]> git.openstreetmap.org Git - rails.git/blob - vendor/assets/iD/iD.js
79fd73321adeb1685eb877080e78c79d3393efb5
[rails.git] / vendor / assets / iD / iD.js
1 (function () {
2         var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};
3
4         function commonjsRequire () {
5                 throw new Error('Dynamic requires are not currently supported by rollup-plugin-commonjs');
6         }
7
8         function unwrapExports (x) {
9                 return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x;
10         }
11
12         function createCommonjsModule(fn, module) {
13                 return module = { exports: {} }, fn(module, module.exports), module.exports;
14         }
15
16         function getCjsExportFromNamespace (n) {
17                 return n && n['default'] || n;
18         }
19
20         var isImplemented = function () {
21                 var set, iterator, result;
22                 if (typeof Set !== 'function') return false;
23                 set = new Set(['raz', 'dwa', 'trzy']);
24                 if (String(set) !== '[object Set]') return false;
25                 if (set.size !== 3) return false;
26                 if (typeof set.add !== 'function') return false;
27                 if (typeof set.clear !== 'function') return false;
28                 if (typeof set.delete !== 'function') return false;
29                 if (typeof set.entries !== 'function') return false;
30                 if (typeof set.forEach !== 'function') return false;
31                 if (typeof set.has !== 'function') return false;
32                 if (typeof set.keys !== 'function') return false;
33                 if (typeof set.values !== 'function') return false;
34
35                 iterator = set.values();
36                 result = iterator.next();
37                 if (result.done !== false) return false;
38                 if (result.value !== 'raz') return false;
39
40                 return true;
41         };
42
43         // eslint-disable-next-line no-empty-function
44         var noop = function () {};
45
46         var _undefined = noop(); // Support ES3 engines
47
48         var isValue = function (val) {
49          return (val !== _undefined) && (val !== null);
50         };
51
52         var validValue = function (value) {
53                 if (!isValue(value)) throw new TypeError("Cannot use null or undefined");
54                 return value;
55         };
56
57         var clear = function () {
58                 validValue(this).length = 0;
59                 return this;
60         };
61
62         var isImplemented$1 = function () {
63                 var numberIsNaN = Number.isNaN;
64                 if (typeof numberIsNaN !== "function") return false;
65                 return !numberIsNaN({}) && numberIsNaN(NaN) && !numberIsNaN(34);
66         };
67
68         var shim = function (value) {
69                 // eslint-disable-next-line no-self-compare
70                 return value !== value;
71         };
72
73         var isNan = isImplemented$1()
74                 ? Number.isNaN
75                 : shim;
76
77         var isImplemented$2 = function () {
78                 var sign = Math.sign;
79                 if (typeof sign !== "function") return false;
80                 return (sign(10) === 1) && (sign(-20) === -1);
81         };
82
83         var shim$1 = function (value) {
84                 value = Number(value);
85                 if (isNaN(value) || (value === 0)) return value;
86                 return value > 0 ? 1 : -1;
87         };
88
89         var sign = isImplemented$2()
90                 ? Math.sign
91                 : shim$1;
92
93         var abs = Math.abs, floor = Math.floor;
94
95         var toInteger = function (value) {
96                 if (isNaN(value)) return 0;
97                 value = Number(value);
98                 if ((value === 0) || !isFinite(value)) return value;
99                 return sign(value) * floor(abs(value));
100         };
101
102         var max = Math.max;
103
104         var toPosInteger = function (value) {
105          return max(0, toInteger(value));
106         };
107
108         var indexOf           = Array.prototype.indexOf
109           , objHasOwnProperty = Object.prototype.hasOwnProperty
110           , abs$1               = Math.abs
111           , floor$1             = Math.floor;
112
113         var eIndexOf = function (searchElement /*, fromIndex*/) {
114                 var i, length, fromIndex, val;
115                 if (!isNan(searchElement)) return indexOf.apply(this, arguments);
116
117                 length = toPosInteger(validValue(this).length);
118                 fromIndex = arguments[1];
119                 if (isNaN(fromIndex)) fromIndex = 0;
120                 else if (fromIndex >= 0) fromIndex = floor$1(fromIndex);
121                 else fromIndex = toPosInteger(this.length) - floor$1(abs$1(fromIndex));
122
123                 for (i = fromIndex; i < length; ++i) {
124                         if (objHasOwnProperty.call(this, i)) {
125                                 val = this[i];
126                                 if (isNan(val)) return i; // Jslint: ignore
127                         }
128                 }
129                 return -1;
130         };
131
132         var create = Object.create, getPrototypeOf = Object.getPrototypeOf, plainObject = {};
133
134         var isImplemented$3 = function (/* CustomCreate*/) {
135                 var setPrototypeOf = Object.setPrototypeOf, customCreate = arguments[0] || create;
136                 if (typeof setPrototypeOf !== "function") return false;
137                 return getPrototypeOf(setPrototypeOf(customCreate(null), plainObject)) === plainObject;
138         };
139
140         var map = { function: true, object: true };
141
142         var isObject = function (value) {
143                 return (isValue(value) && map[typeof value]) || false;
144         };
145
146         var create$1 = Object.create, shim$2;
147
148         if (!isImplemented$3()) {
149                 shim$2 = shim$3;
150         }
151
152         var create_1 = (function () {
153                 var nullObject, polyProps, desc;
154                 if (!shim$2) return create$1;
155                 if (shim$2.level !== 1) return create$1;
156
157                 nullObject = {};
158                 polyProps = {};
159                 desc = {
160                         configurable: false,
161                         enumerable: false,
162                         writable: true,
163                         value: undefined
164                 };
165                 Object.getOwnPropertyNames(Object.prototype).forEach(function (name) {
166                         if (name === "__proto__") {
167                                 polyProps[name] = {
168                                         configurable: true,
169                                         enumerable: false,
170                                         writable: true,
171                                         value: undefined
172                                 };
173                                 return;
174                         }
175                         polyProps[name] = desc;
176                 });
177                 Object.defineProperties(nullObject, polyProps);
178
179                 Object.defineProperty(shim$2, "nullPolyfill", {
180                         configurable: false,
181                         enumerable: false,
182                         writable: false,
183                         value: nullObject
184                 });
185
186                 return function (prototype, props) {
187                         return create$1(prototype === null ? nullObject : prototype, props);
188                 };
189         }());
190
191         var objIsPrototypeOf = Object.prototype.isPrototypeOf
192           , defineProperty  = Object.defineProperty
193           , nullDesc        = {
194                 configurable: true,
195                 enumerable: false,
196                 writable: true,
197                 value: undefined
198         }
199           , validate;
200
201         validate = function (obj, prototype) {
202                 validValue(obj);
203                 if (prototype === null || isObject(prototype)) return obj;
204                 throw new TypeError("Prototype must be null or an object");
205         };
206
207         var shim$3 = (function (status) {
208                 var fn, set;
209                 if (!status) return null;
210                 if (status.level === 2) {
211                         if (status.set) {
212                                 set = status.set;
213                                 fn = function (obj, prototype) {
214                                         set.call(validate(obj, prototype), prototype);
215                                         return obj;
216                                 };
217                         } else {
218                                 fn = function (obj, prototype) {
219                                         validate(obj, prototype).__proto__ = prototype;
220                                         return obj;
221                                 };
222                         }
223                 } else {
224                         fn = function self(obj, prototype) {
225                                 var isNullBase;
226                                 validate(obj, prototype);
227                                 isNullBase = objIsPrototypeOf.call(self.nullPolyfill, obj);
228                                 if (isNullBase) delete self.nullPolyfill.__proto__;
229                                 if (prototype === null) prototype = self.nullPolyfill;
230                                 obj.__proto__ = prototype;
231                                 if (isNullBase) defineProperty(self.nullPolyfill, "__proto__", nullDesc);
232                                 return obj;
233                         };
234                 }
235                 return Object.defineProperty(fn, "level", {
236                         configurable: false,
237                         enumerable: false,
238                         writable: false,
239                         value: status.level
240                 });
241         }(
242                 (function () {
243                         var tmpObj1 = Object.create(null)
244                           , tmpObj2 = {}
245                           , set
246                           , desc = Object.getOwnPropertyDescriptor(Object.prototype, "__proto__");
247
248                         if (desc) {
249                                 try {
250                                         set = desc.set; // Opera crashes at this point
251                                         set.call(tmpObj1, tmpObj2);
252                                 } catch (ignore) {}
253                                 if (Object.getPrototypeOf(tmpObj1) === tmpObj2) return { set: set, level: 2 };
254                         }
255
256                         tmpObj1.__proto__ = tmpObj2;
257                         if (Object.getPrototypeOf(tmpObj1) === tmpObj2) return { level: 2 };
258
259                         tmpObj1 = {};
260                         tmpObj1.__proto__ = tmpObj2;
261                         if (Object.getPrototypeOf(tmpObj1) === tmpObj2) return { level: 1 };
262
263                         return false;
264                 })()
265         ));
266
267         var setPrototypeOf = isImplemented$3()
268                 ? Object.setPrototypeOf
269                 : shim$3;
270
271         var validCallable = function (fn) {
272                 if (typeof fn !== "function") throw new TypeError(fn + " is not a function");
273                 return fn;
274         };
275
276         var isImplemented$4 = function () {
277                 var assign = Object.assign, obj;
278                 if (typeof assign !== "function") return false;
279                 obj = { foo: "raz" };
280                 assign(obj, { bar: "dwa" }, { trzy: "trzy" });
281                 return (obj.foo + obj.bar + obj.trzy) === "razdwatrzy";
282         };
283
284         var isImplemented$5 = function () {
285                 try {
286                         return true;
287                 } catch (e) {
288                         return false;
289                 }
290         };
291
292         var keys = Object.keys;
293
294         var shim$4 = function (object) { return keys(isValue(object) ? Object(object) : object); };
295
296         var keys$1 = isImplemented$5() ? Object.keys : shim$4;
297
298         var max$1   = Math.max;
299
300         var shim$5 = function (dest, src /*, …srcn*/) {
301                 var error, i, length = max$1(arguments.length, 2), assign;
302                 dest = Object(validValue(dest));
303                 assign = function (key) {
304                         try {
305                                 dest[key] = src[key];
306                         } catch (e) {
307                                 if (!error) error = e;
308                         }
309                 };
310                 for (i = 1; i < length; ++i) {
311                         src = arguments[i];
312                         keys$1(src).forEach(assign);
313                 }
314                 if (error !== undefined) throw error;
315                 return dest;
316         };
317
318         var assign = isImplemented$4()
319                 ? Object.assign
320                 : shim$5;
321
322         var forEach = Array.prototype.forEach, create$2 = Object.create;
323
324         var process$1 = function (src, obj) {
325                 var key;
326                 for (key in src) obj[key] = src[key];
327         };
328
329         // eslint-disable-next-line no-unused-vars
330         var normalizeOptions = function (opts1 /*, …options*/) {
331                 var result = create$2(null);
332                 forEach.call(arguments, function (options) {
333                         if (!isValue(options)) return;
334                         process$1(Object(options), result);
335                 });
336                 return result;
337         };
338
339         // Deprecated
340
341         var isCallable = function (obj) {
342          return typeof obj === "function";
343         };
344
345         var str = "razdwatrzy";
346
347         var isImplemented$6 = function () {
348                 if (typeof str.contains !== "function") return false;
349                 return (str.contains("dwa") === true) && (str.contains("foo") === false);
350         };
351
352         var indexOf$1 = String.prototype.indexOf;
353
354         var shim$6 = function (searchString/*, position*/) {
355                 return indexOf$1.call(this, searchString, arguments[1]) > -1;
356         };
357
358         var contains = isImplemented$6()
359                 ? String.prototype.contains
360                 : shim$6;
361
362         var d_1 = createCommonjsModule(function (module) {
363
364         var d;
365
366         d = module.exports = function (dscr, value/*, options*/) {
367                 var c, e, w, options, desc;
368                 if ((arguments.length < 2) || (typeof dscr !== 'string')) {
369                         options = value;
370                         value = dscr;
371                         dscr = null;
372                 } else {
373                         options = arguments[2];
374                 }
375                 if (dscr == null) {
376                         c = w = true;
377                         e = false;
378                 } else {
379                         c = contains.call(dscr, 'c');
380                         e = contains.call(dscr, 'e');
381                         w = contains.call(dscr, 'w');
382                 }
383
384                 desc = { value: value, configurable: c, enumerable: e, writable: w };
385                 return !options ? desc : assign(normalizeOptions(options), desc);
386         };
387
388         d.gs = function (dscr, get, set/*, options*/) {
389                 var c, e, options, desc;
390                 if (typeof dscr !== 'string') {
391                         options = set;
392                         set = get;
393                         get = dscr;
394                         dscr = null;
395                 } else {
396                         options = arguments[3];
397                 }
398                 if (get == null) {
399                         get = undefined;
400                 } else if (!isCallable(get)) {
401                         options = get;
402                         get = set = undefined;
403                 } else if (set == null) {
404                         set = undefined;
405                 } else if (!isCallable(set)) {
406                         options = set;
407                         set = undefined;
408                 }
409                 if (dscr == null) {
410                         c = true;
411                         e = false;
412                 } else {
413                         c = contains.call(dscr, 'c');
414                         e = contains.call(dscr, 'e');
415                 }
416
417                 desc = { get: get, set: set, configurable: c, enumerable: e };
418                 return !options ? desc : assign(normalizeOptions(options), desc);
419         };
420         });
421
422         var eventEmitter = createCommonjsModule(function (module, exports) {
423
424         var apply = Function.prototype.apply, call = Function.prototype.call
425           , create = Object.create, defineProperty = Object.defineProperty
426           , defineProperties = Object.defineProperties
427           , hasOwnProperty = Object.prototype.hasOwnProperty
428           , descriptor = { configurable: true, enumerable: false, writable: true }
429
430           , on, once, off, emit, methods, descriptors, base;
431
432         on = function (type, listener) {
433                 var data;
434
435                 validCallable(listener);
436
437                 if (!hasOwnProperty.call(this, '__ee__')) {
438                         data = descriptor.value = create(null);
439                         defineProperty(this, '__ee__', descriptor);
440                         descriptor.value = null;
441                 } else {
442                         data = this.__ee__;
443                 }
444                 if (!data[type]) data[type] = listener;
445                 else if (typeof data[type] === 'object') data[type].push(listener);
446                 else data[type] = [data[type], listener];
447
448                 return this;
449         };
450
451         once = function (type, listener) {
452                 var once, self;
453
454                 validCallable(listener);
455                 self = this;
456                 on.call(this, type, once = function () {
457                         off.call(self, type, once);
458                         apply.call(listener, this, arguments);
459                 });
460
461                 once.__eeOnceListener__ = listener;
462                 return this;
463         };
464
465         off = function (type, listener) {
466                 var data, listeners, candidate, i;
467
468                 validCallable(listener);
469
470                 if (!hasOwnProperty.call(this, '__ee__')) return this;
471                 data = this.__ee__;
472                 if (!data[type]) return this;
473                 listeners = data[type];
474
475                 if (typeof listeners === 'object') {
476                         for (i = 0; (candidate = listeners[i]); ++i) {
477                                 if ((candidate === listener) ||
478                                                 (candidate.__eeOnceListener__ === listener)) {
479                                         if (listeners.length === 2) data[type] = listeners[i ? 0 : 1];
480                                         else listeners.splice(i, 1);
481                                 }
482                         }
483                 } else {
484                         if ((listeners === listener) ||
485                                         (listeners.__eeOnceListener__ === listener)) {
486                                 delete data[type];
487                         }
488                 }
489
490                 return this;
491         };
492
493         emit = function (type) {
494                 var i, l, listener, listeners, args;
495
496                 if (!hasOwnProperty.call(this, '__ee__')) return;
497                 listeners = this.__ee__[type];
498                 if (!listeners) return;
499
500                 if (typeof listeners === 'object') {
501                         l = arguments.length;
502                         args = new Array(l - 1);
503                         for (i = 1; i < l; ++i) args[i - 1] = arguments[i];
504
505                         listeners = listeners.slice();
506                         for (i = 0; (listener = listeners[i]); ++i) {
507                                 apply.call(listener, this, args);
508                         }
509                 } else {
510                         switch (arguments.length) {
511                         case 1:
512                                 call.call(listeners, this);
513                                 break;
514                         case 2:
515                                 call.call(listeners, this, arguments[1]);
516                                 break;
517                         case 3:
518                                 call.call(listeners, this, arguments[1], arguments[2]);
519                                 break;
520                         default:
521                                 l = arguments.length;
522                                 args = new Array(l - 1);
523                                 for (i = 1; i < l; ++i) {
524                                         args[i - 1] = arguments[i];
525                                 }
526                                 apply.call(listeners, this, args);
527                         }
528                 }
529         };
530
531         methods = {
532                 on: on,
533                 once: once,
534                 off: off,
535                 emit: emit
536         };
537
538         descriptors = {
539                 on: d_1(on),
540                 once: d_1(once),
541                 off: d_1(off),
542                 emit: d_1(emit)
543         };
544
545         base = defineProperties({}, descriptors);
546
547         module.exports = exports = function (o) {
548                 return (o == null) ? create(base) : defineProperties(Object(o), descriptors);
549         };
550         exports.methods = methods;
551         });
552         var eventEmitter_1 = eventEmitter.methods;
553
554         var validTypes = { object: true, symbol: true };
555
556         var isImplemented$7 = function () {
557                 if (typeof Symbol !== 'function') return false;
558                 try { } catch (e) { return false; }
559
560                 // Return 'true' also for polyfills
561                 if (!validTypes[typeof Symbol.iterator]) return false;
562                 if (!validTypes[typeof Symbol.toPrimitive]) return false;
563                 if (!validTypes[typeof Symbol.toStringTag]) return false;
564
565                 return true;
566         };
567
568         var isSymbol = function (x) {
569                 if (!x) return false;
570                 if (typeof x === 'symbol') return true;
571                 if (!x.constructor) return false;
572                 if (x.constructor.name !== 'Symbol') return false;
573                 return (x[x.constructor.toStringTag] === 'Symbol');
574         };
575
576         var validateSymbol = function (value) {
577                 if (!isSymbol(value)) throw new TypeError(value + " is not a symbol");
578                 return value;
579         };
580
581         var create$3 = Object.create, defineProperties = Object.defineProperties
582           , defineProperty$1 = Object.defineProperty, objPrototype = Object.prototype
583           , NativeSymbol, SymbolPolyfill, HiddenSymbol, globalSymbols = create$3(null)
584           , isNativeSafe;
585
586         if (typeof Symbol === 'function') {
587                 NativeSymbol = Symbol;
588                 try {
589                         String(NativeSymbol());
590                         isNativeSafe = true;
591                 } catch (ignore) {}
592         }
593
594         var generateName = (function () {
595                 var created = create$3(null);
596                 return function (desc) {
597                         var postfix = 0, name, ie11BugWorkaround;
598                         while (created[desc + (postfix || '')]) ++postfix;
599                         desc += (postfix || '');
600                         created[desc] = true;
601                         name = '@@' + desc;
602                         defineProperty$1(objPrototype, name, d_1.gs(null, function (value) {
603                                 // For IE11 issue see:
604                                 // https://connect.microsoft.com/IE/feedbackdetail/view/1928508/
605                                 //    ie11-broken-getters-on-dom-objects
606                                 // https://github.com/medikoo/es6-symbol/issues/12
607                                 if (ie11BugWorkaround) return;
608                                 ie11BugWorkaround = true;
609                                 defineProperty$1(this, name, d_1(value));
610                                 ie11BugWorkaround = false;
611                         }));
612                         return name;
613                 };
614         }());
615
616         // Internal constructor (not one exposed) for creating Symbol instances.
617         // This one is used to ensure that `someSymbol instanceof Symbol` always return false
618         HiddenSymbol = function Symbol(description) {
619                 if (this instanceof HiddenSymbol) throw new TypeError('Symbol is not a constructor');
620                 return SymbolPolyfill(description);
621         };
622
623         // Exposed `Symbol` constructor
624         // (returns instances of HiddenSymbol)
625         var polyfill = SymbolPolyfill = function Symbol(description) {
626                 var symbol;
627                 if (this instanceof Symbol) throw new TypeError('Symbol is not a constructor');
628                 if (isNativeSafe) return NativeSymbol(description);
629                 symbol = create$3(HiddenSymbol.prototype);
630                 description = (description === undefined ? '' : String(description));
631                 return defineProperties(symbol, {
632                         __description__: d_1('', description),
633                         __name__: d_1('', generateName(description))
634                 });
635         };
636         defineProperties(SymbolPolyfill, {
637                 for: d_1(function (key) {
638                         if (globalSymbols[key]) return globalSymbols[key];
639                         return (globalSymbols[key] = SymbolPolyfill(String(key)));
640                 }),
641                 keyFor: d_1(function (s) {
642                         var key;
643                         validateSymbol(s);
644                         for (key in globalSymbols) if (globalSymbols[key] === s) return key;
645                 }),
646
647                 // To ensure proper interoperability with other native functions (e.g. Array.from)
648                 // fallback to eventual native implementation of given symbol
649                 hasInstance: d_1('', (NativeSymbol && NativeSymbol.hasInstance) || SymbolPolyfill('hasInstance')),
650                 isConcatSpreadable: d_1('', (NativeSymbol && NativeSymbol.isConcatSpreadable) ||
651                         SymbolPolyfill('isConcatSpreadable')),
652                 iterator: d_1('', (NativeSymbol && NativeSymbol.iterator) || SymbolPolyfill('iterator')),
653                 match: d_1('', (NativeSymbol && NativeSymbol.match) || SymbolPolyfill('match')),
654                 replace: d_1('', (NativeSymbol && NativeSymbol.replace) || SymbolPolyfill('replace')),
655                 search: d_1('', (NativeSymbol && NativeSymbol.search) || SymbolPolyfill('search')),
656                 species: d_1('', (NativeSymbol && NativeSymbol.species) || SymbolPolyfill('species')),
657                 split: d_1('', (NativeSymbol && NativeSymbol.split) || SymbolPolyfill('split')),
658                 toPrimitive: d_1('', (NativeSymbol && NativeSymbol.toPrimitive) || SymbolPolyfill('toPrimitive')),
659                 toStringTag: d_1('', (NativeSymbol && NativeSymbol.toStringTag) || SymbolPolyfill('toStringTag')),
660                 unscopables: d_1('', (NativeSymbol && NativeSymbol.unscopables) || SymbolPolyfill('unscopables'))
661         });
662
663         // Internal tweaks for real symbol producer
664         defineProperties(HiddenSymbol.prototype, {
665                 constructor: d_1(SymbolPolyfill),
666                 toString: d_1('', function () { return this.__name__; })
667         });
668
669         // Proper implementation of methods exposed on Symbol.prototype
670         // They won't be accessible on produced symbol instances as they derive from HiddenSymbol.prototype
671         defineProperties(SymbolPolyfill.prototype, {
672                 toString: d_1(function () { return 'Symbol (' + validateSymbol(this).__description__ + ')'; }),
673                 valueOf: d_1(function () { return validateSymbol(this); })
674         });
675         defineProperty$1(SymbolPolyfill.prototype, SymbolPolyfill.toPrimitive, d_1('', function () {
676                 var symbol = validateSymbol(this);
677                 if (typeof symbol === 'symbol') return symbol;
678                 return symbol.toString();
679         }));
680         defineProperty$1(SymbolPolyfill.prototype, SymbolPolyfill.toStringTag, d_1('c', 'Symbol'));
681
682         // Proper implementaton of toPrimitive and toStringTag for returned symbol instances
683         defineProperty$1(HiddenSymbol.prototype, SymbolPolyfill.toStringTag,
684                 d_1('c', SymbolPolyfill.prototype[SymbolPolyfill.toStringTag]));
685
686         // Note: It's important to define `toPrimitive` as last one, as some implementations
687         // implement `toPrimitive` natively without implementing `toStringTag` (or other specified symbols)
688         // And that may invoke error in definition flow:
689         // See: https://github.com/medikoo/es6-symbol/issues/13#issuecomment-164146149
690         defineProperty$1(HiddenSymbol.prototype, SymbolPolyfill.toPrimitive,
691                 d_1('c', SymbolPolyfill.prototype[SymbolPolyfill.toPrimitive]));
692
693         var es6Symbol = isImplemented$7() ? Symbol : polyfill;
694
695         var objToString = Object.prototype.toString
696           , id = objToString.call(
697                 (function () {
698                         return arguments;
699                 })()
700         );
701
702         var isArguments = function (value) {
703                 return objToString.call(value) === id;
704         };
705
706         var objToString$1 = Object.prototype.toString, id$1 = objToString$1.call("");
707
708         var isString = function (value) {
709                 return (
710                         typeof value === "string" ||
711                         (value &&
712                                 typeof value === "object" &&
713                                 (value instanceof String || objToString$1.call(value) === id$1)) ||
714                         false
715                 );
716         };
717
718         var iteratorSymbol = es6Symbol.iterator
719           , isArray        = Array.isArray;
720
721         var isIterable = function (value) {
722                 if (!isValue(value)) return false;
723                 if (isArray(value)) return true;
724                 if (isString(value)) return true;
725                 if (isArguments(value)) return true;
726                 return typeof value[iteratorSymbol] === "function";
727         };
728
729         var validIterable = function (value) {
730                 if (!isIterable(value)) throw new TypeError(value + " is not iterable");
731                 return value;
732         };
733
734         var isImplemented$8 = function () {
735                 var from = Array.from, arr, result;
736                 if (typeof from !== "function") return false;
737                 arr = ["raz", "dwa"];
738                 result = from(arr);
739                 return Boolean(result && (result !== arr) && (result[1] === "dwa"));
740         };
741
742         var objToString$2 = Object.prototype.toString, id$2 = objToString$2.call(noop);
743
744         var isFunction = function (value) {
745                 return typeof value === "function" && objToString$2.call(value) === id$2;
746         };
747
748         var iteratorSymbol$1 = es6Symbol.iterator
749           , isArray$1        = Array.isArray
750           , call           = Function.prototype.call
751           , desc           = { configurable: true, enumerable: true, writable: true, value: null }
752           , defineProperty$2 = Object.defineProperty;
753
754         // eslint-disable-next-line complexity, max-lines-per-function
755         var shim$7 = function (arrayLike /*, mapFn, thisArg*/) {
756                 var mapFn = arguments[1]
757                   , thisArg = arguments[2]
758                   , Context
759                   , i
760                   , j
761                   , arr
762                   , length
763                   , code
764                   , iterator
765                   , result
766                   , getIterator
767                   , value;
768
769                 arrayLike = Object(validValue(arrayLike));
770
771                 if (isValue(mapFn)) validCallable(mapFn);
772                 if (!this || this === Array || !isFunction(this)) {
773                         // Result: Plain array
774                         if (!mapFn) {
775                                 if (isArguments(arrayLike)) {
776                                         // Source: Arguments
777                                         length = arrayLike.length;
778                                         if (length !== 1) return Array.apply(null, arrayLike);
779                                         arr = new Array(1);
780                                         arr[0] = arrayLike[0];
781                                         return arr;
782                                 }
783                                 if (isArray$1(arrayLike)) {
784                                         // Source: Array
785                                         arr = new Array(length = arrayLike.length);
786                                         for (i = 0; i < length; ++i) arr[i] = arrayLike[i];
787                                         return arr;
788                                 }
789                         }
790                         arr = [];
791                 } else {
792                         // Result: Non plain array
793                         Context = this;
794                 }
795
796                 if (!isArray$1(arrayLike)) {
797                         if ((getIterator = arrayLike[iteratorSymbol$1]) !== undefined) {
798                                 // Source: Iterator
799                                 iterator = validCallable(getIterator).call(arrayLike);
800                                 if (Context) arr = new Context();
801                                 result = iterator.next();
802                                 i = 0;
803                                 while (!result.done) {
804                                         value = mapFn ? call.call(mapFn, thisArg, result.value, i) : result.value;
805                                         if (Context) {
806                                                 desc.value = value;
807                                                 defineProperty$2(arr, i, desc);
808                                         } else {
809                                                 arr[i] = value;
810                                         }
811                                         result = iterator.next();
812                                         ++i;
813                                 }
814                                 length = i;
815                         } else if (isString(arrayLike)) {
816                                 // Source: String
817                                 length = arrayLike.length;
818                                 if (Context) arr = new Context();
819                                 for (i = 0, j = 0; i < length; ++i) {
820                                         value = arrayLike[i];
821                                         if (i + 1 < length) {
822                                                 code = value.charCodeAt(0);
823                                                 // eslint-disable-next-line max-depth
824                                                 if (code >= 0xd800 && code <= 0xdbff) value += arrayLike[++i];
825                                         }
826                                         value = mapFn ? call.call(mapFn, thisArg, value, j) : value;
827                                         if (Context) {
828                                                 desc.value = value;
829                                                 defineProperty$2(arr, j, desc);
830                                         } else {
831                                                 arr[j] = value;
832                                         }
833                                         ++j;
834                                 }
835                                 length = j;
836                         }
837                 }
838                 if (length === undefined) {
839                         // Source: array or array-like
840                         length = toPosInteger(arrayLike.length);
841                         if (Context) arr = new Context(length);
842                         for (i = 0; i < length; ++i) {
843                                 value = mapFn ? call.call(mapFn, thisArg, arrayLike[i], i) : arrayLike[i];
844                                 if (Context) {
845                                         desc.value = value;
846                                         defineProperty$2(arr, i, desc);
847                                 } else {
848                                         arr[i] = value;
849                                 }
850                         }
851                 }
852                 if (Context) {
853                         desc.value = null;
854                         arr.length = length;
855                 }
856                 return arr;
857         };
858
859         var from_1 = isImplemented$8()
860                 ? Array.from
861                 : shim$7;
862
863         var copy = function (obj/*, propertyNames, options*/) {
864                 var copy = Object(validValue(obj)), propertyNames = arguments[1], options = Object(arguments[2]);
865                 if (copy !== obj && !propertyNames) return copy;
866                 var result = {};
867                 if (propertyNames) {
868                         from_1(propertyNames, function (propertyName) {
869                                 if (options.ensure || propertyName in obj) result[propertyName] = obj[propertyName];
870                         });
871                 } else {
872                         assign(result, obj);
873                 }
874                 return result;
875         };
876
877         var bind                    = Function.prototype.bind
878           , call$1                    = Function.prototype.call
879           , keys$2                    = Object.keys
880           , objPropertyIsEnumerable = Object.prototype.propertyIsEnumerable;
881
882         var _iterate = function (method, defVal) {
883                 return function (obj, cb /*, thisArg, compareFn*/) {
884                         var list, thisArg = arguments[2], compareFn = arguments[3];
885                         obj = Object(validValue(obj));
886                         validCallable(cb);
887
888                         list = keys$2(obj);
889                         if (compareFn) {
890                                 list.sort(typeof compareFn === "function" ? bind.call(compareFn, obj) : undefined);
891                         }
892                         if (typeof method !== "function") method = list[method];
893                         return call$1.call(method, list, function (key, index) {
894                                 if (!objPropertyIsEnumerable.call(obj, key)) return defVal;
895                                 return call$1.call(cb, thisArg, obj[key], key, obj, index);
896                         });
897                 };
898         };
899
900         var forEach$1 = _iterate("forEach");
901
902         var call$2     = Function.prototype.call;
903
904         var map$1 = function (obj, cb /*, thisArg*/) {
905                 var result = {}, thisArg = arguments[2];
906                 validCallable(cb);
907                 forEach$1(obj, function (value, key, targetObj, index) {
908                         result[key] = call$2.call(cb, thisArg, value, key, targetObj, index);
909                 });
910                 return result;
911         };
912
913         var callable         = validCallable
914
915           , bind$1 = Function.prototype.bind, defineProperty$3 = Object.defineProperty
916           , hasOwnProperty = Object.prototype.hasOwnProperty
917           , define;
918
919         define = function (name, desc, options) {
920                 var value = validValue(desc) && callable(desc.value), dgs;
921                 dgs = copy(desc);
922                 delete dgs.writable;
923                 delete dgs.value;
924                 dgs.get = function () {
925                         if (!options.overwriteDefinition && hasOwnProperty.call(this, name)) return value;
926                         desc.value = bind$1.call(value, options.resolveContext ? options.resolveContext(this) : this);
927                         defineProperty$3(this, name, desc);
928                         return this[name];
929                 };
930                 return dgs;
931         };
932
933         var autoBind = function (props/*, options*/) {
934                 var options = normalizeOptions(arguments[1]);
935                 if (options.resolveContext != null) validCallable(options.resolveContext);
936                 return map$1(props, function (desc, name) { return define(name, desc, options); });
937         };
938
939         var defineProperty$4 = Object.defineProperty, defineProperties$1 = Object.defineProperties, Iterator;
940
941         var es6Iterator = Iterator = function (list, context) {
942                 if (!(this instanceof Iterator)) throw new TypeError("Constructor requires 'new'");
943                 defineProperties$1(this, {
944                         __list__: d_1("w", validValue(list)),
945                         __context__: d_1("w", context),
946                         __nextIndex__: d_1("w", 0)
947                 });
948                 if (!context) return;
949                 validCallable(context.on);
950                 context.on("_add", this._onAdd);
951                 context.on("_delete", this._onDelete);
952                 context.on("_clear", this._onClear);
953         };
954
955         // Internal %IteratorPrototype% doesn't expose its constructor
956         delete Iterator.prototype.constructor;
957
958         defineProperties$1(
959                 Iterator.prototype,
960                 assign(
961                         {
962                                 _next: d_1(function () {
963                                         var i;
964                                         if (!this.__list__) return undefined;
965                                         if (this.__redo__) {
966                                                 i = this.__redo__.shift();
967                                                 if (i !== undefined) return i;
968                                         }
969                                         if (this.__nextIndex__ < this.__list__.length) return this.__nextIndex__++;
970                                         this._unBind();
971                                         return undefined;
972                                 }),
973                                 next: d_1(function () {
974                                         return this._createResult(this._next());
975                                 }),
976                                 _createResult: d_1(function (i) {
977                                         if (i === undefined) return { done: true, value: undefined };
978                                         return { done: false, value: this._resolve(i) };
979                                 }),
980                                 _resolve: d_1(function (i) {
981                                         return this.__list__[i];
982                                 }),
983                                 _unBind: d_1(function () {
984                                         this.__list__ = null;
985                                         delete this.__redo__;
986                                         if (!this.__context__) return;
987                                         this.__context__.off("_add", this._onAdd);
988                                         this.__context__.off("_delete", this._onDelete);
989                                         this.__context__.off("_clear", this._onClear);
990                                         this.__context__ = null;
991                                 }),
992                                 toString: d_1(function () {
993                                         return "[object " + (this[es6Symbol.toStringTag] || "Object") + "]";
994                                 })
995                         },
996                         autoBind({
997                                 _onAdd: d_1(function (index) {
998                                         if (index >= this.__nextIndex__) return;
999                                         ++this.__nextIndex__;
1000                                         if (!this.__redo__) {
1001                                                 defineProperty$4(this, "__redo__", d_1("c", [index]));
1002                                                 return;
1003                                         }
1004                                         this.__redo__.forEach(function (redo, i) {
1005                                                 if (redo >= index) this.__redo__[i] = ++redo;
1006                                         }, this);
1007                                         this.__redo__.push(index);
1008                                 }),
1009                                 _onDelete: d_1(function (index) {
1010                                         var i;
1011                                         if (index >= this.__nextIndex__) return;
1012                                         --this.__nextIndex__;
1013                                         if (!this.__redo__) return;
1014                                         i = this.__redo__.indexOf(index);
1015                                         if (i !== -1) this.__redo__.splice(i, 1);
1016                                         this.__redo__.forEach(function (redo, j) {
1017                                                 if (redo > index) this.__redo__[j] = --redo;
1018                                         }, this);
1019                                 }),
1020                                 _onClear: d_1(function () {
1021                                         if (this.__redo__) clear.call(this.__redo__);
1022                                         this.__nextIndex__ = 0;
1023                                 })
1024                         })
1025                 )
1026         );
1027
1028         defineProperty$4(
1029                 Iterator.prototype,
1030                 es6Symbol.iterator,
1031                 d_1(function () {
1032                         return this;
1033                 })
1034         );
1035
1036         var array = createCommonjsModule(function (module) {
1037
1038
1039
1040         var defineProperty = Object.defineProperty, ArrayIterator;
1041
1042         ArrayIterator = module.exports = function (arr, kind) {
1043                 if (!(this instanceof ArrayIterator)) throw new TypeError("Constructor requires 'new'");
1044                 es6Iterator.call(this, arr);
1045                 if (!kind) kind = "value";
1046                 else if (contains.call(kind, "key+value")) kind = "key+value";
1047                 else if (contains.call(kind, "key")) kind = "key";
1048                 else kind = "value";
1049                 defineProperty(this, "__kind__", d_1("", kind));
1050         };
1051         if (setPrototypeOf) setPrototypeOf(ArrayIterator, es6Iterator);
1052
1053         // Internal %ArrayIteratorPrototype% doesn't expose its constructor
1054         delete ArrayIterator.prototype.constructor;
1055
1056         ArrayIterator.prototype = Object.create(es6Iterator.prototype, {
1057                 _resolve: d_1(function (i) {
1058                         if (this.__kind__ === "value") return this.__list__[i];
1059                         if (this.__kind__ === "key+value") return [i, this.__list__[i]];
1060                         return i;
1061                 })
1062         });
1063         defineProperty(ArrayIterator.prototype, es6Symbol.toStringTag, d_1("c", "Array Iterator"));
1064         });
1065
1066         var string = createCommonjsModule(function (module) {
1067
1068
1069
1070         var defineProperty = Object.defineProperty, StringIterator;
1071
1072         StringIterator = module.exports = function (str) {
1073                 if (!(this instanceof StringIterator)) throw new TypeError("Constructor requires 'new'");
1074                 str = String(str);
1075                 es6Iterator.call(this, str);
1076                 defineProperty(this, "__length__", d_1("", str.length));
1077         };
1078         if (setPrototypeOf) setPrototypeOf(StringIterator, es6Iterator);
1079
1080         // Internal %ArrayIteratorPrototype% doesn't expose its constructor
1081         delete StringIterator.prototype.constructor;
1082
1083         StringIterator.prototype = Object.create(es6Iterator.prototype, {
1084                 _next: d_1(function () {
1085                         if (!this.__list__) return undefined;
1086                         if (this.__nextIndex__ < this.__length__) return this.__nextIndex__++;
1087                         this._unBind();
1088                         return undefined;
1089                 }),
1090                 _resolve: d_1(function (i) {
1091                         var char = this.__list__[i], code;
1092                         if (this.__nextIndex__ === this.__length__) return char;
1093                         code = char.charCodeAt(0);
1094                         if (code >= 0xd800 && code <= 0xdbff) return char + this.__list__[this.__nextIndex__++];
1095                         return char;
1096                 })
1097         });
1098         defineProperty(StringIterator.prototype, es6Symbol.toStringTag, d_1("c", "String Iterator"));
1099         });
1100
1101         var iteratorSymbol$2 = es6Symbol.iterator;
1102
1103         var get = function (obj) {
1104                 if (typeof validIterable(obj)[iteratorSymbol$2] === "function") return obj[iteratorSymbol$2]();
1105                 if (isArguments(obj)) return new array(obj);
1106                 if (isString(obj)) return new string(obj);
1107                 return new array(obj);
1108         };
1109
1110         var isArray$2 = Array.isArray, call$3 = Function.prototype.call, some = Array.prototype.some;
1111
1112         var forOf = function (iterable, cb /*, thisArg*/) {
1113                 var mode, thisArg = arguments[2], result, doBreak, broken, i, length, char, code;
1114                 if (isArray$2(iterable) || isArguments(iterable)) mode = "array";
1115                 else if (isString(iterable)) mode = "string";
1116                 else iterable = get(iterable);
1117
1118                 validCallable(cb);
1119                 doBreak = function () {
1120                         broken = true;
1121                 };
1122                 if (mode === "array") {
1123                         some.call(iterable, function (value) {
1124                                 call$3.call(cb, thisArg, value, doBreak);
1125                                 return broken;
1126                         });
1127                         return;
1128                 }
1129                 if (mode === "string") {
1130                         length = iterable.length;
1131                         for (i = 0; i < length; ++i) {
1132                                 char = iterable[i];
1133                                 if (i + 1 < length) {
1134                                         code = char.charCodeAt(0);
1135                                         if (code >= 0xd800 && code <= 0xdbff) char += iterable[++i];
1136                                 }
1137                                 call$3.call(cb, thisArg, char, doBreak);
1138                                 if (broken) break;
1139                         }
1140                         return;
1141                 }
1142                 result = iterable.next();
1143
1144                 while (!result.done) {
1145                         call$3.call(cb, thisArg, result.value, doBreak);
1146                         if (broken) return;
1147                         result = iterable.next();
1148                 }
1149         };
1150
1151         var iterator = createCommonjsModule(function (module) {
1152
1153         var toStringTagSymbol = es6Symbol.toStringTag
1154
1155           , defineProperty = Object.defineProperty
1156           , SetIterator;
1157
1158         SetIterator = module.exports = function (set, kind) {
1159                 if (!(this instanceof SetIterator)) return new SetIterator(set, kind);
1160                 es6Iterator.call(this, set.__setData__, set);
1161                 if (!kind) kind = 'value';
1162                 else if (contains.call(kind, 'key+value')) kind = 'key+value';
1163                 else kind = 'value';
1164                 defineProperty(this, '__kind__', d_1('', kind));
1165         };
1166         if (setPrototypeOf) setPrototypeOf(SetIterator, es6Iterator);
1167
1168         SetIterator.prototype = Object.create(es6Iterator.prototype, {
1169                 constructor: d_1(SetIterator),
1170                 _resolve: d_1(function (i) {
1171                         if (this.__kind__ === 'value') return this.__list__[i];
1172                         return [this.__list__[i], this.__list__[i]];
1173                 }),
1174                 toString: d_1(function () { return '[object Set Iterator]'; })
1175         });
1176         defineProperty(SetIterator.prototype, toStringTagSymbol, d_1('c', 'Set Iterator'));
1177         });
1178
1179         // Exports true if environment provides native `Set` implementation,
1180
1181         var isNativeImplemented = (function () {
1182                 if (typeof Set === 'undefined') return false;
1183                 return (Object.prototype.toString.call(Set.prototype) === '[object Set]');
1184         }());
1185
1186         var iterator$1       = validIterable
1187
1188           , call$4 = Function.prototype.call
1189           , defineProperty$5 = Object.defineProperty, getPrototypeOf$1 = Object.getPrototypeOf
1190           , SetPoly, getValues, NativeSet;
1191
1192         if (isNativeImplemented) NativeSet = Set;
1193
1194         var polyfill$1 = SetPoly = function Set(/*iterable*/) {
1195                 var iterable = arguments[0], self;
1196                 if (!(this instanceof SetPoly)) throw new TypeError('Constructor requires \'new\'');
1197                 if (isNativeImplemented && setPrototypeOf) self = setPrototypeOf(new NativeSet(), getPrototypeOf$1(this));
1198                 else self = this;
1199                 if (iterable != null) iterator$1(iterable);
1200                 defineProperty$5(self, '__setData__', d_1('c', []));
1201                 if (!iterable) return self;
1202                 forOf(iterable, function (value) {
1203                         if (eIndexOf.call(this, value) !== -1) return;
1204                         this.push(value);
1205                 }, self.__setData__);
1206                 return self;
1207         };
1208
1209         if (isNativeImplemented) {
1210                 if (setPrototypeOf) setPrototypeOf(SetPoly, NativeSet);
1211                 SetPoly.prototype = Object.create(NativeSet.prototype, { constructor: d_1(SetPoly) });
1212         }
1213
1214         eventEmitter(Object.defineProperties(SetPoly.prototype, {
1215                 add: d_1(function (value) {
1216                         if (this.has(value)) return this;
1217                         this.emit('_add', this.__setData__.push(value) - 1, value);
1218                         return this;
1219                 }),
1220                 clear: d_1(function () {
1221                         if (!this.__setData__.length) return;
1222                         clear.call(this.__setData__);
1223                         this.emit('_clear');
1224                 }),
1225                 delete: d_1(function (value) {
1226                         var index = eIndexOf.call(this.__setData__, value);
1227                         if (index === -1) return false;
1228                         this.__setData__.splice(index, 1);
1229                         this.emit('_delete', index, value);
1230                         return true;
1231                 }),
1232                 entries: d_1(function () { return new iterator(this, 'key+value'); }),
1233                 forEach: d_1(function (cb/*, thisArg*/) {
1234                         var thisArg = arguments[1], iterator, result, value;
1235                         validCallable(cb);
1236                         iterator = this.values();
1237                         result = iterator._next();
1238                         while (result !== undefined) {
1239                                 value = iterator._resolve(result);
1240                                 call$4.call(cb, thisArg, value, value, this);
1241                                 result = iterator._next();
1242                         }
1243                 }),
1244                 has: d_1(function (value) {
1245                         return (eIndexOf.call(this.__setData__, value) !== -1);
1246                 }),
1247                 keys: d_1(getValues = function () { return this.values(); }),
1248                 size: d_1.gs(function () { return this.__setData__.length; }),
1249                 values: d_1(function () { return new iterator(this); }),
1250                 toString: d_1(function () { return '[object Set]'; })
1251         }));
1252         defineProperty$5(SetPoly.prototype, es6Symbol.iterator, d_1(getValues));
1253         defineProperty$5(SetPoly.prototype, es6Symbol.toStringTag, d_1('c', 'Set'));
1254
1255         var es6Set = isImplemented() ? Set : polyfill$1;
1256
1257         var isImplemented$9 = function () {
1258                 var map, iterator, result;
1259                 if (typeof Map !== 'function') return false;
1260                 try {
1261                         // WebKit doesn't support arguments and crashes
1262                         map = new Map([['raz', 'one'], ['dwa', 'two'], ['trzy', 'three']]);
1263                 } catch (e) {
1264                         return false;
1265                 }
1266                 if (String(map) !== '[object Map]') return false;
1267                 if (map.size !== 3) return false;
1268                 if (typeof map.clear !== 'function') return false;
1269                 if (typeof map.delete !== 'function') return false;
1270                 if (typeof map.entries !== 'function') return false;
1271                 if (typeof map.forEach !== 'function') return false;
1272                 if (typeof map.get !== 'function') return false;
1273                 if (typeof map.has !== 'function') return false;
1274                 if (typeof map.keys !== 'function') return false;
1275                 if (typeof map.set !== 'function') return false;
1276                 if (typeof map.values !== 'function') return false;
1277
1278                 iterator = map.entries();
1279                 result = iterator.next();
1280                 if (result.done !== false) return false;
1281                 if (!result.value) return false;
1282                 if (result.value[0] !== 'raz') return false;
1283                 if (result.value[1] !== 'one') return false;
1284
1285                 return true;
1286         };
1287
1288         var forEach$2 = Array.prototype.forEach, create$4 = Object.create;
1289
1290         // eslint-disable-next-line no-unused-vars
1291         var primitiveSet = function (arg /*, …args*/) {
1292                 var set = create$4(null);
1293                 forEach$2.call(arguments, function (name) {
1294                         set[name] = true;
1295                 });
1296                 return set;
1297         };
1298
1299         var iteratorKinds = primitiveSet('key',
1300                 'value', 'key+value');
1301
1302         var iterator$2 = createCommonjsModule(function (module) {
1303
1304         var toStringTagSymbol = es6Symbol.toStringTag
1305
1306           , defineProperties = Object.defineProperties
1307           , unBind = es6Iterator.prototype._unBind
1308           , MapIterator;
1309
1310         MapIterator = module.exports = function (map, kind) {
1311                 if (!(this instanceof MapIterator)) return new MapIterator(map, kind);
1312                 es6Iterator.call(this, map.__mapKeysData__, map);
1313                 if (!kind || !iteratorKinds[kind]) kind = 'key+value';
1314                 defineProperties(this, {
1315                         __kind__: d_1('', kind),
1316                         __values__: d_1('w', map.__mapValuesData__)
1317                 });
1318         };
1319         if (setPrototypeOf) setPrototypeOf(MapIterator, es6Iterator);
1320
1321         MapIterator.prototype = Object.create(es6Iterator.prototype, {
1322                 constructor: d_1(MapIterator),
1323                 _resolve: d_1(function (i) {
1324                         if (this.__kind__ === 'value') return this.__values__[i];
1325                         if (this.__kind__ === 'key') return this.__list__[i];
1326                         return [this.__list__[i], this.__values__[i]];
1327                 }),
1328                 _unBind: d_1(function () {
1329                         this.__values__ = null;
1330                         unBind.call(this);
1331                 }),
1332                 toString: d_1(function () { return '[object Map Iterator]'; })
1333         });
1334         Object.defineProperty(MapIterator.prototype, toStringTagSymbol,
1335                 d_1('c', 'Map Iterator'));
1336         });
1337
1338         // Exports true if environment provides native `Map` implementation,
1339
1340         var isNativeImplemented$1 = (function () {
1341                 if (typeof Map === 'undefined') return false;
1342                 return (Object.prototype.toString.call(new Map()) === '[object Map]');
1343         }());
1344
1345         var iterator$3       = validIterable
1346
1347           , call$5 = Function.prototype.call
1348           , defineProperties$2 = Object.defineProperties, getPrototypeOf$2 = Object.getPrototypeOf
1349           , MapPoly;
1350
1351         var polyfill$2 = MapPoly = function (/*iterable*/) {
1352                 var iterable = arguments[0], keys, values, self;
1353                 if (!(this instanceof MapPoly)) throw new TypeError('Constructor requires \'new\'');
1354                 if (isNativeImplemented$1 && setPrototypeOf && (Map !== MapPoly)) {
1355                         self = setPrototypeOf(new Map(), getPrototypeOf$2(this));
1356                 } else {
1357                         self = this;
1358                 }
1359                 if (iterable != null) iterator$3(iterable);
1360                 defineProperties$2(self, {
1361                         __mapKeysData__: d_1('c', keys = []),
1362                         __mapValuesData__: d_1('c', values = [])
1363                 });
1364                 if (!iterable) return self;
1365                 forOf(iterable, function (value) {
1366                         var key = validValue(value)[0];
1367                         value = value[1];
1368                         if (eIndexOf.call(keys, key) !== -1) return;
1369                         keys.push(key);
1370                         values.push(value);
1371                 }, self);
1372                 return self;
1373         };
1374
1375         if (isNativeImplemented$1) {
1376                 if (setPrototypeOf) setPrototypeOf(MapPoly, Map);
1377                 MapPoly.prototype = Object.create(Map.prototype, {
1378                         constructor: d_1(MapPoly)
1379                 });
1380         }
1381
1382         eventEmitter(defineProperties$2(MapPoly.prototype, {
1383                 clear: d_1(function () {
1384                         if (!this.__mapKeysData__.length) return;
1385                         clear.call(this.__mapKeysData__);
1386                         clear.call(this.__mapValuesData__);
1387                         this.emit('_clear');
1388                 }),
1389                 delete: d_1(function (key) {
1390                         var index = eIndexOf.call(this.__mapKeysData__, key);
1391                         if (index === -1) return false;
1392                         this.__mapKeysData__.splice(index, 1);
1393                         this.__mapValuesData__.splice(index, 1);
1394                         this.emit('_delete', index, key);
1395                         return true;
1396                 }),
1397                 entries: d_1(function () { return new iterator$2(this, 'key+value'); }),
1398                 forEach: d_1(function (cb/*, thisArg*/) {
1399                         var thisArg = arguments[1], iterator, result;
1400                         validCallable(cb);
1401                         iterator = this.entries();
1402                         result = iterator._next();
1403                         while (result !== undefined) {
1404                                 call$5.call(cb, thisArg, this.__mapValuesData__[result],
1405                                         this.__mapKeysData__[result], this);
1406                                 result = iterator._next();
1407                         }
1408                 }),
1409                 get: d_1(function (key) {
1410                         var index = eIndexOf.call(this.__mapKeysData__, key);
1411                         if (index === -1) return;
1412                         return this.__mapValuesData__[index];
1413                 }),
1414                 has: d_1(function (key) {
1415                         return (eIndexOf.call(this.__mapKeysData__, key) !== -1);
1416                 }),
1417                 keys: d_1(function () { return new iterator$2(this, 'key'); }),
1418                 set: d_1(function (key, value) {
1419                         var index = eIndexOf.call(this.__mapKeysData__, key), emit;
1420                         if (index === -1) {
1421                                 index = this.__mapKeysData__.push(key) - 1;
1422                                 emit = true;
1423                         }
1424                         this.__mapValuesData__[index] = value;
1425                         if (emit) this.emit('_add', index, key);
1426                         return this;
1427                 }),
1428                 size: d_1.gs(function () { return this.__mapKeysData__.length; }),
1429                 values: d_1(function () { return new iterator$2(this, 'value'); }),
1430                 toString: d_1(function () { return '[object Map]'; })
1431         }));
1432         Object.defineProperty(MapPoly.prototype, es6Symbol.iterator, d_1(function () {
1433                 return this.entries();
1434         }));
1435         Object.defineProperty(MapPoly.prototype, es6Symbol.toStringTag, d_1('c', 'Map'));
1436
1437         var es6Map = isImplemented$9() ? Map : polyfill$2;
1438
1439         var toStr = Object.prototype.toString;
1440
1441         var isArguments$1 = function isArguments(value) {
1442                 var str = toStr.call(value);
1443                 var isArgs = str === '[object Arguments]';
1444                 if (!isArgs) {
1445                         isArgs = str !== '[object Array]' &&
1446                                 value !== null &&
1447                                 typeof value === 'object' &&
1448                                 typeof value.length === 'number' &&
1449                                 value.length >= 0 &&
1450                                 toStr.call(value.callee) === '[object Function]';
1451                 }
1452                 return isArgs;
1453         };
1454
1455         var keysShim;
1456         if (!Object.keys) {
1457                 // modified from https://github.com/es-shims/es5-shim
1458                 var has = Object.prototype.hasOwnProperty;
1459                 var toStr$1 = Object.prototype.toString;
1460                 var isArgs = isArguments$1; // eslint-disable-line global-require
1461                 var isEnumerable = Object.prototype.propertyIsEnumerable;
1462                 var hasDontEnumBug = !isEnumerable.call({ toString: null }, 'toString');
1463                 var hasProtoEnumBug = isEnumerable.call(function () {}, 'prototype');
1464                 var dontEnums = [
1465                         'toString',
1466                         'toLocaleString',
1467                         'valueOf',
1468                         'hasOwnProperty',
1469                         'isPrototypeOf',
1470                         'propertyIsEnumerable',
1471                         'constructor'
1472                 ];
1473                 var equalsConstructorPrototype = function (o) {
1474                         var ctor = o.constructor;
1475                         return ctor && ctor.prototype === o;
1476                 };
1477                 var excludedKeys = {
1478                         $applicationCache: true,
1479                         $console: true,
1480                         $external: true,
1481                         $frame: true,
1482                         $frameElement: true,
1483                         $frames: true,
1484                         $innerHeight: true,
1485                         $innerWidth: true,
1486                         $outerHeight: true,
1487                         $outerWidth: true,
1488                         $pageXOffset: true,
1489                         $pageYOffset: true,
1490                         $parent: true,
1491                         $scrollLeft: true,
1492                         $scrollTop: true,
1493                         $scrollX: true,
1494                         $scrollY: true,
1495                         $self: true,
1496                         $webkitIndexedDB: true,
1497                         $webkitStorageInfo: true,
1498                         $window: true
1499                 };
1500                 var hasAutomationEqualityBug = (function () {
1501                         /* global window */
1502                         if (typeof window === 'undefined') { return false; }
1503                         for (var k in window) {
1504                                 try {
1505                                         if (!excludedKeys['$' + k] && has.call(window, k) && window[k] !== null && typeof window[k] === 'object') {
1506                                                 try {
1507                                                         equalsConstructorPrototype(window[k]);
1508                                                 } catch (e) {
1509                                                         return true;
1510                                                 }
1511                                         }
1512                                 } catch (e) {
1513                                         return true;
1514                                 }
1515                         }
1516                         return false;
1517                 }());
1518                 var equalsConstructorPrototypeIfNotBuggy = function (o) {
1519                         /* global window */
1520                         if (typeof window === 'undefined' || !hasAutomationEqualityBug) {
1521                                 return equalsConstructorPrototype(o);
1522                         }
1523                         try {
1524                                 return equalsConstructorPrototype(o);
1525                         } catch (e) {
1526                                 return false;
1527                         }
1528                 };
1529
1530                 keysShim = function keys(object) {
1531                         var isObject = object !== null && typeof object === 'object';
1532                         var isFunction = toStr$1.call(object) === '[object Function]';
1533                         var isArguments = isArgs(object);
1534                         var isString = isObject && toStr$1.call(object) === '[object String]';
1535                         var theKeys = [];
1536
1537                         if (!isObject && !isFunction && !isArguments) {
1538                                 throw new TypeError('Object.keys called on a non-object');
1539                         }
1540
1541                         var skipProto = hasProtoEnumBug && isFunction;
1542                         if (isString && object.length > 0 && !has.call(object, 0)) {
1543                                 for (var i = 0; i < object.length; ++i) {
1544                                         theKeys.push(String(i));
1545                                 }
1546                         }
1547
1548                         if (isArguments && object.length > 0) {
1549                                 for (var j = 0; j < object.length; ++j) {
1550                                         theKeys.push(String(j));
1551                                 }
1552                         } else {
1553                                 for (var name in object) {
1554                                         if (!(skipProto && name === 'prototype') && has.call(object, name)) {
1555                                                 theKeys.push(String(name));
1556                                         }
1557                                 }
1558                         }
1559
1560                         if (hasDontEnumBug) {
1561                                 var skipConstructor = equalsConstructorPrototypeIfNotBuggy(object);
1562
1563                                 for (var k = 0; k < dontEnums.length; ++k) {
1564                                         if (!(skipConstructor && dontEnums[k] === 'constructor') && has.call(object, dontEnums[k])) {
1565                                                 theKeys.push(dontEnums[k]);
1566                                         }
1567                                 }
1568                         }
1569                         return theKeys;
1570                 };
1571         }
1572         var implementation = keysShim;
1573
1574         var slice = Array.prototype.slice;
1575
1576
1577         var origKeys = Object.keys;
1578         var keysShim$1 = origKeys ? function keys(o) { return origKeys(o); } : implementation;
1579
1580         var originalKeys = Object.keys;
1581
1582         keysShim$1.shim = function shimObjectKeys() {
1583                 if (Object.keys) {
1584                         var keysWorksWithArguments = (function () {
1585                                 // Safari 5.0 bug
1586                                 var args = Object.keys(arguments);
1587                                 return args && args.length === arguments.length;
1588                         }(1, 2));
1589                         if (!keysWorksWithArguments) {
1590                                 Object.keys = function keys(object) { // eslint-disable-line func-name-matching
1591                                         if (isArguments$1(object)) {
1592                                                 return originalKeys(slice.call(object));
1593                                         }
1594                                         return originalKeys(object);
1595                                 };
1596                         }
1597                 } else {
1598                         Object.keys = keysShim$1;
1599                 }
1600                 return Object.keys || keysShim$1;
1601         };
1602
1603         var objectKeys = keysShim$1;
1604
1605         var hasSymbols = typeof Symbol === 'function' && typeof Symbol('foo') === 'symbol';
1606
1607         var toStr$2 = Object.prototype.toString;
1608         var concat = Array.prototype.concat;
1609         var origDefineProperty = Object.defineProperty;
1610
1611         var isFunction$1 = function (fn) {
1612                 return typeof fn === 'function' && toStr$2.call(fn) === '[object Function]';
1613         };
1614
1615         var arePropertyDescriptorsSupported = function () {
1616                 var obj = {};
1617                 try {
1618                         origDefineProperty(obj, 'x', { enumerable: false, value: obj });
1619                         // eslint-disable-next-line no-unused-vars, no-restricted-syntax
1620                         for (var _ in obj) { // jscs:ignore disallowUnusedVariables
1621                                 return false;
1622                         }
1623                         return obj.x === obj;
1624                 } catch (e) { /* this is IE 8. */
1625                         return false;
1626                 }
1627         };
1628         var supportsDescriptors = origDefineProperty && arePropertyDescriptorsSupported();
1629
1630         var defineProperty$6 = function (object, name, value, predicate) {
1631                 if (name in object && (!isFunction$1(predicate) || !predicate())) {
1632                         return;
1633                 }
1634                 if (supportsDescriptors) {
1635                         origDefineProperty(object, name, {
1636                                 configurable: true,
1637                                 enumerable: false,
1638                                 value: value,
1639                                 writable: true
1640                         });
1641                 } else {
1642                         object[name] = value;
1643                 }
1644         };
1645
1646         var defineProperties$3 = function (object, map) {
1647                 var predicates = arguments.length > 2 ? arguments[2] : {};
1648                 var props = objectKeys(map);
1649                 if (hasSymbols) {
1650                         props = concat.call(props, Object.getOwnPropertySymbols(map));
1651                 }
1652                 for (var i = 0; i < props.length; i += 1) {
1653                         defineProperty$6(object, props[i], map[props[i]], predicates[props[i]]);
1654                 }
1655         };
1656
1657         defineProperties$3.supportsDescriptors = !!supportsDescriptors;
1658
1659         var defineProperties_1 = defineProperties$3;
1660
1661         /* eslint no-invalid-this: 1 */
1662
1663         var ERROR_MESSAGE = 'Function.prototype.bind called on incompatible ';
1664         var slice$1 = Array.prototype.slice;
1665         var toStr$3 = Object.prototype.toString;
1666         var funcType = '[object Function]';
1667
1668         var implementation$1 = function bind(that) {
1669             var target = this;
1670             if (typeof target !== 'function' || toStr$3.call(target) !== funcType) {
1671                 throw new TypeError(ERROR_MESSAGE + target);
1672             }
1673             var args = slice$1.call(arguments, 1);
1674
1675             var bound;
1676             var binder = function () {
1677                 if (this instanceof bound) {
1678                     var result = target.apply(
1679                         this,
1680                         args.concat(slice$1.call(arguments))
1681                     );
1682                     if (Object(result) === result) {
1683                         return result;
1684                     }
1685                     return this;
1686                 } else {
1687                     return target.apply(
1688                         that,
1689                         args.concat(slice$1.call(arguments))
1690                     );
1691                 }
1692             };
1693
1694             var boundLength = Math.max(0, target.length - args.length);
1695             var boundArgs = [];
1696             for (var i = 0; i < boundLength; i++) {
1697                 boundArgs.push('$' + i);
1698             }
1699
1700             bound = Function('binder', 'return function (' + boundArgs.join(',') + '){ return binder.apply(this,arguments); }')(binder);
1701
1702             if (target.prototype) {
1703                 var Empty = function Empty() {};
1704                 Empty.prototype = target.prototype;
1705                 bound.prototype = new Empty();
1706                 Empty.prototype = null;
1707             }
1708
1709             return bound;
1710         };
1711
1712         var functionBind = Function.prototype.bind || implementation$1;
1713
1714         var src = functionBind.call(Function.call, Object.prototype.hasOwnProperty);
1715
1716         var isPrimitive = function isPrimitive(value) {
1717                 return value === null || (typeof value !== 'function' && typeof value !== 'object');
1718         };
1719
1720         var fnToStr = Function.prototype.toString;
1721
1722         var constructorRegex = /^\s*class\b/;
1723         var isES6ClassFn = function isES6ClassFunction(value) {
1724                 try {
1725                         var fnStr = fnToStr.call(value);
1726                         return constructorRegex.test(fnStr);
1727                 } catch (e) {
1728                         return false; // not a function
1729                 }
1730         };
1731
1732         var tryFunctionObject = function tryFunctionToStr(value) {
1733                 try {
1734                         if (isES6ClassFn(value)) { return false; }
1735                         fnToStr.call(value);
1736                         return true;
1737                 } catch (e) {
1738                         return false;
1739                 }
1740         };
1741         var toStr$4 = Object.prototype.toString;
1742         var fnClass = '[object Function]';
1743         var genClass = '[object GeneratorFunction]';
1744         var hasToStringTag = typeof Symbol === 'function' && typeof Symbol.toStringTag === 'symbol';
1745
1746         var isCallable$1 = function isCallable(value) {
1747                 if (!value) { return false; }
1748                 if (typeof value !== 'function' && typeof value !== 'object') { return false; }
1749                 if (typeof value === 'function' && !value.prototype) { return true; }
1750                 if (hasToStringTag) { return tryFunctionObject(value); }
1751                 if (isES6ClassFn(value)) { return false; }
1752                 var strClass = toStr$4.call(value);
1753                 return strClass === fnClass || strClass === genClass;
1754         };
1755
1756         var getDay = Date.prototype.getDay;
1757         var tryDateObject = function tryDateObject(value) {
1758                 try {
1759                         getDay.call(value);
1760                         return true;
1761                 } catch (e) {
1762                         return false;
1763                 }
1764         };
1765
1766         var toStr$5 = Object.prototype.toString;
1767         var dateClass = '[object Date]';
1768         var hasToStringTag$1 = typeof Symbol === 'function' && typeof Symbol.toStringTag === 'symbol';
1769
1770         var isDateObject = function isDateObject(value) {
1771                 if (typeof value !== 'object' || value === null) { return false; }
1772                 return hasToStringTag$1 ? tryDateObject(value) : toStr$5.call(value) === dateClass;
1773         };
1774
1775         /* eslint complexity: [2, 17], max-statements: [2, 33] */
1776         var shams = function hasSymbols() {
1777                 if (typeof Symbol !== 'function' || typeof Object.getOwnPropertySymbols !== 'function') { return false; }
1778                 if (typeof Symbol.iterator === 'symbol') { return true; }
1779
1780                 var obj = {};
1781                 var sym = Symbol('test');
1782                 var symObj = Object(sym);
1783                 if (typeof sym === 'string') { return false; }
1784
1785                 if (Object.prototype.toString.call(sym) !== '[object Symbol]') { return false; }
1786                 if (Object.prototype.toString.call(symObj) !== '[object Symbol]') { return false; }
1787
1788                 // temp disabled per https://github.com/ljharb/object.assign/issues/17
1789                 // if (sym instanceof Symbol) { return false; }
1790                 // temp disabled per https://github.com/WebReflection/get-own-property-symbols/issues/4
1791                 // if (!(symObj instanceof Symbol)) { return false; }
1792
1793                 // if (typeof Symbol.prototype.toString !== 'function') { return false; }
1794                 // if (String(sym) !== Symbol.prototype.toString.call(sym)) { return false; }
1795
1796                 var symVal = 42;
1797                 obj[sym] = symVal;
1798                 for (sym in obj) { return false; } // eslint-disable-line no-restricted-syntax
1799                 if (typeof Object.keys === 'function' && Object.keys(obj).length !== 0) { return false; }
1800
1801                 if (typeof Object.getOwnPropertyNames === 'function' && Object.getOwnPropertyNames(obj).length !== 0) { return false; }
1802
1803                 var syms = Object.getOwnPropertySymbols(obj);
1804                 if (syms.length !== 1 || syms[0] !== sym) { return false; }
1805
1806                 if (!Object.prototype.propertyIsEnumerable.call(obj, sym)) { return false; }
1807
1808                 if (typeof Object.getOwnPropertyDescriptor === 'function') {
1809                         var descriptor = Object.getOwnPropertyDescriptor(obj, sym);
1810                         if (descriptor.value !== symVal || descriptor.enumerable !== true) { return false; }
1811                 }
1812
1813                 return true;
1814         };
1815
1816         var origSymbol = commonjsGlobal.Symbol;
1817
1818
1819         var hasSymbols$1 = function hasNativeSymbols() {
1820                 if (typeof origSymbol !== 'function') { return false; }
1821                 if (typeof Symbol !== 'function') { return false; }
1822                 if (typeof origSymbol('foo') !== 'symbol') { return false; }
1823                 if (typeof Symbol('bar') !== 'symbol') { return false; }
1824
1825                 return shams();
1826         };
1827
1828         var isSymbol$1 = createCommonjsModule(function (module) {
1829
1830         var toStr = Object.prototype.toString;
1831         var hasSymbols = hasSymbols$1();
1832
1833         if (hasSymbols) {
1834                 var symToStr = Symbol.prototype.toString;
1835                 var symStringRegex = /^Symbol\(.*\)$/;
1836                 var isSymbolObject = function isRealSymbolObject(value) {
1837                         if (typeof value.valueOf() !== 'symbol') {
1838                                 return false;
1839                         }
1840                         return symStringRegex.test(symToStr.call(value));
1841                 };
1842
1843                 module.exports = function isSymbol(value) {
1844                         if (typeof value === 'symbol') {
1845                                 return true;
1846                         }
1847                         if (toStr.call(value) !== '[object Symbol]') {
1848                                 return false;
1849                         }
1850                         try {
1851                                 return isSymbolObject(value);
1852                         } catch (e) {
1853                                 return false;
1854                         }
1855                 };
1856         } else {
1857
1858                 module.exports = function isSymbol(value) {
1859                         // this environment does not support Symbols.
1860                         return false;
1861                 };
1862         }
1863         });
1864
1865         var hasSymbols$2 = typeof Symbol === 'function' && typeof Symbol.iterator === 'symbol';
1866
1867
1868
1869
1870
1871
1872         var ordinaryToPrimitive = function OrdinaryToPrimitive(O, hint) {
1873                 if (typeof O === 'undefined' || O === null) {
1874                         throw new TypeError('Cannot call method on ' + O);
1875                 }
1876                 if (typeof hint !== 'string' || (hint !== 'number' && hint !== 'string')) {
1877                         throw new TypeError('hint must be "string" or "number"');
1878                 }
1879                 var methodNames = hint === 'string' ? ['toString', 'valueOf'] : ['valueOf', 'toString'];
1880                 var method, result, i;
1881                 for (i = 0; i < methodNames.length; ++i) {
1882                         method = O[methodNames[i]];
1883                         if (isCallable$1(method)) {
1884                                 result = method.call(O);
1885                                 if (isPrimitive(result)) {
1886                                         return result;
1887                                 }
1888                         }
1889                 }
1890                 throw new TypeError('No default value');
1891         };
1892
1893         var GetMethod = function GetMethod(O, P) {
1894                 var func = O[P];
1895                 if (func !== null && typeof func !== 'undefined') {
1896                         if (!isCallable$1(func)) {
1897                                 throw new TypeError(func + ' returned for property ' + P + ' of object ' + O + ' is not a function');
1898                         }
1899                         return func;
1900                 }
1901                 return void 0;
1902         };
1903
1904         // http://www.ecma-international.org/ecma-262/6.0/#sec-toprimitive
1905         var es2015 = function ToPrimitive(input) {
1906                 if (isPrimitive(input)) {
1907                         return input;
1908                 }
1909                 var hint = 'default';
1910                 if (arguments.length > 1) {
1911                         if (arguments[1] === String) {
1912                                 hint = 'string';
1913                         } else if (arguments[1] === Number) {
1914                                 hint = 'number';
1915                         }
1916                 }
1917
1918                 var exoticToPrim;
1919                 if (hasSymbols$2) {
1920                         if (Symbol.toPrimitive) {
1921                                 exoticToPrim = GetMethod(input, Symbol.toPrimitive);
1922                         } else if (isSymbol$1(input)) {
1923                                 exoticToPrim = Symbol.prototype.valueOf;
1924                         }
1925                 }
1926                 if (typeof exoticToPrim !== 'undefined') {
1927                         var result = exoticToPrim.call(input, hint);
1928                         if (isPrimitive(result)) {
1929                                 return result;
1930                         }
1931                         throw new TypeError('unable to convert exotic object to primitive');
1932                 }
1933                 if (hint === 'default' && (isDateObject(input) || isSymbol$1(input))) {
1934                         hint = 'string';
1935                 }
1936                 return ordinaryToPrimitive(input, hint === 'default' ? 'number' : hint);
1937         };
1938
1939         var es6 = es2015;
1940
1941         /* globals
1942                 Set,
1943                 Map,
1944                 WeakSet,
1945                 WeakMap,
1946
1947                 Promise,
1948
1949                 Symbol,
1950                 Proxy,
1951
1952                 Atomics,
1953                 SharedArrayBuffer,
1954
1955                 ArrayBuffer,
1956                 DataView,
1957                 Uint8Array,
1958                 Float32Array,
1959                 Float64Array,
1960                 Int8Array,
1961                 Int16Array,
1962                 Int32Array,
1963                 Uint8ClampedArray,
1964                 Uint16Array,
1965                 Uint32Array,
1966         */
1967
1968         var undefined$1; // eslint-disable-line no-shadow-restricted-names
1969
1970         var ThrowTypeError = Object.getOwnPropertyDescriptor
1971                 ? (function () { return Object.getOwnPropertyDescriptor(arguments, 'callee').get; }())
1972                 : function () { throw new TypeError(); };
1973
1974         var hasSymbols$3 = typeof Symbol === 'function' && typeof Symbol.iterator === 'symbol';
1975
1976         var getProto = Object.getPrototypeOf || function (x) { return x.__proto__; }; // eslint-disable-line no-proto
1977         var generatorFunction = undefined$1;
1978         var asyncFunction = undefined$1;
1979         var asyncGenFunction = undefined$1;
1980
1981         var TypedArray = typeof Uint8Array === 'undefined' ? undefined$1 : getProto(Uint8Array);
1982
1983         var INTRINSICS = {
1984                 '$ %Array%': Array,
1985                 '$ %ArrayBuffer%': typeof ArrayBuffer === 'undefined' ? undefined$1 : ArrayBuffer,
1986                 '$ %ArrayBufferPrototype%': typeof ArrayBuffer === 'undefined' ? undefined$1 : ArrayBuffer.prototype,
1987                 '$ %ArrayIteratorPrototype%': hasSymbols$3 ? getProto([][Symbol.iterator]()) : undefined$1,
1988                 '$ %ArrayPrototype%': Array.prototype,
1989                 '$ %ArrayProto_entries%': Array.prototype.entries,
1990                 '$ %ArrayProto_forEach%': Array.prototype.forEach,
1991                 '$ %ArrayProto_keys%': Array.prototype.keys,
1992                 '$ %ArrayProto_values%': Array.prototype.values,
1993                 '$ %AsyncFromSyncIteratorPrototype%': undefined$1,
1994                 '$ %AsyncFunction%': asyncFunction,
1995                 '$ %AsyncFunctionPrototype%': undefined$1,
1996                 '$ %AsyncGenerator%': undefined$1,
1997                 '$ %AsyncGeneratorFunction%': asyncGenFunction,
1998                 '$ %AsyncGeneratorPrototype%': undefined$1,
1999                 '$ %AsyncIteratorPrototype%': undefined$1,
2000                 '$ %Atomics%': typeof Atomics === 'undefined' ? undefined$1 : Atomics,
2001                 '$ %Boolean%': Boolean,
2002                 '$ %BooleanPrototype%': Boolean.prototype,
2003                 '$ %DataView%': typeof DataView === 'undefined' ? undefined$1 : DataView,
2004                 '$ %DataViewPrototype%': typeof DataView === 'undefined' ? undefined$1 : DataView.prototype,
2005                 '$ %Date%': Date,
2006                 '$ %DatePrototype%': Date.prototype,
2007                 '$ %decodeURI%': decodeURI,
2008                 '$ %decodeURIComponent%': decodeURIComponent,
2009                 '$ %encodeURI%': encodeURI,
2010                 '$ %encodeURIComponent%': encodeURIComponent,
2011                 '$ %Error%': Error,
2012                 '$ %ErrorPrototype%': Error.prototype,
2013                 '$ %eval%': eval, // eslint-disable-line no-eval
2014                 '$ %EvalError%': EvalError,
2015                 '$ %EvalErrorPrototype%': EvalError.prototype,
2016                 '$ %Float32Array%': typeof Float32Array === 'undefined' ? undefined$1 : Float32Array,
2017                 '$ %Float32ArrayPrototype%': typeof Float32Array === 'undefined' ? undefined$1 : Float32Array.prototype,
2018                 '$ %Float64Array%': typeof Float64Array === 'undefined' ? undefined$1 : Float64Array,
2019                 '$ %Float64ArrayPrototype%': typeof Float64Array === 'undefined' ? undefined$1 : Float64Array.prototype,
2020                 '$ %Function%': Function,
2021                 '$ %FunctionPrototype%': Function.prototype,
2022                 '$ %Generator%': undefined$1,
2023                 '$ %GeneratorFunction%': generatorFunction,
2024                 '$ %GeneratorPrototype%': undefined$1,
2025                 '$ %Int8Array%': typeof Int8Array === 'undefined' ? undefined$1 : Int8Array,
2026                 '$ %Int8ArrayPrototype%': typeof Int8Array === 'undefined' ? undefined$1 : Int8Array.prototype,
2027                 '$ %Int16Array%': typeof Int16Array === 'undefined' ? undefined$1 : Int16Array,
2028                 '$ %Int16ArrayPrototype%': typeof Int16Array === 'undefined' ? undefined$1 : Int8Array.prototype,
2029                 '$ %Int32Array%': typeof Int32Array === 'undefined' ? undefined$1 : Int32Array,
2030                 '$ %Int32ArrayPrototype%': typeof Int32Array === 'undefined' ? undefined$1 : Int32Array.prototype,
2031                 '$ %isFinite%': isFinite,
2032                 '$ %isNaN%': isNaN,
2033                 '$ %IteratorPrototype%': hasSymbols$3 ? getProto(getProto([][Symbol.iterator]())) : undefined$1,
2034                 '$ %JSON%': JSON,
2035                 '$ %JSONParse%': JSON.parse,
2036                 '$ %Map%': typeof Map === 'undefined' ? undefined$1 : Map,
2037                 '$ %MapIteratorPrototype%': typeof Map === 'undefined' || !hasSymbols$3 ? undefined$1 : getProto(new Map()[Symbol.iterator]()),
2038                 '$ %MapPrototype%': typeof Map === 'undefined' ? undefined$1 : Map.prototype,
2039                 '$ %Math%': Math,
2040                 '$ %Number%': Number,
2041                 '$ %NumberPrototype%': Number.prototype,
2042                 '$ %Object%': Object,
2043                 '$ %ObjectPrototype%': Object.prototype,
2044                 '$ %ObjProto_toString%': Object.prototype.toString,
2045                 '$ %ObjProto_valueOf%': Object.prototype.valueOf,
2046                 '$ %parseFloat%': parseFloat,
2047                 '$ %parseInt%': parseInt,
2048                 '$ %Promise%': typeof Promise === 'undefined' ? undefined$1 : Promise,
2049                 '$ %PromisePrototype%': typeof Promise === 'undefined' ? undefined$1 : Promise.prototype,
2050                 '$ %PromiseProto_then%': typeof Promise === 'undefined' ? undefined$1 : Promise.prototype.then,
2051                 '$ %Promise_all%': typeof Promise === 'undefined' ? undefined$1 : Promise.all,
2052                 '$ %Promise_reject%': typeof Promise === 'undefined' ? undefined$1 : Promise.reject,
2053                 '$ %Promise_resolve%': typeof Promise === 'undefined' ? undefined$1 : Promise.resolve,
2054                 '$ %Proxy%': typeof Proxy === 'undefined' ? undefined$1 : Proxy,
2055                 '$ %RangeError%': RangeError,
2056                 '$ %RangeErrorPrototype%': RangeError.prototype,
2057                 '$ %ReferenceError%': ReferenceError,
2058                 '$ %ReferenceErrorPrototype%': ReferenceError.prototype,
2059                 '$ %Reflect%': typeof Reflect === 'undefined' ? undefined$1 : Reflect,
2060                 '$ %RegExp%': RegExp,
2061                 '$ %RegExpPrototype%': RegExp.prototype,
2062                 '$ %Set%': typeof Set === 'undefined' ? undefined$1 : Set,
2063                 '$ %SetIteratorPrototype%': typeof Set === 'undefined' || !hasSymbols$3 ? undefined$1 : getProto(new Set()[Symbol.iterator]()),
2064                 '$ %SetPrototype%': typeof Set === 'undefined' ? undefined$1 : Set.prototype,
2065                 '$ %SharedArrayBuffer%': typeof SharedArrayBuffer === 'undefined' ? undefined$1 : SharedArrayBuffer,
2066                 '$ %SharedArrayBufferPrototype%': typeof SharedArrayBuffer === 'undefined' ? undefined$1 : SharedArrayBuffer.prototype,
2067                 '$ %String%': String,
2068                 '$ %StringIteratorPrototype%': hasSymbols$3 ? getProto(''[Symbol.iterator]()) : undefined$1,
2069                 '$ %StringPrototype%': String.prototype,
2070                 '$ %Symbol%': hasSymbols$3 ? Symbol : undefined$1,
2071                 '$ %SymbolPrototype%': hasSymbols$3 ? Symbol.prototype : undefined$1,
2072                 '$ %SyntaxError%': SyntaxError,
2073                 '$ %SyntaxErrorPrototype%': SyntaxError.prototype,
2074                 '$ %ThrowTypeError%': ThrowTypeError,
2075                 '$ %TypedArray%': TypedArray,
2076                 '$ %TypedArrayPrototype%': TypedArray ? TypedArray.prototype : undefined$1,
2077                 '$ %TypeError%': TypeError,
2078                 '$ %TypeErrorPrototype%': TypeError.prototype,
2079                 '$ %Uint8Array%': typeof Uint8Array === 'undefined' ? undefined$1 : Uint8Array,
2080                 '$ %Uint8ArrayPrototype%': typeof Uint8Array === 'undefined' ? undefined$1 : Uint8Array.prototype,
2081                 '$ %Uint8ClampedArray%': typeof Uint8ClampedArray === 'undefined' ? undefined$1 : Uint8ClampedArray,
2082                 '$ %Uint8ClampedArrayPrototype%': typeof Uint8ClampedArray === 'undefined' ? undefined$1 : Uint8ClampedArray.prototype,
2083                 '$ %Uint16Array%': typeof Uint16Array === 'undefined' ? undefined$1 : Uint16Array,
2084                 '$ %Uint16ArrayPrototype%': typeof Uint16Array === 'undefined' ? undefined$1 : Uint16Array.prototype,
2085                 '$ %Uint32Array%': typeof Uint32Array === 'undefined' ? undefined$1 : Uint32Array,
2086                 '$ %Uint32ArrayPrototype%': typeof Uint32Array === 'undefined' ? undefined$1 : Uint32Array.prototype,
2087                 '$ %URIError%': URIError,
2088                 '$ %URIErrorPrototype%': URIError.prototype,
2089                 '$ %WeakMap%': typeof WeakMap === 'undefined' ? undefined$1 : WeakMap,
2090                 '$ %WeakMapPrototype%': typeof WeakMap === 'undefined' ? undefined$1 : WeakMap.prototype,
2091                 '$ %WeakSet%': typeof WeakSet === 'undefined' ? undefined$1 : WeakSet,
2092                 '$ %WeakSetPrototype%': typeof WeakSet === 'undefined' ? undefined$1 : WeakSet.prototype
2093         };
2094
2095         var GetIntrinsic = function GetIntrinsic(name, allowMissing) {
2096                 if (arguments.length > 1 && typeof allowMissing !== 'boolean') {
2097                         throw new TypeError('"allowMissing" argument must be a boolean');
2098                 }
2099
2100                 var key = '$ ' + name;
2101                 if (!(key in INTRINSICS)) {
2102                         throw new SyntaxError('intrinsic ' + name + ' does not exist!');
2103                 }
2104
2105                 // istanbul ignore if // hopefully this is impossible to test :-)
2106                 if (typeof INTRINSICS[key] === 'undefined' && !allowMissing) {
2107                         throw new TypeError('intrinsic ' + name + ' exists, but is not available. Please file an issue!');
2108                 }
2109                 return INTRINSICS[key];
2110         };
2111
2112         var $TypeError = GetIntrinsic('%TypeError%');
2113         var $SyntaxError = GetIntrinsic('%SyntaxError%');
2114
2115
2116
2117         var predicates = {
2118           // https://ecma-international.org/ecma-262/6.0/#sec-property-descriptor-specification-type
2119           'Property Descriptor': function isPropertyDescriptor(ES, Desc) {
2120             if (ES.Type(Desc) !== 'Object') {
2121               return false;
2122             }
2123             var allowed = {
2124               '[[Configurable]]': true,
2125               '[[Enumerable]]': true,
2126               '[[Get]]': true,
2127               '[[Set]]': true,
2128               '[[Value]]': true,
2129               '[[Writable]]': true
2130             };
2131
2132             for (var key in Desc) { // eslint-disable-line
2133               if (src(Desc, key) && !allowed[key]) {
2134                 return false;
2135               }
2136             }
2137
2138             var isData = src(Desc, '[[Value]]');
2139             var IsAccessor = src(Desc, '[[Get]]') || src(Desc, '[[Set]]');
2140             if (isData && IsAccessor) {
2141               throw new $TypeError('Property Descriptors may not be both accessor and data descriptors');
2142             }
2143             return true;
2144           }
2145         };
2146
2147         var assertRecord = function assertRecord(ES, recordType, argumentName, value) {
2148           var predicate = predicates[recordType];
2149           if (typeof predicate !== 'function') {
2150             throw new $SyntaxError('unknown record type: ' + recordType);
2151           }
2152           if (!predicate(ES, value)) {
2153             throw new $TypeError(argumentName + ' must be a ' + recordType);
2154           }
2155           console.log(predicate(ES, value), value);
2156         };
2157
2158         var _isNaN = Number.isNaN || function isNaN(a) {
2159                 return a !== a;
2160         };
2161
2162         var $isNaN = Number.isNaN || function (a) { return a !== a; };
2163
2164         var _isFinite = Number.isFinite || function (x) { return typeof x === 'number' && !$isNaN(x) && x !== Infinity && x !== -Infinity; };
2165
2166         var has$1 = functionBind.call(Function.call, Object.prototype.hasOwnProperty);
2167
2168         var $assign = Object.assign;
2169
2170         var assign$1 = function assign(target, source) {
2171                 if ($assign) {
2172                         return $assign(target, source);
2173                 }
2174
2175                 for (var key in source) {
2176                         if (has$1(source, key)) {
2177                                 target[key] = source[key];
2178                         }
2179                 }
2180                 return target;
2181         };
2182
2183         var sign$1 = function sign(number) {
2184                 return number >= 0 ? 1 : -1;
2185         };
2186
2187         var mod = function mod(number, modulo) {
2188                 var remain = number % modulo;
2189                 return Math.floor(remain >= 0 ? remain : remain + modulo);
2190         };
2191
2192         var isPrimitive$1 = function isPrimitive(value) {
2193                 return value === null || (typeof value !== 'function' && typeof value !== 'object');
2194         };
2195
2196         var toStr$6 = Object.prototype.toString;
2197
2198
2199
2200
2201
2202         // http://ecma-international.org/ecma-262/5.1/#sec-8.12.8
2203         var ES5internalSlots = {
2204                 '[[DefaultValue]]': function (O) {
2205                         var actualHint;
2206                         if (arguments.length > 1) {
2207                                 actualHint = arguments[1];
2208                         } else {
2209                                 actualHint = toStr$6.call(O) === '[object Date]' ? String : Number;
2210                         }
2211
2212                         if (actualHint === String || actualHint === Number) {
2213                                 var methods = actualHint === String ? ['toString', 'valueOf'] : ['valueOf', 'toString'];
2214                                 var value, i;
2215                                 for (i = 0; i < methods.length; ++i) {
2216                                         if (isCallable$1(O[methods[i]])) {
2217                                                 value = O[methods[i]]();
2218                                                 if (isPrimitive(value)) {
2219                                                         return value;
2220                                                 }
2221                                         }
2222                                 }
2223                                 throw new TypeError('No default value');
2224                         }
2225                         throw new TypeError('invalid [[DefaultValue]] hint supplied');
2226                 }
2227         };
2228
2229         // http://ecma-international.org/ecma-262/5.1/#sec-9.1
2230         var es5 = function ToPrimitive(input) {
2231                 if (isPrimitive(input)) {
2232                         return input;
2233                 }
2234                 if (arguments.length > 1) {
2235                         return ES5internalSlots['[[DefaultValue]]'](input, arguments[1]);
2236                 }
2237                 return ES5internalSlots['[[DefaultValue]]'](input);
2238         };
2239
2240         var $Object = GetIntrinsic('%Object%');
2241         var $TypeError$1 = GetIntrinsic('%TypeError%');
2242         var $String = GetIntrinsic('%String%');
2243
2244
2245
2246
2247
2248
2249
2250
2251
2252
2253
2254
2255
2256         // https://es5.github.io/#x9
2257         var ES5 = {
2258                 ToPrimitive: es5,
2259
2260                 ToBoolean: function ToBoolean(value) {
2261                         return !!value;
2262                 },
2263                 ToNumber: function ToNumber(value) {
2264                         return +value; // eslint-disable-line no-implicit-coercion
2265                 },
2266                 ToInteger: function ToInteger(value) {
2267                         var number = this.ToNumber(value);
2268                         if (_isNaN(number)) { return 0; }
2269                         if (number === 0 || !_isFinite(number)) { return number; }
2270                         return sign$1(number) * Math.floor(Math.abs(number));
2271                 },
2272                 ToInt32: function ToInt32(x) {
2273                         return this.ToNumber(x) >> 0;
2274                 },
2275                 ToUint32: function ToUint32(x) {
2276                         return this.ToNumber(x) >>> 0;
2277                 },
2278                 ToUint16: function ToUint16(value) {
2279                         var number = this.ToNumber(value);
2280                         if (_isNaN(number) || number === 0 || !_isFinite(number)) { return 0; }
2281                         var posInt = sign$1(number) * Math.floor(Math.abs(number));
2282                         return mod(posInt, 0x10000);
2283                 },
2284                 ToString: function ToString(value) {
2285                         return $String(value);
2286                 },
2287                 ToObject: function ToObject(value) {
2288                         this.CheckObjectCoercible(value);
2289                         return $Object(value);
2290                 },
2291                 CheckObjectCoercible: function CheckObjectCoercible(value, optMessage) {
2292                         /* jshint eqnull:true */
2293                         if (value == null) {
2294                                 throw new $TypeError$1(optMessage || 'Cannot call method on ' + value);
2295                         }
2296                         return value;
2297                 },
2298                 IsCallable: isCallable$1,
2299                 SameValue: function SameValue(x, y) {
2300                         if (x === y) { // 0 === -0, but they are not identical.
2301                                 if (x === 0) { return 1 / x === 1 / y; }
2302                                 return true;
2303                         }
2304                         return _isNaN(x) && _isNaN(y);
2305                 },
2306
2307                 // https://www.ecma-international.org/ecma-262/5.1/#sec-8
2308                 Type: function Type(x) {
2309                         if (x === null) {
2310                                 return 'Null';
2311                         }
2312                         if (typeof x === 'undefined') {
2313                                 return 'Undefined';
2314                         }
2315                         if (typeof x === 'function' || typeof x === 'object') {
2316                                 return 'Object';
2317                         }
2318                         if (typeof x === 'number') {
2319                                 return 'Number';
2320                         }
2321                         if (typeof x === 'boolean') {
2322                                 return 'Boolean';
2323                         }
2324                         if (typeof x === 'string') {
2325                                 return 'String';
2326                         }
2327                 },
2328
2329                 // https://ecma-international.org/ecma-262/6.0/#sec-property-descriptor-specification-type
2330                 IsPropertyDescriptor: function IsPropertyDescriptor(Desc) {
2331                         if (this.Type(Desc) !== 'Object') {
2332                                 return false;
2333                         }
2334                         var allowed = {
2335                                 '[[Configurable]]': true,
2336                                 '[[Enumerable]]': true,
2337                                 '[[Get]]': true,
2338                                 '[[Set]]': true,
2339                                 '[[Value]]': true,
2340                                 '[[Writable]]': true
2341                         };
2342
2343                         for (var key in Desc) { // eslint-disable-line
2344                                 if (src(Desc, key) && !allowed[key]) {
2345                                         return false;
2346                                 }
2347                         }
2348
2349                         var isData = src(Desc, '[[Value]]');
2350                         var IsAccessor = src(Desc, '[[Get]]') || src(Desc, '[[Set]]');
2351                         if (isData && IsAccessor) {
2352                                 throw new $TypeError$1('Property Descriptors may not be both accessor and data descriptors');
2353                         }
2354                         return true;
2355                 },
2356
2357                 // https://ecma-international.org/ecma-262/5.1/#sec-8.10.1
2358                 IsAccessorDescriptor: function IsAccessorDescriptor(Desc) {
2359                         if (typeof Desc === 'undefined') {
2360                                 return false;
2361                         }
2362
2363                         assertRecord(this, 'Property Descriptor', 'Desc', Desc);
2364
2365                         if (!src(Desc, '[[Get]]') && !src(Desc, '[[Set]]')) {
2366                                 return false;
2367                         }
2368
2369                         return true;
2370                 },
2371
2372                 // https://ecma-international.org/ecma-262/5.1/#sec-8.10.2
2373                 IsDataDescriptor: function IsDataDescriptor(Desc) {
2374                         if (typeof Desc === 'undefined') {
2375                                 return false;
2376                         }
2377
2378                         assertRecord(this, 'Property Descriptor', 'Desc', Desc);
2379
2380                         if (!src(Desc, '[[Value]]') && !src(Desc, '[[Writable]]')) {
2381                                 return false;
2382                         }
2383
2384                         return true;
2385                 },
2386
2387                 // https://ecma-international.org/ecma-262/5.1/#sec-8.10.3
2388                 IsGenericDescriptor: function IsGenericDescriptor(Desc) {
2389                         if (typeof Desc === 'undefined') {
2390                                 return false;
2391                         }
2392
2393                         assertRecord(this, 'Property Descriptor', 'Desc', Desc);
2394
2395                         if (!this.IsAccessorDescriptor(Desc) && !this.IsDataDescriptor(Desc)) {
2396                                 return true;
2397                         }
2398
2399                         return false;
2400                 },
2401
2402                 // https://ecma-international.org/ecma-262/5.1/#sec-8.10.4
2403                 FromPropertyDescriptor: function FromPropertyDescriptor(Desc) {
2404                         if (typeof Desc === 'undefined') {
2405                                 return Desc;
2406                         }
2407
2408                         assertRecord(this, 'Property Descriptor', 'Desc', Desc);
2409
2410                         if (this.IsDataDescriptor(Desc)) {
2411                                 return {
2412                                         value: Desc['[[Value]]'],
2413                                         writable: !!Desc['[[Writable]]'],
2414                                         enumerable: !!Desc['[[Enumerable]]'],
2415                                         configurable: !!Desc['[[Configurable]]']
2416                                 };
2417                         } else if (this.IsAccessorDescriptor(Desc)) {
2418                                 return {
2419                                         get: Desc['[[Get]]'],
2420                                         set: Desc['[[Set]]'],
2421                                         enumerable: !!Desc['[[Enumerable]]'],
2422                                         configurable: !!Desc['[[Configurable]]']
2423                                 };
2424                         } else {
2425                                 throw new $TypeError$1('FromPropertyDescriptor must be called with a fully populated Property Descriptor');
2426                         }
2427                 },
2428
2429                 // https://ecma-international.org/ecma-262/5.1/#sec-8.10.5
2430                 ToPropertyDescriptor: function ToPropertyDescriptor(Obj) {
2431                         if (this.Type(Obj) !== 'Object') {
2432                                 throw new $TypeError$1('ToPropertyDescriptor requires an object');
2433                         }
2434
2435                         var desc = {};
2436                         if (src(Obj, 'enumerable')) {
2437                                 desc['[[Enumerable]]'] = this.ToBoolean(Obj.enumerable);
2438                         }
2439                         if (src(Obj, 'configurable')) {
2440                                 desc['[[Configurable]]'] = this.ToBoolean(Obj.configurable);
2441                         }
2442                         if (src(Obj, 'value')) {
2443                                 desc['[[Value]]'] = Obj.value;
2444                         }
2445                         if (src(Obj, 'writable')) {
2446                                 desc['[[Writable]]'] = this.ToBoolean(Obj.writable);
2447                         }
2448                         if (src(Obj, 'get')) {
2449                                 var getter = Obj.get;
2450                                 if (typeof getter !== 'undefined' && !this.IsCallable(getter)) {
2451                                         throw new TypeError('getter must be a function');
2452                                 }
2453                                 desc['[[Get]]'] = getter;
2454                         }
2455                         if (src(Obj, 'set')) {
2456                                 var setter = Obj.set;
2457                                 if (typeof setter !== 'undefined' && !this.IsCallable(setter)) {
2458                                         throw new $TypeError$1('setter must be a function');
2459                                 }
2460                                 desc['[[Set]]'] = setter;
2461                         }
2462
2463                         if ((src(desc, '[[Get]]') || src(desc, '[[Set]]')) && (src(desc, '[[Value]]') || src(desc, '[[Writable]]'))) {
2464                                 throw new $TypeError$1('Invalid property descriptor. Cannot both specify accessors and a value or writable attribute');
2465                         }
2466                         return desc;
2467                 }
2468         };
2469
2470         var es5$1 = ES5;
2471
2472         var regexExec = RegExp.prototype.exec;
2473         var gOPD = Object.getOwnPropertyDescriptor;
2474
2475         var tryRegexExecCall = function tryRegexExec(value) {
2476                 try {
2477                         var lastIndex = value.lastIndex;
2478                         value.lastIndex = 0;
2479
2480                         regexExec.call(value);
2481                         return true;
2482                 } catch (e) {
2483                         return false;
2484                 } finally {
2485                         value.lastIndex = lastIndex;
2486                 }
2487         };
2488         var toStr$7 = Object.prototype.toString;
2489         var regexClass = '[object RegExp]';
2490         var hasToStringTag$2 = typeof Symbol === 'function' && typeof Symbol.toStringTag === 'symbol';
2491
2492         var isRegex = function isRegex(value) {
2493                 if (!value || typeof value !== 'object') {
2494                         return false;
2495                 }
2496                 if (!hasToStringTag$2) {
2497                         return toStr$7.call(value) === regexClass;
2498                 }
2499
2500                 var descriptor = gOPD(value, 'lastIndex');
2501                 var hasLastIndexDataProperty = descriptor && src(descriptor, 'value');
2502                 if (!hasLastIndexDataProperty) {
2503                         return false;
2504                 }
2505
2506                 return tryRegexExecCall(value);
2507         };
2508
2509         var $TypeError$2 = GetIntrinsic('%TypeError%');
2510         var $SyntaxError$1 = GetIntrinsic('%SyntaxError%');
2511         var $Array = GetIntrinsic('%Array%');
2512         var $String$1 = GetIntrinsic('%String%');
2513         var $Object$1 = GetIntrinsic('%Object%');
2514         var $Number = GetIntrinsic('%Number%');
2515         var $Symbol = GetIntrinsic('%Symbol%', true);
2516         var $RegExp = GetIntrinsic('%RegExp%');
2517
2518         var hasSymbols$4 = !!$Symbol;
2519
2520
2521
2522
2523         var MAX_SAFE_INTEGER = $Number.MAX_SAFE_INTEGER || Math.pow(2, 53) - 1;
2524
2525
2526
2527
2528
2529         var parseInteger = parseInt;
2530
2531         var arraySlice = functionBind.call(Function.call, $Array.prototype.slice);
2532         var strSlice = functionBind.call(Function.call, $String$1.prototype.slice);
2533         var isBinary = functionBind.call(Function.call, $RegExp.prototype.test, /^0b[01]+$/i);
2534         var isOctal = functionBind.call(Function.call, $RegExp.prototype.test, /^0o[0-7]+$/i);
2535         var regexExec$1 = functionBind.call(Function.call, $RegExp.prototype.exec);
2536         var nonWS = ['\u0085', '\u200b', '\ufffe'].join('');
2537         var nonWSregex = new $RegExp('[' + nonWS + ']', 'g');
2538         var hasNonWS = functionBind.call(Function.call, $RegExp.prototype.test, nonWSregex);
2539         var invalidHexLiteral = /^[-+]0x[0-9a-f]+$/i;
2540         var isInvalidHexLiteral = functionBind.call(Function.call, $RegExp.prototype.test, invalidHexLiteral);
2541         var $charCodeAt = functionBind.call(Function.call, $String$1.prototype.charCodeAt);
2542
2543         var toStr$8 = functionBind.call(Function.call, Object.prototype.toString);
2544
2545         var $NumberValueOf = functionBind.call(Function.call, GetIntrinsic('%NumberPrototype%').valueOf);
2546         var $BooleanValueOf = functionBind.call(Function.call, GetIntrinsic('%BooleanPrototype%').valueOf);
2547         var $StringValueOf = functionBind.call(Function.call, GetIntrinsic('%StringPrototype%').valueOf);
2548         var $DateValueOf = functionBind.call(Function.call, GetIntrinsic('%DatePrototype%').valueOf);
2549
2550         var $floor = Math.floor;
2551         var $abs = Math.abs;
2552
2553         var $ObjectCreate = Object.create;
2554         var $gOPD = $Object$1.getOwnPropertyDescriptor;
2555
2556         var $isExtensible = $Object$1.isExtensible;
2557
2558         var $defineProperty = $Object$1.defineProperty;
2559
2560         // whitespace from: http://es5.github.io/#x15.5.4.20
2561         // implementation from https://github.com/es-shims/es5-shim/blob/v3.4.0/es5-shim.js#L1304-L1324
2562         var ws = [
2563                 '\x09\x0A\x0B\x0C\x0D\x20\xA0\u1680\u180E\u2000\u2001\u2002\u2003',
2564                 '\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\u2028',
2565                 '\u2029\uFEFF'
2566         ].join('');
2567         var trimRegex = new RegExp('(^[' + ws + ']+)|([' + ws + ']+$)', 'g');
2568         var replace = functionBind.call(Function.call, $String$1.prototype.replace);
2569         var trim = function (value) {
2570                 return replace(value, trimRegex, '');
2571         };
2572
2573
2574
2575
2576
2577         // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-abstract-operations
2578         var ES6 = assign$1(assign$1({}, es5$1), {
2579
2580                 // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-call-f-v-args
2581                 Call: function Call(F, V) {
2582                         var args = arguments.length > 2 ? arguments[2] : [];
2583                         if (!this.IsCallable(F)) {
2584                                 throw new $TypeError$2(F + ' is not a function');
2585                         }
2586                         return F.apply(V, args);
2587                 },
2588
2589                 // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-toprimitive
2590                 ToPrimitive: es6,
2591
2592                 // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-toboolean
2593                 // ToBoolean: ES5.ToBoolean,
2594
2595                 // https://ecma-international.org/ecma-262/6.0/#sec-tonumber
2596                 ToNumber: function ToNumber(argument) {
2597                         var value = isPrimitive$1(argument) ? argument : es6(argument, $Number);
2598                         if (typeof value === 'symbol') {
2599                                 throw new $TypeError$2('Cannot convert a Symbol value to a number');
2600                         }
2601                         if (typeof value === 'string') {
2602                                 if (isBinary(value)) {
2603                                         return this.ToNumber(parseInteger(strSlice(value, 2), 2));
2604                                 } else if (isOctal(value)) {
2605                                         return this.ToNumber(parseInteger(strSlice(value, 2), 8));
2606                                 } else if (hasNonWS(value) || isInvalidHexLiteral(value)) {
2607                                         return NaN;
2608                                 } else {
2609                                         var trimmed = trim(value);
2610                                         if (trimmed !== value) {
2611                                                 return this.ToNumber(trimmed);
2612                                         }
2613                                 }
2614                         }
2615                         return $Number(value);
2616                 },
2617
2618                 // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-tointeger
2619                 // ToInteger: ES5.ToNumber,
2620
2621                 // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-toint32
2622                 // ToInt32: ES5.ToInt32,
2623
2624                 // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-touint32
2625                 // ToUint32: ES5.ToUint32,
2626
2627                 // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-toint16
2628                 ToInt16: function ToInt16(argument) {
2629                         var int16bit = this.ToUint16(argument);
2630                         return int16bit >= 0x8000 ? int16bit - 0x10000 : int16bit;
2631                 },
2632
2633                 // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-touint16
2634                 // ToUint16: ES5.ToUint16,
2635
2636                 // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-toint8
2637                 ToInt8: function ToInt8(argument) {
2638                         var int8bit = this.ToUint8(argument);
2639                         return int8bit >= 0x80 ? int8bit - 0x100 : int8bit;
2640                 },
2641
2642                 // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-touint8
2643                 ToUint8: function ToUint8(argument) {
2644                         var number = this.ToNumber(argument);
2645                         if (_isNaN(number) || number === 0 || !_isFinite(number)) { return 0; }
2646                         var posInt = sign$1(number) * $floor($abs(number));
2647                         return mod(posInt, 0x100);
2648                 },
2649
2650                 // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-touint8clamp
2651                 ToUint8Clamp: function ToUint8Clamp(argument) {
2652                         var number = this.ToNumber(argument);
2653                         if (_isNaN(number) || number <= 0) { return 0; }
2654                         if (number >= 0xFF) { return 0xFF; }
2655                         var f = $floor(argument);
2656                         if (f + 0.5 < number) { return f + 1; }
2657                         if (number < f + 0.5) { return f; }
2658                         if (f % 2 !== 0) { return f + 1; }
2659                         return f;
2660                 },
2661
2662                 // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-tostring
2663                 ToString: function ToString(argument) {
2664                         if (typeof argument === 'symbol') {
2665                                 throw new $TypeError$2('Cannot convert a Symbol value to a string');
2666                         }
2667                         return $String$1(argument);
2668                 },
2669
2670                 // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-toobject
2671                 ToObject: function ToObject(value) {
2672                         this.RequireObjectCoercible(value);
2673                         return $Object$1(value);
2674                 },
2675
2676                 // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-topropertykey
2677                 ToPropertyKey: function ToPropertyKey(argument) {
2678                         var key = this.ToPrimitive(argument, $String$1);
2679                         return typeof key === 'symbol' ? key : this.ToString(key);
2680                 },
2681
2682                 // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-tolength
2683                 ToLength: function ToLength(argument) {
2684                         var len = this.ToInteger(argument);
2685                         if (len <= 0) { return 0; } // includes converting -0 to +0
2686                         if (len > MAX_SAFE_INTEGER) { return MAX_SAFE_INTEGER; }
2687                         return len;
2688                 },
2689
2690                 // https://ecma-international.org/ecma-262/6.0/#sec-canonicalnumericindexstring
2691                 CanonicalNumericIndexString: function CanonicalNumericIndexString(argument) {
2692                         if (toStr$8(argument) !== '[object String]') {
2693                                 throw new $TypeError$2('must be a string');
2694                         }
2695                         if (argument === '-0') { return -0; }
2696                         var n = this.ToNumber(argument);
2697                         if (this.SameValue(this.ToString(n), argument)) { return n; }
2698                         return void 0;
2699                 },
2700
2701                 // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-requireobjectcoercible
2702                 RequireObjectCoercible: es5$1.CheckObjectCoercible,
2703
2704                 // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-isarray
2705                 IsArray: $Array.isArray || function IsArray(argument) {
2706                         return toStr$8(argument) === '[object Array]';
2707                 },
2708
2709                 // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-iscallable
2710                 // IsCallable: ES5.IsCallable,
2711
2712                 // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-isconstructor
2713                 IsConstructor: function IsConstructor(argument) {
2714                         return typeof argument === 'function' && !!argument.prototype; // unfortunately there's no way to truly check this without try/catch `new argument`
2715                 },
2716
2717                 // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-isextensible-o
2718                 IsExtensible: Object.preventExtensions
2719                         ? function IsExtensible(obj) {
2720                                 if (isPrimitive$1(obj)) {
2721                                         return false;
2722                                 }
2723                                 return $isExtensible(obj);
2724                         }
2725                         : function isExtensible(obj) { return true; }, // eslint-disable-line no-unused-vars
2726
2727                 // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-isinteger
2728                 IsInteger: function IsInteger(argument) {
2729                         if (typeof argument !== 'number' || _isNaN(argument) || !_isFinite(argument)) {
2730                                 return false;
2731                         }
2732                         var abs = $abs(argument);
2733                         return $floor(abs) === abs;
2734                 },
2735
2736                 // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-ispropertykey
2737                 IsPropertyKey: function IsPropertyKey(argument) {
2738                         return typeof argument === 'string' || typeof argument === 'symbol';
2739                 },
2740
2741                 // https://ecma-international.org/ecma-262/6.0/#sec-isregexp
2742                 IsRegExp: function IsRegExp(argument) {
2743                         if (!argument || typeof argument !== 'object') {
2744                                 return false;
2745                         }
2746                         if (hasSymbols$4) {
2747                                 var isRegExp = argument[$Symbol.match];
2748                                 if (typeof isRegExp !== 'undefined') {
2749                                         return es5$1.ToBoolean(isRegExp);
2750                                 }
2751                         }
2752                         return isRegex(argument);
2753                 },
2754
2755                 // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-samevalue
2756                 // SameValue: ES5.SameValue,
2757
2758                 // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-samevaluezero
2759                 SameValueZero: function SameValueZero(x, y) {
2760                         return (x === y) || (_isNaN(x) && _isNaN(y));
2761                 },
2762
2763                 /**
2764                  * 7.3.2 GetV (V, P)
2765                  * 1. Assert: IsPropertyKey(P) is true.
2766                  * 2. Let O be ToObject(V).
2767                  * 3. ReturnIfAbrupt(O).
2768                  * 4. Return O.[[Get]](P, V).
2769                  */
2770                 GetV: function GetV(V, P) {
2771                         // 7.3.2.1
2772                         if (!this.IsPropertyKey(P)) {
2773                                 throw new $TypeError$2('Assertion failed: IsPropertyKey(P) is not true');
2774                         }
2775
2776                         // 7.3.2.2-3
2777                         var O = this.ToObject(V);
2778
2779                         // 7.3.2.4
2780                         return O[P];
2781                 },
2782
2783                 /**
2784                  * 7.3.9 - https://ecma-international.org/ecma-262/6.0/#sec-getmethod
2785                  * 1. Assert: IsPropertyKey(P) is true.
2786                  * 2. Let func be GetV(O, P).
2787                  * 3. ReturnIfAbrupt(func).
2788                  * 4. If func is either undefined or null, return undefined.
2789                  * 5. If IsCallable(func) is false, throw a TypeError exception.
2790                  * 6. Return func.
2791                  */
2792                 GetMethod: function GetMethod(O, P) {
2793                         // 7.3.9.1
2794                         if (!this.IsPropertyKey(P)) {
2795                                 throw new $TypeError$2('Assertion failed: IsPropertyKey(P) is not true');
2796                         }
2797
2798                         // 7.3.9.2
2799                         var func = this.GetV(O, P);
2800
2801                         // 7.3.9.4
2802                         if (func == null) {
2803                                 return void 0;
2804                         }
2805
2806                         // 7.3.9.5
2807                         if (!this.IsCallable(func)) {
2808                                 throw new $TypeError$2(P + 'is not a function');
2809                         }
2810
2811                         // 7.3.9.6
2812                         return func;
2813                 },
2814
2815                 /**
2816                  * 7.3.1 Get (O, P) - https://ecma-international.org/ecma-262/6.0/#sec-get-o-p
2817                  * 1. Assert: Type(O) is Object.
2818                  * 2. Assert: IsPropertyKey(P) is true.
2819                  * 3. Return O.[[Get]](P, O).
2820                  */
2821                 Get: function Get(O, P) {
2822                         // 7.3.1.1
2823                         if (this.Type(O) !== 'Object') {
2824                                 throw new $TypeError$2('Assertion failed: Type(O) is not Object');
2825                         }
2826                         // 7.3.1.2
2827                         if (!this.IsPropertyKey(P)) {
2828                                 throw new $TypeError$2('Assertion failed: IsPropertyKey(P) is not true');
2829                         }
2830                         // 7.3.1.3
2831                         return O[P];
2832                 },
2833
2834                 Type: function Type(x) {
2835                         if (typeof x === 'symbol') {
2836                                 return 'Symbol';
2837                         }
2838                         return es5$1.Type(x);
2839                 },
2840
2841                 // https://ecma-international.org/ecma-262/6.0/#sec-speciesconstructor
2842                 SpeciesConstructor: function SpeciesConstructor(O, defaultConstructor) {
2843                         if (this.Type(O) !== 'Object') {
2844                                 throw new $TypeError$2('Assertion failed: Type(O) is not Object');
2845                         }
2846                         var C = O.constructor;
2847                         if (typeof C === 'undefined') {
2848                                 return defaultConstructor;
2849                         }
2850                         if (this.Type(C) !== 'Object') {
2851                                 throw new $TypeError$2('O.constructor is not an Object');
2852                         }
2853                         var S = hasSymbols$4 && $Symbol.species ? C[$Symbol.species] : void 0;
2854                         if (S == null) {
2855                                 return defaultConstructor;
2856                         }
2857                         if (this.IsConstructor(S)) {
2858                                 return S;
2859                         }
2860                         throw new $TypeError$2('no constructor found');
2861                 },
2862
2863                 // https://ecma-international.org/ecma-262/6.0/#sec-completepropertydescriptor
2864                 CompletePropertyDescriptor: function CompletePropertyDescriptor(Desc) {
2865                         assertRecord(this, 'Property Descriptor', 'Desc', Desc);
2866
2867                         if (this.IsGenericDescriptor(Desc) || this.IsDataDescriptor(Desc)) {
2868                                 if (!src(Desc, '[[Value]]')) {
2869                                         Desc['[[Value]]'] = void 0;
2870                                 }
2871                                 if (!src(Desc, '[[Writable]]')) {
2872                                         Desc['[[Writable]]'] = false;
2873                                 }
2874                         } else {
2875                                 if (!src(Desc, '[[Get]]')) {
2876                                         Desc['[[Get]]'] = void 0;
2877                                 }
2878                                 if (!src(Desc, '[[Set]]')) {
2879                                         Desc['[[Set]]'] = void 0;
2880                                 }
2881                         }
2882                         if (!src(Desc, '[[Enumerable]]')) {
2883                                 Desc['[[Enumerable]]'] = false;
2884                         }
2885                         if (!src(Desc, '[[Configurable]]')) {
2886                                 Desc['[[Configurable]]'] = false;
2887                         }
2888                         return Desc;
2889                 },
2890
2891                 // https://ecma-international.org/ecma-262/6.0/#sec-set-o-p-v-throw
2892                 Set: function Set(O, P, V, Throw) {
2893                         if (this.Type(O) !== 'Object') {
2894                                 throw new $TypeError$2('O must be an Object');
2895                         }
2896                         if (!this.IsPropertyKey(P)) {
2897                                 throw new $TypeError$2('P must be a Property Key');
2898                         }
2899                         if (this.Type(Throw) !== 'Boolean') {
2900                                 throw new $TypeError$2('Throw must be a Boolean');
2901                         }
2902                         if (Throw) {
2903                                 O[P] = V;
2904                                 return true;
2905                         } else {
2906                                 try {
2907                                         O[P] = V;
2908                                 } catch (e) {
2909                                         return false;
2910                                 }
2911                         }
2912                 },
2913
2914                 // https://ecma-international.org/ecma-262/6.0/#sec-hasownproperty
2915                 HasOwnProperty: function HasOwnProperty(O, P) {
2916                         if (this.Type(O) !== 'Object') {
2917                                 throw new $TypeError$2('O must be an Object');
2918                         }
2919                         if (!this.IsPropertyKey(P)) {
2920                                 throw new $TypeError$2('P must be a Property Key');
2921                         }
2922                         return src(O, P);
2923                 },
2924
2925                 // https://ecma-international.org/ecma-262/6.0/#sec-hasproperty
2926                 HasProperty: function HasProperty(O, P) {
2927                         if (this.Type(O) !== 'Object') {
2928                                 throw new $TypeError$2('O must be an Object');
2929                         }
2930                         if (!this.IsPropertyKey(P)) {
2931                                 throw new $TypeError$2('P must be a Property Key');
2932                         }
2933                         return P in O;
2934                 },
2935
2936                 // https://ecma-international.org/ecma-262/6.0/#sec-isconcatspreadable
2937                 IsConcatSpreadable: function IsConcatSpreadable(O) {
2938                         if (this.Type(O) !== 'Object') {
2939                                 return false;
2940                         }
2941                         if (hasSymbols$4 && typeof $Symbol.isConcatSpreadable === 'symbol') {
2942                                 var spreadable = this.Get(O, Symbol.isConcatSpreadable);
2943                                 if (typeof spreadable !== 'undefined') {
2944                                         return this.ToBoolean(spreadable);
2945                                 }
2946                         }
2947                         return this.IsArray(O);
2948                 },
2949
2950                 // https://ecma-international.org/ecma-262/6.0/#sec-invoke
2951                 Invoke: function Invoke(O, P) {
2952                         if (!this.IsPropertyKey(P)) {
2953                                 throw new $TypeError$2('P must be a Property Key');
2954                         }
2955                         var argumentsList = arraySlice(arguments, 2);
2956                         var func = this.GetV(O, P);
2957                         return this.Call(func, O, argumentsList);
2958                 },
2959
2960                 // https://ecma-international.org/ecma-262/6.0/#sec-getiterator
2961                 GetIterator: function GetIterator(obj, method) {
2962                         if (!hasSymbols$4) {
2963                                 throw new SyntaxError('ES.GetIterator depends on native iterator support.');
2964                         }
2965
2966                         var actualMethod = method;
2967                         if (arguments.length < 2) {
2968                                 actualMethod = this.GetMethod(obj, $Symbol.iterator);
2969                         }
2970                         var iterator = this.Call(actualMethod, obj);
2971                         if (this.Type(iterator) !== 'Object') {
2972                                 throw new $TypeError$2('iterator must return an object');
2973                         }
2974
2975                         return iterator;
2976                 },
2977
2978                 // https://ecma-international.org/ecma-262/6.0/#sec-iteratornext
2979                 IteratorNext: function IteratorNext(iterator, value) {
2980                         var result = this.Invoke(iterator, 'next', arguments.length < 2 ? [] : [value]);
2981                         if (this.Type(result) !== 'Object') {
2982                                 throw new $TypeError$2('iterator next must return an object');
2983                         }
2984                         return result;
2985                 },
2986
2987                 // https://ecma-international.org/ecma-262/6.0/#sec-iteratorcomplete
2988                 IteratorComplete: function IteratorComplete(iterResult) {
2989                         if (this.Type(iterResult) !== 'Object') {
2990                                 throw new $TypeError$2('Assertion failed: Type(iterResult) is not Object');
2991                         }
2992                         return this.ToBoolean(this.Get(iterResult, 'done'));
2993                 },
2994
2995                 // https://ecma-international.org/ecma-262/6.0/#sec-iteratorvalue
2996                 IteratorValue: function IteratorValue(iterResult) {
2997                         if (this.Type(iterResult) !== 'Object') {
2998                                 throw new $TypeError$2('Assertion failed: Type(iterResult) is not Object');
2999                         }
3000                         return this.Get(iterResult, 'value');
3001                 },
3002
3003                 // https://ecma-international.org/ecma-262/6.0/#sec-iteratorstep
3004                 IteratorStep: function IteratorStep(iterator) {
3005                         var result = this.IteratorNext(iterator);
3006                         var done = this.IteratorComplete(result);
3007                         return done === true ? false : result;
3008                 },
3009
3010                 // https://ecma-international.org/ecma-262/6.0/#sec-iteratorclose
3011                 IteratorClose: function IteratorClose(iterator, completion) {
3012                         if (this.Type(iterator) !== 'Object') {
3013                                 throw new $TypeError$2('Assertion failed: Type(iterator) is not Object');
3014                         }
3015                         if (!this.IsCallable(completion)) {
3016                                 throw new $TypeError$2('Assertion failed: completion is not a thunk for a Completion Record');
3017                         }
3018                         var completionThunk = completion;
3019
3020                         var iteratorReturn = this.GetMethod(iterator, 'return');
3021
3022                         if (typeof iteratorReturn === 'undefined') {
3023                                 return completionThunk();
3024                         }
3025
3026                         var completionRecord;
3027                         try {
3028                                 var innerResult = this.Call(iteratorReturn, iterator, []);
3029                         } catch (e) {
3030                                 // if we hit here, then "e" is the innerResult completion that needs re-throwing
3031
3032                                 // if the completion is of type "throw", this will throw.
3033                                 completionRecord = completionThunk();
3034                                 completionThunk = null; // ensure it's not called twice.
3035
3036                                 // if not, then return the innerResult completion
3037                                 throw e;
3038                         }
3039                         completionRecord = completionThunk(); // if innerResult worked, then throw if the completion does
3040                         completionThunk = null; // ensure it's not called twice.
3041
3042                         if (this.Type(innerResult) !== 'Object') {
3043                                 throw new $TypeError$2('iterator .return must return an object');
3044                         }
3045
3046                         return completionRecord;
3047                 },
3048
3049                 // https://ecma-international.org/ecma-262/6.0/#sec-createiterresultobject
3050                 CreateIterResultObject: function CreateIterResultObject(value, done) {
3051                         if (this.Type(done) !== 'Boolean') {
3052                                 throw new $TypeError$2('Assertion failed: Type(done) is not Boolean');
3053                         }
3054                         return {
3055                                 value: value,
3056                                 done: done
3057                         };
3058                 },
3059
3060                 // https://ecma-international.org/ecma-262/6.0/#sec-regexpexec
3061                 RegExpExec: function RegExpExec(R, S) {
3062                         if (this.Type(R) !== 'Object') {
3063                                 throw new $TypeError$2('R must be an Object');
3064                         }
3065                         if (this.Type(S) !== 'String') {
3066                                 throw new $TypeError$2('S must be a String');
3067                         }
3068                         var exec = this.Get(R, 'exec');
3069                         if (this.IsCallable(exec)) {
3070                                 var result = this.Call(exec, R, [S]);
3071                                 if (result === null || this.Type(result) === 'Object') {
3072                                         return result;
3073                                 }
3074                                 throw new $TypeError$2('"exec" method must return `null` or an Object');
3075                         }
3076                         return regexExec$1(R, S);
3077                 },
3078
3079                 // https://ecma-international.org/ecma-262/6.0/#sec-arrayspeciescreate
3080                 ArraySpeciesCreate: function ArraySpeciesCreate(originalArray, length) {
3081                         if (!this.IsInteger(length) || length < 0) {
3082                                 throw new $TypeError$2('Assertion failed: length must be an integer >= 0');
3083                         }
3084                         var len = length === 0 ? 0 : length;
3085                         var C;
3086                         var isArray = this.IsArray(originalArray);
3087                         if (isArray) {
3088                                 C = this.Get(originalArray, 'constructor');
3089                                 // TODO: figure out how to make a cross-realm normal Array, a same-realm Array
3090                                 // if (this.IsConstructor(C)) {
3091                                 //      if C is another realm's Array, C = undefined
3092                                 //      Object.getPrototypeOf(Object.getPrototypeOf(Object.getPrototypeOf(Array))) === null ?
3093                                 // }
3094                                 if (this.Type(C) === 'Object' && hasSymbols$4 && $Symbol.species) {
3095                                         C = this.Get(C, $Symbol.species);
3096                                         if (C === null) {
3097                                                 C = void 0;
3098                                         }
3099                                 }
3100                         }
3101                         if (typeof C === 'undefined') {
3102                                 return $Array(len);
3103                         }
3104                         if (!this.IsConstructor(C)) {
3105                                 throw new $TypeError$2('C must be a constructor');
3106                         }
3107                         return new C(len); // this.Construct(C, len);
3108                 },
3109
3110                 CreateDataProperty: function CreateDataProperty(O, P, V) {
3111                         if (this.Type(O) !== 'Object') {
3112                                 throw new $TypeError$2('Assertion failed: Type(O) is not Object');
3113                         }
3114                         if (!this.IsPropertyKey(P)) {
3115                                 throw new $TypeError$2('Assertion failed: IsPropertyKey(P) is not true');
3116                         }
3117                         var oldDesc = $gOPD(O, P);
3118                         var extensible = oldDesc || (typeof $isExtensible !== 'function' || $isExtensible(O));
3119                         var immutable = oldDesc && (!oldDesc.writable || !oldDesc.configurable);
3120                         if (immutable || !extensible) {
3121                                 return false;
3122                         }
3123                         var newDesc = {
3124                                 configurable: true,
3125                                 enumerable: true,
3126                                 value: V,
3127                                 writable: true
3128                         };
3129                         $defineProperty(O, P, newDesc);
3130                         return true;
3131                 },
3132
3133                 // https://ecma-international.org/ecma-262/6.0/#sec-createdatapropertyorthrow
3134                 CreateDataPropertyOrThrow: function CreateDataPropertyOrThrow(O, P, V) {
3135                         if (this.Type(O) !== 'Object') {
3136                                 throw new $TypeError$2('Assertion failed: Type(O) is not Object');
3137                         }
3138                         if (!this.IsPropertyKey(P)) {
3139                                 throw new $TypeError$2('Assertion failed: IsPropertyKey(P) is not true');
3140                         }
3141                         var success = this.CreateDataProperty(O, P, V);
3142                         if (!success) {
3143                                 throw new $TypeError$2('unable to create data property');
3144                         }
3145                         return success;
3146                 },
3147
3148                 // https://www.ecma-international.org/ecma-262/6.0/#sec-objectcreate
3149                 ObjectCreate: function ObjectCreate(proto, internalSlotsList) {
3150                         if (proto !== null && this.Type(proto) !== 'Object') {
3151                                 throw new $TypeError$2('Assertion failed: proto must be null or an object');
3152                         }
3153                         var slots = arguments.length < 2 ? [] : internalSlotsList;
3154                         if (slots.length > 0) {
3155                                 throw new $SyntaxError$1('es-abstract does not yet support internal slots');
3156                         }
3157
3158                         if (proto === null && !$ObjectCreate) {
3159                                 throw new $SyntaxError$1('native Object.create support is required to create null objects');
3160                         }
3161
3162                         return $ObjectCreate(proto);
3163                 },
3164
3165                 // https://ecma-international.org/ecma-262/6.0/#sec-advancestringindex
3166                 AdvanceStringIndex: function AdvanceStringIndex(S, index, unicode) {
3167                         if (this.Type(S) !== 'String') {
3168                                 throw new $TypeError$2('S must be a String');
3169                         }
3170                         if (!this.IsInteger(index) || index < 0 || index > MAX_SAFE_INTEGER) {
3171                                 throw new $TypeError$2('Assertion failed: length must be an integer >= 0 and <= 2**53');
3172                         }
3173                         if (this.Type(unicode) !== 'Boolean') {
3174                                 throw new $TypeError$2('Assertion failed: unicode must be a Boolean');
3175                         }
3176                         if (!unicode) {
3177                                 return index + 1;
3178                         }
3179                         var length = S.length;
3180                         if ((index + 1) >= length) {
3181                                 return index + 1;
3182                         }
3183
3184                         var first = $charCodeAt(S, index);
3185                         if (first < 0xD800 || first > 0xDBFF) {
3186                                 return index + 1;
3187                         }
3188
3189                         var second = $charCodeAt(S, index + 1);
3190                         if (second < 0xDC00 || second > 0xDFFF) {
3191                                 return index + 1;
3192                         }
3193
3194                         return index + 2;
3195                 },
3196
3197                 // https://www.ecma-international.org/ecma-262/6.0/#sec-createmethodproperty
3198                 CreateMethodProperty: function CreateMethodProperty(O, P, V) {
3199                         if (this.Type(O) !== 'Object') {
3200                                 throw new $TypeError$2('Assertion failed: Type(O) is not Object');
3201                         }
3202
3203                         if (!this.IsPropertyKey(P)) {
3204                                 throw new $TypeError$2('Assertion failed: IsPropertyKey(P) is not true');
3205                         }
3206
3207                         var newDesc = {
3208                                 configurable: true,
3209                                 enumerable: false,
3210                                 value: V,
3211                                 writable: true
3212                         };
3213                         return !!$defineProperty(O, P, newDesc);
3214                 },
3215
3216                 // https://www.ecma-international.org/ecma-262/6.0/#sec-definepropertyorthrow
3217                 DefinePropertyOrThrow: function DefinePropertyOrThrow(O, P, desc) {
3218                         if (this.Type(O) !== 'Object') {
3219                                 throw new $TypeError$2('Assertion failed: Type(O) is not Object');
3220                         }
3221
3222                         if (!this.IsPropertyKey(P)) {
3223                                 throw new $TypeError$2('Assertion failed: IsPropertyKey(P) is not true');
3224                         }
3225
3226                         return !!$defineProperty(O, P, desc);
3227                 },
3228
3229                 // https://www.ecma-international.org/ecma-262/6.0/#sec-deletepropertyorthrow
3230                 DeletePropertyOrThrow: function DeletePropertyOrThrow(O, P) {
3231                         if (this.Type(O) !== 'Object') {
3232                                 throw new $TypeError$2('Assertion failed: Type(O) is not Object');
3233                         }
3234
3235                         if (!this.IsPropertyKey(P)) {
3236                                 throw new $TypeError$2('Assertion failed: IsPropertyKey(P) is not true');
3237                         }
3238
3239                         var success = delete O[P];
3240                         if (!success) {
3241                                 throw new TypeError('Attempt to delete property failed.');
3242                         }
3243                         return success;
3244                 },
3245
3246                 // https://www.ecma-international.org/ecma-262/6.0/#sec-enumerableownnames
3247                 EnumerableOwnNames: function EnumerableOwnNames(O) {
3248                         if (this.Type(O) !== 'Object') {
3249                                 throw new $TypeError$2('Assertion failed: Type(O) is not Object');
3250                         }
3251
3252                         return objectKeys(O);
3253                 },
3254
3255                 // https://ecma-international.org/ecma-262/6.0/#sec-properties-of-the-number-prototype-object
3256                 thisNumberValue: function thisNumberValue(value) {
3257                         if (this.Type(value) === 'Number') {
3258                                 return value;
3259                         }
3260
3261                         return $NumberValueOf(value);
3262                 },
3263
3264                 // https://ecma-international.org/ecma-262/6.0/#sec-properties-of-the-boolean-prototype-object
3265                 thisBooleanValue: function thisBooleanValue(value) {
3266                         if (this.Type(value) === 'Boolean') {
3267                                 return value;
3268                         }
3269
3270                         return $BooleanValueOf(value);
3271                 },
3272
3273                 // https://ecma-international.org/ecma-262/6.0/#sec-properties-of-the-string-prototype-object
3274                 thisStringValue: function thisStringValue(value) {
3275                         if (this.Type(value) === 'String') {
3276                                 return value;
3277                         }
3278
3279                         return $StringValueOf(value);
3280                 },
3281
3282                 // https://ecma-international.org/ecma-262/6.0/#sec-properties-of-the-date-prototype-object
3283                 thisTimeValue: function thisTimeValue(value) {
3284                         return $DateValueOf(value);
3285                 }
3286         });
3287
3288         delete ES6.CheckObjectCoercible; // renamed in ES6 to RequireObjectCoercible
3289
3290         var es2015$1 = ES6;
3291
3292         var es6$1 = es2015$1;
3293
3294         var implementation$2 = function find(predicate) {
3295                 var list = es6$1.ToObject(this);
3296                 var length = es6$1.ToInteger(es6$1.ToLength(list.length));
3297                 if (!es6$1.IsCallable(predicate)) {
3298                         throw new TypeError('Array#find: predicate must be a function');
3299                 }
3300                 if (length === 0) {
3301                         return undefined;
3302                 }
3303                 var thisArg = arguments[1];
3304                 for (var i = 0, value; i < length; i++) {
3305                         value = list[i];
3306                         if (es6$1.Call(predicate, thisArg, [value, i, list])) {
3307                                 return value;
3308                         }
3309                 }
3310                 return undefined;
3311         };
3312
3313         var polyfill$3 = function getPolyfill() {
3314                 // Detect if an implementation exists
3315                 // Detect early implementations which skipped holes in sparse arrays
3316           // eslint-disable-next-line no-sparse-arrays
3317                 var implemented = Array.prototype.find && [, 1].find(function () {
3318                         return true;
3319                 }) !== 1;
3320
3321           // eslint-disable-next-line global-require
3322                 return implemented ? Array.prototype.find : implementation$2;
3323         };
3324
3325         var shim$8 = function shimArrayPrototypeFind() {
3326                 var polyfill = polyfill$3();
3327
3328                 defineProperties_1(Array.prototype, { find: polyfill }, {
3329                         find: function () {
3330                                 return Array.prototype.find !== polyfill;
3331                         }
3332                 });
3333
3334                 return polyfill;
3335         };
3336
3337         var slice$2 = Array.prototype.slice;
3338
3339         var polyfill$4 = polyfill$3();
3340
3341         var boundFindShim = function find(array, predicate) { // eslint-disable-line no-unused-vars
3342                 es6$1.RequireObjectCoercible(array);
3343                 var args = slice$2.call(arguments, 1);
3344                 return polyfill$4.apply(array, args);
3345         };
3346
3347         defineProperties_1(boundFindShim, {
3348                 getPolyfill: polyfill$3,
3349                 implementation: implementation$2,
3350                 shim: shim$8
3351         });
3352
3353         var array_prototype_find = boundFindShim;
3354
3355         var implementation$3 = function findIndex(predicate) {
3356                 var list = es6$1.ToObject(this);
3357                 var length = es6$1.ToLength(list.length);
3358                 if (!es6$1.IsCallable(predicate)) {
3359                         throw new TypeError('Array#findIndex: predicate must be a function');
3360                 }
3361                 if (length === 0) return -1;
3362                 var thisArg = arguments[1];
3363                 for (var i = 0, value; i < length; i++) {
3364                         value = list[i];
3365                         if (es6$1.Call(predicate, thisArg, [value, i, list])) return i;
3366                 }
3367                 return -1;
3368         };
3369
3370         var polyfill$5 = function getPolyfill() {
3371                 // Detect if an implementation exists
3372                 // Detect early implementations which skipped holes in sparse arrays
3373                 var implemented = Array.prototype.findIndex && ([, 1].findIndex(function (item, idx) {
3374                         return idx === 0;
3375                 }) === 0);
3376
3377
3378                 return implemented ? Array.prototype.findIndex : implementation$3;
3379         };
3380
3381         var shim$9 = function shimArrayPrototypeFindIndex() {
3382                 var polyfill = polyfill$5();
3383
3384                 defineProperties_1(Array.prototype, { findIndex: polyfill }, {
3385                         findIndex: function () {
3386                                 return Array.prototype.findIndex !== polyfill;
3387                         }
3388                 });
3389
3390                 return polyfill;
3391         };
3392
3393         var slice$3 = Array.prototype.slice;
3394
3395         var polyfill$6 = polyfill$5();
3396
3397         var boundShim = function findIndex(array, predicate) {
3398                 es6$1.RequireObjectCoercible(array);
3399                 var args = slice$3.call(arguments, 1);
3400                 return polyfill$6.apply(array, args);
3401         };
3402
3403         defineProperties_1(boundShim, {
3404                 implementation: implementation$3,
3405                 getPolyfill: polyfill$5,
3406                 shim: shim$9
3407         });
3408
3409         var array_prototype_findindex = boundShim;
3410
3411         var supportsDescriptors$1 = defineProperties_1.supportsDescriptors;
3412
3413         /*! https://mths.be/array-from v0.2.0 by @mathias */
3414         var implementation$4 = function from(arrayLike) {
3415                 var defineProperty = supportsDescriptors$1 ? Object.defineProperty : function put(object, key, descriptor) {
3416                         object[key] = descriptor.value;
3417                 };
3418                 var C = this;
3419                 if (arrayLike === null || typeof arrayLike === 'undefined') {
3420                         throw new TypeError('`Array.from` requires an array-like object, not `null` or `undefined`');
3421                 }
3422                 var items = es6$1.ToObject(arrayLike);
3423
3424                 var mapFn, T;
3425                 if (typeof arguments[1] !== 'undefined') {
3426                         mapFn = arguments[1];
3427                         if (!es6$1.IsCallable(mapFn)) {
3428                                 throw new TypeError('When provided, the second argument to `Array.from` must be a function');
3429                         }
3430                         if (arguments.length > 2) {
3431                                 T = arguments[2];
3432                         }
3433                 }
3434
3435                 var len = es6$1.ToLength(items.length);
3436                 var A = es6$1.IsCallable(C) ? es6$1.ToObject(new C(len)) : new Array(len);
3437                 var k = 0;
3438                 var kValue, mappedValue;
3439                 while (k < len) {
3440                         kValue = items[k];
3441                         if (mapFn) {
3442                                 mappedValue = typeof T === 'undefined' ? mapFn(kValue, k) : es6$1.Call(mapFn, T, [kValue, k]);
3443                         } else {
3444                                 mappedValue = kValue;
3445                         }
3446                         defineProperty(A, k, {
3447                                 'configurable': true,
3448                                 'enumerable': true,
3449                                 'value': mappedValue,
3450                                 'writable': true
3451                         });
3452                         k += 1;
3453                 }
3454                 A.length = len;
3455                 return A;
3456         };
3457
3458         var tryCall = function (fn) {
3459                 try {
3460                         fn();
3461                         return true;
3462                 } catch (e) {
3463                         return false;
3464                 }
3465         };
3466
3467         var polyfill$7 = function getPolyfill() {
3468                 var implemented = es6$1.IsCallable(Array.from)
3469                         && tryCall(function () { })
3470                         && !tryCall(function () { });
3471
3472                 return implemented ? Array.from : implementation$4;
3473         };
3474
3475         var shim$a = function shimArrayFrom() {
3476                 var polyfill = polyfill$7();
3477
3478                 defineProperties_1(Array, { 'from': polyfill }, {
3479                         'from': function () {
3480                                 return Array.from !== polyfill;
3481                         }
3482                 });
3483
3484                 return polyfill;
3485         };
3486
3487         // eslint-disable-next-line no-unused-vars
3488         var boundFromShim = function from(array) {
3489             // eslint-disable-next-line no-invalid-this
3490                 return implementation$4.apply(this || Array, arguments);
3491         };
3492
3493         defineProperties_1(boundFromShim, {
3494                 'getPolyfill': polyfill$7,
3495                 'implementation': implementation$4,
3496                 'shim': shim$a
3497         });
3498
3499         var array_from = boundFromShim;
3500
3501         var ES2016 = assign$1(assign$1({}, es2015$1), {
3502                 // https://github.com/tc39/ecma262/pull/60
3503                 SameValueNonNumber: function SameValueNonNumber(x, y) {
3504                         if (typeof x === 'number' || typeof x !== typeof y) {
3505                                 throw new TypeError('SameValueNonNumber requires two non-number values of the same type.');
3506                         }
3507                         return this.SameValue(x, y);
3508                 }
3509         });
3510
3511         var es2016 = ES2016;
3512
3513         var es7 = es2016;
3514
3515         var isEnumerable$1 = functionBind.call(Function.call, Object.prototype.propertyIsEnumerable);
3516
3517         var implementation$5 = function values(O) {
3518                 var obj = es7.RequireObjectCoercible(O);
3519                 var vals = [];
3520                 for (var key in obj) {
3521                         if (src(obj, key) && isEnumerable$1(obj, key)) {
3522                                 vals.push(obj[key]);
3523                         }
3524                 }
3525                 return vals;
3526         };
3527
3528         var polyfill$8 = function getPolyfill() {
3529                 return typeof Object.values === 'function' ? Object.values : implementation$5;
3530         };
3531
3532         var shim$b = function shimValues() {
3533                 var polyfill = polyfill$8();
3534                 defineProperties_1(Object, { values: polyfill }, {
3535                         values: function testValues() {
3536                                 return Object.values !== polyfill;
3537                         }
3538                 });
3539                 return polyfill;
3540         };
3541
3542         var polyfill$9 = polyfill$8();
3543
3544         defineProperties_1(polyfill$9, {
3545                 getPolyfill: polyfill$8,
3546                 implementation: implementation$5,
3547                 shim: shim$b
3548         });
3549
3550         var object_values = polyfill$9;
3551
3552         // modified from https://github.com/es-shims/es6-shim
3553
3554
3555         var canBeObject = function (obj) {
3556                 return typeof obj !== 'undefined' && obj !== null;
3557         };
3558         var hasSymbols$5 = shams();
3559         var toObject = Object;
3560         var push = functionBind.call(Function.call, Array.prototype.push);
3561         var propIsEnumerable = functionBind.call(Function.call, Object.prototype.propertyIsEnumerable);
3562         var originalGetSymbols = hasSymbols$5 ? Object.getOwnPropertySymbols : null;
3563
3564         var implementation$6 = function assign(target, source1) {
3565                 if (!canBeObject(target)) { throw new TypeError('target must be an object'); }
3566                 var objTarget = toObject(target);
3567                 var s, source, i, props, syms, value, key;
3568                 for (s = 1; s < arguments.length; ++s) {
3569                         source = toObject(arguments[s]);
3570                         props = objectKeys(source);
3571                         var getSymbols = hasSymbols$5 && (Object.getOwnPropertySymbols || originalGetSymbols);
3572                         if (getSymbols) {
3573                                 syms = getSymbols(source);
3574                                 for (i = 0; i < syms.length; ++i) {
3575                                         key = syms[i];
3576                                         if (propIsEnumerable(source, key)) {
3577                                                 push(props, key);
3578                                         }
3579                                 }
3580                         }
3581                         for (i = 0; i < props.length; ++i) {
3582                                 key = props[i];
3583                                 value = source[key];
3584                                 if (propIsEnumerable(source, key)) {
3585                                         objTarget[key] = value;
3586                                 }
3587                         }
3588                 }
3589                 return objTarget;
3590         };
3591
3592         var lacksProperEnumerationOrder = function () {
3593                 if (!Object.assign) {
3594                         return false;
3595                 }
3596                 // v8, specifically in node 4.x, has a bug with incorrect property enumeration order
3597                 // note: this does not detect the bug unless there's 20 characters
3598                 var str = 'abcdefghijklmnopqrst';
3599                 var letters = str.split('');
3600                 var map = {};
3601                 for (var i = 0; i < letters.length; ++i) {
3602                         map[letters[i]] = letters[i];
3603                 }
3604                 var obj = Object.assign({}, map);
3605                 var actual = '';
3606                 for (var k in obj) {
3607                         actual += k;
3608                 }
3609                 return str !== actual;
3610         };
3611
3612         var assignHasPendingExceptions = function () {
3613                 if (!Object.assign || !Object.preventExtensions) {
3614                         return false;
3615                 }
3616                 // Firefox 37 still has "pending exception" logic in its Object.assign implementation,
3617                 // which is 72% slower than our shim, and Firefox 40's native implementation.
3618                 var thrower = Object.preventExtensions({ 1: 2 });
3619                 try {
3620                         Object.assign(thrower, 'xy');
3621                 } catch (e) {
3622                         return thrower[1] === 'y';
3623                 }
3624                 return false;
3625         };
3626
3627         var polyfill$a = function getPolyfill() {
3628                 if (!Object.assign) {
3629                         return implementation$6;
3630                 }
3631                 if (lacksProperEnumerationOrder()) {
3632                         return implementation$6;
3633                 }
3634                 if (assignHasPendingExceptions()) {
3635                         return implementation$6;
3636                 }
3637                 return Object.assign;
3638         };
3639
3640         var shim$c = function shimAssign() {
3641                 var polyfill = polyfill$a();
3642                 defineProperties_1(
3643                         Object,
3644                         { assign: polyfill },
3645                         { assign: function () { return Object.assign !== polyfill; } }
3646                 );
3647                 return polyfill;
3648         };
3649
3650         var polyfill$b = polyfill$a();
3651
3652         defineProperties_1(polyfill$b, {
3653                 getPolyfill: polyfill$a,
3654                 implementation: implementation$6,
3655                 shim: shim$c
3656         });
3657
3658         var object_assign = polyfill$b;
3659
3660         /**
3661          * @this {Promise}
3662          */
3663         function finallyConstructor(callback) {
3664           var constructor = this.constructor;
3665           return this.then(
3666             function(value) {
3667               return constructor.resolve(callback()).then(function() {
3668                 return value;
3669               });
3670             },
3671             function(reason) {
3672               return constructor.resolve(callback()).then(function() {
3673                 return constructor.reject(reason);
3674               });
3675             }
3676           );
3677         }
3678
3679         // Store setTimeout reference so promise-polyfill will be unaffected by
3680         // other code modifying setTimeout (like sinon.useFakeTimers())
3681         var setTimeoutFunc = setTimeout;
3682
3683         function noop$1() {}
3684
3685         // Polyfill for Function.prototype.bind
3686         function bind$2(fn, thisArg) {
3687           return function() {
3688             fn.apply(thisArg, arguments);
3689           };
3690         }
3691
3692         /**
3693          * @constructor
3694          * @param {Function} fn
3695          */
3696         function Promise$1(fn) {
3697           if (!(this instanceof Promise$1))
3698             throw new TypeError('Promises must be constructed via new');
3699           if (typeof fn !== 'function') throw new TypeError('not a function');
3700           /** @type {!number} */
3701           this._state = 0;
3702           /** @type {!boolean} */
3703           this._handled = false;
3704           /** @type {Promise|undefined} */
3705           this._value = undefined;
3706           /** @type {!Array<!Function>} */
3707           this._deferreds = [];
3708
3709           doResolve(fn, this);
3710         }
3711
3712         function handle(self, deferred) {
3713           while (self._state === 3) {
3714             self = self._value;
3715           }
3716           if (self._state === 0) {
3717             self._deferreds.push(deferred);
3718             return;
3719           }
3720           self._handled = true;
3721           Promise$1._immediateFn(function() {
3722             var cb = self._state === 1 ? deferred.onFulfilled : deferred.onRejected;
3723             if (cb === null) {
3724               (self._state === 1 ? resolve : reject)(deferred.promise, self._value);
3725               return;
3726             }
3727             var ret;
3728             try {
3729               ret = cb(self._value);
3730             } catch (e) {
3731               reject(deferred.promise, e);
3732               return;
3733             }
3734             resolve(deferred.promise, ret);
3735           });
3736         }
3737
3738         function resolve(self, newValue) {
3739           try {
3740             // Promise Resolution Procedure: https://github.com/promises-aplus/promises-spec#the-promise-resolution-procedure
3741             if (newValue === self)
3742               throw new TypeError('A promise cannot be resolved with itself.');
3743             if (
3744               newValue &&
3745               (typeof newValue === 'object' || typeof newValue === 'function')
3746             ) {
3747               var then = newValue.then;
3748               if (newValue instanceof Promise$1) {
3749                 self._state = 3;
3750                 self._value = newValue;
3751                 finale(self);
3752                 return;
3753               } else if (typeof then === 'function') {
3754                 doResolve(bind$2(then, newValue), self);
3755                 return;
3756               }
3757             }
3758             self._state = 1;
3759             self._value = newValue;
3760             finale(self);
3761           } catch (e) {
3762             reject(self, e);
3763           }
3764         }
3765
3766         function reject(self, newValue) {
3767           self._state = 2;
3768           self._value = newValue;
3769           finale(self);
3770         }
3771
3772         function finale(self) {
3773           if (self._state === 2 && self._deferreds.length === 0) {
3774             Promise$1._immediateFn(function() {
3775               if (!self._handled) {
3776                 Promise$1._unhandledRejectionFn(self._value);
3777               }
3778             });
3779           }
3780
3781           for (var i = 0, len = self._deferreds.length; i < len; i++) {
3782             handle(self, self._deferreds[i]);
3783           }
3784           self._deferreds = null;
3785         }
3786
3787         /**
3788          * @constructor
3789          */
3790         function Handler(onFulfilled, onRejected, promise) {
3791           this.onFulfilled = typeof onFulfilled === 'function' ? onFulfilled : null;
3792           this.onRejected = typeof onRejected === 'function' ? onRejected : null;
3793           this.promise = promise;
3794         }
3795
3796         /**
3797          * Take a potentially misbehaving resolver function and make sure
3798          * onFulfilled and onRejected are only called once.
3799          *
3800          * Makes no guarantees about asynchrony.
3801          */
3802         function doResolve(fn, self) {
3803           var done = false;
3804           try {
3805             fn(
3806               function(value) {
3807                 if (done) return;
3808                 done = true;
3809                 resolve(self, value);
3810               },
3811               function(reason) {
3812                 if (done) return;
3813                 done = true;
3814                 reject(self, reason);
3815               }
3816             );
3817           } catch (ex) {
3818             if (done) return;
3819             done = true;
3820             reject(self, ex);
3821           }
3822         }
3823
3824         Promise$1.prototype['catch'] = function(onRejected) {
3825           return this.then(null, onRejected);
3826         };
3827
3828         Promise$1.prototype.then = function(onFulfilled, onRejected) {
3829           // @ts-ignore
3830           var prom = new this.constructor(noop$1);
3831
3832           handle(this, new Handler(onFulfilled, onRejected, prom));
3833           return prom;
3834         };
3835
3836         Promise$1.prototype['finally'] = finallyConstructor;
3837
3838         Promise$1.all = function(arr) {
3839           return new Promise$1(function(resolve, reject) {
3840             if (!arr || typeof arr.length === 'undefined')
3841               throw new TypeError('Promise.all accepts an array');
3842             var args = Array.prototype.slice.call(arr);
3843             if (args.length === 0) return resolve([]);
3844             var remaining = args.length;
3845
3846             function res(i, val) {
3847               try {
3848                 if (val && (typeof val === 'object' || typeof val === 'function')) {
3849                   var then = val.then;
3850                   if (typeof then === 'function') {
3851                     then.call(
3852                       val,
3853                       function(val) {
3854                         res(i, val);
3855                       },
3856                       reject
3857                     );
3858                     return;
3859                   }
3860                 }
3861                 args[i] = val;
3862                 if (--remaining === 0) {
3863                   resolve(args);
3864                 }
3865               } catch (ex) {
3866                 reject(ex);
3867               }
3868             }
3869
3870             for (var i = 0; i < args.length; i++) {
3871               res(i, args[i]);
3872             }
3873           });
3874         };
3875
3876         Promise$1.resolve = function(value) {
3877           if (value && typeof value === 'object' && value.constructor === Promise$1) {
3878             return value;
3879           }
3880
3881           return new Promise$1(function(resolve) {
3882             resolve(value);
3883           });
3884         };
3885
3886         Promise$1.reject = function(value) {
3887           return new Promise$1(function(resolve, reject) {
3888             reject(value);
3889           });
3890         };
3891
3892         Promise$1.race = function(values) {
3893           return new Promise$1(function(resolve, reject) {
3894             for (var i = 0, len = values.length; i < len; i++) {
3895               values[i].then(resolve, reject);
3896             }
3897           });
3898         };
3899
3900         // Use polyfill for setImmediate for performance gains
3901         Promise$1._immediateFn =
3902           (typeof setImmediate === 'function' &&
3903             function(fn) {
3904               setImmediate(fn);
3905             }) ||
3906           function(fn) {
3907             setTimeoutFunc(fn, 0);
3908           };
3909
3910         Promise$1._unhandledRejectionFn = function _unhandledRejectionFn(err) {
3911           if (typeof console !== 'undefined' && console) {
3912             console.warn('Possible Unhandled Promise Rejection:', err); // eslint-disable-line no-console
3913           }
3914         };
3915
3916         /** @suppress {undefinedVars} */
3917         var globalNS = (function() {
3918           // the only reliable means to get the global object is
3919           // `Function('return this')()`
3920           // However, this causes CSP violations in Chrome apps.
3921           if (typeof self !== 'undefined') {
3922             return self;
3923           }
3924           if (typeof window !== 'undefined') {
3925             return window;
3926           }
3927           if (typeof global !== 'undefined') {
3928             return global;
3929           }
3930           throw new Error('unable to locate global object');
3931         })();
3932
3933         if (!('Promise' in globalNS)) {
3934           globalNS['Promise'] = Promise$1;
3935         } else if (!globalNS.Promise.prototype['finally']) {
3936           globalNS.Promise.prototype['finally'] = finallyConstructor;
3937         }
3938
3939         var polyfill$c = /*#__PURE__*/Object.freeze({
3940
3941         });
3942
3943         var setAsap = createCommonjsModule(function (module) {
3944         (function (thisVar, undefined$1) {
3945                 var main = (typeof window === 'object' && window) || (typeof commonjsGlobal === 'object' && commonjsGlobal) ||
3946                         typeof self === 'object' && self || thisVar;
3947
3948                 var hasSetImmediate = typeof setImmediate === 'function';
3949                 var hasNextTick = typeof process === 'object' && !!process && typeof process.nextTick === 'function';
3950                 var index = 0;
3951
3952                 function getNewIndex() {
3953                         if (index === 9007199254740991) {
3954                                 return 0;
3955                         }
3956                         return ++index;
3957                 }
3958
3959                 var setAsap = (function () {
3960                         var hiddenDiv, scriptEl, timeoutFn, callbacks;
3961
3962                         // Modern browsers, fastest async
3963                         if (main.MutationObserver) {
3964                                 return function setAsap(callback) {
3965                                         hiddenDiv = document.createElement("div");
3966                                         (new MutationObserver(function() {
3967                                                 callback();
3968                                                 hiddenDiv = null;
3969                                         })).observe(hiddenDiv, { attributes: true });
3970                                         hiddenDiv.setAttribute('i', '1');
3971                                 };
3972
3973                         // Browsers that support postMessage
3974                         } else if (!hasSetImmediate && main.postMessage && !main.importScripts && main.addEventListener) {
3975
3976                                 var MESSAGE_PREFIX = "com.setImmediate" + Math.random();
3977                                 callbacks = {};
3978
3979                                 var onGlobalMessage = function (event) {
3980                                         if (event.source === main && event.data.indexOf(MESSAGE_PREFIX) === 0) {
3981                                                 var i = +event.data.split(':')[1];
3982                                                 callbacks[i]();
3983                                                 delete callbacks[i];
3984                                         }
3985                                 };
3986
3987                                 main.addEventListener("message", onGlobalMessage, false);
3988
3989                                 return function setAsap(callback) {
3990                                         var i = getNewIndex();
3991                                         callbacks[i] = callback;
3992                                         main.postMessage(MESSAGE_PREFIX + ':' + i, "*");
3993                                 };
3994
3995                                 // IE browsers without postMessage
3996                         } else if (!hasSetImmediate && main.document && 'onreadystatechange' in document.createElement('script')) {
3997
3998                                 return function setAsap(callback) {
3999                                         scriptEl = document.createElement("script");
4000                                         scriptEl.onreadystatechange = function onreadystatechange() {
4001                                                 scriptEl.onreadystatechange = null;
4002                                                 scriptEl.parentNode.removeChild(scriptEl);
4003                                                 scriptEl = null;
4004                                                 callback();
4005                                         };
4006                                         document.body.appendChild(scriptEl);
4007                                 };
4008
4009                         // All other browsers and node
4010                         } else {
4011
4012                                 timeoutFn = (hasSetImmediate && setImmediate) || (hasNextTick && process.nextTick) || setTimeout;
4013                                 return function setAsap(callback) {
4014                                         timeoutFn(callback);
4015                                 };
4016                         }
4017
4018                 })();
4019
4020                 if (module.exports) {
4021                         module.exports = setAsap;
4022                 } else if (typeof commonjsRequire !== 'undefined' && commonjsRequire.amd) {
4023                         undefined$1(function () {
4024                                 return setAsap;
4025                         });
4026                 } else {
4027                         main.setAsap = setAsap;
4028                 }
4029         })(commonjsGlobal);
4030         });
4031
4032         var performanceNow = createCommonjsModule(function (module) {
4033         // Generated by CoffeeScript 1.12.2
4034         (function() {
4035           var getNanoSeconds, hrtime, loadTime, moduleLoadTime, nodeLoadTime, upTime;
4036
4037           if ((typeof performance !== "undefined" && performance !== null) && performance.now) {
4038             module.exports = function() {
4039               return performance.now();
4040             };
4041           } else if ((typeof process !== "undefined" && process !== null) && process.hrtime) {
4042             module.exports = function() {
4043               return (getNanoSeconds() - nodeLoadTime) / 1e6;
4044             };
4045             hrtime = process.hrtime;
4046             getNanoSeconds = function() {
4047               var hr;
4048               hr = hrtime();
4049               return hr[0] * 1e9 + hr[1];
4050             };
4051             moduleLoadTime = getNanoSeconds();
4052             upTime = process.uptime() * 1e9;
4053             nodeLoadTime = moduleLoadTime - upTime;
4054           } else if (Date.now) {
4055             module.exports = function() {
4056               return Date.now() - loadTime;
4057             };
4058             loadTime = Date.now();
4059           } else {
4060             module.exports = function() {
4061               return new Date().getTime() - loadTime;
4062             };
4063             loadTime = new Date().getTime();
4064           }
4065
4066         }).call(commonjsGlobal);
4067
4068
4069         });
4070
4071         var root = typeof window === 'undefined' ? commonjsGlobal : window
4072           , vendors = ['moz', 'webkit']
4073           , suffix = 'AnimationFrame'
4074           , raf = root['request' + suffix]
4075           , caf = root['cancel' + suffix] || root['cancelRequest' + suffix];
4076
4077         for(var i = 0; !raf && i < vendors.length; i++) {
4078           raf = root[vendors[i] + 'Request' + suffix];
4079           caf = root[vendors[i] + 'Cancel' + suffix]
4080               || root[vendors[i] + 'CancelRequest' + suffix];
4081         }
4082
4083         // Some versions of FF have rAF but not cAF
4084         if(!raf || !caf) {
4085           var last = 0
4086             , id$3 = 0
4087             , queue = []
4088             , frameDuration = 1000 / 60;
4089
4090           raf = function(callback) {
4091             if(queue.length === 0) {
4092               var _now = performanceNow()
4093                 , next = Math.max(0, frameDuration - (_now - last));
4094               last = next + _now;
4095               setTimeout(function() {
4096                 var cp = queue.slice(0);
4097                 // Clear queue here to prevent
4098                 // callbacks from appending listeners
4099                 // to the current frame's queue
4100                 queue.length = 0;
4101                 for(var i = 0; i < cp.length; i++) {
4102                   if(!cp[i].cancelled) {
4103                     try{
4104                       cp[i].callback(last);
4105                     } catch(e) {
4106                       setTimeout(function() { throw e }, 0);
4107                     }
4108                   }
4109                 }
4110               }, Math.round(next));
4111             }
4112             queue.push({
4113               handle: ++id$3,
4114               callback: callback,
4115               cancelled: false
4116             });
4117             return id$3
4118           };
4119
4120           caf = function(handle) {
4121             for(var i = 0; i < queue.length; i++) {
4122               if(queue[i].handle === handle) {
4123                 queue[i].cancelled = true;
4124               }
4125             }
4126           };
4127         }
4128
4129         var raf_1 = function(fn) {
4130           // Wrap in a new function to prevent
4131           // `cancel` potentially being assigned
4132           // to the native rAF function
4133           return raf.call(root, fn)
4134         };
4135         var cancel = function() {
4136           caf.apply(root, arguments);
4137         };
4138         var polyfill$d = function(object) {
4139           if (!object) {
4140             object = root;
4141           }
4142           object.requestAnimationFrame = raf;
4143           object.cancelAnimationFrame = caf;
4144         };
4145         raf_1.cancel = cancel;
4146         raf_1.polyfill = polyfill$d;
4147
4148         var support = {
4149           searchParams: 'URLSearchParams' in self,
4150           iterable: 'Symbol' in self && 'iterator' in Symbol,
4151           blob:
4152             'FileReader' in self &&
4153             'Blob' in self &&
4154             (function() {
4155               try {
4156                 new Blob();
4157                 return true
4158               } catch (e) {
4159                 return false
4160               }
4161             })(),
4162           formData: 'FormData' in self,
4163           arrayBuffer: 'ArrayBuffer' in self
4164         };
4165
4166         function isDataView(obj) {
4167           return obj && DataView.prototype.isPrototypeOf(obj)
4168         }
4169
4170         if (support.arrayBuffer) {
4171           var viewClasses = [
4172             '[object Int8Array]',
4173             '[object Uint8Array]',
4174             '[object Uint8ClampedArray]',
4175             '[object Int16Array]',
4176             '[object Uint16Array]',
4177             '[object Int32Array]',
4178             '[object Uint32Array]',
4179             '[object Float32Array]',
4180             '[object Float64Array]'
4181           ];
4182
4183           var isArrayBufferView =
4184             ArrayBuffer.isView ||
4185             function(obj) {
4186               return obj && viewClasses.indexOf(Object.prototype.toString.call(obj)) > -1
4187             };
4188         }
4189
4190         function normalizeName(name) {
4191           if (typeof name !== 'string') {
4192             name = String(name);
4193           }
4194           if (/[^a-z0-9\-#$%&'*+.^_`|~]/i.test(name)) {
4195             throw new TypeError('Invalid character in header field name')
4196           }
4197           return name.toLowerCase()
4198         }
4199
4200         function normalizeValue(value) {
4201           if (typeof value !== 'string') {
4202             value = String(value);
4203           }
4204           return value
4205         }
4206
4207         // Build a destructive iterator for the value list
4208         function iteratorFor(items) {
4209           var iterator = {
4210             next: function() {
4211               var value = items.shift();
4212               return {done: value === undefined, value: value}
4213             }
4214           };
4215
4216           if (support.iterable) {
4217             iterator[Symbol.iterator] = function() {
4218               return iterator
4219             };
4220           }
4221
4222           return iterator
4223         }
4224
4225         function Headers(headers) {
4226           this.map = {};
4227
4228           if (headers instanceof Headers) {
4229             headers.forEach(function(value, name) {
4230               this.append(name, value);
4231             }, this);
4232           } else if (Array.isArray(headers)) {
4233             headers.forEach(function(header) {
4234               this.append(header[0], header[1]);
4235             }, this);
4236           } else if (headers) {
4237             Object.getOwnPropertyNames(headers).forEach(function(name) {
4238               this.append(name, headers[name]);
4239             }, this);
4240           }
4241         }
4242
4243         Headers.prototype.append = function(name, value) {
4244           name = normalizeName(name);
4245           value = normalizeValue(value);
4246           var oldValue = this.map[name];
4247           this.map[name] = oldValue ? oldValue + ', ' + value : value;
4248         };
4249
4250         Headers.prototype['delete'] = function(name) {
4251           delete this.map[normalizeName(name)];
4252         };
4253
4254         Headers.prototype.get = function(name) {
4255           name = normalizeName(name);
4256           return this.has(name) ? this.map[name] : null
4257         };
4258
4259         Headers.prototype.has = function(name) {
4260           return this.map.hasOwnProperty(normalizeName(name))
4261         };
4262
4263         Headers.prototype.set = function(name, value) {
4264           this.map[normalizeName(name)] = normalizeValue(value);
4265         };
4266
4267         Headers.prototype.forEach = function(callback, thisArg) {
4268           for (var name in this.map) {
4269             if (this.map.hasOwnProperty(name)) {
4270               callback.call(thisArg, this.map[name], name, this);
4271             }
4272           }
4273         };
4274
4275         Headers.prototype.keys = function() {
4276           var items = [];
4277           this.forEach(function(value, name) {
4278             items.push(name);
4279           });
4280           return iteratorFor(items)
4281         };
4282
4283         Headers.prototype.values = function() {
4284           var items = [];
4285           this.forEach(function(value) {
4286             items.push(value);
4287           });
4288           return iteratorFor(items)
4289         };
4290
4291         Headers.prototype.entries = function() {
4292           var items = [];
4293           this.forEach(function(value, name) {
4294             items.push([name, value]);
4295           });
4296           return iteratorFor(items)
4297         };
4298
4299         if (support.iterable) {
4300           Headers.prototype[Symbol.iterator] = Headers.prototype.entries;
4301         }
4302
4303         function consumed(body) {
4304           if (body.bodyUsed) {
4305             return Promise.reject(new TypeError('Already read'))
4306           }
4307           body.bodyUsed = true;
4308         }
4309
4310         function fileReaderReady(reader) {
4311           return new Promise(function(resolve, reject) {
4312             reader.onload = function() {
4313               resolve(reader.result);
4314             };
4315             reader.onerror = function() {
4316               reject(reader.error);
4317             };
4318           })
4319         }
4320
4321         function readBlobAsArrayBuffer(blob) {
4322           var reader = new FileReader();
4323           var promise = fileReaderReady(reader);
4324           reader.readAsArrayBuffer(blob);
4325           return promise
4326         }
4327
4328         function readBlobAsText(blob) {
4329           var reader = new FileReader();
4330           var promise = fileReaderReady(reader);
4331           reader.readAsText(blob);
4332           return promise
4333         }
4334
4335         function readArrayBufferAsText(buf) {
4336           var view = new Uint8Array(buf);
4337           var chars = new Array(view.length);
4338
4339           for (var i = 0; i < view.length; i++) {
4340             chars[i] = String.fromCharCode(view[i]);
4341           }
4342           return chars.join('')
4343         }
4344
4345         function bufferClone(buf) {
4346           if (buf.slice) {
4347             return buf.slice(0)
4348           } else {
4349             var view = new Uint8Array(buf.byteLength);
4350             view.set(new Uint8Array(buf));
4351             return view.buffer
4352           }
4353         }
4354
4355         function Body() {
4356           this.bodyUsed = false;
4357
4358           this._initBody = function(body) {
4359             this._bodyInit = body;
4360             if (!body) {
4361               this._bodyText = '';
4362             } else if (typeof body === 'string') {
4363               this._bodyText = body;
4364             } else if (support.blob && Blob.prototype.isPrototypeOf(body)) {
4365               this._bodyBlob = body;
4366             } else if (support.formData && FormData.prototype.isPrototypeOf(body)) {
4367               this._bodyFormData = body;
4368             } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) {
4369               this._bodyText = body.toString();
4370             } else if (support.arrayBuffer && support.blob && isDataView(body)) {
4371               this._bodyArrayBuffer = bufferClone(body.buffer);
4372               // IE 10-11 can't handle a DataView body.
4373               this._bodyInit = new Blob([this._bodyArrayBuffer]);
4374             } else if (support.arrayBuffer && (ArrayBuffer.prototype.isPrototypeOf(body) || isArrayBufferView(body))) {
4375               this._bodyArrayBuffer = bufferClone(body);
4376             } else {
4377               this._bodyText = body = Object.prototype.toString.call(body);
4378             }
4379
4380             if (!this.headers.get('content-type')) {
4381               if (typeof body === 'string') {
4382                 this.headers.set('content-type', 'text/plain;charset=UTF-8');
4383               } else if (this._bodyBlob && this._bodyBlob.type) {
4384                 this.headers.set('content-type', this._bodyBlob.type);
4385               } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) {
4386                 this.headers.set('content-type', 'application/x-www-form-urlencoded;charset=UTF-8');
4387               }
4388             }
4389           };
4390
4391           if (support.blob) {
4392             this.blob = function() {
4393               var rejected = consumed(this);
4394               if (rejected) {
4395                 return rejected
4396               }
4397
4398               if (this._bodyBlob) {
4399                 return Promise.resolve(this._bodyBlob)
4400               } else if (this._bodyArrayBuffer) {
4401                 return Promise.resolve(new Blob([this._bodyArrayBuffer]))
4402               } else if (this._bodyFormData) {
4403                 throw new Error('could not read FormData body as blob')
4404               } else {
4405                 return Promise.resolve(new Blob([this._bodyText]))
4406               }
4407             };
4408
4409             this.arrayBuffer = function() {
4410               if (this._bodyArrayBuffer) {
4411                 return consumed(this) || Promise.resolve(this._bodyArrayBuffer)
4412               } else {
4413                 return this.blob().then(readBlobAsArrayBuffer)
4414               }
4415             };
4416           }
4417
4418           this.text = function() {
4419             var rejected = consumed(this);
4420             if (rejected) {
4421               return rejected
4422             }
4423
4424             if (this._bodyBlob) {
4425               return readBlobAsText(this._bodyBlob)
4426             } else if (this._bodyArrayBuffer) {
4427               return Promise.resolve(readArrayBufferAsText(this._bodyArrayBuffer))
4428             } else if (this._bodyFormData) {
4429               throw new Error('could not read FormData body as text')
4430             } else {
4431               return Promise.resolve(this._bodyText)
4432             }
4433           };
4434
4435           if (support.formData) {
4436             this.formData = function() {
4437               return this.text().then(decode)
4438             };
4439           }
4440
4441           this.json = function() {
4442             return this.text().then(JSON.parse)
4443           };
4444
4445           return this
4446         }
4447
4448         // HTTP methods whose capitalization should be normalized
4449         var methods = ['DELETE', 'GET', 'HEAD', 'OPTIONS', 'POST', 'PUT'];
4450
4451         function normalizeMethod(method) {
4452           var upcased = method.toUpperCase();
4453           return methods.indexOf(upcased) > -1 ? upcased : method
4454         }
4455
4456         function Request(input, options) {
4457           options = options || {};
4458           var body = options.body;
4459
4460           if (input instanceof Request) {
4461             if (input.bodyUsed) {
4462               throw new TypeError('Already read')
4463             }
4464             this.url = input.url;
4465             this.credentials = input.credentials;
4466             if (!options.headers) {
4467               this.headers = new Headers(input.headers);
4468             }
4469             this.method = input.method;
4470             this.mode = input.mode;
4471             this.signal = input.signal;
4472             if (!body && input._bodyInit != null) {
4473               body = input._bodyInit;
4474               input.bodyUsed = true;
4475             }
4476           } else {
4477             this.url = String(input);
4478           }
4479
4480           this.credentials = options.credentials || this.credentials || 'same-origin';
4481           if (options.headers || !this.headers) {
4482             this.headers = new Headers(options.headers);
4483           }
4484           this.method = normalizeMethod(options.method || this.method || 'GET');
4485           this.mode = options.mode || this.mode || null;
4486           this.signal = options.signal || this.signal;
4487           this.referrer = null;
4488
4489           if ((this.method === 'GET' || this.method === 'HEAD') && body) {
4490             throw new TypeError('Body not allowed for GET or HEAD requests')
4491           }
4492           this._initBody(body);
4493         }
4494
4495         Request.prototype.clone = function() {
4496           return new Request(this, {body: this._bodyInit})
4497         };
4498
4499         function decode(body) {
4500           var form = new FormData();
4501           body
4502             .trim()
4503             .split('&')
4504             .forEach(function(bytes) {
4505               if (bytes) {
4506                 var split = bytes.split('=');
4507                 var name = split.shift().replace(/\+/g, ' ');
4508                 var value = split.join('=').replace(/\+/g, ' ');
4509                 form.append(decodeURIComponent(name), decodeURIComponent(value));
4510               }
4511             });
4512           return form
4513         }
4514
4515         function parseHeaders(rawHeaders) {
4516           var headers = new Headers();
4517           // Replace instances of \r\n and \n followed by at least one space or horizontal tab with a space
4518           // https://tools.ietf.org/html/rfc7230#section-3.2
4519           var preProcessedHeaders = rawHeaders.replace(/\r?\n[\t ]+/g, ' ');
4520           preProcessedHeaders.split(/\r?\n/).forEach(function(line) {
4521             var parts = line.split(':');
4522             var key = parts.shift().trim();
4523             if (key) {
4524               var value = parts.join(':').trim();
4525               headers.append(key, value);
4526             }
4527           });
4528           return headers
4529         }
4530
4531         Body.call(Request.prototype);
4532
4533         function Response(bodyInit, options) {
4534           if (!options) {
4535             options = {};
4536           }
4537
4538           this.type = 'default';
4539           this.status = options.status === undefined ? 200 : options.status;
4540           this.ok = this.status >= 200 && this.status < 300;
4541           this.statusText = 'statusText' in options ? options.statusText : 'OK';
4542           this.headers = new Headers(options.headers);
4543           this.url = options.url || '';
4544           this._initBody(bodyInit);
4545         }
4546
4547         Body.call(Response.prototype);
4548
4549         Response.prototype.clone = function() {
4550           return new Response(this._bodyInit, {
4551             status: this.status,
4552             statusText: this.statusText,
4553             headers: new Headers(this.headers),
4554             url: this.url
4555           })
4556         };
4557
4558         Response.error = function() {
4559           var response = new Response(null, {status: 0, statusText: ''});
4560           response.type = 'error';
4561           return response
4562         };
4563
4564         var redirectStatuses = [301, 302, 303, 307, 308];
4565
4566         Response.redirect = function(url, status) {
4567           if (redirectStatuses.indexOf(status) === -1) {
4568             throw new RangeError('Invalid status code')
4569           }
4570
4571           return new Response(null, {status: status, headers: {location: url}})
4572         };
4573
4574         var DOMException$1 = self.DOMException;
4575         try {
4576           new DOMException$1();
4577         } catch (err) {
4578           DOMException$1 = function(message, name) {
4579             this.message = message;
4580             this.name = name;
4581             var error = Error(message);
4582             this.stack = error.stack;
4583           };
4584           DOMException$1.prototype = Object.create(Error.prototype);
4585           DOMException$1.prototype.constructor = DOMException$1;
4586         }
4587
4588         function fetch$1(input, init) {
4589           return new Promise(function(resolve, reject) {
4590             var request = new Request(input, init);
4591
4592             if (request.signal && request.signal.aborted) {
4593               return reject(new DOMException$1('Aborted', 'AbortError'))
4594             }
4595
4596             var xhr = new XMLHttpRequest();
4597
4598             function abortXhr() {
4599               xhr.abort();
4600             }
4601
4602             xhr.onload = function() {
4603               var options = {
4604                 status: xhr.status,
4605                 statusText: xhr.statusText,
4606                 headers: parseHeaders(xhr.getAllResponseHeaders() || '')
4607               };
4608               options.url = 'responseURL' in xhr ? xhr.responseURL : options.headers.get('X-Request-URL');
4609               var body = 'response' in xhr ? xhr.response : xhr.responseText;
4610               resolve(new Response(body, options));
4611             };
4612
4613             xhr.onerror = function() {
4614               reject(new TypeError('Network request failed'));
4615             };
4616
4617             xhr.ontimeout = function() {
4618               reject(new TypeError('Network request failed'));
4619             };
4620
4621             xhr.onabort = function() {
4622               reject(new DOMException$1('Aborted', 'AbortError'));
4623             };
4624
4625             xhr.open(request.method, request.url, true);
4626
4627             if (request.credentials === 'include') {
4628               xhr.withCredentials = true;
4629             } else if (request.credentials === 'omit') {
4630               xhr.withCredentials = false;
4631             }
4632
4633             if ('responseType' in xhr && support.blob) {
4634               xhr.responseType = 'blob';
4635             }
4636
4637             request.headers.forEach(function(value, name) {
4638               xhr.setRequestHeader(name, value);
4639             });
4640
4641             if (request.signal) {
4642               request.signal.addEventListener('abort', abortXhr);
4643
4644               xhr.onreadystatechange = function() {
4645                 // DONE (success or failure)
4646                 if (xhr.readyState === 4) {
4647                   request.signal.removeEventListener('abort', abortXhr);
4648                 }
4649               };
4650             }
4651
4652             xhr.send(typeof request._bodyInit === 'undefined' ? null : request._bodyInit);
4653           })
4654         }
4655
4656         fetch$1.polyfill = true;
4657
4658         if (!self.fetch) {
4659           self.fetch = fetch$1;
4660           self.Headers = Headers;
4661           self.Request = Request;
4662           self.Response = Response;
4663         }
4664
4665         var lib = createCommonjsModule(function (module, exports) {
4666         Object.defineProperty(exports, "__esModule", { value: true });
4667
4668
4669
4670
4671
4672
4673
4674
4675
4676
4677         if (!window.Set) {
4678             window.Set = es6Set;
4679         }
4680         if (!window.Map) {
4681             window.Map = es6Map;
4682         }
4683         if (!window.Promise) {
4684             window.Promise = polyfill$c;
4685             window.Promise._immediateFn = setAsap;
4686         }
4687         if (!Array.prototype.find) {
4688             array_prototype_find.shim();
4689         }
4690         if (!Array.prototype.findIndex) {
4691             array_prototype_findindex.shim();
4692         }
4693         if (!Array.from) {
4694             array_from.shim();
4695         }
4696         if (!Object.values) {
4697             object_values.shim();
4698         }
4699         if (!Object.assign) {
4700             object_assign.shim();
4701         }
4702         if (!window.requestAnimationFrame || !window.cancelAnimationFrame) {
4703             window.requestAnimationFrame = raf_1;
4704             window.cancelAnimationFrame = raf_1.cancel;
4705         }
4706
4707         var finalFetch = window.fetch;
4708         var finalPromise = window.Promise;
4709         window.fetch = function (input, init) {
4710             try {
4711                 return finalFetch(input, init);
4712             }
4713             catch (error) {
4714                 return new finalPromise(function (_, reject) { return reject(error); });
4715             }
4716         };
4717         });
4718
4719         unwrapExports(lib);
4720
4721         (function (factory) {
4722           factory();
4723         }(function () {
4724           function _classCallCheck(instance, Constructor) {
4725             if (!(instance instanceof Constructor)) {
4726               throw new TypeError("Cannot call a class as a function");
4727             }
4728           }
4729
4730           function _defineProperties(target, props) {
4731             for (var i = 0; i < props.length; i++) {
4732               var descriptor = props[i];
4733               descriptor.enumerable = descriptor.enumerable || false;
4734               descriptor.configurable = true;
4735               if ("value" in descriptor) descriptor.writable = true;
4736               Object.defineProperty(target, descriptor.key, descriptor);
4737             }
4738           }
4739
4740           function _createClass(Constructor, protoProps, staticProps) {
4741             if (protoProps) _defineProperties(Constructor.prototype, protoProps);
4742             if (staticProps) _defineProperties(Constructor, staticProps);
4743             return Constructor;
4744           }
4745
4746           function _inherits(subClass, superClass) {
4747             if (typeof superClass !== "function" && superClass !== null) {
4748               throw new TypeError("Super expression must either be null or a function");
4749             }
4750
4751             subClass.prototype = Object.create(superClass && superClass.prototype, {
4752               constructor: {
4753                 value: subClass,
4754                 writable: true,
4755                 configurable: true
4756               }
4757             });
4758             if (superClass) _setPrototypeOf(subClass, superClass);
4759           }
4760
4761           function _getPrototypeOf(o) {
4762             _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) {
4763               return o.__proto__ || Object.getPrototypeOf(o);
4764             };
4765             return _getPrototypeOf(o);
4766           }
4767
4768           function _setPrototypeOf(o, p) {
4769             _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {
4770               o.__proto__ = p;
4771               return o;
4772             };
4773
4774             return _setPrototypeOf(o, p);
4775           }
4776
4777           function _assertThisInitialized(self) {
4778             if (self === void 0) {
4779               throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
4780             }
4781
4782             return self;
4783           }
4784
4785           function _possibleConstructorReturn(self, call) {
4786             if (call && (typeof call === "object" || typeof call === "function")) {
4787               return call;
4788             }
4789
4790             return _assertThisInitialized(self);
4791           }
4792
4793           function _superPropBase(object, property) {
4794             while (!Object.prototype.hasOwnProperty.call(object, property)) {
4795               object = _getPrototypeOf(object);
4796               if (object === null) break;
4797             }
4798
4799             return object;
4800           }
4801
4802           function _get(target, property, receiver) {
4803             if (typeof Reflect !== "undefined" && Reflect.get) {
4804               _get = Reflect.get;
4805             } else {
4806               _get = function _get(target, property, receiver) {
4807                 var base = _superPropBase(target, property);
4808
4809                 if (!base) return;
4810                 var desc = Object.getOwnPropertyDescriptor(base, property);
4811
4812                 if (desc.get) {
4813                   return desc.get.call(receiver);
4814                 }
4815
4816                 return desc.value;
4817               };
4818             }
4819
4820             return _get(target, property, receiver || target);
4821           }
4822
4823           var Emitter =
4824           /*#__PURE__*/
4825           function () {
4826             function Emitter() {
4827               _classCallCheck(this, Emitter);
4828
4829               Object.defineProperty(this, 'listeners', {
4830                 value: {},
4831                 writable: true,
4832                 configurable: true
4833               });
4834             }
4835
4836             _createClass(Emitter, [{
4837               key: "addEventListener",
4838               value: function addEventListener(type, callback) {
4839                 if (!(type in this.listeners)) {
4840                   this.listeners[type] = [];
4841                 }
4842
4843                 this.listeners[type].push(callback);
4844               }
4845             }, {
4846               key: "removeEventListener",
4847               value: function removeEventListener(type, callback) {
4848                 if (!(type in this.listeners)) {
4849                   return;
4850                 }
4851
4852                 var stack = this.listeners[type];
4853
4854                 for (var i = 0, l = stack.length; i < l; i++) {
4855                   if (stack[i] === callback) {
4856                     stack.splice(i, 1);
4857                     return;
4858                   }
4859                 }
4860               }
4861             }, {
4862               key: "dispatchEvent",
4863               value: function dispatchEvent(event) {
4864                 var _this = this;
4865
4866                 if (!(event.type in this.listeners)) {
4867                   return;
4868                 }
4869
4870                 var debounce = function debounce(callback) {
4871                   setTimeout(function () {
4872                     return callback.call(_this, event);
4873                   });
4874                 };
4875
4876                 var stack = this.listeners[event.type];
4877
4878                 for (var i = 0, l = stack.length; i < l; i++) {
4879                   debounce(stack[i]);
4880                 }
4881
4882                 return !event.defaultPrevented;
4883               }
4884             }]);
4885
4886             return Emitter;
4887           }();
4888
4889           var AbortSignal =
4890           /*#__PURE__*/
4891           function (_Emitter) {
4892             _inherits(AbortSignal, _Emitter);
4893
4894             function AbortSignal() {
4895               var _this2;
4896
4897               _classCallCheck(this, AbortSignal);
4898
4899               _this2 = _possibleConstructorReturn(this, _getPrototypeOf(AbortSignal).call(this)); // Some versions of babel does not transpile super() correctly for IE <= 10, if the parent
4900               // constructor has failed to run, then "this.listeners" will still be undefined and then we call
4901               // the parent constructor directly instead as a workaround. For general details, see babel bug:
4902               // https://github.com/babel/babel/issues/3041
4903               // This hack was added as a fix for the issue described here:
4904               // https://github.com/Financial-Times/polyfill-library/pull/59#issuecomment-477558042
4905
4906               if (!_this2.listeners) {
4907                 Emitter.call(_assertThisInitialized(_this2));
4908               } // Compared to assignment, Object.defineProperty makes properties non-enumerable by default and
4909               // we want Object.keys(new AbortController().signal) to be [] for compat with the native impl
4910
4911
4912               Object.defineProperty(_assertThisInitialized(_this2), 'aborted', {
4913                 value: false,
4914                 writable: true,
4915                 configurable: true
4916               });
4917               Object.defineProperty(_assertThisInitialized(_this2), 'onabort', {
4918                 value: null,
4919                 writable: true,
4920                 configurable: true
4921               });
4922               return _this2;
4923             }
4924
4925             _createClass(AbortSignal, [{
4926               key: "toString",
4927               value: function toString() {
4928                 return '[object AbortSignal]';
4929               }
4930             }, {
4931               key: "dispatchEvent",
4932               value: function dispatchEvent(event) {
4933                 if (event.type === 'abort') {
4934                   this.aborted = true;
4935
4936                   if (typeof this.onabort === 'function') {
4937                     this.onabort.call(this, event);
4938                   }
4939                 }
4940
4941                 _get(_getPrototypeOf(AbortSignal.prototype), "dispatchEvent", this).call(this, event);
4942               }
4943             }]);
4944
4945             return AbortSignal;
4946           }(Emitter);
4947           var AbortController =
4948           /*#__PURE__*/
4949           function () {
4950             function AbortController() {
4951               _classCallCheck(this, AbortController);
4952
4953               // Compared to assignment, Object.defineProperty makes properties non-enumerable by default and
4954               // we want Object.keys(new AbortController()) to be [] for compat with the native impl
4955               Object.defineProperty(this, 'signal', {
4956                 value: new AbortSignal(),
4957                 writable: true,
4958                 configurable: true
4959               });
4960             }
4961
4962             _createClass(AbortController, [{
4963               key: "abort",
4964               value: function abort() {
4965                 var event;
4966
4967                 try {
4968                   event = new Event('abort');
4969                 } catch (e) {
4970                   if (typeof document !== 'undefined') {
4971                     if (!document.createEvent) {
4972                       // For Internet Explorer 8:
4973                       event = document.createEventObject();
4974                       event.type = 'abort';
4975                     } else {
4976                       // For Internet Explorer 11:
4977                       event = document.createEvent('Event');
4978                       event.initEvent('abort', false, false);
4979                     }
4980                   } else {
4981                     // Fallback where document isn't available:
4982                     event = {
4983                       type: 'abort',
4984                       bubbles: false,
4985                       cancelable: false
4986                     };
4987                   }
4988                 }
4989
4990                 this.signal.dispatchEvent(event);
4991               }
4992             }, {
4993               key: "toString",
4994               value: function toString() {
4995                 return '[object AbortController]';
4996               }
4997             }]);
4998
4999             return AbortController;
5000           }();
5001
5002           if (typeof Symbol !== 'undefined' && Symbol.toStringTag) {
5003             // These are necessary to make sure that we get correct output for:
5004             // Object.prototype.toString.call(new AbortController())
5005             AbortController.prototype[Symbol.toStringTag] = 'AbortController';
5006             AbortSignal.prototype[Symbol.toStringTag] = 'AbortSignal';
5007           }
5008
5009           function polyfillNeeded(self) {
5010             if (self.__FORCE_INSTALL_ABORTCONTROLLER_POLYFILL) {
5011               console.log('__FORCE_INSTALL_ABORTCONTROLLER_POLYFILL=true is set, will force install polyfill');
5012               return true;
5013             } // Note that the "unfetch" minimal fetch polyfill defines fetch() without
5014             // defining window.Request, and this polyfill need to work on top of unfetch
5015             // so the below feature detection needs the !self.AbortController part.
5016             // The Request.prototype check is also needed because Safari versions 11.1.2
5017             // up to and including 12.1.x has a window.AbortController present but still
5018             // does NOT correctly implement abortable fetch:
5019             // https://bugs.webkit.org/show_bug.cgi?id=174980#c2
5020
5021
5022             return typeof self.Request === 'function' && !self.Request.prototype.hasOwnProperty('signal') || !self.AbortController;
5023           }
5024
5025           /**
5026            * Note: the "fetch.Request" default value is available for fetch imported from
5027            * the "node-fetch" package and not in browsers. This is OK since browsers
5028            * will be importing umd-polyfill.js from that path "self" is passed the
5029            * decorator so the default value will not be used (because browsers that define
5030            * fetch also has Request). One quirky setup where self.fetch exists but
5031            * self.Request does not is when the "unfetch" minimal fetch polyfill is used
5032            * on top of IE11; for this case the browser will try to use the fetch.Request
5033            * default value which in turn will be undefined but then then "if (Request)"
5034            * will ensure that you get a patched fetch but still no Request (as expected).
5035            * @param {fetch, Request = fetch.Request}
5036            * @returns {fetch: abortableFetch, Request: AbortableRequest}
5037            */
5038
5039           function abortableFetchDecorator(patchTargets) {
5040             if ('function' === typeof patchTargets) {
5041               patchTargets = {
5042                 fetch: patchTargets
5043               };
5044             }
5045
5046             var _patchTargets = patchTargets,
5047                 fetch = _patchTargets.fetch,
5048                 _patchTargets$Request = _patchTargets.Request,
5049                 NativeRequest = _patchTargets$Request === void 0 ? fetch.Request : _patchTargets$Request,
5050                 NativeAbortController = _patchTargets.AbortController,
5051                 _patchTargets$__FORCE = _patchTargets.__FORCE_INSTALL_ABORTCONTROLLER_POLYFILL,
5052                 __FORCE_INSTALL_ABORTCONTROLLER_POLYFILL = _patchTargets$__FORCE === void 0 ? false : _patchTargets$__FORCE;
5053
5054             if (!polyfillNeeded({
5055               fetch: fetch,
5056               Request: NativeRequest,
5057               AbortController: NativeAbortController,
5058               __FORCE_INSTALL_ABORTCONTROLLER_POLYFILL: __FORCE_INSTALL_ABORTCONTROLLER_POLYFILL
5059             })) {
5060               return {
5061                 fetch: fetch,
5062                 Request: Request
5063               };
5064             }
5065
5066             var Request = NativeRequest; // Note that the "unfetch" minimal fetch polyfill defines fetch() without
5067             // defining window.Request, and this polyfill need to work on top of unfetch
5068             // hence we only patch it if it's available. Also we don't patch it if signal
5069             // is already available on the Request prototype because in this case support
5070             // is present and the patching below can cause a crash since it assigns to
5071             // request.signal which is technically a read-only property. This latter error
5072             // happens when you run the main5.js node-fetch example in the repo
5073             // "abortcontroller-polyfill-examples". The exact error is:
5074             //   request.signal = init.signal;
5075             //   ^
5076             // TypeError: Cannot set property signal of #<Request> which has only a getter
5077
5078             if (Request && !Request.prototype.hasOwnProperty('signal') || __FORCE_INSTALL_ABORTCONTROLLER_POLYFILL) {
5079               Request = function Request(input, init) {
5080                 var signal;
5081
5082                 if (init && init.signal) {
5083                   signal = init.signal; // Never pass init.signal to the native Request implementation when the polyfill has
5084                   // been installed because if we're running on top of a browser with a
5085                   // working native AbortController (i.e. the polyfill was installed due to
5086                   // __FORCE_INSTALL_ABORTCONTROLLER_POLYFILL being set), then passing our
5087                   // fake AbortSignal to the native fetch will trigger:
5088                   // TypeError: Failed to construct 'Request': member signal is not of type AbortSignal.
5089
5090                   delete init.signal;
5091                 }
5092
5093                 var request = new NativeRequest(input, init);
5094
5095                 if (signal) {
5096                   Object.defineProperty(request, 'signal', {
5097                     writable: false,
5098                     enumerable: false,
5099                     configurable: true,
5100                     value: signal
5101                   });
5102                 }
5103
5104                 return request;
5105               };
5106
5107               Request.prototype = NativeRequest.prototype;
5108             }
5109
5110             var realFetch = fetch;
5111
5112             var abortableFetch = function abortableFetch(input, init) {
5113               var signal = Request && Request.prototype.isPrototypeOf(input) ? input.signal : init ? init.signal : undefined;
5114
5115               if (signal) {
5116                 var abortError;
5117
5118                 try {
5119                   abortError = new DOMException('Aborted', 'AbortError');
5120                 } catch (err) {
5121                   // IE 11 does not support calling the DOMException constructor, use a
5122                   // regular error object on it instead.
5123                   abortError = new Error('Aborted');
5124                   abortError.name = 'AbortError';
5125                 } // Return early if already aborted, thus avoiding making an HTTP request
5126
5127
5128                 if (signal.aborted) {
5129                   return Promise.reject(abortError);
5130                 } // Turn an event into a promise, reject it once `abort` is dispatched
5131
5132
5133                 var cancellation = new Promise(function (_, reject) {
5134                   signal.addEventListener('abort', function () {
5135                     return reject(abortError);
5136                   }, {
5137                     once: true
5138                   });
5139                 });
5140
5141                 if (init && init.signal) {
5142                   // Never pass .signal to the native implementation when the polyfill has
5143                   // been installed because if we're running on top of a browser with a
5144                   // working native AbortController (i.e. the polyfill was installed due to
5145                   // __FORCE_INSTALL_ABORTCONTROLLER_POLYFILL being set), then passing our
5146                   // fake AbortSignal to the native fetch will trigger:
5147                   // TypeError: Failed to execute 'fetch' on 'Window': member signal is not of type AbortSignal.
5148                   delete init.signal;
5149                 } // Return the fastest promise (don't need to wait for request to finish)
5150
5151
5152                 return Promise.race([cancellation, realFetch(input, init)]);
5153               }
5154
5155               return realFetch(input, init);
5156             };
5157
5158             return {
5159               fetch: abortableFetch,
5160               Request: Request
5161             };
5162           }
5163
5164           (function (self) {
5165
5166             if (!polyfillNeeded(self)) {
5167               return;
5168             }
5169
5170             if (!self.fetch) {
5171               console.warn('fetch() is not available, cannot install abortcontroller-polyfill');
5172               return;
5173             }
5174
5175             var _abortableFetch = abortableFetchDecorator(self),
5176                 fetch = _abortableFetch.fetch,
5177                 Request = _abortableFetch.Request;
5178
5179             self.fetch = fetch;
5180             self.Request = Request;
5181             Object.defineProperty(self, 'AbortController', {
5182               writable: true,
5183               enumerable: false,
5184               configurable: true,
5185               value: AbortController
5186             });
5187             Object.defineProperty(self, 'AbortSignal', {
5188               writable: true,
5189               enumerable: false,
5190               configurable: true,
5191               value: AbortSignal
5192             });
5193           })(typeof self !== 'undefined' ? self : commonjsGlobal);
5194
5195         }));
5196
5197         var version = "5.9.2";
5198
5199         function d3_ascending(a, b) {
5200           return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;
5201         }
5202
5203         function d3_bisector(compare) {
5204           if (compare.length === 1) compare = ascendingComparator(compare);
5205           return {
5206             left: function(a, x, lo, hi) {
5207               if (lo == null) lo = 0;
5208               if (hi == null) hi = a.length;
5209               while (lo < hi) {
5210                 var mid = lo + hi >>> 1;
5211                 if (compare(a[mid], x) < 0) lo = mid + 1;
5212                 else hi = mid;
5213               }
5214               return lo;
5215             },
5216             right: function(a, x, lo, hi) {
5217               if (lo == null) lo = 0;
5218               if (hi == null) hi = a.length;
5219               while (lo < hi) {
5220                 var mid = lo + hi >>> 1;
5221                 if (compare(a[mid], x) > 0) hi = mid;
5222                 else lo = mid + 1;
5223               }
5224               return lo;
5225             }
5226           };
5227         }
5228
5229         function ascendingComparator(f) {
5230           return function(d, x) {
5231             return d3_ascending(f(d), x);
5232           };
5233         }
5234
5235         var ascendingBisect = d3_bisector(d3_ascending);
5236         var bisectRight = ascendingBisect.right;
5237         var bisectLeft = ascendingBisect.left;
5238
5239         function pairs(array, f) {
5240           if (f == null) f = pair;
5241           var i = 0, n = array.length - 1, p = array[0], pairs = new Array(n < 0 ? 0 : n);
5242           while (i < n) pairs[i] = f(p, p = array[++i]);
5243           return pairs;
5244         }
5245
5246         function pair(a, b) {
5247           return [a, b];
5248         }
5249
5250         function cross(values0, values1, reduce) {
5251           var n0 = values0.length,
5252               n1 = values1.length,
5253               values = new Array(n0 * n1),
5254               i0,
5255               i1,
5256               i,
5257               value0;
5258
5259           if (reduce == null) reduce = pair;
5260
5261           for (i0 = i = 0; i0 < n0; ++i0) {
5262             for (value0 = values0[i0], i1 = 0; i1 < n1; ++i1, ++i) {
5263               values[i] = reduce(value0, values1[i1]);
5264             }
5265           }
5266
5267           return values;
5268         }
5269
5270         function d3_descending(a, b) {
5271           return b < a ? -1 : b > a ? 1 : b >= a ? 0 : NaN;
5272         }
5273
5274         function number(x) {
5275           return x === null ? NaN : +x;
5276         }
5277
5278         function variance(values, valueof) {
5279           var n = values.length,
5280               m = 0,
5281               i = -1,
5282               mean = 0,
5283               value,
5284               delta,
5285               sum = 0;
5286
5287           if (valueof == null) {
5288             while (++i < n) {
5289               if (!isNaN(value = number(values[i]))) {
5290                 delta = value - mean;
5291                 mean += delta / ++m;
5292                 sum += delta * (value - mean);
5293               }
5294             }
5295           }
5296
5297           else {
5298             while (++i < n) {
5299               if (!isNaN(value = number(valueof(values[i], i, values)))) {
5300                 delta = value - mean;
5301                 mean += delta / ++m;
5302                 sum += delta * (value - mean);
5303               }
5304             }
5305           }
5306
5307           if (m > 1) return sum / (m - 1);
5308         }
5309
5310         function deviation(array, f) {
5311           var v = variance(array, f);
5312           return v ? Math.sqrt(v) : v;
5313         }
5314
5315         function extent(values, valueof) {
5316           var n = values.length,
5317               i = -1,
5318               value,
5319               min,
5320               max;
5321
5322           if (valueof == null) {
5323             while (++i < n) { // Find the first comparable value.
5324               if ((value = values[i]) != null && value >= value) {
5325                 min = max = value;
5326                 while (++i < n) { // Compare the remaining values.
5327                   if ((value = values[i]) != null) {
5328                     if (min > value) min = value;
5329                     if (max < value) max = value;
5330                   }
5331                 }
5332               }
5333             }
5334           }
5335
5336           else {
5337             while (++i < n) { // Find the first comparable value.
5338               if ((value = valueof(values[i], i, values)) != null && value >= value) {
5339                 min = max = value;
5340                 while (++i < n) { // Compare the remaining values.
5341                   if ((value = valueof(values[i], i, values)) != null) {
5342                     if (min > value) min = value;
5343                     if (max < value) max = value;
5344                   }
5345                 }
5346               }
5347             }
5348           }
5349
5350           return [min, max];
5351         }
5352
5353         var array$1 = Array.prototype;
5354
5355         var slice$4 = array$1.slice;
5356         var map$2 = array$1.map;
5357
5358         function constant(x) {
5359           return function() {
5360             return x;
5361           };
5362         }
5363
5364         function identity(x) {
5365           return x;
5366         }
5367
5368         function d3_range(start, stop, step) {
5369           start = +start, stop = +stop, step = (n = arguments.length) < 2 ? (stop = start, start = 0, 1) : n < 3 ? 1 : +step;
5370
5371           var i = -1,
5372               n = Math.max(0, Math.ceil((stop - start) / step)) | 0,
5373               range = new Array(n);
5374
5375           while (++i < n) {
5376             range[i] = start + i * step;
5377           }
5378
5379           return range;
5380         }
5381
5382         var e10 = Math.sqrt(50),
5383             e5 = Math.sqrt(10),
5384             e2 = Math.sqrt(2);
5385
5386         function ticks(start, stop, count) {
5387           var reverse,
5388               i = -1,
5389               n,
5390               ticks,
5391               step;
5392
5393           stop = +stop, start = +start, count = +count;
5394           if (start === stop && count > 0) return [start];
5395           if (reverse = stop < start) n = start, start = stop, stop = n;
5396           if ((step = tickIncrement(start, stop, count)) === 0 || !isFinite(step)) return [];
5397
5398           if (step > 0) {
5399             start = Math.ceil(start / step);
5400             stop = Math.floor(stop / step);
5401             ticks = new Array(n = Math.ceil(stop - start + 1));
5402             while (++i < n) ticks[i] = (start + i) * step;
5403           } else {
5404             start = Math.floor(start * step);
5405             stop = Math.ceil(stop * step);
5406             ticks = new Array(n = Math.ceil(start - stop + 1));
5407             while (++i < n) ticks[i] = (start - i) / step;
5408           }
5409
5410           if (reverse) ticks.reverse();
5411
5412           return ticks;
5413         }
5414
5415         function tickIncrement(start, stop, count) {
5416           var step = (stop - start) / Math.max(0, count),
5417               power = Math.floor(Math.log(step) / Math.LN10),
5418               error = step / Math.pow(10, power);
5419           return power >= 0
5420               ? (error >= e10 ? 10 : error >= e5 ? 5 : error >= e2 ? 2 : 1) * Math.pow(10, power)
5421               : -Math.pow(10, -power) / (error >= e10 ? 10 : error >= e5 ? 5 : error >= e2 ? 2 : 1);
5422         }
5423
5424         function tickStep(start, stop, count) {
5425           var step0 = Math.abs(stop - start) / Math.max(0, count),
5426               step1 = Math.pow(10, Math.floor(Math.log(step0) / Math.LN10)),
5427               error = step0 / step1;
5428           if (error >= e10) step1 *= 10;
5429           else if (error >= e5) step1 *= 5;
5430           else if (error >= e2) step1 *= 2;
5431           return stop < start ? -step1 : step1;
5432         }
5433
5434         function thresholdSturges(values) {
5435           return Math.ceil(Math.log(values.length) / Math.LN2) + 1;
5436         }
5437
5438         function histogram() {
5439           var value = identity,
5440               domain = extent,
5441               threshold = thresholdSturges;
5442
5443           function histogram(data) {
5444             var i,
5445                 n = data.length,
5446                 x,
5447                 values = new Array(n);
5448
5449             for (i = 0; i < n; ++i) {
5450               values[i] = value(data[i], i, data);
5451             }
5452
5453             var xz = domain(values),
5454                 x0 = xz[0],
5455                 x1 = xz[1],
5456                 tz = threshold(values, x0, x1);
5457
5458             // Convert number of thresholds into uniform thresholds.
5459             if (!Array.isArray(tz)) {
5460               tz = tickStep(x0, x1, tz);
5461               tz = d3_range(Math.ceil(x0 / tz) * tz, x1, tz); // exclusive
5462             }
5463
5464             // Remove any thresholds outside the domain.
5465             var m = tz.length;
5466             while (tz[0] <= x0) tz.shift(), --m;
5467             while (tz[m - 1] > x1) tz.pop(), --m;
5468
5469             var bins = new Array(m + 1),
5470                 bin;
5471
5472             // Initialize bins.
5473             for (i = 0; i <= m; ++i) {
5474               bin = bins[i] = [];
5475               bin.x0 = i > 0 ? tz[i - 1] : x0;
5476               bin.x1 = i < m ? tz[i] : x1;
5477             }
5478
5479             // Assign data to bins by value, ignoring any outside the domain.
5480             for (i = 0; i < n; ++i) {
5481               x = values[i];
5482               if (x0 <= x && x <= x1) {
5483                 bins[bisectRight(tz, x, 0, m)].push(data[i]);
5484               }
5485             }
5486
5487             return bins;
5488           }
5489
5490           histogram.value = function(_) {
5491             return arguments.length ? (value = typeof _ === "function" ? _ : constant(_), histogram) : value;
5492           };
5493
5494           histogram.domain = function(_) {
5495             return arguments.length ? (domain = typeof _ === "function" ? _ : constant([_[0], _[1]]), histogram) : domain;
5496           };
5497
5498           histogram.thresholds = function(_) {
5499             return arguments.length ? (threshold = typeof _ === "function" ? _ : Array.isArray(_) ? constant(slice$4.call(_)) : constant(_), histogram) : threshold;
5500           };
5501
5502           return histogram;
5503         }
5504
5505         function threshold(values, p, valueof) {
5506           if (valueof == null) valueof = number;
5507           if (!(n = values.length)) return;
5508           if ((p = +p) <= 0 || n < 2) return +valueof(values[0], 0, values);
5509           if (p >= 1) return +valueof(values[n - 1], n - 1, values);
5510           var n,
5511               i = (n - 1) * p,
5512               i0 = Math.floor(i),
5513               value0 = +valueof(values[i0], i0, values),
5514               value1 = +valueof(values[i0 + 1], i0 + 1, values);
5515           return value0 + (value1 - value0) * (i - i0);
5516         }
5517
5518         function freedmanDiaconis(values, min, max) {
5519           values = map$2.call(values, number).sort(d3_ascending);
5520           return Math.ceil((max - min) / (2 * (threshold(values, 0.75) - threshold(values, 0.25)) * Math.pow(values.length, -1 / 3)));
5521         }
5522
5523         function scott(values, min, max) {
5524           return Math.ceil((max - min) / (3.5 * deviation(values) * Math.pow(values.length, -1 / 3)));
5525         }
5526
5527         function max$2(values, valueof) {
5528           var n = values.length,
5529               i = -1,
5530               value,
5531               max;
5532
5533           if (valueof == null) {
5534             while (++i < n) { // Find the first comparable value.
5535               if ((value = values[i]) != null && value >= value) {
5536                 max = value;
5537                 while (++i < n) { // Compare the remaining values.
5538                   if ((value = values[i]) != null && value > max) {
5539                     max = value;
5540                   }
5541                 }
5542               }
5543             }
5544           }
5545
5546           else {
5547             while (++i < n) { // Find the first comparable value.
5548               if ((value = valueof(values[i], i, values)) != null && value >= value) {
5549                 max = value;
5550                 while (++i < n) { // Compare the remaining values.
5551                   if ((value = valueof(values[i], i, values)) != null && value > max) {
5552                     max = value;
5553                   }
5554                 }
5555               }
5556             }
5557           }
5558
5559           return max;
5560         }
5561
5562         function mean(values, valueof) {
5563           var n = values.length,
5564               m = n,
5565               i = -1,
5566               value,
5567               sum = 0;
5568
5569           if (valueof == null) {
5570             while (++i < n) {
5571               if (!isNaN(value = number(values[i]))) sum += value;
5572               else --m;
5573             }
5574           }
5575
5576           else {
5577             while (++i < n) {
5578               if (!isNaN(value = number(valueof(values[i], i, values)))) sum += value;
5579               else --m;
5580             }
5581           }
5582
5583           if (m) return sum / m;
5584         }
5585
5586         function d3_median(values, valueof) {
5587           var n = values.length,
5588               i = -1,
5589               value,
5590               numbers = [];
5591
5592           if (valueof == null) {
5593             while (++i < n) {
5594               if (!isNaN(value = number(values[i]))) {
5595                 numbers.push(value);
5596               }
5597             }
5598           }
5599
5600           else {
5601             while (++i < n) {
5602               if (!isNaN(value = number(valueof(values[i], i, values)))) {
5603                 numbers.push(value);
5604               }
5605             }
5606           }
5607
5608           return threshold(numbers.sort(d3_ascending), 0.5);
5609         }
5610
5611         function merge(arrays) {
5612           var n = arrays.length,
5613               m,
5614               i = -1,
5615               j = 0,
5616               merged,
5617               array;
5618
5619           while (++i < n) j += arrays[i].length;
5620           merged = new Array(j);
5621
5622           while (--n >= 0) {
5623             array = arrays[n];
5624             m = array.length;
5625             while (--m >= 0) {
5626               merged[--j] = array[m];
5627             }
5628           }
5629
5630           return merged;
5631         }
5632
5633         function min(values, valueof) {
5634           var n = values.length,
5635               i = -1,
5636               value,
5637               min;
5638
5639           if (valueof == null) {
5640             while (++i < n) { // Find the first comparable value.
5641               if ((value = values[i]) != null && value >= value) {
5642                 min = value;
5643                 while (++i < n) { // Compare the remaining values.
5644                   if ((value = values[i]) != null && min > value) {
5645                     min = value;
5646                   }
5647                 }
5648               }
5649             }
5650           }
5651
5652           else {
5653             while (++i < n) { // Find the first comparable value.
5654               if ((value = valueof(values[i], i, values)) != null && value >= value) {
5655                 min = value;
5656                 while (++i < n) { // Compare the remaining values.
5657                   if ((value = valueof(values[i], i, values)) != null && min > value) {
5658                     min = value;
5659                   }
5660                 }
5661               }
5662             }
5663           }
5664
5665           return min;
5666         }
5667
5668         function permute(array, indexes) {
5669           var i = indexes.length, permutes = new Array(i);
5670           while (i--) permutes[i] = array[indexes[i]];
5671           return permutes;
5672         }
5673
5674         function scan(values, compare) {
5675           if (!(n = values.length)) return;
5676           var n,
5677               i = 0,
5678               j = 0,
5679               xi,
5680               xj = values[j];
5681
5682           if (compare == null) compare = d3_ascending;
5683
5684           while (++i < n) {
5685             if (compare(xi = values[i], xj) < 0 || compare(xj, xj) !== 0) {
5686               xj = xi, j = i;
5687             }
5688           }
5689
5690           if (compare(xj, xj) === 0) return j;
5691         }
5692
5693         function shuffle(array, i0, i1) {
5694           var m = (i1 == null ? array.length : i1) - (i0 = i0 == null ? 0 : +i0),
5695               t,
5696               i;
5697
5698           while (m) {
5699             i = Math.random() * m-- | 0;
5700             t = array[m + i0];
5701             array[m + i0] = array[i + i0];
5702             array[i + i0] = t;
5703           }
5704
5705           return array;
5706         }
5707
5708         function sum(values, valueof) {
5709           var n = values.length,
5710               i = -1,
5711               value,
5712               sum = 0;
5713
5714           if (valueof == null) {
5715             while (++i < n) {
5716               if (value = +values[i]) sum += value; // Note: zero and null are equivalent.
5717             }
5718           }
5719
5720           else {
5721             while (++i < n) {
5722               if (value = +valueof(values[i], i, values)) sum += value;
5723             }
5724           }
5725
5726           return sum;
5727         }
5728
5729         function transpose(matrix) {
5730           if (!(n = matrix.length)) return [];
5731           for (var i = -1, m = min(matrix, length), transpose = new Array(m); ++i < m;) {
5732             for (var j = -1, n, row = transpose[i] = new Array(n); ++j < n;) {
5733               row[j] = matrix[j][i];
5734             }
5735           }
5736           return transpose;
5737         }
5738
5739         function length(d) {
5740           return d.length;
5741         }
5742
5743         function zip() {
5744           return transpose(arguments);
5745         }
5746
5747         var slice$5 = Array.prototype.slice;
5748
5749         function identity$1(x) {
5750           return x;
5751         }
5752
5753         var top = 1,
5754             right = 2,
5755             bottom = 3,
5756             left = 4,
5757             epsilon = 1e-6;
5758
5759         function translateX(x) {
5760           return "translate(" + (x + 0.5) + ",0)";
5761         }
5762
5763         function translateY(y) {
5764           return "translate(0," + (y + 0.5) + ")";
5765         }
5766
5767         function number$1(scale) {
5768           return function(d) {
5769             return +scale(d);
5770           };
5771         }
5772
5773         function center(scale) {
5774           var offset = Math.max(0, scale.bandwidth() - 1) / 2; // Adjust for 0.5px offset.
5775           if (scale.round()) offset = Math.round(offset);
5776           return function(d) {
5777             return +scale(d) + offset;
5778           };
5779         }
5780
5781         function entering() {
5782           return !this.__axis;
5783         }
5784
5785         function axis(orient, scale) {
5786           var tickArguments = [],
5787               tickValues = null,
5788               tickFormat = null,
5789               tickSizeInner = 6,
5790               tickSizeOuter = 6,
5791               tickPadding = 3,
5792               k = orient === top || orient === left ? -1 : 1,
5793               x = orient === left || orient === right ? "x" : "y",
5794               transform = orient === top || orient === bottom ? translateX : translateY;
5795
5796           function axis(context) {
5797             var values = tickValues == null ? (scale.ticks ? scale.ticks.apply(scale, tickArguments) : scale.domain()) : tickValues,
5798                 format = tickFormat == null ? (scale.tickFormat ? scale.tickFormat.apply(scale, tickArguments) : identity$1) : tickFormat,
5799                 spacing = Math.max(tickSizeInner, 0) + tickPadding,
5800                 range = scale.range(),
5801                 range0 = +range[0] + 0.5,
5802                 range1 = +range[range.length - 1] + 0.5,
5803                 position = (scale.bandwidth ? center : number$1)(scale.copy()),
5804                 selection = context.selection ? context.selection() : context,
5805                 path = selection.selectAll(".domain").data([null]),
5806                 tick = selection.selectAll(".tick").data(values, scale).order(),
5807                 tickExit = tick.exit(),
5808                 tickEnter = tick.enter().append("g").attr("class", "tick"),
5809                 line = tick.select("line"),
5810                 text = tick.select("text");
5811
5812             path = path.merge(path.enter().insert("path", ".tick")
5813                 .attr("class", "domain")
5814                 .attr("stroke", "currentColor"));
5815
5816             tick = tick.merge(tickEnter);
5817
5818             line = line.merge(tickEnter.append("line")
5819                 .attr("stroke", "currentColor")
5820                 .attr(x + "2", k * tickSizeInner));
5821
5822             text = text.merge(tickEnter.append("text")
5823                 .attr("fill", "currentColor")
5824                 .attr(x, k * spacing)
5825                 .attr("dy", orient === top ? "0em" : orient === bottom ? "0.71em" : "0.32em"));
5826
5827             if (context !== selection) {
5828               path = path.transition(context);
5829               tick = tick.transition(context);
5830               line = line.transition(context);
5831               text = text.transition(context);
5832
5833               tickExit = tickExit.transition(context)
5834                   .attr("opacity", epsilon)
5835                   .attr("transform", function(d) { return isFinite(d = position(d)) ? transform(d) : this.getAttribute("transform"); });
5836
5837               tickEnter
5838                   .attr("opacity", epsilon)
5839                   .attr("transform", function(d) { var p = this.parentNode.__axis; return transform(p && isFinite(p = p(d)) ? p : position(d)); });
5840             }
5841
5842             tickExit.remove();
5843
5844             path
5845                 .attr("d", orient === left || orient == right
5846                     ? (tickSizeOuter ? "M" + k * tickSizeOuter + "," + range0 + "H0.5V" + range1 + "H" + k * tickSizeOuter : "M0.5," + range0 + "V" + range1)
5847                     : (tickSizeOuter ? "M" + range0 + "," + k * tickSizeOuter + "V0.5H" + range1 + "V" + k * tickSizeOuter : "M" + range0 + ",0.5H" + range1));
5848
5849             tick
5850                 .attr("opacity", 1)
5851                 .attr("transform", function(d) { return transform(position(d)); });
5852
5853             line
5854                 .attr(x + "2", k * tickSizeInner);
5855
5856             text
5857                 .attr(x, k * spacing)
5858                 .text(format);
5859
5860             selection.filter(entering)
5861                 .attr("fill", "none")
5862                 .attr("font-size", 10)
5863                 .attr("font-family", "sans-serif")
5864                 .attr("text-anchor", orient === right ? "start" : orient === left ? "end" : "middle");
5865
5866             selection
5867                 .each(function() { this.__axis = position; });
5868           }
5869
5870           axis.scale = function(_) {
5871             return arguments.length ? (scale = _, axis) : scale;
5872           };
5873
5874           axis.ticks = function() {
5875             return tickArguments = slice$5.call(arguments), axis;
5876           };
5877
5878           axis.tickArguments = function(_) {
5879             return arguments.length ? (tickArguments = _ == null ? [] : slice$5.call(_), axis) : tickArguments.slice();
5880           };
5881
5882           axis.tickValues = function(_) {
5883             return arguments.length ? (tickValues = _ == null ? null : slice$5.call(_), axis) : tickValues && tickValues.slice();
5884           };
5885
5886           axis.tickFormat = function(_) {
5887             return arguments.length ? (tickFormat = _, axis) : tickFormat;
5888           };
5889
5890           axis.tickSize = function(_) {
5891             return arguments.length ? (tickSizeInner = tickSizeOuter = +_, axis) : tickSizeInner;
5892           };
5893
5894           axis.tickSizeInner = function(_) {
5895             return arguments.length ? (tickSizeInner = +_, axis) : tickSizeInner;
5896           };
5897
5898           axis.tickSizeOuter = function(_) {
5899             return arguments.length ? (tickSizeOuter = +_, axis) : tickSizeOuter;
5900           };
5901
5902           axis.tickPadding = function(_) {
5903             return arguments.length ? (tickPadding = +_, axis) : tickPadding;
5904           };
5905
5906           return axis;
5907         }
5908
5909         function axisTop(scale) {
5910           return axis(top, scale);
5911         }
5912
5913         function axisRight(scale) {
5914           return axis(right, scale);
5915         }
5916
5917         function axisBottom(scale) {
5918           return axis(bottom, scale);
5919         }
5920
5921         function axisLeft(scale) {
5922           return axis(left, scale);
5923         }
5924
5925         var noop$2 = {value: function() {}};
5926
5927         function dispatch() {
5928           for (var i = 0, n = arguments.length, _ = {}, t; i < n; ++i) {
5929             if (!(t = arguments[i] + "") || (t in _)) throw new Error("illegal type: " + t);
5930             _[t] = [];
5931           }
5932           return new Dispatch(_);
5933         }
5934
5935         function Dispatch(_) {
5936           this._ = _;
5937         }
5938
5939         function parseTypenames(typenames, types) {
5940           return typenames.trim().split(/^|\s+/).map(function(t) {
5941             var name = "", i = t.indexOf(".");
5942             if (i >= 0) name = t.slice(i + 1), t = t.slice(0, i);
5943             if (t && !types.hasOwnProperty(t)) throw new Error("unknown type: " + t);
5944             return {type: t, name: name};
5945           });
5946         }
5947
5948         Dispatch.prototype = dispatch.prototype = {
5949           constructor: Dispatch,
5950           on: function(typename, callback) {
5951             var _ = this._,
5952                 T = parseTypenames(typename + "", _),
5953                 t,
5954                 i = -1,
5955                 n = T.length;
5956
5957             // If no callback was specified, return the callback of the given type and name.
5958             if (arguments.length < 2) {
5959               while (++i < n) if ((t = (typename = T[i]).type) && (t = get$1(_[t], typename.name))) return t;
5960               return;
5961             }
5962
5963             // If a type was specified, set the callback for the given type and name.
5964             // Otherwise, if a null callback was specified, remove callbacks of the given name.
5965             if (callback != null && typeof callback !== "function") throw new Error("invalid callback: " + callback);
5966             while (++i < n) {
5967               if (t = (typename = T[i]).type) _[t] = set(_[t], typename.name, callback);
5968               else if (callback == null) for (t in _) _[t] = set(_[t], typename.name, null);
5969             }
5970
5971             return this;
5972           },
5973           copy: function() {
5974             var copy = {}, _ = this._;
5975             for (var t in _) copy[t] = _[t].slice();
5976             return new Dispatch(copy);
5977           },
5978           call: function(type, that) {
5979             if ((n = arguments.length - 2) > 0) for (var args = new Array(n), i = 0, n, t; i < n; ++i) args[i] = arguments[i + 2];
5980             if (!this._.hasOwnProperty(type)) throw new Error("unknown type: " + type);
5981             for (t = this._[type], i = 0, n = t.length; i < n; ++i) t[i].value.apply(that, args);
5982           },
5983           apply: function(type, that, args) {
5984             if (!this._.hasOwnProperty(type)) throw new Error("unknown type: " + type);
5985             for (var t = this._[type], i = 0, n = t.length; i < n; ++i) t[i].value.apply(that, args);
5986           }
5987         };
5988
5989         function get$1(type, name) {
5990           for (var i = 0, n = type.length, c; i < n; ++i) {
5991             if ((c = type[i]).name === name) {
5992               return c.value;
5993             }
5994           }
5995         }
5996
5997         function set(type, name, callback) {
5998           for (var i = 0, n = type.length; i < n; ++i) {
5999             if (type[i].name === name) {
6000               type[i] = noop$2, type = type.slice(0, i).concat(type.slice(i + 1));
6001               break;
6002             }
6003           }
6004           if (callback != null) type.push({name: name, value: callback});
6005           return type;
6006         }
6007
6008         var xhtml = "http://www.w3.org/1999/xhtml";
6009
6010         var namespaces = {
6011           svg: "http://www.w3.org/2000/svg",
6012           xhtml: xhtml,
6013           xlink: "http://www.w3.org/1999/xlink",
6014           xml: "http://www.w3.org/XML/1998/namespace",
6015           xmlns: "http://www.w3.org/2000/xmlns/"
6016         };
6017
6018         function namespace(name) {
6019           var prefix = name += "", i = prefix.indexOf(":");
6020           if (i >= 0 && (prefix = name.slice(0, i)) !== "xmlns") name = name.slice(i + 1);
6021           return namespaces.hasOwnProperty(prefix) ? {space: namespaces[prefix], local: name} : name;
6022         }
6023
6024         function creatorInherit(name) {
6025           return function() {
6026             var document = this.ownerDocument,
6027                 uri = this.namespaceURI;
6028             return uri === xhtml && document.documentElement.namespaceURI === xhtml
6029                 ? document.createElement(name)
6030                 : document.createElementNS(uri, name);
6031           };
6032         }
6033
6034         function creatorFixed(fullname) {
6035           return function() {
6036             return this.ownerDocument.createElementNS(fullname.space, fullname.local);
6037           };
6038         }
6039
6040         function creator(name) {
6041           var fullname = namespace(name);
6042           return (fullname.local
6043               ? creatorFixed
6044               : creatorInherit)(fullname);
6045         }
6046
6047         function none() {}
6048
6049         function selector(selector) {
6050           return selector == null ? none : function() {
6051             return this.querySelector(selector);
6052           };
6053         }
6054
6055         function selection_select(select) {
6056           if (typeof select !== "function") select = selector(select);
6057
6058           for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {
6059             for (var group = groups[j], n = group.length, subgroup = subgroups[j] = new Array(n), node, subnode, i = 0; i < n; ++i) {
6060               if ((node = group[i]) && (subnode = select.call(node, node.__data__, i, group))) {
6061                 if ("__data__" in node) subnode.__data__ = node.__data__;
6062                 subgroup[i] = subnode;
6063               }
6064             }
6065           }
6066
6067           return new Selection(subgroups, this._parents);
6068         }
6069
6070         function empty() {
6071           return [];
6072         }
6073
6074         function selectorAll(selector) {
6075           return selector == null ? empty : function() {
6076             return this.querySelectorAll(selector);
6077           };
6078         }
6079
6080         function selection_selectAll(select) {
6081           if (typeof select !== "function") select = selectorAll(select);
6082
6083           for (var groups = this._groups, m = groups.length, subgroups = [], parents = [], j = 0; j < m; ++j) {
6084             for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {
6085               if (node = group[i]) {
6086                 subgroups.push(select.call(node, node.__data__, i, group));
6087                 parents.push(node);
6088               }
6089             }
6090           }
6091
6092           return new Selection(subgroups, parents);
6093         }
6094
6095         function matcher(selector) {
6096           return function() {
6097             return this.matches(selector);
6098           };
6099         }
6100
6101         function selection_filter(match) {
6102           if (typeof match !== "function") match = matcher(match);
6103
6104           for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {
6105             for (var group = groups[j], n = group.length, subgroup = subgroups[j] = [], node, i = 0; i < n; ++i) {
6106               if ((node = group[i]) && match.call(node, node.__data__, i, group)) {
6107                 subgroup.push(node);
6108               }
6109             }
6110           }
6111
6112           return new Selection(subgroups, this._parents);
6113         }
6114
6115         function sparse(update) {
6116           return new Array(update.length);
6117         }
6118
6119         function selection_enter() {
6120           return new Selection(this._enter || this._groups.map(sparse), this._parents);
6121         }
6122
6123         function EnterNode(parent, datum) {
6124           this.ownerDocument = parent.ownerDocument;
6125           this.namespaceURI = parent.namespaceURI;
6126           this._next = null;
6127           this._parent = parent;
6128           this.__data__ = datum;
6129         }
6130
6131         EnterNode.prototype = {
6132           constructor: EnterNode,
6133           appendChild: function(child) { return this._parent.insertBefore(child, this._next); },
6134           insertBefore: function(child, next) { return this._parent.insertBefore(child, next); },
6135           querySelector: function(selector) { return this._parent.querySelector(selector); },
6136           querySelectorAll: function(selector) { return this._parent.querySelectorAll(selector); }
6137         };
6138
6139         function constant$1(x) {
6140           return function() {
6141             return x;
6142           };
6143         }
6144
6145         var keyPrefix = "$"; // Protect against keys like “__proto__”.
6146
6147         function bindIndex(parent, group, enter, update, exit, data) {
6148           var i = 0,
6149               node,
6150               groupLength = group.length,
6151               dataLength = data.length;
6152
6153           // Put any non-null nodes that fit into update.
6154           // Put any null nodes into enter.
6155           // Put any remaining data into enter.
6156           for (; i < dataLength; ++i) {
6157             if (node = group[i]) {
6158               node.__data__ = data[i];
6159               update[i] = node;
6160             } else {
6161               enter[i] = new EnterNode(parent, data[i]);
6162             }
6163           }
6164
6165           // Put any non-null nodes that don’t fit into exit.
6166           for (; i < groupLength; ++i) {
6167             if (node = group[i]) {
6168               exit[i] = node;
6169             }
6170           }
6171         }
6172
6173         function bindKey(parent, group, enter, update, exit, data, key) {
6174           var i,
6175               node,
6176               nodeByKeyValue = {},
6177               groupLength = group.length,
6178               dataLength = data.length,
6179               keyValues = new Array(groupLength),
6180               keyValue;
6181
6182           // Compute the key for each node.
6183           // If multiple nodes have the same key, the duplicates are added to exit.
6184           for (i = 0; i < groupLength; ++i) {
6185             if (node = group[i]) {
6186               keyValues[i] = keyValue = keyPrefix + key.call(node, node.__data__, i, group);
6187               if (keyValue in nodeByKeyValue) {
6188                 exit[i] = node;
6189               } else {
6190                 nodeByKeyValue[keyValue] = node;
6191               }
6192             }
6193           }
6194
6195           // Compute the key for each datum.
6196           // If there a node associated with this key, join and add it to update.
6197           // If there is not (or the key is a duplicate), add it to enter.
6198           for (i = 0; i < dataLength; ++i) {
6199             keyValue = keyPrefix + key.call(parent, data[i], i, data);
6200             if (node = nodeByKeyValue[keyValue]) {
6201               update[i] = node;
6202               node.__data__ = data[i];
6203               nodeByKeyValue[keyValue] = null;
6204             } else {
6205               enter[i] = new EnterNode(parent, data[i]);
6206             }
6207           }
6208
6209           // Add any remaining nodes that were not bound to data to exit.
6210           for (i = 0; i < groupLength; ++i) {
6211             if ((node = group[i]) && (nodeByKeyValue[keyValues[i]] === node)) {
6212               exit[i] = node;
6213             }
6214           }
6215         }
6216
6217         function selection_data(value, key) {
6218           if (!value) {
6219             data = new Array(this.size()), j = -1;
6220             this.each(function(d) { data[++j] = d; });
6221             return data;
6222           }
6223
6224           var bind = key ? bindKey : bindIndex,
6225               parents = this._parents,
6226               groups = this._groups;
6227
6228           if (typeof value !== "function") value = constant$1(value);
6229
6230           for (var m = groups.length, update = new Array(m), enter = new Array(m), exit = new Array(m), j = 0; j < m; ++j) {
6231             var parent = parents[j],
6232                 group = groups[j],
6233                 groupLength = group.length,
6234                 data = value.call(parent, parent && parent.__data__, j, parents),
6235                 dataLength = data.length,
6236                 enterGroup = enter[j] = new Array(dataLength),
6237                 updateGroup = update[j] = new Array(dataLength),
6238                 exitGroup = exit[j] = new Array(groupLength);
6239
6240             bind(parent, group, enterGroup, updateGroup, exitGroup, data, key);
6241
6242             // Now connect the enter nodes to their following update node, such that
6243             // appendChild can insert the materialized enter node before this node,
6244             // rather than at the end of the parent node.
6245             for (var i0 = 0, i1 = 0, previous, next; i0 < dataLength; ++i0) {
6246               if (previous = enterGroup[i0]) {
6247                 if (i0 >= i1) i1 = i0 + 1;
6248                 while (!(next = updateGroup[i1]) && ++i1 < dataLength);
6249                 previous._next = next || null;
6250               }
6251             }
6252           }
6253
6254           update = new Selection(update, parents);
6255           update._enter = enter;
6256           update._exit = exit;
6257           return update;
6258         }
6259
6260         function selection_exit() {
6261           return new Selection(this._exit || this._groups.map(sparse), this._parents);
6262         }
6263
6264         function selection_join(onenter, onupdate, onexit) {
6265           var enter = this.enter(), update = this, exit = this.exit();
6266           enter = typeof onenter === "function" ? onenter(enter) : enter.append(onenter + "");
6267           if (onupdate != null) update = onupdate(update);
6268           if (onexit == null) exit.remove(); else onexit(exit);
6269           return enter && update ? enter.merge(update).order() : update;
6270         }
6271
6272         function selection_merge(selection) {
6273
6274           for (var groups0 = this._groups, groups1 = selection._groups, m0 = groups0.length, m1 = groups1.length, m = Math.min(m0, m1), merges = new Array(m0), j = 0; j < m; ++j) {
6275             for (var group0 = groups0[j], group1 = groups1[j], n = group0.length, merge = merges[j] = new Array(n), node, i = 0; i < n; ++i) {
6276               if (node = group0[i] || group1[i]) {
6277                 merge[i] = node;
6278               }
6279             }
6280           }
6281
6282           for (; j < m0; ++j) {
6283             merges[j] = groups0[j];
6284           }
6285
6286           return new Selection(merges, this._parents);
6287         }
6288
6289         function selection_order() {
6290
6291           for (var groups = this._groups, j = -1, m = groups.length; ++j < m;) {
6292             for (var group = groups[j], i = group.length - 1, next = group[i], node; --i >= 0;) {
6293               if (node = group[i]) {
6294                 if (next && node.compareDocumentPosition(next) ^ 4) next.parentNode.insertBefore(node, next);
6295                 next = node;
6296               }
6297             }
6298           }
6299
6300           return this;
6301         }
6302
6303         function selection_sort(compare) {
6304           if (!compare) compare = ascending;
6305
6306           function compareNode(a, b) {
6307             return a && b ? compare(a.__data__, b.__data__) : !a - !b;
6308           }
6309
6310           for (var groups = this._groups, m = groups.length, sortgroups = new Array(m), j = 0; j < m; ++j) {
6311             for (var group = groups[j], n = group.length, sortgroup = sortgroups[j] = new Array(n), node, i = 0; i < n; ++i) {
6312               if (node = group[i]) {
6313                 sortgroup[i] = node;
6314               }
6315             }
6316             sortgroup.sort(compareNode);
6317           }
6318
6319           return new Selection(sortgroups, this._parents).order();
6320         }
6321
6322         function ascending(a, b) {
6323           return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;
6324         }
6325
6326         function selection_call() {
6327           var callback = arguments[0];
6328           arguments[0] = this;
6329           callback.apply(null, arguments);
6330           return this;
6331         }
6332
6333         function selection_nodes() {
6334           var nodes = new Array(this.size()), i = -1;
6335           this.each(function() { nodes[++i] = this; });
6336           return nodes;
6337         }
6338
6339         function selection_node() {
6340
6341           for (var groups = this._groups, j = 0, m = groups.length; j < m; ++j) {
6342             for (var group = groups[j], i = 0, n = group.length; i < n; ++i) {
6343               var node = group[i];
6344               if (node) return node;
6345             }
6346           }
6347
6348           return null;
6349         }
6350
6351         function selection_size() {
6352           var size = 0;
6353           this.each(function() { ++size; });
6354           return size;
6355         }
6356
6357         function selection_empty() {
6358           return !this.node();
6359         }
6360
6361         function selection_each(callback) {
6362
6363           for (var groups = this._groups, j = 0, m = groups.length; j < m; ++j) {
6364             for (var group = groups[j], i = 0, n = group.length, node; i < n; ++i) {
6365               if (node = group[i]) callback.call(node, node.__data__, i, group);
6366             }
6367           }
6368
6369           return this;
6370         }
6371
6372         function attrRemove(name) {
6373           return function() {
6374             this.removeAttribute(name);
6375           };
6376         }
6377
6378         function attrRemoveNS(fullname) {
6379           return function() {
6380             this.removeAttributeNS(fullname.space, fullname.local);
6381           };
6382         }
6383
6384         function attrConstant(name, value) {
6385           return function() {
6386             this.setAttribute(name, value);
6387           };
6388         }
6389
6390         function attrConstantNS(fullname, value) {
6391           return function() {
6392             this.setAttributeNS(fullname.space, fullname.local, value);
6393           };
6394         }
6395
6396         function attrFunction(name, value) {
6397           return function() {
6398             var v = value.apply(this, arguments);
6399             if (v == null) this.removeAttribute(name);
6400             else this.setAttribute(name, v);
6401           };
6402         }
6403
6404         function attrFunctionNS(fullname, value) {
6405           return function() {
6406             var v = value.apply(this, arguments);
6407             if (v == null) this.removeAttributeNS(fullname.space, fullname.local);
6408             else this.setAttributeNS(fullname.space, fullname.local, v);
6409           };
6410         }
6411
6412         function selection_attr(name, value) {
6413           var fullname = namespace(name);
6414
6415           if (arguments.length < 2) {
6416             var node = this.node();
6417             return fullname.local
6418                 ? node.getAttributeNS(fullname.space, fullname.local)
6419                 : node.getAttribute(fullname);
6420           }
6421
6422           return this.each((value == null
6423               ? (fullname.local ? attrRemoveNS : attrRemove) : (typeof value === "function"
6424               ? (fullname.local ? attrFunctionNS : attrFunction)
6425               : (fullname.local ? attrConstantNS : attrConstant)))(fullname, value));
6426         }
6427
6428         function defaultView(node) {
6429           return (node.ownerDocument && node.ownerDocument.defaultView) // node is a Node
6430               || (node.document && node) // node is a Window
6431               || node.defaultView; // node is a Document
6432         }
6433
6434         function styleRemove(name) {
6435           return function() {
6436             this.style.removeProperty(name);
6437           };
6438         }
6439
6440         function styleConstant(name, value, priority) {
6441           return function() {
6442             this.style.setProperty(name, value, priority);
6443           };
6444         }
6445
6446         function styleFunction(name, value, priority) {
6447           return function() {
6448             var v = value.apply(this, arguments);
6449             if (v == null) this.style.removeProperty(name);
6450             else this.style.setProperty(name, v, priority);
6451           };
6452         }
6453
6454         function selection_style(name, value, priority) {
6455           return arguments.length > 1
6456               ? this.each((value == null
6457                     ? styleRemove : typeof value === "function"
6458                     ? styleFunction
6459                     : styleConstant)(name, value, priority == null ? "" : priority))
6460               : styleValue(this.node(), name);
6461         }
6462
6463         function styleValue(node, name) {
6464           return node.style.getPropertyValue(name)
6465               || defaultView(node).getComputedStyle(node, null).getPropertyValue(name);
6466         }
6467
6468         function propertyRemove(name) {
6469           return function() {
6470             delete this[name];
6471           };
6472         }
6473
6474         function propertyConstant(name, value) {
6475           return function() {
6476             this[name] = value;
6477           };
6478         }
6479
6480         function propertyFunction(name, value) {
6481           return function() {
6482             var v = value.apply(this, arguments);
6483             if (v == null) delete this[name];
6484             else this[name] = v;
6485           };
6486         }
6487
6488         function selection_property(name, value) {
6489           return arguments.length > 1
6490               ? this.each((value == null
6491                   ? propertyRemove : typeof value === "function"
6492                   ? propertyFunction
6493                   : propertyConstant)(name, value))
6494               : this.node()[name];
6495         }
6496
6497         function classArray(string) {
6498           return string.trim().split(/^|\s+/);
6499         }
6500
6501         function classList(node) {
6502           return node.classList || new ClassList(node);
6503         }
6504
6505         function ClassList(node) {
6506           this._node = node;
6507           this._names = classArray(node.getAttribute("class") || "");
6508         }
6509
6510         ClassList.prototype = {
6511           add: function(name) {
6512             var i = this._names.indexOf(name);
6513             if (i < 0) {
6514               this._names.push(name);
6515               this._node.setAttribute("class", this._names.join(" "));
6516             }
6517           },
6518           remove: function(name) {
6519             var i = this._names.indexOf(name);
6520             if (i >= 0) {
6521               this._names.splice(i, 1);
6522               this._node.setAttribute("class", this._names.join(" "));
6523             }
6524           },
6525           contains: function(name) {
6526             return this._names.indexOf(name) >= 0;
6527           }
6528         };
6529
6530         function classedAdd(node, names) {
6531           var list = classList(node), i = -1, n = names.length;
6532           while (++i < n) list.add(names[i]);
6533         }
6534
6535         function classedRemove(node, names) {
6536           var list = classList(node), i = -1, n = names.length;
6537           while (++i < n) list.remove(names[i]);
6538         }
6539
6540         function classedTrue(names) {
6541           return function() {
6542             classedAdd(this, names);
6543           };
6544         }
6545
6546         function classedFalse(names) {
6547           return function() {
6548             classedRemove(this, names);
6549           };
6550         }
6551
6552         function classedFunction(names, value) {
6553           return function() {
6554             (value.apply(this, arguments) ? classedAdd : classedRemove)(this, names);
6555           };
6556         }
6557
6558         function selection_classed(name, value) {
6559           var names = classArray(name + "");
6560
6561           if (arguments.length < 2) {
6562             var list = classList(this.node()), i = -1, n = names.length;
6563             while (++i < n) if (!list.contains(names[i])) return false;
6564             return true;
6565           }
6566
6567           return this.each((typeof value === "function"
6568               ? classedFunction : value
6569               ? classedTrue
6570               : classedFalse)(names, value));
6571         }
6572
6573         function textRemove() {
6574           this.textContent = "";
6575         }
6576
6577         function textConstant(value) {
6578           return function() {
6579             this.textContent = value;
6580           };
6581         }
6582
6583         function textFunction(value) {
6584           return function() {
6585             var v = value.apply(this, arguments);
6586             this.textContent = v == null ? "" : v;
6587           };
6588         }
6589
6590         function selection_text(value) {
6591           return arguments.length
6592               ? this.each(value == null
6593                   ? textRemove : (typeof value === "function"
6594                   ? textFunction
6595                   : textConstant)(value))
6596               : this.node().textContent;
6597         }
6598
6599         function htmlRemove() {
6600           this.innerHTML = "";
6601         }
6602
6603         function htmlConstant(value) {
6604           return function() {
6605             this.innerHTML = value;
6606           };
6607         }
6608
6609         function htmlFunction(value) {
6610           return function() {
6611             var v = value.apply(this, arguments);
6612             this.innerHTML = v == null ? "" : v;
6613           };
6614         }
6615
6616         function selection_html(value) {
6617           return arguments.length
6618               ? this.each(value == null
6619                   ? htmlRemove : (typeof value === "function"
6620                   ? htmlFunction
6621                   : htmlConstant)(value))
6622               : this.node().innerHTML;
6623         }
6624
6625         function raise() {
6626           if (this.nextSibling) this.parentNode.appendChild(this);
6627         }
6628
6629         function selection_raise() {
6630           return this.each(raise);
6631         }
6632
6633         function lower() {
6634           if (this.previousSibling) this.parentNode.insertBefore(this, this.parentNode.firstChild);
6635         }
6636
6637         function selection_lower() {
6638           return this.each(lower);
6639         }
6640
6641         function selection_append(name) {
6642           var create = typeof name === "function" ? name : creator(name);
6643           return this.select(function() {
6644             return this.appendChild(create.apply(this, arguments));
6645           });
6646         }
6647
6648         function constantNull() {
6649           return null;
6650         }
6651
6652         function selection_insert(name, before) {
6653           var create = typeof name === "function" ? name : creator(name),
6654               select = before == null ? constantNull : typeof before === "function" ? before : selector(before);
6655           return this.select(function() {
6656             return this.insertBefore(create.apply(this, arguments), select.apply(this, arguments) || null);
6657           });
6658         }
6659
6660         function remove() {
6661           var parent = this.parentNode;
6662           if (parent) parent.removeChild(this);
6663         }
6664
6665         function selection_remove() {
6666           return this.each(remove);
6667         }
6668
6669         function selection_cloneShallow() {
6670           return this.parentNode.insertBefore(this.cloneNode(false), this.nextSibling);
6671         }
6672
6673         function selection_cloneDeep() {
6674           return this.parentNode.insertBefore(this.cloneNode(true), this.nextSibling);
6675         }
6676
6677         function selection_clone(deep) {
6678           return this.select(deep ? selection_cloneDeep : selection_cloneShallow);
6679         }
6680
6681         function selection_datum(value) {
6682           return arguments.length
6683               ? this.property("__data__", value)
6684               : this.node().__data__;
6685         }
6686
6687         var filterEvents = {};
6688
6689         var event = null;
6690
6691         if (typeof document !== "undefined") {
6692           var element = document.documentElement;
6693           if (!("onmouseenter" in element)) {
6694             filterEvents = {mouseenter: "mouseover", mouseleave: "mouseout"};
6695           }
6696         }
6697
6698         function filterContextListener(listener, index, group) {
6699           listener = contextListener(listener, index, group);
6700           return function(event) {
6701             var related = event.relatedTarget;
6702             if (!related || (related !== this && !(related.compareDocumentPosition(this) & 8))) {
6703               listener.call(this, event);
6704             }
6705           };
6706         }
6707
6708         function contextListener(listener, index, group) {
6709           return function(event1) {
6710             var event0 = event; // Events can be reentrant (e.g., focus).
6711             event = event1;
6712             try {
6713               listener.call(this, this.__data__, index, group);
6714             } finally {
6715               event = event0;
6716             }
6717           };
6718         }
6719
6720         function parseTypenames$1(typenames) {
6721           return typenames.trim().split(/^|\s+/).map(function(t) {
6722             var name = "", i = t.indexOf(".");
6723             if (i >= 0) name = t.slice(i + 1), t = t.slice(0, i);
6724             return {type: t, name: name};
6725           });
6726         }
6727
6728         function onRemove(typename) {
6729           return function() {
6730             var on = this.__on;
6731             if (!on) return;
6732             for (var j = 0, i = -1, m = on.length, o; j < m; ++j) {
6733               if (o = on[j], (!typename.type || o.type === typename.type) && o.name === typename.name) {
6734                 this.removeEventListener(o.type, o.listener, o.capture);
6735               } else {
6736                 on[++i] = o;
6737               }
6738             }
6739             if (++i) on.length = i;
6740             else delete this.__on;
6741           };
6742         }
6743
6744         function onAdd(typename, value, capture) {
6745           var wrap = filterEvents.hasOwnProperty(typename.type) ? filterContextListener : contextListener;
6746           return function(d, i, group) {
6747             var on = this.__on, o, listener = wrap(value, i, group);
6748             if (on) for (var j = 0, m = on.length; j < m; ++j) {
6749               if ((o = on[j]).type === typename.type && o.name === typename.name) {
6750                 this.removeEventListener(o.type, o.listener, o.capture);
6751                 this.addEventListener(o.type, o.listener = listener, o.capture = capture);
6752                 o.value = value;
6753                 return;
6754               }
6755             }
6756             this.addEventListener(typename.type, listener, capture);
6757             o = {type: typename.type, name: typename.name, value: value, listener: listener, capture: capture};
6758             if (!on) this.__on = [o];
6759             else on.push(o);
6760           };
6761         }
6762
6763         function selection_on(typename, value, capture) {
6764           var typenames = parseTypenames$1(typename + ""), i, n = typenames.length, t;
6765
6766           if (arguments.length < 2) {
6767             var on = this.node().__on;
6768             if (on) for (var j = 0, m = on.length, o; j < m; ++j) {
6769               for (i = 0, o = on[j]; i < n; ++i) {
6770                 if ((t = typenames[i]).type === o.type && t.name === o.name) {
6771                   return o.value;
6772                 }
6773               }
6774             }
6775             return;
6776           }
6777
6778           on = value ? onAdd : onRemove;
6779           if (capture == null) capture = false;
6780           for (i = 0; i < n; ++i) this.each(on(typenames[i], value, capture));
6781           return this;
6782         }
6783
6784         function customEvent(event1, listener, that, args) {
6785           var event0 = event;
6786           event1.sourceEvent = event;
6787           event = event1;
6788           try {
6789             return listener.apply(that, args);
6790           } finally {
6791             event = event0;
6792           }
6793         }
6794
6795         function dispatchEvent(node, type, params) {
6796           var window = defaultView(node),
6797               event = window.CustomEvent;
6798
6799           if (typeof event === "function") {
6800             event = new event(type, params);
6801           } else {
6802             event = window.document.createEvent("Event");
6803             if (params) event.initEvent(type, params.bubbles, params.cancelable), event.detail = params.detail;
6804             else event.initEvent(type, false, false);
6805           }
6806
6807           node.dispatchEvent(event);
6808         }
6809
6810         function dispatchConstant(type, params) {
6811           return function() {
6812             return dispatchEvent(this, type, params);
6813           };
6814         }
6815
6816         function dispatchFunction(type, params) {
6817           return function() {
6818             return dispatchEvent(this, type, params.apply(this, arguments));
6819           };
6820         }
6821
6822         function selection_dispatch(type, params) {
6823           return this.each((typeof params === "function"
6824               ? dispatchFunction
6825               : dispatchConstant)(type, params));
6826         }
6827
6828         var root$1 = [null];
6829
6830         function Selection(groups, parents) {
6831           this._groups = groups;
6832           this._parents = parents;
6833         }
6834
6835         function selection() {
6836           return new Selection([[document.documentElement]], root$1);
6837         }
6838
6839         Selection.prototype = selection.prototype = {
6840           constructor: Selection,
6841           select: selection_select,
6842           selectAll: selection_selectAll,
6843           filter: selection_filter,
6844           data: selection_data,
6845           enter: selection_enter,
6846           exit: selection_exit,
6847           join: selection_join,
6848           merge: selection_merge,
6849           order: selection_order,
6850           sort: selection_sort,
6851           call: selection_call,
6852           nodes: selection_nodes,
6853           node: selection_node,
6854           size: selection_size,
6855           empty: selection_empty,
6856           each: selection_each,
6857           attr: selection_attr,
6858           style: selection_style,
6859           property: selection_property,
6860           classed: selection_classed,
6861           text: selection_text,
6862           html: selection_html,
6863           raise: selection_raise,
6864           lower: selection_lower,
6865           append: selection_append,
6866           insert: selection_insert,
6867           remove: selection_remove,
6868           clone: selection_clone,
6869           datum: selection_datum,
6870           on: selection_on,
6871           dispatch: selection_dispatch
6872         };
6873
6874         function d3_select(selector) {
6875           return typeof selector === "string"
6876               ? new Selection([[document.querySelector(selector)]], [document.documentElement])
6877               : new Selection([[selector]], root$1);
6878         }
6879
6880         function create$5(name) {
6881           return d3_select(creator(name).call(document.documentElement));
6882         }
6883
6884         var nextId = 0;
6885
6886         function local() {
6887           return new Local;
6888         }
6889
6890         function Local() {
6891           this._ = "@" + (++nextId).toString(36);
6892         }
6893
6894         Local.prototype = local.prototype = {
6895           constructor: Local,
6896           get: function(node) {
6897             var id = this._;
6898             while (!(id in node)) if (!(node = node.parentNode)) return;
6899             return node[id];
6900           },
6901           set: function(node, value) {
6902             return node[this._] = value;
6903           },
6904           remove: function(node) {
6905             return this._ in node && delete node[this._];
6906           },
6907           toString: function() {
6908             return this._;
6909           }
6910         };
6911
6912         function sourceEvent() {
6913           var current = event, source;
6914           while (source = current.sourceEvent) current = source;
6915           return current;
6916         }
6917
6918         function point(node, event) {
6919           var svg = node.ownerSVGElement || node;
6920
6921           if (svg.createSVGPoint) {
6922             var point = svg.createSVGPoint();
6923             point.x = event.clientX, point.y = event.clientY;
6924             point = point.matrixTransform(node.getScreenCTM().inverse());
6925             return [point.x, point.y];
6926           }
6927
6928           var rect = node.getBoundingClientRect();
6929           return [event.clientX - rect.left - node.clientLeft, event.clientY - rect.top - node.clientTop];
6930         }
6931
6932         function d3_mouse(node) {
6933           var event = sourceEvent();
6934           if (event.changedTouches) event = event.changedTouches[0];
6935           return point(node, event);
6936         }
6937
6938         function d3_selectAll(selector) {
6939           return typeof selector === "string"
6940               ? new Selection([document.querySelectorAll(selector)], [document.documentElement])
6941               : new Selection([selector == null ? [] : selector], root$1);
6942         }
6943
6944         function touch(node, touches, identifier) {
6945           if (arguments.length < 3) identifier = touches, touches = sourceEvent().changedTouches;
6946
6947           for (var i = 0, n = touches ? touches.length : 0, touch; i < n; ++i) {
6948             if ((touch = touches[i]).identifier === identifier) {
6949               return point(node, touch);
6950             }
6951           }
6952
6953           return null;
6954         }
6955
6956         function d3_touches(node, touches) {
6957           if (touches == null) touches = sourceEvent().touches;
6958
6959           for (var i = 0, n = touches ? touches.length : 0, points = new Array(n); i < n; ++i) {
6960             points[i] = point(node, touches[i]);
6961           }
6962
6963           return points;
6964         }
6965
6966         function nopropagation() {
6967           event.stopImmediatePropagation();
6968         }
6969
6970         function noevent() {
6971           event.preventDefault();
6972           event.stopImmediatePropagation();
6973         }
6974
6975         function dragDisable(view) {
6976           var root = view.document.documentElement,
6977               selection = d3_select(view).on("dragstart.drag", noevent, true);
6978           if ("onselectstart" in root) {
6979             selection.on("selectstart.drag", noevent, true);
6980           } else {
6981             root.__noselect = root.style.MozUserSelect;
6982             root.style.MozUserSelect = "none";
6983           }
6984         }
6985
6986         function yesdrag(view, noclick) {
6987           var root = view.document.documentElement,
6988               selection = d3_select(view).on("dragstart.drag", null);
6989           if (noclick) {
6990             selection.on("click.drag", noevent, true);
6991             setTimeout(function() { selection.on("click.drag", null); }, 0);
6992           }
6993           if ("onselectstart" in root) {
6994             selection.on("selectstart.drag", null);
6995           } else {
6996             root.style.MozUserSelect = root.__noselect;
6997             delete root.__noselect;
6998           }
6999         }
7000
7001         function constant$2(x) {
7002           return function() {
7003             return x;
7004           };
7005         }
7006
7007         function DragEvent(target, type, subject, id, active, x, y, dx, dy, dispatch) {
7008           this.target = target;
7009           this.type = type;
7010           this.subject = subject;
7011           this.identifier = id;
7012           this.active = active;
7013           this.x = x;
7014           this.y = y;
7015           this.dx = dx;
7016           this.dy = dy;
7017           this._ = dispatch;
7018         }
7019
7020         DragEvent.prototype.on = function() {
7021           var value = this._.on.apply(this._, arguments);
7022           return value === this._ ? this : value;
7023         };
7024
7025         // Ignore right-click, since that should open the context menu.
7026         function defaultFilter() {
7027           return !event.button;
7028         }
7029
7030         function defaultContainer() {
7031           return this.parentNode;
7032         }
7033
7034         function defaultSubject(d) {
7035           return d == null ? {x: event.x, y: event.y} : d;
7036         }
7037
7038         function defaultTouchable() {
7039           return "ontouchstart" in this;
7040         }
7041
7042         function d3_drag() {
7043           var filter = defaultFilter,
7044               container = defaultContainer,
7045               subject = defaultSubject,
7046               touchable = defaultTouchable,
7047               gestures = {},
7048               listeners = dispatch("start", "drag", "end"),
7049               active = 0,
7050               mousedownx,
7051               mousedowny,
7052               mousemoving,
7053               touchending,
7054               clickDistance2 = 0;
7055
7056           function drag(selection) {
7057             selection
7058                 .on("mousedown.drag", mousedowned)
7059               .filter(touchable)
7060                 .on("touchstart.drag", touchstarted)
7061                 .on("touchmove.drag", touchmoved)
7062                 .on("touchend.drag touchcancel.drag", touchended)
7063                 .style("touch-action", "none")
7064                 .style("-webkit-tap-highlight-color", "rgba(0,0,0,0)");
7065           }
7066
7067           function mousedowned() {
7068             if (touchending || !filter.apply(this, arguments)) return;
7069             var gesture = beforestart("mouse", container.apply(this, arguments), d3_mouse, this, arguments);
7070             if (!gesture) return;
7071             d3_select(event.view).on("mousemove.drag", mousemoved, true).on("mouseup.drag", mouseupped, true);
7072             dragDisable(event.view);
7073             nopropagation();
7074             mousemoving = false;
7075             mousedownx = event.clientX;
7076             mousedowny = event.clientY;
7077             gesture("start");
7078           }
7079
7080           function mousemoved() {
7081             noevent();
7082             if (!mousemoving) {
7083               var dx = event.clientX - mousedownx, dy = event.clientY - mousedowny;
7084               mousemoving = dx * dx + dy * dy > clickDistance2;
7085             }
7086             gestures.mouse("drag");
7087           }
7088
7089           function mouseupped() {
7090             d3_select(event.view).on("mousemove.drag mouseup.drag", null);
7091             yesdrag(event.view, mousemoving);
7092             noevent();
7093             gestures.mouse("end");
7094           }
7095
7096           function touchstarted() {
7097             if (!filter.apply(this, arguments)) return;
7098             var touches = event.changedTouches,
7099                 c = container.apply(this, arguments),
7100                 n = touches.length, i, gesture;
7101
7102             for (i = 0; i < n; ++i) {
7103               if (gesture = beforestart(touches[i].identifier, c, touch, this, arguments)) {
7104                 nopropagation();
7105                 gesture("start");
7106               }
7107             }
7108           }
7109
7110           function touchmoved() {
7111             var touches = event.changedTouches,
7112                 n = touches.length, i, gesture;
7113
7114             for (i = 0; i < n; ++i) {
7115               if (gesture = gestures[touches[i].identifier]) {
7116                 noevent();
7117                 gesture("drag");
7118               }
7119             }
7120           }
7121
7122           function touchended() {
7123             var touches = event.changedTouches,
7124                 n = touches.length, i, gesture;
7125
7126             if (touchending) clearTimeout(touchending);
7127             touchending = setTimeout(function() { touchending = null; }, 500); // Ghost clicks are delayed!
7128             for (i = 0; i < n; ++i) {
7129               if (gesture = gestures[touches[i].identifier]) {
7130                 nopropagation();
7131                 gesture("end");
7132               }
7133             }
7134           }
7135
7136           function beforestart(id, container, point, that, args) {
7137             var p = point(container, id), s, dx, dy,
7138                 sublisteners = listeners.copy();
7139
7140             if (!customEvent(new DragEvent(drag, "beforestart", s, id, active, p[0], p[1], 0, 0, sublisteners), function() {
7141               if ((event.subject = s = subject.apply(that, args)) == null) return false;
7142               dx = s.x - p[0] || 0;
7143               dy = s.y - p[1] || 0;
7144               return true;
7145             })) return;
7146
7147             return function gesture(type) {
7148               var p0 = p, n;
7149               switch (type) {
7150                 case "start": gestures[id] = gesture, n = active++; break;
7151                 case "end": delete gestures[id], --active; // nobreak
7152                 case "drag": p = point(container, id), n = active; break;
7153               }
7154               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]);
7155             };
7156           }
7157
7158           drag.filter = function(_) {
7159             return arguments.length ? (filter = typeof _ === "function" ? _ : constant$2(!!_), drag) : filter;
7160           };
7161
7162           drag.container = function(_) {
7163             return arguments.length ? (container = typeof _ === "function" ? _ : constant$2(_), drag) : container;
7164           };
7165
7166           drag.subject = function(_) {
7167             return arguments.length ? (subject = typeof _ === "function" ? _ : constant$2(_), drag) : subject;
7168           };
7169
7170           drag.touchable = function(_) {
7171             return arguments.length ? (touchable = typeof _ === "function" ? _ : constant$2(!!_), drag) : touchable;
7172           };
7173
7174           drag.on = function() {
7175             var value = listeners.on.apply(listeners, arguments);
7176             return value === listeners ? drag : value;
7177           };
7178
7179           drag.clickDistance = function(_) {
7180             return arguments.length ? (clickDistance2 = (_ = +_) * _, drag) : Math.sqrt(clickDistance2);
7181           };
7182
7183           return drag;
7184         }
7185
7186         function define$1(constructor, factory, prototype) {
7187           constructor.prototype = factory.prototype = prototype;
7188           prototype.constructor = constructor;
7189         }
7190
7191         function extend(parent, definition) {
7192           var prototype = Object.create(parent.prototype);
7193           for (var key in definition) prototype[key] = definition[key];
7194           return prototype;
7195         }
7196
7197         function Color() {}
7198
7199         var darker = 0.7;
7200         var brighter = 1 / darker;
7201
7202         var reI = "\\s*([+-]?\\d+)\\s*",
7203             reN = "\\s*([+-]?\\d*\\.?\\d+(?:[eE][+-]?\\d+)?)\\s*",
7204             reP = "\\s*([+-]?\\d*\\.?\\d+(?:[eE][+-]?\\d+)?)%\\s*",
7205             reHex3 = /^#([0-9a-f]{3})$/,
7206             reHex6 = /^#([0-9a-f]{6})$/,
7207             reRgbInteger = new RegExp("^rgb\\(" + [reI, reI, reI] + "\\)$"),
7208             reRgbPercent = new RegExp("^rgb\\(" + [reP, reP, reP] + "\\)$"),
7209             reRgbaInteger = new RegExp("^rgba\\(" + [reI, reI, reI, reN] + "\\)$"),
7210             reRgbaPercent = new RegExp("^rgba\\(" + [reP, reP, reP, reN] + "\\)$"),
7211             reHslPercent = new RegExp("^hsl\\(" + [reN, reP, reP] + "\\)$"),
7212             reHslaPercent = new RegExp("^hsla\\(" + [reN, reP, reP, reN] + "\\)$");
7213
7214         var named = {
7215           aliceblue: 0xf0f8ff,
7216           antiquewhite: 0xfaebd7,
7217           aqua: 0x00ffff,
7218           aquamarine: 0x7fffd4,
7219           azure: 0xf0ffff,
7220           beige: 0xf5f5dc,
7221           bisque: 0xffe4c4,
7222           black: 0x000000,
7223           blanchedalmond: 0xffebcd,
7224           blue: 0x0000ff,
7225           blueviolet: 0x8a2be2,
7226           brown: 0xa52a2a,
7227           burlywood: 0xdeb887,
7228           cadetblue: 0x5f9ea0,
7229           chartreuse: 0x7fff00,
7230           chocolate: 0xd2691e,
7231           coral: 0xff7f50,
7232           cornflowerblue: 0x6495ed,
7233           cornsilk: 0xfff8dc,
7234           crimson: 0xdc143c,
7235           cyan: 0x00ffff,
7236           darkblue: 0x00008b,
7237           darkcyan: 0x008b8b,
7238           darkgoldenrod: 0xb8860b,
7239           darkgray: 0xa9a9a9,
7240           darkgreen: 0x006400,
7241           darkgrey: 0xa9a9a9,
7242           darkkhaki: 0xbdb76b,
7243           darkmagenta: 0x8b008b,
7244           darkolivegreen: 0x556b2f,
7245           darkorange: 0xff8c00,
7246           darkorchid: 0x9932cc,
7247           darkred: 0x8b0000,
7248           darksalmon: 0xe9967a,
7249           darkseagreen: 0x8fbc8f,
7250           darkslateblue: 0x483d8b,
7251           darkslategray: 0x2f4f4f,
7252           darkslategrey: 0x2f4f4f,
7253           darkturquoise: 0x00ced1,
7254           darkviolet: 0x9400d3,
7255           deeppink: 0xff1493,
7256           deepskyblue: 0x00bfff,
7257           dimgray: 0x696969,
7258           dimgrey: 0x696969,
7259           dodgerblue: 0x1e90ff,
7260           firebrick: 0xb22222,
7261           floralwhite: 0xfffaf0,
7262           forestgreen: 0x228b22,
7263           fuchsia: 0xff00ff,
7264           gainsboro: 0xdcdcdc,
7265           ghostwhite: 0xf8f8ff,
7266           gold: 0xffd700,
7267           goldenrod: 0xdaa520,
7268           gray: 0x808080,
7269           green: 0x008000,
7270           greenyellow: 0xadff2f,
7271           grey: 0x808080,
7272           honeydew: 0xf0fff0,
7273           hotpink: 0xff69b4,
7274           indianred: 0xcd5c5c,
7275           indigo: 0x4b0082,
7276           ivory: 0xfffff0,
7277           khaki: 0xf0e68c,
7278           lavender: 0xe6e6fa,
7279           lavenderblush: 0xfff0f5,
7280           lawngreen: 0x7cfc00,
7281           lemonchiffon: 0xfffacd,
7282           lightblue: 0xadd8e6,
7283           lightcoral: 0xf08080,
7284           lightcyan: 0xe0ffff,
7285           lightgoldenrodyellow: 0xfafad2,
7286           lightgray: 0xd3d3d3,
7287           lightgreen: 0x90ee90,
7288           lightgrey: 0xd3d3d3,
7289           lightpink: 0xffb6c1,
7290           lightsalmon: 0xffa07a,
7291           lightseagreen: 0x20b2aa,
7292           lightskyblue: 0x87cefa,
7293           lightslategray: 0x778899,
7294           lightslategrey: 0x778899,
7295           lightsteelblue: 0xb0c4de,
7296           lightyellow: 0xffffe0,
7297           lime: 0x00ff00,
7298           limegreen: 0x32cd32,
7299           linen: 0xfaf0e6,
7300           magenta: 0xff00ff,
7301           maroon: 0x800000,
7302           mediumaquamarine: 0x66cdaa,
7303           mediumblue: 0x0000cd,
7304           mediumorchid: 0xba55d3,
7305           mediumpurple: 0x9370db,
7306           mediumseagreen: 0x3cb371,
7307           mediumslateblue: 0x7b68ee,
7308           mediumspringgreen: 0x00fa9a,
7309           mediumturquoise: 0x48d1cc,
7310           mediumvioletred: 0xc71585,
7311           midnightblue: 0x191970,
7312           mintcream: 0xf5fffa,
7313           mistyrose: 0xffe4e1,
7314           moccasin: 0xffe4b5,
7315           navajowhite: 0xffdead,
7316           navy: 0x000080,
7317           oldlace: 0xfdf5e6,
7318           olive: 0x808000,
7319           olivedrab: 0x6b8e23,
7320           orange: 0xffa500,
7321           orangered: 0xff4500,
7322           orchid: 0xda70d6,
7323           palegoldenrod: 0xeee8aa,
7324           palegreen: 0x98fb98,
7325           paleturquoise: 0xafeeee,
7326           palevioletred: 0xdb7093,
7327           papayawhip: 0xffefd5,
7328           peachpuff: 0xffdab9,
7329           peru: 0xcd853f,
7330           pink: 0xffc0cb,
7331           plum: 0xdda0dd,
7332           powderblue: 0xb0e0e6,
7333           purple: 0x800080,
7334           rebeccapurple: 0x663399,
7335           red: 0xff0000,
7336           rosybrown: 0xbc8f8f,
7337           royalblue: 0x4169e1,
7338           saddlebrown: 0x8b4513,
7339           salmon: 0xfa8072,
7340           sandybrown: 0xf4a460,
7341           seagreen: 0x2e8b57,
7342           seashell: 0xfff5ee,
7343           sienna: 0xa0522d,
7344           silver: 0xc0c0c0,
7345           skyblue: 0x87ceeb,
7346           slateblue: 0x6a5acd,
7347           slategray: 0x708090,
7348           slategrey: 0x708090,
7349           snow: 0xfffafa,
7350           springgreen: 0x00ff7f,
7351           steelblue: 0x4682b4,
7352           tan: 0xd2b48c,
7353           teal: 0x008080,
7354           thistle: 0xd8bfd8,
7355           tomato: 0xff6347,
7356           turquoise: 0x40e0d0,
7357           violet: 0xee82ee,
7358           wheat: 0xf5deb3,
7359           white: 0xffffff,
7360           whitesmoke: 0xf5f5f5,
7361           yellow: 0xffff00,
7362           yellowgreen: 0x9acd32
7363         };
7364
7365         define$1(Color, color, {
7366           displayable: function() {
7367             return this.rgb().displayable();
7368           },
7369           hex: function() {
7370             return this.rgb().hex();
7371           },
7372           toString: function() {
7373             return this.rgb() + "";
7374           }
7375         });
7376
7377         function color(format) {
7378           var m;
7379           format = (format + "").trim().toLowerCase();
7380           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
7381               : (m = reHex6.exec(format)) ? rgbn(parseInt(m[1], 16)) // #ff0000
7382               : (m = reRgbInteger.exec(format)) ? new Rgb(m[1], m[2], m[3], 1) // rgb(255, 0, 0)
7383               : (m = reRgbPercent.exec(format)) ? new Rgb(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, 1) // rgb(100%, 0%, 0%)
7384               : (m = reRgbaInteger.exec(format)) ? rgba(m[1], m[2], m[3], m[4]) // rgba(255, 0, 0, 1)
7385               : (m = reRgbaPercent.exec(format)) ? rgba(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, m[4]) // rgb(100%, 0%, 0%, 1)
7386               : (m = reHslPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, 1) // hsl(120, 50%, 50%)
7387               : (m = reHslaPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, m[4]) // hsla(120, 50%, 50%, 1)
7388               : named.hasOwnProperty(format) ? rgbn(named[format])
7389               : format === "transparent" ? new Rgb(NaN, NaN, NaN, 0)
7390               : null;
7391         }
7392
7393         function rgbn(n) {
7394           return new Rgb(n >> 16 & 0xff, n >> 8 & 0xff, n & 0xff, 1);
7395         }
7396
7397         function rgba(r, g, b, a) {
7398           if (a <= 0) r = g = b = NaN;
7399           return new Rgb(r, g, b, a);
7400         }
7401
7402         function rgbConvert(o) {
7403           if (!(o instanceof Color)) o = color(o);
7404           if (!o) return new Rgb;
7405           o = o.rgb();
7406           return new Rgb(o.r, o.g, o.b, o.opacity);
7407         }
7408
7409         function rgb(r, g, b, opacity) {
7410           return arguments.length === 1 ? rgbConvert(r) : new Rgb(r, g, b, opacity == null ? 1 : opacity);
7411         }
7412
7413         function Rgb(r, g, b, opacity) {
7414           this.r = +r;
7415           this.g = +g;
7416           this.b = +b;
7417           this.opacity = +opacity;
7418         }
7419
7420         define$1(Rgb, rgb, extend(Color, {
7421           brighter: function(k) {
7422             k = k == null ? brighter : Math.pow(brighter, k);
7423             return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);
7424           },
7425           darker: function(k) {
7426             k = k == null ? darker : Math.pow(darker, k);
7427             return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);
7428           },
7429           rgb: function() {
7430             return this;
7431           },
7432           displayable: function() {
7433             return (0 <= this.r && this.r <= 255)
7434                 && (0 <= this.g && this.g <= 255)
7435                 && (0 <= this.b && this.b <= 255)
7436                 && (0 <= this.opacity && this.opacity <= 1);
7437           },
7438           hex: function() {
7439             return "#" + hex$1(this.r) + hex$1(this.g) + hex$1(this.b);
7440           },
7441           toString: function() {
7442             var a = this.opacity; a = isNaN(a) ? 1 : Math.max(0, Math.min(1, a));
7443             return (a === 1 ? "rgb(" : "rgba(")
7444                 + Math.max(0, Math.min(255, Math.round(this.r) || 0)) + ", "
7445                 + Math.max(0, Math.min(255, Math.round(this.g) || 0)) + ", "
7446                 + Math.max(0, Math.min(255, Math.round(this.b) || 0))
7447                 + (a === 1 ? ")" : ", " + a + ")");
7448           }
7449         }));
7450
7451         function hex$1(value) {
7452           value = Math.max(0, Math.min(255, Math.round(value) || 0));
7453           return (value < 16 ? "0" : "") + value.toString(16);
7454         }
7455
7456         function hsla(h, s, l, a) {
7457           if (a <= 0) h = s = l = NaN;
7458           else if (l <= 0 || l >= 1) h = s = NaN;
7459           else if (s <= 0) h = NaN;
7460           return new Hsl(h, s, l, a);
7461         }
7462
7463         function hslConvert(o) {
7464           if (o instanceof Hsl) return new Hsl(o.h, o.s, o.l, o.opacity);
7465           if (!(o instanceof Color)) o = color(o);
7466           if (!o) return new Hsl;
7467           if (o instanceof Hsl) return o;
7468           o = o.rgb();
7469           var r = o.r / 255,
7470               g = o.g / 255,
7471               b = o.b / 255,
7472               min = Math.min(r, g, b),
7473               max = Math.max(r, g, b),
7474               h = NaN,
7475               s = max - min,
7476               l = (max + min) / 2;
7477           if (s) {
7478             if (r === max) h = (g - b) / s + (g < b) * 6;
7479             else if (g === max) h = (b - r) / s + 2;
7480             else h = (r - g) / s + 4;
7481             s /= l < 0.5 ? max + min : 2 - max - min;
7482             h *= 60;
7483           } else {
7484             s = l > 0 && l < 1 ? 0 : h;
7485           }
7486           return new Hsl(h, s, l, o.opacity);
7487         }
7488
7489         function hsl(h, s, l, opacity) {
7490           return arguments.length === 1 ? hslConvert(h) : new Hsl(h, s, l, opacity == null ? 1 : opacity);
7491         }
7492
7493         function Hsl(h, s, l, opacity) {
7494           this.h = +h;
7495           this.s = +s;
7496           this.l = +l;
7497           this.opacity = +opacity;
7498         }
7499
7500         define$1(Hsl, hsl, extend(Color, {
7501           brighter: function(k) {
7502             k = k == null ? brighter : Math.pow(brighter, k);
7503             return new Hsl(this.h, this.s, this.l * k, this.opacity);
7504           },
7505           darker: function(k) {
7506             k = k == null ? darker : Math.pow(darker, k);
7507             return new Hsl(this.h, this.s, this.l * k, this.opacity);
7508           },
7509           rgb: function() {
7510             var h = this.h % 360 + (this.h < 0) * 360,
7511                 s = isNaN(h) || isNaN(this.s) ? 0 : this.s,
7512                 l = this.l,
7513                 m2 = l + (l < 0.5 ? l : 1 - l) * s,
7514                 m1 = 2 * l - m2;
7515             return new Rgb(
7516               hsl2rgb(h >= 240 ? h - 240 : h + 120, m1, m2),
7517               hsl2rgb(h, m1, m2),
7518               hsl2rgb(h < 120 ? h + 240 : h - 120, m1, m2),
7519               this.opacity
7520             );
7521           },
7522           displayable: function() {
7523             return (0 <= this.s && this.s <= 1 || isNaN(this.s))
7524                 && (0 <= this.l && this.l <= 1)
7525                 && (0 <= this.opacity && this.opacity <= 1);
7526           }
7527         }));
7528
7529         /* From FvD 13.37, CSS Color Module Level 3 */
7530         function hsl2rgb(h, m1, m2) {
7531           return (h < 60 ? m1 + (m2 - m1) * h / 60
7532               : h < 180 ? m2
7533               : h < 240 ? m1 + (m2 - m1) * (240 - h) / 60
7534               : m1) * 255;
7535         }
7536
7537         var deg2rad = Math.PI / 180;
7538         var rad2deg = 180 / Math.PI;
7539
7540         // https://beta.observablehq.com/@mbostock/lab-and-rgb
7541         var K = 18,
7542             Xn = 0.96422,
7543             Yn = 1,
7544             Zn = 0.82521,
7545             t0 = 4 / 29,
7546             t1 = 6 / 29,
7547             t2 = 3 * t1 * t1,
7548             t3 = t1 * t1 * t1;
7549
7550         function labConvert(o) {
7551           if (o instanceof Lab) return new Lab(o.l, o.a, o.b, o.opacity);
7552           if (o instanceof Hcl) {
7553             if (isNaN(o.h)) return new Lab(o.l, 0, 0, o.opacity);
7554             var h = o.h * deg2rad;
7555             return new Lab(o.l, Math.cos(h) * o.c, Math.sin(h) * o.c, o.opacity);
7556           }
7557           if (!(o instanceof Rgb)) o = rgbConvert(o);
7558           var r = rgb2lrgb(o.r),
7559               g = rgb2lrgb(o.g),
7560               b = rgb2lrgb(o.b),
7561               y = xyz2lab((0.2225045 * r + 0.7168786 * g + 0.0606169 * b) / Yn), x, z;
7562           if (r === g && g === b) x = z = y; else {
7563             x = xyz2lab((0.4360747 * r + 0.3850649 * g + 0.1430804 * b) / Xn);
7564             z = xyz2lab((0.0139322 * r + 0.0971045 * g + 0.7141733 * b) / Zn);
7565           }
7566           return new Lab(116 * y - 16, 500 * (x - y), 200 * (y - z), o.opacity);
7567         }
7568
7569         function gray(l, opacity) {
7570           return new Lab(l, 0, 0, opacity == null ? 1 : opacity);
7571         }
7572
7573         function lab(l, a, b, opacity) {
7574           return arguments.length === 1 ? labConvert(l) : new Lab(l, a, b, opacity == null ? 1 : opacity);
7575         }
7576
7577         function Lab(l, a, b, opacity) {
7578           this.l = +l;
7579           this.a = +a;
7580           this.b = +b;
7581           this.opacity = +opacity;
7582         }
7583
7584         define$1(Lab, lab, extend(Color, {
7585           brighter: function(k) {
7586             return new Lab(this.l + K * (k == null ? 1 : k), this.a, this.b, this.opacity);
7587           },
7588           darker: function(k) {
7589             return new Lab(this.l - K * (k == null ? 1 : k), this.a, this.b, this.opacity);
7590           },
7591           rgb: function() {
7592             var y = (this.l + 16) / 116,
7593                 x = isNaN(this.a) ? y : y + this.a / 500,
7594                 z = isNaN(this.b) ? y : y - this.b / 200;
7595             x = Xn * lab2xyz(x);
7596             y = Yn * lab2xyz(y);
7597             z = Zn * lab2xyz(z);
7598             return new Rgb(
7599               lrgb2rgb( 3.1338561 * x - 1.6168667 * y - 0.4906146 * z),
7600               lrgb2rgb(-0.9787684 * x + 1.9161415 * y + 0.0334540 * z),
7601               lrgb2rgb( 0.0719453 * x - 0.2289914 * y + 1.4052427 * z),
7602               this.opacity
7603             );
7604           }
7605         }));
7606
7607         function xyz2lab(t) {
7608           return t > t3 ? Math.pow(t, 1 / 3) : t / t2 + t0;
7609         }
7610
7611         function lab2xyz(t) {
7612           return t > t1 ? t * t * t : t2 * (t - t0);
7613         }
7614
7615         function lrgb2rgb(x) {
7616           return 255 * (x <= 0.0031308 ? 12.92 * x : 1.055 * Math.pow(x, 1 / 2.4) - 0.055);
7617         }
7618
7619         function rgb2lrgb(x) {
7620           return (x /= 255) <= 0.04045 ? x / 12.92 : Math.pow((x + 0.055) / 1.055, 2.4);
7621         }
7622
7623         function hclConvert(o) {
7624           if (o instanceof Hcl) return new Hcl(o.h, o.c, o.l, o.opacity);
7625           if (!(o instanceof Lab)) o = labConvert(o);
7626           if (o.a === 0 && o.b === 0) return new Hcl(NaN, 0, o.l, o.opacity);
7627           var h = Math.atan2(o.b, o.a) * rad2deg;
7628           return new Hcl(h < 0 ? h + 360 : h, Math.sqrt(o.a * o.a + o.b * o.b), o.l, o.opacity);
7629         }
7630
7631         function lch(l, c, h, opacity) {
7632           return arguments.length === 1 ? hclConvert(l) : new Hcl(h, c, l, opacity == null ? 1 : opacity);
7633         }
7634
7635         function hcl(h, c, l, opacity) {
7636           return arguments.length === 1 ? hclConvert(h) : new Hcl(h, c, l, opacity == null ? 1 : opacity);
7637         }
7638
7639         function Hcl(h, c, l, opacity) {
7640           this.h = +h;
7641           this.c = +c;
7642           this.l = +l;
7643           this.opacity = +opacity;
7644         }
7645
7646         define$1(Hcl, hcl, extend(Color, {
7647           brighter: function(k) {
7648             return new Hcl(this.h, this.c, this.l + K * (k == null ? 1 : k), this.opacity);
7649           },
7650           darker: function(k) {
7651             return new Hcl(this.h, this.c, this.l - K * (k == null ? 1 : k), this.opacity);
7652           },
7653           rgb: function() {
7654             return labConvert(this).rgb();
7655           }
7656         }));
7657
7658         var A = -0.14861,
7659             B = +1.78277,
7660             C = -0.29227,
7661             D = -0.90649,
7662             E = +1.97294,
7663             ED = E * D,
7664             EB = E * B,
7665             BC_DA = B * C - D * A;
7666
7667         function cubehelixConvert(o) {
7668           if (o instanceof Cubehelix) return new Cubehelix(o.h, o.s, o.l, o.opacity);
7669           if (!(o instanceof Rgb)) o = rgbConvert(o);
7670           var r = o.r / 255,
7671               g = o.g / 255,
7672               b = o.b / 255,
7673               l = (BC_DA * b + ED * r - EB * g) / (BC_DA + ED - EB),
7674               bl = b - l,
7675               k = (E * (g - l) - C * bl) / D,
7676               s = Math.sqrt(k * k + bl * bl) / (E * l * (1 - l)), // NaN if l=0 or l=1
7677               h = s ? Math.atan2(k, bl) * rad2deg - 120 : NaN;
7678           return new Cubehelix(h < 0 ? h + 360 : h, s, l, o.opacity);
7679         }
7680
7681         function cubehelix(h, s, l, opacity) {
7682           return arguments.length === 1 ? cubehelixConvert(h) : new Cubehelix(h, s, l, opacity == null ? 1 : opacity);
7683         }
7684
7685         function Cubehelix(h, s, l, opacity) {
7686           this.h = +h;
7687           this.s = +s;
7688           this.l = +l;
7689           this.opacity = +opacity;
7690         }
7691
7692         define$1(Cubehelix, cubehelix, extend(Color, {
7693           brighter: function(k) {
7694             k = k == null ? brighter : Math.pow(brighter, k);
7695             return new Cubehelix(this.h, this.s, this.l * k, this.opacity);
7696           },
7697           darker: function(k) {
7698             k = k == null ? darker : Math.pow(darker, k);
7699             return new Cubehelix(this.h, this.s, this.l * k, this.opacity);
7700           },
7701           rgb: function() {
7702             var h = isNaN(this.h) ? 0 : (this.h + 120) * deg2rad,
7703                 l = +this.l,
7704                 a = isNaN(this.s) ? 0 : this.s * l * (1 - l),
7705                 cosh = Math.cos(h),
7706                 sinh = Math.sin(h);
7707             return new Rgb(
7708               255 * (l + a * (A * cosh + B * sinh)),
7709               255 * (l + a * (C * cosh + D * sinh)),
7710               255 * (l + a * (E * cosh)),
7711               this.opacity
7712             );
7713           }
7714         }));
7715
7716         function basis(t1, v0, v1, v2, v3) {
7717           var t2 = t1 * t1, t3 = t2 * t1;
7718           return ((1 - 3 * t1 + 3 * t2 - t3) * v0
7719               + (4 - 6 * t2 + 3 * t3) * v1
7720               + (1 + 3 * t1 + 3 * t2 - 3 * t3) * v2
7721               + t3 * v3) / 6;
7722         }
7723
7724         function basis$1(values) {
7725           var n = values.length - 1;
7726           return function(t) {
7727             var i = t <= 0 ? (t = 0) : t >= 1 ? (t = 1, n - 1) : Math.floor(t * n),
7728                 v1 = values[i],
7729                 v2 = values[i + 1],
7730                 v0 = i > 0 ? values[i - 1] : 2 * v1 - v2,
7731                 v3 = i < n - 1 ? values[i + 2] : 2 * v2 - v1;
7732             return basis((t - i / n) * n, v0, v1, v2, v3);
7733           };
7734         }
7735
7736         function basisClosed(values) {
7737           var n = values.length;
7738           return function(t) {
7739             var i = Math.floor(((t %= 1) < 0 ? ++t : t) * n),
7740                 v0 = values[(i + n - 1) % n],
7741                 v1 = values[i % n],
7742                 v2 = values[(i + 1) % n],
7743                 v3 = values[(i + 2) % n];
7744             return basis((t - i / n) * n, v0, v1, v2, v3);
7745           };
7746         }
7747
7748         function constant$3(x) {
7749           return function() {
7750             return x;
7751           };
7752         }
7753
7754         function linear(a, d) {
7755           return function(t) {
7756             return a + t * d;
7757           };
7758         }
7759
7760         function exponential(a, b, y) {
7761           return a = Math.pow(a, y), b = Math.pow(b, y) - a, y = 1 / y, function(t) {
7762             return Math.pow(a + t * b, y);
7763           };
7764         }
7765
7766         function hue(a, b) {
7767           var d = b - a;
7768           return d ? linear(a, d > 180 || d < -180 ? d - 360 * Math.round(d / 360) : d) : constant$3(isNaN(a) ? b : a);
7769         }
7770
7771         function gamma(y) {
7772           return (y = +y) === 1 ? nogamma : function(a, b) {
7773             return b - a ? exponential(a, b, y) : constant$3(isNaN(a) ? b : a);
7774           };
7775         }
7776
7777         function nogamma(a, b) {
7778           var d = b - a;
7779           return d ? linear(a, d) : constant$3(isNaN(a) ? b : a);
7780         }
7781
7782         var d3_interpolateRgb = (function rgbGamma(y) {
7783           var color = gamma(y);
7784
7785           function rgb$1(start, end) {
7786             var r = color((start = rgb(start)).r, (end = rgb(end)).r),
7787                 g = color(start.g, end.g),
7788                 b = color(start.b, end.b),
7789                 opacity = nogamma(start.opacity, end.opacity);
7790             return function(t) {
7791               start.r = r(t);
7792               start.g = g(t);
7793               start.b = b(t);
7794               start.opacity = opacity(t);
7795               return start + "";
7796             };
7797           }
7798
7799           rgb$1.gamma = rgbGamma;
7800
7801           return rgb$1;
7802         })(1);
7803
7804         function rgbSpline(spline) {
7805           return function(colors) {
7806             var n = colors.length,
7807                 r = new Array(n),
7808                 g = new Array(n),
7809                 b = new Array(n),
7810                 i, color;
7811             for (i = 0; i < n; ++i) {
7812               color = rgb(colors[i]);
7813               r[i] = color.r || 0;
7814               g[i] = color.g || 0;
7815               b[i] = color.b || 0;
7816             }
7817             r = spline(r);
7818             g = spline(g);
7819             b = spline(b);
7820             color.opacity = 1;
7821             return function(t) {
7822               color.r = r(t);
7823               color.g = g(t);
7824               color.b = b(t);
7825               return color + "";
7826             };
7827           };
7828         }
7829
7830         var rgbBasis = rgbSpline(basis$1);
7831         var rgbBasisClosed = rgbSpline(basisClosed);
7832
7833         function array$2(a, b) {
7834           var nb = b ? b.length : 0,
7835               na = a ? Math.min(nb, a.length) : 0,
7836               x = new Array(na),
7837               c = new Array(nb),
7838               i;
7839
7840           for (i = 0; i < na; ++i) x[i] = d3_interpolate(a[i], b[i]);
7841           for (; i < nb; ++i) c[i] = b[i];
7842
7843           return function(t) {
7844             for (i = 0; i < na; ++i) c[i] = x[i](t);
7845             return c;
7846           };
7847         }
7848
7849         function date(a, b) {
7850           var d = new Date;
7851           return a = +a, b -= a, function(t) {
7852             return d.setTime(a + b * t), d;
7853           };
7854         }
7855
7856         function d3_interpolateNumber(a, b) {
7857           return a = +a, b -= a, function(t) {
7858             return a + b * t;
7859           };
7860         }
7861
7862         function object(a, b) {
7863           var i = {},
7864               c = {},
7865               k;
7866
7867           if (a === null || typeof a !== "object") a = {};
7868           if (b === null || typeof b !== "object") b = {};
7869
7870           for (k in b) {
7871             if (k in a) {
7872               i[k] = d3_interpolate(a[k], b[k]);
7873             } else {
7874               c[k] = b[k];
7875             }
7876           }
7877
7878           return function(t) {
7879             for (k in i) c[k] = i[k](t);
7880             return c;
7881           };
7882         }
7883
7884         var reA = /[-+]?(?:\d+\.?\d*|\.?\d+)(?:[eE][-+]?\d+)?/g,
7885             reB = new RegExp(reA.source, "g");
7886
7887         function zero(b) {
7888           return function() {
7889             return b;
7890           };
7891         }
7892
7893         function one(b) {
7894           return function(t) {
7895             return b(t) + "";
7896           };
7897         }
7898
7899         function interpolateString(a, b) {
7900           var bi = reA.lastIndex = reB.lastIndex = 0, // scan index for next number in b
7901               am, // current match in a
7902               bm, // current match in b
7903               bs, // string preceding current number in b, if any
7904               i = -1, // index in s
7905               s = [], // string constants and placeholders
7906               q = []; // number interpolators
7907
7908           // Coerce inputs to strings.
7909           a = a + "", b = b + "";
7910
7911           // Interpolate pairs of numbers in a & b.
7912           while ((am = reA.exec(a))
7913               && (bm = reB.exec(b))) {
7914             if ((bs = bm.index) > bi) { // a string precedes the next number in b
7915               bs = b.slice(bi, bs);
7916               if (s[i]) s[i] += bs; // coalesce with previous string
7917               else s[++i] = bs;
7918             }
7919             if ((am = am[0]) === (bm = bm[0])) { // numbers in a & b match
7920               if (s[i]) s[i] += bm; // coalesce with previous string
7921               else s[++i] = bm;
7922             } else { // interpolate non-matching numbers
7923               s[++i] = null;
7924               q.push({i: i, x: d3_interpolateNumber(am, bm)});
7925             }
7926             bi = reB.lastIndex;
7927           }
7928
7929           // Add remains of b.
7930           if (bi < b.length) {
7931             bs = b.slice(bi);
7932             if (s[i]) s[i] += bs; // coalesce with previous string
7933             else s[++i] = bs;
7934           }
7935
7936           // Special optimization for only a single match.
7937           // Otherwise, interpolate each of the numbers and rejoin the string.
7938           return s.length < 2 ? (q[0]
7939               ? one(q[0].x)
7940               : zero(b))
7941               : (b = q.length, function(t) {
7942                   for (var i = 0, o; i < b; ++i) s[(o = q[i]).i] = o.x(t);
7943                   return s.join("");
7944                 });
7945         }
7946
7947         function d3_interpolate(a, b) {
7948           var t = typeof b, c;
7949           return b == null || t === "boolean" ? constant$3(b)
7950               : (t === "number" ? d3_interpolateNumber
7951               : t === "string" ? ((c = color(b)) ? (b = c, d3_interpolateRgb) : interpolateString)
7952               : b instanceof color ? d3_interpolateRgb
7953               : b instanceof Date ? date
7954               : Array.isArray(b) ? array$2
7955               : typeof b.valueOf !== "function" && typeof b.toString !== "function" || isNaN(b) ? object
7956               : d3_interpolateNumber)(a, b);
7957         }
7958
7959         function discrete(range) {
7960           var n = range.length;
7961           return function(t) {
7962             return range[Math.max(0, Math.min(n - 1, Math.floor(t * n)))];
7963           };
7964         }
7965
7966         function hue$1(a, b) {
7967           var i = hue(+a, +b);
7968           return function(t) {
7969             var x = i(t);
7970             return x - 360 * Math.floor(x / 360);
7971           };
7972         }
7973
7974         function interpolateRound(a, b) {
7975           return a = +a, b -= a, function(t) {
7976             return Math.round(a + b * t);
7977           };
7978         }
7979
7980         var degrees = 180 / Math.PI;
7981
7982         var identity$2 = {
7983           translateX: 0,
7984           translateY: 0,
7985           rotate: 0,
7986           skewX: 0,
7987           scaleX: 1,
7988           scaleY: 1
7989         };
7990
7991         function decompose(a, b, c, d, e, f) {
7992           var scaleX, scaleY, skewX;
7993           if (scaleX = Math.sqrt(a * a + b * b)) a /= scaleX, b /= scaleX;
7994           if (skewX = a * c + b * d) c -= a * skewX, d -= b * skewX;
7995           if (scaleY = Math.sqrt(c * c + d * d)) c /= scaleY, d /= scaleY, skewX /= scaleY;
7996           if (a * d < b * c) a = -a, b = -b, skewX = -skewX, scaleX = -scaleX;
7997           return {
7998             translateX: e,
7999             translateY: f,
8000             rotate: Math.atan2(b, a) * degrees,
8001             skewX: Math.atan(skewX) * degrees,
8002             scaleX: scaleX,
8003             scaleY: scaleY
8004           };
8005         }
8006
8007         var cssNode,
8008             cssRoot,
8009             cssView,
8010             svgNode;
8011
8012         function parseCss(value) {
8013           if (value === "none") return identity$2;
8014           if (!cssNode) cssNode = document.createElement("DIV"), cssRoot = document.documentElement, cssView = document.defaultView;
8015           cssNode.style.transform = value;
8016           value = cssView.getComputedStyle(cssRoot.appendChild(cssNode), null).getPropertyValue("transform");
8017           cssRoot.removeChild(cssNode);
8018           value = value.slice(7, -1).split(",");
8019           return decompose(+value[0], +value[1], +value[2], +value[3], +value[4], +value[5]);
8020         }
8021
8022         function parseSvg(value) {
8023           if (value == null) return identity$2;
8024           if (!svgNode) svgNode = document.createElementNS("http://www.w3.org/2000/svg", "g");
8025           svgNode.setAttribute("transform", value);
8026           if (!(value = svgNode.transform.baseVal.consolidate())) return identity$2;
8027           value = value.matrix;
8028           return decompose(value.a, value.b, value.c, value.d, value.e, value.f);
8029         }
8030
8031         function interpolateTransform(parse, pxComma, pxParen, degParen) {
8032
8033           function pop(s) {
8034             return s.length ? s.pop() + " " : "";
8035           }
8036
8037           function translate(xa, ya, xb, yb, s, q) {
8038             if (xa !== xb || ya !== yb) {
8039               var i = s.push("translate(", null, pxComma, null, pxParen);
8040               q.push({i: i - 4, x: d3_interpolateNumber(xa, xb)}, {i: i - 2, x: d3_interpolateNumber(ya, yb)});
8041             } else if (xb || yb) {
8042               s.push("translate(" + xb + pxComma + yb + pxParen);
8043             }
8044           }
8045
8046           function rotate(a, b, s, q) {
8047             if (a !== b) {
8048               if (a - b > 180) b += 360; else if (b - a > 180) a += 360; // shortest path
8049               q.push({i: s.push(pop(s) + "rotate(", null, degParen) - 2, x: d3_interpolateNumber(a, b)});
8050             } else if (b) {
8051               s.push(pop(s) + "rotate(" + b + degParen);
8052             }
8053           }
8054
8055           function skewX(a, b, s, q) {
8056             if (a !== b) {
8057               q.push({i: s.push(pop(s) + "skewX(", null, degParen) - 2, x: d3_interpolateNumber(a, b)});
8058             } else if (b) {
8059               s.push(pop(s) + "skewX(" + b + degParen);
8060             }
8061           }
8062
8063           function scale(xa, ya, xb, yb, s, q) {
8064             if (xa !== xb || ya !== yb) {
8065               var i = s.push(pop(s) + "scale(", null, ",", null, ")");
8066               q.push({i: i - 4, x: d3_interpolateNumber(xa, xb)}, {i: i - 2, x: d3_interpolateNumber(ya, yb)});
8067             } else if (xb !== 1 || yb !== 1) {
8068               s.push(pop(s) + "scale(" + xb + "," + yb + ")");
8069             }
8070           }
8071
8072           return function(a, b) {
8073             var s = [], // string constants and placeholders
8074                 q = []; // number interpolators
8075             a = parse(a), b = parse(b);
8076             translate(a.translateX, a.translateY, b.translateX, b.translateY, s, q);
8077             rotate(a.rotate, b.rotate, s, q);
8078             skewX(a.skewX, b.skewX, s, q);
8079             scale(a.scaleX, a.scaleY, b.scaleX, b.scaleY, s, q);
8080             a = b = null; // gc
8081             return function(t) {
8082               var i = -1, n = q.length, o;
8083               while (++i < n) s[(o = q[i]).i] = o.x(t);
8084               return s.join("");
8085             };
8086           };
8087         }
8088
8089         var interpolateTransformCss = interpolateTransform(parseCss, "px, ", "px)", "deg)");
8090         var interpolateTransformSvg = interpolateTransform(parseSvg, ", ", ")", ")");
8091
8092         var rho = Math.SQRT2,
8093             rho2 = 2,
8094             rho4 = 4,
8095             epsilon2 = 1e-12;
8096
8097         function cosh(x) {
8098           return ((x = Math.exp(x)) + 1 / x) / 2;
8099         }
8100
8101         function sinh(x) {
8102           return ((x = Math.exp(x)) - 1 / x) / 2;
8103         }
8104
8105         function tanh(x) {
8106           return ((x = Math.exp(2 * x)) - 1) / (x + 1);
8107         }
8108
8109         // p0 = [ux0, uy0, w0]
8110         // p1 = [ux1, uy1, w1]
8111         function interpolateZoom(p0, p1) {
8112           var ux0 = p0[0], uy0 = p0[1], w0 = p0[2],
8113               ux1 = p1[0], uy1 = p1[1], w1 = p1[2],
8114               dx = ux1 - ux0,
8115               dy = uy1 - uy0,
8116               d2 = dx * dx + dy * dy,
8117               i,
8118               S;
8119
8120           // Special case for u0 ≅ u1.
8121           if (d2 < epsilon2) {
8122             S = Math.log(w1 / w0) / rho;
8123             i = function(t) {
8124               return [
8125                 ux0 + t * dx,
8126                 uy0 + t * dy,
8127                 w0 * Math.exp(rho * t * S)
8128               ];
8129             };
8130           }
8131
8132           // General case.
8133           else {
8134             var d1 = Math.sqrt(d2),
8135                 b0 = (w1 * w1 - w0 * w0 + rho4 * d2) / (2 * w0 * rho2 * d1),
8136                 b1 = (w1 * w1 - w0 * w0 - rho4 * d2) / (2 * w1 * rho2 * d1),
8137                 r0 = Math.log(Math.sqrt(b0 * b0 + 1) - b0),
8138                 r1 = Math.log(Math.sqrt(b1 * b1 + 1) - b1);
8139             S = (r1 - r0) / rho;
8140             i = function(t) {
8141               var s = t * S,
8142                   coshr0 = cosh(r0),
8143                   u = w0 / (rho2 * d1) * (coshr0 * tanh(rho * s + r0) - sinh(r0));
8144               return [
8145                 ux0 + u * dx,
8146                 uy0 + u * dy,
8147                 w0 * coshr0 / cosh(rho * s + r0)
8148               ];
8149             };
8150           }
8151
8152           i.duration = S * 1000;
8153
8154           return i;
8155         }
8156
8157         function hsl$1(hue) {
8158           return function(start, end) {
8159             var h = hue((start = hsl(start)).h, (end = hsl(end)).h),
8160                 s = nogamma(start.s, end.s),
8161                 l = nogamma(start.l, end.l),
8162                 opacity = nogamma(start.opacity, end.opacity);
8163             return function(t) {
8164               start.h = h(t);
8165               start.s = s(t);
8166               start.l = l(t);
8167               start.opacity = opacity(t);
8168               return start + "";
8169             };
8170           }
8171         }
8172
8173         var hsl$2 = hsl$1(hue);
8174         var hslLong = hsl$1(nogamma);
8175
8176         function lab$1(start, end) {
8177           var l = nogamma((start = lab(start)).l, (end = lab(end)).l),
8178               a = nogamma(start.a, end.a),
8179               b = nogamma(start.b, end.b),
8180               opacity = nogamma(start.opacity, end.opacity);
8181           return function(t) {
8182             start.l = l(t);
8183             start.a = a(t);
8184             start.b = b(t);
8185             start.opacity = opacity(t);
8186             return start + "";
8187           };
8188         }
8189
8190         function hcl$1(hue) {
8191           return function(start, end) {
8192             var h = hue((start = hcl(start)).h, (end = hcl(end)).h),
8193                 c = nogamma(start.c, end.c),
8194                 l = nogamma(start.l, end.l),
8195                 opacity = nogamma(start.opacity, end.opacity);
8196             return function(t) {
8197               start.h = h(t);
8198               start.c = c(t);
8199               start.l = l(t);
8200               start.opacity = opacity(t);
8201               return start + "";
8202             };
8203           }
8204         }
8205
8206         var hcl$2 = hcl$1(hue);
8207         var hclLong = hcl$1(nogamma);
8208
8209         function cubehelix$1(hue) {
8210           return (function cubehelixGamma(y) {
8211             y = +y;
8212
8213             function cubehelix$1(start, end) {
8214               var h = hue((start = cubehelix(start)).h, (end = cubehelix(end)).h),
8215                   s = nogamma(start.s, end.s),
8216                   l = nogamma(start.l, end.l),
8217                   opacity = nogamma(start.opacity, end.opacity);
8218               return function(t) {
8219                 start.h = h(t);
8220                 start.s = s(t);
8221                 start.l = l(Math.pow(t, y));
8222                 start.opacity = opacity(t);
8223                 return start + "";
8224               };
8225             }
8226
8227             cubehelix$1.gamma = cubehelixGamma;
8228
8229             return cubehelix$1;
8230           })(1);
8231         }
8232
8233         var cubehelix$2 = cubehelix$1(hue);
8234         var cubehelixLong = cubehelix$1(nogamma);
8235
8236         function piecewise(interpolate, values) {
8237           var i = 0, n = values.length - 1, v = values[0], I = new Array(n < 0 ? 0 : n);
8238           while (i < n) I[i] = interpolate(v, v = values[++i]);
8239           return function(t) {
8240             var i = Math.max(0, Math.min(n - 1, Math.floor(t *= n)));
8241             return I[i](t - i);
8242           };
8243         }
8244
8245         function d3_quantize(interpolator, n) {
8246           var samples = new Array(n);
8247           for (var i = 0; i < n; ++i) samples[i] = interpolator(i / (n - 1));
8248           return samples;
8249         }
8250
8251         var frame = 0, // is an animation frame pending?
8252             timeout = 0, // is a timeout pending?
8253             interval = 0, // are any timers active?
8254             pokeDelay = 1000, // how frequently we check for clock skew
8255             taskHead,
8256             taskTail,
8257             clockLast = 0,
8258             clockNow = 0,
8259             clockSkew = 0,
8260             clock = typeof performance === "object" && performance.now ? performance : Date,
8261             setFrame = typeof window === "object" && window.requestAnimationFrame ? window.requestAnimationFrame.bind(window) : function(f) { setTimeout(f, 17); };
8262
8263         function now() {
8264           return clockNow || (setFrame(clearNow), clockNow = clock.now() + clockSkew);
8265         }
8266
8267         function clearNow() {
8268           clockNow = 0;
8269         }
8270
8271         function Timer() {
8272           this._call =
8273           this._time =
8274           this._next = null;
8275         }
8276
8277         Timer.prototype = timer.prototype = {
8278           constructor: Timer,
8279           restart: function(callback, delay, time) {
8280             if (typeof callback !== "function") throw new TypeError("callback is not a function");
8281             time = (time == null ? now() : +time) + (delay == null ? 0 : +delay);
8282             if (!this._next && taskTail !== this) {
8283               if (taskTail) taskTail._next = this;
8284               else taskHead = this;
8285               taskTail = this;
8286             }
8287             this._call = callback;
8288             this._time = time;
8289             sleep();
8290           },
8291           stop: function() {
8292             if (this._call) {
8293               this._call = null;
8294               this._time = Infinity;
8295               sleep();
8296             }
8297           }
8298         };
8299
8300         function timer(callback, delay, time) {
8301           var t = new Timer;
8302           t.restart(callback, delay, time);
8303           return t;
8304         }
8305
8306         function timerFlush() {
8307           now(); // Get the current time, if not already set.
8308           ++frame; // Pretend we’ve set an alarm, if we haven’t already.
8309           var t = taskHead, e;
8310           while (t) {
8311             if ((e = clockNow - t._time) >= 0) t._call.call(null, e);
8312             t = t._next;
8313           }
8314           --frame;
8315         }
8316
8317         function wake() {
8318           clockNow = (clockLast = clock.now()) + clockSkew;
8319           frame = timeout = 0;
8320           try {
8321             timerFlush();
8322           } finally {
8323             frame = 0;
8324             nap();
8325             clockNow = 0;
8326           }
8327         }
8328
8329         function poke() {
8330           var now = clock.now(), delay = now - clockLast;
8331           if (delay > pokeDelay) clockSkew -= delay, clockLast = now;
8332         }
8333
8334         function nap() {
8335           var t0, t1 = taskHead, t2, time = Infinity;
8336           while (t1) {
8337             if (t1._call) {
8338               if (time > t1._time) time = t1._time;
8339               t0 = t1, t1 = t1._next;
8340             } else {
8341               t2 = t1._next, t1._next = null;
8342               t1 = t0 ? t0._next = t2 : taskHead = t2;
8343             }
8344           }
8345           taskTail = t0;
8346           sleep(time);
8347         }
8348
8349         function sleep(time) {
8350           if (frame) return; // Soonest alarm already set, or will be.
8351           if (timeout) timeout = clearTimeout(timeout);
8352           var delay = time - clockNow; // Strictly less than if we recomputed clockNow.
8353           if (delay > 24) {
8354             if (time < Infinity) timeout = setTimeout(wake, time - clock.now() - clockSkew);
8355             if (interval) interval = clearInterval(interval);
8356           } else {
8357             if (!interval) clockLast = clock.now(), interval = setInterval(poke, pokeDelay);
8358             frame = 1, setFrame(wake);
8359           }
8360         }
8361
8362         function d3_timeout(callback, delay, time) {
8363           var t = new Timer;
8364           delay = delay == null ? 0 : +delay;
8365           t.restart(function(elapsed) {
8366             t.stop();
8367             callback(elapsed + delay);
8368           }, delay, time);
8369           return t;
8370         }
8371
8372         function interval$1(callback, delay, time) {
8373           var t = new Timer, total = delay;
8374           if (delay == null) return t.restart(callback, delay, time), t;
8375           delay = +delay, time = time == null ? now() : +time;
8376           t.restart(function tick(elapsed) {
8377             elapsed += total;
8378             t.restart(tick, total += delay, time);
8379             callback(elapsed);
8380           }, delay, time);
8381           return t;
8382         }
8383
8384         var emptyOn = dispatch("start", "end", "cancel", "interrupt");
8385         var emptyTween = [];
8386
8387         var CREATED = 0;
8388         var SCHEDULED = 1;
8389         var STARTING = 2;
8390         var STARTED = 3;
8391         var RUNNING = 4;
8392         var ENDING = 5;
8393         var ENDED = 6;
8394
8395         function schedule(node, name, id, index, group, timing) {
8396           var schedules = node.__transition;
8397           if (!schedules) node.__transition = {};
8398           else if (id in schedules) return;
8399           create$6(node, id, {
8400             name: name,
8401             index: index, // For context during callback.
8402             group: group, // For context during callback.
8403             on: emptyOn,
8404             tween: emptyTween,
8405             time: timing.time,
8406             delay: timing.delay,
8407             duration: timing.duration,
8408             ease: timing.ease,
8409             timer: null,
8410             state: CREATED
8411           });
8412         }
8413
8414         function init(node, id) {
8415           var schedule = get$2(node, id);
8416           if (schedule.state > CREATED) throw new Error("too late; already scheduled");
8417           return schedule;
8418         }
8419
8420         function set$1(node, id) {
8421           var schedule = get$2(node, id);
8422           if (schedule.state > STARTED) throw new Error("too late; already running");
8423           return schedule;
8424         }
8425
8426         function get$2(node, id) {
8427           var schedule = node.__transition;
8428           if (!schedule || !(schedule = schedule[id])) throw new Error("transition not found");
8429           return schedule;
8430         }
8431
8432         function create$6(node, id, self) {
8433           var schedules = node.__transition,
8434               tween;
8435
8436           // Initialize the self timer when the transition is created.
8437           // Note the actual delay is not known until the first callback!
8438           schedules[id] = self;
8439           self.timer = timer(schedule, 0, self.time);
8440
8441           function schedule(elapsed) {
8442             self.state = SCHEDULED;
8443             self.timer.restart(start, self.delay, self.time);
8444
8445             // If the elapsed delay is less than our first sleep, start immediately.
8446             if (self.delay <= elapsed) start(elapsed - self.delay);
8447           }
8448
8449           function start(elapsed) {
8450             var i, j, n, o;
8451
8452             // If the state is not SCHEDULED, then we previously errored on start.
8453             if (self.state !== SCHEDULED) return stop();
8454
8455             for (i in schedules) {
8456               o = schedules[i];
8457               if (o.name !== self.name) continue;
8458
8459               // While this element already has a starting transition during this frame,
8460               // defer starting an interrupting transition until that transition has a
8461               // chance to tick (and possibly end); see d3/d3-transition#54!
8462               if (o.state === STARTED) return d3_timeout(start);
8463
8464               // Interrupt the active transition, if any.
8465               if (o.state === RUNNING) {
8466                 o.state = ENDED;
8467                 o.timer.stop();
8468                 o.on.call("interrupt", node, node.__data__, o.index, o.group);
8469                 delete schedules[i];
8470               }
8471
8472               // Cancel any pre-empted transitions.
8473               else if (+i < id) {
8474                 o.state = ENDED;
8475                 o.timer.stop();
8476                 o.on.call("cancel", node, node.__data__, o.index, o.group);
8477                 delete schedules[i];
8478               }
8479             }
8480
8481             // Defer the first tick to end of the current frame; see d3/d3#1576.
8482             // Note the transition may be canceled after start and before the first tick!
8483             // Note this must be scheduled before the start event; see d3/d3-transition#16!
8484             // Assuming this is successful, subsequent callbacks go straight to tick.
8485             d3_timeout(function() {
8486               if (self.state === STARTED) {
8487                 self.state = RUNNING;
8488                 self.timer.restart(tick, self.delay, self.time);
8489                 tick(elapsed);
8490               }
8491             });
8492
8493             // Dispatch the start event.
8494             // Note this must be done before the tween are initialized.
8495             self.state = STARTING;
8496             self.on.call("start", node, node.__data__, self.index, self.group);
8497             if (self.state !== STARTING) return; // interrupted
8498             self.state = STARTED;
8499
8500             // Initialize the tween, deleting null tween.
8501             tween = new Array(n = self.tween.length);
8502             for (i = 0, j = -1; i < n; ++i) {
8503               if (o = self.tween[i].value.call(node, node.__data__, self.index, self.group)) {
8504                 tween[++j] = o;
8505               }
8506             }
8507             tween.length = j + 1;
8508           }
8509
8510           function tick(elapsed) {
8511             var t = elapsed < self.duration ? self.ease.call(null, elapsed / self.duration) : (self.timer.restart(stop), self.state = ENDING, 1),
8512                 i = -1,
8513                 n = tween.length;
8514
8515             while (++i < n) {
8516               tween[i].call(node, t);
8517             }
8518
8519             // Dispatch the end event.
8520             if (self.state === ENDING) {
8521               self.on.call("end", node, node.__data__, self.index, self.group);
8522               stop();
8523             }
8524           }
8525
8526           function stop() {
8527             self.state = ENDED;
8528             self.timer.stop();
8529             delete schedules[id];
8530             for (var i in schedules) return; // eslint-disable-line no-unused-vars
8531             delete node.__transition;
8532           }
8533         }
8534
8535         function interrupt(node, name) {
8536           var schedules = node.__transition,
8537               schedule,
8538               active,
8539               empty = true,
8540               i;
8541
8542           if (!schedules) return;
8543
8544           name = name == null ? null : name + "";
8545
8546           for (i in schedules) {
8547             if ((schedule = schedules[i]).name !== name) { empty = false; continue; }
8548             active = schedule.state > STARTING && schedule.state < ENDING;
8549             schedule.state = ENDED;
8550             schedule.timer.stop();
8551             schedule.on.call(active ? "interrupt" : "cancel", node, node.__data__, schedule.index, schedule.group);
8552             delete schedules[i];
8553           }
8554
8555           if (empty) delete node.__transition;
8556         }
8557
8558         function selection_interrupt(name) {
8559           return this.each(function() {
8560             interrupt(this, name);
8561           });
8562         }
8563
8564         function tweenRemove(id, name) {
8565           var tween0, tween1;
8566           return function() {
8567             var schedule = set$1(this, id),
8568                 tween = schedule.tween;
8569
8570             // If this node shared tween with the previous node,
8571             // just assign the updated shared tween and we’re done!
8572             // Otherwise, copy-on-write.
8573             if (tween !== tween0) {
8574               tween1 = tween0 = tween;
8575               for (var i = 0, n = tween1.length; i < n; ++i) {
8576                 if (tween1[i].name === name) {
8577                   tween1 = tween1.slice();
8578                   tween1.splice(i, 1);
8579                   break;
8580                 }
8581               }
8582             }
8583
8584             schedule.tween = tween1;
8585           };
8586         }
8587
8588         function tweenFunction(id, name, value) {
8589           var tween0, tween1;
8590           if (typeof value !== "function") throw new Error;
8591           return function() {
8592             var schedule = set$1(this, id),
8593                 tween = schedule.tween;
8594
8595             // If this node shared tween with the previous node,
8596             // just assign the updated shared tween and we’re done!
8597             // Otherwise, copy-on-write.
8598             if (tween !== tween0) {
8599               tween1 = (tween0 = tween).slice();
8600               for (var t = {name: name, value: value}, i = 0, n = tween1.length; i < n; ++i) {
8601                 if (tween1[i].name === name) {
8602                   tween1[i] = t;
8603                   break;
8604                 }
8605               }
8606               if (i === n) tween1.push(t);
8607             }
8608
8609             schedule.tween = tween1;
8610           };
8611         }
8612
8613         function transition_tween(name, value) {
8614           var id = this._id;
8615
8616           name += "";
8617
8618           if (arguments.length < 2) {
8619             var tween = get$2(this.node(), id).tween;
8620             for (var i = 0, n = tween.length, t; i < n; ++i) {
8621               if ((t = tween[i]).name === name) {
8622                 return t.value;
8623               }
8624             }
8625             return null;
8626           }
8627
8628           return this.each((value == null ? tweenRemove : tweenFunction)(id, name, value));
8629         }
8630
8631         function tweenValue(transition, name, value) {
8632           var id = transition._id;
8633
8634           transition.each(function() {
8635             var schedule = set$1(this, id);
8636             (schedule.value || (schedule.value = {}))[name] = value.apply(this, arguments);
8637           });
8638
8639           return function(node) {
8640             return get$2(node, id).value[name];
8641           };
8642         }
8643
8644         function interpolate(a, b) {
8645           var c;
8646           return (typeof b === "number" ? d3_interpolateNumber
8647               : b instanceof color ? d3_interpolateRgb
8648               : (c = color(b)) ? (b = c, d3_interpolateRgb)
8649               : interpolateString)(a, b);
8650         }
8651
8652         function attrRemove$1(name) {
8653           return function() {
8654             this.removeAttribute(name);
8655           };
8656         }
8657
8658         function attrRemoveNS$1(fullname) {
8659           return function() {
8660             this.removeAttributeNS(fullname.space, fullname.local);
8661           };
8662         }
8663
8664         function attrConstant$1(name, interpolate, value1) {
8665           var string00,
8666               string1 = value1 + "",
8667               interpolate0;
8668           return function() {
8669             var string0 = this.getAttribute(name);
8670             return string0 === string1 ? null
8671                 : string0 === string00 ? interpolate0
8672                 : interpolate0 = interpolate(string00 = string0, value1);
8673           };
8674         }
8675
8676         function attrConstantNS$1(fullname, interpolate, value1) {
8677           var string00,
8678               string1 = value1 + "",
8679               interpolate0;
8680           return function() {
8681             var string0 = this.getAttributeNS(fullname.space, fullname.local);
8682             return string0 === string1 ? null
8683                 : string0 === string00 ? interpolate0
8684                 : interpolate0 = interpolate(string00 = string0, value1);
8685           };
8686         }
8687
8688         function attrFunction$1(name, interpolate, value) {
8689           var string00,
8690               string10,
8691               interpolate0;
8692           return function() {
8693             var string0, value1 = value(this), string1;
8694             if (value1 == null) return void this.removeAttribute(name);
8695             string0 = this.getAttribute(name);
8696             string1 = value1 + "";
8697             return string0 === string1 ? null
8698                 : string0 === string00 && string1 === string10 ? interpolate0
8699                 : (string10 = string1, interpolate0 = interpolate(string00 = string0, value1));
8700           };
8701         }
8702
8703         function attrFunctionNS$1(fullname, interpolate, value) {
8704           var string00,
8705               string10,
8706               interpolate0;
8707           return function() {
8708             var string0, value1 = value(this), string1;
8709             if (value1 == null) return void this.removeAttributeNS(fullname.space, fullname.local);
8710             string0 = this.getAttributeNS(fullname.space, fullname.local);
8711             string1 = value1 + "";
8712             return string0 === string1 ? null
8713                 : string0 === string00 && string1 === string10 ? interpolate0
8714                 : (string10 = string1, interpolate0 = interpolate(string00 = string0, value1));
8715           };
8716         }
8717
8718         function transition_attr(name, value) {
8719           var fullname = namespace(name), i = fullname === "transform" ? interpolateTransformSvg : interpolate;
8720           return this.attrTween(name, typeof value === "function"
8721               ? (fullname.local ? attrFunctionNS$1 : attrFunction$1)(fullname, i, tweenValue(this, "attr." + name, value))
8722               : value == null ? (fullname.local ? attrRemoveNS$1 : attrRemove$1)(fullname)
8723               : (fullname.local ? attrConstantNS$1 : attrConstant$1)(fullname, i, value));
8724         }
8725
8726         function attrInterpolate(name, i) {
8727           return function(t) {
8728             this.setAttribute(name, i(t));
8729           };
8730         }
8731
8732         function attrInterpolateNS(fullname, i) {
8733           return function(t) {
8734             this.setAttributeNS(fullname.space, fullname.local, i(t));
8735           };
8736         }
8737
8738         function attrTweenNS(fullname, value) {
8739           var t0, i0;
8740           function tween() {
8741             var i = value.apply(this, arguments);
8742             if (i !== i0) t0 = (i0 = i) && attrInterpolateNS(fullname, i);
8743             return t0;
8744           }
8745           tween._value = value;
8746           return tween;
8747         }
8748
8749         function attrTween(name, value) {
8750           var t0, i0;
8751           function tween() {
8752             var i = value.apply(this, arguments);
8753             if (i !== i0) t0 = (i0 = i) && attrInterpolate(name, i);
8754             return t0;
8755           }
8756           tween._value = value;
8757           return tween;
8758         }
8759
8760         function transition_attrTween(name, value) {
8761           var key = "attr." + name;
8762           if (arguments.length < 2) return (key = this.tween(key)) && key._value;
8763           if (value == null) return this.tween(key, null);
8764           if (typeof value !== "function") throw new Error;
8765           var fullname = namespace(name);
8766           return this.tween(key, (fullname.local ? attrTweenNS : attrTween)(fullname, value));
8767         }
8768
8769         function delayFunction(id, value) {
8770           return function() {
8771             init(this, id).delay = +value.apply(this, arguments);
8772           };
8773         }
8774
8775         function delayConstant(id, value) {
8776           return value = +value, function() {
8777             init(this, id).delay = value;
8778           };
8779         }
8780
8781         function transition_delay(value) {
8782           var id = this._id;
8783
8784           return arguments.length
8785               ? this.each((typeof value === "function"
8786                   ? delayFunction
8787                   : delayConstant)(id, value))
8788               : get$2(this.node(), id).delay;
8789         }
8790
8791         function durationFunction(id, value) {
8792           return function() {
8793             set$1(this, id).duration = +value.apply(this, arguments);
8794           };
8795         }
8796
8797         function durationConstant(id, value) {
8798           return value = +value, function() {
8799             set$1(this, id).duration = value;
8800           };
8801         }
8802
8803         function transition_duration(value) {
8804           var id = this._id;
8805
8806           return arguments.length
8807               ? this.each((typeof value === "function"
8808                   ? durationFunction
8809                   : durationConstant)(id, value))
8810               : get$2(this.node(), id).duration;
8811         }
8812
8813         function easeConstant(id, value) {
8814           if (typeof value !== "function") throw new Error;
8815           return function() {
8816             set$1(this, id).ease = value;
8817           };
8818         }
8819
8820         function transition_ease(value) {
8821           var id = this._id;
8822
8823           return arguments.length
8824               ? this.each(easeConstant(id, value))
8825               : get$2(this.node(), id).ease;
8826         }
8827
8828         function transition_filter(match) {
8829           if (typeof match !== "function") match = matcher(match);
8830
8831           for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {
8832             for (var group = groups[j], n = group.length, subgroup = subgroups[j] = [], node, i = 0; i < n; ++i) {
8833               if ((node = group[i]) && match.call(node, node.__data__, i, group)) {
8834                 subgroup.push(node);
8835               }
8836             }
8837           }
8838
8839           return new Transition(subgroups, this._parents, this._name, this._id);
8840         }
8841
8842         function transition_merge(transition) {
8843           if (transition._id !== this._id) throw new Error;
8844
8845           for (var groups0 = this._groups, groups1 = transition._groups, m0 = groups0.length, m1 = groups1.length, m = Math.min(m0, m1), merges = new Array(m0), j = 0; j < m; ++j) {
8846             for (var group0 = groups0[j], group1 = groups1[j], n = group0.length, merge = merges[j] = new Array(n), node, i = 0; i < n; ++i) {
8847               if (node = group0[i] || group1[i]) {
8848                 merge[i] = node;
8849               }
8850             }
8851           }
8852
8853           for (; j < m0; ++j) {
8854             merges[j] = groups0[j];
8855           }
8856
8857           return new Transition(merges, this._parents, this._name, this._id);
8858         }
8859
8860         function start(name) {
8861           return (name + "").trim().split(/^|\s+/).every(function(t) {
8862             var i = t.indexOf(".");
8863             if (i >= 0) t = t.slice(0, i);
8864             return !t || t === "start";
8865           });
8866         }
8867
8868         function onFunction(id, name, listener) {
8869           var on0, on1, sit = start(name) ? init : set$1;
8870           return function() {
8871             var schedule = sit(this, id),
8872                 on = schedule.on;
8873
8874             // If this node shared a dispatch with the previous node,
8875             // just assign the updated shared dispatch and we’re done!
8876             // Otherwise, copy-on-write.
8877             if (on !== on0) (on1 = (on0 = on).copy()).on(name, listener);
8878
8879             schedule.on = on1;
8880           };
8881         }
8882
8883         function transition_on(name, listener) {
8884           var id = this._id;
8885
8886           return arguments.length < 2
8887               ? get$2(this.node(), id).on.on(name)
8888               : this.each(onFunction(id, name, listener));
8889         }
8890
8891         function removeFunction(id) {
8892           return function() {
8893             var parent = this.parentNode;
8894             for (var i in this.__transition) if (+i !== id) return;
8895             if (parent) parent.removeChild(this);
8896           };
8897         }
8898
8899         function transition_remove() {
8900           return this.on("end.remove", removeFunction(this._id));
8901         }
8902
8903         function transition_select(select) {
8904           var name = this._name,
8905               id = this._id;
8906
8907           if (typeof select !== "function") select = selector(select);
8908
8909           for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {
8910             for (var group = groups[j], n = group.length, subgroup = subgroups[j] = new Array(n), node, subnode, i = 0; i < n; ++i) {
8911               if ((node = group[i]) && (subnode = select.call(node, node.__data__, i, group))) {
8912                 if ("__data__" in node) subnode.__data__ = node.__data__;
8913                 subgroup[i] = subnode;
8914                 schedule(subgroup[i], name, id, i, subgroup, get$2(node, id));
8915               }
8916             }
8917           }
8918
8919           return new Transition(subgroups, this._parents, name, id);
8920         }
8921
8922         function transition_selectAll(select) {
8923           var name = this._name,
8924               id = this._id;
8925
8926           if (typeof select !== "function") select = selectorAll(select);
8927
8928           for (var groups = this._groups, m = groups.length, subgroups = [], parents = [], j = 0; j < m; ++j) {
8929             for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {
8930               if (node = group[i]) {
8931                 for (var children = select.call(node, node.__data__, i, group), child, inherit = get$2(node, id), k = 0, l = children.length; k < l; ++k) {
8932                   if (child = children[k]) {
8933                     schedule(child, name, id, k, children, inherit);
8934                   }
8935                 }
8936                 subgroups.push(children);
8937                 parents.push(node);
8938               }
8939             }
8940           }
8941
8942           return new Transition(subgroups, parents, name, id);
8943         }
8944
8945         var Selection$1 = selection.prototype.constructor;
8946
8947         function transition_selection() {
8948           return new Selection$1(this._groups, this._parents);
8949         }
8950
8951         function styleNull(name, interpolate) {
8952           var string00,
8953               string10,
8954               interpolate0;
8955           return function() {
8956             var string0 = styleValue(this, name),
8957                 string1 = (this.style.removeProperty(name), styleValue(this, name));
8958             return string0 === string1 ? null
8959                 : string0 === string00 && string1 === string10 ? interpolate0
8960                 : interpolate0 = interpolate(string00 = string0, string10 = string1);
8961           };
8962         }
8963
8964         function styleRemove$1(name) {
8965           return function() {
8966             this.style.removeProperty(name);
8967           };
8968         }
8969
8970         function styleConstant$1(name, interpolate, value1) {
8971           var string00,
8972               string1 = value1 + "",
8973               interpolate0;
8974           return function() {
8975             var string0 = styleValue(this, name);
8976             return string0 === string1 ? null
8977                 : string0 === string00 ? interpolate0
8978                 : interpolate0 = interpolate(string00 = string0, value1);
8979           };
8980         }
8981
8982         function styleFunction$1(name, interpolate, value) {
8983           var string00,
8984               string10,
8985               interpolate0;
8986           return function() {
8987             var string0 = styleValue(this, name),
8988                 value1 = value(this),
8989                 string1 = value1 + "";
8990             if (value1 == null) string1 = value1 = (this.style.removeProperty(name), styleValue(this, name));
8991             return string0 === string1 ? null
8992                 : string0 === string00 && string1 === string10 ? interpolate0
8993                 : (string10 = string1, interpolate0 = interpolate(string00 = string0, value1));
8994           };
8995         }
8996
8997         function styleMaybeRemove(id, name) {
8998           var on0, on1, listener0, key = "style." + name, event = "end." + key, remove;
8999           return function() {
9000             var schedule = set$1(this, id),
9001                 on = schedule.on,
9002                 listener = schedule.value[key] == null ? remove || (remove = styleRemove$1(name)) : undefined;
9003
9004             // If this node shared a dispatch with the previous node,
9005             // just assign the updated shared dispatch and we’re done!
9006             // Otherwise, copy-on-write.
9007             if (on !== on0 || listener0 !== listener) (on1 = (on0 = on).copy()).on(event, listener0 = listener);
9008
9009             schedule.on = on1;
9010           };
9011         }
9012
9013         function transition_style(name, value, priority) {
9014           var i = (name += "") === "transform" ? interpolateTransformCss : interpolate;
9015           return value == null ? this
9016               .styleTween(name, styleNull(name, i))
9017               .on("end.style." + name, styleRemove$1(name))
9018             : typeof value === "function" ? this
9019               .styleTween(name, styleFunction$1(name, i, tweenValue(this, "style." + name, value)))
9020               .each(styleMaybeRemove(this._id, name))
9021             : this
9022               .styleTween(name, styleConstant$1(name, i, value), priority)
9023               .on("end.style." + name, null);
9024         }
9025
9026         function styleInterpolate(name, i, priority) {
9027           return function(t) {
9028             this.style.setProperty(name, i(t), priority);
9029           };
9030         }
9031
9032         function styleTween(name, value, priority) {
9033           var t, i0;
9034           function tween() {
9035             var i = value.apply(this, arguments);
9036             if (i !== i0) t = (i0 = i) && styleInterpolate(name, i, priority);
9037             return t;
9038           }
9039           tween._value = value;
9040           return tween;
9041         }
9042
9043         function transition_styleTween(name, value, priority) {
9044           var key = "style." + (name += "");
9045           if (arguments.length < 2) return (key = this.tween(key)) && key._value;
9046           if (value == null) return this.tween(key, null);
9047           if (typeof value !== "function") throw new Error;
9048           return this.tween(key, styleTween(name, value, priority == null ? "" : priority));
9049         }
9050
9051         function textConstant$1(value) {
9052           return function() {
9053             this.textContent = value;
9054           };
9055         }
9056
9057         function textFunction$1(value) {
9058           return function() {
9059             var value1 = value(this);
9060             this.textContent = value1 == null ? "" : value1;
9061           };
9062         }
9063
9064         function transition_text(value) {
9065           return this.tween("text", typeof value === "function"
9066               ? textFunction$1(tweenValue(this, "text", value))
9067               : textConstant$1(value == null ? "" : value + ""));
9068         }
9069
9070         function transition_transition() {
9071           var name = this._name,
9072               id0 = this._id,
9073               id1 = newId();
9074
9075           for (var groups = this._groups, m = groups.length, j = 0; j < m; ++j) {
9076             for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {
9077               if (node = group[i]) {
9078                 var inherit = get$2(node, id0);
9079                 schedule(node, name, id1, i, group, {
9080                   time: inherit.time + inherit.delay + inherit.duration,
9081                   delay: 0,
9082                   duration: inherit.duration,
9083                   ease: inherit.ease
9084                 });
9085               }
9086             }
9087           }
9088
9089           return new Transition(groups, this._parents, name, id1);
9090         }
9091
9092         function transition_end() {
9093           var on0, on1, that = this, id = that._id, size = that.size();
9094           return new Promise(function(resolve, reject) {
9095             var cancel = {value: reject},
9096                 end = {value: function() { if (--size === 0) resolve(); }};
9097
9098             that.each(function() {
9099               var schedule = set$1(this, id),
9100                   on = schedule.on;
9101
9102               // If this node shared a dispatch with the previous node,
9103               // just assign the updated shared dispatch and we’re done!
9104               // Otherwise, copy-on-write.
9105               if (on !== on0) {
9106                 on1 = (on0 = on).copy();
9107                 on1._.cancel.push(cancel);
9108                 on1._.interrupt.push(cancel);
9109                 on1._.end.push(end);
9110               }
9111
9112               schedule.on = on1;
9113             });
9114           });
9115         }
9116
9117         var id$4 = 0;
9118
9119         function Transition(groups, parents, name, id) {
9120           this._groups = groups;
9121           this._parents = parents;
9122           this._name = name;
9123           this._id = id;
9124         }
9125
9126         function transition(name) {
9127           return selection().transition(name);
9128         }
9129
9130         function newId() {
9131           return ++id$4;
9132         }
9133
9134         var selection_prototype = selection.prototype;
9135
9136         Transition.prototype = transition.prototype = {
9137           constructor: Transition,
9138           select: transition_select,
9139           selectAll: transition_selectAll,
9140           filter: transition_filter,
9141           merge: transition_merge,
9142           selection: transition_selection,
9143           transition: transition_transition,
9144           call: selection_prototype.call,
9145           nodes: selection_prototype.nodes,
9146           node: selection_prototype.node,
9147           size: selection_prototype.size,
9148           empty: selection_prototype.empty,
9149           each: selection_prototype.each,
9150           on: transition_on,
9151           attr: transition_attr,
9152           attrTween: transition_attrTween,
9153           style: transition_style,
9154           styleTween: transition_styleTween,
9155           text: transition_text,
9156           remove: transition_remove,
9157           tween: transition_tween,
9158           delay: transition_delay,
9159           duration: transition_duration,
9160           ease: transition_ease,
9161           end: transition_end
9162         };
9163
9164         function linear$1(t) {
9165           return +t;
9166         }
9167
9168         function quadIn(t) {
9169           return t * t;
9170         }
9171
9172         function quadOut(t) {
9173           return t * (2 - t);
9174         }
9175
9176         function quadInOut(t) {
9177           return ((t *= 2) <= 1 ? t * t : --t * (2 - t) + 1) / 2;
9178         }
9179
9180         function cubicIn(t) {
9181           return t * t * t;
9182         }
9183
9184         function cubicOut(t) {
9185           return --t * t * t + 1;
9186         }
9187
9188         function cubicInOut(t) {
9189           return ((t *= 2) <= 1 ? t * t * t : (t -= 2) * t * t + 2) / 2;
9190         }
9191
9192         var exponent = 3;
9193
9194         var polyIn = (function custom(e) {
9195           e = +e;
9196
9197           function polyIn(t) {
9198             return Math.pow(t, e);
9199           }
9200
9201           polyIn.exponent = custom;
9202
9203           return polyIn;
9204         })(exponent);
9205
9206         var polyOut = (function custom(e) {
9207           e = +e;
9208
9209           function polyOut(t) {
9210             return 1 - Math.pow(1 - t, e);
9211           }
9212
9213           polyOut.exponent = custom;
9214
9215           return polyOut;
9216         })(exponent);
9217
9218         var polyInOut = (function custom(e) {
9219           e = +e;
9220
9221           function polyInOut(t) {
9222             return ((t *= 2) <= 1 ? Math.pow(t, e) : 2 - Math.pow(2 - t, e)) / 2;
9223           }
9224
9225           polyInOut.exponent = custom;
9226
9227           return polyInOut;
9228         })(exponent);
9229
9230         var pi = Math.PI,
9231             halfPi = pi / 2;
9232
9233         function sinIn(t) {
9234           return 1 - Math.cos(t * halfPi);
9235         }
9236
9237         function sinOut(t) {
9238           return Math.sin(t * halfPi);
9239         }
9240
9241         function sinInOut(t) {
9242           return (1 - Math.cos(pi * t)) / 2;
9243         }
9244
9245         function expIn(t) {
9246           return Math.pow(2, 10 * t - 10);
9247         }
9248
9249         function expOut(t) {
9250           return 1 - Math.pow(2, -10 * t);
9251         }
9252
9253         function expInOut(t) {
9254           return ((t *= 2) <= 1 ? Math.pow(2, 10 * t - 10) : 2 - Math.pow(2, 10 - 10 * t)) / 2;
9255         }
9256
9257         function circleIn(t) {
9258           return 1 - Math.sqrt(1 - t * t);
9259         }
9260
9261         function circleOut(t) {
9262           return Math.sqrt(1 - --t * t);
9263         }
9264
9265         function circleInOut(t) {
9266           return ((t *= 2) <= 1 ? 1 - Math.sqrt(1 - t * t) : Math.sqrt(1 - (t -= 2) * t) + 1) / 2;
9267         }
9268
9269         var b1 = 4 / 11,
9270             b2 = 6 / 11,
9271             b3 = 8 / 11,
9272             b4 = 3 / 4,
9273             b5 = 9 / 11,
9274             b6 = 10 / 11,
9275             b7 = 15 / 16,
9276             b8 = 21 / 22,
9277             b9 = 63 / 64,
9278             b0 = 1 / b1 / b1;
9279
9280         function bounceIn(t) {
9281           return 1 - bounceOut(1 - t);
9282         }
9283
9284         function bounceOut(t) {
9285           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;
9286         }
9287
9288         function bounceInOut(t) {
9289           return ((t *= 2) <= 1 ? 1 - bounceOut(1 - t) : bounceOut(t - 1) + 1) / 2;
9290         }
9291
9292         var overshoot = 1.70158;
9293
9294         var backIn = (function custom(s) {
9295           s = +s;
9296
9297           function backIn(t) {
9298             return t * t * ((s + 1) * t - s);
9299           }
9300
9301           backIn.overshoot = custom;
9302
9303           return backIn;
9304         })(overshoot);
9305
9306         var backOut = (function custom(s) {
9307           s = +s;
9308
9309           function backOut(t) {
9310             return --t * t * ((s + 1) * t + s) + 1;
9311           }
9312
9313           backOut.overshoot = custom;
9314
9315           return backOut;
9316         })(overshoot);
9317
9318         var backInOut = (function custom(s) {
9319           s = +s;
9320
9321           function backInOut(t) {
9322             return ((t *= 2) < 1 ? t * t * ((s + 1) * t - s) : (t -= 2) * t * ((s + 1) * t + s) + 2) / 2;
9323           }
9324
9325           backInOut.overshoot = custom;
9326
9327           return backInOut;
9328         })(overshoot);
9329
9330         var tau = 2 * Math.PI,
9331             amplitude = 1,
9332             period = 0.3;
9333
9334         var elasticIn = (function custom(a, p) {
9335           var s = Math.asin(1 / (a = Math.max(1, a))) * (p /= tau);
9336
9337           function elasticIn(t) {
9338             return a * Math.pow(2, 10 * --t) * Math.sin((s - t) / p);
9339           }
9340
9341           elasticIn.amplitude = function(a) { return custom(a, p * tau); };
9342           elasticIn.period = function(p) { return custom(a, p); };
9343
9344           return elasticIn;
9345         })(amplitude, period);
9346
9347         var elasticOut = (function custom(a, p) {
9348           var s = Math.asin(1 / (a = Math.max(1, a))) * (p /= tau);
9349
9350           function elasticOut(t) {
9351             return 1 - a * Math.pow(2, -10 * (t = +t)) * Math.sin((t + s) / p);
9352           }
9353
9354           elasticOut.amplitude = function(a) { return custom(a, p * tau); };
9355           elasticOut.period = function(p) { return custom(a, p); };
9356
9357           return elasticOut;
9358         })(amplitude, period);
9359
9360         var elasticInOut = (function custom(a, p) {
9361           var s = Math.asin(1 / (a = Math.max(1, a))) * (p /= tau);
9362
9363           function elasticInOut(t) {
9364             return ((t = t * 2 - 1) < 0
9365                 ? a * Math.pow(2, 10 * t) * Math.sin((s - t) / p)
9366                 : 2 - a * Math.pow(2, -10 * t) * Math.sin((s + t) / p)) / 2;
9367           }
9368
9369           elasticInOut.amplitude = function(a) { return custom(a, p * tau); };
9370           elasticInOut.period = function(p) { return custom(a, p); };
9371
9372           return elasticInOut;
9373         })(amplitude, period);
9374
9375         var defaultTiming = {
9376           time: null, // Set on use.
9377           delay: 0,
9378           duration: 250,
9379           ease: cubicInOut
9380         };
9381
9382         function inherit(node, id) {
9383           var timing;
9384           while (!(timing = node.__transition) || !(timing = timing[id])) {
9385             if (!(node = node.parentNode)) {
9386               return defaultTiming.time = now(), defaultTiming;
9387             }
9388           }
9389           return timing;
9390         }
9391
9392         function selection_transition(name) {
9393           var id,
9394               timing;
9395
9396           if (name instanceof Transition) {
9397             id = name._id, name = name._name;
9398           } else {
9399             id = newId(), (timing = defaultTiming).time = now(), name = name == null ? null : name + "";
9400           }
9401
9402           for (var groups = this._groups, m = groups.length, j = 0; j < m; ++j) {
9403             for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {
9404               if (node = group[i]) {
9405                 schedule(node, name, id, i, group, timing || inherit(node, id));
9406               }
9407             }
9408           }
9409
9410           return new Transition(groups, this._parents, name, id);
9411         }
9412
9413         selection.prototype.interrupt = selection_interrupt;
9414         selection.prototype.transition = selection_transition;
9415
9416         var root$2 = [null];
9417
9418         function active(node, name) {
9419           var schedules = node.__transition,
9420               schedule,
9421               i;
9422
9423           if (schedules) {
9424             name = name == null ? null : name + "";
9425             for (i in schedules) {
9426               if ((schedule = schedules[i]).state > SCHEDULED && schedule.name === name) {
9427                 return new Transition([[node]], root$2, name, +i);
9428               }
9429             }
9430           }
9431
9432           return null;
9433         }
9434
9435         function constant$4(x) {
9436           return function() {
9437             return x;
9438           };
9439         }
9440
9441         function BrushEvent(target, type, selection) {
9442           this.target = target;
9443           this.type = type;
9444           this.selection = selection;
9445         }
9446
9447         function nopropagation$1() {
9448           event.stopImmediatePropagation();
9449         }
9450
9451         function noevent$1() {
9452           event.preventDefault();
9453           event.stopImmediatePropagation();
9454         }
9455
9456         var MODE_DRAG = {name: "drag"},
9457             MODE_SPACE = {name: "space"},
9458             MODE_HANDLE = {name: "handle"},
9459             MODE_CENTER = {name: "center"};
9460
9461         var X = {
9462           name: "x",
9463           handles: ["e", "w"].map(type),
9464           input: function(x, e) { return x && [[x[0], e[0][1]], [x[1], e[1][1]]]; },
9465           output: function(xy) { return xy && [xy[0][0], xy[1][0]]; }
9466         };
9467
9468         var Y = {
9469           name: "y",
9470           handles: ["n", "s"].map(type),
9471           input: function(y, e) { return y && [[e[0][0], y[0]], [e[1][0], y[1]]]; },
9472           output: function(xy) { return xy && [xy[0][1], xy[1][1]]; }
9473         };
9474
9475         var XY = {
9476           name: "xy",
9477           handles: ["n", "e", "s", "w", "nw", "ne", "se", "sw"].map(type),
9478           input: function(xy) { return xy; },
9479           output: function(xy) { return xy; }
9480         };
9481
9482         var cursors = {
9483           overlay: "crosshair",
9484           selection: "move",
9485           n: "ns-resize",
9486           e: "ew-resize",
9487           s: "ns-resize",
9488           w: "ew-resize",
9489           nw: "nwse-resize",
9490           ne: "nesw-resize",
9491           se: "nwse-resize",
9492           sw: "nesw-resize"
9493         };
9494
9495         var flipX = {
9496           e: "w",
9497           w: "e",
9498           nw: "ne",
9499           ne: "nw",
9500           se: "sw",
9501           sw: "se"
9502         };
9503
9504         var flipY = {
9505           n: "s",
9506           s: "n",
9507           nw: "sw",
9508           ne: "se",
9509           se: "ne",
9510           sw: "nw"
9511         };
9512
9513         var signsX = {
9514           overlay: +1,
9515           selection: +1,
9516           n: null,
9517           e: +1,
9518           s: null,
9519           w: -1,
9520           nw: -1,
9521           ne: +1,
9522           se: +1,
9523           sw: -1
9524         };
9525
9526         var signsY = {
9527           overlay: +1,
9528           selection: +1,
9529           n: -1,
9530           e: null,
9531           s: +1,
9532           w: null,
9533           nw: -1,
9534           ne: -1,
9535           se: +1,
9536           sw: +1
9537         };
9538
9539         function type(t) {
9540           return {type: t};
9541         }
9542
9543         // Ignore right-click, since that should open the context menu.
9544         function defaultFilter$1() {
9545           return !event.button;
9546         }
9547
9548         function defaultExtent() {
9549           var svg = this.ownerSVGElement || this;
9550           return [[0, 0], [svg.width.baseVal.value, svg.height.baseVal.value]];
9551         }
9552
9553         // Like d3.local, but with the name “__brush” rather than auto-generated.
9554         function local$1(node) {
9555           while (!node.__brush) if (!(node = node.parentNode)) return;
9556           return node.__brush;
9557         }
9558
9559         function empty$1(extent) {
9560           return extent[0][0] === extent[1][0]
9561               || extent[0][1] === extent[1][1];
9562         }
9563
9564         function brushSelection(node) {
9565           var state = node.__brush;
9566           return state ? state.dim.output(state.selection) : null;
9567         }
9568
9569         function brushX() {
9570           return brush$1(X);
9571         }
9572
9573         function brushY() {
9574           return brush$1(Y);
9575         }
9576
9577         function brush() {
9578           return brush$1(XY);
9579         }
9580
9581         function brush$1(dim) {
9582           var extent = defaultExtent,
9583               filter = defaultFilter$1,
9584               listeners = dispatch(brush, "start", "brush", "end"),
9585               handleSize = 6,
9586               touchending;
9587
9588           function brush(group) {
9589             var overlay = group
9590                 .property("__brush", initialize)
9591               .selectAll(".overlay")
9592               .data([type("overlay")]);
9593
9594             overlay.enter().append("rect")
9595                 .attr("class", "overlay")
9596                 .attr("pointer-events", "all")
9597                 .attr("cursor", cursors.overlay)
9598               .merge(overlay)
9599                 .each(function() {
9600                   var extent = local$1(this).extent;
9601                   d3_select(this)
9602                       .attr("x", extent[0][0])
9603                       .attr("y", extent[0][1])
9604                       .attr("width", extent[1][0] - extent[0][0])
9605                       .attr("height", extent[1][1] - extent[0][1]);
9606                 });
9607
9608             group.selectAll(".selection")
9609               .data([type("selection")])
9610               .enter().append("rect")
9611                 .attr("class", "selection")
9612                 .attr("cursor", cursors.selection)
9613                 .attr("fill", "#777")
9614                 .attr("fill-opacity", 0.3)
9615                 .attr("stroke", "#fff")
9616                 .attr("shape-rendering", "crispEdges");
9617
9618             var handle = group.selectAll(".handle")
9619               .data(dim.handles, function(d) { return d.type; });
9620
9621             handle.exit().remove();
9622
9623             handle.enter().append("rect")
9624                 .attr("class", function(d) { return "handle handle--" + d.type; })
9625                 .attr("cursor", function(d) { return cursors[d.type]; });
9626
9627             group
9628                 .each(redraw)
9629                 .attr("fill", "none")
9630                 .attr("pointer-events", "all")
9631                 .style("-webkit-tap-highlight-color", "rgba(0,0,0,0)")
9632                 .on("mousedown.brush touchstart.brush", started);
9633           }
9634
9635           brush.move = function(group, selection) {
9636             if (group.selection) {
9637               group
9638                   .on("start.brush", function() { emitter(this, arguments).beforestart().start(); })
9639                   .on("interrupt.brush end.brush", function() { emitter(this, arguments).end(); })
9640                   .tween("brush", function() {
9641                     var that = this,
9642                         state = that.__brush,
9643                         emit = emitter(that, arguments),
9644                         selection0 = state.selection,
9645                         selection1 = dim.input(typeof selection === "function" ? selection.apply(this, arguments) : selection, state.extent),
9646                         i = d3_interpolate(selection0, selection1);
9647
9648                     function tween(t) {
9649                       state.selection = t === 1 && empty$1(selection1) ? null : i(t);
9650                       redraw.call(that);
9651                       emit.brush();
9652                     }
9653
9654                     return selection0 && selection1 ? tween : tween(1);
9655                   });
9656             } else {
9657               group
9658                   .each(function() {
9659                     var that = this,
9660                         args = arguments,
9661                         state = that.__brush,
9662                         selection1 = dim.input(typeof selection === "function" ? selection.apply(that, args) : selection, state.extent),
9663                         emit = emitter(that, args).beforestart();
9664
9665                     interrupt(that);
9666                     state.selection = selection1 == null || empty$1(selection1) ? null : selection1;
9667                     redraw.call(that);
9668                     emit.start().brush().end();
9669                   });
9670             }
9671           };
9672
9673           function redraw() {
9674             var group = d3_select(this),
9675                 selection = local$1(this).selection;
9676
9677             if (selection) {
9678               group.selectAll(".selection")
9679                   .style("display", null)
9680                   .attr("x", selection[0][0])
9681                   .attr("y", selection[0][1])
9682                   .attr("width", selection[1][0] - selection[0][0])
9683                   .attr("height", selection[1][1] - selection[0][1]);
9684
9685               group.selectAll(".handle")
9686                   .style("display", null)
9687                   .attr("x", function(d) { return d.type[d.type.length - 1] === "e" ? selection[1][0] - handleSize / 2 : selection[0][0] - handleSize / 2; })
9688                   .attr("y", function(d) { return d.type[0] === "s" ? selection[1][1] - handleSize / 2 : selection[0][1] - handleSize / 2; })
9689                   .attr("width", function(d) { return d.type === "n" || d.type === "s" ? selection[1][0] - selection[0][0] + handleSize : handleSize; })
9690                   .attr("height", function(d) { return d.type === "e" || d.type === "w" ? selection[1][1] - selection[0][1] + handleSize : handleSize; });
9691             }
9692
9693             else {
9694               group.selectAll(".selection,.handle")
9695                   .style("display", "none")
9696                   .attr("x", null)
9697                   .attr("y", null)
9698                   .attr("width", null)
9699                   .attr("height", null);
9700             }
9701           }
9702
9703           function emitter(that, args) {
9704             return that.__brush.emitter || new Emitter(that, args);
9705           }
9706
9707           function Emitter(that, args) {
9708             this.that = that;
9709             this.args = args;
9710             this.state = that.__brush;
9711             this.active = 0;
9712           }
9713
9714           Emitter.prototype = {
9715             beforestart: function() {
9716               if (++this.active === 1) this.state.emitter = this, this.starting = true;
9717               return this;
9718             },
9719             start: function() {
9720               if (this.starting) this.starting = false, this.emit("start");
9721               return this;
9722             },
9723             brush: function() {
9724               this.emit("brush");
9725               return this;
9726             },
9727             end: function() {
9728               if (--this.active === 0) delete this.state.emitter, this.emit("end");
9729               return this;
9730             },
9731             emit: function(type) {
9732               customEvent(new BrushEvent(brush, type, dim.output(this.state.selection)), listeners.apply, listeners, [type, this.that, this.args]);
9733             }
9734           };
9735
9736           function started() {
9737             if (event.touches) { if (event.changedTouches.length < event.touches.length) return noevent$1(); }
9738             else if (touchending) return;
9739             if (!filter.apply(this, arguments)) return;
9740
9741             var that = this,
9742                 type = event.target.__data__.type,
9743                 mode = (event.metaKey ? type = "overlay" : type) === "selection" ? MODE_DRAG : (event.altKey ? MODE_CENTER : MODE_HANDLE),
9744                 signX = dim === Y ? null : signsX[type],
9745                 signY = dim === X ? null : signsY[type],
9746                 state = local$1(that),
9747                 extent = state.extent,
9748                 selection = state.selection,
9749                 W = extent[0][0], w0, w1,
9750                 N = extent[0][1], n0, n1,
9751                 E = extent[1][0], e0, e1,
9752                 S = extent[1][1], s0, s1,
9753                 dx,
9754                 dy,
9755                 moving,
9756                 shifting = signX && signY && event.shiftKey,
9757                 lockX,
9758                 lockY,
9759                 point0 = d3_mouse(that),
9760                 point = point0,
9761                 emit = emitter(that, arguments).beforestart();
9762
9763             if (type === "overlay") {
9764               state.selection = selection = [
9765                 [w0 = dim === Y ? W : point0[0], n0 = dim === X ? N : point0[1]],
9766                 [e0 = dim === Y ? E : w0, s0 = dim === X ? S : n0]
9767               ];
9768             } else {
9769               w0 = selection[0][0];
9770               n0 = selection[0][1];
9771               e0 = selection[1][0];
9772               s0 = selection[1][1];
9773             }
9774
9775             w1 = w0;
9776             n1 = n0;
9777             e1 = e0;
9778             s1 = s0;
9779
9780             var group = d3_select(that)
9781                 .attr("pointer-events", "none");
9782
9783             var overlay = group.selectAll(".overlay")
9784                 .attr("cursor", cursors[type]);
9785
9786             if (event.touches) {
9787               group
9788                   .on("touchmove.brush", moved, true)
9789                   .on("touchend.brush touchcancel.brush", ended, true);
9790             } else {
9791               var view = d3_select(event.view)
9792                   .on("keydown.brush", keydowned, true)
9793                   .on("keyup.brush", keyupped, true)
9794                   .on("mousemove.brush", moved, true)
9795                   .on("mouseup.brush", ended, true);
9796
9797               dragDisable(event.view);
9798             }
9799
9800             nopropagation$1();
9801             interrupt(that);
9802             redraw.call(that);
9803             emit.start();
9804
9805             function moved() {
9806               var point1 = d3_mouse(that);
9807               if (shifting && !lockX && !lockY) {
9808                 if (Math.abs(point1[0] - point[0]) > Math.abs(point1[1] - point[1])) lockY = true;
9809                 else lockX = true;
9810               }
9811               point = point1;
9812               moving = true;
9813               noevent$1();
9814               move();
9815             }
9816
9817             function move() {
9818               var t;
9819
9820               dx = point[0] - point0[0];
9821               dy = point[1] - point0[1];
9822
9823               switch (mode) {
9824                 case MODE_SPACE:
9825                 case MODE_DRAG: {
9826                   if (signX) dx = Math.max(W - w0, Math.min(E - e0, dx)), w1 = w0 + dx, e1 = e0 + dx;
9827                   if (signY) dy = Math.max(N - n0, Math.min(S - s0, dy)), n1 = n0 + dy, s1 = s0 + dy;
9828                   break;
9829                 }
9830                 case MODE_HANDLE: {
9831                   if (signX < 0) dx = Math.max(W - w0, Math.min(E - w0, dx)), w1 = w0 + dx, e1 = e0;
9832                   else if (signX > 0) dx = Math.max(W - e0, Math.min(E - e0, dx)), w1 = w0, e1 = e0 + dx;
9833                   if (signY < 0) dy = Math.max(N - n0, Math.min(S - n0, dy)), n1 = n0 + dy, s1 = s0;
9834                   else if (signY > 0) dy = Math.max(N - s0, Math.min(S - s0, dy)), n1 = n0, s1 = s0 + dy;
9835                   break;
9836                 }
9837                 case MODE_CENTER: {
9838                   if (signX) w1 = Math.max(W, Math.min(E, w0 - dx * signX)), e1 = Math.max(W, Math.min(E, e0 + dx * signX));
9839                   if (signY) n1 = Math.max(N, Math.min(S, n0 - dy * signY)), s1 = Math.max(N, Math.min(S, s0 + dy * signY));
9840                   break;
9841                 }
9842               }
9843
9844               if (e1 < w1) {
9845                 signX *= -1;
9846                 t = w0, w0 = e0, e0 = t;
9847                 t = w1, w1 = e1, e1 = t;
9848                 if (type in flipX) overlay.attr("cursor", cursors[type = flipX[type]]);
9849               }
9850
9851               if (s1 < n1) {
9852                 signY *= -1;
9853                 t = n0, n0 = s0, s0 = t;
9854                 t = n1, n1 = s1, s1 = t;
9855                 if (type in flipY) overlay.attr("cursor", cursors[type = flipY[type]]);
9856               }
9857
9858               if (state.selection) selection = state.selection; // May be set by brush.move!
9859               if (lockX) w1 = selection[0][0], e1 = selection[1][0];
9860               if (lockY) n1 = selection[0][1], s1 = selection[1][1];
9861
9862               if (selection[0][0] !== w1
9863                   || selection[0][1] !== n1
9864                   || selection[1][0] !== e1
9865                   || selection[1][1] !== s1) {
9866                 state.selection = [[w1, n1], [e1, s1]];
9867                 redraw.call(that);
9868                 emit.brush();
9869               }
9870             }
9871
9872             function ended() {
9873               nopropagation$1();
9874               if (event.touches) {
9875                 if (event.touches.length) return;
9876                 if (touchending) clearTimeout(touchending);
9877                 touchending = setTimeout(function() { touchending = null; }, 500); // Ghost clicks are delayed!
9878                 group.on("touchmove.brush touchend.brush touchcancel.brush", null);
9879               } else {
9880                 yesdrag(event.view, moving);
9881                 view.on("keydown.brush keyup.brush mousemove.brush mouseup.brush", null);
9882               }
9883               group.attr("pointer-events", "all");
9884               overlay.attr("cursor", cursors.overlay);
9885               if (state.selection) selection = state.selection; // May be set by brush.move (on start)!
9886               if (empty$1(selection)) state.selection = null, redraw.call(that);
9887               emit.end();
9888             }
9889
9890             function keydowned() {
9891               switch (event.keyCode) {
9892                 case 16: { // SHIFT
9893                   shifting = signX && signY;
9894                   break;
9895                 }
9896                 case 18: { // ALT
9897                   if (mode === MODE_HANDLE) {
9898                     if (signX) e0 = e1 - dx * signX, w0 = w1 + dx * signX;
9899                     if (signY) s0 = s1 - dy * signY, n0 = n1 + dy * signY;
9900                     mode = MODE_CENTER;
9901                     move();
9902                   }
9903                   break;
9904                 }
9905                 case 32: { // SPACE; takes priority over ALT
9906                   if (mode === MODE_HANDLE || mode === MODE_CENTER) {
9907                     if (signX < 0) e0 = e1 - dx; else if (signX > 0) w0 = w1 - dx;
9908                     if (signY < 0) s0 = s1 - dy; else if (signY > 0) n0 = n1 - dy;
9909                     mode = MODE_SPACE;
9910                     overlay.attr("cursor", cursors.selection);
9911                     move();
9912                   }
9913                   break;
9914                 }
9915                 default: return;
9916               }
9917               noevent$1();
9918             }
9919
9920             function keyupped() {
9921               switch (event.keyCode) {
9922                 case 16: { // SHIFT
9923                   if (shifting) {
9924                     lockX = lockY = shifting = false;
9925                     move();
9926                   }
9927                   break;
9928                 }
9929                 case 18: { // ALT
9930                   if (mode === MODE_CENTER) {
9931                     if (signX < 0) e0 = e1; else if (signX > 0) w0 = w1;
9932                     if (signY < 0) s0 = s1; else if (signY > 0) n0 = n1;
9933                     mode = MODE_HANDLE;
9934                     move();
9935                   }
9936                   break;
9937                 }
9938                 case 32: { // SPACE
9939                   if (mode === MODE_SPACE) {
9940                     if (event.altKey) {
9941                       if (signX) e0 = e1 - dx * signX, w0 = w1 + dx * signX;
9942                       if (signY) s0 = s1 - dy * signY, n0 = n1 + dy * signY;
9943                       mode = MODE_CENTER;
9944                     } else {
9945                       if (signX < 0) e0 = e1; else if (signX > 0) w0 = w1;
9946                       if (signY < 0) s0 = s1; else if (signY > 0) n0 = n1;
9947                       mode = MODE_HANDLE;
9948                     }
9949                     overlay.attr("cursor", cursors[type]);
9950                     move();
9951                   }
9952                   break;
9953                 }
9954                 default: return;
9955               }
9956               noevent$1();
9957             }
9958           }
9959
9960           function initialize() {
9961             var state = this.__brush || {selection: null};
9962             state.extent = extent.apply(this, arguments);
9963             state.dim = dim;
9964             return state;
9965           }
9966
9967           brush.extent = function(_) {
9968             return arguments.length ? (extent = typeof _ === "function" ? _ : constant$4([[+_[0][0], +_[0][1]], [+_[1][0], +_[1][1]]]), brush) : extent;
9969           };
9970
9971           brush.filter = function(_) {
9972             return arguments.length ? (filter = typeof _ === "function" ? _ : constant$4(!!_), brush) : filter;
9973           };
9974
9975           brush.handleSize = function(_) {
9976             return arguments.length ? (handleSize = +_, brush) : handleSize;
9977           };
9978
9979           brush.on = function() {
9980             var value = listeners.on.apply(listeners, arguments);
9981             return value === listeners ? brush : value;
9982           };
9983
9984           return brush;
9985         }
9986
9987         var cos = Math.cos;
9988         var sin = Math.sin;
9989         var pi$1 = Math.PI;
9990         var halfPi$1 = pi$1 / 2;
9991         var tau$1 = pi$1 * 2;
9992         var max$3 = Math.max;
9993
9994         function compareValue(compare) {
9995           return function(a, b) {
9996             return compare(
9997               a.source.value + a.target.value,
9998               b.source.value + b.target.value
9999             );
10000           };
10001         }
10002
10003         function chord() {
10004           var padAngle = 0,
10005               sortGroups = null,
10006               sortSubgroups = null,
10007               sortChords = null;
10008
10009           function chord(matrix) {
10010             var n = matrix.length,
10011                 groupSums = [],
10012                 groupIndex = d3_range(n),
10013                 subgroupIndex = [],
10014                 chords = [],
10015                 groups = chords.groups = new Array(n),
10016                 subgroups = new Array(n * n),
10017                 k,
10018                 x,
10019                 x0,
10020                 dx,
10021                 i,
10022                 j;
10023
10024             // Compute the sum.
10025             k = 0, i = -1; while (++i < n) {
10026               x = 0, j = -1; while (++j < n) {
10027                 x += matrix[i][j];
10028               }
10029               groupSums.push(x);
10030               subgroupIndex.push(d3_range(n));
10031               k += x;
10032             }
10033
10034             // Sort groups…
10035             if (sortGroups) groupIndex.sort(function(a, b) {
10036               return sortGroups(groupSums[a], groupSums[b]);
10037             });
10038
10039             // Sort subgroups…
10040             if (sortSubgroups) subgroupIndex.forEach(function(d, i) {
10041               d.sort(function(a, b) {
10042                 return sortSubgroups(matrix[i][a], matrix[i][b]);
10043               });
10044             });
10045
10046             // Convert the sum to scaling factor for [0, 2pi].
10047             // TODO Allow start and end angle to be specified?
10048             // TODO Allow padding to be specified as percentage?
10049             k = max$3(0, tau$1 - padAngle * n) / k;
10050             dx = k ? padAngle : tau$1 / n;
10051
10052             // Compute the start and end angle for each group and subgroup.
10053             // Note: Opera has a bug reordering object literal properties!
10054             x = 0, i = -1; while (++i < n) {
10055               x0 = x, j = -1; while (++j < n) {
10056                 var di = groupIndex[i],
10057                     dj = subgroupIndex[di][j],
10058                     v = matrix[di][dj],
10059                     a0 = x,
10060                     a1 = x += v * k;
10061                 subgroups[dj * n + di] = {
10062                   index: di,
10063                   subindex: dj,
10064                   startAngle: a0,
10065                   endAngle: a1,
10066                   value: v
10067                 };
10068               }
10069               groups[di] = {
10070                 index: di,
10071                 startAngle: x0,
10072                 endAngle: x,
10073                 value: groupSums[di]
10074               };
10075               x += dx;
10076             }
10077
10078             // Generate chords for each (non-empty) subgroup-subgroup link.
10079             i = -1; while (++i < n) {
10080               j = i - 1; while (++j < n) {
10081                 var source = subgroups[j * n + i],
10082                     target = subgroups[i * n + j];
10083                 if (source.value || target.value) {
10084                   chords.push(source.value < target.value
10085                       ? {source: target, target: source}
10086                       : {source: source, target: target});
10087                 }
10088               }
10089             }
10090
10091             return sortChords ? chords.sort(sortChords) : chords;
10092           }
10093
10094           chord.padAngle = function(_) {
10095             return arguments.length ? (padAngle = max$3(0, _), chord) : padAngle;
10096           };
10097
10098           chord.sortGroups = function(_) {
10099             return arguments.length ? (sortGroups = _, chord) : sortGroups;
10100           };
10101
10102           chord.sortSubgroups = function(_) {
10103             return arguments.length ? (sortSubgroups = _, chord) : sortSubgroups;
10104           };
10105
10106           chord.sortChords = function(_) {
10107             return arguments.length ? (_ == null ? sortChords = null : (sortChords = compareValue(_))._ = _, chord) : sortChords && sortChords._;
10108           };
10109
10110           return chord;
10111         }
10112
10113         var slice$6 = Array.prototype.slice;
10114
10115         function constant$5(x) {
10116           return function() {
10117             return x;
10118           };
10119         }
10120
10121         var pi$2 = Math.PI,
10122             tau$2 = 2 * pi$2,
10123             epsilon$1 = 1e-6,
10124             tauEpsilon = tau$2 - epsilon$1;
10125
10126         function Path() {
10127           this._x0 = this._y0 = // start of current subpath
10128           this._x1 = this._y1 = null; // end of current subpath
10129           this._ = "";
10130         }
10131
10132         function path() {
10133           return new Path;
10134         }
10135
10136         Path.prototype = path.prototype = {
10137           constructor: Path,
10138           moveTo: function(x, y) {
10139             this._ += "M" + (this._x0 = this._x1 = +x) + "," + (this._y0 = this._y1 = +y);
10140           },
10141           closePath: function() {
10142             if (this._x1 !== null) {
10143               this._x1 = this._x0, this._y1 = this._y0;
10144               this._ += "Z";
10145             }
10146           },
10147           lineTo: function(x, y) {
10148             this._ += "L" + (this._x1 = +x) + "," + (this._y1 = +y);
10149           },
10150           quadraticCurveTo: function(x1, y1, x, y) {
10151             this._ += "Q" + (+x1) + "," + (+y1) + "," + (this._x1 = +x) + "," + (this._y1 = +y);
10152           },
10153           bezierCurveTo: function(x1, y1, x2, y2, x, y) {
10154             this._ += "C" + (+x1) + "," + (+y1) + "," + (+x2) + "," + (+y2) + "," + (this._x1 = +x) + "," + (this._y1 = +y);
10155           },
10156           arcTo: function(x1, y1, x2, y2, r) {
10157             x1 = +x1, y1 = +y1, x2 = +x2, y2 = +y2, r = +r;
10158             var x0 = this._x1,
10159                 y0 = this._y1,
10160                 x21 = x2 - x1,
10161                 y21 = y2 - y1,
10162                 x01 = x0 - x1,
10163                 y01 = y0 - y1,
10164                 l01_2 = x01 * x01 + y01 * y01;
10165
10166             // Is the radius negative? Error.
10167             if (r < 0) throw new Error("negative radius: " + r);
10168
10169             // Is this path empty? Move to (x1,y1).
10170             if (this._x1 === null) {
10171               this._ += "M" + (this._x1 = x1) + "," + (this._y1 = y1);
10172             }
10173
10174             // Or, is (x1,y1) coincident with (x0,y0)? Do nothing.
10175             else if (!(l01_2 > epsilon$1));
10176
10177             // Or, are (x0,y0), (x1,y1) and (x2,y2) collinear?
10178             // Equivalently, is (x1,y1) coincident with (x2,y2)?
10179             // Or, is the radius zero? Line to (x1,y1).
10180             else if (!(Math.abs(y01 * x21 - y21 * x01) > epsilon$1) || !r) {
10181               this._ += "L" + (this._x1 = x1) + "," + (this._y1 = y1);
10182             }
10183
10184             // Otherwise, draw an arc!
10185             else {
10186               var x20 = x2 - x0,
10187                   y20 = y2 - y0,
10188                   l21_2 = x21 * x21 + y21 * y21,
10189                   l20_2 = x20 * x20 + y20 * y20,
10190                   l21 = Math.sqrt(l21_2),
10191                   l01 = Math.sqrt(l01_2),
10192                   l = r * Math.tan((pi$2 - Math.acos((l21_2 + l01_2 - l20_2) / (2 * l21 * l01))) / 2),
10193                   t01 = l / l01,
10194                   t21 = l / l21;
10195
10196               // If the start tangent is not coincident with (x0,y0), line to.
10197               if (Math.abs(t01 - 1) > epsilon$1) {
10198                 this._ += "L" + (x1 + t01 * x01) + "," + (y1 + t01 * y01);
10199               }
10200
10201               this._ += "A" + r + "," + r + ",0,0," + (+(y01 * x20 > x01 * y20)) + "," + (this._x1 = x1 + t21 * x21) + "," + (this._y1 = y1 + t21 * y21);
10202             }
10203           },
10204           arc: function(x, y, r, a0, a1, ccw) {
10205             x = +x, y = +y, r = +r;
10206             var dx = r * Math.cos(a0),
10207                 dy = r * Math.sin(a0),
10208                 x0 = x + dx,
10209                 y0 = y + dy,
10210                 cw = 1 ^ ccw,
10211                 da = ccw ? a0 - a1 : a1 - a0;
10212
10213             // Is the radius negative? Error.
10214             if (r < 0) throw new Error("negative radius: " + r);
10215
10216             // Is this path empty? Move to (x0,y0).
10217             if (this._x1 === null) {
10218               this._ += "M" + x0 + "," + y0;
10219             }
10220
10221             // Or, is (x0,y0) not coincident with the previous point? Line to (x0,y0).
10222             else if (Math.abs(this._x1 - x0) > epsilon$1 || Math.abs(this._y1 - y0) > epsilon$1) {
10223               this._ += "L" + x0 + "," + y0;
10224             }
10225
10226             // Is this arc empty? We’re done.
10227             if (!r) return;
10228
10229             // Does the angle go the wrong way? Flip the direction.
10230             if (da < 0) da = da % tau$2 + tau$2;
10231
10232             // Is this a complete circle? Draw two arcs to complete the circle.
10233             if (da > tauEpsilon) {
10234               this._ += "A" + r + "," + r + ",0,1," + cw + "," + (x - dx) + "," + (y - dy) + "A" + r + "," + r + ",0,1," + cw + "," + (this._x1 = x0) + "," + (this._y1 = y0);
10235             }
10236
10237             // Is this arc non-empty? Draw an arc!
10238             else if (da > epsilon$1) {
10239               this._ += "A" + r + "," + r + ",0," + (+(da >= pi$2)) + "," + cw + "," + (this._x1 = x + r * Math.cos(a1)) + "," + (this._y1 = y + r * Math.sin(a1));
10240             }
10241           },
10242           rect: function(x, y, w, h) {
10243             this._ += "M" + (this._x0 = this._x1 = +x) + "," + (this._y0 = this._y1 = +y) + "h" + (+w) + "v" + (+h) + "h" + (-w) + "Z";
10244           },
10245           toString: function() {
10246             return this._;
10247           }
10248         };
10249
10250         function defaultSource(d) {
10251           return d.source;
10252         }
10253
10254         function defaultTarget(d) {
10255           return d.target;
10256         }
10257
10258         function defaultRadius(d) {
10259           return d.radius;
10260         }
10261
10262         function defaultStartAngle(d) {
10263           return d.startAngle;
10264         }
10265
10266         function defaultEndAngle(d) {
10267           return d.endAngle;
10268         }
10269
10270         function ribbon() {
10271           var source = defaultSource,
10272               target = defaultTarget,
10273               radius = defaultRadius,
10274               startAngle = defaultStartAngle,
10275               endAngle = defaultEndAngle,
10276               context = null;
10277
10278           function ribbon() {
10279             var buffer,
10280                 argv = slice$6.call(arguments),
10281                 s = source.apply(this, argv),
10282                 t = target.apply(this, argv),
10283                 sr = +radius.apply(this, (argv[0] = s, argv)),
10284                 sa0 = startAngle.apply(this, argv) - halfPi$1,
10285                 sa1 = endAngle.apply(this, argv) - halfPi$1,
10286                 sx0 = sr * cos(sa0),
10287                 sy0 = sr * sin(sa0),
10288                 tr = +radius.apply(this, (argv[0] = t, argv)),
10289                 ta0 = startAngle.apply(this, argv) - halfPi$1,
10290                 ta1 = endAngle.apply(this, argv) - halfPi$1;
10291
10292             if (!context) context = buffer = path();
10293
10294             context.moveTo(sx0, sy0);
10295             context.arc(0, 0, sr, sa0, sa1);
10296             if (sa0 !== ta0 || sa1 !== ta1) { // TODO sr !== tr?
10297               context.quadraticCurveTo(0, 0, tr * cos(ta0), tr * sin(ta0));
10298               context.arc(0, 0, tr, ta0, ta1);
10299             }
10300             context.quadraticCurveTo(0, 0, sx0, sy0);
10301             context.closePath();
10302
10303             if (buffer) return context = null, buffer + "" || null;
10304           }
10305
10306           ribbon.radius = function(_) {
10307             return arguments.length ? (radius = typeof _ === "function" ? _ : constant$5(+_), ribbon) : radius;
10308           };
10309
10310           ribbon.startAngle = function(_) {
10311             return arguments.length ? (startAngle = typeof _ === "function" ? _ : constant$5(+_), ribbon) : startAngle;
10312           };
10313
10314           ribbon.endAngle = function(_) {
10315             return arguments.length ? (endAngle = typeof _ === "function" ? _ : constant$5(+_), ribbon) : endAngle;
10316           };
10317
10318           ribbon.source = function(_) {
10319             return arguments.length ? (source = _, ribbon) : source;
10320           };
10321
10322           ribbon.target = function(_) {
10323             return arguments.length ? (target = _, ribbon) : target;
10324           };
10325
10326           ribbon.context = function(_) {
10327             return arguments.length ? ((context = _ == null ? null : _), ribbon) : context;
10328           };
10329
10330           return ribbon;
10331         }
10332
10333         var prefix = "$";
10334
10335         function Map$1() {}
10336
10337         Map$1.prototype = map$3.prototype = {
10338           constructor: Map$1,
10339           has: function(key) {
10340             return (prefix + key) in this;
10341           },
10342           get: function(key) {
10343             return this[prefix + key];
10344           },
10345           set: function(key, value) {
10346             this[prefix + key] = value;
10347             return this;
10348           },
10349           remove: function(key) {
10350             var property = prefix + key;
10351             return property in this && delete this[property];
10352           },
10353           clear: function() {
10354             for (var property in this) if (property[0] === prefix) delete this[property];
10355           },
10356           keys: function() {
10357             var keys = [];
10358             for (var property in this) if (property[0] === prefix) keys.push(property.slice(1));
10359             return keys;
10360           },
10361           values: function() {
10362             var values = [];
10363             for (var property in this) if (property[0] === prefix) values.push(this[property]);
10364             return values;
10365           },
10366           entries: function() {
10367             var entries = [];
10368             for (var property in this) if (property[0] === prefix) entries.push({key: property.slice(1), value: this[property]});
10369             return entries;
10370           },
10371           size: function() {
10372             var size = 0;
10373             for (var property in this) if (property[0] === prefix) ++size;
10374             return size;
10375           },
10376           empty: function() {
10377             for (var property in this) if (property[0] === prefix) return false;
10378             return true;
10379           },
10380           each: function(f) {
10381             for (var property in this) if (property[0] === prefix) f(this[property], property.slice(1), this);
10382           }
10383         };
10384
10385         function map$3(object, f) {
10386           var map = new Map$1;
10387
10388           // Copy constructor.
10389           if (object instanceof Map$1) object.each(function(value, key) { map.set(key, value); });
10390
10391           // Index array by numeric index or specified key function.
10392           else if (Array.isArray(object)) {
10393             var i = -1,
10394                 n = object.length,
10395                 o;
10396
10397             if (f == null) while (++i < n) map.set(i, object[i]);
10398             else while (++i < n) map.set(f(o = object[i], i, object), o);
10399           }
10400
10401           // Convert object to map.
10402           else if (object) for (var key in object) map.set(key, object[key]);
10403
10404           return map;
10405         }
10406
10407         function nest() {
10408           var keys = [],
10409               sortKeys = [],
10410               sortValues,
10411               rollup,
10412               nest;
10413
10414           function apply(array, depth, createResult, setResult) {
10415             if (depth >= keys.length) {
10416               if (sortValues != null) array.sort(sortValues);
10417               return rollup != null ? rollup(array) : array;
10418             }
10419
10420             var i = -1,
10421                 n = array.length,
10422                 key = keys[depth++],
10423                 keyValue,
10424                 value,
10425                 valuesByKey = map$3(),
10426                 values,
10427                 result = createResult();
10428
10429             while (++i < n) {
10430               if (values = valuesByKey.get(keyValue = key(value = array[i]) + "")) {
10431                 values.push(value);
10432               } else {
10433                 valuesByKey.set(keyValue, [value]);
10434               }
10435             }
10436
10437             valuesByKey.each(function(values, key) {
10438               setResult(result, key, apply(values, depth, createResult, setResult));
10439             });
10440
10441             return result;
10442           }
10443
10444           function entries(map, depth) {
10445             if (++depth > keys.length) return map;
10446             var array, sortKey = sortKeys[depth - 1];
10447             if (rollup != null && depth >= keys.length) array = map.entries();
10448             else array = [], map.each(function(v, k) { array.push({key: k, values: entries(v, depth)}); });
10449             return sortKey != null ? array.sort(function(a, b) { return sortKey(a.key, b.key); }) : array;
10450           }
10451
10452           return nest = {
10453             object: function(array) { return apply(array, 0, createObject, setObject); },
10454             map: function(array) { return apply(array, 0, createMap, setMap); },
10455             entries: function(array) { return entries(apply(array, 0, createMap, setMap), 0); },
10456             key: function(d) { keys.push(d); return nest; },
10457             sortKeys: function(order) { sortKeys[keys.length - 1] = order; return nest; },
10458             sortValues: function(order) { sortValues = order; return nest; },
10459             rollup: function(f) { rollup = f; return nest; }
10460           };
10461         }
10462
10463         function createObject() {
10464           return {};
10465         }
10466
10467         function setObject(object, key, value) {
10468           object[key] = value;
10469         }
10470
10471         function createMap() {
10472           return map$3();
10473         }
10474
10475         function setMap(map, key, value) {
10476           map.set(key, value);
10477         }
10478
10479         function Set$1() {}
10480
10481         var proto = map$3.prototype;
10482
10483         Set$1.prototype = set$2.prototype = {
10484           constructor: Set$1,
10485           has: proto.has,
10486           add: function(value) {
10487             value += "";
10488             this[prefix + value] = value;
10489             return this;
10490           },
10491           remove: proto.remove,
10492           clear: proto.clear,
10493           values: proto.keys,
10494           size: proto.size,
10495           empty: proto.empty,
10496           each: proto.each
10497         };
10498
10499         function set$2(object, f) {
10500           var set = new Set$1;
10501
10502           // Copy constructor.
10503           if (object instanceof Set$1) object.each(function(value) { set.add(value); });
10504
10505           // Otherwise, assume it’s an array.
10506           else if (object) {
10507             var i = -1, n = object.length;
10508             if (f == null) while (++i < n) set.add(object[i]);
10509             else while (++i < n) set.add(f(object[i], i, object));
10510           }
10511
10512           return set;
10513         }
10514
10515         function keys$3(map) {
10516           var keys = [];
10517           for (var key in map) keys.push(key);
10518           return keys;
10519         }
10520
10521         function values(map) {
10522           var values = [];
10523           for (var key in map) values.push(map[key]);
10524           return values;
10525         }
10526
10527         function entries(map) {
10528           var entries = [];
10529           for (var key in map) entries.push({key: key, value: map[key]});
10530           return entries;
10531         }
10532
10533         var array$3 = Array.prototype;
10534
10535         var slice$7 = array$3.slice;
10536
10537         function ascending$1(a, b) {
10538           return a - b;
10539         }
10540
10541         function area(ring) {
10542           var i = 0, n = ring.length, area = ring[n - 1][1] * ring[0][0] - ring[n - 1][0] * ring[0][1];
10543           while (++i < n) area += ring[i - 1][1] * ring[i][0] - ring[i - 1][0] * ring[i][1];
10544           return area;
10545         }
10546
10547         function constant$6(x) {
10548           return function() {
10549             return x;
10550           };
10551         }
10552
10553         function contains$1(ring, hole) {
10554           var i = -1, n = hole.length, c;
10555           while (++i < n) if (c = ringContains(ring, hole[i])) return c;
10556           return 0;
10557         }
10558
10559         function ringContains(ring, point) {
10560           var x = point[0], y = point[1], contains = -1;
10561           for (var i = 0, n = ring.length, j = n - 1; i < n; j = i++) {
10562             var pi = ring[i], xi = pi[0], yi = pi[1], pj = ring[j], xj = pj[0], yj = pj[1];
10563             if (segmentContains(pi, pj, point)) return 0;
10564             if (((yi > y) !== (yj > y)) && ((x < (xj - xi) * (y - yi) / (yj - yi) + xi))) contains = -contains;
10565           }
10566           return contains;
10567         }
10568
10569         function segmentContains(a, b, c) {
10570           var i; return collinear(a, b, c) && within(a[i = +(a[0] === b[0])], c[i], b[i]);
10571         }
10572
10573         function collinear(a, b, c) {
10574           return (b[0] - a[0]) * (c[1] - a[1]) === (c[0] - a[0]) * (b[1] - a[1]);
10575         }
10576
10577         function within(p, q, r) {
10578           return p <= q && q <= r || r <= q && q <= p;
10579         }
10580
10581         function noop$3() {}
10582
10583         var cases = [
10584           [],
10585           [[[1.0, 1.5], [0.5, 1.0]]],
10586           [[[1.5, 1.0], [1.0, 1.5]]],
10587           [[[1.5, 1.0], [0.5, 1.0]]],
10588           [[[1.0, 0.5], [1.5, 1.0]]],
10589           [[[1.0, 1.5], [0.5, 1.0]], [[1.0, 0.5], [1.5, 1.0]]],
10590           [[[1.0, 0.5], [1.0, 1.5]]],
10591           [[[1.0, 0.5], [0.5, 1.0]]],
10592           [[[0.5, 1.0], [1.0, 0.5]]],
10593           [[[1.0, 1.5], [1.0, 0.5]]],
10594           [[[0.5, 1.0], [1.0, 0.5]], [[1.5, 1.0], [1.0, 1.5]]],
10595           [[[1.5, 1.0], [1.0, 0.5]]],
10596           [[[0.5, 1.0], [1.5, 1.0]]],
10597           [[[1.0, 1.5], [1.5, 1.0]]],
10598           [[[0.5, 1.0], [1.0, 1.5]]],
10599           []
10600         ];
10601
10602         function contours() {
10603           var dx = 1,
10604               dy = 1,
10605               threshold = thresholdSturges,
10606               smooth = smoothLinear;
10607
10608           function contours(values) {
10609             var tz = threshold(values);
10610
10611             // Convert number of thresholds into uniform thresholds.
10612             if (!Array.isArray(tz)) {
10613               var domain = extent(values), start = domain[0], stop = domain[1];
10614               tz = tickStep(start, stop, tz);
10615               tz = d3_range(Math.floor(start / tz) * tz, Math.floor(stop / tz) * tz, tz);
10616             } else {
10617               tz = tz.slice().sort(ascending$1);
10618             }
10619
10620             return tz.map(function(value) {
10621               return contour(values, value);
10622             });
10623           }
10624
10625           // Accumulate, smooth contour rings, assign holes to exterior rings.
10626           // Based on https://github.com/mbostock/shapefile/blob/v0.6.2/shp/polygon.js
10627           function contour(values, value) {
10628             var polygons = [],
10629                 holes = [];
10630
10631             isorings(values, value, function(ring) {
10632               smooth(ring, values, value);
10633               if (area(ring) > 0) polygons.push([ring]);
10634               else holes.push(ring);
10635             });
10636
10637             holes.forEach(function(hole) {
10638               for (var i = 0, n = polygons.length, polygon; i < n; ++i) {
10639                 if (contains$1((polygon = polygons[i])[0], hole) !== -1) {
10640                   polygon.push(hole);
10641                   return;
10642                 }
10643               }
10644             });
10645
10646             return {
10647               type: "MultiPolygon",
10648               value: value,
10649               coordinates: polygons
10650             };
10651           }
10652
10653           // Marching squares with isolines stitched into rings.
10654           // Based on https://github.com/topojson/topojson-client/blob/v3.0.0/src/stitch.js
10655           function isorings(values, value, callback) {
10656             var fragmentByStart = new Array,
10657                 fragmentByEnd = new Array,
10658                 x, y, t0, t1, t2, t3;
10659
10660             // Special case for the first row (y = -1, t2 = t3 = 0).
10661             x = y = -1;
10662             t1 = values[0] >= value;
10663             cases[t1 << 1].forEach(stitch);
10664             while (++x < dx - 1) {
10665               t0 = t1, t1 = values[x + 1] >= value;
10666               cases[t0 | t1 << 1].forEach(stitch);
10667             }
10668             cases[t1 << 0].forEach(stitch);
10669
10670             // General case for the intermediate rows.
10671             while (++y < dy - 1) {
10672               x = -1;
10673               t1 = values[y * dx + dx] >= value;
10674               t2 = values[y * dx] >= value;
10675               cases[t1 << 1 | t2 << 2].forEach(stitch);
10676               while (++x < dx - 1) {
10677                 t0 = t1, t1 = values[y * dx + dx + x + 1] >= value;
10678                 t3 = t2, t2 = values[y * dx + x + 1] >= value;
10679                 cases[t0 | t1 << 1 | t2 << 2 | t3 << 3].forEach(stitch);
10680               }
10681               cases[t1 | t2 << 3].forEach(stitch);
10682             }
10683
10684             // Special case for the last row (y = dy - 1, t0 = t1 = 0).
10685             x = -1;
10686             t2 = values[y * dx] >= value;
10687             cases[t2 << 2].forEach(stitch);
10688             while (++x < dx - 1) {
10689               t3 = t2, t2 = values[y * dx + x + 1] >= value;
10690               cases[t2 << 2 | t3 << 3].forEach(stitch);
10691             }
10692             cases[t2 << 3].forEach(stitch);
10693
10694             function stitch(line) {
10695               var start = [line[0][0] + x, line[0][1] + y],
10696                   end = [line[1][0] + x, line[1][1] + y],
10697                   startIndex = index(start),
10698                   endIndex = index(end),
10699                   f, g;
10700               if (f = fragmentByEnd[startIndex]) {
10701                 if (g = fragmentByStart[endIndex]) {
10702                   delete fragmentByEnd[f.end];
10703                   delete fragmentByStart[g.start];
10704                   if (f === g) {
10705                     f.ring.push(end);
10706                     callback(f.ring);
10707                   } else {
10708                     fragmentByStart[f.start] = fragmentByEnd[g.end] = {start: f.start, end: g.end, ring: f.ring.concat(g.ring)};
10709                   }
10710                 } else {
10711                   delete fragmentByEnd[f.end];
10712                   f.ring.push(end);
10713                   fragmentByEnd[f.end = endIndex] = f;
10714                 }
10715               } else if (f = fragmentByStart[endIndex]) {
10716                 if (g = fragmentByEnd[startIndex]) {
10717                   delete fragmentByStart[f.start];
10718                   delete fragmentByEnd[g.end];
10719                   if (f === g) {
10720                     f.ring.push(end);
10721                     callback(f.ring);
10722                   } else {
10723                     fragmentByStart[g.start] = fragmentByEnd[f.end] = {start: g.start, end: f.end, ring: g.ring.concat(f.ring)};
10724                   }
10725                 } else {
10726                   delete fragmentByStart[f.start];
10727                   f.ring.unshift(start);
10728                   fragmentByStart[f.start = startIndex] = f;
10729                 }
10730               } else {
10731                 fragmentByStart[startIndex] = fragmentByEnd[endIndex] = {start: startIndex, end: endIndex, ring: [start, end]};
10732               }
10733             }
10734           }
10735
10736           function index(point) {
10737             return point[0] * 2 + point[1] * (dx + 1) * 4;
10738           }
10739
10740           function smoothLinear(ring, values, value) {
10741             ring.forEach(function(point) {
10742               var x = point[0],
10743                   y = point[1],
10744                   xt = x | 0,
10745                   yt = y | 0,
10746                   v0,
10747                   v1 = values[yt * dx + xt];
10748               if (x > 0 && x < dx && xt === x) {
10749                 v0 = values[yt * dx + xt - 1];
10750                 point[0] = x + (value - v0) / (v1 - v0) - 0.5;
10751               }
10752               if (y > 0 && y < dy && yt === y) {
10753                 v0 = values[(yt - 1) * dx + xt];
10754                 point[1] = y + (value - v0) / (v1 - v0) - 0.5;
10755               }
10756             });
10757           }
10758
10759           contours.contour = contour;
10760
10761           contours.size = function(_) {
10762             if (!arguments.length) return [dx, dy];
10763             var _0 = Math.ceil(_[0]), _1 = Math.ceil(_[1]);
10764             if (!(_0 > 0) || !(_1 > 0)) throw new Error("invalid size");
10765             return dx = _0, dy = _1, contours;
10766           };
10767
10768           contours.thresholds = function(_) {
10769             return arguments.length ? (threshold = typeof _ === "function" ? _ : Array.isArray(_) ? constant$6(slice$7.call(_)) : constant$6(_), contours) : threshold;
10770           };
10771
10772           contours.smooth = function(_) {
10773             return arguments.length ? (smooth = _ ? smoothLinear : noop$3, contours) : smooth === smoothLinear;
10774           };
10775
10776           return contours;
10777         }
10778
10779         // TODO Optimize edge cases.
10780         // TODO Optimize index calculation.
10781         // TODO Optimize arguments.
10782         function blurX(source, target, r) {
10783           var n = source.width,
10784               m = source.height,
10785               w = (r << 1) + 1;
10786           for (var j = 0; j < m; ++j) {
10787             for (var i = 0, sr = 0; i < n + r; ++i) {
10788               if (i < n) {
10789                 sr += source.data[i + j * n];
10790               }
10791               if (i >= r) {
10792                 if (i >= w) {
10793                   sr -= source.data[i - w + j * n];
10794                 }
10795                 target.data[i - r + j * n] = sr / Math.min(i + 1, n - 1 + w - i, w);
10796               }
10797             }
10798           }
10799         }
10800
10801         // TODO Optimize edge cases.
10802         // TODO Optimize index calculation.
10803         // TODO Optimize arguments.
10804         function blurY(source, target, r) {
10805           var n = source.width,
10806               m = source.height,
10807               w = (r << 1) + 1;
10808           for (var i = 0; i < n; ++i) {
10809             for (var j = 0, sr = 0; j < m + r; ++j) {
10810               if (j < m) {
10811                 sr += source.data[i + j * n];
10812               }
10813               if (j >= r) {
10814                 if (j >= w) {
10815                   sr -= source.data[i + (j - w) * n];
10816                 }
10817                 target.data[i + (j - r) * n] = sr / Math.min(j + 1, m - 1 + w - j, w);
10818               }
10819             }
10820           }
10821         }
10822
10823         function defaultX(d) {
10824           return d[0];
10825         }
10826
10827         function defaultY(d) {
10828           return d[1];
10829         }
10830
10831         function defaultWeight() {
10832           return 1;
10833         }
10834
10835         function density() {
10836           var x = defaultX,
10837               y = defaultY,
10838               weight = defaultWeight,
10839               dx = 960,
10840               dy = 500,
10841               r = 20, // blur radius
10842               k = 2, // log2(grid cell size)
10843               o = r * 3, // grid offset, to pad for blur
10844               n = (dx + o * 2) >> k, // grid width
10845               m = (dy + o * 2) >> k, // grid height
10846               threshold = constant$6(20);
10847
10848           function density(data) {
10849             var values0 = new Float32Array(n * m),
10850                 values1 = new Float32Array(n * m);
10851
10852             data.forEach(function(d, i, data) {
10853               var xi = (+x(d, i, data) + o) >> k,
10854                   yi = (+y(d, i, data) + o) >> k,
10855                   wi = +weight(d, i, data);
10856               if (xi >= 0 && xi < n && yi >= 0 && yi < m) {
10857                 values0[xi + yi * n] += wi;
10858               }
10859             });
10860
10861             // TODO Optimize.
10862             blurX({width: n, height: m, data: values0}, {width: n, height: m, data: values1}, r >> k);
10863             blurY({width: n, height: m, data: values1}, {width: n, height: m, data: values0}, r >> k);
10864             blurX({width: n, height: m, data: values0}, {width: n, height: m, data: values1}, r >> k);
10865             blurY({width: n, height: m, data: values1}, {width: n, height: m, data: values0}, r >> k);
10866             blurX({width: n, height: m, data: values0}, {width: n, height: m, data: values1}, r >> k);
10867             blurY({width: n, height: m, data: values1}, {width: n, height: m, data: values0}, r >> k);
10868
10869             var tz = threshold(values0);
10870
10871             // Convert number of thresholds into uniform thresholds.
10872             if (!Array.isArray(tz)) {
10873               var stop = max$2(values0);
10874               tz = tickStep(0, stop, tz);
10875               tz = d3_range(0, Math.floor(stop / tz) * tz, tz);
10876               tz.shift();
10877             }
10878
10879             return contours()
10880                 .thresholds(tz)
10881                 .size([n, m])
10882               (values0)
10883                 .map(transform);
10884           }
10885
10886           function transform(geometry) {
10887             geometry.value *= Math.pow(2, -2 * k); // Density in points per square pixel.
10888             geometry.coordinates.forEach(transformPolygon);
10889             return geometry;
10890           }
10891
10892           function transformPolygon(coordinates) {
10893             coordinates.forEach(transformRing);
10894           }
10895
10896           function transformRing(coordinates) {
10897             coordinates.forEach(transformPoint);
10898           }
10899
10900           // TODO Optimize.
10901           function transformPoint(coordinates) {
10902             coordinates[0] = coordinates[0] * Math.pow(2, k) - o;
10903             coordinates[1] = coordinates[1] * Math.pow(2, k) - o;
10904           }
10905
10906           function resize() {
10907             o = r * 3;
10908             n = (dx + o * 2) >> k;
10909             m = (dy + o * 2) >> k;
10910             return density;
10911           }
10912
10913           density.x = function(_) {
10914             return arguments.length ? (x = typeof _ === "function" ? _ : constant$6(+_), density) : x;
10915           };
10916
10917           density.y = function(_) {
10918             return arguments.length ? (y = typeof _ === "function" ? _ : constant$6(+_), density) : y;
10919           };
10920
10921           density.weight = function(_) {
10922             return arguments.length ? (weight = typeof _ === "function" ? _ : constant$6(+_), density) : weight;
10923           };
10924
10925           density.size = function(_) {
10926             if (!arguments.length) return [dx, dy];
10927             var _0 = Math.ceil(_[0]), _1 = Math.ceil(_[1]);
10928             if (!(_0 >= 0) && !(_0 >= 0)) throw new Error("invalid size");
10929             return dx = _0, dy = _1, resize();
10930           };
10931
10932           density.cellSize = function(_) {
10933             if (!arguments.length) return 1 << k;
10934             if (!((_ = +_) >= 1)) throw new Error("invalid cell size");
10935             return k = Math.floor(Math.log(_) / Math.LN2), resize();
10936           };
10937
10938           density.thresholds = function(_) {
10939             return arguments.length ? (threshold = typeof _ === "function" ? _ : Array.isArray(_) ? constant$6(slice$7.call(_)) : constant$6(_), density) : threshold;
10940           };
10941
10942           density.bandwidth = function(_) {
10943             if (!arguments.length) return Math.sqrt(r * (r + 1));
10944             if (!((_ = +_) >= 0)) throw new Error("invalid bandwidth");
10945             return r = Math.round((Math.sqrt(4 * _ * _ + 1) - 1) / 2), resize();
10946           };
10947
10948           return density;
10949         }
10950
10951         var EOL = {},
10952             EOF = {},
10953             QUOTE = 34,
10954             NEWLINE = 10,
10955             RETURN = 13;
10956
10957         function objectConverter(columns) {
10958           return new Function("d", "return {" + columns.map(function(name, i) {
10959             return JSON.stringify(name) + ": d[" + i + "]";
10960           }).join(",") + "}");
10961         }
10962
10963         function customConverter(columns, f) {
10964           var object = objectConverter(columns);
10965           return function(row, i) {
10966             return f(object(row), i, columns);
10967           };
10968         }
10969
10970         // Compute unique columns in order of discovery.
10971         function inferColumns(rows) {
10972           var columnSet = Object.create(null),
10973               columns = [];
10974
10975           rows.forEach(function(row) {
10976             for (var column in row) {
10977               if (!(column in columnSet)) {
10978                 columns.push(columnSet[column] = column);
10979               }
10980             }
10981           });
10982
10983           return columns;
10984         }
10985
10986         function pad(value, width) {
10987           var s = value + "", length = s.length;
10988           return length < width ? new Array(width - length + 1).join(0) + s : s;
10989         }
10990
10991         function formatYear(year) {
10992           return year < 0 ? "-" + pad(-year, 6)
10993             : year > 9999 ? "+" + pad(year, 6)
10994             : pad(year, 4);
10995         }
10996
10997         function formatDate(date) {
10998           var hours = date.getUTCHours(),
10999               minutes = date.getUTCMinutes(),
11000               seconds = date.getUTCSeconds(),
11001               milliseconds = date.getUTCMilliseconds();
11002           return isNaN(date) ? "Invalid Date"
11003               : formatYear(date.getUTCFullYear(), 4) + "-" + pad(date.getUTCMonth() + 1, 2) + "-" + pad(date.getUTCDate(), 2)
11004               + (milliseconds ? "T" + pad(hours, 2) + ":" + pad(minutes, 2) + ":" + pad(seconds, 2) + "." + pad(milliseconds, 3) + "Z"
11005               : seconds ? "T" + pad(hours, 2) + ":" + pad(minutes, 2) + ":" + pad(seconds, 2) + "Z"
11006               : minutes || hours ? "T" + pad(hours, 2) + ":" + pad(minutes, 2) + "Z"
11007               : "");
11008         }
11009
11010         function dsvFormat(delimiter) {
11011           var reFormat = new RegExp("[\"" + delimiter + "\n\r]"),
11012               DELIMITER = delimiter.charCodeAt(0);
11013
11014           function parse(text, f) {
11015             var convert, columns, rows = parseRows(text, function(row, i) {
11016               if (convert) return convert(row, i - 1);
11017               columns = row, convert = f ? customConverter(row, f) : objectConverter(row);
11018             });
11019             rows.columns = columns || [];
11020             return rows;
11021           }
11022
11023           function parseRows(text, f) {
11024             var rows = [], // output rows
11025                 N = text.length,
11026                 I = 0, // current character index
11027                 n = 0, // current line number
11028                 t, // current token
11029                 eof = N <= 0, // current token followed by EOF?
11030                 eol = false; // current token followed by EOL?
11031
11032             // Strip the trailing newline.
11033             if (text.charCodeAt(N - 1) === NEWLINE) --N;
11034             if (text.charCodeAt(N - 1) === RETURN) --N;
11035
11036             function token() {
11037               if (eof) return EOF;
11038               if (eol) return eol = false, EOL;
11039
11040               // Unescape quotes.
11041               var i, j = I, c;
11042               if (text.charCodeAt(j) === QUOTE) {
11043                 while (I++ < N && text.charCodeAt(I) !== QUOTE || text.charCodeAt(++I) === QUOTE);
11044                 if ((i = I) >= N) eof = true;
11045                 else if ((c = text.charCodeAt(I++)) === NEWLINE) eol = true;
11046                 else if (c === RETURN) { eol = true; if (text.charCodeAt(I) === NEWLINE) ++I; }
11047                 return text.slice(j + 1, i - 1).replace(/""/g, "\"");
11048               }
11049
11050               // Find next delimiter or newline.
11051               while (I < N) {
11052                 if ((c = text.charCodeAt(i = I++)) === NEWLINE) eol = true;
11053                 else if (c === RETURN) { eol = true; if (text.charCodeAt(I) === NEWLINE) ++I; }
11054                 else if (c !== DELIMITER) continue;
11055                 return text.slice(j, i);
11056               }
11057
11058               // Return last token before EOF.
11059               return eof = true, text.slice(j, N);
11060             }
11061
11062             while ((t = token()) !== EOF) {
11063               var row = [];
11064               while (t !== EOL && t !== EOF) row.push(t), t = token();
11065               if (f && (row = f(row, n++)) == null) continue;
11066               rows.push(row);
11067             }
11068
11069             return rows;
11070           }
11071
11072           function preformatBody(rows, columns) {
11073             return rows.map(function(row) {
11074               return columns.map(function(column) {
11075                 return formatValue(row[column]);
11076               }).join(delimiter);
11077             });
11078           }
11079
11080           function format(rows, columns) {
11081             if (columns == null) columns = inferColumns(rows);
11082             return [columns.map(formatValue).join(delimiter)].concat(preformatBody(rows, columns)).join("\n");
11083           }
11084
11085           function formatBody(rows, columns) {
11086             if (columns == null) columns = inferColumns(rows);
11087             return preformatBody(rows, columns).join("\n");
11088           }
11089
11090           function formatRows(rows) {
11091             return rows.map(formatRow).join("\n");
11092           }
11093
11094           function formatRow(row) {
11095             return row.map(formatValue).join(delimiter);
11096           }
11097
11098           function formatValue(value) {
11099             return value == null ? ""
11100                 : value instanceof Date ? formatDate(value)
11101                 : reFormat.test(value += "") ? "\"" + value.replace(/"/g, "\"\"") + "\""
11102                 : value;
11103           }
11104
11105           return {
11106             parse: parse,
11107             parseRows: parseRows,
11108             format: format,
11109             formatBody: formatBody,
11110             formatRows: formatRows
11111           };
11112         }
11113
11114         var csv = dsvFormat(",");
11115
11116         var csvParse = csv.parse;
11117         var csvParseRows = csv.parseRows;
11118         var csvFormat = csv.format;
11119         var csvFormatBody = csv.formatBody;
11120         var csvFormatRows = csv.formatRows;
11121
11122         var tsv = dsvFormat("\t");
11123
11124         var tsvParse = tsv.parse;
11125         var tsvParseRows = tsv.parseRows;
11126         var tsvFormat = tsv.format;
11127         var tsvFormatBody = tsv.formatBody;
11128         var tsvFormatRows = tsv.formatRows;
11129
11130         function autoType(object) {
11131           for (var key in object) {
11132             var value = object[key].trim(), number;
11133             if (!value) value = null;
11134             else if (value === "true") value = true;
11135             else if (value === "false") value = false;
11136             else if (value === "NaN") value = NaN;
11137             else if (!isNaN(number = +value)) value = number;
11138             else if (/^([-+]\d{2})?\d{4}(-\d{2}(-\d{2})?)?(T\d{2}:\d{2}(:\d{2}(\.\d{3})?)?(Z|[-+]\d{2}:\d{2})?)?$/.test(value)) value = new Date(value);
11139             else continue;
11140             object[key] = value;
11141           }
11142           return object;
11143         }
11144
11145         function responseBlob(response) {
11146           if (!response.ok) throw new Error(response.status + " " + response.statusText);
11147           return response.blob();
11148         }
11149
11150         function blob(input, init) {
11151           return fetch(input, init).then(responseBlob);
11152         }
11153
11154         function responseArrayBuffer(response) {
11155           if (!response.ok) throw new Error(response.status + " " + response.statusText);
11156           return response.arrayBuffer();
11157         }
11158
11159         function buffer(input, init) {
11160           return fetch(input, init).then(responseArrayBuffer);
11161         }
11162
11163         function responseText(response) {
11164           if (!response.ok) throw new Error(response.status + " " + response.statusText);
11165           return response.text();
11166         }
11167
11168         function d3_text(input, init) {
11169           return fetch(input, init).then(responseText);
11170         }
11171
11172         function dsvParse(parse) {
11173           return function(input, init, row) {
11174             if (arguments.length === 2 && typeof init === "function") row = init, init = undefined;
11175             return d3_text(input, init).then(function(response) {
11176               return parse(response, row);
11177             });
11178           };
11179         }
11180
11181         function dsv(delimiter, input, init, row) {
11182           if (arguments.length === 3 && typeof init === "function") row = init, init = undefined;
11183           var format = dsvFormat(delimiter);
11184           return d3_text(input, init).then(function(response) {
11185             return format.parse(response, row);
11186           });
11187         }
11188
11189         var csv$1 = dsvParse(csvParse);
11190         var tsv$1 = dsvParse(tsvParse);
11191
11192         function image(input, init) {
11193           return new Promise(function(resolve, reject) {
11194             var image = new Image;
11195             for (var key in init) image[key] = init[key];
11196             image.onerror = reject;
11197             image.onload = function() { resolve(image); };
11198             image.src = input;
11199           });
11200         }
11201
11202         function responseJson(response) {
11203           if (!response.ok) throw new Error(response.status + " " + response.statusText);
11204           return response.json();
11205         }
11206
11207         function d3_json(input, init) {
11208           return fetch(input, init).then(responseJson);
11209         }
11210
11211         function parser(type) {
11212           return function(input, init)  {
11213             return d3_text(input, init).then(function(text) {
11214               return (new DOMParser).parseFromString(text, type);
11215             });
11216           };
11217         }
11218
11219         var d3_xml = parser("application/xml");
11220
11221         var html = parser("text/html");
11222
11223         var svg = parser("image/svg+xml");
11224
11225         function center$1(x, y) {
11226           var nodes;
11227
11228           if (x == null) x = 0;
11229           if (y == null) y = 0;
11230
11231           function force() {
11232             var i,
11233                 n = nodes.length,
11234                 node,
11235                 sx = 0,
11236                 sy = 0;
11237
11238             for (i = 0; i < n; ++i) {
11239               node = nodes[i], sx += node.x, sy += node.y;
11240             }
11241
11242             for (sx = sx / n - x, sy = sy / n - y, i = 0; i < n; ++i) {
11243               node = nodes[i], node.x -= sx, node.y -= sy;
11244             }
11245           }
11246
11247           force.initialize = function(_) {
11248             nodes = _;
11249           };
11250
11251           force.x = function(_) {
11252             return arguments.length ? (x = +_, force) : x;
11253           };
11254
11255           force.y = function(_) {
11256             return arguments.length ? (y = +_, force) : y;
11257           };
11258
11259           return force;
11260         }
11261
11262         function constant$7(x) {
11263           return function() {
11264             return x;
11265           };
11266         }
11267
11268         function jiggle() {
11269           return (Math.random() - 0.5) * 1e-6;
11270         }
11271
11272         function tree_add(d) {
11273           var x = +this._x.call(null, d),
11274               y = +this._y.call(null, d);
11275           return add(this.cover(x, y), x, y, d);
11276         }
11277
11278         function add(tree, x, y, d) {
11279           if (isNaN(x) || isNaN(y)) return tree; // ignore invalid points
11280
11281           var parent,
11282               node = tree._root,
11283               leaf = {data: d},
11284               x0 = tree._x0,
11285               y0 = tree._y0,
11286               x1 = tree._x1,
11287               y1 = tree._y1,
11288               xm,
11289               ym,
11290               xp,
11291               yp,
11292               right,
11293               bottom,
11294               i,
11295               j;
11296
11297           // If the tree is empty, initialize the root as a leaf.
11298           if (!node) return tree._root = leaf, tree;
11299
11300           // Find the existing leaf for the new point, or add it.
11301           while (node.length) {
11302             if (right = x >= (xm = (x0 + x1) / 2)) x0 = xm; else x1 = xm;
11303             if (bottom = y >= (ym = (y0 + y1) / 2)) y0 = ym; else y1 = ym;
11304             if (parent = node, !(node = node[i = bottom << 1 | right])) return parent[i] = leaf, tree;
11305           }
11306
11307           // Is the new point is exactly coincident with the existing point?
11308           xp = +tree._x.call(null, node.data);
11309           yp = +tree._y.call(null, node.data);
11310           if (x === xp && y === yp) return leaf.next = node, parent ? parent[i] = leaf : tree._root = leaf, tree;
11311
11312           // Otherwise, split the leaf node until the old and new point are separated.
11313           do {
11314             parent = parent ? parent[i] = new Array(4) : tree._root = new Array(4);
11315             if (right = x >= (xm = (x0 + x1) / 2)) x0 = xm; else x1 = xm;
11316             if (bottom = y >= (ym = (y0 + y1) / 2)) y0 = ym; else y1 = ym;
11317           } while ((i = bottom << 1 | right) === (j = (yp >= ym) << 1 | (xp >= xm)));
11318           return parent[j] = node, parent[i] = leaf, tree;
11319         }
11320
11321         function addAll(data) {
11322           var d, i, n = data.length,
11323               x,
11324               y,
11325               xz = new Array(n),
11326               yz = new Array(n),
11327               x0 = Infinity,
11328               y0 = Infinity,
11329               x1 = -Infinity,
11330               y1 = -Infinity;
11331
11332           // Compute the points and their extent.
11333           for (i = 0; i < n; ++i) {
11334             if (isNaN(x = +this._x.call(null, d = data[i])) || isNaN(y = +this._y.call(null, d))) continue;
11335             xz[i] = x;
11336             yz[i] = y;
11337             if (x < x0) x0 = x;
11338             if (x > x1) x1 = x;
11339             if (y < y0) y0 = y;
11340             if (y > y1) y1 = y;
11341           }
11342
11343           // If there were no (valid) points, abort.
11344           if (x0 > x1 || y0 > y1) return this;
11345
11346           // Expand the tree to cover the new points.
11347           this.cover(x0, y0).cover(x1, y1);
11348
11349           // Add the new points.
11350           for (i = 0; i < n; ++i) {
11351             add(this, xz[i], yz[i], data[i]);
11352           }
11353
11354           return this;
11355         }
11356
11357         function tree_cover(x, y) {
11358           if (isNaN(x = +x) || isNaN(y = +y)) return this; // ignore invalid points
11359
11360           var x0 = this._x0,
11361               y0 = this._y0,
11362               x1 = this._x1,
11363               y1 = this._y1;
11364
11365           // If the quadtree has no extent, initialize them.
11366           // Integer extent are necessary so that if we later double the extent,
11367           // the existing quadrant boundaries don’t change due to floating point error!
11368           if (isNaN(x0)) {
11369             x1 = (x0 = Math.floor(x)) + 1;
11370             y1 = (y0 = Math.floor(y)) + 1;
11371           }
11372
11373           // Otherwise, double repeatedly to cover.
11374           else {
11375             var z = x1 - x0,
11376                 node = this._root,
11377                 parent,
11378                 i;
11379
11380             while (x0 > x || x >= x1 || y0 > y || y >= y1) {
11381               i = (y < y0) << 1 | (x < x0);
11382               parent = new Array(4), parent[i] = node, node = parent, z *= 2;
11383               switch (i) {
11384                 case 0: x1 = x0 + z, y1 = y0 + z; break;
11385                 case 1: x0 = x1 - z, y1 = y0 + z; break;
11386                 case 2: x1 = x0 + z, y0 = y1 - z; break;
11387                 case 3: x0 = x1 - z, y0 = y1 - z; break;
11388               }
11389             }
11390
11391             if (this._root && this._root.length) this._root = node;
11392           }
11393
11394           this._x0 = x0;
11395           this._y0 = y0;
11396           this._x1 = x1;
11397           this._y1 = y1;
11398           return this;
11399         }
11400
11401         function tree_data() {
11402           var data = [];
11403           this.visit(function(node) {
11404             if (!node.length) do data.push(node.data); while (node = node.next)
11405           });
11406           return data;
11407         }
11408
11409         function tree_extent(_) {
11410           return arguments.length
11411               ? this.cover(+_[0][0], +_[0][1]).cover(+_[1][0], +_[1][1])
11412               : isNaN(this._x0) ? undefined : [[this._x0, this._y0], [this._x1, this._y1]];
11413         }
11414
11415         function Quad(node, x0, y0, x1, y1) {
11416           this.node = node;
11417           this.x0 = x0;
11418           this.y0 = y0;
11419           this.x1 = x1;
11420           this.y1 = y1;
11421         }
11422
11423         function tree_find(x, y, radius) {
11424           var data,
11425               x0 = this._x0,
11426               y0 = this._y0,
11427               x1,
11428               y1,
11429               x2,
11430               y2,
11431               x3 = this._x1,
11432               y3 = this._y1,
11433               quads = [],
11434               node = this._root,
11435               q,
11436               i;
11437
11438           if (node) quads.push(new Quad(node, x0, y0, x3, y3));
11439           if (radius == null) radius = Infinity;
11440           else {
11441             x0 = x - radius, y0 = y - radius;
11442             x3 = x + radius, y3 = y + radius;
11443             radius *= radius;
11444           }
11445
11446           while (q = quads.pop()) {
11447
11448             // Stop searching if this quadrant can’t contain a closer node.
11449             if (!(node = q.node)
11450                 || (x1 = q.x0) > x3
11451                 || (y1 = q.y0) > y3
11452                 || (x2 = q.x1) < x0
11453                 || (y2 = q.y1) < y0) continue;
11454
11455             // Bisect the current quadrant.
11456             if (node.length) {
11457               var xm = (x1 + x2) / 2,
11458                   ym = (y1 + y2) / 2;
11459
11460               quads.push(
11461                 new Quad(node[3], xm, ym, x2, y2),
11462                 new Quad(node[2], x1, ym, xm, y2),
11463                 new Quad(node[1], xm, y1, x2, ym),
11464                 new Quad(node[0], x1, y1, xm, ym)
11465               );
11466
11467               // Visit the closest quadrant first.
11468               if (i = (y >= ym) << 1 | (x >= xm)) {
11469                 q = quads[quads.length - 1];
11470                 quads[quads.length - 1] = quads[quads.length - 1 - i];
11471                 quads[quads.length - 1 - i] = q;
11472               }
11473             }
11474
11475             // Visit this point. (Visiting coincident points isn’t necessary!)
11476             else {
11477               var dx = x - +this._x.call(null, node.data),
11478                   dy = y - +this._y.call(null, node.data),
11479                   d2 = dx * dx + dy * dy;
11480               if (d2 < radius) {
11481                 var d = Math.sqrt(radius = d2);
11482                 x0 = x - d, y0 = y - d;
11483                 x3 = x + d, y3 = y + d;
11484                 data = node.data;
11485               }
11486             }
11487           }
11488
11489           return data;
11490         }
11491
11492         function tree_remove(d) {
11493           if (isNaN(x = +this._x.call(null, d)) || isNaN(y = +this._y.call(null, d))) return this; // ignore invalid points
11494
11495           var parent,
11496               node = this._root,
11497               retainer,
11498               previous,
11499               next,
11500               x0 = this._x0,
11501               y0 = this._y0,
11502               x1 = this._x1,
11503               y1 = this._y1,
11504               x,
11505               y,
11506               xm,
11507               ym,
11508               right,
11509               bottom,
11510               i,
11511               j;
11512
11513           // If the tree is empty, initialize the root as a leaf.
11514           if (!node) return this;
11515
11516           // Find the leaf node for the point.
11517           // While descending, also retain the deepest parent with a non-removed sibling.
11518           if (node.length) while (true) {
11519             if (right = x >= (xm = (x0 + x1) / 2)) x0 = xm; else x1 = xm;
11520             if (bottom = y >= (ym = (y0 + y1) / 2)) y0 = ym; else y1 = ym;
11521             if (!(parent = node, node = node[i = bottom << 1 | right])) return this;
11522             if (!node.length) break;
11523             if (parent[(i + 1) & 3] || parent[(i + 2) & 3] || parent[(i + 3) & 3]) retainer = parent, j = i;
11524           }
11525
11526           // Find the point to remove.
11527           while (node.data !== d) if (!(previous = node, node = node.next)) return this;
11528           if (next = node.next) delete node.next;
11529
11530           // If there are multiple coincident points, remove just the point.
11531           if (previous) return (next ? previous.next = next : delete previous.next), this;
11532
11533           // If this is the root point, remove it.
11534           if (!parent) return this._root = next, this;
11535
11536           // Remove this leaf.
11537           next ? parent[i] = next : delete parent[i];
11538
11539           // If the parent now contains exactly one leaf, collapse superfluous parents.
11540           if ((node = parent[0] || parent[1] || parent[2] || parent[3])
11541               && node === (parent[3] || parent[2] || parent[1] || parent[0])
11542               && !node.length) {
11543             if (retainer) retainer[j] = node;
11544             else this._root = node;
11545           }
11546
11547           return this;
11548         }
11549
11550         function removeAll(data) {
11551           for (var i = 0, n = data.length; i < n; ++i) this.remove(data[i]);
11552           return this;
11553         }
11554
11555         function tree_root() {
11556           return this._root;
11557         }
11558
11559         function tree_size() {
11560           var size = 0;
11561           this.visit(function(node) {
11562             if (!node.length) do ++size; while (node = node.next)
11563           });
11564           return size;
11565         }
11566
11567         function tree_visit(callback) {
11568           var quads = [], q, node = this._root, child, x0, y0, x1, y1;
11569           if (node) quads.push(new Quad(node, this._x0, this._y0, this._x1, this._y1));
11570           while (q = quads.pop()) {
11571             if (!callback(node = q.node, x0 = q.x0, y0 = q.y0, x1 = q.x1, y1 = q.y1) && node.length) {
11572               var xm = (x0 + x1) / 2, ym = (y0 + y1) / 2;
11573               if (child = node[3]) quads.push(new Quad(child, xm, ym, x1, y1));
11574               if (child = node[2]) quads.push(new Quad(child, x0, ym, xm, y1));
11575               if (child = node[1]) quads.push(new Quad(child, xm, y0, x1, ym));
11576               if (child = node[0]) quads.push(new Quad(child, x0, y0, xm, ym));
11577             }
11578           }
11579           return this;
11580         }
11581
11582         function tree_visitAfter(callback) {
11583           var quads = [], next = [], q;
11584           if (this._root) quads.push(new Quad(this._root, this._x0, this._y0, this._x1, this._y1));
11585           while (q = quads.pop()) {
11586             var node = q.node;
11587             if (node.length) {
11588               var child, x0 = q.x0, y0 = q.y0, x1 = q.x1, y1 = q.y1, xm = (x0 + x1) / 2, ym = (y0 + y1) / 2;
11589               if (child = node[0]) quads.push(new Quad(child, x0, y0, xm, ym));
11590               if (child = node[1]) quads.push(new Quad(child, xm, y0, x1, ym));
11591               if (child = node[2]) quads.push(new Quad(child, x0, ym, xm, y1));
11592               if (child = node[3]) quads.push(new Quad(child, xm, ym, x1, y1));
11593             }
11594             next.push(q);
11595           }
11596           while (q = next.pop()) {
11597             callback(q.node, q.x0, q.y0, q.x1, q.y1);
11598           }
11599           return this;
11600         }
11601
11602         function defaultX$1(d) {
11603           return d[0];
11604         }
11605
11606         function tree_x(_) {
11607           return arguments.length ? (this._x = _, this) : this._x;
11608         }
11609
11610         function defaultY$1(d) {
11611           return d[1];
11612         }
11613
11614         function tree_y(_) {
11615           return arguments.length ? (this._y = _, this) : this._y;
11616         }
11617
11618         function quadtree(nodes, x, y) {
11619           var tree = new Quadtree(x == null ? defaultX$1 : x, y == null ? defaultY$1 : y, NaN, NaN, NaN, NaN);
11620           return nodes == null ? tree : tree.addAll(nodes);
11621         }
11622
11623         function Quadtree(x, y, x0, y0, x1, y1) {
11624           this._x = x;
11625           this._y = y;
11626           this._x0 = x0;
11627           this._y0 = y0;
11628           this._x1 = x1;
11629           this._y1 = y1;
11630           this._root = undefined;
11631         }
11632
11633         function leaf_copy(leaf) {
11634           var copy = {data: leaf.data}, next = copy;
11635           while (leaf = leaf.next) next = next.next = {data: leaf.data};
11636           return copy;
11637         }
11638
11639         var treeProto = quadtree.prototype = Quadtree.prototype;
11640
11641         treeProto.copy = function() {
11642           var copy = new Quadtree(this._x, this._y, this._x0, this._y0, this._x1, this._y1),
11643               node = this._root,
11644               nodes,
11645               child;
11646
11647           if (!node) return copy;
11648
11649           if (!node.length) return copy._root = leaf_copy(node), copy;
11650
11651           nodes = [{source: node, target: copy._root = new Array(4)}];
11652           while (node = nodes.pop()) {
11653             for (var i = 0; i < 4; ++i) {
11654               if (child = node.source[i]) {
11655                 if (child.length) nodes.push({source: child, target: node.target[i] = new Array(4)});
11656                 else node.target[i] = leaf_copy(child);
11657               }
11658             }
11659           }
11660
11661           return copy;
11662         };
11663
11664         treeProto.add = tree_add;
11665         treeProto.addAll = addAll;
11666         treeProto.cover = tree_cover;
11667         treeProto.data = tree_data;
11668         treeProto.extent = tree_extent;
11669         treeProto.find = tree_find;
11670         treeProto.remove = tree_remove;
11671         treeProto.removeAll = removeAll;
11672         treeProto.root = tree_root;
11673         treeProto.size = tree_size;
11674         treeProto.visit = tree_visit;
11675         treeProto.visitAfter = tree_visitAfter;
11676         treeProto.x = tree_x;
11677         treeProto.y = tree_y;
11678
11679         function x(d) {
11680           return d.x + d.vx;
11681         }
11682
11683         function y(d) {
11684           return d.y + d.vy;
11685         }
11686
11687         function collide(radius) {
11688           var nodes,
11689               radii,
11690               strength = 1,
11691               iterations = 1;
11692
11693           if (typeof radius !== "function") radius = constant$7(radius == null ? 1 : +radius);
11694
11695           function force() {
11696             var i, n = nodes.length,
11697                 tree,
11698                 node,
11699                 xi,
11700                 yi,
11701                 ri,
11702                 ri2;
11703
11704             for (var k = 0; k < iterations; ++k) {
11705               tree = quadtree(nodes, x, y).visitAfter(prepare);
11706               for (i = 0; i < n; ++i) {
11707                 node = nodes[i];
11708                 ri = radii[node.index], ri2 = ri * ri;
11709                 xi = node.x + node.vx;
11710                 yi = node.y + node.vy;
11711                 tree.visit(apply);
11712               }
11713             }
11714
11715             function apply(quad, x0, y0, x1, y1) {
11716               var data = quad.data, rj = quad.r, r = ri + rj;
11717               if (data) {
11718                 if (data.index > node.index) {
11719                   var x = xi - data.x - data.vx,
11720                       y = yi - data.y - data.vy,
11721                       l = x * x + y * y;
11722                   if (l < r * r) {
11723                     if (x === 0) x = jiggle(), l += x * x;
11724                     if (y === 0) y = jiggle(), l += y * y;
11725                     l = (r - (l = Math.sqrt(l))) / l * strength;
11726                     node.vx += (x *= l) * (r = (rj *= rj) / (ri2 + rj));
11727                     node.vy += (y *= l) * r;
11728                     data.vx -= x * (r = 1 - r);
11729                     data.vy -= y * r;
11730                   }
11731                 }
11732                 return;
11733               }
11734               return x0 > xi + r || x1 < xi - r || y0 > yi + r || y1 < yi - r;
11735             }
11736           }
11737
11738           function prepare(quad) {
11739             if (quad.data) return quad.r = radii[quad.data.index];
11740             for (var i = quad.r = 0; i < 4; ++i) {
11741               if (quad[i] && quad[i].r > quad.r) {
11742                 quad.r = quad[i].r;
11743               }
11744             }
11745           }
11746
11747           function initialize() {
11748             if (!nodes) return;
11749             var i, n = nodes.length, node;
11750             radii = new Array(n);
11751             for (i = 0; i < n; ++i) node = nodes[i], radii[node.index] = +radius(node, i, nodes);
11752           }
11753
11754           force.initialize = function(_) {
11755             nodes = _;
11756             initialize();
11757           };
11758
11759           force.iterations = function(_) {
11760             return arguments.length ? (iterations = +_, force) : iterations;
11761           };
11762
11763           force.strength = function(_) {
11764             return arguments.length ? (strength = +_, force) : strength;
11765           };
11766
11767           force.radius = function(_) {
11768             return arguments.length ? (radius = typeof _ === "function" ? _ : constant$7(+_), initialize(), force) : radius;
11769           };
11770
11771           return force;
11772         }
11773
11774         function index(d) {
11775           return d.index;
11776         }
11777
11778         function find(nodeById, nodeId) {
11779           var node = nodeById.get(nodeId);
11780           if (!node) throw new Error("missing: " + nodeId);
11781           return node;
11782         }
11783
11784         function link(links) {
11785           var id = index,
11786               strength = defaultStrength,
11787               strengths,
11788               distance = constant$7(30),
11789               distances,
11790               nodes,
11791               count,
11792               bias,
11793               iterations = 1;
11794
11795           if (links == null) links = [];
11796
11797           function defaultStrength(link) {
11798             return 1 / Math.min(count[link.source.index], count[link.target.index]);
11799           }
11800
11801           function force(alpha) {
11802             for (var k = 0, n = links.length; k < iterations; ++k) {
11803               for (var i = 0, link, source, target, x, y, l, b; i < n; ++i) {
11804                 link = links[i], source = link.source, target = link.target;
11805                 x = target.x + target.vx - source.x - source.vx || jiggle();
11806                 y = target.y + target.vy - source.y - source.vy || jiggle();
11807                 l = Math.sqrt(x * x + y * y);
11808                 l = (l - distances[i]) / l * alpha * strengths[i];
11809                 x *= l, y *= l;
11810                 target.vx -= x * (b = bias[i]);
11811                 target.vy -= y * b;
11812                 source.vx += x * (b = 1 - b);
11813                 source.vy += y * b;
11814               }
11815             }
11816           }
11817
11818           function initialize() {
11819             if (!nodes) return;
11820
11821             var i,
11822                 n = nodes.length,
11823                 m = links.length,
11824                 nodeById = map$3(nodes, id),
11825                 link;
11826
11827             for (i = 0, count = new Array(n); i < m; ++i) {
11828               link = links[i], link.index = i;
11829               if (typeof link.source !== "object") link.source = find(nodeById, link.source);
11830               if (typeof link.target !== "object") link.target = find(nodeById, link.target);
11831               count[link.source.index] = (count[link.source.index] || 0) + 1;
11832               count[link.target.index] = (count[link.target.index] || 0) + 1;
11833             }
11834
11835             for (i = 0, bias = new Array(m); i < m; ++i) {
11836               link = links[i], bias[i] = count[link.source.index] / (count[link.source.index] + count[link.target.index]);
11837             }
11838
11839             strengths = new Array(m), initializeStrength();
11840             distances = new Array(m), initializeDistance();
11841           }
11842
11843           function initializeStrength() {
11844             if (!nodes) return;
11845
11846             for (var i = 0, n = links.length; i < n; ++i) {
11847               strengths[i] = +strength(links[i], i, links);
11848             }
11849           }
11850
11851           function initializeDistance() {
11852             if (!nodes) return;
11853
11854             for (var i = 0, n = links.length; i < n; ++i) {
11855               distances[i] = +distance(links[i], i, links);
11856             }
11857           }
11858
11859           force.initialize = function(_) {
11860             nodes = _;
11861             initialize();
11862           };
11863
11864           force.links = function(_) {
11865             return arguments.length ? (links = _, initialize(), force) : links;
11866           };
11867
11868           force.id = function(_) {
11869             return arguments.length ? (id = _, force) : id;
11870           };
11871
11872           force.iterations = function(_) {
11873             return arguments.length ? (iterations = +_, force) : iterations;
11874           };
11875
11876           force.strength = function(_) {
11877             return arguments.length ? (strength = typeof _ === "function" ? _ : constant$7(+_), initializeStrength(), force) : strength;
11878           };
11879
11880           force.distance = function(_) {
11881             return arguments.length ? (distance = typeof _ === "function" ? _ : constant$7(+_), initializeDistance(), force) : distance;
11882           };
11883
11884           return force;
11885         }
11886
11887         function x$1(d) {
11888           return d.x;
11889         }
11890
11891         function y$1(d) {
11892           return d.y;
11893         }
11894
11895         var initialRadius = 10,
11896             initialAngle = Math.PI * (3 - Math.sqrt(5));
11897
11898         function simulation(nodes) {
11899           var simulation,
11900               alpha = 1,
11901               alphaMin = 0.001,
11902               alphaDecay = 1 - Math.pow(alphaMin, 1 / 300),
11903               alphaTarget = 0,
11904               velocityDecay = 0.6,
11905               forces = map$3(),
11906               stepper = timer(step),
11907               event = dispatch("tick", "end");
11908
11909           if (nodes == null) nodes = [];
11910
11911           function step() {
11912             tick();
11913             event.call("tick", simulation);
11914             if (alpha < alphaMin) {
11915               stepper.stop();
11916               event.call("end", simulation);
11917             }
11918           }
11919
11920           function tick(iterations) {
11921             var i, n = nodes.length, node;
11922
11923             if (iterations === undefined) iterations = 1;
11924
11925             for (var k = 0; k < iterations; ++k) {
11926               alpha += (alphaTarget - alpha) * alphaDecay;
11927
11928               forces.each(function (force) {
11929                 force(alpha);
11930               });
11931
11932               for (i = 0; i < n; ++i) {
11933                 node = nodes[i];
11934                 if (node.fx == null) node.x += node.vx *= velocityDecay;
11935                 else node.x = node.fx, node.vx = 0;
11936                 if (node.fy == null) node.y += node.vy *= velocityDecay;
11937                 else node.y = node.fy, node.vy = 0;
11938               }
11939             }
11940
11941             return simulation;
11942           }
11943
11944           function initializeNodes() {
11945             for (var i = 0, n = nodes.length, node; i < n; ++i) {
11946               node = nodes[i], node.index = i;
11947               if (node.fx != null) node.x = node.fx;
11948               if (node.fy != null) node.y = node.fy;
11949               if (isNaN(node.x) || isNaN(node.y)) {
11950                 var radius = initialRadius * Math.sqrt(i), angle = i * initialAngle;
11951                 node.x = radius * Math.cos(angle);
11952                 node.y = radius * Math.sin(angle);
11953               }
11954               if (isNaN(node.vx) || isNaN(node.vy)) {
11955                 node.vx = node.vy = 0;
11956               }
11957             }
11958           }
11959
11960           function initializeForce(force) {
11961             if (force.initialize) force.initialize(nodes);
11962             return force;
11963           }
11964
11965           initializeNodes();
11966
11967           return simulation = {
11968             tick: tick,
11969
11970             restart: function() {
11971               return stepper.restart(step), simulation;
11972             },
11973
11974             stop: function() {
11975               return stepper.stop(), simulation;
11976             },
11977
11978             nodes: function(_) {
11979               return arguments.length ? (nodes = _, initializeNodes(), forces.each(initializeForce), simulation) : nodes;
11980             },
11981
11982             alpha: function(_) {
11983               return arguments.length ? (alpha = +_, simulation) : alpha;
11984             },
11985
11986             alphaMin: function(_) {
11987               return arguments.length ? (alphaMin = +_, simulation) : alphaMin;
11988             },
11989
11990             alphaDecay: function(_) {
11991               return arguments.length ? (alphaDecay = +_, simulation) : +alphaDecay;
11992             },
11993
11994             alphaTarget: function(_) {
11995               return arguments.length ? (alphaTarget = +_, simulation) : alphaTarget;
11996             },
11997
11998             velocityDecay: function(_) {
11999               return arguments.length ? (velocityDecay = 1 - _, simulation) : 1 - velocityDecay;
12000             },
12001
12002             force: function(name, _) {
12003               return arguments.length > 1 ? ((_ == null ? forces.remove(name) : forces.set(name, initializeForce(_))), simulation) : forces.get(name);
12004             },
12005
12006             find: function(x, y, radius) {
12007               var i = 0,
12008                   n = nodes.length,
12009                   dx,
12010                   dy,
12011                   d2,
12012                   node,
12013                   closest;
12014
12015               if (radius == null) radius = Infinity;
12016               else radius *= radius;
12017
12018               for (i = 0; i < n; ++i) {
12019                 node = nodes[i];
12020                 dx = x - node.x;
12021                 dy = y - node.y;
12022                 d2 = dx * dx + dy * dy;
12023                 if (d2 < radius) closest = node, radius = d2;
12024               }
12025
12026               return closest;
12027             },
12028
12029             on: function(name, _) {
12030               return arguments.length > 1 ? (event.on(name, _), simulation) : event.on(name);
12031             }
12032           };
12033         }
12034
12035         function manyBody() {
12036           var nodes,
12037               node,
12038               alpha,
12039               strength = constant$7(-30),
12040               strengths,
12041               distanceMin2 = 1,
12042               distanceMax2 = Infinity,
12043               theta2 = 0.81;
12044
12045           function force(_) {
12046             var i, n = nodes.length, tree = quadtree(nodes, x$1, y$1).visitAfter(accumulate);
12047             for (alpha = _, i = 0; i < n; ++i) node = nodes[i], tree.visit(apply);
12048           }
12049
12050           function initialize() {
12051             if (!nodes) return;
12052             var i, n = nodes.length, node;
12053             strengths = new Array(n);
12054             for (i = 0; i < n; ++i) node = nodes[i], strengths[node.index] = +strength(node, i, nodes);
12055           }
12056
12057           function accumulate(quad) {
12058             var strength = 0, q, c, weight = 0, x, y, i;
12059
12060             // For internal nodes, accumulate forces from child quadrants.
12061             if (quad.length) {
12062               for (x = y = i = 0; i < 4; ++i) {
12063                 if ((q = quad[i]) && (c = Math.abs(q.value))) {
12064                   strength += q.value, weight += c, x += c * q.x, y += c * q.y;
12065                 }
12066               }
12067               quad.x = x / weight;
12068               quad.y = y / weight;
12069             }
12070
12071             // For leaf nodes, accumulate forces from coincident quadrants.
12072             else {
12073               q = quad;
12074               q.x = q.data.x;
12075               q.y = q.data.y;
12076               do strength += strengths[q.data.index];
12077               while (q = q.next);
12078             }
12079
12080             quad.value = strength;
12081           }
12082
12083           function apply(quad, x1, _, x2) {
12084             if (!quad.value) return true;
12085
12086             var x = quad.x - node.x,
12087                 y = quad.y - node.y,
12088                 w = x2 - x1,
12089                 l = x * x + y * y;
12090
12091             // Apply the Barnes-Hut approximation if possible.
12092             // Limit forces for very close nodes; randomize direction if coincident.
12093             if (w * w / theta2 < l) {
12094               if (l < distanceMax2) {
12095                 if (x === 0) x = jiggle(), l += x * x;
12096                 if (y === 0) y = jiggle(), l += y * y;
12097                 if (l < distanceMin2) l = Math.sqrt(distanceMin2 * l);
12098                 node.vx += x * quad.value * alpha / l;
12099                 node.vy += y * quad.value * alpha / l;
12100               }
12101               return true;
12102             }
12103
12104             // Otherwise, process points directly.
12105             else if (quad.length || l >= distanceMax2) return;
12106
12107             // Limit forces for very close nodes; randomize direction if coincident.
12108             if (quad.data !== node || quad.next) {
12109               if (x === 0) x = jiggle(), l += x * x;
12110               if (y === 0) y = jiggle(), l += y * y;
12111               if (l < distanceMin2) l = Math.sqrt(distanceMin2 * l);
12112             }
12113
12114             do if (quad.data !== node) {
12115               w = strengths[quad.data.index] * alpha / l;
12116               node.vx += x * w;
12117               node.vy += y * w;
12118             } while (quad = quad.next);
12119           }
12120
12121           force.initialize = function(_) {
12122             nodes = _;
12123             initialize();
12124           };
12125
12126           force.strength = function(_) {
12127             return arguments.length ? (strength = typeof _ === "function" ? _ : constant$7(+_), initialize(), force) : strength;
12128           };
12129
12130           force.distanceMin = function(_) {
12131             return arguments.length ? (distanceMin2 = _ * _, force) : Math.sqrt(distanceMin2);
12132           };
12133
12134           force.distanceMax = function(_) {
12135             return arguments.length ? (distanceMax2 = _ * _, force) : Math.sqrt(distanceMax2);
12136           };
12137
12138           force.theta = function(_) {
12139             return arguments.length ? (theta2 = _ * _, force) : Math.sqrt(theta2);
12140           };
12141
12142           return force;
12143         }
12144
12145         function radial(radius, x, y) {
12146           var nodes,
12147               strength = constant$7(0.1),
12148               strengths,
12149               radiuses;
12150
12151           if (typeof radius !== "function") radius = constant$7(+radius);
12152           if (x == null) x = 0;
12153           if (y == null) y = 0;
12154
12155           function force(alpha) {
12156             for (var i = 0, n = nodes.length; i < n; ++i) {
12157               var node = nodes[i],
12158                   dx = node.x - x || 1e-6,
12159                   dy = node.y - y || 1e-6,
12160                   r = Math.sqrt(dx * dx + dy * dy),
12161                   k = (radiuses[i] - r) * strengths[i] * alpha / r;
12162               node.vx += dx * k;
12163               node.vy += dy * k;
12164             }
12165           }
12166
12167           function initialize() {
12168             if (!nodes) return;
12169             var i, n = nodes.length;
12170             strengths = new Array(n);
12171             radiuses = new Array(n);
12172             for (i = 0; i < n; ++i) {
12173               radiuses[i] = +radius(nodes[i], i, nodes);
12174               strengths[i] = isNaN(radiuses[i]) ? 0 : +strength(nodes[i], i, nodes);
12175             }
12176           }
12177
12178           force.initialize = function(_) {
12179             nodes = _, initialize();
12180           };
12181
12182           force.strength = function(_) {
12183             return arguments.length ? (strength = typeof _ === "function" ? _ : constant$7(+_), initialize(), force) : strength;
12184           };
12185
12186           force.radius = function(_) {
12187             return arguments.length ? (radius = typeof _ === "function" ? _ : constant$7(+_), initialize(), force) : radius;
12188           };
12189
12190           force.x = function(_) {
12191             return arguments.length ? (x = +_, force) : x;
12192           };
12193
12194           force.y = function(_) {
12195             return arguments.length ? (y = +_, force) : y;
12196           };
12197
12198           return force;
12199         }
12200
12201         function x$2(x) {
12202           var strength = constant$7(0.1),
12203               nodes,
12204               strengths,
12205               xz;
12206
12207           if (typeof x !== "function") x = constant$7(x == null ? 0 : +x);
12208
12209           function force(alpha) {
12210             for (var i = 0, n = nodes.length, node; i < n; ++i) {
12211               node = nodes[i], node.vx += (xz[i] - node.x) * strengths[i] * alpha;
12212             }
12213           }
12214
12215           function initialize() {
12216             if (!nodes) return;
12217             var i, n = nodes.length;
12218             strengths = new Array(n);
12219             xz = new Array(n);
12220             for (i = 0; i < n; ++i) {
12221               strengths[i] = isNaN(xz[i] = +x(nodes[i], i, nodes)) ? 0 : +strength(nodes[i], i, nodes);
12222             }
12223           }
12224
12225           force.initialize = function(_) {
12226             nodes = _;
12227             initialize();
12228           };
12229
12230           force.strength = function(_) {
12231             return arguments.length ? (strength = typeof _ === "function" ? _ : constant$7(+_), initialize(), force) : strength;
12232           };
12233
12234           force.x = function(_) {
12235             return arguments.length ? (x = typeof _ === "function" ? _ : constant$7(+_), initialize(), force) : x;
12236           };
12237
12238           return force;
12239         }
12240
12241         function y$2(y) {
12242           var strength = constant$7(0.1),
12243               nodes,
12244               strengths,
12245               yz;
12246
12247           if (typeof y !== "function") y = constant$7(y == null ? 0 : +y);
12248
12249           function force(alpha) {
12250             for (var i = 0, n = nodes.length, node; i < n; ++i) {
12251               node = nodes[i], node.vy += (yz[i] - node.y) * strengths[i] * alpha;
12252             }
12253           }
12254
12255           function initialize() {
12256             if (!nodes) return;
12257             var i, n = nodes.length;
12258             strengths = new Array(n);
12259             yz = new Array(n);
12260             for (i = 0; i < n; ++i) {
12261               strengths[i] = isNaN(yz[i] = +y(nodes[i], i, nodes)) ? 0 : +strength(nodes[i], i, nodes);
12262             }
12263           }
12264
12265           force.initialize = function(_) {
12266             nodes = _;
12267             initialize();
12268           };
12269
12270           force.strength = function(_) {
12271             return arguments.length ? (strength = typeof _ === "function" ? _ : constant$7(+_), initialize(), force) : strength;
12272           };
12273
12274           force.y = function(_) {
12275             return arguments.length ? (y = typeof _ === "function" ? _ : constant$7(+_), initialize(), force) : y;
12276           };
12277
12278           return force;
12279         }
12280
12281         // Computes the decimal coefficient and exponent of the specified number x with
12282         // significant digits p, where x is positive and p is in [1, 21] or undefined.
12283         // For example, formatDecimal(1.23) returns ["123", 0].
12284         function formatDecimal(x, p) {
12285           if ((i = (x = p ? x.toExponential(p - 1) : x.toExponential()).indexOf("e")) < 0) return null; // NaN, ±Infinity
12286           var i, coefficient = x.slice(0, i);
12287
12288           // The string returned by toExponential either has the form \d\.\d+e[-+]\d+
12289           // (e.g., 1.2e+3) or the form \de[-+]\d+ (e.g., 1e+3).
12290           return [
12291             coefficient.length > 1 ? coefficient[0] + coefficient.slice(2) : coefficient,
12292             +x.slice(i + 1)
12293           ];
12294         }
12295
12296         function exponent$1(x) {
12297           return x = formatDecimal(Math.abs(x)), x ? x[1] : NaN;
12298         }
12299
12300         function formatGroup(grouping, thousands) {
12301           return function(value, width) {
12302             var i = value.length,
12303                 t = [],
12304                 j = 0,
12305                 g = grouping[0],
12306                 length = 0;
12307
12308             while (i > 0 && g > 0) {
12309               if (length + g + 1 > width) g = Math.max(1, width - length);
12310               t.push(value.substring(i -= g, i + g));
12311               if ((length += g + 1) > width) break;
12312               g = grouping[j = (j + 1) % grouping.length];
12313             }
12314
12315             return t.reverse().join(thousands);
12316           };
12317         }
12318
12319         function formatNumerals(numerals) {
12320           return function(value) {
12321             return value.replace(/[0-9]/g, function(i) {
12322               return numerals[+i];
12323             });
12324           };
12325         }
12326
12327         // [[fill]align][sign][symbol][0][width][,][.precision][~][type]
12328         var re = /^(?:(.)?([<>=^]))?([+\-( ])?([$#])?(0)?(\d+)?(,)?(\.\d+)?(~)?([a-z%])?$/i;
12329
12330         function formatSpecifier(specifier) {
12331           return new FormatSpecifier(specifier);
12332         }
12333
12334         formatSpecifier.prototype = FormatSpecifier.prototype; // instanceof
12335
12336         function FormatSpecifier(specifier) {
12337           if (!(match = re.exec(specifier))) throw new Error("invalid format: " + specifier);
12338           var match;
12339           this.fill = match[1] || " ";
12340           this.align = match[2] || ">";
12341           this.sign = match[3] || "-";
12342           this.symbol = match[4] || "";
12343           this.zero = !!match[5];
12344           this.width = match[6] && +match[6];
12345           this.comma = !!match[7];
12346           this.precision = match[8] && +match[8].slice(1);
12347           this.trim = !!match[9];
12348           this.type = match[10] || "";
12349         }
12350
12351         FormatSpecifier.prototype.toString = function() {
12352           return this.fill
12353               + this.align
12354               + this.sign
12355               + this.symbol
12356               + (this.zero ? "0" : "")
12357               + (this.width == null ? "" : Math.max(1, this.width | 0))
12358               + (this.comma ? "," : "")
12359               + (this.precision == null ? "" : "." + Math.max(0, this.precision | 0))
12360               + (this.trim ? "~" : "")
12361               + this.type;
12362         };
12363
12364         // Trims insignificant zeros, e.g., replaces 1.2000k with 1.2k.
12365         function formatTrim(s) {
12366           out: for (var n = s.length, i = 1, i0 = -1, i1; i < n; ++i) {
12367             switch (s[i]) {
12368               case ".": i0 = i1 = i; break;
12369               case "0": if (i0 === 0) i0 = i; i1 = i; break;
12370               default: if (i0 > 0) { if (!+s[i]) break out; i0 = 0; } break;
12371             }
12372           }
12373           return i0 > 0 ? s.slice(0, i0) + s.slice(i1 + 1) : s;
12374         }
12375
12376         var prefixExponent;
12377
12378         function formatPrefixAuto(x, p) {
12379           var d = formatDecimal(x, p);
12380           if (!d) return x + "";
12381           var coefficient = d[0],
12382               exponent = d[1],
12383               i = exponent - (prefixExponent = Math.max(-8, Math.min(8, Math.floor(exponent / 3))) * 3) + 1,
12384               n = coefficient.length;
12385           return i === n ? coefficient
12386               : i > n ? coefficient + new Array(i - n + 1).join("0")
12387               : i > 0 ? coefficient.slice(0, i) + "." + coefficient.slice(i)
12388               : "0." + new Array(1 - i).join("0") + formatDecimal(x, Math.max(0, p + i - 1))[0]; // less than 1y!
12389         }
12390
12391         function formatRounded(x, p) {
12392           var d = formatDecimal(x, p);
12393           if (!d) return x + "";
12394           var coefficient = d[0],
12395               exponent = d[1];
12396           return exponent < 0 ? "0." + new Array(-exponent).join("0") + coefficient
12397               : coefficient.length > exponent + 1 ? coefficient.slice(0, exponent + 1) + "." + coefficient.slice(exponent + 1)
12398               : coefficient + new Array(exponent - coefficient.length + 2).join("0");
12399         }
12400
12401         var formatTypes = {
12402           "%": function(x, p) { return (x * 100).toFixed(p); },
12403           "b": function(x) { return Math.round(x).toString(2); },
12404           "c": function(x) { return x + ""; },
12405           "d": function(x) { return Math.round(x).toString(10); },
12406           "e": function(x, p) { return x.toExponential(p); },
12407           "f": function(x, p) { return x.toFixed(p); },
12408           "g": function(x, p) { return x.toPrecision(p); },
12409           "o": function(x) { return Math.round(x).toString(8); },
12410           "p": function(x, p) { return formatRounded(x * 100, p); },
12411           "r": formatRounded,
12412           "s": formatPrefixAuto,
12413           "X": function(x) { return Math.round(x).toString(16).toUpperCase(); },
12414           "x": function(x) { return Math.round(x).toString(16); }
12415         };
12416
12417         function identity$3(x) {
12418           return x;
12419         }
12420
12421         var prefixes = ["y","z","a","f","p","n","µ","m","","k","M","G","T","P","E","Z","Y"];
12422
12423         function formatLocale(locale) {
12424           var group = locale.grouping && locale.thousands ? formatGroup(locale.grouping, locale.thousands) : identity$3,
12425               currency = locale.currency,
12426               decimal = locale.decimal,
12427               numerals = locale.numerals ? formatNumerals(locale.numerals) : identity$3,
12428               percent = locale.percent || "%";
12429
12430           function newFormat(specifier) {
12431             specifier = formatSpecifier(specifier);
12432
12433             var fill = specifier.fill,
12434                 align = specifier.align,
12435                 sign = specifier.sign,
12436                 symbol = specifier.symbol,
12437                 zero = specifier.zero,
12438                 width = specifier.width,
12439                 comma = specifier.comma,
12440                 precision = specifier.precision,
12441                 trim = specifier.trim,
12442                 type = specifier.type;
12443
12444             // The "n" type is an alias for ",g".
12445             if (type === "n") comma = true, type = "g";
12446
12447             // The "" type, and any invalid type, is an alias for ".12~g".
12448             else if (!formatTypes[type]) precision == null && (precision = 12), trim = true, type = "g";
12449
12450             // If zero fill is specified, padding goes after sign and before digits.
12451             if (zero || (fill === "0" && align === "=")) zero = true, fill = "0", align = "=";
12452
12453             // Compute the prefix and suffix.
12454             // For SI-prefix, the suffix is lazily computed.
12455             var prefix = symbol === "$" ? currency[0] : symbol === "#" && /[boxX]/.test(type) ? "0" + type.toLowerCase() : "",
12456                 suffix = symbol === "$" ? currency[1] : /[%p]/.test(type) ? percent : "";
12457
12458             // What format function should we use?
12459             // Is this an integer type?
12460             // Can this type generate exponential notation?
12461             var formatType = formatTypes[type],
12462                 maybeSuffix = /[defgprs%]/.test(type);
12463
12464             // Set the default precision if not specified,
12465             // or clamp the specified precision to the supported range.
12466             // For significant precision, it must be in [1, 21].
12467             // For fixed precision, it must be in [0, 20].
12468             precision = precision == null ? 6
12469                 : /[gprs]/.test(type) ? Math.max(1, Math.min(21, precision))
12470                 : Math.max(0, Math.min(20, precision));
12471
12472             function format(value) {
12473               var valuePrefix = prefix,
12474                   valueSuffix = suffix,
12475                   i, n, c;
12476
12477               if (type === "c") {
12478                 valueSuffix = formatType(value) + valueSuffix;
12479                 value = "";
12480               } else {
12481                 value = +value;
12482
12483                 // Perform the initial formatting.
12484                 var valueNegative = value < 0;
12485                 value = formatType(Math.abs(value), precision);
12486
12487                 // Trim insignificant zeros.
12488                 if (trim) value = formatTrim(value);
12489
12490                 // If a negative value rounds to zero during formatting, treat as positive.
12491                 if (valueNegative && +value === 0) valueNegative = false;
12492
12493                 // Compute the prefix and suffix.
12494                 valuePrefix = (valueNegative ? (sign === "(" ? sign : "-") : sign === "-" || sign === "(" ? "" : sign) + valuePrefix;
12495                 valueSuffix = (type === "s" ? prefixes[8 + prefixExponent / 3] : "") + valueSuffix + (valueNegative && sign === "(" ? ")" : "");
12496
12497                 // Break the formatted value into the integer “value” part that can be
12498                 // grouped, and fractional or exponential “suffix” part that is not.
12499                 if (maybeSuffix) {
12500                   i = -1, n = value.length;
12501                   while (++i < n) {
12502                     if (c = value.charCodeAt(i), 48 > c || c > 57) {
12503                       valueSuffix = (c === 46 ? decimal + value.slice(i + 1) : value.slice(i)) + valueSuffix;
12504                       value = value.slice(0, i);
12505                       break;
12506                     }
12507                   }
12508                 }
12509               }
12510
12511               // If the fill character is not "0", grouping is applied before padding.
12512               if (comma && !zero) value = group(value, Infinity);
12513
12514               // Compute the padding.
12515               var length = valuePrefix.length + value.length + valueSuffix.length,
12516                   padding = length < width ? new Array(width - length + 1).join(fill) : "";
12517
12518               // If the fill character is "0", grouping is applied after padding.
12519               if (comma && zero) value = group(padding + value, padding.length ? width - valueSuffix.length : Infinity), padding = "";
12520
12521               // Reconstruct the final output based on the desired alignment.
12522               switch (align) {
12523                 case "<": value = valuePrefix + value + valueSuffix + padding; break;
12524                 case "=": value = valuePrefix + padding + value + valueSuffix; break;
12525                 case "^": value = padding.slice(0, length = padding.length >> 1) + valuePrefix + value + valueSuffix + padding.slice(length); break;
12526                 default: value = padding + valuePrefix + value + valueSuffix; break;
12527               }
12528
12529               return numerals(value);
12530             }
12531
12532             format.toString = function() {
12533               return specifier + "";
12534             };
12535
12536             return format;
12537           }
12538
12539           function formatPrefix(specifier, value) {
12540             var f = newFormat((specifier = formatSpecifier(specifier), specifier.type = "f", specifier)),
12541                 e = Math.max(-8, Math.min(8, Math.floor(exponent$1(value) / 3))) * 3,
12542                 k = Math.pow(10, -e),
12543                 prefix = prefixes[8 + e / 3];
12544             return function(value) {
12545               return f(k * value) + prefix;
12546             };
12547           }
12548
12549           return {
12550             format: newFormat,
12551             formatPrefix: formatPrefix
12552           };
12553         }
12554
12555         var locale;
12556         var format;
12557         var formatPrefix;
12558
12559         defaultLocale({
12560           decimal: ".",
12561           thousands: ",",
12562           grouping: [3],
12563           currency: ["$", ""]
12564         });
12565
12566         function defaultLocale(definition) {
12567           locale = formatLocale(definition);
12568           format = locale.format;
12569           formatPrefix = locale.formatPrefix;
12570           return locale;
12571         }
12572
12573         function precisionFixed(step) {
12574           return Math.max(0, -exponent$1(Math.abs(step)));
12575         }
12576
12577         function precisionPrefix(step, value) {
12578           return Math.max(0, Math.max(-8, Math.min(8, Math.floor(exponent$1(value) / 3))) * 3 - exponent$1(Math.abs(step)));
12579         }
12580
12581         function precisionRound(step, max) {
12582           step = Math.abs(step), max = Math.abs(max) - step;
12583           return Math.max(0, exponent$1(max) - exponent$1(step)) + 1;
12584         }
12585
12586         // Adds floating point numbers with twice the normal precision.
12587         // Reference: J. R. Shewchuk, Adaptive Precision Floating-Point Arithmetic and
12588         // Fast Robust Geometric Predicates, Discrete & Computational Geometry 18(3)
12589         // 305–363 (1997).
12590         // Code adapted from GeographicLib by Charles F. F. Karney,
12591         // http://geographiclib.sourceforge.net/
12592
12593         function adder() {
12594           return new Adder;
12595         }
12596
12597         function Adder() {
12598           this.reset();
12599         }
12600
12601         Adder.prototype = {
12602           constructor: Adder,
12603           reset: function() {
12604             this.s = // rounded value
12605             this.t = 0; // exact error
12606           },
12607           add: function(y) {
12608             add$1(temp, y, this.t);
12609             add$1(this, temp.s, this.s);
12610             if (this.s) this.t += temp.t;
12611             else this.s = temp.t;
12612           },
12613           valueOf: function() {
12614             return this.s;
12615           }
12616         };
12617
12618         var temp = new Adder;
12619
12620         function add$1(adder, a, b) {
12621           var x = adder.s = a + b,
12622               bv = x - a,
12623               av = x - bv;
12624           adder.t = (a - av) + (b - bv);
12625         }
12626
12627         var epsilon$2 = 1e-6;
12628         var epsilon2$1 = 1e-12;
12629         var pi$3 = Math.PI;
12630         var halfPi$2 = pi$3 / 2;
12631         var quarterPi = pi$3 / 4;
12632         var tau$3 = pi$3 * 2;
12633
12634         var degrees$1 = 180 / pi$3;
12635         var radians = pi$3 / 180;
12636
12637         var abs$2 = Math.abs;
12638         var atan = Math.atan;
12639         var atan2 = Math.atan2;
12640         var cos$1 = Math.cos;
12641         var ceil = Math.ceil;
12642         var exp = Math.exp;
12643         var log = Math.log;
12644         var pow = Math.pow;
12645         var sin$1 = Math.sin;
12646         var sign$2 = Math.sign || function(x) { return x > 0 ? 1 : x < 0 ? -1 : 0; };
12647         var sqrt = Math.sqrt;
12648         var tan = Math.tan;
12649
12650         function acos(x) {
12651           return x > 1 ? 0 : x < -1 ? pi$3 : Math.acos(x);
12652         }
12653
12654         function asin(x) {
12655           return x > 1 ? halfPi$2 : x < -1 ? -halfPi$2 : Math.asin(x);
12656         }
12657
12658         function haversin(x) {
12659           return (x = sin$1(x / 2)) * x;
12660         }
12661
12662         function noop$4() {}
12663
12664         function streamGeometry(geometry, stream) {
12665           if (geometry && streamGeometryType.hasOwnProperty(geometry.type)) {
12666             streamGeometryType[geometry.type](geometry, stream);
12667           }
12668         }
12669
12670         var streamObjectType = {
12671           Feature: function(object, stream) {
12672             streamGeometry(object.geometry, stream);
12673           },
12674           FeatureCollection: function(object, stream) {
12675             var features = object.features, i = -1, n = features.length;
12676             while (++i < n) streamGeometry(features[i].geometry, stream);
12677           }
12678         };
12679
12680         var streamGeometryType = {
12681           Sphere: function(object, stream) {
12682             stream.sphere();
12683           },
12684           Point: function(object, stream) {
12685             object = object.coordinates;
12686             stream.point(object[0], object[1], object[2]);
12687           },
12688           MultiPoint: function(object, stream) {
12689             var coordinates = object.coordinates, i = -1, n = coordinates.length;
12690             while (++i < n) object = coordinates[i], stream.point(object[0], object[1], object[2]);
12691           },
12692           LineString: function(object, stream) {
12693             streamLine(object.coordinates, stream, 0);
12694           },
12695           MultiLineString: function(object, stream) {
12696             var coordinates = object.coordinates, i = -1, n = coordinates.length;
12697             while (++i < n) streamLine(coordinates[i], stream, 0);
12698           },
12699           Polygon: function(object, stream) {
12700             streamPolygon(object.coordinates, stream);
12701           },
12702           MultiPolygon: function(object, stream) {
12703             var coordinates = object.coordinates, i = -1, n = coordinates.length;
12704             while (++i < n) streamPolygon(coordinates[i], stream);
12705           },
12706           GeometryCollection: function(object, stream) {
12707             var geometries = object.geometries, i = -1, n = geometries.length;
12708             while (++i < n) streamGeometry(geometries[i], stream);
12709           }
12710         };
12711
12712         function streamLine(coordinates, stream, closed) {
12713           var i = -1, n = coordinates.length - closed, coordinate;
12714           stream.lineStart();
12715           while (++i < n) coordinate = coordinates[i], stream.point(coordinate[0], coordinate[1], coordinate[2]);
12716           stream.lineEnd();
12717         }
12718
12719         function streamPolygon(coordinates, stream) {
12720           var i = -1, n = coordinates.length;
12721           stream.polygonStart();
12722           while (++i < n) streamLine(coordinates[i], stream, 1);
12723           stream.polygonEnd();
12724         }
12725
12726         function d3_geoStream(object, stream) {
12727           if (object && streamObjectType.hasOwnProperty(object.type)) {
12728             streamObjectType[object.type](object, stream);
12729           } else {
12730             streamGeometry(object, stream);
12731           }
12732         }
12733
12734         var areaRingSum = adder();
12735
12736         var areaSum = adder(),
12737             lambda00,
12738             phi00,
12739             lambda0,
12740             cosPhi0,
12741             sinPhi0;
12742
12743         var areaStream = {
12744           point: noop$4,
12745           lineStart: noop$4,
12746           lineEnd: noop$4,
12747           polygonStart: function() {
12748             areaRingSum.reset();
12749             areaStream.lineStart = areaRingStart;
12750             areaStream.lineEnd = areaRingEnd;
12751           },
12752           polygonEnd: function() {
12753             var areaRing = +areaRingSum;
12754             areaSum.add(areaRing < 0 ? tau$3 + areaRing : areaRing);
12755             this.lineStart = this.lineEnd = this.point = noop$4;
12756           },
12757           sphere: function() {
12758             areaSum.add(tau$3);
12759           }
12760         };
12761
12762         function areaRingStart() {
12763           areaStream.point = areaPointFirst;
12764         }
12765
12766         function areaRingEnd() {
12767           areaPoint(lambda00, phi00);
12768         }
12769
12770         function areaPointFirst(lambda, phi) {
12771           areaStream.point = areaPoint;
12772           lambda00 = lambda, phi00 = phi;
12773           lambda *= radians, phi *= radians;
12774           lambda0 = lambda, cosPhi0 = cos$1(phi = phi / 2 + quarterPi), sinPhi0 = sin$1(phi);
12775         }
12776
12777         function areaPoint(lambda, phi) {
12778           lambda *= radians, phi *= radians;
12779           phi = phi / 2 + quarterPi; // half the angular distance from south pole
12780
12781           // Spherical excess E for a spherical triangle with vertices: south pole,
12782           // previous point, current point.  Uses a formula derived from Cagnoli’s
12783           // theorem.  See Todhunter, Spherical Trig. (1871), Sec. 103, Eq. (2).
12784           var dLambda = lambda - lambda0,
12785               sdLambda = dLambda >= 0 ? 1 : -1,
12786               adLambda = sdLambda * dLambda,
12787               cosPhi = cos$1(phi),
12788               sinPhi = sin$1(phi),
12789               k = sinPhi0 * sinPhi,
12790               u = cosPhi0 * cosPhi + k * cos$1(adLambda),
12791               v = k * sdLambda * sin$1(adLambda);
12792           areaRingSum.add(atan2(v, u));
12793
12794           // Advance the previous points.
12795           lambda0 = lambda, cosPhi0 = cosPhi, sinPhi0 = sinPhi;
12796         }
12797
12798         function d3_geoArea(object) {
12799           areaSum.reset();
12800           d3_geoStream(object, areaStream);
12801           return areaSum * 2;
12802         }
12803
12804         function spherical(cartesian) {
12805           return [atan2(cartesian[1], cartesian[0]), asin(cartesian[2])];
12806         }
12807
12808         function cartesian(spherical) {
12809           var lambda = spherical[0], phi = spherical[1], cosPhi = cos$1(phi);
12810           return [cosPhi * cos$1(lambda), cosPhi * sin$1(lambda), sin$1(phi)];
12811         }
12812
12813         function cartesianDot(a, b) {
12814           return a[0] * b[0] + a[1] * b[1] + a[2] * b[2];
12815         }
12816
12817         function cartesianCross(a, b) {
12818           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]];
12819         }
12820
12821         // TODO return a
12822         function cartesianAddInPlace(a, b) {
12823           a[0] += b[0], a[1] += b[1], a[2] += b[2];
12824         }
12825
12826         function cartesianScale(vector, k) {
12827           return [vector[0] * k, vector[1] * k, vector[2] * k];
12828         }
12829
12830         // TODO return d
12831         function cartesianNormalizeInPlace(d) {
12832           var l = sqrt(d[0] * d[0] + d[1] * d[1] + d[2] * d[2]);
12833           d[0] /= l, d[1] /= l, d[2] /= l;
12834         }
12835
12836         var lambda0$1, phi0, lambda1, phi1, // bounds
12837             lambda2, // previous lambda-coordinate
12838             lambda00$1, phi00$1, // first point
12839             p0, // previous 3D point
12840             deltaSum = adder(),
12841             ranges,
12842             range;
12843
12844         var boundsStream = {
12845           point: boundsPoint,
12846           lineStart: boundsLineStart,
12847           lineEnd: boundsLineEnd,
12848           polygonStart: function() {
12849             boundsStream.point = boundsRingPoint;
12850             boundsStream.lineStart = boundsRingStart;
12851             boundsStream.lineEnd = boundsRingEnd;
12852             deltaSum.reset();
12853             areaStream.polygonStart();
12854           },
12855           polygonEnd: function() {
12856             areaStream.polygonEnd();
12857             boundsStream.point = boundsPoint;
12858             boundsStream.lineStart = boundsLineStart;
12859             boundsStream.lineEnd = boundsLineEnd;
12860             if (areaRingSum < 0) lambda0$1 = -(lambda1 = 180), phi0 = -(phi1 = 90);
12861             else if (deltaSum > epsilon$2) phi1 = 90;
12862             else if (deltaSum < -epsilon$2) phi0 = -90;
12863             range[0] = lambda0$1, range[1] = lambda1;
12864           }
12865         };
12866
12867         function boundsPoint(lambda, phi) {
12868           ranges.push(range = [lambda0$1 = lambda, lambda1 = lambda]);
12869           if (phi < phi0) phi0 = phi;
12870           if (phi > phi1) phi1 = phi;
12871         }
12872
12873         function linePoint(lambda, phi) {
12874           var p = cartesian([lambda * radians, phi * radians]);
12875           if (p0) {
12876             var normal = cartesianCross(p0, p),
12877                 equatorial = [normal[1], -normal[0], 0],
12878                 inflection = cartesianCross(equatorial, normal);
12879             cartesianNormalizeInPlace(inflection);
12880             inflection = spherical(inflection);
12881             var delta = lambda - lambda2,
12882                 sign = delta > 0 ? 1 : -1,
12883                 lambdai = inflection[0] * degrees$1 * sign,
12884                 phii,
12885                 antimeridian = abs$2(delta) > 180;
12886             if (antimeridian ^ (sign * lambda2 < lambdai && lambdai < sign * lambda)) {
12887               phii = inflection[1] * degrees$1;
12888               if (phii > phi1) phi1 = phii;
12889             } else if (lambdai = (lambdai + 360) % 360 - 180, antimeridian ^ (sign * lambda2 < lambdai && lambdai < sign * lambda)) {
12890               phii = -inflection[1] * degrees$1;
12891               if (phii < phi0) phi0 = phii;
12892             } else {
12893               if (phi < phi0) phi0 = phi;
12894               if (phi > phi1) phi1 = phi;
12895             }
12896             if (antimeridian) {
12897               if (lambda < lambda2) {
12898                 if (angle(lambda0$1, lambda) > angle(lambda0$1, lambda1)) lambda1 = lambda;
12899               } else {
12900                 if (angle(lambda, lambda1) > angle(lambda0$1, lambda1)) lambda0$1 = lambda;
12901               }
12902             } else {
12903               if (lambda1 >= lambda0$1) {
12904                 if (lambda < lambda0$1) lambda0$1 = lambda;
12905                 if (lambda > lambda1) lambda1 = lambda;
12906               } else {
12907                 if (lambda > lambda2) {
12908                   if (angle(lambda0$1, lambda) > angle(lambda0$1, lambda1)) lambda1 = lambda;
12909                 } else {
12910                   if (angle(lambda, lambda1) > angle(lambda0$1, lambda1)) lambda0$1 = lambda;
12911                 }
12912               }
12913             }
12914           } else {
12915             ranges.push(range = [lambda0$1 = lambda, lambda1 = lambda]);
12916           }
12917           if (phi < phi0) phi0 = phi;
12918           if (phi > phi1) phi1 = phi;
12919           p0 = p, lambda2 = lambda;
12920         }
12921
12922         function boundsLineStart() {
12923           boundsStream.point = linePoint;
12924         }
12925
12926         function boundsLineEnd() {
12927           range[0] = lambda0$1, range[1] = lambda1;
12928           boundsStream.point = boundsPoint;
12929           p0 = null;
12930         }
12931
12932         function boundsRingPoint(lambda, phi) {
12933           if (p0) {
12934             var delta = lambda - lambda2;
12935             deltaSum.add(abs$2(delta) > 180 ? delta + (delta > 0 ? 360 : -360) : delta);
12936           } else {
12937             lambda00$1 = lambda, phi00$1 = phi;
12938           }
12939           areaStream.point(lambda, phi);
12940           linePoint(lambda, phi);
12941         }
12942
12943         function boundsRingStart() {
12944           areaStream.lineStart();
12945         }
12946
12947         function boundsRingEnd() {
12948           boundsRingPoint(lambda00$1, phi00$1);
12949           areaStream.lineEnd();
12950           if (abs$2(deltaSum) > epsilon$2) lambda0$1 = -(lambda1 = 180);
12951           range[0] = lambda0$1, range[1] = lambda1;
12952           p0 = null;
12953         }
12954
12955         // Finds the left-right distance between two longitudes.
12956         // This is almost the same as (lambda1 - lambda0 + 360°) % 360°, except that we want
12957         // the distance between ±180° to be 360°.
12958         function angle(lambda0, lambda1) {
12959           return (lambda1 -= lambda0) < 0 ? lambda1 + 360 : lambda1;
12960         }
12961
12962         function rangeCompare(a, b) {
12963           return a[0] - b[0];
12964         }
12965
12966         function rangeContains(range, x) {
12967           return range[0] <= range[1] ? range[0] <= x && x <= range[1] : x < range[0] || range[1] < x;
12968         }
12969
12970         function d3_geoBounds(feature) {
12971           var i, n, a, b, merged, deltaMax, delta;
12972
12973           phi1 = lambda1 = -(lambda0$1 = phi0 = Infinity);
12974           ranges = [];
12975           d3_geoStream(feature, boundsStream);
12976
12977           // First, sort ranges by their minimum longitudes.
12978           if (n = ranges.length) {
12979             ranges.sort(rangeCompare);
12980
12981             // Then, merge any ranges that overlap.
12982             for (i = 1, a = ranges[0], merged = [a]; i < n; ++i) {
12983               b = ranges[i];
12984               if (rangeContains(a, b[0]) || rangeContains(a, b[1])) {
12985                 if (angle(a[0], b[1]) > angle(a[0], a[1])) a[1] = b[1];
12986                 if (angle(b[0], a[1]) > angle(a[0], a[1])) a[0] = b[0];
12987               } else {
12988                 merged.push(a = b);
12989               }
12990             }
12991
12992             // Finally, find the largest gap between the merged ranges.
12993             // The final bounding box will be the inverse of this gap.
12994             for (deltaMax = -Infinity, n = merged.length - 1, i = 0, a = merged[n]; i <= n; a = b, ++i) {
12995               b = merged[i];
12996               if ((delta = angle(a[1], b[0])) > deltaMax) deltaMax = delta, lambda0$1 = b[0], lambda1 = a[1];
12997             }
12998           }
12999
13000           ranges = range = null;
13001
13002           return lambda0$1 === Infinity || phi0 === Infinity
13003               ? [[NaN, NaN], [NaN, NaN]]
13004               : [[lambda0$1, phi0], [lambda1, phi1]];
13005         }
13006
13007         var W0, W1,
13008             X0, Y0, Z0,
13009             X1, Y1, Z1,
13010             X2, Y2, Z2,
13011             lambda00$2, phi00$2, // first point
13012             x0, y0, z0; // previous point
13013
13014         var centroidStream = {
13015           sphere: noop$4,
13016           point: centroidPoint,
13017           lineStart: centroidLineStart,
13018           lineEnd: centroidLineEnd,
13019           polygonStart: function() {
13020             centroidStream.lineStart = centroidRingStart;
13021             centroidStream.lineEnd = centroidRingEnd;
13022           },
13023           polygonEnd: function() {
13024             centroidStream.lineStart = centroidLineStart;
13025             centroidStream.lineEnd = centroidLineEnd;
13026           }
13027         };
13028
13029         // Arithmetic mean of Cartesian vectors.
13030         function centroidPoint(lambda, phi) {
13031           lambda *= radians, phi *= radians;
13032           var cosPhi = cos$1(phi);
13033           centroidPointCartesian(cosPhi * cos$1(lambda), cosPhi * sin$1(lambda), sin$1(phi));
13034         }
13035
13036         function centroidPointCartesian(x, y, z) {
13037           ++W0;
13038           X0 += (x - X0) / W0;
13039           Y0 += (y - Y0) / W0;
13040           Z0 += (z - Z0) / W0;
13041         }
13042
13043         function centroidLineStart() {
13044           centroidStream.point = centroidLinePointFirst;
13045         }
13046
13047         function centroidLinePointFirst(lambda, phi) {
13048           lambda *= radians, phi *= radians;
13049           var cosPhi = cos$1(phi);
13050           x0 = cosPhi * cos$1(lambda);
13051           y0 = cosPhi * sin$1(lambda);
13052           z0 = sin$1(phi);
13053           centroidStream.point = centroidLinePoint;
13054           centroidPointCartesian(x0, y0, z0);
13055         }
13056
13057         function centroidLinePoint(lambda, phi) {
13058           lambda *= radians, phi *= radians;
13059           var cosPhi = cos$1(phi),
13060               x = cosPhi * cos$1(lambda),
13061               y = cosPhi * sin$1(lambda),
13062               z = sin$1(phi),
13063               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);
13064           W1 += w;
13065           X1 += w * (x0 + (x0 = x));
13066           Y1 += w * (y0 + (y0 = y));
13067           Z1 += w * (z0 + (z0 = z));
13068           centroidPointCartesian(x0, y0, z0);
13069         }
13070
13071         function centroidLineEnd() {
13072           centroidStream.point = centroidPoint;
13073         }
13074
13075         // See J. E. Brock, The Inertia Tensor for a Spherical Triangle,
13076         // J. Applied Mechanics 42, 239 (1975).
13077         function centroidRingStart() {
13078           centroidStream.point = centroidRingPointFirst;
13079         }
13080
13081         function centroidRingEnd() {
13082           centroidRingPoint(lambda00$2, phi00$2);
13083           centroidStream.point = centroidPoint;
13084         }
13085
13086         function centroidRingPointFirst(lambda, phi) {
13087           lambda00$2 = lambda, phi00$2 = phi;
13088           lambda *= radians, phi *= radians;
13089           centroidStream.point = centroidRingPoint;
13090           var cosPhi = cos$1(phi);
13091           x0 = cosPhi * cos$1(lambda);
13092           y0 = cosPhi * sin$1(lambda);
13093           z0 = sin$1(phi);
13094           centroidPointCartesian(x0, y0, z0);
13095         }
13096
13097         function centroidRingPoint(lambda, phi) {
13098           lambda *= radians, phi *= radians;
13099           var cosPhi = cos$1(phi),
13100               x = cosPhi * cos$1(lambda),
13101               y = cosPhi * sin$1(lambda),
13102               z = sin$1(phi),
13103               cx = y0 * z - z0 * y,
13104               cy = z0 * x - x0 * z,
13105               cz = x0 * y - y0 * x,
13106               m = sqrt(cx * cx + cy * cy + cz * cz),
13107               w = asin(m), // line weight = angle
13108               v = m && -w / m; // area weight multiplier
13109           X2 += v * cx;
13110           Y2 += v * cy;
13111           Z2 += v * cz;
13112           W1 += w;
13113           X1 += w * (x0 + (x0 = x));
13114           Y1 += w * (y0 + (y0 = y));
13115           Z1 += w * (z0 + (z0 = z));
13116           centroidPointCartesian(x0, y0, z0);
13117         }
13118
13119         function d3_geoCentroid(object) {
13120           W0 = W1 =
13121           X0 = Y0 = Z0 =
13122           X1 = Y1 = Z1 =
13123           X2 = Y2 = Z2 = 0;
13124           d3_geoStream(object, centroidStream);
13125
13126           var x = X2,
13127               y = Y2,
13128               z = Z2,
13129               m = x * x + y * y + z * z;
13130
13131           // If the area-weighted ccentroid is undefined, fall back to length-weighted ccentroid.
13132           if (m < epsilon2$1) {
13133             x = X1, y = Y1, z = Z1;
13134             // If the feature has zero length, fall back to arithmetic mean of point vectors.
13135             if (W1 < epsilon$2) x = X0, y = Y0, z = Z0;
13136             m = x * x + y * y + z * z;
13137             // If the feature still has an undefined ccentroid, then return.
13138             if (m < epsilon2$1) return [NaN, NaN];
13139           }
13140
13141           return [atan2(y, x) * degrees$1, asin(z / sqrt(m)) * degrees$1];
13142         }
13143
13144         function constant$8(x) {
13145           return function() {
13146             return x;
13147           };
13148         }
13149
13150         function compose(a, b) {
13151
13152           function compose(x, y) {
13153             return x = a(x, y), b(x[0], x[1]);
13154           }
13155
13156           if (a.invert && b.invert) compose.invert = function(x, y) {
13157             return x = b.invert(x, y), x && a.invert(x[0], x[1]);
13158           };
13159
13160           return compose;
13161         }
13162
13163         function rotationIdentity(lambda, phi) {
13164           return [abs$2(lambda) > pi$3 ? lambda + Math.round(-lambda / tau$3) * tau$3 : lambda, phi];
13165         }
13166
13167         rotationIdentity.invert = rotationIdentity;
13168
13169         function rotateRadians(deltaLambda, deltaPhi, deltaGamma) {
13170           return (deltaLambda %= tau$3) ? (deltaPhi || deltaGamma ? compose(rotationLambda(deltaLambda), rotationPhiGamma(deltaPhi, deltaGamma))
13171             : rotationLambda(deltaLambda))
13172             : (deltaPhi || deltaGamma ? rotationPhiGamma(deltaPhi, deltaGamma)
13173             : rotationIdentity);
13174         }
13175
13176         function forwardRotationLambda(deltaLambda) {
13177           return function(lambda, phi) {
13178             return lambda += deltaLambda, [lambda > pi$3 ? lambda - tau$3 : lambda < -pi$3 ? lambda + tau$3 : lambda, phi];
13179           };
13180         }
13181
13182         function rotationLambda(deltaLambda) {
13183           var rotation = forwardRotationLambda(deltaLambda);
13184           rotation.invert = forwardRotationLambda(-deltaLambda);
13185           return rotation;
13186         }
13187
13188         function rotationPhiGamma(deltaPhi, deltaGamma) {
13189           var cosDeltaPhi = cos$1(deltaPhi),
13190               sinDeltaPhi = sin$1(deltaPhi),
13191               cosDeltaGamma = cos$1(deltaGamma),
13192               sinDeltaGamma = sin$1(deltaGamma);
13193
13194           function rotation(lambda, phi) {
13195             var cosPhi = cos$1(phi),
13196                 x = cos$1(lambda) * cosPhi,
13197                 y = sin$1(lambda) * cosPhi,
13198                 z = sin$1(phi),
13199                 k = z * cosDeltaPhi + x * sinDeltaPhi;
13200             return [
13201               atan2(y * cosDeltaGamma - k * sinDeltaGamma, x * cosDeltaPhi - z * sinDeltaPhi),
13202               asin(k * cosDeltaGamma + y * sinDeltaGamma)
13203             ];
13204           }
13205
13206           rotation.invert = function(lambda, phi) {
13207             var cosPhi = cos$1(phi),
13208                 x = cos$1(lambda) * cosPhi,
13209                 y = sin$1(lambda) * cosPhi,
13210                 z = sin$1(phi),
13211                 k = z * cosDeltaGamma - y * sinDeltaGamma;
13212             return [
13213               atan2(y * cosDeltaGamma + z * sinDeltaGamma, x * cosDeltaPhi + k * sinDeltaPhi),
13214               asin(k * cosDeltaPhi - x * sinDeltaPhi)
13215             ];
13216           };
13217
13218           return rotation;
13219         }
13220
13221         function rotation(rotate) {
13222           rotate = rotateRadians(rotate[0] * radians, rotate[1] * radians, rotate.length > 2 ? rotate[2] * radians : 0);
13223
13224           function forward(coordinates) {
13225             coordinates = rotate(coordinates[0] * radians, coordinates[1] * radians);
13226             return coordinates[0] *= degrees$1, coordinates[1] *= degrees$1, coordinates;
13227           }
13228
13229           forward.invert = function(coordinates) {
13230             coordinates = rotate.invert(coordinates[0] * radians, coordinates[1] * radians);
13231             return coordinates[0] *= degrees$1, coordinates[1] *= degrees$1, coordinates;
13232           };
13233
13234           return forward;
13235         }
13236
13237         // Generates a circle centered at [0°, 0°], with a given radius and precision.
13238         function circleStream(stream, radius, delta, direction, t0, t1) {
13239           if (!delta) return;
13240           var cosRadius = cos$1(radius),
13241               sinRadius = sin$1(radius),
13242               step = direction * delta;
13243           if (t0 == null) {
13244             t0 = radius + direction * tau$3;
13245             t1 = radius - step / 2;
13246           } else {
13247             t0 = circleRadius(cosRadius, t0);
13248             t1 = circleRadius(cosRadius, t1);
13249             if (direction > 0 ? t0 < t1 : t0 > t1) t0 += direction * tau$3;
13250           }
13251           for (var point, t = t0; direction > 0 ? t > t1 : t < t1; t -= step) {
13252             point = spherical([cosRadius, -sinRadius * cos$1(t), -sinRadius * sin$1(t)]);
13253             stream.point(point[0], point[1]);
13254           }
13255         }
13256
13257         // Returns the signed angle of a cartesian point relative to [cosRadius, 0, 0].
13258         function circleRadius(cosRadius, point) {
13259           point = cartesian(point), point[0] -= cosRadius;
13260           cartesianNormalizeInPlace(point);
13261           var radius = acos(-point[1]);
13262           return ((-point[2] < 0 ? -radius : radius) + tau$3 - epsilon$2) % tau$3;
13263         }
13264
13265         function circle() {
13266           var center = constant$8([0, 0]),
13267               radius = constant$8(90),
13268               precision = constant$8(6),
13269               ring,
13270               rotate,
13271               stream = {point: point};
13272
13273           function point(x, y) {
13274             ring.push(x = rotate(x, y));
13275             x[0] *= degrees$1, x[1] *= degrees$1;
13276           }
13277
13278           function circle() {
13279             var c = center.apply(this, arguments),
13280                 r = radius.apply(this, arguments) * radians,
13281                 p = precision.apply(this, arguments) * radians;
13282             ring = [];
13283             rotate = rotateRadians(-c[0] * radians, -c[1] * radians, 0).invert;
13284             circleStream(stream, r, p, 1);
13285             c = {type: "Polygon", coordinates: [ring]};
13286             ring = rotate = null;
13287             return c;
13288           }
13289
13290           circle.center = function(_) {
13291             return arguments.length ? (center = typeof _ === "function" ? _ : constant$8([+_[0], +_[1]]), circle) : center;
13292           };
13293
13294           circle.radius = function(_) {
13295             return arguments.length ? (radius = typeof _ === "function" ? _ : constant$8(+_), circle) : radius;
13296           };
13297
13298           circle.precision = function(_) {
13299             return arguments.length ? (precision = typeof _ === "function" ? _ : constant$8(+_), circle) : precision;
13300           };
13301
13302           return circle;
13303         }
13304
13305         function clipBuffer() {
13306           var lines = [],
13307               line;
13308           return {
13309             point: function(x, y) {
13310               line.push([x, y]);
13311             },
13312             lineStart: function() {
13313               lines.push(line = []);
13314             },
13315             lineEnd: noop$4,
13316             rejoin: function() {
13317               if (lines.length > 1) lines.push(lines.pop().concat(lines.shift()));
13318             },
13319             result: function() {
13320               var result = lines;
13321               lines = [];
13322               line = null;
13323               return result;
13324             }
13325           };
13326         }
13327
13328         function pointEqual(a, b) {
13329           return abs$2(a[0] - b[0]) < epsilon$2 && abs$2(a[1] - b[1]) < epsilon$2;
13330         }
13331
13332         function Intersection(point, points, other, entry) {
13333           this.x = point;
13334           this.z = points;
13335           this.o = other; // another intersection
13336           this.e = entry; // is an entry?
13337           this.v = false; // visited
13338           this.n = this.p = null; // next & previous
13339         }
13340
13341         // A generalized polygon clipping algorithm: given a polygon that has been cut
13342         // into its visible line segments, and rejoins the segments by interpolating
13343         // along the clip edge.
13344         function clipRejoin(segments, compareIntersection, startInside, interpolate, stream) {
13345           var subject = [],
13346               clip = [],
13347               i,
13348               n;
13349
13350           segments.forEach(function(segment) {
13351             if ((n = segment.length - 1) <= 0) return;
13352             var n, p0 = segment[0], p1 = segment[n], x;
13353
13354             // If the first and last points of a segment are coincident, then treat as a
13355             // closed ring. TODO if all rings are closed, then the winding order of the
13356             // exterior ring should be checked.
13357             if (pointEqual(p0, p1)) {
13358               stream.lineStart();
13359               for (i = 0; i < n; ++i) stream.point((p0 = segment[i])[0], p0[1]);
13360               stream.lineEnd();
13361               return;
13362             }
13363
13364             subject.push(x = new Intersection(p0, segment, null, true));
13365             clip.push(x.o = new Intersection(p0, null, x, false));
13366             subject.push(x = new Intersection(p1, segment, null, false));
13367             clip.push(x.o = new Intersection(p1, null, x, true));
13368           });
13369
13370           if (!subject.length) return;
13371
13372           clip.sort(compareIntersection);
13373           link$1(subject);
13374           link$1(clip);
13375
13376           for (i = 0, n = clip.length; i < n; ++i) {
13377             clip[i].e = startInside = !startInside;
13378           }
13379
13380           var start = subject[0],
13381               points,
13382               point;
13383
13384           while (1) {
13385             // Find first unvisited intersection.
13386             var current = start,
13387                 isSubject = true;
13388             while (current.v) if ((current = current.n) === start) return;
13389             points = current.z;
13390             stream.lineStart();
13391             do {
13392               current.v = current.o.v = true;
13393               if (current.e) {
13394                 if (isSubject) {
13395                   for (i = 0, n = points.length; i < n; ++i) stream.point((point = points[i])[0], point[1]);
13396                 } else {
13397                   interpolate(current.x, current.n.x, 1, stream);
13398                 }
13399                 current = current.n;
13400               } else {
13401                 if (isSubject) {
13402                   points = current.p.z;
13403                   for (i = points.length - 1; i >= 0; --i) stream.point((point = points[i])[0], point[1]);
13404                 } else {
13405                   interpolate(current.x, current.p.x, -1, stream);
13406                 }
13407                 current = current.p;
13408               }
13409               current = current.o;
13410               points = current.z;
13411               isSubject = !isSubject;
13412             } while (!current.v);
13413             stream.lineEnd();
13414           }
13415         }
13416
13417         function link$1(array) {
13418           if (!(n = array.length)) return;
13419           var n,
13420               i = 0,
13421               a = array[0],
13422               b;
13423           while (++i < n) {
13424             a.n = b = array[i];
13425             b.p = a;
13426             a = b;
13427           }
13428           a.n = b = array[0];
13429           b.p = a;
13430         }
13431
13432         var sum$1 = adder();
13433
13434         function polygonContains(polygon, point) {
13435           var lambda = point[0],
13436               phi = point[1],
13437               sinPhi = sin$1(phi),
13438               normal = [sin$1(lambda), -cos$1(lambda), 0],
13439               angle = 0,
13440               winding = 0;
13441
13442           sum$1.reset();
13443
13444           if (sinPhi === 1) phi = halfPi$2 + epsilon$2;
13445           else if (sinPhi === -1) phi = -halfPi$2 - epsilon$2;
13446
13447           for (var i = 0, n = polygon.length; i < n; ++i) {
13448             if (!(m = (ring = polygon[i]).length)) continue;
13449             var ring,
13450                 m,
13451                 point0 = ring[m - 1],
13452                 lambda0 = point0[0],
13453                 phi0 = point0[1] / 2 + quarterPi,
13454                 sinPhi0 = sin$1(phi0),
13455                 cosPhi0 = cos$1(phi0);
13456
13457             for (var j = 0; j < m; ++j, lambda0 = lambda1, sinPhi0 = sinPhi1, cosPhi0 = cosPhi1, point0 = point1) {
13458               var point1 = ring[j],
13459                   lambda1 = point1[0],
13460                   phi1 = point1[1] / 2 + quarterPi,
13461                   sinPhi1 = sin$1(phi1),
13462                   cosPhi1 = cos$1(phi1),
13463                   delta = lambda1 - lambda0,
13464                   sign = delta >= 0 ? 1 : -1,
13465                   absDelta = sign * delta,
13466                   antimeridian = absDelta > pi$3,
13467                   k = sinPhi0 * sinPhi1;
13468
13469               sum$1.add(atan2(k * sign * sin$1(absDelta), cosPhi0 * cosPhi1 + k * cos$1(absDelta)));
13470               angle += antimeridian ? delta + sign * tau$3 : delta;
13471
13472               // Are the longitudes either side of the point’s meridian (lambda),
13473               // and are the latitudes smaller than the parallel (phi)?
13474               if (antimeridian ^ lambda0 >= lambda ^ lambda1 >= lambda) {
13475                 var arc = cartesianCross(cartesian(point0), cartesian(point1));
13476                 cartesianNormalizeInPlace(arc);
13477                 var intersection = cartesianCross(normal, arc);
13478                 cartesianNormalizeInPlace(intersection);
13479                 var phiArc = (antimeridian ^ delta >= 0 ? -1 : 1) * asin(intersection[2]);
13480                 if (phi > phiArc || phi === phiArc && (arc[0] || arc[1])) {
13481                   winding += antimeridian ^ delta >= 0 ? 1 : -1;
13482                 }
13483               }
13484             }
13485           }
13486
13487           // First, determine whether the South pole is inside or outside:
13488           //
13489           // It is inside if:
13490           // * the polygon winds around it in a clockwise direction.
13491           // * the polygon does not (cumulatively) wind around it, but has a negative
13492           //   (counter-clockwise) area.
13493           //
13494           // Second, count the (signed) number of times a segment crosses a lambda
13495           // from the point to the South pole.  If it is zero, then the point is the
13496           // same side as the South pole.
13497
13498           return (angle < -epsilon$2 || angle < epsilon$2 && sum$1 < -epsilon$2) ^ (winding & 1);
13499         }
13500
13501         function clip(pointVisible, clipLine, interpolate, start) {
13502           return function(sink) {
13503             var line = clipLine(sink),
13504                 ringBuffer = clipBuffer(),
13505                 ringSink = clipLine(ringBuffer),
13506                 polygonStarted = false,
13507                 polygon,
13508                 segments,
13509                 ring;
13510
13511             var clip = {
13512               point: point,
13513               lineStart: lineStart,
13514               lineEnd: lineEnd,
13515               polygonStart: function() {
13516                 clip.point = pointRing;
13517                 clip.lineStart = ringStart;
13518                 clip.lineEnd = ringEnd;
13519                 segments = [];
13520                 polygon = [];
13521               },
13522               polygonEnd: function() {
13523                 clip.point = point;
13524                 clip.lineStart = lineStart;
13525                 clip.lineEnd = lineEnd;
13526                 segments = merge(segments);
13527                 var startInside = polygonContains(polygon, start);
13528                 if (segments.length) {
13529                   if (!polygonStarted) sink.polygonStart(), polygonStarted = true;
13530                   clipRejoin(segments, compareIntersection, startInside, interpolate, sink);
13531                 } else if (startInside) {
13532                   if (!polygonStarted) sink.polygonStart(), polygonStarted = true;
13533                   sink.lineStart();
13534                   interpolate(null, null, 1, sink);
13535                   sink.lineEnd();
13536                 }
13537                 if (polygonStarted) sink.polygonEnd(), polygonStarted = false;
13538                 segments = polygon = null;
13539               },
13540               sphere: function() {
13541                 sink.polygonStart();
13542                 sink.lineStart();
13543                 interpolate(null, null, 1, sink);
13544                 sink.lineEnd();
13545                 sink.polygonEnd();
13546               }
13547             };
13548
13549             function point(lambda, phi) {
13550               if (pointVisible(lambda, phi)) sink.point(lambda, phi);
13551             }
13552
13553             function pointLine(lambda, phi) {
13554               line.point(lambda, phi);
13555             }
13556
13557             function lineStart() {
13558               clip.point = pointLine;
13559               line.lineStart();
13560             }
13561
13562             function lineEnd() {
13563               clip.point = point;
13564               line.lineEnd();
13565             }
13566
13567             function pointRing(lambda, phi) {
13568               ring.push([lambda, phi]);
13569               ringSink.point(lambda, phi);
13570             }
13571
13572             function ringStart() {
13573               ringSink.lineStart();
13574               ring = [];
13575             }
13576
13577             function ringEnd() {
13578               pointRing(ring[0][0], ring[0][1]);
13579               ringSink.lineEnd();
13580
13581               var clean = ringSink.clean(),
13582                   ringSegments = ringBuffer.result(),
13583                   i, n = ringSegments.length, m,
13584                   segment,
13585                   point;
13586
13587               ring.pop();
13588               polygon.push(ring);
13589               ring = null;
13590
13591               if (!n) return;
13592
13593               // No intersections.
13594               if (clean & 1) {
13595                 segment = ringSegments[0];
13596                 if ((m = segment.length - 1) > 0) {
13597                   if (!polygonStarted) sink.polygonStart(), polygonStarted = true;
13598                   sink.lineStart();
13599                   for (i = 0; i < m; ++i) sink.point((point = segment[i])[0], point[1]);
13600                   sink.lineEnd();
13601                 }
13602                 return;
13603               }
13604
13605               // Rejoin connected segments.
13606               // TODO reuse ringBuffer.rejoin()?
13607               if (n > 1 && clean & 2) ringSegments.push(ringSegments.pop().concat(ringSegments.shift()));
13608
13609               segments.push(ringSegments.filter(validSegment));
13610             }
13611
13612             return clip;
13613           };
13614         }
13615
13616         function validSegment(segment) {
13617           return segment.length > 1;
13618         }
13619
13620         // Intersections are sorted along the clip edge. For both antimeridian cutting
13621         // and circle clipping, the same comparison is used.
13622         function compareIntersection(a, b) {
13623           return ((a = a.x)[0] < 0 ? a[1] - halfPi$2 - epsilon$2 : halfPi$2 - a[1])
13624                - ((b = b.x)[0] < 0 ? b[1] - halfPi$2 - epsilon$2 : halfPi$2 - b[1]);
13625         }
13626
13627         var clipAntimeridian = clip(
13628           function() { return true; },
13629           clipAntimeridianLine,
13630           clipAntimeridianInterpolate,
13631           [-pi$3, -halfPi$2]
13632         );
13633
13634         // Takes a line and cuts into visible segments. Return values: 0 - there were
13635         // intersections or the line was empty; 1 - no intersections; 2 - there were
13636         // intersections, and the first and last segments should be rejoined.
13637         function clipAntimeridianLine(stream) {
13638           var lambda0 = NaN,
13639               phi0 = NaN,
13640               sign0 = NaN,
13641               clean; // no intersections
13642
13643           return {
13644             lineStart: function() {
13645               stream.lineStart();
13646               clean = 1;
13647             },
13648             point: function(lambda1, phi1) {
13649               var sign1 = lambda1 > 0 ? pi$3 : -pi$3,
13650                   delta = abs$2(lambda1 - lambda0);
13651               if (abs$2(delta - pi$3) < epsilon$2) { // line crosses a pole
13652                 stream.point(lambda0, phi0 = (phi0 + phi1) / 2 > 0 ? halfPi$2 : -halfPi$2);
13653                 stream.point(sign0, phi0);
13654                 stream.lineEnd();
13655                 stream.lineStart();
13656                 stream.point(sign1, phi0);
13657                 stream.point(lambda1, phi0);
13658                 clean = 0;
13659               } else if (sign0 !== sign1 && delta >= pi$3) { // line crosses antimeridian
13660                 if (abs$2(lambda0 - sign0) < epsilon$2) lambda0 -= sign0 * epsilon$2; // handle degeneracies
13661                 if (abs$2(lambda1 - sign1) < epsilon$2) lambda1 -= sign1 * epsilon$2;
13662                 phi0 = clipAntimeridianIntersect(lambda0, phi0, lambda1, phi1);
13663                 stream.point(sign0, phi0);
13664                 stream.lineEnd();
13665                 stream.lineStart();
13666                 stream.point(sign1, phi0);
13667                 clean = 0;
13668               }
13669               stream.point(lambda0 = lambda1, phi0 = phi1);
13670               sign0 = sign1;
13671             },
13672             lineEnd: function() {
13673               stream.lineEnd();
13674               lambda0 = phi0 = NaN;
13675             },
13676             clean: function() {
13677               return 2 - clean; // if intersections, rejoin first and last segments
13678             }
13679           };
13680         }
13681
13682         function clipAntimeridianIntersect(lambda0, phi0, lambda1, phi1) {
13683           var cosPhi0,
13684               cosPhi1,
13685               sinLambda0Lambda1 = sin$1(lambda0 - lambda1);
13686           return abs$2(sinLambda0Lambda1) > epsilon$2
13687               ? atan((sin$1(phi0) * (cosPhi1 = cos$1(phi1)) * sin$1(lambda1)
13688                   - sin$1(phi1) * (cosPhi0 = cos$1(phi0)) * sin$1(lambda0))
13689                   / (cosPhi0 * cosPhi1 * sinLambda0Lambda1))
13690               : (phi0 + phi1) / 2;
13691         }
13692
13693         function clipAntimeridianInterpolate(from, to, direction, stream) {
13694           var phi;
13695           if (from == null) {
13696             phi = direction * halfPi$2;
13697             stream.point(-pi$3, phi);
13698             stream.point(0, phi);
13699             stream.point(pi$3, phi);
13700             stream.point(pi$3, 0);
13701             stream.point(pi$3, -phi);
13702             stream.point(0, -phi);
13703             stream.point(-pi$3, -phi);
13704             stream.point(-pi$3, 0);
13705             stream.point(-pi$3, phi);
13706           } else if (abs$2(from[0] - to[0]) > epsilon$2) {
13707             var lambda = from[0] < to[0] ? pi$3 : -pi$3;
13708             phi = direction * lambda / 2;
13709             stream.point(-lambda, phi);
13710             stream.point(0, phi);
13711             stream.point(lambda, phi);
13712           } else {
13713             stream.point(to[0], to[1]);
13714           }
13715         }
13716
13717         function clipCircle(radius) {
13718           var cr = cos$1(radius),
13719               delta = 6 * radians,
13720               smallRadius = cr > 0,
13721               notHemisphere = abs$2(cr) > epsilon$2; // TODO optimise for this common case
13722
13723           function interpolate(from, to, direction, stream) {
13724             circleStream(stream, radius, delta, direction, from, to);
13725           }
13726
13727           function visible(lambda, phi) {
13728             return cos$1(lambda) * cos$1(phi) > cr;
13729           }
13730
13731           // Takes a line and cuts into visible segments. Return values used for polygon
13732           // clipping: 0 - there were intersections or the line was empty; 1 - no
13733           // intersections 2 - there were intersections, and the first and last segments
13734           // should be rejoined.
13735           function clipLine(stream) {
13736             var point0, // previous point
13737                 c0, // code for previous point
13738                 v0, // visibility of previous point
13739                 v00, // visibility of first point
13740                 clean; // no intersections
13741             return {
13742               lineStart: function() {
13743                 v00 = v0 = false;
13744                 clean = 1;
13745               },
13746               point: function(lambda, phi) {
13747                 var point1 = [lambda, phi],
13748                     point2,
13749                     v = visible(lambda, phi),
13750                     c = smallRadius
13751                       ? v ? 0 : code(lambda, phi)
13752                       : v ? code(lambda + (lambda < 0 ? pi$3 : -pi$3), phi) : 0;
13753                 if (!point0 && (v00 = v0 = v)) stream.lineStart();
13754                 // Handle degeneracies.
13755                 // TODO ignore if not clipping polygons.
13756                 if (v !== v0) {
13757                   point2 = intersect(point0, point1);
13758                   if (!point2 || pointEqual(point0, point2) || pointEqual(point1, point2)) {
13759                     point1[0] += epsilon$2;
13760                     point1[1] += epsilon$2;
13761                     v = visible(point1[0], point1[1]);
13762                   }
13763                 }
13764                 if (v !== v0) {
13765                   clean = 0;
13766                   if (v) {
13767                     // outside going in
13768                     stream.lineStart();
13769                     point2 = intersect(point1, point0);
13770                     stream.point(point2[0], point2[1]);
13771                   } else {
13772                     // inside going out
13773                     point2 = intersect(point0, point1);
13774                     stream.point(point2[0], point2[1]);
13775                     stream.lineEnd();
13776                   }
13777                   point0 = point2;
13778                 } else if (notHemisphere && point0 && smallRadius ^ v) {
13779                   var t;
13780                   // If the codes for two points are different, or are both zero,
13781                   // and there this segment intersects with the small circle.
13782                   if (!(c & c0) && (t = intersect(point1, point0, true))) {
13783                     clean = 0;
13784                     if (smallRadius) {
13785                       stream.lineStart();
13786                       stream.point(t[0][0], t[0][1]);
13787                       stream.point(t[1][0], t[1][1]);
13788                       stream.lineEnd();
13789                     } else {
13790                       stream.point(t[1][0], t[1][1]);
13791                       stream.lineEnd();
13792                       stream.lineStart();
13793                       stream.point(t[0][0], t[0][1]);
13794                     }
13795                   }
13796                 }
13797                 if (v && (!point0 || !pointEqual(point0, point1))) {
13798                   stream.point(point1[0], point1[1]);
13799                 }
13800                 point0 = point1, v0 = v, c0 = c;
13801               },
13802               lineEnd: function() {
13803                 if (v0) stream.lineEnd();
13804                 point0 = null;
13805               },
13806               // Rejoin first and last segments if there were intersections and the first
13807               // and last points were visible.
13808               clean: function() {
13809                 return clean | ((v00 && v0) << 1);
13810               }
13811             };
13812           }
13813
13814           // Intersects the great circle between a and b with the clip circle.
13815           function intersect(a, b, two) {
13816             var pa = cartesian(a),
13817                 pb = cartesian(b);
13818
13819             // We have two planes, n1.p = d1 and n2.p = d2.
13820             // Find intersection line p(t) = c1 n1 + c2 n2 + t (n1 ⨯ n2).
13821             var n1 = [1, 0, 0], // normal
13822                 n2 = cartesianCross(pa, pb),
13823                 n2n2 = cartesianDot(n2, n2),
13824                 n1n2 = n2[0], // cartesianDot(n1, n2),
13825                 determinant = n2n2 - n1n2 * n1n2;
13826
13827             // Two polar points.
13828             if (!determinant) return !two && a;
13829
13830             var c1 =  cr * n2n2 / determinant,
13831                 c2 = -cr * n1n2 / determinant,
13832                 n1xn2 = cartesianCross(n1, n2),
13833                 A = cartesianScale(n1, c1),
13834                 B = cartesianScale(n2, c2);
13835             cartesianAddInPlace(A, B);
13836
13837             // Solve |p(t)|^2 = 1.
13838             var u = n1xn2,
13839                 w = cartesianDot(A, u),
13840                 uu = cartesianDot(u, u),
13841                 t2 = w * w - uu * (cartesianDot(A, A) - 1);
13842
13843             if (t2 < 0) return;
13844
13845             var t = sqrt(t2),
13846                 q = cartesianScale(u, (-w - t) / uu);
13847             cartesianAddInPlace(q, A);
13848             q = spherical(q);
13849
13850             if (!two) return q;
13851
13852             // Two intersection points.
13853             var lambda0 = a[0],
13854                 lambda1 = b[0],
13855                 phi0 = a[1],
13856                 phi1 = b[1],
13857                 z;
13858
13859             if (lambda1 < lambda0) z = lambda0, lambda0 = lambda1, lambda1 = z;
13860
13861             var delta = lambda1 - lambda0,
13862                 polar = abs$2(delta - pi$3) < epsilon$2,
13863                 meridian = polar || delta < epsilon$2;
13864
13865             if (!polar && phi1 < phi0) z = phi0, phi0 = phi1, phi1 = z;
13866
13867             // Check that the first point is between a and b.
13868             if (meridian
13869                 ? polar
13870                   ? phi0 + phi1 > 0 ^ q[1] < (abs$2(q[0] - lambda0) < epsilon$2 ? phi0 : phi1)
13871                   : phi0 <= q[1] && q[1] <= phi1
13872                 : delta > pi$3 ^ (lambda0 <= q[0] && q[0] <= lambda1)) {
13873               var q1 = cartesianScale(u, (-w + t) / uu);
13874               cartesianAddInPlace(q1, A);
13875               return [q, spherical(q1)];
13876             }
13877           }
13878
13879           // Generates a 4-bit vector representing the location of a point relative to
13880           // the small circle's bounding box.
13881           function code(lambda, phi) {
13882             var r = smallRadius ? radius : pi$3 - radius,
13883                 code = 0;
13884             if (lambda < -r) code |= 1; // left
13885             else if (lambda > r) code |= 2; // right
13886             if (phi < -r) code |= 4; // below
13887             else if (phi > r) code |= 8; // above
13888             return code;
13889           }
13890
13891           return clip(visible, clipLine, interpolate, smallRadius ? [0, -radius] : [-pi$3, radius - pi$3]);
13892         }
13893
13894         function clipLine(a, b, x0, y0, x1, y1) {
13895           var ax = a[0],
13896               ay = a[1],
13897               bx = b[0],
13898               by = b[1],
13899               t0 = 0,
13900               t1 = 1,
13901               dx = bx - ax,
13902               dy = by - ay,
13903               r;
13904
13905           r = x0 - ax;
13906           if (!dx && r > 0) return;
13907           r /= dx;
13908           if (dx < 0) {
13909             if (r < t0) return;
13910             if (r < t1) t1 = r;
13911           } else if (dx > 0) {
13912             if (r > t1) return;
13913             if (r > t0) t0 = r;
13914           }
13915
13916           r = x1 - ax;
13917           if (!dx && r < 0) return;
13918           r /= dx;
13919           if (dx < 0) {
13920             if (r > t1) return;
13921             if (r > t0) t0 = r;
13922           } else if (dx > 0) {
13923             if (r < t0) return;
13924             if (r < t1) t1 = r;
13925           }
13926
13927           r = y0 - ay;
13928           if (!dy && r > 0) return;
13929           r /= dy;
13930           if (dy < 0) {
13931             if (r < t0) return;
13932             if (r < t1) t1 = r;
13933           } else if (dy > 0) {
13934             if (r > t1) return;
13935             if (r > t0) t0 = r;
13936           }
13937
13938           r = y1 - ay;
13939           if (!dy && r < 0) return;
13940           r /= dy;
13941           if (dy < 0) {
13942             if (r > t1) return;
13943             if (r > t0) t0 = r;
13944           } else if (dy > 0) {
13945             if (r < t0) return;
13946             if (r < t1) t1 = r;
13947           }
13948
13949           if (t0 > 0) a[0] = ax + t0 * dx, a[1] = ay + t0 * dy;
13950           if (t1 < 1) b[0] = ax + t1 * dx, b[1] = ay + t1 * dy;
13951           return true;
13952         }
13953
13954         var clipMax = 1e9, clipMin = -clipMax;
13955
13956         // TODO Use d3-polygon’s polygonContains here for the ring check?
13957         // TODO Eliminate duplicate buffering in clipBuffer and polygon.push?
13958
13959         function clipRectangle(x0, y0, x1, y1) {
13960
13961           function visible(x, y) {
13962             return x0 <= x && x <= x1 && y0 <= y && y <= y1;
13963           }
13964
13965           function interpolate(from, to, direction, stream) {
13966             var a = 0, a1 = 0;
13967             if (from == null
13968                 || (a = corner(from, direction)) !== (a1 = corner(to, direction))
13969                 || comparePoint(from, to) < 0 ^ direction > 0) {
13970               do stream.point(a === 0 || a === 3 ? x0 : x1, a > 1 ? y1 : y0);
13971               while ((a = (a + direction + 4) % 4) !== a1);
13972             } else {
13973               stream.point(to[0], to[1]);
13974             }
13975           }
13976
13977           function corner(p, direction) {
13978             return abs$2(p[0] - x0) < epsilon$2 ? direction > 0 ? 0 : 3
13979                 : abs$2(p[0] - x1) < epsilon$2 ? direction > 0 ? 2 : 1
13980                 : abs$2(p[1] - y0) < epsilon$2 ? direction > 0 ? 1 : 0
13981                 : direction > 0 ? 3 : 2; // abs(p[1] - y1) < epsilon
13982           }
13983
13984           function compareIntersection(a, b) {
13985             return comparePoint(a.x, b.x);
13986           }
13987
13988           function comparePoint(a, b) {
13989             var ca = corner(a, 1),
13990                 cb = corner(b, 1);
13991             return ca !== cb ? ca - cb
13992                 : ca === 0 ? b[1] - a[1]
13993                 : ca === 1 ? a[0] - b[0]
13994                 : ca === 2 ? a[1] - b[1]
13995                 : b[0] - a[0];
13996           }
13997
13998           return function(stream) {
13999             var activeStream = stream,
14000                 bufferStream = clipBuffer(),
14001                 segments,
14002                 polygon,
14003                 ring,
14004                 x__, y__, v__, // first point
14005                 x_, y_, v_, // previous point
14006                 first,
14007                 clean;
14008
14009             var clipStream = {
14010               point: point,
14011               lineStart: lineStart,
14012               lineEnd: lineEnd,
14013               polygonStart: polygonStart,
14014               polygonEnd: polygonEnd
14015             };
14016
14017             function point(x, y) {
14018               if (visible(x, y)) activeStream.point(x, y);
14019             }
14020
14021             function polygonInside() {
14022               var winding = 0;
14023
14024               for (var i = 0, n = polygon.length; i < n; ++i) {
14025                 for (var ring = polygon[i], j = 1, m = ring.length, point = ring[0], a0, a1, b0 = point[0], b1 = point[1]; j < m; ++j) {
14026                   a0 = b0, a1 = b1, point = ring[j], b0 = point[0], b1 = point[1];
14027                   if (a1 <= y1) { if (b1 > y1 && (b0 - a0) * (y1 - a1) > (b1 - a1) * (x0 - a0)) ++winding; }
14028                   else { if (b1 <= y1 && (b0 - a0) * (y1 - a1) < (b1 - a1) * (x0 - a0)) --winding; }
14029                 }
14030               }
14031
14032               return winding;
14033             }
14034
14035             // Buffer geometry within a polygon and then clip it en masse.
14036             function polygonStart() {
14037               activeStream = bufferStream, segments = [], polygon = [], clean = true;
14038             }
14039
14040             function polygonEnd() {
14041               var startInside = polygonInside(),
14042                   cleanInside = clean && startInside,
14043                   visible = (segments = merge(segments)).length;
14044               if (cleanInside || visible) {
14045                 stream.polygonStart();
14046                 if (cleanInside) {
14047                   stream.lineStart();
14048                   interpolate(null, null, 1, stream);
14049                   stream.lineEnd();
14050                 }
14051                 if (visible) {
14052                   clipRejoin(segments, compareIntersection, startInside, interpolate, stream);
14053                 }
14054                 stream.polygonEnd();
14055               }
14056               activeStream = stream, segments = polygon = ring = null;
14057             }
14058
14059             function lineStart() {
14060               clipStream.point = linePoint;
14061               if (polygon) polygon.push(ring = []);
14062               first = true;
14063               v_ = false;
14064               x_ = y_ = NaN;
14065             }
14066
14067             // TODO rather than special-case polygons, simply handle them separately.
14068             // Ideally, coincident intersection points should be jittered to avoid
14069             // clipping issues.
14070             function lineEnd() {
14071               if (segments) {
14072                 linePoint(x__, y__);
14073                 if (v__ && v_) bufferStream.rejoin();
14074                 segments.push(bufferStream.result());
14075               }
14076               clipStream.point = point;
14077               if (v_) activeStream.lineEnd();
14078             }
14079
14080             function linePoint(x, y) {
14081               var v = visible(x, y);
14082               if (polygon) ring.push([x, y]);
14083               if (first) {
14084                 x__ = x, y__ = y, v__ = v;
14085                 first = false;
14086                 if (v) {
14087                   activeStream.lineStart();
14088                   activeStream.point(x, y);
14089                 }
14090               } else {
14091                 if (v && v_) activeStream.point(x, y);
14092                 else {
14093                   var a = [x_ = Math.max(clipMin, Math.min(clipMax, x_)), y_ = Math.max(clipMin, Math.min(clipMax, y_))],
14094                       b = [x = Math.max(clipMin, Math.min(clipMax, x)), y = Math.max(clipMin, Math.min(clipMax, y))];
14095                   if (clipLine(a, b, x0, y0, x1, y1)) {
14096                     if (!v_) {
14097                       activeStream.lineStart();
14098                       activeStream.point(a[0], a[1]);
14099                     }
14100                     activeStream.point(b[0], b[1]);
14101                     if (!v) activeStream.lineEnd();
14102                     clean = false;
14103                   } else if (v) {
14104                     activeStream.lineStart();
14105                     activeStream.point(x, y);
14106                     clean = false;
14107                   }
14108                 }
14109               }
14110               x_ = x, y_ = y, v_ = v;
14111             }
14112
14113             return clipStream;
14114           };
14115         }
14116
14117         function extent$1() {
14118           var x0 = 0,
14119               y0 = 0,
14120               x1 = 960,
14121               y1 = 500,
14122               cache,
14123               cacheStream,
14124               clip;
14125
14126           return clip = {
14127             stream: function(stream) {
14128               return cache && cacheStream === stream ? cache : cache = clipRectangle(x0, y0, x1, y1)(cacheStream = stream);
14129             },
14130             extent: function(_) {
14131               return arguments.length ? (x0 = +_[0][0], y0 = +_[0][1], x1 = +_[1][0], y1 = +_[1][1], cache = cacheStream = null, clip) : [[x0, y0], [x1, y1]];
14132             }
14133           };
14134         }
14135
14136         var lengthSum = adder(),
14137             lambda0$2,
14138             sinPhi0$1,
14139             cosPhi0$1;
14140
14141         var lengthStream = {
14142           sphere: noop$4,
14143           point: noop$4,
14144           lineStart: lengthLineStart,
14145           lineEnd: noop$4,
14146           polygonStart: noop$4,
14147           polygonEnd: noop$4
14148         };
14149
14150         function lengthLineStart() {
14151           lengthStream.point = lengthPointFirst;
14152           lengthStream.lineEnd = lengthLineEnd;
14153         }
14154
14155         function lengthLineEnd() {
14156           lengthStream.point = lengthStream.lineEnd = noop$4;
14157         }
14158
14159         function lengthPointFirst(lambda, phi) {
14160           lambda *= radians, phi *= radians;
14161           lambda0$2 = lambda, sinPhi0$1 = sin$1(phi), cosPhi0$1 = cos$1(phi);
14162           lengthStream.point = lengthPoint;
14163         }
14164
14165         function lengthPoint(lambda, phi) {
14166           lambda *= radians, phi *= radians;
14167           var sinPhi = sin$1(phi),
14168               cosPhi = cos$1(phi),
14169               delta = abs$2(lambda - lambda0$2),
14170               cosDelta = cos$1(delta),
14171               sinDelta = sin$1(delta),
14172               x = cosPhi * sinDelta,
14173               y = cosPhi0$1 * sinPhi - sinPhi0$1 * cosPhi * cosDelta,
14174               z = sinPhi0$1 * sinPhi + cosPhi0$1 * cosPhi * cosDelta;
14175           lengthSum.add(atan2(sqrt(x * x + y * y), z));
14176           lambda0$2 = lambda, sinPhi0$1 = sinPhi, cosPhi0$1 = cosPhi;
14177         }
14178
14179         function d3_geoLength(object) {
14180           lengthSum.reset();
14181           d3_geoStream(object, lengthStream);
14182           return +lengthSum;
14183         }
14184
14185         var coordinates = [null, null],
14186             object$1 = {type: "LineString", coordinates: coordinates};
14187
14188         function distance(a, b) {
14189           coordinates[0] = a;
14190           coordinates[1] = b;
14191           return d3_geoLength(object$1);
14192         }
14193
14194         var containsObjectType = {
14195           Feature: function(object, point) {
14196             return containsGeometry(object.geometry, point);
14197           },
14198           FeatureCollection: function(object, point) {
14199             var features = object.features, i = -1, n = features.length;
14200             while (++i < n) if (containsGeometry(features[i].geometry, point)) return true;
14201             return false;
14202           }
14203         };
14204
14205         var containsGeometryType = {
14206           Sphere: function() {
14207             return true;
14208           },
14209           Point: function(object, point) {
14210             return containsPoint(object.coordinates, point);
14211           },
14212           MultiPoint: function(object, point) {
14213             var coordinates = object.coordinates, i = -1, n = coordinates.length;
14214             while (++i < n) if (containsPoint(coordinates[i], point)) return true;
14215             return false;
14216           },
14217           LineString: function(object, point) {
14218             return containsLine(object.coordinates, point);
14219           },
14220           MultiLineString: function(object, point) {
14221             var coordinates = object.coordinates, i = -1, n = coordinates.length;
14222             while (++i < n) if (containsLine(coordinates[i], point)) return true;
14223             return false;
14224           },
14225           Polygon: function(object, point) {
14226             return containsPolygon(object.coordinates, point);
14227           },
14228           MultiPolygon: function(object, point) {
14229             var coordinates = object.coordinates, i = -1, n = coordinates.length;
14230             while (++i < n) if (containsPolygon(coordinates[i], point)) return true;
14231             return false;
14232           },
14233           GeometryCollection: function(object, point) {
14234             var geometries = object.geometries, i = -1, n = geometries.length;
14235             while (++i < n) if (containsGeometry(geometries[i], point)) return true;
14236             return false;
14237           }
14238         };
14239
14240         function containsGeometry(geometry, point) {
14241           return geometry && containsGeometryType.hasOwnProperty(geometry.type)
14242               ? containsGeometryType[geometry.type](geometry, point)
14243               : false;
14244         }
14245
14246         function containsPoint(coordinates, point) {
14247           return distance(coordinates, point) === 0;
14248         }
14249
14250         function containsLine(coordinates, point) {
14251           var ab = distance(coordinates[0], coordinates[1]),
14252               ao = distance(coordinates[0], point),
14253               ob = distance(point, coordinates[1]);
14254           return ao + ob <= ab + epsilon$2;
14255         }
14256
14257         function containsPolygon(coordinates, point) {
14258           return !!polygonContains(coordinates.map(ringRadians), pointRadians(point));
14259         }
14260
14261         function ringRadians(ring) {
14262           return ring = ring.map(pointRadians), ring.pop(), ring;
14263         }
14264
14265         function pointRadians(point) {
14266           return [point[0] * radians, point[1] * radians];
14267         }
14268
14269         function contains$2(object, point) {
14270           return (object && containsObjectType.hasOwnProperty(object.type)
14271               ? containsObjectType[object.type]
14272               : containsGeometry)(object, point);
14273         }
14274
14275         function graticuleX(y0, y1, dy) {
14276           var y = d3_range(y0, y1 - epsilon$2, dy).concat(y1);
14277           return function(x) { return y.map(function(y) { return [x, y]; }); };
14278         }
14279
14280         function graticuleY(x0, x1, dx) {
14281           var x = d3_range(x0, x1 - epsilon$2, dx).concat(x1);
14282           return function(y) { return x.map(function(x) { return [x, y]; }); };
14283         }
14284
14285         function graticule() {
14286           var x1, x0, X1, X0,
14287               y1, y0, Y1, Y0,
14288               dx = 10, dy = dx, DX = 90, DY = 360,
14289               x, y, X, Y,
14290               precision = 2.5;
14291
14292           function graticule() {
14293             return {type: "MultiLineString", coordinates: lines()};
14294           }
14295
14296           function lines() {
14297             return d3_range(ceil(X0 / DX) * DX, X1, DX).map(X)
14298                 .concat(d3_range(ceil(Y0 / DY) * DY, Y1, DY).map(Y))
14299                 .concat(d3_range(ceil(x0 / dx) * dx, x1, dx).filter(function(x) { return abs$2(x % DX) > epsilon$2; }).map(x))
14300                 .concat(d3_range(ceil(y0 / dy) * dy, y1, dy).filter(function(y) { return abs$2(y % DY) > epsilon$2; }).map(y));
14301           }
14302
14303           graticule.lines = function() {
14304             return lines().map(function(coordinates) { return {type: "LineString", coordinates: coordinates}; });
14305           };
14306
14307           graticule.outline = function() {
14308             return {
14309               type: "Polygon",
14310               coordinates: [
14311                 X(X0).concat(
14312                 Y(Y1).slice(1),
14313                 X(X1).reverse().slice(1),
14314                 Y(Y0).reverse().slice(1))
14315               ]
14316             };
14317           };
14318
14319           graticule.extent = function(_) {
14320             if (!arguments.length) return graticule.extentMinor();
14321             return graticule.extentMajor(_).extentMinor(_);
14322           };
14323
14324           graticule.extentMajor = function(_) {
14325             if (!arguments.length) return [[X0, Y0], [X1, Y1]];
14326             X0 = +_[0][0], X1 = +_[1][0];
14327             Y0 = +_[0][1], Y1 = +_[1][1];
14328             if (X0 > X1) _ = X0, X0 = X1, X1 = _;
14329             if (Y0 > Y1) _ = Y0, Y0 = Y1, Y1 = _;
14330             return graticule.precision(precision);
14331           };
14332
14333           graticule.extentMinor = function(_) {
14334             if (!arguments.length) return [[x0, y0], [x1, y1]];
14335             x0 = +_[0][0], x1 = +_[1][0];
14336             y0 = +_[0][1], y1 = +_[1][1];
14337             if (x0 > x1) _ = x0, x0 = x1, x1 = _;
14338             if (y0 > y1) _ = y0, y0 = y1, y1 = _;
14339             return graticule.precision(precision);
14340           };
14341
14342           graticule.step = function(_) {
14343             if (!arguments.length) return graticule.stepMinor();
14344             return graticule.stepMajor(_).stepMinor(_);
14345           };
14346
14347           graticule.stepMajor = function(_) {
14348             if (!arguments.length) return [DX, DY];
14349             DX = +_[0], DY = +_[1];
14350             return graticule;
14351           };
14352
14353           graticule.stepMinor = function(_) {
14354             if (!arguments.length) return [dx, dy];
14355             dx = +_[0], dy = +_[1];
14356             return graticule;
14357           };
14358
14359           graticule.precision = function(_) {
14360             if (!arguments.length) return precision;
14361             precision = +_;
14362             x = graticuleX(y0, y1, 90);
14363             y = graticuleY(x0, x1, precision);
14364             X = graticuleX(Y0, Y1, 90);
14365             Y = graticuleY(X0, X1, precision);
14366             return graticule;
14367           };
14368
14369           return graticule
14370               .extentMajor([[-180, -90 + epsilon$2], [180, 90 - epsilon$2]])
14371               .extentMinor([[-180, -80 - epsilon$2], [180, 80 + epsilon$2]]);
14372         }
14373
14374         function graticule10() {
14375           return graticule()();
14376         }
14377
14378         function interpolate$1(a, b) {
14379           var x0 = a[0] * radians,
14380               y0 = a[1] * radians,
14381               x1 = b[0] * radians,
14382               y1 = b[1] * radians,
14383               cy0 = cos$1(y0),
14384               sy0 = sin$1(y0),
14385               cy1 = cos$1(y1),
14386               sy1 = sin$1(y1),
14387               kx0 = cy0 * cos$1(x0),
14388               ky0 = cy0 * sin$1(x0),
14389               kx1 = cy1 * cos$1(x1),
14390               ky1 = cy1 * sin$1(x1),
14391               d = 2 * asin(sqrt(haversin(y1 - y0) + cy0 * cy1 * haversin(x1 - x0))),
14392               k = sin$1(d);
14393
14394           var interpolate = d ? function(t) {
14395             var B = sin$1(t *= d) / k,
14396                 A = sin$1(d - t) / k,
14397                 x = A * kx0 + B * kx1,
14398                 y = A * ky0 + B * ky1,
14399                 z = A * sy0 + B * sy1;
14400             return [
14401               atan2(y, x) * degrees$1,
14402               atan2(z, sqrt(x * x + y * y)) * degrees$1
14403             ];
14404           } : function() {
14405             return [x0 * degrees$1, y0 * degrees$1];
14406           };
14407
14408           interpolate.distance = d;
14409
14410           return interpolate;
14411         }
14412
14413         function identity$4(x) {
14414           return x;
14415         }
14416
14417         var areaSum$1 = adder(),
14418             areaRingSum$1 = adder(),
14419             x00,
14420             y00,
14421             x0$1,
14422             y0$1;
14423
14424         var areaStream$1 = {
14425           point: noop$4,
14426           lineStart: noop$4,
14427           lineEnd: noop$4,
14428           polygonStart: function() {
14429             areaStream$1.lineStart = areaRingStart$1;
14430             areaStream$1.lineEnd = areaRingEnd$1;
14431           },
14432           polygonEnd: function() {
14433             areaStream$1.lineStart = areaStream$1.lineEnd = areaStream$1.point = noop$4;
14434             areaSum$1.add(abs$2(areaRingSum$1));
14435             areaRingSum$1.reset();
14436           },
14437           result: function() {
14438             var area = areaSum$1 / 2;
14439             areaSum$1.reset();
14440             return area;
14441           }
14442         };
14443
14444         function areaRingStart$1() {
14445           areaStream$1.point = areaPointFirst$1;
14446         }
14447
14448         function areaPointFirst$1(x, y) {
14449           areaStream$1.point = areaPoint$1;
14450           x00 = x0$1 = x, y00 = y0$1 = y;
14451         }
14452
14453         function areaPoint$1(x, y) {
14454           areaRingSum$1.add(y0$1 * x - x0$1 * y);
14455           x0$1 = x, y0$1 = y;
14456         }
14457
14458         function areaRingEnd$1() {
14459           areaPoint$1(x00, y00);
14460         }
14461
14462         var x0$2 = Infinity,
14463             y0$2 = x0$2,
14464             x1 = -x0$2,
14465             y1 = x1;
14466
14467         var boundsStream$1 = {
14468           point: boundsPoint$1,
14469           lineStart: noop$4,
14470           lineEnd: noop$4,
14471           polygonStart: noop$4,
14472           polygonEnd: noop$4,
14473           result: function() {
14474             var bounds = [[x0$2, y0$2], [x1, y1]];
14475             x1 = y1 = -(y0$2 = x0$2 = Infinity);
14476             return bounds;
14477           }
14478         };
14479
14480         function boundsPoint$1(x, y) {
14481           if (x < x0$2) x0$2 = x;
14482           if (x > x1) x1 = x;
14483           if (y < y0$2) y0$2 = y;
14484           if (y > y1) y1 = y;
14485         }
14486
14487         // TODO Enforce positive area for exterior, negative area for interior?
14488
14489         var X0$1 = 0,
14490             Y0$1 = 0,
14491             Z0$1 = 0,
14492             X1$1 = 0,
14493             Y1$1 = 0,
14494             Z1$1 = 0,
14495             X2$1 = 0,
14496             Y2$1 = 0,
14497             Z2$1 = 0,
14498             x00$1,
14499             y00$1,
14500             x0$3,
14501             y0$3;
14502
14503         var centroidStream$1 = {
14504           point: centroidPoint$1,
14505           lineStart: centroidLineStart$1,
14506           lineEnd: centroidLineEnd$1,
14507           polygonStart: function() {
14508             centroidStream$1.lineStart = centroidRingStart$1;
14509             centroidStream$1.lineEnd = centroidRingEnd$1;
14510           },
14511           polygonEnd: function() {
14512             centroidStream$1.point = centroidPoint$1;
14513             centroidStream$1.lineStart = centroidLineStart$1;
14514             centroidStream$1.lineEnd = centroidLineEnd$1;
14515           },
14516           result: function() {
14517             var centroid = Z2$1 ? [X2$1 / Z2$1, Y2$1 / Z2$1]
14518                 : Z1$1 ? [X1$1 / Z1$1, Y1$1 / Z1$1]
14519                 : Z0$1 ? [X0$1 / Z0$1, Y0$1 / Z0$1]
14520                 : [NaN, NaN];
14521             X0$1 = Y0$1 = Z0$1 =
14522             X1$1 = Y1$1 = Z1$1 =
14523             X2$1 = Y2$1 = Z2$1 = 0;
14524             return centroid;
14525           }
14526         };
14527
14528         function centroidPoint$1(x, y) {
14529           X0$1 += x;
14530           Y0$1 += y;
14531           ++Z0$1;
14532         }
14533
14534         function centroidLineStart$1() {
14535           centroidStream$1.point = centroidPointFirstLine;
14536         }
14537
14538         function centroidPointFirstLine(x, y) {
14539           centroidStream$1.point = centroidPointLine;
14540           centroidPoint$1(x0$3 = x, y0$3 = y);
14541         }
14542
14543         function centroidPointLine(x, y) {
14544           var dx = x - x0$3, dy = y - y0$3, z = sqrt(dx * dx + dy * dy);
14545           X1$1 += z * (x0$3 + x) / 2;
14546           Y1$1 += z * (y0$3 + y) / 2;
14547           Z1$1 += z;
14548           centroidPoint$1(x0$3 = x, y0$3 = y);
14549         }
14550
14551         function centroidLineEnd$1() {
14552           centroidStream$1.point = centroidPoint$1;
14553         }
14554
14555         function centroidRingStart$1() {
14556           centroidStream$1.point = centroidPointFirstRing;
14557         }
14558
14559         function centroidRingEnd$1() {
14560           centroidPointRing(x00$1, y00$1);
14561         }
14562
14563         function centroidPointFirstRing(x, y) {
14564           centroidStream$1.point = centroidPointRing;
14565           centroidPoint$1(x00$1 = x0$3 = x, y00$1 = y0$3 = y);
14566         }
14567
14568         function centroidPointRing(x, y) {
14569           var dx = x - x0$3,
14570               dy = y - y0$3,
14571               z = sqrt(dx * dx + dy * dy);
14572
14573           X1$1 += z * (x0$3 + x) / 2;
14574           Y1$1 += z * (y0$3 + y) / 2;
14575           Z1$1 += z;
14576
14577           z = y0$3 * x - x0$3 * y;
14578           X2$1 += z * (x0$3 + x);
14579           Y2$1 += z * (y0$3 + y);
14580           Z2$1 += z * 3;
14581           centroidPoint$1(x0$3 = x, y0$3 = y);
14582         }
14583
14584         function PathContext(context) {
14585           this._context = context;
14586         }
14587
14588         PathContext.prototype = {
14589           _radius: 4.5,
14590           pointRadius: function(_) {
14591             return this._radius = _, this;
14592           },
14593           polygonStart: function() {
14594             this._line = 0;
14595           },
14596           polygonEnd: function() {
14597             this._line = NaN;
14598           },
14599           lineStart: function() {
14600             this._point = 0;
14601           },
14602           lineEnd: function() {
14603             if (this._line === 0) this._context.closePath();
14604             this._point = NaN;
14605           },
14606           point: function(x, y) {
14607             switch (this._point) {
14608               case 0: {
14609                 this._context.moveTo(x, y);
14610                 this._point = 1;
14611                 break;
14612               }
14613               case 1: {
14614                 this._context.lineTo(x, y);
14615                 break;
14616               }
14617               default: {
14618                 this._context.moveTo(x + this._radius, y);
14619                 this._context.arc(x, y, this._radius, 0, tau$3);
14620                 break;
14621               }
14622             }
14623           },
14624           result: noop$4
14625         };
14626
14627         var lengthSum$1 = adder(),
14628             lengthRing,
14629             x00$2,
14630             y00$2,
14631             x0$4,
14632             y0$4;
14633
14634         var lengthStream$1 = {
14635           point: noop$4,
14636           lineStart: function() {
14637             lengthStream$1.point = lengthPointFirst$1;
14638           },
14639           lineEnd: function() {
14640             if (lengthRing) lengthPoint$1(x00$2, y00$2);
14641             lengthStream$1.point = noop$4;
14642           },
14643           polygonStart: function() {
14644             lengthRing = true;
14645           },
14646           polygonEnd: function() {
14647             lengthRing = null;
14648           },
14649           result: function() {
14650             var length = +lengthSum$1;
14651             lengthSum$1.reset();
14652             return length;
14653           }
14654         };
14655
14656         function lengthPointFirst$1(x, y) {
14657           lengthStream$1.point = lengthPoint$1;
14658           x00$2 = x0$4 = x, y00$2 = y0$4 = y;
14659         }
14660
14661         function lengthPoint$1(x, y) {
14662           x0$4 -= x, y0$4 -= y;
14663           lengthSum$1.add(sqrt(x0$4 * x0$4 + y0$4 * y0$4));
14664           x0$4 = x, y0$4 = y;
14665         }
14666
14667         function PathString() {
14668           this._string = [];
14669         }
14670
14671         PathString.prototype = {
14672           _radius: 4.5,
14673           _circle: circle$1(4.5),
14674           pointRadius: function(_) {
14675             if ((_ = +_) !== this._radius) this._radius = _, this._circle = null;
14676             return this;
14677           },
14678           polygonStart: function() {
14679             this._line = 0;
14680           },
14681           polygonEnd: function() {
14682             this._line = NaN;
14683           },
14684           lineStart: function() {
14685             this._point = 0;
14686           },
14687           lineEnd: function() {
14688             if (this._line === 0) this._string.push("Z");
14689             this._point = NaN;
14690           },
14691           point: function(x, y) {
14692             switch (this._point) {
14693               case 0: {
14694                 this._string.push("M", x, ",", y);
14695                 this._point = 1;
14696                 break;
14697               }
14698               case 1: {
14699                 this._string.push("L", x, ",", y);
14700                 break;
14701               }
14702               default: {
14703                 if (this._circle == null) this._circle = circle$1(this._radius);
14704                 this._string.push("M", x, ",", y, this._circle);
14705                 break;
14706               }
14707             }
14708           },
14709           result: function() {
14710             if (this._string.length) {
14711               var result = this._string.join("");
14712               this._string = [];
14713               return result;
14714             } else {
14715               return null;
14716             }
14717           }
14718         };
14719
14720         function circle$1(radius) {
14721           return "m0," + radius
14722               + "a" + radius + "," + radius + " 0 1,1 0," + -2 * radius
14723               + "a" + radius + "," + radius + " 0 1,1 0," + 2 * radius
14724               + "z";
14725         }
14726
14727         function d3_geoPath(projection, context) {
14728           var pointRadius = 4.5,
14729               projectionStream,
14730               contextStream;
14731
14732           function path(object) {
14733             if (object) {
14734               if (typeof pointRadius === "function") contextStream.pointRadius(+pointRadius.apply(this, arguments));
14735               d3_geoStream(object, projectionStream(contextStream));
14736             }
14737             return contextStream.result();
14738           }
14739
14740           path.area = function(object) {
14741             d3_geoStream(object, projectionStream(areaStream$1));
14742             return areaStream$1.result();
14743           };
14744
14745           path.measure = function(object) {
14746             d3_geoStream(object, projectionStream(lengthStream$1));
14747             return lengthStream$1.result();
14748           };
14749
14750           path.bounds = function(object) {
14751             d3_geoStream(object, projectionStream(boundsStream$1));
14752             return boundsStream$1.result();
14753           };
14754
14755           path.centroid = function(object) {
14756             d3_geoStream(object, projectionStream(centroidStream$1));
14757             return centroidStream$1.result();
14758           };
14759
14760           path.projection = function(_) {
14761             return arguments.length ? (projectionStream = _ == null ? (projection = null, identity$4) : (projection = _).stream, path) : projection;
14762           };
14763
14764           path.context = function(_) {
14765             if (!arguments.length) return context;
14766             contextStream = _ == null ? (context = null, new PathString) : new PathContext(context = _);
14767             if (typeof pointRadius !== "function") contextStream.pointRadius(pointRadius);
14768             return path;
14769           };
14770
14771           path.pointRadius = function(_) {
14772             if (!arguments.length) return pointRadius;
14773             pointRadius = typeof _ === "function" ? _ : (contextStream.pointRadius(+_), +_);
14774             return path;
14775           };
14776
14777           return path.projection(projection).context(context);
14778         }
14779
14780         function d3_geoTransform(methods) {
14781           return {
14782             stream: transformer(methods)
14783           };
14784         }
14785
14786         function transformer(methods) {
14787           return function(stream) {
14788             var s = new TransformStream;
14789             for (var key in methods) s[key] = methods[key];
14790             s.stream = stream;
14791             return s;
14792           };
14793         }
14794
14795         function TransformStream() {}
14796
14797         TransformStream.prototype = {
14798           constructor: TransformStream,
14799           point: function(x, y) { this.stream.point(x, y); },
14800           sphere: function() { this.stream.sphere(); },
14801           lineStart: function() { this.stream.lineStart(); },
14802           lineEnd: function() { this.stream.lineEnd(); },
14803           polygonStart: function() { this.stream.polygonStart(); },
14804           polygonEnd: function() { this.stream.polygonEnd(); }
14805         };
14806
14807         function fit(projection, fitBounds, object) {
14808           var clip = projection.clipExtent && projection.clipExtent();
14809           projection.scale(150).translate([0, 0]);
14810           if (clip != null) projection.clipExtent(null);
14811           d3_geoStream(object, projection.stream(boundsStream$1));
14812           fitBounds(boundsStream$1.result());
14813           if (clip != null) projection.clipExtent(clip);
14814           return projection;
14815         }
14816
14817         function fitExtent(projection, extent, object) {
14818           return fit(projection, function(b) {
14819             var w = extent[1][0] - extent[0][0],
14820                 h = extent[1][1] - extent[0][1],
14821                 k = Math.min(w / (b[1][0] - b[0][0]), h / (b[1][1] - b[0][1])),
14822                 x = +extent[0][0] + (w - k * (b[1][0] + b[0][0])) / 2,
14823                 y = +extent[0][1] + (h - k * (b[1][1] + b[0][1])) / 2;
14824             projection.scale(150 * k).translate([x, y]);
14825           }, object);
14826         }
14827
14828         function fitSize(projection, size, object) {
14829           return fitExtent(projection, [[0, 0], size], object);
14830         }
14831
14832         function fitWidth(projection, width, object) {
14833           return fit(projection, function(b) {
14834             var w = +width,
14835                 k = w / (b[1][0] - b[0][0]),
14836                 x = (w - k * (b[1][0] + b[0][0])) / 2,
14837                 y = -k * b[0][1];
14838             projection.scale(150 * k).translate([x, y]);
14839           }, object);
14840         }
14841
14842         function fitHeight(projection, height, object) {
14843           return fit(projection, function(b) {
14844             var h = +height,
14845                 k = h / (b[1][1] - b[0][1]),
14846                 x = -k * b[0][0],
14847                 y = (h - k * (b[1][1] + b[0][1])) / 2;
14848             projection.scale(150 * k).translate([x, y]);
14849           }, object);
14850         }
14851
14852         var maxDepth = 16, // maximum depth of subdivision
14853             cosMinDistance = cos$1(30 * radians); // cos(minimum angular distance)
14854
14855         function resample(project, delta2) {
14856           return +delta2 ? resample$1(project, delta2) : resampleNone(project);
14857         }
14858
14859         function resampleNone(project) {
14860           return transformer({
14861             point: function(x, y) {
14862               x = project(x, y);
14863               this.stream.point(x[0], x[1]);
14864             }
14865           });
14866         }
14867
14868         function resample$1(project, delta2) {
14869
14870           function resampleLineTo(x0, y0, lambda0, a0, b0, c0, x1, y1, lambda1, a1, b1, c1, depth, stream) {
14871             var dx = x1 - x0,
14872                 dy = y1 - y0,
14873                 d2 = dx * dx + dy * dy;
14874             if (d2 > 4 * delta2 && depth--) {
14875               var a = a0 + a1,
14876                   b = b0 + b1,
14877                   c = c0 + c1,
14878                   m = sqrt(a * a + b * b + c * c),
14879                   phi2 = asin(c /= m),
14880                   lambda2 = abs$2(abs$2(c) - 1) < epsilon$2 || abs$2(lambda0 - lambda1) < epsilon$2 ? (lambda0 + lambda1) / 2 : atan2(b, a),
14881                   p = project(lambda2, phi2),
14882                   x2 = p[0],
14883                   y2 = p[1],
14884                   dx2 = x2 - x0,
14885                   dy2 = y2 - y0,
14886                   dz = dy * dx2 - dx * dy2;
14887               if (dz * dz / d2 > delta2 // perpendicular projected distance
14888                   || abs$2((dx * dx2 + dy * dy2) / d2 - 0.5) > 0.3 // midpoint close to an end
14889                   || a0 * a1 + b0 * b1 + c0 * c1 < cosMinDistance) { // angular distance
14890                 resampleLineTo(x0, y0, lambda0, a0, b0, c0, x2, y2, lambda2, a /= m, b /= m, c, depth, stream);
14891                 stream.point(x2, y2);
14892                 resampleLineTo(x2, y2, lambda2, a, b, c, x1, y1, lambda1, a1, b1, c1, depth, stream);
14893               }
14894             }
14895           }
14896           return function(stream) {
14897             var lambda00, x00, y00, a00, b00, c00, // first point
14898                 lambda0, x0, y0, a0, b0, c0; // previous point
14899
14900             var resampleStream = {
14901               point: point,
14902               lineStart: lineStart,
14903               lineEnd: lineEnd,
14904               polygonStart: function() { stream.polygonStart(); resampleStream.lineStart = ringStart; },
14905               polygonEnd: function() { stream.polygonEnd(); resampleStream.lineStart = lineStart; }
14906             };
14907
14908             function point(x, y) {
14909               x = project(x, y);
14910               stream.point(x[0], x[1]);
14911             }
14912
14913             function lineStart() {
14914               x0 = NaN;
14915               resampleStream.point = linePoint;
14916               stream.lineStart();
14917             }
14918
14919             function linePoint(lambda, phi) {
14920               var c = cartesian([lambda, phi]), p = project(lambda, phi);
14921               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);
14922               stream.point(x0, y0);
14923             }
14924
14925             function lineEnd() {
14926               resampleStream.point = point;
14927               stream.lineEnd();
14928             }
14929
14930             function ringStart() {
14931               lineStart();
14932               resampleStream.point = ringPoint;
14933               resampleStream.lineEnd = ringEnd;
14934             }
14935
14936             function ringPoint(lambda, phi) {
14937               linePoint(lambda00 = lambda, phi), x00 = x0, y00 = y0, a00 = a0, b00 = b0, c00 = c0;
14938               resampleStream.point = linePoint;
14939             }
14940
14941             function ringEnd() {
14942               resampleLineTo(x0, y0, lambda0, a0, b0, c0, x00, y00, lambda00, a00, b00, c00, maxDepth, stream);
14943               resampleStream.lineEnd = lineEnd;
14944               lineEnd();
14945             }
14946
14947             return resampleStream;
14948           };
14949         }
14950
14951         var transformRadians = transformer({
14952           point: function(x, y) {
14953             this.stream.point(x * radians, y * radians);
14954           }
14955         });
14956
14957         function transformRotate(rotate) {
14958           return transformer({
14959             point: function(x, y) {
14960               var r = rotate(x, y);
14961               return this.stream.point(r[0], r[1]);
14962             }
14963           });
14964         }
14965
14966         function scaleTranslate(k, dx, dy) {
14967           function transform(x, y) {
14968             return [dx + k * x, dy - k * y];
14969           }
14970           transform.invert = function(x, y) {
14971             return [(x - dx) / k, (dy - y) / k];
14972           };
14973           return transform;
14974         }
14975
14976         function scaleTranslateRotate(k, dx, dy, alpha) {
14977           var cosAlpha = cos$1(alpha),
14978               sinAlpha = sin$1(alpha),
14979               a = cosAlpha * k,
14980               b = sinAlpha * k,
14981               ai = cosAlpha / k,
14982               bi = sinAlpha / k,
14983               ci = (sinAlpha * dy - cosAlpha * dx) / k,
14984               fi = (sinAlpha * dx + cosAlpha * dy) / k;
14985           function transform(x, y) {
14986             return [a * x - b * y + dx, dy - b * x - a * y];
14987           }
14988           transform.invert = function(x, y) {
14989             return [ai * x - bi * y + ci, fi - bi * x - ai * y];
14990           };
14991           return transform;
14992         }
14993
14994         function projection(project) {
14995           return projectionMutator(function() { return project; })();
14996         }
14997
14998         function projectionMutator(projectAt) {
14999           var project,
15000               k = 150, // scale
15001               x = 480, y = 250, // translate
15002               lambda = 0, phi = 0, // center
15003               deltaLambda = 0, deltaPhi = 0, deltaGamma = 0, rotate, // pre-rotate
15004               alpha = 0, // post-rotate
15005               theta = null, preclip = clipAntimeridian, // pre-clip angle
15006               x0 = null, y0, x1, y1, postclip = identity$4, // post-clip extent
15007               delta2 = 0.5, // precision
15008               projectResample,
15009               projectTransform,
15010               projectRotateTransform,
15011               cache,
15012               cacheStream;
15013
15014           function projection(point) {
15015             return projectRotateTransform(point[0] * radians, point[1] * radians);
15016           }
15017
15018           function invert(point) {
15019             point = projectRotateTransform.invert(point[0], point[1]);
15020             return point && [point[0] * degrees$1, point[1] * degrees$1];
15021           }
15022
15023           projection.stream = function(stream) {
15024             return cache && cacheStream === stream ? cache : cache = transformRadians(transformRotate(rotate)(preclip(projectResample(postclip(cacheStream = stream)))));
15025           };
15026
15027           projection.preclip = function(_) {
15028             return arguments.length ? (preclip = _, theta = undefined, reset()) : preclip;
15029           };
15030
15031           projection.postclip = function(_) {
15032             return arguments.length ? (postclip = _, x0 = y0 = x1 = y1 = null, reset()) : postclip;
15033           };
15034
15035           projection.clipAngle = function(_) {
15036             return arguments.length ? (preclip = +_ ? clipCircle(theta = _ * radians) : (theta = null, clipAntimeridian), reset()) : theta * degrees$1;
15037           };
15038
15039           projection.clipExtent = function(_) {
15040             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]];
15041           };
15042
15043           projection.scale = function(_) {
15044             return arguments.length ? (k = +_, recenter()) : k;
15045           };
15046
15047           projection.translate = function(_) {
15048             return arguments.length ? (x = +_[0], y = +_[1], recenter()) : [x, y];
15049           };
15050
15051           projection.center = function(_) {
15052             return arguments.length ? (lambda = _[0] % 360 * radians, phi = _[1] % 360 * radians, recenter()) : [lambda * degrees$1, phi * degrees$1];
15053           };
15054
15055           projection.rotate = function(_) {
15056             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];
15057           };
15058
15059           projection.angle = function(_) {
15060             return arguments.length ? (alpha = _ % 360 * radians, recenter()) : alpha * degrees$1;
15061           };
15062
15063           projection.precision = function(_) {
15064             return arguments.length ? (projectResample = resample(projectTransform, delta2 = _ * _), reset()) : sqrt(delta2);
15065           };
15066
15067           projection.fitExtent = function(extent, object) {
15068             return fitExtent(projection, extent, object);
15069           };
15070
15071           projection.fitSize = function(size, object) {
15072             return fitSize(projection, size, object);
15073           };
15074
15075           projection.fitWidth = function(width, object) {
15076             return fitWidth(projection, width, object);
15077           };
15078
15079           projection.fitHeight = function(height, object) {
15080             return fitHeight(projection, height, object);
15081           };
15082
15083           function recenter() {
15084             var center = scaleTranslateRotate(k, 0, 0, alpha).apply(null, project(lambda, phi)),
15085                 transform = (alpha ? scaleTranslateRotate : scaleTranslate)(k, x - center[0], y - center[1], alpha);
15086             rotate = rotateRadians(deltaLambda, deltaPhi, deltaGamma);
15087             projectTransform = compose(project, transform);
15088             projectRotateTransform = compose(rotate, projectTransform);
15089             projectResample = resample(projectTransform, delta2);
15090             return reset();
15091           }
15092
15093           function reset() {
15094             cache = cacheStream = null;
15095             return projection;
15096           }
15097
15098           return function() {
15099             project = projectAt.apply(this, arguments);
15100             projection.invert = project.invert && invert;
15101             return recenter();
15102           };
15103         }
15104
15105         function conicProjection(projectAt) {
15106           var phi0 = 0,
15107               phi1 = pi$3 / 3,
15108               m = projectionMutator(projectAt),
15109               p = m(phi0, phi1);
15110
15111           p.parallels = function(_) {
15112             return arguments.length ? m(phi0 = _[0] * radians, phi1 = _[1] * radians) : [phi0 * degrees$1, phi1 * degrees$1];
15113           };
15114
15115           return p;
15116         }
15117
15118         function cylindricalEqualAreaRaw(phi0) {
15119           var cosPhi0 = cos$1(phi0);
15120
15121           function forward(lambda, phi) {
15122             return [lambda * cosPhi0, sin$1(phi) / cosPhi0];
15123           }
15124
15125           forward.invert = function(x, y) {
15126             return [x / cosPhi0, asin(y * cosPhi0)];
15127           };
15128
15129           return forward;
15130         }
15131
15132         function conicEqualAreaRaw(y0, y1) {
15133           var sy0 = sin$1(y0), n = (sy0 + sin$1(y1)) / 2;
15134
15135           // Are the parallels symmetrical around the Equator?
15136           if (abs$2(n) < epsilon$2) return cylindricalEqualAreaRaw(y0);
15137
15138           var c = 1 + sy0 * (2 * n - sy0), r0 = sqrt(c) / n;
15139
15140           function project(x, y) {
15141             var r = sqrt(c - 2 * n * sin$1(y)) / n;
15142             return [r * sin$1(x *= n), r0 - r * cos$1(x)];
15143           }
15144
15145           project.invert = function(x, y) {
15146             var r0y = r0 - y;
15147             return [atan2(x, abs$2(r0y)) / n * sign$2(r0y), asin((c - (x * x + r0y * r0y) * n * n) / (2 * n))];
15148           };
15149
15150           return project;
15151         }
15152
15153         function conicEqualArea() {
15154           return conicProjection(conicEqualAreaRaw)
15155               .scale(155.424)
15156               .center([0, 33.6442]);
15157         }
15158
15159         function albers() {
15160           return conicEqualArea()
15161               .parallels([29.5, 45.5])
15162               .scale(1070)
15163               .translate([480, 250])
15164               .rotate([96, 0])
15165               .center([-0.6, 38.7]);
15166         }
15167
15168         // The projections must have mutually exclusive clip regions on the sphere,
15169         // as this will avoid emitting interleaving lines and polygons.
15170         function multiplex(streams) {
15171           var n = streams.length;
15172           return {
15173             point: function(x, y) { var i = -1; while (++i < n) streams[i].point(x, y); },
15174             sphere: function() { var i = -1; while (++i < n) streams[i].sphere(); },
15175             lineStart: function() { var i = -1; while (++i < n) streams[i].lineStart(); },
15176             lineEnd: function() { var i = -1; while (++i < n) streams[i].lineEnd(); },
15177             polygonStart: function() { var i = -1; while (++i < n) streams[i].polygonStart(); },
15178             polygonEnd: function() { var i = -1; while (++i < n) streams[i].polygonEnd(); }
15179           };
15180         }
15181
15182         // A composite projection for the United States, configured by default for
15183         // 960×500. The projection also works quite well at 960×600 if you change the
15184         // scale to 1285 and adjust the translate accordingly. The set of standard
15185         // parallels for each region comes from USGS, which is published here:
15186         // http://egsc.usgs.gov/isb/pubs/MapProjections/projections.html#albers
15187         function albersUsa() {
15188           var cache,
15189               cacheStream,
15190               lower48 = albers(), lower48Point,
15191               alaska = conicEqualArea().rotate([154, 0]).center([-2, 58.5]).parallels([55, 65]), alaskaPoint, // EPSG:3338
15192               hawaii = conicEqualArea().rotate([157, 0]).center([-3, 19.9]).parallels([8, 18]), hawaiiPoint, // ESRI:102007
15193               point, pointStream = {point: function(x, y) { point = [x, y]; }};
15194
15195           function albersUsa(coordinates) {
15196             var x = coordinates[0], y = coordinates[1];
15197             return point = null,
15198                 (lower48Point.point(x, y), point)
15199                 || (alaskaPoint.point(x, y), point)
15200                 || (hawaiiPoint.point(x, y), point);
15201           }
15202
15203           albersUsa.invert = function(coordinates) {
15204             var k = lower48.scale(),
15205                 t = lower48.translate(),
15206                 x = (coordinates[0] - t[0]) / k,
15207                 y = (coordinates[1] - t[1]) / k;
15208             return (y >= 0.120 && y < 0.234 && x >= -0.425 && x < -0.214 ? alaska
15209                 : y >= 0.166 && y < 0.234 && x >= -0.214 && x < -0.115 ? hawaii
15210                 : lower48).invert(coordinates);
15211           };
15212
15213           albersUsa.stream = function(stream) {
15214             return cache && cacheStream === stream ? cache : cache = multiplex([lower48.stream(cacheStream = stream), alaska.stream(stream), hawaii.stream(stream)]);
15215           };
15216
15217           albersUsa.precision = function(_) {
15218             if (!arguments.length) return lower48.precision();
15219             lower48.precision(_), alaska.precision(_), hawaii.precision(_);
15220             return reset();
15221           };
15222
15223           albersUsa.scale = function(_) {
15224             if (!arguments.length) return lower48.scale();
15225             lower48.scale(_), alaska.scale(_ * 0.35), hawaii.scale(_);
15226             return albersUsa.translate(lower48.translate());
15227           };
15228
15229           albersUsa.translate = function(_) {
15230             if (!arguments.length) return lower48.translate();
15231             var k = lower48.scale(), x = +_[0], y = +_[1];
15232
15233             lower48Point = lower48
15234                 .translate(_)
15235                 .clipExtent([[x - 0.455 * k, y - 0.238 * k], [x + 0.455 * k, y + 0.238 * k]])
15236                 .stream(pointStream);
15237
15238             alaskaPoint = alaska
15239                 .translate([x - 0.307 * k, y + 0.201 * k])
15240                 .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]])
15241                 .stream(pointStream);
15242
15243             hawaiiPoint = hawaii
15244                 .translate([x - 0.205 * k, y + 0.212 * k])
15245                 .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]])
15246                 .stream(pointStream);
15247
15248             return reset();
15249           };
15250
15251           albersUsa.fitExtent = function(extent, object) {
15252             return fitExtent(albersUsa, extent, object);
15253           };
15254
15255           albersUsa.fitSize = function(size, object) {
15256             return fitSize(albersUsa, size, object);
15257           };
15258
15259           albersUsa.fitWidth = function(width, object) {
15260             return fitWidth(albersUsa, width, object);
15261           };
15262
15263           albersUsa.fitHeight = function(height, object) {
15264             return fitHeight(albersUsa, height, object);
15265           };
15266
15267           function reset() {
15268             cache = cacheStream = null;
15269             return albersUsa;
15270           }
15271
15272           return albersUsa.scale(1070);
15273         }
15274
15275         function azimuthalRaw(scale) {
15276           return function(x, y) {
15277             var cx = cos$1(x),
15278                 cy = cos$1(y),
15279                 k = scale(cx * cy);
15280             return [
15281               k * cy * sin$1(x),
15282               k * sin$1(y)
15283             ];
15284           }
15285         }
15286
15287         function azimuthalInvert(angle) {
15288           return function(x, y) {
15289             var z = sqrt(x * x + y * y),
15290                 c = angle(z),
15291                 sc = sin$1(c),
15292                 cc = cos$1(c);
15293             return [
15294               atan2(x * sc, z * cc),
15295               asin(z && y * sc / z)
15296             ];
15297           }
15298         }
15299
15300         var azimuthalEqualAreaRaw = azimuthalRaw(function(cxcy) {
15301           return sqrt(2 / (1 + cxcy));
15302         });
15303
15304         azimuthalEqualAreaRaw.invert = azimuthalInvert(function(z) {
15305           return 2 * asin(z / 2);
15306         });
15307
15308         function azimuthalEqualArea() {
15309           return projection(azimuthalEqualAreaRaw)
15310               .scale(124.75)
15311               .clipAngle(180 - 1e-3);
15312         }
15313
15314         var azimuthalEquidistantRaw = azimuthalRaw(function(c) {
15315           return (c = acos(c)) && c / sin$1(c);
15316         });
15317
15318         azimuthalEquidistantRaw.invert = azimuthalInvert(function(z) {
15319           return z;
15320         });
15321
15322         function azimuthalEquidistant() {
15323           return projection(azimuthalEquidistantRaw)
15324               .scale(79.4188)
15325               .clipAngle(180 - 1e-3);
15326         }
15327
15328         function mercatorRaw(lambda, phi) {
15329           return [lambda, log(tan((halfPi$2 + phi) / 2))];
15330         }
15331
15332         mercatorRaw.invert = function(x, y) {
15333           return [x, 2 * atan(exp(y)) - halfPi$2];
15334         };
15335
15336         function mercator() {
15337           return mercatorProjection(mercatorRaw)
15338               .scale(961 / tau$3);
15339         }
15340
15341         function mercatorProjection(project) {
15342           var m = projection(project),
15343               center = m.center,
15344               scale = m.scale,
15345               translate = m.translate,
15346               clipExtent = m.clipExtent,
15347               x0 = null, y0, x1, y1; // clip extent
15348
15349           m.scale = function(_) {
15350             return arguments.length ? (scale(_), reclip()) : scale();
15351           };
15352
15353           m.translate = function(_) {
15354             return arguments.length ? (translate(_), reclip()) : translate();
15355           };
15356
15357           m.center = function(_) {
15358             return arguments.length ? (center(_), reclip()) : center();
15359           };
15360
15361           m.clipExtent = function(_) {
15362             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]];
15363           };
15364
15365           function reclip() {
15366             var k = pi$3 * scale(),
15367                 t = m(rotation(m.rotate()).invert([0, 0]));
15368             return clipExtent(x0 == null
15369                 ? [[t[0] - k, t[1] - k], [t[0] + k, t[1] + k]] : project === mercatorRaw
15370                 ? [[Math.max(t[0] - k, x0), y0], [Math.min(t[0] + k, x1), y1]]
15371                 : [[x0, Math.max(t[1] - k, y0)], [x1, Math.min(t[1] + k, y1)]]);
15372           }
15373
15374           return reclip();
15375         }
15376
15377         function tany(y) {
15378           return tan((halfPi$2 + y) / 2);
15379         }
15380
15381         function conicConformalRaw(y0, y1) {
15382           var cy0 = cos$1(y0),
15383               n = y0 === y1 ? sin$1(y0) : log(cy0 / cos$1(y1)) / log(tany(y1) / tany(y0)),
15384               f = cy0 * pow(tany(y0), n) / n;
15385
15386           if (!n) return mercatorRaw;
15387
15388           function project(x, y) {
15389             if (f > 0) { if (y < -halfPi$2 + epsilon$2) y = -halfPi$2 + epsilon$2; }
15390             else { if (y > halfPi$2 - epsilon$2) y = halfPi$2 - epsilon$2; }
15391             var r = f / pow(tany(y), n);
15392             return [r * sin$1(n * x), f - r * cos$1(n * x)];
15393           }
15394
15395           project.invert = function(x, y) {
15396             var fy = f - y, r = sign$2(n) * sqrt(x * x + fy * fy);
15397             return [atan2(x, abs$2(fy)) / n * sign$2(fy), 2 * atan(pow(f / r, 1 / n)) - halfPi$2];
15398           };
15399
15400           return project;
15401         }
15402
15403         function conicConformal() {
15404           return conicProjection(conicConformalRaw)
15405               .scale(109.5)
15406               .parallels([30, 30]);
15407         }
15408
15409         function equirectangularRaw(lambda, phi) {
15410           return [lambda, phi];
15411         }
15412
15413         equirectangularRaw.invert = equirectangularRaw;
15414
15415         function equirectangular() {
15416           return projection(equirectangularRaw)
15417               .scale(152.63);
15418         }
15419
15420         function conicEquidistantRaw(y0, y1) {
15421           var cy0 = cos$1(y0),
15422               n = y0 === y1 ? sin$1(y0) : (cy0 - cos$1(y1)) / (y1 - y0),
15423               g = cy0 / n + y0;
15424
15425           if (abs$2(n) < epsilon$2) return equirectangularRaw;
15426
15427           function project(x, y) {
15428             var gy = g - y, nx = n * x;
15429             return [gy * sin$1(nx), g - gy * cos$1(nx)];
15430           }
15431
15432           project.invert = function(x, y) {
15433             var gy = g - y;
15434             return [atan2(x, abs$2(gy)) / n * sign$2(gy), g - sign$2(n) * sqrt(x * x + gy * gy)];
15435           };
15436
15437           return project;
15438         }
15439
15440         function conicEquidistant() {
15441           return conicProjection(conicEquidistantRaw)
15442               .scale(131.154)
15443               .center([0, 13.9389]);
15444         }
15445
15446         var A1 = 1.340264,
15447             A2 = -0.081106,
15448             A3 = 0.000893,
15449             A4 = 0.003796,
15450             M = sqrt(3) / 2,
15451             iterations = 12;
15452
15453         function equalEarthRaw(lambda, phi) {
15454           var l = asin(M * sin$1(phi)), l2 = l * l, l6 = l2 * l2 * l2;
15455           return [
15456             lambda * cos$1(l) / (M * (A1 + 3 * A2 * l2 + l6 * (7 * A3 + 9 * A4 * l2))),
15457             l * (A1 + A2 * l2 + l6 * (A3 + A4 * l2))
15458           ];
15459         }
15460
15461         equalEarthRaw.invert = function(x, y) {
15462           var l = y, l2 = l * l, l6 = l2 * l2 * l2;
15463           for (var i = 0, delta, fy, fpy; i < iterations; ++i) {
15464             fy = l * (A1 + A2 * l2 + l6 * (A3 + A4 * l2)) - y;
15465             fpy = A1 + 3 * A2 * l2 + l6 * (7 * A3 + 9 * A4 * l2);
15466             l -= delta = fy / fpy, l2 = l * l, l6 = l2 * l2 * l2;
15467             if (abs$2(delta) < epsilon2$1) break;
15468           }
15469           return [
15470             M * x * (A1 + 3 * A2 * l2 + l6 * (7 * A3 + 9 * A4 * l2)) / cos$1(l),
15471             asin(sin$1(l) / M)
15472           ];
15473         };
15474
15475         function equalEarth() {
15476           return projection(equalEarthRaw)
15477               .scale(177.158);
15478         }
15479
15480         function gnomonicRaw(x, y) {
15481           var cy = cos$1(y), k = cos$1(x) * cy;
15482           return [cy * sin$1(x) / k, sin$1(y) / k];
15483         }
15484
15485         gnomonicRaw.invert = azimuthalInvert(atan);
15486
15487         function gnomonic() {
15488           return projection(gnomonicRaw)
15489               .scale(144.049)
15490               .clipAngle(60);
15491         }
15492
15493         function scaleTranslate$1(kx, ky, tx, ty) {
15494           return kx === 1 && ky === 1 && tx === 0 && ty === 0 ? identity$4 : transformer({
15495             point: function(x, y) {
15496               this.stream.point(x * kx + tx, y * ky + ty);
15497             }
15498           });
15499         }
15500
15501         function d3_geoIdentity() {
15502           var k = 1, tx = 0, ty = 0, sx = 1, sy = 1, transform = identity$4, // scale, translate and reflect
15503               x0 = null, y0, x1, y1, // clip extent
15504               postclip = identity$4,
15505               cache,
15506               cacheStream,
15507               projection;
15508
15509           function reset() {
15510             cache = cacheStream = null;
15511             return projection;
15512           }
15513
15514           return projection = {
15515             stream: function(stream) {
15516               return cache && cacheStream === stream ? cache : cache = transform(postclip(cacheStream = stream));
15517             },
15518             postclip: function(_) {
15519               return arguments.length ? (postclip = _, x0 = y0 = x1 = y1 = null, reset()) : postclip;
15520             },
15521             clipExtent: function(_) {
15522               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]];
15523             },
15524             scale: function(_) {
15525               return arguments.length ? (transform = scaleTranslate$1((k = +_) * sx, k * sy, tx, ty), reset()) : k;
15526             },
15527             translate: function(_) {
15528               return arguments.length ? (transform = scaleTranslate$1(k * sx, k * sy, tx = +_[0], ty = +_[1]), reset()) : [tx, ty];
15529             },
15530             reflectX: function(_) {
15531               return arguments.length ? (transform = scaleTranslate$1(k * (sx = _ ? -1 : 1), k * sy, tx, ty), reset()) : sx < 0;
15532             },
15533             reflectY: function(_) {
15534               return arguments.length ? (transform = scaleTranslate$1(k * sx, k * (sy = _ ? -1 : 1), tx, ty), reset()) : sy < 0;
15535             },
15536             fitExtent: function(extent, object) {
15537               return fitExtent(projection, extent, object);
15538             },
15539             fitSize: function(size, object) {
15540               return fitSize(projection, size, object);
15541             },
15542             fitWidth: function(width, object) {
15543               return fitWidth(projection, width, object);
15544             },
15545             fitHeight: function(height, object) {
15546               return fitHeight(projection, height, object);
15547             }
15548           };
15549         }
15550
15551         function naturalEarth1Raw(lambda, phi) {
15552           var phi2 = phi * phi, phi4 = phi2 * phi2;
15553           return [
15554             lambda * (0.8707 - 0.131979 * phi2 + phi4 * (-0.013791 + phi4 * (0.003971 * phi2 - 0.001529 * phi4))),
15555             phi * (1.007226 + phi2 * (0.015085 + phi4 * (-0.044475 + 0.028874 * phi2 - 0.005916 * phi4)))
15556           ];
15557         }
15558
15559         naturalEarth1Raw.invert = function(x, y) {
15560           var phi = y, i = 25, delta;
15561           do {
15562             var phi2 = phi * phi, phi4 = phi2 * phi2;
15563             phi -= delta = (phi * (1.007226 + phi2 * (0.015085 + phi4 * (-0.044475 + 0.028874 * phi2 - 0.005916 * phi4))) - y) /
15564                 (1.007226 + phi2 * (0.015085 * 3 + phi4 * (-0.044475 * 7 + 0.028874 * 9 * phi2 - 0.005916 * 11 * phi4)));
15565           } while (abs$2(delta) > epsilon$2 && --i > 0);
15566           return [
15567             x / (0.8707 + (phi2 = phi * phi) * (-0.131979 + phi2 * (-0.013791 + phi2 * phi2 * phi2 * (0.003971 - 0.001529 * phi2)))),
15568             phi
15569           ];
15570         };
15571
15572         function naturalEarth1() {
15573           return projection(naturalEarth1Raw)
15574               .scale(175.295);
15575         }
15576
15577         function orthographicRaw(x, y) {
15578           return [cos$1(y) * sin$1(x), sin$1(y)];
15579         }
15580
15581         orthographicRaw.invert = azimuthalInvert(asin);
15582
15583         function orthographic() {
15584           return projection(orthographicRaw)
15585               .scale(249.5)
15586               .clipAngle(90 + epsilon$2);
15587         }
15588
15589         function stereographicRaw(x, y) {
15590           var cy = cos$1(y), k = 1 + cos$1(x) * cy;
15591           return [cy * sin$1(x) / k, sin$1(y) / k];
15592         }
15593
15594         stereographicRaw.invert = azimuthalInvert(function(z) {
15595           return 2 * atan(z);
15596         });
15597
15598         function stereographic() {
15599           return projection(stereographicRaw)
15600               .scale(250)
15601               .clipAngle(142);
15602         }
15603
15604         function transverseMercatorRaw(lambda, phi) {
15605           return [log(tan((halfPi$2 + phi) / 2)), -lambda];
15606         }
15607
15608         transverseMercatorRaw.invert = function(x, y) {
15609           return [-y, 2 * atan(exp(x)) - halfPi$2];
15610         };
15611
15612         function transverseMercator() {
15613           var m = mercatorProjection(transverseMercatorRaw),
15614               center = m.center,
15615               rotate = m.rotate;
15616
15617           m.center = function(_) {
15618             return arguments.length ? center([-_[1], _[0]]) : (_ = center(), [_[1], -_[0]]);
15619           };
15620
15621           m.rotate = function(_) {
15622             return arguments.length ? rotate([_[0], _[1], _.length > 2 ? _[2] + 90 : 90]) : (_ = rotate(), [_[0], _[1], _[2] - 90]);
15623           };
15624
15625           return rotate([0, 0, 90])
15626               .scale(159.155);
15627         }
15628
15629         function defaultSeparation(a, b) {
15630           return a.parent === b.parent ? 1 : 2;
15631         }
15632
15633         function meanX(children) {
15634           return children.reduce(meanXReduce, 0) / children.length;
15635         }
15636
15637         function meanXReduce(x, c) {
15638           return x + c.x;
15639         }
15640
15641         function maxY(children) {
15642           return 1 + children.reduce(maxYReduce, 0);
15643         }
15644
15645         function maxYReduce(y, c) {
15646           return Math.max(y, c.y);
15647         }
15648
15649         function leafLeft(node) {
15650           var children;
15651           while (children = node.children) node = children[0];
15652           return node;
15653         }
15654
15655         function leafRight(node) {
15656           var children;
15657           while (children = node.children) node = children[children.length - 1];
15658           return node;
15659         }
15660
15661         function cluster() {
15662           var separation = defaultSeparation,
15663               dx = 1,
15664               dy = 1,
15665               nodeSize = false;
15666
15667           function cluster(root) {
15668             var previousNode,
15669                 x = 0;
15670
15671             // First walk, computing the initial x & y values.
15672             root.eachAfter(function(node) {
15673               var children = node.children;
15674               if (children) {
15675                 node.x = meanX(children);
15676                 node.y = maxY(children);
15677               } else {
15678                 node.x = previousNode ? x += separation(node, previousNode) : 0;
15679                 node.y = 0;
15680                 previousNode = node;
15681               }
15682             });
15683
15684             var left = leafLeft(root),
15685                 right = leafRight(root),
15686                 x0 = left.x - separation(left, right) / 2,
15687                 x1 = right.x + separation(right, left) / 2;
15688
15689             // Second walk, normalizing x & y to the desired size.
15690             return root.eachAfter(nodeSize ? function(node) {
15691               node.x = (node.x - root.x) * dx;
15692               node.y = (root.y - node.y) * dy;
15693             } : function(node) {
15694               node.x = (node.x - x0) / (x1 - x0) * dx;
15695               node.y = (1 - (root.y ? node.y / root.y : 1)) * dy;
15696             });
15697           }
15698
15699           cluster.separation = function(x) {
15700             return arguments.length ? (separation = x, cluster) : separation;
15701           };
15702
15703           cluster.size = function(x) {
15704             return arguments.length ? (nodeSize = false, dx = +x[0], dy = +x[1], cluster) : (nodeSize ? null : [dx, dy]);
15705           };
15706
15707           cluster.nodeSize = function(x) {
15708             return arguments.length ? (nodeSize = true, dx = +x[0], dy = +x[1], cluster) : (nodeSize ? [dx, dy] : null);
15709           };
15710
15711           return cluster;
15712         }
15713
15714         function count(node) {
15715           var sum = 0,
15716               children = node.children,
15717               i = children && children.length;
15718           if (!i) sum = 1;
15719           else while (--i >= 0) sum += children[i].value;
15720           node.value = sum;
15721         }
15722
15723         function node_count() {
15724           return this.eachAfter(count);
15725         }
15726
15727         function node_each(callback) {
15728           var node = this, current, next = [node], children, i, n;
15729           do {
15730             current = next.reverse(), next = [];
15731             while (node = current.pop()) {
15732               callback(node), children = node.children;
15733               if (children) for (i = 0, n = children.length; i < n; ++i) {
15734                 next.push(children[i]);
15735               }
15736             }
15737           } while (next.length);
15738           return this;
15739         }
15740
15741         function node_eachBefore(callback) {
15742           var node = this, nodes = [node], children, i;
15743           while (node = nodes.pop()) {
15744             callback(node), children = node.children;
15745             if (children) for (i = children.length - 1; i >= 0; --i) {
15746               nodes.push(children[i]);
15747             }
15748           }
15749           return this;
15750         }
15751
15752         function node_eachAfter(callback) {
15753           var node = this, nodes = [node], next = [], children, i, n;
15754           while (node = nodes.pop()) {
15755             next.push(node), children = node.children;
15756             if (children) for (i = 0, n = children.length; i < n; ++i) {
15757               nodes.push(children[i]);
15758             }
15759           }
15760           while (node = next.pop()) {
15761             callback(node);
15762           }
15763           return this;
15764         }
15765
15766         function node_sum(value) {
15767           return this.eachAfter(function(node) {
15768             var sum = +value(node.data) || 0,
15769                 children = node.children,
15770                 i = children && children.length;
15771             while (--i >= 0) sum += children[i].value;
15772             node.value = sum;
15773           });
15774         }
15775
15776         function node_sort(compare) {
15777           return this.eachBefore(function(node) {
15778             if (node.children) {
15779               node.children.sort(compare);
15780             }
15781           });
15782         }
15783
15784         function node_path(end) {
15785           var start = this,
15786               ancestor = leastCommonAncestor(start, end),
15787               nodes = [start];
15788           while (start !== ancestor) {
15789             start = start.parent;
15790             nodes.push(start);
15791           }
15792           var k = nodes.length;
15793           while (end !== ancestor) {
15794             nodes.splice(k, 0, end);
15795             end = end.parent;
15796           }
15797           return nodes;
15798         }
15799
15800         function leastCommonAncestor(a, b) {
15801           if (a === b) return a;
15802           var aNodes = a.ancestors(),
15803               bNodes = b.ancestors(),
15804               c = null;
15805           a = aNodes.pop();
15806           b = bNodes.pop();
15807           while (a === b) {
15808             c = a;
15809             a = aNodes.pop();
15810             b = bNodes.pop();
15811           }
15812           return c;
15813         }
15814
15815         function node_ancestors() {
15816           var node = this, nodes = [node];
15817           while (node = node.parent) {
15818             nodes.push(node);
15819           }
15820           return nodes;
15821         }
15822
15823         function node_descendants() {
15824           var nodes = [];
15825           this.each(function(node) {
15826             nodes.push(node);
15827           });
15828           return nodes;
15829         }
15830
15831         function node_leaves() {
15832           var leaves = [];
15833           this.eachBefore(function(node) {
15834             if (!node.children) {
15835               leaves.push(node);
15836             }
15837           });
15838           return leaves;
15839         }
15840
15841         function node_links() {
15842           var root = this, links = [];
15843           root.each(function(node) {
15844             if (node !== root) { // Don’t include the root’s parent, if any.
15845               links.push({source: node.parent, target: node});
15846             }
15847           });
15848           return links;
15849         }
15850
15851         function hierarchy(data, children) {
15852           var root = new Node(data),
15853               valued = +data.value && (root.value = data.value),
15854               node,
15855               nodes = [root],
15856               child,
15857               childs,
15858               i,
15859               n;
15860
15861           if (children == null) children = defaultChildren;
15862
15863           while (node = nodes.pop()) {
15864             if (valued) node.value = +node.data.value;
15865             if ((childs = children(node.data)) && (n = childs.length)) {
15866               node.children = new Array(n);
15867               for (i = n - 1; i >= 0; --i) {
15868                 nodes.push(child = node.children[i] = new Node(childs[i]));
15869                 child.parent = node;
15870                 child.depth = node.depth + 1;
15871               }
15872             }
15873           }
15874
15875           return root.eachBefore(computeHeight);
15876         }
15877
15878         function node_copy() {
15879           return hierarchy(this).eachBefore(copyData);
15880         }
15881
15882         function defaultChildren(d) {
15883           return d.children;
15884         }
15885
15886         function copyData(node) {
15887           node.data = node.data.data;
15888         }
15889
15890         function computeHeight(node) {
15891           var height = 0;
15892           do node.height = height;
15893           while ((node = node.parent) && (node.height < ++height));
15894         }
15895
15896         function Node(data) {
15897           this.data = data;
15898           this.depth =
15899           this.height = 0;
15900           this.parent = null;
15901         }
15902
15903         Node.prototype = hierarchy.prototype = {
15904           constructor: Node,
15905           count: node_count,
15906           each: node_each,
15907           eachAfter: node_eachAfter,
15908           eachBefore: node_eachBefore,
15909           sum: node_sum,
15910           sort: node_sort,
15911           path: node_path,
15912           ancestors: node_ancestors,
15913           descendants: node_descendants,
15914           leaves: node_leaves,
15915           links: node_links,
15916           copy: node_copy
15917         };
15918
15919         var slice$8 = Array.prototype.slice;
15920
15921         function shuffle$1(array) {
15922           var m = array.length,
15923               t,
15924               i;
15925
15926           while (m) {
15927             i = Math.random() * m-- | 0;
15928             t = array[m];
15929             array[m] = array[i];
15930             array[i] = t;
15931           }
15932
15933           return array;
15934         }
15935
15936         function enclose(circles) {
15937           var i = 0, n = (circles = shuffle$1(slice$8.call(circles))).length, B = [], p, e;
15938
15939           while (i < n) {
15940             p = circles[i];
15941             if (e && enclosesWeak(e, p)) ++i;
15942             else e = encloseBasis(B = extendBasis(B, p)), i = 0;
15943           }
15944
15945           return e;
15946         }
15947
15948         function extendBasis(B, p) {
15949           var i, j;
15950
15951           if (enclosesWeakAll(p, B)) return [p];
15952
15953           // If we get here then B must have at least one element.
15954           for (i = 0; i < B.length; ++i) {
15955             if (enclosesNot(p, B[i])
15956                 && enclosesWeakAll(encloseBasis2(B[i], p), B)) {
15957               return [B[i], p];
15958             }
15959           }
15960
15961           // If we get here then B must have at least two elements.
15962           for (i = 0; i < B.length - 1; ++i) {
15963             for (j = i + 1; j < B.length; ++j) {
15964               if (enclosesNot(encloseBasis2(B[i], B[j]), p)
15965                   && enclosesNot(encloseBasis2(B[i], p), B[j])
15966                   && enclosesNot(encloseBasis2(B[j], p), B[i])
15967                   && enclosesWeakAll(encloseBasis3(B[i], B[j], p), B)) {
15968                 return [B[i], B[j], p];
15969               }
15970             }
15971           }
15972
15973           // If we get here then something is very wrong.
15974           throw new Error;
15975         }
15976
15977         function enclosesNot(a, b) {
15978           var dr = a.r - b.r, dx = b.x - a.x, dy = b.y - a.y;
15979           return dr < 0 || dr * dr < dx * dx + dy * dy;
15980         }
15981
15982         function enclosesWeak(a, b) {
15983           var dr = a.r - b.r + 1e-6, dx = b.x - a.x, dy = b.y - a.y;
15984           return dr > 0 && dr * dr > dx * dx + dy * dy;
15985         }
15986
15987         function enclosesWeakAll(a, B) {
15988           for (var i = 0; i < B.length; ++i) {
15989             if (!enclosesWeak(a, B[i])) {
15990               return false;
15991             }
15992           }
15993           return true;
15994         }
15995
15996         function encloseBasis(B) {
15997           switch (B.length) {
15998             case 1: return encloseBasis1(B[0]);
15999             case 2: return encloseBasis2(B[0], B[1]);
16000             case 3: return encloseBasis3(B[0], B[1], B[2]);
16001           }
16002         }
16003
16004         function encloseBasis1(a) {
16005           return {
16006             x: a.x,
16007             y: a.y,
16008             r: a.r
16009           };
16010         }
16011
16012         function encloseBasis2(a, b) {
16013           var x1 = a.x, y1 = a.y, r1 = a.r,
16014               x2 = b.x, y2 = b.y, r2 = b.r,
16015               x21 = x2 - x1, y21 = y2 - y1, r21 = r2 - r1,
16016               l = Math.sqrt(x21 * x21 + y21 * y21);
16017           return {
16018             x: (x1 + x2 + x21 / l * r21) / 2,
16019             y: (y1 + y2 + y21 / l * r21) / 2,
16020             r: (l + r1 + r2) / 2
16021           };
16022         }
16023
16024         function encloseBasis3(a, b, c) {
16025           var x1 = a.x, y1 = a.y, r1 = a.r,
16026               x2 = b.x, y2 = b.y, r2 = b.r,
16027               x3 = c.x, y3 = c.y, r3 = c.r,
16028               a2 = x1 - x2,
16029               a3 = x1 - x3,
16030               b2 = y1 - y2,
16031               b3 = y1 - y3,
16032               c2 = r2 - r1,
16033               c3 = r3 - r1,
16034               d1 = x1 * x1 + y1 * y1 - r1 * r1,
16035               d2 = d1 - x2 * x2 - y2 * y2 + r2 * r2,
16036               d3 = d1 - x3 * x3 - y3 * y3 + r3 * r3,
16037               ab = a3 * b2 - a2 * b3,
16038               xa = (b2 * d3 - b3 * d2) / (ab * 2) - x1,
16039               xb = (b3 * c2 - b2 * c3) / ab,
16040               ya = (a3 * d2 - a2 * d3) / (ab * 2) - y1,
16041               yb = (a2 * c3 - a3 * c2) / ab,
16042               A = xb * xb + yb * yb - 1,
16043               B = 2 * (r1 + xa * xb + ya * yb),
16044               C = xa * xa + ya * ya - r1 * r1,
16045               r = -(A ? (B + Math.sqrt(B * B - 4 * A * C)) / (2 * A) : C / B);
16046           return {
16047             x: x1 + xa + xb * r,
16048             y: y1 + ya + yb * r,
16049             r: r
16050           };
16051         }
16052
16053         function place(b, a, c) {
16054           var dx = b.x - a.x, x, a2,
16055               dy = b.y - a.y, y, b2,
16056               d2 = dx * dx + dy * dy;
16057           if (d2) {
16058             a2 = a.r + c.r, a2 *= a2;
16059             b2 = b.r + c.r, b2 *= b2;
16060             if (a2 > b2) {
16061               x = (d2 + b2 - a2) / (2 * d2);
16062               y = Math.sqrt(Math.max(0, b2 / d2 - x * x));
16063               c.x = b.x - x * dx - y * dy;
16064               c.y = b.y - x * dy + y * dx;
16065             } else {
16066               x = (d2 + a2 - b2) / (2 * d2);
16067               y = Math.sqrt(Math.max(0, a2 / d2 - x * x));
16068               c.x = a.x + x * dx - y * dy;
16069               c.y = a.y + x * dy + y * dx;
16070             }
16071           } else {
16072             c.x = a.x + c.r;
16073             c.y = a.y;
16074           }
16075         }
16076
16077         function intersects(a, b) {
16078           var dr = a.r + b.r - 1e-6, dx = b.x - a.x, dy = b.y - a.y;
16079           return dr > 0 && dr * dr > dx * dx + dy * dy;
16080         }
16081
16082         function score(node) {
16083           var a = node._,
16084               b = node.next._,
16085               ab = a.r + b.r,
16086               dx = (a.x * b.r + b.x * a.r) / ab,
16087               dy = (a.y * b.r + b.y * a.r) / ab;
16088           return dx * dx + dy * dy;
16089         }
16090
16091         function Node$1(circle) {
16092           this._ = circle;
16093           this.next = null;
16094           this.previous = null;
16095         }
16096
16097         function packEnclose(circles) {
16098           if (!(n = circles.length)) return 0;
16099
16100           var a, b, c, n, aa, ca, i, j, k, sj, sk;
16101
16102           // Place the first circle.
16103           a = circles[0], a.x = 0, a.y = 0;
16104           if (!(n > 1)) return a.r;
16105
16106           // Place the second circle.
16107           b = circles[1], a.x = -b.r, b.x = a.r, b.y = 0;
16108           if (!(n > 2)) return a.r + b.r;
16109
16110           // Place the third circle.
16111           place(b, a, c = circles[2]);
16112
16113           // Initialize the front-chain using the first three circles a, b and c.
16114           a = new Node$1(a), b = new Node$1(b), c = new Node$1(c);
16115           a.next = c.previous = b;
16116           b.next = a.previous = c;
16117           c.next = b.previous = a;
16118
16119           // Attempt to place each remaining circle…
16120           pack: for (i = 3; i < n; ++i) {
16121             place(a._, b._, c = circles[i]), c = new Node$1(c);
16122
16123             // Find the closest intersecting circle on the front-chain, if any.
16124             // “Closeness” is determined by linear distance along the front-chain.
16125             // “Ahead” or “behind” is likewise determined by linear distance.
16126             j = b.next, k = a.previous, sj = b._.r, sk = a._.r;
16127             do {
16128               if (sj <= sk) {
16129                 if (intersects(j._, c._)) {
16130                   b = j, a.next = b, b.previous = a, --i;
16131                   continue pack;
16132                 }
16133                 sj += j._.r, j = j.next;
16134               } else {
16135                 if (intersects(k._, c._)) {
16136                   a = k, a.next = b, b.previous = a, --i;
16137                   continue pack;
16138                 }
16139                 sk += k._.r, k = k.previous;
16140               }
16141             } while (j !== k.next);
16142
16143             // Success! Insert the new circle c between a and b.
16144             c.previous = a, c.next = b, a.next = b.previous = b = c;
16145
16146             // Compute the new closest circle pair to the centroid.
16147             aa = score(a);
16148             while ((c = c.next) !== b) {
16149               if ((ca = score(c)) < aa) {
16150                 a = c, aa = ca;
16151               }
16152             }
16153             b = a.next;
16154           }
16155
16156           // Compute the enclosing circle of the front chain.
16157           a = [b._], c = b; while ((c = c.next) !== b) a.push(c._); c = enclose(a);
16158
16159           // Translate the circles to put the enclosing circle around the origin.
16160           for (i = 0; i < n; ++i) a = circles[i], a.x -= c.x, a.y -= c.y;
16161
16162           return c.r;
16163         }
16164
16165         function siblings(circles) {
16166           packEnclose(circles);
16167           return circles;
16168         }
16169
16170         function optional(f) {
16171           return f == null ? null : required(f);
16172         }
16173
16174         function required(f) {
16175           if (typeof f !== "function") throw new Error;
16176           return f;
16177         }
16178
16179         function constantZero() {
16180           return 0;
16181         }
16182
16183         function constant$9(x) {
16184           return function() {
16185             return x;
16186           };
16187         }
16188
16189         function defaultRadius$1(d) {
16190           return Math.sqrt(d.value);
16191         }
16192
16193         function index$1() {
16194           var radius = null,
16195               dx = 1,
16196               dy = 1,
16197               padding = constantZero;
16198
16199           function pack(root) {
16200             root.x = dx / 2, root.y = dy / 2;
16201             if (radius) {
16202               root.eachBefore(radiusLeaf(radius))
16203                   .eachAfter(packChildren(padding, 0.5))
16204                   .eachBefore(translateChild(1));
16205             } else {
16206               root.eachBefore(radiusLeaf(defaultRadius$1))
16207                   .eachAfter(packChildren(constantZero, 1))
16208                   .eachAfter(packChildren(padding, root.r / Math.min(dx, dy)))
16209                   .eachBefore(translateChild(Math.min(dx, dy) / (2 * root.r)));
16210             }
16211             return root;
16212           }
16213
16214           pack.radius = function(x) {
16215             return arguments.length ? (radius = optional(x), pack) : radius;
16216           };
16217
16218           pack.size = function(x) {
16219             return arguments.length ? (dx = +x[0], dy = +x[1], pack) : [dx, dy];
16220           };
16221
16222           pack.padding = function(x) {
16223             return arguments.length ? (padding = typeof x === "function" ? x : constant$9(+x), pack) : padding;
16224           };
16225
16226           return pack;
16227         }
16228
16229         function radiusLeaf(radius) {
16230           return function(node) {
16231             if (!node.children) {
16232               node.r = Math.max(0, +radius(node) || 0);
16233             }
16234           };
16235         }
16236
16237         function packChildren(padding, k) {
16238           return function(node) {
16239             if (children = node.children) {
16240               var children,
16241                   i,
16242                   n = children.length,
16243                   r = padding(node) * k || 0,
16244                   e;
16245
16246               if (r) for (i = 0; i < n; ++i) children[i].r += r;
16247               e = packEnclose(children);
16248               if (r) for (i = 0; i < n; ++i) children[i].r -= r;
16249               node.r = e + r;
16250             }
16251           };
16252         }
16253
16254         function translateChild(k) {
16255           return function(node) {
16256             var parent = node.parent;
16257             node.r *= k;
16258             if (parent) {
16259               node.x = parent.x + k * node.x;
16260               node.y = parent.y + k * node.y;
16261             }
16262           };
16263         }
16264
16265         function roundNode(node) {
16266           node.x0 = Math.round(node.x0);
16267           node.y0 = Math.round(node.y0);
16268           node.x1 = Math.round(node.x1);
16269           node.y1 = Math.round(node.y1);
16270         }
16271
16272         function treemapDice(parent, x0, y0, x1, y1) {
16273           var nodes = parent.children,
16274               node,
16275               i = -1,
16276               n = nodes.length,
16277               k = parent.value && (x1 - x0) / parent.value;
16278
16279           while (++i < n) {
16280             node = nodes[i], node.y0 = y0, node.y1 = y1;
16281             node.x0 = x0, node.x1 = x0 += node.value * k;
16282           }
16283         }
16284
16285         function partition() {
16286           var dx = 1,
16287               dy = 1,
16288               padding = 0,
16289               round = false;
16290
16291           function partition(root) {
16292             var n = root.height + 1;
16293             root.x0 =
16294             root.y0 = padding;
16295             root.x1 = dx;
16296             root.y1 = dy / n;
16297             root.eachBefore(positionNode(dy, n));
16298             if (round) root.eachBefore(roundNode);
16299             return root;
16300           }
16301
16302           function positionNode(dy, n) {
16303             return function(node) {
16304               if (node.children) {
16305                 treemapDice(node, node.x0, dy * (node.depth + 1) / n, node.x1, dy * (node.depth + 2) / n);
16306               }
16307               var x0 = node.x0,
16308                   y0 = node.y0,
16309                   x1 = node.x1 - padding,
16310                   y1 = node.y1 - padding;
16311               if (x1 < x0) x0 = x1 = (x0 + x1) / 2;
16312               if (y1 < y0) y0 = y1 = (y0 + y1) / 2;
16313               node.x0 = x0;
16314               node.y0 = y0;
16315               node.x1 = x1;
16316               node.y1 = y1;
16317             };
16318           }
16319
16320           partition.round = function(x) {
16321             return arguments.length ? (round = !!x, partition) : round;
16322           };
16323
16324           partition.size = function(x) {
16325             return arguments.length ? (dx = +x[0], dy = +x[1], partition) : [dx, dy];
16326           };
16327
16328           partition.padding = function(x) {
16329             return arguments.length ? (padding = +x, partition) : padding;
16330           };
16331
16332           return partition;
16333         }
16334
16335         var keyPrefix$1 = "$", // Protect against keys like “__proto__”.
16336             preroot = {depth: -1},
16337             ambiguous = {};
16338
16339         function defaultId(d) {
16340           return d.id;
16341         }
16342
16343         function defaultParentId(d) {
16344           return d.parentId;
16345         }
16346
16347         function stratify() {
16348           var id = defaultId,
16349               parentId = defaultParentId;
16350
16351           function stratify(data) {
16352             var d,
16353                 i,
16354                 n = data.length,
16355                 root,
16356                 parent,
16357                 node,
16358                 nodes = new Array(n),
16359                 nodeId,
16360                 nodeKey,
16361                 nodeByKey = {};
16362
16363             for (i = 0; i < n; ++i) {
16364               d = data[i], node = nodes[i] = new Node(d);
16365               if ((nodeId = id(d, i, data)) != null && (nodeId += "")) {
16366                 nodeKey = keyPrefix$1 + (node.id = nodeId);
16367                 nodeByKey[nodeKey] = nodeKey in nodeByKey ? ambiguous : node;
16368               }
16369             }
16370
16371             for (i = 0; i < n; ++i) {
16372               node = nodes[i], nodeId = parentId(data[i], i, data);
16373               if (nodeId == null || !(nodeId += "")) {
16374                 if (root) throw new Error("multiple roots");
16375                 root = node;
16376               } else {
16377                 parent = nodeByKey[keyPrefix$1 + nodeId];
16378                 if (!parent) throw new Error("missing: " + nodeId);
16379                 if (parent === ambiguous) throw new Error("ambiguous: " + nodeId);
16380                 if (parent.children) parent.children.push(node);
16381                 else parent.children = [node];
16382                 node.parent = parent;
16383               }
16384             }
16385
16386             if (!root) throw new Error("no root");
16387             root.parent = preroot;
16388             root.eachBefore(function(node) { node.depth = node.parent.depth + 1; --n; }).eachBefore(computeHeight);
16389             root.parent = null;
16390             if (n > 0) throw new Error("cycle");
16391
16392             return root;
16393           }
16394
16395           stratify.id = function(x) {
16396             return arguments.length ? (id = required(x), stratify) : id;
16397           };
16398
16399           stratify.parentId = function(x) {
16400             return arguments.length ? (parentId = required(x), stratify) : parentId;
16401           };
16402
16403           return stratify;
16404         }
16405
16406         function defaultSeparation$1(a, b) {
16407           return a.parent === b.parent ? 1 : 2;
16408         }
16409
16410         // function radialSeparation(a, b) {
16411         //   return (a.parent === b.parent ? 1 : 2) / a.depth;
16412         // }
16413
16414         // This function is used to traverse the left contour of a subtree (or
16415         // subforest). It returns the successor of v on this contour. This successor is
16416         // either given by the leftmost child of v or by the thread of v. The function
16417         // returns null if and only if v is on the highest level of its subtree.
16418         function nextLeft(v) {
16419           var children = v.children;
16420           return children ? children[0] : v.t;
16421         }
16422
16423         // This function works analogously to nextLeft.
16424         function nextRight(v) {
16425           var children = v.children;
16426           return children ? children[children.length - 1] : v.t;
16427         }
16428
16429         // Shifts the current subtree rooted at w+. This is done by increasing
16430         // prelim(w+) and mod(w+) by shift.
16431         function moveSubtree(wm, wp, shift) {
16432           var change = shift / (wp.i - wm.i);
16433           wp.c -= change;
16434           wp.s += shift;
16435           wm.c += change;
16436           wp.z += shift;
16437           wp.m += shift;
16438         }
16439
16440         // All other shifts, applied to the smaller subtrees between w- and w+, are
16441         // performed by this function. To prepare the shifts, we have to adjust
16442         // change(w+), shift(w+), and change(w-).
16443         function executeShifts(v) {
16444           var shift = 0,
16445               change = 0,
16446               children = v.children,
16447               i = children.length,
16448               w;
16449           while (--i >= 0) {
16450             w = children[i];
16451             w.z += shift;
16452             w.m += shift;
16453             shift += w.s + (change += w.c);
16454           }
16455         }
16456
16457         // If vi-’s ancestor is a sibling of v, returns vi-’s ancestor. Otherwise,
16458         // returns the specified (default) ancestor.
16459         function nextAncestor(vim, v, ancestor) {
16460           return vim.a.parent === v.parent ? vim.a : ancestor;
16461         }
16462
16463         function TreeNode(node, i) {
16464           this._ = node;
16465           this.parent = null;
16466           this.children = null;
16467           this.A = null; // default ancestor
16468           this.a = this; // ancestor
16469           this.z = 0; // prelim
16470           this.m = 0; // mod
16471           this.c = 0; // change
16472           this.s = 0; // shift
16473           this.t = null; // thread
16474           this.i = i; // number
16475         }
16476
16477         TreeNode.prototype = Object.create(Node.prototype);
16478
16479         function treeRoot(root) {
16480           var tree = new TreeNode(root, 0),
16481               node,
16482               nodes = [tree],
16483               child,
16484               children,
16485               i,
16486               n;
16487
16488           while (node = nodes.pop()) {
16489             if (children = node._.children) {
16490               node.children = new Array(n = children.length);
16491               for (i = n - 1; i >= 0; --i) {
16492                 nodes.push(child = node.children[i] = new TreeNode(children[i], i));
16493                 child.parent = node;
16494               }
16495             }
16496           }
16497
16498           (tree.parent = new TreeNode(null, 0)).children = [tree];
16499           return tree;
16500         }
16501
16502         // Node-link tree diagram using the Reingold-Tilford "tidy" algorithm
16503         function tree() {
16504           var separation = defaultSeparation$1,
16505               dx = 1,
16506               dy = 1,
16507               nodeSize = null;
16508
16509           function tree(root) {
16510             var t = treeRoot(root);
16511
16512             // Compute the layout using Buchheim et al.’s algorithm.
16513             t.eachAfter(firstWalk), t.parent.m = -t.z;
16514             t.eachBefore(secondWalk);
16515
16516             // If a fixed node size is specified, scale x and y.
16517             if (nodeSize) root.eachBefore(sizeNode);
16518
16519             // If a fixed tree size is specified, scale x and y based on the extent.
16520             // Compute the left-most, right-most, and depth-most nodes for extents.
16521             else {
16522               var left = root,
16523                   right = root,
16524                   bottom = root;
16525               root.eachBefore(function(node) {
16526                 if (node.x < left.x) left = node;
16527                 if (node.x > right.x) right = node;
16528                 if (node.depth > bottom.depth) bottom = node;
16529               });
16530               var s = left === right ? 1 : separation(left, right) / 2,
16531                   tx = s - left.x,
16532                   kx = dx / (right.x + s + tx),
16533                   ky = dy / (bottom.depth || 1);
16534               root.eachBefore(function(node) {
16535                 node.x = (node.x + tx) * kx;
16536                 node.y = node.depth * ky;
16537               });
16538             }
16539
16540             return root;
16541           }
16542
16543           // Computes a preliminary x-coordinate for v. Before that, FIRST WALK is
16544           // applied recursively to the children of v, as well as the function
16545           // APPORTION. After spacing out the children by calling EXECUTE SHIFTS, the
16546           // node v is placed to the midpoint of its outermost children.
16547           function firstWalk(v) {
16548             var children = v.children,
16549                 siblings = v.parent.children,
16550                 w = v.i ? siblings[v.i - 1] : null;
16551             if (children) {
16552               executeShifts(v);
16553               var midpoint = (children[0].z + children[children.length - 1].z) / 2;
16554               if (w) {
16555                 v.z = w.z + separation(v._, w._);
16556                 v.m = v.z - midpoint;
16557               } else {
16558                 v.z = midpoint;
16559               }
16560             } else if (w) {
16561               v.z = w.z + separation(v._, w._);
16562             }
16563             v.parent.A = apportion(v, w, v.parent.A || siblings[0]);
16564           }
16565
16566           // Computes all real x-coordinates by summing up the modifiers recursively.
16567           function secondWalk(v) {
16568             v._.x = v.z + v.parent.m;
16569             v.m += v.parent.m;
16570           }
16571
16572           // The core of the algorithm. Here, a new subtree is combined with the
16573           // previous subtrees. Threads are used to traverse the inside and outside
16574           // contours of the left and right subtree up to the highest common level. The
16575           // vertices used for the traversals are vi+, vi-, vo-, and vo+, where the
16576           // superscript o means outside and i means inside, the subscript - means left
16577           // subtree and + means right subtree. For summing up the modifiers along the
16578           // contour, we use respective variables si+, si-, so-, and so+. Whenever two
16579           // nodes of the inside contours conflict, we compute the left one of the
16580           // greatest uncommon ancestors using the function ANCESTOR and call MOVE
16581           // SUBTREE to shift the subtree and prepare the shifts of smaller subtrees.
16582           // Finally, we add a new thread (if necessary).
16583           function apportion(v, w, ancestor) {
16584             if (w) {
16585               var vip = v,
16586                   vop = v,
16587                   vim = w,
16588                   vom = vip.parent.children[0],
16589                   sip = vip.m,
16590                   sop = vop.m,
16591                   sim = vim.m,
16592                   som = vom.m,
16593                   shift;
16594               while (vim = nextRight(vim), vip = nextLeft(vip), vim && vip) {
16595                 vom = nextLeft(vom);
16596                 vop = nextRight(vop);
16597                 vop.a = v;
16598                 shift = vim.z + sim - vip.z - sip + separation(vim._, vip._);
16599                 if (shift > 0) {
16600                   moveSubtree(nextAncestor(vim, v, ancestor), v, shift);
16601                   sip += shift;
16602                   sop += shift;
16603                 }
16604                 sim += vim.m;
16605                 sip += vip.m;
16606                 som += vom.m;
16607                 sop += vop.m;
16608               }
16609               if (vim && !nextRight(vop)) {
16610                 vop.t = vim;
16611                 vop.m += sim - sop;
16612               }
16613               if (vip && !nextLeft(vom)) {
16614                 vom.t = vip;
16615                 vom.m += sip - som;
16616                 ancestor = v;
16617               }
16618             }
16619             return ancestor;
16620           }
16621
16622           function sizeNode(node) {
16623             node.x *= dx;
16624             node.y = node.depth * dy;
16625           }
16626
16627           tree.separation = function(x) {
16628             return arguments.length ? (separation = x, tree) : separation;
16629           };
16630
16631           tree.size = function(x) {
16632             return arguments.length ? (nodeSize = false, dx = +x[0], dy = +x[1], tree) : (nodeSize ? null : [dx, dy]);
16633           };
16634
16635           tree.nodeSize = function(x) {
16636             return arguments.length ? (nodeSize = true, dx = +x[0], dy = +x[1], tree) : (nodeSize ? [dx, dy] : null);
16637           };
16638
16639           return tree;
16640         }
16641
16642         function treemapSlice(parent, x0, y0, x1, y1) {
16643           var nodes = parent.children,
16644               node,
16645               i = -1,
16646               n = nodes.length,
16647               k = parent.value && (y1 - y0) / parent.value;
16648
16649           while (++i < n) {
16650             node = nodes[i], node.x0 = x0, node.x1 = x1;
16651             node.y0 = y0, node.y1 = y0 += node.value * k;
16652           }
16653         }
16654
16655         var phi = (1 + Math.sqrt(5)) / 2;
16656
16657         function squarifyRatio(ratio, parent, x0, y0, x1, y1) {
16658           var rows = [],
16659               nodes = parent.children,
16660               row,
16661               nodeValue,
16662               i0 = 0,
16663               i1 = 0,
16664               n = nodes.length,
16665               dx, dy,
16666               value = parent.value,
16667               sumValue,
16668               minValue,
16669               maxValue,
16670               newRatio,
16671               minRatio,
16672               alpha,
16673               beta;
16674
16675           while (i0 < n) {
16676             dx = x1 - x0, dy = y1 - y0;
16677
16678             // Find the next non-empty node.
16679             do sumValue = nodes[i1++].value; while (!sumValue && i1 < n);
16680             minValue = maxValue = sumValue;
16681             alpha = Math.max(dy / dx, dx / dy) / (value * ratio);
16682             beta = sumValue * sumValue * alpha;
16683             minRatio = Math.max(maxValue / beta, beta / minValue);
16684
16685             // Keep adding nodes while the aspect ratio maintains or improves.
16686             for (; i1 < n; ++i1) {
16687               sumValue += nodeValue = nodes[i1].value;
16688               if (nodeValue < minValue) minValue = nodeValue;
16689               if (nodeValue > maxValue) maxValue = nodeValue;
16690               beta = sumValue * sumValue * alpha;
16691               newRatio = Math.max(maxValue / beta, beta / minValue);
16692               if (newRatio > minRatio) { sumValue -= nodeValue; break; }
16693               minRatio = newRatio;
16694             }
16695
16696             // Position and record the row orientation.
16697             rows.push(row = {value: sumValue, dice: dx < dy, children: nodes.slice(i0, i1)});
16698             if (row.dice) treemapDice(row, x0, y0, x1, value ? y0 += dy * sumValue / value : y1);
16699             else treemapSlice(row, x0, y0, value ? x0 += dx * sumValue / value : x1, y1);
16700             value -= sumValue, i0 = i1;
16701           }
16702
16703           return rows;
16704         }
16705
16706         var squarify = (function custom(ratio) {
16707
16708           function squarify(parent, x0, y0, x1, y1) {
16709             squarifyRatio(ratio, parent, x0, y0, x1, y1);
16710           }
16711
16712           squarify.ratio = function(x) {
16713             return custom((x = +x) > 1 ? x : 1);
16714           };
16715
16716           return squarify;
16717         })(phi);
16718
16719         function index$2() {
16720           var tile = squarify,
16721               round = false,
16722               dx = 1,
16723               dy = 1,
16724               paddingStack = [0],
16725               paddingInner = constantZero,
16726               paddingTop = constantZero,
16727               paddingRight = constantZero,
16728               paddingBottom = constantZero,
16729               paddingLeft = constantZero;
16730
16731           function treemap(root) {
16732             root.x0 =
16733             root.y0 = 0;
16734             root.x1 = dx;
16735             root.y1 = dy;
16736             root.eachBefore(positionNode);
16737             paddingStack = [0];
16738             if (round) root.eachBefore(roundNode);
16739             return root;
16740           }
16741
16742           function positionNode(node) {
16743             var p = paddingStack[node.depth],
16744                 x0 = node.x0 + p,
16745                 y0 = node.y0 + p,
16746                 x1 = node.x1 - p,
16747                 y1 = node.y1 - p;
16748             if (x1 < x0) x0 = x1 = (x0 + x1) / 2;
16749             if (y1 < y0) y0 = y1 = (y0 + y1) / 2;
16750             node.x0 = x0;
16751             node.y0 = y0;
16752             node.x1 = x1;
16753             node.y1 = y1;
16754             if (node.children) {
16755               p = paddingStack[node.depth + 1] = paddingInner(node) / 2;
16756               x0 += paddingLeft(node) - p;
16757               y0 += paddingTop(node) - p;
16758               x1 -= paddingRight(node) - p;
16759               y1 -= paddingBottom(node) - p;
16760               if (x1 < x0) x0 = x1 = (x0 + x1) / 2;
16761               if (y1 < y0) y0 = y1 = (y0 + y1) / 2;
16762               tile(node, x0, y0, x1, y1);
16763             }
16764           }
16765
16766           treemap.round = function(x) {
16767             return arguments.length ? (round = !!x, treemap) : round;
16768           };
16769
16770           treemap.size = function(x) {
16771             return arguments.length ? (dx = +x[0], dy = +x[1], treemap) : [dx, dy];
16772           };
16773
16774           treemap.tile = function(x) {
16775             return arguments.length ? (tile = required(x), treemap) : tile;
16776           };
16777
16778           treemap.padding = function(x) {
16779             return arguments.length ? treemap.paddingInner(x).paddingOuter(x) : treemap.paddingInner();
16780           };
16781
16782           treemap.paddingInner = function(x) {
16783             return arguments.length ? (paddingInner = typeof x === "function" ? x : constant$9(+x), treemap) : paddingInner;
16784           };
16785
16786           treemap.paddingOuter = function(x) {
16787             return arguments.length ? treemap.paddingTop(x).paddingRight(x).paddingBottom(x).paddingLeft(x) : treemap.paddingTop();
16788           };
16789
16790           treemap.paddingTop = function(x) {
16791             return arguments.length ? (paddingTop = typeof x === "function" ? x : constant$9(+x), treemap) : paddingTop;
16792           };
16793
16794           treemap.paddingRight = function(x) {
16795             return arguments.length ? (paddingRight = typeof x === "function" ? x : constant$9(+x), treemap) : paddingRight;
16796           };
16797
16798           treemap.paddingBottom = function(x) {
16799             return arguments.length ? (paddingBottom = typeof x === "function" ? x : constant$9(+x), treemap) : paddingBottom;
16800           };
16801
16802           treemap.paddingLeft = function(x) {
16803             return arguments.length ? (paddingLeft = typeof x === "function" ? x : constant$9(+x), treemap) : paddingLeft;
16804           };
16805
16806           return treemap;
16807         }
16808
16809         function binary(parent, x0, y0, x1, y1) {
16810           var nodes = parent.children,
16811               i, n = nodes.length,
16812               sum, sums = new Array(n + 1);
16813
16814           for (sums[0] = sum = i = 0; i < n; ++i) {
16815             sums[i + 1] = sum += nodes[i].value;
16816           }
16817
16818           partition(0, n, parent.value, x0, y0, x1, y1);
16819
16820           function partition(i, j, value, x0, y0, x1, y1) {
16821             if (i >= j - 1) {
16822               var node = nodes[i];
16823               node.x0 = x0, node.y0 = y0;
16824               node.x1 = x1, node.y1 = y1;
16825               return;
16826             }
16827
16828             var valueOffset = sums[i],
16829                 valueTarget = (value / 2) + valueOffset,
16830                 k = i + 1,
16831                 hi = j - 1;
16832
16833             while (k < hi) {
16834               var mid = k + hi >>> 1;
16835               if (sums[mid] < valueTarget) k = mid + 1;
16836               else hi = mid;
16837             }
16838
16839             if ((valueTarget - sums[k - 1]) < (sums[k] - valueTarget) && i + 1 < k) --k;
16840
16841             var valueLeft = sums[k] - valueOffset,
16842                 valueRight = value - valueLeft;
16843
16844             if ((x1 - x0) > (y1 - y0)) {
16845               var xk = (x0 * valueRight + x1 * valueLeft) / value;
16846               partition(i, k, valueLeft, x0, y0, xk, y1);
16847               partition(k, j, valueRight, xk, y0, x1, y1);
16848             } else {
16849               var yk = (y0 * valueRight + y1 * valueLeft) / value;
16850               partition(i, k, valueLeft, x0, y0, x1, yk);
16851               partition(k, j, valueRight, x0, yk, x1, y1);
16852             }
16853           }
16854         }
16855
16856         function sliceDice(parent, x0, y0, x1, y1) {
16857           (parent.depth & 1 ? treemapSlice : treemapDice)(parent, x0, y0, x1, y1);
16858         }
16859
16860         var resquarify = (function custom(ratio) {
16861
16862           function resquarify(parent, x0, y0, x1, y1) {
16863             if ((rows = parent._squarify) && (rows.ratio === ratio)) {
16864               var rows,
16865                   row,
16866                   nodes,
16867                   i,
16868                   j = -1,
16869                   n,
16870                   m = rows.length,
16871                   value = parent.value;
16872
16873               while (++j < m) {
16874                 row = rows[j], nodes = row.children;
16875                 for (i = row.value = 0, n = nodes.length; i < n; ++i) row.value += nodes[i].value;
16876                 if (row.dice) treemapDice(row, x0, y0, x1, y0 += (y1 - y0) * row.value / value);
16877                 else treemapSlice(row, x0, y0, x0 += (x1 - x0) * row.value / value, y1);
16878                 value -= row.value;
16879               }
16880             } else {
16881               parent._squarify = rows = squarifyRatio(ratio, parent, x0, y0, x1, y1);
16882               rows.ratio = ratio;
16883             }
16884           }
16885
16886           resquarify.ratio = function(x) {
16887             return custom((x = +x) > 1 ? x : 1);
16888           };
16889
16890           return resquarify;
16891         })(phi);
16892
16893         function d3_polygonArea(polygon) {
16894           var i = -1,
16895               n = polygon.length,
16896               a,
16897               b = polygon[n - 1],
16898               area = 0;
16899
16900           while (++i < n) {
16901             a = b;
16902             b = polygon[i];
16903             area += a[1] * b[0] - a[0] * b[1];
16904           }
16905
16906           return area / 2;
16907         }
16908
16909         function d3_polygonCentroid(polygon) {
16910           var i = -1,
16911               n = polygon.length,
16912               x = 0,
16913               y = 0,
16914               a,
16915               b = polygon[n - 1],
16916               c,
16917               k = 0;
16918
16919           while (++i < n) {
16920             a = b;
16921             b = polygon[i];
16922             k += c = a[0] * b[1] - b[0] * a[1];
16923             x += (a[0] + b[0]) * c;
16924             y += (a[1] + b[1]) * c;
16925           }
16926
16927           return k *= 3, [x / k, y / k];
16928         }
16929
16930         // Returns the 2D cross product of AB and AC vectors, i.e., the z-component of
16931         // the 3D cross product in a quadrant I Cartesian coordinate system (+x is
16932         // right, +y is up). Returns a positive value if ABC is counter-clockwise,
16933         // negative if clockwise, and zero if the points are collinear.
16934         function cross$1(a, b, c) {
16935           return (b[0] - a[0]) * (c[1] - a[1]) - (b[1] - a[1]) * (c[0] - a[0]);
16936         }
16937
16938         function lexicographicOrder(a, b) {
16939           return a[0] - b[0] || a[1] - b[1];
16940         }
16941
16942         // Computes the upper convex hull per the monotone chain algorithm.
16943         // Assumes points.length >= 3, is sorted by x, unique in y.
16944         // Returns an array of indices into points in left-to-right order.
16945         function computeUpperHullIndexes(points) {
16946           var n = points.length,
16947               indexes = [0, 1],
16948               size = 2;
16949
16950           for (var i = 2; i < n; ++i) {
16951             while (size > 1 && cross$1(points[indexes[size - 2]], points[indexes[size - 1]], points[i]) <= 0) --size;
16952             indexes[size++] = i;
16953           }
16954
16955           return indexes.slice(0, size); // remove popped points
16956         }
16957
16958         function d3_polygonHull(points) {
16959           if ((n = points.length) < 3) return null;
16960
16961           var i,
16962               n,
16963               sortedPoints = new Array(n),
16964               flippedPoints = new Array(n);
16965
16966           for (i = 0; i < n; ++i) sortedPoints[i] = [+points[i][0], +points[i][1], i];
16967           sortedPoints.sort(lexicographicOrder);
16968           for (i = 0; i < n; ++i) flippedPoints[i] = [sortedPoints[i][0], -sortedPoints[i][1]];
16969
16970           var upperIndexes = computeUpperHullIndexes(sortedPoints),
16971               lowerIndexes = computeUpperHullIndexes(flippedPoints);
16972
16973           // Construct the hull polygon, removing possible duplicate endpoints.
16974           var skipLeft = lowerIndexes[0] === upperIndexes[0],
16975               skipRight = lowerIndexes[lowerIndexes.length - 1] === upperIndexes[upperIndexes.length - 1],
16976               hull = [];
16977
16978           // Add upper hull in right-to-l order.
16979           // Then add lower hull in left-to-right order.
16980           for (i = upperIndexes.length - 1; i >= 0; --i) hull.push(points[sortedPoints[upperIndexes[i]][2]]);
16981           for (i = +skipLeft; i < lowerIndexes.length - skipRight; ++i) hull.push(points[sortedPoints[lowerIndexes[i]][2]]);
16982
16983           return hull;
16984         }
16985
16986         function contains$3(polygon, point) {
16987           var n = polygon.length,
16988               p = polygon[n - 1],
16989               x = point[0], y = point[1],
16990               x0 = p[0], y0 = p[1],
16991               x1, y1,
16992               inside = false;
16993
16994           for (var i = 0; i < n; ++i) {
16995             p = polygon[i], x1 = p[0], y1 = p[1];
16996             if (((y1 > y) !== (y0 > y)) && (x < (x0 - x1) * (y - y1) / (y0 - y1) + x1)) inside = !inside;
16997             x0 = x1, y0 = y1;
16998           }
16999
17000           return inside;
17001         }
17002
17003         function length$1(polygon) {
17004           var i = -1,
17005               n = polygon.length,
17006               b = polygon[n - 1],
17007               xa,
17008               ya,
17009               xb = b[0],
17010               yb = b[1],
17011               perimeter = 0;
17012
17013           while (++i < n) {
17014             xa = xb;
17015             ya = yb;
17016             b = polygon[i];
17017             xb = b[0];
17018             yb = b[1];
17019             xa -= xb;
17020             ya -= yb;
17021             perimeter += Math.sqrt(xa * xa + ya * ya);
17022           }
17023
17024           return perimeter;
17025         }
17026
17027         function defaultSource$1() {
17028           return Math.random();
17029         }
17030
17031         var uniform = (function sourceRandomUniform(source) {
17032           function randomUniform(min, max) {
17033             min = min == null ? 0 : +min;
17034             max = max == null ? 1 : +max;
17035             if (arguments.length === 1) max = min, min = 0;
17036             else max -= min;
17037             return function() {
17038               return source() * max + min;
17039             };
17040           }
17041
17042           randomUniform.source = sourceRandomUniform;
17043
17044           return randomUniform;
17045         })(defaultSource$1);
17046
17047         var normal = (function sourceRandomNormal(source) {
17048           function randomNormal(mu, sigma) {
17049             var x, r;
17050             mu = mu == null ? 0 : +mu;
17051             sigma = sigma == null ? 1 : +sigma;
17052             return function() {
17053               var y;
17054
17055               // If available, use the second previously-generated uniform random.
17056               if (x != null) y = x, x = null;
17057
17058               // Otherwise, generate a new x and y.
17059               else do {
17060                 x = source() * 2 - 1;
17061                 y = source() * 2 - 1;
17062                 r = x * x + y * y;
17063               } while (!r || r > 1);
17064
17065               return mu + sigma * y * Math.sqrt(-2 * Math.log(r) / r);
17066             };
17067           }
17068
17069           randomNormal.source = sourceRandomNormal;
17070
17071           return randomNormal;
17072         })(defaultSource$1);
17073
17074         var logNormal = (function sourceRandomLogNormal(source) {
17075           function randomLogNormal() {
17076             var randomNormal = normal.source(source).apply(this, arguments);
17077             return function() {
17078               return Math.exp(randomNormal());
17079             };
17080           }
17081
17082           randomLogNormal.source = sourceRandomLogNormal;
17083
17084           return randomLogNormal;
17085         })(defaultSource$1);
17086
17087         var irwinHall = (function sourceRandomIrwinHall(source) {
17088           function randomIrwinHall(n) {
17089             return function() {
17090               for (var sum = 0, i = 0; i < n; ++i) sum += source();
17091               return sum;
17092             };
17093           }
17094
17095           randomIrwinHall.source = sourceRandomIrwinHall;
17096
17097           return randomIrwinHall;
17098         })(defaultSource$1);
17099
17100         var bates = (function sourceRandomBates(source) {
17101           function randomBates(n) {
17102             var randomIrwinHall = irwinHall.source(source)(n);
17103             return function() {
17104               return randomIrwinHall() / n;
17105             };
17106           }
17107
17108           randomBates.source = sourceRandomBates;
17109
17110           return randomBates;
17111         })(defaultSource$1);
17112
17113         var exponential$1 = (function sourceRandomExponential(source) {
17114           function randomExponential(lambda) {
17115             return function() {
17116               return -Math.log(1 - source()) / lambda;
17117             };
17118           }
17119
17120           randomExponential.source = sourceRandomExponential;
17121
17122           return randomExponential;
17123         })(defaultSource$1);
17124
17125         function initRange(domain, range) {
17126           switch (arguments.length) {
17127             case 0: break;
17128             case 1: this.range(domain); break;
17129             default: this.range(range).domain(domain); break;
17130           }
17131           return this;
17132         }
17133
17134         function initInterpolator(domain, interpolator) {
17135           switch (arguments.length) {
17136             case 0: break;
17137             case 1: this.interpolator(domain); break;
17138             default: this.interpolator(interpolator).domain(domain); break;
17139           }
17140           return this;
17141         }
17142
17143         var array$4 = Array.prototype;
17144
17145         var map$4 = array$4.map;
17146         var slice$9 = array$4.slice;
17147
17148         var implicit = {name: "implicit"};
17149
17150         function ordinal() {
17151           var index = map$3(),
17152               domain = [],
17153               range = [],
17154               unknown = implicit;
17155
17156           function scale(d) {
17157             var key = d + "", i = index.get(key);
17158             if (!i) {
17159               if (unknown !== implicit) return unknown;
17160               index.set(key, i = domain.push(d));
17161             }
17162             return range[(i - 1) % range.length];
17163           }
17164
17165           scale.domain = function(_) {
17166             if (!arguments.length) return domain.slice();
17167             domain = [], index = map$3();
17168             var i = -1, n = _.length, d, key;
17169             while (++i < n) if (!index.has(key = (d = _[i]) + "")) index.set(key, domain.push(d));
17170             return scale;
17171           };
17172
17173           scale.range = function(_) {
17174             return arguments.length ? (range = slice$9.call(_), scale) : range.slice();
17175           };
17176
17177           scale.unknown = function(_) {
17178             return arguments.length ? (unknown = _, scale) : unknown;
17179           };
17180
17181           scale.copy = function() {
17182             return ordinal(domain, range).unknown(unknown);
17183           };
17184
17185           initRange.apply(scale, arguments);
17186
17187           return scale;
17188         }
17189
17190         function band() {
17191           var scale = ordinal().unknown(undefined),
17192               domain = scale.domain,
17193               ordinalRange = scale.range,
17194               range = [0, 1],
17195               step,
17196               bandwidth,
17197               round = false,
17198               paddingInner = 0,
17199               paddingOuter = 0,
17200               align = 0.5;
17201
17202           delete scale.unknown;
17203
17204           function rescale() {
17205             var n = domain().length,
17206                 reverse = range[1] < range[0],
17207                 start = range[reverse - 0],
17208                 stop = range[1 - reverse];
17209             step = (stop - start) / Math.max(1, n - paddingInner + paddingOuter * 2);
17210             if (round) step = Math.floor(step);
17211             start += (stop - start - step * (n - paddingInner)) * align;
17212             bandwidth = step * (1 - paddingInner);
17213             if (round) start = Math.round(start), bandwidth = Math.round(bandwidth);
17214             var values = d3_range(n).map(function(i) { return start + step * i; });
17215             return ordinalRange(reverse ? values.reverse() : values);
17216           }
17217
17218           scale.domain = function(_) {
17219             return arguments.length ? (domain(_), rescale()) : domain();
17220           };
17221
17222           scale.range = function(_) {
17223             return arguments.length ? (range = [+_[0], +_[1]], rescale()) : range.slice();
17224           };
17225
17226           scale.rangeRound = function(_) {
17227             return range = [+_[0], +_[1]], round = true, rescale();
17228           };
17229
17230           scale.bandwidth = function() {
17231             return bandwidth;
17232           };
17233
17234           scale.step = function() {
17235             return step;
17236           };
17237
17238           scale.round = function(_) {
17239             return arguments.length ? (round = !!_, rescale()) : round;
17240           };
17241
17242           scale.padding = function(_) {
17243             return arguments.length ? (paddingInner = Math.min(1, paddingOuter = +_), rescale()) : paddingInner;
17244           };
17245
17246           scale.paddingInner = function(_) {
17247             return arguments.length ? (paddingInner = Math.min(1, _), rescale()) : paddingInner;
17248           };
17249
17250           scale.paddingOuter = function(_) {
17251             return arguments.length ? (paddingOuter = +_, rescale()) : paddingOuter;
17252           };
17253
17254           scale.align = function(_) {
17255             return arguments.length ? (align = Math.max(0, Math.min(1, _)), rescale()) : align;
17256           };
17257
17258           scale.copy = function() {
17259             return band(domain(), range)
17260                 .round(round)
17261                 .paddingInner(paddingInner)
17262                 .paddingOuter(paddingOuter)
17263                 .align(align);
17264           };
17265
17266           return initRange.apply(rescale(), arguments);
17267         }
17268
17269         function pointish(scale) {
17270           var copy = scale.copy;
17271
17272           scale.padding = scale.paddingOuter;
17273           delete scale.paddingInner;
17274           delete scale.paddingOuter;
17275
17276           scale.copy = function() {
17277             return pointish(copy());
17278           };
17279
17280           return scale;
17281         }
17282
17283         function point$1() {
17284           return pointish(band.apply(null, arguments).paddingInner(1));
17285         }
17286
17287         function constant$a(x) {
17288           return function() {
17289             return x;
17290           };
17291         }
17292
17293         function number$2(x) {
17294           return +x;
17295         }
17296
17297         var unit = [0, 1];
17298
17299         function identity$5(x) {
17300           return x;
17301         }
17302
17303         function normalize(a, b) {
17304           return (b -= (a = +a))
17305               ? function(x) { return (x - a) / b; }
17306               : constant$a(isNaN(b) ? NaN : 0.5);
17307         }
17308
17309         function clamper(domain) {
17310           var a = domain[0], b = domain[domain.length - 1], t;
17311           if (a > b) t = a, a = b, b = t;
17312           return function(x) { return Math.max(a, Math.min(b, x)); };
17313         }
17314
17315         // normalize(a, b)(x) takes a domain value x in [a,b] and returns the corresponding parameter t in [0,1].
17316         // interpolate(a, b)(t) takes a parameter t in [0,1] and returns the corresponding range value x in [a,b].
17317         function bimap(domain, range, interpolate) {
17318           var d0 = domain[0], d1 = domain[1], r0 = range[0], r1 = range[1];
17319           if (d1 < d0) d0 = normalize(d1, d0), r0 = interpolate(r1, r0);
17320           else d0 = normalize(d0, d1), r0 = interpolate(r0, r1);
17321           return function(x) { return r0(d0(x)); };
17322         }
17323
17324         function polymap(domain, range, interpolate) {
17325           var j = Math.min(domain.length, range.length) - 1,
17326               d = new Array(j),
17327               r = new Array(j),
17328               i = -1;
17329
17330           // Reverse descending domains.
17331           if (domain[j] < domain[0]) {
17332             domain = domain.slice().reverse();
17333             range = range.slice().reverse();
17334           }
17335
17336           while (++i < j) {
17337             d[i] = normalize(domain[i], domain[i + 1]);
17338             r[i] = interpolate(range[i], range[i + 1]);
17339           }
17340
17341           return function(x) {
17342             var i = bisectRight(domain, x, 1, j) - 1;
17343             return r[i](d[i](x));
17344           };
17345         }
17346
17347         function copy$1(source, target) {
17348           return target
17349               .domain(source.domain())
17350               .range(source.range())
17351               .interpolate(source.interpolate())
17352               .clamp(source.clamp())
17353               .unknown(source.unknown());
17354         }
17355
17356         function transformer$1() {
17357           var domain = unit,
17358               range = unit,
17359               interpolate = d3_interpolate,
17360               transform,
17361               untransform,
17362               unknown,
17363               clamp = identity$5,
17364               piecewise,
17365               output,
17366               input;
17367
17368           function rescale() {
17369             piecewise = Math.min(domain.length, range.length) > 2 ? polymap : bimap;
17370             output = input = null;
17371             return scale;
17372           }
17373
17374           function scale(x) {
17375             return isNaN(x = +x) ? unknown : (output || (output = piecewise(domain.map(transform), range, interpolate)))(transform(clamp(x)));
17376           }
17377
17378           scale.invert = function(y) {
17379             return clamp(untransform((input || (input = piecewise(range, domain.map(transform), d3_interpolateNumber)))(y)));
17380           };
17381
17382           scale.domain = function(_) {
17383             return arguments.length ? (domain = map$4.call(_, number$2), clamp === identity$5 || (clamp = clamper(domain)), rescale()) : domain.slice();
17384           };
17385
17386           scale.range = function(_) {
17387             return arguments.length ? (range = slice$9.call(_), rescale()) : range.slice();
17388           };
17389
17390           scale.rangeRound = function(_) {
17391             return range = slice$9.call(_), interpolate = interpolateRound, rescale();
17392           };
17393
17394           scale.clamp = function(_) {
17395             return arguments.length ? (clamp = _ ? clamper(domain) : identity$5, scale) : clamp !== identity$5;
17396           };
17397
17398           scale.interpolate = function(_) {
17399             return arguments.length ? (interpolate = _, rescale()) : interpolate;
17400           };
17401
17402           scale.unknown = function(_) {
17403             return arguments.length ? (unknown = _, scale) : unknown;
17404           };
17405
17406           return function(t, u) {
17407             transform = t, untransform = u;
17408             return rescale();
17409           };
17410         }
17411
17412         function continuous(transform, untransform) {
17413           return transformer$1()(transform, untransform);
17414         }
17415
17416         function tickFormat(start, stop, count, specifier) {
17417           var step = tickStep(start, stop, count),
17418               precision;
17419           specifier = formatSpecifier(specifier == null ? ",f" : specifier);
17420           switch (specifier.type) {
17421             case "s": {
17422               var value = Math.max(Math.abs(start), Math.abs(stop));
17423               if (specifier.precision == null && !isNaN(precision = precisionPrefix(step, value))) specifier.precision = precision;
17424               return formatPrefix(specifier, value);
17425             }
17426             case "":
17427             case "e":
17428             case "g":
17429             case "p":
17430             case "r": {
17431               if (specifier.precision == null && !isNaN(precision = precisionRound(step, Math.max(Math.abs(start), Math.abs(stop))))) specifier.precision = precision - (specifier.type === "e");
17432               break;
17433             }
17434             case "f":
17435             case "%": {
17436               if (specifier.precision == null && !isNaN(precision = precisionFixed(step))) specifier.precision = precision - (specifier.type === "%") * 2;
17437               break;
17438             }
17439           }
17440           return format(specifier);
17441         }
17442
17443         function linearish(scale) {
17444           var domain = scale.domain;
17445
17446           scale.ticks = function(count) {
17447             var d = domain();
17448             return ticks(d[0], d[d.length - 1], count == null ? 10 : count);
17449           };
17450
17451           scale.tickFormat = function(count, specifier) {
17452             var d = domain();
17453             return tickFormat(d[0], d[d.length - 1], count == null ? 10 : count, specifier);
17454           };
17455
17456           scale.nice = function(count) {
17457             if (count == null) count = 10;
17458
17459             var d = domain(),
17460                 i0 = 0,
17461                 i1 = d.length - 1,
17462                 start = d[i0],
17463                 stop = d[i1],
17464                 step;
17465
17466             if (stop < start) {
17467               step = start, start = stop, stop = step;
17468               step = i0, i0 = i1, i1 = step;
17469             }
17470
17471             step = tickIncrement(start, stop, count);
17472
17473             if (step > 0) {
17474               start = Math.floor(start / step) * step;
17475               stop = Math.ceil(stop / step) * step;
17476               step = tickIncrement(start, stop, count);
17477             } else if (step < 0) {
17478               start = Math.ceil(start * step) / step;
17479               stop = Math.floor(stop * step) / step;
17480               step = tickIncrement(start, stop, count);
17481             }
17482
17483             if (step > 0) {
17484               d[i0] = Math.floor(start / step) * step;
17485               d[i1] = Math.ceil(stop / step) * step;
17486               domain(d);
17487             } else if (step < 0) {
17488               d[i0] = Math.ceil(start * step) / step;
17489               d[i1] = Math.floor(stop * step) / step;
17490               domain(d);
17491             }
17492
17493             return scale;
17494           };
17495
17496           return scale;
17497         }
17498
17499         function linear$2() {
17500           var scale = continuous(identity$5, identity$5);
17501
17502           scale.copy = function() {
17503             return copy$1(scale, linear$2());
17504           };
17505
17506           initRange.apply(scale, arguments);
17507
17508           return linearish(scale);
17509         }
17510
17511         function identity$6(domain) {
17512           var unknown;
17513
17514           function scale(x) {
17515             return isNaN(x = +x) ? unknown : x;
17516           }
17517
17518           scale.invert = scale;
17519
17520           scale.domain = scale.range = function(_) {
17521             return arguments.length ? (domain = map$4.call(_, number$2), scale) : domain.slice();
17522           };
17523
17524           scale.unknown = function(_) {
17525             return arguments.length ? (unknown = _, scale) : unknown;
17526           };
17527
17528           scale.copy = function() {
17529             return identity$6(domain).unknown(unknown);
17530           };
17531
17532           domain = arguments.length ? map$4.call(domain, number$2) : [0, 1];
17533
17534           return linearish(scale);
17535         }
17536
17537         function nice(domain, interval) {
17538           domain = domain.slice();
17539
17540           var i0 = 0,
17541               i1 = domain.length - 1,
17542               x0 = domain[i0],
17543               x1 = domain[i1],
17544               t;
17545
17546           if (x1 < x0) {
17547             t = i0, i0 = i1, i1 = t;
17548             t = x0, x0 = x1, x1 = t;
17549           }
17550
17551           domain[i0] = interval.floor(x0);
17552           domain[i1] = interval.ceil(x1);
17553           return domain;
17554         }
17555
17556         function transformLog(x) {
17557           return Math.log(x);
17558         }
17559
17560         function transformExp(x) {
17561           return Math.exp(x);
17562         }
17563
17564         function transformLogn(x) {
17565           return -Math.log(-x);
17566         }
17567
17568         function transformExpn(x) {
17569           return -Math.exp(-x);
17570         }
17571
17572         function pow10(x) {
17573           return isFinite(x) ? +("1e" + x) : x < 0 ? 0 : x;
17574         }
17575
17576         function powp(base) {
17577           return base === 10 ? pow10
17578               : base === Math.E ? Math.exp
17579               : function(x) { return Math.pow(base, x); };
17580         }
17581
17582         function logp(base) {
17583           return base === Math.E ? Math.log
17584               : base === 10 && Math.log10
17585               || base === 2 && Math.log2
17586               || (base = Math.log(base), function(x) { return Math.log(x) / base; });
17587         }
17588
17589         function reflect(f) {
17590           return function(x) {
17591             return -f(-x);
17592           };
17593         }
17594
17595         function loggish(transform) {
17596           var scale = transform(transformLog, transformExp),
17597               domain = scale.domain,
17598               base = 10,
17599               logs,
17600               pows;
17601
17602           function rescale() {
17603             logs = logp(base), pows = powp(base);
17604             if (domain()[0] < 0) {
17605               logs = reflect(logs), pows = reflect(pows);
17606               transform(transformLogn, transformExpn);
17607             } else {
17608               transform(transformLog, transformExp);
17609             }
17610             return scale;
17611           }
17612
17613           scale.base = function(_) {
17614             return arguments.length ? (base = +_, rescale()) : base;
17615           };
17616
17617           scale.domain = function(_) {
17618             return arguments.length ? (domain(_), rescale()) : domain();
17619           };
17620
17621           scale.ticks = function(count) {
17622             var d = domain(),
17623                 u = d[0],
17624                 v = d[d.length - 1],
17625                 r;
17626
17627             if (r = v < u) i = u, u = v, v = i;
17628
17629             var i = logs(u),
17630                 j = logs(v),
17631                 p,
17632                 k,
17633                 t,
17634                 n = count == null ? 10 : +count,
17635                 z = [];
17636
17637             if (!(base % 1) && j - i < n) {
17638               i = Math.round(i) - 1, j = Math.round(j) + 1;
17639               if (u > 0) for (; i < j; ++i) {
17640                 for (k = 1, p = pows(i); k < base; ++k) {
17641                   t = p * k;
17642                   if (t < u) continue;
17643                   if (t > v) break;
17644                   z.push(t);
17645                 }
17646               } else for (; i < j; ++i) {
17647                 for (k = base - 1, p = pows(i); k >= 1; --k) {
17648                   t = p * k;
17649                   if (t < u) continue;
17650                   if (t > v) break;
17651                   z.push(t);
17652                 }
17653               }
17654             } else {
17655               z = ticks(i, j, Math.min(j - i, n)).map(pows);
17656             }
17657
17658             return r ? z.reverse() : z;
17659           };
17660
17661           scale.tickFormat = function(count, specifier) {
17662             if (specifier == null) specifier = base === 10 ? ".0e" : ",";
17663             if (typeof specifier !== "function") specifier = format(specifier);
17664             if (count === Infinity) return specifier;
17665             if (count == null) count = 10;
17666             var k = Math.max(1, base * count / scale.ticks().length); // TODO fast estimate?
17667             return function(d) {
17668               var i = d / pows(Math.round(logs(d)));
17669               if (i * base < base - 0.5) i *= base;
17670               return i <= k ? specifier(d) : "";
17671             };
17672           };
17673
17674           scale.nice = function() {
17675             return domain(nice(domain(), {
17676               floor: function(x) { return pows(Math.floor(logs(x))); },
17677               ceil: function(x) { return pows(Math.ceil(logs(x))); }
17678             }));
17679           };
17680
17681           return scale;
17682         }
17683
17684         function log$1() {
17685           var scale = loggish(transformer$1()).domain([1, 10]);
17686
17687           scale.copy = function() {
17688             return copy$1(scale, log$1()).base(scale.base());
17689           };
17690
17691           initRange.apply(scale, arguments);
17692
17693           return scale;
17694         }
17695
17696         function transformSymlog(c) {
17697           return function(x) {
17698             return Math.sign(x) * Math.log1p(Math.abs(x / c));
17699           };
17700         }
17701
17702         function transformSymexp(c) {
17703           return function(x) {
17704             return Math.sign(x) * Math.expm1(Math.abs(x)) * c;
17705           };
17706         }
17707
17708         function symlogish(transform) {
17709           var c = 1, scale = transform(transformSymlog(c), transformSymexp(c));
17710
17711           scale.constant = function(_) {
17712             return arguments.length ? transform(transformSymlog(c = +_), transformSymexp(c)) : c;
17713           };
17714
17715           return linearish(scale);
17716         }
17717
17718         function symlog() {
17719           var scale = symlogish(transformer$1());
17720
17721           scale.copy = function() {
17722             return copy$1(scale, symlog()).constant(scale.constant());
17723           };
17724
17725           return initRange.apply(scale, arguments);
17726         }
17727
17728         function transformPow(exponent) {
17729           return function(x) {
17730             return x < 0 ? -Math.pow(-x, exponent) : Math.pow(x, exponent);
17731           };
17732         }
17733
17734         function transformSqrt(x) {
17735           return x < 0 ? -Math.sqrt(-x) : Math.sqrt(x);
17736         }
17737
17738         function transformSquare(x) {
17739           return x < 0 ? -x * x : x * x;
17740         }
17741
17742         function powish(transform) {
17743           var scale = transform(identity$5, identity$5),
17744               exponent = 1;
17745
17746           function rescale() {
17747             return exponent === 1 ? transform(identity$5, identity$5)
17748                 : exponent === 0.5 ? transform(transformSqrt, transformSquare)
17749                 : transform(transformPow(exponent), transformPow(1 / exponent));
17750           }
17751
17752           scale.exponent = function(_) {
17753             return arguments.length ? (exponent = +_, rescale()) : exponent;
17754           };
17755
17756           return linearish(scale);
17757         }
17758
17759         function pow$1() {
17760           var scale = powish(transformer$1());
17761
17762           scale.copy = function() {
17763             return copy$1(scale, pow$1()).exponent(scale.exponent());
17764           };
17765
17766           initRange.apply(scale, arguments);
17767
17768           return scale;
17769         }
17770
17771         function sqrt$1() {
17772           return pow$1.apply(null, arguments).exponent(0.5);
17773         }
17774
17775         function quantile() {
17776           var domain = [],
17777               range = [],
17778               thresholds = [],
17779               unknown;
17780
17781           function rescale() {
17782             var i = 0, n = Math.max(1, range.length);
17783             thresholds = new Array(n - 1);
17784             while (++i < n) thresholds[i - 1] = threshold(domain, i / n);
17785             return scale;
17786           }
17787
17788           function scale(x) {
17789             return isNaN(x = +x) ? unknown : range[bisectRight(thresholds, x)];
17790           }
17791
17792           scale.invertExtent = function(y) {
17793             var i = range.indexOf(y);
17794             return i < 0 ? [NaN, NaN] : [
17795               i > 0 ? thresholds[i - 1] : domain[0],
17796               i < thresholds.length ? thresholds[i] : domain[domain.length - 1]
17797             ];
17798           };
17799
17800           scale.domain = function(_) {
17801             if (!arguments.length) return domain.slice();
17802             domain = [];
17803             for (var i = 0, n = _.length, d; i < n; ++i) if (d = _[i], d != null && !isNaN(d = +d)) domain.push(d);
17804             domain.sort(d3_ascending);
17805             return rescale();
17806           };
17807
17808           scale.range = function(_) {
17809             return arguments.length ? (range = slice$9.call(_), rescale()) : range.slice();
17810           };
17811
17812           scale.unknown = function(_) {
17813             return arguments.length ? (unknown = _, scale) : unknown;
17814           };
17815
17816           scale.quantiles = function() {
17817             return thresholds.slice();
17818           };
17819
17820           scale.copy = function() {
17821             return quantile()
17822                 .domain(domain)
17823                 .range(range)
17824                 .unknown(unknown);
17825           };
17826
17827           return initRange.apply(scale, arguments);
17828         }
17829
17830         function quantize() {
17831           var x0 = 0,
17832               x1 = 1,
17833               n = 1,
17834               domain = [0.5],
17835               range = [0, 1],
17836               unknown;
17837
17838           function scale(x) {
17839             return x <= x ? range[bisectRight(domain, x, 0, n)] : unknown;
17840           }
17841
17842           function rescale() {
17843             var i = -1;
17844             domain = new Array(n);
17845             while (++i < n) domain[i] = ((i + 1) * x1 - (i - n) * x0) / (n + 1);
17846             return scale;
17847           }
17848
17849           scale.domain = function(_) {
17850             return arguments.length ? (x0 = +_[0], x1 = +_[1], rescale()) : [x0, x1];
17851           };
17852
17853           scale.range = function(_) {
17854             return arguments.length ? (n = (range = slice$9.call(_)).length - 1, rescale()) : range.slice();
17855           };
17856
17857           scale.invertExtent = function(y) {
17858             var i = range.indexOf(y);
17859             return i < 0 ? [NaN, NaN]
17860                 : i < 1 ? [x0, domain[0]]
17861                 : i >= n ? [domain[n - 1], x1]
17862                 : [domain[i - 1], domain[i]];
17863           };
17864
17865           scale.unknown = function(_) {
17866             return arguments.length ? (unknown = _, scale) : scale;
17867           };
17868
17869           scale.thresholds = function() {
17870             return domain.slice();
17871           };
17872
17873           scale.copy = function() {
17874             return quantize()
17875                 .domain([x0, x1])
17876                 .range(range)
17877                 .unknown(unknown);
17878           };
17879
17880           return initRange.apply(linearish(scale), arguments);
17881         }
17882
17883         function threshold$1() {
17884           var domain = [0.5],
17885               range = [0, 1],
17886               unknown,
17887               n = 1;
17888
17889           function scale(x) {
17890             return x <= x ? range[bisectRight(domain, x, 0, n)] : unknown;
17891           }
17892
17893           scale.domain = function(_) {
17894             return arguments.length ? (domain = slice$9.call(_), n = Math.min(domain.length, range.length - 1), scale) : domain.slice();
17895           };
17896
17897           scale.range = function(_) {
17898             return arguments.length ? (range = slice$9.call(_), n = Math.min(domain.length, range.length - 1), scale) : range.slice();
17899           };
17900
17901           scale.invertExtent = function(y) {
17902             var i = range.indexOf(y);
17903             return [domain[i - 1], domain[i]];
17904           };
17905
17906           scale.unknown = function(_) {
17907             return arguments.length ? (unknown = _, scale) : unknown;
17908           };
17909
17910           scale.copy = function() {
17911             return threshold$1()
17912                 .domain(domain)
17913                 .range(range)
17914                 .unknown(unknown);
17915           };
17916
17917           return initRange.apply(scale, arguments);
17918         }
17919
17920         var t0$1 = new Date,
17921             t1$1 = new Date;
17922
17923         function newInterval(floori, offseti, count, field) {
17924
17925           function interval(date) {
17926             return floori(date = new Date(+date)), date;
17927           }
17928
17929           interval.floor = interval;
17930
17931           interval.ceil = function(date) {
17932             return floori(date = new Date(date - 1)), offseti(date, 1), floori(date), date;
17933           };
17934
17935           interval.round = function(date) {
17936             var d0 = interval(date),
17937                 d1 = interval.ceil(date);
17938             return date - d0 < d1 - date ? d0 : d1;
17939           };
17940
17941           interval.offset = function(date, step) {
17942             return offseti(date = new Date(+date), step == null ? 1 : Math.floor(step)), date;
17943           };
17944
17945           interval.range = function(start, stop, step) {
17946             var range = [], previous;
17947             start = interval.ceil(start);
17948             step = step == null ? 1 : Math.floor(step);
17949             if (!(start < stop) || !(step > 0)) return range; // also handles Invalid Date
17950             do range.push(previous = new Date(+start)), offseti(start, step), floori(start);
17951             while (previous < start && start < stop);
17952             return range;
17953           };
17954
17955           interval.filter = function(test) {
17956             return newInterval(function(date) {
17957               if (date >= date) while (floori(date), !test(date)) date.setTime(date - 1);
17958             }, function(date, step) {
17959               if (date >= date) {
17960                 if (step < 0) while (++step <= 0) {
17961                   while (offseti(date, -1), !test(date)) {} // eslint-disable-line no-empty
17962                 } else while (--step >= 0) {
17963                   while (offseti(date, +1), !test(date)) {} // eslint-disable-line no-empty
17964                 }
17965               }
17966             });
17967           };
17968
17969           if (count) {
17970             interval.count = function(start, end) {
17971               t0$1.setTime(+start), t1$1.setTime(+end);
17972               floori(t0$1), floori(t1$1);
17973               return Math.floor(count(t0$1, t1$1));
17974             };
17975
17976             interval.every = function(step) {
17977               step = Math.floor(step);
17978               return !isFinite(step) || !(step > 0) ? null
17979                   : !(step > 1) ? interval
17980                   : interval.filter(field
17981                       ? function(d) { return field(d) % step === 0; }
17982                       : function(d) { return interval.count(0, d) % step === 0; });
17983             };
17984           }
17985
17986           return interval;
17987         }
17988
17989         var millisecond = newInterval(function() {
17990           // noop
17991         }, function(date, step) {
17992           date.setTime(+date + step);
17993         }, function(start, end) {
17994           return end - start;
17995         });
17996
17997         // An optimized implementation for this simple case.
17998         millisecond.every = function(k) {
17999           k = Math.floor(k);
18000           if (!isFinite(k) || !(k > 0)) return null;
18001           if (!(k > 1)) return millisecond;
18002           return newInterval(function(date) {
18003             date.setTime(Math.floor(date / k) * k);
18004           }, function(date, step) {
18005             date.setTime(+date + step * k);
18006           }, function(start, end) {
18007             return (end - start) / k;
18008           });
18009         };
18010         var milliseconds = millisecond.range;
18011
18012         var durationSecond = 1e3;
18013         var durationMinute = 6e4;
18014         var durationHour = 36e5;
18015         var durationDay = 864e5;
18016         var durationWeek = 6048e5;
18017
18018         var second = newInterval(function(date) {
18019           date.setTime(date - date.getMilliseconds());
18020         }, function(date, step) {
18021           date.setTime(+date + step * durationSecond);
18022         }, function(start, end) {
18023           return (end - start) / durationSecond;
18024         }, function(date) {
18025           return date.getUTCSeconds();
18026         });
18027         var seconds = second.range;
18028
18029         var minute = newInterval(function(date) {
18030           date.setTime(date - date.getMilliseconds() - date.getSeconds() * durationSecond);
18031         }, function(date, step) {
18032           date.setTime(+date + step * durationMinute);
18033         }, function(start, end) {
18034           return (end - start) / durationMinute;
18035         }, function(date) {
18036           return date.getMinutes();
18037         });
18038         var minutes = minute.range;
18039
18040         var hour = newInterval(function(date) {
18041           date.setTime(date - date.getMilliseconds() - date.getSeconds() * durationSecond - date.getMinutes() * durationMinute);
18042         }, function(date, step) {
18043           date.setTime(+date + step * durationHour);
18044         }, function(start, end) {
18045           return (end - start) / durationHour;
18046         }, function(date) {
18047           return date.getHours();
18048         });
18049         var hours = hour.range;
18050
18051         var day = newInterval(function(date) {
18052           date.setHours(0, 0, 0, 0);
18053         }, function(date, step) {
18054           date.setDate(date.getDate() + step);
18055         }, function(start, end) {
18056           return (end - start - (end.getTimezoneOffset() - start.getTimezoneOffset()) * durationMinute) / durationDay;
18057         }, function(date) {
18058           return date.getDate() - 1;
18059         });
18060         var days = day.range;
18061
18062         function weekday(i) {
18063           return newInterval(function(date) {
18064             date.setDate(date.getDate() - (date.getDay() + 7 - i) % 7);
18065             date.setHours(0, 0, 0, 0);
18066           }, function(date, step) {
18067             date.setDate(date.getDate() + step * 7);
18068           }, function(start, end) {
18069             return (end - start - (end.getTimezoneOffset() - start.getTimezoneOffset()) * durationMinute) / durationWeek;
18070           });
18071         }
18072
18073         var sunday = weekday(0);
18074         var monday = weekday(1);
18075         var tuesday = weekday(2);
18076         var wednesday = weekday(3);
18077         var thursday = weekday(4);
18078         var friday = weekday(5);
18079         var saturday = weekday(6);
18080
18081         var sundays = sunday.range;
18082         var mondays = monday.range;
18083         var tuesdays = tuesday.range;
18084         var wednesdays = wednesday.range;
18085         var thursdays = thursday.range;
18086         var fridays = friday.range;
18087         var saturdays = saturday.range;
18088
18089         var month = newInterval(function(date) {
18090           date.setDate(1);
18091           date.setHours(0, 0, 0, 0);
18092         }, function(date, step) {
18093           date.setMonth(date.getMonth() + step);
18094         }, function(start, end) {
18095           return end.getMonth() - start.getMonth() + (end.getFullYear() - start.getFullYear()) * 12;
18096         }, function(date) {
18097           return date.getMonth();
18098         });
18099         var months = month.range;
18100
18101         var year = newInterval(function(date) {
18102           date.setMonth(0, 1);
18103           date.setHours(0, 0, 0, 0);
18104         }, function(date, step) {
18105           date.setFullYear(date.getFullYear() + step);
18106         }, function(start, end) {
18107           return end.getFullYear() - start.getFullYear();
18108         }, function(date) {
18109           return date.getFullYear();
18110         });
18111
18112         // An optimized implementation for this simple case.
18113         year.every = function(k) {
18114           return !isFinite(k = Math.floor(k)) || !(k > 0) ? null : newInterval(function(date) {
18115             date.setFullYear(Math.floor(date.getFullYear() / k) * k);
18116             date.setMonth(0, 1);
18117             date.setHours(0, 0, 0, 0);
18118           }, function(date, step) {
18119             date.setFullYear(date.getFullYear() + step * k);
18120           });
18121         };
18122         var years = year.range;
18123
18124         var utcMinute = newInterval(function(date) {
18125           date.setUTCSeconds(0, 0);
18126         }, function(date, step) {
18127           date.setTime(+date + step * durationMinute);
18128         }, function(start, end) {
18129           return (end - start) / durationMinute;
18130         }, function(date) {
18131           return date.getUTCMinutes();
18132         });
18133         var utcMinutes = utcMinute.range;
18134
18135         var utcHour = newInterval(function(date) {
18136           date.setUTCMinutes(0, 0, 0);
18137         }, function(date, step) {
18138           date.setTime(+date + step * durationHour);
18139         }, function(start, end) {
18140           return (end - start) / durationHour;
18141         }, function(date) {
18142           return date.getUTCHours();
18143         });
18144         var utcHours = utcHour.range;
18145
18146         var utcDay = newInterval(function(date) {
18147           date.setUTCHours(0, 0, 0, 0);
18148         }, function(date, step) {
18149           date.setUTCDate(date.getUTCDate() + step);
18150         }, function(start, end) {
18151           return (end - start) / durationDay;
18152         }, function(date) {
18153           return date.getUTCDate() - 1;
18154         });
18155         var utcDays = utcDay.range;
18156
18157         function utcWeekday(i) {
18158           return newInterval(function(date) {
18159             date.setUTCDate(date.getUTCDate() - (date.getUTCDay() + 7 - i) % 7);
18160             date.setUTCHours(0, 0, 0, 0);
18161           }, function(date, step) {
18162             date.setUTCDate(date.getUTCDate() + step * 7);
18163           }, function(start, end) {
18164             return (end - start) / durationWeek;
18165           });
18166         }
18167
18168         var utcSunday = utcWeekday(0);
18169         var utcMonday = utcWeekday(1);
18170         var utcTuesday = utcWeekday(2);
18171         var utcWednesday = utcWeekday(3);
18172         var utcThursday = utcWeekday(4);
18173         var utcFriday = utcWeekday(5);
18174         var utcSaturday = utcWeekday(6);
18175
18176         var utcSundays = utcSunday.range;
18177         var utcMondays = utcMonday.range;
18178         var utcTuesdays = utcTuesday.range;
18179         var utcWednesdays = utcWednesday.range;
18180         var utcThursdays = utcThursday.range;
18181         var utcFridays = utcFriday.range;
18182         var utcSaturdays = utcSaturday.range;
18183
18184         var utcMonth = newInterval(function(date) {
18185           date.setUTCDate(1);
18186           date.setUTCHours(0, 0, 0, 0);
18187         }, function(date, step) {
18188           date.setUTCMonth(date.getUTCMonth() + step);
18189         }, function(start, end) {
18190           return end.getUTCMonth() - start.getUTCMonth() + (end.getUTCFullYear() - start.getUTCFullYear()) * 12;
18191         }, function(date) {
18192           return date.getUTCMonth();
18193         });
18194         var utcMonths = utcMonth.range;
18195
18196         var utcYear = newInterval(function(date) {
18197           date.setUTCMonth(0, 1);
18198           date.setUTCHours(0, 0, 0, 0);
18199         }, function(date, step) {
18200           date.setUTCFullYear(date.getUTCFullYear() + step);
18201         }, function(start, end) {
18202           return end.getUTCFullYear() - start.getUTCFullYear();
18203         }, function(date) {
18204           return date.getUTCFullYear();
18205         });
18206
18207         // An optimized implementation for this simple case.
18208         utcYear.every = function(k) {
18209           return !isFinite(k = Math.floor(k)) || !(k > 0) ? null : newInterval(function(date) {
18210             date.setUTCFullYear(Math.floor(date.getUTCFullYear() / k) * k);
18211             date.setUTCMonth(0, 1);
18212             date.setUTCHours(0, 0, 0, 0);
18213           }, function(date, step) {
18214             date.setUTCFullYear(date.getUTCFullYear() + step * k);
18215           });
18216         };
18217         var utcYears = utcYear.range;
18218
18219         function localDate(d) {
18220           if (0 <= d.y && d.y < 100) {
18221             var date = new Date(-1, d.m, d.d, d.H, d.M, d.S, d.L);
18222             date.setFullYear(d.y);
18223             return date;
18224           }
18225           return new Date(d.y, d.m, d.d, d.H, d.M, d.S, d.L);
18226         }
18227
18228         function utcDate(d) {
18229           if (0 <= d.y && d.y < 100) {
18230             var date = new Date(Date.UTC(-1, d.m, d.d, d.H, d.M, d.S, d.L));
18231             date.setUTCFullYear(d.y);
18232             return date;
18233           }
18234           return new Date(Date.UTC(d.y, d.m, d.d, d.H, d.M, d.S, d.L));
18235         }
18236
18237         function newYear(y) {
18238           return {y: y, m: 0, d: 1, H: 0, M: 0, S: 0, L: 0};
18239         }
18240
18241         function formatLocale$1(locale) {
18242           var locale_dateTime = locale.dateTime,
18243               locale_date = locale.date,
18244               locale_time = locale.time,
18245               locale_periods = locale.periods,
18246               locale_weekdays = locale.days,
18247               locale_shortWeekdays = locale.shortDays,
18248               locale_months = locale.months,
18249               locale_shortMonths = locale.shortMonths;
18250
18251           var periodRe = formatRe(locale_periods),
18252               periodLookup = formatLookup(locale_periods),
18253               weekdayRe = formatRe(locale_weekdays),
18254               weekdayLookup = formatLookup(locale_weekdays),
18255               shortWeekdayRe = formatRe(locale_shortWeekdays),
18256               shortWeekdayLookup = formatLookup(locale_shortWeekdays),
18257               monthRe = formatRe(locale_months),
18258               monthLookup = formatLookup(locale_months),
18259               shortMonthRe = formatRe(locale_shortMonths),
18260               shortMonthLookup = formatLookup(locale_shortMonths);
18261
18262           var formats = {
18263             "a": formatShortWeekday,
18264             "A": formatWeekday,
18265             "b": formatShortMonth,
18266             "B": formatMonth,
18267             "c": null,
18268             "d": formatDayOfMonth,
18269             "e": formatDayOfMonth,
18270             "f": formatMicroseconds,
18271             "H": formatHour24,
18272             "I": formatHour12,
18273             "j": formatDayOfYear,
18274             "L": formatMilliseconds,
18275             "m": formatMonthNumber,
18276             "M": formatMinutes,
18277             "p": formatPeriod,
18278             "Q": formatUnixTimestamp,
18279             "s": formatUnixTimestampSeconds,
18280             "S": formatSeconds,
18281             "u": formatWeekdayNumberMonday,
18282             "U": formatWeekNumberSunday,
18283             "V": formatWeekNumberISO,
18284             "w": formatWeekdayNumberSunday,
18285             "W": formatWeekNumberMonday,
18286             "x": null,
18287             "X": null,
18288             "y": formatYear$1,
18289             "Y": formatFullYear,
18290             "Z": formatZone,
18291             "%": formatLiteralPercent
18292           };
18293
18294           var utcFormats = {
18295             "a": formatUTCShortWeekday,
18296             "A": formatUTCWeekday,
18297             "b": formatUTCShortMonth,
18298             "B": formatUTCMonth,
18299             "c": null,
18300             "d": formatUTCDayOfMonth,
18301             "e": formatUTCDayOfMonth,
18302             "f": formatUTCMicroseconds,
18303             "H": formatUTCHour24,
18304             "I": formatUTCHour12,
18305             "j": formatUTCDayOfYear,
18306             "L": formatUTCMilliseconds,
18307             "m": formatUTCMonthNumber,
18308             "M": formatUTCMinutes,
18309             "p": formatUTCPeriod,
18310             "Q": formatUnixTimestamp,
18311             "s": formatUnixTimestampSeconds,
18312             "S": formatUTCSeconds,
18313             "u": formatUTCWeekdayNumberMonday,
18314             "U": formatUTCWeekNumberSunday,
18315             "V": formatUTCWeekNumberISO,
18316             "w": formatUTCWeekdayNumberSunday,
18317             "W": formatUTCWeekNumberMonday,
18318             "x": null,
18319             "X": null,
18320             "y": formatUTCYear,
18321             "Y": formatUTCFullYear,
18322             "Z": formatUTCZone,
18323             "%": formatLiteralPercent
18324           };
18325
18326           var parses = {
18327             "a": parseShortWeekday,
18328             "A": parseWeekday,
18329             "b": parseShortMonth,
18330             "B": parseMonth,
18331             "c": parseLocaleDateTime,
18332             "d": parseDayOfMonth,
18333             "e": parseDayOfMonth,
18334             "f": parseMicroseconds,
18335             "H": parseHour24,
18336             "I": parseHour24,
18337             "j": parseDayOfYear,
18338             "L": parseMilliseconds,
18339             "m": parseMonthNumber,
18340             "M": parseMinutes,
18341             "p": parsePeriod,
18342             "Q": parseUnixTimestamp,
18343             "s": parseUnixTimestampSeconds,
18344             "S": parseSeconds,
18345             "u": parseWeekdayNumberMonday,
18346             "U": parseWeekNumberSunday,
18347             "V": parseWeekNumberISO,
18348             "w": parseWeekdayNumberSunday,
18349             "W": parseWeekNumberMonday,
18350             "x": parseLocaleDate,
18351             "X": parseLocaleTime,
18352             "y": parseYear,
18353             "Y": parseFullYear,
18354             "Z": parseZone,
18355             "%": parseLiteralPercent
18356           };
18357
18358           // These recursive directive definitions must be deferred.
18359           formats.x = newFormat(locale_date, formats);
18360           formats.X = newFormat(locale_time, formats);
18361           formats.c = newFormat(locale_dateTime, formats);
18362           utcFormats.x = newFormat(locale_date, utcFormats);
18363           utcFormats.X = newFormat(locale_time, utcFormats);
18364           utcFormats.c = newFormat(locale_dateTime, utcFormats);
18365
18366           function newFormat(specifier, formats) {
18367             return function(date) {
18368               var string = [],
18369                   i = -1,
18370                   j = 0,
18371                   n = specifier.length,
18372                   c,
18373                   pad,
18374                   format;
18375
18376               if (!(date instanceof Date)) date = new Date(+date);
18377
18378               while (++i < n) {
18379                 if (specifier.charCodeAt(i) === 37) {
18380                   string.push(specifier.slice(j, i));
18381                   if ((pad = pads[c = specifier.charAt(++i)]) != null) c = specifier.charAt(++i);
18382                   else pad = c === "e" ? " " : "0";
18383                   if (format = formats[c]) c = format(date, pad);
18384                   string.push(c);
18385                   j = i + 1;
18386                 }
18387               }
18388
18389               string.push(specifier.slice(j, i));
18390               return string.join("");
18391             };
18392           }
18393
18394           function newParse(specifier, newDate) {
18395             return function(string) {
18396               var d = newYear(1900),
18397                   i = parseSpecifier(d, specifier, string += "", 0),
18398                   week, day$1;
18399               if (i != string.length) return null;
18400
18401               // If a UNIX timestamp is specified, return it.
18402               if ("Q" in d) return new Date(d.Q);
18403
18404               // The am-pm flag is 0 for AM, and 1 for PM.
18405               if ("p" in d) d.H = d.H % 12 + d.p * 12;
18406
18407               // Convert day-of-week and week-of-year to day-of-year.
18408               if ("V" in d) {
18409                 if (d.V < 1 || d.V > 53) return null;
18410                 if (!("w" in d)) d.w = 1;
18411                 if ("Z" in d) {
18412                   week = utcDate(newYear(d.y)), day$1 = week.getUTCDay();
18413                   week = day$1 > 4 || day$1 === 0 ? utcMonday.ceil(week) : utcMonday(week);
18414                   week = utcDay.offset(week, (d.V - 1) * 7);
18415                   d.y = week.getUTCFullYear();
18416                   d.m = week.getUTCMonth();
18417                   d.d = week.getUTCDate() + (d.w + 6) % 7;
18418                 } else {
18419                   week = newDate(newYear(d.y)), day$1 = week.getDay();
18420                   week = day$1 > 4 || day$1 === 0 ? monday.ceil(week) : monday(week);
18421                   week = day.offset(week, (d.V - 1) * 7);
18422                   d.y = week.getFullYear();
18423                   d.m = week.getMonth();
18424                   d.d = week.getDate() + (d.w + 6) % 7;
18425                 }
18426               } else if ("W" in d || "U" in d) {
18427                 if (!("w" in d)) d.w = "u" in d ? d.u % 7 : "W" in d ? 1 : 0;
18428                 day$1 = "Z" in d ? utcDate(newYear(d.y)).getUTCDay() : newDate(newYear(d.y)).getDay();
18429                 d.m = 0;
18430                 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;
18431               }
18432
18433               // If a time zone is specified, all fields are interpreted as UTC and then
18434               // offset according to the specified time zone.
18435               if ("Z" in d) {
18436                 d.H += d.Z / 100 | 0;
18437                 d.M += d.Z % 100;
18438                 return utcDate(d);
18439               }
18440
18441               // Otherwise, all fields are in local time.
18442               return newDate(d);
18443             };
18444           }
18445
18446           function parseSpecifier(d, specifier, string, j) {
18447             var i = 0,
18448                 n = specifier.length,
18449                 m = string.length,
18450                 c,
18451                 parse;
18452
18453             while (i < n) {
18454               if (j >= m) return -1;
18455               c = specifier.charCodeAt(i++);
18456               if (c === 37) {
18457                 c = specifier.charAt(i++);
18458                 parse = parses[c in pads ? specifier.charAt(i++) : c];
18459                 if (!parse || ((j = parse(d, string, j)) < 0)) return -1;
18460               } else if (c != string.charCodeAt(j++)) {
18461                 return -1;
18462               }
18463             }
18464
18465             return j;
18466           }
18467
18468           function parsePeriod(d, string, i) {
18469             var n = periodRe.exec(string.slice(i));
18470             return n ? (d.p = periodLookup[n[0].toLowerCase()], i + n[0].length) : -1;
18471           }
18472
18473           function parseShortWeekday(d, string, i) {
18474             var n = shortWeekdayRe.exec(string.slice(i));
18475             return n ? (d.w = shortWeekdayLookup[n[0].toLowerCase()], i + n[0].length) : -1;
18476           }
18477
18478           function parseWeekday(d, string, i) {
18479             var n = weekdayRe.exec(string.slice(i));
18480             return n ? (d.w = weekdayLookup[n[0].toLowerCase()], i + n[0].length) : -1;
18481           }
18482
18483           function parseShortMonth(d, string, i) {
18484             var n = shortMonthRe.exec(string.slice(i));
18485             return n ? (d.m = shortMonthLookup[n[0].toLowerCase()], i + n[0].length) : -1;
18486           }
18487
18488           function parseMonth(d, string, i) {
18489             var n = monthRe.exec(string.slice(i));
18490             return n ? (d.m = monthLookup[n[0].toLowerCase()], i + n[0].length) : -1;
18491           }
18492
18493           function parseLocaleDateTime(d, string, i) {
18494             return parseSpecifier(d, locale_dateTime, string, i);
18495           }
18496
18497           function parseLocaleDate(d, string, i) {
18498             return parseSpecifier(d, locale_date, string, i);
18499           }
18500
18501           function parseLocaleTime(d, string, i) {
18502             return parseSpecifier(d, locale_time, string, i);
18503           }
18504
18505           function formatShortWeekday(d) {
18506             return locale_shortWeekdays[d.getDay()];
18507           }
18508
18509           function formatWeekday(d) {
18510             return locale_weekdays[d.getDay()];
18511           }
18512
18513           function formatShortMonth(d) {
18514             return locale_shortMonths[d.getMonth()];
18515           }
18516
18517           function formatMonth(d) {
18518             return locale_months[d.getMonth()];
18519           }
18520
18521           function formatPeriod(d) {
18522             return locale_periods[+(d.getHours() >= 12)];
18523           }
18524
18525           function formatUTCShortWeekday(d) {
18526             return locale_shortWeekdays[d.getUTCDay()];
18527           }
18528
18529           function formatUTCWeekday(d) {
18530             return locale_weekdays[d.getUTCDay()];
18531           }
18532
18533           function formatUTCShortMonth(d) {
18534             return locale_shortMonths[d.getUTCMonth()];
18535           }
18536
18537           function formatUTCMonth(d) {
18538             return locale_months[d.getUTCMonth()];
18539           }
18540
18541           function formatUTCPeriod(d) {
18542             return locale_periods[+(d.getUTCHours() >= 12)];
18543           }
18544
18545           return {
18546             format: function(specifier) {
18547               var f = newFormat(specifier += "", formats);
18548               f.toString = function() { return specifier; };
18549               return f;
18550             },
18551             parse: function(specifier) {
18552               var p = newParse(specifier += "", localDate);
18553               p.toString = function() { return specifier; };
18554               return p;
18555             },
18556             utcFormat: function(specifier) {
18557               var f = newFormat(specifier += "", utcFormats);
18558               f.toString = function() { return specifier; };
18559               return f;
18560             },
18561             utcParse: function(specifier) {
18562               var p = newParse(specifier, utcDate);
18563               p.toString = function() { return specifier; };
18564               return p;
18565             }
18566           };
18567         }
18568
18569         var pads = {"-": "", "_": " ", "0": "0"},
18570             numberRe = /^\s*\d+/, // note: ignores next directive
18571             percentRe = /^%/,
18572             requoteRe = /[\\^$*+?|[\]().{}]/g;
18573
18574         function pad$1(value, fill, width) {
18575           var sign = value < 0 ? "-" : "",
18576               string = (sign ? -value : value) + "",
18577               length = string.length;
18578           return sign + (length < width ? new Array(width - length + 1).join(fill) + string : string);
18579         }
18580
18581         function requote(s) {
18582           return s.replace(requoteRe, "\\$&");
18583         }
18584
18585         function formatRe(names) {
18586           return new RegExp("^(?:" + names.map(requote).join("|") + ")", "i");
18587         }
18588
18589         function formatLookup(names) {
18590           var map = {}, i = -1, n = names.length;
18591           while (++i < n) map[names[i].toLowerCase()] = i;
18592           return map;
18593         }
18594
18595         function parseWeekdayNumberSunday(d, string, i) {
18596           var n = numberRe.exec(string.slice(i, i + 1));
18597           return n ? (d.w = +n[0], i + n[0].length) : -1;
18598         }
18599
18600         function parseWeekdayNumberMonday(d, string, i) {
18601           var n = numberRe.exec(string.slice(i, i + 1));
18602           return n ? (d.u = +n[0], i + n[0].length) : -1;
18603         }
18604
18605         function parseWeekNumberSunday(d, string, i) {
18606           var n = numberRe.exec(string.slice(i, i + 2));
18607           return n ? (d.U = +n[0], i + n[0].length) : -1;
18608         }
18609
18610         function parseWeekNumberISO(d, string, i) {
18611           var n = numberRe.exec(string.slice(i, i + 2));
18612           return n ? (d.V = +n[0], i + n[0].length) : -1;
18613         }
18614
18615         function parseWeekNumberMonday(d, string, i) {
18616           var n = numberRe.exec(string.slice(i, i + 2));
18617           return n ? (d.W = +n[0], i + n[0].length) : -1;
18618         }
18619
18620         function parseFullYear(d, string, i) {
18621           var n = numberRe.exec(string.slice(i, i + 4));
18622           return n ? (d.y = +n[0], i + n[0].length) : -1;
18623         }
18624
18625         function parseYear(d, string, i) {
18626           var n = numberRe.exec(string.slice(i, i + 2));
18627           return n ? (d.y = +n[0] + (+n[0] > 68 ? 1900 : 2000), i + n[0].length) : -1;
18628         }
18629
18630         function parseZone(d, string, i) {
18631           var n = /^(Z)|([+-]\d\d)(?::?(\d\d))?/.exec(string.slice(i, i + 6));
18632           return n ? (d.Z = n[1] ? 0 : -(n[2] + (n[3] || "00")), i + n[0].length) : -1;
18633         }
18634
18635         function parseMonthNumber(d, string, i) {
18636           var n = numberRe.exec(string.slice(i, i + 2));
18637           return n ? (d.m = n[0] - 1, i + n[0].length) : -1;
18638         }
18639
18640         function parseDayOfMonth(d, string, i) {
18641           var n = numberRe.exec(string.slice(i, i + 2));
18642           return n ? (d.d = +n[0], i + n[0].length) : -1;
18643         }
18644
18645         function parseDayOfYear(d, string, i) {
18646           var n = numberRe.exec(string.slice(i, i + 3));
18647           return n ? (d.m = 0, d.d = +n[0], i + n[0].length) : -1;
18648         }
18649
18650         function parseHour24(d, string, i) {
18651           var n = numberRe.exec(string.slice(i, i + 2));
18652           return n ? (d.H = +n[0], i + n[0].length) : -1;
18653         }
18654
18655         function parseMinutes(d, string, i) {
18656           var n = numberRe.exec(string.slice(i, i + 2));
18657           return n ? (d.M = +n[0], i + n[0].length) : -1;
18658         }
18659
18660         function parseSeconds(d, string, i) {
18661           var n = numberRe.exec(string.slice(i, i + 2));
18662           return n ? (d.S = +n[0], i + n[0].length) : -1;
18663         }
18664
18665         function parseMilliseconds(d, string, i) {
18666           var n = numberRe.exec(string.slice(i, i + 3));
18667           return n ? (d.L = +n[0], i + n[0].length) : -1;
18668         }
18669
18670         function parseMicroseconds(d, string, i) {
18671           var n = numberRe.exec(string.slice(i, i + 6));
18672           return n ? (d.L = Math.floor(n[0] / 1000), i + n[0].length) : -1;
18673         }
18674
18675         function parseLiteralPercent(d, string, i) {
18676           var n = percentRe.exec(string.slice(i, i + 1));
18677           return n ? i + n[0].length : -1;
18678         }
18679
18680         function parseUnixTimestamp(d, string, i) {
18681           var n = numberRe.exec(string.slice(i));
18682           return n ? (d.Q = +n[0], i + n[0].length) : -1;
18683         }
18684
18685         function parseUnixTimestampSeconds(d, string, i) {
18686           var n = numberRe.exec(string.slice(i));
18687           return n ? (d.Q = (+n[0]) * 1000, i + n[0].length) : -1;
18688         }
18689
18690         function formatDayOfMonth(d, p) {
18691           return pad$1(d.getDate(), p, 2);
18692         }
18693
18694         function formatHour24(d, p) {
18695           return pad$1(d.getHours(), p, 2);
18696         }
18697
18698         function formatHour12(d, p) {
18699           return pad$1(d.getHours() % 12 || 12, p, 2);
18700         }
18701
18702         function formatDayOfYear(d, p) {
18703           return pad$1(1 + day.count(year(d), d), p, 3);
18704         }
18705
18706         function formatMilliseconds(d, p) {
18707           return pad$1(d.getMilliseconds(), p, 3);
18708         }
18709
18710         function formatMicroseconds(d, p) {
18711           return formatMilliseconds(d, p) + "000";
18712         }
18713
18714         function formatMonthNumber(d, p) {
18715           return pad$1(d.getMonth() + 1, p, 2);
18716         }
18717
18718         function formatMinutes(d, p) {
18719           return pad$1(d.getMinutes(), p, 2);
18720         }
18721
18722         function formatSeconds(d, p) {
18723           return pad$1(d.getSeconds(), p, 2);
18724         }
18725
18726         function formatWeekdayNumberMonday(d) {
18727           var day = d.getDay();
18728           return day === 0 ? 7 : day;
18729         }
18730
18731         function formatWeekNumberSunday(d, p) {
18732           return pad$1(sunday.count(year(d), d), p, 2);
18733         }
18734
18735         function formatWeekNumberISO(d, p) {
18736           var day = d.getDay();
18737           d = (day >= 4 || day === 0) ? thursday(d) : thursday.ceil(d);
18738           return pad$1(thursday.count(year(d), d) + (year(d).getDay() === 4), p, 2);
18739         }
18740
18741         function formatWeekdayNumberSunday(d) {
18742           return d.getDay();
18743         }
18744
18745         function formatWeekNumberMonday(d, p) {
18746           return pad$1(monday.count(year(d), d), p, 2);
18747         }
18748
18749         function formatYear$1(d, p) {
18750           return pad$1(d.getFullYear() % 100, p, 2);
18751         }
18752
18753         function formatFullYear(d, p) {
18754           return pad$1(d.getFullYear() % 10000, p, 4);
18755         }
18756
18757         function formatZone(d) {
18758           var z = d.getTimezoneOffset();
18759           return (z > 0 ? "-" : (z *= -1, "+"))
18760               + pad$1(z / 60 | 0, "0", 2)
18761               + pad$1(z % 60, "0", 2);
18762         }
18763
18764         function formatUTCDayOfMonth(d, p) {
18765           return pad$1(d.getUTCDate(), p, 2);
18766         }
18767
18768         function formatUTCHour24(d, p) {
18769           return pad$1(d.getUTCHours(), p, 2);
18770         }
18771
18772         function formatUTCHour12(d, p) {
18773           return pad$1(d.getUTCHours() % 12 || 12, p, 2);
18774         }
18775
18776         function formatUTCDayOfYear(d, p) {
18777           return pad$1(1 + utcDay.count(utcYear(d), d), p, 3);
18778         }
18779
18780         function formatUTCMilliseconds(d, p) {
18781           return pad$1(d.getUTCMilliseconds(), p, 3);
18782         }
18783
18784         function formatUTCMicroseconds(d, p) {
18785           return formatUTCMilliseconds(d, p) + "000";
18786         }
18787
18788         function formatUTCMonthNumber(d, p) {
18789           return pad$1(d.getUTCMonth() + 1, p, 2);
18790         }
18791
18792         function formatUTCMinutes(d, p) {
18793           return pad$1(d.getUTCMinutes(), p, 2);
18794         }
18795
18796         function formatUTCSeconds(d, p) {
18797           return pad$1(d.getUTCSeconds(), p, 2);
18798         }
18799
18800         function formatUTCWeekdayNumberMonday(d) {
18801           var dow = d.getUTCDay();
18802           return dow === 0 ? 7 : dow;
18803         }
18804
18805         function formatUTCWeekNumberSunday(d, p) {
18806           return pad$1(utcSunday.count(utcYear(d), d), p, 2);
18807         }
18808
18809         function formatUTCWeekNumberISO(d, p) {
18810           var day = d.getUTCDay();
18811           d = (day >= 4 || day === 0) ? utcThursday(d) : utcThursday.ceil(d);
18812           return pad$1(utcThursday.count(utcYear(d), d) + (utcYear(d).getUTCDay() === 4), p, 2);
18813         }
18814
18815         function formatUTCWeekdayNumberSunday(d) {
18816           return d.getUTCDay();
18817         }
18818
18819         function formatUTCWeekNumberMonday(d, p) {
18820           return pad$1(utcMonday.count(utcYear(d), d), p, 2);
18821         }
18822
18823         function formatUTCYear(d, p) {
18824           return pad$1(d.getUTCFullYear() % 100, p, 2);
18825         }
18826
18827         function formatUTCFullYear(d, p) {
18828           return pad$1(d.getUTCFullYear() % 10000, p, 4);
18829         }
18830
18831         function formatUTCZone() {
18832           return "+0000";
18833         }
18834
18835         function formatLiteralPercent() {
18836           return "%";
18837         }
18838
18839         function formatUnixTimestamp(d) {
18840           return +d;
18841         }
18842
18843         function formatUnixTimestampSeconds(d) {
18844           return Math.floor(+d / 1000);
18845         }
18846
18847         var locale$1;
18848         var timeFormat;
18849         var timeParse;
18850         var utcFormat;
18851         var utcParse;
18852
18853         defaultLocale$1({
18854           dateTime: "%x, %X",
18855           date: "%-m/%-d/%Y",
18856           time: "%-I:%M:%S %p",
18857           periods: ["AM", "PM"],
18858           days: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"],
18859           shortDays: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"],
18860           months: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"],
18861           shortMonths: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]
18862         });
18863
18864         function defaultLocale$1(definition) {
18865           locale$1 = formatLocale$1(definition);
18866           timeFormat = locale$1.format;
18867           timeParse = locale$1.parse;
18868           utcFormat = locale$1.utcFormat;
18869           utcParse = locale$1.utcParse;
18870           return locale$1;
18871         }
18872
18873         var isoSpecifier = "%Y-%m-%dT%H:%M:%S.%LZ";
18874
18875         function formatIsoNative(date) {
18876           return date.toISOString();
18877         }
18878
18879         var formatIso = Date.prototype.toISOString
18880             ? formatIsoNative
18881             : utcFormat(isoSpecifier);
18882
18883         function parseIsoNative(string) {
18884           var date = new Date(string);
18885           return isNaN(date) ? null : date;
18886         }
18887
18888         var parseIso = +new Date("2000-01-01T00:00:00.000Z")
18889             ? parseIsoNative
18890             : utcParse(isoSpecifier);
18891
18892         var durationSecond$1 = 1000,
18893             durationMinute$1 = durationSecond$1 * 60,
18894             durationHour$1 = durationMinute$1 * 60,
18895             durationDay$1 = durationHour$1 * 24,
18896             durationWeek$1 = durationDay$1 * 7,
18897             durationMonth = durationDay$1 * 30,
18898             durationYear = durationDay$1 * 365;
18899
18900         function date$1(t) {
18901           return new Date(t);
18902         }
18903
18904         function number$3(t) {
18905           return t instanceof Date ? +t : +new Date(+t);
18906         }
18907
18908         function calendar(year, month, week, day, hour, minute, second, millisecond, format) {
18909           var scale = continuous(identity$5, identity$5),
18910               invert = scale.invert,
18911               domain = scale.domain;
18912
18913           var formatMillisecond = format(".%L"),
18914               formatSecond = format(":%S"),
18915               formatMinute = format("%I:%M"),
18916               formatHour = format("%I %p"),
18917               formatDay = format("%a %d"),
18918               formatWeek = format("%b %d"),
18919               formatMonth = format("%B"),
18920               formatYear = format("%Y");
18921
18922           var tickIntervals = [
18923             [second,  1,      durationSecond$1],
18924             [second,  5,  5 * durationSecond$1],
18925             [second, 15, 15 * durationSecond$1],
18926             [second, 30, 30 * durationSecond$1],
18927             [minute,  1,      durationMinute$1],
18928             [minute,  5,  5 * durationMinute$1],
18929             [minute, 15, 15 * durationMinute$1],
18930             [minute, 30, 30 * durationMinute$1],
18931             [  hour,  1,      durationHour$1  ],
18932             [  hour,  3,  3 * durationHour$1  ],
18933             [  hour,  6,  6 * durationHour$1  ],
18934             [  hour, 12, 12 * durationHour$1  ],
18935             [   day,  1,      durationDay$1   ],
18936             [   day,  2,  2 * durationDay$1   ],
18937             [  week,  1,      durationWeek$1  ],
18938             [ month,  1,      durationMonth ],
18939             [ month,  3,  3 * durationMonth ],
18940             [  year,  1,      durationYear  ]
18941           ];
18942
18943           function tickFormat(date) {
18944             return (second(date) < date ? formatMillisecond
18945                 : minute(date) < date ? formatSecond
18946                 : hour(date) < date ? formatMinute
18947                 : day(date) < date ? formatHour
18948                 : month(date) < date ? (week(date) < date ? formatDay : formatWeek)
18949                 : year(date) < date ? formatMonth
18950                 : formatYear)(date);
18951           }
18952
18953           function tickInterval(interval, start, stop, step) {
18954             if (interval == null) interval = 10;
18955
18956             // If a desired tick count is specified, pick a reasonable tick interval
18957             // based on the extent of the domain and a rough estimate of tick size.
18958             // Otherwise, assume interval is already a time interval and use it.
18959             if (typeof interval === "number") {
18960               var target = Math.abs(stop - start) / interval,
18961                   i = d3_bisector(function(i) { return i[2]; }).right(tickIntervals, target);
18962               if (i === tickIntervals.length) {
18963                 step = tickStep(start / durationYear, stop / durationYear, interval);
18964                 interval = year;
18965               } else if (i) {
18966                 i = tickIntervals[target / tickIntervals[i - 1][2] < tickIntervals[i][2] / target ? i - 1 : i];
18967                 step = i[1];
18968                 interval = i[0];
18969               } else {
18970                 step = Math.max(tickStep(start, stop, interval), 1);
18971                 interval = millisecond;
18972               }
18973             }
18974
18975             return step == null ? interval : interval.every(step);
18976           }
18977
18978           scale.invert = function(y) {
18979             return new Date(invert(y));
18980           };
18981
18982           scale.domain = function(_) {
18983             return arguments.length ? domain(map$4.call(_, number$3)) : domain().map(date$1);
18984           };
18985
18986           scale.ticks = function(interval, step) {
18987             var d = domain(),
18988                 t0 = d[0],
18989                 t1 = d[d.length - 1],
18990                 r = t1 < t0,
18991                 t;
18992             if (r) t = t0, t0 = t1, t1 = t;
18993             t = tickInterval(interval, t0, t1, step);
18994             t = t ? t.range(t0, t1 + 1) : []; // inclusive stop
18995             return r ? t.reverse() : t;
18996           };
18997
18998           scale.tickFormat = function(count, specifier) {
18999             return specifier == null ? tickFormat : format(specifier);
19000           };
19001
19002           scale.nice = function(interval, step) {
19003             var d = domain();
19004             return (interval = tickInterval(interval, d[0], d[d.length - 1], step))
19005                 ? domain(nice(d, interval))
19006                 : scale;
19007           };
19008
19009           scale.copy = function() {
19010             return copy$1(scale, calendar(year, month, week, day, hour, minute, second, millisecond, format));
19011           };
19012
19013           return scale;
19014         }
19015
19016         function time() {
19017           return initRange.apply(calendar(year, month, sunday, day, hour, minute, second, millisecond, timeFormat).domain([new Date(2000, 0, 1), new Date(2000, 0, 2)]), arguments);
19018         }
19019
19020         function utcTime() {
19021           return initRange.apply(calendar(utcYear, utcMonth, utcSunday, utcDay, utcHour, utcMinute, second, millisecond, utcFormat).domain([Date.UTC(2000, 0, 1), Date.UTC(2000, 0, 2)]), arguments);
19022         }
19023
19024         function transformer$2() {
19025           var x0 = 0,
19026               x1 = 1,
19027               t0,
19028               t1,
19029               k10,
19030               transform,
19031               interpolator = identity$5,
19032               clamp = false,
19033               unknown;
19034
19035           function scale(x) {
19036             return isNaN(x = +x) ? unknown : interpolator(k10 === 0 ? 0.5 : (x = (transform(x) - t0) * k10, clamp ? Math.max(0, Math.min(1, x)) : x));
19037           }
19038
19039           scale.domain = function(_) {
19040             return arguments.length ? (t0 = transform(x0 = +_[0]), t1 = transform(x1 = +_[1]), k10 = t0 === t1 ? 0 : 1 / (t1 - t0), scale) : [x0, x1];
19041           };
19042
19043           scale.clamp = function(_) {
19044             return arguments.length ? (clamp = !!_, scale) : clamp;
19045           };
19046
19047           scale.interpolator = function(_) {
19048             return arguments.length ? (interpolator = _, scale) : interpolator;
19049           };
19050
19051           scale.unknown = function(_) {
19052             return arguments.length ? (unknown = _, scale) : unknown;
19053           };
19054
19055           return function(t) {
19056             transform = t, t0 = t(x0), t1 = t(x1), k10 = t0 === t1 ? 0 : 1 / (t1 - t0);
19057             return scale;
19058           };
19059         }
19060
19061         function copy$2(source, target) {
19062           return target
19063               .domain(source.domain())
19064               .interpolator(source.interpolator())
19065               .clamp(source.clamp())
19066               .unknown(source.unknown());
19067         }
19068
19069         function sequential() {
19070           var scale = linearish(transformer$2()(identity$5));
19071
19072           scale.copy = function() {
19073             return copy$2(scale, sequential());
19074           };
19075
19076           return initInterpolator.apply(scale, arguments);
19077         }
19078
19079         function sequentialLog() {
19080           var scale = loggish(transformer$2()).domain([1, 10]);
19081
19082           scale.copy = function() {
19083             return copy$2(scale, sequentialLog()).base(scale.base());
19084           };
19085
19086           return initInterpolator.apply(scale, arguments);
19087         }
19088
19089         function sequentialSymlog() {
19090           var scale = symlogish(transformer$2());
19091
19092           scale.copy = function() {
19093             return copy$2(scale, sequentialSymlog()).constant(scale.constant());
19094           };
19095
19096           return initInterpolator.apply(scale, arguments);
19097         }
19098
19099         function sequentialPow() {
19100           var scale = powish(transformer$2());
19101
19102           scale.copy = function() {
19103             return copy$2(scale, sequentialPow()).exponent(scale.exponent());
19104           };
19105
19106           return initInterpolator.apply(scale, arguments);
19107         }
19108
19109         function sequentialSqrt() {
19110           return sequentialPow.apply(null, arguments).exponent(0.5);
19111         }
19112
19113         function sequentialQuantile() {
19114           var domain = [],
19115               interpolator = identity$5;
19116
19117           function scale(x) {
19118             if (!isNaN(x = +x)) return interpolator((bisectRight(domain, x) - 1) / (domain.length - 1));
19119           }
19120
19121           scale.domain = function(_) {
19122             if (!arguments.length) return domain.slice();
19123             domain = [];
19124             for (var i = 0, n = _.length, d; i < n; ++i) if (d = _[i], d != null && !isNaN(d = +d)) domain.push(d);
19125             domain.sort(d3_ascending);
19126             return scale;
19127           };
19128
19129           scale.interpolator = function(_) {
19130             return arguments.length ? (interpolator = _, scale) : interpolator;
19131           };
19132
19133           scale.copy = function() {
19134             return sequentialQuantile(interpolator).domain(domain);
19135           };
19136
19137           return initInterpolator.apply(scale, arguments);
19138         }
19139
19140         function transformer$3() {
19141           var x0 = 0,
19142               x1 = 0.5,
19143               x2 = 1,
19144               t0,
19145               t1,
19146               t2,
19147               k10,
19148               k21,
19149               interpolator = identity$5,
19150               transform,
19151               clamp = false,
19152               unknown;
19153
19154           function scale(x) {
19155             return isNaN(x = +x) ? unknown : (x = 0.5 + ((x = +transform(x)) - t1) * (x < t1 ? k10 : k21), interpolator(clamp ? Math.max(0, Math.min(1, x)) : x));
19156           }
19157
19158           scale.domain = function(_) {
19159             return arguments.length ? (t0 = transform(x0 = +_[0]), t1 = transform(x1 = +_[1]), t2 = transform(x2 = +_[2]), k10 = t0 === t1 ? 0 : 0.5 / (t1 - t0), k21 = t1 === t2 ? 0 : 0.5 / (t2 - t1), scale) : [x0, x1, x2];
19160           };
19161
19162           scale.clamp = function(_) {
19163             return arguments.length ? (clamp = !!_, scale) : clamp;
19164           };
19165
19166           scale.interpolator = function(_) {
19167             return arguments.length ? (interpolator = _, scale) : interpolator;
19168           };
19169
19170           scale.unknown = function(_) {
19171             return arguments.length ? (unknown = _, scale) : unknown;
19172           };
19173
19174           return function(t) {
19175             transform = t, t0 = t(x0), t1 = t(x1), t2 = t(x2), k10 = t0 === t1 ? 0 : 0.5 / (t1 - t0), k21 = t1 === t2 ? 0 : 0.5 / (t2 - t1);
19176             return scale;
19177           };
19178         }
19179
19180         function diverging() {
19181           var scale = linearish(transformer$3()(identity$5));
19182
19183           scale.copy = function() {
19184             return copy$2(scale, diverging());
19185           };
19186
19187           return initInterpolator.apply(scale, arguments);
19188         }
19189
19190         function divergingLog() {
19191           var scale = loggish(transformer$3()).domain([0.1, 1, 10]);
19192
19193           scale.copy = function() {
19194             return copy$2(scale, divergingLog()).base(scale.base());
19195           };
19196
19197           return initInterpolator.apply(scale, arguments);
19198         }
19199
19200         function divergingSymlog() {
19201           var scale = symlogish(transformer$3());
19202
19203           scale.copy = function() {
19204             return copy$2(scale, divergingSymlog()).constant(scale.constant());
19205           };
19206
19207           return initInterpolator.apply(scale, arguments);
19208         }
19209
19210         function divergingPow() {
19211           var scale = powish(transformer$3());
19212
19213           scale.copy = function() {
19214             return copy$2(scale, divergingPow()).exponent(scale.exponent());
19215           };
19216
19217           return initInterpolator.apply(scale, arguments);
19218         }
19219
19220         function divergingSqrt() {
19221           return divergingPow.apply(null, arguments).exponent(0.5);
19222         }
19223
19224         function colors(specifier) {
19225           var n = specifier.length / 6 | 0, colors = new Array(n), i = 0;
19226           while (i < n) colors[i] = "#" + specifier.slice(i * 6, ++i * 6);
19227           return colors;
19228         }
19229
19230         var category10 = colors("1f77b4ff7f0e2ca02cd627289467bd8c564be377c27f7f7fbcbd2217becf");
19231
19232         var Accent = colors("7fc97fbeaed4fdc086ffff99386cb0f0027fbf5b17666666");
19233
19234         var Dark2 = colors("1b9e77d95f027570b3e7298a66a61ee6ab02a6761d666666");
19235
19236         var Paired = colors("a6cee31f78b4b2df8a33a02cfb9a99e31a1cfdbf6fff7f00cab2d66a3d9affff99b15928");
19237
19238         var Pastel1 = colors("fbb4aeb3cde3ccebc5decbe4fed9a6ffffcce5d8bdfddaecf2f2f2");
19239
19240         var Pastel2 = colors("b3e2cdfdcdaccbd5e8f4cae4e6f5c9fff2aef1e2cccccccc");
19241
19242         var Set1 = colors("e41a1c377eb84daf4a984ea3ff7f00ffff33a65628f781bf999999");
19243
19244         var Set2 = colors("66c2a5fc8d628da0cbe78ac3a6d854ffd92fe5c494b3b3b3");
19245
19246         var Set3 = colors("8dd3c7ffffb3bebadafb807280b1d3fdb462b3de69fccde5d9d9d9bc80bdccebc5ffed6f");
19247
19248         function ramp(scheme) {
19249           return rgbBasis(scheme[scheme.length - 1]);
19250         }
19251
19252         var scheme = new Array(3).concat(
19253           "d8b365f5f5f55ab4ac",
19254           "a6611adfc27d80cdc1018571",
19255           "a6611adfc27df5f5f580cdc1018571",
19256           "8c510ad8b365f6e8c3c7eae55ab4ac01665e",
19257           "8c510ad8b365f6e8c3f5f5f5c7eae55ab4ac01665e",
19258           "8c510abf812ddfc27df6e8c3c7eae580cdc135978f01665e",
19259           "8c510abf812ddfc27df6e8c3f5f5f5c7eae580cdc135978f01665e",
19260           "5430058c510abf812ddfc27df6e8c3c7eae580cdc135978f01665e003c30",
19261           "5430058c510abf812ddfc27df6e8c3f5f5f5c7eae580cdc135978f01665e003c30"
19262         ).map(colors);
19263
19264         var BrBG = ramp(scheme);
19265
19266         var scheme$1 = new Array(3).concat(
19267           "af8dc3f7f7f77fbf7b",
19268           "7b3294c2a5cfa6dba0008837",
19269           "7b3294c2a5cff7f7f7a6dba0008837",
19270           "762a83af8dc3e7d4e8d9f0d37fbf7b1b7837",
19271           "762a83af8dc3e7d4e8f7f7f7d9f0d37fbf7b1b7837",
19272           "762a839970abc2a5cfe7d4e8d9f0d3a6dba05aae611b7837",
19273           "762a839970abc2a5cfe7d4e8f7f7f7d9f0d3a6dba05aae611b7837",
19274           "40004b762a839970abc2a5cfe7d4e8d9f0d3a6dba05aae611b783700441b",
19275           "40004b762a839970abc2a5cfe7d4e8f7f7f7d9f0d3a6dba05aae611b783700441b"
19276         ).map(colors);
19277
19278         var PRGn = ramp(scheme$1);
19279
19280         var scheme$2 = new Array(3).concat(
19281           "e9a3c9f7f7f7a1d76a",
19282           "d01c8bf1b6dab8e1864dac26",
19283           "d01c8bf1b6daf7f7f7b8e1864dac26",
19284           "c51b7de9a3c9fde0efe6f5d0a1d76a4d9221",
19285           "c51b7de9a3c9fde0eff7f7f7e6f5d0a1d76a4d9221",
19286           "c51b7dde77aef1b6dafde0efe6f5d0b8e1867fbc414d9221",
19287           "c51b7dde77aef1b6dafde0eff7f7f7e6f5d0b8e1867fbc414d9221",
19288           "8e0152c51b7dde77aef1b6dafde0efe6f5d0b8e1867fbc414d9221276419",
19289           "8e0152c51b7dde77aef1b6dafde0eff7f7f7e6f5d0b8e1867fbc414d9221276419"
19290         ).map(colors);
19291
19292         var PiYG = ramp(scheme$2);
19293
19294         var scheme$3 = new Array(3).concat(
19295           "998ec3f7f7f7f1a340",
19296           "5e3c99b2abd2fdb863e66101",
19297           "5e3c99b2abd2f7f7f7fdb863e66101",
19298           "542788998ec3d8daebfee0b6f1a340b35806",
19299           "542788998ec3d8daebf7f7f7fee0b6f1a340b35806",
19300           "5427888073acb2abd2d8daebfee0b6fdb863e08214b35806",
19301           "5427888073acb2abd2d8daebf7f7f7fee0b6fdb863e08214b35806",
19302           "2d004b5427888073acb2abd2d8daebfee0b6fdb863e08214b358067f3b08",
19303           "2d004b5427888073acb2abd2d8daebf7f7f7fee0b6fdb863e08214b358067f3b08"
19304         ).map(colors);
19305
19306         var PuOr = ramp(scheme$3);
19307
19308         var scheme$4 = new Array(3).concat(
19309           "ef8a62f7f7f767a9cf",
19310           "ca0020f4a58292c5de0571b0",
19311           "ca0020f4a582f7f7f792c5de0571b0",
19312           "b2182bef8a62fddbc7d1e5f067a9cf2166ac",
19313           "b2182bef8a62fddbc7f7f7f7d1e5f067a9cf2166ac",
19314           "b2182bd6604df4a582fddbc7d1e5f092c5de4393c32166ac",
19315           "b2182bd6604df4a582fddbc7f7f7f7d1e5f092c5de4393c32166ac",
19316           "67001fb2182bd6604df4a582fddbc7d1e5f092c5de4393c32166ac053061",
19317           "67001fb2182bd6604df4a582fddbc7f7f7f7d1e5f092c5de4393c32166ac053061"
19318         ).map(colors);
19319
19320         var RdBu = ramp(scheme$4);
19321
19322         var scheme$5 = new Array(3).concat(
19323           "ef8a62ffffff999999",
19324           "ca0020f4a582bababa404040",
19325           "ca0020f4a582ffffffbababa404040",
19326           "b2182bef8a62fddbc7e0e0e09999994d4d4d",
19327           "b2182bef8a62fddbc7ffffffe0e0e09999994d4d4d",
19328           "b2182bd6604df4a582fddbc7e0e0e0bababa8787874d4d4d",
19329           "b2182bd6604df4a582fddbc7ffffffe0e0e0bababa8787874d4d4d",
19330           "67001fb2182bd6604df4a582fddbc7e0e0e0bababa8787874d4d4d1a1a1a",
19331           "67001fb2182bd6604df4a582fddbc7ffffffe0e0e0bababa8787874d4d4d1a1a1a"
19332         ).map(colors);
19333
19334         var RdGy = ramp(scheme$5);
19335
19336         var scheme$6 = new Array(3).concat(
19337           "fc8d59ffffbf91bfdb",
19338           "d7191cfdae61abd9e92c7bb6",
19339           "d7191cfdae61ffffbfabd9e92c7bb6",
19340           "d73027fc8d59fee090e0f3f891bfdb4575b4",
19341           "d73027fc8d59fee090ffffbfe0f3f891bfdb4575b4",
19342           "d73027f46d43fdae61fee090e0f3f8abd9e974add14575b4",
19343           "d73027f46d43fdae61fee090ffffbfe0f3f8abd9e974add14575b4",
19344           "a50026d73027f46d43fdae61fee090e0f3f8abd9e974add14575b4313695",
19345           "a50026d73027f46d43fdae61fee090ffffbfe0f3f8abd9e974add14575b4313695"
19346         ).map(colors);
19347
19348         var RdYlBu = ramp(scheme$6);
19349
19350         var scheme$7 = new Array(3).concat(
19351           "fc8d59ffffbf91cf60",
19352           "d7191cfdae61a6d96a1a9641",
19353           "d7191cfdae61ffffbfa6d96a1a9641",
19354           "d73027fc8d59fee08bd9ef8b91cf601a9850",
19355           "d73027fc8d59fee08bffffbfd9ef8b91cf601a9850",
19356           "d73027f46d43fdae61fee08bd9ef8ba6d96a66bd631a9850",
19357           "d73027f46d43fdae61fee08bffffbfd9ef8ba6d96a66bd631a9850",
19358           "a50026d73027f46d43fdae61fee08bd9ef8ba6d96a66bd631a9850006837",
19359           "a50026d73027f46d43fdae61fee08bffffbfd9ef8ba6d96a66bd631a9850006837"
19360         ).map(colors);
19361
19362         var RdYlGn = ramp(scheme$7);
19363
19364         var scheme$8 = new Array(3).concat(
19365           "fc8d59ffffbf99d594",
19366           "d7191cfdae61abdda42b83ba",
19367           "d7191cfdae61ffffbfabdda42b83ba",
19368           "d53e4ffc8d59fee08be6f59899d5943288bd",
19369           "d53e4ffc8d59fee08bffffbfe6f59899d5943288bd",
19370           "d53e4ff46d43fdae61fee08be6f598abdda466c2a53288bd",
19371           "d53e4ff46d43fdae61fee08bffffbfe6f598abdda466c2a53288bd",
19372           "9e0142d53e4ff46d43fdae61fee08be6f598abdda466c2a53288bd5e4fa2",
19373           "9e0142d53e4ff46d43fdae61fee08bffffbfe6f598abdda466c2a53288bd5e4fa2"
19374         ).map(colors);
19375
19376         var Spectral = ramp(scheme$8);
19377
19378         var scheme$9 = new Array(3).concat(
19379           "e5f5f999d8c92ca25f",
19380           "edf8fbb2e2e266c2a4238b45",
19381           "edf8fbb2e2e266c2a42ca25f006d2c",
19382           "edf8fbccece699d8c966c2a42ca25f006d2c",
19383           "edf8fbccece699d8c966c2a441ae76238b45005824",
19384           "f7fcfde5f5f9ccece699d8c966c2a441ae76238b45005824",
19385           "f7fcfde5f5f9ccece699d8c966c2a441ae76238b45006d2c00441b"
19386         ).map(colors);
19387
19388         var BuGn = ramp(scheme$9);
19389
19390         var scheme$a = new Array(3).concat(
19391           "e0ecf49ebcda8856a7",
19392           "edf8fbb3cde38c96c688419d",
19393           "edf8fbb3cde38c96c68856a7810f7c",
19394           "edf8fbbfd3e69ebcda8c96c68856a7810f7c",
19395           "edf8fbbfd3e69ebcda8c96c68c6bb188419d6e016b",
19396           "f7fcfde0ecf4bfd3e69ebcda8c96c68c6bb188419d6e016b",
19397           "f7fcfde0ecf4bfd3e69ebcda8c96c68c6bb188419d810f7c4d004b"
19398         ).map(colors);
19399
19400         var BuPu = ramp(scheme$a);
19401
19402         var scheme$b = new Array(3).concat(
19403           "e0f3dba8ddb543a2ca",
19404           "f0f9e8bae4bc7bccc42b8cbe",
19405           "f0f9e8bae4bc7bccc443a2ca0868ac",
19406           "f0f9e8ccebc5a8ddb57bccc443a2ca0868ac",
19407           "f0f9e8ccebc5a8ddb57bccc44eb3d32b8cbe08589e",
19408           "f7fcf0e0f3dbccebc5a8ddb57bccc44eb3d32b8cbe08589e",
19409           "f7fcf0e0f3dbccebc5a8ddb57bccc44eb3d32b8cbe0868ac084081"
19410         ).map(colors);
19411
19412         var GnBu = ramp(scheme$b);
19413
19414         var scheme$c = new Array(3).concat(
19415           "fee8c8fdbb84e34a33",
19416           "fef0d9fdcc8afc8d59d7301f",
19417           "fef0d9fdcc8afc8d59e34a33b30000",
19418           "fef0d9fdd49efdbb84fc8d59e34a33b30000",
19419           "fef0d9fdd49efdbb84fc8d59ef6548d7301f990000",
19420           "fff7ecfee8c8fdd49efdbb84fc8d59ef6548d7301f990000",
19421           "fff7ecfee8c8fdd49efdbb84fc8d59ef6548d7301fb300007f0000"
19422         ).map(colors);
19423
19424         var OrRd = ramp(scheme$c);
19425
19426         var scheme$d = new Array(3).concat(
19427           "ece2f0a6bddb1c9099",
19428           "f6eff7bdc9e167a9cf02818a",
19429           "f6eff7bdc9e167a9cf1c9099016c59",
19430           "f6eff7d0d1e6a6bddb67a9cf1c9099016c59",
19431           "f6eff7d0d1e6a6bddb67a9cf3690c002818a016450",
19432           "fff7fbece2f0d0d1e6a6bddb67a9cf3690c002818a016450",
19433           "fff7fbece2f0d0d1e6a6bddb67a9cf3690c002818a016c59014636"
19434         ).map(colors);
19435
19436         var PuBuGn = ramp(scheme$d);
19437
19438         var scheme$e = new Array(3).concat(
19439           "ece7f2a6bddb2b8cbe",
19440           "f1eef6bdc9e174a9cf0570b0",
19441           "f1eef6bdc9e174a9cf2b8cbe045a8d",
19442           "f1eef6d0d1e6a6bddb74a9cf2b8cbe045a8d",
19443           "f1eef6d0d1e6a6bddb74a9cf3690c00570b0034e7b",
19444           "fff7fbece7f2d0d1e6a6bddb74a9cf3690c00570b0034e7b",
19445           "fff7fbece7f2d0d1e6a6bddb74a9cf3690c00570b0045a8d023858"
19446         ).map(colors);
19447
19448         var PuBu = ramp(scheme$e);
19449
19450         var scheme$f = new Array(3).concat(
19451           "e7e1efc994c7dd1c77",
19452           "f1eef6d7b5d8df65b0ce1256",
19453           "f1eef6d7b5d8df65b0dd1c77980043",
19454           "f1eef6d4b9dac994c7df65b0dd1c77980043",
19455           "f1eef6d4b9dac994c7df65b0e7298ace125691003f",
19456           "f7f4f9e7e1efd4b9dac994c7df65b0e7298ace125691003f",
19457           "f7f4f9e7e1efd4b9dac994c7df65b0e7298ace125698004367001f"
19458         ).map(colors);
19459
19460         var PuRd = ramp(scheme$f);
19461
19462         var scheme$g = new Array(3).concat(
19463           "fde0ddfa9fb5c51b8a",
19464           "feebe2fbb4b9f768a1ae017e",
19465           "feebe2fbb4b9f768a1c51b8a7a0177",
19466           "feebe2fcc5c0fa9fb5f768a1c51b8a7a0177",
19467           "feebe2fcc5c0fa9fb5f768a1dd3497ae017e7a0177",
19468           "fff7f3fde0ddfcc5c0fa9fb5f768a1dd3497ae017e7a0177",
19469           "fff7f3fde0ddfcc5c0fa9fb5f768a1dd3497ae017e7a017749006a"
19470         ).map(colors);
19471
19472         var RdPu = ramp(scheme$g);
19473
19474         var scheme$h = new Array(3).concat(
19475           "edf8b17fcdbb2c7fb8",
19476           "ffffcca1dab441b6c4225ea8",
19477           "ffffcca1dab441b6c42c7fb8253494",
19478           "ffffccc7e9b47fcdbb41b6c42c7fb8253494",
19479           "ffffccc7e9b47fcdbb41b6c41d91c0225ea80c2c84",
19480           "ffffd9edf8b1c7e9b47fcdbb41b6c41d91c0225ea80c2c84",
19481           "ffffd9edf8b1c7e9b47fcdbb41b6c41d91c0225ea8253494081d58"
19482         ).map(colors);
19483
19484         var YlGnBu = ramp(scheme$h);
19485
19486         var scheme$i = new Array(3).concat(
19487           "f7fcb9addd8e31a354",
19488           "ffffccc2e69978c679238443",
19489           "ffffccc2e69978c67931a354006837",
19490           "ffffccd9f0a3addd8e78c67931a354006837",
19491           "ffffccd9f0a3addd8e78c67941ab5d238443005a32",
19492           "ffffe5f7fcb9d9f0a3addd8e78c67941ab5d238443005a32",
19493           "ffffe5f7fcb9d9f0a3addd8e78c67941ab5d238443006837004529"
19494         ).map(colors);
19495
19496         var YlGn = ramp(scheme$i);
19497
19498         var scheme$j = new Array(3).concat(
19499           "fff7bcfec44fd95f0e",
19500           "ffffd4fed98efe9929cc4c02",
19501           "ffffd4fed98efe9929d95f0e993404",
19502           "ffffd4fee391fec44ffe9929d95f0e993404",
19503           "ffffd4fee391fec44ffe9929ec7014cc4c028c2d04",
19504           "ffffe5fff7bcfee391fec44ffe9929ec7014cc4c028c2d04",
19505           "ffffe5fff7bcfee391fec44ffe9929ec7014cc4c02993404662506"
19506         ).map(colors);
19507
19508         var YlOrBr = ramp(scheme$j);
19509
19510         var scheme$k = new Array(3).concat(
19511           "ffeda0feb24cf03b20",
19512           "ffffb2fecc5cfd8d3ce31a1c",
19513           "ffffb2fecc5cfd8d3cf03b20bd0026",
19514           "ffffb2fed976feb24cfd8d3cf03b20bd0026",
19515           "ffffb2fed976feb24cfd8d3cfc4e2ae31a1cb10026",
19516           "ffffccffeda0fed976feb24cfd8d3cfc4e2ae31a1cb10026",
19517           "ffffccffeda0fed976feb24cfd8d3cfc4e2ae31a1cbd0026800026"
19518         ).map(colors);
19519
19520         var YlOrRd = ramp(scheme$k);
19521
19522         var scheme$l = new Array(3).concat(
19523           "deebf79ecae13182bd",
19524           "eff3ffbdd7e76baed62171b5",
19525           "eff3ffbdd7e76baed63182bd08519c",
19526           "eff3ffc6dbef9ecae16baed63182bd08519c",
19527           "eff3ffc6dbef9ecae16baed64292c62171b5084594",
19528           "f7fbffdeebf7c6dbef9ecae16baed64292c62171b5084594",
19529           "f7fbffdeebf7c6dbef9ecae16baed64292c62171b508519c08306b"
19530         ).map(colors);
19531
19532         var Blues = ramp(scheme$l);
19533
19534         var scheme$m = new Array(3).concat(
19535           "e5f5e0a1d99b31a354",
19536           "edf8e9bae4b374c476238b45",
19537           "edf8e9bae4b374c47631a354006d2c",
19538           "edf8e9c7e9c0a1d99b74c47631a354006d2c",
19539           "edf8e9c7e9c0a1d99b74c47641ab5d238b45005a32",
19540           "f7fcf5e5f5e0c7e9c0a1d99b74c47641ab5d238b45005a32",
19541           "f7fcf5e5f5e0c7e9c0a1d99b74c47641ab5d238b45006d2c00441b"
19542         ).map(colors);
19543
19544         var Greens = ramp(scheme$m);
19545
19546         var scheme$n = new Array(3).concat(
19547           "f0f0f0bdbdbd636363",
19548           "f7f7f7cccccc969696525252",
19549           "f7f7f7cccccc969696636363252525",
19550           "f7f7f7d9d9d9bdbdbd969696636363252525",
19551           "f7f7f7d9d9d9bdbdbd969696737373525252252525",
19552           "fffffff0f0f0d9d9d9bdbdbd969696737373525252252525",
19553           "fffffff0f0f0d9d9d9bdbdbd969696737373525252252525000000"
19554         ).map(colors);
19555
19556         var Greys = ramp(scheme$n);
19557
19558         var scheme$o = new Array(3).concat(
19559           "efedf5bcbddc756bb1",
19560           "f2f0f7cbc9e29e9ac86a51a3",
19561           "f2f0f7cbc9e29e9ac8756bb154278f",
19562           "f2f0f7dadaebbcbddc9e9ac8756bb154278f",
19563           "f2f0f7dadaebbcbddc9e9ac8807dba6a51a34a1486",
19564           "fcfbfdefedf5dadaebbcbddc9e9ac8807dba6a51a34a1486",
19565           "fcfbfdefedf5dadaebbcbddc9e9ac8807dba6a51a354278f3f007d"
19566         ).map(colors);
19567
19568         var Purples = ramp(scheme$o);
19569
19570         var scheme$p = new Array(3).concat(
19571           "fee0d2fc9272de2d26",
19572           "fee5d9fcae91fb6a4acb181d",
19573           "fee5d9fcae91fb6a4ade2d26a50f15",
19574           "fee5d9fcbba1fc9272fb6a4ade2d26a50f15",
19575           "fee5d9fcbba1fc9272fb6a4aef3b2ccb181d99000d",
19576           "fff5f0fee0d2fcbba1fc9272fb6a4aef3b2ccb181d99000d",
19577           "fff5f0fee0d2fcbba1fc9272fb6a4aef3b2ccb181da50f1567000d"
19578         ).map(colors);
19579
19580         var Reds = ramp(scheme$p);
19581
19582         var scheme$q = new Array(3).concat(
19583           "fee6cefdae6be6550d",
19584           "feeddefdbe85fd8d3cd94701",
19585           "feeddefdbe85fd8d3ce6550da63603",
19586           "feeddefdd0a2fdae6bfd8d3ce6550da63603",
19587           "feeddefdd0a2fdae6bfd8d3cf16913d948018c2d04",
19588           "fff5ebfee6cefdd0a2fdae6bfd8d3cf16913d948018c2d04",
19589           "fff5ebfee6cefdd0a2fdae6bfd8d3cf16913d94801a636037f2704"
19590         ).map(colors);
19591
19592         var Oranges = ramp(scheme$q);
19593
19594         var cubehelix$3 = cubehelixLong(cubehelix(300, 0.5, 0.0), cubehelix(-240, 0.5, 1.0));
19595
19596         var warm = cubehelixLong(cubehelix(-100, 0.75, 0.35), cubehelix(80, 1.50, 0.8));
19597
19598         var cool = cubehelixLong(cubehelix(260, 0.75, 0.35), cubehelix(80, 1.50, 0.8));
19599
19600         var c = cubehelix();
19601
19602         function rainbow(t) {
19603           if (t < 0 || t > 1) t -= Math.floor(t);
19604           var ts = Math.abs(t - 0.5);
19605           c.h = 360 * t - 100;
19606           c.s = 1.5 - 1.5 * ts;
19607           c.l = 0.8 - 0.9 * ts;
19608           return c + "";
19609         }
19610
19611         var c$1 = rgb(),
19612             pi_1_3 = Math.PI / 3,
19613             pi_2_3 = Math.PI * 2 / 3;
19614
19615         function sinebow(t) {
19616           var x;
19617           t = (0.5 - t) * Math.PI;
19618           c$1.r = 255 * (x = Math.sin(t)) * x;
19619           c$1.g = 255 * (x = Math.sin(t + pi_1_3)) * x;
19620           c$1.b = 255 * (x = Math.sin(t + pi_2_3)) * x;
19621           return c$1 + "";
19622         }
19623
19624         function ramp$1(range) {
19625           var n = range.length;
19626           return function(t) {
19627             return range[Math.max(0, Math.min(n - 1, Math.floor(t * n)))];
19628           };
19629         }
19630
19631         var viridis = ramp$1(colors("44015444025645045745055946075a46085c460a5d460b5e470d60470e6147106347116447136548146748166848176948186a481a6c481b6d481c6e481d6f481f70482071482173482374482475482576482677482878482979472a7a472c7a472d7b472e7c472f7d46307e46327e46337f463480453581453781453882443983443a83443b84433d84433e85423f854240864241864142874144874045884046883f47883f48893e49893e4a893e4c8a3d4d8a3d4e8a3c4f8a3c508b3b518b3b528b3a538b3a548c39558c39568c38588c38598c375a8c375b8d365c8d365d8d355e8d355f8d34608d34618d33628d33638d32648e32658e31668e31678e31688e30698e306a8e2f6b8e2f6c8e2e6d8e2e6e8e2e6f8e2d708e2d718e2c718e2c728e2c738e2b748e2b758e2a768e2a778e2a788e29798e297a8e297b8e287c8e287d8e277e8e277f8e27808e26818e26828e26828e25838e25848e25858e24868e24878e23888e23898e238a8d228b8d228c8d228d8d218e8d218f8d21908d21918c20928c20928c20938c1f948c1f958b1f968b1f978b1f988b1f998a1f9a8a1e9b8a1e9c891e9d891f9e891f9f881fa0881fa1881fa1871fa28720a38620a48621a58521a68522a78522a88423a98324aa8325ab8225ac8226ad8127ad8128ae8029af7f2ab07f2cb17e2db27d2eb37c2fb47c31b57b32b67a34b67935b77937b87838b9773aba763bbb753dbc743fbc7340bd7242be7144bf7046c06f48c16e4ac16d4cc26c4ec36b50c46a52c56954c56856c66758c7655ac8645cc8635ec96260ca6063cb5f65cb5e67cc5c69cd5b6ccd5a6ece5870cf5773d05675d05477d1537ad1517cd2507fd34e81d34d84d44b86d54989d5488bd6468ed64590d74393d74195d84098d83e9bd93c9dd93ba0da39a2da37a5db36a8db34aadc32addc30b0dd2fb2dd2db5de2bb8de29bade28bddf26c0df25c2df23c5e021c8e020cae11fcde11dd0e11cd2e21bd5e21ad8e219dae319dde318dfe318e2e418e5e419e7e419eae51aece51befe51cf1e51df4e61ef6e620f8e621fbe723fde725"));
19632
19633         var magma = ramp$1(colors("00000401000501010601010802010902020b02020d03030f03031204041405041606051806051a07061c08071e0907200a08220b09240c09260d0a290e0b2b100b2d110c2f120d31130d34140e36150e38160f3b180f3d19103f1a10421c10441d11471e114920114b21114e22115024125325125527125829115a2a115c2c115f2d11612f116331116533106734106936106b38106c390f6e3b0f703d0f713f0f72400f74420f75440f764510774710784910784a10794c117a4e117b4f127b51127c52137c54137d56147d57157e59157e5a167e5c167f5d177f5f187f601880621980641a80651a80671b80681c816a1c816b1d816d1d816e1e81701f81721f817320817521817621817822817922827b23827c23827e24828025828125818326818426818627818827818928818b29818c29818e2a81902a81912b81932b80942c80962c80982d80992d809b2e7f9c2e7f9e2f7fa02f7fa1307ea3307ea5317ea6317da8327daa337dab337cad347cae347bb0357bb2357bb3367ab5367ab73779b83779ba3878bc3978bd3977bf3a77c03a76c23b75c43c75c53c74c73d73c83e73ca3e72cc3f71cd4071cf4070d0416fd2426fd3436ed5446dd6456cd8456cd9466bdb476adc4869de4968df4a68e04c67e24d66e34e65e44f64e55064e75263e85362e95462ea5661eb5760ec5860ed5a5fee5b5eef5d5ef05f5ef1605df2625df2645cf3655cf4675cf4695cf56b5cf66c5cf66e5cf7705cf7725cf8745cf8765cf9785df9795df97b5dfa7d5efa7f5efa815ffb835ffb8560fb8761fc8961fc8a62fc8c63fc8e64fc9065fd9266fd9467fd9668fd9869fd9a6afd9b6bfe9d6cfe9f6dfea16efea36ffea571fea772fea973feaa74feac76feae77feb078feb27afeb47bfeb67cfeb77efeb97ffebb81febd82febf84fec185fec287fec488fec68afec88cfeca8dfecc8ffecd90fecf92fed194fed395fed597fed799fed89afdda9cfddc9efddea0fde0a1fde2a3fde3a5fde5a7fde7a9fde9aafdebacfcecaefceeb0fcf0b2fcf2b4fcf4b6fcf6b8fcf7b9fcf9bbfcfbbdfcfdbf"));
19634
19635         var inferno = ramp$1(colors("00000401000501010601010802010a02020c02020e03021004031204031405041706041907051b08051d09061f0a07220b07240c08260d08290e092b10092d110a30120a32140b34150b37160b39180c3c190c3e1b0c411c0c431e0c451f0c48210c4a230c4c240c4f260c51280b53290b552b0b572d0b592f0a5b310a5c320a5e340a5f3609613809623909633b09643d09653e0966400a67420a68440a68450a69470b6a490b6a4a0c6b4c0c6b4d0d6c4f0d6c510e6c520e6d540f6d550f6d57106e59106e5a116e5c126e5d126e5f136e61136e62146e64156e65156e67166e69166e6a176e6c186e6d186e6f196e71196e721a6e741a6e751b6e771c6d781c6d7a1d6d7c1d6d7d1e6d7f1e6c801f6c82206c84206b85216b87216b88226a8a226a8c23698d23698f24699025689225689326679526679727669827669a28659b29649d29649f2a63a02a63a22b62a32c61a52c60a62d60a82e5fa92e5eab2f5ead305dae305cb0315bb1325ab3325ab43359b63458b73557b93556ba3655bc3754bd3853bf3952c03a51c13a50c33b4fc43c4ec63d4dc73e4cc83f4bca404acb4149cc4248ce4347cf4446d04545d24644d34743d44842d54a41d74b3fd84c3ed94d3dda4e3cdb503bdd513ade5238df5337e05536e15635e25734e35933e45a31e55c30e65d2fe75e2ee8602de9612bea632aeb6429eb6628ec6726ed6925ee6a24ef6c23ef6e21f06f20f1711ff1731df2741cf3761bf37819f47918f57b17f57d15f67e14f68013f78212f78410f8850ff8870ef8890cf98b0bf98c0af98e09fa9008fa9207fa9407fb9606fb9706fb9906fb9b06fb9d07fc9f07fca108fca309fca50afca60cfca80dfcaa0ffcac11fcae12fcb014fcb216fcb418fbb61afbb81dfbba1ffbbc21fbbe23fac026fac228fac42afac62df9c72ff9c932f9cb35f8cd37f8cf3af7d13df7d340f6d543f6d746f5d949f5db4cf4dd4ff4df53f4e156f3e35af3e55df2e661f2e865f2ea69f1ec6df1ed71f1ef75f1f179f2f27df2f482f3f586f3f68af4f88ef5f992f6fa96f8fb9af9fc9dfafda1fcffa4"));
19636
19637         var plasma = ramp$1(colors("0d088710078813078916078a19068c1b068d1d068e20068f2206902406912605912805922a05932c05942e05952f059631059733059735049837049938049a3a049a3c049b3e049c3f049c41049d43039e44039e46039f48039f4903a04b03a14c02a14e02a25002a25102a35302a35502a45601a45801a45901a55b01a55c01a65e01a66001a66100a76300a76400a76600a76700a86900a86a00a86c00a86e00a86f00a87100a87201a87401a87501a87701a87801a87a02a87b02a87d03a87e03a88004a88104a78305a78405a78606a68707a68808a68a09a58b0aa58d0ba58e0ca48f0da4910ea3920fa39410a29511a19613a19814a099159f9a169f9c179e9d189d9e199da01a9ca11b9ba21d9aa31e9aa51f99a62098a72197a82296aa2395ab2494ac2694ad2793ae2892b02991b12a90b22b8fb32c8eb42e8db52f8cb6308bb7318ab83289ba3388bb3488bc3587bd3786be3885bf3984c03a83c13b82c23c81c33d80c43e7fc5407ec6417dc7427cc8437bc9447aca457acb4679cc4778cc4977cd4a76ce4b75cf4c74d04d73d14e72d24f71d35171d45270d5536fd5546ed6556dd7566cd8576bd9586ada5a6ada5b69db5c68dc5d67dd5e66de5f65de6164df6263e06363e16462e26561e26660e3685fe4695ee56a5de56b5de66c5ce76e5be76f5ae87059e97158e97257ea7457eb7556eb7655ec7754ed7953ed7a52ee7b51ef7c51ef7e50f07f4ff0804ef1814df1834cf2844bf3854bf3874af48849f48948f58b47f58c46f68d45f68f44f79044f79143f79342f89441f89540f9973ff9983ef99a3efa9b3dfa9c3cfa9e3bfb9f3afba139fba238fca338fca537fca636fca835fca934fdab33fdac33fdae32fdaf31fdb130fdb22ffdb42ffdb52efeb72dfeb82cfeba2cfebb2bfebd2afebe2afec029fdc229fdc328fdc527fdc627fdc827fdca26fdcb26fccd25fcce25fcd025fcd225fbd324fbd524fbd724fad824fada24f9dc24f9dd25f8df25f8e125f7e225f7e425f6e626f6e826f5e926f5eb27f4ed27f3ee27f3f027f2f227f1f426f1f525f0f724f0f921"));
19638
19639         function constant$b(x) {
19640           return function constant() {
19641             return x;
19642           };
19643         }
19644
19645         var abs$3 = Math.abs;
19646         var atan2$1 = Math.atan2;
19647         var cos$2 = Math.cos;
19648         var max$4 = Math.max;
19649         var min$1 = Math.min;
19650         var sin$2 = Math.sin;
19651         var sqrt$2 = Math.sqrt;
19652
19653         var epsilon$3 = 1e-12;
19654         var pi$4 = Math.PI;
19655         var halfPi$3 = pi$4 / 2;
19656         var tau$4 = 2 * pi$4;
19657
19658         function acos$1(x) {
19659           return x > 1 ? 0 : x < -1 ? pi$4 : Math.acos(x);
19660         }
19661
19662         function asin$1(x) {
19663           return x >= 1 ? halfPi$3 : x <= -1 ? -halfPi$3 : Math.asin(x);
19664         }
19665
19666         function arcInnerRadius(d) {
19667           return d.innerRadius;
19668         }
19669
19670         function arcOuterRadius(d) {
19671           return d.outerRadius;
19672         }
19673
19674         function arcStartAngle(d) {
19675           return d.startAngle;
19676         }
19677
19678         function arcEndAngle(d) {
19679           return d.endAngle;
19680         }
19681
19682         function arcPadAngle(d) {
19683           return d && d.padAngle; // Note: optional!
19684         }
19685
19686         function intersect(x0, y0, x1, y1, x2, y2, x3, y3) {
19687           var x10 = x1 - x0, y10 = y1 - y0,
19688               x32 = x3 - x2, y32 = y3 - y2,
19689               t = y32 * x10 - x32 * y10;
19690           if (t * t < epsilon$3) return;
19691           t = (x32 * (y0 - y2) - y32 * (x0 - x2)) / t;
19692           return [x0 + t * x10, y0 + t * y10];
19693         }
19694
19695         // Compute perpendicular offset line of length rc.
19696         // http://mathworld.wolfram.com/Circle-LineIntersection.html
19697         function cornerTangents(x0, y0, x1, y1, r1, rc, cw) {
19698           var x01 = x0 - x1,
19699               y01 = y0 - y1,
19700               lo = (cw ? rc : -rc) / sqrt$2(x01 * x01 + y01 * y01),
19701               ox = lo * y01,
19702               oy = -lo * x01,
19703               x11 = x0 + ox,
19704               y11 = y0 + oy,
19705               x10 = x1 + ox,
19706               y10 = y1 + oy,
19707               x00 = (x11 + x10) / 2,
19708               y00 = (y11 + y10) / 2,
19709               dx = x10 - x11,
19710               dy = y10 - y11,
19711               d2 = dx * dx + dy * dy,
19712               r = r1 - rc,
19713               D = x11 * y10 - x10 * y11,
19714               d = (dy < 0 ? -1 : 1) * sqrt$2(max$4(0, r * r * d2 - D * D)),
19715               cx0 = (D * dy - dx * d) / d2,
19716               cy0 = (-D * dx - dy * d) / d2,
19717               cx1 = (D * dy + dx * d) / d2,
19718               cy1 = (-D * dx + dy * d) / d2,
19719               dx0 = cx0 - x00,
19720               dy0 = cy0 - y00,
19721               dx1 = cx1 - x00,
19722               dy1 = cy1 - y00;
19723
19724           // Pick the closer of the two intersection points.
19725           // TODO Is there a faster way to determine which intersection to use?
19726           if (dx0 * dx0 + dy0 * dy0 > dx1 * dx1 + dy1 * dy1) cx0 = cx1, cy0 = cy1;
19727
19728           return {
19729             cx: cx0,
19730             cy: cy0,
19731             x01: -ox,
19732             y01: -oy,
19733             x11: cx0 * (r1 / r - 1),
19734             y11: cy0 * (r1 / r - 1)
19735           };
19736         }
19737
19738         function arc() {
19739           var innerRadius = arcInnerRadius,
19740               outerRadius = arcOuterRadius,
19741               cornerRadius = constant$b(0),
19742               padRadius = null,
19743               startAngle = arcStartAngle,
19744               endAngle = arcEndAngle,
19745               padAngle = arcPadAngle,
19746               context = null;
19747
19748           function arc() {
19749             var buffer,
19750                 r,
19751                 r0 = +innerRadius.apply(this, arguments),
19752                 r1 = +outerRadius.apply(this, arguments),
19753                 a0 = startAngle.apply(this, arguments) - halfPi$3,
19754                 a1 = endAngle.apply(this, arguments) - halfPi$3,
19755                 da = abs$3(a1 - a0),
19756                 cw = a1 > a0;
19757
19758             if (!context) context = buffer = path();
19759
19760             // Ensure that the outer radius is always larger than the inner radius.
19761             if (r1 < r0) r = r1, r1 = r0, r0 = r;
19762
19763             // Is it a point?
19764             if (!(r1 > epsilon$3)) context.moveTo(0, 0);
19765
19766             // Or is it a circle or annulus?
19767             else if (da > tau$4 - epsilon$3) {
19768               context.moveTo(r1 * cos$2(a0), r1 * sin$2(a0));
19769               context.arc(0, 0, r1, a0, a1, !cw);
19770               if (r0 > epsilon$3) {
19771                 context.moveTo(r0 * cos$2(a1), r0 * sin$2(a1));
19772                 context.arc(0, 0, r0, a1, a0, cw);
19773               }
19774             }
19775
19776             // Or is it a circular or annular sector?
19777             else {
19778               var a01 = a0,
19779                   a11 = a1,
19780                   a00 = a0,
19781                   a10 = a1,
19782                   da0 = da,
19783                   da1 = da,
19784                   ap = padAngle.apply(this, arguments) / 2,
19785                   rp = (ap > epsilon$3) && (padRadius ? +padRadius.apply(this, arguments) : sqrt$2(r0 * r0 + r1 * r1)),
19786                   rc = min$1(abs$3(r1 - r0) / 2, +cornerRadius.apply(this, arguments)),
19787                   rc0 = rc,
19788                   rc1 = rc,
19789                   t0,
19790                   t1;
19791
19792               // Apply padding? Note that since r1 ≥ r0, da1 ≥ da0.
19793               if (rp > epsilon$3) {
19794                 var p0 = asin$1(rp / r0 * sin$2(ap)),
19795                     p1 = asin$1(rp / r1 * sin$2(ap));
19796                 if ((da0 -= p0 * 2) > epsilon$3) p0 *= (cw ? 1 : -1), a00 += p0, a10 -= p0;
19797                 else da0 = 0, a00 = a10 = (a0 + a1) / 2;
19798                 if ((da1 -= p1 * 2) > epsilon$3) p1 *= (cw ? 1 : -1), a01 += p1, a11 -= p1;
19799                 else da1 = 0, a01 = a11 = (a0 + a1) / 2;
19800               }
19801
19802               var x01 = r1 * cos$2(a01),
19803                   y01 = r1 * sin$2(a01),
19804                   x10 = r0 * cos$2(a10),
19805                   y10 = r0 * sin$2(a10);
19806
19807               // Apply rounded corners?
19808               if (rc > epsilon$3) {
19809                 var x11 = r1 * cos$2(a11),
19810                     y11 = r1 * sin$2(a11),
19811                     x00 = r0 * cos$2(a00),
19812                     y00 = r0 * sin$2(a00),
19813                     oc;
19814
19815                 // Restrict the corner radius according to the sector angle.
19816                 if (da < pi$4 && (oc = intersect(x01, y01, x00, y00, x11, y11, x10, y10))) {
19817                   var ax = x01 - oc[0],
19818                       ay = y01 - oc[1],
19819                       bx = x11 - oc[0],
19820                       by = y11 - oc[1],
19821                       kc = 1 / sin$2(acos$1((ax * bx + ay * by) / (sqrt$2(ax * ax + ay * ay) * sqrt$2(bx * bx + by * by))) / 2),
19822                       lc = sqrt$2(oc[0] * oc[0] + oc[1] * oc[1]);
19823                   rc0 = min$1(rc, (r0 - lc) / (kc - 1));
19824                   rc1 = min$1(rc, (r1 - lc) / (kc + 1));
19825                 }
19826               }
19827
19828               // Is the sector collapsed to a line?
19829               if (!(da1 > epsilon$3)) context.moveTo(x01, y01);
19830
19831               // Does the sector’s outer ring have rounded corners?
19832               else if (rc1 > epsilon$3) {
19833                 t0 = cornerTangents(x00, y00, x01, y01, r1, rc1, cw);
19834                 t1 = cornerTangents(x11, y11, x10, y10, r1, rc1, cw);
19835
19836                 context.moveTo(t0.cx + t0.x01, t0.cy + t0.y01);
19837
19838                 // Have the corners merged?
19839                 if (rc1 < rc) context.arc(t0.cx, t0.cy, rc1, atan2$1(t0.y01, t0.x01), atan2$1(t1.y01, t1.x01), !cw);
19840
19841                 // Otherwise, draw the two corners and the ring.
19842                 else {
19843                   context.arc(t0.cx, t0.cy, rc1, atan2$1(t0.y01, t0.x01), atan2$1(t0.y11, t0.x11), !cw);
19844                   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);
19845                   context.arc(t1.cx, t1.cy, rc1, atan2$1(t1.y11, t1.x11), atan2$1(t1.y01, t1.x01), !cw);
19846                 }
19847               }
19848
19849               // Or is the outer ring just a circular arc?
19850               else context.moveTo(x01, y01), context.arc(0, 0, r1, a01, a11, !cw);
19851
19852               // Is there no inner ring, and it’s a circular sector?
19853               // Or perhaps it’s an annular sector collapsed due to padding?
19854               if (!(r0 > epsilon$3) || !(da0 > epsilon$3)) context.lineTo(x10, y10);
19855
19856               // Does the sector’s inner ring (or point) have rounded corners?
19857               else if (rc0 > epsilon$3) {
19858                 t0 = cornerTangents(x10, y10, x11, y11, r0, -rc0, cw);
19859                 t1 = cornerTangents(x01, y01, x00, y00, r0, -rc0, cw);
19860
19861                 context.lineTo(t0.cx + t0.x01, t0.cy + t0.y01);
19862
19863                 // Have the corners merged?
19864                 if (rc0 < rc) context.arc(t0.cx, t0.cy, rc0, atan2$1(t0.y01, t0.x01), atan2$1(t1.y01, t1.x01), !cw);
19865
19866                 // Otherwise, draw the two corners and the ring.
19867                 else {
19868                   context.arc(t0.cx, t0.cy, rc0, atan2$1(t0.y01, t0.x01), atan2$1(t0.y11, t0.x11), !cw);
19869                   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);
19870                   context.arc(t1.cx, t1.cy, rc0, atan2$1(t1.y11, t1.x11), atan2$1(t1.y01, t1.x01), !cw);
19871                 }
19872               }
19873
19874               // Or is the inner ring just a circular arc?
19875               else context.arc(0, 0, r0, a10, a00, cw);
19876             }
19877
19878             context.closePath();
19879
19880             if (buffer) return context = null, buffer + "" || null;
19881           }
19882
19883           arc.centroid = function() {
19884             var r = (+innerRadius.apply(this, arguments) + +outerRadius.apply(this, arguments)) / 2,
19885                 a = (+startAngle.apply(this, arguments) + +endAngle.apply(this, arguments)) / 2 - pi$4 / 2;
19886             return [cos$2(a) * r, sin$2(a) * r];
19887           };
19888
19889           arc.innerRadius = function(_) {
19890             return arguments.length ? (innerRadius = typeof _ === "function" ? _ : constant$b(+_), arc) : innerRadius;
19891           };
19892
19893           arc.outerRadius = function(_) {
19894             return arguments.length ? (outerRadius = typeof _ === "function" ? _ : constant$b(+_), arc) : outerRadius;
19895           };
19896
19897           arc.cornerRadius = function(_) {
19898             return arguments.length ? (cornerRadius = typeof _ === "function" ? _ : constant$b(+_), arc) : cornerRadius;
19899           };
19900
19901           arc.padRadius = function(_) {
19902             return arguments.length ? (padRadius = _ == null ? null : typeof _ === "function" ? _ : constant$b(+_), arc) : padRadius;
19903           };
19904
19905           arc.startAngle = function(_) {
19906             return arguments.length ? (startAngle = typeof _ === "function" ? _ : constant$b(+_), arc) : startAngle;
19907           };
19908
19909           arc.endAngle = function(_) {
19910             return arguments.length ? (endAngle = typeof _ === "function" ? _ : constant$b(+_), arc) : endAngle;
19911           };
19912
19913           arc.padAngle = function(_) {
19914             return arguments.length ? (padAngle = typeof _ === "function" ? _ : constant$b(+_), arc) : padAngle;
19915           };
19916
19917           arc.context = function(_) {
19918             return arguments.length ? ((context = _ == null ? null : _), arc) : context;
19919           };
19920
19921           return arc;
19922         }
19923
19924         function Linear(context) {
19925           this._context = context;
19926         }
19927
19928         Linear.prototype = {
19929           areaStart: function() {
19930             this._line = 0;
19931           },
19932           areaEnd: function() {
19933             this._line = NaN;
19934           },
19935           lineStart: function() {
19936             this._point = 0;
19937           },
19938           lineEnd: function() {
19939             if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();
19940             this._line = 1 - this._line;
19941           },
19942           point: function(x, y) {
19943             x = +x, y = +y;
19944             switch (this._point) {
19945               case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;
19946               case 1: this._point = 2; // proceed
19947               default: this._context.lineTo(x, y); break;
19948             }
19949           }
19950         };
19951
19952         function curveLinear(context) {
19953           return new Linear(context);
19954         }
19955
19956         function x$3(p) {
19957           return p[0];
19958         }
19959
19960         function y$3(p) {
19961           return p[1];
19962         }
19963
19964         function line() {
19965           var x = x$3,
19966               y = y$3,
19967               defined = constant$b(true),
19968               context = null,
19969               curve = curveLinear,
19970               output = null;
19971
19972           function line(data) {
19973             var i,
19974                 n = data.length,
19975                 d,
19976                 defined0 = false,
19977                 buffer;
19978
19979             if (context == null) output = curve(buffer = path());
19980
19981             for (i = 0; i <= n; ++i) {
19982               if (!(i < n && defined(d = data[i], i, data)) === defined0) {
19983                 if (defined0 = !defined0) output.lineStart();
19984                 else output.lineEnd();
19985               }
19986               if (defined0) output.point(+x(d, i, data), +y(d, i, data));
19987             }
19988
19989             if (buffer) return output = null, buffer + "" || null;
19990           }
19991
19992           line.x = function(_) {
19993             return arguments.length ? (x = typeof _ === "function" ? _ : constant$b(+_), line) : x;
19994           };
19995
19996           line.y = function(_) {
19997             return arguments.length ? (y = typeof _ === "function" ? _ : constant$b(+_), line) : y;
19998           };
19999
20000           line.defined = function(_) {
20001             return arguments.length ? (defined = typeof _ === "function" ? _ : constant$b(!!_), line) : defined;
20002           };
20003
20004           line.curve = function(_) {
20005             return arguments.length ? (curve = _, context != null && (output = curve(context)), line) : curve;
20006           };
20007
20008           line.context = function(_) {
20009             return arguments.length ? (_ == null ? context = output = null : output = curve(context = _), line) : context;
20010           };
20011
20012           return line;
20013         }
20014
20015         function area$1() {
20016           var x0 = x$3,
20017               x1 = null,
20018               y0 = constant$b(0),
20019               y1 = y$3,
20020               defined = constant$b(true),
20021               context = null,
20022               curve = curveLinear,
20023               output = null;
20024
20025           function area(data) {
20026             var i,
20027                 j,
20028                 k,
20029                 n = data.length,
20030                 d,
20031                 defined0 = false,
20032                 buffer,
20033                 x0z = new Array(n),
20034                 y0z = new Array(n);
20035
20036             if (context == null) output = curve(buffer = path());
20037
20038             for (i = 0; i <= n; ++i) {
20039               if (!(i < n && defined(d = data[i], i, data)) === defined0) {
20040                 if (defined0 = !defined0) {
20041                   j = i;
20042                   output.areaStart();
20043                   output.lineStart();
20044                 } else {
20045                   output.lineEnd();
20046                   output.lineStart();
20047                   for (k = i - 1; k >= j; --k) {
20048                     output.point(x0z[k], y0z[k]);
20049                   }
20050                   output.lineEnd();
20051                   output.areaEnd();
20052                 }
20053               }
20054               if (defined0) {
20055                 x0z[i] = +x0(d, i, data), y0z[i] = +y0(d, i, data);
20056                 output.point(x1 ? +x1(d, i, data) : x0z[i], y1 ? +y1(d, i, data) : y0z[i]);
20057               }
20058             }
20059
20060             if (buffer) return output = null, buffer + "" || null;
20061           }
20062
20063           function arealine() {
20064             return line().defined(defined).curve(curve).context(context);
20065           }
20066
20067           area.x = function(_) {
20068             return arguments.length ? (x0 = typeof _ === "function" ? _ : constant$b(+_), x1 = null, area) : x0;
20069           };
20070
20071           area.x0 = function(_) {
20072             return arguments.length ? (x0 = typeof _ === "function" ? _ : constant$b(+_), area) : x0;
20073           };
20074
20075           area.x1 = function(_) {
20076             return arguments.length ? (x1 = _ == null ? null : typeof _ === "function" ? _ : constant$b(+_), area) : x1;
20077           };
20078
20079           area.y = function(_) {
20080             return arguments.length ? (y0 = typeof _ === "function" ? _ : constant$b(+_), y1 = null, area) : y0;
20081           };
20082
20083           area.y0 = function(_) {
20084             return arguments.length ? (y0 = typeof _ === "function" ? _ : constant$b(+_), area) : y0;
20085           };
20086
20087           area.y1 = function(_) {
20088             return arguments.length ? (y1 = _ == null ? null : typeof _ === "function" ? _ : constant$b(+_), area) : y1;
20089           };
20090
20091           area.lineX0 =
20092           area.lineY0 = function() {
20093             return arealine().x(x0).y(y0);
20094           };
20095
20096           area.lineY1 = function() {
20097             return arealine().x(x0).y(y1);
20098           };
20099
20100           area.lineX1 = function() {
20101             return arealine().x(x1).y(y0);
20102           };
20103
20104           area.defined = function(_) {
20105             return arguments.length ? (defined = typeof _ === "function" ? _ : constant$b(!!_), area) : defined;
20106           };
20107
20108           area.curve = function(_) {
20109             return arguments.length ? (curve = _, context != null && (output = curve(context)), area) : curve;
20110           };
20111
20112           area.context = function(_) {
20113             return arguments.length ? (_ == null ? context = output = null : output = curve(context = _), area) : context;
20114           };
20115
20116           return area;
20117         }
20118
20119         function descending(a, b) {
20120           return b < a ? -1 : b > a ? 1 : b >= a ? 0 : NaN;
20121         }
20122
20123         function identity$7(d) {
20124           return d;
20125         }
20126
20127         function pie() {
20128           var value = identity$7,
20129               sortValues = descending,
20130               sort = null,
20131               startAngle = constant$b(0),
20132               endAngle = constant$b(tau$4),
20133               padAngle = constant$b(0);
20134
20135           function pie(data) {
20136             var i,
20137                 n = data.length,
20138                 j,
20139                 k,
20140                 sum = 0,
20141                 index = new Array(n),
20142                 arcs = new Array(n),
20143                 a0 = +startAngle.apply(this, arguments),
20144                 da = Math.min(tau$4, Math.max(-tau$4, endAngle.apply(this, arguments) - a0)),
20145                 a1,
20146                 p = Math.min(Math.abs(da) / n, padAngle.apply(this, arguments)),
20147                 pa = p * (da < 0 ? -1 : 1),
20148                 v;
20149
20150             for (i = 0; i < n; ++i) {
20151               if ((v = arcs[index[i] = i] = +value(data[i], i, data)) > 0) {
20152                 sum += v;
20153               }
20154             }
20155
20156             // Optionally sort the arcs by previously-computed values or by data.
20157             if (sortValues != null) index.sort(function(i, j) { return sortValues(arcs[i], arcs[j]); });
20158             else if (sort != null) index.sort(function(i, j) { return sort(data[i], data[j]); });
20159
20160             // Compute the arcs! They are stored in the original data's order.
20161             for (i = 0, k = sum ? (da - n * pa) / sum : 0; i < n; ++i, a0 = a1) {
20162               j = index[i], v = arcs[j], a1 = a0 + (v > 0 ? v * k : 0) + pa, arcs[j] = {
20163                 data: data[j],
20164                 index: i,
20165                 value: v,
20166                 startAngle: a0,
20167                 endAngle: a1,
20168                 padAngle: p
20169               };
20170             }
20171
20172             return arcs;
20173           }
20174
20175           pie.value = function(_) {
20176             return arguments.length ? (value = typeof _ === "function" ? _ : constant$b(+_), pie) : value;
20177           };
20178
20179           pie.sortValues = function(_) {
20180             return arguments.length ? (sortValues = _, sort = null, pie) : sortValues;
20181           };
20182
20183           pie.sort = function(_) {
20184             return arguments.length ? (sort = _, sortValues = null, pie) : sort;
20185           };
20186
20187           pie.startAngle = function(_) {
20188             return arguments.length ? (startAngle = typeof _ === "function" ? _ : constant$b(+_), pie) : startAngle;
20189           };
20190
20191           pie.endAngle = function(_) {
20192             return arguments.length ? (endAngle = typeof _ === "function" ? _ : constant$b(+_), pie) : endAngle;
20193           };
20194
20195           pie.padAngle = function(_) {
20196             return arguments.length ? (padAngle = typeof _ === "function" ? _ : constant$b(+_), pie) : padAngle;
20197           };
20198
20199           return pie;
20200         }
20201
20202         var curveRadialLinear = curveRadial(curveLinear);
20203
20204         function Radial(curve) {
20205           this._curve = curve;
20206         }
20207
20208         Radial.prototype = {
20209           areaStart: function() {
20210             this._curve.areaStart();
20211           },
20212           areaEnd: function() {
20213             this._curve.areaEnd();
20214           },
20215           lineStart: function() {
20216             this._curve.lineStart();
20217           },
20218           lineEnd: function() {
20219             this._curve.lineEnd();
20220           },
20221           point: function(a, r) {
20222             this._curve.point(r * Math.sin(a), r * -Math.cos(a));
20223           }
20224         };
20225
20226         function curveRadial(curve) {
20227
20228           function radial(context) {
20229             return new Radial(curve(context));
20230           }
20231
20232           radial._curve = curve;
20233
20234           return radial;
20235         }
20236
20237         function lineRadial(l) {
20238           var c = l.curve;
20239
20240           l.angle = l.x, delete l.x;
20241           l.radius = l.y, delete l.y;
20242
20243           l.curve = function(_) {
20244             return arguments.length ? c(curveRadial(_)) : c()._curve;
20245           };
20246
20247           return l;
20248         }
20249
20250         function lineRadial$1() {
20251           return lineRadial(line().curve(curveRadialLinear));
20252         }
20253
20254         function areaRadial() {
20255           var a = area$1().curve(curveRadialLinear),
20256               c = a.curve,
20257               x0 = a.lineX0,
20258               x1 = a.lineX1,
20259               y0 = a.lineY0,
20260               y1 = a.lineY1;
20261
20262           a.angle = a.x, delete a.x;
20263           a.startAngle = a.x0, delete a.x0;
20264           a.endAngle = a.x1, delete a.x1;
20265           a.radius = a.y, delete a.y;
20266           a.innerRadius = a.y0, delete a.y0;
20267           a.outerRadius = a.y1, delete a.y1;
20268           a.lineStartAngle = function() { return lineRadial(x0()); }, delete a.lineX0;
20269           a.lineEndAngle = function() { return lineRadial(x1()); }, delete a.lineX1;
20270           a.lineInnerRadius = function() { return lineRadial(y0()); }, delete a.lineY0;
20271           a.lineOuterRadius = function() { return lineRadial(y1()); }, delete a.lineY1;
20272
20273           a.curve = function(_) {
20274             return arguments.length ? c(curveRadial(_)) : c()._curve;
20275           };
20276
20277           return a;
20278         }
20279
20280         function pointRadial(x, y) {
20281           return [(y = +y) * Math.cos(x -= Math.PI / 2), y * Math.sin(x)];
20282         }
20283
20284         var slice$a = Array.prototype.slice;
20285
20286         function linkSource(d) {
20287           return d.source;
20288         }
20289
20290         function linkTarget(d) {
20291           return d.target;
20292         }
20293
20294         function link$2(curve) {
20295           var source = linkSource,
20296               target = linkTarget,
20297               x = x$3,
20298               y = y$3,
20299               context = null;
20300
20301           function link() {
20302             var buffer, argv = slice$a.call(arguments), s = source.apply(this, argv), t = target.apply(this, argv);
20303             if (!context) context = buffer = path();
20304             curve(context, +x.apply(this, (argv[0] = s, argv)), +y.apply(this, argv), +x.apply(this, (argv[0] = t, argv)), +y.apply(this, argv));
20305             if (buffer) return context = null, buffer + "" || null;
20306           }
20307
20308           link.source = function(_) {
20309             return arguments.length ? (source = _, link) : source;
20310           };
20311
20312           link.target = function(_) {
20313             return arguments.length ? (target = _, link) : target;
20314           };
20315
20316           link.x = function(_) {
20317             return arguments.length ? (x = typeof _ === "function" ? _ : constant$b(+_), link) : x;
20318           };
20319
20320           link.y = function(_) {
20321             return arguments.length ? (y = typeof _ === "function" ? _ : constant$b(+_), link) : y;
20322           };
20323
20324           link.context = function(_) {
20325             return arguments.length ? ((context = _ == null ? null : _), link) : context;
20326           };
20327
20328           return link;
20329         }
20330
20331         function curveHorizontal(context, x0, y0, x1, y1) {
20332           context.moveTo(x0, y0);
20333           context.bezierCurveTo(x0 = (x0 + x1) / 2, y0, x0, y1, x1, y1);
20334         }
20335
20336         function curveVertical(context, x0, y0, x1, y1) {
20337           context.moveTo(x0, y0);
20338           context.bezierCurveTo(x0, y0 = (y0 + y1) / 2, x1, y0, x1, y1);
20339         }
20340
20341         function curveRadial$1(context, x0, y0, x1, y1) {
20342           var p0 = pointRadial(x0, y0),
20343               p1 = pointRadial(x0, y0 = (y0 + y1) / 2),
20344               p2 = pointRadial(x1, y0),
20345               p3 = pointRadial(x1, y1);
20346           context.moveTo(p0[0], p0[1]);
20347           context.bezierCurveTo(p1[0], p1[1], p2[0], p2[1], p3[0], p3[1]);
20348         }
20349
20350         function linkHorizontal() {
20351           return link$2(curveHorizontal);
20352         }
20353
20354         function linkVertical() {
20355           return link$2(curveVertical);
20356         }
20357
20358         function linkRadial() {
20359           var l = link$2(curveRadial$1);
20360           l.angle = l.x, delete l.x;
20361           l.radius = l.y, delete l.y;
20362           return l;
20363         }
20364
20365         var circle$2 = {
20366           draw: function(context, size) {
20367             var r = Math.sqrt(size / pi$4);
20368             context.moveTo(r, 0);
20369             context.arc(0, 0, r, 0, tau$4);
20370           }
20371         };
20372
20373         var cross$2 = {
20374           draw: function(context, size) {
20375             var r = Math.sqrt(size / 5) / 2;
20376             context.moveTo(-3 * r, -r);
20377             context.lineTo(-r, -r);
20378             context.lineTo(-r, -3 * r);
20379             context.lineTo(r, -3 * r);
20380             context.lineTo(r, -r);
20381             context.lineTo(3 * r, -r);
20382             context.lineTo(3 * r, r);
20383             context.lineTo(r, r);
20384             context.lineTo(r, 3 * r);
20385             context.lineTo(-r, 3 * r);
20386             context.lineTo(-r, r);
20387             context.lineTo(-3 * r, r);
20388             context.closePath();
20389           }
20390         };
20391
20392         var tan30 = Math.sqrt(1 / 3),
20393             tan30_2 = tan30 * 2;
20394
20395         var diamond = {
20396           draw: function(context, size) {
20397             var y = Math.sqrt(size / tan30_2),
20398                 x = y * tan30;
20399             context.moveTo(0, -y);
20400             context.lineTo(x, 0);
20401             context.lineTo(0, y);
20402             context.lineTo(-x, 0);
20403             context.closePath();
20404           }
20405         };
20406
20407         var ka = 0.89081309152928522810,
20408             kr = Math.sin(pi$4 / 10) / Math.sin(7 * pi$4 / 10),
20409             kx = Math.sin(tau$4 / 10) * kr,
20410             ky = -Math.cos(tau$4 / 10) * kr;
20411
20412         var star = {
20413           draw: function(context, size) {
20414             var r = Math.sqrt(size * ka),
20415                 x = kx * r,
20416                 y = ky * r;
20417             context.moveTo(0, -r);
20418             context.lineTo(x, y);
20419             for (var i = 1; i < 5; ++i) {
20420               var a = tau$4 * i / 5,
20421                   c = Math.cos(a),
20422                   s = Math.sin(a);
20423               context.lineTo(s * r, -c * r);
20424               context.lineTo(c * x - s * y, s * x + c * y);
20425             }
20426             context.closePath();
20427           }
20428         };
20429
20430         var square = {
20431           draw: function(context, size) {
20432             var w = Math.sqrt(size),
20433                 x = -w / 2;
20434             context.rect(x, x, w, w);
20435           }
20436         };
20437
20438         var sqrt3 = Math.sqrt(3);
20439
20440         var triangle = {
20441           draw: function(context, size) {
20442             var y = -Math.sqrt(size / (sqrt3 * 3));
20443             context.moveTo(0, y * 2);
20444             context.lineTo(-sqrt3 * y, -y);
20445             context.lineTo(sqrt3 * y, -y);
20446             context.closePath();
20447           }
20448         };
20449
20450         var c$2 = -0.5,
20451             s = Math.sqrt(3) / 2,
20452             k = 1 / Math.sqrt(12),
20453             a = (k / 2 + 1) * 3;
20454
20455         var wye = {
20456           draw: function(context, size) {
20457             var r = Math.sqrt(size / a),
20458                 x0 = r / 2,
20459                 y0 = r * k,
20460                 x1 = x0,
20461                 y1 = r * k + r,
20462                 x2 = -x1,
20463                 y2 = y1;
20464             context.moveTo(x0, y0);
20465             context.lineTo(x1, y1);
20466             context.lineTo(x2, y2);
20467             context.lineTo(c$2 * x0 - s * y0, s * x0 + c$2 * y0);
20468             context.lineTo(c$2 * x1 - s * y1, s * x1 + c$2 * y1);
20469             context.lineTo(c$2 * x2 - s * y2, s * x2 + c$2 * y2);
20470             context.lineTo(c$2 * x0 + s * y0, c$2 * y0 - s * x0);
20471             context.lineTo(c$2 * x1 + s * y1, c$2 * y1 - s * x1);
20472             context.lineTo(c$2 * x2 + s * y2, c$2 * y2 - s * x2);
20473             context.closePath();
20474           }
20475         };
20476
20477         var symbols = [
20478           circle$2,
20479           cross$2,
20480           diamond,
20481           square,
20482           star,
20483           triangle,
20484           wye
20485         ];
20486
20487         function symbol() {
20488           var type = constant$b(circle$2),
20489               size = constant$b(64),
20490               context = null;
20491
20492           function symbol() {
20493             var buffer;
20494             if (!context) context = buffer = path();
20495             type.apply(this, arguments).draw(context, +size.apply(this, arguments));
20496             if (buffer) return context = null, buffer + "" || null;
20497           }
20498
20499           symbol.type = function(_) {
20500             return arguments.length ? (type = typeof _ === "function" ? _ : constant$b(_), symbol) : type;
20501           };
20502
20503           symbol.size = function(_) {
20504             return arguments.length ? (size = typeof _ === "function" ? _ : constant$b(+_), symbol) : size;
20505           };
20506
20507           symbol.context = function(_) {
20508             return arguments.length ? (context = _ == null ? null : _, symbol) : context;
20509           };
20510
20511           return symbol;
20512         }
20513
20514         function noop$5() {}
20515
20516         function point$2(that, x, y) {
20517           that._context.bezierCurveTo(
20518             (2 * that._x0 + that._x1) / 3,
20519             (2 * that._y0 + that._y1) / 3,
20520             (that._x0 + 2 * that._x1) / 3,
20521             (that._y0 + 2 * that._y1) / 3,
20522             (that._x0 + 4 * that._x1 + x) / 6,
20523             (that._y0 + 4 * that._y1 + y) / 6
20524           );
20525         }
20526
20527         function Basis(context) {
20528           this._context = context;
20529         }
20530
20531         Basis.prototype = {
20532           areaStart: function() {
20533             this._line = 0;
20534           },
20535           areaEnd: function() {
20536             this._line = NaN;
20537           },
20538           lineStart: function() {
20539             this._x0 = this._x1 =
20540             this._y0 = this._y1 = NaN;
20541             this._point = 0;
20542           },
20543           lineEnd: function() {
20544             switch (this._point) {
20545               case 3: point$2(this, this._x1, this._y1); // proceed
20546               case 2: this._context.lineTo(this._x1, this._y1); break;
20547             }
20548             if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();
20549             this._line = 1 - this._line;
20550           },
20551           point: function(x, y) {
20552             x = +x, y = +y;
20553             switch (this._point) {
20554               case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;
20555               case 1: this._point = 2; break;
20556               case 2: this._point = 3; this._context.lineTo((5 * this._x0 + this._x1) / 6, (5 * this._y0 + this._y1) / 6); // proceed
20557               default: point$2(this, x, y); break;
20558             }
20559             this._x0 = this._x1, this._x1 = x;
20560             this._y0 = this._y1, this._y1 = y;
20561           }
20562         };
20563
20564         function basis$2(context) {
20565           return new Basis(context);
20566         }
20567
20568         function BasisClosed(context) {
20569           this._context = context;
20570         }
20571
20572         BasisClosed.prototype = {
20573           areaStart: noop$5,
20574           areaEnd: noop$5,
20575           lineStart: function() {
20576             this._x0 = this._x1 = this._x2 = this._x3 = this._x4 =
20577             this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = NaN;
20578             this._point = 0;
20579           },
20580           lineEnd: function() {
20581             switch (this._point) {
20582               case 1: {
20583                 this._context.moveTo(this._x2, this._y2);
20584                 this._context.closePath();
20585                 break;
20586               }
20587               case 2: {
20588                 this._context.moveTo((this._x2 + 2 * this._x3) / 3, (this._y2 + 2 * this._y3) / 3);
20589                 this._context.lineTo((this._x3 + 2 * this._x2) / 3, (this._y3 + 2 * this._y2) / 3);
20590                 this._context.closePath();
20591                 break;
20592               }
20593               case 3: {
20594                 this.point(this._x2, this._y2);
20595                 this.point(this._x3, this._y3);
20596                 this.point(this._x4, this._y4);
20597                 break;
20598               }
20599             }
20600           },
20601           point: function(x, y) {
20602             x = +x, y = +y;
20603             switch (this._point) {
20604               case 0: this._point = 1; this._x2 = x, this._y2 = y; break;
20605               case 1: this._point = 2; this._x3 = x, this._y3 = y; break;
20606               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;
20607               default: point$2(this, x, y); break;
20608             }
20609             this._x0 = this._x1, this._x1 = x;
20610             this._y0 = this._y1, this._y1 = y;
20611           }
20612         };
20613
20614         function basisClosed$1(context) {
20615           return new BasisClosed(context);
20616         }
20617
20618         function BasisOpen(context) {
20619           this._context = context;
20620         }
20621
20622         BasisOpen.prototype = {
20623           areaStart: function() {
20624             this._line = 0;
20625           },
20626           areaEnd: function() {
20627             this._line = NaN;
20628           },
20629           lineStart: function() {
20630             this._x0 = this._x1 =
20631             this._y0 = this._y1 = NaN;
20632             this._point = 0;
20633           },
20634           lineEnd: function() {
20635             if (this._line || (this._line !== 0 && this._point === 3)) this._context.closePath();
20636             this._line = 1 - this._line;
20637           },
20638           point: function(x, y) {
20639             x = +x, y = +y;
20640             switch (this._point) {
20641               case 0: this._point = 1; break;
20642               case 1: this._point = 2; break;
20643               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;
20644               case 3: this._point = 4; // proceed
20645               default: point$2(this, x, y); break;
20646             }
20647             this._x0 = this._x1, this._x1 = x;
20648             this._y0 = this._y1, this._y1 = y;
20649           }
20650         };
20651
20652         function basisOpen(context) {
20653           return new BasisOpen(context);
20654         }
20655
20656         function Bundle(context, beta) {
20657           this._basis = new Basis(context);
20658           this._beta = beta;
20659         }
20660
20661         Bundle.prototype = {
20662           lineStart: function() {
20663             this._x = [];
20664             this._y = [];
20665             this._basis.lineStart();
20666           },
20667           lineEnd: function() {
20668             var x = this._x,
20669                 y = this._y,
20670                 j = x.length - 1;
20671
20672             if (j > 0) {
20673               var x0 = x[0],
20674                   y0 = y[0],
20675                   dx = x[j] - x0,
20676                   dy = y[j] - y0,
20677                   i = -1,
20678                   t;
20679
20680               while (++i <= j) {
20681                 t = i / j;
20682                 this._basis.point(
20683                   this._beta * x[i] + (1 - this._beta) * (x0 + t * dx),
20684                   this._beta * y[i] + (1 - this._beta) * (y0 + t * dy)
20685                 );
20686               }
20687             }
20688
20689             this._x = this._y = null;
20690             this._basis.lineEnd();
20691           },
20692           point: function(x, y) {
20693             this._x.push(+x);
20694             this._y.push(+y);
20695           }
20696         };
20697
20698         var bundle = (function custom(beta) {
20699
20700           function bundle(context) {
20701             return beta === 1 ? new Basis(context) : new Bundle(context, beta);
20702           }
20703
20704           bundle.beta = function(beta) {
20705             return custom(+beta);
20706           };
20707
20708           return bundle;
20709         })(0.85);
20710
20711         function point$3(that, x, y) {
20712           that._context.bezierCurveTo(
20713             that._x1 + that._k * (that._x2 - that._x0),
20714             that._y1 + that._k * (that._y2 - that._y0),
20715             that._x2 + that._k * (that._x1 - x),
20716             that._y2 + that._k * (that._y1 - y),
20717             that._x2,
20718             that._y2
20719           );
20720         }
20721
20722         function Cardinal(context, tension) {
20723           this._context = context;
20724           this._k = (1 - tension) / 6;
20725         }
20726
20727         Cardinal.prototype = {
20728           areaStart: function() {
20729             this._line = 0;
20730           },
20731           areaEnd: function() {
20732             this._line = NaN;
20733           },
20734           lineStart: function() {
20735             this._x0 = this._x1 = this._x2 =
20736             this._y0 = this._y1 = this._y2 = NaN;
20737             this._point = 0;
20738           },
20739           lineEnd: function() {
20740             switch (this._point) {
20741               case 2: this._context.lineTo(this._x2, this._y2); break;
20742               case 3: point$3(this, this._x1, this._y1); break;
20743             }
20744             if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();
20745             this._line = 1 - this._line;
20746           },
20747           point: function(x, y) {
20748             x = +x, y = +y;
20749             switch (this._point) {
20750               case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;
20751               case 1: this._point = 2; this._x1 = x, this._y1 = y; break;
20752               case 2: this._point = 3; // proceed
20753               default: point$3(this, x, y); break;
20754             }
20755             this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;
20756             this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;
20757           }
20758         };
20759
20760         var cardinal = (function custom(tension) {
20761
20762           function cardinal(context) {
20763             return new Cardinal(context, tension);
20764           }
20765
20766           cardinal.tension = function(tension) {
20767             return custom(+tension);
20768           };
20769
20770           return cardinal;
20771         })(0);
20772
20773         function CardinalClosed(context, tension) {
20774           this._context = context;
20775           this._k = (1 - tension) / 6;
20776         }
20777
20778         CardinalClosed.prototype = {
20779           areaStart: noop$5,
20780           areaEnd: noop$5,
20781           lineStart: function() {
20782             this._x0 = this._x1 = this._x2 = this._x3 = this._x4 = this._x5 =
20783             this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = this._y5 = NaN;
20784             this._point = 0;
20785           },
20786           lineEnd: function() {
20787             switch (this._point) {
20788               case 1: {
20789                 this._context.moveTo(this._x3, this._y3);
20790                 this._context.closePath();
20791                 break;
20792               }
20793               case 2: {
20794                 this._context.lineTo(this._x3, this._y3);
20795                 this._context.closePath();
20796                 break;
20797               }
20798               case 3: {
20799                 this.point(this._x3, this._y3);
20800                 this.point(this._x4, this._y4);
20801                 this.point(this._x5, this._y5);
20802                 break;
20803               }
20804             }
20805           },
20806           point: function(x, y) {
20807             x = +x, y = +y;
20808             switch (this._point) {
20809               case 0: this._point = 1; this._x3 = x, this._y3 = y; break;
20810               case 1: this._point = 2; this._context.moveTo(this._x4 = x, this._y4 = y); break;
20811               case 2: this._point = 3; this._x5 = x, this._y5 = y; break;
20812               default: point$3(this, x, y); break;
20813             }
20814             this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;
20815             this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;
20816           }
20817         };
20818
20819         var cardinalClosed = (function custom(tension) {
20820
20821           function cardinal(context) {
20822             return new CardinalClosed(context, tension);
20823           }
20824
20825           cardinal.tension = function(tension) {
20826             return custom(+tension);
20827           };
20828
20829           return cardinal;
20830         })(0);
20831
20832         function CardinalOpen(context, tension) {
20833           this._context = context;
20834           this._k = (1 - tension) / 6;
20835         }
20836
20837         CardinalOpen.prototype = {
20838           areaStart: function() {
20839             this._line = 0;
20840           },
20841           areaEnd: function() {
20842             this._line = NaN;
20843           },
20844           lineStart: function() {
20845             this._x0 = this._x1 = this._x2 =
20846             this._y0 = this._y1 = this._y2 = NaN;
20847             this._point = 0;
20848           },
20849           lineEnd: function() {
20850             if (this._line || (this._line !== 0 && this._point === 3)) this._context.closePath();
20851             this._line = 1 - this._line;
20852           },
20853           point: function(x, y) {
20854             x = +x, y = +y;
20855             switch (this._point) {
20856               case 0: this._point = 1; break;
20857               case 1: this._point = 2; break;
20858               case 2: this._point = 3; this._line ? this._context.lineTo(this._x2, this._y2) : this._context.moveTo(this._x2, this._y2); break;
20859               case 3: this._point = 4; // proceed
20860               default: point$3(this, x, y); break;
20861             }
20862             this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;
20863             this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;
20864           }
20865         };
20866
20867         var cardinalOpen = (function custom(tension) {
20868
20869           function cardinal(context) {
20870             return new CardinalOpen(context, tension);
20871           }
20872
20873           cardinal.tension = function(tension) {
20874             return custom(+tension);
20875           };
20876
20877           return cardinal;
20878         })(0);
20879
20880         function point$4(that, x, y) {
20881           var x1 = that._x1,
20882               y1 = that._y1,
20883               x2 = that._x2,
20884               y2 = that._y2;
20885
20886           if (that._l01_a > epsilon$3) {
20887             var a = 2 * that._l01_2a + 3 * that._l01_a * that._l12_a + that._l12_2a,
20888                 n = 3 * that._l01_a * (that._l01_a + that._l12_a);
20889             x1 = (x1 * a - that._x0 * that._l12_2a + that._x2 * that._l01_2a) / n;
20890             y1 = (y1 * a - that._y0 * that._l12_2a + that._y2 * that._l01_2a) / n;
20891           }
20892
20893           if (that._l23_a > epsilon$3) {
20894             var b = 2 * that._l23_2a + 3 * that._l23_a * that._l12_a + that._l12_2a,
20895                 m = 3 * that._l23_a * (that._l23_a + that._l12_a);
20896             x2 = (x2 * b + that._x1 * that._l23_2a - x * that._l12_2a) / m;
20897             y2 = (y2 * b + that._y1 * that._l23_2a - y * that._l12_2a) / m;
20898           }
20899
20900           that._context.bezierCurveTo(x1, y1, x2, y2, that._x2, that._y2);
20901         }
20902
20903         function CatmullRom(context, alpha) {
20904           this._context = context;
20905           this._alpha = alpha;
20906         }
20907
20908         CatmullRom.prototype = {
20909           areaStart: function() {
20910             this._line = 0;
20911           },
20912           areaEnd: function() {
20913             this._line = NaN;
20914           },
20915           lineStart: function() {
20916             this._x0 = this._x1 = this._x2 =
20917             this._y0 = this._y1 = this._y2 = NaN;
20918             this._l01_a = this._l12_a = this._l23_a =
20919             this._l01_2a = this._l12_2a = this._l23_2a =
20920             this._point = 0;
20921           },
20922           lineEnd: function() {
20923             switch (this._point) {
20924               case 2: this._context.lineTo(this._x2, this._y2); break;
20925               case 3: this.point(this._x2, this._y2); break;
20926             }
20927             if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();
20928             this._line = 1 - this._line;
20929           },
20930           point: function(x, y) {
20931             x = +x, y = +y;
20932
20933             if (this._point) {
20934               var x23 = this._x2 - x,
20935                   y23 = this._y2 - y;
20936               this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha));
20937             }
20938
20939             switch (this._point) {
20940               case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;
20941               case 1: this._point = 2; break;
20942               case 2: this._point = 3; // proceed
20943               default: point$4(this, x, y); break;
20944             }
20945
20946             this._l01_a = this._l12_a, this._l12_a = this._l23_a;
20947             this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a;
20948             this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;
20949             this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;
20950           }
20951         };
20952
20953         var catmullRom = (function custom(alpha) {
20954
20955           function catmullRom(context) {
20956             return alpha ? new CatmullRom(context, alpha) : new Cardinal(context, 0);
20957           }
20958
20959           catmullRom.alpha = function(alpha) {
20960             return custom(+alpha);
20961           };
20962
20963           return catmullRom;
20964         })(0.5);
20965
20966         function CatmullRomClosed(context, alpha) {
20967           this._context = context;
20968           this._alpha = alpha;
20969         }
20970
20971         CatmullRomClosed.prototype = {
20972           areaStart: noop$5,
20973           areaEnd: noop$5,
20974           lineStart: function() {
20975             this._x0 = this._x1 = this._x2 = this._x3 = this._x4 = this._x5 =
20976             this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = this._y5 = NaN;
20977             this._l01_a = this._l12_a = this._l23_a =
20978             this._l01_2a = this._l12_2a = this._l23_2a =
20979             this._point = 0;
20980           },
20981           lineEnd: function() {
20982             switch (this._point) {
20983               case 1: {
20984                 this._context.moveTo(this._x3, this._y3);
20985                 this._context.closePath();
20986                 break;
20987               }
20988               case 2: {
20989                 this._context.lineTo(this._x3, this._y3);
20990                 this._context.closePath();
20991                 break;
20992               }
20993               case 3: {
20994                 this.point(this._x3, this._y3);
20995                 this.point(this._x4, this._y4);
20996                 this.point(this._x5, this._y5);
20997                 break;
20998               }
20999             }
21000           },
21001           point: function(x, y) {
21002             x = +x, y = +y;
21003
21004             if (this._point) {
21005               var x23 = this._x2 - x,
21006                   y23 = this._y2 - y;
21007               this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha));
21008             }
21009
21010             switch (this._point) {
21011               case 0: this._point = 1; this._x3 = x, this._y3 = y; break;
21012               case 1: this._point = 2; this._context.moveTo(this._x4 = x, this._y4 = y); break;
21013               case 2: this._point = 3; this._x5 = x, this._y5 = y; break;
21014               default: point$4(this, x, y); break;
21015             }
21016
21017             this._l01_a = this._l12_a, this._l12_a = this._l23_a;
21018             this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a;
21019             this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;
21020             this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;
21021           }
21022         };
21023
21024         var catmullRomClosed = (function custom(alpha) {
21025
21026           function catmullRom(context) {
21027             return alpha ? new CatmullRomClosed(context, alpha) : new CardinalClosed(context, 0);
21028           }
21029
21030           catmullRom.alpha = function(alpha) {
21031             return custom(+alpha);
21032           };
21033
21034           return catmullRom;
21035         })(0.5);
21036
21037         function CatmullRomOpen(context, alpha) {
21038           this._context = context;
21039           this._alpha = alpha;
21040         }
21041
21042         CatmullRomOpen.prototype = {
21043           areaStart: function() {
21044             this._line = 0;
21045           },
21046           areaEnd: function() {
21047             this._line = NaN;
21048           },
21049           lineStart: function() {
21050             this._x0 = this._x1 = this._x2 =
21051             this._y0 = this._y1 = this._y2 = NaN;
21052             this._l01_a = this._l12_a = this._l23_a =
21053             this._l01_2a = this._l12_2a = this._l23_2a =
21054             this._point = 0;
21055           },
21056           lineEnd: function() {
21057             if (this._line || (this._line !== 0 && this._point === 3)) this._context.closePath();
21058             this._line = 1 - this._line;
21059           },
21060           point: function(x, y) {
21061             x = +x, y = +y;
21062
21063             if (this._point) {
21064               var x23 = this._x2 - x,
21065                   y23 = this._y2 - y;
21066               this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha));
21067             }
21068
21069             switch (this._point) {
21070               case 0: this._point = 1; break;
21071               case 1: this._point = 2; break;
21072               case 2: this._point = 3; this._line ? this._context.lineTo(this._x2, this._y2) : this._context.moveTo(this._x2, this._y2); break;
21073               case 3: this._point = 4; // proceed
21074               default: point$4(this, x, y); break;
21075             }
21076
21077             this._l01_a = this._l12_a, this._l12_a = this._l23_a;
21078             this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a;
21079             this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;
21080             this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;
21081           }
21082         };
21083
21084         var catmullRomOpen = (function custom(alpha) {
21085
21086           function catmullRom(context) {
21087             return alpha ? new CatmullRomOpen(context, alpha) : new CardinalOpen(context, 0);
21088           }
21089
21090           catmullRom.alpha = function(alpha) {
21091             return custom(+alpha);
21092           };
21093
21094           return catmullRom;
21095         })(0.5);
21096
21097         function LinearClosed(context) {
21098           this._context = context;
21099         }
21100
21101         LinearClosed.prototype = {
21102           areaStart: noop$5,
21103           areaEnd: noop$5,
21104           lineStart: function() {
21105             this._point = 0;
21106           },
21107           lineEnd: function() {
21108             if (this._point) this._context.closePath();
21109           },
21110           point: function(x, y) {
21111             x = +x, y = +y;
21112             if (this._point) this._context.lineTo(x, y);
21113             else this._point = 1, this._context.moveTo(x, y);
21114           }
21115         };
21116
21117         function linearClosed(context) {
21118           return new LinearClosed(context);
21119         }
21120
21121         function sign$3(x) {
21122           return x < 0 ? -1 : 1;
21123         }
21124
21125         // Calculate the slopes of the tangents (Hermite-type interpolation) based on
21126         // the following paper: Steffen, M. 1990. A Simple Method for Monotonic
21127         // Interpolation in One Dimension. Astronomy and Astrophysics, Vol. 239, NO.
21128         // NOV(II), P. 443, 1990.
21129         function slope3(that, x2, y2) {
21130           var h0 = that._x1 - that._x0,
21131               h1 = x2 - that._x1,
21132               s0 = (that._y1 - that._y0) / (h0 || h1 < 0 && -0),
21133               s1 = (y2 - that._y1) / (h1 || h0 < 0 && -0),
21134               p = (s0 * h1 + s1 * h0) / (h0 + h1);
21135           return (sign$3(s0) + sign$3(s1)) * Math.min(Math.abs(s0), Math.abs(s1), 0.5 * Math.abs(p)) || 0;
21136         }
21137
21138         // Calculate a one-sided slope.
21139         function slope2(that, t) {
21140           var h = that._x1 - that._x0;
21141           return h ? (3 * (that._y1 - that._y0) / h - t) / 2 : t;
21142         }
21143
21144         // According to https://en.wikipedia.org/wiki/Cubic_Hermite_spline#Representations
21145         // "you can express cubic Hermite interpolation in terms of cubic Bézier curves
21146         // with respect to the four values p0, p0 + m0 / 3, p1 - m1 / 3, p1".
21147         function point$5(that, t0, t1) {
21148           var x0 = that._x0,
21149               y0 = that._y0,
21150               x1 = that._x1,
21151               y1 = that._y1,
21152               dx = (x1 - x0) / 3;
21153           that._context.bezierCurveTo(x0 + dx, y0 + dx * t0, x1 - dx, y1 - dx * t1, x1, y1);
21154         }
21155
21156         function MonotoneX(context) {
21157           this._context = context;
21158         }
21159
21160         MonotoneX.prototype = {
21161           areaStart: function() {
21162             this._line = 0;
21163           },
21164           areaEnd: function() {
21165             this._line = NaN;
21166           },
21167           lineStart: function() {
21168             this._x0 = this._x1 =
21169             this._y0 = this._y1 =
21170             this._t0 = NaN;
21171             this._point = 0;
21172           },
21173           lineEnd: function() {
21174             switch (this._point) {
21175               case 2: this._context.lineTo(this._x1, this._y1); break;
21176               case 3: point$5(this, this._t0, slope2(this, this._t0)); break;
21177             }
21178             if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();
21179             this._line = 1 - this._line;
21180           },
21181           point: function(x, y) {
21182             var t1 = NaN;
21183
21184             x = +x, y = +y;
21185             if (x === this._x1 && y === this._y1) return; // Ignore coincident points.
21186             switch (this._point) {
21187               case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;
21188               case 1: this._point = 2; break;
21189               case 2: this._point = 3; point$5(this, slope2(this, t1 = slope3(this, x, y)), t1); break;
21190               default: point$5(this, this._t0, t1 = slope3(this, x, y)); break;
21191             }
21192
21193             this._x0 = this._x1, this._x1 = x;
21194             this._y0 = this._y1, this._y1 = y;
21195             this._t0 = t1;
21196           }
21197         };
21198
21199         function MonotoneY(context) {
21200           this._context = new ReflectContext(context);
21201         }
21202
21203         (MonotoneY.prototype = Object.create(MonotoneX.prototype)).point = function(x, y) {
21204           MonotoneX.prototype.point.call(this, y, x);
21205         };
21206
21207         function ReflectContext(context) {
21208           this._context = context;
21209         }
21210
21211         ReflectContext.prototype = {
21212           moveTo: function(x, y) { this._context.moveTo(y, x); },
21213           closePath: function() { this._context.closePath(); },
21214           lineTo: function(x, y) { this._context.lineTo(y, x); },
21215           bezierCurveTo: function(x1, y1, x2, y2, x, y) { this._context.bezierCurveTo(y1, x1, y2, x2, y, x); }
21216         };
21217
21218         function monotoneX(context) {
21219           return new MonotoneX(context);
21220         }
21221
21222         function monotoneY(context) {
21223           return new MonotoneY(context);
21224         }
21225
21226         function Natural(context) {
21227           this._context = context;
21228         }
21229
21230         Natural.prototype = {
21231           areaStart: function() {
21232             this._line = 0;
21233           },
21234           areaEnd: function() {
21235             this._line = NaN;
21236           },
21237           lineStart: function() {
21238             this._x = [];
21239             this._y = [];
21240           },
21241           lineEnd: function() {
21242             var x = this._x,
21243                 y = this._y,
21244                 n = x.length;
21245
21246             if (n) {
21247               this._line ? this._context.lineTo(x[0], y[0]) : this._context.moveTo(x[0], y[0]);
21248               if (n === 2) {
21249                 this._context.lineTo(x[1], y[1]);
21250               } else {
21251                 var px = controlPoints(x),
21252                     py = controlPoints(y);
21253                 for (var i0 = 0, i1 = 1; i1 < n; ++i0, ++i1) {
21254                   this._context.bezierCurveTo(px[0][i0], py[0][i0], px[1][i0], py[1][i0], x[i1], y[i1]);
21255                 }
21256               }
21257             }
21258
21259             if (this._line || (this._line !== 0 && n === 1)) this._context.closePath();
21260             this._line = 1 - this._line;
21261             this._x = this._y = null;
21262           },
21263           point: function(x, y) {
21264             this._x.push(+x);
21265             this._y.push(+y);
21266           }
21267         };
21268
21269         // See https://www.particleincell.com/2012/bezier-splines/ for derivation.
21270         function controlPoints(x) {
21271           var i,
21272               n = x.length - 1,
21273               m,
21274               a = new Array(n),
21275               b = new Array(n),
21276               r = new Array(n);
21277           a[0] = 0, b[0] = 2, r[0] = x[0] + 2 * x[1];
21278           for (i = 1; i < n - 1; ++i) a[i] = 1, b[i] = 4, r[i] = 4 * x[i] + 2 * x[i + 1];
21279           a[n - 1] = 2, b[n - 1] = 7, r[n - 1] = 8 * x[n - 1] + x[n];
21280           for (i = 1; i < n; ++i) m = a[i] / b[i - 1], b[i] -= m, r[i] -= m * r[i - 1];
21281           a[n - 1] = r[n - 1] / b[n - 1];
21282           for (i = n - 2; i >= 0; --i) a[i] = (r[i] - a[i + 1]) / b[i];
21283           b[n - 1] = (x[n] + a[n - 1]) / 2;
21284           for (i = 0; i < n - 1; ++i) b[i] = 2 * x[i + 1] - a[i + 1];
21285           return [a, b];
21286         }
21287
21288         function natural(context) {
21289           return new Natural(context);
21290         }
21291
21292         function Step(context, t) {
21293           this._context = context;
21294           this._t = t;
21295         }
21296
21297         Step.prototype = {
21298           areaStart: function() {
21299             this._line = 0;
21300           },
21301           areaEnd: function() {
21302             this._line = NaN;
21303           },
21304           lineStart: function() {
21305             this._x = this._y = NaN;
21306             this._point = 0;
21307           },
21308           lineEnd: function() {
21309             if (0 < this._t && this._t < 1 && this._point === 2) this._context.lineTo(this._x, this._y);
21310             if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();
21311             if (this._line >= 0) this._t = 1 - this._t, this._line = 1 - this._line;
21312           },
21313           point: function(x, y) {
21314             x = +x, y = +y;
21315             switch (this._point) {
21316               case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;
21317               case 1: this._point = 2; // proceed
21318               default: {
21319                 if (this._t <= 0) {
21320                   this._context.lineTo(this._x, y);
21321                   this._context.lineTo(x, y);
21322                 } else {
21323                   var x1 = this._x * (1 - this._t) + x * this._t;
21324                   this._context.lineTo(x1, this._y);
21325                   this._context.lineTo(x1, y);
21326                 }
21327                 break;
21328               }
21329             }
21330             this._x = x, this._y = y;
21331           }
21332         };
21333
21334         function step(context) {
21335           return new Step(context, 0.5);
21336         }
21337
21338         function stepBefore(context) {
21339           return new Step(context, 0);
21340         }
21341
21342         function stepAfter(context) {
21343           return new Step(context, 1);
21344         }
21345
21346         function none$1(series, order) {
21347           if (!((n = series.length) > 1)) return;
21348           for (var i = 1, j, s0, s1 = series[order[0]], n, m = s1.length; i < n; ++i) {
21349             s0 = s1, s1 = series[order[i]];
21350             for (j = 0; j < m; ++j) {
21351               s1[j][1] += s1[j][0] = isNaN(s0[j][1]) ? s0[j][0] : s0[j][1];
21352             }
21353           }
21354         }
21355
21356         function none$2(series) {
21357           var n = series.length, o = new Array(n);
21358           while (--n >= 0) o[n] = n;
21359           return o;
21360         }
21361
21362         function stackValue(d, key) {
21363           return d[key];
21364         }
21365
21366         function stack() {
21367           var keys = constant$b([]),
21368               order = none$2,
21369               offset = none$1,
21370               value = stackValue;
21371
21372           function stack(data) {
21373             var kz = keys.apply(this, arguments),
21374                 i,
21375                 m = data.length,
21376                 n = kz.length,
21377                 sz = new Array(n),
21378                 oz;
21379
21380             for (i = 0; i < n; ++i) {
21381               for (var ki = kz[i], si = sz[i] = new Array(m), j = 0, sij; j < m; ++j) {
21382                 si[j] = sij = [0, +value(data[j], ki, j, data)];
21383                 sij.data = data[j];
21384               }
21385               si.key = ki;
21386             }
21387
21388             for (i = 0, oz = order(sz); i < n; ++i) {
21389               sz[oz[i]].index = i;
21390             }
21391
21392             offset(sz, oz);
21393             return sz;
21394           }
21395
21396           stack.keys = function(_) {
21397             return arguments.length ? (keys = typeof _ === "function" ? _ : constant$b(slice$a.call(_)), stack) : keys;
21398           };
21399
21400           stack.value = function(_) {
21401             return arguments.length ? (value = typeof _ === "function" ? _ : constant$b(+_), stack) : value;
21402           };
21403
21404           stack.order = function(_) {
21405             return arguments.length ? (order = _ == null ? none$2 : typeof _ === "function" ? _ : constant$b(slice$a.call(_)), stack) : order;
21406           };
21407
21408           stack.offset = function(_) {
21409             return arguments.length ? (offset = _ == null ? none$1 : _, stack) : offset;
21410           };
21411
21412           return stack;
21413         }
21414
21415         function expand(series, order) {
21416           if (!((n = series.length) > 0)) return;
21417           for (var i, n, j = 0, m = series[0].length, y; j < m; ++j) {
21418             for (y = i = 0; i < n; ++i) y += series[i][j][1] || 0;
21419             if (y) for (i = 0; i < n; ++i) series[i][j][1] /= y;
21420           }
21421           none$1(series, order);
21422         }
21423
21424         function diverging$1(series, order) {
21425           if (!((n = series.length) > 0)) return;
21426           for (var i, j = 0, d, dy, yp, yn, n, m = series[order[0]].length; j < m; ++j) {
21427             for (yp = yn = 0, i = 0; i < n; ++i) {
21428               if ((dy = (d = series[order[i]][j])[1] - d[0]) >= 0) {
21429                 d[0] = yp, d[1] = yp += dy;
21430               } else if (dy < 0) {
21431                 d[1] = yn, d[0] = yn += dy;
21432               } else {
21433                 d[0] = yp;
21434               }
21435             }
21436           }
21437         }
21438
21439         function silhouette(series, order) {
21440           if (!((n = series.length) > 0)) return;
21441           for (var j = 0, s0 = series[order[0]], n, m = s0.length; j < m; ++j) {
21442             for (var i = 0, y = 0; i < n; ++i) y += series[i][j][1] || 0;
21443             s0[j][1] += s0[j][0] = -y / 2;
21444           }
21445           none$1(series, order);
21446         }
21447
21448         function wiggle(series, order) {
21449           if (!((n = series.length) > 0) || !((m = (s0 = series[order[0]]).length) > 0)) return;
21450           for (var y = 0, j = 1, s0, m, n; j < m; ++j) {
21451             for (var i = 0, s1 = 0, s2 = 0; i < n; ++i) {
21452               var si = series[order[i]],
21453                   sij0 = si[j][1] || 0,
21454                   sij1 = si[j - 1][1] || 0,
21455                   s3 = (sij0 - sij1) / 2;
21456               for (var k = 0; k < i; ++k) {
21457                 var sk = series[order[k]],
21458                     skj0 = sk[j][1] || 0,
21459                     skj1 = sk[j - 1][1] || 0;
21460                 s3 += skj0 - skj1;
21461               }
21462               s1 += sij0, s2 += s3 * sij0;
21463             }
21464             s0[j - 1][1] += s0[j - 1][0] = y;
21465             if (s1) y -= s2 / s1;
21466           }
21467           s0[j - 1][1] += s0[j - 1][0] = y;
21468           none$1(series, order);
21469         }
21470
21471         function appearance(series) {
21472           var peaks = series.map(peak);
21473           return none$2(series).sort(function(a, b) { return peaks[a] - peaks[b]; });
21474         }
21475
21476         function peak(series) {
21477           var i = -1, j = 0, n = series.length, vi, vj = -Infinity;
21478           while (++i < n) if ((vi = +series[i][1]) > vj) vj = vi, j = i;
21479           return j;
21480         }
21481
21482         function ascending$2(series) {
21483           var sums = series.map(sum$2);
21484           return none$2(series).sort(function(a, b) { return sums[a] - sums[b]; });
21485         }
21486
21487         function sum$2(series) {
21488           var s = 0, i = -1, n = series.length, v;
21489           while (++i < n) if (v = +series[i][1]) s += v;
21490           return s;
21491         }
21492
21493         function descending$1(series) {
21494           return ascending$2(series).reverse();
21495         }
21496
21497         function insideOut(series) {
21498           var n = series.length,
21499               i,
21500               j,
21501               sums = series.map(sum$2),
21502               order = appearance(series),
21503               top = 0,
21504               bottom = 0,
21505               tops = [],
21506               bottoms = [];
21507
21508           for (i = 0; i < n; ++i) {
21509             j = order[i];
21510             if (top < bottom) {
21511               top += sums[j];
21512               tops.push(j);
21513             } else {
21514               bottom += sums[j];
21515               bottoms.push(j);
21516             }
21517           }
21518
21519           return bottoms.reverse().concat(tops);
21520         }
21521
21522         function reverse(series) {
21523           return none$2(series).reverse();
21524         }
21525
21526         function constant$c(x) {
21527           return function() {
21528             return x;
21529           };
21530         }
21531
21532         function x$4(d) {
21533           return d[0];
21534         }
21535
21536         function y$4(d) {
21537           return d[1];
21538         }
21539
21540         function RedBlackTree() {
21541           this._ = null; // root node
21542         }
21543
21544         function RedBlackNode(node) {
21545           node.U = // parent node
21546           node.C = // color - true for red, false for black
21547           node.L = // left node
21548           node.R = // right node
21549           node.P = // previous node
21550           node.N = null; // next node
21551         }
21552
21553         RedBlackTree.prototype = {
21554           constructor: RedBlackTree,
21555
21556           insert: function(after, node) {
21557             var parent, grandpa, uncle;
21558
21559             if (after) {
21560               node.P = after;
21561               node.N = after.N;
21562               if (after.N) after.N.P = node;
21563               after.N = node;
21564               if (after.R) {
21565                 after = after.R;
21566                 while (after.L) after = after.L;
21567                 after.L = node;
21568               } else {
21569                 after.R = node;
21570               }
21571               parent = after;
21572             } else if (this._) {
21573               after = RedBlackFirst(this._);
21574               node.P = null;
21575               node.N = after;
21576               after.P = after.L = node;
21577               parent = after;
21578             } else {
21579               node.P = node.N = null;
21580               this._ = node;
21581               parent = null;
21582             }
21583             node.L = node.R = null;
21584             node.U = parent;
21585             node.C = true;
21586
21587             after = node;
21588             while (parent && parent.C) {
21589               grandpa = parent.U;
21590               if (parent === grandpa.L) {
21591                 uncle = grandpa.R;
21592                 if (uncle && uncle.C) {
21593                   parent.C = uncle.C = false;
21594                   grandpa.C = true;
21595                   after = grandpa;
21596                 } else {
21597                   if (after === parent.R) {
21598                     RedBlackRotateLeft(this, parent);
21599                     after = parent;
21600                     parent = after.U;
21601                   }
21602                   parent.C = false;
21603                   grandpa.C = true;
21604                   RedBlackRotateRight(this, grandpa);
21605                 }
21606               } else {
21607                 uncle = grandpa.L;
21608                 if (uncle && uncle.C) {
21609                   parent.C = uncle.C = false;
21610                   grandpa.C = true;
21611                   after = grandpa;
21612                 } else {
21613                   if (after === parent.L) {
21614                     RedBlackRotateRight(this, parent);
21615                     after = parent;
21616                     parent = after.U;
21617                   }
21618                   parent.C = false;
21619                   grandpa.C = true;
21620                   RedBlackRotateLeft(this, grandpa);
21621                 }
21622               }
21623               parent = after.U;
21624             }
21625             this._.C = false;
21626           },
21627
21628           remove: function(node) {
21629             if (node.N) node.N.P = node.P;
21630             if (node.P) node.P.N = node.N;
21631             node.N = node.P = null;
21632
21633             var parent = node.U,
21634                 sibling,
21635                 left = node.L,
21636                 right = node.R,
21637                 next,
21638                 red;
21639
21640             if (!left) next = right;
21641             else if (!right) next = left;
21642             else next = RedBlackFirst(right);
21643
21644             if (parent) {
21645               if (parent.L === node) parent.L = next;
21646               else parent.R = next;
21647             } else {
21648               this._ = next;
21649             }
21650
21651             if (left && right) {
21652               red = next.C;
21653               next.C = node.C;
21654               next.L = left;
21655               left.U = next;
21656               if (next !== right) {
21657                 parent = next.U;
21658                 next.U = node.U;
21659                 node = next.R;
21660                 parent.L = node;
21661                 next.R = right;
21662                 right.U = next;
21663               } else {
21664                 next.U = parent;
21665                 parent = next;
21666                 node = next.R;
21667               }
21668             } else {
21669               red = node.C;
21670               node = next;
21671             }
21672
21673             if (node) node.U = parent;
21674             if (red) return;
21675             if (node && node.C) { node.C = false; return; }
21676
21677             do {
21678               if (node === this._) break;
21679               if (node === parent.L) {
21680                 sibling = parent.R;
21681                 if (sibling.C) {
21682                   sibling.C = false;
21683                   parent.C = true;
21684                   RedBlackRotateLeft(this, parent);
21685                   sibling = parent.R;
21686                 }
21687                 if ((sibling.L && sibling.L.C)
21688                     || (sibling.R && sibling.R.C)) {
21689                   if (!sibling.R || !sibling.R.C) {
21690                     sibling.L.C = false;
21691                     sibling.C = true;
21692                     RedBlackRotateRight(this, sibling);
21693                     sibling = parent.R;
21694                   }
21695                   sibling.C = parent.C;
21696                   parent.C = sibling.R.C = false;
21697                   RedBlackRotateLeft(this, parent);
21698                   node = this._;
21699                   break;
21700                 }
21701               } else {
21702                 sibling = parent.L;
21703                 if (sibling.C) {
21704                   sibling.C = false;
21705                   parent.C = true;
21706                   RedBlackRotateRight(this, parent);
21707                   sibling = parent.L;
21708                 }
21709                 if ((sibling.L && sibling.L.C)
21710                   || (sibling.R && sibling.R.C)) {
21711                   if (!sibling.L || !sibling.L.C) {
21712                     sibling.R.C = false;
21713                     sibling.C = true;
21714                     RedBlackRotateLeft(this, sibling);
21715                     sibling = parent.L;
21716                   }
21717                   sibling.C = parent.C;
21718                   parent.C = sibling.L.C = false;
21719                   RedBlackRotateRight(this, parent);
21720                   node = this._;
21721                   break;
21722                 }
21723               }
21724               sibling.C = true;
21725               node = parent;
21726               parent = parent.U;
21727             } while (!node.C);
21728
21729             if (node) node.C = false;
21730           }
21731         };
21732
21733         function RedBlackRotateLeft(tree, node) {
21734           var p = node,
21735               q = node.R,
21736               parent = p.U;
21737
21738           if (parent) {
21739             if (parent.L === p) parent.L = q;
21740             else parent.R = q;
21741           } else {
21742             tree._ = q;
21743           }
21744
21745           q.U = parent;
21746           p.U = q;
21747           p.R = q.L;
21748           if (p.R) p.R.U = p;
21749           q.L = p;
21750         }
21751
21752         function RedBlackRotateRight(tree, node) {
21753           var p = node,
21754               q = node.L,
21755               parent = p.U;
21756
21757           if (parent) {
21758             if (parent.L === p) parent.L = q;
21759             else parent.R = q;
21760           } else {
21761             tree._ = q;
21762           }
21763
21764           q.U = parent;
21765           p.U = q;
21766           p.L = q.R;
21767           if (p.L) p.L.U = p;
21768           q.R = p;
21769         }
21770
21771         function RedBlackFirst(node) {
21772           while (node.L) node = node.L;
21773           return node;
21774         }
21775
21776         function createEdge(left, right, v0, v1) {
21777           var edge = [null, null],
21778               index = edges.push(edge) - 1;
21779           edge.left = left;
21780           edge.right = right;
21781           if (v0) setEdgeEnd(edge, left, right, v0);
21782           if (v1) setEdgeEnd(edge, right, left, v1);
21783           cells[left.index].halfedges.push(index);
21784           cells[right.index].halfedges.push(index);
21785           return edge;
21786         }
21787
21788         function createBorderEdge(left, v0, v1) {
21789           var edge = [v0, v1];
21790           edge.left = left;
21791           return edge;
21792         }
21793
21794         function setEdgeEnd(edge, left, right, vertex) {
21795           if (!edge[0] && !edge[1]) {
21796             edge[0] = vertex;
21797             edge.left = left;
21798             edge.right = right;
21799           } else if (edge.left === right) {
21800             edge[1] = vertex;
21801           } else {
21802             edge[0] = vertex;
21803           }
21804         }
21805
21806         // Liang–Barsky line clipping.
21807         function clipEdge(edge, x0, y0, x1, y1) {
21808           var a = edge[0],
21809               b = edge[1],
21810               ax = a[0],
21811               ay = a[1],
21812               bx = b[0],
21813               by = b[1],
21814               t0 = 0,
21815               t1 = 1,
21816               dx = bx - ax,
21817               dy = by - ay,
21818               r;
21819
21820           r = x0 - ax;
21821           if (!dx && r > 0) return;
21822           r /= dx;
21823           if (dx < 0) {
21824             if (r < t0) return;
21825             if (r < t1) t1 = r;
21826           } else if (dx > 0) {
21827             if (r > t1) return;
21828             if (r > t0) t0 = r;
21829           }
21830
21831           r = x1 - ax;
21832           if (!dx && r < 0) return;
21833           r /= dx;
21834           if (dx < 0) {
21835             if (r > t1) return;
21836             if (r > t0) t0 = r;
21837           } else if (dx > 0) {
21838             if (r < t0) return;
21839             if (r < t1) t1 = r;
21840           }
21841
21842           r = y0 - ay;
21843           if (!dy && r > 0) return;
21844           r /= dy;
21845           if (dy < 0) {
21846             if (r < t0) return;
21847             if (r < t1) t1 = r;
21848           } else if (dy > 0) {
21849             if (r > t1) return;
21850             if (r > t0) t0 = r;
21851           }
21852
21853           r = y1 - ay;
21854           if (!dy && r < 0) return;
21855           r /= dy;
21856           if (dy < 0) {
21857             if (r > t1) return;
21858             if (r > t0) t0 = r;
21859           } else if (dy > 0) {
21860             if (r < t0) return;
21861             if (r < t1) t1 = r;
21862           }
21863
21864           if (!(t0 > 0) && !(t1 < 1)) return true; // TODO Better check?
21865
21866           if (t0 > 0) edge[0] = [ax + t0 * dx, ay + t0 * dy];
21867           if (t1 < 1) edge[1] = [ax + t1 * dx, ay + t1 * dy];
21868           return true;
21869         }
21870
21871         function connectEdge(edge, x0, y0, x1, y1) {
21872           var v1 = edge[1];
21873           if (v1) return true;
21874
21875           var v0 = edge[0],
21876               left = edge.left,
21877               right = edge.right,
21878               lx = left[0],
21879               ly = left[1],
21880               rx = right[0],
21881               ry = right[1],
21882               fx = (lx + rx) / 2,
21883               fy = (ly + ry) / 2,
21884               fm,
21885               fb;
21886
21887           if (ry === ly) {
21888             if (fx < x0 || fx >= x1) return;
21889             if (lx > rx) {
21890               if (!v0) v0 = [fx, y0];
21891               else if (v0[1] >= y1) return;
21892               v1 = [fx, y1];
21893             } else {
21894               if (!v0) v0 = [fx, y1];
21895               else if (v0[1] < y0) return;
21896               v1 = [fx, y0];
21897             }
21898           } else {
21899             fm = (lx - rx) / (ry - ly);
21900             fb = fy - fm * fx;
21901             if (fm < -1 || fm > 1) {
21902               if (lx > rx) {
21903                 if (!v0) v0 = [(y0 - fb) / fm, y0];
21904                 else if (v0[1] >= y1) return;
21905                 v1 = [(y1 - fb) / fm, y1];
21906               } else {
21907                 if (!v0) v0 = [(y1 - fb) / fm, y1];
21908                 else if (v0[1] < y0) return;
21909                 v1 = [(y0 - fb) / fm, y0];
21910               }
21911             } else {
21912               if (ly < ry) {
21913                 if (!v0) v0 = [x0, fm * x0 + fb];
21914                 else if (v0[0] >= x1) return;
21915                 v1 = [x1, fm * x1 + fb];
21916               } else {
21917                 if (!v0) v0 = [x1, fm * x1 + fb];
21918                 else if (v0[0] < x0) return;
21919                 v1 = [x0, fm * x0 + fb];
21920               }
21921             }
21922           }
21923
21924           edge[0] = v0;
21925           edge[1] = v1;
21926           return true;
21927         }
21928
21929         function clipEdges(x0, y0, x1, y1) {
21930           var i = edges.length,
21931               edge;
21932
21933           while (i--) {
21934             if (!connectEdge(edge = edges[i], x0, y0, x1, y1)
21935                 || !clipEdge(edge, x0, y0, x1, y1)
21936                 || !(Math.abs(edge[0][0] - edge[1][0]) > epsilon$4
21937                     || Math.abs(edge[0][1] - edge[1][1]) > epsilon$4)) {
21938               delete edges[i];
21939             }
21940           }
21941         }
21942
21943         function createCell(site) {
21944           return cells[site.index] = {
21945             site: site,
21946             halfedges: []
21947           };
21948         }
21949
21950         function cellHalfedgeAngle(cell, edge) {
21951           var site = cell.site,
21952               va = edge.left,
21953               vb = edge.right;
21954           if (site === vb) vb = va, va = site;
21955           if (vb) return Math.atan2(vb[1] - va[1], vb[0] - va[0]);
21956           if (site === va) va = edge[1], vb = edge[0];
21957           else va = edge[0], vb = edge[1];
21958           return Math.atan2(va[0] - vb[0], vb[1] - va[1]);
21959         }
21960
21961         function cellHalfedgeStart(cell, edge) {
21962           return edge[+(edge.left !== cell.site)];
21963         }
21964
21965         function cellHalfedgeEnd(cell, edge) {
21966           return edge[+(edge.left === cell.site)];
21967         }
21968
21969         function sortCellHalfedges() {
21970           for (var i = 0, n = cells.length, cell, halfedges, j, m; i < n; ++i) {
21971             if ((cell = cells[i]) && (m = (halfedges = cell.halfedges).length)) {
21972               var index = new Array(m),
21973                   array = new Array(m);
21974               for (j = 0; j < m; ++j) index[j] = j, array[j] = cellHalfedgeAngle(cell, edges[halfedges[j]]);
21975               index.sort(function(i, j) { return array[j] - array[i]; });
21976               for (j = 0; j < m; ++j) array[j] = halfedges[index[j]];
21977               for (j = 0; j < m; ++j) halfedges[j] = array[j];
21978             }
21979           }
21980         }
21981
21982         function clipCells(x0, y0, x1, y1) {
21983           var nCells = cells.length,
21984               iCell,
21985               cell,
21986               site,
21987               iHalfedge,
21988               halfedges,
21989               nHalfedges,
21990               start,
21991               startX,
21992               startY,
21993               end,
21994               endX,
21995               endY,
21996               cover = true;
21997
21998           for (iCell = 0; iCell < nCells; ++iCell) {
21999             if (cell = cells[iCell]) {
22000               site = cell.site;
22001               halfedges = cell.halfedges;
22002               iHalfedge = halfedges.length;
22003
22004               // Remove any dangling clipped edges.
22005               while (iHalfedge--) {
22006                 if (!edges[halfedges[iHalfedge]]) {
22007                   halfedges.splice(iHalfedge, 1);
22008                 }
22009               }
22010
22011               // Insert any border edges as necessary.
22012               iHalfedge = 0, nHalfedges = halfedges.length;
22013               while (iHalfedge < nHalfedges) {
22014                 end = cellHalfedgeEnd(cell, edges[halfedges[iHalfedge]]), endX = end[0], endY = end[1];
22015                 start = cellHalfedgeStart(cell, edges[halfedges[++iHalfedge % nHalfedges]]), startX = start[0], startY = start[1];
22016                 if (Math.abs(endX - startX) > epsilon$4 || Math.abs(endY - startY) > epsilon$4) {
22017                   halfedges.splice(iHalfedge, 0, edges.push(createBorderEdge(site, end,
22018                       Math.abs(endX - x0) < epsilon$4 && y1 - endY > epsilon$4 ? [x0, Math.abs(startX - x0) < epsilon$4 ? startY : y1]
22019                       : Math.abs(endY - y1) < epsilon$4 && x1 - endX > epsilon$4 ? [Math.abs(startY - y1) < epsilon$4 ? startX : x1, y1]
22020                       : Math.abs(endX - x1) < epsilon$4 && endY - y0 > epsilon$4 ? [x1, Math.abs(startX - x1) < epsilon$4 ? startY : y0]
22021                       : Math.abs(endY - y0) < epsilon$4 && endX - x0 > epsilon$4 ? [Math.abs(startY - y0) < epsilon$4 ? startX : x0, y0]
22022                       : null)) - 1);
22023                   ++nHalfedges;
22024                 }
22025               }
22026
22027               if (nHalfedges) cover = false;
22028             }
22029           }
22030
22031           // If there weren’t any edges, have the closest site cover the extent.
22032           // It doesn’t matter which corner of the extent we measure!
22033           if (cover) {
22034             var dx, dy, d2, dc = Infinity;
22035
22036             for (iCell = 0, cover = null; iCell < nCells; ++iCell) {
22037               if (cell = cells[iCell]) {
22038                 site = cell.site;
22039                 dx = site[0] - x0;
22040                 dy = site[1] - y0;
22041                 d2 = dx * dx + dy * dy;
22042                 if (d2 < dc) dc = d2, cover = cell;
22043               }
22044             }
22045
22046             if (cover) {
22047               var v00 = [x0, y0], v01 = [x0, y1], v11 = [x1, y1], v10 = [x1, y0];
22048               cover.halfedges.push(
22049                 edges.push(createBorderEdge(site = cover.site, v00, v01)) - 1,
22050                 edges.push(createBorderEdge(site, v01, v11)) - 1,
22051                 edges.push(createBorderEdge(site, v11, v10)) - 1,
22052                 edges.push(createBorderEdge(site, v10, v00)) - 1
22053               );
22054             }
22055           }
22056
22057           // Lastly delete any cells with no edges; these were entirely clipped.
22058           for (iCell = 0; iCell < nCells; ++iCell) {
22059             if (cell = cells[iCell]) {
22060               if (!cell.halfedges.length) {
22061                 delete cells[iCell];
22062               }
22063             }
22064           }
22065         }
22066
22067         var circlePool = [];
22068
22069         var firstCircle;
22070
22071         function Circle() {
22072           RedBlackNode(this);
22073           this.x =
22074           this.y =
22075           this.arc =
22076           this.site =
22077           this.cy = null;
22078         }
22079
22080         function attachCircle(arc) {
22081           var lArc = arc.P,
22082               rArc = arc.N;
22083
22084           if (!lArc || !rArc) return;
22085
22086           var lSite = lArc.site,
22087               cSite = arc.site,
22088               rSite = rArc.site;
22089
22090           if (lSite === rSite) return;
22091
22092           var bx = cSite[0],
22093               by = cSite[1],
22094               ax = lSite[0] - bx,
22095               ay = lSite[1] - by,
22096               cx = rSite[0] - bx,
22097               cy = rSite[1] - by;
22098
22099           var d = 2 * (ax * cy - ay * cx);
22100           if (d >= -epsilon2$2) return;
22101
22102           var ha = ax * ax + ay * ay,
22103               hc = cx * cx + cy * cy,
22104               x = (cy * ha - ay * hc) / d,
22105               y = (ax * hc - cx * ha) / d;
22106
22107           var circle = circlePool.pop() || new Circle;
22108           circle.arc = arc;
22109           circle.site = cSite;
22110           circle.x = x + bx;
22111           circle.y = (circle.cy = y + by) + Math.sqrt(x * x + y * y); // y bottom
22112
22113           arc.circle = circle;
22114
22115           var before = null,
22116               node = circles._;
22117
22118           while (node) {
22119             if (circle.y < node.y || (circle.y === node.y && circle.x <= node.x)) {
22120               if (node.L) node = node.L;
22121               else { before = node.P; break; }
22122             } else {
22123               if (node.R) node = node.R;
22124               else { before = node; break; }
22125             }
22126           }
22127
22128           circles.insert(before, circle);
22129           if (!before) firstCircle = circle;
22130         }
22131
22132         function detachCircle(arc) {
22133           var circle = arc.circle;
22134           if (circle) {
22135             if (!circle.P) firstCircle = circle.N;
22136             circles.remove(circle);
22137             circlePool.push(circle);
22138             RedBlackNode(circle);
22139             arc.circle = null;
22140           }
22141         }
22142
22143         var beachPool = [];
22144
22145         function Beach() {
22146           RedBlackNode(this);
22147           this.edge =
22148           this.site =
22149           this.circle = null;
22150         }
22151
22152         function createBeach(site) {
22153           var beach = beachPool.pop() || new Beach;
22154           beach.site = site;
22155           return beach;
22156         }
22157
22158         function detachBeach(beach) {
22159           detachCircle(beach);
22160           beaches.remove(beach);
22161           beachPool.push(beach);
22162           RedBlackNode(beach);
22163         }
22164
22165         function removeBeach(beach) {
22166           var circle = beach.circle,
22167               x = circle.x,
22168               y = circle.cy,
22169               vertex = [x, y],
22170               previous = beach.P,
22171               next = beach.N,
22172               disappearing = [beach];
22173
22174           detachBeach(beach);
22175
22176           var lArc = previous;
22177           while (lArc.circle
22178               && Math.abs(x - lArc.circle.x) < epsilon$4
22179               && Math.abs(y - lArc.circle.cy) < epsilon$4) {
22180             previous = lArc.P;
22181             disappearing.unshift(lArc);
22182             detachBeach(lArc);
22183             lArc = previous;
22184           }
22185
22186           disappearing.unshift(lArc);
22187           detachCircle(lArc);
22188
22189           var rArc = next;
22190           while (rArc.circle
22191               && Math.abs(x - rArc.circle.x) < epsilon$4
22192               && Math.abs(y - rArc.circle.cy) < epsilon$4) {
22193             next = rArc.N;
22194             disappearing.push(rArc);
22195             detachBeach(rArc);
22196             rArc = next;
22197           }
22198
22199           disappearing.push(rArc);
22200           detachCircle(rArc);
22201
22202           var nArcs = disappearing.length,
22203               iArc;
22204           for (iArc = 1; iArc < nArcs; ++iArc) {
22205             rArc = disappearing[iArc];
22206             lArc = disappearing[iArc - 1];
22207             setEdgeEnd(rArc.edge, lArc.site, rArc.site, vertex);
22208           }
22209
22210           lArc = disappearing[0];
22211           rArc = disappearing[nArcs - 1];
22212           rArc.edge = createEdge(lArc.site, rArc.site, null, vertex);
22213
22214           attachCircle(lArc);
22215           attachCircle(rArc);
22216         }
22217
22218         function addBeach(site) {
22219           var x = site[0],
22220               directrix = site[1],
22221               lArc,
22222               rArc,
22223               dxl,
22224               dxr,
22225               node = beaches._;
22226
22227           while (node) {
22228             dxl = leftBreakPoint(node, directrix) - x;
22229             if (dxl > epsilon$4) node = node.L; else {
22230               dxr = x - rightBreakPoint(node, directrix);
22231               if (dxr > epsilon$4) {
22232                 if (!node.R) {
22233                   lArc = node;
22234                   break;
22235                 }
22236                 node = node.R;
22237               } else {
22238                 if (dxl > -epsilon$4) {
22239                   lArc = node.P;
22240                   rArc = node;
22241                 } else if (dxr > -epsilon$4) {
22242                   lArc = node;
22243                   rArc = node.N;
22244                 } else {
22245                   lArc = rArc = node;
22246                 }
22247                 break;
22248               }
22249             }
22250           }
22251
22252           createCell(site);
22253           var newArc = createBeach(site);
22254           beaches.insert(lArc, newArc);
22255
22256           if (!lArc && !rArc) return;
22257
22258           if (lArc === rArc) {
22259             detachCircle(lArc);
22260             rArc = createBeach(lArc.site);
22261             beaches.insert(newArc, rArc);
22262             newArc.edge = rArc.edge = createEdge(lArc.site, newArc.site);
22263             attachCircle(lArc);
22264             attachCircle(rArc);
22265             return;
22266           }
22267
22268           if (!rArc) { // && lArc
22269             newArc.edge = createEdge(lArc.site, newArc.site);
22270             return;
22271           }
22272
22273           // else lArc !== rArc
22274           detachCircle(lArc);
22275           detachCircle(rArc);
22276
22277           var lSite = lArc.site,
22278               ax = lSite[0],
22279               ay = lSite[1],
22280               bx = site[0] - ax,
22281               by = site[1] - ay,
22282               rSite = rArc.site,
22283               cx = rSite[0] - ax,
22284               cy = rSite[1] - ay,
22285               d = 2 * (bx * cy - by * cx),
22286               hb = bx * bx + by * by,
22287               hc = cx * cx + cy * cy,
22288               vertex = [(cy * hb - by * hc) / d + ax, (bx * hc - cx * hb) / d + ay];
22289
22290           setEdgeEnd(rArc.edge, lSite, rSite, vertex);
22291           newArc.edge = createEdge(lSite, site, null, vertex);
22292           rArc.edge = createEdge(site, rSite, null, vertex);
22293           attachCircle(lArc);
22294           attachCircle(rArc);
22295         }
22296
22297         function leftBreakPoint(arc, directrix) {
22298           var site = arc.site,
22299               rfocx = site[0],
22300               rfocy = site[1],
22301               pby2 = rfocy - directrix;
22302
22303           if (!pby2) return rfocx;
22304
22305           var lArc = arc.P;
22306           if (!lArc) return -Infinity;
22307
22308           site = lArc.site;
22309           var lfocx = site[0],
22310               lfocy = site[1],
22311               plby2 = lfocy - directrix;
22312
22313           if (!plby2) return lfocx;
22314
22315           var hl = lfocx - rfocx,
22316               aby2 = 1 / pby2 - 1 / plby2,
22317               b = hl / plby2;
22318
22319           if (aby2) return (-b + Math.sqrt(b * b - 2 * aby2 * (hl * hl / (-2 * plby2) - lfocy + plby2 / 2 + rfocy - pby2 / 2))) / aby2 + rfocx;
22320
22321           return (rfocx + lfocx) / 2;
22322         }
22323
22324         function rightBreakPoint(arc, directrix) {
22325           var rArc = arc.N;
22326           if (rArc) return leftBreakPoint(rArc, directrix);
22327           var site = arc.site;
22328           return site[1] === directrix ? site[0] : Infinity;
22329         }
22330
22331         var epsilon$4 = 1e-6;
22332         var epsilon2$2 = 1e-12;
22333         var beaches;
22334         var cells;
22335         var circles;
22336         var edges;
22337
22338         function triangleArea(a, b, c) {
22339           return (a[0] - c[0]) * (b[1] - a[1]) - (a[0] - b[0]) * (c[1] - a[1]);
22340         }
22341
22342         function lexicographic(a, b) {
22343           return b[1] - a[1]
22344               || b[0] - a[0];
22345         }
22346
22347         function Diagram(sites, extent) {
22348           var site = sites.sort(lexicographic).pop(),
22349               x,
22350               y,
22351               circle;
22352
22353           edges = [];
22354           cells = new Array(sites.length);
22355           beaches = new RedBlackTree;
22356           circles = new RedBlackTree;
22357
22358           while (true) {
22359             circle = firstCircle;
22360             if (site && (!circle || site[1] < circle.y || (site[1] === circle.y && site[0] < circle.x))) {
22361               if (site[0] !== x || site[1] !== y) {
22362                 addBeach(site);
22363                 x = site[0], y = site[1];
22364               }
22365               site = sites.pop();
22366             } else if (circle) {
22367               removeBeach(circle.arc);
22368             } else {
22369               break;
22370             }
22371           }
22372
22373           sortCellHalfedges();
22374
22375           if (extent) {
22376             var x0 = +extent[0][0],
22377                 y0 = +extent[0][1],
22378                 x1 = +extent[1][0],
22379                 y1 = +extent[1][1];
22380             clipEdges(x0, y0, x1, y1);
22381             clipCells(x0, y0, x1, y1);
22382           }
22383
22384           this.edges = edges;
22385           this.cells = cells;
22386
22387           beaches =
22388           circles =
22389           edges =
22390           cells = null;
22391         }
22392
22393         Diagram.prototype = {
22394           constructor: Diagram,
22395
22396           polygons: function() {
22397             var edges = this.edges;
22398
22399             return this.cells.map(function(cell) {
22400               var polygon = cell.halfedges.map(function(i) { return cellHalfedgeStart(cell, edges[i]); });
22401               polygon.data = cell.site.data;
22402               return polygon;
22403             });
22404           },
22405
22406           triangles: function() {
22407             var triangles = [],
22408                 edges = this.edges;
22409
22410             this.cells.forEach(function(cell, i) {
22411               if (!(m = (halfedges = cell.halfedges).length)) return;
22412               var site = cell.site,
22413                   halfedges,
22414                   j = -1,
22415                   m,
22416                   s0,
22417                   e1 = edges[halfedges[m - 1]],
22418                   s1 = e1.left === site ? e1.right : e1.left;
22419
22420               while (++j < m) {
22421                 s0 = s1;
22422                 e1 = edges[halfedges[j]];
22423                 s1 = e1.left === site ? e1.right : e1.left;
22424                 if (s0 && s1 && i < s0.index && i < s1.index && triangleArea(site, s0, s1) < 0) {
22425                   triangles.push([site.data, s0.data, s1.data]);
22426                 }
22427               }
22428             });
22429
22430             return triangles;
22431           },
22432
22433           links: function() {
22434             return this.edges.filter(function(edge) {
22435               return edge.right;
22436             }).map(function(edge) {
22437               return {
22438                 source: edge.left.data,
22439                 target: edge.right.data
22440               };
22441             });
22442           },
22443
22444           find: function(x, y, radius) {
22445             var that = this, i0, i1 = that._found || 0, n = that.cells.length, cell;
22446
22447             // Use the previously-found cell, or start with an arbitrary one.
22448             while (!(cell = that.cells[i1])) if (++i1 >= n) return null;
22449             var dx = x - cell.site[0], dy = y - cell.site[1], d2 = dx * dx + dy * dy;
22450
22451             // Traverse the half-edges to find a closer cell, if any.
22452             do {
22453               cell = that.cells[i0 = i1], i1 = null;
22454               cell.halfedges.forEach(function(e) {
22455                 var edge = that.edges[e], v = edge.left;
22456                 if ((v === cell.site || !v) && !(v = edge.right)) return;
22457                 var vx = x - v[0], vy = y - v[1], v2 = vx * vx + vy * vy;
22458                 if (v2 < d2) d2 = v2, i1 = v.index;
22459               });
22460             } while (i1 !== null);
22461
22462             that._found = i0;
22463
22464             return radius == null || d2 <= radius * radius ? cell.site : null;
22465           }
22466         };
22467
22468         function voronoi() {
22469           var x = x$4,
22470               y = y$4,
22471               extent = null;
22472
22473           function voronoi(data) {
22474             return new Diagram(data.map(function(d, i) {
22475               var s = [Math.round(x(d, i, data) / epsilon$4) * epsilon$4, Math.round(y(d, i, data) / epsilon$4) * epsilon$4];
22476               s.index = i;
22477               s.data = d;
22478               return s;
22479             }), extent);
22480           }
22481
22482           voronoi.polygons = function(data) {
22483             return voronoi(data).polygons();
22484           };
22485
22486           voronoi.links = function(data) {
22487             return voronoi(data).links();
22488           };
22489
22490           voronoi.triangles = function(data) {
22491             return voronoi(data).triangles();
22492           };
22493
22494           voronoi.x = function(_) {
22495             return arguments.length ? (x = typeof _ === "function" ? _ : constant$c(+_), voronoi) : x;
22496           };
22497
22498           voronoi.y = function(_) {
22499             return arguments.length ? (y = typeof _ === "function" ? _ : constant$c(+_), voronoi) : y;
22500           };
22501
22502           voronoi.extent = function(_) {
22503             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]]];
22504           };
22505
22506           voronoi.size = function(_) {
22507             return arguments.length ? (extent = _ == null ? null : [[0, 0], [+_[0], +_[1]]], voronoi) : extent && [extent[1][0] - extent[0][0], extent[1][1] - extent[0][1]];
22508           };
22509
22510           return voronoi;
22511         }
22512
22513         function constant$d(x) {
22514           return function() {
22515             return x;
22516           };
22517         }
22518
22519         function ZoomEvent(target, type, transform) {
22520           this.target = target;
22521           this.type = type;
22522           this.transform = transform;
22523         }
22524
22525         function Transform(k, x, y) {
22526           this.k = k;
22527           this.x = x;
22528           this.y = y;
22529         }
22530
22531         Transform.prototype = {
22532           constructor: Transform,
22533           scale: function(k) {
22534             return k === 1 ? this : new Transform(this.k * k, this.x, this.y);
22535           },
22536           translate: function(x, y) {
22537             return x === 0 & y === 0 ? this : new Transform(this.k, this.x + this.k * x, this.y + this.k * y);
22538           },
22539           apply: function(point) {
22540             return [point[0] * this.k + this.x, point[1] * this.k + this.y];
22541           },
22542           applyX: function(x) {
22543             return x * this.k + this.x;
22544           },
22545           applyY: function(y) {
22546             return y * this.k + this.y;
22547           },
22548           invert: function(location) {
22549             return [(location[0] - this.x) / this.k, (location[1] - this.y) / this.k];
22550           },
22551           invertX: function(x) {
22552             return (x - this.x) / this.k;
22553           },
22554           invertY: function(y) {
22555             return (y - this.y) / this.k;
22556           },
22557           rescaleX: function(x) {
22558             return x.copy().domain(x.range().map(this.invertX, this).map(x.invert, x));
22559           },
22560           rescaleY: function(y) {
22561             return y.copy().domain(y.range().map(this.invertY, this).map(y.invert, y));
22562           },
22563           toString: function() {
22564             return "translate(" + this.x + "," + this.y + ") scale(" + this.k + ")";
22565           }
22566         };
22567
22568         var identity$8 = new Transform(1, 0, 0);
22569
22570         transform.prototype = Transform.prototype;
22571
22572         function transform(node) {
22573           return node.__zoom || identity$8;
22574         }
22575
22576         function nopropagation$2() {
22577           event.stopImmediatePropagation();
22578         }
22579
22580         function noevent$2() {
22581           event.preventDefault();
22582           event.stopImmediatePropagation();
22583         }
22584
22585         // Ignore right-click, since that should open the context menu.
22586         function defaultFilter$2() {
22587           return !event.button;
22588         }
22589
22590         function defaultExtent$1() {
22591           var e = this, w, h;
22592           if (e instanceof SVGElement) {
22593             e = e.ownerSVGElement || e;
22594             w = e.width.baseVal.value;
22595             h = e.height.baseVal.value;
22596           } else {
22597             w = e.clientWidth;
22598             h = e.clientHeight;
22599           }
22600           return [[0, 0], [w, h]];
22601         }
22602
22603         function defaultTransform() {
22604           return this.__zoom || identity$8;
22605         }
22606
22607         function defaultWheelDelta() {
22608           return -event.deltaY * (event.deltaMode ? 120 : 1) / 500;
22609         }
22610
22611         function defaultTouchable$1() {
22612           return "ontouchstart" in this;
22613         }
22614
22615         function defaultConstrain(transform, extent, translateExtent) {
22616           var dx0 = transform.invertX(extent[0][0]) - translateExtent[0][0],
22617               dx1 = transform.invertX(extent[1][0]) - translateExtent[1][0],
22618               dy0 = transform.invertY(extent[0][1]) - translateExtent[0][1],
22619               dy1 = transform.invertY(extent[1][1]) - translateExtent[1][1];
22620           return transform.translate(
22621             dx1 > dx0 ? (dx0 + dx1) / 2 : Math.min(0, dx0) || Math.max(0, dx1),
22622             dy1 > dy0 ? (dy0 + dy1) / 2 : Math.min(0, dy0) || Math.max(0, dy1)
22623           );
22624         }
22625
22626         function d3_zoom() {
22627           var filter = defaultFilter$2,
22628               extent = defaultExtent$1,
22629               constrain = defaultConstrain,
22630               wheelDelta = defaultWheelDelta,
22631               touchable = defaultTouchable$1,
22632               scaleExtent = [0, Infinity],
22633               translateExtent = [[-Infinity, -Infinity], [Infinity, Infinity]],
22634               duration = 250,
22635               interpolate = interpolateZoom,
22636               gestures = [],
22637               listeners = dispatch("start", "zoom", "end"),
22638               touchstarting,
22639               touchending,
22640               touchDelay = 500,
22641               wheelDelay = 150,
22642               clickDistance2 = 0;
22643
22644           function zoom(selection) {
22645             selection
22646                 .property("__zoom", defaultTransform)
22647                 .on("wheel.zoom", wheeled)
22648                 .on("mousedown.zoom", mousedowned)
22649                 .on("dblclick.zoom", dblclicked)
22650               .filter(touchable)
22651                 .on("touchstart.zoom", touchstarted)
22652                 .on("touchmove.zoom", touchmoved)
22653                 .on("touchend.zoom touchcancel.zoom", touchended)
22654                 .style("touch-action", "none")
22655                 .style("-webkit-tap-highlight-color", "rgba(0,0,0,0)");
22656           }
22657
22658           zoom.transform = function(collection, transform) {
22659             var selection = collection.selection ? collection.selection() : collection;
22660             selection.property("__zoom", defaultTransform);
22661             if (collection !== selection) {
22662               schedule(collection, transform);
22663             } else {
22664               selection.interrupt().each(function() {
22665                 gesture(this, arguments)
22666                     .start()
22667                     .zoom(null, typeof transform === "function" ? transform.apply(this, arguments) : transform)
22668                     .end();
22669               });
22670             }
22671           };
22672
22673           zoom.scaleBy = function(selection, k) {
22674             zoom.scaleTo(selection, function() {
22675               var k0 = this.__zoom.k,
22676                   k1 = typeof k === "function" ? k.apply(this, arguments) : k;
22677               return k0 * k1;
22678             });
22679           };
22680
22681           zoom.scaleTo = function(selection, k) {
22682             zoom.transform(selection, function() {
22683               var e = extent.apply(this, arguments),
22684                   t0 = this.__zoom,
22685                   p0 = centroid(e),
22686                   p1 = t0.invert(p0),
22687                   k1 = typeof k === "function" ? k.apply(this, arguments) : k;
22688               return constrain(translate(scale(t0, k1), p0, p1), e, translateExtent);
22689             });
22690           };
22691
22692           zoom.translateBy = function(selection, x, y) {
22693             zoom.transform(selection, function() {
22694               return constrain(this.__zoom.translate(
22695                 typeof x === "function" ? x.apply(this, arguments) : x,
22696                 typeof y === "function" ? y.apply(this, arguments) : y
22697               ), extent.apply(this, arguments), translateExtent);
22698             });
22699           };
22700
22701           zoom.translateTo = function(selection, x, y) {
22702             zoom.transform(selection, function() {
22703               var e = extent.apply(this, arguments),
22704                   t = this.__zoom,
22705                   p = centroid(e);
22706               return constrain(identity$8.translate(p[0], p[1]).scale(t.k).translate(
22707                 typeof x === "function" ? -x.apply(this, arguments) : -x,
22708                 typeof y === "function" ? -y.apply(this, arguments) : -y
22709               ), e, translateExtent);
22710             });
22711           };
22712
22713           function scale(transform, k) {
22714             k = Math.max(scaleExtent[0], Math.min(scaleExtent[1], k));
22715             return k === transform.k ? transform : new Transform(k, transform.x, transform.y);
22716           }
22717
22718           function translate(transform, p0, p1) {
22719             var x = p0[0] - p1[0] * transform.k, y = p0[1] - p1[1] * transform.k;
22720             return x === transform.x && y === transform.y ? transform : new Transform(transform.k, x, y);
22721           }
22722
22723           function centroid(extent) {
22724             return [(+extent[0][0] + +extent[1][0]) / 2, (+extent[0][1] + +extent[1][1]) / 2];
22725           }
22726
22727           function schedule(transition, transform, center) {
22728             transition
22729                 .on("start.zoom", function() { gesture(this, arguments).start(); })
22730                 .on("interrupt.zoom end.zoom", function() { gesture(this, arguments).end(); })
22731                 .tween("zoom", function() {
22732                   var that = this,
22733                       args = arguments,
22734                       g = gesture(that, args),
22735                       e = extent.apply(that, args),
22736                       p = center || centroid(e),
22737                       w = Math.max(e[1][0] - e[0][0], e[1][1] - e[0][1]),
22738                       a = that.__zoom,
22739                       b = typeof transform === "function" ? transform.apply(that, args) : transform,
22740                       i = interpolate(a.invert(p).concat(w / a.k), b.invert(p).concat(w / b.k));
22741                   return function(t) {
22742                     if (t === 1) t = b; // Avoid rounding error on end.
22743                     else { var l = i(t), k = w / l[2]; t = new Transform(k, p[0] - l[0] * k, p[1] - l[1] * k); }
22744                     g.zoom(null, t);
22745                   };
22746                 });
22747           }
22748
22749           function gesture(that, args) {
22750             for (var i = 0, n = gestures.length, g; i < n; ++i) {
22751               if ((g = gestures[i]).that === that) {
22752                 return g;
22753               }
22754             }
22755             return new Gesture(that, args);
22756           }
22757
22758           function Gesture(that, args) {
22759             this.that = that;
22760             this.args = args;
22761             this.index = -1;
22762             this.active = 0;
22763             this.extent = extent.apply(that, args);
22764           }
22765
22766           Gesture.prototype = {
22767             start: function() {
22768               if (++this.active === 1) {
22769                 this.index = gestures.push(this) - 1;
22770                 this.emit("start");
22771               }
22772               return this;
22773             },
22774             zoom: function(key, transform) {
22775               if (this.mouse && key !== "mouse") this.mouse[1] = transform.invert(this.mouse[0]);
22776               if (this.touch0 && key !== "touch") this.touch0[1] = transform.invert(this.touch0[0]);
22777               if (this.touch1 && key !== "touch") this.touch1[1] = transform.invert(this.touch1[0]);
22778               this.that.__zoom = transform;
22779               this.emit("zoom");
22780               return this;
22781             },
22782             end: function() {
22783               if (--this.active === 0) {
22784                 gestures.splice(this.index, 1);
22785                 this.index = -1;
22786                 this.emit("end");
22787               }
22788               return this;
22789             },
22790             emit: function(type) {
22791               customEvent(new ZoomEvent(zoom, type, this.that.__zoom), listeners.apply, listeners, [type, this.that, this.args]);
22792             }
22793           };
22794
22795           function wheeled() {
22796             if (!filter.apply(this, arguments)) return;
22797             var g = gesture(this, arguments),
22798                 t = this.__zoom,
22799                 k = Math.max(scaleExtent[0], Math.min(scaleExtent[1], t.k * Math.pow(2, wheelDelta.apply(this, arguments)))),
22800                 p = d3_mouse(this);
22801
22802             // If the mouse is in the same location as before, reuse it.
22803             // If there were recent wheel events, reset the wheel idle timeout.
22804             if (g.wheel) {
22805               if (g.mouse[0][0] !== p[0] || g.mouse[0][1] !== p[1]) {
22806                 g.mouse[1] = t.invert(g.mouse[0] = p);
22807               }
22808               clearTimeout(g.wheel);
22809             }
22810
22811             // If this wheel event won’t trigger a transform change, ignore it.
22812             else if (t.k === k) return;
22813
22814             // Otherwise, capture the mouse point and location at the start.
22815             else {
22816               g.mouse = [p, t.invert(p)];
22817               interrupt(this);
22818               g.start();
22819             }
22820
22821             noevent$2();
22822             g.wheel = setTimeout(wheelidled, wheelDelay);
22823             g.zoom("mouse", constrain(translate(scale(t, k), g.mouse[0], g.mouse[1]), g.extent, translateExtent));
22824
22825             function wheelidled() {
22826               g.wheel = null;
22827               g.end();
22828             }
22829           }
22830
22831           function mousedowned() {
22832             if (touchending || !filter.apply(this, arguments)) return;
22833             var g = gesture(this, arguments),
22834                 v = d3_select(event.view).on("mousemove.zoom", mousemoved, true).on("mouseup.zoom", mouseupped, true),
22835                 p = d3_mouse(this),
22836                 x0 = event.clientX,
22837                 y0 = event.clientY;
22838
22839             dragDisable(event.view);
22840             nopropagation$2();
22841             g.mouse = [p, this.__zoom.invert(p)];
22842             interrupt(this);
22843             g.start();
22844
22845             function mousemoved() {
22846               noevent$2();
22847               if (!g.moved) {
22848                 var dx = event.clientX - x0, dy = event.clientY - y0;
22849                 g.moved = dx * dx + dy * dy > clickDistance2;
22850               }
22851               g.zoom("mouse", constrain(translate(g.that.__zoom, g.mouse[0] = d3_mouse(g.that), g.mouse[1]), g.extent, translateExtent));
22852             }
22853
22854             function mouseupped() {
22855               v.on("mousemove.zoom mouseup.zoom", null);
22856               yesdrag(event.view, g.moved);
22857               noevent$2();
22858               g.end();
22859             }
22860           }
22861
22862           function dblclicked() {
22863             if (!filter.apply(this, arguments)) return;
22864             var t0 = this.__zoom,
22865                 p0 = d3_mouse(this),
22866                 p1 = t0.invert(p0),
22867                 k1 = t0.k * (event.shiftKey ? 0.5 : 2),
22868                 t1 = constrain(translate(scale(t0, k1), p0, p1), extent.apply(this, arguments), translateExtent);
22869
22870             noevent$2();
22871             if (duration > 0) d3_select(this).transition().duration(duration).call(schedule, t1, p0);
22872             else d3_select(this).call(zoom.transform, t1);
22873           }
22874
22875           function touchstarted() {
22876             if (!filter.apply(this, arguments)) return;
22877             var g = gesture(this, arguments),
22878                 touches = event.changedTouches,
22879                 started,
22880                 n = touches.length, i, t, p;
22881
22882             nopropagation$2();
22883             for (i = 0; i < n; ++i) {
22884               t = touches[i], p = touch(this, touches, t.identifier);
22885               p = [p, this.__zoom.invert(p), t.identifier];
22886               if (!g.touch0) g.touch0 = p, started = true;
22887               else if (!g.touch1) g.touch1 = p;
22888             }
22889
22890             // If this is a dbltap, reroute to the (optional) dblclick.zoom handler.
22891             if (touchstarting) {
22892               touchstarting = clearTimeout(touchstarting);
22893               if (!g.touch1) {
22894                 g.end();
22895                 p = d3_select(this).on("dblclick.zoom");
22896                 if (p) p.apply(this, arguments);
22897                 return;
22898               }
22899             }
22900
22901             if (started) {
22902               touchstarting = setTimeout(function() { touchstarting = null; }, touchDelay);
22903               interrupt(this);
22904               g.start();
22905             }
22906           }
22907
22908           function touchmoved() {
22909             var g = gesture(this, arguments),
22910                 touches = event.changedTouches,
22911                 n = touches.length, i, t, p, l;
22912
22913             noevent$2();
22914             if (touchstarting) touchstarting = clearTimeout(touchstarting);
22915             for (i = 0; i < n; ++i) {
22916               t = touches[i], p = touch(this, touches, t.identifier);
22917               if (g.touch0 && g.touch0[2] === t.identifier) g.touch0[0] = p;
22918               else if (g.touch1 && g.touch1[2] === t.identifier) g.touch1[0] = p;
22919             }
22920             t = g.that.__zoom;
22921             if (g.touch1) {
22922               var p0 = g.touch0[0], l0 = g.touch0[1],
22923                   p1 = g.touch1[0], l1 = g.touch1[1],
22924                   dp = (dp = p1[0] - p0[0]) * dp + (dp = p1[1] - p0[1]) * dp,
22925                   dl = (dl = l1[0] - l0[0]) * dl + (dl = l1[1] - l0[1]) * dl;
22926               t = scale(t, Math.sqrt(dp / dl));
22927               p = [(p0[0] + p1[0]) / 2, (p0[1] + p1[1]) / 2];
22928               l = [(l0[0] + l1[0]) / 2, (l0[1] + l1[1]) / 2];
22929             }
22930             else if (g.touch0) p = g.touch0[0], l = g.touch0[1];
22931             else return;
22932             g.zoom("touch", constrain(translate(t, p, l), g.extent, translateExtent));
22933           }
22934
22935           function touchended() {
22936             var g = gesture(this, arguments),
22937                 touches = event.changedTouches,
22938                 n = touches.length, i, t;
22939
22940             nopropagation$2();
22941             if (touchending) clearTimeout(touchending);
22942             touchending = setTimeout(function() { touchending = null; }, touchDelay);
22943             for (i = 0; i < n; ++i) {
22944               t = touches[i];
22945               if (g.touch0 && g.touch0[2] === t.identifier) delete g.touch0;
22946               else if (g.touch1 && g.touch1[2] === t.identifier) delete g.touch1;
22947             }
22948             if (g.touch1 && !g.touch0) g.touch0 = g.touch1, delete g.touch1;
22949             if (g.touch0) g.touch0[1] = this.__zoom.invert(g.touch0[0]);
22950             else g.end();
22951           }
22952
22953           zoom.wheelDelta = function(_) {
22954             return arguments.length ? (wheelDelta = typeof _ === "function" ? _ : constant$d(+_), zoom) : wheelDelta;
22955           };
22956
22957           zoom.filter = function(_) {
22958             return arguments.length ? (filter = typeof _ === "function" ? _ : constant$d(!!_), zoom) : filter;
22959           };
22960
22961           zoom.touchable = function(_) {
22962             return arguments.length ? (touchable = typeof _ === "function" ? _ : constant$d(!!_), zoom) : touchable;
22963           };
22964
22965           zoom.extent = function(_) {
22966             return arguments.length ? (extent = typeof _ === "function" ? _ : constant$d([[+_[0][0], +_[0][1]], [+_[1][0], +_[1][1]]]), zoom) : extent;
22967           };
22968
22969           zoom.scaleExtent = function(_) {
22970             return arguments.length ? (scaleExtent[0] = +_[0], scaleExtent[1] = +_[1], zoom) : [scaleExtent[0], scaleExtent[1]];
22971           };
22972
22973           zoom.translateExtent = function(_) {
22974             return arguments.length ? (translateExtent[0][0] = +_[0][0], translateExtent[1][0] = +_[1][0], translateExtent[0][1] = +_[0][1], translateExtent[1][1] = +_[1][1], zoom) : [[translateExtent[0][0], translateExtent[0][1]], [translateExtent[1][0], translateExtent[1][1]]];
22975           };
22976
22977           zoom.constrain = function(_) {
22978             return arguments.length ? (constrain = _, zoom) : constrain;
22979           };
22980
22981           zoom.duration = function(_) {
22982             return arguments.length ? (duration = +_, zoom) : duration;
22983           };
22984
22985           zoom.interpolate = function(_) {
22986             return arguments.length ? (interpolate = _, zoom) : interpolate;
22987           };
22988
22989           zoom.on = function() {
22990             var value = listeners.on.apply(listeners, arguments);
22991             return value === listeners ? zoom : value;
22992           };
22993
22994           zoom.clickDistance = function(_) {
22995             return arguments.length ? (clickDistance2 = (_ = +_) * _, zoom) : Math.sqrt(clickDistance2);
22996           };
22997
22998           return zoom;
22999         }
23000
23001
23002
23003         var index$3 = /*#__PURE__*/Object.freeze({
23004                 version: version,
23005                 bisect: bisectRight,
23006                 bisectRight: bisectRight,
23007                 bisectLeft: bisectLeft,
23008                 ascending: d3_ascending,
23009                 bisector: d3_bisector,
23010                 cross: cross,
23011                 descending: d3_descending,
23012                 deviation: deviation,
23013                 extent: extent,
23014                 histogram: histogram,
23015                 thresholdFreedmanDiaconis: freedmanDiaconis,
23016                 thresholdScott: scott,
23017                 thresholdSturges: thresholdSturges,
23018                 max: max$2,
23019                 mean: mean,
23020                 median: d3_median,
23021                 merge: merge,
23022                 min: min,
23023                 pairs: pairs,
23024                 permute: permute,
23025                 quantile: threshold,
23026                 range: d3_range,
23027                 scan: scan,
23028                 shuffle: shuffle,
23029                 sum: sum,
23030                 ticks: ticks,
23031                 tickIncrement: tickIncrement,
23032                 tickStep: tickStep,
23033                 transpose: transpose,
23034                 variance: variance,
23035                 zip: zip,
23036                 axisTop: axisTop,
23037                 axisRight: axisRight,
23038                 axisBottom: axisBottom,
23039                 axisLeft: axisLeft,
23040                 brush: brush,
23041                 brushX: brushX,
23042                 brushY: brushY,
23043                 brushSelection: brushSelection,
23044                 chord: chord,
23045                 ribbon: ribbon,
23046                 nest: nest,
23047                 set: set$2,
23048                 map: map$3,
23049                 keys: keys$3,
23050                 values: values,
23051                 entries: entries,
23052                 color: color,
23053                 rgb: rgb,
23054                 hsl: hsl,
23055                 lab: lab,
23056                 hcl: hcl,
23057                 lch: lch,
23058                 gray: gray,
23059                 cubehelix: cubehelix,
23060                 contours: contours,
23061                 contourDensity: density,
23062                 dispatch: dispatch,
23063                 drag: d3_drag,
23064                 dragDisable: dragDisable,
23065                 dragEnable: yesdrag,
23066                 dsvFormat: dsvFormat,
23067                 csvParse: csvParse,
23068                 csvParseRows: csvParseRows,
23069                 csvFormat: csvFormat,
23070                 csvFormatBody: csvFormatBody,
23071                 csvFormatRows: csvFormatRows,
23072                 tsvParse: tsvParse,
23073                 tsvParseRows: tsvParseRows,
23074                 tsvFormat: tsvFormat,
23075                 tsvFormatBody: tsvFormatBody,
23076                 tsvFormatRows: tsvFormatRows,
23077                 autoType: autoType,
23078                 easeLinear: linear$1,
23079                 easeQuad: quadInOut,
23080                 easeQuadIn: quadIn,
23081                 easeQuadOut: quadOut,
23082                 easeQuadInOut: quadInOut,
23083                 easeCubic: cubicInOut,
23084                 easeCubicIn: cubicIn,
23085                 easeCubicOut: cubicOut,
23086                 easeCubicInOut: cubicInOut,
23087                 easePoly: polyInOut,
23088                 easePolyIn: polyIn,
23089                 easePolyOut: polyOut,
23090                 easePolyInOut: polyInOut,
23091                 easeSin: sinInOut,
23092                 easeSinIn: sinIn,
23093                 easeSinOut: sinOut,
23094                 easeSinInOut: sinInOut,
23095                 easeExp: expInOut,
23096                 easeExpIn: expIn,
23097                 easeExpOut: expOut,
23098                 easeExpInOut: expInOut,
23099                 easeCircle: circleInOut,
23100                 easeCircleIn: circleIn,
23101                 easeCircleOut: circleOut,
23102                 easeCircleInOut: circleInOut,
23103                 easeBounce: bounceOut,
23104                 easeBounceIn: bounceIn,
23105                 easeBounceOut: bounceOut,
23106                 easeBounceInOut: bounceInOut,
23107                 easeBack: backInOut,
23108                 easeBackIn: backIn,
23109                 easeBackOut: backOut,
23110                 easeBackInOut: backInOut,
23111                 easeElastic: elasticOut,
23112                 easeElasticIn: elasticIn,
23113                 easeElasticOut: elasticOut,
23114                 easeElasticInOut: elasticInOut,
23115                 blob: blob,
23116                 buffer: buffer,
23117                 dsv: dsv,
23118                 csv: csv$1,
23119                 tsv: tsv$1,
23120                 image: image,
23121                 json: d3_json,
23122                 text: d3_text,
23123                 xml: d3_xml,
23124                 html: html,
23125                 svg: svg,
23126                 forceCenter: center$1,
23127                 forceCollide: collide,
23128                 forceLink: link,
23129                 forceManyBody: manyBody,
23130                 forceRadial: radial,
23131                 forceSimulation: simulation,
23132                 forceX: x$2,
23133                 forceY: y$2,
23134                 formatDefaultLocale: defaultLocale,
23135                 get format () { return format; },
23136                 get formatPrefix () { return formatPrefix; },
23137                 formatLocale: formatLocale,
23138                 formatSpecifier: formatSpecifier,
23139                 precisionFixed: precisionFixed,
23140                 precisionPrefix: precisionPrefix,
23141                 precisionRound: precisionRound,
23142                 geoArea: d3_geoArea,
23143                 geoBounds: d3_geoBounds,
23144                 geoCentroid: d3_geoCentroid,
23145                 geoCircle: circle,
23146                 geoClipAntimeridian: clipAntimeridian,
23147                 geoClipCircle: clipCircle,
23148                 geoClipExtent: extent$1,
23149                 geoClipRectangle: clipRectangle,
23150                 geoContains: contains$2,
23151                 geoDistance: distance,
23152                 geoGraticule: graticule,
23153                 geoGraticule10: graticule10,
23154                 geoInterpolate: interpolate$1,
23155                 geoLength: d3_geoLength,
23156                 geoPath: d3_geoPath,
23157                 geoAlbers: albers,
23158                 geoAlbersUsa: albersUsa,
23159                 geoAzimuthalEqualArea: azimuthalEqualArea,
23160                 geoAzimuthalEqualAreaRaw: azimuthalEqualAreaRaw,
23161                 geoAzimuthalEquidistant: azimuthalEquidistant,
23162                 geoAzimuthalEquidistantRaw: azimuthalEquidistantRaw,
23163                 geoConicConformal: conicConformal,
23164                 geoConicConformalRaw: conicConformalRaw,
23165                 geoConicEqualArea: conicEqualArea,
23166                 geoConicEqualAreaRaw: conicEqualAreaRaw,
23167                 geoConicEquidistant: conicEquidistant,
23168                 geoConicEquidistantRaw: conicEquidistantRaw,
23169                 geoEqualEarth: equalEarth,
23170                 geoEqualEarthRaw: equalEarthRaw,
23171                 geoEquirectangular: equirectangular,
23172                 geoEquirectangularRaw: equirectangularRaw,
23173                 geoGnomonic: gnomonic,
23174                 geoGnomonicRaw: gnomonicRaw,
23175                 geoIdentity: d3_geoIdentity,
23176                 geoProjection: projection,
23177                 geoProjectionMutator: projectionMutator,
23178                 geoMercator: mercator,
23179                 geoMercatorRaw: mercatorRaw,
23180                 geoNaturalEarth1: naturalEarth1,
23181                 geoNaturalEarth1Raw: naturalEarth1Raw,
23182                 geoOrthographic: orthographic,
23183                 geoOrthographicRaw: orthographicRaw,
23184                 geoStereographic: stereographic,
23185                 geoStereographicRaw: stereographicRaw,
23186                 geoTransverseMercator: transverseMercator,
23187                 geoTransverseMercatorRaw: transverseMercatorRaw,
23188                 geoRotation: rotation,
23189                 geoStream: d3_geoStream,
23190                 geoTransform: d3_geoTransform,
23191                 cluster: cluster,
23192                 hierarchy: hierarchy,
23193                 pack: index$1,
23194                 packSiblings: siblings,
23195                 packEnclose: enclose,
23196                 partition: partition,
23197                 stratify: stratify,
23198                 tree: tree,
23199                 treemap: index$2,
23200                 treemapBinary: binary,
23201                 treemapDice: treemapDice,
23202                 treemapSlice: treemapSlice,
23203                 treemapSliceDice: sliceDice,
23204                 treemapSquarify: squarify,
23205                 treemapResquarify: resquarify,
23206                 interpolate: d3_interpolate,
23207                 interpolateArray: array$2,
23208                 interpolateBasis: basis$1,
23209                 interpolateBasisClosed: basisClosed,
23210                 interpolateDate: date,
23211                 interpolateDiscrete: discrete,
23212                 interpolateHue: hue$1,
23213                 interpolateNumber: d3_interpolateNumber,
23214                 interpolateObject: object,
23215                 interpolateRound: interpolateRound,
23216                 interpolateString: interpolateString,
23217                 interpolateTransformCss: interpolateTransformCss,
23218                 interpolateTransformSvg: interpolateTransformSvg,
23219                 interpolateZoom: interpolateZoom,
23220                 interpolateRgb: d3_interpolateRgb,
23221                 interpolateRgbBasis: rgbBasis,
23222                 interpolateRgbBasisClosed: rgbBasisClosed,
23223                 interpolateHsl: hsl$2,
23224                 interpolateHslLong: hslLong,
23225                 interpolateLab: lab$1,
23226                 interpolateHcl: hcl$2,
23227                 interpolateHclLong: hclLong,
23228                 interpolateCubehelix: cubehelix$2,
23229                 interpolateCubehelixLong: cubehelixLong,
23230                 piecewise: piecewise,
23231                 quantize: d3_quantize,
23232                 path: path,
23233                 polygonArea: d3_polygonArea,
23234                 polygonCentroid: d3_polygonCentroid,
23235                 polygonHull: d3_polygonHull,
23236                 polygonContains: contains$3,
23237                 polygonLength: length$1,
23238                 quadtree: quadtree,
23239                 randomUniform: uniform,
23240                 randomNormal: normal,
23241                 randomLogNormal: logNormal,
23242                 randomBates: bates,
23243                 randomIrwinHall: irwinHall,
23244                 randomExponential: exponential$1,
23245                 scaleBand: band,
23246                 scalePoint: point$1,
23247                 scaleIdentity: identity$6,
23248                 scaleLinear: linear$2,
23249                 scaleLog: log$1,
23250                 scaleSymlog: symlog,
23251                 scaleOrdinal: ordinal,
23252                 scaleImplicit: implicit,
23253                 scalePow: pow$1,
23254                 scaleSqrt: sqrt$1,
23255                 scaleQuantile: quantile,
23256                 scaleQuantize: quantize,
23257                 scaleThreshold: threshold$1,
23258                 scaleTime: time,
23259                 scaleUtc: utcTime,
23260                 scaleSequential: sequential,
23261                 scaleSequentialLog: sequentialLog,
23262                 scaleSequentialPow: sequentialPow,
23263                 scaleSequentialSqrt: sequentialSqrt,
23264                 scaleSequentialSymlog: sequentialSymlog,
23265                 scaleSequentialQuantile: sequentialQuantile,
23266                 scaleDiverging: diverging,
23267                 scaleDivergingLog: divergingLog,
23268                 scaleDivergingPow: divergingPow,
23269                 scaleDivergingSqrt: divergingSqrt,
23270                 scaleDivergingSymlog: divergingSymlog,
23271                 tickFormat: tickFormat,
23272                 schemeCategory10: category10,
23273                 schemeAccent: Accent,
23274                 schemeDark2: Dark2,
23275                 schemePaired: Paired,
23276                 schemePastel1: Pastel1,
23277                 schemePastel2: Pastel2,
23278                 schemeSet1: Set1,
23279                 schemeSet2: Set2,
23280                 schemeSet3: Set3,
23281                 interpolateBrBG: BrBG,
23282                 schemeBrBG: scheme,
23283                 interpolatePRGn: PRGn,
23284                 schemePRGn: scheme$1,
23285                 interpolatePiYG: PiYG,
23286                 schemePiYG: scheme$2,
23287                 interpolatePuOr: PuOr,
23288                 schemePuOr: scheme$3,
23289                 interpolateRdBu: RdBu,
23290                 schemeRdBu: scheme$4,
23291                 interpolateRdGy: RdGy,
23292                 schemeRdGy: scheme$5,
23293                 interpolateRdYlBu: RdYlBu,
23294                 schemeRdYlBu: scheme$6,
23295                 interpolateRdYlGn: RdYlGn,
23296                 schemeRdYlGn: scheme$7,
23297                 interpolateSpectral: Spectral,
23298                 schemeSpectral: scheme$8,
23299                 interpolateBuGn: BuGn,
23300                 schemeBuGn: scheme$9,
23301                 interpolateBuPu: BuPu,
23302                 schemeBuPu: scheme$a,
23303                 interpolateGnBu: GnBu,
23304                 schemeGnBu: scheme$b,
23305                 interpolateOrRd: OrRd,
23306                 schemeOrRd: scheme$c,
23307                 interpolatePuBuGn: PuBuGn,
23308                 schemePuBuGn: scheme$d,
23309                 interpolatePuBu: PuBu,
23310                 schemePuBu: scheme$e,
23311                 interpolatePuRd: PuRd,
23312                 schemePuRd: scheme$f,
23313                 interpolateRdPu: RdPu,
23314                 schemeRdPu: scheme$g,
23315                 interpolateYlGnBu: YlGnBu,
23316                 schemeYlGnBu: scheme$h,
23317                 interpolateYlGn: YlGn,
23318                 schemeYlGn: scheme$i,
23319                 interpolateYlOrBr: YlOrBr,
23320                 schemeYlOrBr: scheme$j,
23321                 interpolateYlOrRd: YlOrRd,
23322                 schemeYlOrRd: scheme$k,
23323                 interpolateBlues: Blues,
23324                 schemeBlues: scheme$l,
23325                 interpolateGreens: Greens,
23326                 schemeGreens: scheme$m,
23327                 interpolateGreys: Greys,
23328                 schemeGreys: scheme$n,
23329                 interpolatePurples: Purples,
23330                 schemePurples: scheme$o,
23331                 interpolateReds: Reds,
23332                 schemeReds: scheme$p,
23333                 interpolateOranges: Oranges,
23334                 schemeOranges: scheme$q,
23335                 interpolateCubehelixDefault: cubehelix$3,
23336                 interpolateRainbow: rainbow,
23337                 interpolateWarm: warm,
23338                 interpolateCool: cool,
23339                 interpolateSinebow: sinebow,
23340                 interpolateViridis: viridis,
23341                 interpolateMagma: magma,
23342                 interpolateInferno: inferno,
23343                 interpolatePlasma: plasma,
23344                 create: create$5,
23345                 creator: creator,
23346                 local: local,
23347                 matcher: matcher,
23348                 mouse: d3_mouse,
23349                 namespace: namespace,
23350                 namespaces: namespaces,
23351                 clientPoint: point,
23352                 select: d3_select,
23353                 selectAll: d3_selectAll,
23354                 selection: selection,
23355                 selector: selector,
23356                 selectorAll: selectorAll,
23357                 style: styleValue,
23358                 touch: touch,
23359                 touches: d3_touches,
23360                 window: defaultView,
23361                 get event () { return event; },
23362                 customEvent: customEvent,
23363                 arc: arc,
23364                 area: area$1,
23365                 line: line,
23366                 pie: pie,
23367                 areaRadial: areaRadial,
23368                 radialArea: areaRadial,
23369                 lineRadial: lineRadial$1,
23370                 radialLine: lineRadial$1,
23371                 pointRadial: pointRadial,
23372                 linkHorizontal: linkHorizontal,
23373                 linkVertical: linkVertical,
23374                 linkRadial: linkRadial,
23375                 symbol: symbol,
23376                 symbols: symbols,
23377                 symbolCircle: circle$2,
23378                 symbolCross: cross$2,
23379                 symbolDiamond: diamond,
23380                 symbolSquare: square,
23381                 symbolStar: star,
23382                 symbolTriangle: triangle,
23383                 symbolWye: wye,
23384                 curveBasisClosed: basisClosed$1,
23385                 curveBasisOpen: basisOpen,
23386                 curveBasis: basis$2,
23387                 curveBundle: bundle,
23388                 curveCardinalClosed: cardinalClosed,
23389                 curveCardinalOpen: cardinalOpen,
23390                 curveCardinal: cardinal,
23391                 curveCatmullRomClosed: catmullRomClosed,
23392                 curveCatmullRomOpen: catmullRomOpen,
23393                 curveCatmullRom: catmullRom,
23394                 curveLinearClosed: linearClosed,
23395                 curveLinear: curveLinear,
23396                 curveMonotoneX: monotoneX,
23397                 curveMonotoneY: monotoneY,
23398                 curveNatural: natural,
23399                 curveStep: step,
23400                 curveStepAfter: stepAfter,
23401                 curveStepBefore: stepBefore,
23402                 stack: stack,
23403                 stackOffsetExpand: expand,
23404                 stackOffsetDiverging: diverging$1,
23405                 stackOffsetNone: none$1,
23406                 stackOffsetSilhouette: silhouette,
23407                 stackOffsetWiggle: wiggle,
23408                 stackOrderAppearance: appearance,
23409                 stackOrderAscending: ascending$2,
23410                 stackOrderDescending: descending$1,
23411                 stackOrderInsideOut: insideOut,
23412                 stackOrderNone: none$2,
23413                 stackOrderReverse: reverse,
23414                 timeInterval: newInterval,
23415                 timeMillisecond: millisecond,
23416                 timeMilliseconds: milliseconds,
23417                 utcMillisecond: millisecond,
23418                 utcMilliseconds: milliseconds,
23419                 timeSecond: second,
23420                 timeSeconds: seconds,
23421                 utcSecond: second,
23422                 utcSeconds: seconds,
23423                 timeMinute: minute,
23424                 timeMinutes: minutes,
23425                 timeHour: hour,
23426                 timeHours: hours,
23427                 timeDay: day,
23428                 timeDays: days,
23429                 timeWeek: sunday,
23430                 timeWeeks: sundays,
23431                 timeSunday: sunday,
23432                 timeSundays: sundays,
23433                 timeMonday: monday,
23434                 timeMondays: mondays,
23435                 timeTuesday: tuesday,
23436                 timeTuesdays: tuesdays,
23437                 timeWednesday: wednesday,
23438                 timeWednesdays: wednesdays,
23439                 timeThursday: thursday,
23440                 timeThursdays: thursdays,
23441                 timeFriday: friday,
23442                 timeFridays: fridays,
23443                 timeSaturday: saturday,
23444                 timeSaturdays: saturdays,
23445                 timeMonth: month,
23446                 timeMonths: months,
23447                 timeYear: year,
23448                 timeYears: years,
23449                 utcMinute: utcMinute,
23450                 utcMinutes: utcMinutes,
23451                 utcHour: utcHour,
23452                 utcHours: utcHours,
23453                 utcDay: utcDay,
23454                 utcDays: utcDays,
23455                 utcWeek: utcSunday,
23456                 utcWeeks: utcSundays,
23457                 utcSunday: utcSunday,
23458                 utcSundays: utcSundays,
23459                 utcMonday: utcMonday,
23460                 utcMondays: utcMondays,
23461                 utcTuesday: utcTuesday,
23462                 utcTuesdays: utcTuesdays,
23463                 utcWednesday: utcWednesday,
23464                 utcWednesdays: utcWednesdays,
23465                 utcThursday: utcThursday,
23466                 utcThursdays: utcThursdays,
23467                 utcFriday: utcFriday,
23468                 utcFridays: utcFridays,
23469                 utcSaturday: utcSaturday,
23470                 utcSaturdays: utcSaturdays,
23471                 utcMonth: utcMonth,
23472                 utcMonths: utcMonths,
23473                 utcYear: utcYear,
23474                 utcYears: utcYears,
23475                 timeFormatDefaultLocale: defaultLocale$1,
23476                 get timeFormat () { return timeFormat; },
23477                 get timeParse () { return timeParse; },
23478                 get utcFormat () { return utcFormat; },
23479                 get utcParse () { return utcParse; },
23480                 timeFormatLocale: formatLocale$1,
23481                 isoFormat: formatIso,
23482                 isoParse: parseIso,
23483                 now: now,
23484                 timer: timer,
23485                 timerFlush: timerFlush,
23486                 timeout: d3_timeout,
23487                 interval: interval$1,
23488                 transition: transition,
23489                 active: active,
23490                 interrupt: interrupt,
23491                 voronoi: voronoi,
23492                 zoom: d3_zoom,
23493                 zoomTransform: transform,
23494                 zoomIdentity: identity$8
23495         });
23496
23497         function actionAddEntity(way) {
23498             return function(graph) {
23499                 return graph.replace(way);
23500             };
23501         }
23502
23503         /*
23504         Order the nodes of a way in reverse order and reverse any direction dependent tags
23505         other than `oneway`. (We assume that correcting a backwards oneway is the primary
23506         reason for reversing a way.)
23507
23508         In addition, numeric-valued `incline` tags are negated.
23509
23510         The JOSM implementation was used as a guide, but transformations that were of unclear benefit
23511         or adjusted tags that don't seem to be used in practice were omitted.
23512
23513         References:
23514             http://wiki.openstreetmap.org/wiki/Forward_%26_backward,_left_%26_right
23515             http://wiki.openstreetmap.org/wiki/Key:direction#Steps
23516             http://wiki.openstreetmap.org/wiki/Key:incline
23517             http://wiki.openstreetmap.org/wiki/Route#Members
23518             http://josm.openstreetmap.de/browser/josm/trunk/src/org/openstreetmap/josm/corrector/ReverseWayTagCorrector.java
23519             http://wiki.openstreetmap.org/wiki/Tag:highway%3Dstop
23520             http://wiki.openstreetmap.org/wiki/Key:traffic_sign#On_a_way_or_area
23521         */
23522         function actionReverse(wayID, options) {
23523             var ignoreKey = /^.*(_|:)?(description|name|note|website|ref|source|comment|watch|attribution)(_|:)?/;
23524             var numeric = /^([+\-]?)(?=[\d.])/;
23525             var turn_lanes = /^turn:lanes:?/;
23526             var keyReplacements = [
23527                 [/:right$/, ':left'],
23528                 [/:left$/, ':right'],
23529                 [/:forward$/, ':backward'],
23530                 [/:backward$/, ':forward'],
23531                 [/:right:/, ':left:'],
23532                 [/:left:/, ':right:'],
23533                 [/:forward:/, ':backward:'],
23534                 [/:backward:/, ':forward:']
23535             ];
23536             var valueReplacements = {
23537                 left: 'right',
23538                 right: 'left',
23539                 up: 'down',
23540                 down: 'up',
23541                 forward: 'backward',
23542                 backward: 'forward',
23543                 forwards: 'backward',
23544                 backwards: 'forward',
23545             };
23546             var roleReplacements = {
23547                 forward: 'backward',
23548                 backward: 'forward',
23549                 forwards: 'backward',
23550                 backwards: 'forward'
23551             };
23552             var onewayReplacements = {
23553                 yes: '-1',
23554                 '1': '-1',
23555                 '-1': 'yes'
23556             };
23557
23558
23559             function reverseKey(key) {
23560                 for (var i = 0; i < keyReplacements.length; ++i) {
23561                     var replacement = keyReplacements[i];
23562                     if (replacement[0].test(key)) {
23563                         return key.replace(replacement[0], replacement[1]);
23564                     }
23565                 }
23566                 return key;
23567             }
23568
23569
23570             function reverseValue(key, value) {
23571                 if (ignoreKey.test(key)) return value;
23572
23573                 // Turn lanes are left/right to key (not way) direction - #5674
23574                 if (turn_lanes.test(key)) {
23575                     return value;
23576                 } else if (key === 'incline' && numeric.test(value)) {
23577                     return value.replace(numeric, function(_, sign) { return sign === '-' ? '' : '-'; });
23578                 } else if (options && options.reverseOneway && key === 'oneway') {
23579                     return onewayReplacements[value] || value;
23580                 } else {
23581                     return valueReplacements[value] || value;
23582                 }
23583             }
23584
23585
23586             // Reverse the direction of tags attached to the nodes - #3076
23587             function reverseNodeTags(graph, nodeIDs) {
23588                 for (var i = 0; i < nodeIDs.length; i++) {
23589                     var node = graph.hasEntity(nodeIDs[i]);
23590                     if (!node || !Object.keys(node.tags).length) continue;
23591
23592                     var tags = {};
23593                     for (var key in node.tags) {
23594                         tags[reverseKey(key)] = reverseValue(key, node.tags[key]);
23595                     }
23596                     graph = graph.replace(node.update({tags: tags}));
23597                 }
23598                 return graph;
23599             }
23600
23601
23602             return function(graph) {
23603                 var way = graph.entity(wayID);
23604                 var nodes = way.nodes.slice().reverse();
23605                 var tags = {};
23606                 var role;
23607
23608                 for (var key in way.tags) {
23609                     tags[reverseKey(key)] = reverseValue(key, way.tags[key]);
23610                 }
23611
23612                 graph.parentRelations(way).forEach(function(relation) {
23613                     relation.members.forEach(function(member, index) {
23614                         if (member.id === way.id && (role = roleReplacements[member.role])) {
23615                             relation = relation.updateMember({role: role}, index);
23616                             graph = graph.replace(relation);
23617                         }
23618                     });
23619                 });
23620
23621                 // Reverse any associated directions on nodes on the way and then replace
23622                 // the way itself with the reversed node ids and updated way tags
23623                 return reverseNodeTags(graph, nodes)
23624                     .replace(way.update({nodes: nodes, tags: tags}));
23625             };
23626         }
23627
23628         function osmIsInterestingTag(key) {
23629             return key !== 'attribution' &&
23630                 key !== 'created_by' &&
23631                 key !== 'source' &&
23632                 key !== 'odbl' &&
23633                 key.indexOf('tiger:') !== 0;
23634         }
23635
23636         var osmAreaKeys = {};
23637         function osmSetAreaKeys(value) {
23638             osmAreaKeys = value;
23639         }
23640
23641         // Tags that indicate a node can be a standalone point
23642         // e.g. { amenity: { bar: true, parking: true, ... } ... }
23643         var osmPointTags = {};
23644         function osmSetPointTags(value) {
23645             osmPointTags = value;
23646         }
23647         // Tags that indicate a node can be part of a way
23648         // e.g. { amenity: { parking: true, ... }, highway: { stop: true ... } ... }
23649         var osmVertexTags = {};
23650         function osmSetVertexTags(value) {
23651             osmVertexTags = value;
23652         }
23653
23654         function osmNodeGeometriesForTags(nodeTags) {
23655             var geometries = {};
23656             for (var key in nodeTags) {
23657                 if (osmPointTags[key] &&
23658                     (osmPointTags[key]['*'] || osmPointTags[key][nodeTags[key]])) {
23659                     geometries.point = true;
23660                 }
23661                 if (osmVertexTags[key] &&
23662                     (osmVertexTags[key]['*'] || osmVertexTags[key][nodeTags[key]])) {
23663                     geometries.vertex = true;
23664                 }
23665                 // break early if both are already supported
23666                 if (geometries.point && geometries.vertex) break;
23667             }
23668             return geometries;
23669         }
23670
23671         var osmOneWayTags = {
23672             'aerialway': {
23673                 'chair_lift': true,
23674                 'drag_lift': true,
23675                 'j-bar': true,
23676                 'magic_carpet': true,
23677                 'mixed_lift': true,
23678                 'platter': true,
23679                 'rope_tow': true,
23680                 't-bar': true,
23681                 'zip_line': true
23682             },
23683             'highway': {
23684                 'motorway': true
23685             },
23686             'junction': {
23687                 'circular': true,
23688                 'roundabout': true
23689             },
23690             'man_made': {
23691                 'piste:halfpipe': true
23692             },
23693             'piste:type': {
23694                 'downhill': true,
23695                 'sled': true,
23696                 'yes': true
23697             },
23698             'waterway': {
23699                 'canal': true,
23700                 'ditch': true,
23701                 'drain': true,
23702                 'river': true,
23703                 'stream': true
23704             }
23705         };
23706
23707
23708         var osmPavedTags = {
23709             'surface': {
23710                 'paved': true,
23711                 'asphalt': true,
23712                 'concrete': true,
23713                 'concrete:lanes': true,
23714                 'concrete:plates': true
23715             },
23716             'tracktype': {
23717                 'grade1': true
23718             }
23719         };
23720
23721         var osmRightSideIsInsideTags = {
23722             'natural': {
23723                 'cliff': true,
23724                 'coastline': 'coastline',
23725             },
23726             'barrier': {
23727                 'retaining_wall': true,
23728                 'kerb': true,
23729                 'guard_rail': true,
23730                 'city_wall': true,
23731             },
23732             'man_made': {
23733                 'embankment': true
23734             }
23735         };
23736
23737         // "highway" tag values for pedestrian or vehicle right-of-ways that make up the routable network
23738         // (does not include `raceway`)
23739         var osmRoutableHighwayTagValues = {
23740             motorway: true, trunk: true, primary: true, secondary: true, tertiary: true, residential: true,
23741             motorway_link: true, trunk_link: true, primary_link: true, secondary_link: true, tertiary_link: true,
23742             unclassified: true, road: true, service: true, track: true, living_street: true, bus_guideway: true,
23743             path: true, footway: true, cycleway: true, bridleway: true, pedestrian: true, corridor: true, steps: true
23744         };
23745         // "highway" tag values that generally do not allow motor vehicles
23746         var osmPathHighwayTagValues = {
23747             path: true, footway: true, cycleway: true, bridleway: true, pedestrian: true, corridor: true, steps: true
23748         };
23749
23750         // "railway" tag values representing existing railroad tracks (purposely does not include 'abandoned')
23751         var osmRailwayTrackTagValues = {
23752             rail: true, light_rail: true, tram: true, subway: true,
23753             monorail: true, funicular: true, miniature: true, narrow_gauge: true,
23754             disused: true, preserved: true
23755         };
23756
23757         // "waterway" tag values for line features representing water flow
23758         var osmFlowingWaterwayTagValues = {
23759             canal: true, ditch: true, drain: true, river: true, stream: true
23760         };
23761
23762         // constants
23763         var TAU = 2 * Math.PI;
23764         var EQUATORIAL_RADIUS = 6356752.314245179;
23765         var POLAR_RADIUS = 6378137.0;
23766
23767
23768         function geoLatToMeters(dLat) {
23769             return dLat * (TAU * POLAR_RADIUS / 360);
23770         }
23771
23772
23773         function geoLonToMeters(dLon, atLat) {
23774             return Math.abs(atLat) >= 90 ? 0 :
23775                 dLon * (TAU * EQUATORIAL_RADIUS / 360) * Math.abs(Math.cos(atLat * (Math.PI / 180)));
23776         }
23777
23778
23779         function geoMetersToLat(m) {
23780             return m / (TAU * POLAR_RADIUS / 360);
23781         }
23782
23783
23784         function geoMetersToLon(m, atLat) {
23785             return Math.abs(atLat) >= 90 ? 0 :
23786                 m / (TAU * EQUATORIAL_RADIUS / 360) / Math.abs(Math.cos(atLat * (Math.PI / 180)));
23787         }
23788
23789
23790         function geoMetersToOffset(meters, tileSize) {
23791             tileSize = tileSize || 256;
23792             return [
23793                 meters[0] * tileSize / (TAU * EQUATORIAL_RADIUS),
23794                 -meters[1] * tileSize / (TAU * POLAR_RADIUS)
23795             ];
23796         }
23797
23798
23799         function geoOffsetToMeters(offset, tileSize) {
23800             tileSize = tileSize || 256;
23801             return [
23802                 offset[0] * TAU * EQUATORIAL_RADIUS / tileSize,
23803                 -offset[1] * TAU * POLAR_RADIUS / tileSize
23804             ];
23805         }
23806
23807
23808         // Equirectangular approximation of spherical distances on Earth
23809         function geoSphericalDistance(a, b) {
23810             var x = geoLonToMeters(a[0] - b[0], (a[1] + b[1]) / 2);
23811             var y = geoLatToMeters(a[1] - b[1]);
23812             return Math.sqrt((x * x) + (y * y));
23813         }
23814
23815
23816         // scale to zoom
23817         function geoScaleToZoom(k, tileSize) {
23818             tileSize = tileSize || 256;
23819             var log2ts = Math.log(tileSize) * Math.LOG2E;
23820             return Math.log(k * TAU) / Math.LN2 - log2ts;
23821         }
23822
23823
23824         // zoom to scale
23825         function geoZoomToScale(z, tileSize) {
23826             tileSize = tileSize || 256;
23827             return tileSize * Math.pow(2, z) / TAU;
23828         }
23829
23830
23831         // returns info about the node from `nodes` closest to the given `point`
23832         function geoSphericalClosestNode(nodes, point) {
23833             var minDistance = Infinity, distance;
23834             var indexOfMin;
23835
23836             for (var i in nodes) {
23837                 distance = geoSphericalDistance(nodes[i].loc, point);
23838                 if (distance < minDistance) {
23839                     minDistance = distance;
23840                     indexOfMin = i;
23841                 }
23842             }
23843
23844             if (indexOfMin !== undefined) {
23845                 return { index: indexOfMin, distance: minDistance, node: nodes[indexOfMin] };
23846             } else {
23847                 return null;
23848             }
23849         }
23850
23851         function geoExtent(min, max) {
23852             if (!(this instanceof geoExtent)) {
23853                 return new geoExtent(min, max);
23854             } else if (min instanceof geoExtent) {
23855                 return min;
23856             } else if (min && min.length === 2 && min[0].length === 2 && min[1].length === 2) {
23857                 this[0] = min[0];
23858                 this[1] = min[1];
23859             } else {
23860                 this[0] = min        || [ Infinity,  Infinity];
23861                 this[1] = max || min || [-Infinity, -Infinity];
23862             }
23863         }
23864
23865         geoExtent.prototype = new Array(2);
23866
23867         Object.assign(geoExtent.prototype, {
23868
23869             equals: function (obj) {
23870                 return this[0][0] === obj[0][0] &&
23871                     this[0][1] === obj[0][1] &&
23872                     this[1][0] === obj[1][0] &&
23873                     this[1][1] === obj[1][1];
23874             },
23875
23876
23877             extend: function(obj) {
23878                 if (!(obj instanceof geoExtent)) obj = new geoExtent(obj);
23879                 return geoExtent(
23880                     [Math.min(obj[0][0], this[0][0]), Math.min(obj[0][1], this[0][1])],
23881                     [Math.max(obj[1][0], this[1][0]), Math.max(obj[1][1], this[1][1])]
23882                 );
23883             },
23884
23885
23886             _extend: function(extent) {
23887                 this[0][0] = Math.min(extent[0][0], this[0][0]);
23888                 this[0][1] = Math.min(extent[0][1], this[0][1]);
23889                 this[1][0] = Math.max(extent[1][0], this[1][0]);
23890                 this[1][1] = Math.max(extent[1][1], this[1][1]);
23891             },
23892
23893
23894             area: function() {
23895                 return Math.abs((this[1][0] - this[0][0]) * (this[1][1] - this[0][1]));
23896             },
23897
23898
23899             center: function() {
23900                 return [(this[0][0] + this[1][0]) / 2, (this[0][1] + this[1][1]) / 2];
23901             },
23902
23903
23904             rectangle: function() {
23905                 return [this[0][0], this[0][1], this[1][0], this[1][1]];
23906             },
23907
23908
23909             bbox: function() {
23910                 return { minX: this[0][0], minY: this[0][1], maxX: this[1][0], maxY: this[1][1] };
23911             },
23912
23913
23914             polygon: function() {
23915                 return [
23916                     [this[0][0], this[0][1]],
23917                     [this[0][0], this[1][1]],
23918                     [this[1][0], this[1][1]],
23919                     [this[1][0], this[0][1]],
23920                     [this[0][0], this[0][1]]
23921                 ];
23922             },
23923
23924
23925             contains: function(obj) {
23926                 if (!(obj instanceof geoExtent)) obj = new geoExtent(obj);
23927                 return obj[0][0] >= this[0][0] &&
23928                        obj[0][1] >= this[0][1] &&
23929                        obj[1][0] <= this[1][0] &&
23930                        obj[1][1] <= this[1][1];
23931             },
23932
23933
23934             intersects: function(obj) {
23935                 if (!(obj instanceof geoExtent)) obj = new geoExtent(obj);
23936                 return obj[0][0] <= this[1][0] &&
23937                        obj[0][1] <= this[1][1] &&
23938                        obj[1][0] >= this[0][0] &&
23939                        obj[1][1] >= this[0][1];
23940             },
23941
23942
23943             intersection: function(obj) {
23944                 if (!this.intersects(obj)) return new geoExtent();
23945                 return new geoExtent(
23946                     [Math.max(obj[0][0], this[0][0]), Math.max(obj[0][1], this[0][1])],
23947                     [Math.min(obj[1][0], this[1][0]), Math.min(obj[1][1], this[1][1])]
23948                 );
23949             },
23950
23951
23952             percentContainedIn: function(obj) {
23953                 if (!(obj instanceof geoExtent)) obj = new geoExtent(obj);
23954                 var a1 = this.intersection(obj).area();
23955                 var a2 = this.area();
23956
23957                 if (a1 === Infinity || a2 === Infinity || a1 === 0 || a2 === 0) {
23958                     return 0;
23959                 } else {
23960                     return a1 / a2;
23961                 }
23962             },
23963
23964
23965             padByMeters: function(meters) {
23966                 var dLat = geoMetersToLat(meters);
23967                 var dLon = geoMetersToLon(meters, this.center()[1]);
23968                 return geoExtent(
23969                     [this[0][0] - dLon, this[0][1] - dLat],
23970                     [this[1][0] + dLon, this[1][1] + dLat]
23971                 );
23972             },
23973
23974
23975             toParam: function() {
23976                 return this.rectangle().join(',');
23977             }
23978
23979         });
23980
23981         // vector equals
23982         function geoVecEqual(a, b, epsilon) {
23983             if (epsilon) {
23984                 return (Math.abs(a[0] - b[0]) <= epsilon) && (Math.abs(a[1] - b[1]) <= epsilon);
23985             } else {
23986                 return (a[0] === b[0]) && (a[1] === b[1]);
23987             }
23988         }
23989
23990         // vector addition
23991         function geoVecAdd(a, b) {
23992             return [ a[0] + b[0], a[1] + b[1] ];
23993         }
23994
23995         // vector subtraction
23996         function geoVecSubtract(a, b) {
23997             return [ a[0] - b[0], a[1] - b[1] ];
23998         }
23999
24000         // vector scaling
24001         function geoVecScale(a, mag) {
24002             return [ a[0] * mag, a[1] * mag ];
24003         }
24004
24005         // vector rounding (was: geoRoundCoordinates)
24006         function geoVecFloor(a) {
24007             return [ Math.floor(a[0]), Math.floor(a[1]) ];
24008         }
24009
24010         // linear interpolation
24011         function geoVecInterp(a, b, t) {
24012             return [
24013                 a[0] + (b[0] - a[0]) * t,
24014                 a[1] + (b[1] - a[1]) * t
24015             ];
24016         }
24017
24018         // http://jsperf.com/id-dist-optimization
24019         function geoVecLength(a, b) {
24020             b = b || [0, 0];
24021             var x = a[0] - b[0];
24022             var y = a[1] - b[1];
24023             return Math.sqrt((x * x) + (y * y));
24024         }
24025
24026         // get a unit vector
24027         function geoVecNormalize(a) {
24028             var length = Math.sqrt((a[0] * a[0]) + (a[1] * a[1]));
24029             if (length !== 0) {
24030                 return geoVecScale(a, 1 / length);
24031             }
24032             return [0, 0];
24033         }
24034
24035         // Return the counterclockwise angle in the range (-pi, pi)
24036         // between the positive X axis and the line intersecting a and b.
24037         function geoVecAngle(a, b) {
24038             return Math.atan2(b[1] - a[1], b[0] - a[0]);
24039         }
24040
24041         // dot product
24042         function geoVecDot(a, b, origin) {
24043             origin = origin || [0, 0];
24044             var p = geoVecSubtract(a, origin);
24045             var q = geoVecSubtract(b, origin);
24046             return (p[0]) * (q[0]) + (p[1]) * (q[1]);
24047         }
24048
24049         // normalized dot product
24050         function geoVecNormalizedDot(a, b, origin) {
24051             origin = origin || [0, 0];
24052             var p = geoVecNormalize(geoVecSubtract(a, origin));
24053             var q = geoVecNormalize(geoVecSubtract(b, origin));
24054             return geoVecDot(p, q);
24055         }
24056
24057         // 2D cross product of OA and OB vectors, returns magnitude of Z vector
24058         // Returns a positive value, if OAB makes a counter-clockwise turn,
24059         // negative for clockwise turn, and zero if the points are collinear.
24060         function geoVecCross(a, b, origin) {
24061             origin = origin || [0, 0];
24062             var p = geoVecSubtract(a, origin);
24063             var q = geoVecSubtract(b, origin);
24064             return (p[0]) * (q[1]) - (p[1]) * (q[0]);
24065         }
24066
24067
24068         // find closest orthogonal projection of point onto points array
24069         function geoVecProject(a, points) {
24070             var min = Infinity;
24071             var idx;
24072             var target;
24073
24074             for (var i = 0; i < points.length - 1; i++) {
24075                 var o = points[i];
24076                 var s = geoVecSubtract(points[i + 1], o);
24077                 var v = geoVecSubtract(a, o);
24078                 var proj = geoVecDot(v, s) / geoVecDot(s, s);
24079                 var p;
24080
24081                 if (proj < 0) {
24082                     p = o;
24083                 } else if (proj > 1) {
24084                     p = points[i + 1];
24085                 } else {
24086                     p = [o[0] + proj * s[0], o[1] + proj * s[1]];
24087                 }
24088
24089                 var dist = geoVecLength(p, a);
24090                 if (dist < min) {
24091                     min = dist;
24092                     idx = i + 1;
24093                     target = p;
24094                 }
24095             }
24096
24097             if (idx !== undefined) {
24098                 return { index: idx, distance: min, target: target };
24099             } else {
24100                 return null;
24101             }
24102         }
24103
24104         // Return the counterclockwise angle in the range (-pi, pi)
24105         // between the positive X axis and the line intersecting a and b.
24106         function geoAngle(a, b, projection) {
24107             return geoVecAngle(projection(a.loc), projection(b.loc));
24108         }
24109
24110
24111         function geoEdgeEqual(a, b) {
24112             return (a[0] === b[0] && a[1] === b[1]) ||
24113                 (a[0] === b[1] && a[1] === b[0]);
24114         }
24115
24116
24117         // Rotate all points counterclockwise around a pivot point by given angle
24118         function geoRotate(points, angle, around) {
24119             return points.map(function(point) {
24120                 var radial = geoVecSubtract(point, around);
24121                 return [
24122                     radial[0] * Math.cos(angle) - radial[1] * Math.sin(angle) + around[0],
24123                     radial[0] * Math.sin(angle) + radial[1] * Math.cos(angle) + around[1]
24124                 ];
24125             });
24126         }
24127
24128
24129         // Choose the edge with the minimal distance from `point` to its orthogonal
24130         // projection onto that edge, if such a projection exists, or the distance to
24131         // the closest vertex on that edge. Returns an object with the `index` of the
24132         // chosen edge, the chosen `loc` on that edge, and the `distance` to to it.
24133         function geoChooseEdge(nodes, point, projection, activeID) {
24134             var dist = geoVecLength;
24135             var points = nodes.map(function(n) { return projection(n.loc); });
24136             var ids = nodes.map(function(n) { return n.id; });
24137             var min = Infinity;
24138             var idx;
24139             var loc;
24140
24141             for (var i = 0; i < points.length - 1; i++) {
24142                 if (ids[i] === activeID || ids[i + 1] === activeID) continue;
24143
24144                 var o = points[i];
24145                 var s = geoVecSubtract(points[i + 1], o);
24146                 var v = geoVecSubtract(point, o);
24147                 var proj = geoVecDot(v, s) / geoVecDot(s, s);
24148                 var p;
24149
24150                 if (proj < 0) {
24151                     p = o;
24152                 } else if (proj > 1) {
24153                     p = points[i + 1];
24154                 } else {
24155                     p = [o[0] + proj * s[0], o[1] + proj * s[1]];
24156                 }
24157
24158                 var d = dist(p, point);
24159                 if (d < min) {
24160                     min = d;
24161                     idx = i + 1;
24162                     loc = projection.invert(p);
24163                 }
24164             }
24165
24166             if (idx !== undefined) {
24167                 return { index: idx, distance: min, loc: loc };
24168             } else {
24169                 return null;
24170             }
24171         }
24172
24173
24174         // Test active (dragged or drawing) segments against inactive segments
24175         // This is used to test e.g. multipolygon rings that cross
24176         // `activeNodes` is the ring containing the activeID being dragged.
24177         // `inactiveNodes` is the other ring to test against
24178         function geoHasLineIntersections(activeNodes, inactiveNodes, activeID) {
24179             var actives = [];
24180             var inactives = [];
24181             var j, k, n1, n2, segment;
24182
24183             // gather active segments (only segments in activeNodes that contain the activeID)
24184             for (j = 0; j < activeNodes.length - 1; j++) {
24185                 n1 = activeNodes[j];
24186                 n2 = activeNodes[j+1];
24187                 segment = [n1.loc, n2.loc];
24188                 if (n1.id === activeID || n2.id === activeID) {
24189                     actives.push(segment);
24190                 }
24191             }
24192
24193             // gather inactive segments
24194             for (j = 0; j < inactiveNodes.length - 1; j++) {
24195                 n1 = inactiveNodes[j];
24196                 n2 = inactiveNodes[j+1];
24197                 segment = [n1.loc, n2.loc];
24198                 inactives.push(segment);
24199             }
24200
24201             // test
24202             for (j = 0; j < actives.length; j++) {
24203                 for (k = 0; k < inactives.length; k++) {
24204                     var p = actives[j];
24205                     var q = inactives[k];
24206                     var hit = geoLineIntersection(p, q);
24207                     if (hit) {
24208                         return true;
24209                     }
24210                 }
24211             }
24212
24213             return false;
24214         }
24215
24216
24217         // Test active (dragged or drawing) segments against inactive segments
24218         // This is used to test whether a way intersects with itself.
24219         function geoHasSelfIntersections(nodes, activeID) {
24220             var actives = [];
24221             var inactives = [];
24222             var j, k;
24223
24224             // group active and passive segments along the nodes
24225             for (j = 0; j < nodes.length - 1; j++) {
24226                 var n1 = nodes[j];
24227                 var n2 = nodes[j+1];
24228                 var segment = [n1.loc, n2.loc];
24229                 if (n1.id === activeID || n2.id === activeID) {
24230                     actives.push(segment);
24231                 } else {
24232                     inactives.push(segment);
24233                 }
24234             }
24235
24236             // test
24237             for (j = 0; j < actives.length; j++) {
24238                 for (k = 0; k < inactives.length; k++) {
24239                     var p = actives[j];
24240                     var q = inactives[k];
24241                     // skip if segments share an endpoint
24242                     if (geoVecEqual(p[1], q[0]) || geoVecEqual(p[0], q[1]) ||
24243                         geoVecEqual(p[0], q[0]) || geoVecEqual(p[1], q[1]) ) {
24244                         continue;
24245                     }
24246
24247                     var hit = geoLineIntersection(p, q);
24248                     if (hit) {
24249                         var epsilon = 1e-8;
24250                         // skip if the hit is at the segment's endpoint
24251                         if (geoVecEqual(p[1], hit, epsilon) || geoVecEqual(p[0], hit, epsilon) ||
24252                             geoVecEqual(q[1], hit, epsilon) || geoVecEqual(q[0], hit, epsilon) ) {
24253                             continue;
24254                         } else {
24255                             return true;
24256                         }
24257                     }
24258                 }
24259             }
24260
24261             return false;
24262         }
24263
24264
24265         // Return the intersection point of 2 line segments.
24266         // From https://github.com/pgkelley4/line-segments-intersect
24267         // This uses the vector cross product approach described below:
24268         //  http://stackoverflow.com/a/565282/786339
24269         function geoLineIntersection(a, b) {
24270             var p = [a[0][0], a[0][1]];
24271             var p2 = [a[1][0], a[1][1]];
24272             var q = [b[0][0], b[0][1]];
24273             var q2 = [b[1][0], b[1][1]];
24274             var r = geoVecSubtract(p2, p);
24275             var s = geoVecSubtract(q2, q);
24276             var uNumerator = geoVecCross(geoVecSubtract(q, p), r);
24277             var denominator = geoVecCross(r, s);
24278
24279             if (uNumerator && denominator) {
24280                 var u = uNumerator / denominator;
24281                 var t = geoVecCross(geoVecSubtract(q, p), s) / denominator;
24282
24283                 if ((t >= 0) && (t <= 1) && (u >= 0) && (u <= 1)) {
24284                     return geoVecInterp(p, p2, t);
24285                 }
24286             }
24287
24288             return null;
24289         }
24290
24291
24292         function geoPathIntersections(path1, path2) {
24293             var intersections = [];
24294             for (var i = 0; i < path1.length - 1; i++) {
24295                 for (var j = 0; j < path2.length - 1; j++) {
24296                     var a = [ path1[i], path1[i+1] ];
24297                     var b = [ path2[j], path2[j+1] ];
24298                     var hit = geoLineIntersection(a, b);
24299                     if (hit) {
24300                         intersections.push(hit);
24301                     }
24302                 }
24303             }
24304             return intersections;
24305         }
24306
24307         function geoPathHasIntersections(path1, path2) {
24308             for (var i = 0; i < path1.length - 1; i++) {
24309                 for (var j = 0; j < path2.length - 1; j++) {
24310                     var a = [ path1[i], path1[i+1] ];
24311                     var b = [ path2[j], path2[j+1] ];
24312                     var hit = geoLineIntersection(a, b);
24313                     if (hit) {
24314                         return true;
24315                     }
24316                 }
24317             }
24318             return false;
24319         }
24320
24321
24322         // Return whether point is contained in polygon.
24323         //
24324         // `point` should be a 2-item array of coordinates.
24325         // `polygon` should be an array of 2-item arrays of coordinates.
24326         //
24327         // From https://github.com/substack/point-in-polygon.
24328         // ray-casting algorithm based on
24329         // http://www.ecse.rpi.edu/Homepages/wrf/Research/Short_Notes/pnpoly.html
24330         //
24331         function geoPointInPolygon(point, polygon) {
24332             var x = point[0];
24333             var y = point[1];
24334             var inside = false;
24335
24336             for (var i = 0, j = polygon.length - 1; i < polygon.length; j = i++) {
24337                 var xi = polygon[i][0];
24338                 var yi = polygon[i][1];
24339                 var xj = polygon[j][0];
24340                 var yj = polygon[j][1];
24341
24342                 var intersect = ((yi > y) !== (yj > y)) &&
24343                     (x < (xj - xi) * (y - yi) / (yj - yi) + xi);
24344                 if (intersect) inside = !inside;
24345             }
24346
24347             return inside;
24348         }
24349
24350
24351         function geoPolygonContainsPolygon(outer, inner) {
24352             return inner.every(function(point) {
24353                 return geoPointInPolygon(point, outer);
24354             });
24355         }
24356
24357
24358         function geoPolygonIntersectsPolygon(outer, inner, checkSegments) {
24359             function testPoints(outer, inner) {
24360                 return inner.some(function(point) {
24361                     return geoPointInPolygon(point, outer);
24362                 });
24363             }
24364
24365            return testPoints(outer, inner) || (!!checkSegments && geoPathHasIntersections(outer, inner));
24366         }
24367
24368
24369         // http://gis.stackexchange.com/questions/22895/finding-minimum-area-rectangle-for-given-points
24370         // http://gis.stackexchange.com/questions/3739/generalisation-strategies-for-building-outlines/3756#3756
24371         function geoGetSmallestSurroundingRectangle(points) {
24372             var hull = d3_polygonHull(points);
24373             var centroid = d3_polygonCentroid(hull);
24374             var minArea = Infinity;
24375             var ssrExtent = [];
24376             var ssrAngle = 0;
24377             var c1 = hull[0];
24378
24379             for (var i = 0; i <= hull.length - 1; i++) {
24380                 var c2 = (i === hull.length - 1) ? hull[0] : hull[i + 1];
24381                 var angle = Math.atan2(c2[1] - c1[1], c2[0] - c1[0]);
24382                 var poly = geoRotate(hull, -angle, centroid);
24383                 var extent = poly.reduce(function(extent, point) {
24384                     return extent.extend(geoExtent(point));
24385                 }, geoExtent());
24386
24387                 var area = extent.area();
24388                 if (area < minArea) {
24389                     minArea = area;
24390                     ssrExtent = extent;
24391                     ssrAngle = angle;
24392                 }
24393                 c1 = c2;
24394             }
24395
24396             return {
24397                 poly: geoRotate(ssrExtent.polygon(), ssrAngle, centroid),
24398                 angle: ssrAngle
24399             };
24400         }
24401
24402
24403         function geoPathLength(path) {
24404             var length = 0;
24405             for (var i = 0; i < path.length - 1; i++) {
24406                 length += geoVecLength(path[i], path[i + 1]);
24407             }
24408             return length;
24409         }
24410
24411
24412         // If the given point is at the edge of the padded viewport,
24413         // return a vector that will nudge the viewport in that direction
24414         function geoViewportEdge(point, dimensions) {
24415             var pad = [80, 20, 50, 20];   // top, right, bottom, left
24416             var x = 0;
24417             var y = 0;
24418
24419             if (point[0] > dimensions[0] - pad[1])
24420                 x = -10;
24421             if (point[0] < pad[3])
24422                 x = 10;
24423             if (point[1] > dimensions[1] - pad[2])
24424                 y = -10;
24425             if (point[1] < pad[0])
24426                 y = 10;
24427
24428             if (x || y) {
24429                 return [x, y];
24430             } else {
24431                 return null;
24432             }
24433         }
24434
24435         /*
24436             Bypasses features of D3's default projection stream pipeline that are unnecessary:
24437             * Antimeridian clipping
24438             * Spherical rotation
24439             * Resampling
24440         */
24441         function geoRawMercator() {
24442             var project = mercatorRaw;
24443             var k = 512 / Math.PI; // scale
24444             var x = 0;
24445             var y = 0; // translate
24446             var clipExtent = [[0, 0], [0, 0]];
24447
24448
24449             function projection(point) {
24450                 point = project(point[0] * Math.PI / 180, point[1] * Math.PI / 180);
24451                 return [point[0] * k + x, y - point[1] * k];
24452             }
24453
24454
24455             projection.invert = function(point) {
24456                 point = project.invert((point[0] - x) / k, (y - point[1]) / k);
24457                 return point && [point[0] * 180 / Math.PI, point[1] * 180 / Math.PI];
24458             };
24459
24460
24461             projection.scale = function(_) {
24462                 if (!arguments.length) return k;
24463                 k = +_;
24464                 return projection;
24465             };
24466
24467
24468             projection.translate = function(_) {
24469                 if (!arguments.length) return [x, y];
24470                 x = +_[0];
24471                 y = +_[1];
24472                 return projection;
24473             };
24474
24475
24476             projection.clipExtent = function(_) {
24477                 if (!arguments.length) return clipExtent;
24478                 clipExtent = _;
24479                 return projection;
24480             };
24481
24482
24483             projection.transform = function(obj) {
24484                 if (!arguments.length) return identity$8.translate(x, y).scale(k);
24485                 x = +obj.x;
24486                 y = +obj.y;
24487                 k = +obj.k;
24488                 return projection;
24489             };
24490
24491
24492             projection.stream = d3_geoTransform({
24493                 point: function(x, y) {
24494                     var vec = projection([x, y]);
24495                     this.stream.point(vec[0], vec[1]);
24496                 }
24497             }).stream;
24498
24499
24500             return projection;
24501         }
24502
24503         function geoOrthoNormalizedDotProduct(a, b, origin) {
24504             if (geoVecEqual(origin, a) || geoVecEqual(origin, b)) {
24505                 return 1;  // coincident points, treat as straight and try to remove
24506             }
24507             return geoVecNormalizedDot(a, b, origin);
24508         }
24509
24510
24511         function geoOrthoFilterDotProduct(dotp, epsilon, lowerThreshold, upperThreshold, allowStraightAngles) {
24512             var val = Math.abs(dotp);
24513             if (val < epsilon) {
24514                 return 0;      // already orthogonal
24515             } else if (allowStraightAngles && Math.abs(val-1) < epsilon) {
24516                 return 0;      // straight angle, which is okay in this case
24517             } else if (val < lowerThreshold || val > upperThreshold) {
24518                 return dotp;   // can be adjusted
24519             } else {
24520                 return null;   // ignore vertex
24521             }
24522         }
24523
24524
24525         function geoOrthoCalcScore(points, isClosed, epsilon, threshold) {
24526             var score = 0;
24527             var first = isClosed ? 0 : 1;
24528             var last = isClosed ? points.length : points.length - 1;
24529             var coords = points.map(function(p) { return p.coord; });
24530
24531             var lowerThreshold = Math.cos((90 - threshold) * Math.PI / 180);
24532             var upperThreshold = Math.cos(threshold * Math.PI / 180);
24533
24534             for (var i = first; i < last; i++) {
24535                 var a = coords[(i - 1 + coords.length) % coords.length];
24536                 var origin = coords[i];
24537                 var b = coords[(i + 1) % coords.length];
24538
24539                 var dotp = geoOrthoFilterDotProduct(geoOrthoNormalizedDotProduct(a, b, origin), epsilon, lowerThreshold, upperThreshold);
24540                 if (dotp === null) continue;    // ignore vertex
24541                 score = score + 2.0 * Math.min(Math.abs(dotp - 1.0), Math.min(Math.abs(dotp), Math.abs(dotp + 1)));
24542             }
24543
24544             return score;
24545         }
24546
24547         // returns the maximum angle less than `lessThan` between the actual corner and a 0° or 90° corner
24548         function geoOrthoMaxOffsetAngle(coords, isClosed, lessThan) {
24549             var max = -Infinity;
24550
24551             var first = isClosed ? 0 : 1;
24552             var last = isClosed ? coords.length : coords.length - 1;
24553
24554             for (var i = first; i < last; i++) {
24555                 var a = coords[(i - 1 + coords.length) % coords.length];
24556                 var origin = coords[i];
24557                 var b = coords[(i + 1) % coords.length];
24558                 var normalizedDotP = geoOrthoNormalizedDotProduct(a, b, origin);
24559
24560                 var angle = Math.acos(Math.abs(normalizedDotP)) * 180 / Math.PI;
24561
24562                 if (angle > 45) angle = 90 - angle;
24563
24564                 if (angle >= lessThan) continue;
24565
24566                 if (angle > max) max = angle;
24567             }
24568
24569             if (max === -Infinity) return null;
24570
24571             return max;
24572         }
24573
24574
24575         // similar to geoOrthoCalcScore, but returns quickly if there is something to do
24576         function geoOrthoCanOrthogonalize(coords, isClosed, epsilon, threshold, allowStraightAngles) {
24577             var score = null;
24578             var first = isClosed ? 0 : 1;
24579             var last = isClosed ? coords.length : coords.length - 1;
24580
24581             var lowerThreshold = Math.cos((90 - threshold) * Math.PI / 180);
24582             var upperThreshold = Math.cos(threshold * Math.PI / 180);
24583
24584             for (var i = first; i < last; i++) {
24585                 var a = coords[(i - 1 + coords.length) % coords.length];
24586                 var origin = coords[i];
24587                 var b = coords[(i + 1) % coords.length];
24588
24589                 var dotp = geoOrthoFilterDotProduct(geoOrthoNormalizedDotProduct(a, b, origin), epsilon, lowerThreshold, upperThreshold, allowStraightAngles);
24590                 if (dotp === null) continue;        // ignore vertex
24591                 if (Math.abs(dotp) > 0) return 1;   // something to do
24592                 score = 0;                          // already square
24593             }
24594
24595             return score;
24596         }
24597
24598         var wikibooks = [["Afrikaans","Afrikaans","af"],["Arabic","العربية","ar"],["Azerbaijani","azərbaycanca","az"],["Belarusian","беларуская","be"],["Bulgarian","български","bg"],["Bangla","বাংলা","bn"],["Bosnian","bosanski","bs"],["Catalan","català","ca"],["Czech","čeština","cs"],["Chuvash","Чӑвашла","cv"],["Welsh","Cymraeg","cy"],["Danish","dansk","da"],["German","Deutsch","de"],["Greek","Ελληνικά","el"],["English","English","en"],["Esperanto","Esperanto","eo"],["Spanish","español","es"],["Estonian","eesti","et"],["Basque","euskara","eu"],["Persian","فارسی","fa"],["Finnish","suomi","fi"],["French","français","fr"],["Western Frisian","Frysk","fy"],["Galician","galego","gl"],["Hebrew","עברית","he"],["Hindi","हिन्दी","hi"],["Croatian","hrvatski","hr"],["Hungarian","magyar","hu"],["Armenian","Հայերեն","hy"],["Interlingua","interlingua","ia"],["Indonesian","Bahasa Indonesia","id"],["Icelandic","íslenska","is"],["Italian","italiano","it"],["Japanese","日本語","ja"],["Georgian","ქართული","ka"],["Kazakh","қазақша","kk"],["Khmer","ភាសាខ្មែរ","km"],["Korean","한국어","ko"],["Kurdish","Kurdî","ku"],["Kyrgyz","Кыргызча","ky"],["Latin","Latina","la"],["Limburgish","Limburgs","li"],["Lithuanian","lietuvių","lt"],["Malagasy","Malagasy","mg"],["Macedonian","македонски","mk"],["Malayalam","മലയാളം","ml"],["Marathi","मराठी","mr"],["Malay","Bahasa Melayu","ms"],["Nepali","नेपाली","ne"],["Dutch","Nederlands","nl"],["Norwegian","norsk bokmål","no"],["Occitan","occitan","oc"],["Punjabi","ਪੰਜਾਬੀ","pa"],["Polish","polski","pl"],["Portuguese","português","pt"],["Romanian","română","ro"],["Russian","русский","ru"],["Sanskrit","संस्कृतम्","sa"],["Sinhala","සිංහල","si"],["Slovak","slovenčina","sk"],["Slovenian","slovenščina","sl"],["Albanian","shqip","sq"],["Serbian","српски / srpski","sr"],["Swedish","svenska","sv"],["Tamil","தமிழ்","ta"],["Telugu","తెలుగు","te"],["Tajik","тоҷикӣ","tg"],["Thai","ไทย","th"],["Tagalog","Tagalog","tl"],["Turkish","Türkçe","tr"],["Tatar","татарча/tatarça","tt"],["Ukrainian","українська","uk"],["Urdu","اردو","ur"],["Vietnamese","Tiếng Việt","vi"],["Chinese","中文","zh"]];
24599
24600         var wikibooks$1 = /*#__PURE__*/Object.freeze({
24601                 'default': wikibooks
24602         });
24603
24604         var wikinews = [["Arabic","العربية","ar"],["Bulgarian","български","bg"],["Bosnian","bosanski","bs"],["Catalan","català","ca"],["Czech","čeština","cs"],["German","Deutsch","de"],["Greek","Ελληνικά","el"],["English","English","en"],["Esperanto","Esperanto","eo"],["Spanish","español","es"],["Persian","فارسی","fa"],["Finnish","suomi","fi"],["French","français","fr"],["Hebrew","עברית","he"],["Italian","italiano","it"],["Japanese","日本語","ja"],["Korean","한국어","ko"],["Norwegian","norsk bokmål","no"],["Polish","polski","pl"],["Portuguese","português","pt"],["Romanian","română","ro"],["Russian","русский","ru"],["Albanian","shqip","sq"],["Serbian","српски / srpski","sr"],["Swedish","svenska","sv"],["Tamil","தமிழ்","ta"],["Turkish","Türkçe","tr"],["Ukrainian","українська","uk"],["Chinese","中文","zh"]];
24605
24606         var wikinews$1 = /*#__PURE__*/Object.freeze({
24607                 'default': wikinews
24608         });
24609
24610         var wikiquote = [["Afrikaans","Afrikaans","af"],["Arabic","العربية","ar"],["Azerbaijani","azərbaycanca","az"],["Belarusian","беларуская","be"],["Bulgarian","български","bg"],["Breton","brezhoneg","br"],["Bosnian","bosanski","bs"],["Catalan","català","ca"],["Czech","čeština","cs"],["Welsh","Cymraeg","cy"],["Danish","dansk","da"],["German","Deutsch","de"],["Greek","Ελληνικά","el"],["English","English","en"],["Esperanto","Esperanto","eo"],["Spanish","español","es"],["Estonian","eesti","et"],["Basque","euskara","eu"],["Persian","فارسی","fa"],["Finnish","suomi","fi"],["French","français","fr"],["Galician","galego","gl"],["Gujarati","ગુજરાતી","gu"],["Hebrew","עברית","he"],["Hindi","हिन्दी","hi"],["Croatian","hrvatski","hr"],["Hungarian","magyar","hu"],["Armenian","Հայերեն","hy"],["Indonesian","Bahasa Indonesia","id"],["Icelandic","íslenska","is"],["Italian","italiano","it"],["Japanese","日本語","ja"],["Georgian","ქართული","ka"],["Kannada","ಕನ್ನಡ","kn"],["Korean","한국어","ko"],["Kurdish","Kurdî","ku"],["Kyrgyz","Кыргызча","ky"],["Latin","Latina","la"],["Limburgish","Limburgs","li"],["Lithuanian","lietuvių","lt"],["Malayalam","മലയാളം","ml"],["Marathi","मराठी","mr"],["Dutch","Nederlands","nl"],["Norwegian Nynorsk","norsk nynorsk","nn"],["Norwegian","norsk bokmål","no"],["Polish","polski","pl"],["Portuguese","português","pt"],["Romanian","română","ro"],["Russian","русский","ru"],["Sanskrit","संस्कृतम्","sa"],["Slovak","slovenčina","sk"],["Slovenian","slovenščina","sl"],["Albanian","shqip","sq"],["Serbian","српски / srpski","sr"],["Sundanese","Basa Sunda","su"],["Swedish","svenska","sv"],["Tamil","தமிழ்","ta"],["Telugu","తెలుగు","te"],["Thai","ไทย","th"],["Turkish","Türkçe","tr"],["Ukrainian","українська","uk"],["Urdu","اردو","ur"],["Uzbek","oʻzbekcha/ўзбекча","uz"],["Vietnamese","Tiếng Việt","vi"],["Wolof","Wolof","wo"],["Chinese","中文","zh"]];
24611
24612         var wikiquote$1 = /*#__PURE__*/Object.freeze({
24613                 'default': wikiquote
24614         });
24615
24616         var wikiversity = [["Arabic","العربية","ar"],["Czech","čeština","cs"],["German","Deutsch","de"],["Greek","Ελληνικά","el"],["English","English","en"],["Spanish","español","es"],["Finnish","suomi","fi"],["French","français","fr"],["Italian","italiano","it"],["Japanese","日本語","ja"],["Korean","한국어","ko"],["Portuguese","português","pt"],["Russian","русский","ru"],["Slovenian","slovenščina","sl"],["Swedish","svenska","sv"]];
24617
24618         var wikiversity$1 = /*#__PURE__*/Object.freeze({
24619                 'default': wikiversity
24620         });
24621
24622         var wikivoyage = [["German","Deutsch","de"],["Greek","Ελληνικά","el"],["English","English","en"],["Spanish","español","es"],["Persian","فارسی","fa"],["Finnish","suomi","fi"],["French","français","fr"],["Hebrew","עברית","he"],["Italian","italiano","it"],["Dutch","Nederlands","nl"],["Polish","polski","pl"],["Portuguese","português","pt"],["Romanian","română","ro"],["Russian","русский","ru"],["Swedish","svenska","sv"],["Ukrainian","українська","uk"],["Vietnamese","Tiếng Việt","vi"],["Chinese","中文","zh"]];
24623
24624         var wikivoyage$1 = /*#__PURE__*/Object.freeze({
24625                 'default': wikivoyage
24626         });
24627
24628         var wiktionary = [["Afrikaans","Afrikaans","af"],["Amharic","አማርኛ","am"],["Aragonese","aragonés","an"],["Old English","Ænglisc","ang"],["Arabic","العربية","ar"],["Asturian","asturianu","ast"],["Aymara","Aymar aru","ay"],["Azerbaijani","azərbaycanca","az"],["Belarusian","беларуская","be"],["Bulgarian","български","bg"],["Bangla","বাংলা","bn"],["Breton","brezhoneg","br"],["Bosnian","bosanski","bs"],["Catalan","català","ca"],["Cherokee","ᏣᎳᎩ","chr"],["Corsican","corsu","co"],["Czech","čeština","cs"],["Kashubian","kaszëbsczi","csb"],["Welsh","Cymraeg","cy"],["Danish","dansk","da"],["German","Deutsch","de"],["Divehi","ދިވެހިބަސް","dv"],["Greek","Ελληνικά","el"],["English","English","en"],["Esperanto","Esperanto","eo"],["Spanish","español","es"],["Estonian","eesti","et"],["Basque","euskara","eu"],["Persian","فارسی","fa"],["Finnish","suomi","fi"],["Fijian","Na Vosa Vakaviti","fj"],["Faroese","føroyskt","fo"],["French","français","fr"],["Western Frisian","Frysk","fy"],["Irish","Gaeilge","ga"],["Scottish Gaelic","Gàidhlig","gd"],["Galician","galego","gl"],["Guarani","Avañe'ẽ","gn"],["Gujarati","ગુજરાતી","gu"],["Manx","Gaelg","gv"],["Hausa","Hausa","ha"],["Hebrew","עברית","he"],["Hindi","हिन्दी","hi"],["Croatian","hrvatski","hr"],["Upper Sorbian","hornjoserbsce","hsb"],["Hungarian","magyar","hu"],["Armenian","Հայերեն","hy"],["Interlingua","interlingua","ia"],["Indonesian","Bahasa Indonesia","id"],["Interlingue","Interlingue","ie"],["Ido","Ido","io"],["Icelandic","íslenska","is"],["Italian","italiano","it"],["Inuktitut","ᐃᓄᒃᑎᑐᑦ/inuktitut","iu"],["Japanese","日本語","ja"],["Lojban","la .lojban.","jbo"],["Javanese","Basa Jawa","jv"],["Georgian","ქართული","ka"],["Kazakh","қазақша","kk"],["Kalaallisut","kalaallisut","kl"],["Khmer","ភាសាខ្មែរ","km"],["Kannada","ಕನ್ನಡ","kn"],["Korean","한국어","ko"],["Kashmiri","कॉशुर / کٲشُر","ks"],["Kurdish","Kurdî","ku"],["Cornish","kernowek","kw"],["Kyrgyz","Кыргызча","ky"],["Latin","Latina","la"],["Luxembourgish","Lëtzebuergesch","lb"],["Limburgish","Limburgs","li"],["Lingala","lingála","ln"],["Lao","ລາວ","lo"],["Lithuanian","lietuvių","lt"],["Latvian","latviešu","lv"],["Malagasy","Malagasy","mg"],["Maori","Māori","mi"],["Macedonian","македонски","mk"],["Malayalam","മലയാളം","ml"],["Mongolian","монгол","mn"],["Marathi","मराठी","mr"],["Malay","Bahasa Melayu","ms"],["Maltese","Malti","mt"],["Burmese","မြန်မာဘာသာ","my"],["Nauru","Dorerin Naoero","na"],["Nāhuatl","Nāhuatl","nah"],["Low German","Plattdüütsch","nds"],["Nepali","नेपाली","ne"],["Dutch","Nederlands","nl"],["Norwegian Nynorsk","norsk nynorsk","nn"],["Norwegian","norsk bokmål","no"],["Occitan","occitan","oc"],["Oromo","Oromoo","om"],["Odia","ଓଡ଼ିଆ","or"],["Punjabi","ਪੰਜਾਬੀ","pa"],["Polish","polski","pl"],["Western Punjabi","پنجابی","pnb"],["Pashto","پښتو","ps"],["Portuguese","português","pt"],["Quechua","Runa Simi","qu"],["Romanian","română","ro"],["Aromanian","armãneashti","roa-rup"],["Russian","русский","ru"],["Kinyarwanda","Kinyarwanda","rw"],["Sanskrit","संस्कृतम्","sa"],["Sicilian","sicilianu","scn"],["Sindhi","سنڌي","sd"],["Sango","Sängö","sg"],["Serbo-Croatian","srpskohrvatski / српскохрватски","sh"],["Sinhala","සිංහල","si"],["Simple English","Simple English","simple"],["Slovak","slovenčina","sk"],["Slovenian","slovenščina","sl"],["Samoan","Gagana Samoa","sm"],["Somali","Soomaaliga","so"],["Albanian","shqip","sq"],["Serbian","српски / srpski","sr"],["Swati","SiSwati","ss"],["Southern Sotho","Sesotho","st"],["Sundanese","Basa Sunda","su"],["Swedish","svenska","sv"],["Swahili","Kiswahili","sw"],["Tamil","தமிழ்","ta"],["Telugu","తెలుగు","te"],["Tajik","тоҷикӣ","tg"],["Thai","ไทย","th"],["Tigrinya","ትግርኛ","ti"],["Turkmen","Türkmençe","tk"],["Tagalog","Tagalog","tl"],["Tswana","Setswana","tn"],["Tok Pisin","Tok Pisin","tpi"],["Turkish","Türkçe","tr"],["Tsonga","Xitsonga","ts"],["Tatar","татарча/tatarça","tt"],["Uyghur","ئۇيغۇرچە / Uyghurche","ug"],["Ukrainian","українська","uk"],["Urdu","اردو","ur"],["Uzbek","oʻzbekcha/ўзбекча","uz"],["Venetian","vèneto","vec"],["Vietnamese","Tiếng Việt","vi"],["Volapük","Volapük","vo"],["Walloon","walon","wa"],["Wolof","Wolof","wo"],["Yiddish","ייִדיש","yi"],["Chinese","中文","zh"],["Chinese (Min Nan)","Bân-lâm-gú","zh-min-nan"],["Zulu","isiZulu","zu"]];
24629
24630         var wiktionary$1 = /*#__PURE__*/Object.freeze({
24631                 'default': wiktionary
24632         });
24633
24634         var wikipedia = [["Abkhazian","Аҧсшәа","ab"],["Achinese","Acèh","ace"],["Adyghe","адыгабзэ","ady"],["Afrikaans","Afrikaans","af"],["Akan","Akan","ak"],["Alemannisch","Alemannisch","als"],["Amharic","አማርኛ","am"],["Aragonese","aragonés","an"],["Old English","Ænglisc","ang"],["Arabic","العربية","ar"],["Aramaic","ܐܪܡܝܐ","arc"],["Egyptian Arabic","مصرى","arz"],["Assamese","অসমীয়া","as"],["Asturian","asturianu","ast"],["Avaric","авар","av"],["Aymara","Aymar aru","ay"],["Azerbaijani","azərbaycanca","az"],["تۆرکجه","تۆرکجه","azb"],["Bashkir","башҡортса","ba"],["Bavarian","Boarisch","bar"],["Samogitian","žemaitėška","bat-smg"],["Bikol Central","Bikol Central","bcl"],["Belarusian","беларуская","be"],["беларуская (тарашкевіца)‎","беларуская (тарашкевіца)‎","be-x-old"],["Bulgarian","български","bg"],["भोजपुरी","भोजपुरी","bh"],["Bislama","Bislama","bi"],["Banjar","Bahasa Banjar","bjn"],["Bambara","bamanankan","bm"],["Bangla","বাংলা","bn"],["Tibetan","བོད་ཡིག","bo"],["Bishnupriya","বিষ্ণুপ্রিয়া মণিপুরী","bpy"],["Breton","brezhoneg","br"],["Bosnian","bosanski","bs"],["Buginese","ᨅᨔ ᨕᨘᨁᨗ","bug"],["буряад","буряад","bxr"],["Catalan","català","ca"],["Chavacano de Zamboanga","Chavacano de Zamboanga","cbk-zam"],["Min Dong Chinese","Mìng-dĕ̤ng-ngṳ̄","cdo"],["Chechen","нохчийн","ce"],["Cebuano","Cebuano","ceb"],["Chamorro","Chamoru","ch"],["Cherokee","ᏣᎳᎩ","chr"],["Cheyenne","Tsetsêhestâhese","chy"],["Central Kurdish","کوردیی ناوەندی","ckb"],["Corsican","corsu","co"],["Cree","Nēhiyawēwin / ᓀᐦᐃᔭᐍᐏᐣ","cr"],["Crimean Turkish","qırımtatarca","crh"],["Czech","čeština","cs"],["Kashubian","kaszëbsczi","csb"],["Church Slavic","словѣньскъ / ⰔⰎⰑⰂⰡⰐⰠⰔⰍⰟ","cu"],["Chuvash","Чӑвашла","cv"],["Welsh","Cymraeg","cy"],["Danish","dansk","da"],["German","Deutsch","de"],["Zazaki","Zazaki","diq"],["Lower Sorbian","dolnoserbski","dsb"],["Divehi","ދިވެހިބަސް","dv"],["Dzongkha","ཇོང་ཁ","dz"],["Ewe","eʋegbe","ee"],["Greek","Ελληνικά","el"],["Emiliano-Romagnolo","emiliàn e rumagnòl","eml"],["English","English","en"],["Esperanto","Esperanto","eo"],["Spanish","español","es"],["Estonian","eesti","et"],["Basque","euskara","eu"],["Extremaduran","estremeñu","ext"],["Persian","فارسی","fa"],["Fulah","Fulfulde","ff"],["Finnish","suomi","fi"],["Võro","Võro","fiu-vro"],["Fijian","Na Vosa Vakaviti","fj"],["Faroese","føroyskt","fo"],["French","français","fr"],["Arpitan","arpetan","frp"],["Northern Frisian","Nordfriisk","frr"],["Friulian","furlan","fur"],["Western Frisian","Frysk","fy"],["Irish","Gaeilge","ga"],["Gagauz","Gagauz","gag"],["Gan Chinese","贛語","gan"],["Scottish Gaelic","Gàidhlig","gd"],["Galician","galego","gl"],["Gilaki","گیلکی","glk"],["Guarani","Avañe'ẽ","gn"],["Goan Konkani","गोंयची कोंकणी / Gõychi Konknni","gom"],["Gothic","𐌲𐌿𐍄𐌹𐍃𐌺","got"],["Gujarati","ગુજરાતી","gu"],["Manx","Gaelg","gv"],["Hausa","Hausa","ha"],["Hakka Chinese","客家語/Hak-kâ-ngî","hak"],["Hawaiian","Hawaiʻi","haw"],["Hebrew","עברית","he"],["Hindi","हिन्दी","hi"],["Fiji Hindi","Fiji Hindi","hif"],["Croatian","hrvatski","hr"],["Upper Sorbian","hornjoserbsce","hsb"],["Haitian Creole","Kreyòl ayisyen","ht"],["Hungarian","magyar","hu"],["Armenian","Հայերեն","hy"],["Interlingua","interlingua","ia"],["Indonesian","Bahasa Indonesia","id"],["Interlingue","Interlingue","ie"],["Igbo","Igbo","ig"],["Inupiaq","Iñupiak","ik"],["Iloko","Ilokano","ilo"],["Ido","Ido","io"],["Icelandic","íslenska","is"],["Italian","italiano","it"],["Inuktitut","ᐃᓄᒃᑎᑐᑦ/inuktitut","iu"],["Japanese","日本語","ja"],["Jamaican Creole English","Patois","jam"],["Lojban","la .lojban.","jbo"],["Javanese","Basa Jawa","jv"],["Georgian","ქართული","ka"],["Kara-Kalpak","Qaraqalpaqsha","kaa"],["Kabyle","Taqbaylit","kab"],["Kabardian","Адыгэбзэ","kbd"],["Kongo","Kongo","kg"],["Kikuyu","Gĩkũyũ","ki"],["Kazakh","қазақша","kk"],["Kalaallisut","kalaallisut","kl"],["Khmer","ភាសាខ្មែរ","km"],["Kannada","ಕನ್ನಡ","kn"],["Korean","한국어","ko"],["Komi-Permyak","Перем Коми","koi"],["Karachay-Balkar","къарачай-малкъар","krc"],["Kashmiri","कॉशुर / کٲشُر","ks"],["Colognian","Ripoarisch","ksh"],["Kurdish","Kurdî","ku"],["Komi","коми","kv"],["Cornish","kernowek","kw"],["Kyrgyz","Кыргызча","ky"],["Latin","Latina","la"],["Ladino","Ladino","lad"],["Luxembourgish","Lëtzebuergesch","lb"],["лакку","лакку","lbe"],["Lezghian","лезги","lez"],["Ganda","Luganda","lg"],["Limburgish","Limburgs","li"],["Ligurian","Ligure","lij"],["Lombard","lumbaart","lmo"],["Lingala","lingála","ln"],["Lao","ລາວ","lo"],["Northern Luri","لۊری شومالی","lrc"],["Lithuanian","lietuvių","lt"],["Latgalian","latgaļu","ltg"],["Latvian","latviešu","lv"],["Maithili","मैथिली","mai"],["Basa Banyumasan","Basa Banyumasan","map-bms"],["Moksha","мокшень","mdf"],["Malagasy","Malagasy","mg"],["Eastern Mari","олык марий","mhr"],["Maori","Māori","mi"],["Minangkabau","Baso Minangkabau","min"],["Macedonian","македонски","mk"],["Malayalam","മലയാളം","ml"],["Mongolian","монгол","mn"],["Marathi","मराठी","mr"],["Western Mari","кырык мары","mrj"],["Malay","Bahasa Melayu","ms"],["Maltese","Malti","mt"],["Mirandese","Mirandés","mwl"],["Burmese","မြန်မာဘာသာ","my"],["Erzya","эрзянь","myv"],["Mazanderani","مازِرونی","mzn"],["Nauru","Dorerin Naoero","na"],["Nāhuatl","Nāhuatl","nah"],["Neapolitan","Napulitano","nap"],["Low German","Plattdüütsch","nds"],["Low Saxon","Nedersaksies","nds-nl"],["Nepali","नेपाली","ne"],["Newari","नेपाल भाषा","new"],["Dutch","Nederlands","nl"],["Norwegian Nynorsk","norsk nynorsk","nn"],["Norwegian","norsk bokmål","no"],["Novial","Novial","nov"],["Nouormand","Nouormand","nrm"],["Northern Sotho","Sesotho sa Leboa","nso"],["Navajo","Diné bizaad","nv"],["Nyanja","Chi-Chewa","ny"],["Occitan","occitan","oc"],["Livvi-Karelian","Livvinkarjala","olo"],["Oromo","Oromoo","om"],["Odia","ଓଡ଼ିଆ","or"],["Ossetic","Ирон","os"],["Punjabi","ਪੰਜਾਬੀ","pa"],["Pangasinan","Pangasinan","pag"],["Pampanga","Kapampangan","pam"],["Papiamento","Papiamentu","pap"],["Picard","Picard","pcd"],["Pennsylvania German","Deitsch","pdc"],["Palatine German","Pälzisch","pfl"],["Pali","पालि","pi"],["Norfuk / Pitkern","Norfuk / Pitkern","pih"],["Polish","polski","pl"],["Piedmontese","Piemontèis","pms"],["Western Punjabi","پنجابی","pnb"],["Pontic","Ποντιακά","pnt"],["Pashto","پښتو","ps"],["Portuguese","português","pt"],["Quechua","Runa Simi","qu"],["Romansh","rumantsch","rm"],["Romani","Romani","rmy"],["Rundi","Kirundi","rn"],["Romanian","română","ro"],["Aromanian","armãneashti","roa-rup"],["tarandíne","tarandíne","roa-tara"],["Russian","русский","ru"],["Rusyn","русиньскый","rue"],["Kinyarwanda","Kinyarwanda","rw"],["Sanskrit","संस्कृतम्","sa"],["Sakha","саха тыла","sah"],["Sardinian","sardu","sc"],["Sicilian","sicilianu","scn"],["Scots","Scots","sco"],["Sindhi","سنڌي","sd"],["Northern Sami","sámegiella","se"],["Sango","Sängö","sg"],["Serbo-Croatian","srpskohrvatski / српскохрватски","sh"],["Sinhala","සිංහල","si"],["Simple English","Simple English","simple"],["Slovak","slovenčina","sk"],["Slovenian","slovenščina","sl"],["Samoan","Gagana Samoa","sm"],["Shona","chiShona","sn"],["Somali","Soomaaliga","so"],["Albanian","shqip","sq"],["Serbian","српски / srpski","sr"],["Sranan Tongo","Sranantongo","srn"],["Swati","SiSwati","ss"],["Southern Sotho","Sesotho","st"],["Saterland Frisian","Seeltersk","stq"],["Sundanese","Basa Sunda","su"],["Swedish","svenska","sv"],["Swahili","Kiswahili","sw"],["Silesian","ślůnski","szl"],["Tamil","தமிழ்","ta"],["Tulu","ತುಳು","tcy"],["Telugu","తెలుగు","te"],["Tetum","tetun","tet"],["Tajik","тоҷикӣ","tg"],["Thai","ไทย","th"],["Tigrinya","ትግርኛ","ti"],["Turkmen","Türkmençe","tk"],["Tagalog","Tagalog","tl"],["Tswana","Setswana","tn"],["Tongan","lea faka-Tonga","to"],["Tok Pisin","Tok Pisin","tpi"],["Turkish","Türkçe","tr"],["Tsonga","Xitsonga","ts"],["Tatar","татарча/tatarça","tt"],["Tumbuka","chiTumbuka","tum"],["Twi","Twi","tw"],["Tahitian","reo tahiti","ty"],["Tuvinian","тыва дыл","tyv"],["Udmurt","удмурт","udm"],["Uyghur","ئۇيغۇرچە / Uyghurche","ug"],["Ukrainian","українська","uk"],["Urdu","اردو","ur"],["Uzbek","oʻzbekcha/ўзбекча","uz"],["Venda","Tshivenda","ve"],["Venetian","vèneto","vec"],["Veps","vepsän kel’","vep"],["Vietnamese","Tiếng Việt","vi"],["West Flemish","West-Vlams","vls"],["Volapük","Volapük","vo"],["Walloon","walon","wa"],["Waray","Winaray","war"],["Wolof","Wolof","wo"],["Wu Chinese","吴语","wuu"],["Kalmyk","хальмг","xal"],["Xhosa","isiXhosa","xh"],["Mingrelian","მარგალური","xmf"],["Yiddish","ייִדיש","yi"],["Yoruba","Yorùbá","yo"],["Zhuang","Vahcuengh","za"],["Zeelandic","Zeêuws","zea"],["Chinese","中文","zh"],["Classical Chinese","文言","zh-classical"],["Chinese (Min Nan)","Bân-lâm-gú","zh-min-nan"],["Cantonese","粵語","zh-yue"],["Zulu","isiZulu","zu"]];
24635
24636         var wikipedia$1 = /*#__PURE__*/Object.freeze({
24637                 'default': wikipedia
24638         });
24639
24640         var wikisource = [["Arabic","العربية","ar"],["Assamese","অসমীয়া","as"],["Azerbaijani","azərbaycanca","az"],["Belarusian","беларуская","be"],["Bulgarian","български","bg"],["Bangla","বাংলা","bn"],["Breton","brezhoneg","br"],["Bosnian","bosanski","bs"],["Catalan","català","ca"],["Czech","čeština","cs"],["Welsh","Cymraeg","cy"],["Danish","dansk","da"],["German","Deutsch","de"],["Greek","Ελληνικά","el"],["English","English","en"],["Esperanto","Esperanto","eo"],["Spanish","español","es"],["Estonian","eesti","et"],["Persian","فارسی","fa"],["Finnish","suomi","fi"],["Faroese","føroyskt","fo"],["French","français","fr"],["Galician","galego","gl"],["Gujarati","ગુજરાતી","gu"],["Hebrew","עברית","he"],["Croatian","hrvatski","hr"],["Hungarian","magyar","hu"],["Armenian","Հայերեն","hy"],["Indonesian","Bahasa Indonesia","id"],["Icelandic","íslenska","is"],["Italian","italiano","it"],["Japanese","日本語","ja"],["Kannada","ಕನ್ನಡ","kn"],["Korean","한국어","ko"],["Latin","Latina","la"],["Limburgish","Limburgs","li"],["Lithuanian","lietuvių","lt"],["Macedonian","македонски","mk"],["Malayalam","മലയാളം","ml"],["Marathi","मराठी","mr"],["Dutch","Nederlands","nl"],["Norwegian","norsk bokmål","no"],["Odia","ଓଡ଼ିଆ","or"],["Punjabi","ਪੰਜਾਬੀ","pa"],["Polish","polski","pl"],["Portuguese","português","pt"],["Romanian","română","ro"],["Russian","русский","ru"],["Sanskrit","संस्कृतम्","sa"],["Sakha","саха тыла","sah"],["Slovak","slovenčina","sk"],["Slovenian","slovenščina","sl"],["Serbian","српски / srpski","sr"],["Swedish","svenska","sv"],["Tamil","தமிழ்","ta"],["Telugu","తెలుగు","te"],["Thai","ไทย","th"],["Turkish","Türkçe","tr"],["Ukrainian","українська","uk"],["Venetian","vèneto","vec"],["Vietnamese","Tiếng Việt","vi"],["Yiddish","ייִדיש","yi"],["Chinese","中文","zh"],["Chinese (Min Nan)","Bân-lâm-gú","zh-min-nan"]];
24641
24642         var wikisource$1 = /*#__PURE__*/Object.freeze({
24643                 'default': wikisource
24644         });
24645
24646         getCjsExportFromNamespace(wikibooks$1);
24647
24648         getCjsExportFromNamespace(wikinews$1);
24649
24650         getCjsExportFromNamespace(wikiquote$1);
24651
24652         getCjsExportFromNamespace(wikiversity$1);
24653
24654         getCjsExportFromNamespace(wikivoyage$1);
24655
24656         getCjsExportFromNamespace(wiktionary$1);
24657
24658         var require$$6 = getCjsExportFromNamespace(wikipedia$1);
24659
24660         getCjsExportFromNamespace(wikisource$1);
24661
24662         var wikipedia$2 = require$$6;
24663
24664         var dataAddressFormats = [{format:[["housenumber","street"],["city","postcode"]]},{countryCodes:["au"],format:[["unit","housenumber","street"],["suburb","state","postcode"]]},{countryCodes:["gb"],format:[["housename"],["housenumber","street"],["city","postcode"]]},{countryCodes:["ie"],format:[["housename"],["housenumber","street"],["city"],["postcode"]]},{countryCodes:["at","ch","de","si","pl"],format:[["street","housenumber"],["postcode","city"]]},{countryCodes:["ad","ba","be","cz","dk","es","fi","gr","hr","is","it","li","nl","no","pt","se","sk","sm","va"],format:[["street","housenumber","unit"],["postcode","city"]]},{countryCodes:["fr","lu","mo"],format:[["housenumber","street"],["postcode","city"]]},{countryCodes:["br"],format:[["street"],["housenumber","suburb"],["city","postcode"]]},{countryCodes:["vn"],format:[["housenumber","street"],["subdistrict"],["district"],["city"],["province","postcode"]]},{countryCodes:["ca"],format:[["housenumber","street","unit"],["city","province","postcode"]]},{countryCodes:["us"],format:[["housenumber","street","unit"],["city","state","postcode"]]},{countryCodes:["tw"],format:[["postcode","city","district"],["place","street"],["housenumber","floor","unit"]]},{countryCodes:["jp"],format:[["postcode","province","county"],["city","suburb"],["quarter","neighbourhood"],["block_number","housenumber"]],dropdowns:["postcode","province","county","city","suburb","quarter","neighbourhood","block_number"],widths:{postcode:0.3,province:0.35,county:0.35,city:0.65,suburb:0.35,quarter:0.5,neighbourhood:0.5,block_number:0.5,housenumber:0.5}},{countryCodes:["tr"],format:[["neighbourhood"],["street","housenumber"],["postcode","district","city"]]},{countryCodes:["ua"],format:[["housenumber","postcode"],["street"]]},{countryCodes:["cn"],format:[["postcode","province"],["city","district"],["street","housenumber"]]}];
24665
24666         var dataDeprecated = [{old:{aerialway:"canopy"},replace:{aerialway:"zip_line"}},{old:{aeroway:"aerobridge"},replace:{aeroway:"jet_bridge"}},{old:{amenity:"advertising"},replace:{advertising:"*"}},{old:{amenity:"artwork"},replace:{tourism:"artwork"}},{old:{amenity:"car_repair"},replace:{shop:"car_repair"}},{old:{amenity:"citymap_post"},replace:{tourism:"information"}},{old:{amenity:"club"},replace:{club:"*"}},{old:{amenity:"community_center"},replace:{amenity:"community_centre"}},{old:{amenity:"dancing_school"},replace:{leisure:"dance","dance:teaching":"yes"}},{old:{amenity:"dog_bin"},replace:{amenity:"waste_basket",waste:"dog_excrement"}},{old:{amenity:"dog_waste_bin"},replace:{amenity:"waste_basket",waste:"dog_excrement"}},{old:{amenity:"embassy"},replace:{office:"diplomatic"}},{old:{amenity:"ev_charging"},replace:{amenity:"charging_station"}},{old:{amenity:"fire_hydrant"},replace:{emergency:"fire_hydrant"}},{old:{amenity:"firepit"},replace:{leisure:"firepit"}},{old:{amenity:"garage"},replace:{landuse:"garages"}},{old:{amenity:"garages"},replace:{landuse:"garages"}},{old:{amenity:"gym"},replace:{leisure:"fitness_centre"}},{old:{amenity:"hotel"},replace:{tourism:"hotel"}},{old:{amenity:"kiosk"},replace:{shop:"kiosk"}},{old:{amenity:"nursery"},replace:{amenity:"kindergarten"}},{old:{amenity:"preschool"},replace:{amenity:"kindergarten"}},{old:{amenity:"public_building"},replace:{building:"public"}},{old:{amenity:"real_estate"},replace:{office:"estate_agent"}},{old:{amenity:"register_office"},replace:{office:"government",government:"register_office"}},{old:{amenity:"sauna"},replace:{leisure:"sauna"}},{old:{amenity:"scrapyard"},replace:{landuse:"industrial",industrial:"scrap_yard"}},{old:{amenity:"shop"},replace:{shop:"*"}},{old:{amenity:"sloped_curb"},replace:{kerb:"lowered"}},{old:{amenity:"social_club"},replace:{club:"*"}},{old:{amenity:"swimming_pool"},replace:{leisure:"swimming_pool"}},{old:{amenity:"ticket_booth"},replace:{shop:"ticket"}},{old:{amenity:"toilet"},replace:{amenity:"toilets"}},{old:{amenity:"vending_machine",vending:"news_papers"},replace:{amenity:"vending_machine",vending:"newspapers"}},{old:{amenity:"winery"},replace:{craft:"winery"}},{old:{amenity:"youth_center"},replace:{amenity:"community_centre","community_centre:for":"juvenile"}},{old:{amenity:"youth_centre"},replace:{amenity:"community_centre","community_centre:for":"juvenile"}},{old:{artwork:"*"},replace:{artwork_type:"$1"}},{old:{"artwork:type":"*"},replace:{artwork_type:"$1"}},{old:{attraction:"ferris_wheel"},replace:{attraction:"big_wheel"}},{old:{barrier:"curb"},replace:{barrier:"kerb"}},{old:{barrier:"embankment"},replace:{man_made:"embankment"}},{old:{barrier:"entrance"},replace:{entrance:"*"}},{old:{barrier:"wire_fence"},replace:{barrier:"fence",fence_type:"wire"}},{old:{barrier:"wood_fence"},replace:{barrier:"fence",fence_type:"wood"}},{old:{building:"entrance"},replace:{entrance:"*"}},{old:{building:"family_house"},replace:{building:"house"}},{old:{building:"home"},replace:{building:"house"}},{old:{building:"household"},replace:{building:"house"}},{old:{"building:color":"*"},replace:{"building:colour":"$1"}},{old:{"building:roof:colour":"*"},replace:{"roof:colour":"$1"}},{old:{"building:type":"*"},replace:{building:"$1"}},{old:{color:"*"},replace:{colour:"$1"}},{old:{craft:"glass"},replace:{craft:"glaziery"}},{old:{craft:"catering"},replace:{craft:"caterer"}},{old:{craft:"sculpter"},replace:{craft:"sculptor"}},{old:{crossing:"zebra"},replace:{crossing:"marked"}},{old:{cuisine:"gluten-free"},replace:{"diet:gluten_free":"yes"}},{old:{cuisine:"halal"},replace:{"diet:halal":"yes"}},{old:{cuisine:"kosher"},replace:{"diet:kosher":"yes"}},{old:{cuisine:"vegan"},replace:{"diet:vegan":"yes"}},{old:{cuisine:"vegetarian"},replace:{"diet:vegetarian":"yes"}},{old:{curb:"*"},replace:{kerb:"$1"}},{old:{drinkable:"*"},replace:{drinking_water:"$1"}},{old:{dropped_kerb:"*"},replace:{kerb:"lowered"}},{old:{escalator:"*"},replace:{highway:"steps",conveying:"$1"}},{old:{fee:"0"},replace:{fee:"no"}},{old:{fee:"free"},replace:{fee:"no"}},{old:{fee:"Free"},replace:{fee:"no"}},{old:{fee:"No"},replace:{fee:"no"}},{old:{fee:"none"},replace:{fee:"no"}},{old:{fee:"some"},replace:{fee:"yes"}},{old:{fee:"Yes"},replace:{fee:"yes"}},{old:{fenced:"yes"},replace:{barrier:"fence"}},{old:{footway:"both"},replace:{sidewalk:"both"}},{old:{footway:"crossing",highway:"cycleway"},replace:{cycleway:"crossing",highway:"cycleway"}},{old:{footway:"left"},replace:{sidewalk:"left"}},{old:{footway:"no"},replace:{sidewalk:"no"}},{old:{footway:"none"},replace:{sidewalk:"no"}},{old:{footway:"right"},replace:{sidewalk:"right"}},{old:{footway:"separate"},replace:{sidewalk:"separate"}},{old:{"generator:source":"photovoltaic"},replace:{"generator:source":"solar","generator:method":"photovoltaic"}},{old:{highway:"abandoned"},replace:{"abandoned:highway":"*"}},{old:{highway:"bridleway",horse:"no"},replace:{highway:"path",horse:"no"}},{old:{highway:"cycleway",bicycle:"no"},replace:{highway:"path",bicycle:"no"}},{old:{highway:"footway",foot:"no"},replace:{highway:"path",foot:"no"}},{old:{highway:"ford"},replace:{ford:"*"}},{old:{highway:"no"}},{old:{highway:"platform"},replace:{bus:"yes",public_transport:"platform"}},{old:{highway:"stile"},replace:{barrier:"stile"}},{old:{highway:"unsurfaced"},replace:{highway:"road",surface:"unpaved"}},{old:{internet_access:"public"},replace:{internet_access:"yes","internet_access:fee":"no"}},{old:{internet_access:"wifi"},replace:{internet_access:"wlan"}},{old:{"internet_access:fee":"0"},replace:{"internet_access:fee":"no"}},{old:{"internet_access:fee":"free"},replace:{"internet_access:fee":"no"}},{old:{"internet_access:fee":"Free"},replace:{"internet_access:fee":"no"}},{old:{"internet_access:fee":"No"},replace:{"internet_access:fee":"no"}},{old:{"internet_access:name":"*"},replace:{"internet_access:ssid":"$1"}},{old:{"internet_access:type":"*"},replace:{internet_access:"$1"}},{old:{kerb:"dropped"},replace:{kerb:"lowered"}},{old:{kerb:"flat"},replace:{kerb:"flush"}},{old:{landuse:"basin"},replace:{natural:"water",water:"basin"}},{old:{landuse:"conservation"},replace:{boundary:"protected_area"}},{old:{landuse:"farm"},replace:{landuse:"farmland"}},{old:{landuse:"field"},replace:{landuse:"farmland"}},{old:{landuse:"pond"},replace:{natural:"water",water:"pond"}},{old:{landuse:"port"},replace:{landuse:"industrial",industrial:"port"}},{old:{landuse:"reservoir"},replace:{natural:"water",water:"reservoir"}},{old:{landuse:"wood"},replace:{natural:"wood"}},{old:{lawyer:"notary"},replace:{office:"notary"}},{old:{leisure:"beach"},replace:{natural:"beach"}},{old:{leisure:"club"},replace:{club:"*"}},{old:{leisure:"social_club"},replace:{club:"*"}},{old:{leisure:"video_arcade"},replace:{leisure:"amusement_arcade"}},{old:{leisure:"recreation_ground"},replace:{landuse:"recreation_ground"}},{old:{man_made:"cut_line"},replace:{man_made:"cutline"}},{old:{man_made:"jetty"},replace:{highway:"footway",man_made:"pier"}},{old:{man_made:"mdf"},replace:{telecom:"exchange"}},{old:{man_made:"MDF"},replace:{telecom:"exchange"}},{old:{man_made:"water_tank"},replace:{man_made:"storage_tank",content:"water"}},{old:{man_made:"well"},replace:{man_made:"water_well"}},{old:{man_made:"winery"},replace:{craft:"winery"}},{old:{memorial:"plate"},replace:{memorial:"plaque"}},{old:{mining_resource:"*"},replace:{resource:"$1"}},{old:{natural:"marsh"},replace:{natural:"wetland",wetland:"marsh"}},{old:{natural:"waterfall"},replace:{waterway:"waterfall"}},{old:{nosquare:"*"},replace:{nonsquare:"$1"}},{old:{office:"real_estate"},replace:{office:"estate_agent"}},{old:{oneway:"1"},replace:{oneway:"yes"}},{old:{oneway:"alternate"},replace:{oneway:"alternating"}},{old:{oneway:"no;yes"}},{old:{oneway:"unknown"}},{old:{place_name:"*"},replace:{name:"$1"}},{old:{pole:"transition"},replace:{"location:transition":"yes"}},{old:{postcode:"*"},replace:{"addr:postcode":"$1"}},{old:{power:"busbar"},replace:{power:"line",line:"busbar"}},{old:{power:"line",location:"underground"},replace:{power:"cable",location:"underground"}},{old:{power:"sub_station"},replace:{power:"substation"}},{old:{power:"substation",location:"kiosk"},replace:{power:"substation",man_made:"street_cabinet",street_cabinet:"power"}},{old:{power:"underground_cable"},replace:{power:"cable",location:"underground"}},{old:{power_source:"*"},replace:{"generator:source":"$1"}},{old:{power_rating:"*"},replace:{"generator:output":"$1"}},{old:{recommended_speed:"*"},replace:{"maxspeed:advisory":"$1"}},{old:{"recommended_speed:backward":"*"},replace:{"maxspeed:advisory:backward":"$1"}},{old:{"recommended_speed:forward":"*"},replace:{"maxspeed:advisory:forward":"$1"}},{old:{religion:"catholic"},replace:{religion:"christian",denomination:"catholic"}},{old:{reservations:"*"},replace:{reservation:"$1"}},{old:{"roof:color":"*"},replace:{"roof:colour":"$1"}},{old:{route:"ncn"},replace:{route:"bicycle",network:"ncn"}},{old:{shop:"adult"},replace:{shop:"erotic"}},{old:{shop:"antique"},replace:{shop:"antiques"}},{old:{shop:"auto_parts"},replace:{shop:"car_parts"}},{old:{shop:"baby"},replace:{shop:"baby_goods"}},{old:{shop:"baby_care"},replace:{shop:"baby_goods"}},{old:{shop:"bags"},replace:{shop:"bag"}},{old:{shop:"betting"},replace:{shop:"bookmaker"}},{old:{shop:"boutique"},replace:{shop:"clothes"}},{old:{shop:"cafe"},replace:{amenity:"cafe"}},{old:{shop:"dive"},replace:{shop:"scuba_diving"}},{old:{shop:"fashion"},replace:{shop:"clothes"}},{old:{shop:"fish"},replace:{shop:"seafood"}},{old:{shop:"fishmonger"},replace:{shop:"seafood"}},{old:{shop:"furnace"},replace:{shop:"fireplace"}},{old:{shop:"gallery"},replace:{shop:"art"}},{old:{shop:"jewellery"},replace:{shop:"jewelry"}},{old:{shop:"lingerie"},replace:{shop:"clothes",clothes:"underwear"}},{old:{shop:"luggage"},replace:{shop:"bag"}},{old:{shop:"money_transfer"},replace:{amenity:"money_transfer"}},{old:{shop:"moneylender"},replace:{shop:"money_lender"}},{old:{shop:"organic"},replace:{shop:"supermarket",organic:"only"}},{old:{shop:"perfume"},replace:{shop:"perfumery"}},{old:{shop:"real_estate"},replace:{office:"estate_agent"}},{old:{shop:"tickets"},replace:{shop:"ticket"}},{old:{shop:"underwear"},replace:{shop:"clothes",clothes:"underwear"}},{old:{shop:"winery"},replace:{craft:"winery"}},{old:{sloped_curb:"0"},replace:{kerb:"flush"}},{old:{sloped_curb:"0.00"},replace:{kerb:"flush"}},{old:{sloped_curb:"0.01"},replace:{kerb:"lowered","kerb:height":"1 cm"}},{old:{sloped_curb:"0.02"},replace:{kerb:"lowered","kerb:height":"2 cm"}},{old:{sloped_curb:"0.03"},replace:{kerb:"lowered","kerb:height":"3 cm"}},{old:{sloped_curb:"at_grade"},replace:{kerb:"flush"}},{old:{sloped_curb:"both"},replace:{kerb:"lowered"}},{old:{sloped_curb:"flush"},replace:{kerb:"flush"}},{old:{sloped_curb:"low"},replace:{kerb:"lowered"}},{old:{sloped_curb:"no"},replace:{kerb:"raised"}},{old:{sloped_curb:"yes"},replace:{kerb:"lowered"}},{old:{sport:"horse_shoes"},replace:{sport:"horseshoes"}},{old:{sport:"horseshoe"},replace:{sport:"horseshoes"}},{old:{sport:"shuffle_board"},replace:{sport:"shuffleboard"}},{old:{"theatre:type":"amphitheatre"},replace:{"theatre:type":"amphi"}},{old:{todo:"*"},replace:{fixme:"$1"}},{old:{TODO:"*"},replace:{fixme:"$1"}},{old:{"toilets:disposal":"longdrop"},replace:{"toilets:disposal":"pitlatrine"}},{old:{"toilets:disposal":"pit_latrine"},replace:{"toilets:disposal":"pitlatrine"}},{old:{tourism:"bed_and_breakfast"},replace:{tourism:"guest_house",guest_house:"bed_and_breakfast"}},{old:{type:"broad_leaved"},replace:{leaf_type:"broadleaved"}},{old:{type:"conifer"},replace:{leaf_type:"needleleaved"}},{old:{type:"deciduous"},replace:{leaf_cycle:"deciduous"}},{old:{unnamed:"*"},replace:{noname:"$1"}},{old:{water:"intermittent"},replace:{natural:"water",intermittent:"yes"}},{old:{water:"riverbank"},replace:{natural:"water",water:"river"}},{old:{water:"salt"},replace:{natural:"water",salt:"yes"}},{old:{water:"tidal"},replace:{natural:"water",tidal:"yes"}},{old:{waterway:"aqueduct"},replace:{waterway:"canal",bridge:"aqueduct"}},{old:{waterway:"lock"},replace:{waterway:"canal",lock:"yes"}},{old:{waterway:"riverbank"},replace:{natural:"water",water:"river"}},{old:{wood:"coniferous"},replace:{leaf_type:"needleleaved"}},{old:{wood:"deciduous"},replace:{leaf_cycle:"deciduous"}},{old:{wood:"evergreen"},replace:{leaf_cycle:"evergreen"}},{old:{wood:"mixed"},replace:{leaf_cycle:"mixed",leaf_type:"mixed"}}];
24667
24668         var dataDiscarded = {created_by:true,odbl:true,"odbl:note":true,"tiger:upload_uuid":true,"tiger:tlid":true,"tiger:source":true,"tiger:separated":true,"geobase:datasetName":true,"geobase:uuid":true,"osmarender:nameDirection":true,"osmarender:renderName":true,"osmarender:renderRef":true,"osmarender:rendernames":true,"sub_sea:type":true,"KSJ2:ADS":true,"KSJ2:ARE":true,"KSJ2:AdminArea":true,"KSJ2:COP_label":true,"KSJ2:DFD":true,"KSJ2:INT":true,"KSJ2:INT_label":true,"KSJ2:LOC":true,"KSJ2:LPN":true,"KSJ2:OPC":true,"KSJ2:PubFacAdmin":true,"KSJ2:RAC":true,"KSJ2:RAC_label":true,"KSJ2:RIC":true,"KSJ2:RIN":true,"KSJ2:WSC":true,"KSJ2:coordinate":true,"KSJ2:curve_id":true,"KSJ2:curve_type":true,"KSJ2:filename":true,"KSJ2:lake_id":true,"KSJ2:lat":true,"KSJ2:long":true,"KSJ2:river_id":true,"SK53_bulk:load":true,"yh:LINE_NAME":true,"yh:LINE_NUM":true,"yh:STRUCTURE":true,"yh:TOTYUMONO":true,"yh:TYPE":true,"yh:WIDTH":true,"yh:WIDTH_RANK":true};
24669
24670         var dataLocales = {af:{rtl:false},ar:{rtl:true},"ar-AA":{rtl:true},ast:{rtl:false},be:{rtl:false},bg:{rtl:false},bn:{rtl:false},bs:{rtl:false},ca:{rtl:false},ckb:{rtl:true},cs:{rtl:false},cy:{rtl:false},da:{rtl:false},de:{rtl:false},dv:{rtl:true},el:{rtl:false},"en-AU":{rtl:false},"en-GB":{rtl:false},eo:{rtl:false},es:{rtl:false},et:{rtl:false},eu:{rtl:false},fa:{rtl:true},fi:{rtl:false},fr:{rtl:false},gan:{rtl:false},gl:{rtl:false},gu:{rtl:false},he:{rtl:true},hi:{rtl:false},hr:{rtl:false},hu:{rtl:false},hy:{rtl:false},ia:{rtl:false},id:{rtl:false},is:{rtl:false},it:{rtl:false},ja:{rtl:false},jv:{rtl:false},km:{rtl:false},kn:{rtl:false},ko:{rtl:false},ku:{rtl:false},lij:{rtl:false},lt:{rtl:false},lv:{rtl:false},mg:{rtl:false},mk:{rtl:false},ml:{rtl:false},mn:{rtl:false},ms:{rtl:false},ne:{rtl:false},nl:{rtl:false},nn:{rtl:false},no:{rtl:false},nv:{rtl:false},pap:{rtl:false},pl:{rtl:false},pt:{rtl:false},"pt-BR":{rtl:false},rm:{rtl:false},ro:{rtl:false},ru:{rtl:false},sc:{rtl:false},si:{rtl:false},sk:{rtl:false},sl:{rtl:false},so:{rtl:false},sq:{rtl:false},sr:{rtl:false},sv:{rtl:false},ta:{rtl:false},te:{rtl:false},th:{rtl:false},tl:{rtl:false},tr:{rtl:false},uk:{rtl:false},ur:{rtl:true},vi:{rtl:false},yue:{rtl:false},zh:{rtl:false},"zh-CN":{rtl:false},"zh-HK":{rtl:false},"zh-TW":{rtl:false}};
24671
24672         var dataPhoneFormats = {ag:"+1-268-555-1234",ai:"+1-264-555-1234",as:"+1-684-555-1234",at:"+43 1 123 45 67",bb:"+1-246-555-1234",bj:"+229 20 12 34 56",bm:"+1-441-555-1234",br:"+55 11 0982 1098",bs:"+1-242-555-1234",ca:"+1-226-555-1234",ci:"+225 20 12 34 56",cn:"+86 10 12345678",de:"+49 89 1234567",dm:"+1-767-555-1234","do":"+1-809-555-1234",es:"+34 989 12 34 56",fi:"+358 40 123 4567",fr:"+33 1 23 45 67 89",gb:"+44 1632 961234",gd:"+1-473-555-1234",gg:"+44 1632 961234",gu:"+1-671-555-1234",hk:"+852 1234 5678",hr:"+385 01 123 4567",hu:"+36 1 123 45 67",ie:"+353 20 912 3456",im:"+44 1632 961234",it:"+39 01 123 456",je:"+44 1632 961234",jm:"+1-876-555-1234",kn:"+1-869-555-1234",ky:"+1-345-555-1234",kz:"+7 495 1234567",lc:"+1-758-555-1234",mp:"+1-670-555-1234",ms:"+1-664-555-1234",nl:"+31 42 123 4567",no:"+47 22 12 34 56",pl:"+48 42 123 4567",pr:"+1-787-555-1234",pt:"+351 211 123456",ru:"+7 495 1234567",se:"+46 31 123 4567",si:"+386 31 123 4567",sj:"+47 22 12 34 56",sx:"+1-721-555-1234",tc:"+1-649-555-1234",tr:"+90 312 123 4567",tt:"+1-868-555-1234",tw:"+886 1 2345 6789",ua:"+380 44 123 4567",us:"+1-202-555-1234",va:"+39 01 123 456",vc:"+1-784-555-1234",vg:"+1-284-555-1234",vi:"+1-340-555-1234",vn:"+84 1 234 5678",za:"+27 11 907 1111"};
24673
24674         var dataShortcuts = [{tab:"browsing",text:"shortcuts.browsing.title",columns:[{rows:[{section:"navigation",text:"shortcuts.browsing.navigation.title"},{shortcuts:["↓","↑","←","→"],text:"shortcuts.browsing.navigation.pan",separator:","},{modifiers:["⌘"],shortcuts:["↓","↑","←","→"],text:"shortcuts.browsing.navigation.pan_more",separator:","},{shortcuts:["+","-"],text:"shortcuts.browsing.navigation.zoom",separator:","},{modifiers:["⌘"],shortcuts:["+","-"],text:"shortcuts.browsing.navigation.zoom_more",separator:","},{section:"help",text:"shortcuts.browsing.help.title"},{shortcuts:["help.key"],text:"shortcuts.browsing.help.help"},{shortcuts:["shortcuts.toggle.key","?"],text:"shortcuts.browsing.help.keyboard"},{section:"display_options",text:"shortcuts.browsing.display_options.title"},{shortcuts:["background.key"],text:"shortcuts.browsing.display_options.background"},{modifiers:["⌘"],shortcuts:["background.key"],text:"shortcuts.browsing.display_options.background_switch"},{shortcuts:["map_data.key"],text:"shortcuts.browsing.display_options.map_data"},{modifiers:["⌃","⌘"],shortcuts:["F","F11"],text:"shortcuts.browsing.display_options.fullscreen"},{shortcuts:["sidebar.key","`","²"],text:"shortcuts.browsing.display_options.sidebar"},{shortcuts:["area_fill.wireframe.key"],text:"shortcuts.browsing.display_options.wireframe"},{modifiers:["⌥"],shortcuts:["area_fill.wireframe.key"],text:"shortcuts.browsing.display_options.osm_data"},{shortcuts:["background.minimap.key"],text:"shortcuts.browsing.display_options.minimap"}]},{rows:[{section:"selecting",text:"shortcuts.browsing.selecting.title"},{shortcuts:["Left-click"],text:"shortcuts.browsing.selecting.select_one"},{modifiers:["⇧"],shortcuts:["Left-click"],text:"shortcuts.browsing.selecting.select_multi"},{modifiers:["⇧"],shortcuts:["Left-click"],gesture:"shortcuts.gesture.drag",text:"shortcuts.browsing.selecting.lasso"},{modifiers:["⌘"],shortcuts:["F"],text:"shortcuts.browsing.selecting.search"},{section:"with_selected",text:"shortcuts.browsing.with_selected.title"},{shortcuts:["Right-click","shortcuts.key.space"],text:"shortcuts.browsing.with_selected.edit_menu"},{shortcuts:["inspector.zoom_to.key"],text:"shortcuts.browsing.with_selected.zoom_to"},{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:["modes.add_feature.key"],text:"shortcuts.editing.drawing.focus_add_feature"},{shortcuts:["1","2","3"],text:"shortcuts.editing.drawing.add_favorite",separator:",",suffix:"…"},{shortcuts:["modes.add_note.key"],text:"shortcuts.editing.drawing.add_note"},{shortcuts:["Left-click","shortcuts.key.space"],text:"shortcuts.editing.drawing.place_point"},{shortcuts:["⌥"],text:"shortcuts.editing.drawing.disable_snap"},{shortcuts:["↵","⎋"],text:"shortcuts.editing.drawing.stop_line"},{section:"commands",text:"shortcuts.editing.commands.title"},{modifiers:["⌘"],shortcuts:["C"],text:"shortcuts.editing.commands.copy"},{modifiers:["⌘"],shortcuts:["V"],text:"shortcuts.editing.commands.paste"},{modifiers:["⌘"],shortcuts:["Z"],text:"shortcuts.editing.commands.undo"},{modifiers:["⌘","⇧"],shortcuts:["Z"],text:"shortcuts.editing.commands.redo"},{modifiers:["⌘"],shortcuts:["S"],text:"shortcuts.editing.commands.save"}]},{rows:[{section:"operations",text:"shortcuts.editing.operations.title"},{shortcuts:["operations.continue.key"],text:"shortcuts.editing.operations.continue_line"},{shortcuts:["operations.merge.key"],text:"shortcuts.editing.operations.merge"},{shortcuts:["operations.disconnect.key"],text:"shortcuts.editing.operations.disconnect"},{shortcuts:["operations.extract.key"],text:"shortcuts.editing.operations.extract"},{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.straighten.key"],text:"shortcuts.editing.operations.straighten"},{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"}]}]}];
24675
24676         var type$1 = "FeatureCollection";
24677         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]]]}}];
24678         var dataImperial = {
24679         type: type$1,
24680         features: features
24681         };
24682
24683         var type$2 = "FeatureCollection";
24684         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]]]}}];
24685         var dataDriveLeft = {
24686         type: type$2,
24687         features: features$1
24688         };
24689
24690         var en = {icons:{download:"download",information:"info",remove:"remove",undo:"undo",zoom_to:"zoom to",copy:"copy",open_wikidata:"open on wikidata.org",favorite:"favorite"},toolbar:{inspect:"Inspect",undo_redo:"Undo / Redo",recent:"Recent",favorites:"Favorites",add_feature:"Add Feature"},modes:{add_feature:{title:"Add a feature",description:"Search for features to add to the map.",key:"Tab",result:"{count} result",results:"{count} results"},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.",filter_tooltip:"areas"},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.",filter_tooltip:"lines"},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.",filter_tooltip:"points"},add_note:{title:"Note",label:"Add Note",description:"Spotted an issue? Let other mappers know.",tail:"Click on the map to add a note.",key:"N"},add_preset:{title:"Add {feature}",point:{title:"Add {feature} as a point"},line:{title:"Add {feature} as a line"},area:{title:"Add {feature} as an area"},building:{title:"Add {feature} as a building"}},browse:{title:"Browse",description:"Pan and zoom the map."},draw_area:{tail:"Click to add nodes to your area. Click the first node to finish the area."},draw_line:{tail:"Click to add more nodes to the line. Click on other lines to connect to them, and double-click to end the line."},drag_node:{connected_to_hidden:"This can't be edited because it is connected to a hidden feature."}},operations:{add:{annotation:{point:"Added a point.",vertex:"Added a node to a way.",relation:"Added a relation.",note:"Added a note."}},start:{annotation:{line:"Started a line.",area:"Started an area."}},"continue":{key:"A",title:"Continue",description:"Continue this line.",not_eligible:"No line can be continued here.",multiple:"Several lines can be continued here. To choose a line, press the Shift key and click on it to select it.",annotation:{line:"Continued a line.",area:"Continued an area."}},cancel_draw:{annotation:"Canceled drawing."},change_role:{annotation:"Changed the role of a relation member."},change_tags:{annotation:"Changed tags."},circularize:{title:"Circularize",description:{line:"Make this line circular.",area:"Make this area circular."},key:"O",annotation:{line:"Made a line circular.",area:"Made an area circular."},not_closed:"This can't be made circular because it's not a loop.",too_large:"This can't be made circular because not enough of it is currently visible.",connected_to_hidden:"This can't be made circular because it is connected to a hidden feature.",not_downloaded:"This can't be made circular because parts of it have not yet been downloaded."},orthogonalize:{title:"Square",description:{vertex:"Square this corner.",line:"Square the corners of this line.",area:"Square the corners of this area."},key:"Q",annotation:{vertex:"Squared a single corner.",line:"Squared the corners of a line.",area:"Squared the corners of an area."},end_vertex:"This can't be squared because it is an end node.",square_enough:"This can't be made more square than it already is.",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.",not_downloaded:"This can't be made square because parts of it have not yet been downloaded."},straighten:{title:"Straighten",description:{points:"Straighten these points.",line:"Straighten this line."},key:"S",annotation:{points:"Straightened several points.",line:"Straightened a line."},too_bendy:"This can't be straightened because it bends too much.",connected_to_hidden:"This can't be straightened because it is connected to a hidden feature.",not_downloaded:"This can't be straightened because parts of it have not yet been downloaded."},"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."},not_downloaded:{single:"This feature can't be deleted because parts of it have not yet been downloaded.",multiple:"These features can't be deleted because parts of them have not yet been downloaded."},has_wikidata_tag:{single:"This feature can't be deleted because it has a Wikidata tag.",multiple:"These features can't be deleted because some have Wikidata tags."}},downgrade:{title:"Downgrade",description:{building_address:"Remove all non-address and non-building tags.",building:"Remove all non-building tags.",address:"Remove all non-address tags."},annotation:{building:{single:"Downgraded a feature to a basic building.",multiple:"Downgraded {n} features to basic buildings."},address:{single:"Downgraded a feature to an address.",multiple:"Downgraded {n} features to addresses."},multiple:"Downgraded {n} features."},has_wikidata_tag:{single:"This feature can't be downgraded because it has a Wikidata tag.",multiple:"These features can't be downgraded because some have Wikidata tags."}},add_member:{annotation:"Added a member to a relation."},delete_member:{annotation:"Removed a member from a relation."},reorder_members:{annotation:"Reordered a relation's members."},connect:{annotation:{from_vertex:{to_point:"Connected a way to a point.",to_vertex:"Connected a way to another.",to_line:"Connected a way to a line.",to_area:"Connected a way to an area.",to_adjacent_vertex:"Merged adjacent points in a way.",to_sibling_vertex:"Connected a way to itself."},from_point:{to_point:"Merged a point with another.",to_vertex:"Merged a point with a point in a way.",to_line:"Moved a point to a line.",to_area:"Moved a point to an area."}},relation:"These features can't be connected because they have conflicting relation roles.",restriction:"These features can't be connected because it would damage a \"{relation}\" relation."},disconnect:{title:"Disconnect",description:"Disconnect these lines/areas from each other.",line:{description:"Disconnect this line from other features."},area:{description:"Disconnect this area from other features."},key:"D",annotation:"Disconnected lines/areas.",too_large:{single:"This can't be disconnected because not enough of it is currently visible."},not_connected:"There aren't enough lines/areas here to disconnect.",not_downloaded:"This can't be disconnected because parts of it have not yet been downloaded.",connected_to_hidden:"This can't be disconnected because it is connected to a hidden feature.",relation:"This can't be disconnected because it connects members of a relation."},merge:{title:"Merge",description:"Merge these features.",key:"C",annotation:"Merged {n} features.",not_eligible:"These features can't be merged.",not_adjacent:"These features can't be merged because their endpoints aren't connected.",restriction:"These features can't be merged because it would damage a \"{relation}\" relation.",relation:"These features can't be merged because they have conflicting relation roles.",incomplete_relation:"These features can't be merged because at least one hasn't been fully downloaded.",conflicting_tags:"These features can't be merged because some of their tags have conflicting values.",paths_intersect:"These features can't be merged because the resulting path would intersect itself."},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."},not_downloaded:{single:"This feature can't be moved because parts of it have not yet been downloaded.",multiple:"These features can't be moved because parts of them have not yet been downloaded."}},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."},not_downloaded:{single:"This feature can't be reflected because parts of it have not yet been downloaded.",multiple:"These features can't be reflected because parts of them have not yet been downloaded."}},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."},not_downloaded:{single:"This feature can't be rotated because parts of it have not yet been downloaded.",multiple:"These features can't be rotated because parts of them have not yet been downloaded."}},reverse:{title:"Reverse",description:"Make this line go in the opposite direction.",key:"V",annotation:"Reversed a line."},split:{title:"Split",description:{line:"Split this line into two at this node.",area:"Split the boundary of this area into two.",multiple:"Split the lines/area boundaries at this node into two."},key:"X",annotation:{line:"Split a line.",area:"Split an area boundary.",multiple:"Split {n} lines/area boundaries."},not_eligible:"Lines can't be split at their beginning or end.",multiple_ways:"There are too many lines here to split.",connected_to_hidden:"This can't be split because it is connected to a hidden feature."},restriction:{annotation:{create:"Added a turn restriction","delete":"Deleted a turn restriction"}},extract:{title:"Extract",key:"E",description:{vertex:{single:"Extract this point from its parent lines/areas."},area:{single:"Extract a point from this area."}},annotation:{single:"Extracted a point."},too_large:{area:{single:"A point can't be extracted from this area because not enough of it is currently visible."}},restriction:{vertex:{single:"This point can't be extracted because it would damage a \"{relation}\" relation."}},connected_to_hidden:{vertex:{single:"This point can't be extracted because it is connected to a hidden feature."}}}},restriction:{controls:{distance:"Distance",distance_up_to:"Up to {distance}",via:"Via",via_node_only:"Node only",via_up_to_one:"Up to 1 way",via_up_to_two:"Up to 2 ways"},help:{indirect:"(indirect)",turn:{no_left_turn:"NO Left Turn {indirect}",no_right_turn:"NO Right Turn {indirect}",no_u_turn:"NO U-Turn {indirect}",no_straight_on:"NO Straight On {indirect}",only_left_turn:"ONLY Left Turn {indirect}",only_right_turn:"ONLY Right Turn {indirect}",only_u_turn:"ONLY U-Turn {indirect}",only_straight_on:"ONLY Straight On {indirect}",allowed_left_turn:"Left Turn Allowed {indirect}",allowed_right_turn:"Right Turn Allowed {indirect}",allowed_u_turn:"U-Turn Allowed {indirect}",allowed_straight_on:"Straight On Allowed {indirect}"},from:"FROM",via:"VIA",to:"TO",from_name:"{from} {fromName}",from_name_to_name:"{from} {fromName} {to} {toName}",via_names:"{via} {viaNames}",select_from:"Click to select a {from} segment",select_from_name:"Click to select {from} {fromName}",toggle:"Click for \"{turn}\""}},undo:{tooltip:"Undo: {action}",nothing:"Nothing to undo."},redo:{tooltip:"Redo: {action}",nothing:"Nothing to redo."},tooltip_keyhint:"Shortcut:",browser_notice:"This editor is supported in Firefox, Chrome, Safari, Opera, and Internet Explorer 11 and above. Please upgrade your browser or use Potlatch 2 to edit the map.",translate:{translate:"Translate",localized_translation_label:"Multilingual Name",localized_translation_language:"Choose language",localized_translation_name:"Name"},zoom_in_edit:"Zoom in to edit",login:"Log In",logout:"Log Out",loading_auth:"Connecting to OpenStreetMap...",report_a_bug:"Report a bug",help_translate:"Help translate",sidebar:{key:"`",tooltip:"Toggle the sidebar."},feature_info:{hidden_warning:"{count} hidden features",hidden_details:"These features are currently hidden: {details}"},status:{error:"Unable to connect to API.",offline:"The API is offline. Please try editing later.",readonly:"The API is read-only. You will need to wait to save your changes.",rateLimit:"The API is limiting anonymous connections.  You can fix this by logging in."},commit:{title:"Upload to OpenStreetMap",upload_explanation:"The changes you upload will be visible on all maps that use OpenStreetMap data.",upload_explanation_with_user:"The changes you upload as {user} will be visible on all maps that use OpenStreetMap data.",request_review:"I would like someone to review my edits.",save:"Upload",cancel:"Cancel",changes:"{count} Changes",download_changes:"Download osmChange file",errors:"Errors",warnings:"Warnings",modified:"Modified",deleted:"Deleted",created:"Created",outstanding_errors_message:"Please resolve all errors first. {count} remaining.",comment_needed_message:"Please add a changeset comment first.",about_changeset_comments:"About changeset comments",about_changeset_comments_link:"//wiki.openstreetmap.org/wiki/Good_changeset_comments",google_warning:"You mentioned Google in this comment: remember that copying from Google Maps is strictly forbidden.",google_warning_link:"https://www.openstreetmap.org/copyright"},contributors:{list:"Edits by {users}",truncated_list:"Edits by {users} and {count} others"},info_panels:{key:"I",background:{key:"B",title:"Background",zoom:"Zoom",vintage:"Vintage",source:"Source",description:"Description",resolution:"Resolution",accuracy:"Accuracy",unknown:"Unknown",show_tiles:"Show Tiles",hide_tiles:"Hide Tiles",show_vintage:"Show Vintage",hide_vintage:"Hide Vintage"},history:{key:"H",title:"History",selected:"{n} selected",no_history:"No History (New Feature)",version:"Version",last_edit:"Last Edit",edited_by:"Edited By",changeset:"Changeset",unknown:"Unknown",link_text:"History on openstreetmap.org",note_no_history:"No History (New Note)",note_comments:"Comments",note_created_date:"Created Date",note_created_user:"Created By",note_link_text:"Note on openstreetmap.org"},location:{key:"L",title:"Location",unknown_location:"Unknown Location"},measurement:{key:"M",title:"Measurement",selected:"{n} selected",geometry:"Geometry",closed_line:"closed line",closed_area:"closed area",center:"Center",perimeter:"Perimeter",length:"Length",area:"Area",centroid:"Centroid",location:"Location",metric:"Metric",imperial:"Imperial",node_count:"Number of nodes"}},geometry:{point:"point",vertex:"vertex",line:"line",area:"area",relation:"relation",note:"note"},geocoder:{search:"Search worldwide...",no_results_visible:"No results in visible map area",no_results_worldwide:"No results found"},geolocate:{title:"Show My Location",locating:"Locating, please wait..."},inspector:{zoom_to:{key:"Z",title:"Zoom to this",tooltip_feature:"Center and zoom the map to focus on this feature.",tooltip_note:"Center and zoom the map to focus on this note.",tooltip_data:"Center and zoom the map to focus on this data.",tooltip_issue:"Center and zoom the map to focus on this issue."},show_more:"Show More",view_on_osm:"View on openstreetmap.org",view_on_keepRight:"View on keepright.at",all_fields:"All fields",all_tags:"All tags",all_members:"All members",all_relations:"All relations",add_to_relation:"Add to a relation",new_relation:"New relation...",choose_relation:"Choose a parent relation",role:"Role",choose:"Select feature type",results:"{n} results for {search}",no_documentation_key:"There is no documentation available.",edit_reference:"edit/translate",wiki_reference:"View documentation",wiki_en_reference:"View documentation in English",hidden_preset:{manual:"{features} are hidden. Enable them in the Map Data pane.",zoom:"{features} are hidden. Zoom in to enable them."},back_tooltip:"Change feature",remove:"Remove",search:"Search",multiselect:"Selected features",unknown:"Unknown",incomplete:"<not downloaded>",feature_list:"Search features",edit:"Edit feature",check:{yes:"Yes",no:"No",reverser:"Change Direction"},radio:{structure:{type:"Type","default":"Default",layer:"Layer"}},add:"Add",none:"None",node:"Node",way:"Way",relation:"Relation",location:"Location",add_fields:"Add field:",lock:{suggestion:"The \"{label}\" field is locked because there is a Wikidata tag. You can delete it or edit the tags in the \"All tags\" section."}},background:{title:"Background",description:"Background settings",key:"B",backgrounds:"Backgrounds",none:"None",best_imagery:"Best known imagery source for this location","switch":"Switch back to this background",custom:"Custom",overlays:"Overlays",imagery_source_faq:"Imagery Info / Report a Problem",reset:"reset",reset_all:"Reset All",display_options:"Display Options",brightness:"Brightness",contrast:"Contrast",saturation:"Saturation",sharpness:"Sharpness",minimap:{description:"Show Minimap",tooltip:"Show a zoomed out map to help locate the area currently displayed.",key:"/"},fix_misalignment:"Adjust imagery offset",offset:"Drag anywhere in the gray area below to adjust the imagery offset, or enter the offset values in meters."},map_data:{title:"Map Data",description:"Map Data",key:"F",data_layers:"Data Layers",layers:{osm:{tooltip:"Map data from OpenStreetMap",title:"OpenStreetMap data"},notes:{tooltip:"Note data from OpenStreetMap",title:"OpenStreetMap notes"},keepRight:{tooltip:"Automatically detected map issues from keepright.at",title:"KeepRight Issues"},improveOSM:{tooltip:"Missing data automatically detected by improveosm.org",title:"ImproveOSM Issues"},custom:{tooltip:"Drag and drop a data file onto the page, or click the button to setup",title:"Custom Map Data",zoom:"Zoom to data"}},fill_area:"Fill Areas",map_features:"Map Features",autohidden:"These features have been automatically hidden because too many would be shown on the screen.  You can zoom in to edit them.",osmhidden:"These features have been automatically hidden because the OpenStreetMap layer is hidden."},photo_overlays:{title:"Photo Overlays",traffic_signs:{title:"Traffic Signs"},photo_type:{flat:{title:"Flat Photos",tooltip:"Traditional photos"},panoramic:{title:"Panoramic Photos",tooltip:"360° photos"}}},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 Features",tooltip:"Proposed, Construction, Abandoned, Demolished, etc."},others:{description:"Other Features",tooltip:"Everything Else"}},area_fill:{wireframe:{description:"No Fill (Wireframe)",tooltip:"Enabling wireframe mode makes it easy to see the background imagery.",key:"W"},partial:{description:"Partial Fill",tooltip:"Areas are drawn with fill only around their inner edges. (Recommended for beginner mappers)"},full:{description:"Full Fill",tooltip:"Areas are drawn fully filled."}},settings:{custom_background:{tooltip:"Edit custom background",header:"Custom Background Settings",instructions:"Enter a tile URL template. Valid tokens are:\n   {zoom} or {z}, {x}, {y} for Z/X/Y tile scheme\n   {-y} or {ty} for flipped TMS-style Y coordinates\n   {u} for quadtile scheme\n   {switch:a,b,c} for DNS server multiplexing\n\nExample:\n{example}",template:{placeholder:"Enter a url template"}},custom_data:{tooltip:"Edit custom data layer",header:"Custom Map Data Settings",file:{instructions:"Choose a local data file. Supported types are:\n   .gpx, .kml, .geojson, .json",label:"Browse files"},or:"Or",url:{instructions:"Enter a data file URL or vector tile URL template. Valid tokens are:\n   {zoom} or {z}, {x}, {y} for Z/X/Y tile scheme",placeholder:"Enter a url"}}},restore:{heading:"You have unsaved changes",description:"Do you wish to restore unsaved changes from a previous editing session?",restore:"Restore my changes",reset:"Discard my changes"},save:{title:"Save",help:"Review your changes and upload them to OpenStreetMap, making them visible to other users.",no_changes:"No changes to save.",error:"Errors occurred while trying to save",status_code:"Server returned status code {code}",unknown_error_details:"Please ensure you are connected to the internet.",uploading:"Uploading changes to OpenStreetMap...",conflict_progress:"Checking for conflicts: {num} of {total}",unsaved_changes:"You have unsaved changes",conflict:{header:"Resolve conflicting edits",count:"Conflict {num} of {total}",previous:"< Previous",next:"Next >",keep_local:"Keep mine",keep_remote:"Use theirs",restore:"Restore","delete":"Leave Deleted",download_changes:"Or download osmChange file",done:"All conflicts resolved!",help:"Another user changed some of the same map features you changed.\nClick on each feature below for more details about the conflict, and choose whether to keep\nyour changes or the other user's changes.\n"}},merge_remote_changes:{conflict:{deleted:"This feature has been deleted by {user}.",location:"This feature was moved by both you and {user}.",nodelist:"Nodes were changed by both you and {user}.",memberlist:"Relation members were changed by both you and {user}.",tags:"You changed the <b>{tag}</b> tag to \"{local}\" and {user} changed it to \"{remote}\"."}},success:{just_edited:"You just edited OpenStreetMap!",thank_you:"Thank you for improving the map.",thank_you_location:"Thank you for improving the map around {where}.",thank_you_where:{format:"{place}{separator}{region}",separator:", "},help_html:"Your changes should appear on OpenStreetMap within a few minutes. It may take longer for maps elsewhere to receive updates.",help_link_text:"Details",help_link_url:"https://wiki.openstreetmap.org/wiki/FAQ#I_have_just_made_some_changes_to_the_map._How_do_I_get_to_see_my_changes.3F",view_on_osm:"View Changes on OSM",changeset_id:"Your changeset #: {changeset_id}",like_osm:"Like OpenStreetMap? Connect with others:",more:"More",events:"Events",languages:"Languages: {languages}",missing:"Is something missing from this list?",tell_us:"Tell us!"},confirm:{okay:"OK",cancel:"Cancel"},splash:{welcome:"Welcome to the iD OpenStreetMap editor",text:"iD is a friendly but powerful tool for contributing to the world's best free world map. This is version {version}. For more information see {website} and report bugs at {github}.",walkthrough:"Start the Walkthrough",start:"Edit now"},source_switch:{live:"live",lose_changes:"You have unsaved changes. Switching the map server will discard them. Are you sure you want to switch servers?",dev:"dev"},version:{whats_new:"What's new in iD {version}"},tag_reference:{description:"Description",on_wiki:"{tag} on wiki.osm.org",used_with:"used with {type}"},zoom:{"in":"Zoom in",out:"Zoom out"},cannot_zoom:"Cannot zoom out further in current mode.",full_screen:"Toggle Full Screen",QA:{improveOSM:{title:"ImproveOSM Detection",geometry_types:{path:"paths",parking:"parking",road:"roads",both:"roads and parking"},directions:{east:"east",north:"north",northeast:"northeast",northwest:"northwest",south:"south",southeast:"southeast",southwest:"southwest",west:"west"},error_types:{ow:{title:"Missing One-way",description:"Along this section of {highway}, {percentage}% of {num_trips} recorded trips travel from {from_node} to {to_node}. There may be missing a \"oneway\" tag."},mr:{title:"Missing Geometry",description:"{num_trips} recorded trips in this area suggest there may be unmapped {geometry_type} here.",description_alt:"Data from a 3rd party suggests there may be unmapped {geometry_type} here."},tr:{title:"Missing Turn Restriction",description:"{num_passed} of {num_trips} recorded trips (travelling {travel_direction}) make a turn from {from_way} to {to_way} at {junction}. There may be a missing \"{turn_restriction}\" restriction."}}},keepRight:{title:"KeepRight Error",detail_title:"Error",detail_description:"Description",comment:"Comment",comment_placeholder:"Enter a comment to share with other users.",close:"Close (Error Fixed)",ignore:"Ignore (Not an Error)",save_comment:"Save Comment",close_comment:"Close and Comment",ignore_comment:"Ignore and Comment",error_parts:{this_node:"this node",this_way:"this way",this_relation:"this relation",this_oneway:"this oneway",this_highway:"this highway",this_railway:"this railway",this_waterway:"this waterway",this_cycleway:"this cycleway",this_cycleway_footpath:"this cycleway/footpath",this_riverbank:"this riverbank",this_crossing:"this crossing",this_railway_crossing:"this railway crossing",this_bridge:"this bridge",this_tunnel:"this tunnel",this_boundary:"this boundary",this_turn_restriction:"this turn restriction",this_roundabout:"this roundabout",this_mini_roundabout:"this mini-roundabout",this_track:"this track",this_feature:"this feature",highway:"highway",railway:"railway",waterway:"waterway",cycleway:"cycleway",cycleway_footpath:"cycleway/footpath",riverbank:"riverbank",place_of_worship:"place of worship",pub:"pub",restaurant:"restaurant",school:"school",university:"university",hospital:"hospital",library:"library",theatre:"theatre",courthouse:"courthouse",bank:"bank",cinema:"cinema",pharmacy:"pharmacy",cafe:"cafe",fast_food:"fast food",fuel:"fuel",from:"from",to:"to",left_hand:"left-hand",right_hand:"right-hand"},errorTypes:{"20":{title:"Multiple nodes on the same spot",description:"There is more than one node in this spot. Node IDs: {var1}."},"30":{title:"Non-closed area",description:"{var1} is tagged with \"{var2}\" and should be a closed loop."},"40":{title:"Impossible oneway",description:"The first node {var1} of {var2} is not connected to any other way."},"41":{description:"The last node {var1} of {var2} is not connected to any other way."},"42":{description:"You cannot reach {var1} because all ways leading from it are oneway."},"43":{description:"You cannot escape from {var1} because all ways leading to it are oneway."},"50":{title:"Almost junction",description:"{var1} is very close but not connected to way {var2}."},"60":{title:"Deprecated tag",description:"{var1} uses deprecated tag \"{var2}\". Please use \"{var3}\" instead."},"70":{title:"Missing tag",description:"{var1} has an empty tag: \"{var2}\"."},"71":{description:"{var1} has no tags."},"72":{description:"{var1} is not member of any way and doesn't have any tags."},"73":{description:"{var1} has a \"{var2}\" tag but no \"highway\" tag."},"74":{description:"{var1} has an empty tag: \"{var2}\"."},"75":{description:"{var1} has a name \"{var2}\" but no other tags."},"90":{title:"Motorway without ref tag",description:"{var1} is tagged as a motorway and therefore needs a \"ref\", \"nat_ref\", or \"int_ref\" tag."},"100":{title:"Place of worship without religion",description:"{var1} is tagged as a place of worship and therefore needs a religion tag."},"110":{title:"Point of interest without name",description:"{var1} is tagged as a \"{var2}\" and therefore needs a name tag."},"120":{title:"Way without nodes",description:"{var1} has just one single node."},"130":{title:"Disconnected way",description:"{var1} is not connected to the rest of the map."},"150":{title:"Railway crossing without tag",description:"{var1} of a highway and a railway needs to be tagged as \"railway=crossing\" or \"railway=level_crossing\"."},"160":{title:"Railway layer conflict",description:"There are ways in different layers (e.g. tunnel or bridge) meeting at {var1}."},"170":{title:"FIXME tagged item",description:"{var1} has a FIXME tag: {var2}"},"180":{title:"Relation without type",description:"{var1} is missing a \"type\" tag."},"190":{title:"Intersection without junction",description:"{var1} intersects the {var2} {var3} but there is no junction node, bridge, or tunnel."},"200":{title:"Overlapping ways",description:"{var1} overlaps the {var2} {var3}."},"210":{title:"Self-intersecting way",description:"There is an unspecified issue with self intersecting ways."},"211":{description:"{var1} contains more than one node multiple times. Nodes are {var2}. This may or may not be an error."},"212":{description:"{var1} has only two different nodes and contains one of them more than once."},"220":{title:"Misspelled tag",description:"{var1} is tagged \"{var2}\" where \"{var3}\" looks like \"{var4}\"."},"221":{description:"{var1} has a suspicious tag \"{var2}\"."},"230":{title:"Layer conflict",description:"{var1} is a junction of ways on different layers."},"231":{description:"{var1} is a junction of ways on different layers: {var2}.",layer:"(layer: {layer})"},"232":{description:"{var1} is tagged with \"layer={var2}\". This need not be an error but it looks strange."},"270":{title:"Unusual motorway connection",description:"{var1} is a junction of a motorway and a highway other than \"motorway\", \"motorway_link\", \"trunk\", \"rest_area\", or \"construction\". Connection to \"service\" or \"unclassified\" is only valid if it has \"access=no/private\", or it leads to a motorway service area, or if it is a \"service=parking_aisle\"."},"280":{title:"Boundary issue",description:"There is an unspecified issue with this boundary."},"281":{title:"Boundary missing name",description:"{var1} has no name."},"282":{title:"Boundary missing admin level",description:"The boundary of {var1} has no valid numeric admin_level. Please do not mix admin levels (e.g. \"6;7\"). Always tag the lowest admin_level of all boundaries."},"283":{title:"Boundary not a closed loop",description:"The boundary of {var1} is not a closed loop."},"284":{title:"Boundary is split",description:"The boundary of {var1} splits here."},"285":{title:"Boundary admin_level too high",description:"{var1} has \"admin_level={var2}\" but belongs to a relation with lower \"admin_level\" (e.g. higher priority); it should have the lowest \"admin_level\" of all relations."},"290":{title:"Restriction issue",description:"There is an unspecified issue with this restriction."},"291":{title:"Restriction missing type",description:"{var1} has an unrecognized restriction type."},"292":{title:"Restriction missing \"from\" way",description:"{var1} has {var2} \"from\" members, but it should have 1."},"293":{title:"Restriction missing \"to\" way",description:"{var1} has {var2} \"to\" members, but it should have 1."},"294":{title:"Restriction \"from\" or \"to\" is not a way",description:"{var1} has \"from\" or \"to\" members which should be ways. {var2}."},"295":{title:"Restriction \"via\" is not an endpoint",description:"{var1} has a \"via\" (node {var2}) which is not the first or the last member of \"{var3}\" (way {var4})."},"296":{title:"Unusual restriction angle",description:"{var1} has a restriction type \"{var2}\" but the angle is {var3} degrees. Maybe the restriction type is not appropriate?"},"297":{title:"Wrong direction of \"to\" way",description:"{var1} does not match the direction of \"to\" way {var2}."},"298":{title:"Redundant restriction - oneway",description:"{var1} may be redundant. Entry already prohibited by \"oneway\" tag on {var2}."},"300":{title:"Missing maxspeed",description:"{var1} is missing a \"maxspeed\" tag and is tagged as motorway, trunk, primary, or secondary."},"310":{title:"Roundabout issue",description:"There is an unspecified issue with this roundabout."},"311":{title:"Roundabout not closed loop",description:"{var1} is part of a roundabout but is not closed-loop. (Split carriageways approaching a roundabout should not be tagged as roundabout)."},"312":{title:"Roundabout wrong direction",description:"If {var1} is in a country with {var2} traffic then its orientation goes the wrong way around."},"313":{title:"Roundabout weakly connected",description:"{var1} has only {var2} other road(s) connected. Roundabouts typically have 3 or more."},"320":{title:"Improper link connection",description:"{var1} is tagged as \"{var2}\" but doesn't have a connection to any other \"{var3}\" or \"{var4}\"."},"350":{title:"Improper bridge tag",description:"{var1} doesn't have a tag in common with its surrounding ways that shows the purpose of this bridge. There should be one of these tags: {var2}."},"360":{title:"Missing local name tag",description:"It would be nice if {var1} had a local name tag \"name:XX={var2}\" where XX shows the language of its common name \"{var2}\"."},"370":{title:"Doubled places",description:"{var1} has tags in common with the surrounding way {var2} {var3} and seems to be redundant.",including_the_name:"(including the name {name})"},"380":{title:"Non-physical use of sport tag",description:"{var1} is tagged \"{var2}\" but has no physical tag (e.g. \"leisure\", \"building\", \"amenity\", or \"highway\")."},"390":{title:"Missing tracktype",description:"{var1} doesn't have a \"tracktype\" tag."},"400":{title:"Geometry issue",description:"There is an unspecified issue with the geometry here."},"401":{title:"Missing turn restriction",description:"Ways {var1} and {var2} join in a very sharp angle here and there is no oneway tag or turn restriction that prevents turning."},"402":{title:"Impossible angle",description:"{var1} bends in a very sharp angle here."},"410":{title:"Website issue",description:"There is an unspecified issue with a contact website or URL."},"411":{description:"{var1} may have an outdated URL: {var2} returned HTTP status code {var3}."},"412":{description:"{var1} may have an outdated URL: {var2} contained suspicious text \"{var3}\"."},"413":{description:"{var1} may have an outdated URL: {var2} did not contain keywords \"{var3}\"."}}}},streetside:{tooltip:"Streetside photos from Microsoft",title:"Bing Streetside",report:"Report a privacy concern with this image",view_on_bing:"View on Bing Maps",hires:"High resolution"},mapillary_images:{tooltip:"Street-level photos from Mapillary"},mapillary:{title:"Mapillary",signs:{tooltip:"Traffic signs from Mapillary"},view_on_mapillary:"View this image on Mapillary"},openstreetcam_images:{tooltip:"Street-level photos from OpenStreetCam"},openstreetcam:{title:"OpenStreetCam",view_on_openstreetcam:"View this image on OpenStreetCam"},note:{note:"Note",title:"Edit note",anonymous:"anonymous",closed:"(Closed)",commentTitle:"Comments",status:{opened:"opened {when}",reopened:"reopened {when}",commented:"commented {when}",closed:"closed {when}"},newComment:"New Comment",inputPlaceholder:"Enter a comment to share with other users.",close:"Close Note",open:"Reopen Note",comment:"Comment",close_comment:"Close and Comment",open_comment:"Reopen and Comment",report:"Report","new":"New Note",newDescription:"Describe the issue.",save:"Save Note",login:"You must log in to change or comment on this note.",upload_explanation:"Your comments will be publicly visible to all OpenStreetMap users.",upload_explanation_with_user:"Your comments as {user} will be publicly visible to all OpenStreetMap users."},help:{title:"Help",key:"H",help:{title:"Help",welcome:"Welcome to the iD editor for [OpenStreetMap](https://www.openstreetmap.org/). With this editor you can update OpenStreetMap right from your web browser.",open_data_h:"Open Data",open_data:"Edits that you make on this map will be visible to everyone who uses OpenStreetMap. Your edits can be based on personal knowledge, on-the-ground surveying, or imagery collected from aerial or street level photos. Copying from commercial sources, like Google Maps, [is strictly forbidden](https://www.openstreetmap.org/copyright).",before_start_h:"Before you start",before_start:"You should be familiar with OpenStreetMap and this editor before you start editing. iD contains a walkthrough to teach you the basics of editing OpenStreetMap. Click \"Start the Walkthrough\" on this screen to take the tutorial - it takes only about 15 minutes.",open_source_h:"Open Source",open_source:"The iD editor is a collaborative open source project, and you are using version {version} now. The source code is available [on GitHub](https://github.com/openstreetmap/iD).",open_source_help:"You can help iD by [translating](https://github.com/openstreetmap/iD/blob/master/CONTRIBUTING.md#translating) or [reporting bugs](https://github.com/openstreetmap/iD/issues)."},overview:{title:"Overview",navigation_h:"Navigation",navigation_drag:"You can drag the map by pressing and holding down the {leftclick} left mouse button and moving the mouse around. You can also use the `↓`, `↑`, `←`, `→` arrow keys on your keyboard.",navigation_zoom:"You can zoom in or out by scrolling with the mouse wheel or trackpad, or by clicking the {plus} / {minus} buttons along the side of the map. You can also use the `+`, `-` keys on your keyboard.",features_h:"Map Features",features:"We use the word *features* to describe things that appear on the map, such as roads, buildings, or points of interest. Anything in the real world can be mapped as a feature on OpenStreetMap. Map features are represented on the map using *points*, *lines*, or *areas*.",nodes_ways:"In OpenStreetMap, points are sometimes called *nodes*, and lines and areas are sometimes called *ways*."},editing:{title:"Editing & Saving",select_h:"Select",select_left_click:"{leftclick} Left-click on a feature to select it. This will highlight it with a pulsing glow, and the sidebar will display details about that feature, such as its name or address.",select_right_click:"{rightclick} Right-click on a feature to display the editing menu, which shows the commands that are available, such as rotating, moving, and deleting.",multiselect_h:"Multiselect",multiselect_shift_click:"`{shift}`+{leftclick} left-click to select several features together.  This makes it easier to move or delete multiple items.",multiselect_lasso:"Another way to select multiple features is to hold down the `{shift}` key, then press and hold down the {leftclick} left mouse button and drag the mouse to draw a selection lasso. All of the points inside the lasso area will be selected.",undo_redo_h:"Undo & Redo",undo_redo:"Your edits are stored locally in your browser until you choose to save them to the OpenStreetMap server. You can undo edits by clicking the {undo} **Undo** button, and redo them by clicking the {redo} **Redo** button.",save_h:"Save",save:"Click {save} **Save** to finish your edits and send them to OpenStreetMap. You should remember to save your work frequently!",save_validation:"On the save screen, you'll have a chance to review what you've done. iD will also perform some basic checks for missing data and may offer helpful suggestions and warnings if something doesn't seem right.",upload_h:"Upload",upload:"Before uploading your changes you must enter a [changeset comment](https://wiki.openstreetmap.org/wiki/Good_changeset_comments). Then click **Upload** to send your changes to OpenStreetMap, where they will be merged into the map and publicly visible to everyone.",backups_h:"Automatic Backups",backups:"If you can't finish your edits in one sitting, for example if your computer crashes or you close the browser tab, your edits are still saved in your browser's storage. You can come back later (on the same browser and computer), and iD will offer to restore your work.",keyboard_h:"Keyboard Shortcuts",keyboard:"You can view a list of keyboard shortcuts by pressing the `?` key."},feature_editor:{title:"Feature Editor",intro:"The *feature editor* appears alongside the map, and allows you to see and edit all of the information for the selected feature.",definitions:"The top section displays the feature's type. The middle section contains *fields* showing the feature's attributes, such as its name or address.",type_h:"Feature Type",type:"You can click on the feature type to change the feature to a different type. Everything that exists in the real world can be added to OpenStreetMap, so there are thousands of feature types to choose from.",type_picker:"The type picker displays the most common feature types, such as parks, hospitals, restaurants, roads, and buildings. You can search for anything by typing what you're looking for in the search box. You can also click the {inspect} **Info** icon next to the feature type to learn more about it.",fields_h:"Fields",fields_all_fields:"The \"All fields\" section contains all of the feature's details that you may edit. In OpenStreetMap, all of the fields are optional, and it's OK to leave a field blank if you are unsure.",fields_example:"Each feature type will display different fields. For example, a road may display fields for its surface and speed limit, but a restaurant may display fields for the type of food it serves and the hours it is open.",fields_add_field:"You can also click the \"Add field\" dropdown to add more fields, such as a description, Wikipedia link, wheelchair access, and more.",tags_h:"Tags",tags_all_tags:"Below the fields section, you can expand the \"All tags\" section to edit any of the OpenStreetMap *tags* for the selected feature. Each tag consists of a *key* and *value*, data elements that define all of the features stored in OpenStreetMap.",tags_resources:"Editing a feature's tags requires intermediate knowledge about OpenStreetMap. You should consult resources like the [OpenStreetMap Wiki](https://wiki.openstreetmap.org/wiki/Main_Page) or [Taginfo](https://taginfo.openstreetmap.org/) to learn more about accepted OpenStreetMap tagging practices."},points:{title:"Points",intro:"*Points* can be used to represent features such as shops, restaurants, and monuments. They mark a specific location, and describe what's there.",add_point_h:"Adding Points",add_point:"To add a point, click the {point} **Point** button on the toolbar above the map, or press the shortcut key `1`. This will change the mouse cursor to a cross symbol.",add_point_finish:"To place the new point on the map, position the mouse cursor where the point should go, then {leftclick} left-click or press `Space`.",move_point_h:"Moving Points",move_point:"To move a point, place the mouse cursor over the point, then press and hold the {leftclick} left mouse button while dragging the point to its new location.",delete_point_h:"Deleting Points",delete_point:"It's OK to delete features that don't exist in the real world. Deleting a feature from OpenStreetMap removes it from the map that everyone uses, so you should make sure a feature is really gone before you delete it.",delete_point_command:"To delete a point, {rightclick} right-click on the point to select it and show the edit menu, then use the {delete} **Delete** command."},lines:{title:"Lines",intro:"*Lines* are used to represent features such as roads, railroads, and rivers. Lines should be drawn down the center of the feature that they represent.",add_line_h:"Adding Lines",add_line:"To add a line, click the {line} **Line** button on the toolbar above the map, or press the shortcut key `2`. This will change the mouse cursor to a cross symbol.",add_line_draw:"Next, position the mouse cursor where the line should begin and {leftclick} left-click or press `Space` to begin placing nodes along the line. Continue placing more nodes by clicking or pressing `Space`. While drawing, you can zoom in or drag the map in order to add more detail.",add_line_finish:"To finish a line, press `{return}` or click again on the last node.",modify_line_h:"Modifying Lines",modify_line_dragnode:"Often you'll see lines that aren't shaped correctly, for example a road that does not match up with the background imagery. To adjust the shape of a line, first {leftclick} left-click to select it. All nodes of the line will be drawn as small circles. You can then drag the nodes to better locations.",modify_line_addnode:"You can also create new nodes along a line either by {leftclick}**x2** double-clicking on the line or by dragging the small triangles at the midpoints between nodes.",connect_line_h:"Connecting Lines",connect_line:"Having roads connected properly is important for the map and essential for providing driving directions.",connect_line_display:"The connections between roads are drawn with gray circles. The endpoints of a line are drawn with larger white circles if they don't connect to anything.",connect_line_drag:"To connect a line to another feature, drag one of the line's nodes onto the other feature until both features snap together. Tip: You can hold down the `{alt}` key to prevent nodes from connecting to other features.",connect_line_tag:"If you know that the connection has traffic lights or crosswalks, you can add them by selecting the connecting node and using the feature editor to select the correct feature's type.",disconnect_line_h:"Disconnecting Lines",disconnect_line_command:"To disconnect a road from another feature, {rightclick} right-click the connecting node and select the {disconnect} **Disconnect** command from the editing menu.",move_line_h:"Moving Lines",move_line_command:"To move an entire line, {rightclick} right-click the line and select the {move} **Move** command from the editing menu. Then move the mouse, and {leftclick} left-click to place the line in a new location.",move_line_connected:"Lines that are connected to other features will stay connected as you move the line to a new location. iD may prevent you from moving a line across another connected line.",delete_line_h:"Deleting Lines",delete_line:"If a line is entirely incorrect, for example a road that doesn't exist in the real world, it's OK to delete it. Be careful when deleting features: the background imagery you are using might be outdated, and a road that looks wrong could simply be newly built.",delete_line_command:"To delete a line, {rightclick} right-click on the line to select it and show the edit menu, then use the {delete} **Delete** command."},areas:{title:"Areas",intro:"*Areas* are used to show the boundaries of features like lakes, buildings, and residential areas. Areas should be traced around the edge of the feature that they represent, for example, around the base of a building.",point_or_area_h:"Points or Areas?",point_or_area:"Many features can be represented as points or areas. You should map buildings and property outlines as areas whenever possible. Place points inside a building area to represent businesses, amenities, and other features located inside the building.",add_area_h:"Adding Areas",add_area_command:"To add an area, click the {area} **Area** button on the toolbar above the map, or press the shortcut key `3`. This will change the mouse cursor to a cross symbol.",add_area_draw:"Next, position the mouse cursor at one of the corners of the feature and {leftclick} left-click or press `Space` to begin placing nodes around the outer edge of the area. Continue placing more nodes by clicking or pressing `Space`. While drawing, you can zoom in or drag the map in order to add more detail.",add_area_finish:"To finish an area, press `{return}` or click again on either the first or last node.",square_area_h:"Square Corners",square_area_command:"Many area features like buildings have square corners. To square the corners of an area, {rightclick} right-click the edge of the area and select the {orthogonalize} **Square** command from the editing menu.",modify_area_h:"Modifying Areas",modify_area_dragnode:"Often you'll see areas that aren't shaped correctly, for example a building that does not match up with the background imagery. To adjust the shape of an area, first {leftclick} left-click to select it. All nodes of the area will be drawn as small circles. You can then drag the nodes to better locations.",modify_area_addnode:"You can also create new nodes along an area either by {leftclick}**x2** double-clicking on the edge of the area or by dragging the small triangles at the midpoints between nodes.",delete_area_h:"Deleting Areas",delete_area:"If an area is entirely incorrect, for example a building that doesn't exist in the real world, it's OK to delete it. Be cautious when deleting features - the background imagery you are using might be outdated, and a building that looks wrong could simply be newly built.",delete_area_command:"To delete an area, {rightclick} right-click on the area to select it and show the edit menu, then use the {delete} **Delete** command."},relations:{title:"Relations",intro:"A *relation* is a special type of feature in OpenStreetMap that groups together other features. The features that belong to a relation are called *members*, and each member can have a *role* in the relation.",edit_relation_h:"Editing Relations",edit_relation:"At the bottom of the feature editor, you can expand the \"All relations\" section to see if the selected feature is a member of any relations. You can then click on the relation to select and edit it.",edit_relation_add:"To add a feature to a relation, select the feature, then click the {plus} add button in the \"All relations\" section of the feature editor. You can choose from a list of nearby relations, or choose the \"New relation...\" option.",edit_relation_delete:"You can also click the {delete} **Delete** button to remove the selected feature from the relation. If you remove all of the members from a relation, the relation will be deleted automatically.",maintain_relation_h:"Maintaining Relations",maintain_relation:"For the most part, iD will maintain relations automatically as you edit. You should take care when replacing features that might be members of relations. For example if you delete a section of road and draw a new section of road to replace it, you should add the new section to the same relations (routes, turn restrictions, etc.) as the original.",relation_types_h:"Relation Types",multipolygon_h:"Multipolygons",multipolygon:"A *multipolygon* relation is a group of one or more *outer* features and one or more inner features. The outer features define the outer edges of the multipolygon, and the inner features define sub-areas or holes cut out from the inside of the multipolygon.",multipolygon_create:"To create a multipolygon, for example a building with a hole in it, draw the outer edge as an area and the inner edge as a line or different kind of area. Then `{shift}`+{leftclick} left-click to select both features, {rightclick} right-click to show the edit menu, and select the {merge} **Merge** command.",multipolygon_merge:"Merging several lines or areas will create a new multipolygon relation with all selected areas as members. iD will choose the inner and outer roles automatically, based on which features are contained inside other features.",turn_restriction_h:"Turn restrictions",turn_restriction:"A *turn restriction* relation is a group of several road segments in an intersection. Turn restrictions consist of a *from* road, *via* node or roads, and a *to* road.",turn_restriction_field:"To edit turn restrictions, select a junction node where two or more roads meet. The feature editor will display a special \"Turn Restrictions\" field containing a model of the intersection.",turn_restriction_editing:"In the \"Turn Restrictions\" field, click to select a \"from\" road, and see whether turns are allowed or restricted to any of the \"to\" roads. You can click on the turn icons to toggle them between allowed and restricted. iD will create relations automatically and set the from, via, and to roles based on your choices.",route_h:"Routes",route:"A *route* relation is a group of one or more line features that together form a route network, like a bus route, train route, or highway route.",route_add:"To add a feature to a route relation, select the feature and scroll down to the \"All relations\" section of the feature editor, then click the {plus} add button to add this feature to a nearby existing relation or a new relation.",boundary_h:"Boundaries",boundary:"A *boundary* relation is a group of one or more line features that together form an administrative boundary.",boundary_add:"To add a feature to a boundary relation, select the feature and scroll down to the \"All relations\" section of the feature editor, then click the {plus} add button to add this feature to a nearby existing relation or a new relation."},notes:{title:"Notes",intro:"*Notes* are used to alert other users that a feature requires fixing or attention. Notes mark a specific location on the map. To view existing notes or add new ones, click the {data} **Map data** panel to enable the OpenStreetMap notes layer.",add_note_h:"Adding Notes",add_note:"To add a new note, click the {note} **Note** button on the toolbar above the map, or press the shortcut key `4`. This will change the mouse cursor to a cross symbol. To place the new note on the map, position the mouse cursor where the note should go, then {leftclick} left-click or press `Space`.",move_note:"Only new notes can be moved. To move a note, place the mouse cursor over the new note, then press and hold the {leftclick} left mouse button while dragging the note to its new location.",update_note_h:"Closing, Reopening, and Commenting",update_note:"An existing note can be updated by closing it, reopening it, or adding a comment to it. Closing a note indicates that the problem has been resolved. Reopening a note indicates that the original issue is not resolved.",save_note_h:"Saving Notes",save_note:"You must save any note edits individually by clicking the buttons below the note comments. Note edits are **not** included in changesets that you upload to OpenStreetMap."},imagery:{title:"Background Imagery",intro:"The background imagery that appears beneath the map data is an important resource for mapping. This imagery can be aerial photos collected from satellites, airplanes, and drones, or it can be scanned historical maps or other freely available source data.",sources_h:"Imagery Sources",choosing:"To see which imagery sources are available for editing, click the {layers} **Background settings** button on the side of the map.",sources:"By default, a [Bing Maps](https://www.bing.com/maps/) satellite layer is chosen as the background image. Depending on where you are editing, other imagery sources will be available. Some may be newer or have higher resolution, so it is always useful to check and see which layer is the best one to use as a mapping reference.",offsets_h:"Adjusting Imagery Offset",offset:"Imagery is sometimes offset slightly from accurate map data. If you see a lot of roads or buildings shifted from the background imagery, it may be the imagery that's incorrect, so don't move them all to match the background. Instead, you can adjust the background so that it matches the existing data by expanding the \"Adjust Imagery Offset\" section at the bottom of the Background Settings pane.",offset_change:"Click on the small triangles to adjust the imagery offset in small steps, or hold the {leftclick} left mouse button and drag within the gray square to slide the imagery into alignment."},streetlevel:{title:"Street Level Photos",intro:"Street level photos are useful for mapping traffic signs, businesses, and other details that you can't see from satellite and aerial images. The iD editor supports street level photos from [Bing Streetside](https://www.microsoft.com/en-us/maps/streetside), [Mapillary](https://www.mapillary.com), and [OpenStreetCam](https://www.openstreetcam.org).",using_h:"Using Street Level Photos",using:"To use street level photos for mapping, click the {data} **Map data** panel on the side of the map to enable or disable the available photo layers.",photos:"When enabled, the photo layer displays a line along the sequence of photos. At higher zoom levels, a circle marks at each photo location, and at even higher zoom levels, a cone indicates the direction the camera was facing when the photo was taken.",viewer:"When you click on one of the photo locations, a photo viewer appears in the bottom corner of the map. The photo viewer contains controls to step forward and backward in the image sequence. It also shows the username of the person who captured the image, the date it was captured, and a link to view the image on the original site."},gps:{title:"GPS Traces",intro:"Collected GPS traces are a valuable source of data for OpenStreetMap. This editor supports *.gpx*, *.geojson*, and *.kml* files on your local computer. You can collect GPS traces with a smartphone, sports watch, or other GPS device.",survey:"For information on how to perform a GPS survey, read [Mapping with a smartphone, GPS, or paper](http://learnosm.org/en/mobile-mapping/).",using_h:"Using GPS Traces",using:"To use a GPS trace for mapping, drag and drop the data file onto the map editor. If it's recognized, it will be drawn on the map as a bright purple line. Click the {data} **Map data** panel on the side of the map to enable, disable, or zoom to your GPS data.",tracing:"The GPS track isn't sent to OpenStreetMap - the best way to use it is to draw on the map, using it as a guide for the new features that you add.",upload:"You can also [upload your GPS data to OpenStreetMap](https://www.openstreetmap.org/trace/create) for other users to use."},qa:{title:"Quality Assurance",intro:"*Quality Assurance* (Q/A) tools can find improper tags, disconnected roads, and other issues with OpenStreetMap, which mappers can then fix. To view existing Q/A issues, click the {data} **Map data** panel to enable a specific Q/A layer.",tools_h:"Tools",tools:"The following tools are currently supported: [KeepRight](https://www.keepright.at/) and [ImproveOSM](https://improveosm.org/en/). Expect iD to support [Osmose](https://osmose.openstreetmap.fr/) and more Q/A tools in the future.",issues_h:"Handling Issues",issues:"Handling Q/A issues is similar to handling notes. Click on a marker to view the issue details in the sidebar. Each tool has its own capabilities, but generally you can comment and/or close an issue."},field:{restrictions:{title:"Turn Restrictions Help",about:{title:"About",about:"This field allows you to inspect and modify turn restrictions. It displays a model of the selected intersection including other nearby connected roads.",from_via_to:"A turn restriction always contains: one **FROM way**, one **TO way**, and either one **VIA node** or one or more **VIA ways**.",maxdist:"The \"{distField}\" slider controls how far to search for additional connected roads.",maxvia:"The \"{viaField}\" slider adjusts how many via ways may be included in the search. (Tip: simple is better)"},inspecting:{title:"Inspecting",about:"Hover over any **FROM** segment to see whether it has any turn restrictions. Each possible **TO** destination will be drawn with a colored shadow showing whether a restriction exists.",from_shadow:"{fromShadow} **FROM segment**",allow_shadow:"{allowShadow} **TO Allowed**",restrict_shadow:"{restrictShadow} **TO Restricted**",only_shadow:"{onlyShadow} **TO Only**",restricted:"\"Restricted\" means that there is a turn restriction, for example \"No Left Turn\".",only:"\"Only\" means that a vehicle taking that path may only make that choice, for example \"Only Straight On\"."},modifying:{title:"Modifying",about:"To modify turn restrictions, first click on any starting **FROM** segment to select it. The selected segment will pulse, and all possible **TO** destinations will appear as turn symbols.",indicators:"Then, click on a turn symbol to toggle it between \"Allowed\", \"Restricted\", and \"Only\".",allow_turn:"{allowTurn} **TO Allowed**",restrict_turn:"{restrictTurn} **TO Restricted**",only_turn:"{onlyTurn} **TO Only**"},tips:{title:"Tips",simple:"**Prefer simple restrictions over complex ones.**",simple_example:"For example, avoid creating a via-way restriction if a simpler via-node turn restriction will do.",indirect:"**Some restrictions display the text \"(indirect)\" and are drawn lighter.**",indirect_example:"These restrictions exist because of another nearby restriction. For example, an \"Only Straight On\" restriction will indirectly create \"No Turn\" restrictions for all other paths through the intersection.",indirect_noedit:"You may not edit indirect restrictions. Instead, edit the nearby direct restriction."}}}},issues:{title:"Issues",key:"I",list_title:"Issues ({count})",errors:{list_title:"Errors ({count})"},warnings:{list_title:"Warnings ({count})"},rules:{title:"Rules"},no_issues:{message:{everything:"Everything looks fine",everything_in_view:"Everything in view looks fine",edits:"Your edits look fine",edits_in_view:"Your edits in view look fine"},hidden_issues:{none:"Detected issues will appear here",elsewhere:"Issues elsewhere: {count}",other_features:"Issues with other features: {count}",other_features_elsewhere:"Issues elsewhere with other features: {count}",disabled_rules:"Issues with disabled rules: {count}",disabled_rules_elsewhere:"Issues elsewhere with disabled rules: {count}",ignored_issues:"Ignored issues: {count}",ignored_issues_elsewhere:"Ignored issues elsewhere: {count}"}},options:{what:{title:"Check:",edited:"My Edits",all:"Everything"},where:{title:"Where:",visible:"In View",all:"Everywhere"}},suggested:"Suggested updates:",enable_all:"Enable All",disable_all:"Disable All",reset_ignored:"Reset Ignored ({count})",fix_one:{title:"fix"},fix_all:{title:"Fix All",annotation:"Fixed several validation issues."},almost_junction:{title:"Almost Junctions",message:"{feature} is very close but not connected to {feature2}",tip:"Find features that should possibly be connected to other nearby features","highway-highway":{reference:"Intersecting highways should share a junction vertex."}},close_nodes:{title:"Very Close Points",message:"Two points in {way} are very close together",tip:"Find redundant points in ways",reference:"Redundant points in a way should be merged or moved apart."},crossing_ways:{title:"Crossings Ways",message:"{feature} crosses {feature2}",tip:"Find features that incorrectly cross over one another","building-building":{reference:"Buildings should not intersect except on different layers."},"building-highway":{reference:"Highways crossing buildings should use bridges, tunnels, coverings, or entrances."},"building-railway":{reference:"Railways crossing buildings should use bridges or tunnels."},"building-waterway":{reference:"Waterways crossing buildings should use tunnels or different layers."},"highway-highway":{reference:"Crossing highways should use bridges, tunnels, or intersections."},"highway-railway":{reference:"Highways crossing railways should use bridges, tunnels, or level crossings."},"highway-waterway":{reference:"Highways crossing waterways should use bridges, tunnels, or fords."},"railway-railway":{reference:"Crossing railways should be connected or use bridges or tunnels."},"railway-waterway":{reference:"Railways crossing waterways should use bridges or tunnels."},"waterway-waterway":{reference:"Crossing waterways should be connected or use tunnels."},"tunnel-tunnel":{reference:"Crossing tunnels should use different layers."},"tunnel-tunnel_connectable":{reference:"Crossing tunnels should be connected or use different layers."},"bridge-bridge":{reference:"Crossing bridges should use different layers."},"bridge-bridge_connectable":{reference:"Crossing bridges should be connected or use different layers."},"indoor-indoor":{reference:"Crossing indoor features should use different levels."},"indoor-indoor_connectable":{reference:"Crossing indoor features should be connected or use different levels."}},disconnected_way:{title:"Disconnected Ways",tip:"Find unroutable roads, paths, and ferry routes",routable:{message:{multiple:"{count} routable features are connected only to each other."},reference:"All roads, paths, and ferry routes should connect to form a single routing network."},highway:{message:"{highway} is disconnected from other roads and paths"}},fixme_tag:{title:"\"Fix Me\" Requests",message:"{feature} has a \"Fix Me\" request",tip:"Find features with \"fixme\" tags",reference:"A \"fixme\" tag indicates that a mapper has requested help with a feature."},generic_name:{title:"Suspicious Names",message:"{feature} has the suspicious name \"{name}\"",tip:"Find features with generic or suspicious names",reference:"Names should be the actual, on-the-ground names of features."},incompatible_source:{title:"Suspicious Sources",tip:"Find features with suspicious source tags",google:{feature:{message:"{feature} lists Google as a data source"},reference:"Google products are proprietary and must not be used as references."}},missing_role:{title:"Missing Roles",message:"{member} has no role within {relation}",tip:"Find relations with missing or incorrect member roles",multipolygon:{reference:"Multipolygon members must have an inner or outer role."}},missing_tag:{title:"Missing Tags",tip:"Find features that are missing descriptive tags",reference:"Features must have tags that define what they are.",any:{message:"{feature} has no tags"},descriptive:{message:"{feature} has no descriptive tags"},relation_type:{message:"{feature} is a relation without a type"}},old_multipolygon:{message:"{multipolygon} has misplaced tags",reference:"Multipolygons should be tagged on their relation, not their outer way."},outdated_tags:{title:"Outdated Tags",message:"{feature} has outdated tags",tip:"Find features with deprecated tags that can be updated",reference:"Some tags change over time and should be updated."},private_data:{title:"Private Information",tip:"Find features that may contain private information",reference:"Sensitive data like personal phone numbers should not be tagged.",contact:{message:"{feature} might be tagged with private contact information"}},tag_suggests_area:{title:"Lines Tagged as Areas",message:"{feature} should be a closed area based on the tag \"{tag}\"",tip:"Find features that are tagged as lines and should possibly be tagged as areas",reference:"Areas must have connected endpoints."},unknown_road:{message:"{feature} has no classification",reference:"Roads without a specific type may not appear in maps or routing."},impossible_oneway:{title:"Impossible One-Ways",tip:"Find route issues with one-way features",waterway:{connected:{start:{message:"{feature} flows away from a connected waterway"},end:{message:"{feature} flows against a connected waterway"},reference:"Waterway segments should all flow in the same direction."}},highway:{start:{message:"{feature} is unreachable",reference:"One-way roads must be accessible via other roads."},end:{message:"{feature} has no outlet",reference:"One-way roads must lead to other roads."}}},unsquare_way:{title:"Unsquare Corners (up to {val}°)",message:"{feature} has unsquare corners",tip:"Find features with unsquare corners that can be drawn better",buildings:{reference:"Buildings with unsquare corners can often be drawn more accurately."}},fix:{connect_almost_junction:{annotation:"Connected very close features."},connect_crossing_features:{annotation:"Connected crossing features."},connect_endpoints:{title:"Connect the ends",annotation:"Connected the endpoints of a way."},connect_feature:{title:"Connect this feature"},connect_features:{title:"Connect the features"},continue_from_start:{title:"Continue drawing from start"},continue_from_end:{title:"Continue drawing from end"},delete_feature:{title:"Delete this feature"},ignore_issue:{title:"Ignore this issue"},merge_close_vertices:{annotation:"Merged very close points in a way."},merge_points:{title:"Merge these points"},move_points_apart:{title:"Move these points apart"},move_tags:{title:"Move the tags",annotation:"Moved tags."},remove_from_relation:{title:"Remove from relation"},remove_generic_name:{title:"Remove the name",annotation:"Removed a generic name."},remove_private_info:{annotation:"Removed private information."},remove_proprietary_data:{title:"Remove any proprietary data"},remove_tag:{title:"Remove the tag",annotation:"Removed tag."},remove_tags:{title:"Remove the tags"},reposition_features:{title:"Reposition the features"},reverse_feature:{title:"Reverse this feature"},select_preset:{title:"Select a feature type"},select_road_type:{title:"Select a road type"},set_as_inner:{title:"Set as inner"},set_as_outer:{title:"Set as outer"},square_feature:{title:"Square this feature"},tag_as_disconnected:{title:"Tag as disconnected",annotation:"Tagged very close features as disconnected."},tag_as_unsquare:{title:"Tag as physically unsquare",annotation:"Tagged a way as having unsquare corners."},tag_this_as_higher:{title:"Tag this as higher"},tag_this_as_lower:{title:"Tag this as lower"},upgrade_tags:{title:"Upgrade the tags",annotation:"Upgraded old tags."},use_bridge_or_tunnel:{title:"Use a bridge or tunnel"},use_different_layers:{title:"Use different layers"},use_different_levels:{title:"Use different levels"},use_tunnel:{title:"Use a tunnel"}}},intro:{done:"done",ok:"OK",graph:{block_number:"<value for addr:block_number>",city:"Three Rivers",county:"<value for addr:county>",district:"<value for addr:district>",hamlet:"<value for addr:hamlet>",neighbourhood:"<value for addr:neighbourhood>",postcode:"49093",province:"<value for addr:province>",quarter:"<value for addr:quarter>",state:"MI",subdistrict:"<value for addr:subdistrict>",suburb:"<value for addr:suburb>",countrycode:"us",name:{"1st-avenue":"1st Avenue","2nd-avenue":"2nd Avenue","4th-avenue":"4th Avenue","5th-avenue":"5th Avenue","6th-avenue":"6th Avenue","6th-street":"6th Street","7th-avenue":"7th Avenue","8th-avenue":"8th Avenue","9th-avenue":"9th Avenue","10th-avenue":"10th Avenue","11th-avenue":"11th Avenue","12th-avenue":"12th Avenue","access-point-employment":"Access Point Employment","adams-street":"Adams Street","andrews-elementary-school":"Andrews Elementary School","andrews-street":"Andrews Street","armitage-street":"Armitage Street","barrows-school":"Barrows School","battle-street":"Battle Street","bennett-street":"Bennett Street","bowman-park":"Bowman Park","collins-drive":"Collins Drive","conrail-railroad":"Conrail Railroad","conservation-park":"Conservation Park","constantine-street":"Constantine Street","cushman-street":"Cushman Street","dollar-tree":"Dollar Tree","douglas-avenue":"Douglas Avenue","east-street":"East Street","elm-street":"Elm Street","flower-street":"Flower Street","foster-street":"Foster Street","french-street":"French Street","garden-street":"Garden Street","gem-pawnbroker":"Gem Pawnbroker","golden-finch-framing":"Golden Finch Framing","grant-avenue":"Grant Avenue","hoffman-pond":"Hoffman Pond","hoffman-street":"Hoffman Street","hook-avenue":"Hook Avenue","jefferson-street":"Jefferson Street","kelsey-street":"Kelsey Street","lafayette-park":"LaFayette Park","las-coffee-cafe":"L.A.'s Coffee Cafe","lincoln-avenue":"Lincoln Avenue","lowrys-books":"Lowry's Books","lynns-garage":"Lynn's Garage","main-street-barbell":"Main Street Barbell","main-street-cafe":"Main Street Cafe","main-street-fitness":"Main Street Fitness","main-street":"Main Street","maple-street":"Maple Street","marina-park":"Marina Park","market-street":"Market Street","memory-isle-park":"Memory Isle Park","memory-isle":"Memory Isle","michigan-avenue":"Michigan Avenue","middle-street":"Middle Street","millard-street":"Millard Street","moore-street":"Moore Street","morris-avenue":"Morris Avenue","mural-mall":"Mural Mall","paisanos-bar-and-grill":"Paisano's Bar and Grill","paisley-emporium":"Paisley Emporium","paparazzi-tattoo":"Paparazzi Tattoo","pealer-street":"Pealer Street","pine-street":"Pine Street","pizza-hut":"Pizza Hut","portage-avenue":"Portage Avenue","portage-river":"Portage River","preferred-insurance-services":"Preferred Insurance Services","railroad-drive":"Railroad Drive","river-city-appliance":"River City Appliance","river-drive":"River Drive","river-road":"River Road","river-street":"River Street","riverside-cemetery":"Riverside Cemetery","riverwalk-trail":"Riverwalk Trail","riviera-theatre":"Riviera Theatre","rocky-river":"Rocky River","saint-joseph-river":"Saint Joseph River","scidmore-park-petting-zoo":"Scidmore Park Petting Zoo","scidmore-park":"Scidmore Park","scouter-park":"Scouter Park","sherwin-williams":"Sherwin-Williams","south-street":"South Street","southern-michigan-bank":"Southern Michigan Bank","spring-street":"Spring Street","sturgeon-river-road":"Sturgeon River Road","three-rivers-city-hall":"Three Rivers City Hall","three-rivers-elementary-school":"Three Rivers Elementary School","three-rivers-fire-department":"Three Rivers Fire Department","three-rivers-high-school":"Three Rivers High School","three-rivers-middle-school":"Three Rivers Middle School","three-rivers-municipal-airport":"Three Rivers Municipal Airport","three-rivers-post-office":"Three Rivers Post Office","three-rivers-public-library":"Three Rivers Public Library","three-rivers":"Three Rivers","unique-jewelry":"Unique Jewelry","walnut-street":"Walnut Street","washington-street":"Washington Street","water-street":"Water Street","west-street":"West Street","wheeler-street":"Wheeler Street","william-towing":"William Towing","willow-drive":"Willow Drive","wood-street":"Wood Street","world-fare":"World Fare"}},welcome:{title:"Welcome",welcome:"Welcome! This walkthrough will teach you the basics of editing on OpenStreetMap.",practice:"All of the data in this walkthrough is just for practicing, and any edits that you make in the walkthrough will not be saved.",words:"This walkthrough will introduce some new words and concepts. When we introduce a new word, we'll use *italics*.",mouse:"You can use any input device to edit the map, but this walkthrough assumes you have a mouse with left and right buttons. **If you want to attach a mouse, do so now, then click OK.**",leftclick:"When this tutorial asks you to click or double-click, we mean with the left button. On a trackpad it might be a single-click or single-finger tap. **Left-click {num} times.**",rightclick:"Sometimes we'll also ask you to right-click. This might be the same as control-click, or two-finger tap on a trackpad. Your keyboard might even have a 'menu' key that works like right-click. **Right-click {num} times.**",chapters:"So far, so good! You can use the buttons below to skip chapters at any time or to restart a chapter if you get stuck. Let's begin! **Click '{next}' to continue.**"},navigation:{title:"Navigation",drag:"The main map area shows OpenStreetMap data on top of a background.{br}You can drag the map by pressing and holding the left mouse button while moving the mouse around. You can also use the arrow keys on your keyboard. **Drag the map!**",zoom:"You can zoom in or out by scrolling with the mouse wheel or trackpad, or by clicking the {plus} / {minus} buttons. **Zoom the map!**",features:"We use the word *features* to describe the things that appear on the map. Anything in the real world can be mapped as a feature on OpenStreetMap.",points_lines_areas:"Map features are represented using *points, lines, or areas.*",nodes_ways:"In OpenStreetMap, points are sometimes called *nodes*, and lines and areas are sometimes called *ways*.",click_townhall:"All features on the map can be selected by clicking on them. **Click on the point to select it.**",selected_townhall:"Great! The point is now selected. Selected features are drawn with a pulsing glow.",editor_townhall:"When a feature is selected, the *feature editor* is displayed alongside the map.",preset_townhall:"The top part of the feature editor shows the feature's type. This point is a {preset}.",fields_townhall:"The middle part of the feature editor contains *fields* showing the feature's attributes, such as its name and address.",close_townhall:"**Close the feature editor by hitting escape or pressing the {button} button in the upper corner.**",search_street:"You can also search for features in the current view, or worldwide. **Search for '{name}'.**",choose_street:"**Choose {name} from the list to select it.**",selected_street:"Great! {name} is now selected.",editor_street:"The fields shown for a street are different than the fields that were shown for the town hall.{br}For this selected street, the feature editor shows fields like '{field1}' and '{field2}'. **Close the feature editor by hitting escape or pressing the {button} button.**",play:"Try moving the map and clicking on some other features to see what kinds of things can be added to OpenStreetMap. **When you are ready to continue to the next chapter, click '{next}'.**"},points:{title:"Points",add_point:"*Points* can be used to represent features such as shops, restaurants, and monuments.{br}They mark a specific location, and describe what's there. **Click the {button} Point button to add a new point.**",place_point:"To place the new point on the map, position your mouse cursor where the point should go, then left-click or press the spacebar. **Move the mouse pointer over this building, then left-click or press the spacebar.**",search_cafe:"There are many different features that can be represented by points. The point you just added is a cafe. **Search for '{preset}'.**",choose_cafe:"**Choose {preset} from the list.**",feature_editor:"The point is now marked as a cafe. Using the feature editor, we can add more information about the cafe.",add_name:"In OpenStreetMap, all of the fields are optional, and it's OK to leave a field blank if you are unsure.{br}Let's pretend that you have local knowledge of this cafe, and you know its name. **Add a name for the cafe.**",add_close:"The feature editor will remember all of your changes automatically. **When you are finished adding the name, hit escape, enter, or click the {button} button to close the feature editor.**",reselect:"Often points will already exist, but have mistakes or be incomplete. We can edit existing points. **Click to select the cafe you just created.**",update:"Let's fill in some more details for this cafe. You can change its name, add a cuisine, or add an address. **Change the cafe details.**",update_close:"**When you are finished updating the cafe, hit escape, enter, or click the {button} button to close the feature editor.**",rightclick:"You can right-click on any feature to see the *edit menu*, which shows a list of editing operations that can be performed. **Right-click to select the point you created and show the edit menu.**","delete":"It's OK to delete features that don't exist in the real world.{br}Deleting a feature from OpenStreetMap removes it from the map that everyone uses, so you should make sure a feature is really gone before you delete it. **Click on the {button} button to delete the point.**",undo:"You can always undo any changes up until you save your edits to OpenStreetMap. **Click on the {button} button to undo the delete and get the point back.**",play:"Now that you know how to create and edit points, try creating a few more points for practice! **When you are ready to continue to the next chapter, click '{next}'.**"},areas:{title:"Areas",add_playground:"*Areas* are used to show the boundaries of features like lakes, buildings, and residential areas.{br}They can also be used for more detailed mapping of many features you might normally map as points. **Click the {button} Area button to add a new area.**",start_playground:"Let's add this playground to the map by drawing an area. Areas are drawn by placing *nodes* along the outer edge of the feature. **Click or press spacebar to place a starting node on one of the corners of the playground.**",continue_playground:"Continue drawing the area by placing more nodes along the playground's edge. It is OK to connect the area to the existing walking paths.{br}Tip: You can hold down the '{alt}' key to prevent nodes from connecting to other features. **Continue drawing an area for the playground.**",finish_playground:"Finish the area by pressing enter, or clicking again on either the first or last node. **Finish drawing an area for the playground.**",search_playground:"**Search for '{preset}'.**",choose_playground:"**Choose {preset} from the list.**",add_field:"This playground doesn't have an official name, so we won't add anything in the Name field.{br}Instead let's add some additional details about the playground to the Description field. **Open the Add Field list.**",choose_field:"**Choose {field} from the list.**",retry_add_field:"You didn't select the {field} field. Let's try again.",describe_playground:"**Add a description, then click the {button} button to close the feature editor.**",play:"Good job! Try drawing a few more areas, and see what other kinds of area features you can add to OpenStreetMap. **When you are ready to continue to the next chapter, click '{next}'.**"},lines:{title:"Lines",add_line:"*Lines* are used to represent features such as roads, railroads, and rivers. **Click the {button} Line button to add a new line.**",start_line:"Here is a road that is missing. Let's add it!{br}In OpenStreetMap, lines should be drawn down the center of the road. You can drag and zoom the map while drawing if necessary. **Start a new line by clicking at the top end of this missing road.**",intersect:"Click or press spacebar to add more nodes to the line.{br}Roads, and many other types of lines, are part of a larger network. It is important for these lines to be connected properly in order for routing applications to work. **Click on {name} to create an intersection connecting the two lines.**",retry_intersect:"The road needs to intersect {name}. Let's try again!",continue_line:"Continue drawing the line for the new road. Remember that you can drag and zoom the map if needed.{br}When you are finished drawing, click on the last node again. **Finish drawing the road.**",choose_category_road:"**Select {category} from the list.**",choose_preset_residential:"There are many different types of roads, but this one is a residential road. **Choose the {preset} type.**",retry_preset_residential:"You didn't select the {preset} type. **Click here to choose again.**",name_road:"**Give this road a name, then hit escape, enter, or click the {button} button to close the feature editor.**",did_name_road:"Looks good! Next we will learn how to update the shape of a line.",update_line:"Sometimes you will need to change the shape of an existing line. Here is a road that doesn't look quite right.",add_node:"We can add some nodes to this line to improve its shape. One way to add a node is to double-click the line where you want to add a node. **Double-click on the line to create a new node.**",start_drag_endpoint:"When a line is selected, you can drag any of its nodes by clicking and holding down the left mouse button while you drag. **Drag the endpoint to the place where these roads should intersect.**",finish_drag_endpoint:"This spot looks good. **Release the left mouse button to finish dragging.**",start_drag_midpoint:"Small triangles are drawn at the *midpoints* between nodes. Another way to create a new node is to drag a midpoint to a new location. **Drag the midpoint triangle to create a new node along the curve of the road.**",continue_drag_midpoint:"This line is looking much better! Continue to adjust this line by double-clicking or dragging midpoints until the curve matches the road shape. **When you're happy with how the line looks, click OK.**",delete_lines:"It's OK to delete lines for roads that don't exist in the real world.{br}Here's an example where the city planned a {street} but never built it. We can improve this part of the map by deleting the extra lines.",rightclick_intersection:"The last real street is {street1}, so we will *split* {street2} at this intersection and remove everything above it. **Right click on the intersection node.**",split_intersection:"**Click on the {button} button to split {street}.**",retry_split:"You didn't click the Split button. Try again.",did_split_multi:"Good job! {street1} is now split into two pieces. The top part can be removed. **Click the top part of {street2} to select it.**",did_split_single:"**Click the top part of {street2} to select it.**",multi_select:"{selected} is now selected. Let's also select {other1}. You can shift-click to select multiple things. **Shift-click on {other2}.**",multi_rightclick:"Good! Both lines to delete are now selected. **Right-click on one of the lines to show the edit menu.**",multi_delete:"**Click on the {button} button to delete the extra lines.**",retry_delete:"You didn't click the Delete button. Try again.",play:"Great! Use the skills that you've learned in this chapter to practice editing some more lines. **When you are ready to continue to the next chapter, click '{next}'.**"},buildings:{title:"Buildings",add_building:"OpenStreetMap is the world's largest database of buildings.{br}You can help improve this database by tracing buildings that aren't already mapped. **Click the {button} Area button to add a new area.**",start_building:"Let's add this house to the map by tracing its outline.{br}Buildings should be traced around their footprint as accurately as possible. **Click or press spacebar to place a starting node on one of the corners of the building.**",continue_building:"Continue adding more nodes to trace the outline of the building. Remember that you can zoom in if you want to add more details.{br}Finish the building by pressing enter, or clicking again on either the first or last node. **Finish tracing the building.**",retry_building:"It looks like you had some trouble placing the nodes at the building corners. Try again!",choose_category_building:"**Choose {category} from the list.**",choose_preset_house:"There are many different types of buildings, but this one is clearly a house.{br}If you're not sure of the type, it's OK to just choose the generic Building type. **Choose the {preset} type.**",close:"**Hit escape or click the {button} button to close the feature editor.**",rightclick_building:"**Right-click to select the building you created and show the edit menu.**",square_building:"The house that you just added will look even better with perfectly square corners. **Click on the {button} button to square the building shape.**",retry_square:"You didn't click the Square button. Try again.",done_square:"See how the corners of the building moved into place? Let's learn another useful trick.",add_tank:"Next we'll trace this circular storage tank. **Click the {button} Area button to add a new area.**",start_tank:"Don't worry, you won't need to draw a perfect circle. Just draw an area inside the tank that touches its edge. **Click or press spacebar to place a starting node on the edge of the tank.**",continue_tank:"Add a few more nodes around the edge. The circle will be created outside the nodes that you draw.{br}Finish the area by pressing enter, or clicking again on either the first or last node. **Finish tracing the tank.**",search_tank:"**Search for '{preset}'.**",choose_tank:"**Choose {preset} from the list.**",rightclick_tank:"**Right-click to select the storage tank you created and show the edit menu.**",circle_tank:"**Click on the {button} button to make the tank a circle.**",retry_circle:"You didn't click the Circularize button. Try again.",play:"Great Job! Practice tracing a few more buildings, and try some of the other commands on the edit menu. **When you are ready to continue to the next chapter, click '{next}'.**"},startediting:{title:"Start Editing",help:"You're now ready to edit OpenStreetMap!{br}You can replay this walkthrough anytime or view more documentation by clicking the {button} Help button or pressing the '{key}' key.",shortcuts:"You can view a list of commands along with their keyboard shortcuts by pressing the '{key}' key.",save:"Don't forget to regularly save your changes!",start:"Start mapping!"}},shortcuts:{title:"Keyboard shortcuts",tooltip:"Show the keyboard shortcuts screen.",toggle:{key:"?"},key:{alt:"Alt",backspace:"Backspace",cmd:"Cmd",ctrl:"Ctrl","delete":"Delete",del:"Del",end:"End",enter:"Enter",esc:"Esc",home:"Home",option:"Option",pause:"Pause",pgdn:"PgDn",pgup:"PgUp","return":"Return",shift:"Shift",space:"Space"},gesture:{drag:"drag"},or:"-or-",browsing:{title:"Browsing",navigation:{title:"Navigation",pan:"Pan map",pan_more:"Pan map by one screenful",zoom:"Zoom in / Zoom out",zoom_more:"Zoom in / Zoom out by a lot"},help:{title:"Help",help:"Show help/documentation",keyboard:"Show keyboard shortcuts"},display_options:{title:"Display options",background:"Show background options",background_switch:"Switch back to last background",map_data:"Show map data options",fullscreen:"Enter full screen mode",sidebar:"Toggle sidebar",wireframe:"Toggle wireframe mode",osm_data:"Toggle OpenStreetMap data",minimap:"Toggle minimap"},selecting:{title:"Selecting features",select_one:"Select a single feature",select_multi:"Select multiple features",lasso:"Draw a selection lasso around features",search:"Find features matching search text"},with_selected:{title:"With feature selected",edit_menu:"Toggle edit menu",zoom_to:"Zoom to selected feature"},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",focus_add_feature:"Focus the feature search field",add_point:"'Add point' mode",add_line:"'Add line' mode",add_area:"'Add area' mode",add_note:"'Add note' mode",add_favorite:"Add a favorite feature",place_point:"Place a point or note",disable_snap:"Hold to disable point snapping",stop_line:"Finish drawing a line or area"},operations:{title:"Operations",continue_line:"Continue a line at the selected node",merge:"Combine (merge) selected features",disconnect:"Disconnect features at the selected node",extract:"Extract a point from a feature",split:"Split a line into two at the selected node",reverse:"Reverse a line",move:"Move selected features",rotate:"Rotate selected features",orthogonalize:"Square corners of a line or area",straighten:"Straighten a line or points",circularize:"Circularize a closed line or area",reflect_long:"Reflect features across the longer axis",reflect_short:"Reflect features across the shorter axis","delete":"Delete selected features"},commands:{title:"Commands",copy:"Copy selected features",paste:"Paste copied features",undo:"Undo last action",redo:"Redo last action",save:"Save changes"}},tools:{title:"Tools",info:{title:"Information",all:"Toggle all information panels",background:"Toggle background panel",history:"Toggle history panel",location:"Toggle location panel",measurement:"Toggle measurement panel"}}},units:{feet:"{quantity} ft",miles:"{quantity} mi",square_feet:"{quantity} sq ft",square_miles:"{quantity} sq mi",acres:"{quantity} ac",meters:"{quantity} m",kilometers:"{quantity} km",square_meters:"{quantity} m²",square_kilometers:"{quantity} km²",hectares:"{quantity} ha",area_pair:"{area1} ({area2})",arcdegrees:"{quantity}°",arcminutes:"{quantity}′",arcseconds:"{quantity}″",north:"N",south:"S",east:"E",west:"W",coordinate:"{coordinate}{direction}",coordinate_pair:"{latitude}, {longitude}"},wikidata:{identifier:"Identifier",label:"Label",description:"Description"},presets:{categories:{"category-barrier":{name:"Barrier Features"},"category-building":{name:"Building Features"},"category-golf":{name:"Golf Features"},"category-landuse":{name:"Land Use Features"},"category-natural":{name:"Natural Features"},"category-path":{name:"Paths"},"category-rail":{name:"Rails"},"category-restriction":{name:"Restriction Features"},"category-road_major":{name:"Major Roads"},"category-road_minor":{name:"Minor Roads"},"category-road_service":{name:"Service Roads"},"category-route":{name:"Route Features"},"category-utility":{name:"Utility Features"},"category-water":{name:"Water Bodies"},"category-waterway":{name:"Waterways"}},fields:{access_simple:{label:"Allowed Access"},access:{label:"Allowed Access",placeholder:"Not Specified",types:{access:"All",foot:"Foot",motor_vehicle:"Motor Vehicles",bicycle:"Bicycles",horse:"Horses"},options:{yes:{title:"Allowed",description:"Access allowed by law; a right of way"},no:{title:"Prohibited",description:"Access not allowed to the general public"},permissive:{title:"Permissive",description:"Access allowed until such time as the owner revokes the permission"},"private":{title:"Private",description:"Access allowed only with permission of the owner on an individual basis"},designated:{title:"Designated",description:"Access allowed according to signs or specific local laws"},destination:{title:"Destination",description:"Access allowed only to reach a destination"},dismount:{title:"Dismount",description:"Access allowed but rider must dismount"},permit:{title:"Permit",description:"Access allowed only with a valid permit or license"}}},address:{label:"Address",placeholders:{block_number:"Block Number","block_number!jp":"Block No.",city:"City","city!jp":"City/Town/Village/Tokyo Special Ward","city!vn":"City/Town",conscriptionnumber:"123",country:"Country",county:"County","county!jp":"District",district:"District","district!vn":"Arrondissement/Town/District",floor:"Floor",hamlet:"Hamlet",housename:"Housename",housenumber:"123","housenumber!jp":"Building No./Lot No.",neighbourhood:"Neighbourhood","neighbourhood!jp":"Chōme/Aza/Koaza",place:"Place",postcode:"Postcode",province:"Province","province!jp":"Prefecture",quarter:"Quarter","quarter!jp":"Ōaza/Machi",state:"State",street:"Street",subdistrict:"Subdistrict","subdistrict!vn":"Ward/Commune/Townlet",suburb:"Suburb","suburb!jp":"Ward",unit:"Unit"}},admin_level:{label:"Admin Level"},aerialway:{label:"Type"},"aerialway/access":{label:"Access",options:{entry:"Entry",exit:"Exit",both:"Both"}},"aerialway/bubble":{label:"Bubble"},"aerialway/capacity":{label:"Capacity (per hour)",placeholder:"500, 2500, 5000..."},"aerialway/duration":{label:"Duration (minutes)",placeholder:"1, 2, 3..."},"aerialway/heating":{label:"Heated"},"aerialway/occupancy":{label:"Occupancy",placeholder:"2, 4, 8..."},"aerialway/summer/access":{label:"Access (summer)",options:{entry:"Entry",exit:"Exit",both:"Both"}},aeroway:{label:"Type"},agrarian:{label:"Products"},air_conditioning:{label:"Air Conditioning"},amenity:{label:"Type"},animal_boarding:{label:"For Animals"},animal_breeding:{label:"For Animals"},animal_shelter:{label:"For Animals"},architect:{label:"Architect"},"area/highway":{label:"Type"},artist:{label:"Artist"},artwork_type:{label:"Type"},atm:{label:"ATM"},attraction:{label:"Type"},backrest:{label:"Backrest"},bar:{label:"Bar"},barrier:{label:"Type"},basin:{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:"Beauty Specialty"},bench:{label:"Bench"},bicycle_parking:{label:"Type"},bin:{label:"Waste Bin"},blood_components:{label:"Blood Components",options:{whole:"whole blood",plasma:"plasma",platelets:"platelets",stemcells:"stem cell samples"}},board_type:{label:"Type"},booth:{label:"Booth"},boules:{label:"Type"},boundary:{label:"Type"},brand:{label:"Brand"},brewery:{label:"Draft Beers"},bridge:{label:"Type",placeholder:"Default"},"bridge/support":{label:"Type"},building_area:{label:"Building"},building:{label:"Building"},"building/levels_building":{label:"Building Levels",placeholder:"2, 4, 6..."},"building/material":{label:"Material"},bunker_type:{label:"Type"},cables:{label:"Cables",placeholder:"1, 2, 3..."},"camera/direction":{label:"Direction (Degrees Clockwise)",placeholder:"45, 90, 180, 270"},"camera/mount":{label:"Camera Mount"},"camera/type":{label:"Camera Type",options:{fixed:"Fixed",panning:"Panning",dome:"Dome"}},capacity:{label:"Capacity",placeholder:"50, 100, 200..."},cash_in:{label:"Cash In"},castle_type:{label:"Type"},check_date:{label:"Last Checked Date"},clothes:{label:"Clothes"},club:{label:"Type"},collection_times:{label:"Collection Times"},colour:{label:"Color"},comment:{label:"Changeset Comment",placeholder:"Brief description of your contributions (required)"},communication_multi:{label:"Communication Types"},construction:{label:"Type"},consulate:{label:"Type"},"contact/webcam":{label:"Webcam URL",placeholder:"http://example.com/"},content:{label:"Content"},conveying:{label:"Movement Direction",options:{forward:"Forward",backward:"Backward",reversible:"Reversible"}},country:{label:"Country"},couplings:{label:"Couplings",placeholder:"1, 2, 3..."},covered:{label:"Covered"},craft:{label:"Type"},"crane/type":{label:"Crane Type",options:{portal_crane:"Portal Crane","floor-mounted_crane":"Floor-mounted Crane",travel_lift:"Travel Lift"}},crop:{label:"Crops"},crossing:{label:"Type"},cuisine:{label:"Cuisines"},currency_multi:{label:"Currency Types"},cutting:{label:"Type",placeholder:"Default"},cycle_network:{label:"Network"},cycleway:{label:"Bike Lanes",placeholder:"none",types:{"cycleway:left":"Left side","cycleway:right":"Right side"},options:{none:{title:"None",description:"No bike lane"},lane:{title:"Standard bike lane",description:"A bike lane separated from auto traffic by a painted line"},shared_lane:{title:"Shared bike lane",description:"A bike lane with no separation from auto traffic"},track:{title:"Bike track",description:"A bike lane separated from traffic by a physical barrier"},share_busway:{title:"Bike lane shared with bus",description:"A bike lane shared with a bus lane"},opposite_lane:{title:"Opposite bike lane",description:"A bike lane that travels in the opposite direction of traffic"},opposite:{title:"Contraflow bike lane",description:"A bike lane that travels in both directions on a one-way street"}}},"dance/style":{label:"Dance Styles"},date:{label:"Date"},delivery:{label:"Delivery"},denomination:{label:"Denomination"},denotation:{label:"Denotation"},departures_board:{label:"Departures Board",options:{yes:"Yes",timetable:"Timetable",realtime:"Realtime",no:"None"}},description:{label:"Description"},design:{label:"Design"},destination_oneway:{label:"Destinations"},"destination/ref_oneway":{label:"Destination Road Numbers"},"destination/symbol_oneway":{label:"Destination Symbols"},devices:{label:"Devices",placeholder:"1, 2, 3..."},diaper:{label:"Diaper Changing Available"},diet_multi:{label:"Diet Types"},diplomatic:{label:"Type"},"diplomatic/services":{label:"Services"},direction_cardinal:{label:"Direction",options:{N:"North",E:"East",S:"South",W:"West",NE:"Northeast",SE:"Southeast",SW:"Southwest",NW:"Northwest",NNE:"North-northeast",ENE:"East-northeast",ESE:"East-southeast",SSE:"South-southeast",SSW:"South-southwest",WSW:"West-southwest",WNW:"West-northwest",NNW:"North-northwest"}},direction_clock:{label:"Direction",options:{clockwise:"Clockwise",anticlockwise:"Counterclockwise"}},direction_vertex:{label:"Direction",options:{forward:"Forward",backward:"Backward",both:"Both / All"}},direction:{label:"Direction (Degrees Clockwise)",placeholder:"45, 90, 180, 270"},dispensing:{label:"Dispenses Prescriptions"},display:{label:"Display"},distance:{label:"Distance"},dock:{label:"Type"},dog:{label:"Dogs",options:{yes:"Allowed",leashed:"Leashed Only",no:"Not Allowed"}},door_type:{label:"Type"},door:{label:"Door"},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"},embassy:{label:"Type"},emergency_combo:{label:"Type"},emergency:{label:"Emergency"},enforcement:{label:"Type"},entrance:{label:"Type"},except:{label:"Exceptions"},faces:{label:"Faces"},fax:{label:"Fax",placeholder:"+31 42 123 4567"},fee:{label:"Fee"},fence_type:{label:"Type"},"fire_hydrant/diameter":{label:"Diameter (mm, in, or letters)"},"fire_hydrant/pressure":{label:"Pressure (bar)"},"fire_hydrant/type":{label:"Shape",options:{pillar:"Pillar/Aboveground",underground:"Underground",wall:"Wall",pipe:"Capped Pipe"}},fireplace:{label:"Fireplace"},fishing:{label:"Fishing"},fitness_station:{label:"Equipment Type"},fixme:{label:"Fix Me"},"flag/type":{label:"Flag Type"},floating:{label:"Floating"},flood_prone:{label:"Flood Prone"},ford:{label:"Type",placeholder:"Default"},frequency_electrified:{label:"Operating Frequency"},frequency:{label:"Operating Frequency"},from:{label:"From"},fuel_multi:{label:"Fuel Types"},fuel:{label:"Fuel"},gauge:{label:"Gauge"},gender:{label:"Gender",placeholder:"Unknown",options:{male:"Male",female:"Female",unisex:"Unisex"}},"generator/method":{label:"Method"},"generator/output/electricity":{label:"Power Output",placeholder:"50 MW, 100 MW, 200 MW..."},"generator/source":{label:"Source"},"generator/type":{label:"Type"},government:{label:"Type"},grape_variety:{label:"Grape Varieties"},guest_house:{label:"Type"},handicap:{label:"Handicap",placeholder:"1-18"},handrail:{label:"Handrail"},hashtags:{label:"Suggested Hashtags",placeholder:"#example"},healthcare:{label:"Type"},"healthcare/speciality":{label:"Specialties"},height_building:{label:"Building Height (Meters)"},height:{label:"Height (Meters)"},highspeed:{label:"High-Speed"},highway:{label:"Type"},historic:{label:"Type"},"historic/civilization":{label:"Historic Civilization"},"historic/wreck/date_sunk":{label:"Date Sunk"},"historic/wreck/visible_at_high_tide":{label:"Visible At High Tide"},"historic/wreck/visible_at_low_tide":{label:"Visible At Low Tide"},hoops:{label:"Hoops",placeholder:"1, 2, 4..."},horse_dressage:{label:"Dressage Riding",options:{"undefined":"No",equestrian:"Yes"}},horse_riding:{label:"Horseback Riding",options:{"undefined":"No",horse_riding:"Yes"}},horse_scale:{label:"Horseback Riding Difficulty",placeholder:"Difficult, Dangerous...",options:{common:"Easy: No problems or difficulties. (default)",demanding:"Use with caution: Uneven way, occasional difficult passages.",difficult:"Difficult: Way narrow and exposed. May contain obstacles to step over and narrow passages.",critical:"Borderline: Passable only for experienced riders and horses. Major obstacles. Bridges should be examined carefully.",dangerous:"Dangerous: Passable only for very experienced riders and horses and only in good weather. Dismount.",impossible:"Impassable: Way or bridge not passable for horses. Too narrow, insuffient support, obstacles like ladders. Danger of life."}},horse_stables:{label:"Riding Stable",options:{"undefined":"No",stables:"Yes"}},iata:{label:"IATA"},icao:{label:"ICAO"},incline_steps:{label:"Incline",options:{up:"Up",down:"Down"}},incline:{label:"Incline"},indoor_type:{label:"Type"},indoor:{label:"Indoor"},industrial:{label:"Type"},information:{label:"Type"},inscription:{label:"Inscription"},intermittent_yes:{label:"Intermittent"},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:"Wifi Network Name"},interval:{label:"Interval"},junction_line:{label:"Junction",options:{roundabout:"Roundabout",circular:"Traffic Circle",jughandle:"Jughandle"}},"junction/ref_oneway":{label:"Junction Number"},kerb:{label:"Curb"},"kerb/height":{label:"Height"},label:{label:"Label"},lamp_type:{label:"Type"},landuse:{label:"Type"},lanes:{label:"Lanes",placeholder:"1, 2, 3..."},language_multi:{label:"Languages"},layer:{label:"Layer",placeholder:"0"},leaf_cycle_singular:{label:"Leaf Cycle",options:{evergreen:"Evergreen",deciduous:"Deciduous",semi_evergreen:"Semi-Evergreen",semi_deciduous:"Semi-Deciduous"}},leaf_cycle:{label:"Leaf Cycle",options:{evergreen:"Evergreen",deciduous:"Deciduous",semi_evergreen:"Semi-Evergreen",semi_deciduous:"Semi-Deciduous",mixed:"Mixed"}},leaf_type_singular:{label:"Leaf Type",options:{broadleaved:"Broadleaved",needleleaved:"Needleleaved",leafless:"Leafless"}},leaf_type:{label:"Leaf Type",options:{broadleaved:"Broadleaved",needleleaved:"Needleleaved",mixed:"Mixed",leafless:"Leafless"}},leisure:{label:"Type"},length:{label:"Length (Meters)"},level:{label:"Level"},levels:{label:"Levels",placeholder:"2, 4, 6..."},liaison:{label:"Type"},lit:{label:"Lit"},location_pool:{label:"Location",options:{outdoor:"Outdoor",indoor:"Indoor",roof:"Rooftop"}},location:{label:"Location"},lock:{label:"Lock"},man_made:{label:"Type"},manhole:{label:"Type"},manufacturer:{label:"Manufacturer"},map_size:{label:"Coverage"},map_type:{label:"Type"},material:{label:"Material"},maxheight:{label:"Max Height",placeholder:"4, 4.5, 5, 14'0\", 14'6\", 15'0\""},maxspeed:{label:"Speed Limit",placeholder:"40, 50, 60..."},"maxspeed/advisory":{label:"Advisory Speed Limit",placeholder:"40, 50, 60..."},maxstay:{label:"Max Stay"},maxweight_bridge:{label:"Max Weight"},maxweight:{label:"Max Weight"},memorial:{label:"Type"},microbrewery:{label:"Microbrewery"},minspeed:{label:"Minimum Speed Limit",placeholder:"20, 30, 40..."},monitoring_multi:{label:"Monitoring"},"mtb/scale":{label:"Mountain Biking Difficulty",placeholder:"0, 1, 2, 3...",options:{"0":"0: Solid gravel/packed earth, no obstacles, wide curves","1":"1: Some loose surface, small obstacles, wide curves","2":"2: Much loose surface, large obstacles, easy hairpins","3":"3: Slippery surface, large obstacles, tight hairpins","4":"4: Loose surface or boulders, dangerous hairpins","5":"5: Maximum difficulty, boulder fields, landslides","6":"6: Not rideable except by the very best mountain bikers"}},"mtb/scale/imba":{label:"IMBA Trail Difficulty",placeholder:"Easy, Medium, Difficult...",options:{"0":"Easiest (white circle)","1":"Easy (green circle)","2":"Medium (blue square)","3":"Difficult (black diamond)","4":"Extremely Difficult (double black diamond)"}},"mtb/scale/uphill":{label:"Mountain Biking Uphill Difficulty",placeholder:"0, 1, 2, 3...",options:{"0":"0: Avg. incline <10%, gravel/packed earth, no obstacles","1":"1: Avg. incline <15%, gravel/packed earth, few small objects","2":"2: Avg. incline <20%, stable surface, fistsize rocks/roots","3":"3: Avg. incline <25%, variable surface, fistsize rocks/branches","4":"4: Avg. incline <30%, poor condition, big rocks/branches","5":"5: Very steep, bike generally needs to be pushed or carried"}},name:{label:"Name",placeholder:"Common name (if any)"},natural:{label:"Natural"},network_bicycle:{label:"Network Type",placeholder:"Local, Regional, National, International",options:{lcn:"Local",rcn:"Regional",ncn:"National",icn:"International"}},network_foot:{label:"Network Type",placeholder:"Local, Regional, National, International",options:{lwn:"Local",rwn:"Regional",nwn:"National",iwn:"International"}},network_horse:{label:"Network Type",placeholder:"Local, Regional, National, International",options:{lhn:"Local",rhn:"Regional",nhn:"National",ihn:"International"}},network_road:{label:"Network"},network:{label:"Network"},note:{label:"Note"},office:{label:"Type"},oneway_yes:{label:"One Way",options:{"undefined":"Assumed to be Yes",yes:"Yes",no:"No",reversible:"Reversible",alternating:"Alternating"}},oneway:{label:"One Way",options:{"undefined":"Assumed to be No",yes:"Yes",no:"No",reversible:"Reversible",alternating:"Alternating"}},"oneway/bicycle":{label:"One Way (Bicycles)"},opening_date:{label:"Expected Opening Date"},opening_hours:{label:"Hours",placeholder:"Unknown"},operator:{label:"Operator"},outdoor_seating:{label:"Outdoor Seating"},par:{label:"Par",placeholder:"3, 4, 5..."},park_ride:{label:"Park and Ride"},parking:{label:"Type",options:{surface:"Surface","multi-storey":"Multilevel",underground:"Underground",sheds:"Sheds",carports:"Carports",garage_boxes:"Garage Boxes",lane:"Roadside Lane"}},payment_multi_fee:{label:"Payment Types"},payment_multi:{label:"Payment Types"},phases:{label:"Phases",placeholder:"1, 2, 3..."},phone:{label:"Telephone",placeholder:"+31 42 123 4567"},"piste/difficulty_downhill":{label:"Difficulty",placeholder:"Easy, Intermediate, Advanced...",options:{novice:"Novice (instructional)",easy:"Easy (green circle)",intermediate:"Intermediate (blue square)",advanced:"Advanced (black diamond)",expert:"Expert (double black diamond)",freeride:"Freeride (off-piste)",extreme:"Extreme (climbing equipment required)"}},"piste/difficulty_nordic":{label:"Difficulty",placeholder:"Easy, Intermediate, Advanced...",options:{novice:"Novice - Flat, no effort needed",easy:"Easy - Soft hills, short steep section",intermediate:"Intermediate - Steep section",advanced:"Advanced - Narrow, steep or icy section, sharp turn",expert:"Expert - Dangerous terrain around"}},"piste/difficulty_skitour":{label:"Difficulty",placeholder:"Easy, Intermediate, Advanced...",options:{novice:"Novice - L: <30° incline",easy:"Easy - WS: 30-35° incline",intermediate:"Intermediate - ZS: 35-40° incline",advanced:"Advanced - S: 40-45° incline",expert:"Expert - SS: 45–50° incline",freeride:"Freeride - AS: 50–55° incline",extreme:"Extreme - EX: >55° incline"}},"piste/difficulty":{label:"Difficulty",placeholder:"Easy, Intermediate, Advanced...",options:{novice:"Novice",easy:"Easy",intermediate:"Intermediate",advanced:"Advanced",expert:"Expert",freeride:"Freeride",extreme:"Extreme"}},"piste/grooming_downhill":{label:"Grooming",options:{classic:"Classic",mogul:"Mogul",backcountry:"Backcountry - no grooming"}},"piste/grooming_hike":{label:"Grooming",options:{classic:"Classic - Winter Hiking",backcountry:"Backcountry - Snowshoeing"}},"piste/grooming_nordic":{label:"Grooming",options:{classic:"Classic",backcountry:"Backcountry, no grooming","classic+skating":"Classic and Skating",scooter:"Scooter/Snowmobile",skating:"Skating"}},"piste/grooming":{label:"Grooming",options:{classic:"Classic",mogul:"Mogul",backcountry:"Backcountry","classic+skating":"Classic and Skating",scooter:"Scooter/Snowmobile",skating:"Skating"}},"piste/type":{label:"Type",options:{downhill:"Downhill",nordic:"Nordic",skitour:"Skitour",sled:"Sled",hike:"Hike",sleigh:"Sleigh",ice_skate:"Ice Skate",snow_park:"Snow Park",playground:"Playground",connection:"Connection"}},place:{label:"Type"},plant:{label:"Plant"},"plant/output/electricity":{label:"Power Output",placeholder:"500 MW, 1000 MW, 2000 MW..."},playground:{label:"Type"},"playground/baby":{label:"Baby Seat"},"playground/max_age":{label:"Maximum Age"},"playground/min_age":{label:"Minimum Age"},population:{label:"Population"},power_supply:{label:"Power Supply"},power:{label:"Type"},produce:{label:"Produce"},product:{label:"Products"},railway:{label:"Type"},"railway/position":{label:"Milestone Position",placeholder:"Distance to one decimal (123.4)"},"railway/signal/direction":{label:"Direction",options:{forward:"Forward",backward:"Backward",both:"Both / All"}},rating:{label:"Power Rating"},recycling_accepts:{label:"Accepts"},recycling_type:{label:"Type",placeholder:"Container, Center",options:{container:"Container",centre:"Center"}},ref_aeroway_gate:{label:"Gate Number"},ref_golf_hole:{label:"Hole Number",placeholder:"1-18"},ref_highway_junction:{label:"Junction Number"},ref_platform:{label:"Platform Number"},ref_road_number:{label:"Road Number"},ref_room_number:{label:"Room Number"},ref_route:{label:"Route Number"},ref_runway:{label:"Runway Number",placeholder:"e.g. 01L/19R"},ref_stop_position:{label:"Stop Number"},ref_taxiway:{label:"Taxiway Name",placeholder:"e.g. A5"},ref:{label:"Reference Code"},"ref/isil":{label:"ISIL Code"},relation:{label:"Type"},religion:{label:"Religion"},reservation:{label:"Reservations",options:{yes:"Accepted",no:"Not Accepted",required:"Required",recommended:"Recommended"}},resource:{label:"Resources"},restriction:{label:"Type"},restrictions:{label:"Turn Restrictions"},"roof/colour":{label:"Roof Color"},room:{label:"Type"},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"}},salt:{label:"Salt"},sanitary_dump_station:{label:"Toilet Disposal"},screen:{label:"Screens",placeholder:"1, 4, 8…"},scuba_diving:{label:"Services"},"seamark/beacon_isolated_danger/shape":{label:"Shape"},"seamark/beacon_lateral/category":{label:"Category",options:{port:"Port",starboard:"Starboard",waterway_left:"Waterway Left",waterway_right:"Waterway Right",danger_left:"Danger Left",danger_right:"Danger Right"}},"seamark/beacon_lateral/colour":{label:"Color",options:{red:"Red",green:"Green",grey:"Grey"}},"seamark/beacon_lateral/shape":{label:"Shape"},"seamark/beacon_lateral/system":{label:"System",options:{"iala-a":"IALA A","iala-b":"IALA B",cevni:"CEVNI",other:"Other"}},"seamark/buoy_lateral/category":{label:"Category",options:{port:"Port",starboard:"Starboard",channel_left:"Channel Left",channel_right:"Channel Right",waterway_left:"Waterway Left",waterway_right:"Waterway Right",danger_left:"Danger Left",danger_right:"Danger Right",preferred_channel_port:"Preferred Channel Port",preferred_channel_starboard:"Preferred Channel Starboard"}},"seamark/buoy_lateral/colour":{label:"Color",options:{red:"Red",green:"Green","red;white;red;white":"Red-White-Red-White","green;white;green;white":"Green-White-Green-White","red;green;red":"Red-Green-Red","green;red;green":"Green-Red-Green",white:"White",yellow:"Yellow"}},"seamark/buoy_lateral/shape":{label:"Shape"},"seamark/buoy_lateral/system":{label:"System",options:{"iala-a":"IALA A","iala-b":"IALA B",cevni:"CEVNI",other:"Other"}},"seamark/mooring/category":{label:"Category"},"seamark/type":{label:"Seamark"},"seamark/wreck/category":{label:"Category"},seasonal:{label:"Seasonal"},seats:{label:"Seats",placeholder:"2, 4, 6..."},second_hand:{label:"Sells Used",placeholder:"Yes, No, Only",options:{yes:"Yes",no:"No",only:"Only"}},self_service:{label:"Self-Service"},service_rail:{label:"Service Type",options:{spur:"Spur",yard:"Yard",siding:"Siding",crossover:"Crossover"}},service_times:{label:"Service Times"},service:{label:"Type"},"service/bicycle":{label:"Services"},"service/vehicle":{label:"Services"},shelter_type:{label:"Type"},shelter:{label:"Shelter"},shop:{label:"Type"},"siren/purpose":{label:"Purpose"},"siren/type":{label:"Type",options:{pneumatic:"Pneumatic",electronic:"Electronic",other:"Other"}},site_type:{label:"Site Type"},site:{label:"Type"},smoking:{label:"Smoking",placeholder:"No, Separated, Yes...",options:{no:"No smoking anywhere",separated:"In smoking areas, not physically isolated",isolated:"In smoking areas, physically isolated",outside:"Allowed outside",yes:"Allowed everywhere",dedicated:"Dedicated to smokers (e.g. smokers' club)"}},smoothness:{label:"Smoothness",placeholder:"Thin Rollers, Wheels, Off-Road...",options:{excellent:"Thin Rollers: rollerblade, skateboard",good:"Thin Wheels: racing bike",intermediate:"Wheels: city bike, wheelchair, scooter",bad:"Robust Wheels: trekking bike, car, rickshaw",very_bad:"High Clearance: light duty off-road vehicle",horrible:"Off-Road: heavy duty off-road vehicle",very_horrible:"Specialized off-road: tractor, ATV",impassable:"Impassable / No wheeled vehicle"}},social_facility_for:{label:"People Served"},social_facility:{label:"Type"},source:{label:"Sources"},sport_ice:{label:"Sports"},sport_racing_motor:{label:"Sports"},sport_racing_nonmotor:{label:"Sports"},sport:{label:"Sports"},stars:{label:"Stars"},start_date:{label:"Start Date"},step_count:{label:"Number of Steps"},stop:{label:"Stop Type",options:{all:"All Ways",minor:"Minor Road"}},street_cabinet:{label:"Type"},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"},"survey/date":{label:"Last Survey Date"},swimming_pool:{label:"Type"},"switch":{label:"Type",options:{mechanical:"Mechanical",circuit_breaker:"Circuit Breaker",disconnector:"Disconnector",earthing:"Earthing"}},tactile_paving:{label:"Tactile Paving"},takeaway:{label:"Takeaway",placeholder:"Yes, No, Takeaway Only...",options:{yes:"Yes",no:"No",only:"Takeaway Only"}},target:{label:"Target"},tidal:{label:"Tidal"},to:{label:"To"},"toilets/disposal":{label:"Disposal",options:{flush:"Flush",pitlatrine:"Pit Latrine",chemical:"Chemical",bucket:"Bucket"}},"toilets/handwashing":{label:"Handwashing"},"toilets/position":{label:"Positions"},toll:{label:"Toll"},tomb:{label:"Type"},tourism:{label:"Type"},"tower/construction":{label:"Construction",placeholder:"Guyed, Lattice, Concealed, ..."},"tower/type":{label:"Type"},tracktype:{label:"Track Type",placeholder:"Solid, Mostly Solid, Soft...",options:{grade1:"Solid: paved or heavily compacted hardcore surface",grade2:"Mostly Solid: gravel/rock with some soft material mixed in",grade3:"Even mixture of hard and soft materials",grade4:"Mostly Soft: soil/sand/grass with some hard material mixed in",grade5:"Soft: soil/sand/grass"}},trade:{label:"Type"},traffic_calming:{label:"Type"},traffic_sign:{label:"Traffic Sign"},"traffic_sign/direction":{label:"Direction",options:{forward:"Forward",backward:"Backward",both:"Both / All"}},traffic_signals:{label:"Type"},"traffic_signals/direction":{label:"Direction",options:{forward:"Forward",backward:"Backward",both:"Both / All"}},trail_visibility:{label:"Trail Visibility",placeholder:"Excellent, Good, Bad...",options:{excellent:"Excellent: unambiguous path or markers everywhere",good:"Good: markers visible, sometimes require searching",intermediate:"Intermediate: few markers, path mostly visible",bad:"Bad: no markers, path sometimes invisible/pathless",horrible:"Horrible: often pathless, some orientation skills required",no:"No: pathless, excellent orientation skills required"}},transformer:{label:"Type",options:{distribution:"Distribution",generator:"Generator",converter:"Converter",traction:"Traction",auto:"Autotransformer",phase_angle_regulator:"Phase Angle Regulator",auxiliary:"Auxiliary",yes:"Unknown"}},trees:{label:"Trees"},trolley_wire:{label:"Overhead Trolley Wires"},tunnel:{label:"Type",placeholder:"Default"},usage_rail:{label:"Usage Type",options:{main:"Main",branch:"Branch",industrial:"Industrial",military:"Military",test:"Test",tourism:"Tourism"}},vending:{label:"Types of Goods"},visibility:{label:"Visibility",options:{house:"Up to 5m (16ft)",street:"5 to 20m (16 to 65ft)",area:"Over 20m (65ft)"}},"volcano/status":{label:"Volcano Status",options:{active:"Active",dormant:"Dormant",extinct:"Extinct"}},"volcano/type":{label:"Volcano Type",options:{stratovolcano:"Stratovolcano",shield:"Shield",scoria:"Scoria"}},voltage_electrified:{label:"Voltage"},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_source:{label:"Water Source"},water_volume:{label:"Water Reserve Volume (m³)"},water:{label:"Type"},waterway:{label:"Type"},website:{label:"Website",placeholder:"https://example.com"},wetland:{label:"Type"},wheelchair:{label:"Wheelchair Access"},wholesale:{label:"Wholesale"},width:{label:"Width (Meters)"},wikidata:{label:"Wikidata"},wikipedia:{label:"Wikipedia"},windings:{label:"Windings",placeholder:"1, 2, 3..."},"windings/configuration":{label:"Windings Configuration",options:{star:"Star / Wye",delta:"Delta","open-delta":"Open Delta",zigzag:"Zig Zag",open:"Open",scott:"Scott",leblanc:"Leblanc"}}},presets:{aerialway:{name:"Aerialway",terms:""},aeroway:{name:"Aeroway",terms:""},amenity:{name:"Amenity",terms:""},attraction:{name:"Attraction",terms:""},boundary:{name:"Boundary",terms:""},building_point:{name:"Building",terms:""},embankment:{name:"Embankment",terms:""},emergency:{name:"Emergency Feature",terms:""},highway:{name:"Highway",terms:""},indoor:{name:"Indoor Feature",terms:""},landuse:{name:"Land Use",terms:""},leisure:{name:"Leisure",terms:""},man_made:{name:"Man Made",terms:""},natural:{name:"Natural",terms:""},place:{name:"Place",terms:""},playground:{name:"Playground Equipment",terms:""},power:{name:"Power",terms:""},railway:{name:"Railway",terms:""},seamark:{name:"Seamark",terms:""},tourism:{name:"Tourism",terms:""},waterway:{name:"Waterway",terms:""},address:{name:"Address",terms:""},"advertising/billboard":{name:"Billboard",terms:""},"advertising/column":{name:"Advertising Column",terms:""},"aerialway/station":{name:"Aerialway Station",terms:""},"aerialway/cable_car":{name:"Cable Car",terms:"tramway,ropeway"},"aerialway/chair_lift":{name:"Chair Lift",terms:""},"aerialway/drag_lift":{name:"Drag Lift",terms:""},"aerialway/gondola":{name:"Gondola",terms:""},"aerialway/goods":{name:"Goods Aerialway",terms:""},"aerialway/j-bar":{name:"J-bar Lift",terms:"jbar"},"aerialway/magic_carpet":{name:"Magic Carpet Lift",terms:""},"aerialway/mixed_lift":{name:"Mixed Lift",terms:""},"aerialway/platter":{name:"Platter Lift",terms:"button lift,poma lift"},"aerialway/pylon":{name:"Aerialway Pylon",terms:""},"aerialway/rope_tow":{name:"Rope Tow Lift",terms:"handle tow,bugel lift"},"aerialway/t-bar":{name:"T-bar Lift",terms:"tbar"},"aerialway/zip_line":{name:"Zip Line",terms:"aerial runway,canopy,flying fox,foefie slide,gravity propelled aerial ropeslide,Tyrolean traverse,zip wire,zip-line,zipline,zipwire"},"aeroway/aerodrome":{name:"Airport",terms:"aerodrome,aeroway,airplane,airport,jet,plane"},"aeroway/apron":{name:"Apron",terms:"ramp"},"aeroway/gate":{name:"Airport Gate",terms:""},"aeroway/hangar":{name:"Hangar",terms:""},"aeroway/helipad":{name:"Helipad",terms:"helicopter,helipad,heliport"},"aeroway/jet_bridge":{name:"Jet Bridge",terms:"aerobridge,air jetty,airbridge,finger,gangway,jet way,jetway,passenger boarding bridge,PBB,portal,skybridge,terminal gate connector"},"aeroway/runway":{name:"Runway",terms:"landing strip"},"aeroway/taxiway":{name:"Taxiway",terms:""},"aeroway/terminal":{name:"Airport Terminal",terms:"airport,aerodrome"},"aeroway/windsock":{name:"Windsock",terms:""},"allotments/plot":{name:"Community Garden Plot",terms:""},"amenity/bus_station":{name:"Bus Station / Terminal",terms:""},"amenity/coworking_space":{name:"Coworking Space",terms:""},"amenity/embassy":{name:"Embassy",terms:""},"amenity/ferry_terminal":{name:"Ferry Station / Terminal",terms:""},"amenity/nursing_home":{name:"Nursing Home",terms:""},"amenity/recycling":{name:"Recycling",terms:"bin,can,bottle,glass,garbage,rubbish,scrap,trash"},"amenity/register_office":{name:"Register Office",terms:""},"amenity/scrapyard":{name:"Scrap Yard",terms:""},"amenity/swimming_pool":{name:"Swimming Pool",terms:""},"amenity/animal_boarding":{name:"Animal Boarding Facility",terms:"boarding,cat,cattery,dog,horse,kennel,kitten,pet,pet boarding,pet care,pet hotel,puppy,reptile"},"amenity/animal_breeding":{name:"Animal Breeding Facility",terms:"breeding,bull,cat,cow,dog,horse,husbandry,kitten,livestock,pet breeding,puppy,reptile"},"amenity/animal_shelter":{name:"Animal Shelter",terms:"adoption,aspca,cat,dog,horse,kitten,pet care,pet rescue,puppy,raptor,reptile,rescue,spca"},"amenity/arts_centre":{name:"Arts Center",terms:""},"amenity/atm":{name:"ATM",terms:"money,cash,machine"},"amenity/bank":{name:"Bank",terms:"credit union,check,deposit,fund,investment,repository,reserve,safe,savings,stock,treasury,trust,vault"},"amenity/bar":{name:"Bar",terms:"dive,beer,bier,booze"},"amenity/bar/lgbtq":{name:"LGBTQ+ Bar",terms:"gay bar,lesbian bar,lgbtq bar,lgbt bar,lgb bar"},"amenity/bbq":{name:"Barbecue/Grill",terms:"bbq,grill"},"amenity/bench":{name:"Bench",terms:"seat"},"amenity/bicycle_parking":{name:"Bicycle Parking",terms:"bike"},"amenity/bicycle_parking/building":{name:"Bicycle Parking Garage",terms:"Multi-Storey Bicycle Park,Multi-Storey Bike Park,Bike Parking Station"},"amenity/bicycle_parking/lockers":{name:"Bicycle Lockers",terms:"Bike Lockers"},"amenity/bicycle_parking/shed":{name:"Bicycle Shed",terms:"Bike Shed"},"amenity/bicycle_rental":{name:"Bicycle Rental",terms:"bike"},"amenity/bicycle_repair_station":{name:"Bicycle Repair Tool Stand",terms:"bike,repair,chain,pump"},"amenity/biergarten":{name:"Biergarten",terms:"beer,bier,booze"},"amenity/boat_rental":{name:"Boat Rental",terms:""},"amenity/bureau_de_change":{name:"Currency Exchange",terms:"bureau de change,money changer"},"amenity/cafe":{name:"Cafe",terms:"bistro,coffee,tea"},"amenity/car_pooling":{name:"Car Pooling",terms:""},"amenity/car_rental":{name:"Car Rental",terms:""},"amenity/car_sharing":{name:"Car Sharing",terms:""},"amenity/car_wash":{name:"Car Wash",terms:""},"amenity/casino":{name:"Casino",terms:"gambling,roulette,craps,poker,blackjack"},"amenity/charging_station":{name:"Charging Station",terms:"EV,Electric Vehicle,Supercharger"},"amenity/childcare":{name:"Nursery/Childcare",terms:"daycare,orphanage,playgroup"},"amenity/cinema":{name:"Cinema",terms:"drive-in,film,flick,movie,theater,picture,show,screen"},"amenity/clinic":{name:"Clinic",terms:"medical,urgentcare"},"amenity/clinic/abortion":{name:"Abortion Clinic",terms:""},"amenity/clinic/fertility":{name:"Fertility Clinic",terms:"egg,fertility,reproductive,sperm,ovulation"},"amenity/clock":{name:"Clock",terms:""},"amenity/clock/sundial":{name:"Sundial",terms:"gnomon,shadow"},"amenity/college":{name:"College Grounds",terms:"university,undergraduate school"},"amenity/community_centre":{name:"Community Center",terms:"event,hall"},"amenity/community_centre/lgbtq":{name:"LGBTQ+ Community Center",terms:"lgbtq event,lgbtq hall,lgbt event,lgbt hall,lgb event,lgb hall"},"amenity/compressed_air":{name:"Compressed Air",terms:""},"amenity/conference_centre":{name:"Convention Center",terms:"auditorium,conference,exhibition,exposition,lecture"},"amenity/courthouse":{name:"Courthouse",terms:""},"amenity/crematorium":{name:"Crematorium",terms:"cemetery,funeral"},"amenity/dentist":{name:"Dentist",terms:"tooth,teeth"},"amenity/dive_centre":{name:"Dive Center",terms:"diving,scuba"},"amenity/doctors":{name:"Doctor",terms:"medic*,physician"},"amenity/dojo":{name:"Dojo / Martial Arts Academy",terms:"martial arts,dojang"},"amenity/drinking_water":{name:"Drinking Water",terms:"potable water source,water fountain,drinking fountain,bubbler,water tap"},"amenity/driving_school":{name:"Driving School",terms:""},"amenity/events_venue":{name:"Events Venue",terms:"banquet hall,baptism,Bar Mitzvah,Bat Mitzvah,birthdays,celebrations,conferences,confirmation,meetings,parties,party,quinceañera,reunions,weddings"},"amenity/fast_food":{name:"Fast Food",terms:"restaurant,takeaway"},"amenity/fast_food/ice_cream":{name:"Ice Cream Fast Food",terms:""},"amenity/fast_food/burger":{name:"Burger Fast Food",terms:"breakfast,dine,dining,dinner,drive-in,eat,grill,lunch,table"},"amenity/fast_food/chicken":{name:"Chicken Fast Food",terms:"breakfast,canteen,dine,dining,dinner,drive-in,eat,grill,lunch,table"},"amenity/fast_food/donut":{name:"Donut Fast Food",terms:"breakfast,brunch,cafe,canteen,coffee,dine,diner,donut,doughnut,dining,eat,lunch,table"},"amenity/fast_food/fish_and_chips":{name:"Fish & Chips Fast Food",terms:"breakfast,cafe,café,dine,dining,dinner,drive-in,eat,grill,lunch,table,french fries"},"amenity/fast_food/kebab":{name:"Kebab Fast Food",terms:"bar,breakfast,cafe,café,canteen,dine,dining,dinner,drive-in,eat,grill,lunch,table"},"amenity/fast_food/mexican":{name:"Mexican Fast Food",terms:"breakfast,dine,dining,dinner,drive-in,eat,grill,lunch,table,tacos,burritos,enchiladas,fajitas,nachos,tortillas,salsa,tamales,quesadillas"},"amenity/fast_food/pizza":{name:"Pizza Fast Food",terms:"dine,dining,dinner,drive-in,eat,lunch,table,deep dish,thin crust,slice"},"amenity/fast_food/sandwich":{name:"Sandwich Fast Food",terms:"breakfast,cafe,café,dine,dining,dinner,drive-in,eat,grill,lunch,table"},"amenity/fire_station":{name:"Fire Station",terms:""},"amenity/food_court":{name:"Food Court",terms:"fast food,restaurant,food"},"amenity/fountain":{name:"Fountain",terms:""},"amenity/fuel":{name:"Gas Station",terms:"petrol,fuel,gasoline,propane,diesel,lng,cng,biodiesel"},"amenity/grave_yard":{name:"Graveyard",terms:""},"amenity/grit_bin":{name:"Grit Bin",terms:"salt,sand"},"amenity/hospital":{name:"Hospital Grounds",terms:"clinic,doctor,emergency room,health,infirmary,institution,sanatorium,sanitarium,sick,surgery,ward"},"amenity/hunting_stand":{name:"Hunting Stand",terms:"game,gun,lookout,rifle,shoot*,wild,watch"},"amenity/ice_cream":{name:"Ice Cream Shop",terms:"gelato,sorbet,sherbet,frozen,yogurt"},"amenity/internet_cafe":{name:"Internet Cafe",terms:"cybercafe,taxiphone,teleboutique,coffee,cafe,net,lanhouse"},"amenity/kindergarten":{name:"Preschool/Kindergarten Grounds",terms:"kindergarden,pre-school"},"amenity/language_school":{name:"Language School",terms:"esl"},"amenity/library":{name:"Library",terms:"book"},"amenity/love_hotel":{name:"Love Hotel",terms:""},"amenity/marketplace":{name:"Marketplace",terms:""},"amenity/monastery":{name:"Monastery Grounds",terms:"abbey,basilica,bethel,cathedral,chancel,chantry,chapel,church,fold,house of God,house of prayer,house of worship,minster,mission,monastery,mosque,oratory,parish,sacellum,sanctuary,shrine,synagogue,tabernacle,temple"},"amenity/money_transfer":{name:"Money Transfer Station",terms:"money order,check,bill,currency,finance,wire transfer,cable,person to person,cash to cash,exchange"},"amenity/motorcycle_parking":{name:"Motorcycle Parking",terms:""},"amenity/music_school":{name:"Music School",terms:"school of music"},"amenity/nightclub":{name:"Nightclub",terms:"disco*,night club,dancing,dance club"},"amenity/nightclub/lgbtq":{name:"LGBTQ+ Nightclub",terms:"gay nightclub,lesbian nightclub,lgbtq nightclub,lgbt nightclub,lgb nightclub"},"amenity/parking_entrance":{name:"Parking Garage Entrance/Exit",terms:""},"amenity/parking_space":{name:"Parking Space",terms:""},"amenity/parking":{name:"Parking Lot",terms:"automobile parking,car lot,car parking,rv parking,truck parking,vehicle parking"},"amenity/parking/multi-storey":{name:"Multilevel Parking Garage",terms:"car,indoor parking,multistorey car park,parkade,parking building,parking deck,parking garage,parking ramp,parking structure"},"amenity/parking/underground":{name:"Underground Parking",terms:"automobile parking,car lot,car parking,rv parking,subsurface parking,truck parking,vehicle parking"},"amenity/payment_centre":{name:"Payment Center",terms:"check,tax pay,bill pay,currency,finance,cash,money"},"amenity/payment_terminal":{name:"Payment Terminal",terms:"interactive kiosk,ekiosk,atm,bill pay,tax pay,phone pay,finance,cash,money transfer,card"},"amenity/pharmacy":{name:"Pharmacy Counter",terms:"apothecary,drug store,drugstore,med*,prescription"},"amenity/photo_booth":{name:"Photo Booth",terms:"photobooth,photo,booth,kiosk,camera"},"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:"Christian Church",terms:"christian,abbey,basilica,bethel,cathedral,chancel,chantry,chapel,fold,house of God,house of prayer,house of worship,minster,mission,oratory,parish,sacellum,sanctuary,shrine,tabernacle,temple"},"amenity/place_of_worship/hindu":{name:"Hindu Temple",terms:"kovil,devasthana,mandir,kshetram,alayam,shrine,temple"},"amenity/place_of_worship/jewish":{name:"Jewish Synagogue",terms:"jewish"},"amenity/place_of_worship/muslim":{name:"Muslim 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/prep_school":{name:"Test Prep / Tutoring School",terms:"academic,ACT,SAT,homework,math,reading,test prep,tutoring,writing"},"amenity/prison":{name:"Prison Grounds",terms:"cell,jail"},"amenity/pub":{name:"Pub",terms:"alcohol,drink,dive,beer,bier,booze"},"amenity/pub/lgbtq":{name:"LGBTQ+ Pub",terms:"gay pub,lesbian pub,lgbtq pub,lgbt pub,lgb pub"},"amenity/pub/microbrewery":{name:"Brewpub",terms:"alcohol,drink,dive,beer,bier,booze,craft brewery,microbrewery,small batch brewery"},"amenity/public_bath":{name:"Public Bath",terms:"onsen,foot bath,hot springs"},"amenity/public_bookcase":{name:"Public Bookcase",terms:"library,bookcrossing"},"amenity/ranger_station":{name:"Ranger Station",terms:"visitor center,visitor centre,permit center,permit centre,backcountry office,warden office,warden center"},"amenity/recycling_centre":{name:"Recycling Center",terms:"bottle,can,dump,glass,garbage,rubbish,scrap,trash"},"amenity/recycling_container":{name:"Recycling Container",terms:"bin,can,bottle,glass,garbage,rubbish,scrap,trash"},"amenity/restaurant":{name:"Restaurant",terms:"bar,breakfast,cafe,café,canteen,coffee,dine,dining,dinner,drive-in,eat,grill,lunch,table"},"amenity/restaurant/american":{name:"American Restaurant",terms:"bar,breakfast,cafe,café,canteen,coffee,dine,dining,dinner,drive-in,eat,grill,lunch,table"},"amenity/restaurant/asian":{name:"Asian Restaurant",terms:"bar,breakfast,cafe,café,canteen,dine,dining,dinner,drive-in,eat,grill,lunch,table"},"amenity/restaurant/chinese":{name:"Chinese Restaurant",terms:"bar,breakfast,cafe,café,canteen,dine,dining,dinner,drive-in,eat,grill,lunch,table"},"amenity/restaurant/french":{name:"French Restaurant",terms:"bar,breakfast,cafe,café,canteen,dine,dining,dinner,drive-in,eat,grill,lunch,table"},"amenity/restaurant/german":{name:"German Restaurant",terms:"bar,breakfast,cafe,café,canteen,dine,dining,dinner,drive-in,eat,grill,lunch,table"},"amenity/restaurant/greek":{name:"Greek Restaurant",terms:"bar,breakfast,cafe,café,canteen,dine,dining,dinner,drive-in,eat,grill,lunch,table,gyros,pitas,olives"},"amenity/restaurant/indian":{name:"Indian Restaurant",terms:"bar,breakfast,dine,dining,dinner,drive-in,eat,grill,lunch,table,curry"},"amenity/restaurant/italian":{name:"Italian Restaurant",terms:"bar,breakfast,cafe,café,canteen,dine,dining,dinner,drive-in,eat,grill,lunch,table,pasta,pizza"},"amenity/restaurant/japanese":{name:"Japanese Restaurant",terms:"bar,breakfast,cafe,café,canteen,dine,dining,dinner,drive-in,eat,grill,lunch,table"},"amenity/restaurant/mexican":{name:"Mexican Restaurant",terms:"bar,breakfast,dine,dining,dinner,drive-in,eat,grill,lunch,table,tacos,burritos,enchiladas,fajitas,nachos,tortillas,salsa,tamales,quesadillas"},"amenity/restaurant/noodle":{name:"Noodle Restaurant",terms:"bar,breakfast,cafe,café,canteen,dine,dining,dinner,drive-in,eat,grill,lunch,table,ramen noodles,soup,soba noodles,cellophane noodles,rice noodles"},"amenity/restaurant/pizza":{name:"Pizza Restaurant",terms:"bar,dine,dining,dinner,drive-in,eat,lunch,table,deep dish,thin crust,slice"},"amenity/restaurant/seafood":{name:"Seafood Restaurant",terms:"bar,breakfast,cafe,café,dine,dining,dinner,drive-in,eat,grill,lunch,table,fish,shellfish,molluscs,crustaceans,clams,oysters,lobsters,crab,shrimp,squid,octopus"},"amenity/restaurant/steakhouse":{name:"Steakhouse",terms:"bar,breakfast,cafe,café,canteen,dine,dining,dinner,drive-in,eat,grill,lunch,table,steak house,chop house,beef"},"amenity/restaurant/sushi":{name:"Sushi Restaurant",terms:"bar,breakfast,cafe,café,canteen,dine,dining,dinner,drive-in,eat,grill,lunch,table"},"amenity/restaurant/thai":{name:"Thai Restaurant",terms:"bar,breakfast,cafe,café,canteen,dine,dining,dinner,drive-in,eat,grill,lunch,table"},"amenity/restaurant/turkish":{name:"Turkish Restaurant",terms:"bar,breakfast,cafe,café,canteen,dine,dining,dinner,drive-in,eat,grill,lunch,table"},"amenity/restaurant/vietnamese":{name:"Vietnamese Restaurant",terms:"bar,breakfast,cafe,café,canteen,dine,dining,dinner,drive-in,eat,grill,lunch,table"},"amenity/sanitary_dump_station":{name:"RV Toilet Disposal",terms:"Motor Home,Camper,Sanitary,Dump Station,Elsan,CDP,CTDP,Chemical Toilet"},"amenity/school":{name:"School Grounds",terms:"academy,elementary school,middle school,high school"},"amenity/shelter":{name:"Shelter",terms:"lean-to,gazebo,picnic"},"amenity/shelter/gazebo":{name:"Gazebo",terms:""},"amenity/shelter/lean_to":{name:"Lean-To",terms:""},"amenity/shelter/picnic_shelter":{name:"Picnic Shelter",terms:"pavilion"},"amenity/shelter/public_transport":{name:"Transit Shelter",terms:"bus stop,metro stop,public transit shelter,public transport shelter,tram stop shelter,waiting"},"amenity/shower":{name:"Shower",terms:"rain closet"},"amenity/smoking_area":{name:"Smoking Area",terms:""},"amenity/social_centre":{name:"Social Center",terms:"event,fraternal,fraternity,hall,organization,professional,society,sorority,union,vetern"},"amenity/social_facility":{name:"Social Facility",terms:""},"amenity/social_facility/ambulatory_care":{name:"Ambulatory Care",terms:""},"amenity/social_facility/food_bank":{name:"Food Bank",terms:""},"amenity/social_facility/group_home":{name:"Elderly Group Home",terms:"old,senior,living,care home,assisted living"},"amenity/social_facility/homeless_shelter":{name:"Homeless Shelter",terms:"houseless,unhoused,displaced"},"amenity/social_facility/nursing_home":{name:"Nursing Home",terms:"elderly,living,nursing,old,senior,assisted living"},"amenity/studio":{name:"Studio",terms:"recording,radio,television"},"amenity/taxi":{name:"Taxi Stand",terms:"cab"},"amenity/telephone":{name:"Telephone",terms:"phone"},"amenity/theatre":{name:"Theater",terms:"theatre,performance,play,musical"},"amenity/theatre/type/amphi":{name:"Amphitheatre",terms:"open air,outdoor,greek,ampi"},"amenity/toilets":{name:"Toilets",terms:"bathroom,restroom,outhouse,privy,head,lavatory,latrine,water closet,WC,W.C."},"amenity/toilets/disposal/flush":{name:"Flush Toilets",terms:"bathroom,head,lavatory,privy,restroom,water closet,WC,W.C."},"amenity/toilets/disposal/pitlatrine":{name:"Pit Latrine",terms:"head,lavatory,long drop,outhouse,pit toilet,privy"},"amenity/townhall":{name:"Town Hall",terms:"village,city,government,courthouse,municipal"},"amenity/toy_library":{name:"Toy Library",terms:"game,toy"},"amenity/university":{name:"University Grounds",terms:"college,graduate school,PhD program,master's degree program"},"amenity/vehicle_inspection":{name:"Vehicle Inspection",terms:"car inspection"},"amenity/vending_machine":{name:"Vending Machine",terms:""},"amenity/vending_machine/cigarettes":{name:"Cigarette Vending Machine",terms:"cigarette"},"amenity/vending_machine/coffee":{name:"Coffee Vending Machine",terms:"coffee"},"amenity/vending_machine/condoms":{name:"Condom Vending Machine",terms:"condom"},"amenity/vending_machine/drinks":{name:"Drink Vending Machine",terms:"drink,soda,beverage,juice,pop"},"amenity/vending_machine/electronics":{name:"Electronics Vending Machine",terms:"cable,charger,earbud,headphone,phone,tablet"},"amenity/vending_machine/elongated_coin":{name:"Flat Coin Vending Machine",terms:"coin,crush,elongated,flatten,penny,souvenir"},"amenity/vending_machine/excrement_bags":{name:"Excrement Bag Dispenser",terms:"excrement bags,poop,waste,dog,animal"},"amenity/vending_machine/feminine_hygiene":{name:"Feminine Hygiene Vending Machine",terms:"condom,tampon,pad,woman,women,menstrual hygiene products,personal care"},"amenity/vending_machine/food":{name:"Food Vending Machine",terms:"food"},"amenity/vending_machine/fuel":{name:"Gas Pump",terms:"petrol,fuel,gasoline,propane,diesel,lng,cng,biodiesel"},"amenity/vending_machine/ice_cream":{name:"Ice Cream Vending Machine",terms:"chocolate,ice cream,frozen,popsicle,vanilla"},"amenity/vending_machine/newspapers":{name:"Newspaper Vending Machine",terms:"newspaper"},"amenity/vending_machine/parcel_pickup_dropoff":{name:"Parcel Pickup/Dropoff Locker",terms:"mail,parcel,pickup"},"amenity/vending_machine/parcel_pickup":{name:"Parcel Pickup Locker",terms:"amazon,locker,mail,parcel,pickup"},"amenity/vending_machine/parking_tickets":{name:"Parking Ticket Vending Machine",terms:"parking,ticket"},"amenity/vending_machine/public_transport_tickets":{name:"Transit Ticket Vending Machine",terms:"bus,train,ferry,rail,ticket,transportation"},"amenity/vending_machine/stamps":{name:"Postage Vending Machine",terms:"mail,postage,stamp"},"amenity/vending_machine/sweets":{name:"Snack Vending Machine",terms:"candy,gum,chip,pretzel,cookie,cracker"},"amenity/veterinary":{name:"Veterinary",terms:"pet clinic,veterinarian,animal hospital,pet doctor"},"amenity/waste_basket":{name:"Waste Basket",terms:"bin,garbage,rubbish,litter,trash"},"amenity/waste_disposal":{name:"Garbage Dumpster",terms:"garbage,rubbish,litter,trash"},"amenity/waste_transfer_station":{name:"Waste Transfer Station",terms:"dump,garbage,recycling,rubbish,scrap,trash"},"amenity/waste/dog_excrement":{name:"Dog Excrement Bin",terms:"bin,garbage,rubbish,litter,trash,poo,dog"},"amenity/water_point":{name:"RV Drinking Water",terms:""},"amenity/watering_place":{name:"Animal Watering Place",terms:""},area:{name:"Area",terms:"polygon"},"area/highway":{name:"Road Surface",terms:"area:highway,edge of pavement,highway area,highway shape,pavement,road shape,street area"},"attraction/amusement_ride":{name:"Amusement Ride",terms:"theme park,carnival ride"},"attraction/animal":{name:"Animal Enclosure",terms:"amphibian,animal park,aquarium,bear,bird,fish,insect,lion,mammal,monkey,penguin,reptile,safari,theme park,tiger,zoo"},"attraction/big_wheel":{name:"Big Wheel",terms:"ferris wheel,theme park,amusement ride"},"attraction/bumper_car":{name:"Bumper Car",terms:"theme park,dodgem cars,autoscooter"},"attraction/bungee_jumping":{name:"Bungee Jumping",terms:"theme park,bungy jumping,jumping platform"},"attraction/carousel":{name:"Carousel",terms:"theme park,roundabout,merry-go-round,galloper,jumper,horseabout,flying horses"},"attraction/dark_ride":{name:"Dark Ride",terms:"theme park,ghost train"},"attraction/drop_tower":{name:"Drop Tower",terms:"theme park,amusement ride,gondola,tower,big drop"},"attraction/maze":{name:"Maze",terms:"theme park,amusement ride,labyrinth"},"attraction/pirate_ship":{name:"Pirate Ship",terms:"theme park,carnival ride,amusement ride"},"attraction/river_rafting":{name:"River Rafting",terms:"theme park,aquatic park,water park,rafting simulator,river rafting ride,river rapids ride"},"attraction/roller_coaster":{name:"Roller Coaster",terms:"theme park,amusement ride"},"attraction/summer_toboggan":{name:"Summer Toboggan",terms:"alpine slide,mountain coaster"},"attraction/train":{name:"Tourist Train",terms:"theme park,rackless train,road train,Tschu-Tschu train,dotto train,park train"},"attraction/water_slide":{name:"Water Slide",terms:"theme park,aquatic park,water park,flumes,water chutes,hydroslides"},barrier:{name:"Barrier",terms:""},"barrier/entrance":{name:"Entrance",terms:""},"barrier/block":{name:"Block",terms:""},"barrier/bollard":{name:"Bollard",terms:""},"barrier/border_control":{name:"Border Control",terms:""},"barrier/cattle_grid":{name:"Cattle Grid",terms:""},"barrier/chain":{name:"Chain",terms:""},"barrier/city_wall":{name:"City Wall",terms:""},"barrier/cycle_barrier":{name:"Cycle Barrier",terms:""},"barrier/ditch":{name:"Trench",terms:""},"barrier/fence":{name:"Fence",terms:""},"barrier/fence/railing":{name:"Railing",terms:"railing,handrail,guard rail"},"barrier/gate":{name:"Gate",terms:""},"barrier/guard_rail":{name:"Guard Rail",terms:"guardrail,traffic barrier,crash barrier,median barrier,roadside barrier,Armco barrier"},"barrier/hedge":{name:"Hedge",terms:""},"barrier/height_restrictor":{name:"Height Restrictor",terms:""},"barrier/kerb":{name:"Curb",terms:""},"barrier/kerb/flush":{name:"Flush Curb",terms:"even curb,level curb,tactile curb"},"barrier/kerb/lowered":{name:"Lowered Curb",terms:"curb cut,curb ramp,kerb ramp,dropped kerb,pram ramp"},"barrier/kerb/raised":{name:"Raised Curb",terms:""},"barrier/kerb/rolled":{name:"Rolled Curb",terms:"gutter"},"barrier/kissing_gate":{name:"Kissing Gate",terms:""},"barrier/lift_gate":{name:"Lift Gate",terms:""},"barrier/retaining_wall":{name:"Retaining Wall",terms:""},"barrier/sally_port":{name:"Sally Port",terms:"Postern,castle side gate"},"barrier/stile":{name:"Stile",terms:""},"barrier/toll_booth":{name:"Toll Booth",terms:""},"barrier/turnstile":{name:"Turnstile",terms:"baffle gate,turnstyle"},"barrier/wall":{name:"Wall",terms:""},"boundary/administrative":{name:"Administrative Boundary",terms:""},"bridge/support":{name:"Bridge Support",terms:""},"bridge/support/pier":{name:"Bridge Pier",terms:""},building_part:{name:"Building Part",terms:"roof,simple 3D buildings"},building:{name:"Building",terms:""},"building/bunker":{name:"Bunker",terms:""},"building/entrance":{name:"Entrance/Exit",terms:""},"building/train_station":{name:"Train Station Building",terms:""},"building/apartments":{name:"Apartment Building",terms:""},"building/barn":{name:"Barn",terms:""},"building/boathouse":{name:"Boathouse",terms:""},"building/bungalow":{name:"Bungalow",terms:"home,detached"},"building/cabin":{name:"Cabin",terms:""},"building/carport":{name:"Carport",terms:"covered parking space,garage,car,porch"},"building/cathedral":{name:"Cathedral Building",terms:""},"building/chapel":{name:"Chapel Building",terms:""},"building/church":{name:"Church Building",terms:""},"building/civic":{name:"Civic Building",terms:""},"building/college":{name:"College Building",terms:"university"},"building/commercial":{name:"Commercial Building",terms:""},"building/construction":{name:"Building Under Construction",terms:""},"building/detached":{name:"Detached House",terms:"home,single,family,residence,dwelling"},"building/dormitory":{name:"Dormitory",terms:""},"building/farm_auxiliary":{name:"Farm Building",terms:""},"building/farm":{name:"Farm House",terms:""},"building/garage":{name:"Garage",terms:""},"building/garages":{name:"Garages",terms:""},"building/grandstand":{name:"Grandstand",terms:"tribune,stand,stands,bleachers"},"building/greenhouse":{name:"Greenhouse",terms:""},"building/hangar":{name:"Hangar Building",terms:""},"building/hospital":{name:"Hospital Building",terms:""},"building/hotel":{name:"Hotel Building",terms:""},"building/house":{name:"House",terms:"home,family,residence,dwelling"},"building/houseboat":{name:"Houseboat",terms:"home,family,residence,dwelling"},"building/hut":{name:"Hut",terms:""},"building/industrial":{name:"Industrial Building",terms:""},"building/kindergarten":{name:"Preschool/Kindergarten Building",terms:"kindergarden,pre-school"},"building/mosque":{name:"Mosque Building",terms:""},"building/pavilion":{name:"Pavilion Building",terms:"sports"},"building/public":{name:"Public Building",terms:""},"building/residential":{name:"Residential Building",terms:""},"building/retail":{name:"Retail Building",terms:""},"building/roof":{name:"Roof",terms:""},"building/ruins":{name:"Building Ruins",terms:""},"building/school":{name:"School Building",terms:"academy,elementary school,middle school,high school"},"building/semidetached_house":{name:"Semi-Detached House",terms:"home,double,duplex,twin,family,residence,dwelling"},"building/service":{name:"Service Building",terms:""},"building/shed":{name:"Shed",terms:""},"building/stable":{name:"Stable",terms:""},"building/stadium":{name:"Stadium Building",terms:""},"building/static_caravan":{name:"Static Mobile Home",terms:""},"building/temple":{name:"Temple Building",terms:""},"building/terrace":{name:"Row Houses",terms:"home,terrace,brownstone,family,residence,dwelling"},"building/transportation":{name:"Transportation Building",terms:""},"building/university":{name:"University Building",terms:"college"},"building/warehouse":{name:"Warehouse",terms:""},"camp_site/camp_pitch":{name:"Camp Pitch",terms:"tent,rv"},club:{name:"Club",terms:"social"},"club/sport":{name:"Sports Club",terms:"athletics club,sporting club,sports association,sports society"},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/agricultural_engines":{name:"Argricultural Engines Mechanic",terms:""},"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/floorer":{name:"Floorer",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/joiner":{name:"Joiner",terms:"furniture"},"craft/key_cutter":{name:"Key Cutter",terms:""},"craft/metal_construction":{name:"Metal Construction",terms:""},"craft/painter":{name:"Painter",terms:""},"craft/parquet_layer":{name:"Parquet Layer",terms:""},"craft/photographer":{name:"Photographer",terms:""},"craft/photographic_laboratory":{name:"Photographic Laboratory",terms:"film"},"craft/plasterer":{name:"Plasterer",terms:""},"craft/plumber":{name:"Plumber",terms:"pipe"},"craft/pottery":{name:"Pottery",terms:"ceramic"},"craft/rigger":{name:"Rigger",terms:""},"craft/roofer":{name:"Roofer",terms:""},"craft/saddler":{name:"Saddler",terms:""},"craft/sailmaker":{name:"Sailmaker",terms:""},"craft/sawmill":{name:"Sawmill",terms:"lumber"},"craft/scaffolder":{name:"Scaffolder",terms:""},"craft/sculptor":{name:"Sculptor",terms:""},"craft/shoemaker":{name:"Shoemaker",terms:"cobbler"},"craft/stonemason":{name:"Stonemason",terms:"masonry"},"craft/tiler":{name:"Tiler",terms:""},"craft/tinsmith":{name:"Tinsmith",terms:""},"craft/upholsterer":{name:"Upholsterer",terms:""},"craft/watchmaker":{name:"Watchmaker",terms:""},"craft/window_construction":{name:"Window Construction",terms:"glass"},"craft/winery":{name:"Winery",terms:""},"emergency/designated":{name:"Emergency Access Designated",terms:""},"emergency/destination":{name:"Emergency Access Destination",terms:""},"emergency/no":{name:"Emergency Access No",terms:""},"emergency/official":{name:"Emergency Access Official",terms:""},"emergency/private":{name:"Emergency Access Private",terms:""},"emergency/yes":{name:"Emergency Access Yes",terms:""},"emergency/ambulance_station":{name:"Ambulance Station",terms:"EMS,EMT,rescue"},"emergency/defibrillator":{name:"Defibrillator",terms:"AED"},"emergency/fire_alarm":{name:"Fire Alarm Call Box",terms:""},"emergency/fire_extinguisher":{name:"Fire Extinguisher",terms:""},"emergency/fire_hose":{name:"Fire Hose",terms:""},"emergency/fire_hydrant":{name:"Fire Hydrant",terms:"fire plug,fire water well,hydrant"},"emergency/first_aid_kit":{name:"First Aid Kit",terms:"bandage,first aid,med,med kit,medic*,medkit"},"emergency/life_ring":{name:"Life Ring",terms:"life buoy,kisby ring,kisbie ring,perry buoy"},"emergency/lifeguard":{name:"Lifeguard",terms:"CPR,rescue"},"emergency/phone":{name:"Emergency Phone",terms:""},"emergency/siren":{name:"Siren",terms:"air raid,loud,noise,storm,tornado,warning"},"emergency/water_tank":{name:"Emergency Water Tank",terms:"water tank,cistern,reservoir"},entrance:{name:"Entrance/Exit",terms:"entrance,exit,door"},ford:{name:"Ford",terms:""},"golf/bunker":{name:"Sand Trap",terms:"hazard,bunker"},"golf/cartpath":{name:"Golf Cartpath",terms:""},"golf/driving_range":{name:"Driving Range",terms:""},"golf/fairway":{name:"Fairway",terms:""},"golf/green":{name:"Putting Green",terms:""},"golf/hole":{name:"Golf Hole",terms:""},"golf/lateral_water_hazard":{name:"Lateral Water Hazard",terms:""},"golf/path":{name:"Golf Walking Path",terms:""},"golf/rough":{name:"Rough",terms:""},"golf/tee":{name:"Tee Box",terms:"teeing ground"},"golf/water_hazard":{name:"Water Hazard",terms:""},healthcare:{name:"Healthcare Facility",terms:"clinic,doctor,disease,health,institution,sick,surgery,wellness"},"healthcare/alternative":{name:"Alternative Medicine",terms:"acupuncture,anthroposophical,applied kinesiology,aromatherapy,ayurveda,herbalism,homeopathy,hydrotherapy,hypnosis,naturopathy,osteopathy,reflexology,reiki,shiatsu,traditional,tuina,unani"},"healthcare/alternative/chiropractic":{name:"Chiropractor",terms:"back,pain,spine"},"healthcare/audiologist":{name:"Audiologist",terms:"ear,hearing,sound"},"healthcare/birthing_center":{name:"Birthing Center",terms:"baby,childbirth,delivery,labour,labor,pregnancy"},"healthcare/blood_donation":{name:"Blood Donor Center",terms:"blood bank,blood donation,blood transfusion,apheresis,plasmapheresis,plateletpheresis,stem cell donation"},"healthcare/hospice":{name:"Hospice",terms:"terminal,illness"},"healthcare/laboratory":{name:"Medical Laboratory",terms:"medical_laboratory,medical_lab,blood_check"},"healthcare/midwife":{name:"Midwife",terms:"baby,childbirth,delivery,labour,labor,pregnancy"},"healthcare/occupational_therapist":{name:"Occupational Therapist",terms:"therapist,therapy"},"healthcare/optometrist":{name:"Optometrist",terms:"eye,glasses,lasik,lenses,vision"},"healthcare/physiotherapist":{name:"Physiotherapist",terms:"physical,therapist,therapy"},"healthcare/podiatrist":{name:"Podiatrist",terms:"foot,feet,nails"},"healthcare/psychotherapist":{name:"Psychotherapist",terms:"anxiety,counselor,depression,mental health,mind,suicide,therapist,therapy"},"healthcare/rehabilitation":{name:"Rehabilitation Facility",terms:"rehab,therapist,therapy"},"healthcare/speech_therapist":{name:"Speech Therapist",terms:"speech,therapist,therapy,voice"},"highway/bus_stop":{name:"Bus Stop",terms:""},"highway/crossing":{name:"Crossing",terms:""},"highway/bridleway":{name:"Bridle Path",terms:"bridleway,equestrian,horse,trail"},"highway/bus_guideway":{name:"Bus Guideway",terms:""},"highway/construction":{name:"Road Closed",terms:"closed,closure,construction"},"highway/corridor":{name:"Indoor Corridor",terms:"gallery,hall,hallway,indoor,passage,passageway"},"highway/crossing/zebra-raised":{name:"Marked Crosswalk (Raised)",terms:"zebra crossing,marked crossing,crosswalk,flat top,hump,speed,slow"},"highway/crossing/zebra":{name:"Marked Crosswalk",terms:"zebra crossing,marked crossing,crosswalk"},"highway/crossing/marked-raised":{name:"Marked Crosswalk (Raised)",terms:"zebra crossing,marked crossing,crosswalk,flat top,hump,speed,slow"},"highway/crossing/marked":{name:"Marked Crosswalk",terms:"zebra crossing,marked crossing,crosswalk"},"highway/crossing/unmarked-raised":{name:"Unmarked Crossing (Raised)",terms:"flat top,hump,speed,slow"},"highway/crossing/unmarked":{name:"Unmarked Crossing",terms:""},"highway/cycleway":{name:"Cycle Path",terms:"bike path,bicyle path"},"highway/cycleway/crossing":{name:"Cycle Crossing",terms:""},"highway/cycleway/bicycle_foot":{name:"Cycle & Foot Path",terms:"bicycle and foot path,mixed-use trail,multi-use trail,segregated trail"},"highway/cycleway/crossing/marked":{name:"Marked Cycle Crossing",terms:"cycle crosswalk,cycle path crossing,cycleway crossing,bicycle crossing,bike crossing"},"highway/cycleway/crossing/unmarked":{name:"Unmarked Cycle Crossing",terms:"cycle path crossing,cycleway crossing,bicycle crossing,bike crossing"},"highway/elevator":{name:"Elevator",terms:"lift"},"highway/emergency_bay":{name:"Emergency Stopping Place",terms:"Highway Emergency Bay"},"highway/footway":{name:"Foot Path",terms:"hike,hiking,promenade,trackway,trail,walk"},"highway/footway/crossing":{name:"Pedestrian Crossing",terms:""},"highway/footway/zebra-raised":{name:"Marked Crosswalk (Raised)",terms:"zebra crossing,marked crossing,crosswalk,flat top,hump,speed,slow"},"highway/footway/zebra":{name:"Marked Crosswalk",terms:"zebra crossing,marked crossing,crosswalk"},"highway/footway/conveying":{name:"Moving Walkway",terms:"moving sidewalk,autwalk,skywalk,travolator,travelator,travellator,conveyor"},"highway/footway/marked-raised":{name:"Marked Crosswalk (Raised)",terms:"zebra crossing,marked crossing,crosswalk,flat top,hump,speed,slow"},"highway/footway/marked":{name:"Marked Crosswalk",terms:"marked foot path crossing,marked crossing,marked pedestrian crosswalk,zebra crossing"},"highway/footway/sidewalk":{name:"Sidewalk",terms:"pavement,sidepath"},"highway/footway/unmarked-raised":{name:"Unmarked Crossing (Raised)",terms:"flat top,hump,speed,slow"},"highway/footway/unmarked":{name:"Unmarked Crossing",terms:"unmarked foot path crossing,unmarked crosswalk,unmarked pedestrian crossing"},"highway/give_way":{name:"Yield Sign",terms:"give way,yield,sign"},"highway/living_street":{name:"Living Street",terms:""},"highway/milestone":{name:"Highway Milestone",terms:"mile marker,mile post,mile stone,mileage marker,milemarker,milepost"},"highway/mini_roundabout":{name:"Mini-Roundabout",terms:"traffic circle"},"highway/motorway_junction":{name:"Motorway Junction / Exit",terms:"exit"},"highway/motorway_link":{name:"Motorway Link",terms:"exit,ramp,road,street,on ramp,off ramp"},"highway/motorway":{name:"Motorway",terms:"autobahn,expressway,freeway,highway,interstate,parkway,road,street,thruway,turnpike"},"highway/passing_place":{name:"Passing Place",terms:"turnout, pullout"},"highway/path":{name:"Path",terms:"hike,hiking,trackway,trail,walk"},"highway/pedestrian_area":{name:"Pedestrian Area",terms:"center,centre,plaza,quad,square,walkway"},"highway/pedestrian_line":{name:"Pedestrian Street",terms:"center,centre,plaza,quad,square,walkway"},"highway/primary_link":{name:"Primary Link",terms:"on ramp,off ramp,ramp,road,street"},"highway/primary":{name:"Primary Road",terms:"road,street"},"highway/raceway":{name:"Racetrack (Motorsport)",terms:"auto*,formula one,kart,motocross,nascar,race*,track"},"highway/residential":{name:"Residential Road",terms:"road,street"},"highway/rest_area":{name:"Rest Area",terms:"rest stop"},"highway/road":{name:"Unknown Road",terms:"road,street"},"highway/secondary_link":{name:"Secondary Link",terms:"on ramp,off ramp,ramp,road,street"},"highway/secondary":{name:"Secondary Road",terms:"road,street"},"highway/service":{name:"Service Road",terms:"road,street"},"highway/service/alley":{name:"Alley",terms:""},"highway/service/drive-through":{name:"Drive-Through",terms:""},"highway/service/driveway":{name:"Driveway",terms:""},"highway/service/emergency_access":{name:"Emergency Access",terms:""},"highway/service/parking_aisle":{name:"Parking Aisle",terms:""},"highway/services":{name:"Service Area",terms:"services,travel plaza,service station"},"highway/speed_camera":{name:"Speed Camera",terms:""},"highway/steps":{name:"Steps",terms:"stairs,staircase,stairway"},"highway/steps/conveying":{name:"Escalator",terms:"moving staircase,moving stairway,people mover"},"highway/stop":{name:"Stop Sign",terms:"stop,halt,sign"},"highway/street_lamp":{name:"Street Lamp",terms:"streetlight,street light,lamp,light,gaslight"},"highway/tertiary_link":{name:"Tertiary Link",terms:"on ramp,off ramp,ramp,road,street"},"highway/tertiary":{name:"Tertiary Road",terms:"road,street"},"highway/track":{name:"Unmaintained Track Road",terms:"woods road,forest road,logging road,fire road,farm road,agricultural road,ranch road,carriage road,primitive,unmaintained,rut,offroad,4wd,4x4,four wheel drive,atv,quad,jeep,double track,two track"},"highway/traffic_mirror":{name:"Traffic Mirror",terms:"blind spot,convex,corner,curved,roadside,round,safety,sphere,visibility"},"highway/traffic_signals":{name:"Traffic Signals",terms:"light,stoplight,traffic light"},"highway/trailhead":{name:"Trailhead",terms:"hiking,mile zero,mountain biking,mountaineering,trail endpoint,trail start,staging area,trekking"},"highway/trunk_link":{name:"Trunk Link",terms:"on ramp,off ramp,ramp,road,street"},"highway/trunk":{name:"Trunk Road",terms:"road,street"},"highway/turning_circle":{name:"Turning Circle",terms:"cul-de-sac"},"highway/turning_loop":{name:"Turning Loop (Island)",terms:"cul-de-sac"},"highway/unclassified":{name:"Minor/Unclassified Road",terms:"road,street"},historic:{name:"Historic Site",terms:""},"historic/archaeological_site":{name:"Archaeological Site",terms:""},"historic/boundary_stone":{name:"Boundary Stone",terms:""},"historic/castle":{name:"Castle",terms:""},"historic/castle/fortress":{name:"Historic Fortress",terms:"citadel,military"},"historic/castle/palace":{name:"Palace",terms:"Royal Residence,royal,king,queen"},"historic/castle/stately":{name:"Château",terms:"Historic Country House,Stately Home,nobility,gentry,representative"},"historic/city_gate":{name:"City Gate",terms:"Town Gate"},"historic/fort":{name:"Historic Fort",terms:"military"},"historic/manor":{name:"Manor House",terms:"Mansion,gentry,nobility,estate"},"historic/memorial":{name:"Memorial",terms:"dedicatory,epitaph,remember,remembrance,memory,monument,stolperstein"},"historic/memorial/plaque":{name:"Commemorative Plaque",terms:"dedicatory,epitaph,historical marker,remember,remembrance,memory"},"historic/monument":{name:"Monument",terms:""},"historic/ruins":{name:"Ruins",terms:""},"historic/tomb":{name:"Tomb",terms:""},"historic/wayside_cross":{name:"Wayside Cross",terms:""},"historic/wayside_shrine":{name:"Wayside Shrine",terms:""},"historic/wreck":{name:"Shipwreck",terms:"hull,mast,maritime,remains,ship,boat"},"indoor/corridor_line":{name:"Indoor Corridor",terms:""},"indoor/area":{name:"Indoor Area",terms:"indoor space"},"indoor/corridor":{name:"Indoor Corridor",terms:"concourse,foyer,hallway,passageway"},"indoor/door":{name:"Indoor Door",terms:"doorframe,doorway,portal,room access,threshold"},"indoor/room":{name:"Room",terms:"antechamber,anteroom,atrium,cell,chamber,concourse,foyer,indoor room,lobby,vestibule"},"indoor/wall":{name:"Indoor Wall",terms:"indoor barrier,room divider,room partition"},"internet_access/wlan":{name:"Wi-Fi Hotspot",terms:"wi-fi,wifi,hotspot"},junction:{name:"Junction",terms:""},"junction/circular":{name:"Traffic Circle",terms:""},"junction/jughandle":{name:"Jughandle",terms:""},"junction/roundabout":{name:"Roundabout",terms:""},"landuse/basin":{name:"Basin",terms:""},"landuse/farm":{name:"Farmland",terms:""},"landuse/pond":{name:"Pond",terms:""},"landuse/reservoir":{name:"Reservoir",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/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:"Managed Forest",terms:"cut,forest,forestry,lumber,silviculture,tree"},"landuse/garages":{name:"Garage Landuse",terms:""},"landuse/grass":{name:"Grass",terms:""},"landuse/greenfield":{name:"Greenfield",terms:""},"landuse/greenhouse_horticulture":{name:"Greenhouse Horticulture",terms:"flower,greenhouse,horticulture,grow,vivero"},"landuse/harbour":{name:"Harbor",terms:"boat"},"landuse/industrial":{name:"Industrial Area",terms:""},"landuse/industrial/scrap_yard":{name:"Scrap Yard",terms:"car,junk,metal,salvage,scrap,u-pull-it,vehicle,wreck,yard"},"landuse/industrial/slaughterhouse":{name:"Slaughterhouse",terms:"abattoir,beef,butchery,calf,chicken,cow,killing house,meat,pig,pork,poultry,shambles,stockyard"},"landuse/landfill":{name:"Landfill",terms:"dump"},"landuse/meadow":{name:"Meadow",terms:"grazing,hay field,pasture"},"landuse/military":{name:"Military Area",terms:""},"landuse/military/airfield":{name:"Military Airfield",terms:"aerodrome,aeroway,air force,airplane,airport,army,base,bomb,fight,force,guard,heli*,jet,marine,navy,plane,troop,war"},"landuse/military/barracks":{name:"Barracks",terms:"air force,army,base,fight,force,guard,marine,navy,troop,war"},"landuse/military/bunker":{name:"Military Bunker",terms:"air force,army,base,fight,force,guard,marine,navy,troop,war"},"landuse/military/checkpoint":{name:"Checkpoint",terms:"air force,army,base,force,guard,marine,navy,troop,war"},"landuse/military/danger_area":{name:"Danger Area",terms:"air force,army,base,blast,bomb,explo*,force,guard,mine,marine,navy,troop,war"},"landuse/military/naval_base":{name:"Naval Base",terms:"base,fight,force,guard,marine,navy,ship,sub,troop,war"},"landuse/military/nuclear_explosion_site":{name:"Nuclear Explosion Site",terms:"atom,blast,bomb,detonat*,nuke,site,test"},"landuse/military/obstacle_course":{name:"Obstacle Course",terms:"army,base,force,guard,marine,navy,troop,war"},"landuse/military/office":{name:"Military Office",terms:"air force,army,base,enlist,fight,force,guard,marine,navy,recruit,troop,war"},"landuse/military/range":{name:"Military Range",terms:"air force,army,base,fight,fire,force,guard,gun,marine,navy,rifle,shoot*,snip*,train,troop,war"},"landuse/military/training_area":{name:"Training Area",terms:"air force,army,base,fight,fire,force,guard,gun,marine,navy,rifle,shoot*,snip*,train,troop,war"},"landuse/orchard":{name:"Orchard",terms:"fruit"},"landuse/plant_nursery":{name:"Plant Nursery",terms:"flower,garden,grow,vivero"},"landuse/quarry":{name:"Quarry",terms:""},"landuse/railway":{name:"Railway Corridor",terms:"rail,train,track"},"landuse/recreation_ground":{name:"Recreation Ground",terms:"playing fields"},"landuse/religious":{name:"Religious Area",terms:""},"landuse/residential":{name:"Residential Area",terms:""},"landuse/residential/apartments":{name:"Apartment Complex",terms:"flat,residence,tenement"},"landuse/retail":{name:"Retail Area",terms:""},"landuse/vineyard":{name:"Vineyard",terms:"grape,wine"},"leisure/adult_gaming_centre":{name:"Adult Gaming Center",terms:"gambling,slot machine"},"leisure/amusement_arcade":{name:"Amusement Arcade",terms:"pay-to-play games,video games,driving simulators,pinball machines"},"leisure/bandstand":{name:"Bandstand",terms:""},"leisure/beach_resort":{name:"Beach Resort",terms:""},"leisure/bird_hide":{name:"Bird Hide",terms:"machan,ornithology"},"leisure/bleachers":{name:"Bleachers",terms:"crowd,bench,sports,stand,stands,seat,seating"},"leisure/bowling_alley":{name:"Bowling Alley",terms:"bowling center"},"leisure/common":{name:"Common",terms:"open space"},"leisure/dance":{name:"Dance Hall",terms:"ballroom,jive,swing,tango,waltz"},"leisure/dancing_school":{name:"Dance School",terms:"jive,swing,tango,waltz,dance teaching"},"leisure/dog_park":{name:"Dog Park",terms:""},"leisure/firepit":{name:"Firepit",terms:"fireplace,campfire"},"leisure/fishing":{name:"Fishing Spot",terms:"angler"},"leisure/fitness_centre":{name:"Gym / Fitness Center",terms:"health,gym,leisure,studio"},"leisure/fitness_centre/yoga":{name:"Yoga Studio",terms:"studio,asanas,modern yoga,meditation"},"leisure/fitness_station":{name:"Outdoor Fitness Station",terms:"exercise,fitness,gym,trim trail"},"leisure/fitness_station/balance_beam":{name:"Exercise Balance Beam",terms:"balance,exercise,fitness,gym,trim trail"},"leisure/fitness_station/box":{name:"Exercise Box",terms:"box,exercise,fitness,gym,jump,trim trail"},"leisure/fitness_station/horizontal_bar":{name:"Exercise Horizontal Bar",terms:"bar,chinup,chin up,exercise,fitness,gym,pullup,pull up,trim trail"},"leisure/fitness_station/horizontal_ladder":{name:"Exercise Monkey Bars",terms:"bar,chinup,chin up,exercise,fitness,gym,ladder,monkey bars,pullup,pull up,trim trail"},"leisure/fitness_station/hyperextension":{name:"Hyperextension Station",terms:"back,exercise,extension,fitness,gym,roman chair,trim trail"},"leisure/fitness_station/parallel_bars":{name:"Parallel Bars",terms:"bar,dip,exercise,fitness,gym,trim trail"},"leisure/fitness_station/push-up":{name:"Push-Up Station",terms:"bar,exercise,fitness,gym,pushup,push up,trim trail"},"leisure/fitness_station/rings":{name:"Exercise Rings",terms:"exercise,fitness,gym,muscle up,pullup,pull up,trim trail"},"leisure/fitness_station/sign":{name:"Exercise Instruction Sign",terms:"exercise,fitness,gym,trim trail"},"leisure/fitness_station/sit-up":{name:"Sit-Up Station",terms:"crunch,exercise,fitness,gym,situp,sit up,trim trail"},"leisure/fitness_station/stairs":{name:"Exercise Stairs",terms:"exercise,fitness,gym,steps,trim trail"},"leisure/garden":{name:"Garden",terms:""},"leisure/golf_course":{name:"Golf Course",terms:"links"},"leisure/hackerspace":{name:"Hackerspace",terms:"makerspace,hackspace,hacklab"},"leisure/horse_riding":{name:"Horseback Riding Facility",terms:"equestrian,stable"},"leisure/ice_rink":{name:"Ice Rink",terms:"hockey,skating,curling"},"leisure/marina":{name:"Marina",terms:"boat"},"leisure/miniature_golf":{name:"Miniature Golf",terms:"crazy golf,mini golf,putt-putt"},"leisure/nature_reserve":{name:"Nature Reserve",terms:"protected,wildlife"},"leisure/outdoor_seating":{name:"Outdoor Seating Area",terms:"al fresco,beer garden,dining,cafe,restaurant,pub,bar,patio"},"leisure/park":{name:"Park",terms:"esplanade,estate,forest,garden,grass,green,grounds,lawn,lot,meadow,parkland,place,playground,plaza,pleasure garden,recreation area,square,tract,village green,woodland"},"leisure/picnic_table":{name:"Picnic Table",terms:"bench"},"leisure/picnic_table/chess":{name:"Chess Table",terms:"bench,chess board,checkerboard,checkers,chequerboard,game table"},"leisure/pitch":{name:"Sport Pitch",terms:"field"},"leisure/pitch/american_football":{name:"American Football Field",terms:"football,gridiron"},"leisure/pitch/australian_football":{name:"Australian Football Field",terms:"Aussie,AFL,football"},"leisure/pitch/badminton":{name:"Badminton Court",terms:""},"leisure/pitch/baseball":{name:"Baseball Field",terms:""},"leisure/pitch/basketball":{name:"Basketball Court",terms:""},"leisure/pitch/beachvolleyball":{name:"Beach Volleyball Court",terms:"volleyball"},"leisure/pitch/boules":{name:"Boules/Bocce Court",terms:"bocce,lyonnaise,pétanque"},"leisure/pitch/bowls":{name:"Bowling Green",terms:""},"leisure/pitch/cricket":{name:"Cricket Field",terms:""},"leisure/pitch/equestrian":{name:"Riding Arena",terms:"dressage,equestrian,horse,horseback,riding"},"leisure/pitch/horseshoes":{name:"Horseshoes Pit",terms:"horse shoes"},"leisure/pitch/netball":{name:"Netball Court",terms:""},"leisure/pitch/rugby_league":{name:"Rugby League Field",terms:""},"leisure/pitch/rugby_union":{name:"Rugby Union Field",terms:""},"leisure/pitch/shuffleboard":{name:"Shuffleboard Court",terms:"deck shuffleboard,floor shuffleboard"},"leisure/pitch/skateboard":{name:"Skate Park",terms:""},"leisure/pitch/soccer":{name:"Soccer Field",terms:"football"},"leisure/pitch/softball":{name:"Softball Field",terms:"softball,diamond"},"leisure/pitch/table_tennis":{name:"Ping Pong Table",terms:"table tennis,ping pong"},"leisure/pitch/tennis":{name:"Tennis Court",terms:""},"leisure/pitch/volleyball":{name:"Volleyball Court",terms:""},"leisure/playground":{name:"Playground",terms:"jungle gym,play area"},"leisure/resort":{name:"Resort",terms:""},"leisure/sauna":{name:"Sauna",terms:""},"leisure/slipway_point":{name:"Slipway",terms:"boat launch,boat ramp,boat landing"},"leisure/slipway":{name:"Slipway",terms:"boat launch,boat ramp,boat landing"},"leisure/sports_centre":{name:"Sports Center / Complex",terms:""},"leisure/sports_centre/climbing":{name:"Climbing Gym",terms:"abseiling,artificial climbing wall,belaying,bouldering,rock climbing facility,indoor rock wall,rappeling,rock gym,ropes"},"leisure/sports_centre/swimming":{name:"Swimming Pool Facility",terms:"dive,water"},"leisure/stadium":{name:"Stadium",terms:""},"leisure/swimming_area":{name:"Natural Swimming Area",terms:"dive,water,aquatics"},"leisure/swimming_pool":{name:"Swimming Pool",terms:"dive,water,aquatics"},"leisure/track":{name:"Racetrack (Non-Motorsport)",terms:"cycle,dog,greyhound,horse,race*,track"},"leisure/track/cycling_point":{name:"Cycling Track",terms:"bicycle track,bicycling track,cycle racetrack,velodrome"},"leisure/track/cycling":{name:"Cycling Track",terms:"bicycle track,bicycling track,cycle racetrack,velodrome"},"leisure/track/horse_racing_point":{name:"Horse Racing Track",terms:"equestrian race track,horse race betting,horseracing,horsetrack,horse racetrack"},"leisure/track/horse_racing":{name:"Horse Racing Track",terms:"equestrian race track,horse race betting,horseracing,horsetrack,horse racetrack"},"leisure/track/running_point":{name:"Running Track",terms:"athletics track,decathlon,foot race,long distance running,marathon,middle distance running,racetrack,running,sprint,track,walking"},"leisure/track/running":{name:"Running Track",terms:"athletics track,decathlon,foot race,long distance running,marathon,middle distance running,racetrack,running,sprint,track,walking"},"leisure/water_park":{name:"Water Park",terms:"swim,pool,dive"},line:{name:"Line",terms:"polyline"},"man_made/adit":{name:"Adit",terms:"cave,horizontal mine entrance,tunnel,underground"},"man_made/antenna":{name:"Antenna",terms:"broadcast,cell phone,cell,communication,mobile phone,radio,television,transmission,tv"},"man_made/beacon":{name:"Beacon",terms:""},"man_made/beehive":{name:"Beehive",terms:"apiary,beekeeper,farm,honey,pollination"},"man_made/breakwater":{name:"Breakwater",terms:""},"man_made/bridge":{name:"Bridge",terms:""},"man_made/bunker_silo":{name:"Bunker Silo",terms:"Silage,Storage"},"man_made/chimney":{name:"Chimney",terms:""},"man_made/clearcut":{name:"Clearcut Forest",terms:"cut,forest,lumber,tree,wood"},"man_made/crane":{name:"Crane",terms:""},"man_made/cross":{name:"Summit Cross",terms:""},"man_made/cutline":{name:"Cut line",terms:""},"man_made/dyke":{name:"Levee",terms:"Dike,Dyke,Floodbank,Stopbank"},"man_made/embankment":{name:"Embankment",terms:""},"man_made/flagpole":{name:"Flagpole",terms:""},"man_made/gasometer":{name:"Gasometer",terms:"gas holder"},"man_made/groyne":{name:"Groyne",terms:""},"man_made/lighthouse":{name:"Lighthouse",terms:""},"man_made/mast":{name:"Mast",terms:"antenna,broadcast tower,cell phone tower,cell tower,communication mast,communication tower,guyed tower,mobile phone tower,radio mast,radio tower,television tower,transmission mast,transmission tower,tv tower"},"man_made/mast/communication":{name:"Communication Mast",terms:"antenna,broadcast tower,cell phone tower,cell tower,communication mast,communication tower,guyed tower,mobile phone tower,radio mast,radio tower,television tower,transmission mast,transmission tower,tv tower"},"man_made/mast/communication/mobile_phone":{name:"Mobile Phone Mast",terms:"antenna,cell mast,cell phone mast,cell phone tower,cell tower,communication mast,communication tower,guyed tower,mobile phone tower,transmission mast,transmission tower"},"man_made/mast/communication/radio":{name:"Radio Broadcast Mast",terms:"antenna,broadcast tower,communication mast,communication tower,guyed tower,radio mast,radio tower,transmission mast,transmission tower"},"man_made/mast/communication/television":{name:"Television Broadcast Mast",terms:"antenna,broadcast tower,communication mast,communication tower,guyed tower,television mast,television tower,transmission mast,transmission tower,tv mast,tv tower"},"man_made/mineshaft":{name:"Mineshaft",terms:"cave,mine shaft,tunnel,underground,vertical mine entrance"},"man_made/monitoring_station":{name:"Monitoring Station",terms:"weather,earthquake,seismology,air,gps"},"man_made/observatory":{name:"Observatory",terms:"astronomical,meteorological"},"man_made/petroleum_well":{name:"Oil Well",terms:"drilling rig,oil derrick,oil drill,oil horse,oil rig,oil pump,petroleum well,pumpjack"},"man_made/pier":{name:"Pier",terms:"berth,dock,jetty,landing,promenade,wharf"},"man_made/pier/floating":{name:"Floating Pier",terms:"berth,dock,jetty,landing,promenade,wharf"},"man_made/pipeline":{name:"Pipeline",terms:"oil,natural gas,water,sewer,sewage"},"man_made/pipeline/underground":{name:"Underground Pipeline",terms:"oil,natural gas,water,sewer,sewage"},"man_made/pumping_station":{name:"Pumping Station",terms:""},"man_made/silo":{name:"Silo",terms:"grain,corn,wheat"},"man_made/storage_tank":{name:"Storage Tank",terms:"water,oil,gas,petrol"},"man_made/street_cabinet":{name:"Street Cabinet",terms:"cable tv,monitoring box,technical box,telecommunications,traffic signal controls"},"man_made/surveillance":{name:"Surveillance",terms:"anpr,alpr,camera,car plate recognition,cctv,guard,license plate recognition,monitoring,number plate recognition,security,video,webcam"},"man_made/surveillance/camera":{name:"Surveillance Camera",terms:"anpr,alpr,camera,car plate recognition,cctv,guard,license plate recognition,monitoring,number plate recognition,security,video,webcam"},"man_made/survey_point":{name:"Survey Point",terms:"trig point,triangulation pillar,trigonometrical station"},"man_made/tower":{name:"Tower",terms:""},"man_made/tower/bell_tower":{name:"Bell Tower",terms:"belfry,bell gable,campanile,church tower,klockstapel"},"man_made/tower/communication":{name:"Communication Tower",terms:"antenna,broadcast tower,cell phone tower,cell tower,communication mast,communication tower,guyed tower,mobile phone tower,radio mast,radio tower,television tower,transmission mast,transmission tower,tv tower"},"man_made/tower/defensive":{name:"Fortified Tower",terms:"Defensive Tower,Castle Tower"},"man_made/tower/minaret":{name:"Minaret",terms:"Islam,mosque,Muezzin,Muslim"},"man_made/tower/observation":{name:"Observation Tower",terms:"lookout tower,fire tower"},"man_made/tunnel":{name:"Tunnel",terms:"bore,dig,shaft,underground passage,underpass"},"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/bare_rock":{name:"Bare Rock",terms:"rock"},"natural/bay":{name:"Bay",terms:""},"natural/beach":{name:"Beach",terms:"shore"},"natural/cape":{name:"Cape",terms:"bay,coastline,erosion,headland,promontory"},"natural/cave_entrance":{name:"Cave Entrance",terms:"cavern,hollow,grotto,shelter,cavity"},"natural/cliff":{name:"Cliff",terms:"crag,escarpment,rock face,scarp"},"natural/coastline":{name:"Coastline",terms:"shore"},"natural/fell":{name:"Fell",terms:""},"natural/glacier":{name:"Glacier",terms:"ice,snow"},"natural/grassland":{name:"Grassland",terms:"prairie,savanna"},"natural/heath":{name:"Heath",terms:""},"natural/mud":{name:"Mud",terms:"wetland"},"natural/peak":{name:"Peak",terms:"acme,aiguille,alp,climax,crest,crown,hill,mount,mountain,pinnacle,summit,tip,top"},"natural/reef":{name:"Reef",terms:"barrier,coral,ocean,sand,shoal"},"natural/ridge":{name:"Ridge",terms:"crest"},"natural/rock":{name:"Attached Rock / Boulder",terms:"boulder,stone,rock"},"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/shingle":{name:"Shingle",terms:"beach,gravel,pebbles,riverbed,rounded rock fragments"},"natural/spring":{name:"Spring",terms:""},"natural/stone":{name:"Unattached Stone / Boulder",terms:"boulder,stone,rock"},"natural/tree_row":{name:"Tree Row",terms:""},"natural/tree":{name:"Tree",terms:""},"natural/valley":{name:"Valley",terms:"canyon,dale,dell,dene,depression,glen,gorge,gully,gulley,gultch,hollow,ravine,rift,vale"},"natural/volcano":{name:"Volcano",terms:"mountain,crater"},"natural/water":{name:"Water",terms:""},"natural/water/basin":{name:"Basin",terms:"detention,drain,overflow,rain,retention"},"natural/water/canal":{name:"Canal",terms:""},"natural/water/lake":{name:"Lake",terms:"lakelet,loch,mere"},"natural/water/moat":{name:"Moat",terms:""},"natural/water/pond":{name:"Pond",terms:"lakelet,millpond,tarn,pool,mere"},"natural/water/reservoir":{name:"Reservoir",terms:""},"natural/water/river":{name:"River",terms:"beck,branch,brook,course,creek,estuary,rill,riverbank,rivulet,run,runnel,stream,tributary,watercourse"},"natural/water/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"},"natural/water/wastewater":{name:"Wastewater Basin",terms:"excrement,shit,sewage,wastewater,Settling Basin,Clarifier Basin"},"natural/wetland":{name:"Wetland",terms:"bog,fen,marsh,mire,moor,muskeg,peatland,quagmire,reedbed,saltmarsh,swamp,tidalflat,wet meadow"},"natural/wood":{name:"Wood",terms:"tree"},"noexit/yes":{name:"No Exit",terms:"no exit,road end,dead end"},office:{name:"Office",terms:""},"office/administrative":{name:"Administrative Office",terms:""},"office/physician":{name:"Physician",terms:""},"office/travel_agent":{name:"Travel Agency",terms:""},"office/accountant":{name:"Accountant Office",terms:""},"office/adoption_agency":{name:"Adoption Agency",terms:""},"office/advertising_agency":{name:"Advertising Agency",terms:"ad,ad agency,advert agency,advertising,marketing"},"office/architect":{name:"Architect Office",terms:""},"office/association":{name:"Nonprofit Organization Office",terms:"association,non-profit,nonprofit,organization,society"},"office/charity":{name:"Charity Office",terms:"charitable organization"},"office/company":{name:"Corporate Office",terms:""},"office/coworking":{name:"Coworking Space",terms:"coworking,office"},"office/diplomatic":{name:"Diplomatic Office",terms:""},"office/diplomatic/consulate":{name:"Consulate",terms:""},"office/diplomatic/embassy":{name:"Embassy",terms:""},"office/diplomatic/liaison":{name:"Liaison Office",terms:""},"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:"real estate"},"office/financial_advisor":{name:"Financial Advisor",terms:"401k,inheritance,savings,stocks,retirement,wealth management"},"office/financial":{name:"Financial Office",terms:""},"office/forestry":{name:"Forestry Office",terms:"forest,ranger"},"office/foundation":{name:"Foundation Office",terms:""},"office/government":{name:"Government Office",terms:""},"office/government/register_office":{name:"Register Office",terms:"clerk,marriage,death,birth,certificate"},"office/government/tax":{name:"Tax and Revenue Office",terms:"fiscal authorities,revenue office,tax office"},"office/guide":{name:"Tour Guide Office",terms:"dive guide,mountain guide,tour guide"},"office/insurance":{name:"Insurance Office",terms:""},"office/it":{name:"Information Technology Office",terms:"computer,information,software,technology"},"office/lawyer":{name:"Law Office",terms:""},"office/lawyer/notary":{name:"Notary Office",terms:""},"office/moving_company":{name:"Moving Company Office",terms:"relocation"},"office/newspaper":{name:"Newspaper Office",terms:""},"office/ngo":{name:"NGO Office",terms:"ngo,non government,non-government,organization,organisation"},"office/notary":{name:"Notary Office",terms:"clerk,deeds,estate,signature,wills"},"office/political_party":{name:"Political Party",terms:""},"office/private_investigator":{name:"Private Investigator Office",terms:"PI,private eye,private detective"},"office/quango":{name:"Quasi-NGO Office",terms:"ngo,non government,non-government,organization,organisation,quasi autonomous,quasi-autonomous"},"office/religion":{name:"Religious Office",terms:""},"office/research":{name:"Research Office",terms:""},"office/surveyor":{name:"Surveyor Office",terms:""},"office/tax_advisor":{name:"Tax Advisor Office",terms:"tax,tax consultant"},"office/telecommunication":{name:"Telecom Office",terms:"communication,internet,phone,voice"},"office/therapist":{name:"Therapist Office",terms:"therapy"},"office/water_utility":{name:"Water Utility Office",terms:"water board,utility"},"piste/downhill":{name:"Downhill Piste/Ski Run",terms:"ski,alpine,snowboard,downhill,piste"},"piste/downhill/halfpipe":{name:"Halfpipe",terms:"ski,alpine,halfpipe,half pipe,snowboard,downhill,piste"},"piste/hike":{name:"Snowshoeing or Winter Hiking Trail",terms:"hike,winter hiking,snowshoe,snowshoeing,piste,ski"},"piste/ice_skate":{name:"Ice Skating Piste",terms:"ice,skating,ski,piste"},"piste/nordic":{name:"Nordic or Crosscountry Piste/Ski Trail",terms:"ski,nordic,crosscountry,skating,piste"},"piste/piste":{name:"Winter Sport Trails",terms:"ski,nordic,crosscountry,downhill,alpine,snowboard,skitour,ski touring,sled,luge,sleigh,sledge,ski-joring,husky,horse,winter hiking,snowshoe,snowshoeing,ice,skating"},"piste/skitour":{name:"Ski Touring Trail",terms:"ski,skitour,crosscountry,ski touring,piste"},"piste/sled":{name:"Sled Piste",terms:"ski,sled,luge,sleigh,sledge,piste"},"piste/sleigh":{name:"Sleigh Piste",terms:"ski,piste,sled,luge,sleigh,sledge,ski-joring,husky,horse"},"place/farm":{name:"Farm",terms:""},"place/city_block":{name:"City Block",terms:""},"place/city":{name:"City",terms:""},"place/hamlet":{name:"Hamlet",terms:""},"place/island":{name:"Island",terms:"archipelago,atoll,bar,cay,isle,islet,key,reef"},"place/islet":{name:"Islet",terms:"archipelago,atoll,bar,cay,isle,islet,key,reef"},"place/isolated_dwelling":{name:"Isolated Dwelling",terms:""},"place/locality":{name:"Locality",terms:""},"place/neighbourhood":{name:"Neighborhood",terms:"neighbourhood"},"place/plot":{name:"Plot",terms:"tract,land,lot,parcel"},"place/quarter":{name:"Sub-Borough / Quarter",terms:"boro,borough,quarter"},"place/square":{name:"Square",terms:""},"place/suburb":{name:"Borough / Suburb",terms:"boro,borough,quarter"},"place/town":{name:"Town",terms:""},"place/village":{name:"Village",terms:""},"playground/balance_beam":{name:"Play Balance Beam",terms:""},"playground/basket_spinner":{name:"Basket Spinner",terms:"basket rotator"},"playground/basket_swing":{name:"Basket Swing",terms:""},"playground/climbing_frame":{name:"Climbing Frame",terms:""},"playground/cushion":{name:"Bouncy Cushion",terms:""},"playground/horizontal_bar":{name:"Play Horizontal Bar",terms:"high bar"},"playground/rocker":{name:"Spring Rider",terms:"spring rocker,springy rocker"},"playground/roundabout":{name:"Play Roundabout",terms:"merry-go-round"},"playground/sandpit":{name:"Sandpit",terms:""},"playground/seesaw":{name:"Seesaw",terms:""},"playground/slide":{name:"Slide",terms:""},"playground/structure":{name:"Play Structure",terms:""},"playground/swing":{name:"Swing",terms:""},"playground/zipwire":{name:"Zip Wire",terms:""},point:{name:"Point",terms:"node,other,vertex,vertices"},"power/sub_station":{name:"Substation",terms:""},"power/cable/underground":{name:"Underground Power Cable",terms:""},"power/generator":{name:"Power Generator",terms:"hydro,solar,turbine,wind"},"power/generator/method/photovoltaic":{name:"Solar Panel",terms:"photovoltaic module,PV module,sunlight"},"power/generator/source/hydro":{name:"Water Turbine",terms:"dam,generator,francis turbine,hydroelectricity,kaplan turbine,pelton turbine"},"power/generator/source/nuclear":{name:"Nuclear Reactor",terms:"fission,generator,nuclear,nuke,reactor"},"power/generator/source/wind":{name:"Wind Turbine",terms:"generator,turbine,windmill,wind"},"power/line":{name:"Power Line",terms:""},"power/minor_line":{name:"Minor Power Line",terms:""},"power/plant":{name:"Power Station Grounds",terms:"coal,gas,generat*,hydro,nuclear,power,station"},"power/pole":{name:"Power Pole",terms:""},"power/substation":{name:"Substation",terms:""},"power/switch":{name:"Power Switch",terms:""},"power/tower":{name:"High-Voltage Tower",terms:"power"},"power/transformer":{name:"Transformer",terms:""},"public_transport/platform_point":{name:"Transit Stop / Platform",terms:"platform,public transit,public transportation,transit,transportation"},"public_transport/platform":{name:"Transit Platform",terms:"platform,public transit,public transportation,transit,transportation"},"public_transport/platform/aerialway_point":{name:"Aerialway Stop / Platform",terms:"aerialway,cable car,platform,public transit,public transportation,transit,transportation"},"public_transport/platform/ferry_point":{name:"Ferry Stop / Platform",terms:"boat,dock,ferry,pier,platform,public transit,public transportation,transit,transportation"},"public_transport/platform/light_rail_point":{name:"Light Rail Stop / Platform",terms:"electric,light rail,platform,public transit,public transportation,rail,track,tram,trolley,transit,transportation"},"public_transport/platform/monorail_point":{name:"Monorail Stop / Platform",terms:"monorail,platform,public transit,public transportation,rail,transit,transportation"},"public_transport/platform/subway_point":{name:"Subway Stop / Platform",terms:"metro,platform,public transit,public transportation,rail,subway,track,transit,transportation,underground"},"public_transport/platform/train_point":{name:"Train Stop / Platform",terms:"platform,public transit,public transportation,rail,track,train,transit,transportation"},"public_transport/platform/tram_point":{name:"Tram Stop / Platform",terms:"electric,light rail,platform,public transit,public transportation,rail,streetcar,track,tram,trolley,transit,transportation"},"public_transport/platform/aerialway":{name:"Aerialway Platform",terms:"aerialway,cable car,platform,public transit,public transportation,transit,transportation"},"public_transport/platform/bus_point":{name:"Bus Stop",terms:"bus,platform,public transit,public transportation,transit,transportation"},"public_transport/platform/bus":{name:"Bus Platform",terms:"bus,platform,public transit,public transportation,transit,transportation"},"public_transport/platform/ferry":{name:"Ferry Platform",terms:"boat,dock,ferry,pier,platform,public transit,public transportation,transit,transportation"},"public_transport/platform/light_rail":{name:"Light Rail Platform",terms:"electric,light rail,platform,public transit,public transportation,rail,track,tram,trolley,transit,transportation"},"public_transport/platform/monorail":{name:"Monorail Platform",terms:"monorail,platform,public transit,public transportation,rail,transit,transportation"},"public_transport/platform/subway":{name:"Subway Platform",terms:"metro,platform,public transit,public transportation,rail,subway,track,transit,transportation,underground"},"public_transport/platform/train":{name:"Train Platform",terms:"platform,public transit,public transportation,rail,track,train,transit,transportation"},"public_transport/platform/tram":{name:"Tram Platform",terms:"electric,light rail,platform,public transit,public transportation,rail,streetcar,track,tram,trolley,transit,transportation"},"public_transport/platform/trolleybus_point":{name:"Trolleybus Stop",terms:"bus,electric,platform,public transit,public transportation,streetcar,trackless,tram,trolley,transit,transportation"},"public_transport/platform/trolleybus":{name:"Trolleybus Platform",terms:"bus,electric,platform,public transit,public transportation,streetcar,trackless,tram,trolley,transit,transportation"},"public_transport/station_aerialway":{name:"Aerialway Station",terms:"aerialway,cable car,public transit,public transportation,station,terminal,transit,transportation"},"public_transport/station_bus":{name:"Bus Station / Terminal",terms:"bus,public transit,public transportation,station,terminal,transit,transportation"},"public_transport/station_ferry":{name:"Ferry Station / Terminal",terms:"boat,dock,ferry,pier,public transit,public transportation,station,terminal,transit,transportation"},"public_transport/station_light_rail":{name:"Light Rail Station",terms:"electric,light rail,public transit,public transportation,rail,station,terminal,track,tram,trolley,transit,transportation"},"public_transport/station_monorail":{name:"Monorail Station",terms:"monorail,public transit,public transportation,rail,station,terminal,transit,transportation"},"public_transport/station_subway":{name:"Subway Station",terms:"metro,public transit,public transportation,rail,station,subway,terminal,track,transit,transportation,underground"},"public_transport/station_train_halt":{name:"Train Station (Halt / Request)",terms:"halt,public transit,public transportation,rail,station,track,train,transit,transportation,whistle stop"},"public_transport/station_train":{name:"Train Station",terms:"public transit,public transportation,rail,station,terminal,track,train,transit,transportation"},"public_transport/station_tram":{name:"Tram Station",terms:"electric,light rail,public transit,public transportation,rail,station,streetcar,terminal,track,tram,trolley,transit,transportation"},"public_transport/station_trolleybus":{name:"Trolleybus Station / Terminal",terms:"bus,electric,public transit,public transportation,station,streetcar,terminal,trackless,tram,trolley,transit,transportation"},"public_transport/station":{name:"Transit Station",terms:"public transit,public transportation,station,terminal,transit,transportation"},"public_transport/stop_area":{name:"Transit Stop Area",terms:""},"public_transport/stop_position_aerialway":{name:"Aerialway Stopping Location",terms:"aerialway,cable car,public transit,public transportation,transit,transportation"},"public_transport/stop_position_bus":{name:"Bus Stopping Location",terms:"bus,public transit,public transportation,transit,transportation"},"public_transport/stop_position_ferry":{name:"Ferry Stopping Location",terms:"boat,dock,ferry,pier,public transit,public transportation,transit,transportation"},"public_transport/stop_position_light_rail":{name:"Light Rail Stopping Location",terms:"electric,light rail,public transit,public transportation,rail,track,tram,trolley,transit,transportation"},"public_transport/stop_position_monorail":{name:"Monorail Stopping Location",terms:"monorail,public transit,public transportation,rail,transit,transportation"},"public_transport/stop_position_subway":{name:"Subway Stopping Location",terms:"metro,public transit,public transportation,rail,subway,track,transit,transportation,underground"},"public_transport/stop_position_train":{name:"Train Stopping Location",terms:"public transit,public transportation,rail,track,train,transit,transportation"},"public_transport/stop_position_tram":{name:"Tram Stopping Location",terms:"electric,light rail,public transit,public transportation,rail,streetcar,track,tram,trolley,transit,transportation"},"public_transport/stop_position_trolleybus":{name:"Trolleybus Stopping Location",terms:"bus,electric,public transit,public transportation,streetcar,trackless,tram,trolley,transit,transportation"},"public_transport/stop_position":{name:"Transit Stopping Location",terms:"public transit,public transportation,transit,transportation"},"railway/halt":{name:"Train Station (Halt / Request)",terms:"break,interrupt,rest,wait,interruption"},"railway/platform":{name:"Train Platform",terms:""},"railway/station":{name:"Train Station",terms:"train station,station"},"railway/tram_stop":{name:"Tram Stopping Position",terms:"light rail,streetcar,tram,trolley"},"railway/abandoned":{name:"Abandoned Railway",terms:""},"railway/buffer_stop":{name:"Buffer Stop",terms:"stop,halt,buffer"},"railway/construction":{name:"Railway Under Construction",terms:""},"railway/crossing":{name:"Railway Crossing (Path)",terms:"crossing,pedestrian crossing,railroad crossing,level crossing,grade crossing,path through railroad,train crossing"},"railway/derail":{name:"Railway Derailer",terms:"derailer"},"railway/disused":{name:"Disused Railway",terms:""},"railway/funicular":{name:"Funicular",terms:"venicular,cliff railway,cable car,cable railway,funicular railway"},"railway/level_crossing":{name:"Railway Crossing (Road)",terms:"crossing,railroad crossing,level crossing,grade crossing,road through railroad,train crossing"},"railway/light_rail":{name:"Light Rail",terms:"light rail,streetcar,trolley"},"railway/milestone":{name:"Railway Milestone",terms:"milestone,marker"},"railway/miniature":{name:"Miniature Railway",terms:"rideable miniature railway,narrow gauge railway,minimum gauge railway"},"railway/monorail":{name:"Monorail",terms:""},"railway/narrow_gauge":{name:"Narrow Gauge Rail",terms:"narrow gauge railway,narrow gauge railroad"},"railway/rail":{name:"Rail",terms:"rail line,railroad track,train track"},"railway/rail/highspeed":{name:"High-Speed Rail",terms:"bullet train,fast rail,high speed rail,highspeed rail,HSR"},"railway/signal":{name:"Railway Signal",terms:"signal,lights"},"railway/subway_entrance":{name:"Subway Entrance",terms:"metro,transit"},"railway/subway":{name:"Subway",terms:"metro,transit"},"railway/switch":{name:"Railway Switch",terms:"switch,points"},"railway/train_wash":{name:"Train Wash",terms:"wash,clean"},"railway/tram":{name:"Tram",terms:"light rail,streetcar,tram,trolley"},relation:{name:"Relation",terms:""},"route/ferry":{name:"Ferry Route",terms:""},"seamark/beacon_isolated_danger":{name:"Danger Beacon",terms:"beacon isolated danger,isolated danger beacon,iala"},"seamark/beacon_lateral":{name:"Channel Beacon",terms:"lateral beacon,beacon lateral,cevni,channel marker,iala,lateral mark"},"seamark/buoy_lateral":{name:"Channel Buoy",terms:"lateral buoy,buoy lateral,cevni,channel marker,iala,lateral mark"},"seamark/buoy_lateral/green":{name:"Green Buoy",terms:"lateral buoy,buoy lateral,cevni,channel marker,iala,lateral mark"},"seamark/buoy_lateral/red":{name:"Red Buoy",terms:"lateral buoy,buoy lateral,cevni,channel marker,iala,lateral mark"},"seamark/mooring":{name:"Mooring",terms:"dolphin,pile,bollard,buoy,post"},shop:{name:"Shop",terms:""},"shop/boutique":{name:"Boutique",terms:""},"shop/fashion":{name:"Fashion Store",terms:""},"shop/fishmonger":{name:"Fishmonger",terms:""},"shop/furnace":{name:"Furnace Store",terms:"oven,stove"},"shop/vacant":{name:"Vacant Shop",terms:""},"shop/agrarian":{name:"Farm Supply Shop",terms:"agricultural inputs,agricultural machines,seeds,pesticides,fertilizer,agricultural tools"},"shop/alcohol":{name:"Liquor Store",terms:"alcohol,beer,booze,wine"},"shop/anime":{name:"Anime Shop",terms:"manga,japan,cosplay,figurine,dakimakura"},"shop/antiques":{name:"Antiques Shop",terms:""},"shop/appliance":{name:"Appliance Store",terms:"air conditioner,appliance,dishwasher,dryer,freezer,fridge,grill,kitchen,oven,refrigerator,stove,washer,washing machine"},"shop/art":{name:"Art Store",terms:"art*,exhibit*,gallery"},"shop/baby_goods":{name:"Baby Goods Store",terms:""},"shop/bag":{name:"Bag/Luggage Store",terms:"handbag,purse"},"shop/bakery":{name:"Bakery",terms:"bread,cakes,rolls"},"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:"drinks"},"shop/bicycle":{name:"Bicycle Shop",terms:"bike,repair,tricycle,unicycle"},"shop/boat":{name:"Boat Store",terms:"fishing boat,jetski,motorboat,rowboat,sailboat,vessel,watercraft"},"shop/bookmaker":{name:"Bookmaker",terms:"betting,bookie"},"shop/books":{name:"Book Store",terms:""},"shop/butcher":{name:"Butcher",terms:"chicken,beef,lamb,meat,pork"},"shop/candles":{name:"Candle Shop",terms:"wax"},"shop/cannabis":{name:"Cannabis Shop",terms:"420,marijuana,pot,reefer,weed"},"shop/car_parts":{name:"Car Parts Store",terms:"automobile,automotive"},"shop/car_repair":{name:"Car Repair Shop",terms:"automobile,automotive,garage,service"},"shop/car":{name:"Car Dealership",terms:"automobile,automotive"},"shop/caravan":{name:"RV Dealership",terms:"auto,camper,recreational vehicle"},"shop/carpet":{name:"Carpet Store",terms:"rug"},"shop/catalogue":{name:"Catalog Shop",terms:""},"shop/charity":{name:"Charity Store",terms:"thrift,op shop,nonprofit"},"shop/cheese":{name:"Cheese Store",terms:""},"shop/chemist":{name:"Drugstore",terms:"apothecary,beauty,drug store,drugstore,gift,hair,med*,pharmacy,prescription,tooth"},"shop/chocolate":{name:"Chocolate Store",terms:"cocoa"},"shop/clothes":{name:"Clothing Store",terms:"blouses,boutique,bras,clothes,dresses,fashion,pants,shirts,shorts,skirts,slacks,socks,suits,underwear"},"shop/clothes/underwear":{name:"Underwear Store",terms:"boutique,bras,brassieres,briefs,boxers,fashion,lingerie,panties,slips,socks,stockings,underclothes,undergarments,underpants,undies"},"shop/coffee":{name:"Coffee Store",terms:""},"shop/computer":{name:"Computer Store",terms:"desktop,laptop,hardware,operating system,software"},"shop/confectionery":{name:"Candy Store",terms:"sweet"},"shop/convenience":{name:"Convenience Store",terms:""},"shop/copyshop":{name:"Copy Store",terms:"print,scan"},"shop/cosmetics":{name:"Cosmetics Store",terms:"make-up,makeup"},"shop/country_store":{name:"Country Store",terms:""},"shop/craft":{name:"Arts and Crafts Store",terms:"art*,paint*,frame"},"shop/curtain":{name:"Curtain Store",terms:"drape*,window"},"shop/dairy":{name:"Dairy Store",terms:"milk,egg,cheese"},"shop/deli":{name:"Deli",terms:"lunch,meat,sandwich"},"shop/department_store":{name:"Department Store",terms:""},"shop/doityourself":{name:"DIY Store",terms:""},"shop/dry_cleaning":{name:"Dry Cleaner",terms:""},"shop/e-cigarette":{name:"E-Cigarette Shop",terms:"electronic,vape,vaping,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/erotic/lgbtq":{name:"LGBTQ+ Erotic Store",terms:"sex,porn"},"shop/fabric":{name:"Fabric Store",terms:"sew"},"shop/farm":{name:"Produce Stand",terms:"farm shop,farm stand"},"shop/fireplace":{name:"Fireplace Store",terms:"fireplace,stove,masonry heater"},"shop/fishing":{name:"Fishing Shop",terms:"bait,fishing line,flies,fly,lure,reel,rod,tackle"},"shop/florist":{name:"Florist",terms:"flower"},"shop/frame":{name:"Framing Shop",terms:"art*,paint*,photo*,frame"},"shop/frozen_food":{name:"Frozen Food",terms:""},"shop/fuel":{name:"Fuel Shop",terms:""},"shop/funeral_directors":{name:"Funeral Home",terms:"undertaker,memorial home"},"shop/furniture":{name:"Furniture Store",terms:"chair,sofa,table"},"shop/games":{name:"Tabletop Game Store",terms:"board game,card game,dice game,game shop,live action role-playing game,miniatures wargame,strategy game"},"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/general":{name:"General Store",terms:"Village Shop"},"shop/gift":{name:"Gift Shop",terms:"souvenir"},"shop/greengrocer":{name:"Greengrocer",terms:"fruit,produce,vegetable"},"shop/hairdresser_supply":{name:"Hairdresser Supply Store",terms:"barber,shampoo,conditioner"},"shop/hairdresser":{name:"Hairdresser",terms:"barber"},"shop/hardware":{name:"Hardware Store",terms:""},"shop/health_food":{name:"Health Food Shop",terms:"wholefood,vitamins,vegetarian,vegan"},"shop/hearing_aids":{name:"Hearing Aids Store",terms:""},"shop/herbalist":{name:"Herbalist",terms:""},"shop/hifi":{name:"Hifi Store",terms:"audio,hi-fi,high fidelity,stereo,video"},"shop/houseware":{name:"Houseware Store",terms:"home,household,kitchenware"},"shop/hunting":{name:"Hunting Shop",terms:"arrows,bows,bullets,crossbows,rifles,traps"},"shop/interior_decoration":{name:"Interior Decoration Store",terms:""},"shop/jewelry":{name:"Jewelry Store",terms:"bracelet,diamond,earrings,gem,gold,jeweler,jewellery,jeweller,necklace,pins,ring,silver"},"shop/kiosk":{name:"Kiosk",terms:""},"shop/kitchen":{name:"Kitchen Design Store",terms:"cabinets,countertops,sinks"},"shop/laundry":{name:"Laundry",terms:""},"shop/laundry/self_service":{name:"Self-Service Laundry",terms:"Coin Laundry,Laundromat,Coin Wash,Launderette,Washateria"},"shop/leather":{name:"Leather Store",terms:""},"shop/lighting":{name:"Lighting Store",terms:"fluorescent lighting,lamps,LEDs,light fixtures,lightbulbs"},"shop/locksmith":{name:"Locksmith",terms:"key,lockpick"},"shop/lottery":{name:"Lottery Shop",terms:""},"shop/mall":{name:"Mall",terms:"shopping"},"shop/massage":{name:"Massage Shop",terms:""},"shop/medical_supply":{name:"Medical Supply Store",terms:""},"shop/mobile_phone":{name:"Mobile Phone Store",terms:""},"shop/money_lender":{name:"Money Lender",terms:""},"shop/motorcycle_repair":{name:"Motorcycle Repair Shop",terms:"auto,bike,garage,motorcycle,repair,service"},"shop/motorcycle":{name:"Motorcycle Dealership",terms:"bike"},"shop/music":{name:"Music Store",terms:"tape casettes,CDs,compact discs,vinyl records"},"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,outfitter,outdoor equipment,outdoor supplies"},"shop/outpost":{name:"Online Retailer Outpost",terms:"online,pick up,pickup"},"shop/paint":{name:"Paint Store",terms:""},"shop/party":{name:"Party Supply Store",terms:"balloons,costumes,decorations,invitations"},"shop/pastry":{name:"Pastry Shop",terms:"patisserie,cake shop,cakery"},"shop/pawnbroker":{name:"Pawn Shop",terms:""},"shop/perfumery":{name:"Perfume Store",terms:""},"shop/pet_grooming":{name:"Pet Grooming Store",terms:"cat,dog"},"shop/pet":{name:"Pet Store",terms:"animal,cat,dog,fish,kitten,puppy,reptile"},"shop/photo":{name:"Photography Store",terms:"camera,film"},"shop/pyrotechnics":{name:"Fireworks Store",terms:""},"shop/radiotechnics":{name:"Radio/Electronic Component Store",terms:"antenna,transistor"},"shop/religion":{name:"Religious Store",terms:""},"shop/scuba_diving":{name:"Scuba Diving Shop",terms:"diving,scuba"},"shop/seafood":{name:"Seafood Shop",terms:"fishmonger"},"shop/second_hand":{name:"Consignment/Thrift Store",terms:"secondhand,second hand,resale,thrift,used"},"shop/sewing":{name:"Sewing Supply Shop",terms:"haberdashery"},"shop/shoes":{name:"Shoe Store",terms:"boots,cleats,clogs,heels,loafers,oxfords,sneakers"},"shop/sports":{name:"Sporting Goods Store",terms:"athletics"},"shop/stationery":{name:"Stationery Store",terms:"card,paper"},"shop/storage_rental":{name:"Storage Rental",terms:"garages"},"shop/supermarket":{name:"Supermarket",terms:"grocery,store,shop"},"shop/tailor":{name:"Tailor",terms:"clothes,suit"},"shop/tattoo":{name:"Tattoo Parlor",terms:"ink"},"shop/tea":{name:"Tea Store",terms:""},"shop/ticket":{name:"Ticket Seller",terms:"box office"},"shop/tiles":{name:"Tile Shop",terms:""},"shop/tobacco":{name:"Tobacco Shop",terms:"cigarettes,cigars"},"shop/toys":{name:"Toy Store",terms:"games"},"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,VHS,video casette"},"shop/watches":{name:"Watches Shop",terms:""},"shop/water_sports":{name:"Watersport/Swim Shop",terms:""},"shop/water":{name:"Drinking Water Shop",terms:""},"shop/weapons":{name:"Weapon Shop",terms:"ammo,gun,knife,knives"},"shop/wholesale":{name:"Wholesale Store",terms:"warehouse club,cash and carry"},"shop/window_blind":{name:"Window Blind Store",terms:""},"shop/wine":{name:"Wine Shop",terms:""},tactile_paving:{name:"Tactile Paving",terms:"blind path,detectable warning surfaces,tactile ground surface indicators,tactile walking surface indicators,truncated domes,visually impaired path"},"telecom/data_center":{name:"Data Center",terms:"computer systems storage,information technology,server farm,the cloud,telecommunications"},"tourism/alpine_hut":{name:"Alpine Hut",terms:"climbing hut"},"tourism/apartment":{name:"Guest Apartment / Condo",terms:""},"tourism/aquarium":{name:"Aquarium",terms:"fish,sea,water"},"tourism/artwork":{name:"Artwork",terms:"mural,sculpture,statue"},"tourism/artwork/bust":{name:"Bust",terms:"figure"},"tourism/artwork/graffiti":{name:"Graffiti",terms:"Street Artwork,Guerilla Artwork,Graffiti Artwork"},"tourism/artwork/installation":{name:"Art Installation",terms:"interactive art,intervention art,modern art"},"tourism/artwork/mural":{name:"Mural",terms:"fresco,wall painting"},"tourism/artwork/sculpture":{name:"Sculpture",terms:"statue,figure,carving"},"tourism/artwork/statue":{name:"Statue",terms:"sculpture,figure,carving"},"tourism/attraction":{name:"Tourist Attraction",terms:""},"tourism/camp_site":{name:"Campground",terms:"tent,rv"},"tourism/caravan_site":{name:"RV Park",terms:"Motor Home,Camper"},"tourism/chalet":{name:"Holiday Cottage",terms:"holiday,holiday cottage,holiday home,vacation,vacation home"},"tourism/gallery":{name:"Art Gallery",terms:"art*,exhibit*,paint*,photo*,sculpt*"},"tourism/guest_house":{name:"Guest House",terms:"B&B,Bed and Breakfast"},"tourism/hostel":{name:"Hostel",terms:""},"tourism/hotel":{name:"Hotel",terms:""},"tourism/information":{name:"Information",terms:""},"tourism/information/board":{name:"Information Board",terms:""},"tourism/information/guidepost":{name:"Guidepost",terms:"signpost"},"tourism/information/map":{name:"Map",terms:""},"tourism/information/office":{name:"Tourist Information Office",terms:""},"tourism/information/route_marker":{name:"Trail Marker",terms:"cairn,painted blaze,route flag,route marker,stone pile,trail blaze,trail post,way marker"},"tourism/information/terminal":{name:"Information Terminal",terms:""},"tourism/motel":{name:"Motel",terms:""},"tourism/museum":{name:"Museum",terms:"art*,exhibit*,gallery,foundation,hall,institution,paint*,photo*,sculpt*"},"tourism/picnic_site":{name:"Picnic Site",terms:"camp"},"tourism/theme_park":{name:"Theme Park",terms:""},"tourism/trail_riding_station":{name:"Trail Riding Station",terms:""},"tourism/viewpoint":{name:"Viewpoint",terms:""},"tourism/wilderness_hut":{name:"Wilderness Hut",terms:"wilderness hut,backcountry hut,bothy"},"tourism/zoo":{name:"Zoo",terms:"animal"},"tourism/zoo/petting":{name:"Petting Zoo",terms:"Children's Zoo,Children's Farm,Petting Farm,farm animals"},"tourism/zoo/safari":{name:"Safari Park",terms:"Drive-Through Zoo,Drive-In Zoo"},"tourism/zoo/wildlife":{name:"Wildlife Park",terms:"indigenous animals"},traffic_calming:{name:"Traffic Calming",terms:"bump,hump,slow,speed"},"traffic_calming/bump":{name:"Speed Bump",terms:"hump,speed,slow"},"traffic_calming/chicane":{name:"Traffic Chicane",terms:"driveway link,speed,slow"},"traffic_calming/choker":{name:"Traffic Choker",terms:"speed,slow"},"traffic_calming/cushion":{name:"Speed Cushion",terms:"bump,hump,speed,slow"},"traffic_calming/dip":{name:"Dip",terms:"speed,slow"},"traffic_calming/hump":{name:"Speed Hump",terms:"bump,speed,slow"},"traffic_calming/island":{name:"Traffic Island",terms:"circle,roundabout,slow"},"traffic_calming/rumble_strip":{name:"Rumble Strip",terms:"audible lines,sleeper lines,growlers"},"traffic_calming/table":{name:"Speed Table",terms:"flat top,hump,speed,slow"},traffic_sign_vertex:{name:"Traffic Sign",terms:"road,highway"},traffic_sign:{name:"Traffic Sign",terms:"road,highway"},"traffic_sign/city_limit_vertex":{name:"City Limit Sign",terms:"town,village,hamlet,boundary,edge,border,road,highway"},"traffic_sign/city_limit":{name:"City Limit Sign",terms:"town,village,hamlet,boundary,edge,border,road,highway"},"traffic_sign/maxspeed_vertex":{name:"Speed Limit Sign",terms:"max speed,maximum speed,road,highway"},"traffic_sign/maxspeed":{name:"Speed Limit Sign",terms:"max speed,maximum speed,road,highway"},"type/multipolygon":{name:"Multipolygon",terms:""},"type/boundary":{name:"Boundary",terms:""},"type/boundary/administrative":{name:"Administrative Boundary",terms:""},"type/enforcement":{name:"Enforcement",terms:""},"type/public_transport/stop_area_group":{name:"Transit Stop Area Group",terms:""},"type/restriction":{name:"Restriction",terms:""},"type/restriction/no_left_turn":{name:"No Left Turn",terms:""},"type/restriction/no_right_turn":{name:"No Right Turn",terms:""},"type/restriction/no_straight_on":{name:"No Straight On",terms:""},"type/restriction/no_u_turn":{name:"No U-turn",terms:""},"type/restriction/only_left_turn":{name:"Only Left Turn",terms:""},"type/restriction/only_right_turn":{name:"Only Right Turn",terms:""},"type/restriction/only_straight_on":{name:"Only Straight On",terms:""},"type/restriction/only_u_turn":{name:"Only U-turn",terms:""},"type/route_master":{name:"Route Master",terms:""},"type/route":{name:"Route",terms:""},"type/route/bicycle":{name:"Cycle Route",terms:""},"type/route/bus":{name:"Bus Route",terms:""},"type/route/detour":{name:"Detour Route",terms:""},"type/route/ferry":{name:"Ferry Route",terms:""},"type/route/foot":{name:"Foot Route",terms:""},"type/route/hiking":{name:"Hiking Route",terms:""},"type/route/horse":{name:"Riding Route",terms:""},"type/route/light_rail":{name:"Light Rail Route",terms:""},"type/route/monorail":{name:"Monorail Route",terms:""},"type/route/pipeline":{name:"Pipeline Route",terms:""},"type/route/piste":{name:"Piste/Ski Route",terms:""},"type/route/power":{name:"Power Route",terms:""},"type/route/road":{name:"Road Route",terms:""},"type/route/subway":{name:"Subway Route",terms:""},"type/route/train":{name:"Train Route",terms:""},"type/route/tram":{name:"Tram Route",terms:""},"type/site":{name:"Site",terms:""},"type/waterway":{name:"Waterway",terms:""},"waterway/riverbank":{name:"Riverbank",terms:""},"waterway/boatyard":{name:"Boatyard",terms:""},"waterway/canal":{name:"Canal",terms:""},"waterway/canal/lock":{name:"Canal Lock",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/lock_gate":{name:"Lock Gate",terms:"canal"},"waterway/milestone":{name:"Waterway Milestone",terms:"milestone,marker"},"waterway/river":{name:"River",terms:"beck,branch,brook,course,creek,estuary,rill,rivulet,run,runnel,stream,tributary,watercourse"},"waterway/sanitary_dump_station":{name:"Marine Toilet Disposal",terms:"Boat,Watercraft,Sanitary,Dump Station,Pumpout,Pump out,Elsan,CDP,CTDP,Chemical Toilet"},"waterway/stream_intermittent":{name:"Intermittent Stream",terms:"arroyo,beck,branch,brook,burn,course,creek,drift,flood,flow,gully,run,runnel,rush,spate,spritz,tributary,wadi,wash,watercourse"},"waterway/stream":{name:"Stream",terms:"beck,branch,brook,burn,course,creek,current,drift,flood,flow,freshet,race,rill,rindle,rivulet,run,runnel,rush,spate,spritz,surge,tide,torrent,tributary,watercourse"},"waterway/water_point":{name:"Marine Drinking Water",terms:""},"waterway/waterfall":{name:"Waterfall",terms:"fall"},"waterway/weir":{name:"Weir",terms:""}}},imagery:{AGIV:{attribution:{text:"© agentschap Informatie Vlaanderen"},name:"AIV Flanders most recent aerial imagery"},AGIV10cm:{attribution:{text:"© agentschap Informatie Vlaanderen"},name:"AIV Flanders 2013-2015 aerial imagery 10cm"},AGIVFlandersGRB:{attribution:{text:"© agentschap Informatie Vlaanderen"},name:"AIV Flanders GRB"},AIV_DHMV_II_HILL_25cm:{attribution:{text:"© agentschap Informatie Vlaanderen"},name:"AIV Digitaal Hoogtemodel Vlaanderen II, multidirectionale hillshade 0,25 m"},AIV_DHMV_II_SVF_25cm:{attribution:{text:"© agentschap Informatie Vlaanderen"},name:"AIV Digitaal Hoogtemodel Vlaanderen II, Skyview factor 0,25 m"},Bing:{description:"Satellite and aerial imagery.",name:"Bing aerial imagery"},"DigitalGlobe-Premium":{attribution:{text:"Terms & Feedback"},description:"DigitalGlobe-Premium is a mosaic composed of DigitalGlobe basemap with select regions filled with +Vivid or custom area of interest imagery, 50cm resolution or better, and refreshed more frequently with ongoing updates.",name:"DigitalGlobe Premium Imagery"},"DigitalGlobe-Premium-vintage":{attribution:{text:"Terms & Feedback"},description:"Imagery boundaries and capture dates. Labels appear at zoom level 13 and higher.",name:"DigitalGlobe Premium Imagery Vintage"},"DigitalGlobe-Standard":{attribution:{text:"Terms & Feedback"},description:"DigitalGlobe-Standard is a curated set of imagery covering 86% of the earth’s landmass, with 30-60cm resolution where available, backfilled by Landsat. Average age is 2.31 years, with some areas updated 2x per year.",name:"DigitalGlobe Standard Imagery"},"DigitalGlobe-Standard-vintage":{attribution:{text:"Terms & Feedback"},description:"Imagery boundaries and capture dates. Labels appear at zoom level 13 and higher.",name:"DigitalGlobe Standard Imagery Vintage"},"DigitalGlobe-Vivid":{attribution:{text:"Terms & Feedback"},description:"DigitalGlobe-Vivid is a mosaic with optimal aesthetics and currency for any area on the globe, 50cm resolution or better, and image currency <20 month average globally.",name:"DigitalGlobe Vivid Imagery"},EOXAT2018CLOUDLESS:{attribution:{text:"Sentinel-2 cloudless - https://s2maps.eu by EOX IT Services GmbH (Contains modified Copernicus Sentinel data 2017 & 2018)"},description:"Post-processed Sentinel Satellite imagery.",name:"eox.at 2018 cloudless"},EsriWorldImagery:{attribution:{text:"Terms & Feedback"},description:"Esri world imagery.",name:"Esri World Imagery"},EsriWorldImageryClarity:{attribution:{text:"Terms & Feedback"},description:"Esri archive imagery that may be clearer and more accurate than the default layer.",name:"Esri World Imagery (Clarity) Beta"},MAPNIK:{attribution:{text:"© OpenStreetMap contributors, CC-BY-SA"},description:"The default OpenStreetMap layer.",name:"OpenStreetMap (Standard)"},Mapbox:{attribution:{text:"Terms & Feedback"},description:"Satellite and aerial imagery.",name:"Mapbox Satellite"},"OSM_Inspector-Addresses":{attribution:{text:"© Geofabrik GmbH, OpenStreetMap contributors, CC-BY-SA"},name:"OSM Inspector: Addresses"},"OSM_Inspector-Geometry":{attribution:{text:"© Geofabrik GmbH, OpenStreetMap contributors, CC-BY-SA"},name:"OSM Inspector: Geometry"},"OSM_Inspector-Highways":{attribution:{text:"© Geofabrik GmbH, OpenStreetMap contributors, CC-BY-SA"},name:"OSM Inspector: Highways"},"OSM_Inspector-Multipolygon":{attribution:{text:"© Geofabrik GmbH, OpenStreetMap contributors, CC-BY-SA"},name:"OSM Inspector: Area"},"OSM_Inspector-Places":{attribution:{text:"© Geofabrik GmbH, OpenStreetMap contributors, CC-BY-SA"},name:"OSM Inspector: Places"},"OSM_Inspector-Routing":{attribution:{text:"© Geofabrik GmbH, OpenStreetMap contributors, CC-BY-SA"},name:"OSM Inspector: Routing"},"OSM_Inspector-Tagging":{attribution:{text:"© Geofabrik GmbH, OpenStreetMap contributors, CC-BY-SA"},name:"OSM Inspector: Tagging"},SPW_ORTHO_LAST:{name:"SPW(allonie) most recent aerial imagery"},SPW_PICC:{name:"SPW(allonie) PICC numerical imagery"},"US-TIGER-Roads-2014":{description:"At zoom level 16+, public domain map data from the US Census. At lower zooms, only changes since 2006 minus changes already incorporated into OpenStreetMap",name:"TIGER Roads 2014"},"US-TIGER-Roads-2017":{description:"Yellow = Public domain map data from the US Census. Red = Data not found in OpenStreetMap",name:"TIGER Roads 2017"},"US-TIGER-Roads-2018":{description:"Yellow = Public domain map data from the US Census. Red = Data not found in OpenStreetMap",name:"TIGER Roads 2018"},US_Forest_Service_roads_overlay:{description:"Highway: Green casing = unclassified. Brown casing = track. Surface: gravel = light brown fill, Asphalt = black, paved = gray, ground =white, concrete = blue, grass = green. Seasonal = white bars",name:"U.S. Forest Roads Overlay"},UrbISOrtho2016:{attribution:{text:"Realized by means of Brussels UrbIS®© - Distribution & Copyright CIRB"},name:"UrbIS-Ortho 2016"},UrbISOrtho2017:{attribution:{text:"Realized by means of Brussels UrbIS®© - Distribution & Copyright CIRB"},name:"UrbIS-Ortho 2017"},UrbISOrtho2018:{attribution:{text:"Realized by means of Brussels UrbIS®© - Distribution & Copyright CIRB"},name:"UrbIS-Ortho 2018"},UrbisAdmFR:{attribution:{text:"Realized by means of Brussels UrbIS®© - Distribution & Copyright CIRB"},name:"UrbisAdm FR"},UrbisAdmNL:{attribution:{text:"Realized by means of Brussels UrbIS®© - Distribution & Copyright CIRB"},name:"UrbisAdm NL"},"Waymarked_Trails-Cycling":{attribution:{text:"© waymarkedtrails.org, OpenStreetMap contributors, CC by-SA 3.0"},name:"Waymarked Trails: Cycling"},"Waymarked_Trails-Hiking":{attribution:{text:"© waymarkedtrails.org, OpenStreetMap contributors, CC by-SA 3.0"},name:"Waymarked Trails: Hiking"},"Waymarked_Trails-MTB":{attribution:{text:"© waymarkedtrails.org, OpenStreetMap contributors, CC by-SA 3.0"},name:"Waymarked Trails: MTB"},"Waymarked_Trails-Skating":{attribution:{text:"© waymarkedtrails.org, OpenStreetMap contributors, CC by-SA 3.0"},name:"Waymarked Trails: Skating"},"Waymarked_Trails-Winter_Sports":{attribution:{text:"© waymarkedtrails.org, OpenStreetMap contributors, CC by-SA 3.0"},name:"Waymarked Trails: Winter Sports"},"basemap.at":{attribution:{text:"basemap.at"},description:"Basemap of Austria, based on government data.",name:"basemap.at"},"basemap.at-orthofoto":{attribution:{text:"basemap.at"},description:"Orthofoto layer provided by basemap.at. \"Successor\" of geoimage.at imagery.",name:"basemap.at Orthofoto"},"eufar-balaton":{attribution:{text:"EUFAR Balaton ortofotó 2010"},description:"1940 geo-tagged photography from Balaton Limnological Institute.",name:"EUFAR Balaton orthophotos"},"finds.jp_KBN_2500":{attribution:{text:"GSI KIBAN 2500"},description:"GSI Kiban 2500 via finds.jp. Good for tracing, but a bit older.",name:"Japan GSI KIBAN 2500"},"gsi.go.jp":{attribution:{text:"GSI Japan"},description:"Japan GSI ortho Imagery. Usually better than bing, but a bit older.",name:"Japan GSI ortho Imagery"},"gsi.go.jp_airphoto":{attribution:{text:"GSI Japan"},description:"Japan GSI airphoto Imagery. Not fully orthorectified, but a bit newer and/or differently covered than GSI ortho Imagery.",name:"Japan GSI airphoto Imagery"},"gsi.go.jp_seamlessphoto":{attribution:{text:"GSI Japan seamless photo"},description:"Japan GSI seamlessphoto Imagery. The collection of latest imageries of GSI ortho, airphoto, post disaster and others.",name:"Japan GSI seamlessphoto Imagery"},"gsi.go.jp_std_map":{attribution:{text:"GSI Japan"},description:"Japan GSI Standard Map. Widely covered.",name:"Japan GSI Standard Map"},"helsingborg-orto":{attribution:{text:"© Helsingborg municipality"},description:"Orthophotos from the municipality of Helsingborg 2016, public domain",name:"Helsingborg Orthophoto"},"kalmar-orto-2014":{attribution:{text:"© Kalmar municipality"},description:"Orthophotos for the north coast of the municipality of Kalmar 2014",name:"Kalmar North Orthophoto 2014"},"kalmar-orto-2016":{attribution:{text:"© Kalmar municipality"},description:"Orthophotos for the south coast of the municipality of Kalmar 2016",name:"Kalmar South Orthophoto 2016"},"kalmar-orto-2018":{attribution:{text:"© Kalmar municipality"},description:"Orthophotos for urban areas of the municipality of Kalmar 2018",name:"Kalmar Urban Orthophoto 2018"},kelkkareitit:{attribution:{text:"© Kelkkareitit.fi"},description:"Kelkkareitit.fi snowmobile trails from OSM (Nordic coverage)",name:"Nordic snowmobile overlay"},"lantmateriet-orto1960":{attribution:{text:"© Lantmäteriet, CC0"},description:"Mosaic of Swedish orthophotos from the period 1955–1965. Older and younger pictures may occur.",name:"Lantmäteriet Historic Orthophoto 1960"},"lantmateriet-orto1975":{attribution:{text:"© Lantmäteriet, CC0"},description:"Mosaic of Swedish orthophotos from the period 1970–1980. Is under construction.",name:"Lantmäteriet Historic Orthophoto 1975"},"lantmateriet-topowebb":{attribution:{text:"© Lantmäteriet, CC0"},description:"Topographic map of Sweden 1:50 000",name:"Lantmäteriet Topographic Map"},"linkoping-orto":{attribution:{text:"© Linköping municipality"},description:"Orthophotos from the municipality of Linköping 2010, open data",name:"Linköping Orthophoto"},mapbox_locator_overlay:{attribution:{text:"Terms & Feedback"},description:"Shows major features to help orient you.",name:"Locator Overlay"},openpt_map:{attribution:{text:"© OpenStreetMap contributors, CC-BY-SA"},name:"OpenPT Map (overlay)"},"osm-gps":{attribution:{text:"© OpenStreetMap contributors"},description:"Public GPS traces uploaded to OpenStreetMap.",name:"OpenStreetMap GPS traces"},"osm-mapnik-black_and_white":{attribution:{text:"© OpenStreetMap contributors, CC-BY-SA"},name:"OpenStreetMap (Standard Black & White)"},"osm-mapnik-german_style":{attribution:{text:"© OpenStreetMap contributors, CC-BY-SA"},name:"OpenStreetMap (German Style)"},"osmse-ekonomiska":{attribution:{text:"© Lantmäteriet"},description:"Scan of \"Economic maps\" ca. 1950–1980",name:"Lantmäteriet Economic Map 1950–1980"},qa_no_address:{attribution:{text:"Simon Poole, Data ©OpenStreetMap contributors"},name:"QA No Address"},skobbler:{attribution:{text:"© Tiles: skobbler Map data: OpenStreetMap contributors"},name:"skobbler"},skoterleder:{attribution:{text:"© Skoterleder.org"},description:"Snowmobile trails",name:"Snowmobile map Sweden"},"stamen-terrain-background":{attribution:{text:"Map tiles by Stamen Design, under CC BY 3.0. Data by OpenStreetMap, under ODbL"},name:"Stamen Terrain"},"stockholm-orto":{attribution:{text:"© Stockholm municipality, CC0"},description:"Orthophotos from the municipality of Stockholm 2016, CC0 license",name:"Stockholm Orthophoto"},"tf-cycle":{attribution:{text:"Maps © Thunderforest, Data © OpenStreetMap contributors"},name:"Thunderforest OpenCycleMap"},"tf-landscape":{attribution:{text:"Maps © Thunderforest, Data © OpenStreetMap contributors"},name:"Thunderforest Landscape"},"trafikverket-baninfo":{attribution:{text:"© Trafikverket, CC0"},description:"Swedish railway network, including sidings",name:"Trafikverket Railway Network"},"trafikverket-baninfo-option":{attribution:{text:"© Trafikverket, CC0"},description:"Swedish railway network with several options for map layers",name:"Trafikverket Railway Network options"},"trafikverket-vagnat":{attribution:{text:"© Trafikverket, CC0"},description:"Swedish NVDB road network",name:"Trafikverket Road Network"},"trafikverket-vagnat-extra":{attribution:{text:"© Trafikverket, CC0"},description:"Swedish NVDB extra details: Highway reference, traffic calming, rest area, bus stop, bridge, tunnel, speed camera",name:"Trafikverket Road Network extra"},"trafikverket-vagnat-navn":{attribution:{text:"© Trafikverket, CC0"},description:"Swedish NVDB street names",name:"Trafikverket Street Names"},"trafikverket-vagnat-option":{attribution:{text:"© Trafikverket, CC0"},description:"Swedish NVDB road network with several options for map layers",name:"Trafikverket Road Network options"}},community:{"bw-facebook":{name:"Mapping Botswana on Facebook",description:"Page of OpenStreetMap in Botswana"},"bw-twitter":{name:"Mapping Botswana on Twitter",description:"Twitter of OpenStreetMap in Botswana"},"ym-Centre-Universitaire-de-Recherche-et-dApplication-en-Tldtection-CURAT-de-lUniversit-Felix-Houphouet-Boigny":{name:"YouthMappers CURAT",description:"YouthMappers chapter at Centre Universitaire de Recherche et d'Application en Télédétection (CURAT) de l'Université Felix Houphouet Boigny",extendedDescription:"Our chapter aim is to promote the use of collaborative free mapping and the use of openstreetmap data in the field of research and their application in the implementation of tools for decision-making. Help students produce their own data of their research."},"ym-The-Gambia-YMCA-University-of-the-Gambia":{name:"Connected YouthMappers",description:"YouthMappers chapter at The Gambia YMCA / University of the Gambia",extendedDescription:"Connected YouthMappers is comprised of dedicated young Gambians who aspire to change and aid national development."},"cape-coast-youthmappers":{name:"University of Cape Coast YouthMappers",description:"Follow us on Twitter: {url}",extendedDescription:"This is the official handle for the Youth Mappers chapter of the University of Cape Coast, Ghana. we love maps, open data and helping the vulnerable."},"osm-gh-facebook":{name:"OpenStreetMap Ghana on Facebook",description:"Facebook group for people interested in OpenStreetMap.",extendedDescription:"Mappers in Ghana community, promoting OpenStreetMap and Humanitarian OpenStreetMap Team (HOT) projects in Ghana. Join us."},"osm-gh-twitter":{name:"OpenStreetMap Ghana on Twitter",description:"Follow us on Twitter: {url}"},"talk-gh":{name:"Talk-gh Mailing List",description:"Talk-gh is the official mailing list for Ghana OSM community."},"ym-Kwame-Nkrumah-University-of-Science-and-Technology":{name:"Kwame Nkrumah University of Science and Technology YouthMappers",description:"YouthMappers chapter at Kwame Nkrumah University of Science and Technology"},"ym-University-of-Cape-Coast":{name:"UCC Geographical Society",description:"YouthMappers chapter at University of Cape Coast",extendedDescription:"We are a society that encompasses all students who are reading and read geography in the Department of Geography and Regional Planning at the University of Cape Coast. Our main aim is to promote interest in the discipline inside and outside of the classroom. Our motto is “We comprehend the Earth and its inhabitants.”"},"ym-University-of-Energy-and-Natural-Resources":{name:"Eco-Club",description:"YouthMappers chapter at University of Energy and Natural Resources",extendedDescription:"To provide a sound education to all citizens about the deteriorating environment and provide utmost use of recreation of the environment for human survival."},"ym-University-of-Ghana":{name:"University of Ghana YouthMappers",description:"YouthMappers chapter at University of Ghana",extendedDescription:"UG YouthMappers consists of both graduate and undergraduate students possessing knowledge and skills in GIS and Remote Sensing. The club is composed of an energetic team that is poised to address social issues and mitigate environmental problems through mapping. Our fundamental principles are capacity building, empowerment and teamwork."},"ym-University-of-Mines-and-Technology":{name:"UMaT YouthMappers",description:"YouthMappers chapter at University of Mines and Technology",extendedDescription:"UMaT YouthMappers is a group of volunteer students who seek to grant students the opportunity to improve skills in the field of mapping & creating open geographic data and analyses that address locally defined development challenges worldwide."},"ym-General-Lansana-Conte-University":{name:"YouthMappers General Lansana Conte University",description:"YouthMappers chapter at General Lansana Conte University",extendedDescription:"The YouthMappers of the University General Lansana Conté is a non profit community willing to contribute to Map Guinea and others part of the world. We are promoting the use of GIS and Open data to build decision support tools. We also work to build capacities among the students and local communities."},"ym-Institute-of-Science-and-Veterinary-Medicine":{name:"YouthMappers ISSMV Dalaba",description:"YouthMappers chapter at Institute of Science and Veterinary Medicine",extendedDescription:"YouthMappers ISSMV Dabala is a non profit organisation working to promote humanitarian mapping and the use of open sources and open data to build decision making tools in Guinea."},"ym-Universit-de-NZrkor":{name:"Youthmappers à N'Zérékoré",description:"YouthMappers chapter at Université de N'Zérékoré",extendedDescription:"YouthMappers est un groupe qui permet de faire la cartographie des communautés enclavées et à la prise des décisions en cas de catastrophes ou épidémies. Elle permet aussi la production et l'utilisation des données en accès gratuit."},"ym-Dedan-Kimathi-University-of-Technology":{name:"GDEV",description:"YouthMappers chapter at Dedan Kimathi University of Technology",extendedDescription:"GDEV is a group of enthusiastic GIS group at DeKUT that aims at helping students share, engage and learn from each other in matters geospatial"},"ym-Jomo-Kenyatta-University-of-Agriculture-and-Technology":{name:"Association of Geomatics Engineering Students",description:"YouthMappers chapter at Jomo Kenyatta University of Agriculture and Technology",extendedDescription:"The Association of Geomatics Engineering Students (AGES), aims at promoting GIS products and services as well as training students on the use of the same. It not only promotes socialization between the students and practicing professionals, but also provides a platform for exchanging new ideas for holding new GIS and surveying events and training at the university."},"ym-Karatina-University":{name:"Nature Club Karatina University",description:"YouthMappers chapter at Karatina University",extendedDescription:"This chapter aims to bring together all GIS enthusiasts.They include environment experts, wildlife experts, aquatic and tourism officers, just to mention a few. Its main aim is to provide a platform where students can learn from each other and, in the process, understand how to integrate the GIS skills in their various career paths as well as provide solutions to various environmental related challenges."},"ym-Kenyatta-University":{name:"Kenyatta University GIS Club",description:"YouthMappers chapter at Kenyatta University",extendedDescription:"Kenyatta University GIS Club (KUGISC) was founded on 28th October 2016, with more than 200 students and staff from all faculty within campus as members. We are committed to empower members with spatial knowledge, skills and expertise required in understanding the Earth. We help in mapping resources within the university by incorporating geospatial data in their projects as well as fieldwork data collection."},"ym-Moi-University":{name:"Geography Students Association",description:"YouthMappers chapter at Moi University",extendedDescription:"The Geography Students Association at Moi University (GEOSAMU) explores, discovers and aims at developing the entire world through the young Geo-Spatial analysts.  GEOSAMU is part of the Department of Geography."},"ym-Technical-University-of-Kenya":{name:"Geospatial Science Student Association",description:"YouthMappers chapter at Technical University of Kenya",extendedDescription:"It's a geographical information based group with very passionate students in the relevant fields of study. We do training to members on emerging trends in the market and keep up with technological advancements"},"ym-University-of-Nairobi":{name:"Geospatial Engineering Students Association",description:"YouthMappers chapter at University of Nairobi",extendedDescription:"UN students are working with the local OSM community, Map Kibera, and GrouthTruth to learn about open mapping and contribute data for needs in their urban communities."},"ym-African-Methodist-Episcopal-University":{name:"YouthMappers-AMEU",description:"YouthMappers chapter at African Methodist Episcopal University"},"ym-Cuttington-University":{name:"Cuttington University YouthMappers",description:"YouthMappers chapter at Cuttington University",extendedDescription:"The YouthMappers at Cuttington University, Suakoko, and Bong County comprised of Students from three different departments; namely, the Department of Natural Resources Management “DONRM”, Department of Environmental Sciences, and the Department of Natural Sciences. Since the establishment of the Chapter in February 2017, the overall membership is  20 students, with each department containing 5 students."},"ym-Grand-Gedeh-County-Community-College":{name:"YouthMappers at Grand Gedeh County Community College",description:"YouthMappers chapter at Grand Gedeh County Community College",extendedDescription:"The Youth Mappers of GGCCC sole intent is to put  places in and around Liberia  that are not on the map. We gather youths from the college within the Grand Gedeh Community College to make it their duties to unite and bring these places to the spot light geographically."},"ym-Nimba-County-Community-College":{name:"Nimba County Community College Youth Mappers",description:"YouthMappers chapter at Nimba County Community College"},"ym-Stella-Maris-Polytechnic":{name:"YouthMappers-SMP",description:"YouthMappers chapter at Stella Maris Polytechnic"},"ym-University-of-Liberia-YouthMappers":{name:"University of Liberia YouthMappers",description:"YouthMappers chapter at University of Liberia YouthMappers",extendedDescription:"The University of Liberia YouthMappers is a chapter organization of the Global YouthMappers. We are a nonprofit student mapping organization focus on mapping for Liberia’s development and the World at large. The purpose of this organization shall be to utilize technology and geospatial knowledge as means of creating and developing maps; collecting and analyzing data that will address local and worldwide challenges. Our aim is to support and create opportunity for students to develop interest and skills in the fields of mapping. We envision a united student community that are collaborative, active and are willing to work with the University of Liberia YouthMappers in order to better the lives of others."},"osm-mg-facebook":{name:"OpenStreetMap Madagascar Facebook Group",description:"Malagasy Facebook group for people interested in OpenStreetMap."},"talk-mg":{name:"Talk-mg Mailing List",description:"Place for OpenStreetMap contributors, communities and users in Madagascar to share and discuss."},"ym-University-of-Malawi":{name:"Chanco Malawi YouthMappers",description:"YouthMappers chapter at University of Malawi",extendedDescription:"Chanco Malawi YouthMappers is the student mapping organization for the University of Malawi's Chancellor College. The students in this chapter focus on mapping for Malawi's development and science needs."},"ym-Universit-des-Sciences-Sociale-et-de-Gestion-de-Bamako":{name:"Etudiant au Laboratoire HoPE",description:"YouthMappers chapter at Université des Sciences Sociale et de Gestion de Bamako"},"ym-Universidade-Eduardo-Mondlane":{name:"Comunidade YouthMappers Moçambique",description:"YouthMappers chapter at Universidade Eduardo Mondlane",extendedDescription:"We are a student group that intends to join Mozambican society to create a resilient community of humanitarian mapping. The community intend to map the physical occupation of our Country and create open geographic data, accessible to the public and able to be used in several areas without associated costs."},"ym-Namibia-University-of-Science-and-Technology":{name:"Geoinformation Technology Student Society",description:"YouthMappers chapter at Namibia University of Science and Technology"},"ym-Abia-State-University":{name:"AbsuMappersTeam",description:"YouthMappers chapter at Abia State University",extendedDescription:"AbsuMappersTeam is  voluntary team of map enthusiast ,using openstreetmap,GIS and other open source geospatial techno;ogy to solve problems.It is a dedicated for disaster response using OpenStreetMap.It is a  professional mentoring  and empowerment platform for  those with passion for GIS and Mapping.It is a community of  volunteers for geospatial data creation,field data collection and mapping.The team was co-founded by Victor N.Sunday(the Team mentor) and Professor J.U.Ogbonna ,the team coordinator and faculty Advisor. AbsuMapperTeam is an affiliate of UniiqueMappersTeam-Port Harcourt.The team stands to support sustainable development using geospatial  technology"},"ym-Ahmadu-Bello-University":{name:"ABU Geomappers",description:"YouthMappers chapter at Ahmadu Bello University",extendedDescription:"We are a group of Data driven Humanitarian mappers, who are dedicated to rendering humanitarian service in response to disaster and mitigation. We are glad to contribute our expertise and knowledge through mapping, and helping to spread #OpenEvangelism through Training, and collaboration."},"ym-Federal-School-of-Surveys":{name:"OyoMappersTeam (OMT) Oyo",description:"YouthMappers chapter at Federal School of Surveys"},"ym-Federal-University-of-Technology-Akure":{name:"YouthMappers Futa Space Club",description:"YouthMappers chapter at Federal University of Technology, Akure",extendedDescription:"Our mission is to raise the next generation of Space Leaders. Activities include research and capacity building in Remote Sensing, GIS, Climate Change, Astronomy, Cosmology, Space Engineering, Global Navigation, Robotics and Space Education."},"ym-Ignatius-Ajuru-University-of-Education":{name:"IgnatiusMappersTeam (IMT)",description:"YouthMappers chapter at Ignatius Ajuru University of Education",extendedDescription:"We are a YouthMappers Chapter of Ignatius Ajuru University of Education involved in crowdsourced mapping of our environment and remote mapping of resilient communities.We are a team of volunteers using openstreetmap and other open Geospatial source for mapping."},"ym-University-of-Nigeria-Nsukka":{name:"LionMappersTeam (LMT) Nsukka",description:"YouthMappers chapter at University of Nigeria, Nsukka",extendedDescription:"The LionMappersTeam is an affiliate of YouthMappers Network, with the sole aim of providing members the opportunity to learn and improve their skills in the field of mapping science and to create open geographic data and analysis that addresses locally defined challenges globally. It is a team of volunteers for crowdsourced mapping and geographic information provision using Openstreetmap, citizen science  and other geospatial  technology for research, training and response to resilient community challenges. We are involved in GIS and Remote Sensing Applications and Research.Paticipatory GIS and Citizen Science,field mapping ,training workshops and outreaches to High Schools."},"ym-University-of-Port-Harcourt":{name:"UniqueMappersTeam (UMT) Port Harcourt",description:"YouthMappers chapter at University of Port Harcourt",extendedDescription:"UniqueMappersTeam(UMT)Port Harcourt  is an action group and a team of volunteers for a collaborative online mapping targeted at training and empowering members with trending mapping skills  to create open geospatial data and analysis that addresses locally defined challenges for geoinformation and to provide humanitarian mapping  services to resilient communities in Niger Delta,Nigeria and elsewhere.We promote Crowdsoucred Mapping and Geographic information volunteering using OpenStreetMap(OSM) platform and other accessible platforms for Rapid Response Mapping,Disaster Mapping,Geo-intelligence Mapping,Map updates and training.Its an affiliate Campus chapter of Humanitarian OpenStreetMap Team(HOT).It is a project-task team of YouthMappers that provide opportunity for members to learn and improve their skills in Geoinformatics so as to explore global opportunities in the field of Mapping and Geoinformation."},"ym-University-of-Nigeria-Enugu-Campus":{name:"LionMappersTeam (LMT) Enugu",description:"YouthMappers chapter at University of Nigeria, Enugu Campus",extendedDescription:"The LionMappersTeam(LMT)Enugu Campus is an affiliate of YouthMappers Network, with the sole aim of providing members the opportunity to learn and improve their skills in the field of Geoinformatics and to create open geographic data and analysis that addresses locally defined challenges globally. It is a team of volunteers for Crowdsourced Mapping and Geographic Information provision using Openstreetmap, Citizen Science and other Geospatial Technology for research, training and response to resilient community challenges. We are involved in Web-Cartography, GIS and Remote Sensing Applications and ResearchWe are passionate about Volunteered Geographic Information.Paticipatory GIS and Citizen Science.Our major activities include online crowdsourced-Cartography, Field Mapping ,Training workshops and outreaches to High School as well as Humanitarian/Disaster Response Mapping."},"ym-Insititue-d-Enseignement-Superieur-de-Ruhengeri":{name:"YouthMappers at INES Ruhengeri",description:"YouthMappers chapter at Insititue d' Enseignement Superieur de Ruhengeri",extendedDescription:"We are students from Land Administration and Management and Land survey Departments from INES-Ruhengeri. We are engaged in mapping activities that create the changes toward sustainable development in our community."},"ym-University-of-Rwanda-Huye-Campus":{name:"Rwanda YouthMappers",description:"YouthMappers chapter at University of Rwanda - Huye Campus",extendedDescription:"Based on the commitment and the purpose of promoting mapping, and the information from YouthMappers public talks, we have organized as students in Geography department who are committed in mapping to found a chapter of our Campus. We have supported by our Facilitator Dr. Gaspard Rwanyiziri (Director of CGIS-Rwanda) and various lecturer mentors."},"ym-Institut-Suprieur-de-Management-Kolda":{name:"Les Femmes Leaders de ISM/Kolda",description:"YouthMappers chapter at Institut Supérieur de Management Kolda",extendedDescription:"Les Femmes Leaders de ISM/Kolda is an all-female mapping group in southern Senegal looking to put Kolda and surrounding villages on the map and better understand how to use OSM."},"ym-Universit-Gaston-Berger":{name:"YouthMappers at UGB",description:"YouthMappers chapter at Université Gaston Berger",extendedDescription:"YouthMappers UGB is made up of young students and researchers who are passionate about mapping. Our aim is to improve students' skills in the field of cartography and to participate in the creation of open geographic data that responds to development challenges around the world and particularly in Africa."},"ym-Fourah-Bay-College":{name:"Student's Geographical Association",description:"YouthMappers chapter at Fourah Bay College",extendedDescription:"The Student's Geographical Association- YouthMappers is an association of Fourah Bay College Students with the common goals of mapping out vulnerable places in Sierra Leone and the world at large for relief and other beneficial purposes,carry out Research and other educative endeavors. The chapter consists of young people with great ideas, development oriented with the capacity to relate with each other, comprehend and implement sustainable developmental projects as a team."},"ym-Njala-University-Freetown-Campus":{name:"Njala Freetown YouthMappers",description:"YouthMappers chapter at Njala University, Freetown Campus",extendedDescription:"We are students of Njala University Freetown Campus, studying Information Technology under the department of Physics and Computer Science. and we are located at Henry Street Freetown, Sierra Leone."},"ym-Njala-University-Njala-Campus":{name:"YouthMappers Njala University, Njala Campus",description:"YouthMappers chapter at Njala University, Njala Campus"},"ym-University-of-Pretoria":{name:"Centre for Geoinformation Science",description:"YouthMappers chapter at University of Pretoria",extendedDescription:"The students who map Pretoria are supported by the University of Pretoria's Centre for Geoinformation Science, a platform from where the excellence of UP individuals and teams involved in geographic information science (GISc) research, education and training, professional development and community engagement is encouraged and strengthened through collaborations, education and training and  alliances within South Africa and abroad."},"ym-Ardhi-University":{name:"ARU Mapper",description:"YouthMappers chapter at Ardhi University",extendedDescription:"As upcoming geospatial data consultants we seek to educate and provide advice to the society on how they can use spatial data not only as a form of location but a tool of decision making and predict different hazardous and climatical changes which may harm them or future genarations."},"ym-Institute-of-Finance-Management":{name:"IFM mappers",description:"YouthMappers chapter at Institute of Finance Management",extendedDescription:"This is a new  chapter at out institute and we are looking forward to use our financial education that we are receiving here at the campus  and link ig with the environment in order to develop our sustainable environment towards helping the community  with the effects of our environment in a financial ways by converting them into numbers. this is widely explained in ecosystem accounting and environmental accounts"},"ym-Institute-of-Rural-Development-Planning-Mwanza":{name:"Youth Mappers Chapter at Institute of Rural Development Planning - Lake Zone Centre",description:"YouthMappers chapter at Institute of Rural Development Planning Mwanza"},"ym-Institute-of-Rural-Development-Planning":{name:"Mipango YouthMappers Chapter",description:"YouthMappers chapter at Institute of Rural Development Planning",extendedDescription:"Mipango YouthMappers Chapter was introduced at IRDP on 3rd July, 2017 by Dr.Domitilla Bashemera. The founding members were  300 (190 males and 110 female) Bachelor Degree students, who were registered as members of the Chapter. Gerald Zacharia is the president of the chapter and Juster Lugira is Vice President."},"ym-Open-University-of-Tanzania":{name:"Youth Mappers at Open University of Tanzania",description:"YouthMappers chapter at Open University of Tanzania",extendedDescription:"Youth Mappers at Open University of Tanzania\n\nHad been founded by members and students of Open University of Tanzania in Department of Geography who are mainly need to improve their career and help young community through joint and partnership projects with local community groups such as Mikoko Scout Group (www.msg.or.tz) and start cooperation with international colleges and universities for exchange programs in relation to Geography Studies as some programs prepared by Mikoko Scout Group which will link local university and other universities of the same interest through International Nature & Environmental Youth Camp 2019 (www.campsite.msg.or.tz/nature.html )\n\nOur chapter will soon be recognized as youth network program that will open opportunity for students to study and conduct research studies at a local levels."},"ym-Sokoine-University-of-Agriculture":{name:"SMCoSE YouthMappers",description:"YouthMappers chapter at Sokoine University of Agriculture",extendedDescription:"A Chapter comprising of Environmental sciences and management students and Geography studies under the dept. of Geography and  we will be using mapping techniques, based on systems concepts and theories, can be used to facilitate, explore, and capture the different understandings of the relationships, perspectives, and boundaries involved in environmental sustainability to obtain a more complete comprehension of the concept and develop plans for action."},"ym-University-of-Dar-es-Salaam":{name:"YouthMappers at University of Dar es Salaam",description:"YouthMappers chapter at University of Dar es Salaam",extendedDescription:"The purpose of the University of Dar es Salaam YouthMappers  is to use and promote open source data and GIS technologies to map potential disaster areas, provide resources for emergency management, connect its members with open source and GIS organizations in the city of Dar es Salaam, and serve any upcoming needs of our project partners ."},"ym-Busitema-University":{name:"Good Mappers",description:"YouthMappers chapter at Busitema University",extendedDescription:"Good mappers is a team of students in Busitema University. Its main objective is to create a community of experienced mappers who can contribute to the world map."},"ym-Gulu-University":{name:"CSGU Mappers",description:"YouthMappers chapter at Gulu University",extendedDescription:"The CSGU Mappers are the Computing Society at Gulu University. This chapter is creative, passionate, innovative and ready to map Uganda and the world at large, beyond other people's imagination."},"ym-Kumi-University":{name:"Ever Last YouthMappers",description:"YouthMappers chapter at Kumi University",extendedDescription:"This energetic group of students organizes within the faculty of Science and Information Technology."},"ym-Makerere-University":{name:"Geo YouthMappers",description:"YouthMappers chapter at Makerere University",extendedDescription:"Geo YouthMappers is a Makerere University based mapping chapter esteemed to apply the spatial conception to the real world.We have collaborated on various mapping events with OSM. Our main aim is the desire to simplify data and make it readily available mostly for disaster preparedness.\"We map the world and change lives."},"ym-Mbarara-University-of-Science-and-Technology":{name:"MUST Street Mappers",description:"YouthMappers chapter at Mbarara University of Science and Technology",extendedDescription:"MUST Street Mappers is a Youth Mappers chapter at the Mbarara University of Science and Technology that is based on making our country and the world at large a better place through mapping. We base on collected information to notice patterns and data mine to present relevant and beneficial information to society."},"ym-St.-Augustine-International-University":{name:"YouthMappers at St Augustine International University",description:"YouthMappers chapter at St. Augustine International University"},"ym-Uganda-Christian-University-Mbale-Campus":{name:"Mappers for Life",description:"YouthMappers chapter at Uganda Christian University Mbale Campus",extendedDescription:"We are Team Mappers for life! Please come and join us as we map together!\" This group works from the Department of Information Technology at the UCU."},"ym-Uganda-Pentecostal-University":{name:"HiTech Youth Mappers",description:"YouthMappers chapter at Uganda Pentecostal University",extendedDescription:"A new Youthmappers Chapter in Western Uganda. Ready to map and provide open data with OpenStreetMap for development purposes."},"ym-St.-Mawaggali-Trades-Training-Institute":{name:"MawaggaliMappers",description:"YouthMappers chapter at St. Mawaggali Trades Training Institute",extendedDescription:"We are the youthappers chapter at St. Mawaggali trades in choma who are want to contribute the different humantarian tasks to serve lives through mapping."},"ym-The-University-of-Zambia":{name:"YouthMappers Unza",description:"YouthMappers chapter at The University of Zambia"},"ym-University-of-Zimbabwe":{name:"UZMappers",description:"YouthMappers chapter at University of Zimbabwe",extendedDescription:"UzMappersTeam Zimbabwe is a team of Volunteers using OpenStreetMap for Open Data Mapping and Humanitarian Disaster response mapping .The team empowers its members with open source geospatial technology skills."},"OSM-BGD-facebook":{name:"OpenStreetMap Bangladesh",description:"Improve OpenStreetMap in Bangladesh",extendedDescription:"Mapping in Bangladesh? Have questions, want to connect with the community here? Join us at {url}. All are welcome!"},"ym-Asian-University-for-Women":{name:"YouthMappers at AUW",description:"YouthMappers chapter at Asian University for Women",extendedDescription:"The Asian University for Women seeks to graduate women who will be skilled and innovative professionals, service-oriented leaders in the businesses and communities in which they will work and live, and promoters of intercultural understanding and sustainable human and economic development in Asia and throughout the world."},"ym-Dhaka-College":{name:"YouthMappers Daka College",description:"YouthMappers chapter at Dhaka College",extendedDescription:"YouthMappers DhakaCollege is an approach by students to help mapping vulnerable areas of the world as a part of Humanitarian Action. YouthMappers  gives the opportunity to the students for helping people and using mapping for humanitarian purposes. This open geographic data can be used for educational, navigational and other humanitarian purposes. Happy mapping."},"ym-Dhaka-University":{name:"Openstreetmap YouthMappers",description:"YouthMappers chapter at Dhaka University",extendedDescription:"It's a great privilege for the students of University of Dhaka to map for humanitarian purposes. Our chapter gives the opportunity to the students for helping people and use mapping for humanitarian purposes."},"ym-Eastern-University":{name:"YouthMappers at Eastern University",description:"YouthMappers chapter at Eastern University",extendedDescription:"YouthMappers at Eastern University, Bangladesh has been formed with a view to assisting people during humanitarian crisis. The students, likewise other mappers of the world, are promised to assist people in using the map for educational, navigational and other humanitarian purposes."},"ym-Jahangirnagar-University":{name:"YouthMappers at IRS, Jahangirnagar University",description:"YouthMappers chapter at Jahangirnagar University"},"ym-Khulna-University":{name:"Openstreetmap",description:"YouthMappers chapter at Khulna University",extendedDescription:"KU students and faculty from multiple disciplines are experienced at creating open data for OSM to address local challenges of development, including food security and other topics."},"ym-Rajshahi-University-of-Engineering-Technology":{name:"YouthMappers at RUET",description:"YouthMappers chapter at Rajshahi University of Engineering & Technology",extendedDescription:"The \"YouthMappers at RUET\" is a humanitarian mapping group of students of Rajshahi University of Engineering & Technology (RUET) to share, develop and practice the knowledge of GIS.  This group encourages using open source geospatial data and platform to make solution to reach the most vulnerable group of the world."},"ym-Sherubtse-College":{name:"Geographical Society",description:"YouthMappers chapter at Sherubtse College",extendedDescription:"The Geographical Society, in the Department of Geography & Planning, Sherubtse College, Royal University of Bhutan, with support from the Center for Climate Change and Spatial Information, has made several efforts to create awareness and address important issues at the local and national level. We now join hands with the international student-centered YouthMappers network on \"Mapping for Resilience\" and contributing to a global 'Happiness'!"},"OSM-India-facebook":{name:"OpenStreetMap India - Participatory neighborhood mapping",description:"Improve OpenStreetMap in India",extendedDescription:"Mapping in India? Have questions, want to connect with the community here? Join us at {url}. All are welcome!",events:{sotmasia2018:{name:"State of the Map Asia 2018",description:"Join the 2018 OpenStreetMap region-wide event at State of the Map Asia in India",where:"Indian Institute of Management, Bangalore, India"}}},"osm-india-forum":{name:"OpenStreetMap India forum",description:"OpenStreetMap India web forum"},"osm-india-github":{name:"OpenStreetMap India GitHub",description:"Code with us: {url}"},"OSM-india-mailinglist":{name:"OpenStreetMap India Mailinglist",description:"Talk-in is the official Mailinglist for Indian Community"},"osm-india-telegram":{name:"OpenStreetMap India Telegram",description:"Join our family: {url}"},"OSM-india-twitter":{name:"OpenStreetMap India Twitter",description:"We are just a tweet away: {url}"},"osm-india-website":{name:"OpenStreetMap India",description:"Mappers and OpenStreetMap users in India"},"osm-india-wiki":{name:"OpenStreetMap Wikiproject India",description:"Everything you need to know about mapping in India: {url}"},"osm-india-youtube":{name:"OpenStreetMap India Youtube",description:"Subscribe to our channel: {url}"},"OSM-India-Puducherry-Facebook":{name:"Free Software Hardware Movement - Facebook",description:"FSHM Facebook page to know about community events, activities",extendedDescription:"FSHM organizes events relating to free software/hardware, technology, activism and OpenStreetMap. Its FB page is the best way to keep in contact with its events."},"OSM-Puducherry-Mailing-List":{name:"Free Software Hardware Movement - Mailing List",description:"FSHM Puducherry mailing list to discuss mapping in Puducherry and other things.",extendedDescription:"FSHM organizes events relating to free software/hardware, technology, activism and OpenStreetMap."},"OSM-India-Puducherry-Matrix":{name:"Free Software Hardware Movement - Matrix",description:"FSHM Riot group to discuss, share and update mapping activities, events in and around Puducherry",extendedDescription:"FSHM community members share their OSM mapping updates / experiences through the Riot.im group, this group is also used to discuss things related to free software / hardware, technology and activism."},"ym-Gujarat-University":{name:"CCIM at Ahmedabad",description:"YouthMappers chapter at Gujarat University"},"OSM-IDN-facebook":{name:"OpenStreetMap Indonesia",description:"Improve OpenStreetMap in Indonesia",extendedDescription:"Mapping in Indonesia? Have questions, want to connect with the community here? Join us at {Url}. All are welcome!"},"ym-Universitas-Negeri-Makassar":{name:"Kontur Geografi",description:"YouthMappers chapter at Universitas Negeri Makassar"},"ym-University-Muhammadiyah-Surakarta":{name:"SpaceTime",description:"YouthMappers chapter at University Muhammadiyah Surakarta",extendedDescription:"SpaceTime is a community mapping in the Faculty of Geography of Muhammadiyah University of Surakarta. SpaceTime was founded by Bruce Maldy Pratama, Mukhlis Akbar and Irfandi Fauzi. They are active students in the Faculty of Geography University Muhammadiyah Surakarta."},"osm-iran-aparat":{name:"OpenStreetMap Iran Aparat",description:"Subscribe to our channel at {url}",extendedDescription:"A good resource of videos about anything related to OpenStreetMap. Mainly in Persian."},"osm-iran-forum":{name:"OpenStreetMap Iran web forum",description:"OpenStreetMap Iran web forum",extendedDescription:"A web forum for OpenStreetMap users in Iran. Feel free to ask questions and discuss with others!"},"osm-iran-telegram":{name:"OpenStreetMap Iran Telegram",description:"You're welcome to join our Telegram channel at {url}. We also have a supergroup of many OSMers interested in Iran. Find its link in bio of channel."},"OSM-japan-facebook":{name:"OpenStreetMap Japan Community",description:"Mappers and OpenStreetMap users in Japan"},"OSM-japan-mailinglist":{name:"OpenStreetMap Japan Mailinglist",description:"Talk-ja is an Official Mailinglist for Japanese Community"},"OSM-japan-twitter":{name:"OpenStreetMap Japan Twitter",description:"Hashtag on Twitter: {url}"},"OSM-japan-website":{name:"OpenStreetMap Japan",description:"Mappers and OpenStreetMap users in Japan"},"OSM-MY-facebook":{name:"OpenStreetMap Malaysia on Facebook",description:"For chat about anything related to OpenStreetMap!"},"OSM-MY-forum":{name:"OpenStreetMap Malaysia Forum",description:"Official OpenStreetMap Malaysia Forum"},"OSM-MY-matrix":{name:"OpenStreetMap Malaysia Riot channel",description:"All mappers are welcome! Sign up at {signupUrl}"},"OSM-MNG-facebook":{name:"OpenStreetMap Mongolia",description:"Improve OpenStreetMap in Mongolia",extendedDescription:"Mapping in Mongolia? Have questions, want to connect with the community here? Join us at {Url}. All are welcome!"},"OSM-MMR-facebook":{name:"OpenStreetMap Myanmar",description:"Improve OpenStreetMap in Myanmar",extendedDescription:"Mapping in Myanmar? Have questions, want to connect with the community here? Join us at {Url}. All are welcome!"},"OSM-Nepal-facebook":{name:"OpenStreetMap Nepal",description:"Improve OpenStreetMap in Nepal",extendedDescription:"Mapping in Nepal? Have questions, want to connect with the community here? Join us at {Url}. All are welcome!"},"ym-Institute-of-Crisis-Management-Studies":{name:"Institute of Crisis Management Studies YouthMappers",description:"YouthMappers chapter at Institute of Crisis Management Studies",extendedDescription:"To develop Crisis Mappers to assist during disaster situations."},"ym-Kathmandu-University":{name:"Geomatics Engineering Society,GES",description:"YouthMappers chapter at Kathmandu University",extendedDescription:"Geomatics Engineering Society (GES) established in 2008 A.D is a departmental club under Department of Civil and Geomatics Engineering (DCGE) at Kathmandu University. GES acts as a platform to develop the skills of students apart from their educational activities by focusing on activities like technical trainings, seminars, talk programs and interaction with experts from related field, sports activities etc."},"ym-Tribhuvan-University":{name:"Geomatics Engineering Students Association",description:"YouthMappers chapter at Tribhuvan University",extendedDescription:"This organization is the student forum of Geomatics Engineering students of Tribhuvan University , Institute of Engineering on the Pashchimanchal campus. Established since the beginning of the degree program, students have been active in mapping and leadership and are thrilled to be a part of the YouthMappers network."},"OSM-Asia-mailinglist":{name:"OpenStreetMap Asia Mailinglist",description:"Talk-asia is the official Mailinglist for Asian Community"},"osm-asia-telegram":{name:"OpenStreetMap Asia Telegram",description:"Join our family: {url}"},"OSM-PH-facebook":{name:"OpenStreetMap PH Facebook",description:"Welcome to OpenStreetMap Philippines, where we encourage all fellow Filipinos to contribute to the OpenStreetMap project."},"OSM-PH-mailinglist":{name:"Talk-ph Mailing List",description:"A mailing list to discuss OpenStreetMap in the Philippines"},"OSM-PH-slack":{name:"OpenStreetMap PH Slack",description:"All are welcome! Sign up at {signupUrl}"},"OSM-PH-telegram":{name:"OpenStreetMap PH Telegram",description:"Un-official, Telegram local community of OpenStreetMap contributors and friends in the Philippines"},"ym-Far-Eastern-University-Institute-of-Technology":{name:"Junior Philippines Computer Society",description:"YouthMappers chapter at Far Eastern University -Institute of Technology",extendedDescription:"FEU has been recognized as one of the leading universities in the Philippines. Its mission centers on producing graduates who have contributed to the advancement of the country. The university continuously challenges itself to raise the bar of excellence to achieve a top-tier status not only in the Philippines but also in the South East Asian region"},"ym-University-of-the-Philippines-Resilience-Institute":{name:"YouthMappers UP Resilience Institute",description:"YouthMappers chapter at University of the Philippines Resilience Institute",extendedDescription:"The UP Resilience Institute was established in 2016 with a mission statement to empower local communities through multidisciplinary research and actions toward resilience. Through UP NOAH Center, and the help of different organizations, we have provided building exposure maps for 17 provinces out of the 82 and uploaded more than 4 million footprints to Open Street Maps."},"OSM-RU-forum":{name:"OpenStreetMap RU forum",description:"OpenStreetMap Russia web forum"},"OSM-RU-telegram":{name:"OpenStreetMap RU telegram",description:"OpenStreetMap Russia telegram chat"},"OSM-south-korea-telegram":{name:"OSM South Korea Telegram",description:"Unofficial Channnel for OpenStreetMap contributors, communities, and users in South Korea to share and discuss."},"OSM-sri-lanka-facebook":{name:"OpenStreetMap Sri Lanka",description:"Improve OpenStreetMap in Sri Lanka",extendedDescription:"Mapping in Sri Lanka? Have questions, want to connect with the community here? Join us at {Url}. All are welcome!"},"OSM-TW-facebook":{name:"OpenStreetMap Taiwan Community",description:"Facebook Group for Mappers and OpenStreetMap users to discuss matters about Taiwan."},"OSM-TW-mailinglist":{name:"OpenStreetMap Taiwan Mailinglist",description:"Talk-tw is an Official Mailinglist for the Communities to dicuss matters about Taiwan"},"OSM-TH-CNX-meetup":{name:"OSM Meetup Chiang Mai",description:"Irregular meeting of the OpenStreetMap community in Chiang Mai",extendedDescription:"Members of the OpenStreetMap community meet every few months in Chiang Mai. Get in contact and check out {url} to see when the next meetup is scheduled"},"OSM-TH-facebook":{name:"OpenStreetMap TH Facebook group",description:"Facebook group for OpenStreetMappers in Thailand"},"OSM-TH-forum":{name:"OpenStreetMap TH forum",description:"OpenStreetMap Thailand web forum"},"al-forum":{name:"OSM Albania Forum",description:"OpenStreetMap Albania Forum"},"al-maptime-tirana":{name:"Maptime Tirana",description:"Social events organized around mapping - beginners most welcome!",extendedDescription:"Maptime is an open learning environment for all levels and degrees of knowledge, offering intentional educational support for the beginner. Maptime is simultaneously flexible and structured, creating space for mapping tutorials, workshops, ongoing projects with a shared goal, and independent/collaborative work time."},"al-telegram":{name:"OSM Albania Telegram channel",description:"OpenStreetMap Albania Telegram channel"},"at-forum":{name:"OpenStreetMap Austria Forum",description:"The official forum for OpenStreetMap questions in and around Austria"},"at-mailinglist":{name:"Talk-at Mailing List",description:"Talk-at is the official mailing list for the Austrian OSM community"},"at-twitter":{name:"OpenStreetMap Austria Twitter",description:"OpenStreetMap Austria On Twitter: {url}"},"osmgraz-meetup":{name:"OSM community meetup Graz",description:"Monthly meetup of the OpenStreetMap community in Graz"},"osmgraz-twitter":{name:"OSM community Graz on twitter",description:"OpenStreetMap community in Graz on twitter"},"osm-at":{name:"OpenStreetMap Austria",description:"The platform for information on OpenStreetMap in Austria"},byosm:{name:"OpenStreetMap Belarus",description:"OpenStreetMap Belarus telegram chat"},"be-facebook":{name:"OpenStreetMap BE Community",description:"Mappers and OpenStreetMap on Facebook in Belgium"},"be-forum":{name:"OpenStreetMap BE forum",description:"OpenStreetMap Belgium web forum"},"be-irc":{name:"OpenStreetMap Belgium IRC",description:"Join #osmbe on irc.oftc.net (port 6667)",extendedDescription:"Join #osmbe on irc.oftc.net (port 6667), it is bridged with the Matrix chat channel"},"be-mailinglist":{name:"Talk-be Mailing List",description:"Talk-be is the official mailing list for the Belgian OSM community"},"be-matrix":{name:"OpenStreetMap BE Matrix channel",description:"All mappers are welcome!",extendedDescription:"Most talk is happening at the \"OpenStreetMap Belgium\" channel. You can ask anything there! The other rooms are for specific subjects."},"be-meetup":{name:"OpenStreetMap Belgium Meetup",description:"Real life meetups of everyone who is interested in OpenStreetMap",extendedDescription:"Physical meetups are great to meet other mappers, ask them questions and to learn a lot. Especially new contributors are very welcome!"},"be-twitter":{name:"OpenStreetMap Belgium Twitter",description:"OSM Belgium on Twitter: @osm_be"},"hr-facebook":{name:"OpenStreetMap Croatia Facebook group",description:"OpenStreetMap Croatia Facebook group"},"hr-irc":{name:"OpenStreetMap Croatia on IRC",description:"Join #osm-hr on irc.freenode.org (port 6667)"},"hr-mailinglist":{name:"Talk-hr Mailing List",description:"Talk-hr mailing list"},"czech-community":{name:"Czech OSM community",description:"Map portal, website and contacts on OSM members in Czechia"},"osmcz-facebook":{name:"OpenStreetMap CZ on Facebook",description:"Follow czech community on Facebook - including translated WeeklyOSM!"},"osmcz-twitter":{name:"Czech twitter @osmcz",description:"Follow czech community on Twitter - including translated WeeklyOSM!"},"talk-cz-mailinglist":{name:"Czech mailing list (talk-cz)",description:"Talk-cz is the official mailing list for Czech community"},"dk-forum":{name:"OpenStreetMap Denmark Web Forum",description:"OpenStreetMap Denmark web forum"},"dk-irc":{name:"OpenStreetMap Denmark IRC",description:"Join #osm-dk on irc.oftc.net (port 6667)"},"dk-mailinglist":{name:"Talk-dk Mailing List",description:"A mailing list to discuss OpenStreetMap in Denmark"},"ym-Queen-Mary-University-of-London":{name:"Queen Mary YouthMappers",description:"YouthMappers chapter at Queen Mary University of London",extendedDescription:"This chapter will be part of the activities of the Queen Mary Geography Society."},"fi-forum":{name:"OpenStreetMap FI forum",description:"OpenStreetMap Finland web forum"},"fi-irc":{name:"OpenStreetMap Finland IRC",description:"Join #osm-fi on irc.oftc.net (port 6667)"},"fi-mailinglist":{name:"Talk-fi Mailing List",description:"Talk-fi is the official mailing list for the Finnish OSM community"},"fr-facebook":{name:"OpenStreetMap France Facebook page",description:"OpenStreetMap France Facebook page"},"fr-forum":{name:"OpenStreetMap France web forum",description:"OpenStreetMap France web forum"},"fr-irc":{name:"OpenStreetMap France on IRC",description:"Join #osm-fr on irc.oftc.net (port 6667)"},"fr-mailinglist":{name:"Talk-fr Mailing List",description:"Talk-fr mailing list"},"fr-twitter":{name:"OpenStreetMap France on Twitter",description:"OpenStreetMap France on Twitter: {url}"},"de-berlin-mailinglist":{name:"Berlin Mailing List",description:"This is the mailing list for the Berlin OSM community"},"de-berlin-meetup":{name:"OpenStreetMap Berlin-Brandenburg Meetup",description:"Mappers and OpenStreetMap users in the Berlin area"},"de-berlin-telegram":{name:"@osmberlin on Telegram",description:"OpenStreetMap Berlin Telegram chat"},"de-berlin-twitter":{name:"OpenStreetMap Berlin Twitter",description:"Follow us on Twitter: {url}"},"de-forum":{name:"OpenStreetMap DE forum",description:"OpenStreetMap Germany web forum"},"de-irc":{name:"OpenStreetMap Germany IRC",description:"Join #osm-de on irc.oftc.net (port 6667)"},"de-mailinglist":{name:"Talk-de Mailing List",description:"Talk-de is the official mailing list for the German OSM community"},"de-ostwestfalen-lippe-mailinglist":{name:"OWL Mailing List",description:"This is the mailing list for the Ostwestfalen-Lippe OSM community"},"de-telegram":{name:"OpenStreetMap Germany Telegram",description:"Join the OpenStreetMap Germany Telegram supergroup at {url}"},"osm-de":{name:"OpenStreetMap Germany",description:"The platform for information on OpenStreetMap in Germany"},"ym-Heidelberg-University":{name:"disastermappers heidelberg",description:"YouthMappers chapter at Heidelberg University",extendedDescription:"Disastermappers Heidelberg was founded in 2014 as a student initiative to build a platform for exchange between students, researchers and humanitarian actors. Disastermappers are a member of Missing Maps and are organizing mapathons, workshops and webinars in Heidelberg and beyond and support HOT and Missing Maps through research and applications."},"hu-facebook":{name:"OpenStreetMap HU on Facebook",description:"Mappers and OpenStreetMap Facebook in Hungary"},"hu-forum":{name:"OpenStreetMap HU forum",description:"OpenStreetMap Hungary web forum"},"hu-meetup":{name:"OpenStreetMap Hungary Meetup",description:"The platform for organizing meetups in Hungary"},"is-facebook":{name:"OSM Iceland on Facebook",description:"Page of OpenStreetMap in Iceland"},"is-mailinglist":{name:"Talk-is Mailing List",description:"Talk-is is the official mailing list for the Icelandic OSM community"},"is-twitter":{name:"OSM Iceland on Twitter",description:"Twitter of OpenStreetMap in Iceland"},"it-facebook":{name:"OpenStreetMap Italy Facebook",description:"Join the OpenStreetMap Italy community on Facebook"},"it-irc":{name:"OpenStreetMap Italy IRC",description:"Join #osm-it on irc.oftc.net (port 6667)"},"it-mailinglist":{name:"Talk-it Mailing List",description:"Talk-it is the official mailing list for the Italian OSM community"},"it-telegram":{name:"@OpenStreetMapItalia on Telegram",description:"OpenStreetMap Italy Telegram chat"},"it-twitter":{name:"OpenStreetMap Italy Twitter",description:"Follow us on Twitter at {url}"},"OSM-Rome-meetup":{name:"Incontro Mappatori Romani",description:"Improve OpenStreetMap in the Rome area",extendedDescription:"We aim to be a resource for people to discuss and share knowledge on utilizing free geographic data sets especially OpenStreetMap, and Open geo-spatial software that manages, edits, and displays geographic data, and advocate for its use in Lazio."},"South-Tyrol-Mailing-List":{name:"OpenStreetMap mailing list for South Tyrol",description:"OpenStreetMap Italy regional talk list for South Tyrol"},"talk-it-lazio":{name:"OpenStreetMap IT Lazio",description:"All are welcome! Sign up at {signupUrl}",extendedDescription:"Mailinglist for Rome and Lazio area."},"Trentino-Mailing-List":{name:"OpenStreetMap mailing list for Trentino",description:"OpenStreetMap Italy regional talk list for Trentino"},"ym-Politecnico-di-Milano":{name:"PoliMappers",description:"YouthMappers chapter at Politecnico di Milano",extendedDescription:"PoliMappers is a volunteer students’ association based at Politecnico di Milano. The mission of the group is to train and motivate the next generation of volunteer mappers and to do mapping using free and open source software within the university as well as primary and secondary schools."},"ym-Yarmouk-University":{name:"YouthMappers at YU",description:"YouthMappers chapter at Yarmouk University",extendedDescription:"YouthMappers chapter at YU is the first mapping group in the Middle East and North Africa region where refugees, drought, and poverty are rising crises and in urgent need for humanitarian mapping  activities to mitigate the consequences of such crises. YU Mappers are encouraged to use open data to address challenges in MENA region to bring relief and development to target areas within the region."},"kosovo-telegram":{name:"OpenStreetMap Kosovo on Telegram",description:"Semi-official all-Kosovo Telegram public group. We welcome all mappers from anywhere in any language."},"ym-Universit-Mohammed-V-Rabat":{name:"Brahmapoutre at Rabat",description:"YouthMappers chapter at Université Mohammed V Rabat",extendedDescription:"This chapter sees participation in the YouthMappers program as an oppourtunity to share our knowlege create new working relationships with other chapters in different countries"},"no-forum":{name:"OpenStreetMap Norway Web Forum",description:"OpenStreetMap Norway web forum"},"no-irc":{name:"OpenStreetMap Norway on IRC",description:"Chat room for mappers and OpenStreetMap users, developers and enthusiasts in Norway"},"no-mailinglist":{name:"OpenStreetMap Norway mailing list",description:"Mailing list for mappers and OpenStreetMap users, developers and enthusiasts in Norway"},"no-telegram":{name:"@OSM_no on Telegram",description:"OpenStreetMap Norway Telegram chat"},"OSM-PL-facebook-group":{name:"OpenStreetMap Poland Facebook group",description:"Group for mappers and users of OpenStreetMap in Poland"},"OSM-PL-forum":{name:"OpenStreetMap Poland Forum",description:"Forum of Polish OpenStreetMap community"},"si-forum":{name:"OpenStreetMap Slovenia Forum",description:"Forum of OpenStreetMap community in Slovenia"},"si-mailinglist":{name:"OpenStreetMap Slovenia mailing list",description:"Mailing list of OpenStreetMap community in Slovenia"},"si-twitter":{name:"OpenStreetMap Slovenia Twitter",description:"Follow OpenStreetMap Slovenia On Twitter: {url}"},"OSM-ES-mailinglist":{name:"Talk-es mailing list",description:"A mailing list to discuss OpenStreetMap in Spain"},"OSM-ES-telegram":{name:"@OSMes on Telegram",description:"OpenStreetMap Spain Telegram chat"},"ym-Universidad-Autonoma-de-Madrid":{name:"YouthMappers at UAM",description:"YouthMappers chapter at Universidad Autonoma de Madrid"},"ym-Universidad-Politcnica-de-Madrid":{name:"Mapeo Humanitario",description:"YouthMappers chapter at Universidad Politécnica de Madrid",extendedDescription:"Geo-volunteering group formed at Moncloa Campus on November 2017. Around 20 members from three Universities (Complutense, CEU and UPM). Undergraduate students, MSc and PhD students collaborate together with organizations (MSF, Acción contra el Hambre,...) supported by trainers from Geoinquietos. Official recognition by UPM as Educative Innovation Project (Code  IE1718.0411)"},"osm-se":{name:"OpenStreetMap.se",description:"Provide OSM services and information for the local community in Sweden"},"se-facebook":{name:"OpenStreetMap Sweden Facebook",description:"OpenStreetMap Sweden on Facebook"},"se-forum":{name:"OpenStreetMap Sweden Web Forum",description:"OpenStreetMap Sweden web forum"},"se-irc":{name:"OpenStreetMap Sweden IRC",description:"Join #osm.se on irc.oftc.net (port 6667)"},"se-mailinglist":{name:"Talk-se Mailing List",description:"A mailing list to discuss OpenStreetMap in Sweden"},"se-twitter":{name:"OpenStreetMap Sweden on Twitter",description:"Follow us on Twitter: {url}"},"ym-Istanbul-Technical-University":{name:"YouthMappers ITU",description:"YouthMappers chapter at Istanbul Technical University",extendedDescription:"YouthMappers ITU is an interdisciplinary and collaborative student community to promote humanitarian mapping for vulnerable settlements and aims to develop and share strategic and innovative spatial information for the future cities by using geographical information systems and open data."},"Nottingham-OSM-pub-meetup":{name:"East Midlands (Nottingham) Monthly pub meet-up",description:"Social gathering for East Midlands mappers and users",extendedDescription:"A group have been meeting since March 2011, initially in Nottingham, and, more recently in Derby, and from time to time elsewhere in the East Midlands. These are social gatherings, but are an excellent place to come and ask specific questions about OSM either in the area or in general. In the summer months we usually do some light mapping for an hour in the vicinity of our meeting place. The group as a whole has a special interest in mapping public rights of way and from time to time has mapping meetings for this purpose."},"gb-mailinglist":{name:"Talk-gb Mailing List",description:"Talk-gb is the main communication forum list for the British (including Northern Ireland) OSM community"},"mappa-mercia-group":{name:"Mappa Mercia local group",description:"A home for OpenStreetMap enthusiasts in the Midlands",extendedDescription:"Mappa Mercia is a project to grow OpenStreetMap in the West Midlands, UK. We run community events, provide training and support local organisations wishing to open up their data."},"gb-irc":{name:"OpenStreetMap United Kingdom IRC",description:"Join #osm-gb on irc.oftc.net (port 6667)",extendedDescription:"Join #osm-gb on irc.oftc.net (port 6667), please be patient and wait for a few minutes if you ask a question"},"ym-University-of-Exeter":{name:"University of Exeter British Red Cross Missing Maps",description:"YouthMappers chapter at University of Exeter",extendedDescription:"We are a team of enthusiastic Geographers with comprehensive knowledge of GIS. We are passionate about supporting the British Red Cross Society with various humanitarian aid efforts. We are also important teachers of the significance of mapping remotely sensed data and how this helps on the ground. Our mapathons have themed academic focuses that highlight the different GIS research in our geography department, while also functioning as employability awareness events which we use to invite speakers in to talk about their GIS/British Red Cross careers."},"ym-University-of-Warwick":{name:"University of Warwick Resilience Mapping Society",description:"YouthMappers chapter at University of Warwick",extendedDescription:"We are a group of enthusiastic mappers based at Warwick University. Our aim is to get people excited about humanitarian mapping and help them understand the impact this activity has on the field. We are closely aligned with Missing Maps and Doctors Without Borders UK and focus on HOT tasks in our mapping activities and workshops. Our mapathons are listed on the Missing Maps page whenever they are scheduled."},"ym-Sacred-Heart-Junior-College":{name:"Youth Mappers at Sacred Heart Junior College",description:"YouthMappers chapter at Sacred Heart Junior College"},"OSM-CA-Slack":{name:"OSM-CA Slack",description:"All are welcome! Sign up at {signupUrl}."},"OSM-Vancouver-meetup":{name:"OpenStreetMap Vancouver",description:"Mappers and OpenStreetMap users in the Vancouver, BC area"},"ym-Universidad-de-Costa-Rica":{name:"YouthMappers de Universidad de Costa Rica",description:"YouthMappers chapter at Universidad de Costa Rica",extendedDescription:"YouthMappers de Universidad de Costa Rica nace en función de acción social para y por miembros de comunidades distintas según temáticas de involucramiento, interacción y representación de variables dentro de un espacio geográfico definido (un territorio) Gracias a las herramientas de OpenStreetMaps tenemos la viabilidad de poder obtener, validar y compartir la información generada para comprobación y uso destinadas a las comunidades o el interesado en tales temáticas objetivas."},"OSM-CU-telegram":{name:"OSM Cuba on Telegram",description:"OpenStreetMap Cuba Telegram chat"},"ym-Universidad-Nacional-Autnoma-de-Honduras":{name:"PumaGis Hn",description:"YouthMappers chapter at Universidad Nacional Autónoma de Honduras"},"ym-University-of-the-West-Indies-Mona-Campus":{name:"Libraries Outreach - ODL",description:"YouthMappers chapter at University of the West Indies, Mona Campus",extendedDescription:"The UWI, Mona Campus Library engages in public, outreach and special projects. This will allow our library the means to be a catalyst for spatial literacy and advocate for spatial data sharing and access to Jamaican and Caribbean interests. We have disaster relief and communication needs and   extensive earth science and geo-hazards needs to better serve our campus and community. Specifically, we hace a Science Library to showcase such to all faculty and students."},"OSM-NI-telegram":{name:"OSM Nicaragua on Telegram",description:"OpenStreetMap Nicaragua Telegram chat"},"ym-Universidad-Nacional-de-Ingenieria":{name:"Yeka Street MGA",description:"YouthMappers chapter at Universidad Nacional de Ingenieria",extendedDescription:"YEKA STREET is a work team constituted by students from Universidad Nacional de Ingenieria at Managua, Nicaragua. With the principal purpose of apply our knowledge and skills using many tools and apps to map areas in our cities and contribute to the development community projects and disasters relieve plans. We want to lead the way adding more students from all careers and universities in our country to join us at this cause, increasing in this way the life level and reducing the population vulnerability."},"ym-University-of-Panama":{name:"YouthMappers UP",description:"YouthMappers chapter at University of Panama",extendedDescription:"Student mappers in Panama work with open spatial data to help identify, define, address, and create meaning about locally defined development challenges. They collaborate with students from other countries on community mapping topics from ecotourism to food security, from biodiversity to indigenous issues, promoting a humanistic vision through scientific perspectives."},"ym-Universidad-de-Puerto-Rico-Rio-Piedras":{name:"UPR YouthMappers",description:"YouthMappers chapter at Universidad de Puerto Rico - Rio Piedras"},"Bay-Area-OpenStreetMappers":{name:"Bay Area OpenStreetMappers",description:"Improve OpenStreetMap in the Bay Area",extendedDescription:"This group is about growing the OpenStreetMap community here in the Bay Area. Our events are open to everyone, from open source enthusiasts, cyclists, GIS professionals, geocachers, and beyond. Anyone and everyone who is interested in maps, map making and free map data is welcome to join our group as well as attend our events."},"Central-Pennsylvania-OSM":{name:"Central Pennsylvania OSM",description:"Online mapping community based out of State College, PA"},"Code-for-San-Jose-Slack":{name:"Code for San Jose Slack",description:"All are welcome! Sign up at {signupUrl}, then join the #osm channel."},"Dallas-Fort-Worth-OSM":{name:"Dallas-Fort Worth OSM",description:"The OpenStreetMap user group for Dallas-Fort Worth",extendedDescription:"Dallas, Fort Worth, and all the cities in between are abounding with creative and tech-savvy people. The vision for this usergroup is to find new ways to use the amazing resource of OSM."},GeoPhilly:{name:"GeoPhilly",description:"Meetup for map enthusiasts in the Philadelphia area",extendedDescription:"GeoPhilly unites developers, geographers, data geeks, open source enthusiasts, civic hackers and map addicts in our shared love of maps and the stories they tell. If you use maps as part of your work or just want to learn more, this is the meetup for you!  Our events aim to be open, friendly, educational and social and range from happy hours to lightning talks or even workshops. Come create a diverse, inspiring geospatial community in the Philadelphia with us!"},MapMinnesota:{name:"MapMinnesota",description:"Mappers and OpenStreetMap enthusiasts in the Twin Cities area",extendedDescription:"Connecting OpenStreetMap enthusiasts in Minnesota and the Twin Cities!"},"Mapping-DC-meetup":{name:"Mapping DC",description:"Improve OpenStreetMap in the DC area",extendedDescription:"We are a group of volunteer mappers who aim to improve the OpenStreetMap in the DC area. We also aim to teach others about the OSM ecosystem, data analytics, cartography, and GIS. We gather every other month at meetups to focus on one area of our city."},"Maptime-ME-meetup":{name:"MaptimeME",description:"Mappers and OpenStreetMap users, around Portland, ME",extendedDescription:"Maptime is, rather literally, time for mapmaking.  Our mission is to open the doors of cartographic possibility to anyone interested by creating a time and space for collaborative learning, exploration, and map creation using mapping tools and technologies."},"MaptimeHRVA-twitter":{name:"MaptimeHRVA Twitter",description:"Follow us on Twitter at {url}"},"us-ma-mailinglist":{name:"Talk-us-massachusetts Mailing List",description:"Email mailing list for the Massachusetts OSM community"},"OpenCleveland-meetup":{name:"Open Cleveland",description:"Improve OpenStreetMap in the Cleveland area",extendedDescription:"Open Geo Cleveland aims to be a resource for people to discuss and share knowledge on utilizing free geographic data sets especially OpenStreetMap, and Open geo-spatial software that manages, edits, and displays geographic data, and advocate for its use in Northeast Ohio. We're also a maptime chapter =)"},"OSM-Boston":{name:"OpenStreetMap Boston",description:"Mappers and OpenStreetMap users in the Boston area",extendedDescription:"OpenStreetMap is the free and open, wiki-style map of the world, with hundreds of thousands of contributions every day from people like you. Editing the map is simple, and fun! Join us both indoors and outdoors in our effort to create the best map of the Boston area and the rest of the world!"},"OSM-Central-Salish-Sea":{name:"OpenStreetMap Central Salish Sea",description:"Mappers and OpenStreetMap users around Mount Vernon, WA",extendedDescription:"OpenStreetMap is an map of the world made by people like you. It's a map that you build, that's given away for free like wikipedia. Check out osm.org for more. We meet all the time to talk maps, make maps and have fun!"},"OSM-Chattanooga":{name:"OSM Chattanooga",description:"The OpenStreetMap user group for Chattanooga"},"OSM-Colorado":{name:"OpenStreetMap Colorado",description:"Mappers and OpenStreetMap users in the state of Colorado, USA",extendedDescription:"OpenStreetMap (OSM) Colorado is a local collaboration of people interested in contributing their efforts to create free maps. We encourage all of our mappers to organize or suggest mapping events throughout the state. Meetup activities can be simple social mixers, OSM basic to advanced training, or community mapping parties."},"OSM-NYC":{name:"OpenStreetMap NYC",description:"Mappers and OpenStreetMap users, developers and enthusiasts in the New York Metropolitan area"},"OSM-Portland-forum":{name:"OpenStreetMap PDX Google Group",description:"Forum and mailing list for OpenStreetMap users in the Portland area",extendedDescription:"This group is to facilitate improvements to OpenStreetMap in the Portland, Oregon area to support applications such as the Open Trip Planner."},"OSM-Portland":{name:"OpenStreetMap Portland",description:"Mappers and OpenStreetMap users in the Portland area",extendedDescription:"OpenStreetMap (OSM) is a map of the world made by people like you. It's a map that you build, that's given away for free like wikipedia. Check out osm.org for more, and come join us at a meetup to talk maps, contribute to OSM, and have fun!"},"OSM-Seattle":{name:"OpenStreetMap Seattle",description:"Mappers and OpenStreetMap users in the Seattle area"},"OSM-SoCal":{name:"OpenStreetMap Southern California",description:"Let's have some fun, contribute something to Los Angeles, and learn about mapping!",extendedDescription:"OpenStreetMap (OSM) Southern California is for anyone interested in mapping to get together to work with OpenStreetMap.  OpenStreetMap, the Wikipedia of maps, is a free open-source map of the world being created by more than 1,000,000 volunteers around the globe.  Everyone is welcome.  If you don't know OpenStreetMap, we'll teach you. If you have an idea for a mapping project or even a field trip that the group can do, great!"},"OSM-South-Bay":{name:"OSM South Bay",description:"Map Nights hosted by Code for San Jose",extendedDescription:"Code for San Jose, the local Code for America brigade, hosts monthly Map Nights on Thursday nights in downtown San José. Meet fellow South Bay mappers, help out with local mapping projects, and hear about other civic tech projects. Programming and GIS skills are not required."},"OSM-Tampa-Bay":{name:"OpenStreetMap Tampa Bay",description:"Mappers and OpenStreetMap users in the Tampa Bay area",extendedDescription:"OSM Tampa Bay group for local residents to get together and build out the definitive map of Tampa Bay with OpenStreetMap, the free and editable map of the world.  If you're into maps, data, open source, GPS, hiking, cycling, et cetera, you'll love working with OpenStreetMap -- so join in! We'll get together and map and talk about new topics once-a-month or so."},"OSM-US-Slack":{name:"OpenStreetMap US Slack",description:"All are welcome! Sign up at {signupUrl}"},"OSM-US":{name:"OpenStreetMap US",description:"We help grow and improve OpenStreetMap in the United States.",extendedDescription:"We support OpenStreetMap by holding annual conferences, providing community resources, building partnerships, and by spreading the word. Join OpenStreetMap US here: {signupUrl}",events:{"sotmus2019-cfs":{name:"Propose a Talk for SotM-US 2019",description:"We are calling on all members of the OpenStreetMap community to share your ideas and session proposals for State of the Map US 2019. Whether you are brand new to OSM or have been a core contributor since the beginning, we want to hear from you!",where:"Minneapolis, Minnesota"},sotmus2019:{name:"State of the Map US 2019",description:"Join the OpenStreetMap community at State of the Map US in Minneapolis, Minnesota. Connect with other mappers, businesses, government agencies, and non profits, all collaborating around the free and editable map of the world.",where:"Minneapolis, Minnesota"}}},"OSM-Utah":{name:"OpenStreetMap Utah",description:"Mappers and OpenStreetMap users in the Salt Lake City area",extendedDescription:"Activities may include things like Learn To Map workshops, mapping parties and outdoor data collection. The events will take place in the SLC area, at least initially.  We are looking for seasoned mappers as well as people new to OSM. Join and let's do some mapping!"},"OSM-Wyoming":{name:"OpenStreetMap Wyoming",description:"Mappers and OpenStreetMap users in the state of Wyoming",extendedDescription:"OpenStreetMap (OSM) Wyoming is a local collaboration of people interested in contributing their efforts to create free maps. We encourage all of our mappers to organize or suggest mapping events throughout the state. Meetup activities can be simple social mixers, OSM basic to advanced training, or community mapping parties."},"PHXGeo-meetup":{name:"PHXGeo Meetup",description:"Mappers and OpenStreetMap users in the Phoenix, AZ area",extendedDescription:"This is a meetup group for those in the Phoenix area who like maps, GIS, OpenStreetMap, cartography and anything in between."},"PHXGeo-twitter":{name:"PHXGeo Twitter",description:"Follow us on Twitter at {url}"},"Western-Slope-facebook":{name:"Western Slope OSM Facebook",description:"Mappers and OpenStreetMap users around Grand Junction, CO"},"Western-Slope-meetup":{name:"Western Slope OSM Meetup",description:"Mappers and OpenStreetMap users around Grand Junction, CO",extendedDescription:"The goal of this group is to introduce OpenStreetMap to the community, develop a community of mappers, create the most amazing geodata possible using whatever method we can and finally strategize in order to get this data out into our community. Imagine accurate trail signage! Imagine further development of bike paths! Imagine anything you want, that's the joy of OpenStreetMap!"},"ym-Ball-State-University":{name:"Gamma Theta Upsilon- Iota Omega Chapter",description:"YouthMappers chapter at Ball State University",extendedDescription:"Our chapter is a very active one. We primarily focus on community events, fundraising, and field trips. We are currently looking to develop more mapping-related activities to draw in other students from campus who may be interested in contributing."},"ym-California-University-of-Pennsylvania":{name:"CalU PA GIS Club",description:"YouthMappers chapter at California University of Pennsylvania",extendedDescription:"GIS Students at Cal U learn to apply spatial theory to the real world. The university degree program focuses on geography as well as utilizing GIS in emergency management."},"ym-Central-Washington-University":{name:"Geography Club",description:"YouthMappers chapter at Central Washington University",extendedDescription:"Our goal teaming up with Youthmappers is to bring relief to areas that are in need of humanitarian mapping. By doing so, we are serving our fellow brothers and sisters around the world as well as furthering our own cartography skills."},"ym-Clemson-University":{name:"Clemson Mappers",description:"YouthMappers chapter at Clemson University",extendedDescription:"Students in Clemson are supported by the Center for Geospatial Technologies, a community of interdisciplinary geospatial science practitioners supporting research, teaching, and outreach activities using technologies that enable the collection, analysis, and application of geospatial data. Students integrate geospatial technologies within their scholarly activities across all disciplines and build connections throughout the world."},"ym-College-of-William-and-Mary":{name:"All over the map!",description:"YouthMappers chapter at College of William and Mary",extendedDescription:"The students who are all over the map are supported by the Center for Geospatial Analysis, a group integrating GIS across the curriculum and providing student and faculty with hardware, software, and expertise.  Students of all backgrounds utilize GIS across campus, including environmental science and policy, geology, history, business, sociology, biology, anthropology, public policy, and marine sciences."},"ym-Cornell-University":{name:"Mapping Society",description:"YouthMappers chapter at Cornell University",extendedDescription:"Cornell students and faculty use open data and open source software to address challenges at local, national, and global scales. In doing so, we advance our academic and personal goals of developing our own skills around GIS and spatial literacy."},"ym-George-Mason-University":{name:"Mason Mappers",description:"YouthMappers chapter at George Mason University",extendedDescription:"Mason Mappers Student Society is a humanitarian mapping student organization in the George Mason University GGS Department, and its goal is to promote education and knowledge in geo-technologies, geo-info science, to foster good global stewardship and engage in professional development while building a positive, interactive geo-community, as well as shaping students into leaders of tomorrow."},"ym-Indiana-University-of-Pennsylvania":{name:"Geospatial Science Club",description:"YouthMappers chapter at Indiana University of Pennsylvania"},"ym-Jacksonville-State-University":{name:"JSU Disaster Mapping Team",description:"YouthMappers chapter at Jacksonville State University",extendedDescription:"The JSU Disaster Mapping Team is a program at Jacksonville State University dedicated to assisting disaster response in times of emergencies. This includes tornadoes, severe thunderstorms, floods, etc. The team is intended to be a valuable asset to surrounding counties and a conduit for the JSU Geoscience Department students to apply what they have learned in an academic setting to support emergency services. Our goal is to streamline disaster response and recovery operations while utilizing student skill sets"},"ym-Kansas-State-University":{name:"Gamma Theta Upsilon: Beta Psi Chapter",description:"YouthMappers chapter at Kansas State University",extendedDescription:"We are the Kansas State University Chapter of Gamma Theta Upsilon, an international geography honor society with affiliation to YouthMappers. We have been active with mapping for OSM and conducted a mapathon called \"Map for Nepal,\" in which we used OpenStreetMap to digitize unmapped areas of Nepal after the earthquake in 2015."},"ym-McGill-University":{name:"Open Mapping Group McGill: A Member of the McGill Undergraduate Geography Society",description:"YouthMappers chapter at McGill University",extendedDescription:"The Open Mapping Group McGill: A Member of McGill Undergraduate Geography Society (OMG McGill) aims to connect students with open geospatial data and technologies to enhance resilience, community-building, and learning through mapping–on campus, in Montreal, in Canada, and abroad."},"ym-Miami-University":{name:"Geography and Planning Society",description:"YouthMappers chapter at Miami University",extendedDescription:"GPS at Miami University aims to create a close-knit community of planners and geographers who want to have fun, learn more about careers and higher education in their field, network, and work alongside professionals for real experience."},"ym-Monroe-Community-College":{name:"MCC Mapping Corps",description:"YouthMappers chapter at Monroe Community College"},"ym-Montgomery-College":{name:"GeoMC",description:"YouthMappers chapter at Montgomery College",extendedDescription:"GeoMC’s mission is to provide students with hands-on experience in applying geospatial tools, collecting data, and project management. Most of our students come with a background in GIS and are geography majors. Our chapter’s members come from diverse backgrounds and we all work together to make a positive impact in the world live in."},"ym-New-York-University":{name:"NYU mHealth Initiative Mapping Corps",description:"YouthMappers chapter at New York University",extendedDescription:"The NYU mobile health or “mHealth” research initiative focuses on development of systems that link people - usually via their phones - to the places that they live and traverse, and thus supports novel research on the way phones and maps can be leveraged to understand behavioral decision making and ultimately health outcomes."},"ym-Ohio-Wesleyan-University":{name:"Environment and Wildlife Club",description:"YouthMappers chapter at Ohio Wesleyan University",extendedDescription:"Environment and Wildlife Club looks at environmental issues on campus, in Delaware, and even nationally! We create campus and community projects, explore and enjoy the outdoors, volunteer, and try to promote environmentalism in every aspect of our lives."},"ym-Oklahoma-State-University":{name:"Geography Club",description:"YouthMappers chapter at Oklahoma State University"},"ym-State-University-of-New-York-Geneseo":{name:"SUNY Geneseo GIS Association",description:"YouthMappers chapter at State University of New York Geneseo",extendedDescription:"We spread awareness, support, education, volunteerism, and career advancement opportunities in geographic information systems, across disciplines and departments, in the context of SUNY Geneseo, the local community, and global community."},"ym-SUNY-at-Fredonia":{name:"Geoventurers",description:"YouthMappers chapter at SUNY at Fredonia",extendedDescription:"GeoVenturers is a group of students joining together across a number of majors on our campus that see geospatial technologies as a tool to serve others and to bring people together. Mentoring for the group brings in science education from the department of curriculum and instruction. We hope that we can bring our skills to play in helping make people's lives better."},"ym-Texas-Tech-University":{name:"YouthMappers at TTU",description:"YouthMappers chapter at Texas Tech University",extendedDescription:"As one of the co-founding chapters of the network, the TTU YouthMappers are enthusiastic to serve as interdisciplinary leaders to help create open geographic data and analyses that address locally defined development challenges worldwide. The chapter strives to exchange and collaborate with other chapters around the globe while also offering themselves as a local resource and service to Texas Tech student organizations in ways that add value to their respecitive campus activities through mapping."},"ym-The-Citadel":{name:"YouthMappers at The Citadel",description:"YouthMappers chapter at The Citadel",extendedDescription:"This chapter is also a Rotaract Club, which is an affiliate of Rotary International. Multiple members, as well as leadership have expressed an interest in YouthMappers and we would like to affiliate our Citadel Rotaract Club with YouthMappers."},"ym-The-George-Washington-University":{name:"Humanitarian Mapping Society",description:"YouthMappers chapter at The George Washington University",extendedDescription:"Models of leadership and engagement, HMS seeks to render aid and better the world through humanitarian Geographic Information Systems (GIS) projects. This co-founding affiliated chapter on the campus of GWU has a plethora of experience to share, and frequently partners directly with USAID, the American Red Cross, and the US Department of State in their DC area to expand student-led efforts and serve the global community."},"ym-The-Johns-Hopkins-University-SAIS":{name:"SAIS YouthMappers",description:"YouthMappers chapter at The Johns Hopkins University, SAIS",extendedDescription:"The mission of SAIS Youth Mappers is to provide students at the Johns Hopkins University SAIS with the opportunity to become highly skilled humanitarian mappers. As a group within the South Asia Club, its primary focus is on supporting humanitarian mapping projects in the Indo-Pacific Region."},"ym-The-Pennsylvania-State-University":{name:"Penn State GIS Coalition",description:"YouthMappers chapter at The Pennsylvania State University",extendedDescription:"The Penn State Geospatial Information Science (GIS) Coalition is an organization that offers students majoring, minoring, or sharing an interest in GIS opportunities to develop supplementary knowledge and skills necessary to succeed in the professional GIS industry."},"ym-University-of-California-Davis":{name:"Mapping Club",description:"YouthMappers chapter at University of California, Davis"},"ym-University-of-Central-Florida":{name:"Geospatial Information Society",description:"YouthMappers chapter at University of Central Florida",extendedDescription:"Our mission is to foster a social and educational environment for all majors who are interested in the discussion and application of GIS. Group and community events throughout the academic year organize students to volunteer to help local and regional communities by using community-based GIS projects and educating local middle and high school students on the use and application of GIS."},"ym-University-of-Chicago":{name:"Tobler Society",description:"YouthMappers chapter at University of Chicago"},"ym-University-of-Maryland-College-Park":{name:"Geography Club",description:"YouthMappers chapter at University of Maryland - College Park",extendedDescription:"The mission of the Geography Club at the University of Maryland College Park is to engage and encourage students to explore geographic interests within the campus and the community."},"ym-University-of-North-Texas":{name:"UNT Geography Club",description:"YouthMappers chapter at University of North Texas",extendedDescription:"The Geography Club is a student organization at University of North Texas that welcomes all students who are interested in geography. The objective of the Geography Club is to promote interest in Geography, the Major and the Geography Department along with fellowship among students and faculty. The club also seeks to represent student needs and wants in regard to the study of geography and to provide a forum for the presentation of innovative ideas to the benefit of the University community."},"ym-University-of-Northern-Colorado":{name:"UNCO Geography and GIS Club",description:"YouthMappers chapter at University of Northern Colorado",extendedDescription:"Official Geography and GIS Club chapter affiliated with the University of Northern Colorado where our aim is to learn, share and connect with those around us. #MakingSenseOfTheWorld"},"ym-University-of-Oregon":{name:"Map by Northwest",description:"YouthMappers chapter at University of Oregon",extendedDescription:"Map By Northwest aims to engage undergraduate students at the University of Oregon in mapping projects to assist in humanitarian causes and for conducting geographic research. We welcome students from all disciplines to join us in our mapping adventures."},"ym-University-of-Redlands":{name:"URSpatial Geo-Thinkers",description:"YouthMappers chapter at University of Redlands",extendedDescription:"To build upon the members' GIS skills and knowledge of the tools and methods through applied social engagement as well as to educate the campus community about the power of mapping and spatial analysis through community service events."},"ym-University-of-South-Carolina":{name:"Geography Graduate Student Association",description:"YouthMappers chapter at University of South Carolina",extendedDescription:"The GGSA is a fully student-run organization, designed to serve as an advocate and resource for all geography graduate students by filling the role of liaison between the department and students. Our goal is to further professional, academic, and personal development of graduate students interested in the field of geography and its sub disciplines."},"ym-University-of-Southern-California":{name:"SC Mappers",description:"YouthMappers chapter at University of Southern California",extendedDescription:"We see the world differently: we view it through a spatial lens. With the power of spatial thinking, we connect place and space to help address global challenges. Collaborate with us!"},"ym-University-of-Vermont":{name:"University of Vermont Humanitarian Mapping Club",description:"YouthMappers chapter at University of Vermont"},"ym-University-of-Victoria":{name:"Society of Geography Students",description:"YouthMappers chapter at University of Victoria",extendedDescription:"SOGS seeks to promote and represent social and academic interests within the Department of Geography. This is expressed by four key goals: To provide a forum for the discussion of matters concerning the quality and accessibility of education within geography; to provide a means of expressing a consensus of student opinion to deparhnental faculty through representation at deparkrnental meetings and on departrnental committees; to undertake anangements for such activities as are for the benefit of students and are seen to be within the field of interest of students in geography; to act as a liaison through the UVSS and the Course Union Council with other student groups on campus"},"ym-University-of-Wyoming":{name:"Gamma Theta Upsilon/Geography Club",description:"YouthMappers chapter at University of Wyoming"},"ym-UW-Madison":{name:"BadgerMaps",description:"YouthMappers chapter at UW-Madison",extendedDescription:"BadgerMaps is the UW campus chapter of Youthmappers, an organization dedicated to humanitarian and community mapping services. We connect our volunteer network with opportunities to create GIS data for projects that need it."},"ym-Vassar-College":{name:"Hudson Valley Mappers",description:"YouthMappers chapter at Vassar College",extendedDescription:"Our mission is to provide a multi-disciplinary platform for peers, educators, and community organizations to engage in local mapping projects with a focus on strengthening our local ecosystems, our built environment, and the health of our community. We also seek to contribute geospatial support for global humanitarian aid and development efforts."},"ym-Villanova-University":{name:"The Villanova Globeplotters",description:"YouthMappers chapter at Villanova University",extendedDescription:"The Villanova Globeplotters is built on Villanova’s Augustinian principle of selfless-service to the global community. Mixed with relaxed social interaction, we strive to provide geospatial outreach to those in need regardless of participating students’ race, academic major, student group association, or college career level."},"ym-West-Virginia-University":{name:"Maptime Morgantown",description:"YouthMappers chapter at West Virginia University",extendedDescription:"Working as a collaborative team, this co-founding chapter focuses on providing an open learning environment for those interested in working on projects that intersect international development, emergency response, and geographic information science.\nThey connect beginners and experts by providing technical training and experience in building meaningful and useful geographic infrastructure data, while connecting to sister cities around the world."},"ym-Western-Michigan-University":{name:"Geography Club",description:"YouthMappers chapter at Western Michigan University"},"Maptime-Australia-Slack":{name:"Maptime Australia Slack",description:"Sign up at {signupUrl}"},"talk-au":{name:"Talk-au Mailing List",description:"Place for Aussie mappers to chat"},"OSM-AR-facebook":{name:"OpenStreetMap Argentina Facebook",description:"Join the OpenStreetMap Argentina community on Facebook",extendedDescription:"News from the local community"},"OSM-AR-forum":{name:"OpenStreetMap Argentina web forum",description:"Join the OpenStreetMap Argentina web forum",extendedDescription:"Ideal for long or important discussions. Slow response time."},"OSM-AR-irc":{name:"OpenStreetMap Argentina IRC",description:"Join #osm-ar on irc.oftc.net (port 6667)",extendedDescription:"You may find the most geeky user in the community."},"OSM-AR-mailinglist":{name:"Talk-ar Mailing List",description:"Historic mailing list. Almost unused today."},"OSM-AR-telegram":{name:"OpenStreetMap Argentina Telegram",description:"Join the OpenStreetMap Argentina community on Telegram",extendedDescription:"The most active channel in the community, ideal for chatting and getting answers to your questions instantly. Everyone is welcome!"},"OSM-AR-twitter":{name:"OpenStreetMap Argentina Twitter",description:"Follow us on Twitter at {url}",extendedDescription:"News from the local community and OpenStreetMap in general."},"OSM-BO-mailinglist":{name:"Talk-bo Mailing List",description:"Talk-bo is the official mailing list for the Bolivian OpenStreetMap community",extendedDescription:"Mapping in Bolivia? Have questions, want to connect with the community here? Join us at {url}. All are welcome!"},"Bahia-telegram":{name:"OpenStreetMap Bahia Telegram Group",description:"Join the OpenStreetMap Bahia community on Telegram",extendedDescription:"Join the community to learn more about OpenStreetMap, ask questions or participate in our meetings. Everyone is welcome!"},"DF-telegram":{name:"OpenStreetMap Brasília Telegram Group",description:"Join the OpenStreetMap Brasília community on Telegram",extendedDescription:"Join the community to learn more about OpenStreetMap, ask questions or participate in our meetings. Everyone is welcome!"},"OSM-br-mailinglist":{name:"Talk-br Mailing List",description:"A mailing list to discuss OpenStreetMap in Brazil"},"OSM-br-telegram":{name:"OpenStreetMap Brasil Telegram",description:"Join the OpenStreetMap Brasil community on Telegram",extendedDescription:"Join the community to learn more about OpenStreetMap, ask questions or participate in our meetings. Everyone is welcome!"},"OSM-br-twitter":{name:"OpenStreetMap Brasil Twitter",description:"Follow us on Twitter at {url}"},"RS-telegram":{name:"OpenStreetMap Rio Grande do Sul Telegram Group",description:"Join the OpenStreetMap Rio Grande do Sul community on Telegram",extendedDescription:"Join the community to learn more about OpenStreetMap, ask questions or participate in our meetings. Everyone is welcome!"},"OSM-CL-facebook":{name:"OpenStreetMap Chile Facebook",description:"Join the OpenStreetMap Chile community on Facebook",extendedDescription:"Join the community to learn more about OpenStreetMap, ask questions or participate in our meetings. Everyone is welcome!"},"OSM-CL-mailinglist":{name:"Talk-cl Mailing List",description:"A mailing list to discuss OpenStreetMap in Chile"},"OSM-CL-telegram":{name:"OpenStreetMap Chile Telegram",description:"Join the OpenStreetMap Chile community on Telegram",extendedDescription:"Join the community to learn more about OpenStreetMap, ask questions or participate in our meetings. Everyone is welcome!"},"OSM-CL-twitter":{name:"OpenStreetMap Chile Twitter",description:"Follow us on Twitter at {url}"},"Maptime-Bogota":{name:"Maptime Bogotá",description:"We're a group of mappers interested in mapping in OpenStreetMap around Bogotá.",extendedDescription:"Learn to collect data in the field and digitize onto OpenStreetMap.  It is not necessary to have previous knowledge! You just need the desire to participate, learn, and have fun."},"OSM-CO-facebook":{name:"OpenStreetMap Colombia Facebook",description:"Join the OpenStreetMap Colombia community on Facebook",extendedDescription:"Join the community to learn more about OpenStreetMap. Everyone is welcome!"},"OSM-CO-mailinglist":{name:"Talk-co Mailing List",description:"A mailing list to discuss OpenStreetMap in Colombia"},"OSM-CO-telegram":{name:"OSM Colombia on Telegram",description:"OpenStreetMap Colombia Telegram chat"},"OSM-CO-twitter":{name:"OpenStreetMap Colombia Twitter",description:"Follow us on Twitter at {url}"},"OSM-CO":{name:"OpenStreetMap Colombia",description:"News of the OpenStreetMap Colombia community and the OSMCo Foundation"},"ym-Universidad-de-Antioquia":{name:"Geomatica UDEA",description:"YouthMappers chapter at Universidad de Antioquia",extendedDescription:"We are a group interested in geospatial data, voluntary cartography, and participating in mapping with others in our country and within the YouthMappers network."},"ym-Universidad-de-La-Guajira":{name:"Grupo Mesh",description:"YouthMappers chapter at Universidad de La Guajira",extendedDescription:"Grupo Mesh is a student organization at the Universidad de la Guajira in Colombia, including students from the program of Environmental Engineering who learn cartography and open mapping."},"ym-Universidad-de-Los-Andes":{name:"Cartografos Uniandes",description:"YouthMappers chapter at Universidad de Los Andes",extendedDescription:"We are a circle of student participation that seeks to use mapping and spatial reasoning as a means to create bonds of cooperation and integration between the university and society by addressing different spatial, social, political , economic and cultural dynamics."},"ym-Universidad-de-San-Buenaventura":{name:"YouthMappers San Buenaventura",description:"YouthMappers chapter at Universidad de San Buenaventura",extendedDescription:"We are pleased to join YouthMappers mapping for a better world and community."},"ym-Universidad-Distrital-Francisco-Jose-de-Caldas":{name:"YouthMappers at Bogota",description:"YouthMappers chapter at Universidad Distrital Francisco Jose de Caldas",extendedDescription:"The Universidad Distrital Francisco José de Caldas is a public, coeducational, research university based in Bogotá, Colombia with a population of 26,140 students."},"ym-Universidad-Nacional-de-Colombia":{name:"Grupo UN",description:"YouthMappers chapter at Universidad Nacional de Colombia",extendedDescription:"Students are uniting to map and network with university students across the country of Colombia and across the globe.  Geographic specialties include affiliation with microbiology and health disciplines."},"OSM-EC-telegram":{name:"OSM Ecuador on Telegram",description:"OpenStreetMap Ecuador Telegram chat"},"OSM-PY-telegram":{name:"OSM Paraguay on Telegram",description:"OpenStreetMap Paraguay Telegram chat"},"OSM-PE-facebook":{name:"OpenStreetMap Peru Facebook",description:"Join the OpenStreetMap Peru community on Facebook"},"OSM-PE-mailinglist":{name:"Talk-pe Mailing List",description:"The official mailing list for the OpenStreetMap Peru community"},"OSM-PE-matrix":{name:"OpenStreetMap Peru Matrix Chat",description:"Chat with other members of the OpenStreetMap Peru community in Matrix."},"OSM-PE-telegram":{name:"OpenStreetMap Peru Telegram",description:"Join the OpenStreetMap Peru community on Telegram"},"OSM-PE-twitter":{name:"OpenStreetMap Peru Twitter",description:"Follow us on Twitter at {url}"},"OSM-PE":{name:"OpenStreetMap Peru",description:"News and resources for the OpenStreetMap Peru community"},"LATAM-Facebook":{name:"OpenStreetMap Latam Facebook",description:"OpenStreetMap Latam on Facebook"},"LATAM-Telegram":{name:"OpenStreetMap Latam Telegram",description:"OpenStreetMap Telegram for Latin America"},"LATAM-Twitter":{name:"OpenStreetMap Latam Twitter",description:"Follow us on Twitter at {url}"},"osm-latam":{name:"OpenStreetMap Latam",description:"Supporting OpenStreetMap in Latin America",events:{"sotm-latam-2018":{name:"State of the Map Latam 2018",description:"State of the Map Latam is the annual conference for all mappers and users of OpenStreetMap in Latin America. The program includes talks, panels, workshops, and mapathons related to OpenStreetMap.",where:"Buenos Aires, Argentina"}}},"OSM-Discord":{name:"OpenStreetMap Discord",description:"Get in touch with other mappers via Discord"},"OSM-Facebook":{name:"OpenStreetMap on Facebook",description:"Like us on Facebook for news and updates about OpenStreetMap."},"OSM-help":{name:"OpenStreetMap Help",description:"Ask a question and get answers on OSM's community-driven question and answer site.",extendedDescription:"{url} is for everyone who needs help with OpenStreetMap.  Whether you are a beginner mapper or have a technical question, we're here to help!"},"OSM-IRC":{name:"OpenStreetMap IRC",description:"Join #osm on irc.oftc.net (port 6667)"},"OSM-Reddit":{name:"OpenStreetMap on Reddit",description:"/r/openstreetmap/ is a great place to learn more about OpenStreetMap.  Ask us anything!"},"OSM-Telegram":{name:"OpenStreetMap Telegram",description:"Join the OpenStreetMap Telegram global supergroup at {url}"},"OSM-Twitter":{name:"OpenStreetMap Twitter",description:"Follow us on Twitter at {url}"},OSMF:{name:"OpenStreetMap Foundation",description:"OSMF is a UK-based not-for-profit that supports the OpenStreetMap Project",extendedDescription:"OSMF supports the OpenStreetMap by fundraising, maintaining the servers which power OSM, organizing the annual State of the Map conference, and coordinating the volunteers who keep OSM running. You can show your support and have a voice in the direction of OpenStreetMap by joining as an OSMF member here: {signupUrl}",events:{sotm2018:{name:"State of the Map 2018",description:"Join us for 3 days in Milan, Italy for the annual worldwide OpenStreetMap conference, bringing together everyone in the community to socialize, share, and learn.",where:"Milan, Italy"}}}}};
24691
24692         var features$2 = {botswana:{type:"Feature",id:"botswana",properties:{},geometry:{type:"Polygon",coordinates:[[[25.65423,-18.48085],[25.70131,-18.56629],[25.79198,-18.60814],[25.83557,-18.82958],[25.95414,-18.89236],[26.00296,-19.02313],[25.9925,-19.058],[26.17908,-19.52356],[26.25057,-19.57064],[26.32554,-19.57064],[26.37611,-19.62121],[26.35344,-19.64562],[26.70741,-19.87404],[26.73356,-19.91763],[26.97419,-20.00133],[27.04394,-19.99784],[27.13984,-20.06585],[27.22005,-20.07456],[27.30723,-20.22626],[27.31769,-20.45643],[27.73269,-20.4913],[27.74664,-20.70926],[27.71525,-21.07718],[27.9088,-21.2777],[28.02562,-21.55668],[28.19825,-21.5933],[28.37261,-21.59679],[28.50339,-21.65433],[28.58011,-21.62643],[28.8033,-21.71362],[29.08577,-21.80603],[29.03346,-21.90193],[29.06659,-22.02399],[29.17645,-22.07107],[29.25665,-22.05189],[29.38569,-22.19312],[29.32117,-22.21231],[29.0387,-22.23323],[29.01428,-22.27159],[28.97941,-22.31344],[28.98115,-22.34482],[28.94105,-22.45991],[28.52257,-22.59766],[28.36041,-22.58371],[28.18255,-22.70053],[28.18255,-22.74761],[28.06747,-22.89931],[27.95239,-22.9708],[27.96285,-23.03532],[27.74838,-23.24107],[27.68561,-23.21666],[27.62109,-23.23758],[27.56006,-23.36836],[27.2741,-23.49565],[27.08578,-23.66304],[27.00034,-23.70489],[26.88875,-24.10593],[26.87654,-24.26635],[26.74228,-24.31343],[26.57663,-24.45292],[26.42842,-24.64821],[25.8844,-24.77724],[25.89486,-24.88012],[25.76585,-25.17485],[25.66467,-25.48682],[25.58448,-25.64908],[25.3456,-25.78509],[25.11021,-25.76939],[25.02517,-25.71967],[24.92538,-25.81822],[24.69696,-25.83042],[24.46156,-25.74324],[24.37786,-25.76765],[24.21127,-25.67022],[23.92974,-25.64036],[23.66819,-25.44158],[23.3121,-25.26869],[22.88179,-25.50087],[22.72835,-26.01351],[22.63768,-26.10767],[22.56793,-26.2367],[22.48424,-26.21054],[22.35521,-26.33609],[22.24971,-26.35352],[22.07317,-26.63251],[21.9668,-26.67131],[21.79767,-26.66956],[21.77761,-26.69223],[21.80377,-26.78465],[21.6913,-26.87096],[21.59889,-26.8605],[21.5274,-26.86224],[21.32339,-26.84349],[21.14248,-26.87375],[21.00386,-26.84873],[20.98729,-26.81621],[20.85826,-26.80575],[20.68477,-26.92022],[20.61677,-26.79293],[20.61589,-26.68718],[20.622,-26.60461],[20.5941,-26.47558],[20.82252,-26.153],[20.78939,-25.92458],[20.63769,-25.63862],[20.63595,-25.55143],[20.36045,-25.06321],[20.25583,-24.93766],[20.11982,-24.89756],[19.98556,-24.76853],[19.99602,-21.99435],[20.9934,-22.00132],[20.99514,-18.30648],[21.45547,-18.31171],[23.10324,-17.98913],[23.31422,-17.98913],[23.43105,-18.18268],[23.54439,-18.26289],[23.60542,-18.48085],[23.77455,-18.36577],[23.91928,-18.20884],[24.18606,-18.01355],[24.36915,-17.94031],[24.47377,-17.956],[24.51038,-18.03621],[24.57839,-18.05714],[24.615,-17.98565],[24.71439,-17.89498],[24.97594,-17.77466],[25.09102,-17.82174],[25.15903,-17.76246],[25.27411,-17.79559],[25.25493,-17.91241],[25.31596,-18.06062],[25.40489,-18.1077],[25.5374,-18.37972],[25.65423,-18.48085]]]}},"Centre-Universitaire-de-Recherche-et-dApplication-en-Tldtection-CURAT-de-lUniversit-Felix-Houphouet-Boigny":{type:"Feature",id:"Centre-Universitaire-de-Recherche-et-dApplication-en-Tldtection-CURAT-de-lUniversit-Felix-Houphouet-Boigny",properties:{},geometry:{type:"Polygon",coordinates:[[[-3.98799,5.5686],[-3.94397,5.56428],[-3.90165,5.5515],[-3.86264,5.53074],[-3.82846,5.5028],[-3.80041,5.46876],[-3.77958,5.42993],[-3.76675,5.38779],[-3.76243,5.34398],[-3.76678,5.30017],[-3.77963,5.25804],[-3.80049,5.21922],[-3.82854,5.1852],[-3.86272,5.15728],[-3.90171,5.13653],[-3.94401,5.12375],[-3.98799,5.11944],[-4.03198,5.12375],[-4.07428,5.13653],[-4.11327,5.15728],[-4.14745,5.1852],[-4.1755,5.21922],[-4.19635,5.25804],[-4.2092,5.30017],[-4.21355,5.34398],[-4.20924,5.38779],[-4.19641,5.42993],[-4.17558,5.46876],[-4.14753,5.5028],[-4.11335,5.53074],[-4.07434,5.5515],[-4.03201,5.56428],[-3.98799,5.5686]]]}},"The-Gambia-YMCA-University-of-the-Gambia":{type:"Feature",id:"The-Gambia-YMCA-University-of-the-Gambia",properties:{},geometry:{type:"Polygon",coordinates:[[[-16.6763,13.68253],[-16.63121,13.67821],[-16.58785,13.66542],[-16.54791,13.64465],[-16.5129,13.6167],[-16.48419,13.58265],[-16.46288,13.54381],[-16.44977,13.50166],[-16.44538,13.45785],[-16.44986,13.41404],[-16.46303,13.37192],[-16.4844,13.33311],[-16.51312,13.2991],[-16.54811,13.27119],[-16.58801,13.25045],[-16.63129,13.23769],[-16.6763,13.23337],[-16.72131,13.23769],[-16.76459,13.25045],[-16.80449,13.27119],[-16.83948,13.2991],[-16.8682,13.33311],[-16.88956,13.37192],[-16.90274,13.41404],[-16.90722,13.45785],[-16.90282,13.50166],[-16.88972,13.54381],[-16.8684,13.58265],[-16.83969,13.6167],[-16.80469,13.64465],[-16.76474,13.66542],[-16.72139,13.67821],[-16.6763,13.68253]]]}},cape_coast_gh:{type:"Feature",id:"cape_coast_gh",properties:{},geometry:{type:"Polygon",coordinates:[[[-1.6,5],[-1.6,5.4],[-1,5.4],[-1,5],[-1.6,5]]]}},ghana:{type:"Feature",properties:{},id:"ghana",geometry:{type:"Polygon",coordinates:[[[-3.11256,5.13335],[-2.97215,5.11112],[-2.94811,5.12753],[-2.75757,5.10599],[-2.7253,5.14087],[-2.78641,5.28242],[-2.78297,5.29541],[-2.76993,5.2937],[-2.76546,5.31797],[-2.77748,5.33079],[-2.77319,5.35557],[-2.72495,5.34224],[-2.78023,5.60642],[-2.86022,5.65049],[-2.92889,5.61838],[-2.96631,5.64127],[-2.95292,5.71643],[-3.02639,5.7096],[-3.01987,5.8575],[-3.07411,5.98624],[-3.10226,6.15284],[-3.15514,6.25114],[-3.17574,6.25182],[-3.17162,6.29755],[-3.23753,6.54183],[-3.23341,6.60049],[-3.26157,6.61959],[-3.21007,6.73417],[-3.24028,6.83031],[-2.95326,7.23817],[-2.97558,7.27018],[-2.92236,7.61436],[-2.77611,7.94432],[-2.60513,8.03747],[-2.62985,8.11769],[-2.48978,8.20877],[-2.64221,9.00988],[-2.77679,9.03972],[-2.76581,9.15633],[-2.66968,9.26478],[-2.93884,10.66601],[-2.82898,11.0113],[-0.68939,11.00051],[-0.60974,10.91962],[-0.43121,11.04095],[-0.43396,11.10295],[-0.27843,11.17672],[-0.13424,11.13967],[-0.14214,11.10632],[-0.05905,11.08341],[-0.0388,11.10733],[-0.01339,11.11204],[0.02369,11.05308],[0.03296,10.97793],[-0.00549,10.96411],[-0.02266,10.81914],[-0.07141,10.76856],[-0.07999,10.69806],[-0.05905,10.63294],[0.04257,10.60257],[0.0618,10.56207],[0.14351,10.52629],[0.17097,10.42265],[0.26711,10.41151],[0.28633,10.42096],[0.34264,10.31357],[0.39757,10.31492],[0.39722,10.30546],[0.37148,10.28283],[0.35225,10.10746],[0.41817,10.06487],[0.40924,10.01822],[0.36461,10.03174],[0.34676,9.66506],[0.26779,9.64678],[0.24994,9.44771],[0.42847,9.48564],[0.56168,9.40977],[0.48203,8.80501],[0.3804,8.74122],[0.47653,8.59324],[0.65369,8.49546],[0.65781,8.42347],[0.70862,8.38339],[0.72784,8.28964],[0.60425,8.21693],[0.62004,7.70623],[0.59464,7.70283],[0.5809,7.62253],[0.52322,7.5953],[0.52734,7.45099],[0.56168,7.39243],[0.62759,7.40741],[0.66055,7.30935],[0.59395,7.11248],[0.61317,7.09306],[0.59601,7.00549],[0.52322,6.97823],[0.52322,6.94006],[0.56442,6.92234],[0.53284,6.82962],[0.65094,6.73962],[0.63446,6.63733],[0.74707,6.57048],[0.71411,6.51864],[0.90242,6.33355],[1.00405,6.33543],[1.02516,6.25319],[1.05537,6.22964],[1.1,6.17],[1.2,6.17],[1.2,4],[-3,4.5],[-3.11256,5.13335]]]}},"Kwame-Nkrumah-University-of-Science-and-Technology":{type:"Feature",id:"Kwame-Nkrumah-University-of-Science-and-Technology",properties:{},geometry:{type:"Polygon",coordinates:[[[-1.56831,6.89695],[-1.52418,6.89263],[-1.48174,6.87985],[-1.44264,6.85909],[-1.40837,6.83115],[-1.38026,6.7971],[-1.35937,6.75827],[-1.34652,6.71613],[-1.3422,6.67232],[-1.34656,6.62851],[-1.35945,6.58638],[-1.38035,6.54757],[-1.40848,6.51354],[-1.44274,6.48562],[-1.48182,6.46488],[-1.52422,6.45211],[-1.56831,6.44779],[-1.6124,6.45211],[-1.6548,6.46488],[-1.69388,6.48562],[-1.72814,6.51354],[-1.75627,6.54757],[-1.77717,6.58638],[-1.79006,6.62851],[-1.79442,6.67232],[-1.7901,6.71613],[-1.77725,6.75827],[-1.75636,6.7971],[-1.72825,6.83115],[-1.69398,6.85909],[-1.65488,6.87985],[-1.61244,6.89263],[-1.56831,6.89695]]]}},"University-of-Cape-Coast":{type:"Feature",id:"University-of-Cape-Coast",properties:{},geometry:{type:"Polygon",coordinates:[[[-1.23047,5.31552],[-1.18647,5.31121],[-1.14416,5.29842],[-1.10517,5.27766],[-1.071,5.24973],[-1.04296,5.21569],[-1.02214,5.17685],[-1.00932,5.13472],[-1.005,5.0909],[-1.00935,5.04709],[-1.02219,5.00497],[-1.04303,4.96615],[-1.07108,4.93212],[-1.10524,4.9042],[-1.14421,4.88345],[-1.1865,4.87068],[-1.23047,4.86637],[-1.27444,4.87068],[-1.31672,4.88345],[-1.3557,4.9042],[-1.38986,4.93212],[-1.4179,4.96615],[-1.43875,5.00497],[-1.45159,5.04709],[-1.45594,5.0909],[-1.45162,5.13472],[-1.4388,5.17685],[-1.41798,5.21569],[-1.38994,5.24973],[-1.35577,5.27766],[-1.31678,5.29842],[-1.27447,5.31121],[-1.23047,5.31552]]]}},"University-of-Energy-and-Natural-Resources":{type:"Feature",id:"University-of-Energy-and-Natural-Resources",properties:{},geometry:{type:"Polygon",coordinates:[[[-2.343,7.57482],[-2.2988,7.5705],[-2.2563,7.55771],[-2.21714,7.53695],[-2.18283,7.50901],[-2.15467,7.47497],[-2.13376,7.43613],[-2.12089,7.394],[-2.11656,7.35018],[-2.12093,7.30637],[-2.13384,7.26425],[-2.15477,7.22543],[-2.18294,7.19141],[-2.21725,7.16349],[-2.25639,7.14275],[-2.29885,7.12997],[-2.343,7.12566],[-2.38715,7.12997],[-2.42961,7.14275],[-2.46875,7.16349],[-2.50306,7.19141],[-2.53123,7.22543],[-2.55216,7.26425],[-2.56507,7.30637],[-2.56944,7.35018],[-2.56511,7.394],[-2.55224,7.43613],[-2.53133,7.47497],[-2.50317,7.50901],[-2.46886,7.53695],[-2.4297,7.55771],[-2.3872,7.5705],[-2.343,7.57482]]]}},"University-of-Ghana":{type:"Feature",id:"University-of-Ghana",properties:{},geometry:{type:"Polygon",coordinates:[[[-0.19624,5.87573],[-0.15219,5.87141],[-0.10984,5.85863],[-0.07082,5.83787],[-0.03662,5.80993],[-0.00855,5.77589],[0.01229,5.73706],[0.02512,5.69492],[0.02944,5.65111],[0.02509,5.6073],[0.01223,5.56517],[-0.00863,5.52635],[-0.0367,5.49233],[-0.0709,5.46441],[-0.1099,5.44366],[-0.15223,5.43089],[-0.19624,5.42657],[-0.24025,5.43089],[-0.28257,5.44366],[-0.32157,5.46441],[-0.35577,5.49233],[-0.38384,5.52635],[-0.4047,5.56517],[-0.41756,5.6073],[-0.42191,5.65111],[-0.41759,5.69492],[-0.40476,5.73706],[-0.38392,5.77589],[-0.35586,5.80993],[-0.32166,5.83787],[-0.28263,5.85863],[-0.24028,5.87141],[-0.19624,5.87573]]]}},"University-of-Mines-and-Technology":{type:"Feature",id:"University-of-Mines-and-Technology",properties:{},geometry:{type:"Polygon",coordinates:[[[-2.00125,5.52338],[-1.95723,5.51907],[-1.91491,5.50628],[-1.87591,5.48552],[-1.84173,5.45759],[-1.81368,5.42355],[-1.79285,5.38471],[-1.78003,5.34258],[-1.77571,5.29876],[-1.78006,5.25495],[-1.7929,5.21283],[-1.81376,5.17401],[-1.84181,5.13998],[-1.87598,5.11206],[-1.91497,5.09132],[-1.95726,5.07854],[-2.00125,5.07423],[-2.04524,5.07854],[-2.08753,5.09132],[-2.12652,5.11206],[-2.16069,5.13998],[-2.18874,5.17401],[-2.2096,5.21283],[-2.22244,5.25495],[-2.22679,5.29876],[-2.22247,5.34258],[-2.20965,5.38471],[-2.18882,5.42355],[-2.16077,5.45759],[-2.12659,5.48552],[-2.08759,5.50628],[-2.04527,5.51907],[-2.00125,5.52338]]]}},"General-Lansana-Conte-University":{type:"Feature",id:"General-Lansana-Conte-University",properties:{},geometry:{type:"Polygon",coordinates:[[[-13.62305,9.93364],[-13.57857,9.92932],[-13.5358,9.91653],[-13.49639,9.89576],[-13.46186,9.86782],[-13.43353,9.83377],[-13.41249,9.79494],[-13.39955,9.7528],[-13.3952,9.70898],[-13.39961,9.66517],[-13.4126,9.62305],[-13.43367,9.58424],[-13.46201,9.55022],[-13.49653,9.5223],[-13.53591,9.50156],[-13.57863,9.48879],[-13.62305,9.48448],[-13.66747,9.48879],[-13.71018,9.50156],[-13.74956,9.5223],[-13.78408,9.55022],[-13.81242,9.58424],[-13.83349,9.62305],[-13.84648,9.66517],[-13.85089,9.70898],[-13.84654,9.7528],[-13.8336,9.79494],[-13.81256,9.83377],[-13.78423,9.86782],[-13.7497,9.89576],[-13.71029,9.91653],[-13.66753,9.92932],[-13.62305,9.93364]]]}},"Institute-of-Science-and-Veterinary-Medicine":{type:"Feature",id:"Institute-of-Science-and-Veterinary-Medicine",properties:{},geometry:{type:"Polygon",coordinates:[[[-12.1175,10.91114],[-12.07288,10.90682],[-12.02998,10.89403],[-11.99045,10.87326],[-11.95581,10.84532],[-11.9274,10.81127],[-11.90629,10.77243],[-11.89332,10.73029],[-11.88896,10.68648],[-11.89338,10.64267],[-11.90641,10.60055],[-11.92755,10.56173],[-11.95598,10.52772],[-11.99061,10.4998],[-12.0301,10.47906],[-12.07295,10.46629],[-12.1175,10.46198],[-12.16205,10.46629],[-12.2049,10.47906],[-12.24439,10.4998],[-12.27902,10.52772],[-12.30745,10.56173],[-12.32859,10.60055],[-12.34162,10.64267],[-12.34604,10.68648],[-12.34168,10.73029],[-12.32871,10.77243],[-12.3076,10.81127],[-12.27919,10.84532],[-12.24455,10.87326],[-12.20502,10.89403],[-12.16212,10.90682],[-12.1175,10.91114]]]}},"Universit-de-NZrkor":{type:"Feature",id:"Universit-de-NZrkor",properties:{},geometry:{type:"Polygon",coordinates:[[[-8.83716,7.95701],[-8.79292,7.95269],[-8.75039,7.9399],[-8.71119,7.91914],[-8.67684,7.8912],[-8.64866,7.85715],[-8.62773,7.81832],[-8.61485,7.77618],[-8.61052,7.73237],[-8.6149,7.68856],[-8.62781,7.64643],[-8.64877,7.60762],[-8.67696,7.5736],[-8.7113,7.54568],[-8.75047,7.52493],[-8.79297,7.51216],[-8.83716,7.50785],[-8.88135,7.51216],[-8.92385,7.52493],[-8.96302,7.54568],[-8.99736,7.5736],[-9.02555,7.60762],[-9.0465,7.64643],[-9.05942,7.68856],[-9.0638,7.73237],[-9.05947,7.77618],[-9.04659,7.81832],[-9.02566,7.85715],[-8.99748,7.8912],[-8.96313,7.91914],[-8.92393,7.9399],[-8.8814,7.95269],[-8.83716,7.95701]]]}},"Dedan-Kimathi-University-of-Technology":{type:"Feature",id:"Dedan-Kimathi-University-of-Technology",properties:{},geometry:{type:"Polygon",coordinates:[[[37.00195,-0.21487],[37.04577,-0.21919],[37.0879,-0.23196],[37.12672,-0.25272],[37.16076,-0.28065],[37.18869,-0.31468],[37.20944,-0.3535],[37.22222,-0.39563],[37.22654,-0.43945],[37.22222,-0.48326],[37.20945,-0.52539],[37.18869,-0.56422],[37.16076,-0.59825],[37.12673,-0.62618],[37.0879,-0.64693],[37.04577,-0.65971],[37.00195,-0.66403],[36.95814,-0.65971],[36.91601,-0.64693],[36.87718,-0.62618],[36.84314,-0.59825],[36.81521,-0.56422],[36.79446,-0.52539],[36.78168,-0.48326],[36.77737,-0.43945],[36.78168,-0.39563],[36.79447,-0.3535],[36.81522,-0.31468],[36.84315,-0.28065],[36.87718,-0.25272],[36.91601,-0.23196],[36.95814,-0.21919],[37.00195,-0.21487]]]}},"Jomo-Kenyatta-University-of-Agriculture-and-Technology":{type:"Feature",id:"Jomo-Kenyatta-University-of-Agriculture-and-Technology",properties:{},geometry:{type:"Polygon",coordinates:[[[37.0105,-0.86452],[37.05432,-0.86884],[37.09645,-0.88162],[37.13528,-0.90237],[37.16932,-0.93029],[37.19726,-0.96433],[37.21802,-1.00315],[37.2308,-1.04528],[37.23512,-1.08909],[37.23081,-1.1329],[37.21803,-1.17504],[37.19727,-1.21386],[37.16934,-1.2479],[37.1353,-1.27583],[37.09646,-1.29658],[37.05432,-1.30936],[37.0105,-1.31368],[36.96668,-1.30936],[36.92454,-1.29658],[36.8857,-1.27583],[36.85166,-1.2479],[36.82373,-1.21386],[36.80297,-1.17504],[36.79019,-1.1329],[36.78588,-1.08909],[36.7902,-1.04528],[36.80298,-1.00315],[36.82374,-0.96433],[36.85168,-0.93029],[36.88572,-0.90237],[36.92455,-0.88162],[36.96668,-0.86884],[37.0105,-0.86452]]]}},"Karatina-University":{type:"Feature",id:"Karatina-University",properties:{},geometry:{type:"Polygon",coordinates:[[[37.12789,-0.25676],[37.1717,-0.26108],[37.21383,-0.27386],[37.25266,-0.29461],[37.28669,-0.32254],[37.31462,-0.35657],[37.33538,-0.3954],[37.34816,-0.43752],[37.35247,-0.48134],[37.34816,-0.52515],[37.33538,-0.56728],[37.31463,-0.60611],[37.2867,-0.64014],[37.25267,-0.66807],[37.21384,-0.68882],[37.1717,-0.7016],[37.12789,-0.70592],[37.08407,-0.7016],[37.04194,-0.68882],[37.00311,-0.66807],[36.96908,-0.64014],[36.94115,-0.60611],[36.92039,-0.56728],[36.90762,-0.52515],[36.9033,-0.48134],[36.90762,-0.43752],[36.9204,-0.3954],[36.94115,-0.35657],[36.96908,-0.32254],[37.00312,-0.29461],[37.04194,-0.27386],[37.08407,-0.26108],[37.12789,-0.25676]]]}},"Kenyatta-University":{type:"Feature",id:"Kenyatta-University",properties:{},geometry:{type:"Polygon",coordinates:[[[36.93493,-0.95538],[36.97875,-0.9597],[37.02089,-0.97248],[37.05972,-0.99323],[37.09376,-1.02116],[37.12169,-1.05519],[37.14245,-1.09401],[37.15524,-1.13614],[37.15956,-1.17995],[37.15524,-1.22377],[37.14247,-1.2659],[37.12171,-1.30472],[37.09378,-1.33876],[37.05974,-1.36669],[37.0209,-1.38744],[36.97876,-1.40023],[36.93493,-1.40454],[36.8911,-1.40023],[36.84896,-1.38744],[36.81013,-1.36669],[36.77609,-1.33876],[36.74815,-1.30472],[36.7274,-1.2659],[36.71462,-1.22377],[36.7103,-1.17995],[36.71462,-1.13614],[36.72741,-1.09401],[36.74817,-1.05519],[36.7761,-1.02116],[36.81014,-0.99323],[36.84898,-0.97248],[36.89111,-0.9597],[36.93493,-0.95538]]]}},"Moi-University":{type:"Feature",id:"Moi-University",properties:{},geometry:{type:"Polygon",coordinates:[[[35.50781,-0.12698],[35.55163,-0.1313],[35.59376,-0.14408],[35.63258,-0.16483],[35.66661,-0.19276],[35.69454,-0.22679],[35.7153,-0.26562],[35.72808,-0.30774],[35.7324,-0.35156],[35.72808,-0.39537],[35.7153,-0.4375],[35.69455,-0.47633],[35.66662,-0.51036],[35.63259,-0.53829],[35.59376,-0.55904],[35.55163,-0.57182],[35.50781,-0.57614],[35.464,-0.57182],[35.42187,-0.55904],[35.38304,-0.53829],[35.34901,-0.51036],[35.32108,-0.47633],[35.30032,-0.4375],[35.28754,-0.39537],[35.28323,-0.35156],[35.28755,-0.30774],[35.30033,-0.26562],[35.32108,-0.22679],[35.34901,-0.19276],[35.38304,-0.16483],[35.42187,-0.14408],[35.464,-0.1313],[35.50781,-0.12698]]]}},"Technical-University-of-Kenya":{type:"Feature",id:"Technical-University-of-Kenya",properties:{},geometry:{type:"Polygon",coordinates:[[[36.82449,-1.06703],[36.86831,-1.07134],[36.91045,-1.08412],[36.94928,-1.10487],[36.98332,-1.1328],[37.01126,-1.16683],[37.03202,-1.20566],[37.04481,-1.24778],[37.04913,-1.2916],[37.04481,-1.33541],[37.03203,-1.37754],[37.01128,-1.41637],[36.98334,-1.4504],[36.9493,-1.47833],[36.91046,-1.49909],[36.86832,-1.51187],[36.82449,-1.51618],[36.78066,-1.51187],[36.73852,-1.49909],[36.69968,-1.47833],[36.66564,-1.4504],[36.6377,-1.41637],[36.61695,-1.37754],[36.60417,-1.33541],[36.59986,-1.2916],[36.60418,-1.24778],[36.61696,-1.20566],[36.63772,-1.16683],[36.66566,-1.1328],[36.6997,-1.10487],[36.73853,-1.08412],[36.78067,-1.07134],[36.82449,-1.06703]]]}},"University-of-Nairobi":{type:"Feature",id:"University-of-Nairobi",properties:{},geometry:{type:"Polygon",coordinates:[[[36.82617,-1.09366],[36.86999,-1.09798],[36.91213,-1.11076],[36.95097,-1.13151],[36.98501,-1.15944],[37.01294,-1.19347],[37.0337,-1.23229],[37.04649,-1.27442],[37.05081,-1.31823],[37.0465,-1.36205],[37.03372,-1.40418],[37.01296,-1.44301],[36.98503,-1.47704],[36.95098,-1.50497],[36.91214,-1.52573],[36.87,-1.53851],[36.82617,-1.54282],[36.78234,-1.53851],[36.7402,-1.52573],[36.70136,-1.50497],[36.66732,-1.47704],[36.63938,-1.44301],[36.61863,-1.40418],[36.60585,-1.36205],[36.60153,-1.31823],[36.60585,-1.27442],[36.61864,-1.23229],[36.6394,-1.19347],[36.66734,-1.15944],[36.70138,-1.13151],[36.74021,-1.11076],[36.78235,-1.09798],[36.82617,-1.09366]]]}},"African-Methodist-Episcopal-University":{type:"Feature",id:"African-Methodist-Episcopal-University",properties:{},geometry:{type:"Polygon",coordinates:[[[-10.80063,6.53533],[-10.75653,6.53101],[-10.71413,6.51823],[-10.67505,6.49747],[-10.64081,6.46953],[-10.61272,6.43549],[-10.59185,6.39665],[-10.579,6.35452],[-10.57468,6.3107],[-10.57904,6.26689],[-10.59192,6.22477],[-10.61281,6.18595],[-10.64091,6.15193],[-10.67514,6.12401],[-10.7142,6.10326],[-10.75657,6.09049],[-10.80063,6.08617],[-10.84469,6.09049],[-10.88706,6.10326],[-10.92612,6.12401],[-10.96035,6.15193],[-10.98845,6.18595],[-11.00934,6.22477],[-11.02222,6.26689],[-11.02658,6.3107],[-11.02226,6.35452],[-11.00941,6.39665],[-10.98854,6.43549],[-10.96045,6.46953],[-10.92621,6.49747],[-10.88713,6.51823],[-10.84473,6.53101],[-10.80063,6.53533]]]}},"Cuttington-University":{type:"Feature",id:"Cuttington-University",properties:{},geometry:{type:"Polygon",coordinates:[[[-9.5539,7.26498],[-9.50973,7.26066],[-9.46727,7.24788],[-9.42813,7.22711],[-9.39384,7.19917],[-9.3657,7.16513],[-9.3448,7.1263],[-9.33194,7.08416],[-9.32762,7.04035],[-9.33198,6.99653],[-9.34488,6.95441],[-9.3658,6.91559],[-9.39395,6.88157],[-9.42823,6.85365],[-9.46734,6.83291],[-9.50977,6.82013],[-9.5539,6.81582],[-9.59803,6.82013],[-9.64046,6.83291],[-9.67957,6.85365],[-9.71385,6.88157],[-9.742,6.91559],[-9.76292,6.95441],[-9.77582,6.99653],[-9.78018,7.04035],[-9.77586,7.08416],[-9.763,7.1263],[-9.7421,7.16513],[-9.71396,7.19917],[-9.67967,7.22711],[-9.64053,7.24788],[-9.59807,7.26066],[-9.5539,7.26498]]]}},"Grand-Gedeh-County-Community-College":{type:"Feature",id:"Grand-Gedeh-County-Community-College",properties:{},geometry:{type:"Polygon",coordinates:[[[-8.11817,6.28853],[-8.07409,6.28421],[-8.03171,6.27143],[-7.99266,6.25066],[-7.95843,6.22273],[-7.93035,6.18869],[-7.90949,6.14985],[-7.89665,6.10772],[-7.89233,6.0639],[-7.89669,6.02009],[-7.90955,5.97797],[-7.93043,5.93915],[-7.95852,5.90512],[-7.99274,5.8772],[-8.03178,5.85646],[-8.07413,5.84368],[-8.11817,5.83937],[-8.16221,5.84368],[-8.20456,5.85646],[-8.2436,5.8772],[-8.27782,5.90512],[-8.30591,5.93915],[-8.32679,5.97797],[-8.33966,6.02009],[-8.34401,6.0639],[-8.33969,6.10772],[-8.32686,6.14985],[-8.306,6.18869],[-8.27791,6.22273],[-8.24369,6.25066],[-8.20463,6.27143],[-8.16225,6.28421],[-8.11817,6.28853]]]}},"Nimba-County-Community-College":{type:"Feature",id:"Nimba-County-Community-College",properties:{},geometry:{type:"Polygon",coordinates:[[[-8.71645,7.57669],[-8.67226,7.57237],[-8.62976,7.55959],[-8.5906,7.53882],[-8.55628,7.51088],[-8.52812,7.47684],[-8.50721,7.438],[-8.49434,7.39587],[-8.49001,7.35205],[-8.49439,7.30824],[-8.50729,7.26612],[-8.52823,7.2273],[-8.55639,7.19328],[-8.5907,7.16536],[-8.62984,7.14462],[-8.6723,7.13185],[-8.71645,7.12753],[-8.76061,7.13185],[-8.80307,7.14462],[-8.84221,7.16536],[-8.87652,7.19328],[-8.90468,7.2273],[-8.92562,7.26612],[-8.93852,7.30824],[-8.9429,7.35205],[-8.93857,7.39587],[-8.9257,7.438],[-8.90479,7.47684],[-8.87663,7.51088],[-8.84231,7.53882],[-8.80315,7.55959],[-8.76065,7.57237],[-8.71645,7.57669]]]}},"Stella-Maris-Polytechnic":{type:"Feature",id:"Stella-Maris-Polytechnic",properties:{},geometry:{type:"Polygon",coordinates:[[[-10.7944,6.51458],[-10.7503,6.51026],[-10.7079,6.49748],[-10.66883,6.47672],[-10.63459,6.44878],[-10.60649,6.41474],[-10.58562,6.3759],[-10.57278,6.33377],[-10.56846,6.28995],[-10.57282,6.24614],[-10.58569,6.20402],[-10.60658,6.1652],[-10.63469,6.13117],[-10.66892,6.10325],[-10.70797,6.08251],[-10.75034,6.06973],[-10.7944,6.06542],[-10.83846,6.06973],[-10.88083,6.08251],[-10.91988,6.10325],[-10.95411,6.13117],[-10.98222,6.1652],[-11.00311,6.20402],[-11.01598,6.24614],[-11.02034,6.28995],[-11.01602,6.33377],[-11.00318,6.3759],[-10.98231,6.41474],[-10.95421,6.44878],[-10.91997,6.47672],[-10.8809,6.49748],[-10.8385,6.51026],[-10.7944,6.51458]]]}},"University-of-Liberia-YouthMappers":{type:"Feature",id:"University-of-Liberia-YouthMappers",properties:{},geometry:{type:"Polygon",coordinates:[[[-10.61986,6.60165],[-10.57576,6.59733],[-10.53335,6.58454],[-10.49427,6.56378],[-10.46002,6.53584],[-10.43192,6.5018],[-10.41105,6.46297],[-10.39821,6.42083],[-10.39389,6.37702],[-10.39825,6.33321],[-10.41112,6.29108],[-10.43202,6.25226],[-10.46012,6.21824],[-10.49436,6.19032],[-10.53342,6.16958],[-10.5758,6.1568],[-10.61986,6.15249],[-10.66393,6.1568],[-10.70631,6.16958],[-10.74536,6.19032],[-10.7796,6.21824],[-10.80771,6.25226],[-10.8286,6.29108],[-10.84148,6.33321],[-10.84584,6.37702],[-10.84152,6.42083],[-10.82867,6.46297],[-10.8078,6.5018],[-10.7797,6.53584],[-10.74546,6.56378],[-10.70638,6.58454],[-10.66397,6.59733],[-10.61986,6.60165]]]}},madagascar:{type:"Feature",id:"madagascar",properties:{},geometry:{type:"Polygon",coordinates:[[[51,-15],[47.5,-26],[42,-26],[43.5,-16],[49.5,-11],[51,-15]]]}},"University-of-Malawi":{type:"Feature",id:"University-of-Malawi",properties:{},geometry:{type:"Polygon",coordinates:[[[35.33203,-15.14437],[35.37742,-15.14868],[35.42107,-15.16145],[35.46131,-15.18218],[35.4966,-15.21009],[35.52557,-15.2441],[35.54712,-15.2829],[35.56042,-15.32502],[35.56494,-15.36883],[35.56051,-15.41265],[35.5473,-15.45479],[35.5258,-15.49364],[35.49685,-15.52769],[35.46154,-15.55564],[35.42125,-15.57642],[35.37752,-15.58921],[35.33203,-15.59353],[35.28654,-15.58921],[35.24281,-15.57642],[35.20252,-15.55564],[35.16721,-15.52769],[35.13826,-15.49364],[35.11676,-15.45479],[35.10355,-15.41265],[35.09912,-15.36883],[35.10365,-15.32502],[35.11694,-15.2829],[35.13849,-15.2441],[35.16747,-15.21009],[35.20275,-15.18218],[35.24299,-15.16145],[35.28664,-15.14868],[35.33203,-15.14437]]]}},"Universit-des-Sciences-Sociale-et-de-Gestion-de-Bamako":{type:"Feature",id:"Universit-des-Sciences-Sociale-et-de-Gestion-de-Bamako",properties:{},geometry:{type:"Polygon",coordinates:[[[-7.98832,12.83993],[-7.94339,12.83562],[-7.90018,12.82283],[-7.86037,12.80206],[-7.82549,12.77411],[-7.79688,12.74006],[-7.77564,12.70121],[-7.76257,12.65907],[-7.75819,12.61526],[-7.76265,12.57145],[-7.77578,12.52933],[-7.79707,12.49052],[-7.82569,12.45651],[-7.86056,12.4286],[-7.90033,12.40786],[-7.94347,12.39509],[-7.98832,12.39078],[-8.03318,12.39509],[-8.07632,12.40786],[-8.11609,12.4286],[-8.15095,12.45651],[-8.17958,12.49052],[-8.20087,12.52933],[-8.214,12.57145],[-8.21846,12.61526],[-8.21408,12.65907],[-8.20101,12.70121],[-8.17977,12.74006],[-8.15116,12.77411],[-8.11627,12.80206],[-8.07646,12.82283],[-8.03326,12.83562],[-7.98832,12.83993]]]}},"Universidade-Eduardo-Mondlane":{type:"Feature",id:"Universidade-Eduardo-Mondlane",properties:{},geometry:{type:"Polygon",coordinates:[[[32.60357,-25.72761],[32.65221,-25.73192],[32.69898,-25.74467],[32.74211,-25.76539],[32.77994,-25.79328],[32.81102,-25.82727],[32.83416,-25.86606],[32.84845,-25.90817],[32.85334,-25.95197],[32.84863,-25.99579],[32.83449,-26.03795],[32.81146,-26.07681],[32.78042,-26.11088],[32.74255,-26.13885],[32.69932,-26.15964],[32.65239,-26.17244],[32.60357,-26.17677],[32.55475,-26.17244],[32.50782,-26.15964],[32.46459,-26.13885],[32.42672,-26.11088],[32.39568,-26.07681],[32.37265,-26.03795],[32.35851,-25.99579],[32.35381,-25.95197],[32.3587,-25.90817],[32.37299,-25.86606],[32.39612,-25.82727],[32.4272,-25.79328],[32.46503,-25.76539],[32.50816,-25.74467],[32.55493,-25.73192],[32.60357,-25.72761]]]}},"Namibia-University-of-Science-and-Technology":{type:"Feature",id:"Namibia-University-of-Science-and-Technology",properties:{},geometry:{type:"Polygon",coordinates:[[[17.07709,-22.34124],[17.12446,-22.34555],[17.17002,-22.35831],[17.21202,-22.37903],[17.24886,-22.40692],[17.27912,-22.44092],[17.30164,-22.47972],[17.31554,-22.52183],[17.32029,-22.56563],[17.31569,-22.60945],[17.30192,-22.6516],[17.27949,-22.69046],[17.24926,-22.72453],[17.21239,-22.75249],[17.1703,-22.77327],[17.12461,-22.78607],[17.07709,-22.79039],[17.02957,-22.78607],[16.98388,-22.77327],[16.94179,-22.75249],[16.90493,-22.72453],[16.8747,-22.69046],[16.85226,-22.6516],[16.83849,-22.60945],[16.83389,-22.56563],[16.83864,-22.52183],[16.85255,-22.47972],[16.87506,-22.44092],[16.90532,-22.40692],[16.94216,-22.37903],[16.98416,-22.35831],[17.02972,-22.34555],[17.07709,-22.34124]]]}},"Abia-State-University":{type:"Feature",id:"Abia-State-University",properties:{},geometry:{type:"Polygon",coordinates:[[[7.41909,6.0554],[7.46315,6.05108],[7.50551,6.0383],[7.54455,6.01753],[7.57877,5.9896],[7.60684,5.95556],[7.62769,5.91672],[7.64052,5.87459],[7.64484,5.83077],[7.64048,5.78696],[7.62762,5.74484],[7.60675,5.70602],[7.57868,5.67199],[7.54447,5.64407],[7.50545,5.62333],[7.46312,5.61055],[7.41909,5.60624],[7.37507,5.61055],[7.33274,5.62333],[7.29372,5.64407],[7.25951,5.67199],[7.23143,5.70602],[7.21056,5.74484],[7.1977,5.78696],[7.19335,5.83077],[7.19767,5.87459],[7.2105,5.91672],[7.23135,5.95556],[7.25942,5.9896],[7.29363,6.01753],[7.33267,6.0383],[7.37503,6.05108],[7.41909,6.0554]]]}},"Ahmadu-Bello-University":{type:"Feature",id:"Ahmadu-Bello-University",properties:{},geometry:{type:"Polygon",coordinates:[[[7.64648,11.40298],[7.69118,11.39866],[7.73415,11.38587],[7.77375,11.36511],[7.80845,11.33716],[7.83691,11.30311],[7.85804,11.26427],[7.87104,11.22213],[7.87541,11.17831],[7.87097,11.13451],[7.85792,11.09239],[7.83674,11.05357],[7.80827,11.01956],[7.77359,10.99164],[7.73403,10.97091],[7.69111,10.95813],[7.64648,10.95382],[7.60186,10.95813],[7.55894,10.97091],[7.51938,10.99164],[7.4847,11.01956],[7.45622,11.05357],[7.43505,11.09239],[7.422,11.13451],[7.41756,11.17831],[7.42193,11.22213],[7.43493,11.26427],[7.45606,11.30311],[7.48452,11.33716],[7.51922,11.36511],[7.55882,11.38587],[7.60179,11.39866],[7.64648,11.40298]]]}},"Federal-School-of-Surveys":{type:"Feature",id:"Federal-School-of-Surveys",properties:{},geometry:{type:"Polygon",coordinates:[[[3.95129,8.06678],[3.99554,8.06247],[4.03808,8.04968],[4.07729,8.02892],[4.11165,8.00098],[4.13984,7.96693],[4.16077,7.9281],[4.17365,7.88596],[4.17798,7.84215],[4.17361,7.79833],[4.16069,7.75621],[4.13972,7.7174],[4.11153,7.68337],[4.07718,7.65546],[4.038,7.63471],[3.99549,7.62194],[3.95129,7.61763],[3.90708,7.62194],[3.86457,7.63471],[3.82539,7.65546],[3.79105,7.68337],[3.76285,7.7174],[3.74189,7.75621],[3.72897,7.79833],[3.72459,7.84215],[3.72892,7.88596],[3.7418,7.9281],[3.76274,7.96693],[3.79092,8.00098],[3.82528,8.02892],[3.86449,8.04968],[3.90704,8.06247],[3.95129,8.06678]]]}},"Federal-University-of-Technology-Akure":{type:"Feature",id:"Federal-University-of-Technology-Akure",properties:{},geometry:{type:"Polygon",coordinates:[[[5.18555,7.49987],[5.22974,7.49555],[5.27223,7.48277],[5.31138,7.46201],[5.34569,7.43407],[5.37385,7.40002],[5.39475,7.36119],[5.40762,7.31905],[5.41195,7.27524],[5.40758,7.23143],[5.39467,7.1893],[5.37374,7.15048],[5.34558,7.11646],[5.31128,7.08854],[5.27215,7.0678],[5.22969,7.05503],[5.18555,7.05071],[5.1414,7.05503],[5.09895,7.0678],[5.05982,7.08854],[5.02551,7.11646],[4.99735,7.15048],[4.97642,7.1893],[4.96352,7.23143],[4.95915,7.27524],[4.96347,7.31905],[4.97634,7.36119],[4.99725,7.40002],[5.0254,7.43407],[5.05971,7.46201],[5.09887,7.48277],[5.14136,7.49555],[5.18555,7.49987]]]}},"Ignatius-Ajuru-University-of-Education":{type:"Feature",id:"Ignatius-Ajuru-University-of-Education",properties:{},geometry:{type:"Polygon",coordinates:[[[6.93364,5.03111],[6.97762,5.02679],[7.01991,5.01401],[7.05888,4.99325],[7.09304,4.96531],[7.12106,4.93127],[7.14188,4.89244],[7.15469,4.85031],[7.15901,4.80649],[7.15466,4.76268],[7.14183,4.72056],[7.12099,4.68174],[7.09296,4.64771],[7.05881,4.61979],[7.01986,4.59904],[6.97759,4.58627],[6.93364,4.58195],[6.88968,4.58627],[6.84742,4.59904],[6.80846,4.61979],[6.77431,4.64771],[6.74628,4.68174],[6.72545,4.72056],[6.71261,4.76268],[6.70826,4.80649],[6.71258,4.85031],[6.72539,4.89244],[6.74621,4.93127],[6.77424,4.96531],[6.80839,4.99325],[6.84736,5.01401],[6.88965,5.02679],[6.93364,5.03111]]]}},"University-of-Nigeria-Nsukka":{type:"Feature",id:"University-of-Nigeria-Nsukka",properties:{},geometry:{type:"Polygon",coordinates:[[[7.40821,7.08921],[7.45236,7.0849],[7.49481,7.07211],[7.53393,7.05135],[7.56821,7.02341],[7.59634,6.98937],[7.61723,6.95053],[7.63008,6.9084],[7.63441,6.86458],[7.63004,6.82077],[7.61715,6.77865],[7.59624,6.73983],[7.5681,6.70581],[7.53383,6.67789],[7.49473,6.65714],[7.45232,6.64437],[7.40821,6.64006],[7.3641,6.64437],[7.32168,6.65714],[7.28259,6.67789],[7.24831,6.70581],[7.22018,6.73983],[7.19926,6.77865],[7.18637,6.82077],[7.18201,6.86458],[7.18633,6.9084],[7.19919,6.95053],[7.22008,6.98937],[7.24821,7.02341],[7.28249,7.05135],[7.32161,7.07211],[7.36406,7.0849],[7.40821,7.08921]]]}},"University-of-Port-Harcourt":{type:"Feature",id:"University-of-Port-Harcourt",properties:{},geometry:{type:"Polygon",coordinates:[[[6.92037,5.12633],[6.96436,5.12201],[7.00665,5.10923],[7.04563,5.08847],[7.07979,5.06053],[7.10782,5.02649],[7.12864,4.98766],[7.14145,4.94553],[7.14577,4.90171],[7.14142,4.8579],[7.12859,4.81578],[7.10775,4.77696],[7.07971,4.74293],[7.04556,4.71501],[7.0066,4.69426],[6.96433,4.68149],[6.92037,4.67717],[6.87641,4.68149],[6.83414,4.69426],[6.79517,4.71501],[6.76102,4.74293],[6.73299,4.77696],[6.71215,4.81578],[6.69931,4.8579],[6.69496,4.90171],[6.69928,4.94553],[6.71209,4.98766],[6.73292,5.02649],[6.76094,5.06053],[6.7951,5.08847],[6.83408,5.10923],[6.87638,5.12201],[6.92037,5.12633]]]}},"University-of-Nigeria-Enugu-Campus":{type:"Feature",id:"University-of-Nigeria-Enugu-Campus",properties:{},geometry:{type:"Polygon",coordinates:[[[7.50373,6.651],[7.54784,6.64668],[7.59025,6.63389],[7.62934,6.61313],[7.66359,6.58519],[7.69169,6.55115],[7.71256,6.51232],[7.72541,6.47018],[7.72973,6.42637],[7.72537,6.38256],[7.71249,6.34043],[7.6916,6.30161],[7.66349,6.26759],[7.62924,6.23967],[7.59018,6.21893],[7.5478,6.20615],[7.50373,6.20184],[7.45966,6.20615],[7.41728,6.21893],[7.37822,6.23967],[7.34398,6.26759],[7.31587,6.30161],[7.29497,6.34043],[7.28209,6.38256],[7.27773,6.42637],[7.28206,6.47018],[7.2949,6.51232],[7.31577,6.55115],[7.34388,6.58519],[7.37813,6.61313],[7.41721,6.63389],[7.45962,6.64668],[7.50373,6.651]]]}},"Insititue-d-Enseignement-Superieur-de-Ruhengeri":{type:"Feature",id:"Insititue-d-Enseignement-Superieur-de-Ruhengeri",properties:{},geometry:{type:"Polygon",coordinates:[[[29.6112,-1.27634],[29.65502,-1.28065],[29.69717,-1.29343],[29.736,-1.31418],[29.77005,-1.34211],[29.79799,-1.37614],[29.81875,-1.41496],[29.83154,-1.45709],[29.83586,-1.5009],[29.83154,-1.54472],[29.81876,-1.58685],[29.79801,-1.62568],[29.77007,-1.65971],[29.73602,-1.68764],[29.69718,-1.7084],[29.65503,-1.72118],[29.6112,-1.72549],[29.56737,-1.72118],[29.52522,-1.7084],[29.48638,-1.68764],[29.45233,-1.65971],[29.4244,-1.62568],[29.40364,-1.58685],[29.39086,-1.54472],[29.38655,-1.5009],[29.39087,-1.45709],[29.40365,-1.41496],[29.42442,-1.37614],[29.45236,-1.34211],[29.4864,-1.31418],[29.52524,-1.29343],[29.56738,-1.28065],[29.6112,-1.27634]]]}},"University-of-Rwanda-Huye-Campus":{type:"Feature",id:"University-of-Rwanda-Huye-Campus",properties:{},geometry:{type:"Polygon",coordinates:[[[29.7397,-2.39052],[29.78355,-2.39484],[29.82572,-2.40761],[29.86458,-2.42836],[29.89865,-2.45629],[29.92661,-2.49032],[29.94739,-2.52914],[29.96019,-2.57127],[29.96451,-2.61508],[29.9602,-2.65889],[29.94741,-2.70103],[29.92664,-2.73986],[29.89869,-2.77389],[29.86462,-2.80182],[29.82575,-2.82258],[29.78357,-2.83536],[29.7397,-2.83968],[29.69583,-2.83536],[29.65365,-2.82258],[29.61478,-2.80182],[29.58071,-2.77389],[29.55276,-2.73986],[29.53199,-2.70103],[29.5192,-2.65889],[29.51489,-2.61508],[29.51921,-2.57127],[29.53201,-2.52914],[29.55279,-2.49032],[29.58075,-2.45629],[29.61482,-2.42836],[29.65368,-2.40761],[29.69585,-2.39484],[29.7397,-2.39052]]]}},"Institut-Suprieur-de-Management-Kolda":{type:"Feature",id:"Institut-Suprieur-de-Management-Kolda",properties:{},geometry:{type:"Polygon",coordinates:[[[-14.94108,13.11445],[-14.8961,13.11013],[-14.85285,13.09734],[-14.81299,13.07657],[-14.77807,13.04862],[-14.74943,13.01457],[-14.72816,12.97573],[-14.71509,12.93359],[-14.7107,12.88977],[-14.71517,12.84596],[-14.72831,12.80384],[-14.74962,12.76503],[-14.77828,12.73102],[-14.81319,12.70311],[-14.85299,12.68237],[-14.89618,12.66961],[-14.94108,12.66529],[-14.98599,12.66961],[-15.02918,12.68237],[-15.06898,12.70311],[-15.10389,12.73102],[-15.13255,12.76503],[-15.15386,12.80384],[-15.167,12.84596],[-15.17147,12.88977],[-15.16708,12.93359],[-15.15401,12.97573],[-15.13274,13.01457],[-15.1041,13.04862],[-15.06918,13.07657],[-15.02932,13.09734],[-14.98607,13.11013],[-14.94108,13.11445]]]}},"Universit-Gaston-Berger":{type:"Feature",id:"Universit-Gaston-Berger",properties:{},geometry:{type:"Polygon",coordinates:[[[-16.42556,16.28748],[-16.37992,16.28316],[-16.33604,16.27037],[-16.2956,16.2496],[-16.26018,16.22164],[-16.23112,16.18759],[-16.20956,16.14874],[-16.1963,16.1066],[-16.19186,16.06278],[-16.1964,16.01897],[-16.20974,15.97685],[-16.23137,15.93805],[-16.26044,15.90404],[-16.29585,15.87614],[-16.33622,15.8554],[-16.38002,15.84264],[-16.42556,15.83833],[-16.47111,15.84264],[-16.51491,15.8554],[-16.55528,15.87614],[-16.59069,15.90404],[-16.61976,15.93805],[-16.64138,15.97685],[-16.65473,16.01897],[-16.65927,16.06278],[-16.65483,16.1066],[-16.64157,16.14874],[-16.62,16.18759],[-16.59095,16.22164],[-16.55552,16.2496],[-16.51509,16.27037],[-16.47121,16.28316],[-16.42556,16.28748]]]}},"Fourah-Bay-College":{type:"Feature",id:"Fourah-Bay-College",properties:{},geometry:{type:"Polygon",coordinates:[[[-13.18359,8.71868],[-13.13927,8.71437],[-13.09665,8.70158],[-13.05738,8.68081],[-13.02296,8.65287],[-12.99473,8.61883],[-12.97376,8.57999],[-12.96086,8.53785],[-12.95652,8.49404],[-12.96091,8.45023],[-12.97386,8.40811],[-12.99485,8.36929],[-13.0231,8.33527],[-13.0575,8.30735],[-13.09674,8.28661],[-13.13932,8.27384],[-13.18359,8.26953],[-13.22787,8.27384],[-13.27044,8.28661],[-13.30969,8.30735],[-13.34409,8.33527],[-13.37233,8.36929],[-13.39333,8.40811],[-13.40627,8.45023],[-13.41066,8.49404],[-13.40633,8.53785],[-13.39343,8.57999],[-13.37246,8.61883],[-13.34422,8.65287],[-13.30981,8.68081],[-13.27054,8.70158],[-13.22792,8.71437],[-13.18359,8.71868]]]}},"Njala-University-Freetown-Campus":{type:"Feature",id:"Njala-University-Freetown-Campus",properties:{},geometry:{type:"Polygon",coordinates:[[[-13.23673,8.7042],[-13.19241,8.69988],[-13.14979,8.68709],[-13.11052,8.66633],[-13.07611,8.63839],[-13.04787,8.60434],[-13.02691,8.5655],[-13.01401,8.52337],[-13.00967,8.47955],[-13.01406,8.43574],[-13.027,8.39362],[-13.048,8.3548],[-13.07624,8.32078],[-13.11064,8.29287],[-13.14988,8.27212],[-13.19246,8.25935],[-13.23673,8.25504],[-13.281,8.25935],[-13.32358,8.27212],[-13.36282,8.29287],[-13.39722,8.32078],[-13.42546,8.3548],[-13.44646,8.39362],[-13.4594,8.43574],[-13.46379,8.47955],[-13.45945,8.52337],[-13.44655,8.5655],[-13.42559,8.60434],[-13.39735,8.63839],[-13.36294,8.66633],[-13.32367,8.68709],[-13.28105,8.69988],[-13.23673,8.7042]]]}},"Njala-University-Njala-Campus":{type:"Feature",id:"Njala-University-Njala-Campus",properties:{},geometry:{type:"Polygon",coordinates:[[[-11.76548,8.16057],[-11.72122,8.15625],[-11.67867,8.14347],[-11.63945,8.1227],[-11.60508,8.09476],[-11.57689,8.06072],[-11.55595,8.02188],[-11.54307,7.97975],[-11.53873,7.93593],[-11.54311,7.89212],[-11.55604,7.85],[-11.577,7.81118],[-11.60521,7.77716],[-11.63956,7.74924],[-11.67875,7.7285],[-11.72127,7.71573],[-11.76548,7.71141],[-11.8097,7.71573],[-11.85221,7.7285],[-11.8914,7.74924],[-11.92576,7.77716],[-11.95396,7.81118],[-11.97493,7.85],[-11.98785,7.89212],[-11.99223,7.93593],[-11.9879,7.97975],[-11.97502,8.02188],[-11.95408,8.06072],[-11.92588,8.09476],[-11.89152,8.1227],[-11.8523,8.14347],[-11.80974,8.15625],[-11.76548,8.16057]]]}},"University-of-Pretoria":{type:"Feature",id:"University-of-Pretoria",properties:{},geometry:{type:"Polygon",coordinates:[[[28.21289,-25.49616],[28.26143,-25.50046],[28.30812,-25.51322],[28.35116,-25.53394],[28.38892,-25.56183],[28.41994,-25.59582],[28.44303,-25.63461],[28.45729,-25.67672],[28.46217,-25.72052],[28.45747,-25.76434],[28.44336,-25.8065],[28.42037,-25.84536],[28.38939,-25.87943],[28.3516,-25.9074],[28.30845,-25.92819],[28.26161,-25.94099],[28.21289,-25.94531],[28.16417,-25.94099],[28.11733,-25.92819],[28.07418,-25.9074],[28.03639,-25.87943],[28.00541,-25.84536],[27.98242,-25.8065],[27.96831,-25.76434],[27.96361,-25.72052],[27.96849,-25.67672],[27.98275,-25.63461],[28.00584,-25.59582],[28.03686,-25.56183],[28.07462,-25.53394],[28.11766,-25.51322],[28.16435,-25.50046],[28.21289,-25.49616]]]}},"Ardhi-University":{type:"Feature",id:"Ardhi-University",properties:{},geometry:{type:"Polygon",coordinates:[[[39.21541,-6.54158],[39.25951,-6.54589],[39.30192,-6.55867],[39.34101,-6.57941],[39.37527,-6.60733],[39.4034,-6.64135],[39.42431,-6.68017],[39.4372,-6.72229],[39.44156,-6.7661],[39.43724,-6.80992],[39.42439,-6.85205],[39.4035,-6.89089],[39.37538,-6.92493],[39.3411,-6.95287],[39.30199,-6.97363],[39.25955,-6.98642],[39.21541,-6.99074],[39.17127,-6.98642],[39.12883,-6.97363],[39.08972,-6.95287],[39.05544,-6.92493],[39.02732,-6.89089],[39.00643,-6.85205],[38.99358,-6.80992],[38.98926,-6.7661],[38.99362,-6.72229],[39.00651,-6.68017],[39.02742,-6.64135],[39.05555,-6.60733],[39.08981,-6.57941],[39.1289,-6.55867],[39.17131,-6.54589],[39.21541,-6.54158]]]}},"Institute-of-Finance-Management":{type:"Feature",id:"Institute-of-Finance-Management",properties:{},geometry:{type:"Polygon",coordinates:[[[39.2935,-5.91323],[39.33755,-5.91754],[39.3799,-5.93032],[39.41894,-5.95107],[39.45317,-5.97899],[39.48126,-6.01301],[39.50215,-6.05183],[39.51501,-6.09395],[39.51937,-6.13776],[39.51505,-6.18158],[39.50221,-6.22371],[39.48135,-6.26255],[39.45326,-6.29659],[39.41903,-6.32453],[39.37997,-6.34529],[39.33758,-6.35807],[39.2935,-6.36239],[39.24941,-6.35807],[39.20703,-6.34529],[39.16797,-6.32453],[39.13373,-6.29659],[39.10565,-6.26255],[39.08479,-6.22371],[39.07195,-6.18158],[39.06763,-6.13776],[39.07198,-6.09395],[39.08485,-6.05183],[39.10574,-6.01301],[39.13383,-5.97899],[39.16805,-5.95107],[39.20709,-5.93032],[39.24945,-5.91754],[39.2935,-5.91323]]]}},"Institute-of-Rural-Development-Planning-Mwanza":{type:"Feature",id:"Institute-of-Rural-Development-Planning-Mwanza",properties:{},geometry:{type:"Polygon",coordinates:[[[32.89851,-2.29201],[32.94236,-2.29632],[32.98452,-2.3091],[33.02338,-2.32985],[33.05745,-2.35778],[33.08541,-2.3918],[33.10618,-2.43063],[33.11898,-2.47275],[33.12331,-2.51657],[33.119,-2.56038],[33.10621,-2.60251],[33.08544,-2.64134],[33.05749,-2.67538],[33.02342,-2.70331],[32.98455,-2.72407],[32.94238,-2.73685],[32.89851,-2.74116],[32.85465,-2.73685],[32.81247,-2.72407],[32.7736,-2.70331],[32.73954,-2.67538],[32.71158,-2.64134],[32.69081,-2.60251],[32.67803,-2.56038],[32.67372,-2.51657],[32.67804,-2.47275],[32.69084,-2.43063],[32.71162,-2.3918],[32.73958,-2.35778],[32.77364,-2.32985],[32.8125,-2.3091],[32.85466,-2.29632],[32.89851,-2.29201]]]}},"Institute-of-Rural-Development-Planning":{type:"Feature",id:"Institute-of-Rural-Development-Planning",properties:{},geometry:{type:"Polygon",coordinates:[[[35.74578,-5.89759],[35.78983,-5.9019],[35.83218,-5.91468],[35.87122,-5.93543],[35.90545,-5.96335],[35.93354,-5.99737],[35.95442,-6.03619],[35.96729,-6.07831],[35.97165,-6.12212],[35.96733,-6.16594],[35.95449,-6.20807],[35.93363,-6.24691],[35.90554,-6.28095],[35.87131,-6.30889],[35.83225,-6.32965],[35.78986,-6.34243],[35.74578,-6.34675],[35.7017,-6.34243],[35.65931,-6.32965],[35.62025,-6.30889],[35.58602,-6.28095],[35.55794,-6.24691],[35.53707,-6.20807],[35.52424,-6.16594],[35.51992,-6.12212],[35.52427,-6.07831],[35.53714,-6.03619],[35.55802,-5.99737],[35.58612,-5.96335],[35.62034,-5.93543],[35.65938,-5.91468],[35.70174,-5.9019],[35.74578,-5.89759]]]}},"Open-University-of-Tanzania":{type:"Feature",id:"Open-University-of-Tanzania",properties:{},geometry:{type:"Polygon",coordinates:[[[39.26466,-6.55895],[39.30876,-6.56326],[39.35117,-6.57603],[39.39026,-6.59678],[39.42453,-6.6247],[39.45266,-6.65872],[39.47357,-6.69754],[39.48646,-6.73966],[39.49082,-6.78347],[39.4865,-6.82729],[39.47364,-6.86942],[39.45275,-6.90826],[39.42463,-6.9423],[39.39036,-6.97024],[39.35125,-6.991],[39.3088,-7.00379],[39.26466,-7.0081],[39.22052,-7.00379],[39.17807,-6.991],[39.13896,-6.97024],[39.10469,-6.9423],[39.07656,-6.90826],[39.05568,-6.86942],[39.04282,-6.82729],[39.0385,-6.78347],[39.04286,-6.73966],[39.05575,-6.69754],[39.07666,-6.65872],[39.10479,-6.6247],[39.13906,-6.59678],[39.17815,-6.57603],[39.22056,-6.56326],[39.26466,-6.55895]]]}},"Sokoine-University-of-Agriculture":{type:"Feature",id:"Sokoine-University-of-Agriculture",properties:{},geometry:{type:"Polygon",coordinates:[[[37.65636,-6.62796],[37.70047,-6.63227],[37.74288,-6.64505],[37.78198,-6.66579],[37.81625,-6.69371],[37.84439,-6.72773],[37.8653,-6.76655],[37.87819,-6.80868],[37.88255,-6.85249],[37.87823,-6.8963],[37.86537,-6.93844],[37.84448,-6.97727],[37.81636,-7.01131],[37.78208,-7.03925],[37.74296,-7.06002],[37.70051,-7.0728],[37.65636,-7.07712],[37.61221,-7.0728],[37.56976,-7.06002],[37.53064,-7.03925],[37.49636,-7.01131],[37.46824,-6.97727],[37.44735,-6.93844],[37.43449,-6.8963],[37.43017,-6.85249],[37.43453,-6.80868],[37.44742,-6.76655],[37.46833,-6.72773],[37.49647,-6.69371],[37.53074,-6.66579],[37.56984,-6.64505],[37.61225,-6.63227],[37.65636,-6.62796]]]}},"University-of-Dar-es-Salaam":{type:"Feature",id:"University-of-Dar-es-Salaam",properties:{},geometry:{type:"Polygon",coordinates:[[[39.20531,-6.55579],[39.24941,-6.56011],[39.29182,-6.57288],[39.33091,-6.59363],[39.36518,-6.62155],[39.39331,-6.65557],[39.41422,-6.69439],[39.42711,-6.73651],[39.43147,-6.78032],[39.42715,-6.82414],[39.41429,-6.86627],[39.39341,-6.90511],[39.36528,-6.93915],[39.33101,-6.96709],[39.2919,-6.98785],[39.24945,-7.00063],[39.20531,-7.00495],[39.16117,-7.00063],[39.11873,-6.98785],[39.07961,-6.96709],[39.04534,-6.93915],[39.01722,-6.90511],[38.99633,-6.86627],[38.98348,-6.82414],[38.97915,-6.78032],[38.98352,-6.73651],[38.9964,-6.69439],[39.01731,-6.65557],[39.04544,-6.62155],[39.07971,-6.59363],[39.1188,-6.57288],[39.16121,-6.56011],[39.20531,-6.55579]]]}},"Busitema-University":{type:"Feature",id:"Busitema-University",properties:{},geometry:{type:"Polygon",coordinates:[[[34.01367,0.75192],[34.05749,0.7476],[34.09962,0.73482],[34.13845,0.71407],[34.17248,0.68614],[34.20041,0.6521],[34.22117,0.61328],[34.23395,0.57115],[34.23826,0.52733],[34.23394,0.48352],[34.22116,0.44139],[34.20041,0.40256],[34.17248,0.36853],[34.13844,0.3406],[34.09962,0.31985],[34.05749,0.30707],[34.01367,0.30276],[33.96986,0.30707],[33.92773,0.31985],[33.8889,0.3406],[33.85487,0.36853],[33.82694,0.40256],[33.80618,0.44139],[33.7934,0.48352],[33.78908,0.52733],[33.7934,0.57115],[33.80618,0.61328],[33.82693,0.6521],[33.85486,0.68614],[33.88889,0.71407],[33.92772,0.73482],[33.96986,0.7476],[34.01367,0.75192]]]}},"Gulu-University":{type:"Feature",id:"Gulu-University",properties:{},geometry:{type:"Polygon",coordinates:[[[32.34375,3.03595],[32.38762,3.03163],[32.42981,3.01885],[32.46869,2.99809],[32.50276,2.97016],[32.53073,2.93613],[32.5515,2.8973],[32.56429,2.85516],[32.5686,2.81135],[32.56427,2.76754],[32.55147,2.72541],[32.53069,2.68659],[32.50272,2.65256],[32.46865,2.62463],[32.42978,2.60388],[32.38761,2.59111],[32.34375,2.58679],[32.29989,2.59111],[32.25772,2.60388],[32.21885,2.62463],[32.18478,2.65256],[32.15681,2.68659],[32.13603,2.72541],[32.12323,2.76754],[32.1189,2.81135],[32.12321,2.85516],[32.136,2.8973],[32.15677,2.93613],[32.18474,2.97016],[32.21881,2.99809],[32.25769,3.01885],[32.29988,3.03163],[32.34375,3.03595]]]}},"Kumi-University":{type:"Feature",id:"Kumi-University",properties:{},geometry:{type:"Polygon",coordinates:[[[33.83789,1.71855],[33.88172,1.71423],[33.92387,1.70145],[33.96271,1.6807],[33.99676,1.65277],[34.0247,1.61873],[34.04545,1.5799],[34.05823,1.53777],[34.06255,1.49396],[34.05822,1.45015],[34.04544,1.40802],[34.02467,1.36919],[33.99673,1.33516],[33.96269,1.30724],[33.92385,1.28649],[33.88171,1.27371],[33.83789,1.26939],[33.79407,1.27371],[33.75193,1.28649],[33.71309,1.30724],[33.67905,1.33516],[33.65111,1.36919],[33.63034,1.40802],[33.61756,1.45015],[33.61324,1.49396],[33.61755,1.53777],[33.63033,1.5799],[33.65109,1.61873],[33.67902,1.65277],[33.71307,1.6807],[33.75191,1.70145],[33.79406,1.71423],[33.83789,1.71855]]]}},"Makerere-University":{type:"Feature",id:"Makerere-University",properties:{},geometry:{type:"Polygon",coordinates:[[[32.60742,0.57614],[32.65124,0.57182],[32.69337,0.55904],[32.7322,0.53829],[32.76623,0.51036],[32.79416,0.47633],[32.81491,0.4375],[32.82769,0.39537],[32.832,0.35156],[32.82769,0.30774],[32.81491,0.26562],[32.79415,0.22679],[32.76622,0.19276],[32.73219,0.16483],[32.69336,0.14408],[32.65124,0.1313],[32.60742,0.12698],[32.56361,0.1313],[32.52148,0.14408],[32.48265,0.16483],[32.44862,0.19276],[32.42069,0.22679],[32.39994,0.26562],[32.38716,0.30774],[32.38284,0.35156],[32.38715,0.39537],[32.39993,0.4375],[32.42069,0.47633],[32.44861,0.51036],[32.48265,0.53829],[32.52148,0.55904],[32.56361,0.57182],[32.60742,0.57614]]]}},"Mbarara-University-of-Science-and-Technology":{type:"Feature",id:"Mbarara-University-of-Science-and-Technology",properties:{},geometry:{type:"Polygon",coordinates:[[[30.65679,-0.39187],[30.7006,-0.39618],[30.74273,-0.40896],[30.78156,-0.42971],[30.81559,-0.45764],[30.84353,-0.49167],[30.86428,-0.5305],[30.87706,-0.57263],[30.88138,-0.61644],[30.87707,-0.66025],[30.86429,-0.70238],[30.84353,-0.74121],[30.8156,-0.77524],[30.78157,-0.80317],[30.74274,-0.82393],[30.70061,-0.83671],[30.65679,-0.84102],[30.61297,-0.83671],[30.57084,-0.82393],[30.53201,-0.80317],[30.49797,-0.77524],[30.47004,-0.74121],[30.44929,-0.70238],[30.43651,-0.66025],[30.4322,-0.61644],[30.43651,-0.57263],[30.4493,-0.5305],[30.47005,-0.49167],[30.49798,-0.45764],[30.53202,-0.42971],[30.57084,-0.40896],[30.61297,-0.39618],[30.65679,-0.39187]]]}},"St.-Augustine-International-University":{type:"Feature",id:"St.-Augustine-International-University",properties:{},geometry:{type:"Polygon",coordinates:[[[32.62161,0.49696],[32.66543,0.49264],[32.70756,0.47986],[32.74639,0.45911],[32.78042,0.43118],[32.80835,0.39714],[32.8291,0.35832],[32.84188,0.31619],[32.8462,0.27237],[32.84188,0.22856],[32.8291,0.18643],[32.80834,0.14761],[32.78042,0.11357],[32.74638,0.08565],[32.70756,0.06489],[32.66543,0.05211],[32.62161,0.0478],[32.5778,0.05211],[32.53567,0.06489],[32.49684,0.08565],[32.46281,0.11357],[32.43488,0.14761],[32.41413,0.18643],[32.40135,0.22856],[32.39703,0.27237],[32.40135,0.31619],[32.41413,0.35832],[32.43488,0.39714],[32.46281,0.43118],[32.49684,0.45911],[32.53567,0.47986],[32.5778,0.49264],[32.62161,0.49696]]]}},"Uganda-Christian-University-Mbale-Campus":{type:"Feature",id:"Uganda-Christian-University-Mbale-Campus",properties:{},geometry:{type:"Polygon",coordinates:[[[34.17487,1.30046],[34.21869,1.29614],[34.26083,1.28336],[34.29967,1.26261],[34.3337,1.23468],[34.36164,1.20064],[34.38239,1.16182],[34.39517,1.11969],[34.39949,1.07587],[34.39517,1.03206],[34.38238,0.98993],[34.36162,0.95111],[34.33369,0.91707],[34.29965,0.88915],[34.26082,0.8684],[34.21868,0.85562],[34.17487,0.8513],[34.13105,0.85562],[34.08891,0.8684],[34.05008,0.88915],[34.01605,0.91707],[33.98811,0.95111],[33.96735,0.98993],[33.95457,1.03206],[33.95025,1.07587],[33.95456,1.11969],[33.96734,1.16182],[33.9881,1.20064],[34.01603,1.23468],[34.05007,1.26261],[34.0889,1.28336],[34.13104,1.29614],[34.17487,1.30046]]]}},"Uganda-Pentecostal-University":{type:"Feature",id:"Uganda-Pentecostal-University",properties:{},geometry:{type:"Polygon",coordinates:[[[30.26621,0.88664],[30.31003,0.88233],[30.35216,0.86955],[30.39099,0.84879],[30.42503,0.82086],[30.45296,0.78683],[30.47371,0.748],[30.48649,0.70587],[30.4908,0.66206],[30.48649,0.61825],[30.4737,0.57612],[30.45295,0.53729],[30.42502,0.50326],[30.39098,0.47533],[30.35215,0.45458],[30.31002,0.4418],[30.26621,0.43749],[30.22239,0.4418],[30.18026,0.45458],[30.14144,0.47533],[30.1074,0.50326],[30.07947,0.53729],[30.05871,0.57612],[30.04593,0.61825],[30.04162,0.66206],[30.04593,0.70587],[30.05871,0.748],[30.07946,0.78683],[30.10739,0.82086],[30.14143,0.84879],[30.18026,0.86955],[30.22239,0.88233],[30.26621,0.88664]]]}},"St.-Mawaggali-Trades-Training-Institute":{type:"Feature",id:"St.-Mawaggali-Trades-Training-Institute",properties:{},geometry:{type:"Polygon",coordinates:[[[26.9671,-16.59033],[27.01282,-16.59464],[27.05679,-16.60741],[27.09732,-16.62814],[27.13286,-16.65604],[27.16204,-16.69005],[27.18376,-16.72886],[27.19715,-16.77097],[27.20171,-16.81478],[27.19726,-16.8586],[27.18395,-16.90074],[27.1623,-16.93959],[27.13314,-16.97365],[27.09757,-17.0016],[27.05698,-17.02238],[27.01293,-17.03517],[26.9671,-17.03949],[26.92128,-17.03517],[26.87722,-17.02238],[26.83663,-17.0016],[26.80107,-16.97365],[26.7719,-16.93959],[26.75025,-16.90074],[26.73695,-16.8586],[26.73249,-16.81478],[26.73705,-16.77097],[26.75045,-16.72886],[26.77216,-16.69005],[26.80135,-16.65604],[26.83689,-16.62814],[26.87742,-16.60741],[26.92138,-16.59464],[26.9671,-16.59033]]]}},"The-University-of-Zambia":{type:"Feature",id:"The-University-of-Zambia",properties:{},geometry:{type:"Polygon",coordinates:[[[28.33027,-15.16737],[28.37567,-15.17168],[28.41932,-15.18445],[28.45957,-15.20518],[28.49485,-15.23309],[28.52383,-15.2671],[28.54538,-15.3059],[28.55868,-15.34802],[28.5632,-15.39183],[28.55878,-15.43565],[28.54556,-15.47779],[28.52406,-15.51664],[28.49511,-15.55069],[28.4598,-15.57864],[28.4195,-15.59942],[28.37576,-15.61221],[28.33027,-15.61653],[28.28478,-15.61221],[28.24104,-15.59942],[28.20074,-15.57864],[28.16544,-15.55069],[28.13648,-15.51664],[28.11498,-15.47779],[28.10177,-15.43565],[28.09734,-15.39183],[28.10186,-15.34802],[28.11516,-15.3059],[28.13671,-15.2671],[28.16569,-15.23309],[28.20098,-15.20518],[28.24122,-15.18445],[28.28488,-15.17168],[28.33027,-15.16737]]]}},"University-of-Zimbabwe":{type:"Feature",id:"University-of-Zimbabwe",properties:{},geometry:{type:"Polygon",coordinates:[[[31.05466,-17.56016],[31.10061,-17.56447],[31.14481,-17.57724],[31.18555,-17.59797],[31.22128,-17.62587],[31.25062,-17.65988],[31.27245,-17.69868],[31.28592,-17.74079],[31.29051,-17.7846],[31.28603,-17.82842],[31.27266,-17.87056],[31.2509,-17.90941],[31.22158,-17.94347],[31.18583,-17.97143],[31.14502,-17.99221],[31.10073,-18.005],[31.05466,-18.00932],[31.00859,-18.005],[30.9643,-17.99221],[30.92349,-17.97143],[30.88774,-17.94347],[30.85842,-17.90941],[30.83666,-17.87056],[30.82328,-17.82842],[30.81881,-17.7846],[30.8234,-17.74079],[30.83687,-17.69868],[30.85869,-17.65988],[30.88803,-17.62587],[30.92376,-17.59797],[30.96451,-17.57724],[31.0087,-17.56447],[31.05466,-17.56016]]]}},asia_full:{type:"Feature",id:"asia_full",properties:{},geometry:{type:"Polygon",coordinates:[[[51,13.5],[43.5,12.3],[34.25,27.3],[34.9,29.45],[34,31.9],[27,34.7],[25.1,39],[25.6,40.2],[26.33,40.98],[26.33,41.23],[26.63,41.36],[26.58,41.6],[26.32,41.76],[27.2,42.1],[27.55,41.93],[35,43],[38.3,47.6],[38.7,47.7],[38.86,47.86],[39.74,47.82],[40.1,49.6],[38,50],[37.4,50.4],[36.65,50.25],[35.66,50.35],[35.2,51.1],[34.28,51.27],[34.1,51.7],[34.4,51.73],[33.9,52.35],[31.8,52.05],[31.3,53.1],[32.8,53.3],[30.77,54.78],[30.95,55.61],[28.19,56.13],[27.83,57.29],[27.33,57.53],[27.7,57.9],[27.3,58.7],[28.2,59.37],[27.2,60.2],[31.5,62.6],[29,67],[30,67.66],[28.27,68.6],[31,70],[31,90],[180,90],[180,60],[130,7],[130,-0.5],[131.8,-3.5],[132.3,-8],[128,-11.3],[65,-11.3],[51,13.5]]]}},"Asian-University-for-Women":{type:"Feature",id:"Asian-University-for-Women",properties:{},geometry:{type:"Polygon",coordinates:[[[91.8457,22.57465],[91.89315,22.57033],[91.93877,22.55753],[91.98079,22.53675],[92.0176,22.50879],[92.04778,22.47472],[92.07018,22.43586],[92.08393,22.39371],[92.08852,22.34989],[92.08378,22.30609],[92.0699,22.26398],[92.04742,22.22518],[92.01721,22.19118],[91.98043,22.16329],[91.93849,22.14257],[91.893,22.12981],[91.8457,22.1255],[91.79841,22.12981],[91.75292,22.14257],[91.71098,22.16329],[91.6742,22.19118],[91.64399,22.22518],[91.6215,22.26398],[91.60762,22.30609],[91.60288,22.34989],[91.60747,22.39371],[91.62123,22.43586],[91.64362,22.47472],[91.67381,22.50879],[91.71062,22.53675],[91.75264,22.55753],[91.79826,22.57033],[91.8457,22.57465]]]}},BGD:{type:"Feature",id:"BGD",properties:{name:"Bangladesh"},geometry:{type:"Polygon",coordinates:[[[92.67272,22.04124],[92.65226,21.32405],[92.30323,21.47548],[92.36855,20.67088],[92.08289,21.1922],[92.02522,21.70157],[91.83489,22.18294],[91.41709,22.76502],[90.49601,22.80502],[90.58696,22.39279],[90.27297,21.83637],[89.84747,22.03915],[89.70205,21.85712],[89.41886,21.96618],[89.03196,22.05571],[88.87631,22.87915],[88.52977,23.63114],[88.69994,24.23372],[88.08442,24.50166],[88.30637,24.86608],[88.93155,25.23869],[88.20979,25.76807],[88.56305,26.44653],[89.35509,26.01441],[89.83248,25.96508],[89.92069,25.26975],[90.87221,25.1326],[91.7996,25.14743],[92.3762,24.97669],[91.91509,24.13041],[91.46773,24.07264],[91.15896,23.50353],[91.70647,22.98526],[91.86993,23.62435],[92.14603,23.6275],[92.67272,22.04124]]]}},"Dhaka-College":{type:"Feature",id:"Dhaka-College",properties:{},geometry:{type:"Polygon",coordinates:[[[90.35156,23.94959],[90.3995,23.94527],[90.44559,23.93247],[90.48805,23.91168],[90.52524,23.88372],[90.55573,23.84965],[90.57835,23.81079],[90.59224,23.76864],[90.59687,23.72482],[90.59208,23.68101],[90.57805,23.6389],[90.55534,23.60011],[90.52481,23.56611],[90.48766,23.53822],[90.44529,23.5175],[90.39934,23.50474],[90.35156,23.50043],[90.30379,23.50474],[90.25783,23.5175],[90.21547,23.53822],[90.17831,23.56611],[90.14779,23.60011],[90.12507,23.6389],[90.11105,23.68101],[90.10625,23.72482],[90.11088,23.76864],[90.12478,23.81079],[90.1474,23.84965],[90.17789,23.88372],[90.21508,23.91168],[90.25754,23.93247],[90.30362,23.94527],[90.35156,23.94959]]]}},"Dhaka-University":{type:"Feature",id:"Dhaka-University",properties:{},geometry:{type:"Polygon",coordinates:[[[90.35156,23.94959],[90.3995,23.94527],[90.44559,23.93247],[90.48805,23.91168],[90.52524,23.88372],[90.55573,23.84965],[90.57835,23.81079],[90.59224,23.76864],[90.59687,23.72482],[90.59208,23.68101],[90.57805,23.6389],[90.55534,23.60011],[90.52481,23.56611],[90.48766,23.53822],[90.44529,23.5175],[90.39934,23.50474],[90.35156,23.50043],[90.30379,23.50474],[90.25783,23.5175],[90.21547,23.53822],[90.17831,23.56611],[90.14779,23.60011],[90.12507,23.6389],[90.11105,23.68101],[90.10625,23.72482],[90.11088,23.76864],[90.12478,23.81079],[90.1474,23.84965],[90.17789,23.88372],[90.21508,23.91168],[90.25754,23.93247],[90.30362,23.94527],[90.35156,23.94959]]]}},"Eastern-University":{type:"Feature",id:"Eastern-University",properties:{},geometry:{type:"Polygon",coordinates:[[[90.38063,23.96703],[90.42857,23.96271],[90.47466,23.94991],[90.51713,23.92913],[90.55432,23.90116],[90.58482,23.86709],[90.60744,23.82823],[90.62134,23.78608],[90.62597,23.74226],[90.62117,23.69846],[90.60714,23.65635],[90.58443,23.61755],[90.5539,23.58356],[90.51674,23.55567],[90.47437,23.53494],[90.42841,23.52218],[90.38063,23.51788],[90.33284,23.52218],[90.28688,23.53494],[90.24451,23.55567],[90.20735,23.58356],[90.17682,23.61755],[90.15411,23.65635],[90.14008,23.69846],[90.13528,23.74226],[90.13991,23.78608],[90.15381,23.82823],[90.17643,23.86709],[90.20693,23.90116],[90.24412,23.92913],[90.28659,23.94991],[90.33268,23.96271],[90.38063,23.96703]]]}},"Jahangirnagar-University":{type:"Feature",id:"Jahangirnagar-University",properties:{},geometry:{type:"Polygon",coordinates:[[[90.26753,24.10689],[90.31553,24.10257],[90.36167,24.08977],[90.40418,24.06899],[90.44141,24.04102],[90.47194,24.00695],[90.49459,23.96809],[90.5085,23.92594],[90.51314,23.88212],[90.50834,23.83831],[90.49429,23.79621],[90.47155,23.75741],[90.44099,23.72342],[90.40378,23.69552],[90.36137,23.6748],[90.31536,23.66204],[90.26753,23.65774],[90.21969,23.66204],[90.17369,23.6748],[90.13127,23.69552],[90.09407,23.72342],[90.06351,23.75741],[90.04077,23.79621],[90.02672,23.83831],[90.02192,23.88212],[90.02656,23.92594],[90.04046,23.96809],[90.06312,24.00695],[90.09364,24.04102],[90.13088,24.06899],[90.17339,24.08977],[90.21953,24.10257],[90.26753,24.10689]]]}},"Khulna-University":{type:"Feature",id:"Khulna-University",properties:{},geometry:{type:"Polygon",coordinates:[[[89.56055,23.06152],[89.60816,23.0572],[89.65394,23.0444],[89.69611,23.02362],[89.73306,22.99565],[89.76335,22.96159],[89.78582,22.92273],[89.79962,22.88058],[89.80423,22.83676],[89.79947,22.79295],[89.78554,22.75085],[89.76297,22.71205],[89.73265,22.67805],[89.69574,22.65016],[89.65366,22.62944],[89.60801,22.61668],[89.56055,22.61237],[89.51308,22.61668],[89.46744,22.62944],[89.42535,22.65016],[89.38844,22.67805],[89.35812,22.71205],[89.33556,22.75085],[89.32163,22.79295],[89.31687,22.83676],[89.32147,22.88058],[89.33527,22.92273],[89.35775,22.96159],[89.38804,22.99565],[89.42498,23.02362],[89.46715,23.0444],[89.51293,23.0572],[89.56055,23.06152]]]}},"Rajshahi-University-of-Engineering-Technology":{type:"Feature",id:"Rajshahi-University-of-Engineering-Technology",properties:{},geometry:{type:"Polygon",coordinates:[[[88.62839,24.58841],[88.67657,24.58409],[88.72289,24.57129],[88.76556,24.5505],[88.80293,24.52253],[88.83358,24.48846],[88.85631,24.4496],[88.87027,24.40745],[88.87492,24.36363],[88.8701,24.31983],[88.856,24.27772],[88.83317,24.23893],[88.8025,24.20493],[88.76515,24.17704],[88.72258,24.15632],[88.6764,24.14356],[88.62839,24.13925],[88.58037,24.14356],[88.5342,24.15632],[88.49162,24.17704],[88.45428,24.20493],[88.4236,24.23893],[88.40077,24.27772],[88.38667,24.31983],[88.38185,24.36363],[88.38651,24.40745],[88.40047,24.4496],[88.4232,24.48846],[88.45384,24.52253],[88.49122,24.5505],[88.53389,24.57129],[88.58021,24.58409],[88.62839,24.58841]]]}},"Sherubtse-College":{type:"Feature",id:"Sherubtse-College",properties:{},geometry:{type:"Polygon",coordinates:[[[91.52369,27.51129],[91.57309,27.50697],[91.62058,27.49416],[91.66432,27.47337],[91.70263,27.4454],[91.73404,27.41133],[91.75734,27.37246],[91.77163,27.33031],[91.77639,27.28649],[91.77144,27.24268],[91.75698,27.20058],[91.73357,27.16179],[91.70212,27.1278],[91.66385,27.09991],[91.62022,27.0792],[91.5729,27.06644],[91.52369,27.06214],[91.47449,27.06644],[91.42717,27.0792],[91.38354,27.09991],[91.34526,27.1278],[91.31382,27.16179],[91.29041,27.20058],[91.27595,27.24268],[91.271,27.28649],[91.27575,27.33031],[91.29005,27.37246],[91.31335,27.41133],[91.34475,27.4454],[91.38307,27.47337],[91.42681,27.49416],[91.4743,27.50697],[91.52369,27.51129]]]}},"Gujarat-University":{type:"Feature",id:"Gujarat-University",properties:{},geometry:{type:"Polygon",coordinates:[[[72.50977,23.22343],[72.55744,23.21911],[72.60327,23.20631],[72.6455,23.18552],[72.68248,23.15756],[72.71281,23.12349],[72.73531,23.08463],[72.74913,23.04248],[72.75374,22.99866],[72.74897,22.95486],[72.73502,22.91275],[72.71243,22.87395],[72.68208,22.83996],[72.64512,22.81206],[72.60299,22.79134],[72.55728,22.77858],[72.50977,22.77427],[72.46225,22.77858],[72.41654,22.79134],[72.37441,22.81206],[72.33745,22.83996],[72.3071,22.87395],[72.28451,22.91275],[72.27056,22.95486],[72.26579,22.99866],[72.2704,23.04248],[72.28422,23.08463],[72.30672,23.12349],[72.33705,23.15756],[72.37403,23.18552],[72.41626,23.20631],[72.46209,23.21911],[72.50977,23.22343]]]}},india_andhrapradesh:{type:"Feature",id:"india_andhrapradesh",properties:{},geometry:{type:"Polygon",coordinates:[[[76.76365,14.98503],[76.78952,15.01589],[76.77614,15.05336],[76.80034,15.09466],[76.86072,15.05669],[76.87678,15.02859],[76.94279,15.02725],[76.98159,15.0103],[77.00077,15.02948],[77.04671,15.02904],[77.07882,15.00004],[77.1096,15.02859],[77.12744,15.09371],[77.14751,15.10753],[77.16873,15.17462],[77.14554,15.22413],[77.15223,15.29148],[77.12118,15.29418],[77.11387,15.3334],[77.07705,15.32577],[77.0421,15.36103],[77.027,15.44075],[76.97414,15.50807],[77.02697,15.5037],[77.03509,15.63815],[77.08728,15.65733],[77.08192,15.69524],[77.05293,15.72914],[77.05561,15.82458],[77.03333,15.85326],[77.07659,15.90991],[77.14448,15.94265],[77.2479,15.96378],[77.3564,15.95008],[77.42745,15.94836],[77.46652,15.93453],[77.61152,15.91691],[77.6536,15.88393],[77.72205,15.89199],[77.80554,15.87083],[77.8616,15.88138],[77.89376,15.90154],[78.00803,15.86506],[78.03641,15.90188],[78.06997,15.85048],[78.10755,15.83401],[78.17153,15.85511],[78.17371,15.89569],[78.20995,15.9197],[78.2507,15.96993],[78.2682,16.02857],[78.29785,16.01169],[78.40727,16.0756],[78.45394,16.07503],[78.55814,16.04517],[78.59917,16.08361],[78.64311,16.08312],[78.68277,16.03346],[78.73718,16.0097],[78.78267,16.02125],[78.8419,16.08707],[78.83228,16.13919],[78.87606,16.13902],[78.88876,16.0879],[78.92138,16.10307],[78.9049,16.17711],[78.92807,16.19871],[78.98352,16.21074],[79.01236,16.24173],[79.09802,16.2236],[79.12305,16.23187],[79.1593,16.20893],[79.22111,16.23251],[79.23438,16.32518],[79.21143,16.35493],[79.21112,16.44396],[79.22091,16.51631],[79.25265,16.57381],[79.37802,16.58412],[79.41773,16.57986],[79.44409,16.61796],[79.49421,16.63408],[79.53884,16.63046],[79.60613,16.67239],[79.63566,16.6594],[79.68544,16.69755],[79.72286,16.68966],[79.74673,16.72106],[79.79256,16.72485],[79.81796,16.69098],[79.84286,16.70561],[79.88555,16.68642],[79.90723,16.63408],[79.95306,16.63621],[80.00576,16.70857],[80.05536,16.74833],[80.07093,16.81323],[80.0332,16.85233],[79.99173,16.86303],[80.04569,16.96517],[80.08405,16.96339],[80.134,16.98524],[80.18217,17.04501],[80.19555,17.01825],[80.26201,17.01066],[80.28877,16.97677],[80.31553,16.91254],[80.3191,16.87106],[80.35879,16.85501],[80.37306,16.8113],[80.41856,16.84252],[80.45647,16.78989],[80.56262,16.76268],[80.6041,16.78766],[80.55593,16.81843],[80.56485,16.86883],[80.59027,16.91165],[80.53184,16.95001],[80.44264,16.9451],[80.35835,16.97052],[80.38778,17.0071],[80.36682,17.0566],[80.39001,17.07623],[80.42034,17.02494],[80.48234,17.05036],[80.49616,17.10789],[80.56039,17.13822],[80.68393,17.06865],[80.82309,17.03787],[80.85877,17.05081],[80.87714,17.10478],[80.88011,17.1644],[80.91689,17.15439],[80.91892,17.22003],[80.99838,17.19012],[81.03576,17.19196],[81.05653,17.22041],[81.16295,17.23278],[81.18035,17.25463],[81.17053,17.29656],[81.19016,17.32733],[81.26732,17.3202],[81.31385,17.37576],[81.24132,17.40667],[81.22725,17.43762],[81.17746,17.45203],[81.15755,17.47938],[81.11343,17.49477],[81.08374,17.45957],[81.01198,17.49248],[80.99962,17.53013],[80.95671,17.58749],[80.85431,17.59347],[80.86444,17.62914],[80.90266,17.63912],[80.90684,17.67993],[80.89153,17.74125],[80.94636,17.76025],[81.03556,17.74495],[81.07481,17.76038],[81.08891,17.81081],[81.15938,17.85273],[81.19194,17.84694],[81.25394,17.81215],[81.40915,17.80501],[81.47025,17.8233],[81.48096,17.80278],[81.5541,17.81616],[81.61119,17.81527],[81.66293,17.87682],[81.70307,17.86121],[81.78246,17.90982],[81.80119,17.93614],[81.89932,17.9687],[82.0019,18.02356],[82.03316,18.06597],[82.08072,18.07378],[82.14091,18.0439],[82.17228,18.04993],[82.25028,17.9883],[82.27583,17.995],[82.2667,18.04332],[82.29628,18.06899],[82.34354,18.07485],[82.33329,18.1422],[82.30608,18.19572],[82.33284,18.21579],[82.33685,18.26619],[82.37209,18.27421],[82.39305,18.30633],[82.33462,18.31703],[82.38458,18.36922],[82.36138,18.4098],[82.43513,18.48477],[82.48969,18.52285],[82.53139,18.51177],[82.54422,18.41638],[82.60918,18.37427],[82.59758,18.26516],[82.64005,18.23708],[82.67329,18.29908],[82.70644,18.30476],[82.77538,18.33958],[82.79251,18.36262],[82.78448,18.42803],[82.80742,18.44772],[82.89919,18.40074],[82.91103,18.36453],[82.98471,18.36362],[83.0002,18.38368],[83.04775,18.37883],[83.07472,18.401],[83.04552,18.44345],[83.05997,18.48603],[83.09665,18.54123],[83.05931,18.54334],[83.0336,18.57266],[83.05776,18.62215],[83.09414,18.63021],[83.15495,18.70089],[83.23099,18.75616],[83.27407,18.76523],[83.28745,18.79777],[83.36791,18.81557],[83.40661,18.84174],[83.39569,18.87914],[83.35554,18.92896],[83.36892,18.96132],[83.32119,18.97447],[83.3428,19.01449],[83.41665,19.00408],[83.45049,18.95576],[83.48237,19.00825],[83.46716,19.07746],[83.51314,19.07262],[83.52143,19.03271],[83.61209,19.10076],[83.62679,19.14969],[83.69206,19.05202],[83.71342,18.99346],[83.73398,18.98382],[83.79596,19.01607],[83.84255,18.9178],[83.85136,18.86003],[83.87788,18.82716],[84.05557,18.79246],[84.0894,18.75373],[84.16689,18.78415],[84.22422,18.79642],[84.2535,18.78262],[84.2914,18.8],[84.33966,18.80123],[84.39349,18.89211],[84.43671,18.92277],[84.42292,18.94711],[84.47894,18.99017],[84.51711,19.04634],[84.62687,19.08543],[84.61653,19.12624],[84.66828,19.13065],[84.6721,19.16552],[84.71352,19.1524],[84.70468,19.11772],[84.76857,19.08003],[85.15481,18.87834],[85.14492,18.85295],[85.05442,18.77126],[85.01176,18.69225],[84.94947,18.67649],[84.44354,18.21885],[83.98107,17.79763],[83.77893,17.63361],[83.20925,17.15734],[82.8246,16.92714],[82.20846,16.16914],[81.78413,16.05362],[81.60171,16.04774],[80.84225,15.52037],[80.65306,15.4875],[80.54735,15.42991],[80.4922,15.34128],[80.47381,15.25261],[80.48624,15.06582],[80.49835,15.0251],[80.66968,13.56514],[80.26863,13.56255],[80.24181,13.46797],[80.22545,13.48346],[80.14774,13.49443],[80.08045,13.49111],[80.08,13.52565],[80.00213,13.53964],[80.01841,13.50074],[79.97441,13.46419],[79.96622,13.38714],[79.93821,13.34898],[79.86379,13.31632],[79.8129,13.31712],[79.79245,13.29487],[79.73437,13.27843],[79.79598,13.24103],[79.75102,13.21106],[79.68369,13.24845],[79.68102,13.29448],[79.57781,13.26176],[79.54809,13.32329],[79.42941,13.33391],[79.41957,13.24971],[79.43293,13.1966],[79.39666,13.19679],[79.36005,13.17504],[79.36244,13.13752],[79.31106,13.1268],[79.28351,13.14994],[79.23853,13.1464],[79.20549,13.10147],[79.16498,13.01908],[79.06532,13.04951],[78.99361,13.08754],[78.95768,13.07478],[78.81243,13.08649],[78.75104,13.05634],[78.71387,13.06691],[78.70525,13.01518],[78.6625,13.02861],[78.63167,12.98455],[78.63629,12.92494],[78.60313,12.84933],[78.59178,12.77804],[78.55737,12.73938],[78.55312,12.69582],[78.50595,12.74103],[78.50517,12.68031],[78.46933,12.67292],[78.47136,12.62811],[78.3799,12.62235],[78.30177,12.66322],[78.27563,12.70205],[78.23857,12.6994],[78.23025,12.75702],[78.2528,12.82236],[78.25198,12.85741],[78.31411,12.85733],[78.32741,12.90272],[78.35638,12.93819],[78.38944,12.90542],[78.41213,12.94302],[78.46924,12.97546],[78.46092,13.03126],[78.5219,13.06638],[78.54509,13.11098],[78.57956,13.21461],[78.57797,13.28201],[78.51185,13.28722],[78.44649,13.30825],[78.43949,13.327],[78.36546,13.36503],[78.38151,13.40071],[78.37259,13.46181],[78.38241,13.52477],[78.40574,13.57659],[78.39268,13.5915],[78.32632,13.59445],[78.25894,13.58461],[78.20436,13.60369],[78.16645,13.65721],[78.11784,13.65587],[78.12295,13.71405],[78.09423,13.74251],[78.12795,13.78565],[78.11441,13.8625],[78.04999,13.89494],[78.04642,13.86104],[78.00476,13.87355],[77.95566,13.82664],[77.95098,13.88825],[77.98752,13.89784],[77.97015,13.95827],[77.92868,13.90698],[77.89567,13.93954],[77.83858,13.93508],[77.81494,13.91679],[77.83635,13.86863],[77.79261,13.8211],[77.6267,13.76984],[77.53033,13.69514],[77.45805,13.68671],[77.47014,13.7502],[77.45855,13.79212],[77.41662,13.80595],[77.43223,13.84163],[77.32787,13.83226],[77.31449,13.86393],[77.25829,13.84609],[77.21904,13.86794],[77.18236,13.8682],[77.15308,13.84278],[77.18088,13.78098],[77.17444,13.76135],[77.10308,13.76759],[77.06516,13.74405],[77.0277,13.77651],[77.00003,13.74482],[76.97723,13.81547],[77.01323,13.85558],[77.04239,13.9332],[76.99574,13.96114],[77.00108,13.98729],[76.93324,14.03009],[76.97878,14.07002],[76.89779,14.16518],[76.96469,14.18169],[77.02696,14.17477],[77.02154,14.13052],[77.03389,14.05587],[77.13014,14.04533],[77.1441,14.00245],[77.28518,14.01342],[77.31997,14.03126],[77.3503,13.95767],[77.35476,13.90325],[77.39713,13.90415],[77.42702,13.98353],[77.39,14.01386],[77.33291,14.02947],[77.40204,14.1102],[77.38331,14.13607],[77.39624,14.17175],[77.51711,14.17844],[77.49659,14.23419],[77.50284,14.27834],[77.45021,14.28414],[77.44887,14.31625],[77.37617,14.33081],[77.38984,14.26937],[77.28608,14.2828],[77.28786,14.33766],[77.23835,14.31759],[77.1661,14.34301],[77.13845,14.33721],[77.11838,14.29395],[77.11539,14.22104],[77.0818,14.2159],[77.05638,14.24623],[76.9426,14.2444],[76.92967,14.27651],[76.94748,14.31179],[76.9038,14.32379],[76.88373,14.35055],[76.88774,14.3947],[76.97828,14.48256],[76.91138,14.48836],[76.87481,14.47275],[76.83244,14.52761],[76.80434,14.53207],[76.76554,14.60075],[76.77639,14.68002],[76.80359,14.7398],[76.78371,14.78455],[76.83756,14.78968],[76.86771,14.96792],[76.76736,14.97267],[76.76365,14.98503]]]}},india_full:{type:"Feature",id:"india_full",properties:{name:"India"},geometry:{type:"MultiPolygon",coordinates:[[[[77.83745,35.49401],[78.91227,34.32194],[78.81109,33.5062],[79.20889,32.99439],[79.17613,32.48378],[78.45845,32.61816],[78.73889,31.51591],[79.72137,30.88272],[81.11126,30.18348],[80.47672,29.72987],[80.08843,28.79447],[81.0572,28.41609],[81.99999,27.92548],[83.30425,27.36451],[84.67502,27.2349],[85.25178,26.7262],[86.02439,26.63098],[87.22747,26.3979],[88.06024,26.41462],[88.1748,26.8104],[88.04313,27.44582],[88.12044,27.87654],[88.73033,28.08686],[88.81425,27.29932],[88.83564,27.09897],[89.74453,26.7194],[90.37328,26.87572],[91.21751,26.80865],[92.03348,26.83831],[92.10371,27.45261],[91.69666,27.77174],[92.50312,27.89688],[93.41335,28.64063],[94.56599,29.27744],[95.4048,29.03172],[96.11768,29.4528],[96.58659,28.83098],[96.24883,28.41103],[97.32711,28.26158],[97.40256,27.88254],[97.05199,27.69906],[97.134,27.08377],[96.41937,27.26459],[95.12477,26.57357],[95.15515,26.00131],[94.60325,25.16249],[94.55266,24.67524],[94.10674,23.85074],[93.32519,24.07856],[93.28633,23.04366],[93.06029,22.70311],[93.16613,22.27846],[92.67272,22.04124],[92.14603,23.6275],[91.86993,23.62435],[91.70647,22.98526],[91.15896,23.50353],[91.46773,24.07264],[91.91509,24.13041],[92.3762,24.97669],[91.7996,25.14743],[90.87221,25.1326],[89.92069,25.26975],[89.83248,25.96508],[89.35509,26.01441],[88.56305,26.44653],[88.20979,25.76807],[88.93155,25.23869],[88.30637,24.86608],[88.08442,24.50166],[88.69994,24.23372],[88.52977,23.63114],[88.87631,22.87915],[89.03196,22.05571],[88.88877,21.69059],[88.2085,21.70317],[86.9757,21.49556],[87.03317,20.74331],[86.49935,20.15164],[85.06027,19.47858],[83.94101,18.30201],[83.18922,17.67122],[82.19279,17.01664],[82.19124,16.55666],[81.69272,16.31022],[80.792,15.95197],[80.3249,15.89918],[80.02507,15.13641],[80.23327,13.83577],[80.28629,13.00626],[79.86255,12.05621],[79.858,10.35727],[79.34051,10.30885],[78.88535,9.54614],[79.18972,9.21654],[78.27794,8.93305],[77.94116,8.25296],[77.5399,7.96554],[76.59298,8.89928],[76.13006,10.29963],[75.74647,11.30825],[75.3961,11.78125],[74.86482,12.74194],[74.61672,13.99258],[74.44386,14.61722],[73.5342,15.99065],[73.11991,17.92857],[72.82091,19.20823],[72.82448,20.4195],[72.63053,21.35601],[71.17527,20.75744],[70.47046,20.87733],[69.16413,22.0893],[69.64493,22.45078],[69.3496,22.84318],[68.17664,23.69196],[68.8426,24.35913],[71.04324,24.35652],[70.8447,25.2151],[70.28287,25.72223],[70.16893,26.49187],[69.51439,26.94097],[70.6165,27.9892],[71.77767,27.91318],[72.82375,28.96159],[73.45064,29.97641],[74.42138,30.97981],[74.40593,31.69264],[75.25864,32.2711],[74.45156,32.7649],[74.10429,33.44147],[73.74995,34.3177],[74.2402,34.74889],[75.75706,34.50492],[76.87172,34.65354],[77.83745,35.49401]]]]}},india_karnataka:{type:"Feature",id:"india_karnataka",properties:{},geometry:{type:"Polygon",coordinates:[[[73.87267,14.75312],[74.17989,14.95708],[74.2532,14.95804],[74.29821,15.04123],[74.31574,15.18805],[74.27607,15.27727],[74.32187,15.34414],[74.28027,15.38891],[74.27464,15.54999],[74.24074,15.66684],[74.11652,15.65308],[74.16212,15.75075],[74.28923,15.73953],[74.36893,15.78648],[74.34579,15.84959],[74.43203,15.95338],[74.46484,16.0421],[74.37226,16.07692],[74.48045,16.14527],[74.50509,16.22265],[74.31843,16.32588],[74.33806,16.40125],[74.26427,16.53936],[74.33986,16.54825],[74.54427,16.63407],[74.6313,16.57831],[74.68877,16.71489],[74.91203,16.7883],[74.99259,16.95146],[75.09075,16.95064],[75.18186,16.84374],[75.26705,16.86247],[75.28311,16.95524],[75.46783,16.98524],[75.51065,16.94733],[75.66898,16.97766],[75.67389,17.11369],[75.62834,17.18928],[75.65739,17.27069],[75.58469,17.34963],[75.63468,17.47651],[75.77995,17.37683],[75.89432,17.40292],[75.93159,17.32197],[76.11996,17.37007],[76.22917,17.36301],[76.38171,17.31172],[76.37153,17.4341],[76.33086,17.46872],[76.41561,17.60431],[76.48659,17.66155],[76.48652,17.71358],[76.56488,17.76523],[76.66314,17.68771],[76.8094,17.8693],[76.92164,17.94103],[76.9513,18.05843],[76.92422,18.14531],[77.14325,18.20848],[77.20119,18.27828],[77.24726,18.41311],[77.31257,18.43674],[77.41407,18.39352],[77.3672,18.30846],[77.46332,18.26219],[77.57345,18.24294],[77.59821,18.0861],[77.64737,17.99934],[77.6208,17.9031],[77.5709,17.86625],[77.53999,17.72825],[77.45138,17.69052],[77.44541,17.58272],[77.6912,17.50865],[77.53911,17.44295],[77.52471,17.36431],[77.45747,17.34038],[77.3772,17.14285],[77.46328,17.11129],[77.50069,17.01255],[77.45223,16.91995],[77.47617,16.7804],[77.46008,16.61106],[77.37653,16.48644],[77.25617,16.47308],[77.28927,16.408],[77.41673,16.36775],[77.52418,16.3753],[77.59655,16.31743],[77.49303,16.25534],[77.51178,15.92828],[77.2479,15.96378],[77.07659,15.90991],[77.03509,15.63815],[77.027,15.44075],[77.0421,15.36103],[77.15223,15.29148],[77.16873,15.17462],[77.1096,15.02859],[76.98159,15.0103],[76.87678,15.02859],[76.80034,15.09466],[76.76736,14.97267],[76.86771,14.96792],[76.83756,14.78968],[76.77639,14.68002],[76.76554,14.60075],[76.87481,14.47275],[76.88373,14.35055],[76.94748,14.31179],[76.9426,14.2444],[77.05638,14.24623],[77.1661,14.34301],[77.28608,14.2828],[77.38984,14.26937],[77.44887,14.31625],[77.50284,14.27834],[77.51711,14.17844],[77.39624,14.17175],[77.40204,14.1102],[77.33291,14.02947],[77.42702,13.98353],[77.35476,13.90325],[77.31997,14.03126],[77.1441,14.00245],[77.03389,14.05587],[77.02696,14.17477],[76.89779,14.16518],[76.97878,14.07002],[76.93324,14.03009],[77.04239,13.9332],[76.97723,13.81547],[77.06516,13.74405],[77.17444,13.76135],[77.18236,13.8682],[77.32787,13.83226],[77.43223,13.84163],[77.47014,13.7502],[77.53033,13.69514],[77.6267,13.76984],[77.79261,13.8211],[77.89567,13.93954],[77.95098,13.88825],[78.04999,13.89494],[78.11441,13.8625],[78.11784,13.65587],[78.20436,13.60369],[78.40574,13.57659],[78.37068,13.46984],[78.40217,13.31113],[78.58854,13.26912],[78.5219,13.06638],[78.46924,12.97546],[78.35684,12.94022],[78.31447,12.8595],[78.25248,12.85994],[78.23196,12.76495],[78.08636,12.80344],[77.99036,12.80553],[77.93327,12.8876],[77.81099,12.8303],[77.74108,12.67162],[77.60006,12.6661],[77.58743,12.51473],[77.63575,12.48605],[77.61553,12.36799],[77.52722,12.27746],[77.51993,12.19264],[77.60853,12.20409],[77.73432,12.17555],[77.77447,12.12033],[77.67932,11.97287],[77.60217,11.93627],[77.49513,11.94251],[77.42332,11.77259],[77.29576,11.80871],[77.11315,11.77337],[77.01458,11.81306],[76.90977,11.79343],[76.8262,11.60485],[76.56305,11.62046],[76.51399,11.70565],[76.41621,11.67255],[76.20482,11.86247],[76.1155,11.8579],[76.11204,11.97862],[76.00455,11.93123],[75.86924,11.95161],[75.79654,12.0533],[75.63883,12.14712],[75.5804,12.1556],[75.4863,12.29074],[75.43456,12.29653],[75.37427,12.46113],[75.22345,12.56714],[75.1619,12.66883],[75.06067,12.66842],[75.00958,12.79255],[74.8591,12.76032],[74.64061,12.65899],[74.51827,12.99543],[74.32397,13.82179],[73.87267,14.75312]]]}},india_kerala:{type:"Feature",id:"india_kerala",properties:{},geometry:{type:"Polygon",coordinates:[[[74.64061,12.65899],[74.8591,12.76032],[74.88399,12.75347],[74.95843,12.78474],[75.00958,12.79255],[74.99766,12.73819],[75.05297,12.71899],[75.06067,12.66842],[75.11342,12.67842],[75.1619,12.66883],[75.14362,12.63805],[75.18287,12.63181],[75.22345,12.56714],[75.23683,12.56625],[75.28071,12.61847],[75.29121,12.59649],[75.27114,12.55367],[75.28095,12.51799],[75.33492,12.49034],[75.3573,12.46234],[75.39003,12.49736],[75.41661,12.49293],[75.4241,12.46603],[75.39599,12.45143],[75.37427,12.46113],[75.36747,12.41202],[75.38331,12.39011],[75.42333,12.37233],[75.41374,12.34763],[75.43456,12.29653],[75.4863,12.29074],[75.51484,12.25818],[75.53759,12.20064],[75.5804,12.1556],[75.63883,12.14712],[75.66604,12.09583],[75.68727,12.10816],[75.73047,12.07283],[75.75506,12.08318],[75.79833,12.08006],[75.79654,12.0533],[75.82391,12.01308],[75.82999,11.98372],[75.86924,11.95161],[76.00455,11.93123],[76.03621,11.9406],[76.07903,11.96914],[76.11204,11.97862],[76.1155,11.8579],[76.15528,11.87128],[76.20482,11.86247],[76.22662,11.80542],[76.27964,11.81018],[76.30774,11.78297],[76.31799,11.75041],[76.34252,11.73748],[76.41129,11.75913],[76.42399,11.72006],[76.40338,11.70748],[76.41621,11.67255],[76.44345,11.63744],[76.42497,11.62329],[76.37992,11.6224],[76.37056,11.59341],[76.29786,11.56442],[76.2711,11.59296],[76.2256,11.56442],[76.24255,11.52874],[76.24478,11.49439],[76.32105,11.44489],[76.33354,11.45871],[76.39063,11.42794],[76.44861,11.38155],[76.53826,11.35167],[76.54532,11.30094],[76.52349,11.27236],[76.45271,11.23905],[76.44934,11.20462],[76.51048,11.21163],[76.53385,11.19671],[76.60091,11.20654],[76.62971,11.19413],[76.69784,11.23906],[76.72537,11.22534],[76.72765,11.19388],[76.69301,11.17193],[76.69124,11.14472],[76.73852,11.12108],[76.74788,11.07514],[76.73718,11.04749],[76.69507,11.02252],[76.68644,10.98934],[76.66047,10.96052],[76.64932,10.92395],[76.73272,10.88113],[76.77286,10.88158],[76.81746,10.86195],[76.85983,10.79996],[76.88838,10.79996],[76.8973,10.77096],[76.875,10.70674],[76.85537,10.67507],[76.87277,10.62958],[76.80497,10.62646],[76.80854,10.59434],[76.82995,10.58498],[76.81746,10.43869],[76.8072,10.41505],[76.83932,10.35974],[76.82944,10.30749],[76.9018,10.26001],[76.90974,10.23668],[76.93976,10.23927],[76.98194,10.22077],[77.04075,10.25298],[77.06496,10.29751],[77.11964,10.31782],[77.17683,10.35777],[77.23655,10.35242],[77.21441,10.30577],[77.25054,10.25359],[77.25544,10.22549],[77.28042,10.20721],[77.26769,10.12222],[77.23784,10.12768],[77.20426,10.11207],[77.21976,10.07801],[77.26184,10.03015],[77.25908,9.9945],[77.27231,9.96404],[77.24834,9.95177],[77.21305,9.87549],[77.23646,9.85946],[77.22277,9.82317],[77.24656,9.80841],[77.20553,9.69439],[77.17963,9.65641],[77.16816,9.61495],[77.21264,9.60207],[77.23711,9.58089],[77.27684,9.57498],[77.3042,9.59951],[77.36511,9.54996],[77.3997,9.49683],[77.39331,9.45986],[77.36661,9.46037],[77.33693,9.40901],[77.33713,9.36507],[77.32506,9.33664],[77.28329,9.30039],[77.28844,9.27469],[77.26509,9.18184],[77.26714,9.15394],[77.24693,9.12483],[77.21199,9.101],[77.18667,9.04329],[77.16025,9.03584],[77.14986,9.01008],[77.17354,8.99121],[77.19759,8.95104],[77.19567,8.9236],[77.2559,8.8781],[77.25798,8.83758],[77.2292,8.78679],[77.19607,8.74588],[77.17517,8.73703],[77.20586,8.68645],[77.21552,8.64836],[77.27872,8.56521],[77.26344,8.50713],[77.20618,8.47859],[77.22506,8.44602],[77.18854,8.43476],[77.15375,8.37722],[77.14974,8.32192],[77.12209,8.32281],[77.09077,8.2973],[76.92132,8.09605],[76.6728,8.34299],[76.46487,8.59279],[76.22556,8.95652],[75.91159,10.04616],[75.68288,10.55908],[75.58764,10.89204],[75.55244,11.04304],[75.25797,11.51227],[75.53645,11.69255],[75.53089,11.70357],[75.25113,11.52458],[74.97117,11.94518],[74.71236,12.49398],[74.64061,12.65899]]]}},india_maharashtra:{type:"Feature",id:"india_maharashtra",properties:{name:"Maharashtra"},geometry:{type:"Polygon",coordinates:[[[72.53789,20.1498],[72.80202,20.12516],[72.87472,20.22596],[72.97061,20.21213],[72.97329,20.13096],[73.18604,20.05291],[73.29353,20.15371],[73.31137,20.20723],[73.43,20.20634],[73.41484,20.38162],[73.47594,20.49491],[73.51787,20.67019],[73.62224,20.62514],[73.63428,20.58232],[73.74801,20.56716],[73.84658,20.62336],[73.88538,20.72951],[73.93846,20.76073],[73.94515,20.84012],[73.79279,21.06787],[73.68111,21.15233],[73.82249,21.17195],[73.83231,21.2674],[73.94827,21.29773],[73.96879,21.39228],[74.10883,21.44803],[74.30776,21.48014],[74.2917,21.55864],[73.97926,21.54124],[73.86085,21.49576],[73.82294,21.60057],[73.88583,21.64517],[73.89029,21.71073],[73.83231,21.81064],[74.04684,21.92259],[74.14585,21.95425],[74.28991,21.93597],[74.38848,22.02026],[74.52764,21.90876],[74.50578,21.78254],[74.59053,21.66435],[74.83048,21.61038],[74.86438,21.63402],[75.05795,21.56489],[75.11504,21.45963],[75.21985,21.41101],[75.38443,21.38559],[75.46828,21.39406],[75.83267,21.38336],[75.95934,21.39629],[76.05255,21.35259],[76.09849,21.37399],[76.15915,21.25892],[76.16851,21.08587],[76.3826,21.07963],[76.45262,21.11486],[76.48741,21.19604],[76.61676,21.19871],[76.66091,21.28256],[76.62434,21.33519],[76.73227,21.40878],[76.79159,21.48996],[76.79516,21.59745],[76.90131,21.60101],[76.9972,21.68174],[77.1212,21.72545],[77.20728,21.69423],[77.27998,21.76113],[77.47756,21.77005],[77.57122,21.62688],[77.56721,21.52965],[77.45749,21.55641],[77.41869,21.52073],[77.48692,21.37756],[77.93873,21.38693],[78.16932,21.49843],[78.21526,21.55374],[78.3,21.58496],[78.41329,21.57782],[78.43024,21.50155],[78.50874,21.52831],[78.58501,21.48683],[78.932,21.48728],[78.91327,21.59254],[79.1278,21.62822],[79.22102,21.69646],[79.48862,21.67416],[79.50602,21.59031],[79.57604,21.54348],[79.73259,21.60235],[79.85703,21.53099],[80.06665,21.55686],[80.18842,21.63402],[80.26022,21.62019],[80.36905,21.52296],[80.41142,21.43822],[80.51936,21.3896],[80.63532,21.25],[80.45736,21.17284],[80.42391,21.0096],[80.46539,20.92709],[80.54166,20.93378],[80.54344,20.79195],[80.57823,20.67866],[80.50776,20.65458],[80.51177,20.585],[80.62239,20.60373],[80.58581,20.39544],[80.61659,20.32587],[80.38288,20.24157],[80.4141,20.19028],[80.54032,20.11],[80.54567,19.98734],[80.46048,19.82812],[80.66476,19.69075],[80.65673,19.61225],[80.82755,19.56274],[80.88553,19.50922],[80.84271,19.36605],[80.74905,19.28666],[80.67864,19.33089],[80.60751,19.31353],[80.58732,19.39674],[80.48071,19.3355],[80.39329,19.24591],[80.39154,19.1836],[80.3302,19.13746],[80.26929,18.94468],[80.35176,18.84592],[80.24684,18.70149],[80.10826,18.68928],[79.94712,18.78372],[79.95979,18.85795],[79.93945,19.0406],[79.85699,19.09508],[79.94349,19.16387],[79.92836,19.24777],[79.97469,19.38922],[79.92536,19.49855],[79.87599,19.5041],[79.75713,19.60733],[79.63608,19.57639],[79.60249,19.51309],[79.5317,19.55241],[79.42494,19.53529],[79.22736,19.61468],[79.22023,19.5286],[79.1725,19.46081],[79.08018,19.53261],[79.00213,19.54198],[78.89954,19.66954],[78.84245,19.65839],[78.82963,19.75513],[78.60098,19.81809],[78.48728,19.79375],[78.28109,19.90236],[78.3514,19.78327],[78.32909,19.71548],[78.26933,19.69184],[78.29475,19.60621],[78.29564,19.46794],[78.20778,19.43583],[78.16318,19.3551],[78.16675,19.2436],[78.03473,19.2436],[77.92412,19.3444],[77.84428,19.30426],[77.81484,19.13745],[77.74304,19.06118],[77.75106,18.98357],[77.83714,18.95414],[77.90751,18.8295],[77.83749,18.80764],[77.74829,18.60515],[77.65541,18.5316],[77.59709,18.54762],[77.54937,18.3875],[77.55171,18.29114],[77.46332,18.26219],[77.3672,18.30846],[77.41407,18.39352],[77.31257,18.43674],[77.2452,18.41278],[77.19913,18.27795],[77.14119,18.20815],[77.03495,18.18076],[76.95329,18.18881],[76.92422,18.14531],[76.9513,18.05843],[76.9075,18.00923],[76.92164,17.94103],[76.8094,17.8693],[76.66314,17.68771],[76.56488,17.76523],[76.48652,17.71358],[76.48659,17.66155],[76.41561,17.60431],[76.33086,17.46872],[76.37153,17.4341],[76.38171,17.31172],[76.22917,17.36301],[76.11996,17.37007],[75.93159,17.32197],[75.89432,17.40292],[75.77995,17.37683],[75.63468,17.47651],[75.58469,17.34963],[75.65739,17.27069],[75.62834,17.18928],[75.67389,17.11369],[75.66898,16.97766],[75.51065,16.94733],[75.46783,16.98524],[75.28311,16.95524],[75.26705,16.86247],[75.18186,16.84374],[75.09075,16.95064],[74.99259,16.95146],[74.96287,16.87942],[74.90306,16.86241],[74.91203,16.7883],[74.68877,16.71489],[74.6313,16.57831],[74.56843,16.55445],[74.54427,16.63407],[74.33986,16.54825],[74.26427,16.53936],[74.33806,16.40125],[74.31843,16.32588],[74.50509,16.22265],[74.48045,16.14527],[74.37226,16.07692],[74.46484,16.0421],[74.43203,15.95338],[74.34579,15.84959],[74.36893,15.78648],[74.28923,15.73953],[74.16212,15.75075],[74.11652,15.65308],[74.02811,15.60433],[73.97592,15.62887],[73.94515,15.74126],[73.88226,15.74929],[73.68072,15.72057],[73.32871,15.60794],[72.98859,16.57559],[72.71294,17.97077],[72.60935,19.26366],[72.53789,20.1498]]]}},india_puducherry:{type:"Feature",id:"india_puducherry",properties:{name:"Puducherry"},geometry:{type:"Polygon",coordinates:[[[79.87782,12.04973],[79.84726,11.95536],[79.83593,11.90229],[79.81979,11.85761],[79.81464,11.79006],[79.79645,11.7736],[79.77036,11.77191],[79.74564,11.78065],[79.6804,11.7988],[79.61655,11.82434],[79.58702,11.88549],[79.65672,11.93152],[79.64745,11.9594],[79.6423,12.0138],[79.66599,12.03865],[79.72813,12.04201],[79.79885,12.0457],[79.8452,12.05644],[79.87782,12.04973]]]}},india_tamilnadu:{type:"Feature",id:"india_tamilnadu",properties:{},geometry:{type:"Polygon",coordinates:[[[76.23882,11.52666],[76.42497,11.62329],[76.48321,11.69182],[76.56305,11.62046],[76.8262,11.60485],[76.90977,11.79343],[77.01458,11.81306],[77.11315,11.77337],[77.29576,11.80871],[77.33679,11.76902],[77.42332,11.77259],[77.49513,11.94251],[77.60217,11.93627],[77.67932,11.97287],[77.77447,12.12033],[77.73432,12.17555],[77.60853,12.20409],[77.51993,12.19264],[77.52722,12.27746],[77.61553,12.36799],[77.63575,12.48605],[77.58743,12.51473],[77.60006,12.6661],[77.74108,12.67162],[77.79267,12.74643],[77.81099,12.8303],[77.93327,12.8876],[77.99036,12.80553],[78.08636,12.80344],[78.23196,12.76495],[78.2273,12.71513],[78.36824,12.61165],[78.54754,12.68569],[78.62559,12.9194],[78.61355,12.97872],[78.70231,13.05633],[78.80801,13.07774],[78.97973,13.0764],[79.15278,13.00727],[79.1889,13.08443],[79.25625,13.13661],[79.34679,13.13482],[79.45292,13.33852],[79.53513,13.33423],[79.58006,13.24544],[79.68442,13.25659],[79.92572,13.33598],[79.96184,13.45149],[80.06933,13.53757],[80.15229,13.4787],[80.25978,13.44748],[80.68273,13.45353],[80.58546,12.88895],[80.57389,12.78634],[80.43092,12.33305],[80.32877,12.14],[80.20563,11.84284],[79.85031,11.95606],[79.74742,12.0054],[79.69629,11.95142],[79.76493,11.85315],[80.17499,11.74816],[80.13891,11.5158],[80.22104,11.03359],[80.22222,10.98402],[79.85413,10.97539],[79.73705,10.98906],[79.70405,10.91904],[79.85166,10.82788],[80.22599,10.82479],[80.03964,10.09642],[79.66744,9.97318],[79.55982,9.92323],[79.37812,9.6665],[79.42037,9.35343],[79.56652,9.25796],[79.57134,9.08722],[79.49634,8.89762],[79.37403,8.97879],[79.06914,9.02225],[78.73928,8.93257],[78.54484,8.84743],[78.46298,8.3509],[78.36123,8.16045],[78.10363,8.04096],[77.66766,7.85864],[76.92132,8.09605],[77.09077,8.2973],[77.14974,8.32192],[77.20618,8.47859],[77.27872,8.56521],[77.21552,8.64836],[77.19607,8.74588],[77.25798,8.83758],[77.14986,9.01008],[77.26714,9.15394],[77.28844,9.27469],[77.33693,9.40901],[77.3997,9.49683],[77.3042,9.59951],[77.27684,9.57498],[77.16816,9.61495],[77.24656,9.80841],[77.21305,9.87549],[77.26184,10.03015],[77.28042,10.20721],[77.17683,10.35777],[77.06496,10.29751],[76.98194,10.22077],[76.82944,10.30749],[76.81746,10.43869],[76.82995,10.58498],[76.8973,10.77096],[76.81746,10.86195],[76.64932,10.92395],[76.73718,11.04749],[76.72765,11.19388],[76.44934,11.20462],[76.52349,11.27236],[76.53826,11.35167],[76.39063,11.42794],[76.25772,11.47343],[76.23882,11.52666]]]}},india_telengana:{type:"Feature",id:"india_telengana",properties:{},geometry:{type:"Polygon",coordinates:[[[77.23521,16.47123],[77.29413,16.47453],[77.37516,16.48768],[77.37501,16.50885],[77.41861,16.51735],[77.42586,16.57007],[77.46147,16.58589],[77.45871,16.61229],[77.47627,16.64839],[77.43775,16.64241],[77.42132,16.66752],[77.46657,16.6772],[77.47337,16.71709],[77.42692,16.72829],[77.44309,16.76259],[77.4748,16.78164],[77.45754,16.82843],[77.46322,16.84476],[77.45223,16.91995],[77.48061,16.97751],[77.478,17.00152],[77.50069,17.01255],[77.49527,17.04601],[77.46328,17.11129],[77.40575,17.12751],[77.3772,17.14285],[77.36157,17.16669],[77.37179,17.19944],[77.39294,17.1981],[77.40662,17.2372],[77.45894,17.28058],[77.43826,17.29144],[77.45747,17.34038],[77.45274,17.37335],[77.50349,17.35735],[77.52471,17.36431],[77.53972,17.40645],[77.53911,17.44295],[77.57779,17.43051],[77.60849,17.44332],[77.61732,17.47261],[77.65946,17.48011],[77.69188,17.47463],[77.6912,17.50865],[77.66304,17.5217],[77.59762,17.53374],[77.59603,17.56309],[77.55361,17.55007],[77.52751,17.57308],[77.49462,17.56675],[77.44541,17.58272],[77.45732,17.63263],[77.45138,17.69052],[77.49398,17.7153],[77.53999,17.72825],[77.56532,17.74838],[77.55654,17.76872],[77.50997,17.78724],[77.51604,17.80424],[77.55572,17.81934],[77.5709,17.86625],[77.6208,17.9031],[77.61974,17.93865],[77.65529,17.97047],[77.64737,17.99934],[77.5862,18.01459],[77.55377,18.03572],[77.54914,18.06475],[77.59821,18.0861],[77.59705,18.15205],[77.57179,18.19195],[77.58611,18.21875],[77.57345,18.24294],[77.60614,18.28059],[77.57018,18.29238],[77.56676,18.31792],[77.51948,18.34914],[77.54937,18.3875],[77.56007,18.43522],[77.59709,18.54762],[77.64035,18.55386],[77.65775,18.5271],[77.71216,18.55431],[77.73669,18.55476],[77.74829,18.60515],[77.72956,18.64262],[77.73268,18.67607],[77.74963,18.6899],[77.78664,18.6841],[77.83749,18.80764],[77.90751,18.8295],[77.90895,18.86137],[77.88264,18.86984],[77.86524,18.91043],[77.82421,18.9131],[77.83714,18.95414],[77.79611,18.95146],[77.80057,18.98447],[77.75106,18.98357],[77.74081,19.03041],[77.74304,19.06118],[77.77693,19.07322],[77.78942,19.10534],[77.83179,19.09195],[77.81484,19.13745],[77.84205,19.18294],[77.82822,19.19008],[77.85097,19.25743],[77.88398,19.25832],[77.88442,19.27928],[77.84562,19.28597],[77.84428,19.30426],[77.89602,19.31987],[77.92412,19.3444],[77.96916,19.31095],[78.00172,19.29846],[78.02938,19.27304],[78.03473,19.2436],[78.1101,19.24851],[78.1333,19.232],[78.16675,19.2436],[78.16675,19.28106],[78.18057,19.33369],[78.16318,19.3551],[78.17121,19.39747],[78.20778,19.43583],[78.23543,19.43182],[78.25684,19.4559],[78.29564,19.46794],[78.2787,19.5393],[78.29475,19.57365],[78.29475,19.60621],[78.27111,19.65661],[78.26933,19.69184],[78.29966,19.69273],[78.32909,19.71548],[78.3514,19.78327],[78.3224,19.84125],[78.2778,19.85151],[78.27921,19.88196],[78.3679,19.8814],[78.38128,19.83858],[78.41205,19.8252],[78.45978,19.81851],[78.47762,19.79531],[78.50973,19.82386],[78.5686,19.8136],[78.58734,19.8194],[78.67966,19.79175],[78.70018,19.769],[78.72203,19.78149],[78.76842,19.7806],[78.79116,19.76008],[78.82774,19.76097],[78.84691,19.69898],[78.84245,19.65839],[78.87457,19.65705],[78.89954,19.66954],[78.9379,19.66553],[78.95262,19.65125],[78.94637,19.61914],[78.97626,19.56384],[79.00213,19.54198],[79.03513,19.54733],[79.08018,19.53261],[79.08821,19.51477],[79.12389,19.50318],[79.1725,19.46081],[79.2064,19.46973],[79.19034,19.49381],[79.22023,19.5286],[79.23361,19.57945],[79.22736,19.61468],[79.35492,19.56339],[79.39729,19.53529],[79.42494,19.53529],[79.45394,19.49961],[79.4972,19.52013],[79.5317,19.55241],[79.55367,19.52413],[79.60249,19.51309],[79.61596,19.55941],[79.63608,19.57639],[79.71198,19.58528],[79.75713,19.60733],[79.81825,19.57293],[79.82378,19.55743],[79.87599,19.5041],[79.92536,19.49855],[79.97171,19.42013],[79.97469,19.38922],[79.94937,19.29163],[79.9293,19.24996],[79.92636,19.20252],[79.94349,19.16387],[79.88262,19.13295],[79.85699,19.09508],[79.8741,19.04152],[79.92544,19.05312],[79.93945,19.0406],[79.9397,18.98616],[79.95302,18.96934],[79.95979,18.85795],[79.91056,18.82565],[79.94712,18.78372],[79.99276,18.76905],[80.03276,18.74654],[80.10826,18.68928],[80.24684,18.70149],[80.27513,18.72272],[80.30656,18.68345],[80.33809,18.59903],[80.379,18.60937],[80.38851,18.5972],[80.45022,18.62656],[80.48858,18.62656],[80.514,18.61318],[80.53184,18.58598],[80.59562,18.54896],[80.63264,18.51863],[80.65093,18.47224],[80.6991,18.43612],[80.74281,18.32194],[80.74459,18.30231],[80.7883,18.24968],[80.73344,18.21891],[80.73478,18.17163],[80.79811,18.16628],[80.81774,18.18724],[80.81729,18.22515],[80.85922,18.22605],[80.84807,18.1975],[80.86189,18.13283],[80.9007,18.13461],[80.95422,18.16717],[80.9725,18.14353],[80.94931,18.12302],[80.94396,18.08109],[80.96225,18.03158],[80.98455,17.92276],[80.99436,17.91428],[81.00417,17.83846],[81.03227,17.78985],[81.07375,17.78628],[81.08891,17.81081],[81.15938,17.85273],[81.19194,17.84694],[81.25394,17.81215],[81.40915,17.80501],[81.47025,17.8233],[81.48096,17.80278],[81.5541,17.81616],[81.56882,17.82776],[81.61119,17.81527],[81.64286,17.83935],[81.66293,17.87682],[81.68835,17.88485],[81.70307,17.86121],[81.75838,17.89332],[81.79272,17.85273],[81.78246,17.83177],[81.72939,17.81928],[81.68478,17.77067],[81.62323,17.76264],[81.5764,17.72607],[81.57105,17.68771],[81.50281,17.59003],[81.52377,17.57264],[81.50147,17.53919],[81.49345,17.44865],[81.44171,17.38175],[81.41584,17.36168],[81.37168,17.35722],[81.32262,17.38933],[81.28917,17.33759],[81.26732,17.3202],[81.19016,17.32733],[81.17053,17.29656],[81.18035,17.25463],[81.16295,17.23278],[81.11835,17.22475],[81.02603,17.18684],[80.99124,17.1797],[80.93058,17.20513],[80.90516,17.20111],[80.91318,17.14581],[80.87037,17.14625],[80.8552,17.11146],[80.86412,17.09585],[80.85877,17.05081],[80.82309,17.03787],[80.72586,17.06463],[80.68393,17.06865],[80.65673,17.08782],[80.56039,17.13822],[80.51936,17.10834],[80.49616,17.10789],[80.48234,17.05036],[80.42034,17.02494],[80.39001,17.07623],[80.36682,17.0566],[80.38778,17.0071],[80.35835,16.97052],[80.44264,16.9451],[80.48769,16.91745],[80.49126,16.94822],[80.53184,16.95001],[80.59027,16.91165],[80.5867,16.87374],[80.56485,16.86883],[80.55593,16.81843],[80.6041,16.78766],[80.56262,16.76268],[80.51088,16.76982],[80.45647,16.78989],[80.45245,16.81531],[80.41856,16.84252],[80.37306,16.8113],[80.35879,16.85501],[80.3191,16.87106],[80.31553,16.91254],[80.28877,16.97677],[80.26201,17.01066],[80.23569,17.00219],[80.19555,17.01825],[80.18217,17.04501],[80.134,16.98524],[80.08405,16.96339],[80.04569,16.96517],[80.03722,16.93663],[80.00957,16.90719],[79.99173,16.86303],[80.0332,16.85233],[80.04168,16.82602],[80.07093,16.81323],[80.054,16.74194],[80.02722,16.71251],[80.00576,16.70857],[79.95306,16.63621],[79.90723,16.63408],[79.88555,16.68642],[79.84286,16.70561],[79.81796,16.69098],[79.79256,16.72485],[79.74673,16.72106],[79.72286,16.68966],[79.68544,16.69755],[79.6621,16.68835],[79.63566,16.6594],[79.60613,16.67239],[79.53884,16.63046],[79.49421,16.63408],[79.44409,16.61796],[79.41773,16.57986],[79.37802,16.58412],[79.31162,16.57554],[79.27926,16.5816],[79.24543,16.57009],[79.24388,16.53515],[79.22091,16.51631],[79.21526,16.4846],[79.23202,16.46035],[79.21112,16.44396],[79.21143,16.35493],[79.23438,16.32518],[79.22111,16.23251],[79.1593,16.20893],[79.12305,16.23187],[79.09802,16.2236],[79.05373,16.23827],[79.01236,16.24173],[78.98352,16.21074],[78.92807,16.19871],[78.9049,16.17711],[78.92481,16.13259],[78.92138,16.10307],[78.88876,16.0879],[78.87606,16.13902],[78.83228,16.13919],[78.8419,16.08707],[78.82164,16.05227],[78.78267,16.02125],[78.73718,16.0097],[78.68277,16.03346],[78.64311,16.08312],[78.59917,16.08361],[78.55814,16.04517],[78.45394,16.07503],[78.40727,16.0756],[78.36075,16.04605],[78.32341,16.033],[78.29785,16.01169],[78.2682,16.02857],[78.25445,16.01627],[78.2507,15.96993],[78.20995,15.9197],[78.17371,15.89569],[78.17153,15.85511],[78.13252,15.8549],[78.10755,15.83401],[78.06997,15.85048],[78.03641,15.90188],[78.00803,15.86506],[77.97903,15.87982],[77.93428,15.88216],[77.89376,15.90154],[77.8616,15.88138],[77.80554,15.87083],[77.72205,15.89199],[77.689,15.87914],[77.6536,15.88393],[77.61152,15.91691],[77.58504,15.91532],[77.51178,15.92828],[77.52058,15.95112],[77.51562,16.00803],[77.49612,16.03679],[77.50848,16.07885],[77.49242,16.12134],[77.48889,16.16443],[77.50036,16.1925],[77.49303,16.25534],[77.59655,16.31743],[77.58991,16.33381],[77.54011,16.35849],[77.52418,16.3753],[77.4865,16.38299],[77.41673,16.36775],[77.37791,16.38517],[77.35761,16.3815],[77.28927,16.408],[77.26056,16.45344],[77.23521,16.47123]]]}},IDN:{type:"Feature",id:"IDN",properties:{},geometry:{type:"Polygon",coordinates:[[[109.538,1.92671],[109.58606,1.79192],[109.68554,1.78179],[109.66224,1.61881],[109.82759,1.48148],[109.93117,1.42466],[109.97919,1.29865],[110.09758,1.19756],[110.1922,1.18303],[110.30096,0.99575],[110.39497,0.99668],[110.49064,0.87637],[110.59486,0.858],[110.85815,0.94998],[110.9055,1.02835],[111.19759,1.06475],[111.22607,1.08799],[111.40504,1.0094],[111.48916,1.03442],[111.52219,0.95868],[111.66704,1.04281],[111.82599,0.98538],[111.934,1.10284],[112.13391,1.13752],[112.22581,1.39272],[112.20003,1.43709],[112.5171,1.57395],[112.77536,1.56153],[112.87744,1.58118],[113.05767,1.55877],[113.106,1.44495],[113.35493,1.35908],[113.41908,1.28549],[113.53549,1.32127],[113.63068,1.21597],[113.81508,1.30294],[113.85093,1.38715],[113.97573,1.45005],[114.14945,1.46149],[114.2027,1.4213],[114.41581,1.51111],[114.52646,1.44179],[114.58583,1.44665],[114.61498,1.57508],[114.71115,1.67148],[114.69469,1.81063],[114.74372,1.86954],[114.87834,1.91463],[114.80632,2.02438],[114.78024,2.14454],[114.79949,2.24936],[114.90604,2.25697],[114.95039,2.35132],[115.09508,2.41123],[115.13965,2.4776],[115.23743,2.50599],[115.09278,2.69409],[115.14115,2.74432],[115.11387,2.83327],[115.15001,2.90895],[115.24912,2.9667],[115.48328,3.01964],[115.56423,3.17109],[115.51617,3.26111],[115.53779,3.36201],[115.6344,3.45571],[115.57652,3.6094],[115.57965,3.74752],[115.61864,3.84247],[115.58177,3.88792],[115.64991,3.98828],[115.70731,4.19935],[115.8296,4.24118],[115.8779,4.39102],[116.00607,4.34818],[116.07901,4.27643],[116.18028,4.38255],[116.34851,4.39138],[116.43275,4.32567],[116.53602,4.37566],[116.61942,4.33622],[116.89887,4.36704],[116.97351,4.34488],[117.28899,4.31595],[117.52934,4.1615],[117.8992,4.16585],[117.95861,4.19058],[118.26478,4.09696],[127.3,5.2],[129,2.7],[141,-2.4],[141,-6.3],[140.83,-6.7],[141.02,-6.95],[141.02,-9.5],[128.5,-9.5],[127.3,-8.2],[125,-8.5],[123.96,-9.2],[124.11,-9.42],[124.22,-9.37],[124.269,-9.4],[124.287,-9.5],[124.358,-9.48564],[124.355,-9.43281],[124.383,-9.361],[124.444,-9.31899],[124.48,-9.15],[124.95,-8.9],[124.94064,-9.03565],[124.99695,-9.06413],[125.11368,-8.98275],[125.18234,-9.03293],[125.18234,-9.17396],[124.98459,-9.19429],[124.99283,-9.28646],[125.04913,-9.33254],[125.16,-9.7],[123,-11.4],[100,-7],[93.5,6.3],[96.6,6.1],[103,1.4],[103.75,1.14],[103.9,1.2],[104.5,1.3],[105,3],[108,5.1],[109.64501,2.08141],[109.62041,1.98321],[109.538,1.92671]]]}},"Universitas-Negeri-Makassar":{type:"Feature",id:"Universitas-Negeri-Makassar",properties:{},geometry:{type:"Polygon",coordinates:[[[119.4292,-4.96157],[119.47318,-4.96588],[119.51547,-4.97866],[119.55445,-4.9994],[119.58862,-5.02733],[119.61666,-5.06135],[119.63751,-5.10017],[119.65035,-5.14229],[119.6547,-5.18611],[119.65039,-5.22992],[119.63757,-5.27205],[119.61674,-5.31089],[119.5887,-5.34493],[119.55452,-5.37286],[119.51553,-5.39362],[119.47321,-5.40641],[119.4292,-5.41072],[119.38519,-5.40641],[119.34288,-5.39362],[119.30388,-5.37286],[119.26971,-5.34493],[119.24167,-5.31089],[119.22084,-5.27205],[119.20802,-5.22992],[119.2037,-5.18611],[119.20805,-5.14229],[119.22089,-5.10017],[119.24174,-5.06135],[119.26979,-5.02733],[119.30396,-4.9994],[119.34293,-4.97866],[119.38522,-4.96588],[119.4292,-4.96157]]]}},"University-Muhammadiyah-Surakarta":{type:"Feature",id:"University-Muhammadiyah-Surakarta",properties:{},geometry:{type:"Polygon",coordinates:[[[110.76899,-7.33303],[110.81316,-7.33735],[110.85564,-7.35012],[110.89479,-7.37086],[110.92912,-7.39878],[110.9573,-7.4328],[110.97825,-7.47162],[110.99116,-7.51374],[110.99553,-7.55755],[110.9912,-7.60137],[110.97833,-7.64351],[110.95741,-7.68234],[110.92924,-7.71638],[110.8949,-7.74433],[110.85572,-7.76509],[110.81321,-7.77787],[110.76899,-7.78219],[110.72477,-7.77787],[110.68225,-7.76509],[110.64307,-7.74433],[110.60873,-7.71638],[110.58056,-7.68234],[110.55964,-7.64351],[110.54677,-7.60137],[110.54244,-7.55755],[110.54681,-7.51374],[110.55973,-7.47162],[110.58067,-7.4328],[110.60885,-7.39878],[110.64318,-7.37086],[110.68233,-7.35012],[110.72481,-7.33735],[110.76899,-7.33303]]]}},iran:{type:"Feature",properties:{},id:"iran",geometry:{type:"Polygon",coordinates:[[[43.96643,39.42704],[44.36828,39.45104],[44.3518,39.57183],[44.62479,39.89048],[45.02746,39.54218],[45.50433,39.06259],[45.9613,38.92951],[46.50828,38.94537],[47.3236,39.44892],[48.00512,39.77374],[48.4411,39.3641],[48.19977,39.25565],[48.3728,39.10236],[48.30414,38.906],[48.10427,38.85269],[48.67649,38.48336],[49.32106,38.48734],[53.94287,37.48358],[54.43724,37.47487],[54.70691,37.69815],[55.26122,38.10864],[55.91695,38.16284],[56.239,38.26407],[57.28683,38.36073],[57.57896,37.98007],[58.01879,37.91821],[58.41395,37.7018],[58.72191,37.76204],[59.4218,37.59896],[59.63834,37.17964],[60.08422,37.11653],[60.37835,36.70792],[61.23424,36.72619],[61.37598,35.51361],[60.99608,34.29808],[60.63333,34.05914],[60.68847,33.68779],[61.01753,33.53868],[60.68833,33.11604],[60.98034,32.20735],[60.95577,31.5572],[61.7915,31.4486],[61.89696,31.1188],[61.90736,30.81546],[60.99448,29.85451],[61.42455,29.4109],[61.97206,28.63509],[62.8889,28.33884],[62.90715,27.31879],[63.29659,27.35528],[63.40209,27.17648],[63.2895,26.57212],[62.5891,26.47058],[62.29032,26.24108],[61.94822,26.12877],[61.62376,24.73837],[60.55845,24.98624],[58.03141,25.27164],[57.11051,25.5495],[56.54686,26.57238],[55.4988,26.01213],[55.28816,25.6474],[54.37853,25.61961],[53.90126,26.2239],[53.08217,26.52934],[51.26311,27.61327],[50.77328,28.14996],[50.48217,27.81479],[50.17456,27.78564],[49.93835,27.81965],[49.88342,27.975],[49.92187,28.18825],[50.33305,28.67232],[49.4197,29.70202],[48.58632,29.62242],[47.9928,30.44356],[47.98907,30.97004],[47.65869,30.98703],[47.65817,31.39276],[47.76361,31.76875],[47.30962,32.37144],[45.91075,33.02471],[46.06882,33.24741],[45.37024,33.9384],[45.40649,34.48845],[45.61523,34.74162],[45.84765,35.07793],[46.0613,35.21211],[45.91186,35.63945],[46.06018,35.76881],[45.75644,35.74371],[45.3092,35.9317],[45.19226,36.33283],[44.97802,36.46548],[44.95056,36.68605],[44.80224,36.7609],[44.83543,36.92589],[44.74731,37.02887],[44.71435,37.2828],[44.57153,37.38762],[44.51099,37.70537],[44.17537,37.86225],[44.29736,38.30899],[44.10461,39.10449],[43.93976,39.34825],[43.96643,39.42704]]]}},japan:{type:"Feature",id:"japan",properties:{},geometry:{type:"Polygon",coordinates:[[[141.11938,45.69083],[142.28497,45.56863],[145.39307,44.48867],[145.57983,44.11125],[145.27222,43.79291],[145.47821,43.46289],[145.68695,43.4589],[145.91217,43.39108],[145.44903,42.69934],[143.91094,41.8376],[142.48272,39.3181],[142.1751,38.15265],[141.38409,35.69383],[140.94463,35.21056],[140.55908,32.1198],[139.38457,31.87843],[138.98907,33.1752],[138.01025,34.29807],[135.99976,33.17434],[133.53882,32.71336],[132.48516,32.06483],[131.56128,31.04352],[131.03497,29.53613],[129.94629,27.50827],[127.78301,25.4442],[126.47461,25.42343],[125.86487,24.52713],[124.92657,23.88678],[123.37921,23.82053],[122.67883,24.31456],[122.7293,24.64795],[124.67834,25.02588],[125.36602,25.52354],[126.24493,26.35342],[127.56329,27.13828],[128.57403,28.73003],[128.74981,31.46703],[128.36426,32.62087],[128.92559,33.76174],[129.21021,34.62417],[129.56177,34.84086],[136.69739,37.9312],[139.1209,38.85762],[139.04297,42.04929],[140.13165,43.58114],[140.5711,45.64549],[141.11938,45.69083]]]}},malaysia:{type:"Feature",id:"malaysia",properties:{},geometry:{type:"MultiPolygon",coordinates:[[[[109.538,1.92671],[109.62041,1.98321],[109.64501,2.08141],[113.8,4.8],[114.26015,4.50701],[114.33278,4.34889],[114.31645,4.26363],[114.45418,4.24183],[114.49579,4.14668],[114.6492,4.00624],[114.80762,4.14929],[114.85775,4.26957],[114.87758,4.42656],[114.82955,4.42966],[114.80229,4.67536],[114.85851,4.79751],[114.97133,4.80824],[115.02238,4.74977],[115.09879,4.4685],[115.15547,4.38302],[115.24582,4.34118],[115.28924,4.60384],[115.2375,4.79584],[115.15038,4.87204],[115.15825,5.02512],[115,5.3],[116.9,7.6],[117.5,7.4],[119.35011,5.53088],[119.43909,5.11578],[118.83773,4.45269],[118.26478,4.09696],[117.95861,4.19058],[117.8992,4.16585],[117.52934,4.1615],[117.28899,4.31595],[116.97351,4.34488],[116.89887,4.36704],[116.61942,4.33622],[116.53602,4.37566],[116.43275,4.32567],[116.34851,4.39138],[116.18028,4.38255],[116.07901,4.27643],[116.00607,4.34818],[115.8779,4.39102],[115.8296,4.24118],[115.70731,4.19935],[115.64991,3.98828],[115.58177,3.88792],[115.61864,3.84247],[115.57965,3.74752],[115.57652,3.6094],[115.6344,3.45571],[115.53779,3.36201],[115.51617,3.26111],[115.56423,3.17109],[115.48328,3.01964],[115.24912,2.9667],[115.15001,2.90895],[115.11387,2.83327],[115.14115,2.74432],[115.09278,2.69409],[115.23743,2.50599],[115.13965,2.4776],[115.09508,2.41123],[114.95039,2.35132],[114.90604,2.25697],[114.79949,2.24936],[114.78024,2.14454],[114.80632,2.02438],[114.87834,1.91463],[114.74372,1.86954],[114.69469,1.81063],[114.71115,1.67148],[114.61498,1.57508],[114.58583,1.44665],[114.52646,1.44179],[114.41581,1.51111],[114.2027,1.4213],[114.14945,1.46149],[113.97573,1.45005],[113.85093,1.38715],[113.81508,1.30294],[113.63068,1.21597],[113.53549,1.32127],[113.41908,1.28549],[113.35493,1.35908],[113.106,1.44495],[113.05767,1.55877],[112.87744,1.58118],[112.77536,1.56153],[112.5171,1.57395],[112.20003,1.43709],[112.22581,1.39272],[112.13391,1.13752],[111.934,1.10284],[111.82599,0.98538],[111.66704,1.04281],[111.52219,0.95868],[111.48916,1.03442],[111.40504,1.0094],[111.22607,1.08799],[111.19759,1.06475],[110.9055,1.02835],[110.85815,0.94998],[110.59486,0.858],[110.49064,0.87637],[110.39497,0.99668],[110.30096,0.99575],[110.1922,1.18303],[110.09758,1.19756],[109.97919,1.29865],[109.93117,1.42466],[109.82759,1.48148],[109.66224,1.61881],[109.68554,1.78179],[109.58606,1.79192],[109.538,1.92671]]],[[[99.45833,6.30667],[99.51167,6.48167],[99.68908,6.47146],[99.91691,6.5233],[100.07588,6.40615],[100.15906,6.48065],[100.17157,6.69376],[100.32605,6.6597],[100.36648,6.53967],[100.4962,6.52128],[100.66237,6.45103],[100.73937,6.49207],[100.81258,6.44219],[100.83515,6.29654],[100.90398,6.23379],[100.98414,6.27884],[101.0943,6.26044],[101.12667,6.19264],[101.0868,5.9109],[101.03707,5.91804],[100.98946,5.78393],[101.1192,5.67031],[101.25999,5.71155],[101.27615,5.81155],[101.39691,5.87241],[101.48454,5.86993],[101.58131,5.93436],[101.66236,5.86871],[101.69082,5.75576],[101.79332,5.75066],[101.94402,5.87247],[101.94265,5.98109],[102.05204,6.0785],[102.08029,6.22537],[102.2,6.5],[103.6,5.8],[104.8,2.5],[104.5,1.5],[104.31571,1.28352],[104.12518,1.27582],[104.07647,1.43092],[103.89786,1.42794],[103.81267,1.47847],[103.67389,1.42814],[103.56667,1.1955],[103,1.325],[99,4.5],[99.45833,6.30667]]]]}},MNG:{type:"Feature",id:"MNG",properties:{name:"Mongolia"},geometry:{type:"Polygon",coordinates:[[[87.75126,49.2972],[88.80557,49.47052],[90.71367,50.33181],[92.23471,50.80217],[93.10422,50.49529],[94.14757,50.48054],[94.81595,50.01343],[95.81403,49.97747],[97.25973,49.72606],[98.23176,50.4224],[97.82574,51.011],[98.86149,52.04737],[99.98173,51.63401],[100.88948,51.51686],[102.06522,51.25992],[102.25591,50.51056],[103.67655,50.08997],[104.62155,50.27533],[105.88659,50.40602],[106.8888,50.2743],[107.86818,49.79371],[108.47517,49.28255],[109.40245,49.29296],[110.66201,49.13013],[111.58123,49.37797],[112.89774,49.54357],[114.36246,50.2483],[114.96211,50.14025],[115.4857,49.80518],[116.6788,49.88853],[116.1918,49.1346],[115.48528,48.13538],[115.74284,47.72655],[116.30895,47.85341],[117.29551,47.69771],[118.06414,48.06673],[118.86657,47.74706],[119.77282,47.04806],[119.66327,46.69268],[118.87433,46.80541],[117.4217,46.67273],[116.71787,46.3882],[115.9851,45.72724],[114.46033,45.33982],[113.46391,44.80889],[112.43606,45.01165],[111.87331,45.10208],[111.34838,44.45744],[111.66774,44.07318],[111.82959,43.74312],[111.12968,43.40683],[110.4121,42.87123],[109.2436,42.51945],[107.74477,42.48152],[106.12932,42.13433],[104.96499,41.59741],[104.52228,41.90835],[103.31228,41.90747],[101.83304,42.51487],[100.84587,42.6638],[99.51582,42.52469],[97.45176,42.74889],[96.3494,42.72563],[95.76246,43.31945],[95.30688,44.24133],[94.68893,44.35233],[93.48073,44.97547],[92.13389,45.11508],[90.94554,45.28607],[90.58577,45.71972],[90.97081,46.88815],[90.28083,47.69355],[88.8543,48.06908],[88.01383,48.59946],[87.75126,49.2972]]]}},MMR:{type:"Feature",id:"MMR",properties:{name:"Myanmar"},geometry:{type:"Polygon",coordinates:[[[92.10937,20.85881],[92.3291,21.49396],[92.68066,21.28937],[92.63672,22.08564],[92.98828,22.06528],[93.18604,22.22809],[93.14209,23.09994],[93.38379,23.22115],[93.36182,24.1267],[94.19678,23.92601],[94.70215,25.04579],[94.57031,25.26457],[95.20752,26.03704],[95.05371,26.49024],[97.66846,28.51697],[98.65723,27.50827],[98.56934,25.85922],[97.62451,24.8665],[97.73438,23.88584],[98.83301,24.14675],[98.85498,23.18076],[99.49219,23.05952],[99.1626,22.04491],[100.0415,21.96342],[100.32715,21.49396],[101.09619,21.71868],[101.16211,21.41216],[99.99756,20.36523],[97.91016,19.49766],[97.53662,18.29195],[98.83301,16.21467],[98.50342,15.32657],[98.21777,15.11455],[98.65723,14.24309],[99.18457,13.66734],[99.22852,12.85465],[99.66797,11.65224],[98.4375,9.90392],[97.77832,14.34955],[97.00928,16.80454],[95.42725,15.55954],[94.021,16.04581],[94.21875,18.0832],[92.10937,20.85881]]]}},"Institute-of-Crisis-Management-Studies":{type:"Feature",id:"Institute-of-Crisis-Management-Studies",properties:{},geometry:{type:"Polygon",coordinates:[[[85.34173,27.95228],[85.39133,27.94796],[85.43901,27.93515],[85.48293,27.91436],[85.5214,27.88639],[85.55293,27.85231],[85.57632,27.81345],[85.59067,27.77129],[85.59544,27.72747],[85.59047,27.68367],[85.57595,27.64156],[85.55245,27.60278],[85.52087,27.56879],[85.48245,27.5409],[85.43864,27.52019],[85.39113,27.50743],[85.34173,27.50313],[85.29233,27.50743],[85.24482,27.52019],[85.20102,27.5409],[85.16259,27.56879],[85.13102,27.60278],[85.10752,27.64156],[85.09299,27.68367],[85.08802,27.72747],[85.09279,27.77129],[85.10715,27.81345],[85.13054,27.85231],[85.16207,27.88639],[85.20053,27.91436],[85.24445,27.93515],[85.29213,27.94796],[85.34173,27.95228]]]}},"Kathmandu-University":{type:"Feature",id:"Kathmandu-University",properties:{},geometry:{type:"Polygon",coordinates:[[[85.53873,27.84494],[85.58828,27.84062],[85.63591,27.82781],[85.67979,27.80702],[85.71822,27.77905],[85.74972,27.74497],[85.77308,27.70611],[85.78742,27.66395],[85.79219,27.62013],[85.78722,27.57633],[85.77272,27.53422],[85.74924,27.49543],[85.7177,27.46145],[85.67931,27.43356],[85.63554,27.41285],[85.58808,27.40009],[85.53873,27.39578],[85.48938,27.40009],[85.44192,27.41285],[85.39815,27.43356],[85.35976,27.46145],[85.32822,27.49543],[85.30474,27.53422],[85.29024,27.57633],[85.28527,27.62013],[85.29004,27.66395],[85.30438,27.70611],[85.32774,27.74497],[85.35924,27.77905],[85.39767,27.80702],[85.44155,27.82781],[85.48918,27.84062],[85.53873,27.84494]]]}},NPL:{type:"Feature",id:"NPL",properties:{name:"Nepal"},geometry:{type:"Polygon",coordinates:[[[88.12044,27.87654],[88.04313,27.44582],[88.1748,26.8104],[88.06024,26.41462],[87.22747,26.3979],[86.02439,26.63098],[85.25178,26.7262],[84.67502,27.2349],[83.30425,27.36451],[81.99999,27.92548],[81.0572,28.41609],[80.08843,28.79447],[80.47672,29.72987],[81.11126,30.18348],[81.5258,30.42272],[82.32751,30.11527],[83.33711,29.46373],[83.89899,29.32023],[84.23458,28.83989],[85.01164,28.64277],[85.82332,28.20358],[86.95452,27.97426],[88.12044,27.87654]]]}},"Tribhuvan-University":{type:"Feature",id:"Tribhuvan-University",properties:{},geometry:{type:"Polygon",coordinates:[[[83.97645,28.47849],[84.0263,28.47417],[84.07421,28.46136],[84.11835,28.44057],[84.157,28.4126],[84.18869,28.37852],[84.21219,28.33965],[84.22661,28.2975],[84.23141,28.25368],[84.22641,28.20987],[84.21181,28.16777],[84.18819,28.12898],[84.15647,28.09499],[84.11785,28.06711],[84.07383,28.04639],[84.02609,28.03364],[83.97645,28.02933],[83.92682,28.03364],[83.87908,28.04639],[83.83506,28.06711],[83.79644,28.09499],[83.76471,28.12898],[83.7411,28.16777],[83.7265,28.20987],[83.7215,28.25368],[83.72629,28.2975],[83.74072,28.33965],[83.76422,28.37852],[83.7959,28.4126],[83.83456,28.44057],[83.8787,28.46136],[83.92661,28.47417],[83.97645,28.47849]]]}},north_korea:{type:"Feature",id:"north_korea",properties:{},geometry:{type:"Polygon",coordinates:[[[125,37.2],[123.5,38.4],[124.38,40.12],[124.87,40.47],[126.05,40.95],[126.6,41.6],[126.9,41.8],[127.25,41.5],[128.2,41.4],[128.3,41.56],[128.04,42.03],[128.95,42.03],[129.35,42.44],[129.69,42.44],[129.88,43],[130.2,42.9],[130.3,42.66],[130.5,42.6],[130.7,42.3],[131,39],[128.33,38.61],[128.28,38.42],[128.08,38.32],[127.14,38.32],[126.99,38.21],[126.95,38.14],[126.88,38.1],[126.82,38],[126.67,37.95],[126.69,37.84],[126.667,37.828],[126.66,37.79],[126.585,37.76],[126.474,37.81],[126.42,37.845],[126.2,37.82],[126.18,37.74],[125,37.2]]]}},"Far-Eastern-University-Institute-of-Technology":{type:"Feature",id:"Far-Eastern-University-Institute-of-Technology",properties:{},geometry:{type:"Polygon",coordinates:[[[121.02539,14.82943],[121.07071,14.82511],[121.11429,14.81231],[121.15444,14.79154],[121.18961,14.76359],[121.21847,14.72954],[121.23989,14.69069],[121.25305,14.64855],[121.25747,14.60473],[121.25296,14.56092],[121.23972,14.51881],[121.21825,14.48],[121.18938,14.44599],[121.15422,14.41808],[121.11412,14.39735],[121.07062,14.38458],[121.02539,14.38027],[120.98016,14.38458],[120.93666,14.39735],[120.89656,14.41808],[120.8614,14.44599],[120.83253,14.48],[120.81106,14.51881],[120.79782,14.56092],[120.79331,14.60473],[120.79773,14.64855],[120.81089,14.69069],[120.83232,14.72954],[120.86117,14.76359],[120.89635,14.79154],[120.93649,14.81231],[120.98007,14.82511],[121.02539,14.82943]]]}},philippines:{type:"Feature",id:"philippines",properties:{},geometry:{type:"Polygon",coordinates:[[[114.93896,8.23324],[122.01416,21.71868],[127.6062,7.39515],[125.50781,5.14566],[118.89954,4.41761],[119.49829,5.28789],[117.53174,7.39515],[114.93896,8.23324]]]}},"University-of-the-Philippines-Resilience-Institute":{type:"Feature",id:"University-of-the-Philippines-Resilience-Institute",properties:{},geometry:{type:"Polygon",coordinates:[[[121.06511,14.87964],[121.11044,14.87532],[121.15402,14.86253],[121.19418,14.84176],[121.22937,14.81381],[121.25822,14.77975],[121.27965,14.74091],[121.29282,14.69877],[121.29724,14.65495],[121.29273,14.61114],[121.27948,14.56902],[121.25801,14.53022],[121.22913,14.49621],[121.19396,14.4683],[121.15385,14.44756],[121.11035,14.4348],[121.06511,14.43049],[121.01986,14.4348],[120.97636,14.44756],[120.93625,14.4683],[120.90108,14.49621],[120.8722,14.53022],[120.85073,14.56902],[120.83748,14.61114],[120.83297,14.65495],[120.83739,14.69877],[120.85056,14.74091],[120.87199,14.77975],[120.90084,14.81381],[120.93603,14.84176],[120.97619,14.86253],[121.01977,14.87532],[121.06511,14.87964]]]}},russia:{type:"Feature",id:"russia",properties:{},geometry:{type:"MultiPolygon",coordinates:[[[[22.7311,54.32754],[20.89224,54.31253],[19.66064,54.42608],[19.88848,54.86616],[21.26845,55.19048],[22.31572,55.0153],[22.75776,54.85657],[22.65105,54.58274],[22.7311,54.32754]]],[[[-180,83],[-169,66.5],[-171,64],[-180,64],[-180,83]]],[[[180,83],[180,64.97971],[179.99281,64.97433],[178.7072,64.53493],[177.41128,64.60821],[178.313,64.07593],[178.90825,63.25197],[179.37034,62.98262],[179.48636,62.56894],[179.22825,62.3041],[177.3643,62.5219],[174.56929,61.76915],[173.68013,61.65261],[172.15,60.95],[170.6985,60.33618],[170.33085,59.88177],[168.90046,60.57355],[166.29498,59.78855],[165.84,60.16],[164.87674,59.7316],[163.53929,59.86871],[163.21711,59.21101],[162.01733,58.24328],[162.05297,57.83912],[163.19191,57.61503],[163.05794,56.15924],[162.12958,56.12219],[161.70146,55.28568],[162.11749,54.85514],[160.36877,54.34433],[160.02173,53.20257],[158.53094,52.95868],[158.23118,51.94269],[156.78979,51.01105],[156.42,51.7],[155.99182,53.15895],[155.43366,55.38103],[155.91442,56.76792],[156.75815,57.3647],[156.81035,57.83204],[158.36433,58.05575],[160.15064,59.31477],[161.87204,60.343],[163.66969,61.1409],[164.47355,62.55061],[163.25842,62.46627],[162.65791,61.6425],[160.12148,60.54423],[159.30232,61.77396],[156.72068,61.43442],[154.21806,59.75818],[155.04375,59.14495],[152.81185,58.88385],[151.26573,58.78089],[151.33815,59.50396],[149.78371,59.65573],[148.54481,59.16448],[145.48722,59.33637],[142.19782,59.03998],[138.95848,57.08805],[135.12619,54.72959],[136.70171,54.60355],[137.19342,53.97732],[138.1647,53.75501],[138.80463,54.25455],[139.90151,54.18968],[141.34531,53.08957],[141.37923,52.23877],[140.59742,51.23967],[140.51308,50.04553],[140.06193,48.44671],[138.55472,46.99965],[138.21971,46.30795],[136.86232,45.1435],[135.51535,43.989],[134.86939,43.39821],[133.53687,42.81147],[132.90627,42.79849],[132.27807,43.28456],[130.93587,42.55274],[130.78,42.22],[130.64,42.395],[130.63387,42.90302],[131.14469,42.92999],[131.28856,44.11152],[131.02519,44.96796],[131.88345,45.32116],[133.09712,45.14409],[133.76964,46.11693],[134.11235,47.21248],[134.50081,47.57845],[135.02631,48.47823],[133.3736,48.18344],[132.50669,47.78896],[130.98726,47.79013],[130.58229,48.72969],[129.39782,49.4406],[127.6574,49.76027],[127.28746,50.7398],[126.93916,51.35389],[126.5644,51.78426],[125.94635,52.7928],[125.06821,53.16105],[123.57147,53.4588],[122.24575,53.43173],[121.00308,53.2514],[120.17709,52.75389],[120.72579,52.51623],[120.7382,51.96411],[120.18208,51.64355],[119.27939,50.58292],[119.28846,50.14288],[117.87924,49.51098],[116.6788,49.88853],[115.4857,49.80518],[114.96211,50.14025],[114.36246,50.2483],[112.89774,49.54357],[111.58123,49.37797],[110.66201,49.13013],[109.40245,49.29296],[108.47517,49.28255],[107.86818,49.79371],[106.8888,50.2743],[105.88659,50.40602],[104.62158,50.27532],[103.67655,50.08997],[102.25589,50.51056],[102.06521,51.25991],[100.88948,51.51686],[99.98173,51.63401],[98.86149,52.04737],[97.82574,51.011],[98.23176,50.4224],[97.25976,49.72605],[95.81402,49.97746],[94.81595,50.01343],[94.14757,50.48054],[93.10421,50.49529],[92.23471,50.80217],[90.71367,50.33181],[88.80557,49.47052],[87.75126,49.2972],[87.35997,49.21498],[86.82936,49.82668],[85.54127,49.69286],[85.11556,50.1173],[84.41638,50.3114],[83.93511,50.88925],[83.383,51.06918],[81.94599,50.8122],[80.56845,51.38834],[80.03556,50.86475],[77.80092,53.40442],[76.52518,54.177],[76.8911,54.49052],[74.38482,53.54685],[73.42568,53.48981],[73.50852,54.03562],[72.22415,54.37665],[71.18013,54.13329],[70.86527,55.16973],[69.06817,55.38525],[68.1691,54.97039],[65.66687,54.60125],[65.17853,54.35423],[61.4366,54.00625],[60.97807,53.66499],[61.69999,52.98],[60.73999,52.71999],[60.92727,52.44755],[59.96753,51.96042],[61.588,51.27266],[61.33742,50.79907],[59.93281,50.84219],[59.64228,50.54544],[58.36332,51.06364],[56.77798,51.04355],[55.71694,50.62171],[54.53288,51.02624],[52.32872,51.71865],[50.76665,51.69276],[48.70238,50.60513],[48.57784,49.87476],[47.54948,50.4547],[46.7516,49.35601],[47.04367,49.15204],[46.46645,48.39415],[47.31524,47.71585],[48.05725,47.74377],[48.69473,47.07563],[48.59325,46.56104],[49.10116,46.39933],[48.64541,45.80629],[47.67591,45.64149],[46.68201,44.6092],[47.59094,43.66016],[47.49252,42.98658],[48.58437,41.80888],[47.98728,41.40582],[47.81567,41.15142],[47.37331,41.21973],[46.68607,41.82714],[46.40495,41.86068],[45.7764,42.09244],[45.47028,42.50278],[44.53762,42.71199],[43.93121,42.55496],[43.75599,42.74083],[42.3944,43.2203],[40.92219,43.38215],[40.07697,43.5531],[39.95501,43.435],[38.68,44.28],[37.53912,44.65721],[36.67546,45.24469],[37.40317,45.40451],[38.23295,46.24087],[37.67372,46.63657],[39.14767,47.04475],[39.1212,47.26336],[38.22354,47.10219],[38.25511,47.5464],[38.77057,47.82562],[39.73828,47.89894],[39.89562,48.23241],[39.67465,48.78382],[40.08079,49.30743],[40.06904,49.60105],[38.59499,49.92646],[38.01063,49.91566],[37.39346,50.38395],[36.62617,50.22559],[35.35612,50.5772],[35.37791,50.77394],[35.02218,51.20757],[34.22482,51.25599],[34.14198,51.56641],[34.39173,51.76888],[33.7527,52.33508],[32.71576,52.23846],[32.41206,52.28869],[32.15944,52.06125],[31.78597,52.10168],[31.54002,52.74205],[31.3052,53.074],[31.49764,53.16743],[32.30452,53.13273],[32.69364,53.35142],[32.4056,53.61805],[31.73127,53.79403],[31.79142,53.97464],[31.38447,54.15706],[30.75753,54.81177],[30.97184,55.08155],[30.87391,55.55098],[29.89629,55.78946],[29.37157,55.67009],[29.22951,55.91834],[28.17671,56.16913],[27.85528,56.75933],[27.77002,57.24426],[27.28818,57.47453],[27.71669,57.7919],[27.42015,58.72457],[28.1317,59.30083],[27.98112,59.47537],[29.1177,60.02805],[28.07,60.50352],[30.21111,61.78003],[31.13999,62.35769],[31.51609,62.86769],[30.03587,63.55281],[30.44468,64.20445],[29.54443,64.94867],[30.21765,65.80598],[29.05459,66.94429],[29.97743,67.6983],[28.44594,68.36461],[28.59193,69.06478],[35,71],[40,83],[180,83]]]]}},south_korea:{type:"Feature",id:"south_korea",properties:{},geometry:{type:"Polygon",coordinates:[[[125,33],[125,37.2],[126.18,37.74],[126.2,37.82],[126.42,37.845],[126.474,37.81],[126.585,37.76],[126.66,37.79],[126.667,37.828],[126.69,37.84],[126.67,37.95],[126.82,38],[126.88,38.1],[126.95,38.14],[126.99,38.21],[127.14,38.32],[128.08,38.32],[128.28,38.42],[128.33,38.61],[131,39],[131.3,36.6],[127.3,33],[125,33]]]}},sri_lanka:{type:"Feature",id:"sri_lanka",properties:{name:"Sri Lanka"},geometry:{type:"Polygon",coordinates:[[[81.78796,7.52306],[81.63732,6.48177],[81.21802,6.19714],[80.34836,5.96837],[79.87247,6.76346],[79.69517,8.20084],[80.1478,9.82408],[80.83882,9.26843],[81.30432,8.56421],[81.78796,7.52306]]]}},taiwan:{type:"Feature",id:"taiwan",properties:{},geometry:{type:"Polygon",coordinates:[[[119,23.5],[121.7,26],[122.5,25.5],[121.8,21.8],[120,21.5],[119,23.5]]]}},thailand_cnx:{type:"Feature",id:"thailand_cnx",properties:{},geometry:{type:"Polygon",coordinates:[[[98.4375,18.2319],[98.4375,19.2255],[99.5306,19.2255],[99.5306,18.2319],[98.4375,18.2319]]]}},thailand_full:{type:"Feature",id:"thailand_full",properties:{},geometry:{type:"Polygon",coordinates:[[[97.50366,8.39358],[97.7124,9.60075],[99.47021,11.8566],[98.05298,14.84923],[98.32764,16.15137],[97.21802,18.39623],[97.38281,19.73568],[100.2832,20.66363],[101.37085,19.69431],[101.40381,18.27109],[104.08447,18.58377],[105.76538,16.06693],[105.52368,14.15788],[102.854,13.82741],[103.00781,11.69527],[102.12891,5.81276],[101.11542,5.4875],[100.66498,6.42448],[99.13788,6.34806],[97.50366,8.39358]]]}},"al-tirana":{type:"Feature",id:"al-tirana",properties:{},geometry:{type:"Polygon",coordinates:[[[19.77796,41.36244],[19.78028,41.36267],[19.78123,41.36014],[19.78004,41.35915],[19.78099,41.35803],[19.77752,41.35682],[19.78082,41.35409],[19.77658,41.35122],[19.78029,41.34936],[19.7832,41.35026],[19.7899,41.34976],[19.79536,41.34793],[19.80046,41.3502],[19.81074,41.35213],[19.81874,41.35044],[19.82238,41.35173],[19.83428,41.35186],[19.84174,41.35434],[19.84682,41.3589],[19.84829,41.35842],[19.85095,41.36008],[19.85159,41.35903],[19.8561,41.35843],[19.85488,41.3545],[19.85784,41.35167],[19.85518,41.35228],[19.85275,41.35145],[19.85276,41.34956],[19.85151,41.34955],[19.85462,41.34419],[19.85876,41.33995],[19.8642,41.33947],[19.86465,41.33789],[19.86829,41.33772],[19.86999,41.33882],[19.87262,41.33794],[19.87259,41.33606],[19.87543,41.3355],[19.87644,41.33126],[19.87554,41.33042],[19.87232,41.33102],[19.87095,41.32999],[19.86659,41.33088],[19.86535,41.32664],[19.86164,41.32543],[19.85813,41.3214],[19.85489,41.32066],[19.85575,41.31876],[19.84532,41.314],[19.84458,41.31212],[19.85095,41.30156],[19.84975,41.29748],[19.8457,41.29559],[19.83906,41.29791],[19.82955,41.29568],[19.82738,41.29791],[19.82504,41.29827],[19.82605,41.29986],[19.82333,41.30509],[19.82032,41.30525],[19.81821,41.3037],[19.81168,41.30787],[19.81162,41.31002],[19.80709,41.31302],[19.79827,41.31487],[19.79767,41.31238],[19.79374,41.313],[19.78954,41.31035],[19.7852,41.31117],[19.78057,41.3142],[19.77976,41.31244],[19.78765,41.30887],[19.78369,41.30473],[19.77721,41.30247],[19.77515,41.30039],[19.77077,41.30363],[19.76019,41.29972],[19.75706,41.30651],[19.75854,41.30874],[19.75473,41.31208],[19.75643,41.31314],[19.75571,41.31548],[19.76586,41.3199],[19.76813,41.32266],[19.77017,41.32139],[19.76811,41.31882],[19.76922,41.31754],[19.77559,41.31854],[19.77323,41.32284],[19.77378,41.32422],[19.77893,41.32349],[19.77968,41.32518],[19.78451,41.32399],[19.78734,41.32541],[19.78321,41.33328],[19.78343,41.33578],[19.77659,41.33783],[19.78083,41.34567],[19.76839,41.35239],[19.75832,41.35489],[19.76053,41.35931],[19.75484,41.3598],[19.75767,41.36542],[19.76169,41.36185],[19.76434,41.36249],[19.76411,41.36393],[19.76775,41.36369],[19.76857,41.36459],[19.77145,41.364],[19.77204,41.36125],[19.77796,41.36244]]]}},albania:{type:"Feature",id:"albania",properties:{},geometry:{type:"Polygon",coordinates:[[[19.39087,41.86138],[19.40186,42.09007],[19.27002,42.18376],[19.69849,42.67436],[19.81384,42.46399],[20.07202,42.55713],[20.25879,42.33824],[20.34668,42.32606],[20.51697,42.23665],[20.61584,41.92272],[20.52795,41.71803],[20.56091,41.57847],[20.44556,41.54559],[20.56091,41.40566],[20.50049,41.3397],[20.58289,41.09177],[20.65979,41.07521],[20.71472,40.90521],[20.95642,40.92181],[20.98389,40.7431],[21.07178,40.60978],[20.95093,40.47202],[20.85205,40.47202],[20.68726,40.10329],[20.43457,40.07387],[20.33569,39.99396],[20.43457,39.82119],[20.38513,39.77899],[20.28625,39.8001],[20.31921,39.72831],[20.20386,39.63954],[19.97314,39.69451],[20.0116,39.86759],[19.86328,40.04444],[19.35791,40.2921],[19.25354,40.51798],[19.4458,40.3298],[19.50073,40.43859],[19.31396,40.65564],[19.41833,40.90936],[19.53918,40.92181],[19.4458,41.00063],[19.43481,41.15384],[19.50623,41.2489],[19.4458,41.32733],[19.41284,41.4139],[19.51721,41.52092],[19.45129,41.60312],[19.52271,41.57847],[19.58862,41.62366],[19.59961,41.7836],[19.39087,41.86138]]]}},austria:{type:"Feature",id:"austria",properties:{},geometry:{type:"Polygon",coordinates:[[[16.50733,46.99293],[16.28342,46.99293],[16.13584,46.8713],[15.98317,46.81909],[16.04933,46.65517],[15.86104,46.71801],[15.75926,46.69009],[15.56079,46.67962],[15.57606,46.63421],[15.47937,46.60276],[15.43357,46.65168],[15.22493,46.63421],[15.04682,46.64819],[14.99084,46.58877],[14.9603,46.62373],[14.85344,46.60276],[14.83308,46.50127],[14.75166,46.49776],[14.68041,46.43818],[14.61426,46.43818],[14.57864,46.37853],[14.44124,46.43116],[14.16135,46.42766],[14.12573,46.47674],[14.01886,46.47674],[13.91199,46.52578],[13.82548,46.50477],[13.44381,46.56078],[13.30641,46.55028],[13.1283,46.58877],[12.84332,46.61324],[12.72628,46.6412],[12.51255,46.66565],[12.35988,46.70405],[12.36497,46.77032],[12.28863,46.77729],[12.27337,46.88522],[12.20721,46.87478],[12.13088,46.90261],[12.11561,46.99987],[12.25301,47.06577],[12.2123,47.0935],[11.9833,47.04497],[11.73394,46.96168],[11.63217,47.01028],[11.54057,46.97557],[11.49986,47.00681],[11.41843,46.96515],[11.25559,46.97557],[11.1131,46.91304],[11.04185,46.76335],[10.88919,46.75986],[10.74161,46.78426],[10.70599,46.86435],[10.57877,46.83998],[10.45663,46.85043],[10.47699,46.92694],[10.38539,46.98946],[10.23272,46.86435],[10.12076,46.83302],[9.86632,46.94084],[9.90194,47.00334],[9.68312,47.05884],[9.61188,47.03804],[9.63223,47.12813],[9.58134,47.1662],[9.54063,47.26644],[9.60679,47.34926],[9.67294,47.36994],[9.64241,47.44571],[9.56608,47.48011],[9.71365,47.52824],[9.7849,47.59692],[9.83579,47.54542],[9.94774,47.53855],[10.09023,47.44915],[10.11059,47.36649],[10.2429,47.38717],[10.18692,47.2699],[10.32432,47.29751],[10.48208,47.44915],[10.43119,47.48699],[10.44137,47.59005],[10.48717,47.55229],[10.54823,47.53511],[10.59912,47.56602],[10.75688,47.53168],[10.88919,47.54542],[10.94008,47.48699],[10.99605,47.39061],[11.23523,47.44227],[11.28103,47.3975],[11.42352,47.51449],[11.57619,47.50762],[11.60672,47.59005],[11.83572,47.58662],[12.00366,47.62436],[12.20721,47.60378],[12.16141,47.69634],[12.2581,47.74427],[12.25301,47.67921],[12.43112,47.71004],[12.49219,47.63122],[12.56852,47.62779],[12.62959,47.68949],[12.77208,47.66893],[12.83315,47.54198],[12.97564,47.47323],[13.04179,47.49387],[13.0367,47.55572],[13.09777,47.64151],[13.03161,47.71004],[12.90439,47.72031],[13.00617,47.84683],[12.9451,47.93555],[12.86368,47.95941],[12.86368,48.00369],[12.75172,48.09894],[12.87386,48.21097],[12.96037,48.21097],[13.04179,48.2652],[13.18428,48.29907],[13.26061,48.2923],[13.39801,48.35659],[13.44381,48.41742],[13.43872,48.55234],[13.50997,48.58601],[13.61175,48.57255],[13.72879,48.5119],[13.78477,48.57255],[13.82039,48.62639],[13.79495,48.71713],[13.85093,48.77417],[14.05957,48.66338],[14.01377,48.63312],[14.07484,48.59274],[14.21733,48.59611],[14.3649,48.54897],[14.46668,48.64993],[14.55828,48.59611],[14.59899,48.62639],[14.72113,48.57591],[14.72113,48.6869],[14.8229,48.7272],[14.81782,48.77753],[14.96472,48.78518],[14.98936,49.01266],[15.14859,48.99503],[15.19439,48.93155],[15.30635,48.98501],[15.39286,48.98501],[15.48446,48.92821],[15.74908,48.8546],[15.84068,48.88807],[16.00862,48.78088],[16.20708,48.73391],[16.39537,48.73727],[16.49206,48.81105],[16.69053,48.77417],[16.7058,48.73391],[16.89917,48.71377],[16.97551,48.51527],[16.84828,48.45118],[16.85337,48.34644],[16.95515,48.25165],[16.99077,48.1499],[17.09255,48.13971],[17.08237,48.02412],[17.17397,48.02071],[17.08237,47.87414],[16.98568,47.86732],[17.08237,47.80925],[17.09255,47.70319],[16.74142,47.67921],[16.7058,47.75112],[16.53786,47.75454],[16.54804,47.70662],[16.42082,47.66893],[16.57348,47.6175],[16.67017,47.63122],[16.71088,47.53855],[16.66,47.44915],[16.54295,47.39406],[16.46153,47.39406],[16.49206,47.2768],[16.42591,47.19733],[16.47171,47.1489],[16.54804,47.1489],[16.47679,47.07964],[16.52768,47.05884],[16.50733,46.99293]]]}},graz:{type:"Feature",id:"graz",properties:{},geometry:{type:"Polygon",coordinates:[[[15.26276,46.94182],[15.26276,47.16918],[15.62943,47.16918],[15.62943,46.94182],[15.26276,46.94182]]]}},belarus:{type:"Feature",id:"belarus",properties:{},geometry:{type:"Polygon",coordinates:[[[23.19351,52.37811],[23.38715,52.57134],[23.67554,52.61806],[23.87329,52.72215],[23.75656,53.20027],[23.42148,53.83956],[23.43521,53.97467],[24.33609,53.99082],[24.73022,54.03762],[24.70825,54.16967],[24.95682,54.18253],[25.48004,54.37176],[25.63385,54.95239],[26.53748,55.24468],[26.27655,55.26973],[26.48804,55.71009],[26.89728,55.87993],[27.56195,55.82597],[27.56195,55.97226],[27.98218,56.20976],[29.64935,55.96304],[30.28107,55.89303],[30.95398,55.64815],[31.20941,54.67065],[32.47009,53.7617],[32.83539,53.3866],[32.22839,53.02635],[31.51978,53.16159],[31.84662,52.06262],[30.8139,51.93411],[30.4953,51.21032],[27.71301,51.46085],[25.85083,51.88666],[24.5874,51.81541],[23.51898,51.41634],[23.45581,51.99841],[23.15918,52.1874],[23.19351,52.37811]]]}},belgium:{type:"Feature",id:"belgium",properties:{},geometry:{type:"Polygon",coordinates:[[[3.08167,51.55146],[3.30963,51.43346],[3.36834,51.36996],[3.37761,51.35956],[3.37589,51.34841],[3.38482,51.34337],[3.38722,51.33887],[3.38688,51.33286],[3.36096,51.31527],[3.3819,51.30207],[3.37641,51.29928],[3.36782,51.29681],[3.38293,51.28726],[3.38327,51.2806],[3.37915,51.27824],[3.38121,51.27598],[3.39031,51.27416],[3.39598,51.26686],[3.40439,51.26449],[3.40937,51.25923],[3.41795,51.26127],[3.42138,51.25848],[3.4267,51.25482],[3.42894,51.24709],[3.44679,51.24279],[3.52592,51.24677],[3.51425,51.2878],[3.52927,51.28935],[3.53434,51.28474],[3.53811,51.28479],[3.54266,51.29177],[3.55717,51.29187],[3.5588,51.2959],[3.56163,51.29644],[3.56489,51.29569],[3.5727,51.29225],[3.57253,51.29107],[3.57571,51.28946],[3.57905,51.28951],[3.58206,51.28876],[3.58214,51.29247],[3.58618,51.29316],[3.58026,51.29869],[3.58987,51.30663],[3.62626,51.29413],[3.64145,51.28914],[3.64411,51.29069],[3.6581,51.29096],[3.6781,51.28345],[3.67905,51.28168],[3.69063,51.28173],[3.69424,51.27668],[3.71801,51.27217],[3.71827,51.27368],[3.72273,51.274],[3.75054,51.27061],[3.75286,51.27104],[3.75681,51.26986],[3.76342,51.26261],[3.76848,51.26106],[3.77123,51.26218],[3.77355,51.2646],[3.79698,51.25665],[3.79071,51.24553],[3.79063,51.21608],[3.80453,51.2143],[3.80796,51.21398],[3.82479,51.21086],[3.8356,51.21516],[3.85225,51.21484],[3.85895,51.21291],[3.89002,51.22473],[3.89568,51.21968],[3.89482,51.2143],[3.88298,51.20764],[3.88762,51.20301],[3.89345,51.20527],[3.89929,51.20398],[3.91542,51.20989],[3.91388,51.21764],[3.92349,51.21989],[3.93105,51.22194],[3.9374,51.21398],[3.94323,51.21721],[3.95748,51.21764],[3.96023,51.22527],[3.97654,51.22667],[3.9846,51.2357],[3.99473,51.23914],[4.00469,51.24311],[4.01636,51.24623],[4.03851,51.24687],[4.04125,51.24397],[4.05842,51.24505],[4.06082,51.24773],[4.16365,51.29391],[4.23815,51.35345],[4.22373,51.35881],[4.21686,51.36878],[4.21635,51.37435],[4.33685,51.37842],[4.34235,51.35988],[4.35093,51.35967],[4.36861,51.35795],[4.38543,51.35592],[4.39505,51.35753],[4.42114,51.36707],[4.42818,51.36642],[4.42337,51.37242],[4.42904,51.37521],[4.38852,51.40702],[4.38097,51.42137],[4.38904,51.42597],[4.39093,51.43304],[4.3935,51.43486],[4.39161,51.44416],[4.37891,51.44502],[4.37719,51.44716],[4.38131,51.45165],[4.38509,51.4508],[4.44157,51.47005],[4.46354,51.4723],[4.47487,51.47978],[4.48654,51.4786],[4.53856,51.48416],[4.55074,51.47283],[4.53238,51.44877],[4.53701,51.42522],[4.57512,51.43411],[4.63469,51.42651],[4.64087,51.42372],[4.65048,51.42747],[4.6673,51.42779],[4.66473,51.44556],[4.69236,51.45326],[4.70146,51.46845],[4.71416,51.47026],[4.71519,51.47304],[4.72781,51.48486],[4.74524,51.48988],[4.74721,51.49368],[4.74781,51.49651],[4.75047,51.49945],[4.75648,51.50196],[4.77253,51.50682],[4.79485,51.5034],[4.82025,51.49784],[4.82643,51.48609],[4.84737,51.48352],[4.84291,51.46449],[4.84909,51.46085],[4.84463,51.4478],[4.83089,51.44438],[4.83742,51.42683],[4.8563,51.41805],[4.88171,51.43325],[4.91741,51.4127],[4.93389,51.42083],[4.90162,51.44053],[4.9387,51.46192],[4.97646,51.44545],[5.02419,51.48523],[5.03225,51.48919],[5.04187,51.4878],[5.04135,51.48053],[5.04856,51.47433],[5.08032,51.47475],[5.10658,51.43047],[5.07294,51.39358],[5.11765,51.36149],[5.12074,51.35592],[5.13268,51.3475],[5.13525,51.31608],[5.1622,51.31135],[5.17241,51.31688],[5.19001,51.32069],[5.19585,51.32123],[5.19988,51.32348],[5.24331,51.30594],[5.2276,51.26841],[5.23842,51.26208],[5.26357,51.26782],[5.29584,51.26267],[5.31567,51.26449],[5.33755,51.26428],[5.34107,51.26686],[5.34399,51.27309],[5.34554,51.27668],[5.4172,51.2632],[5.43222,51.27706],[5.43806,51.27695],[5.44132,51.2827],[5.46398,51.28549],[5.47608,51.29209],[5.47608,51.29536],[5.48226,51.29923],[5.48201,51.301],[5.51625,51.29612],[5.52011,51.28957],[5.54363,51.27298],[5.55711,51.26718],[5.55874,51.2631],[5.55745,51.25316],[5.55651,51.24472],[5.56131,51.22301],[5.63667,51.20355],[5.65401,51.19812],[5.65513,51.1936],[5.65212,51.1929],[5.65753,51.1865],[5.66834,51.18671],[5.67624,51.18548],[5.67761,51.18435],[5.6856,51.18542],[5.68946,51.18623],[5.69815,51.1842],[5.70201,51.18397],[5.70165,51.18275],[5.70645,51.18248],[5.70815,51.18223],[5.70987,51.1812],[5.71431,51.1839],[5.7177,51.18475],[5.72948,51.18601],[5.73031,51.18553],[5.73274,51.18564],[5.73274,51.18615],[5.7345,51.18657],[5.73993,51.18757],[5.74576,51.19032],[5.75769,51.18618],[5.75821,51.1851],[5.76731,51.18413],[5.77821,51.1787],[5.77477,51.17337],[5.7801,51.17289],[5.78078,51.17208],[5.77992,51.17052],[5.77673,51.1702],[5.77585,51.17028],[5.77321,51.16967],[5.77274,51.16925],[5.77192,51.16924],[5.77093,51.1698],[5.76993,51.16905],[5.77059,51.16458],[5.77383,51.16453],[5.77385,51.16558],[5.77638,51.16565],[5.77701,51.16306],[5.7775,51.16298],[5.77808,51.16353],[5.77975,51.16356],[5.78025,51.15935],[5.77797,51.15803],[5.77677,51.15554],[5.77829,51.15502],[5.77907,51.15319],[5.78456,51.15421],[5.79005,51.15798],[5.79512,51.15798],[5.80095,51.15954],[5.80027,51.16094],[5.80361,51.1632],[5.80619,51.16352],[5.8134,51.16051],[5.8146,51.16325],[5.82473,51.16874],[5.83434,51.16314],[5.83589,51.15905],[5.84078,51.15819],[5.84129,51.15523],[5.8564,51.15071],[5.86258,51.14446],[5.85674,51.14037],[5.85159,51.13671],[5.84816,51.12938],[5.83374,51.12744],[5.82241,51.12249],[5.81211,51.11387],[5.82275,51.11171],[5.84026,51.10611],[5.83683,51.0936],[5.82584,51.08929],[5.80559,51.09102],[5.81142,51.07851],[5.80421,51.07031],[5.80868,51.06233],[5.797,51.05564],[5.77709,51.05693],[5.76576,51.03384],[5.78568,51.02412],[5.77263,51.01354],[5.77332,51.00555],[5.76885,50.99345],[5.7589,50.98912],[5.74654,50.97767],[5.72765,50.9647],[5.72834,50.95843],[5.73761,50.96145],[5.75306,50.96232],[5.76851,50.9541],[5.7589,50.94567],[5.73521,50.92446],[5.73177,50.91061],[5.7177,50.90563],[5.70362,50.9078],[5.70122,50.89545],[5.68954,50.88224],[5.68096,50.87726],[5.67169,50.87574],[5.65453,50.87054],[5.64766,50.86274],[5.64766,50.84757],[5.65453,50.83435],[5.66448,50.82437],[5.6971,50.81353],[5.71838,50.80333],[5.72113,50.77642],[5.78018,50.79639],[5.82962,50.77294],[5.9079,50.77381],[6.00403,50.76947],[6.04248,50.76252],[6.05621,50.75123],[6.129,50.73385],[6.16745,50.69037],[6.21689,50.66252],[6.2471,50.65991],[6.28143,50.64424],[6.28693,50.62333],[6.27045,50.59631],[6.24847,50.58542],[6.24058,50.56078],[6.22719,50.5538],[6.21586,50.54965],[6.20419,50.53591],[6.21552,50.52063],[6.22993,50.50295],[6.23989,50.50513],[6.2598,50.50338],[6.27766,50.50731],[6.29139,50.50076],[6.3089,50.50513],[6.3216,50.49923],[6.35078,50.49377],[6.35765,50.48722],[6.34838,50.47936],[6.35147,50.46188],[6.37756,50.45925],[6.38065,50.44657],[6.37619,50.40786],[6.36383,50.39561],[6.35387,50.38028],[6.36246,50.37634],[6.41155,50.34415],[6.41499,50.33363],[6.40675,50.31982],[6.38718,50.31763],[6.36829,50.3025],[6.35765,50.30338],[6.33018,50.31565],[6.31645,50.31478],[6.30444,50.30601],[6.29585,50.29044],[6.29414,50.27354],[6.27628,50.26411],[6.22856,50.25511],[6.21483,50.25094],[6.20659,50.24062],[6.19869,50.23403],[6.17947,50.23139],[6.18221,50.22678],[6.17672,50.22151],[6.19251,50.21206],[6.19801,50.18437],[6.19217,50.17646],[6.15166,50.16656],[6.15509,50.15491],[6.16058,50.14633],[6.15578,50.13554],[6.14376,50.13224],[6.13243,50.12454],[6.10737,50.13378],[6.11012,50.16282],[6.09947,50.16502],[6.08677,50.15425],[6.06583,50.14875],[6.02943,50.15579],[6.01639,50.17294],[5.97931,50.16898],[5.96832,50.12542],[5.94566,50.12278],[5.90378,50.10473],[5.89073,50.06948],[5.86876,50.06243],[5.87837,50.03289],[5.83168,50.01039],[5.84404,49.99935],[5.84747,49.98214],[5.81932,49.95785],[5.78773,49.95255],[5.77263,49.91144],[5.74722,49.89994],[5.7843,49.88977],[5.7946,49.87473],[5.76645,49.86012],[5.75203,49.834],[5.76645,49.80121],[5.79941,49.79855],[5.84404,49.74977],[5.83923,49.72847],[5.87906,49.72892],[5.89622,49.70672],[5.87563,49.67963],[5.91176,49.66218],[5.90567,49.65779],[5.9073,49.65479],[5.90429,49.65213],[5.90507,49.64735],[5.90567,49.64262],[5.90876,49.63868],[5.89854,49.63362],[5.89374,49.63573],[5.88524,49.6319],[5.88799,49.62645],[5.87837,49.62],[5.87829,49.61305],[5.8776,49.60737],[5.84996,49.59675],[5.85202,49.58824],[5.86318,49.58773],[5.86524,49.58974],[5.86962,49.59013],[5.87279,49.58913],[5.87502,49.58295],[5.87073,49.58134],[5.87288,49.57961],[5.87314,49.57677],[5.87451,49.5736],[5.86387,49.56965],[5.86164,49.56603],[5.85288,49.56347],[5.85168,49.56185],[5.84661,49.5608],[5.84773,49.55896],[5.84722,49.55567],[5.84224,49.55233],[5.8267,49.54933],[5.82524,49.55066],[5.82026,49.54599],[5.81623,49.54599],[5.81245,49.54582],[5.80765,49.5486],[5.79941,49.54816],[5.78859,49.55194],[5.77263,49.56141],[5.76181,49.55963],[5.75941,49.54203],[5.7407,49.53724],[5.73521,49.53813],[5.72971,49.54225],[5.7189,49.53802],[5.70156,49.5378],[5.6904,49.54392],[5.67993,49.54348],[5.67787,49.54715],[5.66757,49.54682],[5.66002,49.5505],[5.64526,49.54437],[5.62878,49.53579],[5.6262,49.52287],[5.62346,49.5144],[5.61298,49.50292],[5.60217,49.50671],[5.59359,49.51953],[5.56904,49.52565],[5.56372,49.52409],[5.55462,49.52744],[5.54192,49.51384],[5.50329,49.50504],[5.4875,49.50526],[5.48458,49.50113],[5.47085,49.49322],[5.46209,49.49679],[5.46055,49.50738],[5.45214,49.51083],[5.44304,49.51841],[5.46158,49.52788],[5.46209,49.53735],[5.4372,49.55283],[5.45368,49.56542],[5.44458,49.56586],[5.43549,49.56887],[5.42673,49.5899],[5.42862,49.59358],[5.41523,49.59947],[5.40871,49.60748],[5.39892,49.6096],[5.39652,49.6146],[5.3742,49.62128],[5.37025,49.62105],[5.36047,49.62428],[5.34897,49.62895],[5.34279,49.61505],[5.33781,49.61427],[5.32957,49.61494],[5.32064,49.61271],[5.31378,49.6096],[5.31034,49.61071],[5.30863,49.61694],[5.30279,49.62317],[5.30245,49.62962],[5.30794,49.63851],[5.31738,49.64807],[5.33043,49.65318],[5.30708,49.67085],[5.29284,49.67607],[5.27962,49.68496],[5.2791,49.6884],[5.26829,49.69495],[5.25782,49.69295],[5.2482,49.68529],[5.24117,49.68429],[5.24134,49.68851],[5.23104,49.69007],[5.2173,49.6864],[5.21421,49.68784],[5.20666,49.69451],[5.19722,49.69062],[5.18932,49.6924],[5.17542,49.6924],[5.16306,49.69218],[5.1622,49.6995],[5.1646,49.71083],[5.15963,49.71438],[5.15327,49.71671],[5.15087,49.71249],[5.14263,49.70739],[5.14006,49.71194],[5.13147,49.71205],[5.12529,49.71105],[5.12032,49.71704],[5.12358,49.72637],[5.11723,49.73757],[5.09302,49.76297],[5.08796,49.76475],[5.08452,49.76186],[5.07963,49.76164],[5.07611,49.76109],[5.07139,49.75987],[5.06727,49.76081],[5.06144,49.76192],[5.06092,49.76624],[5.04908,49.76741],[5.00599,49.7816],[5.00547,49.7832],[5.00504,49.78719],[5.00041,49.79312],[4.99741,49.79379],[4.99603,49.79506],[4.99715,49.79672],[4.99672,49.79955],[4.9938,49.79977],[4.98539,49.79888],[4.97895,49.79972],[4.96977,49.8011],[4.96779,49.79756],[4.96179,49.79717],[4.95569,49.80027],[4.94865,49.79811],[4.94814,49.79473],[4.94368,49.79035],[4.94213,49.79035],[4.94132,49.79226],[4.93887,49.7926],[4.93286,49.78977],[4.9329,49.78825],[4.93114,49.78661],[4.92939,49.78686],[4.92102,49.78805],[4.91793,49.78708],[4.91269,49.78573],[4.90475,49.78492],[4.89947,49.78597],[4.89741,49.78836],[4.88913,49.78769],[4.88724,49.78786],[4.88244,49.79049],[4.87939,49.79249],[4.87591,49.79282],[4.87068,49.79268],[4.87188,49.78922],[4.87081,49.78839],[4.86227,49.78805],[4.85712,49.78966],[4.85201,49.79035],[4.84909,49.79368],[4.8563,49.79722],[4.86076,49.80354],[4.86214,49.81373],[4.87364,49.81883],[4.86712,49.82071],[4.86712,49.82625],[4.86506,49.83444],[4.8654,49.83964],[4.85304,49.84042],[4.84943,49.84894],[4.84789,49.86278],[4.84463,49.8703],[4.85561,49.87096],[4.87484,49.89618],[4.87347,49.90459],[4.87999,49.90879],[4.87553,49.92006],[4.85424,49.92957],[4.84325,49.94636],[4.82849,49.94724],[4.78558,49.9563],[4.78523,49.9828],[4.80995,49.99626],[4.81647,50.02671],[4.83021,50.04127],[4.81441,50.04788],[4.8127,50.06794],[4.8357,50.07014],[4.83192,50.09085],[4.84291,50.10363],[4.86626,50.10318],[4.85836,50.1164],[4.88274,50.13664],[4.87072,50.14875],[4.8278,50.14963],[4.82025,50.15579],[4.76875,50.1296],[4.75262,50.10539],[4.70352,50.08424],[4.70112,50.01502],[4.69803,49.99229],[4.63383,49.98037],[4.56963,49.96712],[4.53255,49.94857],[4.51401,49.93973],[4.44122,49.93178],[4.35745,49.94327],[4.31145,49.95564],[4.22974,49.94945],[4.18785,49.95034],[4.16725,49.96801],[4.12331,49.97286],[4.12193,50.01215],[4.14734,50.05273],[4.18167,50.05493],[4.22012,50.07301],[4.1906,50.10252],[4.18922,50.1263],[4.16382,50.1219],[4.11644,50.13158],[4.13841,50.21734],[4.20708,50.25555],[4.1827,50.27025],[4.16382,50.28298],[4.15901,50.27596],[4.17309,50.2685],[4.17309,50.25994],[4.16519,50.25401],[4.13258,50.25489],[4.1312,50.26433],[4.13017,50.27091],[4.11644,50.27464],[4.12262,50.2821],[4.1185,50.2957],[4.09653,50.30864],[4.07696,50.30579],[4.07215,50.31807],[4.05533,50.32946],[4.03679,50.33998],[4.02512,50.35291],[3.98598,50.33911],[3.95748,50.33845],[3.8974,50.32267],[3.88264,50.32377],[3.88092,50.33494],[3.85448,50.33911],[3.84933,50.34875],[3.82942,50.35028],[3.82633,50.34217],[3.80711,50.3413],[3.80608,50.35072],[3.74256,50.34393],[3.73604,50.31149],[3.72437,50.30272],[3.70583,50.29921],[3.68076,50.31894],[3.66428,50.34152],[3.65227,50.37087],[3.66634,50.39123],[3.66325,50.42143],[3.65398,50.4551],[3.62995,50.46712],[3.60832,50.49006],[3.59974,50.48657],[3.55476,50.48853],[3.49915,50.47936],[3.48198,50.48635],[3.50945,50.52085],[3.4758,50.52478],[3.45726,50.50513],[3.43735,50.49945],[3.36662,50.48416],[3.27324,50.52609],[3.25951,50.60154],[3.2341,50.65251],[3.24097,50.67862],[3.24783,50.70037],[3.19565,50.70776],[3.1311,50.77642],[3.06725,50.76296],[2.99652,50.74428],[2.95807,50.67035],[2.82898,50.68602],[2.68341,50.77816],[2.57629,50.81114],[2.5708,50.93939],[2.51862,51.05866],[2.36755,51.2516],[3.08167,51.55146]]]}},be_brussels:{type:"Feature",id:"be_brussels",properties:{},geometry:{type:"Polygon",coordinates:[[[4.37973,50.76382],[4.37853,50.76811],[4.34522,50.77337],[4.34205,50.77164],[4.32952,50.77381],[4.31621,50.78624],[4.31458,50.79454],[4.30282,50.79709],[4.29802,50.80593],[4.28901,50.80691],[4.2854,50.80506],[4.27579,50.80696],[4.27218,50.81011],[4.25802,50.80935],[4.25519,50.8151],[4.24403,50.81548],[4.24343,50.82182],[4.25227,50.82697],[4.25107,50.83288],[4.25467,50.83695],[4.27193,50.84036],[4.28094,50.84215],[4.28042,50.85721],[4.27802,50.85911],[4.27699,50.86713],[4.28274,50.87227],[4.29561,50.88094],[4.29553,50.88262],[4.29149,50.88495],[4.29004,50.88982],[4.30634,50.89274],[4.31647,50.89605],[4.32892,50.90249],[4.34025,50.90411],[4.34857,50.90341],[4.36213,50.9033],[4.3726,50.90032],[4.38119,50.90319],[4.38462,50.91093],[4.39578,50.91407],[4.41543,50.91342],[4.41655,50.90757],[4.4296,50.90103],[4.43595,50.89502],[4.43106,50.89014],[4.44007,50.87845],[4.43183,50.87628],[4.4253,50.86615],[4.44599,50.85992],[4.44968,50.85591],[4.46238,50.85396],[4.46899,50.84573],[4.46959,50.83537],[4.47972,50.82036],[4.45947,50.81661],[4.45921,50.80626],[4.48238,50.79617],[4.4817,50.79134],[4.46427,50.78645],[4.435,50.775],[4.43028,50.77517],[4.38917,50.76377],[4.37973,50.76382]]]}},be_flanders:{type:"Feature",id:"be_flanders",properties:{},geometry:{type:"Polygon",coordinates:[[[2.52239,51.10172],[3.12606,51.34118],[3.17493,51.38246],[3.37615,51.38784],[3.41065,51.3304],[3.40202,51.28548],[3.49114,51.2567],[3.48251,51.30345],[3.57737,51.32322],[3.81309,51.27289],[3.82172,51.23691],[3.93095,51.23691],[4.05456,51.27469],[4.20116,51.35195],[4.16954,51.38067],[4.34202,51.39502],[4.36502,51.46491],[4.53749,51.50072],[4.57199,51.47924],[4.56049,51.44879],[4.63811,51.45058],[4.75022,51.52397],[4.83645,51.50787],[5.0808,51.49893],[5.13541,51.447],[5.10667,51.39143],[5.26477,51.31783],[5.26477,51.28727],[5.4085,51.29267],[5.48612,51.32501],[5.58098,51.28368],[5.58385,51.23511],[5.76783,51.2045],[5.87706,51.16125],[5.70459,50.80293],[5.90581,50.78657],[5.93743,50.73202],[5.90293,50.70108],[5.81382,50.69379],[5.61547,50.76112],[5.50049,50.712],[5.2044,50.7029],[5.16416,50.67558],[5.03768,50.70108],[4.98881,50.75021],[4.91694,50.72656],[4.79046,50.76658],[4.68122,50.77021],[4.66973,50.73566],[4.2874,50.67922],[3.91083,50.6774],[3.71823,50.75203],[3.65499,50.712],[3.53426,50.71018],[3.51413,50.74112],[3.45664,50.74384],[3.37328,50.69562],[3.31004,50.70745],[3.28991,50.73657],[3.16487,50.74294],[3.13181,50.77203],[3.08007,50.76021],[2.87453,50.7393],[2.89609,50.71109],[2.87453,50.69562],[2.79692,50.7029],[2.69918,50.8002],[2.62013,50.79747],[2.56982,50.8583],[2.56695,50.92358],[2.60288,50.94985],[2.5497,50.99601],[2.52239,51.10172]]]}},be_wallonia:{type:"Feature",id:"be_wallonia",properties:{},geometry:{type:"Polygon",coordinates:[[[5.78257,49.87573],[5.73919,49.83362],[5.75516,49.79146],[5.78839,49.79665],[5.91064,49.66249],[5.84857,49.59723],[5.87102,49.57599],[5.81857,49.54638],[5.66079,49.55362],[5.61108,49.50603],[5.55603,49.52928],[5.47051,49.49737],[5.45708,49.56703],[5.37522,49.62333],[5.31486,49.61137],[5.33243,49.65263],[5.26851,49.69657],[5.16628,49.69303],[4.99753,49.80006],[4.85164,49.79345],[4.84754,49.86806],[4.89013,49.90893],[4.79117,49.958],[4.87762,50.15374],[4.82418,50.16932],[4.70207,50.09556],[4.69441,49.99625],[4.44551,49.93722],[4.30589,49.96829],[4.19746,49.9546],[4.1352,50.01508],[4.22825,50.07842],[4.19682,50.13519],[4.12714,50.1355],[4.2052,50.27347],[4.16262,50.28896],[4.13538,50.25784],[4.02795,50.3584],[3.88574,50.32701],[3.84578,50.35323],[3.74546,50.35005],[3.70994,50.30316],[3.65756,50.37076],[3.65552,50.4617],[3.60586,50.49632],[3.4993,50.48921],[3.51992,50.52362],[3.47439,50.53368],[3.37698,50.49109],[3.28634,50.52793],[3.26104,50.70131],[3.20602,50.71139],[3.17839,50.75609],[3.30562,50.75466],[3.36077,50.70962],[3.45439,50.77072],[3.64047,50.72242],[3.67752,50.77062],[3.75857,50.78045],[3.77568,50.74789],[3.8798,50.75146],[3.9097,50.69245],[4.05868,50.69439],[4.14853,50.72834],[4.2467,50.6894],[4.46355,50.75511],[4.52399,50.72724],[4.59727,50.76359],[4.63445,50.74272],[4.64309,50.79755],[4.76014,50.80544],[4.92545,50.74275],[5.00339,50.76594],[5.07039,50.70649],[5.16508,50.6957],[5.16984,50.72257],[5.30912,50.71802],[5.35029,50.74629],[5.47863,50.72352],[5.68786,50.81193],[5.68225,50.75651],[5.7707,50.75132],[5.81963,50.71396],[5.88333,50.70992],[5.89217,50.75518],[5.96561,50.76107],[6.04045,50.74546],[6.03959,50.71833],[6.11066,50.72299],[6.18169,50.62383],[6.26953,50.62519],[6.17812,50.54153],[6.22658,50.49432],[6.35036,50.48854],[6.34298,50.38033],[6.40542,50.32331],[6.30647,50.32019],[6.27889,50.26734],[6.17377,50.23165],[6.19232,50.18203],[6.147,50.17775],[6.13779,50.12985],[6.10245,50.17055],[5.96368,50.17263],[5.96133,50.13136],[5.89532,50.11216],[5.81968,50.01329],[5.83578,49.97892],[5.77502,49.9608],[5.73577,49.89684],[5.78257,49.87573]]]}},croatia:{type:"Feature",id:"croatia",properties:{},geometry:{type:"Polygon",coordinates:[[[18.55316,42.39709],[18.487,42.33],[16,42.2],[13,45],[13.48,45.55],[13.6,45.46],[13.67282,45.45244],[13.78445,45.47445],[13.87695,45.43477],[13.98354,45.46061],[13.95607,45.5049],[13.99868,45.52812],[14.07402,45.49231],[14.19361,45.48114],[14.23361,45.51383],[14.33098,45.47073],[14.4841,45.54339],[14.55276,45.65149],[15.16462,45.43061],[15.36301,45.48661],[15.28061,45.60731],[15.34584,45.65341],[15.24587,45.72718],[15.55939,45.85272],[15.68573,45.84315],[15.71043,46.04506],[15.61913,46.08657],[15.60059,46.16509],[15.67131,46.23068],[15.78049,46.21928],[15.79422,46.26439],[16.073,46.34266],[16.04759,46.3891],[16.15145,46.40378],[16.30028,46.38152],[16.24191,46.49508],[16.36894,46.55083],[16.66077,46.45725],[16.72462,46.39715],[16.86058,46.35783],[16.97456,46.22688],[17.17232,46.1551],[17.31102,45.97167],[17.58087,45.93874],[17.66574,45.84483],[17.86118,45.77993],[18.15765,45.79625],[18.43522,45.74655],[18.68019,45.91486],[18.77838,45.88666],[18.82507,45.91724],[18.9164,45.70714],[18.96652,45.66972],[18.89717,45.56551],[18.94817,45.54136],[19.01686,45.56369],[19.10858,45.5144],[19.08125,45.47585],[19.00341,45.48553],[18.99315,45.44969],[19.03735,45.40735],[18.9792,45.37883],[19.09424,45.3367],[19.10972,45.30469],[19.2687,45.24886],[19.42108,45.23622],[19.45198,45.16219],[19.2041,45.17236],[19.14345,45.119],[19.09331,45.13091],[19.08464,45.11852],[19.11231,45.08359],[19.1011,44.98811],[19.16343,44.94855],[19.06865,44.88961],[18.99843,44.89696],[19.01991,44.84386],[18.83764,44.84591],[18.75065,44.90197],[18.73803,44.94119],[18.75375,44.95245],[18.78491,44.94261],[18.77858,44.98426],[18.72157,44.98326],[18.66267,45.04785],[18.46602,45.05359],[18.41889,45.09637],[18.22841,45.09274],[18.2011,45.0684],[18.11746,45.06832],[18.0011,45.14282],[17.93745,45.09903],[17.93891,45.07086],[17.84756,45.03242],[17.66404,45.12204],[17.59713,45.09425],[17.16882,45.13674],[16.92275,45.23503],[16.81812,45.17296],[16.5105,45.20898],[16.46738,45.13326],[16.40374,45.10639],[16.36047,44.99622],[16.29175,44.9865],[16.11145,45.08758],[15.99747,45.21978],[15.81894,45.2072],[15.77283,45.16143],[15.80439,45.1121],[15.75505,45.05587],[15.78598,44.96966],[15.7338,44.9371],[15.78598,44.84029],[15.74818,44.81311],[15.82858,44.72686],[15.90458,44.75089],[16.14789,44.48088],[16.15253,44.38405],[16.39709,44.06983],[17.1476,43.49677],[17.22656,43.49776],[17.282,43.47769],[17.30151,43.4393],[17.26227,43.39108],[17.37488,43.2502],[17.44734,43.1998],[17.43805,43.18365],[17.63424,43.09863],[17.71339,42.97351],[17.53967,42.93531],[17.64267,42.88351],[17.67975,42.92174],[17.7903,42.89961],[17.80815,42.92073],[17.85896,42.89458],[17.90239,42.81647],[18.24898,42.61375],[18.3609,42.61526],[18.44437,42.56076],[18.43575,42.48273],[18.55316,42.39709]]]}},czechia:{type:"Feature",id:"czechia",properties:{},geometry:{type:"Polygon",coordinates:[[[14.3811,51.06902],[15.13916,51.08282],[16.42456,50.70863],[16.68823,50.32442],[16.78711,50.49246],[17.75391,50.35247],[18.58887,49.96536],[18.92944,49.51808],[18.1604,48.98022],[17.00684,48.61839],[15.13916,48.85749],[14.67773,48.55298],[13.85376,48.58206],[12.00806,50.05008],[11.92017,50.35948],[14.3811,51.06902]]]}},denmark:{type:"Feature",id:"denmark",properties:{},geometry:{type:"Polygon",coordinates:[[[7.99805,55.11608],[7.9541,56.94497],[10.62378,57.94401],[12.65625,56.01681],[12.65625,55.91535],[12.82928,55.5566],[12.60956,55.42122],[12.66449,55.25095],[14.82605,55.37911],[15.28198,55.22902],[15.11719,54.85448],[12.87598,54.85922],[12.07672,54.44769],[10.849,54.73414],[10.67871,54.58002],[9.88083,54.83708],[9.73972,54.82265],[9.60823,54.8525],[9.63158,54.87996],[9.59038,54.88668],[9.4994,54.83886],[9.43176,54.82601],[9.41013,54.84242],[9.38198,54.83827],[9.37443,54.82047],[9.34422,54.80108],[9.25152,54.80979],[9.23985,54.84993],[9.13822,54.87483],[9.06338,54.87048],[8.90167,54.90386],[8.85532,54.89517],[8.82408,54.90662],[8.79765,54.90445],[8.77602,54.893],[8.72761,54.89181],[8.67645,54.91195],[8.66066,54.90859],[8.55698,54.92063],[8.47355,55.05537],[7.99805,55.11608]]]}},"Queen-Mary-University-of-London":{type:"Feature",id:"Queen-Mary-University-of-London",properties:{},geometry:{type:"Polygon",coordinates:[[[-0.04049,51.74867],[0.03027,51.74434],[0.09827,51.7315],[0.16087,51.71065],[0.21563,51.68262],[0.26045,51.64848],[0.29361,51.60956],[0.31386,51.56737],[0.32046,51.52354],[0.31318,51.47975],[0.29235,51.43768],[0.25881,51.39894],[0.21385,51.36502],[0.15922,51.33719],[0.09701,51.31653],[0.02959,51.30381],[-0.04049,51.29952],[-0.11057,51.30381],[-0.178,51.31653],[-0.24021,51.33719],[-0.29484,51.36502],[-0.33979,51.39894],[-0.37334,51.43768],[-0.39417,51.47975],[-0.40144,51.52354],[-0.39485,51.56737],[-0.3746,51.60956],[-0.34144,51.64848],[-0.29662,51.68262],[-0.24185,51.71065],[-0.17926,51.7315],[-0.11125,51.74434],[-0.04049,51.74867]]]}},finland:{type:"Feature",id:"finland",properties:{},geometry:{type:"Polygon",coordinates:[[[24.16992,65.34851],[23.90625,66.14274],[23.68652,66.44311],[23.99414,66.80922],[23.51074,67.27204],[23.37891,67.44123],[23.73047,67.97463],[20.74219,69.03714],[21.18164,69.28726],[21.70898,69.27171],[22.45605,68.73638],[23.15918,68.65655],[23.90625,68.8318],[25.00488,68.59249],[25.40039,68.87936],[25.75195,68.95839],[25.97168,69.70287],[26.45508,69.96044],[27.20215,69.90012],[27.50977,70.0506],[27.86133,70.08056],[28.38867,69.82447],[29.04785,69.71811],[29.26758,69.53452],[28.87207,69.225],[29.0918,69.02141],[28.52051,68.89519],[28.78418,68.84767],[28.52051,68.56038],[28.69629,68.17156],[29.26758,68.0733],[30.05859,67.69277],[29.17969,67.0503],[29.0918,66.8956],[30.14648,65.73063],[29.66309,65.20147],[29.70703,64.79285],[30.05859,64.79285],[30.10254,64.41592],[30.4541,64.30182],[30.05859,63.74363],[31.59668,63.01511],[30.27832,61.89758],[27.81738,60.56538],[27.33398,60.19616],[24.65332,59.88894],[21.84082,59.46741],[20.43457,59.46741],[19.11621,60.19616],[19.2041,60.58697],[20.08301,60.75916],[20.69824,61.14324],[20.96191,61.73153],[19.99512,63.27318],[21.44531,63.66576],[22.93945,64.20638],[23.24707,64.51064],[23.81836,64.66152],[24.16992,65.34851]]]}},france:{type:"Feature",id:"france",properties:{},geometry:{type:"MultiPolygon",coordinates:[[[[9.9,42.64836],[9.9,42.02785],[9.63227,41.43244],[9.36968,41.35052],[9.32602,41.3036],[9.27311,41.29196],[9.07196,41.26129],[8.94186,41.27688],[8.8742,41.26232],[8.84542,41.26311],[8.78782,41.25725],[7.3114,41.4242],[5.8,41.64],[3.17358,42.41768],[3.16081,42.42757],[3.0944,42.41457],[3.03402,42.45331],[3.02214,42.45645],[2.87822,42.4487],[2.87019,42.44653],[2.78424,42.40256],[2.7413,42.41128],[2.72928,42.40998],[2.69331,42.39417],[2.68378,42.3854],[2.68162,42.37263],[2.68585,42.34679],[2.66719,42.33008],[2.58106,42.34418],[2.56777,42.34173],[2.5338,42.32197],[2.47795,42.32986],[2.41933,42.37658],[2.41222,42.38021],[2.26719,42.42055],[2.25973,42.42117],[2.20694,42.41558],[2.20653,42.41526],[2.20526,42.41541],[2.16028,42.41065],[2.14881,42.40545],[2.09393,42.35474],[2.00861,42.33818],[1.965,42.36473],[1.93076,42.42442],[1.92089,42.43302],[1.88467,42.44761],[1.88459,42.44762],[1.88444,42.4477],[1.82774,42.47056],[1.72567,42.48452],[1.71561,42.50125],[1.7272,42.56103],[1.72479,42.57499],[1.71011,42.59992],[1.69377,42.60975],[1.60283,42.61382],[1.56069,42.6392],[1.54636,42.64166],[1.50444,42.6331],[1.4921,42.62502],[1.47238,42.59703],[1.43792,42.59264],[1.41936,42.60643],[1.38032,42.67415],[1.37335,42.68127],[1.33313,42.70563],[1.32364,42.7085],[1.23221,42.71248],[1.16554,42.69928],[1.08546,42.76635],[1.07564,42.77079],[0.95937,42.78852],[0.95073,42.78794],[0.92265,42.7797],[0.84606,42.8157],[0.71511,42.8464],[0.70017,42.84402],[0.69117,42.83186],[0.67409,42.76479],[0.67474,42.75286],[0.69192,42.70684],[0.669,42.67901],[0.43024,42.67863],[0.3715,42.70308],[0.35954,42.70415],[0.34912,42.69817],[0.32567,42.67274],[0.29571,42.66388],[0.24593,42.70175],[0.23972,42.70494],[0.18967,42.72039],[0.17919,42.72075],[-0.01993,42.67389],[-0.06726,42.6848],[-0.16949,42.77157],[-0.29987,42.82697],[-0.31683,42.82635],[-0.39208,42.78766],[-0.44354,42.78453],[-0.48842,42.80255],[-0.50868,42.79935],[-0.54499,42.76906],[-0.56721,42.76937],[-0.67446,42.86392],[-0.68094,42.86775],[-0.73372,42.88666],[-0.7476,42.93879],[-0.75711,42.95107],[-0.77253,42.95284],[-0.82114,42.93865],[-0.94508,42.94192],[-1.02313,42.98206],[-1.10852,43.00409],[-1.1156,43.00461],[-1.14775,43.00124],[-1.15845,43.01452],[-1.16736,43.02083],[-1.21622,43.0381],[-1.22612,43.03898],[-1.26236,43.03303],[-1.30643,43.05531],[-1.31992,43.05696],[-1.33135,43.0496],[-1.3542,43.0197],[-1.43868,43.03371],[-1.4775,43.06889],[-1.48311,43.08561],[-1.47641,43.10248],[-1.43479,43.13087],[-1.42732,43.1404],[-1.39411,43.22935],[-1.39531,43.24596],[-1.40868,43.25591],[-1.52629,43.28099],[-1.54626,43.2737],[-1.57149,43.2412],[-1.61053,43.24223],[-1.65,43.29323],[-1.66953,43.30065],[-1.73359,43.28856],[-1.75606,43.31966],[-1.76297,43.32565],[-1.79156,43.34067],[-1.80099,43.37017],[-1.78509,43.39037],[-1.7835,43.39686],[-2.7,43.9],[-6.3,48.98],[-2.25,50.09],[1.26331,50.92504],[1.76605,51.17762],[2.35816,51.32937],[2.5488,51.09759],[2.57048,51.07409],[2.58741,51.01763],[2.59845,51.0051],[2.61558,50.99749],[2.63986,50.95766],[2.64225,50.94578],[2.62452,50.9256],[2.61962,50.91067],[2.62396,50.86071],[2.62781,50.85054],[2.63786,50.83696],[2.6511,50.82906],[2.73267,50.81738],[2.79995,50.73795],[2.81655,50.73092],[2.85265,50.73335],[2.89072,50.7162],[2.90492,50.71536],[2.9161,50.72418],[2.93508,50.75592],[3.00718,50.78377],[3.08218,50.78749],[3.09244,50.79092],[3.11412,50.80566],[3.14877,50.80195],[3.2154,50.73111],[3.22149,50.7267],[3.27051,50.70375],[3.27545,50.67757],[3.26576,50.6604],[3.26588,50.64054],[3.28922,50.60028],[3.29219,50.55037],[3.3056,50.53267],[3.37551,50.50839],[3.3898,50.50884],[3.4748,50.54445],[3.52173,50.53459],[3.53266,50.51873],[3.54779,50.51012],[3.61523,50.50558],[3.67378,50.45642],[3.68415,50.35277],[3.6901,50.34044],[3.70258,50.33482],[3.71576,50.33854],[3.74935,50.36279],[3.84109,50.36558],[3.90189,50.3436],[3.91317,50.34291],[4.02672,50.36904],[4.13761,50.29984],[4.14388,50.29727],[4.21444,50.28167],[4.22904,50.26664],[4.23078,50.25233],[4.17084,50.18579],[4.16601,50.16888],[4.1764,50.1547],[4.21195,50.13602],[4.24074,50.07102],[4.23193,50.05551],[4.18164,50.03436],[4.17177,50.02537],[4.16976,50.01217],[4.1765,50.00065],[4.20633,49.97546],[4.22164,49.97089],[4.30877,49.98145],[4.44542,49.9523],[4.45469,49.95251],[4.6581,50.00609],[4.66936,50.01392],[4.67293,50.02716],[4.66924,50.06972],[4.69517,50.10472],[4.83123,50.17941],[4.8815,50.16436],[4.90479,50.14451],[4.90426,50.12639],[4.88076,50.0815],[4.86277,50.0745],[4.85104,50.06216],[4.84331,50.03884],[4.84331,50.03883],[4.8433,50.03881],[4.82678,49.989],[4.82662,49.97692],[4.83343,49.96696],[4.89654,49.91753],[4.89755,49.89424],[4.87913,49.86942],[4.87625,49.85111],[4.88924,49.81266],[4.89769,49.80204],[4.91098,49.79926],[4.99534,49.81116],[5.01867,49.79272],[5.02686,49.78886],[5.09944,49.77323],[5.13458,49.73462],[5.1412,49.72984],[5.18761,49.70906],[5.19602,49.70732],[5.28157,49.70836],[5.33363,49.67308],[5.344,49.65049],[5.3544,49.64041],[5.43141,49.60791],[5.48205,49.52815],[5.49294,49.51979],[5.50666,49.52042],[5.55401,49.54025],[5.59311,49.53424],[5.6076,49.53761],[5.641,49.56095],[5.70676,49.55267],[5.71578,49.55361],[5.77526,49.57414],[5.8399,49.55321],[5.86126,49.52038],[5.876,49.5114],[5.97516,49.50129],[5.99801,49.47317],[6.01627,49.46597],[6.08635,49.47562],[6.09319,49.47787],[6.17397,49.52187],[6.24643,49.52511],[6.334,49.48235],[6.34423,49.48037],[6.43515,49.487],[6.5451,49.44384],[6.60639,49.37868],[6.60497,49.33739],[6.61627,49.31869],[6.67013,49.29269],[6.72996,49.22917],[6.74328,49.19086],[6.76026,49.17752],[6.80904,49.17284],[6.82473,49.17826],[6.83093,49.19366],[6.82982,49.21802],[6.85119,49.23136],[6.88453,49.2239],[6.89322,49.22389],[6.93753,49.23369],[7.04055,49.19794],[7.0463,49.17503],[7.05478,49.16313],[7.06908,49.16018],[7.10494,49.16634],[7.14315,49.14159],[7.1535,49.13839],[7.28683,49.13488],[7.29893,49.13856],[7.36095,49.18259],[7.45012,49.19517],[7.50113,49.17672],[7.54379,49.10572],[7.5579,49.09626],[7.6296,49.08527],[7.64722,49.06722],[7.6612,49.06119],[7.75401,49.05963],[7.76073,49.06067],[7.80291,49.07489],[7.85525,49.05329],[7.8673,49.05227],[7.93826,49.06832],[8.08069,49.00688],[8.2225,48.98787],[8.23704,48.97683],[8.23589,48.95817],[8.20888,48.94863],[8.20089,48.94339],[8.15824,48.89753],[8.10087,48.7993],[7.99071,48.74478],[7.98534,48.7409],[7.90422,48.65865],[7.85605,48.63606],[7.8484,48.62977],[7.81842,48.58883],[7.81456,48.57704],[7.81449,48.50968],[7.78547,48.48337],[7.78055,48.47652],[7.74506,48.39484],[7.74357,48.38427],[7.75159,48.32322],[7.71085,48.29841],[7.70241,48.28803],[7.67661,48.21555],[7.59605,48.11698],[7.59165,48.10648],[7.58522,48.04694],[7.59127,48.03035],[7.62437,47.99865],[7.63205,47.97081],[7.57554,47.87436],[7.5728,47.86435],[7.57267,47.83631],[7.54581,47.78793],[7.54418,47.77232],[7.55758,47.72899],[7.53526,47.6989],[7.53136,47.68564],[7.537,47.67302],[7.60016,47.60822],[7.58967,47.56755],[7.55424,47.55128],[7.54511,47.54283],[7.51256,47.48439],[7.38747,47.42111],[7.32653,47.4273],[7.24435,47.40939],[7.16708,47.4335],[7.15212,47.47612],[7.14279,47.48707],[7.12853,47.48893],[7.0801,47.47718],[7.03557,47.48695],[7.02102,47.48458],[7.01205,47.47287],[7.003,47.44095],[6.9551,47.40808],[6.94716,47.39698],[6.94818,47.38337],[6.95769,47.37359],[6.97126,47.37218],[7.018,47.38386],[7.05623,47.37035],[7.07007,47.35005],[7.05958,47.32257],[6.97424,47.27856],[6.96347,47.26233],[6.96134,47.23479],[6.89443,47.19393],[6.88913,47.18922],[6.85545,47.14636],[6.76907,47.10751],[6.76011,47.09953],[6.72561,47.0418],[6.62355,46.9811],[6.4812,46.9445],[6.46892,46.93522],[6.46686,46.91997],[6.47548,46.88771],[6.4535,46.8239],[6.45644,46.80534],[6.46722,46.79104],[6.46098,46.76887],[6.15817,46.59343],[6.14872,46.58069],[6.15152,46.56508],[6.16549,46.54399],[6.15811,46.52456],[6.10174,46.46979],[6.09572,46.45418],[6.09704,46.43317],[6.10829,46.41643],[6.16622,46.38839],[6.17817,46.36922],[6.13748,46.31297],[6.13371,46.30227],[6.13038,46.23737],[6.1103,46.22344],[6.08865,46.23081],[6.07717,46.23123],[6.01857,46.21601],[6.00681,46.20752],[6.00388,46.19332],[6.00787,46.16977],[6.01783,46.15564],[6.03509,46.15456],[6.05564,46.16288],[6.12468,46.15415],[6.13778,46.15702],[6.24026,46.22094],[6.24906,46.23299],[6.24707,46.24777],[6.21148,46.31057],[6.21219,46.32485],[6.23946,46.36705],[6.31648,46.41557],[6.41083,46.42495],[6.41748,46.42682],[6.50498,46.46871],[6.63047,46.47435],[6.74665,46.45695],[6.82244,46.42925],[6.81832,46.38181],[6.80484,46.36179],[6.80189,46.34639],[6.81095,46.33359],[6.86491,46.30038],[6.87504,46.28007],[6.86092,46.2439],[6.82698,46.21188],[6.82075,46.19862],[6.81863,46.16592],[6.82259,46.15261],[6.83427,46.14509],[6.90382,46.12971],[6.90491,46.09595],[6.90932,46.08406],[6.92001,46.07721],[6.94898,46.0699],[7.01556,46.00883],[7.05191,45.93066],[7.04533,45.92217],[7.04497,45.92064],[7.04394,45.92036],[6.99582,45.85822],[6.94097,45.83551],[6.84376,45.82387],[6.83102,45.81711],[6.82614,45.80353],[6.82787,45.73217],[6.83174,45.72082],[6.8414,45.71373],[6.90729,45.69124],[6.92419,45.66935],[6.94247,45.66172],[6.97131,45.66528],[7.00597,45.64945],[7.01151,45.63652],[6.9978,45.60877],[6.99643,45.59465],[7.0158,45.52354],[7.02774,45.5102],[7.1072,45.47877],[7.1228,45.44924],[7.13304,45.44001],[7.1856,45.41894],[7.19515,45.40409],[7.17075,45.35069],[7.14232,45.32298],[7.13649,45.30576],[7.14458,45.25048],[7.08417,45.20279],[6.99279,45.19823],[6.98106,45.19368],[6.90009,45.12689],[6.85843,45.11699],[6.78283,45.14228],[6.77056,45.14242],[6.67751,45.11356],[6.6653,45.10289],[6.66501,45.08667],[6.68237,45.04558],[6.69602,45.03395],[6.75744,45.01884],[6.78375,44.9146],[6.7942,44.90161],[6.86698,44.86519],[6.8798,44.86346],[6.93633,44.87461],[7.01795,44.84402],[7.03453,44.82282],[7.03711,44.75009],[7.0496,44.73226],[7.07224,44.72311],[7.08651,44.6968],[7.08666,44.68085],[7.07671,44.67134],[6.99007,44.67203],[6.97413,44.66431],[6.97056,44.64696],[6.97819,44.61784],[6.94659,44.57124],[6.88235,44.53479],[6.87233,44.5195],[6.87892,44.50245],[6.95894,44.43129],[6.95872,44.42908],[6.92167,44.41436],[6.91223,44.40659],[6.90907,44.39477],[6.90972,44.38195],[6.91637,44.36804],[6.99909,44.29414],[7.01181,44.256],[7.01983,44.24558],[7.03259,44.2424],[7.07312,44.2461],[7.1651,44.22112],[7.24533,44.18544],[7.26053,44.16682],[7.27537,44.15947],[7.33878,44.1574],[7.36278,44.13834],[7.37776,44.13416],[7.56283,44.15792],[7.5642,44.15836],[7.56478,44.15817],[7.60548,44.1634],[7.6162,44.16827],[7.63989,44.18928],[7.68608,44.1861],[7.69422,44.17795],[7.68937,44.13869],[7.69445,44.12276],[7.72786,44.08615],[7.72403,44.05704],[7.68603,44.02371],[7.68077,44.0164],[7.66016,43.9672],[7.59624,43.94466],[7.58419,43.93287],[7.56858,43.89159],[7.5271,43.87434],[7.51649,43.86397],[7.51594,43.84915],[7.53622,43.79234],[9.26696,43.39308],[9.8,43.1],[9.9,42.64836]]]]}},"de-berlin-brandenburg":{type:"Feature",id:"de-berlin-brandenburg",properties:{},geometry:{type:"Polygon",coordinates:[[[11.32141,53.11711],[12.09595,53.36694],[12.88147,53.20274],[13.78235,53.50765],[14.16687,53.41608],[14.10645,53.28164],[14.29871,53.27507],[14.41956,53.32431],[14.19434,52.93871],[14.19434,52.82932],[14.57336,52.60972],[14.57336,52.36218],[14.71619,52.05249],[14.61182,51.84257],[14.76563,51.54975],[14.36462,51.519],[14.1449,51.54975],[13.99109,51.36835],[13.2605,51.39578],[13.07373,51.65211],[13.13965,51.86971],[12.67273,52.01532],[12.40356,52.03222],[12.22229,52.14697],[12.32117,52.50619],[12.16736,52.51956],[12.23877,52.87245],[11.60156,52.96849],[11.32141,53.11711]]]}},"de-ostwestfalen-lippe":{type:"Feature",id:"de-ostwestfalen-lippe",properties:{},geometry:{type:"Polygon",coordinates:[[[8.04337,52.05756],[8.42583,52.19919],[8.43846,52.35394],[8.30866,52.39929],[8.28438,52.4581],[8.67096,52.56967],[9.22028,52.49616],[9.06097,52.28328],[9.47365,51.86716],[9.46266,51.64103],[9.26285,51.46641],[9.15648,51.43569],[8.80348,51.43218],[8.54444,51.46003],[8.42239,51.55658],[8.31076,51.72252],[8.12645,51.86844],[8.04337,52.05756]]]}},germany:{type:"Feature",id:"germany",properties:{},geometry:{type:"Polygon",coordinates:[[[7.05048,52.62973],[7.21252,53.20274],[6.56982,53.61858],[8.30772,55.1467],[8.6483,54.96421],[9.45305,54.83313],[9.95018,54.82838],[11.99913,54.44689],[13.3889,54.89162],[14.15245,54.47562],[14.26231,53.78037],[14.44359,53.27096],[14.36119,53.0668],[14.16344,52.97097],[14.13597,52.84508],[14.62486,52.60555],[14.5919,52.35463],[14.71825,52.24042],[14.74571,52.06516],[14.60838,51.83153],[14.74571,51.69554],[14.76768,51.54206],[14.98741,51.43261],[15.03136,51.27824],[14.94347,51.04744],[14.85558,50.88138],[14.77867,50.81548],[14.64684,50.85017],[14.5974,50.99215],[14.32823,51.07506],[14.32823,50.88138],[13.01537,50.49508],[12.48253,50.38663],[12.33421,50.18305],[12.1804,50.30952],[12.12547,50.25686],[12.22984,50.09856],[12.55394,49.92912],[12.4276,49.75199],[12.5045,49.68807],[12.77916,49.35286],[12.93297,49.36002],[13.03185,49.28841],[13.57018,48.96489],[13.80089,48.81319],[13.75694,48.52297],[13.52074,48.58842],[13.45482,48.57388],[13.40538,48.36994],[13.23509,48.28959],[12.99889,48.24571],[12.75169,48.12118],[12.9879,47.86385],[12.91649,47.71623],[13.04832,47.72362],[13.09776,47.67186],[13.0648,47.50885],[12.93846,47.47173],[12.77367,47.5793],[12.8286,47.60894],[12.70226,47.70144],[12.1859,47.70514],[12.16942,47.62005],[11.86729,47.60524],[11.63109,47.59412],[11.25755,47.40114],[10.98839,47.40486],[10.88402,47.52369],[10.67528,47.55707],[10.45006,47.54594],[10.46654,47.41973],[10.34019,47.3081],[10.19737,47.27457],[10.21385,47.38998],[10.10948,47.3751],[10.08202,47.46431],[9.84581,47.55336],[9.40636,47.55336],[9.09874,47.68388],[8.90236,47.65521],[8.85292,47.70329],[8.80348,47.74025],[8.76915,47.71993],[8.80486,47.70329],[8.79524,47.68388],[8.7307,47.69867],[8.73482,47.7227],[8.71284,47.7384],[8.7513,47.76887],[8.69637,47.76425],[8.65654,47.8067],[8.63594,47.76518],[8.61122,47.80947],[8.57002,47.79286],[8.48763,47.77902],[8.41621,47.71808],[8.41347,47.68111],[8.46428,47.65891],[8.53706,47.67001],[8.60985,47.67741],[8.63457,47.64966],[8.59886,47.64319],[8.61122,47.6219],[8.56865,47.60061],[8.56865,47.6219],[8.52745,47.64041],[8.45879,47.60801],[8.50273,47.58672],[8.38463,47.57004],[8.33107,47.57375],[8.29399,47.61542],[8.2061,47.62653],[8.10173,47.56819],[7.96852,47.5617],[7.92046,47.55429],[7.89024,47.59505],[7.8257,47.58949],[7.81197,47.56726],[7.6815,47.54038],[7.6403,47.56448],[7.69386,47.5756],[7.6815,47.59412],[7.64854,47.60061],[7.61421,47.58394],[7.50641,47.70237],[7.79205,48.60749],[8.22876,48.97481],[6.84174,49.17093],[6.37482,49.48597],[6.53961,49.80963],[6.1441,50.01833],[6.19835,50.21119],[6.41808,50.35159],[6.19835,50.63117],[6.02257,50.77034],[6.02257,51.07506],[6.24229,51.37778],[5.97862,51.81456],[6.1496,51.90022],[6.44073,51.85105],[6.828,51.95611],[6.68518,52.05587],[7.04773,52.23957],[6.99554,52.45768],[6.70166,52.48445],[6.72913,52.64973],[7.05048,52.62973]]]}},"Heidelberg-University":{type:"Feature",id:"Heidelberg-University",properties:{},geometry:{type:"Polygon",coordinates:[[[8.67039,49.64365],[8.73804,49.63932],[8.80306,49.62648],[8.86292,49.60564],[8.91529,49.57762],[8.95817,49.54349],[8.98989,49.50458],[9.00928,49.46239],[9.01561,49.41856],[9.00868,49.37477],[8.98878,49.33269],[8.95671,49.29395],[8.91371,49.26002],[8.86146,49.23218],[8.80194,49.21151],[8.73744,49.19879],[8.67039,49.19449],[8.60334,49.19879],[8.53883,49.21151],[8.47931,49.23218],[8.42706,49.26002],[8.38407,49.29395],[8.352,49.33269],[8.3321,49.37477],[8.32516,49.41856],[8.33149,49.46239],[8.35088,49.50458],[8.38261,49.54349],[8.42548,49.57762],[8.47786,49.60564],[8.53771,49.62648],[8.60273,49.63932],[8.67039,49.64365]]]}},hungary:{type:"Feature",id:"hungary",properties:{},geometry:{type:"Polygon",coordinates:[[[18.43643,45.73111],[17.67426,45.83454],[17.57675,45.92823],[17.35153,45.94303],[17.14966,46.16081],[16.52756,46.50028],[16.3147,46.86582],[16.11969,46.86582],[16.28448,46.99337],[16.48224,47.01584],[16.5152,47.1505],[16.42731,47.2177],[16.43829,47.41136],[16.66763,47.44852],[16.67587,47.60616],[16.43829,47.65614],[16.54816,47.75964],[16.71844,47.73563],[16.75003,47.68111],[17.08099,47.70791],[17.04254,47.86293],[17.09473,47.96234],[17.20734,48.02484],[17.75665,47.74486],[18.71246,47.76702],[18.85529,47.82606],[18.77838,47.87767],[18.75641,47.98808],[18.82233,48.04687],[19.50348,48.1056],[19.55566,48.25028],[19.92096,48.14227],[20.34943,48.30329],[20.54718,48.54389],[20.82184,48.58751],[21.14044,48.50751],[21.47003,48.58751],[21.70074,48.36902],[21.8367,48.34073],[22.2171,48.42282],[22.38327,48.24205],[22.50549,48.24845],[22.61948,48.1056],[22.83371,48.11843],[22.90649,47.95406],[22.59064,47.75779],[22.48077,47.81131],[22.42584,47.74486],[22.32147,47.75779],[22.02759,47.51442],[22.03033,47.38161],[21.9397,47.3658],[21.48926,46.75868],[21.52908,46.73233],[21.4151,46.61737],[21.33133,46.61549],[21.10611,46.23875],[20.79575,46.27863],[20.7106,46.15035],[20.25055,46.13227],[19.82758,46.16461],[19.54742,46.17793],[19.51447,46.1018],[18.80997,45.87567],[18.70285,45.91294],[18.43643,45.73111]]]}},iceland:{type:"Feature",id:"iceland",properties:{},geometry:{type:"Polygon",coordinates:[[[-25.21,65.81],[-23.17,66.89],[-19.51,66.29],[-19.09,67.46],[-17.98,67.34],[-17.38,66.83],[-14.01,66.72],[-12.36,64.54],[-17.21,62.92],[-23.63,63.15],[-25.21,65.81]]]}},italy:{type:"Feature",id:"italy",properties:{},geometry:{type:"Polygon",coordinates:[[[7.6,43.5],[7.49542,43.86523],[7.69043,44.0718],[7.69043,44.19796],[7.42676,44.15068],[6.9873,44.26094],[6.85547,44.55916],[7.03125,44.73113],[7.00928,44.87144],[6.72363,44.91814],[6.5918,45.12005],[7.09717,45.25942],[7.14111,45.41388],[6.96533,45.61404],[6.76758,45.79817],[7.03125,45.9053],[7.55859,45.9817],[7.77832,45.93587],[8.12988,46.13417],[8.08594,46.30141],[8.48145,46.46813],[8.61328,46.13417],[8.81104,46.10371],[9.05273,45.8288],[9.07471,46.11894],[9.27246,46.25585],[9.25049,46.43786],[9.44824,46.49839],[9.49219,46.31658],[9.68994,46.31658],[9.95361,46.36209],[10.06348,46.17983],[10.17334,46.25585],[10.0415,46.453],[10.08545,46.60417],[10.26123,46.66452],[10.45898,46.49839],[10.50293,46.61926],[10.39307,46.70974],[10.41504,46.86019],[10.61279,46.87521],[11.03027,46.76997],[11.16211,46.93526],[11.27197,46.99524],[11.53564,47.01023],[11.7334,46.99524],[12.2168,47.10004],[12.15088,46.93526],[12.43652,46.70974],[12.96387,46.61926],[13.73291,46.54375],[13.71094,46.42271],[13.40332,46.33176],[13.40332,46.22545],[13.66699,46.17983],[13.51318,46.05799],[13.64502,45.96642],[13.5791,45.85941],[13.93066,45.64477],[13.82629,45.5756],[13.6,45.6294],[12.9,45.4],[12.8,45],[18.9,40.3],[18.5,39],[15,36],[11,38],[9.6,43.2],[7.6,43.5]]]}},IT_Lazio:{type:"Feature",id:"IT_Lazio",properties:{},geometry:{type:"Polygon",coordinates:[[[13.23814,42.1301],[13.19363,42.15923],[13.17062,42.15169],[13.12434,42.17797],[13.08798,42.17886],[13.08575,42.14318],[13.0317,42.12309],[13.01946,42.07634],[13.05545,42.01736],[13.10194,42.00898],[13.10589,42.02698],[13.36437,41.92475],[13.384,41.90419],[13.35751,41.8694],[13.38052,41.81709],[13.4169,41.83467],[13.50508,41.8016],[13.52044,41.77297],[13.57182,41.7543],[13.66214,41.81144],[13.70555,41.78747],[13.72956,41.7989],[13.7629,41.7488],[13.81162,41.75426],[13.85645,41.73124],[13.89541,41.73405],[13.98311,41.66238],[14.01182,41.60835],[13.99895,41.57448],[14.02596,41.55567],[14.00526,41.53875],[14.0275,41.52321],[13.97291,41.49404],[13.99278,41.48208],[13.9779,41.46249],[13.90257,41.42273],[13.86123,41.41763],[13.8886,41.40081],[13.8688,41.36272],[13.88974,41.29748],[13.82898,41.28154],[13.83083,41.2502],[13.77126,41.24136],[13.45667,40.77769],[11.52381,41.03693],[11.44922,42.37798],[11.48889,42.43937],[11.61771,42.43604],[11.61626,42.48862],[11.56011,42.51595],[11.58852,42.54226],[11.57917,42.56803],[11.61401,42.55723],[11.64337,42.56635],[11.71111,42.61091],[11.73597,42.60666],[11.74975,42.63965],[11.80478,42.644],[11.77554,42.70951],[11.80156,42.70719],[11.81949,42.74543],[11.74602,42.78576],[11.77424,42.82107],[11.80685,42.79485],[11.8137,42.82267],[11.84851,42.84008],[11.90558,42.8325],[11.92743,42.78092],[11.97948,42.76459],[11.96293,42.72669],[11.9301,42.71295],[11.94133,42.6833],[12.03,42.64324],[12.10666,42.66464],[12.12406,42.64929],[12.16101,42.67691],[12.20434,42.66046],[12.24292,42.62906],[12.22819,42.61077],[12.24626,42.60256],[12.23866,42.57218],[12.27504,42.55991],[12.26676,42.53347],[12.29027,42.51904],[12.27477,42.50921],[12.30735,42.4973],[12.29041,42.49164],[12.32537,42.49476],[12.35123,42.47365],[12.39017,42.49819],[12.41905,42.49765],[12.41244,42.46756],[12.43038,42.45802],[12.41368,42.45517],[12.41365,42.4256],[12.4636,42.42909],[12.44469,42.39882],[12.51169,42.40311],[12.52874,42.36445],[12.60642,42.40245],[12.61481,42.46511],[12.64109,42.4678],[12.6495,42.44331],[12.67465,42.44242],[12.74156,42.47053],[12.71114,42.50079],[12.89273,42.5635],[12.88052,42.60935],[13.00524,42.61622],[13.02522,42.64],[13.06423,42.62427],[13.13,42.66053],[13.14645,42.64714],[13.17506,42.66707],[13.19025,42.73363],[13.25415,42.72145],[13.2645,42.74019],[13.28589,42.74049],[13.35851,42.69533],[13.35059,42.66968],[13.37022,42.6507],[13.4092,42.64383],[13.39493,42.59223],[13.29421,42.5705],[13.28454,42.58349],[13.24686,42.57367],[13.19228,42.58849],[13.15673,42.54102],[13.17934,42.48031],[13.11708,42.44489],[13.19508,42.39017],[13.15427,42.35797],[13.22737,42.32031],[13.23563,42.27871],[13.28229,42.23874],[13.33653,42.22338],[13.34238,42.19939],[13.3808,42.18142],[13.34871,42.17689],[13.35488,42.16769],[13.32819,42.16483],[13.30621,42.13923],[13.23814,42.1301]]]}},"Politecnico-di-Milano":{type:"Feature",id:"Politecnico-di-Milano",properties:{},geometry:{type:"Polygon",coordinates:[[[9.22852,45.68471],[9.29123,45.68038],[9.3515,45.66755],[9.40699,45.64672],[9.45556,45.61871],[9.49533,45.58459],[9.52478,45.54569],[9.54279,45.50351],[9.5487,45.45968],[9.5423,45.41589],[9.52388,45.37381],[9.49415,45.33505],[9.45428,45.30111],[9.40581,45.27326],[9.3506,45.25258],[9.29074,45.23985],[9.22852,45.23555],[9.16629,45.23985],[9.10644,45.25258],[9.05122,45.27326],[9.00275,45.30111],[8.96288,45.33505],[8.93316,45.37381],[8.91473,45.41589],[8.90833,45.45968],[8.91424,45.50351],[8.93225,45.54569],[8.9617,45.58459],[9.00147,45.61871],[9.05004,45.64672],[9.10553,45.66755],[9.16581,45.68038],[9.22852,45.68471]]]}},IT_Roma_Capitale:{type:"Feature",id:"IT_Roma_Capitale",properties:{},geometry:{type:"Polygon",coordinates:[[[11.6,42.16],[12.28,42.2],[12.52,42.31],[13.27,41.92],[13.15,41.58],[12.6,41.16],[11.6,42.16]]]}},south_tyrol:{type:"Feature",id:"south_tyrol",properties:{},geometry:{type:"Polygon",coordinates:[[[10.45624,46.86582],[10.73639,46.89211],[10.82977,46.80946],[10.96161,46.81322],[11.1319,46.99149],[11.49067,47.01233],[11.68121,47.04018],[11.7691,47.01023],[12.16736,47.115],[12.28546,47.08322],[12.18384,46.98213],[12.30469,46.85831],[12.37335,46.73421],[12.49969,46.67017],[12.34039,46.61737],[12.08771,46.64944],[12.0163,46.52297],[11.8515,46.49272],[11.66336,46.48657],[11.56929,46.34077],[11.399,46.25585],[11.18958,46.21072],[11.13739,46.2867],[11.20193,46.44732],[10.91904,46.42603],[10.61966,46.43833],[10.44113,46.49036],[10.36766,46.68854],[10.45624,46.86582]]]}},trentino:{type:"Feature",id:"trentino",properties:{},geometry:{type:"Polygon",coordinates:[[[10.49332,46.35641],[10.59219,46.46624],[10.76317,46.49697],[10.84076,46.45536],[11.07971,46.54469],[11.23627,46.50123],[11.21086,46.32559],[11.1779,46.27341],[11.23352,46.2473],[11.32416,46.30235],[11.5583,46.40378],[11.62628,46.5069],[11.83502,46.54233],[11.91399,46.44306],[11.85356,46.34124],[11.99158,46.18363],[11.84464,46.08466],[11.72791,46.07704],[11.69907,45.95592],[11.51093,45.97979],[11.28845,45.8814],[11.21567,45.76273],[11.16074,45.68316],[10.90256,45.66013],[10.82016,45.71097],[10.84076,45.81827],[10.51529,45.76752],[10.41504,46.00269],[10.51941,46.2112],[10.49332,46.35641]]]}},"Yarmouk-University":{type:"Feature",id:"Yarmouk-University",properties:{},geometry:{type:"Polygon",coordinates:[[[35.85811,32.76124],[35.91021,32.75691],[35.96029,32.7441],[36.00642,32.72331],[36.04681,32.69532],[36.07992,32.66124],[36.10446,32.62236],[36.11951,32.5802],[36.1245,32.53638],[36.11926,32.49258],[36.10399,32.45048],[36.0793,32.4117],[36.04615,32.37772],[36.00581,32.34985],[35.95982,32.32914],[35.90996,32.31639],[35.85811,32.31208],[35.80627,32.31639],[35.75641,32.32914],[35.71042,32.34985],[35.67008,32.37772],[35.63693,32.4117],[35.61224,32.45048],[35.59697,32.49258],[35.59173,32.53638],[35.59672,32.5802],[35.61177,32.62236],[35.63631,32.66124],[35.66941,32.69532],[35.70981,32.72331],[35.75593,32.7441],[35.80602,32.75691],[35.85811,32.76124]]]}},kosovo:{type:"Feature",id:"kosovo",properties:{},geometry:{type:"Polygon",coordinates:[[[20.68323,41.85101],[20.64878,41.8621],[20.62895,41.87788],[20.59321,41.87344],[20.5834,41.88906],[20.57131,41.92032],[20.61548,41.94279],[20.61932,41.97284],[20.60727,41.98358],[20.58959,42.03994],[20.56682,42.05515],[20.55,42.08081],[20.5618,42.12415],[20.51171,42.21912],[20.4557,42.26696],[20.40232,42.28017],[20.39286,42.29328],[20.35016,42.30573],[20.34327,42.32034],[20.32919,42.32272],[20.30564,42.30975],[20.28975,42.31841],[20.25651,42.31381],[20.23897,42.32339],[20.24172,42.33451],[20.23137,42.34709],[20.24041,42.36756],[20.20299,42.40034],[20.2216,42.42031],[20.18897,42.44976],[20.18995,42.46123],[20.16241,42.50248],[20.09905,42.52756],[20.07781,42.55062],[20.05218,42.55643],[20.0611,42.56636],[20.07983,42.63561],[20.09833,42.65387],[20.02597,42.70293],[20.01357,42.73718],[20.0294,42.76543],[20.05828,42.77918],[20.17177,42.77208],[20.25749,42.77015],[20.26633,42.81006],[20.26709,42.81838],[20.40458,42.85177],[20.48421,42.87209],[20.52629,42.8857],[20.48117,42.92979],[20.48712,42.94371],[20.52036,42.97599],[20.538,42.97944],[20.54736,42.96696],[20.56759,43.00047],[20.59714,43.01791],[20.61815,43.00738],[20.63582,43.01263],[20.65529,43.03791],[20.66666,43.05941],[20.65555,43.06668],[20.65535,43.07614],[20.69024,43.09046],[20.68474,43.11734],[20.6571,43.13426],[20.60822,43.17079],[20.59313,43.19966],[20.59288,43.20807],[20.60326,43.21586],[20.61577,43.20947],[20.6759,43.21404],[20.71781,43.23861],[20.72976,43.25396],[20.78861,43.2509],[20.79902,43.26973],[20.82402,43.27416],[20.88056,43.23237],[20.89633,43.2064],[20.89185,43.19741],[20.86038,43.18418],[20.88322,43.17221],[20.968,43.12786],[20.97317,43.13725],[21.00171,43.14304],[21.02916,43.13467],[21.05505,43.11374],[21.0768,43.12108],[21.0795,43.1332],[21.09221,43.14057],[21.11813,43.11808],[21.14314,43.11815],[21.15722,43.09497],[21.14943,43.08237],[21.15915,43.04152],[21.17346,43.02927],[21.17228,43.01229],[21.18865,43.01181],[21.19528,43.02655],[21.20838,43.03051],[21.24098,43.01253],[21.25156,42.98139],[21.24127,42.95446],[21.27793,42.90132],[21.30679,42.91192],[21.33168,42.90934],[21.34717,42.90549],[21.36699,42.87815],[21.44,42.87777],[21.44185,42.85103],[21.43,42.84464],[21.42818,42.80712],[21.41748,42.77388],[21.39541,42.75691],[21.39835,42.75158],[21.45096,42.75723],[21.46671,42.74511],[21.48212,42.7524],[21.53015,42.73143],[21.56111,42.74322],[21.59623,42.731],[21.59439,42.7097],[21.67045,42.68104],[21.68037,42.6972],[21.73393,42.71782],[21.7767,42.72243],[21.77888,42.69807],[21.80449,42.65599],[21.77972,42.64209],[21.77173,42.62838],[21.77008,42.60166],[21.75125,42.58434],[21.75095,42.55505],[21.72961,42.54235],[21.70728,42.54294],[21.70222,42.53272],[21.71414,42.51308],[21.69423,42.49888],[21.67446,42.49033],[21.67458,42.48071],[21.62857,42.45056],[21.65142,42.40951],[21.62852,42.37199],[21.57112,42.35813],[21.5391,42.36425],[21.53133,42.33801],[21.56671,42.3189],[21.59596,42.27006],[21.58272,42.25167],[21.52186,42.23975],[21.50594,42.2651],[21.44573,42.27489],[21.43843,42.25552],[21.44638,42.23142],[21.43208,42.22775],[21.39412,42.24212],[21.3493,42.20076],[21.33667,42.1989],[21.33915,42.18753],[21.30895,42.13871],[21.32219,42.10706],[21.30296,42.10363],[21.29279,42.10824],[21.25722,42.08817],[21.23557,42.08617],[21.21595,42.09461],[21.20791,42.12657],[21.16719,42.1714],[21.16274,42.19266],[21.11303,42.20093],[21.05269,42.16308],[21.02143,42.14681],[20.92263,42.12229],[20.89259,42.09216],[20.83556,42.08285],[20.79199,42.07669],[20.76879,42.04106],[20.77208,41.95756],[20.77892,41.91873],[20.74544,41.8779],[20.68323,41.85101]]]}},"Universit-Mohammed-V-Rabat":{type:"Feature",id:"Universit-Mohammed-V-Rabat",properties:{},geometry:{type:"Polygon",coordinates:[[[-6.84395,34.22335],[-6.79097,34.21902],[-6.74003,34.20621],[-6.69312,34.18541],[-6.65205,34.15742],[-6.61839,34.12333],[-6.59343,34.08446],[-6.57813,34.0423],[-6.57307,33.99847],[-6.57841,33.95467],[-6.59394,33.91257],[-6.61905,33.8738],[-6.65276,33.83982],[-6.69379,33.81195],[-6.74054,33.79124],[-6.79124,33.7785],[-6.84395,33.77419],[-6.89666,33.7785],[-6.94736,33.79124],[-6.99412,33.81195],[-7.03514,33.83982],[-7.06886,33.8738],[-7.09397,33.91257],[-7.1095,33.95467],[-7.11484,33.99847],[-7.10977,34.0423],[-7.09447,34.08446],[-7.06952,34.12333],[-7.03586,34.15742],[-6.99478,34.18541],[-6.94787,34.20621],[-6.89694,34.21902],[-6.84395,34.22335]]]}},norway:{type:"Feature",id:"norway",properties:{},geometry:{type:"Polygon",coordinates:[[[25.98816,69.6179],[25.24109,68.60752],[20.42908,68.97318],[16.9519,67.9499],[13.77686,64.59561],[14.28223,64.47279],[14.08447,63.99524],[13.02979,64.10101],[12.00806,63.2633],[12.14813,61.6586],[12.87323,61.31245],[12.67548,61.0636],[12.26074,61.00241],[12.60681,60.50593],[12.49146,60.08128],[12.17285,59.88756],[11.87622,59.84895],[11.94214,59.69547],[11.6922,59.58998],[11.84601,59.25044],[11.64276,58.89471],[11.45325,58.88194],[11.44775,59.00168],[11.34888,59.11254],[11.18134,59.08009],[11.06186,58.97054],[8,57.5],[3,57.5],[3,83],[40,83],[35,71],[29.61365,69.28629],[27.98767,69.99711],[25.98816,69.6179]]]}},poland:{type:"Feature",id:"poland",properties:{},geometry:{type:"Polygon",coordinates:[[[14.03,52.84],[14.34,53.26],[14.13,54.16],[15.95,54.52],[16.31,54.76],[17.13,54.97],[18.29,55.08],[18.9,54.98],[19.69,54.5],[21.47,54.37],[22.9,54.46],[23.39,54.3],[24.01,53.17],[24.03,52.71],[23.29,52.3],[23.74,52.09],[23.64,51.61],[24.24,50.86],[24.11,50.41],[23.78,50.34],[22.77,49.55],[22.96,48.97],[22.18,49.1],[21.6,49.38],[20.93,49.24],[20.47,49.34],[20.12,49.13],[19.76,49.14],[19.45,49.51],[18.94,49.34],[18.48,49.85],[17.83,49.92],[17.54,50.21],[17.06,50.35],[17.08,50.18],[16.65,50.05],[16.11,50.41],[16.3,50.6],[16.01,50.54],[15.34,50.73],[15.14,50.93],[14.78,50.82],[14.94,51.27],[14.5,51.81],[14.66,52.05],[14.53,52.57],[14.03,52.84]]]}},slovenia:{type:"Feature",id:"slovenia",properties:{},geometry:{type:"Polygon",coordinates:[[[15.17101,45.41273],[15.06731,45.4781],[14.98353,45.48726],[14.93027,45.51869],[14.91295,45.46869],[14.81398,45.45019],[14.77755,45.49724],[14.71885,45.52386],[14.68383,45.51924],[14.68367,45.57107],[14.58902,45.61966],[14.59477,45.65727],[14.51653,45.5974],[14.49636,45.52968],[14.32388,45.46048],[14.28251,45.47949],[14.26083,45.47352],[14.2367,45.49569],[14.21022,45.45962],[14.1328,45.46542],[14.06694,45.47615],[14.01187,45.50769],[13.98752,45.49945],[14.00668,45.4739],[13.99154,45.44854],[13.91789,45.44329],[13.88867,45.416],[13.81063,45.42531],[13.7856,45.45577],[13.67553,45.43241],[13.37688,45.56647],[13.63953,45.6426],[13.72158,45.60472],[13.83759,45.59226],[13.89962,45.63295],[13.82754,45.67917],[13.82429,45.70266],[13.78961,45.73525],[13.66355,45.79008],[13.62279,45.78613],[13.58835,45.80154],[13.56531,45.85522],[13.62633,45.93894],[13.62975,45.97662],[13.59233,45.97929],[13.57124,45.9591],[13.52998,45.95627],[13.46729,46.00147],[13.49765,46.03741],[13.4896,46.06574],[13.58839,46.11268],[13.63712,46.14524],[13.65358,46.17505],[13.57147,46.17434],[13.54859,46.19982],[13.48189,46.21479],[13.42003,46.19662],[13.40026,46.21037],[13.40304,46.23284],[13.36653,46.30266],[13.43369,46.33243],[13.43247,46.36779],[13.56263,46.40895],[13.59357,46.44846],[13.68393,46.44947],[13.71321,46.53296],[13.79725,46.5164],[13.91305,46.53108],[14.00849,46.49169],[14.09406,46.49538],[14.12664,46.4852],[14.16569,46.44341],[14.28242,46.45347],[14.3259,46.44111],[14.43178,46.4568],[14.45113,46.43239],[14.52618,46.43623],[14.56677,46.38549],[14.58993,46.44479],[14.65658,46.45447],[14.71191,46.50954],[14.80818,46.51778],[14.81442,46.55093],[14.86094,46.61239],[14.9102,46.61569],[14.95398,46.64257],[14.98376,46.61868],[15.02973,46.65796],[15.10645,46.66965],[15.23727,46.64973],[15.41364,46.66553],[15.46237,46.64732],[15.47411,46.6226],[15.53427,46.64346],[15.53636,46.6761],[15.59201,46.69952],[15.62405,46.69039],[15.65624,46.71643],[15.767,46.70899],[15.83801,46.73237],[15.91476,46.71958],[16.02919,46.67033],[16.02955,46.68778],[15.99495,46.71178],[15.97505,46.74967],[15.98671,46.84189],[16.0553,46.85049],[16.11022,46.87912],[16.15425,46.86525],[16.23302,46.88667],[16.29431,46.8824],[16.34649,46.85476],[16.36058,46.8278],[16.34711,46.79707],[16.32245,46.79068],[16.33977,46.7799],[16.33186,46.75896],[16.38893,46.70785],[16.4383,46.69655],[16.42822,46.65301],[16.40159,46.6439],[16.51477,46.57299],[16.54136,46.53627],[16.5416,46.50887],[16.611,46.48393],[16.61889,46.46203],[16.52219,46.45842],[16.47451,46.50108],[16.36776,46.53371],[16.2582,46.489],[16.28533,46.42441],[16.3168,46.40141],[16.30574,46.36921],[16.18689,46.36804],[16.14548,46.39515],[16.06959,46.38154],[16.08614,46.34087],[16.04058,46.32708],[16.01819,46.29964],[15.80777,46.25091],[15.79649,46.21296],[15.77128,46.19937],[15.67996,46.21707],[15.65737,46.20838],[15.65639,46.18456],[15.62037,46.16163],[15.61899,46.11595],[15.63483,46.09529],[15.71869,46.06873],[15.74241,46.04578],[15.71612,45.99489],[15.71645,45.9178],[15.69237,45.90013],[15.69375,45.87111],[15.71776,45.8416],[15.6441,45.81058],[15.57467,45.83999],[15.52333,45.81155],[15.49115,45.82041],[15.47514,45.78666],[15.40343,45.78216],[15.28683,45.73391],[15.27435,45.72408],[15.29763,45.70782],[15.36329,45.72191],[15.41517,45.65443],[15.39705,45.62929],[15.31501,45.62356],[15.31503,45.60696],[15.29266,45.60163],[15.30852,45.58653],[15.31145,45.5423],[15.39496,45.48325],[15.34824,45.44665],[15.27515,45.45599],[15.22848,45.41683],[15.17101,45.41273]]]}},spain:{type:"Feature",id:"spain",properties:{},geometry:{type:"MultiPolygon",coordinates:[[[[-19,29],[-13,30],[-13,29],[-14,27.8],[-19,27],[-19,29]]],[[[-8.89106,41.82289],[-10,44],[-4,44],[-1.77005,43.37605],[-1.71005,43.37569],[-1.71135,43.33125],[-1.72259,43.31318],[-1.68904,43.31291],[-1.68811,43.33413],[-1.64467,43.33372],[-1.64498,43.31332],[-1.60299,43.31295],[-1.60344,43.29266],[-1.56359,43.29212],[-1.56305,43.31338],[-1.47799,43.31284],[-1.36677,43.27614],[-1.35688,43.23815],[-1.37037,43.1713],[-1.44231,43.08336],[-1.41983,43.06036],[-1.37307,43.05117],[-1.36407,43.11159],[-1.30203,43.13522],[-1.23549,43.13325],[-1.27955,43.07744],[-1.19232,43.06496],[-1.00619,43.00778],[-0.94234,42.9749],[-0.7562,42.98213],[-0.71484,42.96108],[-0.69685,42.90314],[-0.55118,42.82207],[-0.50442,42.84845],[-0.42889,42.82009],[-0.31648,42.86558],[-0.14563,42.81086],[-0.03143,42.71249],[0.18618,42.7541],[0.30218,42.71777],[0.36422,42.74287],[0.44875,42.71447],[0.62769,42.7224],[0.64118,42.85767],[0.71492,42.88272],[0.9676,42.81811],[1.10878,42.79898],[1.17532,42.73429],[1.36326,42.74155],[1.41137,42.70939],[1.48061,42.71034],[1.4813,42.50107],[1.64436,42.50203],[1.64328,42.54245],[1.73041,42.54342],[1.73164,42.50118],[2.06386,42.50164],[2.06456,42.45902],[2.39693,42.45994],[2.39768,42.41784],[2.48048,42.41797],[2.48098,42.37594],[2.64479,42.37626],[2.64448,42.45924],[2.81133,42.45961],[2.81126,42.50104],[3.06388,42.50085],[3.06388,42.45915],[3.23078,42.45934],[5,40],[4,39],[-2.2,36.5],[-5.6,35.95],[-6,36],[-7.37535,37.15354],[-7.40832,37.16822],[-7.4481,37.39094],[-7.46963,37.40758],[-7.4647,37.45305],[-7.50197,37.51641],[-7.51916,37.52292],[-7.52196,37.57237],[-7.45013,37.66958],[-7.4249,37.75992],[-7.31666,37.83997],[-7.26833,37.98895],[-7.15368,38.01552],[-7.11771,38.05536],[-7.0143,38.02438],[-6.99632,38.10756],[-6.96147,38.20125],[-7.08062,38.15708],[-7.34027,38.44024],[-7.26383,38.73807],[-7.04352,38.87297],[-7.06151,38.90796],[-6.96934,39.01983],[-7.00081,39.08879],[-7.15368,39.09577],[-7.15255,39.16029],[-7.24472,39.19689],[-7.25596,39.28133],[-7.33689,39.35351],[-7.3279,39.45599],[-7.51449,39.58865],[-7.55271,39.67954],[-7.05027,39.67522],[-6.99519,39.81954],[-6.92213,39.87909],[-6.88616,40.02299],[-7.04128,40.13479],[-7.01767,40.26615],[-6.8086,40.34501],[-6.86818,40.44516],[-6.85356,40.60664],[-6.83783,40.87576],[-6.9536,41.03704],[-6.80186,41.03959],[-6.76814,41.13871],[-6.64112,41.26556],[-6.56244,41.26303],[-6.21737,41.5791],[-6.31628,41.64465],[-6.51523,41.64129],[-6.58717,41.68832],[-6.54783,41.85597],[-6.62988,41.91121],[-7.13345,41.94048],[-7.16829,41.87188],[-7.42569,41.78477],[-7.95398,41.84593],[-8.13045,41.78058],[-8.25185,41.90786],[-8.12933,42.03488],[-8.24848,42.1008],[-8.36762,42.05575],[-8.60704,42.03405],[-8.89106,41.82289]]]]}},"Universidad-Autonoma-de-Madrid":{type:"Feature",id:"Universidad-Autonoma-de-Madrid",properties:{},geometry:{type:"Polygon",coordinates:[[[-3.69437,40.77124],[-3.63652,40.76691],[-3.58092,40.75409],[-3.52972,40.73327],[-3.48489,40.70527],[-3.44818,40.67117],[-3.42097,40.63228],[-3.40432,40.59011],[-3.39883,40.54628],[-3.4047,40.50248],[-3.42167,40.46039],[-3.44909,40.42163],[-3.48588,40.38767],[-3.53063,40.35981],[-3.58162,40.33912],[-3.6369,40.32638],[-3.69437,40.32208],[-3.75184,40.32638],[-3.80712,40.33912],[-3.85811,40.35981],[-3.90286,40.38767],[-3.93965,40.42163],[-3.96707,40.46039],[-3.98405,40.50248],[-3.98992,40.54628],[-3.98443,40.59011],[-3.96777,40.63228],[-3.94057,40.67117],[-3.90385,40.70527],[-3.85903,40.73327],[-3.80783,40.75409],[-3.75222,40.76691],[-3.69437,40.77124]]]}},"Universidad-Politcnica-de-Madrid":{type:"Feature",id:"Universidad-Politcnica-de-Madrid",properties:{},geometry:{type:"Polygon",coordinates:[[[-3.7173,40.67259],[-3.65954,40.66826],[-3.60402,40.65544],[-3.55289,40.63463],[-3.50813,40.60662],[-3.47147,40.57252],[-3.44431,40.53363],[-3.42767,40.49146],[-3.42219,40.44764],[-3.42805,40.40384],[-3.445,40.36175],[-3.47238,40.32298],[-3.50912,40.28902],[-3.5538,40.26117],[-3.60472,40.24047],[-3.65992,40.22773],[-3.7173,40.22343],[-3.77469,40.22773],[-3.82989,40.24047],[-3.8808,40.26117],[-3.92549,40.28902],[-3.96222,40.32298],[-3.9896,40.36175],[-4.00656,40.40384],[-4.01241,40.44764],[-4.00693,40.49146],[-3.9903,40.53363],[-3.96314,40.57252],[-3.92647,40.60662],[-3.88172,40.63463],[-3.83059,40.65544],[-3.77507,40.66826],[-3.7173,40.67259]]]}},sweden:{type:"Feature",id:"sweden",properties:{},geometry:{type:"Polygon",coordinates:[[[10.57159,58.2445],[10.63202,58.9245],[11.35712,59.12804],[11.53839,58.91174],[11.62079,58.92308],[11.75812,59.24341],[11.65649,59.61777],[11.85974,59.7121],[11.82129,59.84481],[11.95862,59.91098],[12.15363,59.91235],[12.44476,60.0895],[12.48322,60.32151],[12.56012,60.50458],[12.36511,60.71217],[12.19482,61.01572],[12.64801,61.09415],[12.82928,61.34276],[12.55463,61.55018],[12.42828,61.54495],[12.12341,61.71331],[12.28546,62.26664],[12.03278,62.60851],[12.10968,62.74718],[12.06024,62.89772],[12.18658,62.99765],[11.95587,63.28183],[12.18109,63.47873],[12.1344,63.59012],[12.659,63.9856],[12.90619,64.0722],[13.20831,64.10461],[13.9801,64.03014],[14.06525,64.46214],[13.60382,64.56968],[14.26025,65.11608],[14.31519,65.23831],[14.45251,65.31412],[14.47998,65.62656],[14.57886,65.80953],[14.49097,66.15163],[14.99634,66.17161],[15.4248,66.29337],[15.33691,66.51107],[16.04004,66.93221],[16.37512,67.06743],[16.35864,67.21467],[16.06201,67.42015],[16.1499,67.52957],[16.37512,67.55266],[16.70471,67.91688],[17.25952,68.13067],[17.88025,67.99523],[18.09448,68.19809],[18.06702,68.54432],[18.39661,68.58848],[19.00085,68.52019],[19.89075,68.39109],[20.13245,68.48798],[19.89075,68.55637],[20.28076,68.78613],[19.99512,69.06268],[20.62134,69.08033],[20.86853,69.03518],[21.24756,68.8437],[21.92322,68.60652],[22.90649,68.39514],[23.73596,67.96639],[23.5437,67.8362],[23.62061,67.47492],[23.79639,67.44544],[23.81287,67.26992],[23.63159,67.23806],[24.04358,66.82868],[23.91174,66.57448],[23.71399,66.31986],[24.22485,65.97333],[24.04358,65.64469],[21.00586,63.63894],[18.57239,61.83023],[19.18762,60.53297],[19.11346,60.18387],[19.66827,59.82687],[19.90173,58.07788],[18.78662,56.9869],[16.73218,56.05977],[15.0238,55.72711],[14.36462,55.31977],[13.1163,55.22276],[12.7002,55.30414],[12.82654,55.57834],[12.84851,55.72402],[12.79358,55.83214],[12.6123,56.0751],[12.49146,56.13331],[12.07947,56.30435],[11.35437,57.67185],[10.57159,58.2445]]]}},"Istanbul-Technical-University":{type:"Feature",id:"Istanbul-Technical-University",properties:{},geometry:{type:"Polygon",coordinates:[[[29.02465,41.33019],[29.083,41.32586],[29.13907,41.31304],[29.19071,41.29222],[29.23592,41.26422],[29.27294,41.23011],[29.30037,41.19122],[29.31717,41.14905],[29.3227,41.10523],[29.31678,41.06143],[29.29965,41.01934],[29.272,40.98058],[29.2349,40.94662],[29.18977,40.91876],[29.13835,40.89807],[29.08261,40.88533],[29.02465,40.88103],[28.9667,40.88533],[28.91095,40.89807],[28.85954,40.91876],[28.81441,40.94662],[28.77731,40.98058],[28.74965,41.01934],[28.73253,41.06143],[28.72661,41.10523],[28.73214,41.14905],[28.74893,41.19122],[28.77636,41.23011],[28.81339,41.26422],[28.85859,41.29222],[28.91023,41.31304],[28.96631,41.32586],[29.02465,41.33019]]]}},east_midlands_uk:{type:"Feature",id:"east_midlands_uk",properties:{},geometry:{type:"Polygon",coordinates:[[[0.03031,53.53488],[0.28564,53.56315],[0.48889,53.10722],[0.27299,52.82421],[0.24507,52.7845],[0.27219,52.77279],[0.18631,52.73533],[0.14206,52.7399],[0.08901,52.72361],[0.06361,52.72737],[0.04413,52.71436],[0.04883,52.68175],[0.02104,52.66476],[-0.03129,52.66151],[-0.06373,52.67521],[-0.08777,52.66676],[-0.10221,52.67218],[-0.14108,52.65149],[-0.18003,52.66054],[-0.19288,52.65242],[-0.20605,52.66805],[-0.26064,52.65139],[-0.28925,52.67025],[-0.335,52.67485],[-0.35023,52.66159],[-0.40569,52.64802],[-0.45065,52.65411],[-0.49897,52.63931],[-0.52006,52.64143],[-0.55014,52.61223],[-0.54419,52.59287],[-0.55813,52.59447],[-0.57192,52.58579],[-0.58149,52.59587],[-0.58865,52.58679],[-0.60303,52.58857],[-0.66093,52.56893],[-0.69783,52.5457],[-0.71564,52.52237],[-0.75723,52.51093],[-0.77488,52.51826],[-0.82013,52.51552],[-0.86871,52.52699],[-0.88346,52.51395],[-0.88214,52.49315],[-0.89806,52.4869],[-0.88241,52.47127],[-0.90065,52.45994],[-0.94219,52.46777],[-0.95192,52.47741],[-1.0007,52.47092],[-1.04452,52.44573],[-1.03429,52.43627],[-1.04987,52.42225],[-1.08439,52.43628],[-1.12928,52.41609],[-1.14947,52.39701],[-1.20141,52.39648],[-1.30715,52.49423],[-1.52226,52.57033],[-1.52716,52.58272],[-1.56075,52.59612],[-1.55447,52.61472],[-1.57139,52.6353],[-1.54714,52.64218],[-1.54245,52.65362],[-1.55281,52.66845],[-1.58965,52.68724],[-1.59082,52.69801],[-1.65505,52.69878],[-1.65662,52.72173],[-1.70372,52.7298],[-1.69687,52.75272],[-1.66654,52.78471],[-1.61113,52.78139],[-1.61435,52.78826],[-1.58887,52.79985],[-1.59183,52.80947],[-1.6105,52.81639],[-1.58536,52.8317],[-1.62672,52.85441],[-1.69028,52.86445],[-1.70061,52.86057],[-1.70435,52.86666],[-1.72527,52.85964],[-1.77712,52.88377],[-1.79092,52.88023],[-1.80186,52.88613],[-1.81171,52.88058],[-1.83295,52.8869],[-1.85422,52.93063],[-1.82982,52.94565],[-1.82678,52.97707],[-1.76257,52.99965],[-1.75775,53.01698],[-1.75978,53.03869],[-1.7847,53.04991],[-1.77566,53.05933],[-1.79424,53.08837],[-1.78373,53.10281],[-1.82144,53.13579],[-1.81254,53.15432],[-1.8393,53.1769],[-1.87403,53.19536],[-1.95671,53.21373],[-1.96237,53.22622],[-1.9896,53.21572],[-1.97486,53.23106],[-2.00948,53.26065],[-2.00679,53.35457],[-2.009,53.36201],[-2.03173,53.36573],[-2.03385,53.37517],[-2.00464,53.38633],[-1.99233,53.41519],[-2.02371,53.42055],[-2.02738,53.43233],[-2.01366,53.43988],[-2.00422,53.43592],[-2.00823,53.44155],[-1.98579,53.45523],[-1.98809,53.48033],[-1.97428,53.48838],[-1.97159,53.50434],[-1.92197,53.50995],[-1.92678,53.52095],[-1.91189,53.53803],[-1.89411,53.5336],[-1.87349,53.54041],[-1.84182,53.51989],[-1.82223,53.52108],[-1.80428,53.537],[-1.77188,53.53384],[-1.74155,53.54105],[-1.72318,53.55991],[-1.66945,53.5532],[-1.65103,53.56166],[-1.61581,53.56305],[-1.59636,53.57692],[-1.59109,53.60677],[-1.55023,53.60421],[-1.53078,53.59311],[-1.51867,53.5997],[-1.49656,53.59736],[-1.49512,53.60317],[-1.48371,53.59485],[-1.44763,53.61272],[-1.40036,53.59865],[-1.3767,53.60646],[-1.35612,53.59535],[-1.35143,53.58106],[-1.30782,53.57535],[-1.25803,53.59198],[-1.24825,53.61634],[-1.21778,53.62429],[-1.21602,53.642],[-1.1886,53.63583],[-1.15503,53.64319],[-1.13504,53.63254],[-1.12095,53.64688],[-0.99046,53.6612],[-0.94448,53.65868],[-0.86533,53.63769],[-0.89792,53.58325],[-0.90111,53.5687],[-0.89099,53.56654],[-0.90126,53.54788],[-0.89233,53.53738],[-0.94654,53.52732],[-0.95001,53.51363],[-0.93209,53.51065],[-0.93557,53.5025],[-0.90047,53.47513],[-0.92046,53.46446],[-0.87373,53.46146],[-0.87192,53.46629],[-0.79748,53.45504],[-0.78436,53.46336],[-0.78439,53.47665],[-0.77157,53.47918],[-0.76811,53.4989],[-0.75211,53.50051],[-0.73959,53.51991],[-0.62449,53.51282],[-0.62975,53.45819],[-0.55179,53.4595],[-0.47175,53.47485],[-0.48663,53.48045],[-0.48838,53.50484],[-0.40507,53.51759],[-0.40814,53.53208],[-0.43066,53.54631],[-0.50123,53.53744],[-0.46702,53.54894],[-0.429,53.5745],[-0.41967,53.56375],[-0.33594,53.5586],[-0.30342,53.59077],[-0.30093,53.61636],[-0.24847,53.59364],[-0.25139,53.58463],[-0.23466,53.58623],[-0.22255,53.56799],[-0.19169,53.56844],[-0.21988,53.53258],[-0.21059,53.53168],[-0.20408,53.51174],[-0.2106,53.48626],[-0.18856,53.48451],[-0.1818,53.46862],[-0.15368,53.46565],[-0.14923,53.44667],[-0.13188,53.43591],[-0.12034,53.43357],[-0.08221,53.45112],[-0.10786,53.46987],[-0.0898,53.47765],[-0.09548,53.48596],[-0.07526,53.48931],[-0.06493,53.51878],[-0.01452,53.51538],[0.03031,53.53488]]]}},"england-west-midlands":{type:"Feature",id:"england-west-midlands",properties:{},geometry:{type:"Polygon",coordinates:[[[-3.28493,52.44175],[-3.12706,52.96995],[-1.95817,53.27605],[-1.1222,52.36367],[-1.59859,51.90733],[-2.65611,51.7761],[-3.10848,51.95414],[-3.28493,52.44175]]]}},london_uk:{type:"Feature",id:"london_uk",properties:{},geometry:{type:"Polygon",coordinates:[[[0.23926,51.43251],[0.23923,51.43329],[0.23926,51.43251],[0.23717,51.4241],[0.205,51.39919],[0.18385,51.37628],[0.16188,51.36621],[0.15614,51.3539],[0.1603,51.31026],[0.14958,51.30173],[0.14213,51.29098],[0.06692,51.27361],[-0.01594,51.26864],[-0.05766,51.2586],[-0.10949,51.25943],[-0.16628,51.26848],[-0.19872,51.25854],[-0.22666,51.2587],[-0.27352,51.28757],[-0.31813,51.30077],[-0.33644,51.31532],[-0.40313,51.30581],[-0.44436,51.31987],[-0.47985,51.3302],[-0.50762,51.37142],[-0.53414,51.39494],[-0.54109,51.42774],[-0.53264,51.43923],[-0.5152,51.46248],[-0.49617,51.48894],[-0.50203,51.53945],[-0.5278,51.55474],[-0.53166,51.5611],[-0.53569,51.57289],[-0.53596,51.5778],[-0.53455,51.58275],[-0.53376,51.58792],[-0.51516,51.6337],[-0.49776,51.65205],[-0.4901,51.66912],[-0.45924,51.67692],[-0.44684,51.69442],[-0.42579,51.71213],[-0.39306,51.715],[-0.38079,51.71654],[-0.34459,51.70948],[-0.2838,51.71515],[-0.26707,51.71395],[-0.23509,51.69056],[-0.22093,51.68445],[-0.17729,51.68441],[-0.10644,51.69165],[-0.05899,51.68257],[0.02324,51.678],[0.0691,51.68854],[0.10856,51.68336],[0.19863,51.65015],[0.25714,51.61353],[0.28187,51.57813],[0.29039,51.55903],[0.26811,51.50265],[0.26882,51.49783],[0.26782,51.49042],[0.2659,51.47443],[0.25509,51.46053],[0.23586,51.44791],[0.23926,51.43251]]]}},united_kingdom:{type:"Feature",id:"united_kingdom",properties:{name:"United Kingdom",source:"OpenStreetMap"},geometry:{type:"Polygon",coordinates:[[[-7.24863,55.06999],[-6.96705,55.19847],[-6.59182,55.36664],[-9.93166,58.01975],[0.32957,61.43878],[2.43894,51.64531],[0.72508,50.42953],[-7.66848,49.03788],[-5.93264,51.46771],[-5.4053,53.54032],[-6.07527,54.0096],[-6.28173,54.11135],[-6.309,54.10669],[-6.31788,54.09098],[-6.33629,54.09472],[-6.33993,54.11189],[-6.3662,54.11374],[-6.36237,54.0766],[-6.37492,54.06914],[-6.37907,54.06909],[-6.37911,54.06907],[-6.37918,54.06902],[-6.39105,54.05885],[-6.41198,54.06306],[-6.44345,54.05649],[-6.45607,54.07252],[-6.47779,54.07709],[-6.4713,54.0663],[-6.51051,54.05268],[-6.53187,54.05968],[-6.55772,54.04917],[-6.58643,54.05757],[-6.59499,54.04462],[-6.62381,54.03646],[-6.66426,54.06917],[-6.66202,54.09283],[-6.64506,54.096],[-6.66127,54.12266],[-6.64886,54.12138],[-6.63961,54.13187],[-6.63436,54.16317],[-6.66539,54.19316],[-6.70601,54.20005],[-6.72106,54.18197],[-6.74076,54.18192],[-6.75617,54.19926],[-6.77562,54.19895],[-6.80097,54.21317],[-6.80042,54.2211],[-6.81617,54.22302],[-6.82774,54.26149],[-6.87804,54.27924],[-6.87229,54.28794],[-6.859,54.28191],[-6.85087,54.29728],[-6.87594,54.34641],[-6.90626,54.3503],[-6.91129,54.37474],[-6.93074,54.37575],[-6.9237,54.38284],[-6.95963,54.39221],[-6.98165,54.40946],[-6.99601,54.40538],[-7.0291,54.42137],[-7.05724,54.41108],[-7.07234,54.38839],[-7.10979,54.36824],[-7.10388,54.35574],[-7.15344,54.33501],[-7.18882,54.33765],[-7.17974,54.32046],[-7.17949,54.30924],[-7.19789,54.31106],[-7.21219,54.29962],[-7.17302,54.28613],[-7.17937,54.2726],[-7.16092,54.27371],[-7.14225,54.25559],[-7.15893,54.24396],[-7.14594,54.23957],[-7.14503,54.22473],[-7.17104,54.2176],[-7.18808,54.22492],[-7.1986,54.21578],[-7.22085,54.21581],[-7.23182,54.20557],[-7.24806,54.20446],[-7.24915,54.19817],[-7.233,54.19784],[-7.25942,54.19225],[-7.25828,54.17737],[-7.24028,54.1697],[-7.25812,54.16451],[-7.26296,54.13741],[-7.29195,54.11911],[-7.30891,54.13211],[-7.28551,54.13626],[-7.30149,54.14421],[-7.28379,54.15386],[-7.27997,54.16797],[-7.2913,54.17196],[-7.33956,54.14672],[-7.30533,54.12336],[-7.31867,54.11329],[-7.32713,54.12458],[-7.34602,54.11645],[-7.3632,54.1316],[-7.39181,54.12013],[-7.37279,54.13963],[-7.42078,54.13705],[-7.40959,54.15646],[-7.44192,54.15409],[-7.46841,54.14081],[-7.47919,54.12227],[-7.5281,54.13574],[-7.54738,54.12214],[-7.56576,54.12659],[-7.57454,54.14151],[-7.61043,54.14378],[-7.62966,54.1703],[-7.66425,54.18797],[-7.67659,54.18196],[-7.68829,54.20197],[-7.68543,54.20776],[-7.7394,54.20353],[-7.74858,54.20942],[-7.80368,54.20707],[-7.81173,54.20073],[-7.86017,54.21728],[-7.86046,54.26026],[-7.87322,54.27945],[-7.86187,54.29343],[-7.88087,54.29188],[-7.9017,54.30143],[-7.91095,54.29595],[-7.9616,54.31247],[-8.00093,54.35846],[-8.03129,54.35671],[-8.05733,54.36572],[-8.08416,54.39741],[-8.16026,54.44028],[-8.14291,54.45092],[-8.17751,54.46476],[-8.11467,54.46903],[-8.11324,54.4764],[-8.09148,54.47653],[-8.09868,54.48433],[-8.08933,54.48708],[-8.04265,54.48763],[-8.04185,54.50638],[-8.00601,54.54594],[-7.9703,54.54705],[-7.94973,54.53363],[-7.85055,54.53313],[-7.82402,54.54427],[-7.83325,54.55223],[-7.79659,54.57163],[-7.79341,54.58188],[-7.76212,54.58588],[-7.75151,54.59878],[-7.69725,54.61007],[-7.70877,54.63495],[-7.74165,54.61797],[-7.75797,54.62503],[-7.77236,54.62149],[-7.81366,54.64411],[-7.82828,54.63305],[-7.85213,54.63078],[-7.85669,54.65057],[-7.89164,54.65594],[-7.9099,54.66828],[-7.91381,54.67596],[-7.89766,54.68701],[-7.92089,54.69596],[-7.91804,54.70282],[-7.8796,54.70269],[-7.83665,54.73642],[-7.81761,54.73378],[-7.8047,54.7186],[-7.78875,54.71964],[-7.75006,54.70428],[-7.73551,54.71683],[-7.7116,54.72611],[-7.69723,54.72356],[-7.63657,54.75151],[-7.60944,54.74415],[-7.59117,54.74438],[-7.57919,54.75047],[-7.57865,54.74191],[-7.5698,54.74384],[-7.54826,54.74101],[-7.53859,54.751],[-7.54804,54.75711],[-7.54795,54.78835],[-7.52847,54.80757],[-7.47096,54.8348],[-7.44188,54.87561],[-7.45258,54.89849],[-7.44727,54.93524],[-7.39202,54.94545],[-7.4072,54.95521],[-7.4027,54.96689],[-7.40705,54.98294],[-7.39135,54.99774],[-7.40558,55.00332],[-7.37023,55.03476],[-7.34516,55.05083],[-7.31828,55.04507],[-7.29947,55.0561],[-7.28944,55.04771],[-7.27251,55.06357],[-7.24863,55.06999]]]}},"University-of-Exeter":{type:"Feature",id:"University-of-Exeter",properties:{},geometry:{type:"Polygon",coordinates:[[[-3.53515,50.96148],[-3.46559,50.95715],[-3.39875,50.94431],[-3.33721,50.92347],[-3.28338,50.89544],[-3.23931,50.8613],[-3.20671,50.82239],[-3.18679,50.7802],[-3.1803,50.73637],[-3.18744,50.69258],[-3.20791,50.6505],[-3.24089,50.61177],[-3.28508,50.57784],[-3.33879,50.55001],[-3.39995,50.52934],[-3.46624,50.51662],[-3.53515,50.51233],[-3.60405,50.51662],[-3.67035,50.52934],[-3.73151,50.55001],[-3.78522,50.57784],[-3.82941,50.61177],[-3.86239,50.6505],[-3.88285,50.69258],[-3.89,50.73637],[-3.8835,50.7802],[-3.86359,50.82239],[-3.83098,50.8613],[-3.78692,50.89544],[-3.73308,50.92347],[-3.67155,50.94431],[-3.6047,50.95715],[-3.53515,50.96148]]]}},"University-of-Warwick":{type:"Feature",id:"University-of-Warwick",properties:{},geometry:{type:"Polygon",coordinates:[[[-1.56119,52.60392],[-1.48906,52.59958],[-1.41974,52.58674],[-1.35593,52.56589],[-1.30011,52.53785],[-1.25443,52.50371],[-1.22063,52.46479],[-1.2,52.4226],[-1.19329,52.37877],[-1.20072,52.33498],[-1.22196,52.29291],[-1.25615,52.25418],[-1.30198,52.22025],[-1.35766,52.19243],[-1.42106,52.17177],[-1.48977,52.15905],[-1.56119,52.15476],[-1.63261,52.15905],[-1.70132,52.17177],[-1.76473,52.19243],[-1.8204,52.22025],[-1.86623,52.25418],[-1.90043,52.29291],[-1.92166,52.33498],[-1.92909,52.37877],[-1.92238,52.4226],[-1.90175,52.46479],[-1.86796,52.50371],[-1.82228,52.53785],[-1.76645,52.56589],[-1.70265,52.58674],[-1.63333,52.59958],[-1.56119,52.60392]]]}},"Sacred-Heart-Junior-College":{type:"Feature",id:"Sacred-Heart-Junior-College",properties:{},geometry:{type:"Polygon",coordinates:[[[-89.07411,17.38565],[-89.0282,17.38133],[-88.98406,17.36853],[-88.9434,17.34776],[-88.90777,17.3198],[-88.87855,17.28574],[-88.85686,17.24689],[-88.84353,17.20475],[-88.83907,17.16093],[-88.84364,17.11712],[-88.85706,17.07501],[-88.87881,17.0362],[-88.90805,17.0022],[-88.94366,16.97429],[-88.98426,16.95356],[-89.02831,16.9408],[-89.07411,16.93649],[-89.11991,16.9408],[-89.16396,16.95356],[-89.20456,16.97429],[-89.24017,17.0022],[-89.26941,17.0362],[-89.29116,17.07501],[-89.30458,17.11712],[-89.30915,17.16093],[-89.30469,17.20475],[-89.29136,17.24689],[-89.26967,17.28574],[-89.24045,17.3198],[-89.20483,17.34776],[-89.16416,17.36853],[-89.12002,17.38133],[-89.07411,17.38565]]]}},canada_full:{type:"Feature",id:"canada_full",properties:{},geometry:{type:"Polygon",coordinates:[[[-140.99854,69.64945],[-120.9375,78.7335],[-91.05469,82.7432],[-75.58594,83.40004],[-63.45703,83.15311],[-59.32617,82.37915],[-63.76465,81.42049],[-67.19238,80.79583],[-73.21289,78.85307],[-74.9707,76.33114],[-61.34766,70.75797],[-50.1416,46.67959],[-65.98389,42.85181],[-66.95892,44.48769],[-66.9397,44.81692],[-67.13745,45.15493],[-67.26379,45.18591],[-67.31873,45.1278],[-67.43958,45.21881],[-67.44507,45.58329],[-67.79114,45.67164],[-67.78015,47.07012],[-68.19763,47.35743],[-68.39539,47.35743],[-68.37891,47.29413],[-68.90625,47.17478],[-69.06006,47.23449],[-69.08203,47.43552],[-69.22485,47.46524],[-70.00488,46.70974],[-70.05981,46.41514],[-70.18066,46.36209],[-70.3125,46.21025],[-70.24658,46.14178],[-70.3125,45.97406],[-70.26855,45.91294],[-70.42236,45.80583],[-70.42236,45.72152],[-70.71899,45.49865],[-70.62012,45.38302],[-70.80688,45.4293],[-70.85083,45.22848],[-71.00464,45.3367],[-71.1145,45.25169],[-71.26831,45.29035],[-71.41113,45.24395],[-71.5155,45.0153],[-74.81689,45.0153],[-75.31128,44.84808],[-75.7782,44.51218],[-75.82214,44.4377],[-76.43188,44.09942],[-76.79993,43.63011],[-78.68683,43.63806],[-79.19495,43.45292],[-79.07204,43.26521],[-79.05693,43.25671],[-79.04594,43.13807],[-79.06998,43.12103],[-79.06311,43.11652],[-79.05693,43.10951],[-79.07616,43.08393],[-79.07684,43.07691],[-79.01505,43.06839],[-78.99719,43.05785],[-79.02672,43.02071],[-79.01779,42.98456],[-78.98003,42.97099],[-78.96423,42.95843],[-78.93402,42.95542],[-78.91136,42.93883],[-78.90518,42.90011],[-78.93127,42.82361],[-80.07935,42.38289],[-81.27686,42.20818],[-82.39197,41.68112],[-82.68311,41.67701],[-83.07861,41.86547],[-83.15552,42.03909],[-83.12531,42.12064],[-83.13904,42.23462],[-83.07587,42.31185],[-82.98523,42.33418],[-82.81219,42.37478],[-82.63916,42.56117],[-82.59521,42.54903],[-82.52655,42.61375],[-82.41669,43.00063],[-82.13379,43.59631],[-82.51831,45.34442],[-83.59772,45.82114],[-83.43567,45.99696],[-83.57162,46.10847],[-83.65402,46.12275],[-83.76663,46.10466],[-83.82843,46.11989],[-83.89984,46.06084],[-83.95615,46.05989],[-83.974,46.1018],[-84.00833,46.11609],[-84.00696,46.14559],[-84.07974,46.18934],[-84.10995,46.24065],[-84.0976,46.25585],[-84.11545,46.26724],[-84.12094,46.31564],[-84.10309,46.32038],[-84.13467,46.36115],[-84.14841,46.42082],[-84.10995,46.50359],[-84.12781,46.531],[-84.14085,46.53241],[-84.17313,46.52722],[-84.19373,46.54092],[-84.226,46.53525],[-84.26582,46.49603],[-84.2926,46.49225],[-84.34135,46.50595],[-84.37225,46.50879],[-84.44023,46.49036],[-84.47662,46.45489],[-84.55353,46.45867],[-84.76776,46.62492],[-84.84741,46.88272],[-88.38501,48.31243],[-89.32983,47.96786],[-93.21899,48.64743],[-93.80127,48.5166],[-93.83423,48.63291],[-94.6637,48.75257],[-94.8175,49.32691],[-95.15259,49.38595],[-95.15533,49.00184],[-123.31879,49.00004],[-122.99469,48.7761],[-123.2666,48.69096],[-123.11279,48.37815],[-123.44238,48.22467],[-124.7168,48.49477],[-128.49609,48.74895],[-131.2207,53.61858],[-130.75928,54.73731],[-129.99023,55.27912],[-130.07813,56.10881],[-131.74805,56.63206],[-135.53833,59.80063],[-137.47192,58.90465],[-138.67493,59.78958],[-138.6969,59.90822],[-139.20227,60.09772],[-139.08142,60.35141],[-139.71863,60.33239],[-139.98779,60.18523],[-140.46021,60.30791],[-140.52063,60.22618],[-141.01501,60.30519],[-140.99854,69.64945]]]}},ottawa_gatineau:{type:"Feature",id:"ottawa_gatineau",properties:{},geometry:{type:"Polygon",coordinates:[[[-76.23413,45.50827],[-76.12839,45.55829],[-75.26184,45.58041],[-75.13412,45.39652],[-75.42938,45.32512],[-75.35385,45.17816],[-75.82489,44.93564],[-76.34537,45.36855],[-76.23413,45.50827]]]}},vancouver_metro:{type:"Feature",id:"vancouver_metro",properties:{},geometry:{type:"Polygon",coordinates:[[[-123.32,49],[-123.45,49.38],[-123.26,49.47],[-122.24,49.27],[-122.2,49],[-123.32,49]]]}},"Universidad-de-Costa-Rica":{type:"Feature",id:"Universidad-de-Costa-Rica",properties:{},geometry:{type:"Polygon",coordinates:[[[-84.05105,10.16183],[-84.00654,10.15751],[-83.96374,10.14472],[-83.92431,10.12396],[-83.88975,10.09601],[-83.8614,10.06196],[-83.84035,10.02313],[-83.8274,9.98099],[-83.82305,9.93717],[-83.82746,9.89336],[-83.84046,9.85124],[-83.86155,9.81243],[-83.88991,9.77841],[-83.92445,9.75049],[-83.96385,9.72975],[-84.0066,9.71698],[-84.05105,9.71267],[-84.0955,9.71698],[-84.13825,9.72975],[-84.17765,9.75049],[-84.21219,9.77841],[-84.24055,9.81243],[-84.26164,9.85124],[-84.27464,9.89336],[-84.27905,9.93717],[-84.2747,9.98099],[-84.26175,10.02313],[-84.2407,10.06196],[-84.21235,10.09601],[-84.17779,10.12396],[-84.13836,10.14472],[-84.09556,10.15751],[-84.05105,10.16183]]]}},cuba:{type:"Feature",id:"cuba",properties:{},geometry:{type:"Polygon",coordinates:[[[-85.5,21.75],[-83.5,23.5],[-80,23.5],[-73.5,20.4],[-74.5,19.5],[-78,19.5],[-85.5,21.75]]]}},"Universidad-Nacional-Autnoma-de-Honduras":{type:"Feature",id:"Universidad-Nacional-Autnoma-de-Honduras",properties:{},geometry:{type:"Polygon",coordinates:[[[-87.16598,14.30969],[-87.12077,14.30537],[-87.07729,14.29258],[-87.03724,14.27181],[-87.00214,14.24385],[-86.97336,14.2098],[-86.95199,14.17096],[-86.93885,14.12882],[-86.93444,14.085],[-86.93893,14.04119],[-86.95215,13.99907],[-86.97357,13.96026],[-87.00237,13.92625],[-87.03745,13.89834],[-87.07745,13.87761],[-87.12085,13.86484],[-87.16598,13.86053],[-87.21111,13.86484],[-87.25451,13.87761],[-87.29451,13.89834],[-87.32959,13.92625],[-87.35839,13.96026],[-87.37982,13.99907],[-87.39303,14.04119],[-87.39752,14.085],[-87.39312,14.12882],[-87.37998,14.17096],[-87.3586,14.2098],[-87.32982,14.24385],[-87.29472,14.27181],[-87.25467,14.29258],[-87.2112,14.30537],[-87.16598,14.30969]]]}},"University-of-the-West-Indies-Mona-Campus":{type:"Feature",id:"University-of-the-West-Indies-Mona-Campus",properties:{},geometry:{type:"Polygon",coordinates:[[[-76.74601,18.23094],[-76.69988,18.22662],[-76.65553,18.21383],[-76.61468,18.19305],[-76.57888,18.16509],[-76.54952,18.13104],[-76.52773,18.09219],[-76.51435,18.05004],[-76.50987,18.00622],[-76.51446,17.96241],[-76.52795,17.9203],[-76.5498,17.8815],[-76.57918,17.84749],[-76.61495,17.81959],[-76.65575,17.79886],[-76.7,17.7861],[-76.74601,17.78179],[-76.79202,17.7861],[-76.83627,17.79886],[-76.87707,17.81959],[-76.91284,17.84749],[-76.94222,17.8815],[-76.96407,17.9203],[-76.97756,17.96241],[-76.98215,18.00622],[-76.97767,18.05004],[-76.96429,18.09219],[-76.9425,18.13104],[-76.91314,18.16509],[-76.87734,18.19305],[-76.83649,18.21383],[-76.79214,18.22662],[-76.74601,18.23094]]]}},nicaragua:{type:"Feature",id:"nicaragua",properties:{},geometry:{type:"Polygon",coordinates:[[[-88,13],[-87.56104,13.13298],[-87.36877,12.99921],[-86.97876,13.02597],[-86.88538,13.28272],[-86.7041,13.29876],[-86.77002,13.76873],[-86.31409,13.77407],[-86.1438,14.046],[-86.01746,14.05133],[-85.75378,13.89141],[-85.16602,14.31761],[-84.96277,14.80144],[-84.4574,14.63674],[-83.39722,15.03499],[-82.5,14.9],[-82.8,12],[-83.676,10.95],[-83.66,10.8],[-83.92,10.7],[-84.688,11.076],[-84.91,10.945],[-85.615,11.215],[-85.7,11.06],[-86,11.06],[-88,13]]]}},"Universidad-Nacional-de-Ingenieria":{type:"Feature",id:"Universidad-Nacional-de-Ingenieria",properties:{},geometry:{type:"Polygon",coordinates:[[[-86.27051,12.35623],[-86.22565,12.35191],[-86.18253,12.33912],[-86.1428,12.31835],[-86.10798,12.2904],[-86.07942,12.25635],[-86.05821,12.21751],[-86.04517,12.17537],[-86.0408,12.13156],[-86.04525,12.08775],[-86.05835,12.04563],[-86.0796,12.00682],[-86.10817,11.9728],[-86.14298,11.94489],[-86.18267,11.92415],[-86.22573,11.91138],[-86.27051,11.90707],[-86.31528,11.91138],[-86.35834,11.92415],[-86.39804,11.94489],[-86.43284,11.9728],[-86.46141,12.00682],[-86.48266,12.04563],[-86.49576,12.08775],[-86.50021,12.13156],[-86.49584,12.17537],[-86.4828,12.21751],[-86.46159,12.25635],[-86.43303,12.2904],[-86.39822,12.31835],[-86.35848,12.33912],[-86.31536,12.35191],[-86.27051,12.35623]]]}},"University-of-Panama":{type:"Feature",id:"University-of-Panama",properties:{},geometry:{type:"Polygon",coordinates:[[[-79.54102,9.23988],[-79.49663,9.23556],[-79.45395,9.22278],[-79.41462,9.20201],[-79.38016,9.17407],[-79.35188,9.14002],[-79.33089,9.10119],[-79.31797,9.05905],[-79.31363,9.01523],[-79.31802,8.97142],[-79.33099,8.9293],[-79.35201,8.89048],[-79.3803,8.85647],[-79.41475,8.82855],[-79.45405,8.80781],[-79.49668,8.79504],[-79.54102,8.79072],[-79.58535,8.79504],[-79.62798,8.80781],[-79.66728,8.82855],[-79.70173,8.85647],[-79.73002,8.89048],[-79.75104,8.9293],[-79.76401,8.97142],[-79.7684,9.01523],[-79.76406,9.05905],[-79.75114,9.10119],[-79.73015,9.14002],[-79.70187,9.17407],[-79.66741,9.20201],[-79.62808,9.22278],[-79.5854,9.23556],[-79.54102,9.23988]]]}},"Universidad-de-Puerto-Rico-Rio-Piedras":{type:"Feature",id:"Universidad-de-Puerto-Rico-Rio-Piedras",properties:{},geometry:{type:"Polygon",coordinates:[[[-66.04978,18.62742],[-66.00355,18.6231],[-65.9591,18.6103],[-65.91815,18.58953],[-65.88227,18.56157],[-65.85285,18.52751],[-65.83101,18.48866],[-65.81759,18.44651],[-65.8131,18.40269],[-65.81771,18.35889],[-65.83123,18.31677],[-65.85313,18.27797],[-65.88258,18.24397],[-65.91843,18.21606],[-65.95932,18.19533],[-66.00367,18.18257],[-66.04978,18.17826],[-66.0959,18.18257],[-66.14025,18.19533],[-66.18113,18.21606],[-66.21699,18.24397],[-66.24644,18.27797],[-66.26834,18.31677],[-66.28186,18.35889],[-66.28647,18.40269],[-66.28198,18.44651],[-66.26856,18.48866],[-66.24672,18.52751],[-66.2173,18.56157],[-66.18142,18.58953],[-66.14047,18.6103],[-66.09602,18.6231],[-66.04978,18.62742]]]}},"Ball-State-University":{type:"Feature",id:"Ball-State-University",properties:{},geometry:{type:"Polygon",coordinates:[[[-85.40688,40.43064],[-85.34933,40.42631],[-85.294,40.41349],[-85.24306,40.39268],[-85.19846,40.36468],[-85.16193,40.33057],[-85.13486,40.29169],[-85.11829,40.24952],[-85.11283,40.20569],[-85.11866,40.16189],[-85.13555,40.1198],[-85.16283,40.08104],[-85.19944,40.04708],[-85.24396,40.01922],[-85.29469,39.99852],[-85.3497,39.98578],[-85.40688,39.98148],[-85.46406,39.98578],[-85.51907,39.99852],[-85.5698,40.01922],[-85.61432,40.04708],[-85.65093,40.08104],[-85.67821,40.1198],[-85.6951,40.16189],[-85.70094,40.20569],[-85.69547,40.24952],[-85.6789,40.29169],[-85.65183,40.33057],[-85.6153,40.36468],[-85.5707,40.39268],[-85.51976,40.41349],[-85.46444,40.42631],[-85.40688,40.43064]]]}},boston_metro:{type:"Feature",id:"boston_metro",properties:{},geometry:{type:"Polygon",coordinates:[[[-70.5,41.91],[-71,41.91],[-71.42,42.05],[-71.57,42.18],[-71.64,42.4],[-71.57,42.52],[-71.35,42.64],[-71.1,42.7],[-70.5,42.7],[-70.5,41.91]]]}},"California-University-of-Pennsylvania":{type:"Feature",id:"California-University-of-Pennsylvania",properties:{},geometry:{type:"Polygon",coordinates:[[[-79.89258,40.26902],[-79.83516,40.26469],[-79.77997,40.25187],[-79.72915,40.23105],[-79.68466,40.20305],[-79.64821,40.16895],[-79.62121,40.13006],[-79.60467,40.08789],[-79.59922,40.04407],[-79.60504,40.00027],[-79.62189,39.95818],[-79.64911,39.91941],[-79.68562,39.88545],[-79.73004,39.85759],[-79.78066,39.8369],[-79.83553,39.82416],[-79.89258,39.81986],[-79.94963,39.82416],[-80.0045,39.8369],[-80.05511,39.85759],[-80.09953,39.88545],[-80.13605,39.91941],[-80.16326,39.95818],[-80.18011,40.00027],[-80.18593,40.04407],[-80.18048,40.08789],[-80.16395,40.13006],[-80.13694,40.16895],[-80.1005,40.20305],[-80.05601,40.23105],[-80.00518,40.25187],[-79.95,40.26469],[-79.89258,40.26902]]]}},central_pa:{type:"Feature",id:"central_pa",properties:{},geometry:{type:"Polygon",coordinates:[[[-78.7,41.5],[-77,41.5],[-76,40],[-76,39.72],[-79.3,39.72],[-78.7,41.5]]]}},"Central-Washington-University":{type:"Feature",id:"Central-Washington-University",properties:{},geometry:{type:"Polygon",coordinates:[[[-120.49805,47.20483],[-120.43356,47.2005],[-120.37159,47.18767],[-120.31453,47.16684],[-120.26459,47.13882],[-120.22371,47.10469],[-120.19344,47.06579],[-120.17494,47.02361],[-120.16888,46.97978],[-120.17546,46.93599],[-120.19442,46.89391],[-120.22499,46.85516],[-120.26598,46.82122],[-120.3158,46.79338],[-120.37256,46.7727],[-120.43409,46.75997],[-120.49805,46.75567],[-120.562,46.75997],[-120.62353,46.7727],[-120.68029,46.79338],[-120.73012,46.82122],[-120.77111,46.85516],[-120.80167,46.89391],[-120.82063,46.93599],[-120.82722,46.97978],[-120.82116,47.02361],[-120.80265,47.06579],[-120.77238,47.10469],[-120.7315,47.13882],[-120.68157,47.16684],[-120.62451,47.18767],[-120.56253,47.2005],[-120.49805,47.20483]]]}},chattanooga:{type:"Feature",id:"chattanooga",properties:{},geometry:{type:"Polygon",coordinates:[[[-85.634,34.743],[-85.634,35.282],[-84.933,35.282],[-84.933,34.743],[-85.634,34.743]]]}},"Clemson-University":{type:"Feature",id:"Clemson-University",properties:{},geometry:{type:"Polygon",coordinates:[[[-82.79297,34.89394],[-82.73955,34.88961],[-82.68821,34.8768],[-82.64092,34.85599],[-82.59951,34.82801],[-82.56558,34.79392],[-82.54043,34.75504],[-82.52501,34.71288],[-82.51991,34.66905],[-82.5253,34.62525],[-82.54095,34.58316],[-82.56627,34.54438],[-82.60025,34.51041],[-82.6416,34.48253],[-82.68873,34.46183],[-82.73984,34.44908],[-82.79297,34.44478],[-82.8461,34.44908],[-82.8972,34.46183],[-82.94433,34.48253],[-82.98568,34.51041],[-83.01967,34.54438],[-83.04498,34.58316],[-83.06064,34.62525],[-83.06603,34.66905],[-83.06092,34.71288],[-83.04551,34.75504],[-83.02035,34.79392],[-82.98642,34.82801],[-82.94502,34.85599],[-82.89773,34.8768],[-82.84638,34.88961],[-82.79297,34.89394]]]}},cleveland:{type:"Feature",id:"cleveland",properties:{},geometry:{type:"Polygon",coordinates:[[[-82.5,41.5],[-80.95,42],[-80.95,41],[-82.5,41],[-82.5,41.5]]]}},"College-of-William-and-Mary":{type:"Feature",id:"College-of-William-and-Mary",properties:{},geometry:{type:"Polygon",coordinates:[[[-76.72852,37.52485],[-76.67328,37.52053],[-76.62018,37.50771],[-76.57128,37.4869],[-76.52846,37.45891],[-76.49338,37.42481],[-76.46739,37.38593],[-76.45146,37.34377],[-76.44619,37.29994],[-76.45178,37.25614],[-76.46798,37.21405],[-76.49416,37.17527],[-76.5293,37.14131],[-76.57205,37.11344],[-76.62077,37.09274],[-76.6736,37.08],[-76.72852,37.0757],[-76.78343,37.08],[-76.83626,37.09274],[-76.88498,37.11344],[-76.92773,37.14131],[-76.96287,37.17527],[-76.98905,37.21405],[-77.00525,37.25614],[-77.01084,37.29994],[-77.00557,37.34377],[-76.98965,37.38593],[-76.96365,37.42481],[-76.92857,37.45891],[-76.88576,37.4869],[-76.83685,37.50771],[-76.78376,37.52053],[-76.72852,37.52485]]]}},colorado:{type:"Feature",id:"colorado",properties:{},geometry:{type:"Polygon",coordinates:[[[-109.05,37],[-109.05,41],[-102.05,41],[-102.05,37],[-109.05,37]]]}},"Cornell-University":{type:"Feature",id:"Cornell-University",properties:{},geometry:{type:"Polygon",coordinates:[[[-76.4735,42.67798],[-76.41391,42.67365],[-76.35663,42.66082],[-76.30389,42.64001],[-76.25772,42.612],[-76.21991,42.57789],[-76.1919,42.539],[-76.17476,42.49683],[-76.16912,42.453],[-76.17518,42.4092],[-76.19268,42.36711],[-76.22092,42.32835],[-76.25882,42.2944],[-76.3049,42.26655],[-76.3574,42.24586],[-76.41433,42.23312],[-76.4735,42.22882],[-76.53267,42.23312],[-76.5896,42.24586],[-76.6421,42.26655],[-76.68818,42.2944],[-76.72608,42.32835],[-76.75432,42.36711],[-76.77182,42.4092],[-76.77788,42.453],[-76.77224,42.49683],[-76.7551,42.539],[-76.72709,42.57789],[-76.68928,42.612],[-76.64311,42.64001],[-76.59037,42.66082],[-76.53309,42.67365],[-76.4735,42.67798]]]}},dc_metro:{type:"Feature",id:"dc_metro",properties:{},geometry:{type:"Polygon",coordinates:[[[-77.04437,38.70266],[-77.27783,38.69409],[-77.57172,38.91668],[-77.61017,39.1258],[-77.27509,39.21523],[-77.08694,39.21204],[-76.87546,39.05119],[-76.69968,38.97863],[-76.71066,38.77657],[-76.84662,38.7048],[-77.04437,38.70266]]]}},dfw_metro:{type:"Feature",id:"dfw_metro",properties:{},geometry:{type:"Polygon",coordinates:[[[-97.75,32.25],[-97.75,33.4],[-96,33.4],[-96,32.25],[-97.75,32.25]]]}},"George-Mason-University":{type:"Feature",id:"George-Mason-University",properties:{},geometry:{type:"Polygon",coordinates:[[[-77.34375,39.04717],[-77.28734,39.04284],[-77.23312,39.03002],[-77.18318,39.00921],[-77.13947,38.98121],[-77.10365,38.94711],[-77.07711,38.90823],[-77.06086,38.86606],[-77.05549,38.82224],[-77.06121,38.77844],[-77.07776,38.73635],[-77.10449,38.69758],[-77.14037,38.66361],[-77.18402,38.63575],[-77.23376,38.61506],[-77.28769,38.60231],[-77.34375,38.59801],[-77.39981,38.60231],[-77.45374,38.61506],[-77.50348,38.63575],[-77.54713,38.66361],[-77.58301,38.69758],[-77.60974,38.73635],[-77.62629,38.77844],[-77.63201,38.82224],[-77.62664,38.86606],[-77.61039,38.90823],[-77.58385,38.94711],[-77.54803,38.98121],[-77.50432,39.00921],[-77.45438,39.03002],[-77.40016,39.04284],[-77.34375,39.04717]]]}},grand_junction_co:{type:"Feature",id:"grand_junction_co",properties:{},geometry:{type:"Polygon",coordinates:[[[-109,39.4],[-108.1,39.4],[-107.8,39.16],[-107.8,38.7],[-108.1,38.5],[-109,39],[-109,39.4]]]}},hrva:{type:"Feature",id:"hrva",properties:{},geometry:{type:"Polygon",coordinates:[[[-76.85486,36.53392],[-76.85486,37.35488],[-75.8194,37.35488],[-75.8194,36.53392],[-76.85486,36.53392]]]}},"Indiana-University-of-Pennsylvania":{type:"Feature",id:"Indiana-University-of-Pennsylvania",properties:{},geometry:{type:"Polygon",coordinates:[[[-79.16139,40.83872],[-79.10348,40.83439],[-79.04782,40.82157],[-78.99657,40.80076],[-78.9517,40.77275],[-78.91495,40.73865],[-78.88772,40.69976],[-78.87104,40.65759],[-78.86555,40.61377],[-78.87142,40.56997],[-78.88842,40.52788],[-78.91586,40.48911],[-78.95269,40.45515],[-78.99749,40.4273],[-79.04853,40.4066],[-79.10386,40.39387],[-79.16139,40.38956],[-79.21892,40.39387],[-79.27426,40.4066],[-79.3253,40.4273],[-79.37009,40.45515],[-79.40692,40.48911],[-79.43437,40.52788],[-79.45136,40.56997],[-79.45724,40.61377],[-79.45174,40.65759],[-79.43507,40.69976],[-79.40784,40.73865],[-79.37108,40.77275],[-79.32622,40.80076],[-79.27496,40.82157],[-79.2193,40.83439],[-79.16139,40.83872]]]}},"Jacksonville-State-University":{type:"Feature",id:"Jacksonville-State-University",properties:{},geometry:{type:"Polygon",coordinates:[[[-85.76795,34.04756],[-85.71507,34.04323],[-85.66424,34.03042],[-85.61743,34.00962],[-85.57644,33.98163],[-85.54285,33.94754],[-85.51794,33.90867],[-85.50268,33.86651],[-85.49762,33.82268],[-85.50295,33.77888],[-85.51845,33.73679],[-85.5435,33.69801],[-85.57715,33.66403],[-85.61809,33.63616],[-85.66475,33.61545],[-85.71534,33.6027],[-85.76795,33.5984],[-85.82055,33.6027],[-85.87115,33.61545],[-85.91781,33.63616],[-85.95874,33.66403],[-85.99239,33.69801],[-86.01745,33.73679],[-86.03295,33.77888],[-86.03828,33.82268],[-86.03322,33.86651],[-86.01795,33.90867],[-85.99305,33.94754],[-85.95945,33.98163],[-85.91846,34.00962],[-85.87165,34.03042],[-85.82082,34.04323],[-85.76795,34.04756]]]}},"Kansas-State-University":{type:"Feature",id:"Kansas-State-University",properties:{},geometry:{type:"Polygon",coordinates:[[[-96.5918,39.38872],[-96.53511,39.38439],[-96.48062,39.37157],[-96.43045,39.35076],[-96.38652,39.32276],[-96.35053,39.28866],[-96.32387,39.24978],[-96.30753,39.20761],[-96.30215,39.16378],[-96.30789,39.11998],[-96.32452,39.07789],[-96.35139,39.03912],[-96.38744,39.00516],[-96.4313,38.9773],[-96.48128,38.95661],[-96.53546,38.94386],[-96.5918,38.93956],[-96.64813,38.94386],[-96.70232,38.95661],[-96.75229,38.9773],[-96.79615,39.00516],[-96.83221,39.03912],[-96.85907,39.07789],[-96.87571,39.11998],[-96.88145,39.16378],[-96.87606,39.20761],[-96.85973,39.24978],[-96.83306,39.28866],[-96.79708,39.32276],[-96.75315,39.35076],[-96.70297,39.37157],[-96.64848,39.38439],[-96.5918,39.38872]]]}},la_metro:{type:"Feature",id:"la_metro",properties:{},geometry:{type:"Polygon",coordinates:[[[-118.5,33.7],[-118.68,34.23],[-118.5,34.35],[-118,34.2],[-117.3,34.2],[-117.2,34.1],[-117.37,33.9],[-117.74,33.5],[-118.5,33.7]]]}},massachusetts:{type:"Feature",id:"massachusetts",properties:{},geometry:{type:"Polygon",coordinates:[[[-73.53149,42.9725],[-69.40063,42.9725],[-69.40063,40.98819],[-71.55396,41.04622],[-71.53198,41.91863],[-73.70728,41.91045],[-73.53149,42.9725]]]}},"McGill-University":{type:"Feature",id:"McGill-University",properties:{},geometry:{type:"Polygon",coordinates:[[[-73.5787,45.73088],[-73.51593,45.72655],[-73.45561,45.71372],[-73.40007,45.69289],[-73.35147,45.66488],[-73.31166,45.63076],[-73.28219,45.59186],[-73.26416,45.54968],[-73.25825,45.50585],[-73.26465,45.46206],[-73.28309,45.41998],[-73.31284,45.38122],[-73.35274,45.34728],[-73.40125,45.31943],[-73.45652,45.29875],[-73.51642,45.28602],[-73.5787,45.28172],[-73.64097,45.28602],[-73.70088,45.29875],[-73.75614,45.31943],[-73.80465,45.34728],[-73.84455,45.38122],[-73.8743,45.41998],[-73.89274,45.46206],[-73.89914,45.50585],[-73.89323,45.54968],[-73.8752,45.59186],[-73.84573,45.63076],[-73.80593,45.66488],[-73.75732,45.69289],[-73.70178,45.71372],[-73.64146,45.72655],[-73.5787,45.73088]]]}},"Miami-University":{type:"Feature",id:"Miami-University",properties:{},geometry:{type:"Polygon",coordinates:[[[-84.73174,39.73566],[-84.67477,39.73133],[-84.62001,39.71851],[-84.56958,39.6977],[-84.52543,39.6697],[-84.48927,39.6356],[-84.46247,39.59671],[-84.44606,39.55454],[-84.44065,39.51072],[-84.44642,39.46692],[-84.46314,39.42483],[-84.49014,39.38606],[-84.52638,39.3521],[-84.57045,39.32424],[-84.62067,39.30354],[-84.67513,39.2908],[-84.73174,39.2865],[-84.78835,39.2908],[-84.84281,39.30354],[-84.89303,39.32424],[-84.9371,39.3521],[-84.97334,39.38606],[-85.00034,39.42483],[-85.01706,39.46692],[-85.02283,39.51072],[-85.01742,39.55454],[-85.00101,39.59671],[-84.97421,39.6356],[-84.93805,39.6697],[-84.8939,39.6977],[-84.84347,39.71851],[-84.78871,39.73133],[-84.73174,39.73566]]]}},minneapolis_st_paul_metro:{type:"Feature",id:"minneapolis_st_paul_metro",properties:{},geometry:{type:"Polygon",coordinates:[[[-93.801,44.578],[-93.801,45.348],[-92.666,45.348],[-92.666,44.578],[-93.801,44.578]]]}},"Monroe-Community-College":{type:"Feature",id:"Monroe-Community-College",properties:{},geometry:{type:"Polygon",coordinates:[[[-77.61025,43.32617],[-77.55003,43.32184],[-77.49214,43.30901],[-77.43884,43.28819],[-77.39219,43.26018],[-77.35398,43.22607],[-77.32568,43.18718],[-77.30836,43.14501],[-77.30267,43.10118],[-77.30879,43.05738],[-77.32648,43.0153],[-77.35502,42.97654],[-77.39332,42.94258],[-77.43988,42.91473],[-77.49294,42.89405],[-77.55046,42.88131],[-77.61025,42.87701],[-77.67004,42.88131],[-77.72756,42.89405],[-77.78061,42.91473],[-77.82718,42.94258],[-77.86547,42.97654],[-77.89402,43.0153],[-77.9117,43.05738],[-77.91783,43.10118],[-77.91214,43.14501],[-77.89482,43.18718],[-77.86652,43.22607],[-77.82831,43.26018],[-77.78166,43.28819],[-77.72836,43.30901],[-77.67047,43.32184],[-77.61025,43.32617]]]}},"Montgomery-College":{type:"Feature",id:"Montgomery-College",properties:{},geometry:{type:"Polygon",coordinates:[[[-77.15782,39.32194],[-77.10119,39.31761],[-77.04675,39.30479],[-76.99662,39.28398],[-76.95274,39.25598],[-76.91678,39.22188],[-76.89014,39.183],[-76.87383,39.14083],[-76.86844,39.097],[-76.87418,39.0532],[-76.8908,39.01111],[-76.91764,38.97234],[-76.95366,38.93838],[-76.99747,38.91052],[-77.0474,38.88982],[-77.10154,38.87708],[-77.15782,38.87278],[-77.2141,38.87708],[-77.26823,38.88982],[-77.31816,38.91052],[-77.36198,38.93838],[-77.398,38.97234],[-77.42484,39.01111],[-77.44146,39.0532],[-77.4472,39.097],[-77.44181,39.14083],[-77.42549,39.183],[-77.39885,39.22188],[-77.3629,39.25598],[-77.31902,39.28398],[-77.26889,39.30479],[-77.21445,39.31761],[-77.15782,39.32194]]]}},mt_vernon_wa:{type:"Feature",id:"mt_vernon_wa",properties:{},geometry:{type:"Polygon",coordinates:[[[-123.3,49],[-122,49],[-122,48],[-123.2,48.4],[-123.3,49]]]}},"New-York-University":{type:"Feature",id:"New-York-University",properties:{},geometry:{type:"Polygon",coordinates:[[[-74.00391,40.93853],[-73.94591,40.9342],[-73.89017,40.92138],[-73.83883,40.90057],[-73.7939,40.87257],[-73.75709,40.83846],[-73.72982,40.79957],[-73.71312,40.7574],[-73.70762,40.71358],[-73.7135,40.66978],[-73.73053,40.62769],[-73.75801,40.58893],[-73.7949,40.55497],[-73.83976,40.52711],[-73.89087,40.50642],[-73.94629,40.49368],[-74.00391,40.48938],[-74.06152,40.49368],[-74.11694,40.50642],[-74.16805,40.52711],[-74.21291,40.55497],[-74.2498,40.58893],[-74.27729,40.62769],[-74.29431,40.66978],[-74.30019,40.71358],[-74.29469,40.7574],[-74.27799,40.79957],[-74.25072,40.83846],[-74.21391,40.87257],[-74.16898,40.90057],[-74.11765,40.92138],[-74.0619,40.9342],[-74.00391,40.93853]]]}},nyc_metro:{type:"Feature",id:"nyc_metro",properties:{},geometry:{type:"Polygon",coordinates:[[[-74.73,40.64],[-73.95,41.38],[-73.6,40.95],[-73.25,41],[-73.25,40.6],[-74.43,40.43],[-74.73,40.64]]]}},"Ohio-Wesleyan-University":{type:"Feature",id:"Ohio-Wesleyan-University",properties:{},geometry:{type:"Polygon",coordinates:[[[-83.06823,40.52082],[-83.0106,40.51649],[-82.9552,40.50367],[-82.90419,40.48285],[-82.85953,40.45485],[-82.82295,40.42075],[-82.79585,40.38186],[-82.77925,40.33969],[-82.77378,40.29586],[-82.77963,40.25207],[-82.79654,40.20998],[-82.82385,40.17121],[-82.86051,40.13725],[-82.90509,40.10939],[-82.95589,40.0887],[-83.01097,40.07596],[-83.06823,40.07166],[-83.12549,40.07596],[-83.18056,40.0887],[-83.23136,40.10939],[-83.27595,40.13725],[-83.3126,40.17121],[-83.33992,40.20998],[-83.35683,40.25207],[-83.36268,40.29586],[-83.3572,40.33969],[-83.34061,40.38186],[-83.31351,40.42075],[-83.27692,40.45485],[-83.23227,40.48285],[-83.18126,40.50367],[-83.12586,40.51649],[-83.06823,40.52082]]]}},"Oklahoma-State-University":{type:"Feature",id:"Oklahoma-State-University",properties:{},geometry:{type:"Polygon",coordinates:[[[-97.07253,36.34551],[-97.01814,36.34119],[-96.96586,36.32837],[-96.9177,36.30756],[-96.87554,36.27957],[-96.841,36.24548],[-96.81539,36.2066],[-96.7997,36.16444],[-96.79451,36.12061],[-96.80001,36.07681],[-96.81596,36.03472],[-96.84173,35.99594],[-96.87634,35.96197],[-96.91844,35.9341],[-96.96642,35.9134],[-97.01845,35.90066],[-97.07253,35.89636],[-97.12662,35.90066],[-97.17865,35.9134],[-97.22663,35.9341],[-97.26873,35.96197],[-97.30333,35.99594],[-97.32911,36.03472],[-97.34506,36.07681],[-97.35055,36.12061],[-97.34537,36.16444],[-97.32967,36.2066],[-97.30407,36.24548],[-97.26952,36.27957],[-97.22736,36.30756],[-97.17921,36.32837],[-97.12693,36.34119],[-97.07253,36.34551]]]}},philly_metro:{type:"Feature",id:"philly_metro",properties:{},geometry:{type:"Polygon",coordinates:[[[-75.7,40.3],[-75.3,40.4],[-74.7,40.3],[-74.45,40.1],[-74.9,39.55],[-75.5,39.55],[-75.8,39.7218],[-76.23,39.7211],[-75.7,40.3]]]}},phoenix:{type:"Feature",id:"phoenix",properties:{},geometry:{type:"Polygon",coordinates:[[[-113,32.7],[-113,34],[-111.1,34],[-111.1,32.7],[-113,32.7]]]}},portland_me:{type:"Feature",id:"portland_me",properties:{},geometry:{type:"Polygon",coordinates:[[[-70.5,42.9],[-71,43.3],[-71,44.2],[-69.6,44.5],[-69,44],[-70.5,42.9]]]}},portland_or:{type:"Feature",id:"portland_or",properties:{},geometry:{type:"Polygon",coordinates:[[[-124.4,44.8],[-124.4,46.3],[-121.5,46.3],[-121.5,44.8],[-124.4,44.8]]]}},salt_lake_city:{type:"Feature",id:"salt_lake_city",properties:{},geometry:{type:"Polygon",coordinates:[[[-112.6,40.75],[-112.3,41.4],[-111.5,41.4],[-111.1,40.3],[-112,39.75],[-112.6,40.75]]]}},seattle:{type:"Feature",id:"seattle",properties:{},geometry:{type:"Polygon",coordinates:[[[-122.15,47.26],[-122.33,47.26],[-122.54,47.33],[-122.52,47.46],[-122.45,47.55],[-122.45,47.8],[-121.2,47.8],[-121.43,47.38],[-121.43,47.14],[-121.94,47.14],[-122,47.17],[-122,47.17],[-122.1,47.19],[-122.15,47.26]]]}},sf_bay_area:{type:"Feature",id:"sf_bay_area",properties:{},geometry:{type:"Polygon",coordinates:[[[-123.5,38.5],[-122.8,38.8],[-121.7,38.2],[-121.5,36.9],[-123,36.9],[-123.5,38.5]]]}},south_sf_bay_area:{type:"Feature",id:"south_sf_bay_area",properties:{},geometry:{type:"Polygon",coordinates:[[[-121.4566,37.48249],[-121.21628,37.17673],[-121.20529,36.95757],[-121.49368,36.95757],[-121.5596,36.8928],[-121.98257,37.12419],[-122.27234,37.39635],[-122.13501,37.48903],[-121.4566,37.48249]]]}},st_louis:{type:"Feature",id:"st_louis",properties:{},geometry:{type:"Polygon",coordinates:[[[-90.28,39.1],[-89.57,39.05],[-89.57,38.18],[-90.58,38],[-91.37,38.2],[-91.37,38.75],[-90.28,39.1]]]}},"State-University-of-New-York-Geneseo":{type:"Feature",id:"State-University-of-New-York-Geneseo",properties:{},geometry:{type:"Polygon",coordinates:[[[-77.7832,43.0361],[-77.72327,43.03177],[-77.66566,43.01895],[-77.61261,42.99813],[-77.56618,42.97012],[-77.52815,42.93601],[-77.49998,42.89712],[-77.48274,42.85494],[-77.47707,42.81111],[-77.48316,42.76732],[-77.50076,42.72523],[-77.52917,42.68647],[-77.56729,42.65252],[-77.61364,42.62467],[-77.66644,42.60398],[-77.72369,42.59124],[-77.7832,42.58694],[-77.84272,42.59124],[-77.89996,42.60398],[-77.95277,42.62467],[-77.99912,42.65252],[-78.03723,42.68647],[-78.06564,42.72523],[-78.08324,42.76732],[-78.08934,42.81111],[-78.08367,42.85494],[-78.06643,42.89712],[-78.03826,42.93601],[-78.00023,42.97012],[-77.9538,42.99813],[-77.90075,43.01895],[-77.84314,43.03177],[-77.7832,43.0361]]]}},"SUNY-at-Fredonia":{type:"Feature",id:"SUNY-at-Fredonia",properties:{},geometry:{type:"Polygon",coordinates:[[[-79.36523,42.64804],[-79.30567,42.6437],[-79.24842,42.63088],[-79.19571,42.61006],[-79.14956,42.58206],[-79.11177,42.54795],[-79.08377,42.50906],[-79.06664,42.46688],[-79.061,42.42305],[-79.06706,42.37926],[-79.08454,42.33717],[-79.11278,42.29841],[-79.15065,42.26445],[-79.19671,42.2366],[-79.24919,42.21591],[-79.30609,42.20318],[-79.36523,42.19888],[-79.42438,42.20318],[-79.48128,42.21591],[-79.53376,42.2366],[-79.57982,42.26445],[-79.61769,42.29841],[-79.64592,42.33717],[-79.66341,42.37926],[-79.66947,42.42305],[-79.66383,42.46688],[-79.64669,42.50906],[-79.6187,42.54795],[-79.58091,42.58206],[-79.53476,42.61006],[-79.48205,42.63088],[-79.4248,42.6437],[-79.36523,42.64804]]]}},tampa_bay:{type:"Feature",id:"tampa_bay",properties:{},geometry:{type:"Polygon",coordinates:[[[-83,28.2],[-82.2,28.2],[-82.2,27.55],[-83,27.55],[-83,28.2]]]}},"Texas-Tech-University":{type:"Feature",id:"Texas-Tech-University",properties:{},geometry:{type:"Polygon",coordinates:[[[-101.86523,33.80259],[-101.81251,33.79827],[-101.76183,33.78546],[-101.71515,33.76465],[-101.67428,33.73667],[-101.64078,33.70258],[-101.61595,33.66371],[-101.60072,33.62155],[-101.59568,33.57772],[-101.60099,33.53392],[-101.61644,33.49182],[-101.64143,33.45304],[-101.67498,33.41907],[-101.7158,33.39119],[-101.76233,33.37049],[-101.81278,33.35774],[-101.86523,33.35344],[-101.91769,33.35774],[-101.96814,33.37049],[-102.01467,33.39119],[-102.05549,33.41907],[-102.08904,33.45304],[-102.11403,33.49182],[-102.12948,33.53392],[-102.13479,33.57772],[-102.12975,33.62155],[-102.11452,33.66371],[-102.08969,33.70258],[-102.05619,33.73667],[-102.01532,33.76465],[-101.96864,33.78546],[-101.91796,33.79827],[-101.86523,33.80259]]]}},"The-Citadel":{type:"Feature",id:"The-Citadel",properties:{},geometry:{type:"Polygon",coordinates:[[[-79.96064,33.02165],[-79.90838,33.01732],[-79.85816,33.00451],[-79.81189,32.98371],[-79.77138,32.95573],[-79.73818,32.92164],[-79.71357,32.88277],[-79.69847,32.84061],[-79.69347,32.79679],[-79.69873,32.75298],[-79.71404,32.71088],[-79.73881,32.6721],[-79.77206,32.63813],[-79.81252,32.61025],[-79.85863,32.58954],[-79.90864,32.57679],[-79.96064,32.57249],[-80.01263,32.57679],[-80.06264,32.58954],[-80.10876,32.61025],[-80.14921,32.63813],[-80.18247,32.6721],[-80.20723,32.71088],[-80.22254,32.75298],[-80.2278,32.79679],[-80.2228,32.84061],[-80.2077,32.88277],[-80.18309,32.92164],[-80.14989,32.95573],[-80.10938,32.98371],[-80.06312,33.00451],[-80.01289,33.01732],[-79.96064,33.02165]]]}},"The-George-Washington-University":{type:"Feature",id:"The-George-Washington-University",properties:{},geometry:{type:"Polygon",coordinates:[[[-77.04812,39.12442],[-76.99165,39.12009],[-76.93737,39.10727],[-76.88738,39.08646],[-76.84362,39.05846],[-76.80776,39.02436],[-76.7812,38.98548],[-76.76492,38.94331],[-76.75955,38.89948],[-76.76527,38.85569],[-76.78184,38.81359],[-76.80861,38.77483],[-76.84453,38.74086],[-76.88822,38.713],[-76.93801,38.6923],[-76.992,38.67956],[-77.04812,38.67526],[-77.10425,38.67956],[-77.15823,38.6923],[-77.20803,38.713],[-77.25172,38.74086],[-77.28764,38.77483],[-77.31441,38.81359],[-77.33097,38.85569],[-77.33669,38.89948],[-77.33132,38.94331],[-77.31505,38.98548],[-77.28848,39.02436],[-77.25263,39.05846],[-77.20887,39.08646],[-77.15888,39.10727],[-77.1046,39.12009],[-77.04812,39.12442]]]}},"The-Johns-Hopkins-University-SAIS":{type:"Feature",id:"The-Johns-Hopkins-University-SAIS",properties:{},geometry:{type:"Polygon",coordinates:[[[-77.04027,39.13272],[-76.98379,39.12839],[-76.9295,39.11557],[-76.87951,39.09476],[-76.83574,39.06677],[-76.79988,39.03267],[-76.77331,38.99378],[-76.75704,38.95161],[-76.75167,38.90779],[-76.75739,38.86399],[-76.77396,38.8219],[-76.80073,38.78313],[-76.83665,38.74916],[-76.88035,38.7213],[-76.93015,38.70061],[-76.98414,38.68787],[-77.04027,38.68356],[-77.0964,38.68787],[-77.15039,38.70061],[-77.20019,38.7213],[-77.24389,38.74916],[-77.27982,38.78313],[-77.30658,38.8219],[-77.32316,38.86399],[-77.32888,38.90779],[-77.32351,38.95161],[-77.30723,38.99378],[-77.28066,39.03267],[-77.2448,39.06677],[-77.20104,39.09476],[-77.15104,39.11557],[-77.09675,39.12839],[-77.04027,39.13272]]]}},"The-Pennsylvania-State-University":{type:"Feature",id:"The-Pennsylvania-State-University",properties:{},geometry:{type:"Polygon",coordinates:[[[-77.85976,41.02277],[-77.80169,41.01844],[-77.74587,41.00562],[-77.69448,40.9848],[-77.64948,40.9568],[-77.61263,40.92269],[-77.58532,40.88381],[-77.5686,40.84164],[-77.5631,40.79781],[-77.56899,40.75401],[-77.58603,40.71192],[-77.61355,40.67316],[-77.65049,40.6392],[-77.6954,40.61134],[-77.74658,40.59065],[-77.80207,40.57791],[-77.85976,40.57361],[-77.91744,40.57791],[-77.97293,40.59065],[-78.02411,40.61134],[-78.06903,40.6392],[-78.10596,40.67316],[-78.13348,40.71192],[-78.15053,40.75401],[-78.15642,40.79781],[-78.15091,40.84164],[-78.13419,40.88381],[-78.10689,40.92269],[-78.07003,40.9568],[-78.02504,40.9848],[-77.97364,41.00562],[-77.91783,41.01844],[-77.85976,41.02277]]]}},"University-of-California-Davis":{type:"Feature",id:"University-of-California-Davis",properties:{},geometry:{type:"Polygon",coordinates:[[[-121.72852,38.77274],[-121.67232,38.76842],[-121.61831,38.7556],[-121.56857,38.73479],[-121.52502,38.70679],[-121.48934,38.67269],[-121.4629,38.63381],[-121.44671,38.59164],[-121.44136,38.54781],[-121.44705,38.50402],[-121.46354,38.46192],[-121.49017,38.42315],[-121.52591,38.38919],[-121.56939,38.36133],[-121.61894,38.34063],[-121.67267,38.32789],[-121.72852,38.32359],[-121.78437,38.32789],[-121.83809,38.34063],[-121.88764,38.36133],[-121.93112,38.38919],[-121.96686,38.42315],[-121.99349,38.46192],[-122.00998,38.50402],[-122.01567,38.54781],[-122.01032,38.59164],[-121.99413,38.63381],[-121.96769,38.67269],[-121.93201,38.70679],[-121.88847,38.73479],[-121.83872,38.7556],[-121.78471,38.76842],[-121.72852,38.77274]]]}},"University-of-Central-Florida":{type:"Feature",id:"University-of-Central-Florida",properties:{},geometry:{type:"Polygon",coordinates:[[[-81.38672,28.68361],[-81.33678,28.67929],[-81.28877,28.66648],[-81.24455,28.64569],[-81.20582,28.61771],[-81.17407,28.58364],[-81.15052,28.54477],[-81.13608,28.50262],[-81.13127,28.45879],[-81.13628,28.41499],[-81.15091,28.37289],[-81.17457,28.3341],[-81.20636,28.30011],[-81.24505,28.27223],[-81.28915,28.25151],[-81.33699,28.23876],[-81.38672,28.23445],[-81.43645,28.23876],[-81.48428,28.25151],[-81.52839,28.27223],[-81.56708,28.30011],[-81.59887,28.3341],[-81.62253,28.37289],[-81.63715,28.41499],[-81.64217,28.45879],[-81.63736,28.50262],[-81.62291,28.54477],[-81.59937,28.58364],[-81.56762,28.61771],[-81.52889,28.64569],[-81.48467,28.66648],[-81.43666,28.67929],[-81.38672,28.68361]]]}},"University-of-Chicago":{type:"Feature",id:"University-of-Chicago",properties:{},geometry:{type:"Polygon",coordinates:[[[-87.59878,42.0135],[-87.53981,42.00917],[-87.48314,41.99634],[-87.43095,41.97553],[-87.38527,41.94752],[-87.34785,41.91341],[-87.32013,41.87452],[-87.30316,41.83235],[-87.29758,41.78852],[-87.30357,41.74473],[-87.32088,41.70264],[-87.34882,41.66388],[-87.38632,41.62992],[-87.43192,41.60207],[-87.48388,41.58138],[-87.54022,41.56864],[-87.59878,41.56434],[-87.65734,41.56864],[-87.71367,41.58138],[-87.76563,41.60207],[-87.81124,41.62992],[-87.84873,41.66388],[-87.87668,41.70264],[-87.89399,41.74473],[-87.89998,41.78852],[-87.8944,41.83235],[-87.87743,41.87452],[-87.84971,41.91341],[-87.81229,41.94752],[-87.76661,41.97553],[-87.71442,41.99634],[-87.65774,42.00917],[-87.59878,42.0135]]]}},"University-of-Maryland-College-Park":{type:"Feature",id:"University-of-Maryland-College-Park",properties:{},geometry:{type:"Polygon",coordinates:[[[-76.94332,39.21148],[-76.88677,39.20715],[-76.83242,39.19433],[-76.78237,39.17352],[-76.73856,39.14552],[-76.70266,39.11142],[-76.67606,39.07254],[-76.65977,39.03037],[-76.65439,38.98654],[-76.66012,38.94275],[-76.67671,38.90065],[-76.70351,38.86189],[-76.73947,38.82792],[-76.78322,38.80006],[-76.83307,38.77937],[-76.88712,38.76662],[-76.94332,38.76232],[-76.99951,38.76662],[-77.05356,38.77937],[-77.10341,38.80006],[-77.14716,38.82792],[-77.18313,38.86189],[-77.20992,38.90065],[-77.22651,38.94275],[-77.23224,38.98654],[-77.22686,39.03037],[-77.21057,39.07254],[-77.18397,39.11142],[-77.14808,39.14552],[-77.10426,39.17352],[-77.05421,39.19433],[-76.99986,39.20715],[-76.94332,39.21148]]]}},"University-of-North-Texas":{type:"Feature",id:"University-of-North-Texas",properties:{},geometry:{type:"Polygon",coordinates:[[[-97.15255,33.43207],[-97.10005,33.42774],[-97.04958,33.41493],[-97.0031,33.39413],[-96.9624,33.36615],[-96.92905,33.33206],[-96.90432,33.29319],[-96.88916,33.25103],[-96.88413,33.2072],[-96.88942,33.1634],[-96.90481,33.1213],[-96.92969,33.08252],[-96.96309,33.04855],[-97.00374,33.02067],[-97.05007,32.99997],[-97.10031,32.98722],[-97.15255,32.98291],[-97.20478,32.98722],[-97.25502,32.99997],[-97.30135,33.02067],[-97.342,33.04855],[-97.3754,33.08252],[-97.40028,33.1213],[-97.41567,33.1634],[-97.42096,33.2072],[-97.41593,33.25103],[-97.40077,33.29319],[-97.37604,33.33206],[-97.34269,33.36615],[-97.30199,33.39413],[-97.25551,33.41493],[-97.20504,33.42774],[-97.15255,33.43207]]]}},"University-of-Northern-Colorado":{type:"Feature",id:"University-of-Northern-Colorado",properties:{},geometry:{type:"Polygon",coordinates:[[[-104.69563,40.62872],[-104.63791,40.62439],[-104.58242,40.61157],[-104.53133,40.59075],[-104.4866,40.56275],[-104.44996,40.52865],[-104.42281,40.48976],[-104.40619,40.44759],[-104.40071,40.40377],[-104.40657,40.35997],[-104.42351,40.31788],[-104.45087,40.27911],[-104.48758,40.24515],[-104.53224,40.21729],[-104.58312,40.1966],[-104.63828,40.18386],[-104.69563,40.17956],[-104.75298,40.18386],[-104.80815,40.1966],[-104.85903,40.21729],[-104.90368,40.24515],[-104.94039,40.27911],[-104.96775,40.31788],[-104.98469,40.35997],[-104.99055,40.40377],[-104.98507,40.44759],[-104.96845,40.48976],[-104.9413,40.52865],[-104.90466,40.56275],[-104.85994,40.59075],[-104.80884,40.61157],[-104.75336,40.62439],[-104.69563,40.62872]]]}},"University-of-Oregon":{type:"Feature",id:"University-of-Oregon",properties:{},geometry:{type:"Polygon",coordinates:[[[-123.04688,44.249],[-122.98571,44.24467],[-122.92693,44.23184],[-122.87281,44.21102],[-122.82543,44.18301],[-122.78663,44.1489],[-122.7579,44.11],[-122.74032,44.06783],[-122.73455,44.024],[-122.74077,43.9802],[-122.75874,43.93812],[-122.78773,43.89936],[-122.82661,43.86541],[-122.8739,43.83756],[-122.92777,43.81688],[-122.98617,43.80414],[-123.04688,43.79984],[-123.10758,43.80414],[-123.16598,43.81688],[-123.21985,43.83756],[-123.26714,43.86541],[-123.30602,43.89936],[-123.33501,43.93812],[-123.35298,43.9802],[-123.3592,44.024],[-123.35343,44.06783],[-123.33585,44.11],[-123.30712,44.1489],[-123.26832,44.18301],[-123.22094,44.21102],[-123.16682,44.23184],[-123.10804,44.24467],[-123.04688,44.249]]]}},"University-of-Redlands":{type:"Feature",id:"University-of-Redlands",properties:{},geometry:{type:"Polygon",coordinates:[[[-117.16339,34.28768],[-117.11037,34.28336],[-117.0594,34.27054],[-117.01245,34.24974],[-116.97134,34.22175],[-116.93766,34.18767],[-116.91268,34.14879],[-116.89737,34.10663],[-116.8923,34.06281],[-116.89765,34.019],[-116.91319,33.97691],[-116.93832,33.93813],[-116.97206,33.90415],[-117.01311,33.87628],[-117.0599,33.85558],[-117.11064,33.84283],[-117.16339,33.83852],[-117.21614,33.84283],[-117.26688,33.85558],[-117.31367,33.87628],[-117.35473,33.90415],[-117.38847,33.93813],[-117.4136,33.97691],[-117.42914,34.019],[-117.43448,34.06281],[-117.42941,34.10663],[-117.4141,34.14879],[-117.38913,34.18767],[-117.35544,34.22175],[-117.31434,34.24974],[-117.26739,34.27054],[-117.21642,34.28336],[-117.16339,34.28768]]]}},"University-of-South-Carolina":{type:"Feature",id:"University-of-South-Carolina",properties:{},geometry:{type:"Polygon",coordinates:[[[-81.03516,34.24082],[-80.98216,34.23649],[-80.93122,34.22368],[-80.8843,34.20288],[-80.84321,34.17489],[-80.80954,34.14081],[-80.78458,34.10193],[-80.76928,34.05977],[-80.76421,34.01594],[-80.76956,33.97214],[-80.78509,33.93005],[-80.81021,33.89127],[-80.84393,33.85729],[-80.88496,33.82942],[-80.93172,33.80871],[-80.98243,33.79597],[-81.03516,33.79166],[-81.08788,33.79597],[-81.13859,33.80871],[-81.18535,33.82942],[-81.22638,33.85729],[-81.26011,33.89127],[-81.28522,33.93005],[-81.30076,33.97214],[-81.3061,34.01594],[-81.30103,34.05977],[-81.28573,34.10193],[-81.26077,34.14081],[-81.2271,34.17489],[-81.18602,34.20288],[-81.1391,34.22368],[-81.08815,34.23649],[-81.03516,34.24082]]]}},"University-of-Southern-California":{type:"Feature",id:"University-of-Southern-California",properties:{},geometry:{type:"Polygon",coordinates:[[[-118.30078,34.24082],[-118.24779,34.23649],[-118.19684,34.22368],[-118.14992,34.20288],[-118.10884,34.17489],[-118.07517,34.14081],[-118.05021,34.10193],[-118.03491,34.05977],[-118.02984,34.01594],[-118.03518,33.97214],[-118.05072,33.93005],[-118.07583,33.89127],[-118.10955,33.85729],[-118.15058,33.82942],[-118.19735,33.80871],[-118.24806,33.79597],[-118.30078,33.79166],[-118.3535,33.79597],[-118.40421,33.80871],[-118.45098,33.82942],[-118.49201,33.85729],[-118.52573,33.89127],[-118.55085,33.93005],[-118.56638,33.97214],[-118.57172,34.01594],[-118.56665,34.05977],[-118.55135,34.10193],[-118.52639,34.14081],[-118.49273,34.17489],[-118.45164,34.20288],[-118.40472,34.22368],[-118.35378,34.23649],[-118.30078,34.24082]]]}},"University-of-Vermont":{type:"Feature",id:"University-of-Vermont",properties:{},geometry:{type:"Polygon",coordinates:[[[-73.21289,44.68973],[-73.15127,44.6854],[-73.09204,44.67257],[-73.0375,44.65175],[-72.98977,44.62374],[-72.95068,44.58962],[-72.92174,44.55072],[-72.90403,44.50855],[-72.89821,44.46472],[-72.90449,44.42092],[-72.92259,44.37884],[-72.9518,44.34008],[-72.99098,44.30613],[-73.03862,44.27829],[-73.09289,44.2576],[-73.15173,44.24487],[-73.21289,44.24057],[-73.27405,44.24487],[-73.33289,44.2576],[-73.38716,44.27829],[-73.4348,44.30613],[-73.47398,44.34008],[-73.50319,44.37884],[-73.52129,44.42092],[-73.52757,44.46472],[-73.52175,44.50855],[-73.50404,44.55072],[-73.4751,44.58962],[-73.43601,44.62374],[-73.38828,44.65175],[-73.33374,44.67257],[-73.27451,44.6854],[-73.21289,44.68973]]]}},"University-of-Victoria":{type:"Feature",id:"University-of-Victoria",properties:{},geometry:{type:"Polygon",coordinates:[[[-123.31186,48.68804],[-123.24549,48.68371],[-123.18171,48.67087],[-123.123,48.65004],[-123.07162,48.62201],[-123.02956,48.58789],[-122.99842,48.54898],[-122.9794,48.5068],[-122.97318,48.46297],[-122.97997,48.41917],[-122.99948,48.3771],[-123.03094,48.33835],[-123.07312,48.30441],[-123.12438,48.27658],[-123.18277,48.25591],[-123.24607,48.24318],[-123.31186,48.23888],[-123.37764,48.24318],[-123.44094,48.25591],[-123.49933,48.27658],[-123.55059,48.30441],[-123.59277,48.33835],[-123.62423,48.3771],[-123.64374,48.41917],[-123.65053,48.46297],[-123.64431,48.5068],[-123.62529,48.54898],[-123.59415,48.58789],[-123.55209,48.62201],[-123.50071,48.65004],[-123.442,48.67087],[-123.37822,48.68371],[-123.31186,48.68804]]]}},"University-of-Wyoming":{type:"Feature",id:"University-of-Wyoming",properties:{},geometry:{type:"Polygon",coordinates:[[[-105.56651,41.53953],[-105.50798,41.5352],[-105.45172,41.52238],[-105.39992,41.50157],[-105.35457,41.47356],[-105.31742,41.43946],[-105.2899,41.40057],[-105.27306,41.3584],[-105.26751,41.31457],[-105.27345,41.27077],[-105.29063,41.22868],[-105.31837,41.18992],[-105.3556,41.15596],[-105.40087,41.12811],[-105.45245,41.10742],[-105.50837,41.09468],[-105.56651,41.09038],[-105.62465,41.09468],[-105.68057,41.10742],[-105.73215,41.12811],[-105.77742,41.15596],[-105.81465,41.18992],[-105.84239,41.22868],[-105.85957,41.27077],[-105.86551,41.31457],[-105.85996,41.3584],[-105.84312,41.40057],[-105.8156,41.43946],[-105.77845,41.47356],[-105.7331,41.50157],[-105.6813,41.52238],[-105.62504,41.5352],[-105.56651,41.53953]]]}},usa_full:{type:"Feature",id:"usa_full",properties:{},geometry:{type:"MultiPolygon",coordinates:[[[[-124.76179,48.41301],[-123.22752,48.18499],[-123.32289,49.00429],[-96.01312,49.00605],[-95.11054,49.412],[-93.99811,49.00671],[-89.43531,47.98378],[-88.34922,48.29633],[-87.50645,48.01427],[-83.2814,46.13885],[-82.17616,43.58854],[-82.66248,41.68895],[-79.00601,42.80053],[-79.15798,43.44626],[-78.76239,43.62496],[-76.90231,43.80246],[-75.07988,44.98029],[-72.02225,45.00598],[-71.41227,45.25488],[-70.46149,46.21766],[-69.25051,47.51223],[-67.75966,47.099],[-66.94528,44.71049],[-69.84893,43.26199],[-69.87974,40.99205],[-72.00202,40.99125],[-74.02112,39.57279],[-75.41474,35.05319],[-80.02453,32.01613],[-79.89011,26.85507],[-80.02,24.0071],[-84.01601,24.00527],[-84.01656,25.01258],[-81.99666,25.01349],[-81.9972,25.98268],[-84.01879,28.99618],[-86.02775,30.00475],[-88.01625,30.00389],[-88.01567,28.99443],[-90.90285,28.85645],[-93.74053,29.47421],[-95.55633,28.58761],[-96.80617,27.79782],[-96.95553,25.98216],[-97.43502,25.8266],[-98.01091,25.9928],[-99.23511,26.4476],[-100.00624,28.00822],[-101.25529,29.48105],[-102.1514,29.74757],[-102.71736,29.39206],[-103.25189,28.89087],[-104.58819,29.69979],[-105.02053,30.5361],[-106.20525,31.4467],[-106.28689,31.56133],[-106.42932,31.75206],[-106.48421,31.74645],[-106.53072,31.78209],[-108.18711,31.77551],[-108.19927,31.326],[-111.00893,31.33601],[-114.86123,32.47999],[-117.67593,32.46302],[-119.97759,33.00641],[-122.53697,36.85661],[-124.99343,40.05576],[-124.60595,45.90245],[-124.76179,48.41301]]],[[[-160.57876,22.50629],[-159.00937,22.50702],[-157.50474,21.9985],[-156.29276,21.22259],[-154.68902,19.88057],[-154.62178,18.7587],[-155.99619,18.77902],[-157.50832,20.9958],[-158.74706,21.24398],[-160.57822,21.49846],[-160.57876,22.50629]]],[[[-167.1572,68.722],[-164.9717,68.9947],[-163.0218,69.9707],[-160.4136,70.7398],[-156.1769,71.5633],[-140.9684,69.9535],[-140.9874,61.0119],[-139.1716,60.4127],[-138.0072,59.9918],[-135.123,59.7566],[-131.9759,56.9995],[-130.0071,57.0001],[-130.0044,54.0043],[-133.9948,54.0032],[-138.515,57.9986],[-138.516,58.9953],[-151.5013,58.992],[-151.5003,57.9988],[-151.9963,55.9992],[-158.0191,55.0028],[-159.0076,55.0025],[-162.4025,53.9567],[-171.4689,51.8215],[-177.9993,51.2554],[-178.0001,52.2446],[-173.8197,59.7401],[-172.5143,63.8767],[-169.0075,64.9988],[-169.0087,66.0015],[-168.0022,66.0018],[-164.8554,67.0255],[-167.1572,68.722]]],[[[-68.2,17.8],[-67.9,18.67],[-65.33,18.57],[-64.64,18.36],[-64.32,17.38],[-68.2,17.8]]],[[[146.2,15.4],[144.8,12.9],[144.2,13.2],[145.7,15.6],[146.2,15.4]]],[[[180,52.2],[180,51],[172,52.5],[172,53.5],[180,52.2]]]]}},"UW-Madison":{type:"Feature",id:"UW-Madison",properties:{},geometry:{type:"Polygon",coordinates:[[[-89.41268,43.30123],[-89.35248,43.2969],[-89.29462,43.28408],[-89.24134,43.26326],[-89.19471,43.23525],[-89.15652,43.20114],[-89.12823,43.16225],[-89.11092,43.12007],[-89.10523,43.07624],[-89.11135,43.03245],[-89.12903,42.99036],[-89.15756,42.9516],[-89.19584,42.91765],[-89.24239,42.8898],[-89.29542,42.86911],[-89.35291,42.85638],[-89.41268,42.85208],[-89.47245,42.85638],[-89.52994,42.86911],[-89.58298,42.8898],[-89.62952,42.91765],[-89.6678,42.9516],[-89.69634,42.99036],[-89.71401,43.03245],[-89.72014,43.07624],[-89.71444,43.12007],[-89.69713,43.16225],[-89.66884,43.20114],[-89.63065,43.23525],[-89.58402,43.26326],[-89.53074,43.28408],[-89.47288,43.2969],[-89.41268,43.30123]]]}},"Vassar-College":{type:"Feature",id:"Vassar-College",properties:{},geometry:{type:"Polygon",coordinates:[[[-73.89515,41.91136],[-73.83628,41.90703],[-73.7797,41.8942],[-73.72759,41.87339],[-73.68198,41.84538],[-73.64462,41.81127],[-73.61695,41.77238],[-73.6,41.73021],[-73.59443,41.68639],[-73.60041,41.64259],[-73.61769,41.6005],[-73.64559,41.56174],[-73.68303,41.52778],[-73.72856,41.49993],[-73.78044,41.47924],[-73.83668,41.4665],[-73.89515,41.4622],[-73.95362,41.4665],[-74.00986,41.47924],[-74.06174,41.49993],[-74.10727,41.52778],[-74.14471,41.56174],[-74.17261,41.6005],[-74.1899,41.64259],[-74.19587,41.68639],[-74.1903,41.73021],[-74.17336,41.77238],[-74.14568,41.81127],[-74.10832,41.84538],[-74.06271,41.87339],[-74.01061,41.8942],[-73.95402,41.90703],[-73.89515,41.91136]]]}},"Villanova-University":{type:"Feature",id:"Villanova-University",properties:{},geometry:{type:"Polygon",coordinates:[[[-75.34361,40.26191],[-75.28619,40.25758],[-75.23101,40.24476],[-75.18019,40.22394],[-75.13571,40.19594],[-75.09927,40.16184],[-75.07227,40.12296],[-75.05573,40.08079],[-75.05028,40.03696],[-75.0561,39.99316],[-75.07295,39.95107],[-75.10016,39.9123],[-75.13667,39.87834],[-75.18109,39.85048],[-75.23169,39.82979],[-75.28656,39.81705],[-75.34361,39.81275],[-75.40065,39.81705],[-75.45552,39.82979],[-75.50613,39.85048],[-75.55054,39.87834],[-75.58705,39.9123],[-75.61426,39.95107],[-75.63111,39.99316],[-75.63693,40.03696],[-75.63148,40.08079],[-75.61495,40.12296],[-75.58795,40.16184],[-75.5515,40.19594],[-75.50702,40.22394],[-75.4562,40.24476],[-75.40102,40.25758],[-75.34361,40.26191]]]}},"West-Virginia-University":{type:"Feature",id:"West-Virginia-University",properties:{},geometry:{type:"Polygon",coordinates:[[[-79.98047,39.86412],[-79.92339,39.85979],[-79.86853,39.84697],[-79.81801,39.82616],[-79.77378,39.79816],[-79.73755,39.76405],[-79.7107,39.72517],[-79.69426,39.683],[-79.68884,39.63917],[-79.69462,39.59537],[-79.71137,39.55328],[-79.73842,39.51452],[-79.77473,39.48055],[-79.81888,39.4527],[-79.8692,39.432],[-79.92375,39.41926],[-79.98047,39.41496],[-80.03718,39.41926],[-80.09174,39.432],[-80.14206,39.4527],[-80.18621,39.48055],[-80.22252,39.51452],[-80.24957,39.55328],[-80.26632,39.59537],[-80.2721,39.63917],[-80.26668,39.683],[-80.25024,39.72517],[-80.22339,39.76405],[-80.18716,39.79816],[-80.14293,39.82616],[-80.09241,39.84697],[-80.03755,39.85979],[-79.98047,39.86412]]]}},"Western-Michigan-University":{type:"Feature",id:"Western-Michigan-University",properties:{},geometry:{type:"Polygon",coordinates:[[[-85.61042,42.5082],[-85.55099,42.50387],[-85.49387,42.49105],[-85.44127,42.47023],[-85.39523,42.44222],[-85.35752,42.40811],[-85.32959,42.36922],[-85.31249,42.32705],[-85.30686,42.28322],[-85.3129,42.23942],[-85.33035,42.19734],[-85.35852,42.15858],[-85.39631,42.12462],[-85.44227,42.09677],[-85.49464,42.07608],[-85.55141,42.06334],[-85.61042,42.05904],[-85.66944,42.06334],[-85.72621,42.07608],[-85.77857,42.09677],[-85.82453,42.12462],[-85.86232,42.15858],[-85.89049,42.19734],[-85.90794,42.23942],[-85.91398,42.28322],[-85.90835,42.32705],[-85.89125,42.36922],[-85.86332,42.40811],[-85.82561,42.44222],[-85.77957,42.47023],[-85.72697,42.49105],[-85.66985,42.50387],[-85.61042,42.5082]]]}},wyoming:{type:"Feature",id:"wyoming",properties:{},geometry:{type:"Polygon",coordinates:[[[-111.05,41],[-111.05,45],[-104.05,45],[-104.05,41],[-111.05,41]]]}},australia_full:{type:"Feature",id:"australia_full",properties:{},geometry:{type:"Polygon",coordinates:[[[146.07422,-44.43378],[131.66016,-44.65302],[124.54102,-41.44273],[116.45508,-39.36828],[108.80859,-39.16414],[103.18359,-27.60567],[95.27344,-24.04646],[96.30615,-11.15685],[106.25977,-9.92557],[116.47705,-13.98738],[122.77222,-11.65224],[126.43066,-11.48002],[129.26514,-9.92557],[134.89014,-9.92557],[139.46045,-10.14193],[141.55334,-9.99861],[141.7868,-9.77132],[142.229,-9.67115],[142.72614,-9.552],[143.30017,-9.39216],[144.24774,-9.24851],[144.44824,-9.59533],[149.5459,-12.68321],[154.90723,-18.02053],[156.42334,-21.55528],[158.02734,-24.68695],[160.0708,-26.03704],[167.34375,-26.6671],[170.354,-29.11378],[168.2666,-30.63791],[160.15869,-34.03445],[152.18262,-38.41056],[149.94141,-43.51669],[146.07422,-44.43378]]]}},argentina:{type:"Feature",id:"argentina",properties:{},geometry:{type:"Polygon",coordinates:[[[-73.14602,-49.18818],[-72.91615,-48.93261],[-72.53201,-48.80072],[-72.58755,-48.48542],[-72.22624,-48.32339],[-72.49784,-47.96155],[-72.33315,-47.44938],[-71.86801,-47.23376],[-71.94851,-46.80983],[-71.64665,-46.68783],[-71.79939,-46.19141],[-71.6147,-45.97522],[-71.79762,-45.62288],[-71.46813,-45.4921],[-71.32472,-45.306],[-71.56043,-44.97863],[-72.04094,-44.90019],[-72.07396,-44.78023],[-71.46969,-44.73753],[-71.23704,-44.79082],[-71.13226,-44.4711],[-71.36469,-44.38958],[-71.80731,-44.42036],[-71.84736,-44.11002],[-71.64902,-43.94552],[-71.75129,-43.78527],[-71.60784,-43.62836],[-71.93082,-43.45685],[-71.76157,-43.1645],[-72.14281,-42.8979],[-72.1812,-42.69735],[-72.023,-42.41766],[-72.17288,-42.14043],[-71.72931,-42.12447],[-71.91021,-41.34113],[-71.8196,-41.06038],[-71.96387,-40.71955],[-71.8414,-40.4521],[-71.65704,-40.36426],[-71.82818,-40.20778],[-71.59266,-39.90123],[-71.67811,-39.56486],[-71.39497,-39.34179],[-71.42542,-38.92164],[-70.92524,-38.76298],[-70.84044,-38.54138],[-70.97623,-38.44222],[-70.98292,-38.10477],[-71.21191,-37.68901],[-71.11983,-37.4585],[-71.21555,-37.27261],[-71.09237,-37.11444],[-71.11982,-36.69792],[-71.03513,-36.47333],[-70.71285,-36.42687],[-70.70501,-36.27229],[-70.42451,-36.15581],[-70.38755,-35.60868],[-70.43201,-35.31842],[-70.58358,-35.27831],[-70.36203,-35.13645],[-70.21683,-34.61145],[-70.01089,-34.41389],[-70.03094,-34.28805],[-69.79507,-34.24304],[-69.90417,-33.77143],[-69.7705,-33.3611],[-70.00282,-33.32294],[-70.08089,-33.02919],[-70.00121,-32.8846],[-70.17038,-32.62555],[-70.14899,-32.46585],[-70.31918,-32.27335],[-70.35277,-32.0257],[-70.2106,-31.95769],[-70.46072,-31.84116],[-70.56691,-31.60016],[-70.49734,-31.12216],[-70.40805,-31.16633],[-70.23998,-30.61575],[-70.11719,-30.43102],[-69.89853,-30.35557],[-69.87492,-29.7043],[-70.01808,-29.38321],[-69.78724,-29.13008],[-69.68114,-28.47172],[-69.45679,-28.18357],[-69.17254,-27.97088],[-68.94231,-27.52325],[-68.8412,-27.15464],[-68.29854,-27.0389],[-68.2638,-26.91623],[-68.58734,-26.49294],[-68.55754,-26.2871],[-68.38108,-26.17822],[-68.57599,-25.42894],[-68.4999,-25.16149],[-68.34279,-25.1124],[-68.56789,-24.79739],[-68.26201,-24.40457],[-67.32231,-24.0344],[-66.99052,-23.00044],[-67.18066,-22.8138],[-67.02827,-22.54089],[-66.78247,-22.43778],[-66.73899,-22.23893],[-66.28793,-22.08605],[-66.24277,-21.79408],[-66.07589,-21.83493],[-65.74764,-22.10912],[-64.99322,-22.08239],[-64.53579,-22.29137],[-64.29933,-22.86509],[-64.24332,-22.56039],[-63.93139,-22],[-62.80617,-22],[-62.7913,-22.16193],[-62.3009,-22.48659],[-62.20671,-22.70418],[-61.73612,-23.23432],[-61.08824,-23.61393],[-60.9899,-23.81808],[-60.37353,-24.024],[-60.03941,-24.01156],[-59.47554,-24.33261],[-59.35397,-24.47821],[-58.67243,-24.83192],[-58.24167,-24.92801],[-57.76089,-25.17193],[-57.555,-25.4484],[-57.74064,-25.65045],[-57.89112,-25.9662],[-58.08473,-26.11185],[-58.22103,-26.41403],[-58.18996,-26.64518],[-58.31991,-26.85821],[-58.64913,-27.12662],[-58.59905,-27.29984],[-57.87482,-27.27527],[-57.48754,-27.44418],[-56.96564,-27.50202],[-56.84926,-27.6063],[-56.60117,-27.42102],[-56.3749,-27.58903],[-56.29432,-27.42003],[-56.06276,-27.306],[-55.73692,-27.44516],[-55.6057,-27.16241],[-55.42284,-26.99528],[-54.78695,-26.63111],[-54.61874,-26.20893],[-54.67933,-25.99524],[-54.65698,-25.67619],[-54.5842,-25.58952],[-54.4812,-25.62543],[-54.108,-25.495],[-53.86217,-25.65902],[-53.83619,-25.97166],[-53.6411,-26.21559],[-53.73094,-26.5097],[-53.67249,-26.91252],[-53.84355,-27.16453],[-53.959,-27.15804],[-54.21736,-27.38603],[-54.673,-27.57],[-54.814,-27.533],[-54.936,-27.772],[-55.38728,-27.98524],[-55.76677,-28.23982],[-55.69902,-28.42637],[-55.88091,-28.4715],[-56.29651,-28.80272],[-56.42475,-29.07897],[-56.59315,-29.12516],[-56.70164,-29.35913],[-57.328,-29.972],[-57.64923,-30.20184],[-57.63687,-30.33197],[-57.85924,-30.47701],[-57.8096,-30.91332],[-58.08141,-31.45457],[-57.98082,-31.58691],[-58.20653,-31.86773],[-58.10645,-32.24002],[-58.20464,-32.46055],[-58.0841,-32.99782],[-58.36693,-33.12177],[-58.49375,-33.57857],[-58.29507,-34.17809],[-57.9345,-34.4519],[-55.9,-35.6],[-57,-39],[-61,-41],[-63.5,-55],[-66.67094,-55.11906],[-67.27285,-54.90511],[-67.95071,-54.87373],[-68.60967,-54.91369],[-68.60676,-52.65902],[-68.41869,-52.3325],[-69.19014,-52.15044],[-69.48632,-52.15165],[-69.9955,-52.00074],[-71.92259,-51.99991],[-72.29907,-51.69791],[-72.28621,-50.65987],[-72.72636,-50.61667],[-73.06995,-50.78909],[-73.32848,-50.5716],[-73.52199,-50.15397],[-73.44481,-49.79226],[-73.53933,-49.49825],[-73.47299,-49.20464],[-73.14602,-49.18818]]]}},bolivia:{type:"Feature",id:"bolivia",properties:{},geometry:{type:"Polygon",coordinates:[[[-60.17487,-16.26675],[-58.32092,-16.31948],[-58.47336,-16.74472],[-58.39371,-17.18081],[-57.79152,-17.55501],[-57.71187,-17.73103],[-57.55463,-18.22348],[-57.72079,-18.89914],[-57.70775,-19.0381],[-58.11768,-19.75313],[-57.85675,-19.96754],[-58.15338,-20.15201],[-58.17535,-19.83066],[-59.07074,-19.28846],[-59.97025,-19.29494],[-61.78848,-19.65358],[-62.57401,-21.99972],[-63.93082,-22.00736],[-64.24942,-22.60957],[-64.31808,-22.8806],[-64.56528,-22.36595],[-64.62021,-22.21856],[-64.99649,-22.08628],[-65.77446,-22.10027],[-65.92552,-21.93222],[-66.04774,-21.91884],[-66.04225,-21.86022],[-66.2273,-21.78437],[-66.3121,-22.1219],[-66.74057,-22.23635],[-66.7955,-22.44213],[-67.18002,-22.81353],[-67.56351,-22.90085],[-67.81174,-22.87934],[-68.17566,-21.3252],[-68.405,-20.9499],[-68.54095,-20.92681],[-68.55606,-20.7285],[-68.43796,-20.63857],[-68.74557,-20.46369],[-68.72772,-20.08173],[-68.56293,-20.05077],[-68.53134,-19.85779],[-68.69064,-19.74667],[-68.41873,-19.41544],[-68.9296,-18.97448],[-69.12186,-18.14128],[-69.46793,-17.50852],[-69.46793,-17.37489],[-69.63547,-17.27787],[-69.01199,-16.66053],[-69.03877,-16.58487],[-68.93509,-16.2061],[-69.16718,-16.22259],[-69.40201,-15.62634],[-69.13422,-15.23516],[-69.35806,-14.96933],[-68.97903,-14.21979],[-68.87466,-12.88745],[-68.65768,-12.49088],[-69.57264,-10.94456],[-68.74806,-11.00835],[-68.75167,-11.01762],[-68.75201,-11.03716],[-68.76592,-11.04963],[-68.70815,-11.14253],[-68.54576,-11.11036],[-68.24295,-10.95872],[-68.08502,-10.69165],[-67.86736,-10.64036],[-67.71629,-10.71459],[-67.6775,-10.60341],[-67.65947,-10.61792],[-67.58446,-10.50402],[-67.43614,-10.44966],[-67.40593,-10.38314],[-67.31461,-10.37774],[-67.32216,-10.32438],[-67.1953,-10.32277],[-67.18869,-10.33983],[-67.17093,-10.33814],[-66.57921,-9.90392],[-65.86441,-9.75981],[-65.56503,-9.82477],[-65.44968,-9.67318],[-65.29449,-9.85589],[-65.39474,-10.54722],[-65.35629,-10.78474],[-65.2684,-10.88658],[-65.29861,-11.32656],[-65.14481,-11.70939],[-64.36752,-12.4587],[-63.67538,-12.46675],[-61.64841,-13.53453],[-61.06339,-13.52919],[-60.4303,-13.88608],[-60.23804,-15.09864],[-60.57312,-15.09599],[-60.24353,-15.47221],[-60.17487,-16.26675]]]}},bahia:{id:"bahia",type:"Feature",properties:{},geometry:{type:"Polygon",coordinates:[[[-46.26343,-11.52309],[-46.40625,-11.53923],[-46.51062,-11.50425],[-46.604,-11.3481],[-46.61224,-11.25653],[-46.46668,-11.1811],[-46.42822,-11.02208],[-46.32935,-10.9331],[-46.19751,-10.65521],[-45.84045,-10.47701],[-45.82672,-10.35275],[-45.74707,-10.34194],[-45.70038,-10.26087],[-45.72784,-10.15815],[-45.59326,-10.09326],[-45.41199,-10.43379],[-45.45593,-10.55262],[-45.37903,-10.72538],[-45.15381,-10.8387],[-44.90112,-10.90883],[-44.60999,-10.66601],[-44.34631,-10.54182],[-44.13757,-10.63362],[-44.05518,-10.39057],[-43.96179,-10.42839],[-43.78601,-10.15275],[-43.69263,-10.03918],[-43.69812,-9.95262],[-43.64868,-9.82274],[-43.76404,-9.76861],[-43.8794,-9.54117],[-43.68713,-9.41655],[-43.4729,-9.24851],[-43.3081,-9.37861],[-43.04443,-9.36235],[-42.8302,-9.60617],[-42.33581,-9.31899],[-41.90735,-9.23767],[-41.7865,-9.09125],[-41.40198,-8.71136],[-41.14929,-8.70593],[-41.03943,-8.83351],[-41.01471,-8.82808],[-40.92407,-8.83894],[-40.8197,-9.07226],[-40.68237,-9.14277],[-40.66864,-9.26478],[-40.7428,-9.30002],[-40.75653,-9.42197],[-40.62744,-9.47615],[-40.53131,-9.41384],[-40.47363,-9.39758],[-40.42694,-9.34338],[-40.36102,-9.37319],[-40.29785,-9.09396],[-40.23468,-9.04243],[-40.14679,-9.10481],[-40.07813,-9.05057],[-39.98749,-9.05599],[-39.8996,-8.95833],[-39.90509,-8.82808],[-39.68262,-8.77923],[-39.70459,-8.67063],[-39.65241,-8.65977],[-39.41345,-8.50769],[-39.2926,-8.54843],[-39.23492,-8.6299],[-38.96576,-8.76837],[-38.86963,-8.76837],[-38.71307,-8.83622],[-38.68835,-8.90678],[-38.66913,-8.98275],[-38.61694,-8.96376],[-38.60596,-8.86065],[-38.5675,-8.81723],[-38.47687,-8.84708],[-38.50983,-8.94205],[-38.42194,-9.037],[-38.33679,-8.97461],[-38.28461,-9.00716],[-38.31757,-9.06684],[-38.21045,-9.36235],[-38.04565,-9.4599],[-38.02368,-9.8498],[-37.89185,-9.96885],[-37.74902,-10.31492],[-37.8479,-10.37977],[-37.78198,-10.64981],[-37.93579,-10.73617],[-38.13354,-10.6822],[-38.26538,-10.79014],[-38.02368,-11.31848],[-37.73804,-11.57691],[-37.3645,-11.48002],[-38.50159,-18.11975],[-39.65515,-18.35453],[-40.25391,-17.96828],[-40.23193,-17.79053],[-40.61646,-17.38209],[-40.51758,-16.89917],[-40.13306,-16.45716],[-39.90234,-16.04581],[-40.68237,-15.68651],[-41.08887,-15.73939],[-41.35254,-15.73939],[-41.37451,-15.49603],[-41.80298,-15.09334],[-42.04468,-15.18878],[-43.24219,-14.67925],[-43.50586,-14.78551],[-43.92334,-14.63674],[-43.7915,-14.31761],[-44.35181,-14.24309],[-44.65942,-14.38148],[-45.78003,-15.13576],[-46.10962,-15.29478],[-46.06567,-14.87047],[-45.92285,-14.38148],[-46.24146,-14.14723],[-46.32935,-13.11158],[-46.38428,-12.02858],[-46.26343,-11.52309]]]}},brazil:{type:"Feature",id:"brazil",properties:{},geometry:{type:"Polygon",coordinates:[[[-51.56433,4.29711],[-28.4491,1.04914],[-37.67761,-21.04862],[-52.94861,-34.05721],[-53.56384,-33.71063],[-53.58581,-33.23409],[-53.16833,-32.81036],[-54.11316,-32.08723],[-55.73914,-30.85036],[-56.11267,-31.18931],[-56.11267,-30.90694],[-57.0575,-30.14988],[-57.23328,-30.32073],[-57.73865,-30.26381],[-55.98083,-28.5411],[-54.94812,-27.68839],[-53.80554,-27.18136],[-53.7616,-26.73089],[-53.87146,-26.00249],[-54.20105,-25.88394],[-54.6405,-25.88394],[-54.28894,-24.13171],[-55.43701,-24.18685],[-55.87647,-22.3704],[-58.07373,-22.08564],[-58.24402,-20.06109],[-57.71668,-17.98396],[-58.43628,-17.18278],[-58.50769,-16.38866],[-60.1831,-16.29905],[-60.26001,-15.14637],[-60.49072,-14.09396],[-60.94116,-13.63531],[-61.85303,-13.5926],[-63.58887,-12.56529],[-64.22058,-12.55992],[-65.20386,-11.8996],[-65.4126,-9.74154],[-66.82983,-10.1203],[-68.17566,-10.92501],[-70.6366,-11.18379],[-70.6366,-9.62783],[-71.42761,-9.97426],[-72.74597,-9.88769],[-73.97644,-7.10634],[-72.70752,-4.67498],[-70.15869,-4.23686],[-69.67529,-1.03266],[-70.19714,1.75205],[-67.56042,1.83989],[-66.94519,0.69761],[-63.78113,1.83989],[-64.84131,4.36832],[-63.25378,3.59566],[-60.24353,5.20584],[-60.03479,4.98698],[-59.57886,3.81493],[-59.89746,3.26118],[-60.05676,2.76199],[-59.9469,2.2626],[-59.77661,2.23515],[-59.77661,1.75754],[-58.64502,1.55987],[-55.87647,2.61384],[-53.10791,2.35041],[-51.56433,4.29711]]]}},df_br:{id:"df_br",type:"Feature",properties:{},geometry:{type:"Polygon",coordinates:[[[-48.20114,-15.49868],[-47.42111,-15.5],[-47.38953,-15.56484],[-47.32361,-15.58865],[-47.33047,-15.63891],[-47.31125,-15.73278],[-47.36755,-15.83189],[-47.3703,-15.927],[-47.36893,-15.99698],[-47.30988,-16.04317],[-48.27805,-16.04713],[-48.24921,-15.94152],[-48.2753,-15.93096],[-48.29041,-15.83189],[-48.22998,-15.77772],[-48.21899,-15.71163],[-48.24097,-15.70898],[-48.23547,-15.66535],[-48.22449,-15.63097],[-48.20251,-15.62568],[-48.20114,-15.49868]]]}},rs_br:{id:"rs_br",type:"Feature",properties:{},geometry:{type:"Polygon",coordinates:[[[-50.56791,-28.32331],[-49.64837,-28.40599],[-49.62152,-28.67722],[-49.82288,-28.81257],[-49.86986,-29.14725],[-49.40674,-29.43409],[-50.66187,-31.5221],[-51.51429,-32.07544],[-52.0244,-32.51232],[-52.32644,-33.22264],[-53.199,-34.04411],[-53.65541,-33.63156],[-53.50103,-32.61414],[-55.57503,-31.01726],[-56.0113,-31.18392],[-56.20595,-30.78112],[-56.93084,-30.18535],[-57.2463,-30.36505],[-57.57519,-30.33029],[-57.71614,-30.18535],[-57.40068,-29.91811],[-57.23959,-29.67347],[-56.02473,-28.4178],[-55.70255,-28.08671],[-54.40043,-27.2008],[-53.38022,-26.97372],[-51.97071,-27.23661],[-51.03103,-27.74271],[-50.56791,-28.32331]]]}},chile:{type:"Feature",id:"chile",properties:{},geometry:{type:"MultiPolygon",coordinates:[[[[-110,-28],[-110,-26],[-109,-26],[-109,-28],[-110,-28]],[[-69.46999,-17.50394],[-69.67049,-17.66692],[-69.80164,-17.65253],[-69.83047,-17.71337],[-69.82704,-17.75196],[-69.80919,-17.8023],[-69.75494,-17.98135],[-69.82018,-18.1191],[-69.86618,-18.17325],[-69.96918,-18.26065],[-70.19165,-18.33106],[-72.5,-18.3],[-78,-53],[-68,-58],[-65.80412,-55.20392],[-67.30412,-54.90395],[-68.60412,-54.90395],[-68.60412,-52.65417],[-68.42212,-52.39063],[-68.42268,-52.33665],[-68.57786,-52.32931],[-68.58833,-52.31016],[-68.84205,-52.28181],[-69.19421,-52.15445],[-69.49016,-52.15561],[-70.00412,-52.00423],[-71.92097,-52.00391],[-71.95221,-51.97896],[-72.04212,-51.96756],[-71.93324,-51.91854],[-72.03255,-51.8118],[-72.32412,-51.60426],[-72.34531,-50.65403],[-73.32687,-50.52827],[-73.51742,-49.89065],[-72.98733,-48.99351],[-72.68005,-48.89271],[-72.53174,-48.77746],[-72.56195,-48.50569],[-72.24472,-48.34986],[-72.46788,-47.7451],[-72.0504,-47.34557],[-71.87325,-47.12505],[-71.9426,-46.81204],[-71.64974,-46.68289],[-71.82037,-46.1256],[-71.64459,-46.00936],[-71.75291,-45.55168],[-71.47104,-45.49829],[-71.54383,-45.40436],[-71.3895,-45.35287],[-71.33354,-45.28286],[-71.41148,-45.19486],[-71.56494,-44.98326],[-72.03323,-44.88409],[-72.03495,-44.76989],[-71.24908,-44.80425],[-71.07056,-44.47985],[-71.81213,-44.30714],[-71.58417,-43.64303],[-71.8856,-43.45765],[-71.72596,-43.19066],[-72.14344,-42.90363],[-72.04765,-42.54322],[-72.04182,-42.40546],[-72.17194,-42.14686],[-71.73051,-42.11516],[-71.92612,-40.72332],[-71.80252,-40.42081],[-71.70639,-40.425],[-71.66794,-40.30571],[-71.77643,-40.268],[-71.39465,-38.92843],[-70.90816,-38.67251],[-71.189,-37.74167],[-71.04858,-36.49087],[-70.95932,-36.50246],[-70.37876,-36.04743],[-70.43884,-35.32549],[-70.58441,-35.27646],[-70.53875,-35.20551],[-70.3791,-35.17241],[-69.87854,-34.15614],[-69.8703,-33.57458],[-69.78207,-33.33282],[-69.86721,-33.28663],[-69.99561,-33.3268],[-70.08453,-33.03716],[-70.3125,-32.12562],[-70.22736,-31.93934],[-70.46185,-31.84548],[-70.53102,-31.3724],[-70.07904,-30.38828],[-69.88678,-30.35747],[-69.81262,-30.14869],[-69.93347,-30.10118],[-69.94308,-29.24087],[-68.78609,-27.10803],[-68.56567,-27.17525],[-68.25256,-26.96492],[-68.57666,-26.49147],[-68.5437,-26.27987],[-68.37067,-26.17639],[-68.48328,-25.15399],[-68.32397,-25.09928],[-68.5437,-24.79047],[-68.46405,-24.62829],[-68.24432,-24.39338],[-67.32216,-24.03768],[-66.98639,-23.00012],[-67.17728,-22.81416],[-67.55768,-22.89642],[-67.81586,-22.86099],[-68.19489,-21.27018],[-68.405,-20.93964],[-68.53546,-20.8524],[-68.47504,-20.64949],[-68.72772,-20.46948],[-68.73322,-20.38454],[-68.67279,-20.34591],[-68.76549,-20.08237],[-68.56842,-20.05658],[-68.52997,-19.85262],[-68.68309,-19.72793],[-68.40225,-19.41091],[-68.92548,-18.97253],[-69.11087,-18.1328],[-69.06143,-18.06231],[-69.29352,-17.96698],[-69.30931,-17.9121],[-69.30794,-17.83956],[-69.34708,-17.7343],[-69.47205,-17.61065],[-69.46999,-17.50394]]]]}},bogota:{type:"Feature",id:"bogota",properties:{},geometry:{type:"Polygon",coordinates:[[[-74.38,4.7],[-74.17,5],[-73.75,5],[-73.9,4.37],[-74.25,4.31],[-74.38,4.7]]]}},colombia:{type:"Feature",id:"colombia",properties:{},geometry:{type:"Polygon",coordinates:[[[-75.8,11.8],[-71.3,12.7],[-70.9,11.9],[-71.98242,11.65762],[-72.2406,11.14607],[-72.45483,11.10295],[-72.8833,10.43379],[-72.94922,9.83898],[-73.31177,9.20514],[-72.99866,9.29189],[-72.94373,9.09125],[-72.76245,9.12379],[-72.65259,8.61633],[-72.39716,8.36098],[-72.34497,8.00484],[-72.4054,8.04563],[-72.49054,7.945],[-72.4411,7.89875],[-72.45209,7.53676],[-72.43835,7.40605],[-72.18567,7.38426],[-72.14996,7.32161],[-72.18018,7.24532],[-72.03461,7.0273],[-71.12,7.02457],[-71.09528,6.98641],[-70.9964,6.98641],[-70.77942,7.09817],[-70.5542,7.07636],[-70.30701,6.93461],[-70.11475,6.98095],[-69.43016,6.10778],[-69.34914,6.13987],[-69.31,6.0873],[-69.23378,6.08047],[-69.17404,6.15011],[-69.03877,6.22384],[-68.66455,6.14055],[-67.80762,6.288],[-67.45056,6.21155],[-67.47803,6.10232],[-67.40662,6.00946],[-67.60437,5.7909],[-67.63184,5.4629],[-67.82959,5.31524],[-67.79114,4.28068],[-67.62085,3.74915],[-67.5,3.78204],[-67.29126,3.36537],[-67.86255,2.82234],[-67.58789,2.79491],[-67.1759,2.33395],[-66.85181,1.23037],[-67.08801,1.16172],[-67.16766,1.83989],[-67.34894,1.97715],[-67.36816,2.22417],[-67.44781,2.21868],[-67.56866,2.054],[-67.80487,1.98813],[-67.91199,1.81793],[-68.18939,2.01009],[-68.2663,1.85087],[-68.16193,1.73008],[-69.83459,1.71361],[-69.8291,1.08209],[-69.19739,1.06561],[-69.15344,0.62621],[-69.48303,0.73057],[-69.79065,0.58776],[-70.02686,0.57128],[-70.04059,-0.19226],[-69.60937,-0.50262],[-69.55719,-0.65367],[-69.61212,-0.7498],[-69.41986,-1.03541],[-69.40338,-1.37041],[-69.9321,-4.21974],[-69.94995,-4.23275],[-70.06531,-4.08071],[-70.1841,-3.93893],[-70.28641,-3.82246],[-70.35027,-3.80054],[-70.50613,-3.87796],[-70.71075,-3.793],[-70.04883,-2.75102],[-70.8783,-2.23241],[-71.41113,-2.37786],[-71.75171,-2.19124],[-72.36694,-2.48762],[-72.63336,-2.36688],[-72.67456,-2.4595],[-72.93274,-2.4492],[-73.1813,-2.22692],[-73.10028,-2.0842],[-73.14697,-1.79597],[-73.55347,-1.69439],[-73.47382,-1.55437],[-73.64136,-1.26607],[-73.85834,-1.22763],[-74.27582,-0.97774],[-74.42139,-0.51086],[-74.79492,-0.23621],[-75.20142,-0.06592],[-75.27832,-0.12909],[-75.80566,0.04669],[-76.09955,0.32959],[-76.32751,0.42572],[-76.40991,0.37903],[-76.41266,0.23621],[-76.96198,0.27191],[-77.11029,0.36529],[-77.53601,0.40649],[-77.48383,0.65093],[-77.69257,0.73606],[-77.66441,0.81296],[-77.7166,0.85141],[-77.74544,0.83562],[-77.77565,0.83974],[-77.80861,0.82738],[-77.8196,0.80678],[-77.96173,0.82257],[-78.19794,0.94478],[-78.19931,0.99284],[-78.28308,1.05325],[-78.2515,1.08346],[-78.31741,1.19193],[-78.43002,1.1425],[-78.55499,1.2496],[-78.61816,1.24685],[-80,2.5],[-77.7,7.7],[-77.55524,7.51498],[-77.32178,7.87971],[-77.17896,7.93956],[-77.5,8.5],[-75.8,11.8]]]}},"Universidad-de-Antioquia":{type:"Feature",id:"Universidad-de-Antioquia",properties:{},geometry:{type:"Polygon",coordinates:[[[-75.58594,6.45251],[-75.54185,6.4482],[-75.49945,6.43541],[-75.46038,6.41465],[-75.42614,6.38671],[-75.39805,6.35267],[-75.37719,6.31384],[-75.36435,6.2717],[-75.36003,6.22789],[-75.36438,6.18407],[-75.37726,6.14195],[-75.39814,6.10313],[-75.42624,6.06911],[-75.46047,6.04119],[-75.49952,6.02044],[-75.54188,6.00767],[-75.58594,6.00336],[-75.62999,6.00767],[-75.67236,6.02044],[-75.7114,6.04119],[-75.74563,6.06911],[-75.77373,6.10313],[-75.79462,6.14195],[-75.80749,6.18407],[-75.81185,6.22789],[-75.80753,6.2717],[-75.79469,6.31384],[-75.77382,6.35267],[-75.74573,6.38671],[-75.71149,6.41465],[-75.67242,6.43541],[-75.63003,6.4482],[-75.58594,6.45251]]]}},"Universidad-de-La-Guajira":{type:"Feature",id:"Universidad-de-La-Guajira",properties:{},geometry:{type:"Polygon",coordinates:[[[-72.86133,11.74767],[-72.81658,11.74335],[-72.77355,11.73056],[-72.73391,11.70979],[-72.69917,11.68184],[-72.67067,11.64779],[-72.64951,11.60895],[-72.6365,11.56681],[-72.63213,11.523],[-72.63657,11.47919],[-72.64964,11.43707],[-72.67084,11.39826],[-72.69935,11.36424],[-72.73408,11.33633],[-72.77368,11.31559],[-72.81665,11.30282],[-72.86133,11.29851],[-72.90601,11.30282],[-72.94897,11.31559],[-72.98858,11.33633],[-73.0233,11.36424],[-73.05182,11.39826],[-73.07302,11.43707],[-73.08609,11.47919],[-73.09053,11.523],[-73.08616,11.56681],[-73.07314,11.60895],[-73.05198,11.64779],[-73.02349,11.68184],[-72.98875,11.70979],[-72.9491,11.73056],[-72.90608,11.74335],[-72.86133,11.74767]]]}},"Universidad-de-Los-Andes":{type:"Feature",id:"Universidad-de-Los-Andes",properties:{},geometry:{type:"Polygon",coordinates:[[[-74.0918,4.79005],[-74.04783,4.78574],[-74.00556,4.77295],[-73.9666,4.75219],[-73.93245,4.72426],[-73.90444,4.69022],[-73.88363,4.65139],[-73.87082,4.60925],[-73.8665,4.56544],[-73.87085,4.52163],[-73.88368,4.4795],[-73.9045,4.44068],[-73.93253,4.40665],[-73.96666,4.37873],[-74.00561,4.35798],[-74.04786,4.34521],[-74.0918,4.34089],[-74.13574,4.34521],[-74.17799,4.35798],[-74.21693,4.37873],[-74.25107,4.40665],[-74.27909,4.44068],[-74.29992,4.4795],[-74.31275,4.52163],[-74.31709,4.56544],[-74.31278,4.60925],[-74.29997,4.65139],[-74.27915,4.69022],[-74.25114,4.72426],[-74.217,4.75219],[-74.17804,4.77295],[-74.13576,4.78574],[-74.0918,4.79005]]]}},"Universidad-de-San-Buenaventura":{type:"Feature",id:"Universidad-de-San-Buenaventura",properties:{},geometry:{type:"Polygon",coordinates:[[[-75.58594,6.45251],[-75.54185,6.4482],[-75.49945,6.43541],[-75.46038,6.41465],[-75.42614,6.38671],[-75.39805,6.35267],[-75.37719,6.31384],[-75.36435,6.2717],[-75.36003,6.22789],[-75.36438,6.18407],[-75.37726,6.14195],[-75.39814,6.10313],[-75.42624,6.06911],[-75.46047,6.04119],[-75.49952,6.02044],[-75.54188,6.00767],[-75.58594,6.00336],[-75.62999,6.00767],[-75.67236,6.02044],[-75.7114,6.04119],[-75.74563,6.06911],[-75.77373,6.10313],[-75.79462,6.14195],[-75.80749,6.18407],[-75.81185,6.22789],[-75.80753,6.2717],[-75.79469,6.31384],[-75.77382,6.35267],[-75.74573,6.38671],[-75.71149,6.41465],[-75.67242,6.43541],[-75.63003,6.4482],[-75.58594,6.45251]]]}},"Universidad-Distrital-Francisco-Jose-de-Caldas":{type:"Feature",id:"Universidad-Distrital-Francisco-Jose-de-Caldas",properties:{},geometry:{type:"Polygon",coordinates:[[[-74.0918,4.87766],[-74.04782,4.87334],[-74.00554,4.86056],[-73.96658,4.8398],[-73.93243,4.81186],[-73.90442,4.77782],[-73.8836,4.73899],[-73.87079,4.69686],[-73.86648,4.65304],[-73.87082,4.60923],[-73.88365,4.56711],[-73.90448,4.52829],[-73.93251,4.49426],[-73.96665,4.46634],[-74.0056,4.44559],[-74.04785,4.43281],[-74.0918,4.4285],[-74.13574,4.43281],[-74.178,4.44559],[-74.21695,4.46634],[-74.25109,4.49426],[-74.27911,4.52829],[-74.29994,4.56711],[-74.31278,4.60923],[-74.31712,4.65304],[-74.3128,4.69686],[-74.29999,4.73899],[-74.27918,4.77782],[-74.25116,4.81186],[-74.21701,4.8398],[-74.17805,4.86056],[-74.13577,4.87334],[-74.0918,4.87766]]]}},"Universidad-Nacional-de-Colombia":{type:"Feature",id:"Universidad-Nacional-de-Colombia",properties:{},geometry:{type:"Polygon",coordinates:[[[-74.0918,4.87766],[-74.04782,4.87334],[-74.00554,4.86056],[-73.96658,4.8398],[-73.93243,4.81186],[-73.90442,4.77782],[-73.8836,4.73899],[-73.87079,4.69686],[-73.86648,4.65304],[-73.87082,4.60923],[-73.88365,4.56711],[-73.90448,4.52829],[-73.93251,4.49426],[-73.96665,4.46634],[-74.0056,4.44559],[-74.04785,4.43281],[-74.0918,4.4285],[-74.13574,4.43281],[-74.178,4.44559],[-74.21695,4.46634],[-74.25109,4.49426],[-74.27911,4.52829],[-74.29994,4.56711],[-74.31278,4.60923],[-74.31712,4.65304],[-74.3128,4.69686],[-74.29999,4.73899],[-74.27918,4.77782],[-74.25116,4.81186],[-74.21701,4.8398],[-74.17805,4.86056],[-74.13577,4.87334],[-74.0918,4.87766]]]}},ecuador:{type:"Feature",id:"ecuador",properties:{},geometry:{type:"Polygon",coordinates:[[[-82,-3],[-80,2.2],[-77.86079,0.80404],[-77.72072,0.85484],[-77.66287,0.81794],[-77.66424,0.80884],[-77.67385,0.80215],[-77.67729,0.79099],[-77.66184,0.78979],[-77.68587,0.77365],[-77.6972,0.74241],[-77.67523,0.73778],[-77.5573,0.65058],[-77.47353,0.6626],[-77.52159,0.44837],[-76.47583,0.20874],[-76.32202,0.4422],[-76.0199,0.30487],[-75.81665,0.09064],[-75.26733,-0.1181],[-75.31265,-0.16617],[-75.50629,-0.21698],[-75.22888,-0.56441],[-75.20279,-0.97362],[-75.28931,-0.99147],[-75.36072,-0.95027],[-75.64087,-1.62576],[-76.63376,-2.59052],[-77.84637,-3],[-78.2872,-3.42158],[-79.01917,-5.01844],[-79.24301,-4.96581],[-79.62753,-4.42656],[-79.79233,-4.48954],[-80.12535,-4.29784],[-80.36018,-4.49775],[-80.44584,-4.45086],[-80.44739,-4.37692],[-80.33409,-4.21841],[-80.45013,-4.20968],[-80.44928,-4.13024],[-80.48035,-4.09445],[-80.47297,-4.05079],[-80.44739,-3.99719],[-80.39915,-3.98281],[-80.29701,-4.01843],[-80.12878,-3.89718],[-80.16106,-3.86704],[-80.19264,-3.60256],[-80.21633,-3.582],[-80.20706,-3.54705],[-80.21745,-3.5],[-80.22878,-3.50181],[-80.2335,-3.4899],[-80.2456,-3.48759],[-80.24545,-3.48481],[-80.24416,-3.48461],[-80.24386,-3.48247],[-80.24313,-3.48142],[-80.24393,-3.47881],[-80.24079,-3.47723],[-80.2438,-3.46463],[-80.22217,-3.44047],[-80.25238,-3.41],[-82,-3]]]}},paraguay:{type:"Feature",id:"paraguay",properties:{},geometry:{type:"Polygon",coordinates:[[[-54.25873,-24.35961],[-54.58403,-25.58921],[-54.65681,-25.67588],[-54.67916,-25.99493],[-54.61857,-26.20862],[-54.78678,-26.6308],[-55.42267,-26.99497],[-55.60553,-27.1621],[-55.73675,-27.44486],[-55.78857,-27.44309],[-55.89775,-27.34371],[-55.97809,-27.35591],[-56.06259,-27.30569],[-56.29415,-27.41973],[-56.37473,-27.58873],[-56.601,-27.42072],[-56.84909,-27.606],[-56.96547,-27.50172],[-57.48737,-27.44388],[-57.87465,-27.27496],[-58.59888,-27.29953],[-58.64896,-27.12631],[-58.31974,-26.8579],[-58.18979,-26.64487],[-58.22086,-26.41372],[-58.08456,-26.11154],[-57.89095,-25.96589],[-57.74047,-25.65014],[-57.55483,-25.44809],[-57.76072,-25.17162],[-58.2415,-24.9277],[-58.67226,-24.83161],[-59.3538,-24.4779],[-59.47537,-24.3323],[-60.03924,-24.01125],[-60.37336,-24.02369],[-60.98973,-23.81777],[-61.08807,-23.61362],[-61.73595,-23.234],[-62.20654,-22.70386],[-62.30073,-22.48627],[-62.64387,-22.24906],[-62.26072,-21.05983],[-62.26622,-20.56305],[-61.92152,-20.08915],[-61.73647,-19.63289],[-59.97488,-19.29332],[-59.06988,-19.28619],[-58.20814,-19.80515],[-57.83186,-20.9842],[-57.92507,-21.63334],[-57.88113,-21.68734],[-57.90602,-21.71294],[-57.97194,-22.07832],[-56.81013,-22.27099],[-56.56363,-22.20044],[-56.49462,-22.08659],[-56.39677,-22.07641],[-56.26631,-22.24811],[-56.01774,-22.29259],[-55.8526,-22.28227],[-55.78935,-22.38413],[-55.74034,-22.38913],[-55.75132,-22.47989],[-55.7472,-22.50653],[-55.72347,-22.5514],[-55.69845,-22.56298],[-55.69365,-22.57788],[-55.62361,-22.62986],[-55.38191,-24.00601],[-54.65973,-23.82806],[-54.31366,-24.01762],[-54.25873,-24.35961]]]}},peru:{type:"Feature",id:"peru",properties:{},geometry:{type:"Polygon",coordinates:[[[-83,-3],[-80.25238,-3.41],[-80.22217,-3.44047],[-80.2438,-3.46463],[-80.24079,-3.47723],[-80.24393,-3.47881],[-80.24313,-3.48142],[-80.24386,-3.48247],[-80.24416,-3.48461],[-80.24545,-3.48481],[-80.2456,-3.48759],[-80.2335,-3.4899],[-80.22878,-3.50181],[-80.21745,-3.5001],[-80.20706,-3.54705],[-80.21633,-3.582],[-80.19264,-3.60256],[-80.16106,-3.86704],[-80.12878,-3.89718],[-80.29701,-4.01843],[-80.39915,-3.98281],[-80.44739,-3.99719],[-80.47297,-4.05079],[-80.48035,-4.09445],[-80.44928,-4.13024],[-80.45013,-4.20968],[-80.33409,-4.21841],[-80.44739,-4.37692],[-80.44584,-4.45086],[-80.36018,-4.49775],[-80.12535,-4.29784],[-79.79233,-4.48954],[-79.62753,-4.42656],[-79.24301,-4.96581],[-79.01917,-5.01844],[-78.2872,-3.42158],[-77.84637,-3],[-76.63376,-2.59052],[-75.64087,-1.62576],[-75.36072,-0.95027],[-75.56534,-0.13806],[-75.15884,-0.06665],[-74.40628,-0.55553],[-72.92862,-2.39505],[-70.9552,-2.25162],[-70.02686,-2.70987],[-70.70595,-3.78478],[-70.49789,-3.88142],[-70.32349,-3.8088],[-69.95819,-4.23211],[-69.94446,-4.29784],[-69.99802,-4.37316],[-70.10376,-4.29164],[-70.19028,-4.35946],[-71.82999,-4.5662],[-72.86133,-5.25507],[-73.94348,-7.4932],[-72.19116,-9.95803],[-70.61188,-9.57638],[-70.62149,-10.96681],[-69.57161,-10.94557],[-68.65494,-12.49629],[-69.01886,-13.62196],[-68.83896,-14.22445],[-69.38141,-14.86251],[-69.14795,-15.24444],[-69.39926,-15.6151],[-69.19189,-16.17449],[-69.10177,-16.22555],[-68.96152,-16.19456],[-68.78952,-16.34254],[-68.98865,-16.42357],[-69.04015,-16.57368],[-69.01886,-16.65198],[-69.61075,-17.26542],[-69.46896,-17.37423],[-69.46827,-17.49919],[-69.66654,-17.66071],[-69.81262,-17.67281],[-69.75,-18],[-70,-18.27],[-75,-19],[-83,-3]]]}},latam:{type:"Feature",id:"latam",properties:{},geometry:{type:"Polygon",coordinates:[[[-123,14],[-117.45574,32.58935],[-117.23326,32.52453],[-116.43813,32.58992],[-115.96571,32.62752],[-115.48953,32.66395],[-114.71211,32.7179],[-114.7455,32.65614],[-114.79837,32.6067],[-114.81091,32.49615],[-111.06611,31.33282],[-109.5397,31.33311],[-108.86816,31.33165],[-108.2131,31.33135],[-108.21447,31.78655],[-106.52962,31.78363],[-106.51966,31.77225],[-106.50867,31.76116],[-106.4867,31.74715],[-106.4716,31.75123],[-106.46851,31.75912],[-106.45409,31.76554],[-106.43898,31.75678],[-106.41426,31.75007],[-106.37959,31.7305],[-106.37409,31.71269],[-106.35075,31.69575],[-106.33289,31.65835],[-106.30543,31.6224],[-106.28002,31.56186],[-106.24741,31.54314],[-106.21101,31.47347],[-106.17805,31.45766],[-106.14956,31.43335],[-106.00502,31.38881],[-105.76607,31.16816],[-105.38292,30.84683],[-104.9121,30.63644],[-104.67293,29.91804],[-104.39415,29.56151],[-103.20921,28.98742],[-102.4182,29.81056],[-101.4514,29.77242],[-100.96779,29.34866],[-100.9005,29.31454],[-100.69725,29.14257],[-100.62309,28.91322],[-100.51598,28.749],[-100.51186,28.70474],[-100.50293,28.66227],[-100.40337,28.58271],[-100.01472,28.06956],[-99.53957,27.59837],[-99.53339,27.57859],[-99.51279,27.5655],[-99.52103,27.55607],[-99.52824,27.49731],[-99.5018,27.50066],[-99.48601,27.49426],[-99.47777,27.48299],[-99.48498,27.4635],[-99.49596,27.44857],[-99.48669,27.39067],[-99.53476,27.31321],[-99.44344,27.25951],[-99.45717,27.03222],[-99.07127,26.42692],[-98.9978,26.39248],[-98.46771,26.21028],[-98.25966,26.09194],[-98.08388,26.05061],[-97.95067,26.06172],[-97.79205,26.05185],[-97.57919,25.95002],[-97.51328,25.89073],[-97.46315,25.87899],[-97.41783,25.83821],[-97.34367,25.92594],[-97,26],[-81,24],[-73.5,20.5],[-64,20],[-29,0],[-29,-20],[-63,-51],[-62,-57],[-72,-57],[-113,-30],[-123,14]]]}}};
24693
24694         var resources = {"bw-facebook":{id:"bw-facebook",type:"facebook",featureId:"botswana",countryCodes:["bw"],languageCodes:["en","tn"],name:"Mapping Botswana on Facebook",description:"Page of OpenStreetMap in Botswana",url:"https://www.facebook.com/MappingBotswana/",contacts:[{name:"info@openstreetmap.org.bw",email:"info@openstreetmap.org.bw"}]},"bw-twitter":{id:"bw-twitter",type:"twitter",featureId:"botswana",countryCodes:["bw"],languageCodes:["en","tn"],name:"Mapping Botswana on Twitter",description:"Twitter of OpenStreetMap in Botswana",url:"https://twitter.com/mappingbotswana",contacts:[{name:"info@openstreetmap.org.bw",email:"info@openstreetmap.org.bw"}]},"ym-Centre-Universitaire-de-Recherche-et-dApplication-en-Tldtection-CURAT-de-lUniversit-Felix-Houphouet-Boigny":{type:"youthmappers",name:"YouthMappers CURAT",description:"YouthMappers chapter at Centre Universitaire de Recherche et d'Application en Télédétection (CURAT) de l'Université Felix Houphouet Boigny",id:"ym-Centre-Universitaire-de-Recherche-et-dApplication-en-Tldtection-CURAT-de-lUniversit-Felix-Houphouet-Boigny",featureId:"Centre-Universitaire-de-Recherche-et-dApplication-en-Tldtection-CURAT-de-lUniversit-Felix-Houphouet-Boigny",contacts:[{name:"Organizer",email:"gpcome@gmail.com"}],extendedDescription:"Our chapter aim is to promote the use of collaborative free mapping and the use of openstreetmap data in the field of research and their application in the implementation of tools for decision-making. Help students produce their own data of their research.",countryCodes:["ci"],url:"mailto:gpcome@gmail.com"},"ym-The-Gambia-YMCA-University-of-the-Gambia":{type:"youthmappers",name:"Connected YouthMappers",description:"YouthMappers chapter at The Gambia YMCA / University of the Gambia",id:"ym-The-Gambia-YMCA-University-of-the-Gambia",featureId:"The-Gambia-YMCA-University-of-the-Gambia",contacts:[{name:"Organizer",email:"connectedyouthmappers@gmail.com"}],extendedDescription:"Connected YouthMappers is comprised of dedicated young Gambians who aspire to change and aid national development.",countryCodes:["gm"],url:"mailto:connectedyouthmappers@gmail.com"},"cape-coast-youthmappers":{id:"cape-coast-youthmappers",featureId:"cape_coast_gh",type:"twitter",name:"University of Cape Coast YouthMappers",countryCodes:["gh"],languageCodes:["en"],description:"Follow us on Twitter: {url}",extendedDescription:"This is the official handle for the Youth Mappers chapter of the University of Cape Coast, Ghana. we love maps, open data and helping the vulnerable.",url:"https://twitter.com/YouthmappersUCC",contacts:[{name:"Enock Seth Nyamador",email:"kwadzo459@gmail.com"}]},"osm-gh-facebook":{id:"osm-gh-facebook",featureId:"ghana",type:"facebook",name:"OpenStreetMap Ghana on Facebook",countryCodes:["gh"],languageCodes:["en"],description:"Facebook group for people interested in OpenStreetMap.",extendedDescription:"Mappers in Ghana community, promoting OpenStreetMap and Humanitarian OpenStreetMap Team (HOT) projects in Ghana. Join us.",url:"https://www.facebook.com/OSMGhana/",contacts:[{name:"Enock Seth Nyamador",email:"kwadzo459@gmail.com"}]},"osm-gh-twitter":{id:"osm-gh-twitter",featureId:"ghana",type:"twitter",name:"OpenStreetMap Ghana on Twitter",countryCodes:["gh"],languageCodes:["en"],description:"Follow us on Twitter: {url}",url:"https://twitter.com/osmghana",contacts:[{name:"Enock Seth Nyamador",email:"kwadzo459@gmail.com"}]},"talk-gh":{id:"talk-gh",featureId:"ghana",type:"mailinglist",name:"Talk-gh Mailing List",countryCodes:["gh"],languageCodes:["en"],description:"Talk-gh is the official mailing list for Ghana OSM community.",url:"https://lists.openstreetmap.org/listinfo/talk-gh",contacts:[{name:"Enock Seth Nyamador",email:"kwadzo459@gmail.com"}]},"ym-Kwame-Nkrumah-University-of-Science-and-Technology":{type:"youthmappers",name:"Kwame Nkrumah University of Science and Technology YouthMappers",description:"YouthMappers chapter at Kwame Nkrumah University of Science and Technology",id:"ym-Kwame-Nkrumah-University-of-Science-and-Technology",featureId:"Kwame-Nkrumah-University-of-Science-and-Technology",contacts:[{name:"Organizer",email:"knustyouthmappers@outlook.com"}],countryCodes:["gh"],url:"https://www.facebook.com/KNUSTMappers/"},"ym-University-of-Cape-Coast":{type:"youthmappers",name:"UCC Geographical Society",description:"YouthMappers chapter at University of Cape Coast",id:"ym-University-of-Cape-Coast",featureId:"University-of-Cape-Coast",contacts:[{name:"Organizer",email:"geosoc_ucc@yahoo.com"}],extendedDescription:"We are a society that encompasses all students who are reading and read geography in the Department of Geography and Regional Planning at the University of Cape Coast. Our main aim is to promote interest in the discipline inside and outside of the classroom. Our motto is “We comprehend the Earth and its inhabitants.”",countryCodes:["gh"],url:"https://www.facebook.com/Geographical-Society-Ucc-105157196204838/info/?tab=page_info"},"ym-University-of-Energy-and-Natural-Resources":{type:"youthmappers",name:"Eco-Club",description:"YouthMappers chapter at University of Energy and Natural Resources",id:"ym-University-of-Energy-and-Natural-Resources",featureId:"University-of-Energy-and-Natural-Resources",contacts:[{name:"Organizer",email:"james.agyei-ohemeng@uenr.edu.gh"}],extendedDescription:"To provide a sound education to all citizens about the deteriorating environment and provide utmost use of recreation of the environment for human survival.",countryCodes:["gh"],url:"mailto:james.agyei-ohemeng@uenr.edu.gh"},"ym-University-of-Ghana":{type:"youthmappers",name:"University of Ghana YouthMappers",description:"YouthMappers chapter at University of Ghana",id:"ym-University-of-Ghana",featureId:"University-of-Ghana",contacts:[{name:"Organizer",email:"mawulikaf@gmail.com"}],extendedDescription:"UG YouthMappers consists of both graduate and undergraduate students possessing knowledge and skills in GIS and Remote Sensing. The club is composed of an energetic team that is poised to address social issues and mitigate environmental problems through mapping. Our fundamental principles are capacity building, empowerment and teamwork.",countryCodes:["gh"],url:"https://twitter.com/UGYouthMappers"},"ym-University-of-Mines-and-Technology":{type:"youthmappers",name:"UMaT YouthMappers",description:"YouthMappers chapter at University of Mines and Technology",id:"ym-University-of-Mines-and-Technology",featureId:"University-of-Mines-and-Technology",contacts:[{name:"Organizer",email:"kwadzo459@gmail.com"}],extendedDescription:"UMaT YouthMappers is a group of volunteer students who seek to grant students the opportunity to improve skills in the field of mapping & creating open geographic data and analyses that address locally defined development challenges worldwide.",countryCodes:["gh"],url:"http://umatyouthmappers.wordpress.com/"},"ym-General-Lansana-Conte-University":{type:"youthmappers",name:"YouthMappers General Lansana Conte University",description:"YouthMappers chapter at General Lansana Conte University",id:"ym-General-Lansana-Conte-University",featureId:"General-Lansana-Conte-University",contacts:[{name:"Organizer",email:"condefa3@gmail.com"}],extendedDescription:"The YouthMappers of the University General Lansana Conté is a non profit community willing to contribute to Map Guinea and others part of the world. We are promoting the use of GIS and Open data to build decision support tools. We also work to build capacities among the students and local communities.",countryCodes:["gn"],url:"www.uglc.org"},"ym-Institute-of-Science-and-Veterinary-Medicine":{type:"youthmappers",name:"YouthMappers ISSMV Dalaba",description:"YouthMappers chapter at Institute of Science and Veterinary Medicine",id:"ym-Institute-of-Science-and-Veterinary-Medicine",featureId:"Institute-of-Science-and-Veterinary-Medicine",contacts:[{name:"Organizer",email:"bvloua45@gmail.com"}],extendedDescription:"YouthMappers ISSMV Dabala is a non profit organisation working to promote humanitarian mapping and the use of open sources and open data to build decision making tools in Guinea.",countryCodes:["gn"],url:"mailto:bvloua45@gmail.com"},"ym-Universit-de-NZrkor":{type:"youthmappers",name:"Youthmappers à N'Zérékoré",description:"YouthMappers chapter at Université de N'Zérékoré",id:"ym-Universit-de-NZrkor",featureId:"Universit-de-NZrkor",contacts:[{name:"Organizer",email:"donpaul1974@gmail.com"}],extendedDescription:"YouthMappers est un groupe qui permet de faire la cartographie des communautés enclavées et à la prise des décisions en cas de catastrophes ou épidémies. Elle permet aussi la production et l'utilisation des données en accès gratuit.",countryCodes:["gn"],url:"mailto:donpaul1974@gmail.com"},"ym-Dedan-Kimathi-University-of-Technology":{type:"youthmappers",name:"GDEV",description:"YouthMappers chapter at Dedan Kimathi University of Technology",id:"ym-Dedan-Kimathi-University-of-Technology",featureId:"Dedan-Kimathi-University-of-Technology",contacts:[{name:"Organizer",email:"gdevkenya@gmail.com"}],extendedDescription:"GDEV is a group of enthusiastic GIS group at DeKUT that aims at helping students share, engage and learn from each other in matters geospatial",countryCodes:["ke"],url:"https://plus.google.com/u/0/communities/102367719061492681269/stream/e376a295-1246-4e19-9f66-fa6077719f32"},"ym-Jomo-Kenyatta-University-of-Agriculture-and-Technology":{type:"youthmappers",name:"Association of Geomatics Engineering Students",description:"YouthMappers chapter at Jomo Kenyatta University of Agriculture and Technology",id:"ym-Jomo-Kenyatta-University-of-Agriculture-and-Technology",featureId:"Jomo-Kenyatta-University-of-Agriculture-and-Technology",contacts:[{name:"Organizer",email:"laurahmugeha36@gmail.com"}],extendedDescription:"The Association of Geomatics Engineering Students (AGES), aims at promoting GIS products and services as well as training students on the use of the same. It not only promotes socialization between the students and practicing professionals, but also provides a platform for exchanging new ideas for holding new GIS and surveying events and training at the university.",countryCodes:["ke"],url:"mailto:laurahmugeha36@gmail.com"},"ym-Karatina-University":{type:"youthmappers",name:"Nature Club Karatina University",description:"YouthMappers chapter at Karatina University",id:"ym-Karatina-University",featureId:"Karatina-University",contacts:[{name:"Organizer",email:"karunatureclub@gmail.com"}],extendedDescription:"This chapter aims to bring together all GIS enthusiasts.They include environment experts, wildlife experts, aquatic and tourism officers, just to mention a few. Its main aim is to provide a platform where students can learn from each other and, in the process, understand how to integrate the GIS skills in their various career paths as well as provide solutions to various environmental related challenges.",countryCodes:["ke"],url:"https://twitter.com/karunature"},"ym-Kenyatta-University":{type:"youthmappers",name:"Kenyatta University GIS Club",description:"YouthMappers chapter at Kenyatta University",id:"ym-Kenyatta-University",featureId:"Kenyatta-University",contacts:[{name:"Organizer",email:"jamesmagige24@gmail.com"}],extendedDescription:"Kenyatta University GIS Club (KUGISC) was founded on 28th October 2016, with more than 200 students and staff from all faculty within campus as members. We are committed to empower members with spatial knowledge, skills and expertise required in understanding the Earth. We help in mapping resources within the university by incorporating geospatial data in their projects as well as fieldwork data collection.",countryCodes:["ke"],url:"mailto:jamesmagige24@gmail.com"},"ym-Moi-University":{type:"youthmappers",name:"Geography Students Association",description:"YouthMappers chapter at Moi University",id:"ym-Moi-University",featureId:"Moi-University",contacts:[{name:"Organizer",email:"geosamu44@gmail.com"}],extendedDescription:"The Geography Students Association at Moi University (GEOSAMU) explores, discovers and aims at developing the entire world through the young Geo-Spatial analysts.  GEOSAMU is part of the Department of Geography.",countryCodes:["ke"],url:"mailto:geosamu44@gmail.com?subject=YouthMappers%20at%20Moi%20University"},"ym-Technical-University-of-Kenya":{type:"youthmappers",name:"Geospatial Science Student Association",description:"YouthMappers chapter at Technical University of Kenya",id:"ym-Technical-University-of-Kenya",featureId:"Technical-University-of-Kenya",contacts:[{name:"Organizer",email:"youthmappers.tuk@gmail.com"}],extendedDescription:"It's a geographical information based group with very passionate students in the relevant fields of study. We do training to members on emerging trends in the market and keep up with technological advancements",countryCodes:["ke"],url:"mailto:youthmappers.tuk@gmail.com"},"ym-University-of-Nairobi":{type:"youthmappers",name:"Geospatial Engineering Students Association",description:"YouthMappers chapter at University of Nairobi",id:"ym-University-of-Nairobi",featureId:"University-of-Nairobi",contacts:[{name:"Organizer",email:"contact@mapkibera.org"}],extendedDescription:"UN students are working with the local OSM community, Map Kibera, and GrouthTruth to learn about open mapping and contribute data for needs in their urban communities.",countryCodes:["ke"],url:"www.geospatial.uonbi.ac.ke"},"ym-African-Methodist-Episcopal-University":{type:"youthmappers",name:"YouthMappers-AMEU",description:"YouthMappers chapter at African Methodist Episcopal University",id:"ym-African-Methodist-Episcopal-University",featureId:"African-Methodist-Episcopal-University",contacts:[{name:"Organizer",email:"youthmapper.ameu@gmail.com"}],countryCodes:["lr"],url:"mailto:youthmapper.ameu@gmail.com"},"ym-Cuttington-University":{type:"youthmappers",name:"Cuttington University YouthMappers",description:"YouthMappers chapter at Cuttington University",id:"ym-Cuttington-University",featureId:"Cuttington-University",contacts:[{name:"Organizer",email:"youthmappers.cu@gmail.com"}],extendedDescription:"The YouthMappers at Cuttington University, Suakoko, and Bong County comprised of Students from three different departments; namely, the Department of Natural Resources Management “DONRM”, Department of Environmental Sciences, and the Department of Natural Sciences. Since the establishment of the Chapter in February 2017, the overall membership is  20 students, with each department containing 5 students.",countryCodes:["lr"],url:"mailto:youthmappers.cu@gmail.com"},"ym-Grand-Gedeh-County-Community-College":{type:"youthmappers",name:"YouthMappers at Grand Gedeh County Community College",description:"YouthMappers chapter at Grand Gedeh County Community College",id:"ym-Grand-Gedeh-County-Community-College",featureId:"Grand-Gedeh-County-Community-College",contacts:[{name:"Organizer",email:"yimodaxzibitallison@gmail.com"}],extendedDescription:"The Youth Mappers of GGCCC sole intent is to put  places in and around Liberia  that are not on the map. We gather youths from the college within the Grand Gedeh Community College to make it their duties to unite and bring these places to the spot light geographically.",countryCodes:["lr"],url:"mailto:yimodaxzibitallison@gmail.com"},"ym-Nimba-County-Community-College":{type:"youthmappers",name:"Nimba County Community College Youth Mappers",description:"YouthMappers chapter at Nimba County Community College",id:"ym-Nimba-County-Community-College",featureId:"Nimba-County-Community-College",contacts:[{name:"Organizer",email:"ncccyouthmappers@yahoo.com"}],countryCodes:["lr"],url:"mailto:ncccyouthmappers@yahoo.com"},"ym-Stella-Maris-Polytechnic":{type:"youthmappers",name:"YouthMappers-SMP",description:"YouthMappers chapter at Stella Maris Polytechnic",id:"ym-Stella-Maris-Polytechnic",featureId:"Stella-Maris-Polytechnic",contacts:[{name:"Organizer",email:"youthmappers.smp@gmail.com"}],countryCodes:["lr"],url:"mailto:youthmappers.smp@gmail.com"},"ym-University-of-Liberia-YouthMappers":{type:"youthmappers",name:"University of Liberia YouthMappers",description:"YouthMappers chapter at University of Liberia YouthMappers",id:"ym-University-of-Liberia-YouthMappers",featureId:"University-of-Liberia-YouthMappers",contacts:[{name:"Organizer",email:"ulym2017@gmail.com"}],extendedDescription:"The University of Liberia YouthMappers is a chapter organization of the Global YouthMappers. We are a nonprofit student mapping organization focus on mapping for Liberia’s development and the World at large. The purpose of this organization shall be to utilize technology and geospatial knowledge as means of creating and developing maps; collecting and analyzing data that will address local and worldwide challenges. Our aim is to support and create opportunity for students to develop interest and skills in the fields of mapping. We envision a united student community that are collaborative, active and are willing to work with the University of Liberia YouthMappers in order to better the lives of others.",countryCodes:["lr"],url:"mailto:ulym2017@gmail.com"},"osm-mg-facebook":{id:"osm-mg-facebook",featureId:"madagascar",type:"facebook",name:"OpenStreetMap Madagascar Facebook Group",countryCodes:["mg"],languageCodes:["mg","fr"],description:"Malagasy Facebook group for people interested in OpenStreetMap.",url:"https://www.facebook.com/groups/1601381123461284/",contacts:[{name:"Brice Ramamonjy",email:"rafaby21@gmail.com"},{name:"Dolly Andriatsiferana",email:"privatemajory@gmail.com"}]},"talk-mg":{id:"talk-mg",featureId:"madagascar",type:"mailinglist",countryCodes:["mg"],languageCodes:["mg","fr"],name:"Talk-mg Mailing List",description:"Place for OpenStreetMap contributors, communities and users in Madagascar to share and discuss.",url:"https://lists.openstreetmap.org/listinfo/talk-mg",contacts:[{name:"Brice Ramamonjy",email:"rafaby21@gmail.com"},{name:"Dolly Andriatsiferana",email:"privatemajory@gmail.com"}]},"ym-University-of-Malawi":{type:"youthmappers",name:"Chanco Malawi YouthMappers",description:"YouthMappers chapter at University of Malawi",id:"ym-University-of-Malawi",featureId:"University-of-Malawi",contacts:[{name:"Organizer",email:"zolamanyungwa@gmail.com"}],extendedDescription:"Chanco Malawi YouthMappers is the student mapping organization for the University of Malawi's Chancellor College. The students in this chapter focus on mapping for Malawi's development and science needs.",countryCodes:["mw"],url:"mailto:zolamanyungwa@gmail.com"},"ym-Universit-des-Sciences-Sociale-et-de-Gestion-de-Bamako":{type:"youthmappers",name:"Etudiant au Laboratoire HoPE",description:"YouthMappers chapter at Université des Sciences Sociale et de Gestion de Bamako",id:"ym-Universit-des-Sciences-Sociale-et-de-Gestion-de-Bamako",featureId:"Universit-des-Sciences-Sociale-et-de-Gestion-de-Bamako",contacts:[{name:"Organizer",email:"youthmappersfhg@gmail.com"}],countryCodes:["ml"],url:"mailto:youthmappersfhg@gmail.com"},"ym-Universidade-Eduardo-Mondlane":{type:"youthmappers",name:"Comunidade YouthMappers Moçambique",description:"YouthMappers chapter at Universidade Eduardo Mondlane",id:"ym-Universidade-Eduardo-Mondlane",featureId:"Universidade-Eduardo-Mondlane",contacts:[{name:"Organizer",email:"moz.youthmappers1@hotmail.com"}],extendedDescription:"We are a student group that intends to join Mozambican society to create a resilient community of humanitarian mapping. The community intend to map the physical occupation of our Country and create open geographic data, accessible to the public and able to be used in several areas without associated costs.",countryCodes:["mz"],url:"www.facebook.com/Moz-YouthMappers"},"ym-Namibia-University-of-Science-and-Technology":{type:"youthmappers",name:"Geoinformation Technology Student Society",description:"YouthMappers chapter at Namibia University of Science and Technology",id:"ym-Namibia-University-of-Science-and-Technology",featureId:"Namibia-University-of-Science-and-Technology",contacts:[{name:"Organizer",email:"patriciasem87@gmail.com"}],countryCodes:["na"],url:"mailto:patriciasem87@gmail.com"},"ym-Abia-State-University":{type:"youthmappers",name:"AbsuMappersTeam",description:"YouthMappers chapter at Abia State University",id:"ym-Abia-State-University",featureId:"Abia-State-University",contacts:[{name:"Organizer",email:"absumappersteam@gmail.com"}],extendedDescription:"AbsuMappersTeam is  voluntary team of map enthusiast ,using openstreetmap,GIS and other open source geospatial techno;ogy to solve problems.It is a dedicated for disaster response using OpenStreetMap.It is a  professional mentoring  and empowerment platform for  those with passion for GIS and Mapping.It is a community of  volunteers for geospatial data creation,field data collection and mapping.The team was co-founded by Victor N.Sunday(the Team mentor) and Professor J.U.Ogbonna ,the team coordinator and faculty Advisor. AbsuMapperTeam is an affiliate of UniiqueMappersTeam-Port Harcourt.The team stands to support sustainable development using geospatial  technology",countryCodes:["ng"],url:"https://www.facebook.com/Absumappersteam-1709186109157466"},"ym-Ahmadu-Bello-University":{type:"youthmappers",name:"ABU Geomappers",description:"YouthMappers chapter at Ahmadu Bello University",id:"ym-Ahmadu-Bello-University",featureId:"Ahmadu-Bello-University",contacts:[{name:"Organizer",email:"abugeomappers@gmail.com"}],extendedDescription:"We are a group of Data driven Humanitarian mappers, who are dedicated to rendering humanitarian service in response to disaster and mitigation. We are glad to contribute our expertise and knowledge through mapping, and helping to spread #OpenEvangelism through Training, and collaboration.",countryCodes:["ng"],url:"https://web.facebook.com/abugeomappers/"},"ym-Federal-School-of-Surveys":{type:"youthmappers",name:"OyoMappersTeam (OMT) Oyo",description:"YouthMappers chapter at Federal School of Surveys",id:"ym-Federal-School-of-Surveys",featureId:"Federal-School-of-Surveys",contacts:[{name:"Organizer",email:"oyomappersteam@gmail.com"}],countryCodes:["ng"],url:"https://web.facebook.com/Oyomappersteam-omt-oyo-1432864713415765/"},"ym-Federal-University-of-Technology-Akure":{type:"youthmappers",name:"YouthMappers Futa Space Club",description:"YouthMappers chapter at Federal University of Technology, Akure",id:"ym-Federal-University-of-Technology-Akure",featureId:"Federal-University-of-Technology-Akure",contacts:[{name:"Organizer",email:"denironyx@gmail.com"}],extendedDescription:"Our mission is to raise the next generation of Space Leaders. Activities include research and capacity building in Remote Sensing, GIS, Climate Change, Astronomy, Cosmology, Space Engineering, Global Navigation, Robotics and Space Education.",countryCodes:["ng"],url:"http://spaceclubfuta.com.ng/"},"ym-Ignatius-Ajuru-University-of-Education":{type:"youthmappers",name:"IgnatiusMappersTeam (IMT)",description:"YouthMappers chapter at Ignatius Ajuru University of Education",id:"ym-Ignatius-Ajuru-University-of-Education",featureId:"Ignatius-Ajuru-University-of-Education",contacts:[{name:"Organizer",email:"ignatiusmappersteam@gmail.com"}],extendedDescription:"We are a YouthMappers Chapter of Ignatius Ajuru University of Education involved in crowdsourced mapping of our environment and remote mapping of resilient communities.We are a team of volunteers using openstreetmap and other open Geospatial source for mapping.",countryCodes:["ng"],url:"https://fb.me/ignatiusmappersteam"},"ym-University-of-Nigeria-Nsukka":{type:"youthmappers",name:"LionMappersTeam (LMT) Nsukka",description:"YouthMappers chapter at University of Nigeria, Nsukka",id:"ym-University-of-Nigeria-Nsukka",featureId:"University-of-Nigeria-Nsukka",contacts:[{name:"Organizer",email:"lionmappersteam@gmail.com"}],extendedDescription:"The LionMappersTeam is an affiliate of YouthMappers Network, with the sole aim of providing members the opportunity to learn and improve their skills in the field of mapping science and to create open geographic data and analysis that addresses locally defined challenges globally. It is a team of volunteers for crowdsourced mapping and geographic information provision using Openstreetmap, citizen science  and other geospatial  technology for research, training and response to resilient community challenges. We are involved in GIS and Remote Sensing Applications and Research.Paticipatory GIS and Citizen Science,field mapping ,training workshops and outreaches to High Schools.",countryCodes:["ng"],url:"http://fb.me/LionMappersTeamNsukka;and send messages to our Page at m.me/LionMappersTeamNsukka"},"ym-University-of-Port-Harcourt":{type:"youthmappers",name:"UniqueMappersTeam (UMT) Port Harcourt",description:"YouthMappers chapter at University of Port Harcourt",id:"ym-University-of-Port-Harcourt",featureId:"University-of-Port-Harcourt",contacts:[{name:"Organizer",email:"victor.sunday@uniport.edu.ng"}],extendedDescription:"UniqueMappersTeam(UMT)Port Harcourt  is an action group and a team of volunteers for a collaborative online mapping targeted at training and empowering members with trending mapping skills  to create open geospatial data and analysis that addresses locally defined challenges for geoinformation and to provide humanitarian mapping  services to resilient communities in Niger Delta,Nigeria and elsewhere.We promote Crowdsoucred Mapping and Geographic information volunteering using OpenStreetMap(OSM) platform and other accessible platforms for Rapid Response Mapping,Disaster Mapping,Geo-intelligence Mapping,Map updates and training.Its an affiliate Campus chapter of Humanitarian OpenStreetMap Team(HOT).It is a project-task team of YouthMappers that provide opportunity for members to learn and improve their skills in Geoinformatics so as to explore global opportunities in the field of Mapping and Geoinformation.",countryCodes:["ng"],url:"https://web.facebook.com/uniquemappersteamportharcourt/"},"ym-University-of-Nigeria-Enugu-Campus":{type:"youthmappers",name:"LionMappersTeam (LMT) Enugu",description:"YouthMappers chapter at University of Nigeria, Enugu Campus",id:"ym-University-of-Nigeria-Enugu-Campus",featureId:"University-of-Nigeria-Enugu-Campus",contacts:[{name:"Organizer",email:"lmtenugucampus@gmail.com"}],extendedDescription:"The LionMappersTeam(LMT)Enugu Campus is an affiliate of YouthMappers Network, with the sole aim of providing members the opportunity to learn and improve their skills in the field of Geoinformatics and to create open geographic data and analysis that addresses locally defined challenges globally. It is a team of volunteers for Crowdsourced Mapping and Geographic Information provision using Openstreetmap, Citizen Science and other Geospatial Technology for research, training and response to resilient community challenges. We are involved in Web-Cartography, GIS and Remote Sensing Applications and ResearchWe are passionate about Volunteered Geographic Information.Paticipatory GIS and Citizen Science.Our major activities include online crowdsourced-Cartography, Field Mapping ,Training workshops and outreaches to High School as well as Humanitarian/Disaster Response Mapping.",countryCodes:["ng"],url:"https://web.facebook.com/Lionmappersteam-enugu-Campus-361221567667528/"},"ym-Insititue-d-Enseignement-Superieur-de-Ruhengeri":{type:"youthmappers",name:"YouthMappers at INES Ruhengeri",description:"YouthMappers chapter at Insititue d' Enseignement Superieur de Ruhengeri",id:"ym-Insititue-d-Enseignement-Superieur-de-Ruhengeri",featureId:"Insititue-d-Enseignement-Superieur-de-Ruhengeri",contacts:[{name:"Organizer",email:"dufitesaie91@yahoo.com"}],extendedDescription:"We are students from Land Administration and Management and Land survey Departments from INES-Ruhengeri. We are engaged in mapping activities that create the changes toward sustainable development in our community.",countryCodes:["rw"],url:"www.ines.ac.rw"},"ym-University-of-Rwanda-Huye-Campus":{type:"youthmappers",name:"Rwanda YouthMappers",description:"YouthMappers chapter at University of Rwanda - Huye Campus",id:"ym-University-of-Rwanda-Huye-Campus",featureId:"University-of-Rwanda-Huye-Campus",contacts:[{name:"Organizer",email:"erneruz@gmail.com"}],extendedDescription:"Based on the commitment and the purpose of promoting mapping, and the information from YouthMappers public talks, we have organized as students in Geography department who are committed in mapping to found a chapter of our Campus. We have supported by our Facilitator Dr. Gaspard Rwanyiziri (Director of CGIS-Rwanda) and various lecturer mentors.",countryCodes:["rw"],url:"https://www.facebook.com/Rwanda-YouthMappers"},"ym-Institut-Suprieur-de-Management-Kolda":{type:"youthmappers",name:"Les Femmes Leaders de ISM/Kolda",description:"YouthMappers chapter at Institut Supérieur de Management Kolda",id:"ym-Institut-Suprieur-de-Management-Kolda",featureId:"Institut-Suprieur-de-Management-Kolda",contacts:[{name:"Organizer",email:"koldaym@gmail.com"}],extendedDescription:"Les Femmes Leaders de ISM/Kolda is an all-female mapping group in southern Senegal looking to put Kolda and surrounding villages on the map and better understand how to use OSM.",countryCodes:["sn"],url:"mailto:koldaym@gmail.com"},"ym-Universit-Gaston-Berger":{type:"youthmappers",name:"YouthMappers at UGB",description:"YouthMappers chapter at Université Gaston Berger",id:"ym-Universit-Gaston-Berger",featureId:"Universit-Gaston-Berger",contacts:[{name:"Organizer",email:"youthmappers.ugb@gmail.com"}],extendedDescription:"YouthMappers UGB is made up of young students and researchers who are passionate about mapping. Our aim is to improve students' skills in the field of cartography and to participate in the creation of open geographic data that responds to development challenges around the world and particularly in Africa.",countryCodes:["sn"],url:"https://web.facebook.com/youthmappersugb/"},"ym-Fourah-Bay-College":{type:"youthmappers",name:"Student's Geographical Association",description:"YouthMappers chapter at Fourah Bay College",id:"ym-Fourah-Bay-College",featureId:"Fourah-Bay-College",contacts:[{name:"Organizer",email:"sgayouthmappers@gmail.com"}],extendedDescription:"The Student's Geographical Association- YouthMappers is an association of Fourah Bay College Students with the common goals of mapping out vulnerable places in Sierra Leone and the world at large for relief and other beneficial purposes,carry out Research and other educative endeavors. The chapter consists of young people with great ideas, development oriented with the capacity to relate with each other, comprehend and implement sustainable developmental projects as a team.",countryCodes:["sl"],url:"mailto:sgayouthmappers@gmail.com?subject=YouthMappers%20at%20Fourah%20Bay%20College"},"ym-Njala-University-Freetown-Campus":{type:"youthmappers",name:"Njala Freetown YouthMappers",description:"YouthMappers chapter at Njala University, Freetown Campus",id:"ym-Njala-University-Freetown-Campus",featureId:"Njala-University-Freetown-Campus",contacts:[{name:"Organizer",email:"njalafreetownmappers@gmail.com"}],extendedDescription:"We are students of Njala University Freetown Campus, studying Information Technology under the department of Physics and Computer Science. and we are located at Henry Street Freetown, Sierra Leone.",countryCodes:["sl"],url:"mailto:Njalafreetownmappers@gmail.com"},"ym-Njala-University-Njala-Campus":{type:"youthmappers",name:"YouthMappers Njala University, Njala Campus",description:"YouthMappers chapter at Njala University, Njala Campus",id:"ym-Njala-University-Njala-Campus",featureId:"Njala-University-Njala-Campus",contacts:[{name:"Organizer",email:"youthmappersnu2017@gmail.com"}],countryCodes:["sl"],url:"mailto:youthmappersnu2017@gmail.com"},"ym-University-of-Pretoria":{type:"youthmappers",name:"Centre for Geoinformation Science",description:"YouthMappers chapter at University of Pretoria",id:"ym-University-of-Pretoria",featureId:"University-of-Pretoria",contacts:[{name:"Organizer",email:"cgis-info@kendy.up.ac.za"}],extendedDescription:"The students who map Pretoria are supported by the University of Pretoria's Centre for Geoinformation Science, a platform from where the excellence of UP individuals and teams involved in geographic information science (GISc) research, education and training, professional development and community engagement is encouraged and strengthened through collaborations, education and training and  alliances within South Africa and abroad.",countryCodes:["za"],url:"http://www.up.ac.za/cgis"},"ym-Ardhi-University":{type:"youthmappers",name:"ARU Mapper",description:"YouthMappers chapter at Ardhi University",id:"ym-Ardhi-University",featureId:"Ardhi-University",contacts:[{name:"Organizer",email:"bayonakennedy@gmail.com"}],extendedDescription:"As upcoming geospatial data consultants we seek to educate and provide advice to the society on how they can use spatial data not only as a form of location but a tool of decision making and predict different hazardous and climatical changes which may harm them or future genarations.",countryCodes:["tz"],url:"mailto:bayonakennedy@gmail.com"},"ym-Institute-of-Finance-Management":{type:"youthmappers",name:"IFM mappers",description:"YouthMappers chapter at Institute of Finance Management",id:"ym-Institute-of-Finance-Management",featureId:"Institute-of-Finance-Management",contacts:[{name:"Organizer",email:"supermalik95@gmail.com"}],extendedDescription:"This is a new  chapter at out institute and we are looking forward to use our financial education that we are receiving here at the campus  and link ig with the environment in order to develop our sustainable environment towards helping the community  with the effects of our environment in a financial ways by converting them into numbers. this is widely explained in ecosystem accounting and environmental accounts",countryCodes:["tz"],url:"mailto:supermalik95@gmail.com"},"ym-Institute-of-Rural-Development-Planning-Mwanza":{type:"youthmappers",name:"Youth Mappers Chapter at Institute of Rural Development Planning - Lake Zone Centre",description:"YouthMappers chapter at Institute of Rural Development Planning Mwanza",id:"ym-Institute-of-Rural-Development-Planning-Mwanza",featureId:"Institute-of-Rural-Development-Planning-Mwanza",contacts:[{name:"Organizer",email:"shabanimagawila@gmail.com"}],countryCodes:["tz"],url:"www.facebook.com/IYMLZC/"},"ym-Institute-of-Rural-Development-Planning":{type:"youthmappers",name:"Mipango YouthMappers Chapter",description:"YouthMappers chapter at Institute of Rural Development Planning",id:"ym-Institute-of-Rural-Development-Planning",featureId:"Institute-of-Rural-Development-Planning",contacts:[{name:"Organizer",email:"msmapperschapter@gmail.com"}],extendedDescription:"Mipango YouthMappers Chapter was introduced at IRDP on 3rd July, 2017 by Dr.Domitilla Bashemera. The founding members were  300 (190 males and 110 female) Bachelor Degree students, who were registered as members of the Chapter. Gerald Zacharia is the president of the chapter and Juster Lugira is Vice President.",countryCodes:["tz"],url:"mailto:msmapperschapter@gmail.com"},"ym-Open-University-of-Tanzania":{type:"youthmappers",name:"Youth Mappers at Open University of Tanzania",description:"YouthMappers chapter at Open University of Tanzania",id:"ym-Open-University-of-Tanzania",featureId:"Open-University-of-Tanzania",contacts:[{name:"Organizer",email:"youthmapout@gmail.com"}],extendedDescription:"Youth Mappers at Open University of Tanzania\n\nHad been founded by members and students of Open University of Tanzania in Department of Geography who are mainly need to improve their career and help young community through joint and partnership projects with local community groups such as Mikoko Scout Group (www.msg.or.tz) and start cooperation with international colleges and universities for exchange programs in relation to Geography Studies as some programs prepared by Mikoko Scout Group which will link local university and other universities of the same interest through International Nature & Environmental Youth Camp 2019 (www.campsite.msg.or.tz/nature.html )\n\nOur chapter will soon be recognized as youth network program that will open opportunity for students to study and conduct research studies at a local levels.",countryCodes:["tz"],url:"mailto:youthmapout@gmail.com"},"ym-Sokoine-University-of-Agriculture":{type:"youthmappers",name:"SMCoSE YouthMappers",description:"YouthMappers chapter at Sokoine University of Agriculture",id:"ym-Sokoine-University-of-Agriculture",featureId:"Sokoine-University-of-Agriculture",contacts:[{name:"Organizer",email:"smcoseyouthmappers@gmail.com"}],extendedDescription:"A Chapter comprising of Environmental sciences and management students and Geography studies under the dept. of Geography and  we will be using mapping techniques, based on systems concepts and theories, can be used to facilitate, explore, and capture the different understandings of the relationships, perspectives, and boundaries involved in environmental sustainability to obtain a more complete comprehension of the concept and develop plans for action.",countryCodes:["tz"],url:"mailto:SMCoSEyouthmappers@gmail.com"},"ym-University-of-Dar-es-Salaam":{type:"youthmappers",name:"YouthMappers at University of Dar es Salaam",description:"YouthMappers chapter at University of Dar es Salaam",id:"ym-University-of-Dar-es-Salaam",featureId:"University-of-Dar-es-Salaam",contacts:[{name:"Organizer",email:"godluckur@gmail.com"}],extendedDescription:"The purpose of the University of Dar es Salaam YouthMappers  is to use and promote open source data and GIS technologies to map potential disaster areas, provide resources for emergency management, connect its members with open source and GIS organizations in the city of Dar es Salaam, and serve any upcoming needs of our project partners .",countryCodes:["tz"],url:"https://www.facebook.com/UDSMYouthMappers/"},"ym-Busitema-University":{type:"youthmappers",name:"Good Mappers",description:"YouthMappers chapter at Busitema University",id:"ym-Busitema-University",featureId:"Busitema-University",contacts:[{name:"Organizer",email:"mulindwasteven82@gmail.com"}],extendedDescription:"Good mappers is a team of students in Busitema University. Its main objective is to create a community of experienced mappers who can contribute to the world map.",countryCodes:["ug"],url:"https://m.facebook.com/HOTBusitemaUniv/"},"ym-Gulu-University":{type:"youthmappers",name:"CSGU Mappers",description:"YouthMappers chapter at Gulu University",id:"ym-Gulu-University",featureId:"Gulu-University",contacts:[{name:"Organizer",email:"git445@gmail.com"}],extendedDescription:"The CSGU Mappers are the Computing Society at Gulu University. This chapter is creative, passionate, innovative and ready to map Uganda and the world at large, beyond other people's imagination.",countryCodes:["ug"],url:"mailto:git445@gmail.com?subject=YouthMappers%20at%20Gulu%20University"},"ym-Kumi-University":{type:"youthmappers",name:"Ever Last YouthMappers",description:"YouthMappers chapter at Kumi University",id:"ym-Kumi-University",featureId:"Kumi-University",contacts:[{name:"Organizer",email:"kumiuniversityeverlastyouthmap@gmail.com"}],extendedDescription:"This energetic group of students organizes within the faculty of Science and Information Technology.",countryCodes:["ug"],url:"mailto:kumiuniversityeverlastyouthmap@gmail.com?subject=YouthMappers%20at%20Kumi%20University"},"ym-Makerere-University":{type:"youthmappers",name:"Geo YouthMappers",description:"YouthMappers chapter at Makerere University",id:"ym-Makerere-University",featureId:"Makerere-University",contacts:[{name:"Organizer",email:"geo-youthmappers@googlegroups.com"}],extendedDescription:"Geo YouthMappers is a Makerere University based mapping chapter esteemed to apply the spatial conception to the real world.We have collaborated on various mapping events with OSM. Our main aim is the desire to simplify data and make it readily available mostly for disaster preparedness.\"We map the world and change lives.",countryCodes:["ug"],url:"https://www.facebook.com/groups/1742657446017065/"},"ym-Mbarara-University-of-Science-and-Technology":{type:"youthmappers",name:"MUST Street Mappers",description:"YouthMappers chapter at Mbarara University of Science and Technology",id:"ym-Mbarara-University-of-Science-and-Technology",featureId:"Mbarara-University-of-Science-and-Technology",contacts:[{name:"Organizer",email:"muststreetmappers@gmail.com"}],extendedDescription:"MUST Street Mappers is a Youth Mappers chapter at the Mbarara University of Science and Technology that is based on making our country and the world at large a better place through mapping. We base on collected information to notice patterns and data mine to present relevant and beneficial information to society.",countryCodes:["ug"],url:"https://web.facebook.com/muststreetmappers/"},"ym-St.-Augustine-International-University":{type:"youthmappers",name:"YouthMappers at St Augustine International University",description:"YouthMappers chapter at St. Augustine International University",id:"ym-St.-Augustine-International-University",featureId:"St.-Augustine-International-University",contacts:[{name:"Organizer",email:"youthmapperssaiu@gmail.com"}],countryCodes:["ng"],url:"mailto:youthmapperssaiu@gmail.com"},"ym-Uganda-Christian-University-Mbale-Campus":{type:"youthmappers",name:"Mappers for Life",description:"YouthMappers chapter at Uganda Christian University Mbale Campus",id:"ym-Uganda-Christian-University-Mbale-Campus",featureId:"Uganda-Christian-University-Mbale-Campus",contacts:[{name:"Organizer",email:"munhilll@gmail.com"}],extendedDescription:"We are Team Mappers for life! Please come and join us as we map together!\" This group works from the Department of Information Technology at the UCU.",countryCodes:["ug"],url:"mailto:munhilll@gmail.com?subject=YouthMappers%20and%20the%20Uganda%20Christian%20University%20Mappers%20for%20Life"},"ym-Uganda-Pentecostal-University":{type:"youthmappers",name:"HiTech Youth Mappers",description:"YouthMappers chapter at Uganda Pentecostal University",id:"ym-Uganda-Pentecostal-University",featureId:"Uganda-Pentecostal-University",contacts:[{name:"Organizer",email:"hitechyouthmappers@gmail.com"}],extendedDescription:"A new Youthmappers Chapter in Western Uganda. Ready to map and provide open data with OpenStreetMap for development purposes.",countryCodes:["ug"],url:"mailto:hitechyouthmappers@gmail.com"},"ym-St.-Mawaggali-Trades-Training-Institute":{type:"youthmappers",name:"MawaggaliMappers",description:"YouthMappers chapter at St. Mawaggali Trades Training Institute",id:"ym-St.-Mawaggali-Trades-Training-Institute",featureId:"St.-Mawaggali-Trades-Training-Institute",contacts:[{name:"Organizer",email:"mawaggalimappers@gmail.com"}],extendedDescription:"We are the youthappers chapter at St. Mawaggali trades in choma who are want to contribute the different humantarian tasks to serve lives through mapping.",countryCodes:["zm"],url:"mailto:mawaggalimappers@gmail.com"},"ym-The-University-of-Zambia":{type:"youthmappers",name:"YouthMappers Unza",description:"YouthMappers chapter at The University of Zambia",id:"ym-The-University-of-Zambia",featureId:"The-University-of-Zambia",contacts:[{name:"Organizer",email:"chombachishala13@gmail.com"}],countryCodes:["zm"],url:"https://www.facebook.com/search/posts/?q=youth%20mappers%20unza"},"ym-University-of-Zimbabwe":{type:"youthmappers",name:"UZMappers",description:"YouthMappers chapter at University of Zimbabwe",id:"ym-University-of-Zimbabwe",featureId:"University-of-Zimbabwe",contacts:[{name:"Organizer",email:"uzmappersteam@gmail.com"}],extendedDescription:"UzMappersTeam Zimbabwe is a team of Volunteers using OpenStreetMap for Open Data Mapping and Humanitarian Disaster response mapping .The team empowers its members with open source geospatial technology skills.",countryCodes:["zw"],url:"https://www.facebook.com/Uzmappersteam-Zimbabwe-246038666256392/"},"OSM-BGD-facebook":{id:"OSM-BGD-facebook",featureId:"BGD",type:"facebook",name:"OpenStreetMap Bangladesh",description:"Improve OpenStreetMap in Bangladesh",extendedDescription:"Mapping in Bangladesh? Have questions, want to connect with the community here? Join us at {url}. All are welcome!",url:"https://www.facebook.com/groups/osmbd/",contacts:[{name:"Ahasanul Hoque",email:"hoque.ahasan@gmail.com"}]},"ym-Asian-University-for-Women":{type:"youthmappers",name:"YouthMappers at AUW",description:"YouthMappers chapter at Asian University for Women",id:"ym-Asian-University-for-Women",featureId:"Asian-University-for-Women",contacts:[{name:"Organizer",email:"harunur.rashid@auw.edu.bd"}],extendedDescription:"The Asian University for Women seeks to graduate women who will be skilled and innovative professionals, service-oriented leaders in the businesses and communities in which they will work and live, and promoters of intercultural understanding and sustainable human and economic development in Asia and throughout the world.",countryCodes:["bd"],url:"http://www.auw.edu.bd/"},"ym-Dhaka-College":{type:"youthmappers",name:"YouthMappers Daka College",description:"YouthMappers chapter at Dhaka College",id:"ym-Dhaka-College",featureId:"Dhaka-College",contacts:[{name:"Organizer",email:"youthmappersdc@gmail.com"}],extendedDescription:"YouthMappers DhakaCollege is an approach by students to help mapping vulnerable areas of the world as a part of Humanitarian Action. YouthMappers  gives the opportunity to the students for helping people and using mapping for humanitarian purposes. This open geographic data can be used for educational, navigational and other humanitarian purposes. Happy mapping.",countryCodes:["bd"],url:"https://www.facebook.com/groups/321220498214124/"},"ym-Dhaka-University":{type:"youthmappers",name:"Openstreetmap YouthMappers",description:"YouthMappers chapter at Dhaka University",id:"ym-Dhaka-University",featureId:"Dhaka-University",contacts:[{name:"Organizer",email:"hoque.ahasan@gmail.com"}],extendedDescription:"It's a great privilege for the students of University of Dhaka to map for humanitarian purposes. Our chapter gives the opportunity to the students for helping people and use mapping for humanitarian purposes.",countryCodes:["bd"],url:"https://www.facebook.com/groups/osmDU/1773150346233538/?notif_t=group_activity&notif_id=1472953820177890"},"ym-Eastern-University":{type:"youthmappers",name:"YouthMappers at Eastern University",description:"YouthMappers chapter at Eastern University",id:"ym-Eastern-University",featureId:"Eastern-University",contacts:[{name:"Organizer",email:"infolimon@gmail.com"}],extendedDescription:"YouthMappers at Eastern University, Bangladesh has been formed with a view to assisting people during humanitarian crisis. The students, likewise other mappers of the world, are promised to assist people in using the map for educational, navigational and other humanitarian purposes.",countryCodes:["bd"],url:"mailto:infolimon@gmail.com"},"ym-Jahangirnagar-University":{type:"youthmappers",name:"YouthMappers at IRS, Jahangirnagar University",description:"YouthMappers chapter at Jahangirnagar University",id:"ym-Jahangirnagar-University",featureId:"Jahangirnagar-University",contacts:[{name:"Organizer",email:"s.t.islam@juniv.edu"}],countryCodes:["bd"],url:"mailto:s.t.islam@juniv.edu"},"ym-Khulna-University":{type:"youthmappers",name:"Openstreetmap",description:"YouthMappers chapter at Khulna University",id:"ym-Khulna-University",featureId:"Khulna-University",contacts:[{name:"Organizer",email:"hoque.ahasan@gmail.com"}],extendedDescription:"KU students and faculty from multiple disciplines are experienced at creating open data for OSM to address local challenges of development, including food security and other topics.",countryCodes:["bd"],url:"https://www.facebook.com/groups/osmku/"},"ym-Rajshahi-University-of-Engineering-Technology":{type:"youthmappers",name:"YouthMappers at RUET",description:"YouthMappers chapter at Rajshahi University of Engineering & Technology",id:"ym-Rajshahi-University-of-Engineering-Technology",featureId:"Rajshahi-University-of-Engineering-Technology",contacts:[{name:"Organizer",email:"ruetmappers@gmail.com"}],extendedDescription:"The \"YouthMappers at RUET\" is a humanitarian mapping group of students of Rajshahi University of Engineering & Technology (RUET) to share, develop and practice the knowledge of GIS.  This group encourages using open source geospatial data and platform to make solution to reach the most vulnerable group of the world.",countryCodes:["bd"],url:"mailto:ruetmappers@gmail.com"},"ym-Sherubtse-College":{type:"youthmappers",name:"Geographical Society",description:"YouthMappers chapter at Sherubtse College",id:"ym-Sherubtse-College",featureId:"Sherubtse-College",contacts:[{name:"Organizer",email:"gsscbhutan@gmail.com"}],extendedDescription:"The Geographical Society, in the Department of Geography & Planning, Sherubtse College, Royal University of Bhutan, with support from the Center for Climate Change and Spatial Information, has made several efforts to create awareness and address important issues at the local and national level. We now join hands with the international student-centered YouthMappers network on \"Mapping for Resilience\" and contributing to a global 'Happiness'!",countryCodes:["bt"],url:"mailto:gsscbhutan@gmail.com?subject=About%20the%20Royal%20University%20of%20Bhutan%20Geographical%20Society%20and%20Youth%20Mappers"},"OSM-India-facebook":{id:"OSM-India-facebook",featureId:"india_full",type:"facebook",name:"OpenStreetMap India - Participatory neighborhood mapping",description:"Improve OpenStreetMap in India",extendedDescription:"Mapping in India? Have questions, want to connect with the community here? Join us at {url}. All are welcome!",url:"https://www.facebook.com/groups/mappingindia/",contacts:[{name:"Jinal Foflia",email:"fofliajinal@gmail.com"},{name:"Arun Ganesh",email:"arun.planemad@gmail.com"}],events:[{id:"sotmasia2018",i18n:true,name:"State of the Map Asia 2018",description:"Join the 2018 OpenStreetMap region-wide event at State of the Map Asia in India",where:"Indian Institute of Management, Bangalore, India",when:"2018-11-17",url:"http://stateofthemap.asia/"}]},"osm-india-forum":{id:"osm-india-forum",featureId:"india_full",type:"forum",countryCodes:["in"],name:"OpenStreetMap India forum",description:"OpenStreetMap India web forum",url:"https://forum.openstreetmap.org/viewforum.php?id=65",contacts:[{name:"OpenStreetMap India",email:"openstreetmapindia@gmail.com"}]},"osm-india-github":{id:"osm-india-github",featureId:"india_full",type:"github",name:"OpenStreetMap India GitHub",description:"Code with us: {url}",url:"https://github.com/osm-in",contacts:[{name:"Naveen Francis",email:"naveenpf@gmail.com"}]},"OSM-india-mailinglist":{id:"OSM-india-mailinglist",featureId:"india_full",type:"mailinglist",name:"OpenStreetMap India Mailinglist",description:"Talk-in is the official Mailinglist for Indian Community",url:"https://lists.openstreetmap.org/listinfo/talk-in",contacts:[{name:"Arun Ganesh",email:"arun.planemad@gmail.com"}]},"osm-india-telegram":{id:"osm-india-telegram",featureId:"india_full",type:"telegram",name:"OpenStreetMap India Telegram",description:"Join our family: {url}",url:"https://t.me/OSMIndia",contacts:[{name:"Naveen Francis",email:"naveenpf@gmail.com"}]},"OSM-india-twitter":{id:"OSM-india-twitter",featureId:"india_full",type:"twitter",name:"OpenStreetMap India Twitter",description:"We are just a tweet away: {url}",url:"https://twitter.com/osm_in",contacts:[{name:"Jinal Foflia",email:"fofliajinal@gmail.com"}]},"osm-india-website":{id:"osm-india-website",featureId:"india_full",type:"osm",name:"OpenStreetMap India",countryCodes:["in"],description:"Mappers and OpenStreetMap users in India",url:"https://openstreetmap.in/",contacts:[{name:" OpenStreetMap India",email:"openstreetmapindia@gmail.com"}]},"osm-india-wiki":{id:"osm-india-wiki",featureId:"india_full",type:"wiki",name:"OpenStreetMap Wikiproject India",description:"Everything you need to know about mapping in India: {url}",url:"https://wiki.openstreetmap.org/wiki/WikiProject_India",contacts:[{name:"Naveen Francis",email:"naveenpf@gmail.com"}]},"osm-india-youtube":{id:"osm-india-youtube",featureId:"india_full",type:"youtube",name:"OpenStreetMap India Youtube",description:"Subscribe to our channel: {url}",url:"https://www.youtube.com/channel/UCu5sKaPU04x0RJkgGkoFORw",contacts:[{name:"Naveen Francis",email:"naveenpf@gmail.com"}]},"OSM-India-Puducherry-Facebook":{id:"OSM-India-Puducherry-Facebook",featureId:"india_puducherry",type:"facebook",name:"Free Software Hardware Movement - Facebook",description:"FSHM Facebook page to know about community events, activities",extendedDescription:"FSHM organizes events relating to free software/hardware, technology, activism and OpenStreetMap. Its FB page is the best way to keep in contact with its events.",url:"https://www.facebook.com/FSHMP",contacts:[{name:"Kamalavelan",email:"sskamalavelan@gmail.com",osm:"demonshreder"},{name:"Prasanna",email:"prasmailme@gmail.com",osm:"Prashere"}]},"OSM-Puducherry-Mailing-List":{id:"OSM-Puducherry-Mailing-List",featureId:"india_puducherry",type:"mailinglist",name:"Free Software Hardware Movement - Mailing List",description:"FSHM Puducherry mailing list to discuss mapping in Puducherry and other things.",extendedDescription:"FSHM organizes events relating to free software/hardware, technology, activism and OpenStreetMap.",url:"https://www.freelists.org/archive/puduvailug/",signupUrl:"https://www.freelists.org/list/puduvailug",contacts:[{name:"Kamalavelan",email:"sskamalavelan@gmail.com",osm:"demonshreder"},{name:"Prasanna",email:"prasmailme@gmail.com",osm:"Prashere"}]},"OSM-India-Puducherry-Matrix":{id:"OSM-India-Puducherry-Matrix",featureId:"india_puducherry",type:"matrix",name:"Free Software Hardware Movement - Matrix",description:"FSHM Riot group to discuss, share and update mapping activities, events in and around Puducherry",extendedDescription:"FSHM community members share their OSM mapping updates / experiences through the Riot.im group, this group is also used to discuss things related to free software / hardware, technology and activism.",url:"https://riot.im/app/#/room/#fshm:matrix.org",contacts:[{name:"Kamalavelan",email:"sskamalavelan@gmail.com",osm:"demonshreder"},{name:"Prasanna",email:"prasmailme@gmail.com",osm:"Prashere"}]},"ym-Gujarat-University":{type:"youthmappers",name:"CCIM at Ahmedabad",description:"YouthMappers chapter at Gujarat University",id:"ym-Gujarat-University",featureId:"Gujarat-University",contacts:[{name:"Organizer",email:"coolmulls@gmail.com"}],countryCodes:["in"],url:"mailto:Coolmulls@gmail.com"},"OSM-IDN-facebook":{id:"OSM-IDN-facebook",featureId:"IDN",type:"facebook",name:"OpenStreetMap Indonesia",description:"Improve OpenStreetMap in Indonesia",extendedDescription:"Mapping in Indonesia? Have questions, want to connect with the community here? Join us at {Url}. All are welcome!",url:"https://www.facebook.com/groups/osm.id/",contacts:[{name:"Yantisa Akhadi",email:"yantisa.akhadi@hotosm.org"}]},"ym-Universitas-Negeri-Makassar":{type:"youthmappers",name:"Kontur Geografi",description:"YouthMappers chapter at Universitas Negeri Makassar",id:"ym-Universitas-Negeri-Makassar",featureId:"Universitas-Negeri-Makassar",contacts:[{name:"Organizer",email:"konturgeografi@gmail.com"}],countryCodes:["in"],url:"https://tentangkontur.blogspot.co.id"},"ym-University-Muhammadiyah-Surakarta":{type:"youthmappers",name:"SpaceTime",description:"YouthMappers chapter at University Muhammadiyah Surakarta",id:"ym-University-Muhammadiyah-Surakarta",featureId:"University-Muhammadiyah-Surakarta",contacts:[{name:"Organizer",email:"spacetime1717@gmail.com"}],extendedDescription:"SpaceTime is a community mapping in the Faculty of Geography of Muhammadiyah University of Surakarta. SpaceTime was founded by Bruce Maldy Pratama, Mukhlis Akbar and Irfandi Fauzi. They are active students in the Faculty of Geography University Muhammadiyah Surakarta.",countryCodes:["in"],url:"mailto:spacetime1717@gmail.com"},"osm-iran-aparat":{id:"osm-iran-aparat",featureId:"iran",type:"aparat",countryCodes:["ir"],languageCodes:["fa"],name:"OpenStreetMap Iran Aparat",description:"Subscribe to our channel at {url}",extendedDescription:"A good resource of videos about anything related to OpenStreetMap. Mainly in Persian.",url:"https://www.aparat.com/osm_iran",contacts:[{name:"Iman",email:"iriman@chmail.ir"}]},"osm-iran-forum":{id:"osm-iran-forum",featureId:"iran",type:"forum",countryCodes:["ir"],languageCodes:["fa"],name:"OpenStreetMap Iran web forum",description:"OpenStreetMap Iran web forum",extendedDescription:"A web forum for OpenStreetMap users in Iran. Feel free to ask questions and discuss with others!",url:"https://forum.openstreetmap.org/viewforum.php?id=103",contacts:[{name:"Iman",email:"iriman@chmail.ir"}]},"osm-iran-telegram":{id:"osm-iran-telegram",featureId:"iran",type:"telegram",countryCodes:["ir"],languageCodes:["fa"],name:"OpenStreetMap Iran Telegram",description:"You're welcome to join our Telegram channel at {url}. We also have a supergroup of many OSMers interested in Iran. Find its link in bio of channel.",url:"https://t.me/openstreetmapir",contacts:[{name:"Iman",email:"iriman@chmail.ir"}]},"OSM-japan-facebook":{id:"OSM-japan-facebook",featureId:"japan",type:"facebook",name:"OpenStreetMap Japan Community",countryCodes:["jp"],languageCodes:["jp"],description:"Mappers and OpenStreetMap users in Japan",url:"https://www.facebook.com/groups/osmjapan/",contacts:[{name:"Satoshi IIDA",email:"nyampire@gmail.com"}]},"OSM-japan-mailinglist":{id:"OSM-japan-mailinglist",featureId:"japan",type:"mailinglist",name:"OpenStreetMap Japan Mailinglist",countryCodes:["jp"],languageCodes:["jp"],description:"Talk-ja is an Official Mailinglist for Japanese Community",url:"https://lists.openstreetmap.org/listinfo/talk-ja",contacts:[{name:"OSMF Japan",email:"info@osmf.jp"}]},"OSM-japan-twitter":{id:"OSM-japan-twitter",featureId:"japan",type:"twitter",name:"OpenStreetMap Japan Twitter",countryCodes:["jp"],languageCodes:["jp"],description:"Hashtag on Twitter: {url}",url:"https://twitter.com/hashtag/osmjp",contacts:[{name:"Satoshi IIDA",email:"nyampire@gmail.com"}]},"OSM-japan-website":{id:"OSM-japan-website",featureId:"japan",type:"group",name:"OpenStreetMap Japan",countryCodes:["jp"],languageCodes:["jp"],description:"Mappers and OpenStreetMap users in Japan",url:"https://openstreetmap.jp/",contacts:[{name:"Satoshi IIDA",email:"nyampire@gmail.com"}]},"OSM-MY-facebook":{id:"OSM-MY-facebook",featureId:"malaysia",type:"facebook",countryCodes:["my"],languageCodes:["ms","en"],name:"OpenStreetMap Malaysia on Facebook",description:"For chat about anything related to OpenStreetMap!",url:"https://www.facebook.com/groups/openstreetmapMY/",contacts:[{name:"Mohd Saidin",email:"projekopenstreetmap@hotmail.com"}]},"OSM-MY-forum":{id:"OSM-MY-forum",featureId:"malaysia",type:"forum",countryCodes:["my"],languageCodes:["ms","en"],name:"OpenStreetMap Malaysia Forum",description:"Official OpenStreetMap Malaysia Forum",url:"https://forum.openstreetmap.org/viewforum.php?id=60",contacts:[{name:"Mohd Saidin",email:"projekopenstreetmap@hotmail.com"}]},"OSM-MY-matrix":{id:"OSM-MY-matrix",featureId:"malaysia",type:"matrix",countryCodes:["my"],languageCodes:["ms","en"],name:"OpenStreetMap Malaysia Riot channel",description:"All mappers are welcome! Sign up at {signupUrl}",signupUrl:"https://riot.im/app/#/register",url:"https://riot.im/app/#/room/#OpenstreetmapMalaysia:matrix.org",contacts:[{name:"Ahmad Amsyar",email:"OfficiallyAhmad@protonmail.ch"}]},"OSM-MNG-facebook":{id:"OSM-MNG-facebook",featureId:"MNG",type:"facebook",name:"OpenStreetMap Mongolia",description:"Improve OpenStreetMap in Mongolia",extendedDescription:"Mapping in Mongolia? Have questions, want to connect with the community here? Join us at {Url}. All are welcome!",url:"https://www.facebook.com/groups/OSM.Mongolia/",contacts:[{name:" ",email:"talk-mn@openstreetmap.org"}]},"OSM-MMR-facebook":{id:"OSM-MMR-facebook",featureId:"MMR",type:"facebook",name:"OpenStreetMap Myanmar",description:"Improve OpenStreetMap in Myanmar",extendedDescription:"Mapping in Myanmar? Have questions, want to connect with the community here? Join us at {Url}. All are welcome!",url:"https://www.facebook.com/groups/osmmm/",contacts:[{name:"Yan Naung Oak",email:"yan@phandeeyar.org"},{name:"Patrick Oswald",email:"patrickoswald.omm@gmail.com"},{name:"Set Khaing Oo",email:"setkhaing@phandeeyar.org"}]},"OSM-Nepal-facebook":{id:"OSM-Nepal-facebook",featureId:"NPL",type:"facebook",name:"OpenStreetMap Nepal",description:"Improve OpenStreetMap in Nepal",extendedDescription:"Mapping in Nepal? Have questions, want to connect with the community here? Join us at {Url}. All are welcome!",url:"https://www.facebook.com/groups/mapkathmandu/",contacts:[{name:"Kshitiz Khanal",email:"khanal1990@gmail.com"}]},"ym-Institute-of-Crisis-Management-Studies":{type:"youthmappers",name:"Institute of Crisis Management Studies YouthMappers",description:"YouthMappers chapter at Institute of Crisis Management Studies",id:"ym-Institute-of-Crisis-Management-Studies",featureId:"Institute-of-Crisis-Management-Studies",contacts:[{name:"Organizer",email:"deepakadhikari@tuicms.edu.np"}],extendedDescription:"To develop Crisis Mappers to assist during disaster situations.",countryCodes:["np"],url:"mailto:deepakadhikari@tuicms.edu.np"},"ym-Kathmandu-University":{type:"youthmappers",name:"Geomatics Engineering Society,GES",description:"YouthMappers chapter at Kathmandu University",id:"ym-Kathmandu-University",featureId:"Kathmandu-University",contacts:[{name:"Organizer",email:"ges@ku.edu.np"}],extendedDescription:"Geomatics Engineering Society (GES) established in 2008 A.D is a departmental club under Department of Civil and Geomatics Engineering (DCGE) at Kathmandu University. GES acts as a platform to develop the skills of students apart from their educational activities by focusing on activities like technical trainings, seminars, talk programs and interaction with experts from related field, sports activities etc.",countryCodes:["np"],url:"ku.edu.np/ges"},"ym-Tribhuvan-University":{type:"youthmappers",name:"Geomatics Engineering Students Association",description:"YouthMappers chapter at Tribhuvan University",id:"ym-Tribhuvan-University",featureId:"Tribhuvan-University",contacts:[{name:"Organizer",email:"gesan.nepal@gmail.com"}],extendedDescription:"This organization is the student forum of Geomatics Engineering students of Tribhuvan University , Institute of Engineering on the Pashchimanchal campus. Established since the beginning of the degree program, students have been active in mapping and leadership and are thrilled to be a part of the YouthMappers network.",countryCodes:["np"],url:"http://gesanwrc.wordpress.com/"},"OSM-Asia-mailinglist":{id:"OSM-Asia-mailinglist",featureId:"asia_full",type:"mailinglist",name:"OpenStreetMap Asia Mailinglist",description:"Talk-asia is the official Mailinglist for Asian Community",url:"https://lists.openstreetmap.org/listinfo/talk-asia",contacts:[{name:"Erwin Olario",email:"govvin@gmail.com"}]},"osm-asia-telegram":{id:"osm-asia-telegram",featureId:"asia_full",type:"telegram",name:"OpenStreetMap Asia Telegram",description:"Join our family: {url}",url:"https://t.me/OpenStreetMapAsia",contacts:[{name:"Erwin Olario",email:"govvin@gmail.com"}]},"OSM-PH-facebook":{id:"OSM-PH-facebook",featureId:"philippines",type:"facebook",countryCodes:["ph"],name:"OpenStreetMap PH Facebook",description:"Welcome to OpenStreetMap Philippines, where we encourage all fellow Filipinos to contribute to the OpenStreetMap project.",url:"https://www.facebook.com/OSMPH/",contacts:[{name:"Maning Sambale",email:"emmanuel.sambale@gmail.com"},{name:"OSM PH Group",email:"osm.pilipinas@gmail.com"}]},"OSM-PH-mailinglist":{id:"OSM-PH-mailinglist",featureId:"philippines",type:"mailinglist",countryCodes:["ph"],name:"Talk-ph Mailing List",description:"A mailing list to discuss OpenStreetMap in the Philippines",url:"https://lists.openstreetmap.org/pipermail/talk-ph/",contacts:[{name:"Maning Sambale",email:"emmanuel.sambale@gmail.com"},{name:"OSM PH Group",email:"osm.pilipinas@gmail.com"}]},"OSM-PH-slack":{id:"OSM-PH-slack",featureId:"philippines",type:"slack",countryCodes:["ph"],name:"OpenStreetMap PH Slack",description:"All are welcome! Sign up at {signupUrl}",signupUrl:"https://osmph-chat.herokuapp.com/",url:"https://osmph.slack.com",contacts:[{name:"Maning Sambale",email:"emmanuel.sambale@gmail.com"},{name:"OSM PH Group",email:"osm.pilipinas@gmail.com"}]},"OSM-PH-telegram":{id:"OSM-PH-telegram",featureId:"philippines",type:"telegram",countryCodes:["ph"],languageCodes:["tl","en"],name:"OpenStreetMap PH Telegram",description:"Un-official, Telegram local community of OpenStreetMap contributors and friends in the Philippines",url:"https://t.me/osmph",contacts:[{name:"Erwin Olario",email:"govvin@gmail.com"},{name:"OSM PH Group",email:"osm.pilipinas@gmail.com"}]},"ym-Far-Eastern-University-Institute-of-Technology":{type:"youthmappers",name:"Junior Philippines Computer Society",description:"YouthMappers chapter at Far Eastern University -Institute of Technology",id:"ym-Far-Eastern-University-Institute-of-Technology",featureId:"Far-Eastern-University-Institute-of-Technology",contacts:[{name:"Organizer",email:"jpcsfeutech@outlook.com"}],extendedDescription:"FEU has been recognized as one of the leading universities in the Philippines. Its mission centers on producing graduates who have contributed to the advancement of the country. The university continuously challenges itself to raise the bar of excellence to achieve a top-tier status not only in the Philippines but also in the South East Asian region",countryCodes:["ph"],url:"mailto:jpcsfeutech@outlook.com?subject=YouthMappers%20and%20Junior%20Philippines%20Computer%20Society"},"ym-University-of-the-Philippines-Resilience-Institute":{type:"youthmappers",name:"YouthMappers UP Resilience Institute",description:"YouthMappers chapter at University of the Philippines Resilience Institute",id:"ym-University-of-the-Philippines-Resilience-Institute",featureId:"University-of-the-Philippines-Resilience-Institute",contacts:[{name:"Organizer",email:"llnguyen@up.edu.ph"}],extendedDescription:"The UP Resilience Institute was established in 2016 with a mission statement to empower local communities through multidisciplinary research and actions toward resilience. Through UP NOAH Center, and the help of different organizations, we have provided building exposure maps for 17 provinces out of the 82 and uploaded more than 4 million footprints to Open Street Maps.",countryCodes:["ph"],url:"https://www.facebook.com/UP-Resillience-Institute-Youth-Mappers-123477508533225"},"OSM-RU-forum":{id:"OSM-RU-forum",type:"forum",featureId:"russia",countryCodes:["ru"],languageCodes:["ru"],name:"OpenStreetMap RU forum",description:"OpenStreetMap Russia web forum",url:"https://forum.openstreetmap.org/viewforum.php?id=21",contacts:[{name:"Ilya Zverev",email:"ilya@zverev.info"}]},"OSM-RU-telegram":{id:"OSM-RU-telegram",type:"telegram",featureId:"russia",countryCodes:["ru"],languageCodes:["ru"],name:"OpenStreetMap RU telegram",description:"OpenStreetMap Russia telegram chat",url:"https://t.me/ruosm",contacts:[{name:"Ilya Zverev",email:"ilya@zverev.info"}]},"OSM-south-korea-telegram":{id:"OSM-south-korea-telegram",featureId:"south_korea",type:"telegram",countryCodes:["kr"],languageCodes:["ko","en"],name:"OSM South Korea Telegram",description:"Unofficial Channnel for OpenStreetMap contributors, communities, and users in South Korea to share and discuss.",url:"https://t.me/osmKorea",contacts:[{name:"Yongmin Hong",email:"revi@pobox.com"},{name:"Max N",email:"abonnements@revolwear.com"}]},"OSM-sri-lanka-facebook":{id:"OSM-sri-lanka-facebook",featureId:"sri_lanka",type:"facebook",countryCodes:["lk"],name:"OpenStreetMap Sri Lanka",description:"Improve OpenStreetMap in Sri Lanka",extendedDescription:"Mapping in Sri Lanka? Have questions, want to connect with the community here? Join us at {Url}. All are welcome!",url:"https://www.facebook.com/groups/142058222659672/",contacts:[{name:"Karan Suthakaran",email:"karansuthakaran@yahoo.com"}]},"OSM-TW-facebook":{id:"OSM-TW-facebook",featureId:"taiwan",type:"facebook",name:"OpenStreetMap Taiwan Community",countryCodes:["tw"],languageCodes:["zh-tw"],description:"Facebook Group for Mappers and OpenStreetMap users to discuss matters about Taiwan.",url:"https://www.facebook.com/groups/OpenStreetMap.TW/",contacts:[{name:"Nobody 沒有人 (Public mail)",email:"hiboard@openstreetmap.tw"}]},"OSM-TW-mailinglist":{id:"OSM-TW-mailinglist",featureId:"taiwan",type:"mailinglist",name:"OpenStreetMap Taiwan Mailinglist",countryCodes:["tw"],languageCodes:["zh-tw","en"],description:"Talk-tw is an Official Mailinglist for the Communities to dicuss matters about Taiwan",url:"https://lists.openstreetmap.org/listinfo/talk-tw",contacts:[{name:"Nobody 沒有人 (Public email)",email:"hiboard@openstreetmap.tw"}]},"OSM-TH-CNX-meetup":{id:"OSM-TH-CNX-meetup",featureId:"thailand_cnx",type:"meetup",countryCodes:["th"],languageCodes:["en"],name:"OSM Meetup Chiang Mai",description:"Irregular meeting of the OpenStreetMap community in Chiang Mai",extendedDescription:"Members of the OpenStreetMap community meet every few months in Chiang Mai. Get in contact and check out {url} to see when the next meetup is scheduled",url:"https://forum.openstreetmap.org/viewforum.php?id=46",contacts:[{name:"Team Chiang Mai",email:"meetup-cnx@openstreetmap.in.th"}]},"OSM-TH-facebook":{id:"OSM-TH-facebook",featureId:"thailand_full",type:"facebook",countryCodes:["th"],languageCodes:["en","th"],name:"OpenStreetMap TH Facebook group",description:"Facebook group for OpenStreetMappers in Thailand",url:"https://www.facebook.com/groups/thaiosm/",contacts:[{name:"Theppitak Karoonboonyanan",email:"theppitak@gmail.com"}]},"OSM-TH-forum":{id:"OSM-TH-forum",featureId:"thailand_full",type:"forum",countryCodes:["th"],languageCodes:["en","th"],name:"OpenStreetMap TH forum",description:"OpenStreetMap Thailand web forum",url:"https://forum.openstreetmap.org/viewforum.php?id=46",contacts:[{name:"Stephan Knauss",email:"osm@stephans-server.de"}]},"al-forum":{id:"al-forum",featureId:"albania",type:"forum",countryCodes:["al"],languageCodes:["sq","en"],name:"OSM Albania Forum",description:"OpenStreetMap Albania Forum",url:"https://forum.openstreetmap.org/viewforum.php?id=91",contacts:[{name:"Jonathan Beliën",email:"dev@jbelien.be"},{name:"Amanti Lulo",email:"amanti.lulo@gmail.com"}]},"al-maptime-tirana":{id:"al-maptime-tirana",featureId:"al-tirana",type:"group",countryCodes:["al"],languageCodes:["sq","en"],name:"Maptime Tirana",description:"Social events organized around mapping - beginners most welcome!",extendedDescription:"Maptime is an open learning environment for all levels and degrees of knowledge, offering intentional educational support for the beginner. Maptime is simultaneously flexible and structured, creating space for mapping tutorials, workshops, ongoing projects with a shared goal, and independent/collaborative work time.",url:"http://maptime.io/tirana/",contacts:[{name:"Jonathan Beliën",email:"dev@jbelien.be"},{name:"Amanti Lulo",email:"amanti.lulo@gmail.com"}]},"al-telegram":{id:"al-telegram",featureId:"albania",type:"telegram",countryCodes:["al"],languageCodes:["sq","en"],name:"OSM Albania Telegram channel",description:"OpenStreetMap Albania Telegram channel",url:"https://telegram.me/OpenStreetMapAL",contacts:[{name:"Jonathan Beliën",email:"dev@jbelien.be"},{name:"Amanti Lulo",email:"amanti.lulo@gmail.com"}]},"at-forum":{id:"at-forum",featureId:"austria",type:"forum",name:"OpenStreetMap Austria Forum",countryCodes:["at"],languageCodes:["en","de"],description:"The official forum for OpenStreetMap questions in and around Austria",url:"https://forum.openstreetmap.org/viewforum.php?id=89",contacts:[{name:"emga",email:"emgaosm@gmail.com"}]},"at-mailinglist":{id:"at-mailinglist",featureId:"austria",type:"mailinglist",name:"Talk-at Mailing List",countryCodes:["at"],languageCodes:["de"],description:"Talk-at is the official mailing list for the Austrian OSM community",url:"https://lists.openstreetmap.org/listinfo/talk-at",contacts:[{name:"AT community",email:"info@openstreetmap.at"}]},"at-twitter":{id:"at-twitter",featureId:"austria",type:"twitter",name:"OpenStreetMap Austria Twitter",countryCodes:["at"],languageCodes:["de"],description:"OpenStreetMap Austria On Twitter: {url}",url:"https://twitter.com/osm_at",contacts:[{name:"AT Community",email:"info@openstreetmap.at"}]},"osmgraz-meetup":{id:"osmgraz-meetup",featureId:"graz",type:"meetup",countryCodes:["at"],languageCodes:["de","en"],name:"OSM community meetup Graz",description:"Monthly meetup of the OpenStreetMap community in Graz",url:"https://wiki.openstreetmap.org/wiki/Graz/Stammtisch",contacts:[{name:"Michael Maier",email:"michael.maier@secure.mailbox.org"}]},"osmgraz-twitter":{id:"osmgraz-twitter",featureId:"graz",type:"twitter",countryCodes:["at"],languageCodes:["de","en"],name:"OSM community Graz on twitter",description:"OpenStreetMap community in Graz on twitter",url:"https://twitter.com/osmgraz",contacts:[{name:"Michael Maier",email:"michael.maier@secure.mailbox.org"}]},"osm-at":{id:"osm-at",featureId:"austria",type:"group",countryCodes:["at"],languageCodes:["de"],name:"OpenStreetMap Austria",description:"The platform for information on OpenStreetMap in Austria",url:"https://www.openstreetmap.at/",contacts:[{name:"AT community",email:"info@openstreetmap.at"}]},byosm:{id:"byosm",type:"telegram",featureId:"belarus",languageCodes:["ru","be","en"],name:"OpenStreetMap Belarus",description:"OpenStreetMap Belarus telegram chat",url:"https://t.me/byosm",contacts:[{name:"Darafei Praliaskouski",email:"me@komzpa.net"}]},"be-facebook":{id:"be-facebook",featureId:"belgium",type:"facebook",name:"OpenStreetMap BE Community",countryCodes:["be"],languageCodes:["en","nl","fr","de"],description:"Mappers and OpenStreetMap on Facebook in Belgium",url:"https://www.facebook.com/groups/1419016881706058/",contacts:[{name:"BE community",email:"community@osm.be"}]},"be-forum":{id:"be-forum",type:"forum",featureId:"belgium",countryCodes:["be"],languageCodes:["en","nl","fr","de"],name:"OpenStreetMap BE forum",description:"OpenStreetMap Belgium web forum",url:"https://forum.openstreetmap.org/viewforum.php?id=29",contacts:[{name:"BE community",email:"community@osm.be"}]},"be-irc":{id:"be-irc",featureId:"belgium",type:"irc",name:"OpenStreetMap Belgium IRC",countryCodes:["be"],languageCodes:["en","nl","fr","de"],description:"Join #osmbe on irc.oftc.net (port 6667)",extendedDescription:"Join #osmbe on irc.oftc.net (port 6667), it is bridged with the Matrix chat channel",url:"https://webchat.oftc.net/?channels=osmbe",contacts:[{name:"BE community",email:"community@osm.be"}]},"be-mailinglist":{id:"be-mailinglist",featureId:"belgium",type:"mailinglist",name:"Talk-be Mailing List",countryCodes:["be"],languageCodes:["en","nl","fr","de"],description:"Talk-be is the official mailing list for the Belgian OSM community",url:"https://lists.openstreetmap.org/listinfo/talk-be",contacts:[{name:"BE community",email:"community@osm.be"}]},"be-matrix":{id:"be-matrix",featureId:"belgium",type:"matrix",countryCodes:["be"],languageCodes:["en","nl","fr","de"],name:"OpenStreetMap BE Matrix channel",description:"All mappers are welcome!",extendedDescription:"Most talk is happening at the \"OpenStreetMap Belgium\" channel. You can ask anything there! The other rooms are for specific subjects.",url:"https://riot.im/app/#/group/+osmbe:matrix.org",contacts:[{name:"BE community",email:"community@osm.be"}]},"be-meetup":{id:"be-meetup",featureId:"belgium",type:"meetup",countryCodes:["be"],languageCodes:["en","nl","fr","de"],name:"OpenStreetMap Belgium Meetup",description:"Real life meetups of everyone who is interested in OpenStreetMap",extendedDescription:"Physical meetups are great to meet other mappers, ask them questions and to learn a lot. Especially new contributors are very welcome!",url:"https://meetup.com/OpenStreetMap-Belgium/",contacts:[{name:"BE community",email:"community@osm.be"}]},"be-twitter":{id:"be-twitter",featureId:"belgium",type:"twitter",name:"OpenStreetMap Belgium Twitter",countryCodes:["be"],languageCodes:["en","nl","fr","de"],description:"OSM Belgium on Twitter: @osm_be",url:"https://twitter.com/osm_be",contacts:[{name:"BE community",email:"community@osm.be"}]},"hr-facebook":{id:"hr-facebook",featureId:"croatia",type:"facebook",name:"OpenStreetMap Croatia Facebook group",countryCodes:["hr"],languageCodes:["hr"],description:"OpenStreetMap Croatia Facebook group",url:"https://www.facebook.com/groups/541098862671461",contacts:[{name:"OpenStreetMap Croatia",email:"info@osm-hr.org"}]},"hr-irc":{id:"hr-irc",featureId:"croatia",type:"irc",name:"OpenStreetMap Croatia on IRC",countryCodes:["hr"],languageCodes:["hr"],description:"Join #osm-hr on irc.freenode.org (port 6667)",url:"https://webchat.freenode.net/?url=irc://irc.freenode.net/osm-hr",contacts:[{name:"OpenStreetMap Croatia",email:"info@osm-hr.org"}]},"hr-mailinglist":{id:"hr-mailinglist",featureId:"croatia",type:"mailinglist",name:"Talk-hr Mailing List",countryCodes:["hr"],languageCodes:["hr"],description:"Talk-hr mailing list",url:"https://lists.openstreetmap.org/listinfo/talk-hr",contacts:[{name:"OpenStreetMap Croatia",email:"info@osm-hr.org"}]},"czech-community":{id:"czech-community",featureId:"czechia",type:"group",name:"Czech OSM community",countryCodes:["cz"],languageCodes:["cs","sk","en"],description:"Map portal, website and contacts on OSM members in Czechia",url:"https://openstreetmap.cz/komunita",contacts:[{name:"osmcz",email:"dev@openstreetmap.cz"}]},"osmcz-facebook":{id:"osmcz-facebook",featureId:"czechia",type:"facebook",name:"OpenStreetMap CZ on Facebook",countryCodes:["cz"],languageCodes:["cs","sk","en"],description:"Follow czech community on Facebook - including translated WeeklyOSM!",url:"https://www.facebook.com/osmcz",contacts:[{name:"osmcz",email:"dev@openstreetmap.cz"}]},"osmcz-twitter":{id:"osmcz-twitter",featureId:"czechia",type:"twitter",name:"Czech twitter @osmcz",countryCodes:["cz"],languageCodes:["cs","sk","en"],description:"Follow czech community on Twitter - including translated WeeklyOSM!",url:"https://twitter.com/osmcz",contacts:[{name:"osmcz",email:"dev@openstreetmap.cz"}]},"talk-cz-mailinglist":{id:"talk-cz-mailinglist",featureId:"czechia",type:"mailinglist",name:"Czech mailing list (talk-cz)",countryCodes:["cz"],languageCodes:["cs","sk","en"],description:"Talk-cz is the official mailing list for Czech community",url:"https://openstreetmap.cz/talkcz",contacts:[{name:"osmcz",email:"dev@openstreetmap.cz"}]},"dk-forum":{id:"dk-forum",type:"forum",featureId:"denmark",countryCodes:["dk"],languageCodes:["da"],name:"OpenStreetMap Denmark Web Forum",description:"OpenStreetMap Denmark web forum",url:"https://forum.openstreetmap.org/viewforum.php?id=48",contacts:[{name:"Talk-dk-owner",email:"talk-dk-owner@openstreetmap.org"}]},"dk-irc":{id:"dk-irc",featureId:"denmark",type:"irc",name:"OpenStreetMap Denmark IRC",countryCodes:["dk"],languageCodes:["da"],description:"Join #osm-dk on irc.oftc.net (port 6667)",url:"https://webchat.oftc.net/?channels=osm-dk",contacts:[{name:"Talk-dk-owner",email:"talk-dk-owner@openstreetmap.org"}]},"dk-mailinglist":{id:"dk-mailinglist",featureId:"denmark",type:"mailinglist",name:"Talk-dk Mailing List",countryCodes:["dk"],languageCodes:["da"],description:"A mailing list to discuss OpenStreetMap in Denmark",url:"https://lists.openstreetmap.org/listinfo/talk-dk",contacts:[{name:"Talk-dk-owner",email:"talk-dk-owner@openstreetmap.org"}]},"ym-Queen-Mary-University-of-London":{type:"youthmappers",name:"Queen Mary YouthMappers",description:"YouthMappers chapter at Queen Mary University of London",id:"ym-Queen-Mary-University-of-London",featureId:"Queen-Mary-University-of-London",contacts:[{name:"Organizer",email:"youthmappers@qmul.ac.uk"}],extendedDescription:"This chapter will be part of the activities of the Queen Mary Geography Society.",countryCodes:["uk"],url:"https://www.facebook.com/groups/qmulgeographysociety/"},"fi-forum":{id:"fi-forum",featureId:"finland",type:"forum",countryCodes:["fi"],languageCodes:["fi"],name:"OpenStreetMap FI forum",description:"OpenStreetMap Finland web forum",url:"https://forum.openstreetmap.org/viewforum.php?id=15",contacts:[{name:"Talk-fi administrator",email:"talk-fi-owner@openstreetmap.org"}]},"fi-irc":{id:"fi-irc",featureId:"finland",type:"irc",name:"OpenStreetMap Finland IRC",countryCodes:["fi"],languageCodes:["fi"],description:"Join #osm-fi on irc.oftc.net (port 6667)",url:"https://webchat.oftc.net/?channels=osm-fi",contacts:[{name:"Talk-fi administrator",email:"talk-fi-owner@openstreetmap.org"}]},"fi-mailinglist":{id:"fi-mailinglist",featureId:"finland",type:"mailinglist",name:"Talk-fi Mailing List",countryCodes:["fi"],languageCodes:["fi"],description:"Talk-fi is the official mailing list for the Finnish OSM community",url:"https://lists.openstreetmap.org/listinfo/talk-fi",contacts:[{name:"Talk-fi administrator",email:"talk-fi-owner@openstreetmap.org"}]},"fr-facebook":{id:"fr-facebook",featureId:"france",type:"facebook",name:"OpenStreetMap France Facebook page",countryCodes:["fr"],languageCodes:["fr"],description:"OpenStreetMap France Facebook page",url:"https://www.facebook.com/osmfr",contacts:[{name:"OpenStreetMap France",email:"contact@openstreetmap.fr"}]},"fr-forum":{id:"fr-forum",type:"forum",featureId:"france",countryCodes:["fr"],languageCodes:["fr"],name:"OpenStreetMap France web forum",description:"OpenStreetMap France web forum",url:"https://forum.openstreetmap.fr/",contacts:[{name:"OpenStreetMap France",email:"contact@openstreetmap.fr"}]},"fr-irc":{id:"fr-irc",featureId:"france",type:"irc",name:"OpenStreetMap France on IRC",countryCodes:["fr"],languageCodes:["fr"],description:"Join #osm-fr on irc.oftc.net (port 6667)",url:"https://webchat.oftc.net/?channels=osm-fr",contacts:[{name:"OpenStreetMap France",email:"contact@openstreetmap.fr"}]},"fr-mailinglist":{id:"fr-mailinglist",featureId:"france",type:"mailinglist",name:"Talk-fr Mailing List",countryCodes:["fr"],languageCodes:["fr"],description:"Talk-fr mailing list",url:"https://lists.openstreetmap.org/listinfo/talk-fr",contacts:[{name:"OpenStreetMap France",email:"contact@openstreetmap.fr"}]},"fr-twitter":{id:"fr-twitter",featureId:"france",type:"twitter",name:"OpenStreetMap France on Twitter",countryCodes:["fr"],languageCodes:["fr"],description:"OpenStreetMap France on Twitter: {url}",url:"https://twitter.com/osm_fr",contacts:[{name:"OpenStreetMap France",email:"contact@openstreetmap.fr"}]},"de-berlin-mailinglist":{id:"de-berlin-mailinglist",featureId:"de-berlin-brandenburg",type:"mailinglist",name:"Berlin Mailing List",countryCodes:["de"],languageCodes:["de"],description:"This is the mailing list for the Berlin OSM community",url:"https://lists.openstreetmap.de/listinfo/berlin",contacts:[{name:"FOSSGIS e.V.",email:"info@fossgis.de"}]},"de-berlin-meetup":{id:"de-berlin-meetup",featureId:"de-berlin-brandenburg",type:"meetup",name:"OpenStreetMap Berlin-Brandenburg Meetup",countryCodes:["de"],languageCodes:["de"],description:"Mappers and OpenStreetMap users in the Berlin area",url:"https://www.meetup.com/OSM-Berlin-Brandenburg/",contacts:[{name:"Christopher Lorenz",email:"osm@lorenz.lu"}]},"de-berlin-telegram":{id:"de-berlin-telegram",featureId:"de-berlin-brandenburg",type:"telegram",name:"@osmberlin on Telegram",countryCodes:["de"],languageCodes:["de"],description:"OpenStreetMap Berlin Telegram chat",url:"https://t.me/osmberlin",contacts:[{name:"Christopher Lorenz",email:"osm@lorenz.lu"}]},"de-berlin-twitter":{id:"de-berlin-twitter",featureId:"de-berlin-brandenburg",type:"twitter",name:"OpenStreetMap Berlin Twitter",countryCodes:["de"],languageCodes:["de"],description:"Follow us on Twitter: {url}",url:"https://twitter.com/osmberlin",contacts:[{name:"Christopher Lorenz",email:"osm@lorenz.lu"}]},"de-forum":{id:"de-forum",featureId:"germany",type:"forum",countryCodes:["de"],languageCodes:["de"],name:"OpenStreetMap DE forum",description:"OpenStreetMap Germany web forum",url:"https://forum.openstreetmap.org/viewforum.php?id=14",contacts:[{name:"FOSSGIS e.V.",email:"info@fossgis.de"}]},"de-irc":{id:"de-irc",featureId:"germany",type:"irc",name:"OpenStreetMap Germany IRC",countryCodes:["de"],languageCodes:["de"],description:"Join #osm-de on irc.oftc.net (port 6667)",url:"https://webchat.oftc.net/?channels=osm-de",contacts:[{name:"FOSSGIS e.V.",email:"info@fossgis.de"}]},"de-mailinglist":{id:"de-mailinglist",featureId:"germany",type:"mailinglist",name:"Talk-de Mailing List",countryCodes:["de"],languageCodes:["de"],description:"Talk-de is the official mailing list for the German OSM community",url:"https://lists.openstreetmap.org/listinfo/talk-de",contacts:[{name:"FOSSGIS e.V.",email:"info@fossgis.de"}]},"de-ostwestfalen-lippe-mailinglist":{id:"de-ostwestfalen-lippe-mailinglist",featureId:"de-ostwestfalen-lippe",type:"mailinglist",name:"OWL Mailing List",countryCodes:["de"],languageCodes:["de"],description:"This is the mailing list for the Ostwestfalen-Lippe OSM community",url:"https://gt.owl.de/mailman/listinfo/osm",contacts:[{name:"Florian Lohoff",email:"osm-owner@gt.owl.de"}]},"de-telegram":{id:"de-telegram",featureId:"germany",type:"telegram",name:"OpenStreetMap Germany Telegram",countryCodes:["de"],languageCodes:["de"],description:"Join the OpenStreetMap Germany Telegram supergroup at {url}",url:"https://t.me/OSM_de",contacts:[{name:"Max N",email:"abonnements@revolwear.com"}]},"osm-de":{id:"osm-de",featureId:"germany",type:"group",countryCodes:["de"],languageCodes:["de"],name:"OpenStreetMap Germany",description:"The platform for information on OpenStreetMap in Germany",url:"https://www.openstreetmap.de/",contacts:[{name:"FOSSGIS e.V.",email:"info@fossgis.de"}]},"ym-Heidelberg-University":{type:"youthmappers",name:"disastermappers heidelberg",description:"YouthMappers chapter at Heidelberg University",id:"ym-Heidelberg-University",featureId:"Heidelberg-University",contacts:[{name:"Organizer",email:"disastermappers@posteo.de"}],extendedDescription:"Disastermappers Heidelberg was founded in 2014 as a student initiative to build a platform for exchange between students, researchers and humanitarian actors. Disastermappers are a member of Missing Maps and are organizing mapathons, workshops and webinars in Heidelberg and beyond and support HOT and Missing Maps through research and applications.",countryCodes:["de"],url:"https://disastermappers.wordpress.com/"},"hu-facebook":{id:"hu-facebook",featureId:"hungary",type:"facebook",name:"OpenStreetMap HU on Facebook",countryCodes:["hu"],languageCodes:["hu"],description:"Mappers and OpenStreetMap Facebook in Hungary",url:"https://www.facebook.com/groups/osm.hu/",contacts:[{name:"Ferenc Veres",email:"info@openstreetmap.hu"}]},"hu-forum":{id:"hu-forum",featureId:"hungary",type:"forum",countryCodes:["hu"],languageCodes:["hu"],name:"OpenStreetMap HU forum",description:"OpenStreetMap Hungary web forum",url:"https://groups.google.com/forum/#!forum/openstreetmap-hungary",contacts:[{name:"Ferenc Veres",email:"info@openstreetmap.hu"}]},"hu-meetup":{id:"hu-meetup",featureId:"hungary",type:"meetup",countryCodes:["hu"],languageCodes:["hu"],name:"OpenStreetMap Hungary Meetup",description:"The platform for organizing meetups in Hungary",url:"https://www.meetup.com/OpenStreetMap-Hungary",contacts:[{name:"Ferenc Veres",email:"info@openstreetmap.hu"}]},"is-facebook":{id:"is-facebook",type:"facebook",featureId:"iceland",countryCodes:["is"],languageCodes:["is","en"],name:"OSM Iceland on Facebook",description:"Page of OpenStreetMap in Iceland",url:"https://www.facebook.com/osmiceland/",contacts:[{name:"Talk-is-owner",email:"talk-is-owner@openstreetmap.org"}]},"is-mailinglist":{id:"is-mailinglist",type:"mailinglist",featureId:"iceland",countryCodes:["is"],languageCodes:["is","en"],name:"Talk-is Mailing List",description:"Talk-is is the official mailing list for the Icelandic OSM community",url:"https://lists.openstreetmap.org/listinfo/talk-is",contacts:[{name:"Talk-is-owner",email:"talk-is-owner@openstreetmap.org"}]},"is-twitter":{id:"is-twitter",type:"twitter",featureId:"iceland",countryCodes:["is"],languageCodes:["is","en"],name:"OSM Iceland on Twitter",description:"Twitter of OpenStreetMap in Iceland",url:"https://twitter.com/openstreetmapis",contacts:[{name:"Talk-is-owner",email:"talk-is-owner@openstreetmap.org"}]},"it-facebook":{id:"it-facebook",featureId:"italy",type:"facebook",name:"OpenStreetMap Italy Facebook",countryCodes:["it"],languageCodes:["it"],description:"Join the OpenStreetMap Italy community on Facebook",url:"https://www.facebook.com/OpenStreetMap.Italia/",contacts:[{name:"Simone Cortesi",email:"simone@cortesi.com"},{name:"Stefano",email:"sabas88@gmail.com"},{name:"Alessandro Palmas",email:"alessandro.palmas@wikimedia.it"}]},"it-irc":{id:"it-irc",featureId:"italy",type:"irc",name:"OpenStreetMap Italy IRC",countryCodes:["it"],languageCodes:["it"],description:"Join #osm-it on irc.oftc.net (port 6667)",url:"https://webchat.oftc.net/?channels=osm-it",contacts:[{name:"Simone Cortesi",email:"simone@cortesi.com"},{name:"Stefano",email:"sabas88@gmail.com"},{name:"Alessandro Palmas",email:"alessandro.palmas@wikimedia.it"}]},"it-mailinglist":{id:"it-mailinglist",featureId:"italy",type:"mailinglist",name:"Talk-it Mailing List",countryCodes:["it"],languageCodes:["it"],description:"Talk-it is the official mailing list for the Italian OSM community",url:"https://lists.openstreetmap.org/listinfo/talk-it",contacts:[{name:"Simone Cortesi",email:"simone@cortesi.com"},{name:"Stefano",email:"sabas88@gmail.com"},{name:"Alessandro Palmas",email:"alessandro.palmas@wikimedia.it"}]},"it-telegram":{id:"it-telegram",type:"telegram",featureId:"italy",countryCodes:["it"],languageCodes:["it"],name:"@OpenStreetMapItalia on Telegram",description:"OpenStreetMap Italy Telegram chat",url:"https://t.me/OpenStreetMapItalia",contacts:[{name:"Simone Cortesi",email:"simone@cortesi.com"},{name:"Stefano",email:"sabas88@gmail.com"},{name:"Alessandro Palmas",email:"alessandro.palmas@wikimedia.it"}]},"it-twitter":{id:"it-twitter",featureId:"italy",type:"twitter",name:"OpenStreetMap Italy Twitter",countryCodes:["it"],languageCodes:["it"],description:"Follow us on Twitter at {url}",url:"https://twitter.com/OpenStreetMapIt",contacts:[{name:"Simone Cortesi",email:"simone@cortesi.com"},{name:"Stefano",email:"sabas88@gmail.com"},{name:"Alessandro Palmas",email:"alessandro.palmas@wikimedia.it"}]},"OSM-Rome-meetup":{id:"OSM-Rome-meetup",featureId:"IT_Roma_Capitale",type:"group",name:"Incontro Mappatori Romani",countryCodes:["it"],languageCodes:["it"],description:"Improve OpenStreetMap in the Rome area",extendedDescription:"We aim to be a resource for people to discuss and share knowledge on utilizing free geographic data sets especially OpenStreetMap, and Open geo-spatial software that manages, edits, and displays geographic data, and advocate for its use in Lazio.",url:"https://wiki.openstreetmap.org/wiki/Rome/Incontro",contacts:[{name:"Martin Koppenhoefer",email:"dieterdreist@gmail.com"}]},"South-Tyrol-Mailing-List":{id:"South-Tyrol-Mailing-List",featureId:"south_tyrol",type:"mailinglist",countryCodes:["it"],languageCodes:["de","it","lld","en"],name:"OpenStreetMap mailing list for South Tyrol",description:"OpenStreetMap Italy regional talk list for South Tyrol",url:"https://lists.openstreetmap.org/listinfo/talk-it-southtyrol",contacts:[{name:"Martin Raifer",email:"tyr.asd@gmail.com"}]},"talk-it-lazio":{id:"talk-it-lazio",featureId:"IT_Lazio",type:"mailinglist",countryCodes:["it"],languageCodes:["it"],name:"OpenStreetMap IT Lazio",description:"All are welcome! Sign up at {signupUrl}",extendedDescription:"Mailinglist for Rome and Lazio area.",signupUrl:"https://lists.openstreetmap.org/listinfo/talk-it-lazio",url:"https://lists.openstreetmap.org/listinfo/talk-it-lazio",contacts:[{name:"Martin Koppenhoefer",email:"dieterdreist@gmail.com"}]},"Trentino-Mailing-List":{id:"Trentino-Mailing-List",featureId:"trentino",type:"mailinglist",countryCodes:["it"],languageCodes:["it"],name:"OpenStreetMap mailing list for Trentino",description:"OpenStreetMap Italy regional talk list for Trentino",url:"https://lists.openstreetmap.org/listinfo/talk-it-trentino",contacts:[{name:"Luca Delucchi",email:"lucadeluge@gmail.com"}]},"ym-Politecnico-di-Milano":{type:"youthmappers",name:"PoliMappers",description:"YouthMappers chapter at Politecnico di Milano",id:"ym-Politecnico-di-Milano",featureId:"Politecnico-di-Milano",contacts:[{name:"Organizer",email:"polimappers@gmail.com"}],extendedDescription:"PoliMappers is a volunteer students’ association based at Politecnico di Milano. The mission of the group is to train and motivate the next generation of volunteer mappers and to do mapping using free and open source software within the university as well as primary and secondary schools.",countryCodes:["it"],url:"https://polimappers.github.io/"},"ym-Yarmouk-University":{type:"youthmappers",name:"YouthMappers at YU",description:"YouthMappers chapter at Yarmouk University",id:"ym-Yarmouk-University",featureId:"Yarmouk-University",contacts:[{name:"Organizer",email:"rnjawarneh@yu.edu.jo"}],extendedDescription:"YouthMappers chapter at YU is the first mapping group in the Middle East and North Africa region where refugees, drought, and poverty are rising crises and in urgent need for humanitarian mapping  activities to mitigate the consequences of such crises. YU Mappers are encouraged to use open data to address challenges in MENA region to bring relief and development to target areas within the region.",countryCodes:["jo"],url:"mailto:rnjawarneh@yu.edu.jo"},"kosovo-telegram":{id:"kosovo-telegram",type:"telegram",featureId:"kosovo",countryCodes:["xk"],languageCodes:["sq","sr","en"],name:"OpenStreetMap Kosovo on Telegram",description:"Semi-official all-Kosovo Telegram public group. We welcome all mappers from anywhere in any language.",url:"https://t.me/osmkosovo",contacts:[{name:"Guillaume Rischard",email:"guillaumenospam@openstreetmapnospam.lu"}]},"ym-Universit-Mohammed-V-Rabat":{type:"youthmappers",name:"Brahmapoutre at Rabat",description:"YouthMappers chapter at Université Mohammed V Rabat",id:"ym-Universit-Mohammed-V-Rabat",featureId:"Universit-Mohammed-V-Rabat",contacts:[{name:"Organizer",email:"khmichasma@gmail.com"}],extendedDescription:"This chapter sees participation in the YouthMappers program as an oppourtunity to share our knowlege create new working relationships with other chapters in different countries",countryCodes:["ma"],url:"mailto:khmichasma@gmail.com"},"no-forum":{id:"no-forum",type:"forum",featureId:"norway",countryCodes:["no"],languageCodes:["no"],name:"OpenStreetMap Norway Web Forum",description:"OpenStreetMap Norway web forum",url:"https://forum.openstreetmap.org/viewforum.php?id=68",contacts:[{name:"OpenStreetMap Norway",email:"kart@nuug.no"}]},"no-irc":{id:"no-irc",featureId:"norway",type:"irc",name:"OpenStreetMap Norway on IRC",countryCodes:["no"],languageCodes:["no"],description:"Chat room for mappers and OpenStreetMap users, developers and enthusiasts in Norway",contacts:[{name:"OpenStreetMap Norway",email:"kart@nuug.no"}],url:"https://webchat.oftc.net/?channels=osm-no"},"no-mailinglist":{id:"no-mailinglist",featureId:"norway",type:"mailinglist",name:"OpenStreetMap Norway mailing list",countryCodes:["no"],languageCodes:["no"],description:"Mailing list for mappers and OpenStreetMap users, developers and enthusiasts in Norway",contacts:[{name:"OpenStreetMap Norway",email:"kart@nuug.no"}],url:"https://lists.nuug.no/mailman/listinfo/kart"},"no-telegram":{id:"no-telegram",type:"telegram",featureId:"norway",countryCodes:["no"],languageCodes:["no"],name:"@OSM_no on Telegram",description:"OpenStreetMap Norway Telegram chat",url:"https://t.me/OSM_no",contacts:[{name:"Syver Stensholt",email:"sssandum@gmail.com"}]},"OSM-PL-facebook-group":{id:"OSM-PL-facebook-group",type:"facebook",featureId:"poland",countryCodes:["pl"],languageCodes:["pl"],name:"OpenStreetMap Poland Facebook group",description:"Group for mappers and users of OpenStreetMap in Poland",url:"https://www.facebook.com/groups/500589303317858/",contacts:[{name:"Michał Brzozowski",email:"www.haxor@gmail.com"}]},"OSM-PL-forum":{id:"OSM-PL-forum",type:"forum",featureId:"poland",countryCodes:["pl"],languageCodes:["pl","en"],name:"OpenStreetMap Poland Forum",description:"Forum of Polish OpenStreetMap community",url:"https://forum.openstreetmap.org/viewforum.php?id=23",contacts:[{name:"Daniel Koć",email:"daniel@xn--ko-wla.pl"},{name:"Ryszard Mikke",email:"ryszard.mikke@gmail.com"}]},"si-forum":{id:"si-forum",type:"forum",featureId:"slovenia",countryCodes:["si"],languageCodes:["sl","en"],name:"OpenStreetMap Slovenia Forum",description:"Forum of OpenStreetMap community in Slovenia",url:"https://forum.openstreetmap.org/viewforum.php?id=58",contacts:[{name:"OpenStreetMap Slovenia",email:"talk-si@openstreetmap.org"}]},"si-mailinglist":{id:"si-mailinglist",type:"mailinglist",featureId:"slovenia",countryCodes:["si"],languageCodes:["sl","en"],name:"OpenStreetMap Slovenia mailing list",description:"Mailing list of OpenStreetMap community in Slovenia",url:"https://lists.openstreetmap.org/listinfo/talk-si",contacts:[{name:"OpenStreetMap Slovenia",email:"talk-si@openstreetmap.org"}]},"si-twitter":{id:"si-twitter",featureId:"slovenia",type:"twitter",name:"OpenStreetMap Slovenia Twitter",countryCodes:["si"],languageCodes:["sl","en"],description:"Follow OpenStreetMap Slovenia On Twitter: {url}",url:"https://twitter.com/OpenStreetMapSi",contacts:[{name:"OpenStreetMap Slovenia",email:"talk-si@openstreetmap.org"}]},"OSM-ES-mailinglist":{id:"OSM-ES-mailinglist",type:"mailinglist",featureId:"spain",languageCodes:["es"],name:"Talk-es mailing list",description:"A mailing list to discuss OpenStreetMap in Spain",url:"https://lists.openstreetmap.org/listinfo/talk-es",contacts:[{name:"Iván Sánchez",email:"ivansanchez@escomposlinux.org"}]},"OSM-ES-telegram":{id:"OSM-ES-telegram",type:"telegram",featureId:"spain",languageCodes:["es"],name:"@OSMes on Telegram",description:"OpenStreetMap Spain Telegram chat",url:"https://t.me/OSMes",contacts:[{name:"Jorge Sanz",email:"sanchi2@gmail.com"}]},"ym-Universidad-Autonoma-de-Madrid":{type:"youthmappers",name:"YouthMappers at UAM",description:"YouthMappers chapter at Universidad Autonoma de Madrid",id:"ym-Universidad-Autonoma-de-Madrid",featureId:"Universidad-Autonoma-de-Madrid",contacts:[{name:"Organizer",email:"youthmappersatuam@gmail.com"}],countryCodes:["es"],url:"mailto:youthmappersatuam@gmail.com"},"ym-Universidad-Politcnica-de-Madrid":{type:"youthmappers",name:"Mapeo Humanitario",description:"YouthMappers chapter at Universidad Politécnica de Madrid",id:"ym-Universidad-Politcnica-de-Madrid",featureId:"Universidad-Politcnica-de-Madrid",contacts:[{name:"Organizer",email:"lab.topografia@gmail.com"}],extendedDescription:"Geo-volunteering group formed at Moncloa Campus on November 2017. Around 20 members from three Universities (Complutense, CEU and UPM). Undergraduate students, MSc and PhD students collaborate together with organizations (MSF, Acción contra el Hambre,...) supported by trainers from Geoinquietos. Official recognition by UPM as Educative Innovation Project (Code  IE1718.0411)",countryCodes:["es"],url:"https://blogs.upm.es/mapeo-humanitario/"},"osm-se":{id:"osm-se",featureId:"sweden",type:"group",countryCodes:["se"],languageCodes:["sv"],name:"OpenStreetMap.se",description:"Provide OSM services and information for the local community in Sweden",url:"http://openstreetmap.se/",contacts:[{name:"Talk-se-owner",email:"talk-se-owner@openstreetmap.org"}]},"se-facebook":{id:"se-facebook",featureId:"sweden",type:"facebook",name:"OpenStreetMap Sweden Facebook",countryCodes:["se"],languageCodes:["sv"],description:"OpenStreetMap Sweden on Facebook",url:"https://www.facebook.com/groups/osmsweden/",contacts:[{name:"Talk-se-owner",email:"talk-se-owner@openstreetmap.org"}]},"se-forum":{id:"se-forum",type:"forum",featureId:"sweden",countryCodes:["se"],languageCodes:["sv"],name:"OpenStreetMap Sweden Web Forum",description:"OpenStreetMap Sweden web forum",url:"https://forum.openstreetmap.org/viewforum.php?id=4",contacts:[{name:"Talk-se-owner",email:"talk-se-owner@openstreetmap.org"}]},"se-irc":{id:"se-irc",featureId:"sweden",type:"irc",name:"OpenStreetMap Sweden IRC",countryCodes:["se"],languageCodes:["sv"],description:"Join #osm.se on irc.oftc.net (port 6667)",url:"https://webchat.oftc.net/?channels=osm.se",contacts:[{name:"Talk-se-owner",email:"talk-se-owner@openstreetmap.org"}]},"se-mailinglist":{id:"se-mailinglist",featureId:"sweden",type:"mailinglist",name:"Talk-se Mailing List",countryCodes:["se"],languageCodes:["sv"],description:"A mailing list to discuss OpenStreetMap in Sweden",url:"https://lists.openstreetmap.org/listinfo/talk-se",contacts:[{name:"Talk-se-owner",email:"talk-se-owner@openstreetmap.org"}]},"se-twitter":{id:"se-twitter",featureId:"sweden",type:"twitter",name:"OpenStreetMap Sweden on Twitter",countryCodes:["se"],languageCodes:["sv"],description:"Follow us on Twitter: {url}",url:"https://twitter.com/openstreetmapse",contacts:[{name:"Talk-se-owner",email:"talk-se-owner@openstreetmap.org"}]},"ym-Istanbul-Technical-University":{type:"youthmappers",name:"YouthMappers ITU",description:"YouthMappers chapter at Istanbul Technical University",id:"ym-Istanbul-Technical-University",featureId:"Istanbul-Technical-University",contacts:[{name:"Organizer",email:"youthmappersitu@gmail.com"}],extendedDescription:"YouthMappers ITU is an interdisciplinary and collaborative student community to promote humanitarian mapping for vulnerable settlements and aims to develop and share strategic and innovative spatial information for the future cities by using geographical information systems and open data.",countryCodes:["tr"],url:"https://www.facebook.com/YouthMappers-ITU-226489641442744/?modal=admin_todo_tour"},"Nottingham-OSM-pub-meetup":{id:"Nottingham-OSM-pub-meetup",featureId:"east_midlands_uk",type:"group",name:"East Midlands (Nottingham) Monthly pub meet-up",countryCodes:["gb"],languageCodes:["en"],description:"Social gathering for East Midlands mappers and users",extendedDescription:"A group have been meeting since March 2011, initially in Nottingham, and, more recently in Derby, and from time to time elsewhere in the East Midlands. These are social gatherings, but are an excellent place to come and ask specific questions about OSM either in the area or in general. In the summer months we usually do some light mapping for an hour in the vicinity of our meeting place. The group as a whole has a special interest in mapping public rights of way and from time to time has mapping meetings for this purpose.",url:"https://wiki.openstreetmap.org/wiki/Nottingham/Pub-meetup",contacts:[{name:"Jerry Clough",email:"SK53.osm@gmail.com"}]},"gb-mailinglist":{id:"gb-mailinglist",featureId:"united_kingdom",type:"mailinglist",name:"Talk-gb Mailing List",countryCodes:["gb"],languageCodes:["en","cy"],description:"Talk-gb is the main communication forum list for the British (including Northern Ireland) OSM community",url:"https://lists.openstreetmap.org/listinfo/talk-gb",contacts:[{name:"UK mailing list",email:"talk-gb-owner@lists.openstreetmap.org"}]},"mappa-mercia-group":{id:"mappa-mercia-group",featureId:"england-west-midlands",type:"group",countryCodes:["gb"],languageCodes:["en"],name:"Mappa Mercia local group",description:"A home for OpenStreetMap enthusiasts in the Midlands",extendedDescription:"Mappa Mercia is a project to grow OpenStreetMap in the West Midlands, UK. We run community events, provide training and support local organisations wishing to open up their data.",url:"http://www.mappa-mercia.org/",contacts:[{name:"Brian Prangle",email:"community@mappa-mercia.org"}]},"gb-irc":{id:"gb-irc",featureId:"united_kingdom",type:"irc",name:"OpenStreetMap United Kingdom IRC",countryCodes:["gb"],languageCodes:["en","cy"],description:"Join #osm-gb on irc.oftc.net (port 6667)",extendedDescription:"Join #osm-gb on irc.oftc.net (port 6667), please be patient and wait for a few minutes if you ask a question",url:"https://webchat.oftc.net/?channels=osm-gb",contacts:[{name:"UK mailing list",email:"talk-gb-owner@lists.openstreetmap.org"}]},"ym-University-of-Exeter":{type:"youthmappers",name:"University of Exeter British Red Cross Missing Maps",description:"YouthMappers chapter at University of Exeter",id:"ym-University-of-Exeter",featureId:"University-of-Exeter",contacts:[{name:"Organizer",email:"uniofexemissingmaps@gmail.com"}],extendedDescription:"We are a team of enthusiastic Geographers with comprehensive knowledge of GIS. We are passionate about supporting the British Red Cross Society with various humanitarian aid efforts. We are also important teachers of the significance of mapping remotely sensed data and how this helps on the ground. Our mapathons have themed academic focuses that highlight the different GIS research in our geography department, while also functioning as employability awareness events which we use to invite speakers in to talk about their GIS/British Red Cross careers.",countryCodes:["uk"],url:"https://www.facebook.com/EUMissingMaps/"},"ym-University-of-Warwick":{type:"youthmappers",name:"University of Warwick Resilience Mapping Society",description:"YouthMappers chapter at University of Warwick",id:"ym-University-of-Warwick",featureId:"University-of-Warwick",contacts:[{name:"Organizer",email:"p.ulbrich@warwick.ac.uk"}],extendedDescription:"We are a group of enthusiastic mappers based at Warwick University. Our aim is to get people excited about humanitarian mapping and help them understand the impact this activity has on the field. We are closely aligned with Missing Maps and Doctors Without Borders UK and focus on HOT tasks in our mapping activities and workshops. Our mapathons are listed on the Missing Maps page whenever they are scheduled.",countryCodes:["uk"],url:"mailto:p.ulbrich@warwick.ac.uk"},"ym-Sacred-Heart-Junior-College":{type:"youthmappers",name:"Youth Mappers at Sacred Heart Junior College",description:"YouthMappers chapter at Sacred Heart Junior College",id:"ym-Sacred-Heart-Junior-College",featureId:"Sacred-Heart-Junior-College",contacts:[{name:"Organizer",email:"jtzib18@gmail.com"}],countryCodes:["bz"],url:"mailto:jtzib18@gmail.com"},"OSM-CA-Slack":{id:"OSM-CA-Slack",featureId:"canada_full",type:"slack",countryCodes:["ca"],languageCodes:["en","fr"],name:"OSM-CA Slack",description:"All are welcome! Sign up at {signupUrl}.",signupUrl:"https://slackinviteosmcanada.herokuapp.com/",url:"https://osm-ca.slack.com/",contacts:[{name:"Denis Carriere",email:"carriere.denis@gmail.com"}]},"OSM-Vancouver-meetup":{id:"OSM-Vancouver-meetup",featureId:"vancouver_metro",type:"meetup",name:"OpenStreetMap Vancouver",countryCodes:["ca"],languageCodes:["en"],description:"Mappers and OpenStreetMap users in the Vancouver, BC area",url:"https://www.meetup.com/OpenStreetMap-Vancouver/",contacts:[{name:"Paul Norman",email:"penorman@mac.com"},{name:"Peter Chin",email:"bpchin@gmail.com"}],events:[{name:"April Metrotown Mappy Hour",description:"Mappy Hour is the time and place for discussion of OpenStreetMap, from surveying data to consuming data. Beginners welcome. Bring your questions.",when:"2018-04-27 18:30",where:"Firefighters' Public House, 6515 Bonsor Avenue, Burnaby, BC",url:"https://www.meetup.com/OpenStreetMap-Vancouver/events/qzsbsmyxgbkc/"}]},"ym-Universidad-de-Costa-Rica":{type:"youthmappers",name:"YouthMappers de Universidad de Costa Rica",description:"YouthMappers chapter at Universidad de Costa Rica",id:"ym-Universidad-de-Costa-Rica",featureId:"Universidad-de-Costa-Rica",contacts:[{name:"Organizer",email:"youthmappersucr@gmail.com"}],extendedDescription:"YouthMappers de Universidad de Costa Rica nace en función de acción social para y por miembros de comunidades distintas según temáticas de involucramiento, interacción y representación de variables dentro de un espacio geográfico definido (un territorio) Gracias a las herramientas de OpenStreetMaps tenemos la viabilidad de poder obtener, validar y compartir la información generada para comprobación y uso destinadas a las comunidades o el interesado en tales temáticas objetivas.",countryCodes:["cr"],url:"https://www.facebook.com/ucr.asege/"},"OSM-CU-telegram":{id:"OSM-CU-telegram",type:"telegram",featureId:"cuba",countryCodes:["cu"],languageCodes:["es"],name:"OSM Cuba on Telegram",description:"OpenStreetMap Cuba Telegram chat",url:"https://telegram.me/OSM_Cuba",contacts:[{name:"Talk-cu Owner",email:"talk-cu-owner@openstreetmap.org"}]},"ym-Universidad-Nacional-Autnoma-de-Honduras":{type:"youthmappers",name:"PumaGis Hn",description:"YouthMappers chapter at Universidad Nacional Autónoma de Honduras",id:"ym-Universidad-Nacional-Autnoma-de-Honduras",featureId:"Universidad-Nacional-Autnoma-de-Honduras",contacts:[{name:"Organizer",email:"pumagishn@gmail.com"}],countryCodes:["hn"],url:"mailto:pumagishn@gmail.com"},"ym-University-of-the-West-Indies-Mona-Campus":{type:"youthmappers",name:"Libraries Outreach - ODL",description:"YouthMappers chapter at University of the West Indies, Mona Campus",id:"ym-University-of-the-West-Indies-Mona-Campus",featureId:"University-of-the-West-Indies-Mona-Campus",contacts:[{name:"Organizer",email:"benjamin.branch@uwimona.edu.jm"}],extendedDescription:"The UWI, Mona Campus Library engages in public, outreach and special projects. This will allow our library the means to be a catalyst for spatial literacy and advocate for spatial data sharing and access to Jamaican and Caribbean interests. We have disaster relief and communication needs and   extensive earth science and geo-hazards needs to better serve our campus and community. Specifically, we hace a Science Library to showcase such to all faculty and students.",countryCodes:["jm"],url:"mailto:benjamin.branch@uwimona.edu.jm"},"OSM-NI-telegram":{id:"OSM-NI-telegram",type:"telegram",featureId:"nicaragua",countryCodes:["ni"],languageCodes:["es"],name:"OSM Nicaragua on Telegram",description:"OpenStreetMap Nicaragua Telegram chat",url:"https://telegram.me/MapaNica",contacts:[{name:"Talk-ni Owner",email:"talk-ni-owner@openstreetmap.org"}]},"ym-Universidad-Nacional-de-Ingenieria":{type:"youthmappers",name:"Yeka Street MGA",description:"YouthMappers chapter at Universidad Nacional de Ingenieria",id:"ym-Universidad-Nacional-de-Ingenieria",featureId:"Universidad-Nacional-de-Ingenieria",contacts:[{name:"Organizer",email:"yeka.street.mga@gmail.com"}],extendedDescription:"YEKA STREET is a work team constituted by students from Universidad Nacional de Ingenieria at Managua, Nicaragua. With the principal purpose of apply our knowledge and skills using many tools and apps to map areas in our cities and contribute to the development community projects and disasters relieve plans. We want to lead the way adding more students from all careers and universities in our country to join us at this cause, increasing in this way the life level and reducing the population vulnerability.",countryCodes:["ni"],url:"https://www.facebook.com/yekastreetmga/"},"ym-University-of-Panama":{type:"youthmappers",name:"YouthMappers UP",description:"YouthMappers chapter at University of Panama",id:"ym-University-of-Panama",featureId:"University-of-Panama",contacts:[{name:"Organizer",email:"youthmappers.up@gmail.com"}],extendedDescription:"Student mappers in Panama work with open spatial data to help identify, define, address, and create meaning about locally defined development challenges. They collaborate with students from other countries on community mapping topics from ecotourism to food security, from biodiversity to indigenous issues, promoting a humanistic vision through scientific perspectives.",countryCodes:["pa"],url:"mailto:Youthmappers.up@gmail.com"},"ym-Universidad-de-Puerto-Rico-Rio-Piedras":{type:"youthmappers",name:"UPR YouthMappers",description:"YouthMappers chapter at Universidad de Puerto Rico - Rio Piedras",id:"ym-Universidad-de-Puerto-Rico-Rio-Piedras",featureId:"Universidad-de-Puerto-Rico-Rio-Piedras",contacts:[{name:"Organizer",email:"carlosguilbe@gmail.com"}],countryCodes:["pa"],url:"mailto:carlosguilbe@gmail.com"},"Bay-Area-OpenStreetMappers":{id:"Bay-Area-OpenStreetMappers",featureId:"sf_bay_area",type:"meetup",name:"Bay Area OpenStreetMappers",countryCodes:["us"],languageCodes:["en"],description:"Improve OpenStreetMap in the Bay Area",extendedDescription:"This group is about growing the OpenStreetMap community here in the Bay Area. Our events are open to everyone, from open source enthusiasts, cyclists, GIS professionals, geocachers, and beyond. Anyone and everyone who is interested in maps, map making and free map data is welcome to join our group as well as attend our events.",url:"https://www.meetup.com/Bay-Area-OpenStreetMappers/",contacts:[{name:"Ben Discoe",email:"bdiscoe@gmail.com"}]},"Central-Pennsylvania-OSM":{id:"Central-Pennsylvania-OSM",featureId:"central_pa",type:"facebook",name:"Central Pennsylvania OSM",countryCodes:["us"],languageCodes:["en"],description:"Online mapping community based out of State College, PA",url:"https://www.facebook.com/CentralPennsylvaniaOSM",contacts:[{name:"Sterling Quinn",email:"sdq107@psu.edu"}]},"Code-for-San-Jose-Slack":{id:"Code-for-San-Jose-Slack",featureId:"south_sf_bay_area",type:"slack",countryCodes:["us"],languageCodes:["en"],name:"Code for San Jose Slack",description:"All are welcome! Sign up at {signupUrl}, then join the #osm channel.",signupUrl:"https://slackin-c4sj.herokuapp.com/",url:"https://codeforsanjose.slack.com/",contacts:[{name:"OSM Bay Area mailing list",email:"talk-us-sfbay@openstreetmap.org"}]},"Dallas-Fort-Worth-OSM":{id:"Dallas-Fort-Worth-OSM",featureId:"dfw_metro",type:"group",name:"Dallas-Fort Worth OSM",countryCodes:["us"],languageCodes:["en"],description:"The OpenStreetMap user group for Dallas-Fort Worth",extendedDescription:"Dallas, Fort Worth, and all the cities in between are abounding with creative and tech-savvy people. The vision for this usergroup is to find new ways to use the amazing resource of OSM.",url:"http://dfwosm.org/",contacts:[{name:"Andrew Matheny",email:"andrewdmatheny@gmail.com"}]},GeoPhilly:{id:"GeoPhilly",featureId:"philly_metro",type:"meetup",name:"GeoPhilly",countryCodes:["us"],languageCodes:["en"],description:"Meetup for map enthusiasts in the Philadelphia area",extendedDescription:"GeoPhilly unites developers, geographers, data geeks, open source enthusiasts, civic hackers and map addicts in our shared love of maps and the stories they tell. If you use maps as part of your work or just want to learn more, this is the meetup for you!  Our events aim to be open, friendly, educational and social and range from happy hours to lightning talks or even workshops. Come create a diverse, inspiring geospatial community in the Philadelphia with us!",url:"https://www.meetup.com/GeoPhilly/",contacts:[{name:"Dan Ford",email:"dford@azavea.com"}]},MapMinnesota:{id:"MapMinnesota",featureId:"minneapolis_st_paul_metro",type:"meetup",name:"MapMinnesota",countryCodes:["us"],languageCodes:["en"],description:"Mappers and OpenStreetMap enthusiasts in the Twin Cities area",extendedDescription:"Connecting OpenStreetMap enthusiasts in Minnesota and the Twin Cities!",url:"https://www.meetup.com/Map-Minnesota/",contacts:[{name:"Ian Dees",email:"ian.dees@gmail.com"}]},"Mapping-DC-meetup":{id:"Mapping-DC-meetup",featureId:"dc_metro",type:"meetup",name:"Mapping DC",countryCodes:["us"],languageCodes:["en"],description:"Improve OpenStreetMap in the DC area",extendedDescription:"We are a group of volunteer mappers who aim to improve the OpenStreetMap in the DC area. We also aim to teach others about the OSM ecosystem, data analytics, cartography, and GIS. We gather every other month at meetups to focus on one area of our city.",url:"https://mappingdc.org/",contacts:[{name:"Brian DeRocher",email:"brian@derocher.org"}],events:[{name:"April Meetup",description:"Meets every other month on the 2nd Tuesday",when:"2018-04-10 18:00",where:"Capitol City Brewing Company, 1100 New York Ave NW, Washington, DC",url:"https://www.meetup.com/MappingDC/events/qqvnvhyxgbnb/"},{name:"June Meetup",description:"Meets every other month on the 2nd Tuesday",when:"2018-06-12 18:00",where:"Capitol City Brewing Company, 1100 New York Ave NW, Washington, DC",url:"https://www.meetup.com/MappingDC/events/qqvnvhyxjbqb/"},{name:"August Meetup",description:"Meets every other month on the 2nd Tuesday",when:"2018-08-14 18:00",where:"Capitol City Brewing Company, 1100 New York Ave NW, Washington, DC",url:"https://www.meetup.com/MappingDC/events/qqvnvhyxlbsb/"},{name:"October Meetup",description:"Meets every other month on the 2nd Tuesday",when:"2018-10-09 18:00",where:"Capitol City Brewing Company, 1100 New York Ave NW, Washington, DC",url:"https://www.meetup.com/MappingDC/events/qqvnvhyxnbmb/"}]},"Maptime-ME-meetup":{id:"Maptime-ME-meetup",featureId:"portland_me",type:"meetup",name:"MaptimeME",countryCodes:["us"],languageCodes:["en"],description:"Mappers and OpenStreetMap users, around Portland, ME",extendedDescription:"Maptime is, rather literally, time for mapmaking.  Our mission is to open the doors of cartographic possibility to anyone interested by creating a time and space for collaborative learning, exploration, and map creation using mapping tools and technologies.",url:"https://www.meetup.com/MaptimeME/",contacts:[{name:"Malcolm Toon",email:"malcolm@foreflight.com"}]},"MaptimeHRVA-twitter":{id:"MaptimeHRVA-twitter",featureId:"hrva",type:"twitter",name:"MaptimeHRVA Twitter",countryCodes:["us"],languageCodes:["en"],description:"Follow us on Twitter at {url}",url:"https://twitter.com/maptimehrva",contacts:[{name:"Jonah Adkins",email:"jonahadkins@gmail.com"}]},"us-ma-mailinglist":{id:"us-ma-mailinglist",featureId:"massachusetts",type:"mailinglist",name:"Talk-us-massachusetts Mailing List",countryCodes:["us"],languageCodes:["en"],description:"Email mailing list for the Massachusetts OSM community",url:"https://lists.openstreetmap.org/listinfo/talk-us-massachusetts",contacts:[{name:"Alan Bragg",email:"alan.ruth.bragg@gmail.com"}]},"OpenCleveland-meetup":{id:"OpenCleveland-meetup",featureId:"cleveland",type:"meetup",name:"Open Cleveland",countryCodes:["us"],languageCodes:["en"],description:"Improve OpenStreetMap in the Cleveland area",extendedDescription:"Open Geo Cleveland aims to be a resource for people to discuss and share knowledge on utilizing free geographic data sets especially OpenStreetMap, and Open geo-spatial software that manages, edits, and displays geographic data, and advocate for its use in Northeast Ohio. We're also a maptime chapter =)",url:"https://www.meetup.com/open-cleveland/",contacts:[{name:"Will Skora",email:"skorasaurus@gmail.com"},{name:"Anastasia Diamond-Ortiz",email:"anastasia.diamond@gmail.com"}],events:[{name:"Wednesday Meetup / Hack Night",description:"Meets weekly - programming experience is not necessary!",when:"2018-04-18 18:00",where:"The Tech Hive, 6815 Euclid Ave, Cleveland, OH",url:"https://www.meetup.com/open-cleveland/events/lcjdnpyxgbxb/"},{name:"Wednesday Meetup / Hack Night",description:"Meets weekly - programming experience is not necessary!",when:"2018-04-25 18:00",where:"The Tech Hive, 6815 Euclid Ave, Cleveland, OH",url:"https://www.meetup.com/open-cleveland/events/lcjdnpyxgbhc/"},{name:"Wednesday Meetup / Hack Night",description:"Meets weekly - programming experience is not necessary!",when:"2018-05-02 18:00",where:"The Tech Hive, 6815 Euclid Ave, Cleveland, OH",url:"https://www.meetup.com/open-cleveland/events/lcjdnpyxhbdb/"},{name:"Wednesday Meetup / Hack Night",description:"Meets weekly - programming experience is not necessary!",when:"2018-05-09 18:00",where:"The Tech Hive, 6815 Euclid Ave, Cleveland, OH",url:"https://www.meetup.com/open-cleveland/events/lcjdnpyxhbmb/"},{name:"Wednesday Meetup / Hack Night",description:"Meets weekly - programming experience is not necessary!",when:"2018-05-16 18:00",where:"The Tech Hive, 6815 Euclid Ave, Cleveland, OH",url:"https://www.meetup.com/open-cleveland/events/lcjdnpyxhbvb/"},{name:"Wednesday Meetup / Hack Night",description:"Meets weekly - programming experience is not necessary!",when:"2018-05-23 18:00",where:"The Tech Hive, 6815 Euclid Ave, Cleveland, OH",url:"https://www.meetup.com/open-cleveland/events/lcjdnpyxhbfc/"},{name:"Wednesday Meetup / Hack Night",description:"Meets weekly - programming experience is not necessary!",when:"2018-05-30 18:00",where:"The Tech Hive, 6815 Euclid Ave, Cleveland, OH",url:"https://www.meetup.com/open-cleveland/events/lcjdnpyxhbnc/"}]},"OSM-Boston":{id:"OSM-Boston",featureId:"boston_metro",type:"meetup",name:"OpenStreetMap Boston",countryCodes:["us"],languageCodes:["en"],description:"Mappers and OpenStreetMap users in the Boston area",extendedDescription:"OpenStreetMap is the free and open, wiki-style map of the world, with hundreds of thousands of contributions every day from people like you. Editing the map is simple, and fun! Join us both indoors and outdoors in our effort to create the best map of the Boston area and the rest of the world!",url:"https://www.meetup.com/OpenStreetMap-Boston/",contacts:[{name:"Lars Ahlzen",email:"lars@ahlzen.com"}]},"OSM-Central-Salish-Sea":{id:"OSM-Central-Salish-Sea",featureId:"mt_vernon_wa",type:"meetup",name:"OpenStreetMap Central Salish Sea",countryCodes:["us"],languageCodes:["en"],description:"Mappers and OpenStreetMap users around Mount Vernon, WA",extendedDescription:"OpenStreetMap is an map of the world made by people like you. It's a map that you build, that's given away for free like wikipedia. Check out osm.org for more. We meet all the time to talk maps, make maps and have fun!",url:"https://www.meetup.com/OpenStreetMap-Central-Salish-Sea/",contacts:[{name:"Clifford Snow",email:"clifford@snowandsnow.us"}]},"OSM-Chattanooga":{id:"OSM-Chattanooga",featureId:"chattanooga",type:"facebook",name:"OSM Chattanooga",countryCodes:["us"],languageCodes:["en"],description:"The OpenStreetMap user group for Chattanooga",url:"https://www.facebook.com/groups/123483951073256",contacts:[{name:"Jenny Park",email:"tennessee@tpl.org"},{name:"Randal Hale",email:"rjhale@northrivergeographic.com"}]},"OSM-Colorado":{id:"OSM-Colorado",featureId:"colorado",type:"meetup",name:"OpenStreetMap Colorado",countryCodes:["us"],languageCodes:["en"],description:"Mappers and OpenStreetMap users in the state of Colorado, USA",extendedDescription:"OpenStreetMap (OSM) Colorado is a local collaboration of people interested in contributing their efforts to create free maps. We encourage all of our mappers to organize or suggest mapping events throughout the state. Meetup activities can be simple social mixers, OSM basic to advanced training, or community mapping parties.",url:"https://www.meetup.com/OSM-Colorado/",contacts:[{name:"Russell Deffner",email:"russdeffner@gmail.com"}]},"OSM-NYC":{id:"OSM-NYC",featureId:"nyc_metro",type:"meetup",name:"OpenStreetMap NYC",countryCodes:["us"],languageCodes:["en"],description:"Mappers and OpenStreetMap users, developers and enthusiasts in the New York Metropolitan area",url:"https://www.meetup.com/osm-nyc/",contacts:[{name:"Jeff Ferzoco",email:"jferzoco@carto.com"}]},"OSM-Portland-forum":{id:"OSM-Portland-forum",featureId:"portland_or",type:"forum",name:"OpenStreetMap PDX Google Group",countryCodes:["us"],languageCodes:["en"],description:"Forum and mailing list for OpenStreetMap users in the Portland area",extendedDescription:"This group is to facilitate improvements to OpenStreetMap in the Portland, Oregon area to support applications such as the Open Trip Planner.",url:"https://groups.google.com/group/osm-pdx",contacts:[{name:"Madeline Steele",email:"madeline.steele@gmail.com"}]},"OSM-Portland":{id:"OSM-Portland",featureId:"portland_or",type:"meetup",name:"OpenStreetMap Portland",countryCodes:["us"],languageCodes:["en"],description:"Mappers and OpenStreetMap users in the Portland area",extendedDescription:"OpenStreetMap (OSM) is a map of the world made by people like you. It's a map that you build, that's given away for free like wikipedia. Check out osm.org for more, and come join us at a meetup to talk maps, contribute to OSM, and have fun!",url:"https://www.meetup.com/OpenStreetMap-Portland/",contacts:[{name:"Madeline Steele",email:"madeline.steele@gmail.com"}]},"OSM-Seattle":{id:"OSM-Seattle",featureId:"seattle",type:"meetup",name:"OpenStreetMap Seattle",countryCodes:["us"],languageCodes:["en"],description:"Mappers and OpenStreetMap users in the Seattle area",url:"https://www.meetup.com/OpenStreetMap-Seattle/",contacts:[{name:"Clifford Snow",email:"clifford@snowandsnow.us"},{name:"Chase Stephens",email:"seattlefyi@gmail.com"},{name:"Paul McCombs",email:"pablo@imperium.org"}]},"OSM-SoCal":{id:"OSM-SoCal",featureId:"la_metro",type:"meetup",name:"OpenStreetMap Southern California",countryCodes:["us"],languageCodes:["en"],description:"Let's have some fun, contribute something to Los Angeles, and learn about mapping!",extendedDescription:"OpenStreetMap (OSM) Southern California is for anyone interested in mapping to get together to work with OpenStreetMap.  OpenStreetMap, the Wikipedia of maps, is a free open-source map of the world being created by more than 1,000,000 volunteers around the globe.  Everyone is welcome.  If you don't know OpenStreetMap, we'll teach you. If you have an idea for a mapping project or even a field trip that the group can do, great!",url:"https://www.meetup.com/OSM-Southern-California/",contacts:[{name:"Charlotte Wolter",email:"techlady@techlady.com"}]},"OSM-South-Bay":{id:"OSM-South-Bay",featureId:"south_sf_bay_area",type:"meetup",name:"OSM South Bay",countryCodes:["us"],languageCodes:["en"],description:"Map Nights hosted by Code for San Jose",extendedDescription:"Code for San Jose, the local Code for America brigade, hosts monthly Map Nights on Thursday nights in downtown San José. Meet fellow South Bay mappers, help out with local mapping projects, and hear about other civic tech projects. Programming and GIS skills are not required.",url:"https://www.meetup.com/Code-for-San-Jose/",contacts:[{name:"OSM Bay Area mailing list",email:"talk-us-sfbay@openstreetmap.org"}]},"OSM-Tampa-Bay":{id:"OSM-Tampa-Bay",featureId:"tampa_bay",type:"meetup",name:"OpenStreetMap Tampa Bay",countryCodes:["us"],languageCodes:["en"],description:"Mappers and OpenStreetMap users in the Tampa Bay area",extendedDescription:"OSM Tampa Bay group for local residents to get together and build out the definitive map of Tampa Bay with OpenStreetMap, the free and editable map of the world.  If you're into maps, data, open source, GPS, hiking, cycling, et cetera, you'll love working with OpenStreetMap -- so join in! We'll get together and map and talk about new topics once-a-month or so.",url:"https://www.meetup.com/osmtampabay/",contacts:[{name:"Coleman McCormick",email:"cmccormick@gmail.com"}]},"OSM-US-Slack":{id:"OSM-US-Slack",featureId:"usa_full",type:"slack",countryCodes:["us"],languageCodes:["en"],name:"OpenStreetMap US Slack",description:"All are welcome! Sign up at {signupUrl}",signupUrl:"https://slack.openstreetmap.us/",url:"https://osmus.slack.com",contacts:[{name:"Ian Dees",email:"ian@openstreetmap.us"},{name:"Clifford Snow",email:"clifford@snowandsnow.us"}]},"OSM-US":{id:"OSM-US",featureId:"usa_full",type:"group",countryCodes:["us"],languageCodes:["en"],name:"OpenStreetMap US",description:"We help grow and improve OpenStreetMap in the United States.",extendedDescription:"We support OpenStreetMap by holding annual conferences, providing community resources, building partnerships, and by spreading the word. Join OpenStreetMap US here: {signupUrl}",signupUrl:"https://www.openstreetmap.us/join",url:"https://www.openstreetmap.us/",contacts:[{name:"Ian Dees",email:"ian@openstreetmap.us"},{name:"Bryan Housel",email:"bryan@openstreetmap.us"}],events:[{id:"sotmus2019-cfs",i18n:true,name:"Propose a Talk for SotM-US 2019",description:"We are calling on all members of the OpenStreetMap community to share your ideas and session proposals for State of the Map US 2019. Whether you are brand new to OSM or have been a core contributor since the beginning, we want to hear from you!",where:"Minneapolis, Minnesota",when:"2019-jun-01",url:"https://sessionize.com/sotmus2019"},{id:"sotmus2019",i18n:true,name:"State of the Map US 2019",description:"Join the OpenStreetMap community at State of the Map US in Minneapolis, Minnesota. Connect with other mappers, businesses, government agencies, and non profits, all collaborating around the free and editable map of the world.",where:"Minneapolis, Minnesota",when:"2019-sep-05",url:"https://2019.stateofthemap.us/"}]},"OSM-Utah":{id:"OSM-Utah",featureId:"salt_lake_city",type:"meetup",name:"OpenStreetMap Utah",countryCodes:["us"],languageCodes:["en"],description:"Mappers and OpenStreetMap users in the Salt Lake City area",extendedDescription:"Activities may include things like Learn To Map workshops, mapping parties and outdoor data collection. The events will take place in the SLC area, at least initially.  We are looking for seasoned mappers as well as people new to OSM. Join and let's do some mapping!",url:"https://www.meetup.com/OpenStreetMap-Utah/",contacts:[{name:"Martijn van Exel",email:"m@rtijn.org"}]},"OSM-Wyoming":{id:"OSM-Wyoming",featureId:"wyoming",type:"meetup",name:"OpenStreetMap Wyoming",countryCodes:["us"],languageCodes:["en"],description:"Mappers and OpenStreetMap users in the state of Wyoming",extendedDescription:"OpenStreetMap (OSM) Wyoming is a local collaboration of people interested in contributing their efforts to create free maps. We encourage all of our mappers to organize or suggest mapping events throughout the state. Meetup activities can be simple social mixers, OSM basic to advanced training, or community mapping parties.",url:"https://www.meetup.com/OSM-Wyoming/",contacts:[{name:"Russell Deffner",email:"russdeffner@gmail.com"}]},"PHXGeo-meetup":{id:"PHXGeo-meetup",featureId:"phoenix",type:"meetup",name:"PHXGeo Meetup",countryCodes:["us"],languageCodes:["en"],description:"Mappers and OpenStreetMap users in the Phoenix, AZ area",extendedDescription:"This is a meetup group for those in the Phoenix area who like maps, GIS, OpenStreetMap, cartography and anything in between.",url:"https://www.meetup.com/PHXGeo/",contacts:[{name:"Ryan Arp",email:"ryan@arpconsultinggroup.com"}]},"PHXGeo-twitter":{id:"PHXGeo-twitter",featureId:"phoenix",type:"twitter",name:"PHXGeo Twitter",countryCodes:["us"],languageCodes:["en"],description:"Follow us on Twitter at {url}",url:"https://twitter.com/phxgeo",contacts:[{name:"Ryan Arp",email:"ryan@arpconsultinggroup.com"}]},"Western-Slope-facebook":{id:"Western-Slope-facebook",featureId:"grand_junction_co",type:"facebook",name:"Western Slope OSM Facebook",countryCodes:["us"],languageCodes:["en"],description:"Mappers and OpenStreetMap users around Grand Junction, CO",url:"https://www.facebook.com/wsosm/",contacts:[{name:"Aaron Young",email:"aaron@kaartgroup.com"}]},"Western-Slope-meetup":{id:"Western-Slope-meetup",featureId:"grand_junction_co",type:"meetup",name:"Western Slope OSM Meetup",countryCodes:["us"],languageCodes:["en"],description:"Mappers and OpenStreetMap users around Grand Junction, CO",extendedDescription:"The goal of this group is to introduce OpenStreetMap to the community, develop a community of mappers, create the most amazing geodata possible using whatever method we can and finally strategize in order to get this data out into our community. Imagine accurate trail signage! Imagine further development of bike paths! Imagine anything you want, that's the joy of OpenStreetMap!",url:"https://www.meetup.com/Western-Slope-OpenStreetMap/",contacts:[{name:"Aaron Young",email:"aaron@kaartgroup.com"}]},"ym-Ball-State-University":{type:"youthmappers",name:"Gamma Theta Upsilon- Iota Omega Chapter",description:"YouthMappers chapter at Ball State University",id:"ym-Ball-State-University",featureId:"Ball-State-University",contacts:[{name:"Organizer",email:"gtu@bsu.edu"}],extendedDescription:"Our chapter is a very active one. We primarily focus on community events, fundraising, and field trips. We are currently looking to develop more mapping-related activities to draw in other students from campus who may be interested in contributing.",countryCodes:["us"],url:"https://www.facebook.com/BallState.GammaThetaUpsilon/"},"ym-California-University-of-Pennsylvania":{type:"youthmappers",name:"CalU PA GIS Club",description:"YouthMappers chapter at California University of Pennsylvania",id:"ym-California-University-of-Pennsylvania",featureId:"California-University-of-Pennsylvania",contacts:[{name:"Organizer",email:"mueller@calu.edu"}],extendedDescription:"GIS Students at Cal U learn to apply spatial theory to the real world. The university degree program focuses on geography as well as utilizing GIS in emergency management.",countryCodes:["us"],url:"https://www.facebook.com/CalUGisClub/"},"ym-Central-Washington-University":{type:"youthmappers",name:"Geography Club",description:"YouthMappers chapter at Central Washington University",id:"ym-Central-Washington-University",featureId:"Central-Washington-University",contacts:[{name:"Organizer",email:"valkoc@cwu.edu"}],extendedDescription:"Our goal teaming up with Youthmappers is to bring relief to areas that are in need of humanitarian mapping. By doing so, we are serving our fellow brothers and sisters around the world as well as furthering our own cartography skills.",countryCodes:["us"],url:"https://www.cwu.edu/geography/geography-club"},"ym-Clemson-University":{type:"youthmappers",name:"Clemson Mappers",description:"YouthMappers chapter at Clemson University",id:"ym-Clemson-University",featureId:"Clemson-University",contacts:[{name:"Organizer",email:"clemsonmappers@gmail.com"}],extendedDescription:"Students in Clemson are supported by the Center for Geospatial Technologies, a community of interdisciplinary geospatial science practitioners supporting research, teaching, and outreach activities using technologies that enable the collection, analysis, and application of geospatial data. Students integrate geospatial technologies within their scholarly activities across all disciplines and build connections throughout the world.",countryCodes:["us"],url:"http://www.clemsongis.org/#!clemson-mappers/i9w6t"},"ym-College-of-William-and-Mary":{type:"youthmappers",name:"All over the map!",description:"YouthMappers chapter at College of William and Mary",id:"ym-College-of-William-and-Mary",featureId:"College-of-William-and-Mary",contacts:[{name:"Organizer",email:"lnseitz@email.wm.edu"}],extendedDescription:"The students who are all over the map are supported by the Center for Geospatial Analysis, a group integrating GIS across the curriculum and providing student and faculty with hardware, software, and expertise.  Students of all backgrounds utilize GIS across campus, including environmental science and policy, geology, history, business, sociology, biology, anthropology, public policy, and marine sciences.",countryCodes:["us"],url:"mailto:lnseitz@email.wm.edu"},"ym-Cornell-University":{type:"youthmappers",name:"Mapping Society",description:"YouthMappers chapter at Cornell University",id:"ym-Cornell-University",featureId:"Cornell-University",contacts:[{name:"Organizer",email:"mappingsocietycornell@gmail.com"}],extendedDescription:"Cornell students and faculty use open data and open source software to address challenges at local, national, and global scales. In doing so, we advance our academic and personal goals of developing our own skills around GIS and spatial literacy.",countryCodes:["us"],url:"mailto:mappingsocietycornell@gmail.com?subject=Youth%20Mappers%20and%20Mapping%20Society%20at%20Cornell%20University"},"ym-George-Mason-University":{type:"youthmappers",name:"Mason Mappers",description:"YouthMappers chapter at George Mason University",id:"ym-George-Mason-University",featureId:"George-Mason-University",contacts:[{name:"Organizer",email:"masonmappers@gmail.com"}],extendedDescription:"Mason Mappers Student Society is a humanitarian mapping student organization in the George Mason University GGS Department, and its goal is to promote education and knowledge in geo-technologies, geo-info science, to foster good global stewardship and engage in professional development while building a positive, interactive geo-community, as well as shaping students into leaders of tomorrow.",countryCodes:["us"],url:"Facebook.com/MasonMappers"},"ym-Indiana-University-of-Pennsylvania":{type:"youthmappers",name:"Geospatial Science Club",description:"YouthMappers chapter at Indiana University of Pennsylvania",id:"ym-Indiana-University-of-Pennsylvania",featureId:"Indiana-University-of-Pennsylvania",contacts:[{name:"Organizer",email:"rhoch@iup.edu"}],countryCodes:["us"],url:"mailto:rhoch@iup.edu"},"ym-Jacksonville-State-University":{type:"youthmappers",name:"JSU Disaster Mapping Team",description:"YouthMappers chapter at Jacksonville State University",id:"ym-Jacksonville-State-University",featureId:"Jacksonville-State-University",contacts:[{name:"Organizer",email:"ltatum@stu.jsu.edu"}],extendedDescription:"The JSU Disaster Mapping Team is a program at Jacksonville State University dedicated to assisting disaster response in times of emergencies. This includes tornadoes, severe thunderstorms, floods, etc. The team is intended to be a valuable asset to surrounding counties and a conduit for the JSU Geoscience Department students to apply what they have learned in an academic setting to support emergency services. Our goal is to streamline disaster response and recovery operations while utilizing student skill sets",countryCodes:["us"],url:"mailto:ltatum@stu.jsu.edu"},"ym-Kansas-State-University":{type:"youthmappers",name:"Gamma Theta Upsilon: Beta Psi Chapter",description:"YouthMappers chapter at Kansas State University",id:"ym-Kansas-State-University",featureId:"Kansas-State-University",contacts:[{name:"Organizer",email:"tblarsen@ksu.edu"}],extendedDescription:"We are the Kansas State University Chapter of Gamma Theta Upsilon, an international geography honor society with affiliation to YouthMappers. We have been active with mapping for OSM and conducted a mapathon called \"Map for Nepal,\" in which we used OpenStreetMap to digitize unmapped areas of Nepal after the earthquake in 2015.",countryCodes:["us"],url:"https://www.facebook.com/kstate.gtu?fref=ts"},"ym-McGill-University":{type:"youthmappers",name:"Open Mapping Group McGill: A Member of the McGill Undergraduate Geography Society",description:"YouthMappers chapter at McGill University",id:"ym-McGill-University",featureId:"McGill-University",contacts:[{name:"Organizer",email:"omg.mcgill@gmail.com"}],extendedDescription:"The Open Mapping Group McGill: A Member of McGill Undergraduate Geography Society (OMG McGill) aims to connect students with open geospatial data and technologies to enhance resilience, community-building, and learning through mapping–on campus, in Montreal, in Canada, and abroad.",countryCodes:["ca"],url:"mailto:omg.mcgill@gmail.com"},"ym-Miami-University":{type:"youthmappers",name:"Geography and Planning Society",description:"YouthMappers chapter at Miami University",id:"ym-Miami-University",featureId:"Miami-University",contacts:[{name:"Organizer",email:"gpsmiamioh@gmail.com"}],extendedDescription:"GPS at Miami University aims to create a close-knit community of planners and geographers who want to have fun, learn more about careers and higher education in their field, network, and work alongside professionals for real experience.",countryCodes:["us"],url:"mailto:GPSMiamiOH@gmail.com"},"ym-Monroe-Community-College":{type:"youthmappers",name:"MCC Mapping Corps",description:"YouthMappers chapter at Monroe Community College",id:"ym-Monroe-Community-College",featureId:"Monroe-Community-College",contacts:[{name:"Organizer",email:"gist@monroecc.edu"}],countryCodes:["us"],url:"mailto:GIST@monroecc.edu"},"ym-Montgomery-College":{type:"youthmappers",name:"GeoMC",description:"YouthMappers chapter at Montgomery College",id:"ym-Montgomery-College",featureId:"Montgomery-College",contacts:[{name:"Organizer",email:"stephanie.calderon@montgomerycollege.edu"}],extendedDescription:"GeoMC’s mission is to provide students with hands-on experience in applying geospatial tools, collecting data, and project management. Most of our students come with a background in GIS and are geography majors. Our chapter’s members come from diverse backgrounds and we all work together to make a positive impact in the world live in.",countryCodes:["us"],url:"mailto:stephanie.calderon@montgomerycollege.edu"},"ym-New-York-University":{type:"youthmappers",name:"NYU mHealth Initiative Mapping Corps",description:"YouthMappers chapter at New York University",id:"ym-New-York-University",featureId:"New-York-University",contacts:[{name:"Organizer",email:"mhealth@nyu.edu"}],extendedDescription:"The NYU mobile health or “mHealth” research initiative focuses on development of systems that link people - usually via their phones - to the places that they live and traverse, and thus supports novel research on the way phones and maps can be leveraged to understand behavioral decision making and ultimately health outcomes.",countryCodes:["us"],url:"www.nyumhealth.org"},"ym-Ohio-Wesleyan-University":{type:"youthmappers",name:"Environment and Wildlife Club",description:"YouthMappers chapter at Ohio Wesleyan University",id:"ym-Ohio-Wesleyan-University",featureId:"Ohio-Wesleyan-University",contacts:[{name:"Organizer",email:"envirowild@owu.edu"}],extendedDescription:"Environment and Wildlife Club looks at environmental issues on campus, in Delaware, and even nationally! We create campus and community projects, explore and enjoy the outdoors, volunteer, and try to promote environmentalism in every aspect of our lives.",countryCodes:["us"],url:"mailto:envirowild@owu.edu"},"ym-Oklahoma-State-University":{type:"youthmappers",name:"Geography Club",description:"YouthMappers chapter at Oklahoma State University",id:"ym-Oklahoma-State-University",featureId:"Oklahoma-State-University",contacts:[{name:"Organizer",email:"hhayden@okstate.edu"}],countryCodes:["us"],url:"mailto:hhayden@okstate.edu"},"ym-State-University-of-New-York-Geneseo":{type:"youthmappers",name:"SUNY Geneseo GIS Association",description:"YouthMappers chapter at State University of New York Geneseo",id:"ym-State-University-of-New-York-Geneseo",featureId:"State-University-of-New-York-Geneseo",contacts:[{name:"Organizer",email:"bb18@geneseo.edu"}],extendedDescription:"We spread awareness, support, education, volunteerism, and career advancement opportunities in geographic information systems, across disciplines and departments, in the context of SUNY Geneseo, the local community, and global community.",countryCodes:["us"],url:"http://www.facebook.com/GeneseoGIS"},"ym-SUNY-at-Fredonia":{type:"youthmappers",name:"Geoventurers",description:"YouthMappers chapter at SUNY at Fredonia",id:"ym-SUNY-at-Fredonia",featureId:"SUNY-at-Fredonia",contacts:[{name:"Organizer",email:"amw30@geneseo.edu"}],extendedDescription:"GeoVenturers is a group of students joining together across a number of majors on our campus that see geospatial technologies as a tool to serve others and to bring people together. Mentoring for the group brings in science education from the department of curriculum and instruction. We hope that we can bring our skills to play in helping make people's lives better.",countryCodes:["us"],url:"mailto:amw30@geneseo.edu?subject=GeoVenturers%20and%20the%20YouthMappers%20network"},"ym-Texas-Tech-University":{type:"youthmappers",name:"YouthMappers at TTU",description:"YouthMappers chapter at Texas Tech University",id:"ym-Texas-Tech-University",featureId:"Texas-Tech-University",contacts:[{name:"Organizer",email:"emily.glaeser@ttu.edu"}],extendedDescription:"As one of the co-founding chapters of the network, the TTU YouthMappers are enthusiastic to serve as interdisciplinary leaders to help create open geographic data and analyses that address locally defined development challenges worldwide. The chapter strives to exchange and collaborate with other chapters around the globe while also offering themselves as a local resource and service to Texas Tech student organizations in ways that add value to their respecitive campus activities through mapping.",countryCodes:["us"],url:"https://www.facebook.com/youthmapperstexastech/"},"ym-The-Citadel":{type:"youthmappers",name:"YouthMappers at The Citadel",description:"YouthMappers chapter at The Citadel",id:"ym-The-Citadel",featureId:"The-Citadel",contacts:[{name:"Organizer",email:"cstokes5@citadel.edu"}],extendedDescription:"This chapter is also a Rotaract Club, which is an affiliate of Rotary International. Multiple members, as well as leadership have expressed an interest in YouthMappers and we would like to affiliate our Citadel Rotaract Club with YouthMappers.",countryCodes:["us"],url:"Mailto:cstokes5@citadel.edu"},"ym-The-George-Washington-University":{type:"youthmappers",name:"Humanitarian Mapping Society",description:"YouthMappers chapter at The George Washington University",id:"ym-The-George-Washington-University",featureId:"The-George-Washington-University",contacts:[{name:"Organizer",email:"hms.gwu@gmail.com"}],extendedDescription:"Models of leadership and engagement, HMS seeks to render aid and better the world through humanitarian Geographic Information Systems (GIS) projects. This co-founding affiliated chapter on the campus of GWU has a plethora of experience to share, and frequently partners directly with USAID, the American Red Cross, and the US Department of State in their DC area to expand student-led efforts and serve the global community.",countryCodes:["us"],url:"https://www.facebook.com/GWHMS/"},"ym-The-Johns-Hopkins-University-SAIS":{type:"youthmappers",name:"SAIS YouthMappers",description:"YouthMappers chapter at The Johns Hopkins University, SAIS",id:"ym-The-Johns-Hopkins-University-SAIS",featureId:"The-Johns-Hopkins-University-SAIS",contacts:[{name:"Organizer",email:"saisyouthmappers@gmail.com"}],extendedDescription:"The mission of SAIS Youth Mappers is to provide students at the Johns Hopkins University SAIS with the opportunity to become highly skilled humanitarian mappers. As a group within the South Asia Club, its primary focus is on supporting humanitarian mapping projects in the Indo-Pacific Region.",countryCodes:["us"],url:"mailto:saisyouthmappers@gmail.com"},"ym-The-Pennsylvania-State-University":{type:"youthmappers",name:"Penn State GIS Coalition",description:"YouthMappers chapter at The Pennsylvania State University",id:"ym-The-Pennsylvania-State-University",featureId:"The-Pennsylvania-State-University",contacts:[{name:"Organizer",email:"advising@geog.psu.edu"}],extendedDescription:"The Penn State Geospatial Information Science (GIS) Coalition is an organization that offers students majoring, minoring, or sharing an interest in GIS opportunities to develop supplementary knowledge and skills necessary to succeed in the professional GIS industry.",countryCodes:["us"],url:"mailto:advising@geog.psu.edu"},"ym-University-of-California-Davis":{type:"youthmappers",name:"Mapping Club",description:"YouthMappers chapter at University of California, Davis",id:"ym-University-of-California-Davis",featureId:"University-of-California-Davis",contacts:[{name:"Organizer",email:"ucdmappingclub@ucdavis.edu"}],countryCodes:["us"],url:"mailto:ucdmappingclub@ucdavis.edu?subject=YouthMappers%20and%20UC%20Davis%20Mapping%20Club"},"ym-University-of-Central-Florida":{type:"youthmappers",name:"Geospatial Information Society",description:"YouthMappers chapter at University of Central Florida",id:"ym-University-of-Central-Florida",featureId:"University-of-Central-Florida",contacts:[{name:"Organizer",email:"rsouth@knights.ucf.edu"}],extendedDescription:"Our mission is to foster a social and educational environment for all majors who are interested in the discussion and application of GIS. Group and community events throughout the academic year organize students to volunteer to help local and regional communities by using community-based GIS projects and educating local middle and high school students on the use and application of GIS.",countryCodes:["us"],url:"mailto:rsouth@knights.ucf.edu"},"ym-University-of-Chicago":{type:"youthmappers",name:"Tobler Society",description:"YouthMappers chapter at University of Chicago",id:"ym-University-of-Chicago",featureId:"University-of-Chicago",contacts:[{name:"Organizer",email:"toblersociety@uchicago.edu"}],countryCodes:["us"],url:"mailto:toblersociety@uchicago.edu"},"ym-University-of-Maryland-College-Park":{type:"youthmappers",name:"Geography Club",description:"YouthMappers chapter at University of Maryland - College Park",id:"ym-University-of-Maryland-College-Park",featureId:"University-of-Maryland-College-Park",contacts:[{name:"Organizer",email:"geogclubumd@gmail.com"}],extendedDescription:"The mission of the Geography Club at the University of Maryland College Park is to engage and encourage students to explore geographic interests within the campus and the community.",countryCodes:["us"],url:"https://www.facebook.com/UMDGeographyClub/?fref=ts"},"ym-University-of-North-Texas":{type:"youthmappers",name:"UNT Geography Club",description:"YouthMappers chapter at University of North Texas",id:"ym-University-of-North-Texas",featureId:"University-of-North-Texas",contacts:[{name:"Organizer",email:"reeseramsey@my.unt.edu"}],extendedDescription:"The Geography Club is a student organization at University of North Texas that welcomes all students who are interested in geography. The objective of the Geography Club is to promote interest in Geography, the Major and the Geography Department along with fellowship among students and faculty. The club also seeks to represent student needs and wants in regard to the study of geography and to provide a forum for the presentation of innovative ideas to the benefit of the University community.",countryCodes:["us"],url:"Mailto:reeseramsey@my.unt.edu"},"ym-University-of-Northern-Colorado":{type:"youthmappers",name:"UNCO Geography and GIS Club",description:"YouthMappers chapter at University of Northern Colorado",id:"ym-University-of-Northern-Colorado",featureId:"University-of-Northern-Colorado",contacts:[{name:"Organizer",email:"uncogeoggisclub@gmail.com"}],extendedDescription:"Official Geography and GIS Club chapter affiliated with the University of Northern Colorado where our aim is to learn, share and connect with those around us. #MakingSenseOfTheWorld",countryCodes:["us"],url:"www.facebook.com/groups/476365076071166/"},"ym-University-of-Oregon":{type:"youthmappers",name:"Map by Northwest",description:"YouthMappers chapter at University of Oregon",id:"ym-University-of-Oregon",featureId:"University-of-Oregon",contacts:[{name:"Organizer",email:"cbone@uoregon.edu"}],extendedDescription:"Map By Northwest aims to engage undergraduate students at the University of Oregon in mapping projects to assist in humanitarian causes and for conducting geographic research. We welcome students from all disciplines to join us in our mapping adventures.",countryCodes:["us"],url:"http://blogs.uoregon.edu/mxnw/"},"ym-University-of-Redlands":{type:"youthmappers",name:"URSpatial Geo-Thinkers",description:"YouthMappers chapter at University of Redlands",id:"ym-University-of-Redlands",featureId:"University-of-Redlands",contacts:[{name:"Organizer",email:"nathan_strout@redlands.edu"}],extendedDescription:"To build upon the members' GIS skills and knowledge of the tools and methods through applied social engagement as well as to educate the campus community about the power of mapping and spatial analysis through community service events.",countryCodes:["us"],url:"mailto:nathan_strout@redlands.edu"},"ym-University-of-South-Carolina":{type:"youthmappers",name:"Geography Graduate Student Association",description:"YouthMappers chapter at University of South Carolina",id:"ym-University-of-South-Carolina",featureId:"University-of-South-Carolina",contacts:[{name:"Organizer",email:"carolina_ggsa@gmail.com"}],extendedDescription:"The GGSA is a fully student-run organization, designed to serve as an advocate and resource for all geography graduate students by filling the role of liaison between the department and students. Our goal is to further professional, academic, and personal development of graduate students interested in the field of geography and its sub disciplines.",countryCodes:["us"],url:"https://carolinaggsa.wordpress.com/"},"ym-University-of-Southern-California":{type:"youthmappers",name:"SC Mappers",description:"YouthMappers chapter at University of Southern California",id:"ym-University-of-Southern-California",featureId:"University-of-Southern-California",contacts:[{name:"Organizer",email:"scmappers@gmail.com"}],extendedDescription:"We see the world differently: we view it through a spatial lens. With the power of spatial thinking, we connect place and space to help address global challenges. Collaborate with us!",countryCodes:["us"],url:"mailto:scmappers@gmail.com?subject=YouthMappers%20at%20USC"},"ym-University-of-Vermont":{type:"youthmappers",name:"University of Vermont Humanitarian Mapping Club",description:"YouthMappers chapter at University of Vermont",id:"ym-University-of-Vermont",featureId:"University-of-Vermont",contacts:[{name:"Organizer",email:"uvm.hmc@gmail.com"}],countryCodes:["us"],url:"https://www.facebook.com/UVMHMC"},"ym-University-of-Victoria":{type:"youthmappers",name:"Society of Geography Students",description:"YouthMappers chapter at University of Victoria",id:"ym-University-of-Victoria",featureId:"University-of-Victoria",contacts:[{name:"Organizer",email:"sogsmappers@gmail.com"}],extendedDescription:"SOGS seeks to promote and represent social and academic interests within the Department of Geography. This is expressed by four key goals: To provide a forum for the discussion of matters concerning the quality and accessibility of education within geography; to provide a means of expressing a consensus of student opinion to deparhnental faculty through representation at deparkrnental meetings and on departrnental committees; to undertake anangements for such activities as are for the benefit of students and are seen to be within the field of interest of students in geography; to act as a liaison through the UVSS and the Course Union Council with other student groups on campus",url:"https://www.facebook.com/SOGSUVic/"},"ym-University-of-Wyoming":{type:"youthmappers",name:"Gamma Theta Upsilon/Geography Club",description:"YouthMappers chapter at University of Wyoming",id:"ym-University-of-Wyoming",featureId:"University-of-Wyoming",contacts:[{name:"Organizer",email:"gtu-geography@uwyo.edu"}],countryCodes:["us"],url:"http://www.uwyo.edu/geography/geographyclub/"},"ym-UW-Madison":{type:"youthmappers",name:"BadgerMaps",description:"YouthMappers chapter at UW-Madison",id:"ym-UW-Madison",featureId:"UW-Madison",contacts:[{name:"Organizer",email:"uwbadgermaps@gmail.com"}],extendedDescription:"BadgerMaps is the UW campus chapter of Youthmappers, an organization dedicated to humanitarian and community mapping services. We connect our volunteer network with opportunities to create GIS data for projects that need it.",countryCodes:["us"],url:"https://www.facebook.com/UW-BadgerMaps-197746270811951/"},"ym-Vassar-College":{type:"youthmappers",name:"Hudson Valley Mappers",description:"YouthMappers chapter at Vassar College",id:"ym-Vassar-College",featureId:"Vassar-College",contacts:[{name:"Organizer",email:"geo@vassar.edu"}],extendedDescription:"Our mission is to provide a multi-disciplinary platform for peers, educators, and community organizations to engage in local mapping projects with a focus on strengthening our local ecosystems, our built environment, and the health of our community. We also seek to contribute geospatial support for global humanitarian aid and development efforts.",countryCodes:["us"],url:"http://pages.vassar.edu/gis/vassar-youthmappers/"},"ym-Villanova-University":{type:"youthmappers",name:"The Villanova Globeplotters",description:"YouthMappers chapter at Villanova University",id:"ym-Villanova-University",featureId:"Villanova-University",contacts:[{name:"Organizer",email:"villanova.globeplotters@gmail.com"}],extendedDescription:"The Villanova Globeplotters is built on Villanova’s Augustinian principle of selfless-service to the global community. Mixed with relaxed social interaction, we strive to provide geospatial outreach to those in need regardless of participating students’ race, academic major, student group association, or college career level.",countryCodes:["us"],url:"mailto:villanova.globeplotters@gmail.com"},"ym-West-Virginia-University":{type:"youthmappers",name:"Maptime Morgantown",description:"YouthMappers chapter at West Virginia University",id:"ym-West-Virginia-University",featureId:"West-Virginia-University",contacts:[{name:"Organizer",email:"maptimemorgantown@gmail.com"}],extendedDescription:"Working as a collaborative team, this co-founding chapter focuses on providing an open learning environment for those interested in working on projects that intersect international development, emergency response, and geographic information science.\nThey connect beginners and experts by providing technical training and experience in building meaningful and useful geographic infrastructure data, while connecting to sister cities around the world.",countryCodes:["us"],url:"mailto:MaptimeMorgantown@gmail.com?subject=Maptime%20Morgantown%20from%20YouthMappers%20website"},"ym-Western-Michigan-University":{type:"youthmappers",name:"Geography Club",description:"YouthMappers chapter at Western Michigan University",id:"ym-Western-Michigan-University",featureId:"Western-Michigan-University",contacts:[{name:"Organizer",email:"wmu.geog.club@gmail.com"}],countryCodes:["us"],url:"http://www.facebook.com/groups/WMUGeographyClub/"},"Maptime-Australia-Slack":{id:"Maptime-Australia-Slack",featureId:"australia_full",type:"slack",countryCodes:["au"],languageCodes:["en"],name:"Maptime Australia Slack",description:"Sign up at {signupUrl}",signupUrl:"https://bit.ly/maptimeau",url:"https://maptimeaustralia.slack.com",contacts:[{name:"David Dean",email:"ddean@ieee.org"},{name:"Philip Mallis",email:"philip.mallis@unimelb.edu.au"},{name:"Edoardo Neerhut",email:"ed@mapillary.com"}]},"talk-au":{id:"talk-au",featureId:"australia_full",type:"mailinglist",countryCodes:["au"],languageCodes:["en"],name:"Talk-au Mailing List",description:"Place for Aussie mappers to chat",url:"https://lists.openstreetmap.org/listinfo/talk-au",contacts:[{name:"Ben Kelley",email:"ben.kelley@gmail.com"},{name:"Steve Bennett",email:"stevagewp@gmail.com"},{name:"Ian Sergeant",email:"inas66+osm@gmail.com"}]},"OSM-AR-facebook":{id:"OSM-AR-facebook",featureId:"argentina",type:"facebook",name:"OpenStreetMap Argentina Facebook",countryCodes:["ar"],languageCodes:["es"],description:"Join the OpenStreetMap Argentina community on Facebook",extendedDescription:"News from the local community",url:"https://www.facebook.com/OpenStreetMapArgentina/",contacts:[{name:"OpenStreetMap Argentina",email:"openstreetmap.org.ar@gmail.com"}]},"OSM-AR-forum":{id:"OSM-AR-forum",featureId:"argentina",type:"forum",name:"OpenStreetMap Argentina web forum",countryCodes:["ar"],languageCodes:["es"],description:"Join the OpenStreetMap Argentina web forum",extendedDescription:"Ideal for long or important discussions. Slow response time.",url:"https://forum.openstreetmap.org/viewforum.php?id=49",contacts:[{name:"OpenStreetMap Argentina",email:"openstreetmap.org.ar@gmail.com"}]},"OSM-AR-irc":{id:"OSM-AR-irc",featureId:"argentina",type:"irc",name:"OpenStreetMap Argentina IRC",countryCodes:["ar"],languageCodes:["es"],description:"Join #osm-ar on irc.oftc.net (port 6667)",extendedDescription:"You may find the most geeky user in the community.",url:"https://webchat.oftc.net/?channels=osm-ar",contacts:[{name:"OpenStreetMap Argentina",email:"openstreetmap.org.ar@gmail.com"}]},"OSM-AR-mailinglist":{id:"OSM-AR-mailinglist",featureId:"argentina",type:"mailinglist",name:"Talk-ar Mailing List",countryCodes:["ar"],languageCodes:["es"],description:"Historic mailing list. Almost unused today.",url:"https://lists.openstreetmap.org/pipermail/talk-ar/",contacts:[{name:"OpenStreetMap Argentina",email:"openstreetmap.org.ar@gmail.com"}]},"OSM-AR-telegram":{id:"OSM-AR-telegram",featureId:"argentina",type:"telegram",name:"OpenStreetMap Argentina Telegram",countryCodes:["ar"],languageCodes:["es"],description:"Join the OpenStreetMap Argentina community on Telegram",extendedDescription:"The most active channel in the community, ideal for chatting and getting answers to your questions instantly. Everyone is welcome!",url:"https://telegram.me/osm_ar",contacts:[{name:"OpenStreetMap Argentina",email:"openstreetmap.org.ar@gmail.com"}]},"OSM-AR-twitter":{id:"OSM-AR-twitter",featureId:"argentina",type:"twitter",name:"OpenStreetMap Argentina Twitter",countryCodes:["ar"],languageCodes:["es"],description:"Follow us on Twitter at {url}",extendedDescription:"News from the local community and OpenStreetMap in general.",url:"https://twitter.com/OpenStreetMapAr",contacts:[{name:"OpenStreetMap Argentina",email:"openstreetmap.org.ar@gmail.com"}]},"OSM-BO-mailinglist":{id:"OSM-BO-mailinglist",featureId:"bolivia",type:"mailinglist",name:"Talk-bo Mailing List",countryCodes:["bo"],languageCodes:["es"],description:"Talk-bo is the official mailing list for the Bolivian OpenStreetMap community",extendedDescription:"Mapping in Bolivia? Have questions, want to connect with the community here? Join us at {url}. All are welcome!",url:"https://lists.openstreetmap.org/pipermail/talk-bo/",contacts:[{name:"Marco Antonio",email:"marcoantoniofrias@gmail.com"}]},"Bahia-telegram":{id:"Bahia-telegram",featureId:"bahia",type:"telegram",name:"OpenStreetMap Bahia Telegram Group",countryCodes:["br"],languageCodes:["pt"],description:"Join the OpenStreetMap Bahia community on Telegram",extendedDescription:"Join the community to learn more about OpenStreetMap, ask questions or participate in our meetings. Everyone is welcome!",url:"https://t.me/OSMBA",contacts:[{name:"Wille Marcel",email:"wille@wille.blog.br"}]},"DF-telegram":{id:"DF-telegram",featureId:"df_br",type:"telegram",name:"OpenStreetMap Brasília Telegram Group",countryCodes:["br"],languageCodes:["pt"],description:"Join the OpenStreetMap Brasília community on Telegram",extendedDescription:"Join the community to learn more about OpenStreetMap, ask questions or participate in our meetings. Everyone is welcome!",url:"https://t.me/osmbsb",contacts:[{name:"Wille Marcel",email:"wille@wille.blog.br"}]},"OSM-br-mailinglist":{id:"OSM-br-mailinglist",featureId:"brazil",type:"mailinglist",name:"Talk-br Mailing List",countryCodes:["br"],languageCodes:["pt"],description:"A mailing list to discuss OpenStreetMap in Brazil",url:"https://lists.openstreetmap.org/pipermail/talk-br/",contacts:[{name:"Arlindo Pereira",email:"nighto@gmail.com"}]},"OSM-br-telegram":{id:"OSM-br-telegram",featureId:"brazil",type:"telegram",name:"OpenStreetMap Brasil Telegram",countryCodes:["br"],languageCodes:["pt"],description:"Join the OpenStreetMap Brasil community on Telegram",extendedDescription:"Join the community to learn more about OpenStreetMap, ask questions or participate in our meetings. Everyone is welcome!",url:"https://t.me/OSMBrasil_Comunidade",contacts:[{name:"Vitor George",email:"vitor.george@gmail.com"}],events:[{id:"webinar_mundogeo",name:"Webinar: OpenStreetMap em Prefeituras e Empresas",description:"Participe do webinar sobre como utilizar o OpenStreeMap em prefeituras e empresas.",where:"Online",when:"2018-05-02 14:30",url:"http://mundogeo.com/webinar/webinar.html"},{id:"mundogeo",name:"Painel OpenStreetMap no MundoGeo #connect",description:"Participe do painel sobre o OpenStreetMap no MundoGeo #connect.",where:"São Paulo, SP, Brasil",when:"2018-05-16 11:00",url:"http://mundogeoconnect.com/2018/atividades-especiais/"}]},"OSM-br-twitter":{id:"OSM-br-twitter",featureId:"brazil",type:"twitter",name:"OpenStreetMap Brasil Twitter",countryCodes:["br"],languageCodes:["pt"],description:"Follow us on Twitter at {url}",url:"https://twitter.com/OpenStreetMapBR",contacts:[{name:"Wille Marcel",email:"wille@wille.blog.br"}]},"RS-telegram":{id:"RS-telegram",featureId:"rs_br",type:"telegram",name:"OpenStreetMap Rio Grande do Sul Telegram Group",countryCodes:["br"],languageCodes:["pt"],description:"Join the OpenStreetMap Rio Grande do Sul community on Telegram",extendedDescription:"Join the community to learn more about OpenStreetMap, ask questions or participate in our meetings. Everyone is welcome!",url:"https://t.me/osmrs",contacts:[{name:"No one",email:"nobody@nowhere.org"}]},"OSM-CL-facebook":{id:"OSM-CL-facebook",featureId:"chile",type:"facebook",name:"OpenStreetMap Chile Facebook",countryCodes:["cl"],languageCodes:["es"],description:"Join the OpenStreetMap Chile community on Facebook",extendedDescription:"Join the community to learn more about OpenStreetMap, ask questions or participate in our meetings. Everyone is welcome!",url:"https://www.facebook.com/OpenStreetMap-Chile-145127198882915/",contacts:[{name:"Julio Costa",email:"julio.costa@openstreetmap.cl"}]},"OSM-CL-mailinglist":{id:"OSM-CL-mailinglist",featureId:"chile",type:"mailinglist",name:"Talk-cl Mailing List",countryCodes:["cl"],languageCodes:["es"],description:"A mailing list to discuss OpenStreetMap in Chile",url:"https://lists.openstreetmap.org/pipermail/talk-cl/",contacts:[{name:"Julio Costa",email:"julio.costa@openstreetmap.cl"}]},"OSM-CL-telegram":{id:"OSM-CL-telegram",featureId:"chile",type:"telegram",name:"OpenStreetMap Chile Telegram",countryCodes:["cl"],languageCodes:["es"],description:"Join the OpenStreetMap Chile community on Telegram",extendedDescription:"Join the community to learn more about OpenStreetMap, ask questions or participate in our meetings. Everyone is welcome!",url:"https://t.me/OSMcl",contacts:[{name:"Julio Costa",email:"julio.costa@openstreetmap.cl"}]},"OSM-CL-twitter":{id:"OSM-CL-twitter",featureId:"chile",type:"twitter",name:"OpenStreetMap Chile Twitter",countryCodes:["cl"],languageCodes:["es"],description:"Follow us on Twitter at {url}",url:"https://twitter.com/osmCL",contacts:[{name:"Julio Costa",email:"julio.costa@openstreetmap.cl"}]},"Maptime-Bogota":{id:"Maptime-Bogota",featureId:"bogota",type:"meetup",name:"Maptime Bogotá",countryCodes:["co"],languageCodes:["es"],description:"We're a group of mappers interested in mapping in OpenStreetMap around Bogotá.",extendedDescription:"Learn to collect data in the field and digitize onto OpenStreetMap.  It is not necessary to have previous knowledge! You just need the desire to participate, learn, and have fun.",url:"https://www.meetup.com/Maptime-Colombia-OSM/",contacts:[{name:"Andrés Gómez Casanova",email:"angoca@gmail.com"}]},"OSM-CO-facebook":{id:"OSM-CO-facebook",featureId:"colombia",type:"facebook",name:"OpenStreetMap Colombia Facebook",countryCodes:["co"],languageCodes:["es"],description:"Join the OpenStreetMap Colombia community on Facebook",extendedDescription:"Join the community to learn more about OpenStreetMap. Everyone is welcome!",url:"https://www.facebook.com/groups/OsmCol/",contacts:[{name:"Fredy Rivera",email:"fredyrivera@gmail.com"}]},"OSM-CO-mailinglist":{id:"OSM-CO-mailinglist",featureId:"colombia",type:"mailinglist",name:"Talk-co Mailing List",countryCodes:["co"],languageCodes:["es"],description:"A mailing list to discuss OpenStreetMap in Colombia",url:"https://lists.openstreetmap.org/pipermail/talk-co/",contacts:[{name:"Fredy Rivera",email:"fredyrivera@gmail.com"}]},"OSM-CO-telegram":{id:"OSM-CO-telegram",type:"telegram",featureId:"colombia",countryCodes:["co"],languageCodes:["es"],name:"OSM Colombia on Telegram",description:"OpenStreetMap Colombia Telegram chat",url:"https://telegram.me/osmco",contacts:[{name:"Fredy Rivera",email:"fredyrivera@gmail.com"}]},"OSM-CO-twitter":{id:"OSM-CO-twitter",featureId:"colombia",type:"twitter",name:"OpenStreetMap Colombia Twitter",countryCodes:["co"],languageCodes:["es"],description:"Follow us on Twitter at {url}",url:"https://twitter.com/OpenStreetMapCo",contacts:[{name:"Fredy Rivera",email:"fredyrivera@gmail.com"}]},"OSM-CO":{id:"OSM-CO",featureId:"colombia",type:"group",countryCodes:["co"],languageCodes:["es"],name:"OpenStreetMap Colombia",description:"News of the OpenStreetMap Colombia community and the OSMCo Foundation",url:"https://blog.openstreetmap.co/s657",contacts:[{name:"Fredy Rivera",email:"fredyrivera@gmail.com"}]},"ym-Universidad-de-Antioquia":{type:"youthmappers",name:"Geomatica UDEA",description:"YouthMappers chapter at Universidad de Antioquia",id:"ym-Universidad-de-Antioquia",featureId:"Universidad-de-Antioquia",contacts:[{name:"Organizer",email:"geomatica.ing.udea@gmail.com"}],extendedDescription:"We are a group interested in geospatial data, voluntary cartography, and participating in mapping with others in our country and within the YouthMappers network.",countryCodes:["co"],url:"mailto:geomatica.ing.udea@gmail.com?subject=YouthMappers%20y%20Universidad%20de%20Antioquia"},"ym-Universidad-de-La-Guajira":{type:"youthmappers",name:"Grupo Mesh",description:"YouthMappers chapter at Universidad de La Guajira",id:"ym-Universidad-de-La-Guajira",featureId:"Universidad-de-La-Guajira",contacts:[{name:"Organizer",email:"zoviedo@uniguajira.edu.co"}],extendedDescription:"Grupo Mesh is a student organization at the Universidad de la Guajira in Colombia, including students from the program of Environmental Engineering who learn cartography and open mapping.",countryCodes:["co"],url:"mailto:zoviedo@uniguajira.edu.co?subject=Grupo%20Mesh%20y%20YouthMappers"},"ym-Universidad-de-Los-Andes":{type:"youthmappers",name:"Cartografos Uniandes",description:"YouthMappers chapter at Universidad de Los Andes",id:"ym-Universidad-de-Los-Andes",featureId:"Universidad-de-Los-Andes",contacts:[{name:"Organizer",email:"geografia@uniandes.edu.co"}],extendedDescription:"We are a circle of student participation that seeks to use mapping and spatial reasoning as a means to create bonds of cooperation and integration between the university and society by addressing different spatial, social, political , economic and cultural dynamics.",countryCodes:["co"],url:"mailto:geografia@uniandes.edu.co?subject=Youth%20Mappers%20Chapter%20y%20la%20Universidad%20de%20los%20Andes"},"ym-Universidad-de-San-Buenaventura":{type:"youthmappers",name:"YouthMappers San Buenaventura",description:"YouthMappers chapter at Universidad de San Buenaventura",id:"ym-Universidad-de-San-Buenaventura",featureId:"Universidad-de-San-Buenaventura",contacts:[{name:"Organizer",email:"ingenieria.sistemas@usbmed.edu.co"}],extendedDescription:"We are pleased to join YouthMappers mapping for a better world and community.",countryCodes:["co"],url:"https://www.facebook.com/groups/1742657446017065/"},"ym-Universidad-Distrital-Francisco-Jose-de-Caldas":{type:"youthmappers",name:"YouthMappers at Bogota",description:"YouthMappers chapter at Universidad Distrital Francisco Jose de Caldas",id:"ym-Universidad-Distrital-Francisco-Jose-de-Caldas",featureId:"Universidad-Distrital-Francisco-Jose-de-Caldas",contacts:[{name:"Organizer",email:"lrocha@selper.org.co"}],extendedDescription:"The Universidad Distrital Francisco José de Caldas is a public, coeducational, research university based in Bogotá, Colombia with a population of 26,140 students.",countryCodes:["co"],url:"mailto:lrocha@selper.org.co"},"ym-Universidad-Nacional-de-Colombia":{type:"youthmappers",name:"Grupo UN",description:"YouthMappers chapter at Universidad Nacional de Colombia",id:"ym-Universidad-Nacional-de-Colombia",featureId:"Universidad-Nacional-de-Colombia",contacts:[{name:"Organizer",email:"raknudsono@unal.edu.co"}],extendedDescription:"Students are uniting to map and network with university students across the country of Colombia and across the globe.  Geographic specialties include affiliation with microbiology and health disciplines.",countryCodes:["co"],url:"mailto:raknudsono@unal.edu.co?subject=Youth%20Mappers%20y%20Grupo%20UN%20Colombia"},"OSM-EC-telegram":{id:"OSM-EC-telegram",type:"telegram",featureId:"ecuador",languageCodes:["es"],countryCodes:["ec"],name:"OSM Ecuador on Telegram",description:"OpenStreetMap Ecuador Telegram chat",url:"https://telegram.me/MappingEcuador",contacts:[{name:"Talk-ec Owner",email:"talk-ec-owner@openstreetmap.org"}]},"OSM-PY-telegram":{id:"OSM-PY-telegram",type:"telegram",featureId:"paraguay",languageCodes:["es"],countryCodes:["py"],name:"OSM Paraguay on Telegram",description:"OpenStreetMap Paraguay Telegram chat",url:"https://telegram.me/osm_py",contacts:[{name:"Talk-py Owner",email:"talk-py-owner@openstreetmap.org"}]},"OSM-PE-facebook":{id:"OSM-PE-facebook",featureId:"peru",type:"facebook",name:"OpenStreetMap Peru Facebook",countryCodes:["pe"],languageCodes:["es"],description:"Join the OpenStreetMap Peru community on Facebook",url:"https://www.facebook.com/Osmpe",contacts:[{name:"Diego Sangunietti",email:"diego.sanguinetti@hotmail.com"},{name:"Ruben Lopez M.",email:"rub2106@gmail.com"}]},"OSM-PE-mailinglist":{id:"OSM-PE-mailinglist",featureId:"peru",type:"mailinglist",name:"Talk-pe Mailing List",countryCodes:["pe"],languageCodes:["es"],description:"The official mailing list for the OpenStreetMap Peru community",url:"https://lists.openstreetmap.org/pipermail/talk-pe/",contacts:[{name:"Diego Sangunietti",email:"diego.sanguinetti@hotmail.com"},{name:"Ruben Lopez M.",email:"rub2106@gmail.com"}]},"OSM-PE-matrix":{id:"OSM-PE-matrix",featureId:"peru",type:"matrix",name:"OpenStreetMap Peru Matrix Chat",countryCodes:["pe"],languageCodes:["es"],description:"Chat with other members of the OpenStreetMap Peru community in Matrix.",url:"https://matrix.to/#/#osmpe:matrix.org",contacts:[{name:"Diego Sangunietti",email:"diego.sanguinetti@hotmail.com"},{name:"Ruben Lopez M.",email:"rub2106@gmail.com"}]},"OSM-PE-telegram":{id:"OSM-PE-telegram",featureId:"peru",type:"telegram",name:"OpenStreetMap Peru Telegram",countryCodes:["pe"],languageCodes:["es"],description:"Join the OpenStreetMap Peru community on Telegram",url:"https://telegram.me/osmPe",contacts:[{name:"Diego Sangunietti",email:"diego.sanguinetti@hotmail.com"},{name:"Ruben Lopez M.",email:"rub2106@gmail.com"}]},"OSM-PE-twitter":{id:"OSM-PE-twitter",featureId:"peru",type:"twitter",name:"OpenStreetMap Peru Twitter",countryCodes:["pe"],languageCodes:["es"],description:"Follow us on Twitter at {url}",url:"https://twitter.com/osmpe",contacts:[{name:"Diego Sangunietti",email:"diego.sanguinetti@hotmail.com"},{name:"Ruben Lopez M.",email:"rub2106@gmail.com"}]},"OSM-PE":{id:"OSM-PE",featureId:"peru",type:"group",name:"OpenStreetMap Peru",countryCodes:["ar"],languageCodes:["es"],description:"News and resources for the OpenStreetMap Peru community",url:"http://osmpe.ourproject.org/",contacts:[{name:"Diego Sangunietti",email:"diego.sanguinetti@hotmail.com"},{name:"Ruben Lopez M.",email:"rub2106@gmail.com"}]},"LATAM-Facebook":{id:"LATAM-Facebook",featureId:"latam",type:"facebook",languageCodes:["es","pt"],name:"OpenStreetMap Latam Facebook",description:"OpenStreetMap Latam on Facebook",url:"https://www.facebook.com/osmlatam/",contacts:[{name:"OSM LATAM",email:"info@osmlatam.org"}]},"LATAM-Telegram":{id:"LATAM-Telegram",featureId:"latam",type:"telegram",languageCodes:["es","pt"],name:"OpenStreetMap Latam Telegram",description:"OpenStreetMap Telegram for Latin America",url:"https://t.me/OSMLatam",contacts:[{name:"OSM LATAM",email:"info@osmlatam.org"}]},"LATAM-Twitter":{id:"LATAM-Twitter",featureId:"latam",type:"twitter",languageCodes:["es","pt"],name:"OpenStreetMap Latam Twitter",description:"Follow us on Twitter at {url}",url:"https://twitter.com/osmlatam",contacts:[{name:"OSM LATAM",email:"info@osmlatam.org"}]},"osm-latam":{id:"osm-latam",featureId:"latam",type:"group",languageCodes:["es","pt"],name:"OpenStreetMap Latam",description:"Supporting OpenStreetMap in Latin America",url:"https://osmlatam.org/",contacts:[{name:"OSM LATAM",email:"info@osmlatam.org"}],events:[{id:"sotm-latam-2018",i18n:true,name:"State of the Map Latam 2018",description:"State of the Map Latam is the annual conference for all mappers and users of OpenStreetMap in Latin America. The program includes talks, panels, workshops, and mapathons related to OpenStreetMap.",where:"Buenos Aires, Argentina",when:"2018-sep-24",url:"https://state.osmlatam.org/"}]},"OSM-Discord":{id:"OSM-Discord",type:"discord",languageCodes:["en"],name:"OpenStreetMap Discord",description:"Get in touch with other mappers via Discord",url:"https://discord.gg/SRZUYUz",contacts:[{name:"Austin Harrison",email:"jaustinharrison@gmail.com"}]},"OSM-Facebook":{id:"OSM-Facebook",type:"facebook",languageCodes:["en"],name:"OpenStreetMap on Facebook",description:"Like us on Facebook for news and updates about OpenStreetMap.",url:"https://www.facebook.com/OpenStreetMap",contacts:[{name:"Harry Wood",email:"mail@harrywood.co.uk"}]},"OSM-help":{id:"OSM-help",type:"forum",languageCodes:["en"],name:"OpenStreetMap Help",description:"Ask a question and get answers on OSM's community-driven question and answer site.",extendedDescription:"{url} is for everyone who needs help with OpenStreetMap.  Whether you are a beginner mapper or have a technical question, we're here to help!",url:"https://help.openstreetmap.org/",contacts:[{name:"OSMF Operations",email:"operations@osmfoundation.org"}]},"OSM-IRC":{id:"OSM-IRC",type:"irc",languageCodes:["en"],name:"OpenStreetMap IRC",description:"Join #osm on irc.oftc.net (port 6667)",url:"https://webchat.oftc.net/?channels=osm",contacts:[{name:"Harry Wood",email:"mail@harrywood.co.uk"}]},"OSM-Reddit":{id:"OSM-Reddit",type:"reddit",languageCodes:["en"],name:"OpenStreetMap on Reddit",description:"/r/openstreetmap/ is a great place to learn more about OpenStreetMap.  Ask us anything!",url:"https://www.reddit.com/r/openstreetmap/",contacts:[{name:"Serge Wroclawski",email:"emacsen@gmail.com"}]},"OSM-Telegram":{id:"OSM-Telegram",type:"telegram",languageCodes:["en"],name:"OpenStreetMap Telegram",description:"Join the OpenStreetMap Telegram global supergroup at {url}",url:"https://t.me/OpenStreetMapOrg",contacts:[{name:"Max N",email:"abonnements@revolwear.com"}]},"OSM-Twitter":{id:"OSM-Twitter",type:"twitter",languageCodes:["en"],name:"OpenStreetMap Twitter",description:"Follow us on Twitter at {url}",url:"https://twitter.com/openstreetmap",contacts:[{name:"Harry Wood",email:"mail@harrywood.co.uk"}]},OSMF:{id:"OSMF",type:"group",languageCodes:["en","nl","fr","it","jp","ru"],name:"OpenStreetMap Foundation",description:"OSMF is a UK-based not-for-profit that supports the OpenStreetMap Project",extendedDescription:"OSMF supports the OpenStreetMap by fundraising, maintaining the servers which power OSM, organizing the annual State of the Map conference, and coordinating the volunteers who keep OSM running. You can show your support and have a voice in the direction of OpenStreetMap by joining as an OSMF member here: {signupUrl}",url:"https://wiki.osmfoundation.org/wiki/Main_Page",signupUrl:"https://join.osmfoundation.org/",contacts:[{name:"OSMF Board",email:"board@osmfoundation.org"}],events:[{id:"sotm2018",i18n:true,name:"State of the Map 2018",description:"Join us for 3 days in Milan, Italy for the annual worldwide OpenStreetMap conference, bringing together everyone in the community to socialize, share, and learn.",where:"Milan, Italy",when:"2018-jul-28",url:"https://2018.stateofthemap.org/"}]}};
24695
24696         var dataImagery = [{id:"sjcgis.org-Aerials_2013_WM",name:"2013 aerial imagery for San Juan County WA",type:"tms",template:"https://sjcgis.org/arcgis/rest/services/Basemaps/Aerials_2013_WM/MapServer/tile/{zoom}/{y}/{x}",endDate:"2013-06-01T00:00:00.000Z",startDate:"2013-05-01T00:00:00.000Z",zoomExtent:[0,19],polygon:[[[-123.02167,48.44667],[-122.94666,48.44781],[-122.90151,48.41307],[-122.80263,48.40771],[-122.79199,48.4428],[-122.80881,48.47866],[-122.73912,48.49572],[-122.78547,48.62161],[-122.73088,48.63613],[-122.7556,48.71208],[-122.95747,48.71593],[-122.97086,48.69577],[-122.9997,48.6978],[-123.00348,48.73427],[-123.0433,48.7431],[-123.07626,48.70528],[-123.08485,48.66335],[-123.12845,48.6638],[-123.22698,48.70302],[-123.24655,48.68353],[-123.17445,48.64702],[-123.21514,48.60107],[-123.21393,48.57336],[-123.1808,48.56575],[-123.16621,48.52006],[-123.10235,48.47684],[-123.02167,48.44667]],[[-122.98339,48.78214],[-122.93498,48.76653],[-122.91181,48.73858],[-122.80229,48.73982],[-122.81946,48.75499],[-122.9343,48.79572],[-122.98374,48.79436],[-122.98339,48.78214]]],terms_url:"https://www.arcgis.com/home/item.html?id=7bf69831861d438d8365cf9f46662523",terms_text:"Pictometry Inc, San Juan County GIS",description:"Public domain aerial imagery taken in May/June 2013 from San Juan County, WA. Resolution is 9 inch."},{id:"sjcgis.org-Aerials_2016_WM",name:"2016 aerial imagery for San Juan County WA",type:"tms",template:"https://sjcgis.org/arcgis/rest/services/Basemaps/Aerials_2016_WM/MapServer/tile/{zoom}/{y}/{x}",endDate:"2016-07-01T00:00:00.000Z",startDate:"2016-05-01T00:00:00.000Z",zoomExtent:[0,19],polygon:[[[-123.02167,48.44667],[-122.94666,48.44781],[-122.90151,48.41307],[-122.80263,48.40771],[-122.79199,48.4428],[-122.80881,48.47866],[-122.73912,48.49572],[-122.78547,48.62161],[-122.73088,48.63613],[-122.7556,48.71208],[-122.95747,48.71593],[-122.97086,48.69577],[-122.9997,48.6978],[-123.00348,48.73427],[-123.0433,48.7431],[-123.07626,48.70528],[-123.08485,48.66335],[-123.12845,48.6638],[-123.22698,48.70302],[-123.24655,48.68353],[-123.17445,48.64702],[-123.21514,48.60107],[-123.21393,48.57336],[-123.1808,48.56575],[-123.16621,48.52006],[-123.10235,48.47684],[-123.02167,48.44667]],[[-122.98339,48.78214],[-122.93498,48.76653],[-122.91181,48.73858],[-122.80229,48.73982],[-122.81946,48.75499],[-122.9343,48.79572],[-122.98374,48.79436],[-122.98339,48.78214]]],best:true,description:"Public domain aerial imagery taken in May, June, and July from San Juan County, WA. Resolution is 6 inch countywide."},{id:"OS7",name:"7th Series (OS7)",type:"tms",template:"https://ooc.openstreetmap.org/os7/{zoom}/{x}/{y}.jpg",zoomExtent:[6,14],polygon:[[[-3.04697,54.83947],[-3.05864,55.24157],[-4.04466,55.23296],[-4.07076,55.63654],[-4.61904,55.6253],[-4.64926,56.02834],[-4.48961,56.03217],[-4.52394,56.4367],[-3.86751,56.44581],[-3.84176,56.04944],[-3.44591,56.04982],[-3.43492,55.64429],[-2.79497,55.65049],[-2.80802,56.05749],[-3.20661,56.05327],[-3.21417,56.45682],[-3.73808,56.45075],[-3.74185,56.86175],[-5.07669,56.83171],[-5.03652,56.42949],[-5.16012,56.42493],[-5.12991,56.01798],[-5.92607,55.99456],[-5.85518,55.23335],[-5.2281,55.25136],[-5.21024,55.02765],[-4.65956,55.04181],[-4.64548,54.81633],[-3.04697,54.83947]],[[-1.74835,57.76428],[-1.74065,57.36],[-2.58022,57.35537],[-2.57437,57.04526],[-2.08408,57.04799],[-2.07651,56.64276],[-2.7345,56.63906],[-2.73781,56.81718],[-3.23885,56.81437],[-3.24896,57.35168],[-3.75629,57.34889],[-3.76219,57.65868],[-4.76587,57.64473],[-4.81008,58.26984],[-5.2511,58.26547],[-5.27376,58.66767],[-3.55818,58.69887],[-3.56607,58.9316],[-3.37656,58.93444],[-3.38584,59.20171],[-3.18713,59.20215],[-3.18747,59.24176],[-3.06757,59.24203],[-3.07855,59.42135],[-2.37131,59.42763],[-2.36856,59.0222],[-2.67893,59.02078],[-2.67343,58.83935],[-2.86569,58.83651],[-2.8602,58.53531],[-3.03461,58.53316],[-3.0195,58.13159],[-3.6156,58.11982],[-3.61276,57.97754],[-3.71092,57.97562],[-3.69932,57.75364],[-1.74835,57.76428]],[[-7.07492,56.76319],[-7.73471,56.73566],[-7.7911,57.13994],[-7.70662,57.14343],[-7.76299,57.54311],[-7.60218,57.54968],[-7.62134,57.68452],[-7.72499,57.6803],[-7.73017,57.71673],[-7.60264,57.72191],[-7.59964,57.70083],[-7.48634,57.70544],[-7.49528,57.76813],[-7.37493,57.77301],[-7.39337,57.90201],[-7.23591,57.90838],[-7.24323,57.95948],[-7.13916,57.96369],[-7.14508,58.00495],[-7.23742,58.00122],[-7.23297,57.97018],[-7.31133,57.96702],[-7.31538,57.99525],[-7.24904,57.99792],[-7.28082,58.21856],[-7.07355,58.22687],[-7.0827,58.29018],[-6.80743,58.30119],[-6.82768,58.44074],[-6.50305,58.45366],[-6.51532,58.53792],[-6.16474,58.55184],[-6.10631,58.14894],[-6.33469,58.13976],[-6.27759,57.74145],[-6.96138,57.71366],[-6.93332,57.51615],[-7.10017,57.50933],[-7.05218,57.169],[-7.13111,57.16575],[-7.07492,56.76319]],[[0.41076,50.82087],[0.98102,50.80612],[0.99437,51.01173],[1.45062,50.99998],[1.47712,51.40552],[0.89619,51.42035],[0.88243,51.21039],[0.505,51.22007],[0.52273,51.49042],[-0.63397,51.51063],[-0.63671,51.44563],[-1.09951,51.45248],[-1.11485,51.04814],[-0.52987,51.0394],[-0.52751,51.10203],[0.42806,51.08778],[0.41076,50.82087]],[[-5.39457,51.9619],[-4.79581,51.98051],[-4.78873,51.89403],[-4.20265,51.91228],[-4.22941,52.23828],[-3.6552,52.25602],[-3.62228,51.85483],[-4.21342,51.8364],[-4.18551,51.49342],[-4.77661,51.47485],[-4.78476,51.57525],[-5.08799,51.56574],[-5.09422,51.64242],[-5.3678,51.63385],[-5.39457,51.9619]],[[-1.2389,54.03537],[-0.62779,54.02811],[-0.62004,54.25257],[-0.57268,54.25201],[-0.55865,54.65542],[-1.17998,54.66269],[-1.18782,54.43788],[-1.23221,54.4384],[-1.2389,54.03537]],[[-2.67227,50.97677],[-2.09961,50.98023],[-2.10572,51.37949],[-1.58877,51.38259],[-1.59499,51.78589],[-2.17563,51.78891],[-2.17154,51.38392],[-2.67846,51.38088],[-2.67227,50.97677]],[[-2.60155,53.27155],[-3.22973,53.2685],[-3.23522,53.67231],[-2.60704,53.67533],[-2.60155,53.27155]],[[-0.03942,51.7728],[-0.61563,51.77577],[-0.60465,52.58414],[-0.02843,52.58122],[-0.03942,51.7728]],[[-2.91529,54.03523],[-3.53229,54.02866],[-3.54484,54.43397],[-2.92785,54.44047],[-2.91529,54.03523]],[[-6.30583,57.19689],[-6.3539,57.60015],[-5.69111,57.62295],[-5.64305,57.21995],[-6.30583,57.19689]],[[1.17115,52.57236],[1.19865,52.97594],[1.79788,52.96106],[1.77037,52.55734],[1.17115,52.57236]],[[-2.40225,55.56317],[-2.40088,55.9657],[-1.76084,55.96501],[-1.76222,55.56248],[-2.40225,55.56317]],[[-6.32574,56.38537],[-7.0196,56.35747],[-7.07316,56.76384],[-6.3793,56.79145],[-6.32574,56.38537]],[[-2.42258,54.4431],[-2.42574,54.84188],[-1.79931,54.84354],[-1.79614,54.44477],[-2.42258,54.4431]],[[-3.02701,51.37935],[-3.60589,51.37017],[-3.62237,51.77304],[-3.04349,51.78215],[-3.02701,51.37935]],[[-3.05379,52.18979],[-3.06615,52.59374],[-2.48364,52.60034],[-2.47128,52.19646],[-3.05379,52.18979]],[[-5.67673,51.70425],[-5.67886,51.73101],[-5.4636,51.7376],[-5.46146,51.71084],[-5.67673,51.70425]],[[-5.84427,59.10882],[-5.8469,59.13578],[-5.79558,59.1371],[-5.79294,59.11014],[-5.84427,59.10882]],[[-8.64844,57.77861],[-8.66597,57.87717],[-8.46649,57.88721],[-8.44897,57.78867],[-8.64844,57.77861]],[[-4.52711,59.01532],[-4.52859,59.03319],[-4.47623,59.03434],[-4.47475,59.01646],[-4.52711,59.01532]],[[-7.68062,58.25838],[-7.68655,58.2938],[-7.53445,58.30084],[-7.52852,58.26542],[-7.68062,58.25838]],[[-6.19102,59.08009],[-6.19546,59.11586],[-6.12542,59.11815],[-6.12099,59.08238],[-6.19102,59.08009]],[[-4.42669,59.07112],[-4.42805,59.0887],[-4.37621,59.08976],[-4.37485,59.07218],[-4.42669,59.07112]]]},{id:"ACT2017",name:"ACTmapi Imagery 2017",type:"wms",template:"https://data.actmapi.act.gov.au/arcgis/rest/services/actmapi/imagery2017mga/ImageServer/exportImage?f=image&format=jpeg&imageSR=3857&bboxSR=3857&bbox={bbox}&size={width},{height}&foo={proj}",projection:"EPSG:3857",endDate:"2017-05-01T00:00:00.000Z",startDate:"2017-05-01T00:00:00.000Z",zoomExtent:[0,21],polygon:[[[149.085,-35.1171],[149.1509,-35.1157],[149.1509,-35.1335],[149.1736,-35.1335],[149.1739,-35.1512],[149.1957,-35.1512],[149.1962,-35.1689],[149.2177,-35.1683],[149.2192,-35.2048],[149.241,-35.2043],[149.2419,-35.2223],[149.2632,-35.2222],[149.2644,-35.2575],[149.3085,-35.2571],[149.309,-35.2751],[149.3531,-35.2742],[149.3536,-35.2921],[149.3974,-35.2917],[149.3988,-35.3452],[149.3777,-35.3457],[149.3772,-35.3641],[149.3341,-35.3648],[149.3385,-35.5451],[149.1624,-35.5487],[149.1727,-35.9271],[149.0175,-35.9294],[149.0172,-35.9113],[148.9506,-35.9125],[148.9499,-35.8946],[148.9277,-35.8949],[148.9272,-35.8768],[148.9053,-35.8768],[148.9042,-35.8586],[148.8826,-35.859],[148.8805,-35.7695],[148.8361,-35.7698],[148.8359,-35.7521],[148.8138,-35.7524],[148.8131,-35.7343],[148.7909,-35.7347],[148.7911,-35.7167],[148.7688,-35.7167],[148.7617,-35.3924],[148.7839,-35.3921],[148.7822,-35.3022],[148.8041,-35.302],[148.8033,-35.2836],[148.8474,-35.2832],[148.8469,-35.2652],[148.8689,-35.2643],[148.8687,-35.2466],[148.9128,-35.246],[148.9123,-35.2282],[148.9341,-35.228],[148.9329,-35.1919],[148.999,-35.1904],[148.9986,-35.1724],[149.0206,-35.172],[149.0204,-35.154],[149.0637,-35.1532],[149.0635,-35.1355],[149.0857,-35.1348],[149.085,-35.1171]]],terms_url:"https://actmapi-actgov.opendata.arcgis.com/datasets/884456bde6fd46d68e0c05479f55d548",terms_text:"© Jacobs Group (Australia) Pty Ltd and Australian Capital Territory",icon:"http://actmapi.act.gov.au/img/apple-touch-icon.png"},{id:"ACT2018",name:"ACTmapi Imagery 2018",type:"wms",template:"https://data.actmapi.act.gov.au/arcgis/rest/services/actmapi/imagery2018mga/ImageServer/exportImage?f=image&format=jpeg&imageSR=3857&bboxSR=3857&bbox={bbox}&size={width},{height}&foo={proj}",projection:"EPSG:3857",endDate:"2018-03-19T00:00:00.000Z",startDate:"2018-03-19T00:00:00.000Z",zoomExtent:[0,21],polygon:[[[149.2695,-35.4381],[149.2669,-35.348],[149.3329,-35.3468],[149.3334,-35.3648],[149.3774,-35.364],[149.3769,-35.3459],[149.3989,-35.3455],[149.3984,-35.3275],[149.4094,-35.3273],[149.4088,-35.3092],[149.3978,-35.3095],[149.3973,-35.2914],[149.3533,-35.2923],[149.3528,-35.2743],[149.3089,-35.2751],[149.3084,-35.2571],[149.2644,-35.2579],[149.2634,-35.2219],[149.2415,-35.2223],[149.241,-35.2043],[149.219,-35.2047],[149.218,-35.1687],[149.1961,-35.1691],[149.1956,-35.151],[149.1737,-35.1514],[149.1732,-35.1334],[149.1512,-35.1338],[149.1508,-35.1158],[149.085,-35.1169],[149.0854,-35.135],[149.0635,-35.1353],[149.0639,-35.1534],[149.0201,-35.1541],[149.0205,-35.1721],[148.9985,-35.1725],[148.999,-35.1905],[148.9331,-35.1916],[148.934,-35.2276],[148.912,-35.228],[148.9124,-35.246],[148.8685,-35.2467],[148.8689,-35.2647],[148.8469,-35.265],[148.8473,-35.2831],[148.8034,-35.2837],[148.8038,-35.3018],[148.7818,-35.3021],[148.7838,-35.3922],[148.8058,-35.3919],[148.8086,-35.5181],[148.7976,-35.5182],[148.7994,-35.5993],[148.8766,-35.5982],[148.8747,-35.517],[148.8527,-35.5174],[148.8508,-35.4363],[148.8398,-35.4364],[148.8388,-35.3914],[149.0039,-35.3888],[149.0048,-35.4248],[149.0268,-35.4244],[149.0277,-35.4605],[149.0497,-35.4601],[149.0511,-35.5142],[149.1613,-35.5122],[149.1594,-35.4402],[149.2695,-35.4381]]],terms_text:"© Jacobs Group (Australia) Pty Ltd and Australian Capital Territory",best:true,icon:"http://actmapi.act.gov.au/img/apple-touch-icon.png"},{id:"AGRI-black_and_white-2.5m",name:"AGRI black-and-white 2.5m",type:"tms",template:"https://{switch:a,b,c}.agri.openstreetmap.org/layer/au_ga_agri/{zoom}/{x}/{y}.png",endDate:"2011-01-01T00:00:00.000Z",startDate:"2006-01-01T00:00:00.000Z",zoomExtent:[0,16],polygon:[[[112.28778,-28.78459],[112.71488,-31.13894],[114.11263,-34.17829],[113.60788,-37.39012],[117.17992,-37.45179],[119.31538,-37.42096],[121.72262,-36.70839],[123.81925,-35.76893],[125.9547,-34.3066],[127.97368,-33.7274],[130.07031,-33.24166],[130.10913,-33.8887],[131.00214,-34.04971],[131.0798,-34.72257],[132.28342,-35.39],[134.18591,-35.61126],[133.8753,-37.1119],[134.8459,-37.6365],[139.7769,-37.82075],[139.93223,-39.4283],[141.6017,-39.8767],[142.3783,-39.36829],[142.3783,-40.64702],[142.49478,-42.07487],[144.009,-44.06013],[147.23161,-44.03222],[149.05645,-42.53431],[149.52237,-40.99959],[149.9494,-40.85292],[150.8036,-38.09627],[151.81313,-38.12682],[156.20052,-22.66771],[156.20052,-20.10109],[156.62761,-17.41763],[155.26869,-17.19521],[154.14272,-19.51662],[153.5215,-18.34139],[153.05558,-16.5636],[152.78379,-15.25677],[152.27905,-13.4135],[151.3472,-12.39177],[149.48354,-12.05024],[146.9598,-9.99241],[135.9719,-9.99241],[130.3032,-10.33636],[128.09016,-12.16414],[125.91588,-12.31591],[124.3239,-11.86033],[122.03323,-11.97429],[118.26706,-16.9353],[115.93747,-19.11357],[114.0738,-21.11863],[113.49141,-22.59603],[112.28778,-28.78459]]],terms_url:"https://data.gov.au/dataset/agri-the-australian-geographic-reference-image",terms_text:"AGRI, Geoscience Australia"},{id:"AIV_DHMV_II_HILL_25cm",name:"AIV Digitaal Hoogtemodel Vlaanderen II, multidirectionale hillshade 0,25 m",type:"wms",template:"https://geoservices.informatievlaanderen.be/raadpleegdiensten/dhmv/wms?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=DHMV_II_HILL_25cm&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2015-01-01T00:00:00.000Z",startDate:"2013-01-01T00:00:00.000Z",polygon:[[[5.98494,50.70723],[5.98494,50.7672],[5.91079,50.82275],[5.75561,50.83533],[5.75423,50.86264],[5.8332,50.93323],[5.85517,51.02661],[5.90941,51.07754],[5.91216,51.18225],[5.87851,51.20807],[5.77414,51.23689],[5.68419,51.24075],[5.62308,51.26998],[5.62308,51.29789],[5.54,51.34724],[5.4473,51.34853],[5.39855,51.32107],[5.31203,51.32322],[5.26671,51.36182],[5.19942,51.37254],[5.18294,51.39611],[5.15891,51.4924],[5.08338,51.53086],[5.03257,51.53983],[4.95566,51.50522],[4.90142,51.50565],[4.83825,51.54367],[4.77096,51.55862],[4.7119,51.54709],[4.64049,51.49667],[4.6144,51.4971],[4.56565,51.53171],[4.48256,51.53043],[4.42626,51.52189],[4.3006,51.46974],[4.29511,51.42566],[4.18113,51.42437],[4.13718,51.39525],[4.13856,51.35067],[4.05204,51.30047],[3.93325,51.27298],[3.86527,51.27084],[3.86321,51.29016],[3.76296,51.32407],[3.59336,51.35925],[3.47732,51.33137],[3.42582,51.39739],[3.23562,51.35153],[3.226,51.36568],[3.17794,51.36182],[3.16009,51.33223],[3.06258,51.30219],[2.75084,51.1702],[2.47001,51.07452],[2.49267,50.99378],[2.53112,50.95573],[2.50915,50.91159],[2.53043,50.82145],[2.5991,50.76416],[2.66501,50.76459],[2.77007,50.66677],[2.8971,50.65894],[2.99186,50.72549],[3.11339,50.72636],[3.23699,50.70592],[3.36265,50.6585],[3.47114,50.70201],[3.63936,50.66721],[3.69842,50.68156],[3.72794,50.71245],[3.81858,50.68418],[3.87488,50.64152],[4.09255,50.64283],[4.15023,50.66329],[4.20653,50.64413],[4.31365,50.64283],[4.45235,50.68766],[4.53475,50.67808],[4.61303,50.69549],[4.67689,50.69592],[4.72701,50.73201],[4.78057,50.73201],[4.79979,50.71288],[4.86228,50.71288],[4.88563,50.69549],[4.96116,50.69549],[5.03119,50.65763],[5.10741,50.65023],[5.2008,50.64892],[5.23581,50.66546],[5.32508,50.6659],[5.36696,50.682],[5.42121,50.66416],[5.52215,50.6746],[5.6224,50.72418],[5.67527,50.69853],[5.73981,50.69723],[5.77277,50.67199],[5.8126,50.66024],[5.90804,50.65981],[5.98494,50.70723]]],terms_text:"© agentschap Informatie Vlaanderen",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/be/BE_GRB_Flanders_TMS.png"},{id:"AIV_DHMV_II_SVF_25cm",name:"AIV Digitaal Hoogtemodel Vlaanderen II, Skyview factor 0,25 m",type:"wms",template:"https://geoservices.informatievlaanderen.be/raadpleegdiensten/dhmv/wms?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=DHMV_II_SVF_25cm&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2015-01-01T00:00:00.000Z",startDate:"2013-01-01T00:00:00.000Z",polygon:[[[5.98494,50.70723],[5.98494,50.7672],[5.91079,50.82275],[5.75561,50.83533],[5.75423,50.86264],[5.8332,50.93323],[5.85517,51.02661],[5.90941,51.07754],[5.91216,51.18225],[5.87851,51.20807],[5.77414,51.23689],[5.68419,51.24075],[5.62308,51.26998],[5.62308,51.29789],[5.54,51.34724],[5.4473,51.34853],[5.39855,51.32107],[5.31203,51.32322],[5.26671,51.36182],[5.19942,51.37254],[5.18294,51.39611],[5.15891,51.4924],[5.08338,51.53086],[5.03257,51.53983],[4.95566,51.50522],[4.90142,51.50565],[4.83825,51.54367],[4.77096,51.55862],[4.7119,51.54709],[4.64049,51.49667],[4.6144,51.4971],[4.56565,51.53171],[4.48256,51.53043],[4.42626,51.52189],[4.3006,51.46974],[4.29511,51.42566],[4.18113,51.42437],[4.13718,51.39525],[4.13856,51.35067],[4.05204,51.30047],[3.93325,51.27298],[3.86527,51.27084],[3.86321,51.29016],[3.76296,51.32407],[3.59336,51.35925],[3.47732,51.33137],[3.42582,51.39739],[3.23562,51.35153],[3.226,51.36568],[3.17794,51.36182],[3.16009,51.33223],[3.06258,51.30219],[2.75084,51.1702],[2.47001,51.07452],[2.49267,50.99378],[2.53112,50.95573],[2.50915,50.91159],[2.53043,50.82145],[2.5991,50.76416],[2.66501,50.76459],[2.77007,50.66677],[2.8971,50.65894],[2.99186,50.72549],[3.11339,50.72636],[3.23699,50.70592],[3.36265,50.6585],[3.47114,50.70201],[3.63936,50.66721],[3.69842,50.68156],[3.72794,50.71245],[3.81858,50.68418],[3.87488,50.64152],[4.09255,50.64283],[4.15023,50.66329],[4.20653,50.64413],[4.31365,50.64283],[4.45235,50.68766],[4.53475,50.67808],[4.61303,50.69549],[4.67689,50.69592],[4.72701,50.73201],[4.78057,50.73201],[4.79979,50.71288],[4.86228,50.71288],[4.88563,50.69549],[4.96116,50.69549],[5.03119,50.65763],[5.10741,50.65023],[5.2008,50.64892],[5.23581,50.66546],[5.32508,50.6659],[5.36696,50.682],[5.42121,50.66416],[5.52215,50.6746],[5.6224,50.72418],[5.67527,50.69853],[5.73981,50.69723],[5.77277,50.67199],[5.8126,50.66024],[5.90804,50.65981],[5.98494,50.70723]]],terms_text:"© agentschap Informatie Vlaanderen",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/be/BE_GRB_Flanders_TMS.png"},{id:"AGIV10cm",name:"AIV Flanders 2013-2015 aerial imagery 10cm",type:"wms",template:"https://geoservices.informatievlaanderen.be/raadpleegdiensten/OGW/wms?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=OGWRGB13_15VL&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2015-01-01T00:00:00.000Z",startDate:"2013-01-01T00:00:00.000Z",polygon:[[[5.98494,50.70723],[5.98494,50.7672],[5.91079,50.82275],[5.75561,50.83533],[5.75423,50.86264],[5.8332,50.93323],[5.85517,51.02661],[5.90941,51.07754],[5.91216,51.18225],[5.87851,51.20807],[5.77414,51.23689],[5.68419,51.24075],[5.62308,51.26998],[5.62308,51.29789],[5.54,51.34724],[5.4473,51.34853],[5.39855,51.32107],[5.31203,51.32322],[5.26671,51.36182],[5.19942,51.37254],[5.18294,51.39611],[5.15891,51.4924],[5.08338,51.53086],[5.03257,51.53983],[4.95566,51.50522],[4.90142,51.50565],[4.83825,51.54367],[4.77096,51.55862],[4.7119,51.54709],[4.64049,51.49667],[4.6144,51.4971],[4.56565,51.53171],[4.48256,51.53043],[4.42626,51.52189],[4.3006,51.46974],[4.29511,51.42566],[4.18113,51.42437],[4.13718,51.39525],[4.13856,51.35067],[4.05204,51.30047],[3.93325,51.27298],[3.86527,51.27084],[3.86321,51.29016],[3.76296,51.32407],[3.59336,51.35925],[3.47732,51.33137],[3.42582,51.39739],[3.23562,51.35153],[3.226,51.36568],[3.17794,51.36182],[3.16009,51.33223],[3.06258,51.30219],[2.75084,51.1702],[2.47001,51.07452],[2.49267,50.99378],[2.53112,50.95573],[2.50915,50.91159],[2.53043,50.82145],[2.5991,50.76416],[2.66501,50.76459],[2.77007,50.66677],[2.8971,50.65894],[2.99186,50.72549],[3.11339,50.72636],[3.23699,50.70592],[3.36265,50.6585],[3.47114,50.70201],[3.63936,50.66721],[3.69842,50.68156],[3.72794,50.71245],[3.81858,50.68418],[3.87488,50.64152],[4.09255,50.64283],[4.15023,50.66329],[4.20653,50.64413],[4.31365,50.64283],[4.45235,50.68766],[4.53475,50.67808],[4.61303,50.69549],[4.67689,50.69592],[4.72701,50.73201],[4.78057,50.73201],[4.79979,50.71288],[4.86228,50.71288],[4.88563,50.69549],[4.96116,50.69549],[5.03119,50.65763],[5.10741,50.65023],[5.2008,50.64892],[5.23581,50.66546],[5.32508,50.6659],[5.36696,50.682],[5.42121,50.66416],[5.52215,50.6746],[5.6224,50.72418],[5.67527,50.69853],[5.73981,50.69723],[5.77277,50.67199],[5.8126,50.66024],[5.90804,50.65981],[5.98494,50.70723]]],terms_text:"© agentschap Informatie Vlaanderen",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/be/BE_GRB_Flanders_TMS.png"},{id:"AGIVFlandersGRB",name:"AIV Flanders GRB",type:"tms",template:"https://tile.informatievlaanderen.be/ws/raadpleegdiensten/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=grb_bsk&STYLE=&FORMAT=image/png&tileMatrixSet=GoogleMapsVL&tileMatrix={zoom}&tileRow={y}&tileCol={x}",zoomExtent:[0,21],polygon:[[[4.40434,50.78177],[4.45538,50.79328],[4.40268,50.8961],[4.331,50.90094],[4.27142,50.82002],[4.30648,50.81244],[4.36348,50.77251],[4.40434,50.78177],[4.43104,50.73831],[4.31859,50.72022],[4.29031,50.69402],[4.14853,50.72834],[3.95877,50.68947],[3.9097,50.69245],[3.89113,50.74333],[3.77568,50.74789],[3.75857,50.78045],[3.67752,50.77062],[3.64047,50.72242],[3.54139,50.73377],[3.54062,50.76307],[3.46005,50.76556],[3.3522,50.70614],[3.30562,50.75466],[3.17839,50.75609],[3.15329,50.78564],[3.02008,50.77312],[2.99943,50.81035],[2.91648,50.75356],[2.85476,50.75745],[2.86521,50.70565],[2.78473,50.7369],[2.713,50.81534],[2.63518,50.8129],[2.59909,50.85306],[2.59031,50.91893],[2.63262,50.94575],[2.57372,51.00842],[2.54165,51.09345],[3.15582,51.32714],[3.18307,51.37128],[3.23443,51.34669],[3.36356,51.37228],[3.38101,51.27446],[3.44201,51.24313],[3.52759,51.24604],[3.51511,51.28753],[3.58984,51.30577],[3.7783,51.26235],[3.79088,51.21429],[3.92412,51.21938],[4.16613,51.2929],[4.26163,51.37647],[4.42065,51.36473],[4.39108,51.45149],[4.54747,51.48571],[4.53541,51.42303],[4.64953,51.42758],[4.76359,51.5088],[4.84188,51.48074],[4.8383,51.42174],[4.89366,51.41698],[4.92785,51.39544],[5.02894,51.48789],[5.08018,51.46948],[5.10202,51.42892],[5.07117,51.3935],[5.13109,51.35137],[5.13448,51.31547],[5.20031,51.32172],[5.24189,51.30534],[5.23036,51.26436],[5.34828,51.27492],[5.41741,51.26229],[5.4863,51.30197],[5.5556,51.26986],[5.56045,51.22233],[5.76027,51.18505],[5.85578,51.14463],[5.75909,51.03588],[5.72665,50.91307],[5.64522,50.8372],[5.68732,50.804],[5.47863,50.72352],[5.41196,50.72368],[5.38908,50.74775],[5.30912,50.71802],[5.16984,50.72257],[5.16508,50.6957],[5.05642,50.71567],[5.00339,50.76594],[4.92545,50.74275],[4.90869,50.76968],[4.83106,50.77028],[4.76014,50.80544],[4.64309,50.79755],[4.65486,50.7552],[4.62021,50.74348],[4.59727,50.76359],[4.52399,50.72724],[4.49455,50.75679],[4.43104,50.73831],[4.40434,50.78177]],[[5.67393,50.75373],[5.88438,50.70114],[5.94172,50.76524],[5.76662,50.78761],[5.67393,50.75373]],[[4.91171,51.43492],[4.93711,51.42614],[4.95891,51.45471],[4.92801,51.46049],[4.91171,51.43492]]],terms_text:"© agentschap Informatie Vlaanderen",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/be/BE_GRB_Flanders_TMS.png"},{id:"AGIV",name:"AIV Flanders most recent aerial imagery",type:"tms",template:"https://tile.informatievlaanderen.be/ws/raadpleegdiensten/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=omwrgbmrvl&STYLE=&FORMAT=image/png&tileMatrixSet=GoogleMapsVL&tileMatrix={zoom}&tileRow={y}&tileCol={x}",zoomExtent:[0,21],polygon:[[[4.7737,50.79368],[4.8379,50.75916],[4.92511,50.73483],[4.98862,50.76264],[5.036,50.73527],[5.0645,50.69875],[5.1644,50.69005],[5.19393,50.71179],[5.3086,50.71245],[5.36422,50.74396],[5.43391,50.70766],[5.54378,50.74396],[5.61141,50.73527],[5.71166,50.73505],[5.77105,50.74092],[5.81946,50.70484],[5.89568,50.70614],[5.9204,50.72831],[5.91971,50.74504],[5.89843,50.77675],[5.81569,50.76351],[5.77517,50.79216],[5.69552,50.79737],[5.69072,50.82319],[5.66325,50.82904],[5.65467,50.86481],[5.72368,50.9012],[5.77174,50.95443],[5.75114,50.97368],[5.78273,51.00048],[5.78032,51.0523],[5.80848,51.05338],[5.80951,51.07668],[5.84315,51.09372],[5.84418,51.1101],[5.82599,51.11851],[5.86959,51.14953],[5.8277,51.17365],[5.792,51.16891],[5.7738,51.19344],[5.666,51.1928],[5.64059,51.21065],[5.5709,51.22829],[5.56231,51.27535],[5.49811,51.30605],[5.47099,51.30219],[5.45794,51.2893],[5.43048,51.28823],[5.41434,51.27363],[5.36593,51.282],[5.33641,51.28265],[5.32577,51.26718],[5.24337,51.27406],[5.24989,51.31335],[5.20972,51.32794],[5.14174,51.31914],[5.14209,51.35367],[5.08647,51.39482],[5.11565,51.43615],[5.08853,51.47508],[5.05214,51.47636],[5.04561,51.4939],[5.02364,51.4939],[5.01609,51.48663],[4.82966,51.48663],[4.83001,51.50009],[4.76855,51.51099],[4.74727,51.50394],[4.658,51.4492],[4.65663,51.43144],[4.53956,51.43379],[4.55466,51.48171],[4.5296,51.48748],[4.46368,51.48235],[4.37167,51.45562],[4.37751,51.40553],[4.4139,51.37511],[4.39776,51.36118],[4.34798,51.36675],[4.34627,51.38497],[4.20344,51.38111],[4.2213,51.3511],[4.15641,51.29832],[4.05101,51.25193],[4.00638,51.25279],[3.95144,51.22205],[3.88484,51.22936],[3.81926,51.21797],[3.80038,51.22872],[3.80107,51.26074],[3.74442,51.28007],[3.63593,51.29746],[3.58615,51.31378],[3.5065,51.28308],[3.51371,51.25021],[3.43921,51.25064],[3.39766,51.27513],[3.37329,51.31678],[3.39114,51.34274],[3.3623,51.37961],[3.24283,51.35474],[3.20266,51.37039],[3.15631,51.35196],[3.14223,51.33051],[2.53318,51.09092],[2.56476,50.9968],[2.61832,50.9527],[2.57781,50.91852],[2.5936,50.88431],[2.58948,50.85051],[2.6245,50.80757],[2.71033,50.8054],[2.78449,50.71853],[2.87375,50.69983],[2.86483,50.74765],[2.92525,50.75156],[2.97263,50.77024],[2.97332,50.79889],[3.00078,50.79759],[3.01383,50.76676],[3.09863,50.76611],[3.13537,50.78196],[3.16832,50.75004],[3.30428,50.74613],[3.31561,50.71484],[3.3678,50.70179],[3.44848,50.75091],[3.53293,50.75156],[3.53328,50.72549],[3.63902,50.7131],[3.69086,50.7672],[3.75163,50.76177],[3.7712,50.73874],[3.87729,50.73983],[3.87969,50.70418],[3.9202,50.68352],[3.99951,50.682],[4.06749,50.68961],[4.16018,50.72049],[4.17632,50.70331],[4.24739,50.68222],[4.31708,50.69418],[4.31846,50.70962],[4.38403,50.71027],[4.38437,50.72353],[4.47226,50.74743],[4.52617,50.71853],[4.55226,50.73766],[4.64908,50.73722],[4.6532,50.78717],[4.72426,50.78218],[4.73731,50.79585],[4.7737,50.79368]]],terms_text:"© agentschap Informatie Vlaanderen",best:true,icon:"https://osmlab.github.io/editor-layer-index/sources/europe/be/BE_GRB_Flanders_TMS.png"},{id:"alagoas_litoral",name:"Alagoas Litoral 2006",type:"wms",template:"http://geoserver.dados.al.gov.br:8080/geoserver/Alagoas/ows?LAYERS=Ortofotos%202006&SERVICE=WMS&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.0&SERVICE=WMS&REQUEST=GetMap&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[-35.52384,-9.48089],[-35.5236,-9.44515],[-35.51572,-9.44518],[-35.51584,-9.44229],[-35.50542,-9.44238],[-35.50518,-9.43064],[-35.49334,-9.43073],[-35.49304,-9.3982],[-35.4893,-9.39817],[-35.48921,-9.38628],[-35.4854,-9.38634],[-35.48525,-9.37809],[-35.48127,-9.37812],[-35.48114,-9.36987],[-35.47698,-9.36996],[-35.47686,-9.36385],[-35.47459,-9.36388],[-35.47447,-9.36153],[-35.47212,-9.36141],[-35.47206,-9.35917],[-35.46976,-9.3592],[-35.46967,-9.35682],[-35.46653,-9.35676],[-35.46641,-9.35289],[-35.46387,-9.35277],[-35.46387,-9.35119],[-35.44135,-9.35131],[-35.44125,-9.34541],[-35.43177,-9.34538],[-35.43171,-9.33602],[-35.39463,-9.33632],[-35.39442,-9.30125],[-35.38165,-9.30143],[-35.38147,-9.28638],[-35.37799,-9.28626],[-35.37796,-9.2811],[-35.36942,-9.28122],[-35.36921,-9.27261],[-35.35966,-9.27276],[-35.35969,-9.26465],[-35.35051,-9.26474],[-35.35036,-9.25562],[-35.34115,-9.25565],[-35.34118,-9.24501],[-35.31775,-9.24519],[-35.3176,-9.22567],[-35.30292,-9.22579],[-35.30283,-9.2113],[-35.30794,-9.21136],[-35.30785,-9.19979],[-35.29103,-9.19988],[-35.29091,-9.1966],[-35.29018,-9.19669],[-35.28997,-9.16516],[-35.27759,-9.16522],[-35.2775,-9.16417],[-35.27541,-9.1642],[-35.27535,-9.16152],[-35.27375,-9.16149],[-35.27366,-9.15839],[-35.27182,-9.15842],[-35.27185,-9.15729],[-35.27149,-9.15729],[-35.27143,-9.15469],[-35.26965,-9.15463],[-35.26959,-9.15362],[-35.26919,-9.15362],[-35.26907,-9.13159],[-35.26403,-9.13165],[-35.264,-9.12318],[-35.26056,-9.12321],[-35.26053,-9.11781],[-35.256,-9.11784],[-35.25573,-9.08946],[-35.25114,-9.08955],[-35.25108,-9.08651],[-35.25026,-9.08648],[-35.25029,-9.08475],[-35.24449,-9.08478],[-35.24449,-9.07989],[-35.24093,-9.07997],[-35.24081,-9.07312],[-35.23734,-9.07312],[-35.23719,-9.06322],[-35.23655,-9.06322],[-35.23652,-9.04655],[-35.23323,-9.04652],[-35.23332,-9.04345],[-35.2306,-9.04348],[-35.2306,-9.04014],[-35.22897,-9.04008],[-35.229,-9.03835],[-35.22505,-9.03826],[-35.22502,-9.03167],[-35.2223,-9.03161],[-35.22233,-9.02012],[-35.21834,-9.02009],[-35.21831,-9.01341],[-35.21671,-9.01341],[-35.21668,-9.00998],[-35.21176,-9.00998],[-35.21173,-9.00647],[-35.20971,-9.00653],[-35.20974,-9.00438],[-35.20765,-9.00432],[-35.20768,-9.00226],[-35.20566,-9.00226],[-35.20563,-8.99987],[-35.20391,-8.99987],[-35.20394,-8.99785],[-35.20213,-8.99791],[-35.20213,-8.99579],[-35.19844,-8.99582],[-35.19844,-8.99361],[-35.19434,-8.99361],[-35.19428,-8.99122],[-35.19065,-8.99131],[-35.19062,-8.98833],[-35.18766,-8.98842],[-35.18763,-8.98544],[-35.18473,-8.98541],[-35.18467,-8.98255],[-35.18238,-8.98252],[-35.18235,-8.98052],[-35.17951,-8.98061],[-35.17948,-8.97742],[-35.17809,-8.97745],[-35.17803,-8.97306],[-35.17558,-8.97303],[-35.17549,-8.96912],[-35.17293,-8.96909],[-35.17284,-8.96292],[-35.17063,-8.96289],[-35.17048,-8.95579],[-35.16852,-8.95564],[-35.16852,-8.94806],[-35.16794,-8.948],[-35.16791,-8.93995],[-35.16245,-8.93995],[-35.16242,-8.92978],[-35.1587,-8.92981],[-35.15873,-8.92662],[-35.15547,-8.92668],[-35.1555,-8.92378],[-35.15348,-8.92381],[-35.15339,-8.92065],[-35.15131,-8.92062],[-35.15122,-8.91194],[-35.15263,-8.91194],[-35.15263,-8.90821],[-35.15439,-8.90824],[-35.1543,-8.90215],[-35.15593,-8.90212],[-35.15593,-8.90051],[-35.15768,-8.90048],[-35.15774,-8.89905],[-35.15958,-8.89908],[-35.15955,-8.89747],[-35.16139,-8.8975],[-35.16133,-8.89625],[-35.16363,-8.89625],[-35.1636,-8.89526],[-35.16553,-8.89526],[-35.1655,-8.89315],[-35.16794,-8.89315],[-35.16791,-8.89147],[-35.17024,-8.89153],[-35.17027,-8.8904],[-35.17302,-8.89043],[-35.17302,-8.88876],[-35.17791,-8.88876],[-35.17794,-8.88795],[-35.17894,-8.88792],[-35.17894,-8.88891],[-35.17966,-8.88894],[-35.17978,-8.88858],[-35.18099,-8.88861],[-35.18099,-8.88816],[-35.18519,-8.88816],[-35.18519,-8.88897],[-35.18591,-8.889],[-35.18591,-8.88971],[-35.18932,-8.88971],[-35.18947,-8.8893],[-35.19014,-8.88927],[-35.19017,-8.88831],[-35.19071,-8.88831],[-35.19077,-8.88789],[-35.19153,-8.88792],[-35.19156,-8.88619],[-35.19754,-8.88607],[-35.19757,-8.8873],[-35.19968,-8.8873],[-35.19974,-8.88777],[-35.2008,-8.88777],[-35.2008,-8.88822],[-35.2033,-8.88822],[-35.20337,-8.8887],[-35.20563,-8.88861],[-35.20557,-8.88983],[-35.20741,-8.8898],[-35.20744,-8.89022],[-35.21125,-8.89025],[-35.21128,-8.88769],[-35.21245,-8.88777],[-35.21248,-8.88861],[-35.21623,-8.88858],[-35.21623,-8.88748],[-35.21871,-8.88745],[-35.21871,-8.88897],[-35.22136,-8.88897],[-35.22263,-8.88792],[-35.22402,-8.88748],[-35.22453,-8.88763],[-35.22644,-8.88718],[-35.22707,-8.88598],[-35.23311,-8.88446],[-35.23933,-8.88339],[-35.24129,-8.88416],[-35.25011,-8.88515],[-35.25624,-8.88506],[-35.26168,-8.88294],[-35.26161,-8.88094],[-35.26406,-8.88109],[-35.26877,-8.8793],[-35.27421,-8.87748],[-35.2781,-8.87518],[-35.28499,-8.87507],[-35.28502,-8.87581],[-35.2881,-8.87578],[-35.29405,-8.87545],[-35.30782,-8.87208],[-35.31757,-8.86961],[-35.32784,-8.86716],[-35.33206,-8.86614],[-35.34103,-8.86376],[-35.3471,-8.86244],[-35.3522,-8.86113],[-35.35257,-8.86391],[-35.34903,-8.86611],[-35.34496,-8.87205],[-35.34327,-8.87489],[-35.34318,-8.87569],[-35.34381,-8.87668],[-35.34481,-8.8768],[-35.34888,-8.87721],[-35.35042,-8.87781],[-35.35254,-8.87891],[-35.35399,-8.88011],[-35.35577,-8.88252],[-35.35755,-8.88396],[-35.36036,-8.88512],[-35.36114,-8.88509],[-35.3612,-8.88587],[-35.36175,-8.8859],[-35.36178,-8.88777],[-35.36253,-8.88783],[-35.36247,-8.891],[-35.36311,-8.89112],[-35.36311,-8.89482],[-35.3644,-8.89488],[-35.36507,-8.8967],[-35.36637,-8.90022],[-35.36754,-8.90427],[-35.36794,-8.90782],[-35.36863,-8.90917],[-35.37207,-8.91155],[-35.3741,-8.91349],[-35.37277,-8.916],[-35.37262,-8.91817],[-35.37084,-8.92229],[-35.37062,-8.92486],[-35.37235,-8.93038],[-35.37153,-8.93193],[-35.37153,-8.93363],[-35.37171,-8.93387],[-35.37171,-8.94362],[-35.36818,-8.94377],[-35.36815,-8.94505],[-35.36927,-8.94511],[-35.36921,-8.94863],[-35.37078,-8.94872],[-35.37081,-8.95182],[-35.37219,-8.95176],[-35.37222,-8.95528],[-35.37319,-8.95531],[-35.37313,-8.95737],[-35.3744,-8.95737],[-35.37446,-8.96012],[-35.37567,-8.96018],[-35.3757,-8.96205],[-35.37688,-8.96208],[-35.37694,-8.96444],[-35.37781,-8.96444],[-35.37775,-8.96617],[-35.38074,-8.96617],[-35.38074,-8.96331],[-35.38288,-8.96328],[-35.38291,-8.95982],[-35.38542,-8.95985],[-35.38542,-8.95722],[-35.38723,-8.95722],[-35.3872,-8.95406],[-35.38947,-8.95409],[-35.38947,-8.95084],[-35.39158,-8.95087],[-35.39158,-8.94792],[-35.39587,-8.94792],[-35.39581,-8.94651],[-35.3972,-8.94654],[-35.39711,-8.94472],[-35.39838,-8.94469],[-35.39838,-8.93915],[-35.40107,-8.93915],[-35.40106,-8.93895],[-35.40167,-8.93894],[-35.40173,-8.93688],[-35.40236,-8.93688],[-35.40236,-8.93628],[-35.40324,-8.9364],[-35.4033,-8.93583],[-35.40426,-8.9358],[-35.4042,-8.93363],[-35.40574,-8.9336],[-35.40577,-8.93124],[-35.4081,-8.93133],[-35.40804,-8.92927],[-35.40937,-8.9293],[-35.40928,-8.92739],[-35.41085,-8.92742],[-35.41085,-8.92542],[-35.41239,-8.92545],[-35.41236,-8.9239],[-35.41335,-8.92387],[-35.41329,-8.92193],[-35.41523,-8.92196],[-35.41523,-8.91999],[-35.41655,-8.92002],[-35.41655,-8.91755],[-35.4196,-8.91755],[-35.41966,-8.91964],[-35.42184,-8.91964],[-35.42187,-8.92265],[-35.42389,-8.92268],[-35.42392,-8.92513],[-35.42537,-8.92513],[-35.42537,-8.92766],[-35.42724,-8.92766],[-35.42727,-8.92987],[-35.42815,-8.92984],[-35.42818,-8.9316],[-35.42987,-8.93154],[-35.4299,-8.93407],[-35.43141,-8.93407],[-35.43141,-8.9356],[-35.43226,-8.93557],[-35.43229,-8.93586],[-35.4334,-8.93583],[-35.4334,-8.94001],[-35.43434,-8.94004],[-35.43434,-8.94097],[-35.43531,-8.94097],[-35.43534,-8.94261],[-35.43567,-8.94264],[-35.4357,-8.94329],[-35.43627,-8.94332],[-35.43624,-8.94422],[-35.4373,-8.94422],[-35.43727,-8.9452],[-35.43823,-8.9452],[-35.43827,-8.94684],[-35.43902,-8.94687],[-35.43902,-8.94798],[-35.44026,-8.94798],[-35.44032,-8.94953],[-35.44159,-8.94956],[-35.44165,-8.95152],[-35.44273,-8.95152],[-35.44273,-8.95334],[-35.44436,-8.95334],[-35.44436,-8.95498],[-35.44569,-8.95501],[-35.44563,-8.95674],[-35.4472,-8.9568],[-35.44717,-8.95865],[-35.44895,-8.95871],[-35.44892,-8.96],[-35.45101,-8.95994],[-35.45098,-8.96101],[-35.45469,-8.96095],[-35.45466,-8.96235],[-35.46049,-8.96235],[-35.46055,-8.96557],[-35.46653,-8.96548],[-35.46659,-8.96885],[-35.46771,-8.96883],[-35.46774,-8.97053],[-35.4739,-8.97053],[-35.47399,-8.9753],[-35.47791,-8.97521],[-35.47797,-8.97816],[-35.4841,-8.97813],[-35.48416,-8.98201],[-35.49084,-8.98195],[-35.49084,-8.98562],[-35.49721,-8.98562],[-35.49721,-8.99069],[-35.50225,-8.99057],[-35.50234,-8.99567],[-35.50648,-8.99567],[-35.50651,-8.99856],[-35.51204,-8.9985],[-35.51207,-9.00163],[-35.51663,-9.00166],[-35.51666,-9.00617],[-35.52119,-9.00614],[-35.52122,-9.00739],[-35.53127,-9.00733],[-35.53127,-9.01064],[-35.54818,-9.01049],[-35.54818,-9.01359],[-35.56968,-9.01344],[-35.56974,-9.01738],[-35.58575,-9.01732],[-35.58578,-9.01995],[-35.60957,-9.01983],[-35.60954,-9.02302],[-35.62911,-9.02287],[-35.62905,-9.02508],[-35.65221,-9.0249],[-35.65224,-9.02758],[-35.67552,-9.0274],[-35.67555,-9.03056],[-35.68295,-9.03056],[-35.68298,-9.03435],[-35.69128,-9.03432],[-35.69128,-9.03766],[-35.6995,-9.0376],[-35.6995,-9.04034],[-35.70668,-9.04031],[-35.70671,-9.04518],[-35.71115,-9.04518],[-35.71133,-9.06691],[-35.70871,-9.06691],[-35.70877,-9.07869],[-35.70656,-9.07872],[-35.70656,-9.08653],[-35.7043,-9.08653],[-35.70433,-9.09104],[-35.69992,-9.09107],[-35.69989,-9.0956],[-35.69536,-9.09557],[-35.69542,-9.10001],[-35.69092,-9.10013],[-35.69101,-9.10207],[-35.63367,-9.10246],[-35.6337,-9.10541],[-35.62585,-9.10553],[-35.62591,-9.10964],[-35.62231,-9.10964],[-35.62234,-9.11203],[-35.6199,-9.112],[-35.6199,-9.11501],[-35.61473,-9.11507],[-35.61473,-9.11707],[-35.61177,-9.11701],[-35.61181,-9.1182],[-35.6096,-9.11826],[-35.60963,-9.12571],[-35.59976,-9.12583],[-35.59979,-9.12923],[-35.59634,-9.12926],[-35.5964,-9.13502],[-35.59197,-9.13507],[-35.59209,-9.149],[-35.59018,-9.14897],[-35.59015,-9.15108],[-35.6016,-9.15105],[-35.60154,-9.14912],[-35.60552,-9.14912],[-35.60549,-9.14557],[-35.61184,-9.14554],[-35.61184,-9.14235],[-35.6176,-9.14238],[-35.61757,-9.13853],[-35.624,-9.13853],[-35.62397,-9.13466],[-35.63177,-9.13466],[-35.63164,-9.13063],[-35.63922,-9.1306],[-35.63919,-9.12878],[-35.66386,-9.12869],[-35.6638,-9.1261],[-35.71278,-9.12577],[-35.71275,-9.12407],[-35.72426,-9.12401],[-35.71964,-9.15323],[-35.72112,-9.1532],[-35.72124,-9.17258],[-35.72066,-9.17255],[-35.72082,-9.18558],[-35.71212,-9.18566],[-35.7133,-9.34416],[-35.69041,-9.34433],[-35.69065,-9.37189],[-35.68899,-9.37189],[-35.68902,-9.37598],[-35.68757,-9.37598],[-35.68766,-9.38232],[-35.68497,-9.38235],[-35.68503,-9.39093],[-35.68168,-9.39099],[-35.68177,-9.39936],[-35.67715,-9.39933],[-35.67724,-9.4089],[-35.67292,-9.40893],[-35.67301,-9.41754],[-35.66972,-9.4176],[-35.66978,-9.42498],[-35.66722,-9.42498],[-35.66728,-9.4327],[-35.66075,-9.43288],[-35.66075,-9.43705],[-35.6513,-9.43708],[-35.65142,-9.44211],[-35.64514,-9.44217],[-35.64523,-9.44652],[-35.63645,-9.44661],[-35.63645,-9.44992],[-35.62711,-9.45],[-35.62727,-9.46505],[-35.62086,-9.46511],[-35.62092,-9.4722],[-35.60939,-9.47222],[-35.60939,-9.47529],[-35.59674,-9.47535],[-35.59674,-9.47351],[-35.57844,-9.47371],[-35.57847,-9.47595],[-35.57267,-9.47604],[-35.5727,-9.48042],[-35.56823,-9.48048],[-35.56826,-9.48881],[-35.54169,-9.48893],[-35.54163,-9.48071],[-35.52384,-9.48089]]],terms_url:"http://www.seplag.al.gov.br",terms_text:"Secretaria de Estado do Planejamento, Gestão e Patrimônio"},{id:"arapiraca_al",name:"Arapiraca AL",type:"wms",template:"http://geoserver.dados.al.gov.br:8080/geoserver/Alagoas/ows?LAYERS=Arapiraca&SERVICE=WMS&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.0&SERVICE=WMS&REQUEST=GetMap&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[-36.60875,-9.83072],[-36.60784,-9.74047],[-36.61718,-9.74051],[-36.61631,-9.65075],[-36.70737,-9.64977],[-36.70832,-9.74043],[-36.69898,-9.74047],[-36.69997,-9.82968],[-36.60875,-9.83072]]],terms_url:"http://www.seplag.al.gov.br",terms_text:"Secretaria de Estado do Planejamento, Gestão e Patrimônio"},{id:"CRAIG-Auvergne-2013",name:"Auvergne 2013 25cm CRAIG",type:"tms",template:"https://tiles.craig.fr/osm/wmts/1.0.0/ortho_2013/webmercator/{zoom}/{x}/{y}.jpeg",endDate:"2013-01-01T00:00:00.000Z",startDate:"2013-01-01T00:00:00.000Z",zoomExtent:[0,21],polygon:[[[2.94012,44.63388],[2.99719,44.63393],[2.99717,44.64734],[3.01597,44.64735],[3.01593,44.67412],[3.03495,44.67413],[3.0349,44.70152],[3.05363,44.70154],[3.05357,44.7419],[3.07233,44.74191],[3.07222,44.80917],[3.09216,44.80919],[3.09214,44.82213],[3.13014,44.82216],[3.13005,44.87707],[3.14856,44.87709],[3.14858,44.8637],[3.16823,44.86371],[3.16825,44.85003],[3.2064,44.85006],[3.20638,44.86284],[3.24395,44.86287],[3.24393,44.87679],[3.26315,44.87681],[3.26308,44.91752],[3.32004,44.91757],[3.32002,44.93033],[3.33908,44.93035],[3.33906,44.9442],[3.377,44.94423],[3.37702,44.93029],[3.39603,44.9303],[3.39612,44.87627],[3.41483,44.87629],[3.41489,44.83553],[3.43334,44.83554],[3.43338,44.80828],[3.45255,44.80829],[3.45258,44.79463],[3.50893,44.79468],[3.5089,44.80815],[3.60426,44.80823],[3.60422,44.83482],[3.62361,44.83484],[3.62357,44.86166],[3.64248,44.86167],[3.64255,44.8211],[3.66101,44.82112],[3.66103,44.80777],[3.6993,44.8078],[3.69928,44.82099],[3.73611,44.82102],[3.73618,44.77971],[3.77511,44.77974],[3.77515,44.75223],[3.81184,44.75226],[3.81186,44.7392],[3.83118,44.73922],[3.83121,44.72468],[3.88782,44.72472],[3.8878,44.73818],[3.92563,44.73821],[3.9256,44.75167],[3.94541,44.75168],[3.94537,44.77847],[3.96437,44.77848],[3.96435,44.79193],[4.00332,44.79196],[4.0033,44.80526],[4.02169,44.80527],[4.02167,44.81857],[4.05965,44.8186],[4.05961,44.84492],[4.07981,44.84494],[4.07979,44.85735],[4.17388,44.85743],[4.17386,44.87055],[4.19326,44.87056],[4.19323,44.88427],[4.21404,44.88429],[4.214,44.91002],[4.23241,44.91004],[4.23237,44.93731],[4.27155,44.93734],[4.27153,44.9503],[4.32887,44.95034],[4.32878,45.00367],[4.34893,45.00368],[4.3489,45.01707],[4.40608,45.01711],[4.40599,45.071],[4.38847,45.07099],[4.38845,45.0846],[4.40794,45.08461],[4.40792,45.09663],[4.48436,45.09669],[4.48429,45.13705],[4.46636,45.13703],[4.46634,45.1502],[4.48645,45.15022],[4.4864,45.17724],[4.50655,45.17726],[4.50644,45.24501],[4.48813,45.24499],[4.48811,45.25921],[4.46986,45.25919],[4.46984,45.27298],[4.45088,45.27297],[4.45086,45.28642],[4.39368,45.28637],[4.39363,45.31352],[4.37509,45.3135],[4.37507,45.32741],[4.39507,45.32742],[4.39503,45.35458],[4.37679,45.35457],[4.37676,45.36855],[4.35766,45.36853],[4.35763,45.38234],[4.28146,45.38227],[4.28143,45.39688],[4.24446,45.39685],[4.24443,45.41079],[4.14812,45.41071],[4.14814,45.39807],[4.12919,45.39805],[4.12921,45.38409],[4.09021,45.38406],[4.09024,45.37121],[4.01355,45.37115],[4.01353,45.3861],[3.91709,45.38602],[3.91707,45.39974],[3.93757,45.39975],[3.93755,45.41311],[3.97528,45.41315],[3.97526,45.42621],[3.99537,45.42622],[3.9957,45.52096],[3.97778,45.52094],[3.97769,45.57439],[3.95818,45.57437],[3.95815,45.58837],[3.9396,45.58835],[3.93958,45.60262],[3.92023,45.60261],[3.9202,45.61646],[3.88189,45.61643],[3.88185,45.64328],[3.84413,45.64325],[3.84411,45.65709],[3.82617,45.65707],[3.82612,45.68389],[3.80722,45.68387],[3.80713,45.73758],[3.78821,45.73756],[3.78819,45.7518],[3.76885,45.75178],[3.7688,45.77897],[3.75072,45.77895],[3.75058,45.86066],[3.76967,45.86067],[3.76958,45.91433],[3.75166,45.91432],[3.75164,45.92809],[3.7329,45.92807],[3.73285,45.95472],[3.81018,45.95478],[3.81016,45.96823],[3.8496,45.96826],[3.84951,46.02162],[3.83188,46.0216],[3.83179,46.07591],[3.8505,46.07592],[3.85046,46.10295],[3.83247,46.10294],[3.83234,46.18456],[3.81422,46.18455],[3.81415,46.22442],[3.83369,46.22444],[3.83366,46.2381],[3.85289,46.23812],[3.85287,46.25147],[3.89314,46.25151],[3.89312,46.26447],[3.91306,46.26448],[3.91303,46.27793],[3.95189,46.27796],[3.95187,46.29082],[3.97152,46.29084],[3.9715,46.30369],[4.0105,46.30373],[4.01048,46.31776],[4.02983,46.31778],[4.02978,46.34428],[4.0116,46.34427],[4.01146,46.42534],[4.03153,46.42536],[4.03146,46.4658],[4.01324,46.46578],[4.01322,46.47938],[3.99437,46.47936],[3.99435,46.49361],[3.9746,46.4936],[3.97457,46.50753],[3.87754,46.50745],[3.8775,46.53478],[3.85836,46.53476],[3.85833,46.54832],[3.81869,46.54828],[3.81871,46.53553],[3.79924,46.53552],[3.79922,46.54907],[3.76104,46.54904],[3.76092,46.61681],[3.74233,46.61679],[3.74228,46.64396],[3.72286,46.64395],[3.72281,46.67104],[3.70387,46.67102],[3.70385,46.68467],[3.68411,46.68466],[3.68406,46.712],[3.66484,46.71198],[3.66479,46.73904],[3.64576,46.73902],[3.64572,46.76634],[3.62575,46.76632],[3.62573,46.77971],[3.56723,46.77966],[3.56725,46.76631],[3.54715,46.76629],[3.54719,46.73928],[3.52716,46.73927],[3.52723,46.6989],[3.48774,46.69887],[3.48776,46.68594],[3.46796,46.68593],[3.46794,46.69941],[3.46792,46.71279],[3.44865,46.71278],[3.44863,46.72679],[3.35043,46.72671],[3.35048,46.6999],[3.33039,46.69988],[3.33034,46.7272],[3.23272,46.72712],[3.23274,46.71351],[3.2129,46.7135],[3.21293,46.70013],[3.17354,46.7001],[3.1735,46.72751],[3.15412,46.72749],[3.1541,46.74073],[3.11478,46.7407],[3.11475,46.75428],[3.07534,46.75424],[3.0753,46.78135],[3.05597,46.78134],[3.05592,46.80831],[2.99704,46.80826],[2.99702,46.82196],[2.93794,46.82191],[2.93797,46.80826],[2.89866,46.80823],[2.89869,46.79424],[2.87899,46.79422],[2.87901,46.78104],[2.85942,46.78103],[2.85944,46.76771],[2.84004,46.76769],[2.84007,46.75447],[2.7414,46.75439],[2.74138,46.76682],[2.70234,46.76679],[2.70236,46.75389],[2.68266,46.75387],[2.68268,46.74048],[2.66349,46.74046],[2.66351,46.7259],[2.64342,46.72588],[2.64344,46.71309],[2.62414,46.71308],[2.62417,46.69981],[2.60397,46.69979],[2.60399,46.68584],[2.56512,46.68581],[2.56515,46.67261],[2.54593,46.6726],[2.546,46.63215],[2.56592,46.63217],[2.56595,46.61811],[2.54564,46.61809],[2.54569,46.59072],[2.56642,46.59074],[2.56644,46.57754],[2.5855,46.57756],[2.58552,46.56472],[2.56613,46.5647],[2.56616,46.55062],[2.46828,46.55055],[2.4683,46.53582],[2.33212,46.53571],[2.33217,46.50886],[2.31265,46.50884],[2.31267,46.49534],[2.29288,46.49533],[2.2929,46.48182],[2.27487,46.4818],[2.27492,46.45442],[2.25539,46.4544],[2.25553,46.37349],[2.27595,46.37351],[2.27604,46.32087],[2.31456,46.32091],[2.31458,46.30704],[2.35371,46.30707],[2.35373,46.29297],[2.39384,46.293],[2.39389,46.26729],[2.45157,46.26733],[2.4516,46.25349],[2.47094,46.25351],[2.47098,46.22656],[2.49151,46.22657],[2.49155,46.19933],[2.51088,46.19934],[2.51093,46.17278],[2.53117,46.1728],[2.53138,46.05135],[2.55163,46.05137],[2.55166,46.03777],[2.57056,46.03778],[2.57068,45.96994],[2.55144,45.96993],[2.55146,45.95662],[2.53226,45.9566],[2.53228,45.94301],[2.51307,45.94299],[2.51313,45.90203],[2.47494,45.902],[2.47496,45.88882],[2.43619,45.88879],[2.43622,45.87533],[2.41721,45.87531],[2.41725,45.84794],[2.37847,45.84791],[2.3785,45.83397],[2.35952,45.83396],[2.35956,45.80708],[2.37873,45.8071],[2.37875,45.79358],[2.3987,45.79359],[2.39872,45.78035],[2.41825,45.78036],[2.41832,45.74],[2.45722,45.74003],[2.45724,45.7267],[2.47589,45.72671],[2.47591,45.71324],[2.49533,45.71325],[2.49542,45.65913],[2.45769,45.6591],[2.45776,45.61834],[2.43912,45.61833],[2.43919,45.57766],[2.4585,45.57768],[2.45855,45.55053],[2.47809,45.55055],[2.47811,45.53725],[2.49755,45.53726],[2.49759,45.51068],[2.47855,45.51066],[2.47864,45.45613],[2.45978,45.45612],[2.45987,45.40176],[2.42249,45.40173],[2.42247,45.41528],[2.40232,45.41527],[2.40229,45.42882],[2.3256,45.42876],[2.32567,45.38796],[2.34562,45.38798],[2.34566,45.36111],[2.32626,45.36109],[2.32628,45.34721],[2.30738,45.3472],[2.3074,45.3336],[2.28811,45.33358],[2.28813,45.32082],[2.26963,45.3208],[2.26966,45.30621],[2.25066,45.3062],[2.25068,45.29251],[2.23169,45.2925],[2.23171,45.27924],[2.213,45.27922],[2.21305,45.25204],[2.19374,45.25202],[2.19376,45.23811],[2.17561,45.2381],[2.17574,45.15768],[2.15735,45.15767],[2.15744,45.10295],[2.12024,45.10292],[2.12026,45.08955],[2.10067,45.08953],[2.10069,45.07544],[2.08246,45.07543],[2.08255,45.0216],[2.10255,45.02161],[2.1026,44.99445],[2.04574,44.99441],[2.04585,44.92753],[2.06578,44.92755],[2.06589,44.85969],[2.0857,44.8597],[2.08572,44.84581],[2.10556,44.84583],[2.1056,44.81933],[2.12474,44.81934],[2.12477,44.80551],[2.14351,44.80553],[2.14355,44.7786],[2.12561,44.77858],[2.1257,44.72427],[2.10665,44.72426],[2.10671,44.68423],[2.12634,44.68424],[2.12636,44.67074],[2.14598,44.67075],[2.14607,44.61644],[2.18396,44.61648],[2.18398,44.60378],[2.24042,44.60383],[2.24037,44.63095],[2.25948,44.63097],[2.25946,44.64493],[2.31668,44.64498],[2.3167,44.63088],[2.33615,44.6309],[2.33617,44.61758],[2.37242,44.61761],[2.3724,44.63158],[2.41105,44.63161],[2.41107,44.61907],[2.44922,44.61911],[2.4492,44.63232],[2.50486,44.63237],[2.50481,44.65976],[2.52461,44.65977],[2.52457,44.68717],[2.54225,44.68719],[2.54223,44.70122],[2.58071,44.70125],[2.5806,44.76834],[2.61769,44.76837],[2.61762,44.80884],[2.63676,44.80885],[2.63669,44.84929],[2.67331,44.84933],[2.67329,44.86252],[2.69338,44.86253],[2.69333,44.88943],[2.73052,44.88946],[2.73048,44.91645],[2.74992,44.91646],[2.75005,44.83647],[2.80733,44.83652],[2.80731,44.8491],[2.82638,44.84912],[2.8264,44.83628],[2.8457,44.8363],[2.84577,44.79571],[2.86422,44.79573],[2.86426,44.76865],[2.88399,44.76866],[2.88403,44.74197],[2.90203,44.74198],[2.90214,44.67432],[2.92198,44.67434],[2.92202,44.6473],[2.9401,44.64731],[2.94012,44.63388]]],terms_url:"http://ids.craig.fr/geocat/srv/fre/catalog.search?node=srv#/metadata/8cabc987-829c-4c9f-943b-6a0e255cd73",terms_text:"Orthophotographie CRAIG/Sintegra/IGN 2013"},{id:"CRAIG-Auvergne-2016",name:"Auvergne 2016 25cm CRAIG",type:"tms",template:"https://tiles.craig.fr/ortho/wmts/1.0.0/ortho_2016/webmercator/{zoom}/{x}/{y}.jpeg",endDate:"2016-01-01T00:00:00.000Z",startDate:"2016-01-01T00:00:00.000Z",zoomExtent:[0,21],polygon:[[[2.49389,46.66829],[2.71362,46.84141],[3.64746,46.80758],[4.04846,46.48327],[4.03747,46.24825],[4.46044,46.25965],[4.4934,46.14559],[4.38354,46.09229],[4.45495,45.69084],[4.76257,45.57176],[4.81201,45.34443],[4.22424,44.84419],[3.86169,44.696],[3.37829,44.80523],[3.33435,44.89091],[3.18054,44.82471],[3.03222,44.60612],[2.92785,44.60221],[2.71911,44.85198],[2.51037,44.60221],[2.12585,44.58265],[2.005,44.97257],[2.30712,45.46784],[2.43347,45.44087],[2.41149,45.72919],[2.34558,45.82402],[2.54882,45.97979],[2.46093,46.22166],[2.21374,46.33935],[2.27828,46.53903],[2.54882,46.56642],[2.49389,46.66829]]],terms_url:"http://ids.craig.fr/geocat/srv/fre/catalog.search?node=srv#/metadata/e37c057b-5884-429b-8bec-5db0baef0ee",terms_text:"CRAIG - IGN -TopoGEODIS - Feder Auvergne-Rhône-Alpes 2016"},{id:"BANO",name:"BANO",type:"tms",template:"https://{switch:a,b,c}.layers.openstreetmap.fr/bano/{zoom}/{x}/{y}.png",zoomExtent:[12,20],polygon:[[[-2.7,43.9],[-6.3,48.98],[-2.25,50.09],[1.31,50.88],[2.35816,51.32937],[2.5488,51.09759],[2.57048,51.07409],[2.58741,51.01763],[2.59845,51.0051],[2.61558,50.99749],[2.63986,50.95766],[2.64225,50.94578],[2.62452,50.9256],[2.61962,50.91067],[2.62396,50.86071],[2.62781,50.85054],[2.63786,50.83696],[2.6511,50.82906],[2.73267,50.81738],[2.79995,50.73795],[2.81655,50.73092],[2.85265,50.73335],[2.89072,50.7162],[2.90492,50.71536],[2.9161,50.72418],[2.93508,50.75592],[3.00718,50.78377],[3.08218,50.78749],[3.09244,50.79092],[3.11412,50.80566],[3.14877,50.80195],[3.2154,50.73111],[3.22149,50.7267],[3.27051,50.70375],[3.27545,50.67757],[3.26576,50.6604],[3.26588,50.64054],[3.28922,50.60028],[3.29219,50.55037],[3.3056,50.53267],[3.37551,50.50839],[3.3898,50.50884],[3.4748,50.54445],[3.52173,50.53459],[3.53266,50.51873],[3.54779,50.51012],[3.61523,50.50558],[3.67378,50.45642],[3.68415,50.35277],[3.6901,50.34044],[3.70258,50.33482],[3.71576,50.33854],[3.74935,50.36279],[3.84109,50.36558],[3.90189,50.3436],[3.91317,50.34291],[4.02672,50.36904],[4.13761,50.29984],[4.14388,50.29727],[4.21444,50.28167],[4.22904,50.26664],[4.23078,50.25233],[4.17084,50.18579],[4.16601,50.16888],[4.1764,50.1547],[4.21195,50.13602],[4.24074,50.07102],[4.23193,50.05551],[4.18164,50.03436],[4.17177,50.02537],[4.16976,50.01217],[4.1765,50.00065],[4.20633,49.97546],[4.22164,49.97089],[4.30877,49.98145],[4.44542,49.9523],[4.45469,49.95251],[4.6581,50.00609],[4.66936,50.01392],[4.67293,50.02716],[4.66924,50.06972],[4.69517,50.10472],[4.83123,50.17941],[4.8815,50.16436],[4.90479,50.14451],[4.90426,50.12639],[4.88076,50.0815],[4.86277,50.0745],[4.85104,50.06216],[4.84331,50.03884],[4.84331,50.03883],[4.8433,50.03881],[4.82678,49.989],[4.82662,49.97692],[4.83343,49.96696],[4.89654,49.91753],[4.89755,49.89424],[4.87913,49.86942],[4.87625,49.85111],[4.88924,49.81266],[4.89769,49.80204],[4.91098,49.79926],[4.99534,49.81116],[5.01867,49.79272],[5.02686,49.78886],[5.09944,49.77323],[5.13458,49.73462],[5.1412,49.72984],[5.18761,49.70906],[5.19602,49.70732],[5.28157,49.70836],[5.33363,49.67308],[5.344,49.65049],[5.3544,49.64041],[5.43141,49.60791],[5.48205,49.52815],[5.49294,49.51979],[5.50666,49.52042],[5.55401,49.54025],[5.59311,49.53424],[5.6076,49.53761],[5.641,49.56095],[5.70676,49.55267],[5.71578,49.55361],[5.77526,49.57414],[5.8399,49.55321],[5.86126,49.52038],[5.876,49.5114],[5.97516,49.50129],[5.99801,49.47317],[6.01627,49.46597],[6.08635,49.47562],[6.09319,49.47787],[6.17397,49.52187],[6.24643,49.52511],[6.334,49.48235],[6.34423,49.48037],[6.43515,49.487],[6.5451,49.44384],[6.60639,49.37868],[6.60497,49.33739],[6.61627,49.31869],[6.67013,49.29269],[6.72996,49.22917],[6.74328,49.19086],[6.76026,49.17752],[6.80904,49.17284],[6.82473,49.17826],[6.83093,49.19366],[6.82982,49.21802],[6.85119,49.23136],[6.88453,49.2239],[6.89322,49.22389],[6.93753,49.23369],[7.04055,49.19794],[7.0463,49.17503],[7.05478,49.16313],[7.06908,49.16018],[7.10494,49.16634],[7.14315,49.14159],[7.1535,49.13839],[7.28683,49.13488],[7.29893,49.13856],[7.36095,49.18259],[7.45012,49.19517],[7.50113,49.17672],[7.54379,49.10572],[7.5579,49.09626],[7.6296,49.08527],[7.64722,49.06722],[7.6612,49.06119],[7.75401,49.05963],[7.76073,49.06067],[7.80291,49.07489],[7.85525,49.05329],[7.8673,49.05227],[7.93826,49.06832],[8.08069,49.00688],[8.2225,48.98787],[8.23704,48.97683],[8.23589,48.95817],[8.20888,48.94863],[8.20089,48.94339],[8.15824,48.89753],[8.10087,48.7993],[7.99071,48.74478],[7.98534,48.7409],[7.90422,48.65865],[7.85605,48.63606],[7.8484,48.62977],[7.81842,48.58883],[7.81456,48.57704],[7.81449,48.50968],[7.78547,48.48337],[7.78055,48.47652],[7.74506,48.39484],[7.74357,48.38427],[7.75159,48.32322],[7.71085,48.29841],[7.70241,48.28803],[7.67661,48.21555],[7.59605,48.11698],[7.59165,48.10648],[7.58522,48.04694],[7.59127,48.03035],[7.62437,47.99865],[7.63205,47.97081],[7.57554,47.87436],[7.5728,47.86435],[7.57267,47.83631],[7.54581,47.78793],[7.54418,47.77232],[7.55758,47.72899],[7.53526,47.6989],[7.53136,47.68564],[7.537,47.67302],[7.60016,47.60822],[7.58967,47.56755],[7.55424,47.55128],[7.54511,47.54283],[7.51256,47.48439],[7.38747,47.42111],[7.32653,47.4273],[7.24435,47.40939],[7.16708,47.4335],[7.15212,47.47612],[7.14279,47.48707],[7.12853,47.48893],[7.0801,47.47718],[7.03557,47.48695],[7.02102,47.48458],[7.01205,47.47287],[7.003,47.44095],[6.9551,47.40808],[6.94716,47.39698],[6.94818,47.38337],[6.95769,47.37359],[6.97126,47.37218],[7.018,47.38386],[7.05623,47.37035],[7.07007,47.35005],[7.05958,47.32257],[6.97424,47.27856],[6.96347,47.26233],[6.96134,47.23479],[6.89443,47.19393],[6.88913,47.18922],[6.85545,47.14636],[6.76907,47.10751],[6.76011,47.09953],[6.72561,47.0418],[6.62355,46.9811],[6.4812,46.9445],[6.46892,46.93522],[6.46686,46.91997],[6.47548,46.88771],[6.4535,46.8239],[6.45644,46.80534],[6.46722,46.79104],[6.46098,46.76887],[6.15817,46.59343],[6.14872,46.58069],[6.15152,46.56508],[6.16549,46.54399],[6.15811,46.52456],[6.10174,46.46979],[6.09572,46.45418],[6.09704,46.43317],[6.10829,46.41643],[6.16622,46.38839],[6.17817,46.36922],[6.13748,46.31297],[6.13371,46.30227],[6.13038,46.23737],[6.1103,46.22344],[6.08865,46.23081],[6.07717,46.23123],[6.01857,46.21601],[6.00681,46.20752],[6.00388,46.19332],[6.00787,46.16977],[6.01783,46.15564],[6.03509,46.15456],[6.05564,46.16288],[6.12468,46.15415],[6.13778,46.15702],[6.24026,46.22094],[6.24906,46.23299],[6.24707,46.24777],[6.21148,46.31057],[6.21219,46.32485],[6.23946,46.36705],[6.31648,46.41557],[6.41083,46.42495],[6.41748,46.42682],[6.50498,46.46871],[6.63047,46.47435],[6.74665,46.45695],[6.82244,46.42925],[6.81832,46.38181],[6.80484,46.36179],[6.80189,46.34639],[6.81095,46.33359],[6.86491,46.30038],[6.87504,46.28007],[6.86092,46.2439],[6.82698,46.21188],[6.82075,46.19862],[6.81863,46.16592],[6.82259,46.15261],[6.83427,46.14509],[6.90382,46.12971],[6.90491,46.09595],[6.90932,46.08406],[6.92001,46.07721],[6.94898,46.0699],[7.01556,46.00883],[7.05191,45.93066],[7.04533,45.92217],[7.04497,45.92064],[7.04394,45.92036],[6.99582,45.85822],[6.94097,45.83551],[6.84376,45.82387],[6.83102,45.81711],[6.82614,45.80353],[6.82787,45.73217],[6.83174,45.72082],[6.8414,45.71373],[6.90729,45.69124],[6.92419,45.66935],[6.94247,45.66172],[6.97131,45.66528],[7.00597,45.64945],[7.01151,45.63652],[6.9978,45.60877],[6.99643,45.59465],[7.0158,45.52354],[7.02774,45.5102],[7.1072,45.47877],[7.1228,45.44924],[7.13304,45.44001],[7.1856,45.41894],[7.19515,45.40409],[7.17075,45.35069],[7.14232,45.32298],[7.13649,45.30576],[7.14458,45.25048],[7.08417,45.20279],[6.99279,45.19823],[6.98106,45.19368],[6.90009,45.12689],[6.85843,45.11699],[6.78283,45.14228],[6.77056,45.14242],[6.67751,45.11356],[6.6653,45.10289],[6.66501,45.08667],[6.68237,45.04558],[6.69602,45.03395],[6.75744,45.01884],[6.78375,44.9146],[6.7942,44.90161],[6.86698,44.86519],[6.8798,44.86346],[6.93633,44.87461],[7.01795,44.84402],[7.03453,44.82282],[7.03711,44.75009],[7.0496,44.73226],[7.07224,44.72311],[7.08651,44.6968],[7.08666,44.68085],[7.07671,44.67134],[6.99007,44.67203],[6.97413,44.66431],[6.97056,44.64696],[6.97819,44.61784],[6.94659,44.57124],[6.88235,44.53479],[6.87233,44.5195],[6.87892,44.50245],[6.95894,44.43129],[6.95872,44.42908],[6.92167,44.41436],[6.91223,44.40659],[6.90907,44.39477],[6.90972,44.38195],[6.91637,44.36804],[6.99909,44.29414],[7.01181,44.256],[7.01983,44.24558],[7.03259,44.2424],[7.07312,44.2461],[7.1651,44.22112],[7.24533,44.18544],[7.26053,44.16682],[7.27537,44.15947],[7.33878,44.1574],[7.36278,44.13834],[7.37776,44.13416],[7.56283,44.15792],[7.5642,44.15836],[7.56478,44.15817],[7.60548,44.1634],[7.6162,44.16827],[7.63989,44.18928],[7.68608,44.1861],[7.69422,44.17795],[7.68937,44.13869],[7.69445,44.12276],[7.72786,44.08615],[7.72403,44.05704],[7.68603,44.02371],[7.68077,44.0164],[7.66016,43.9672],[7.59624,43.94466],[7.58419,43.93287],[7.56858,43.89159],[7.5271,43.87434],[7.51649,43.86397],[7.51594,43.84915],[7.53622,43.79234],[9.8,43.1],[9.63227,41.43244],[9.36968,41.35052],[9.27311,41.29196],[8.94186,41.27688],[5.8,41.64],[3.17358,42.41768],[3.16081,42.42757],[3.0944,42.41457],[3.03402,42.45331],[3.02214,42.45645],[2.87822,42.4487],[2.87019,42.44653],[2.78424,42.40256],[2.7413,42.41128],[2.72928,42.40998],[2.69331,42.39417],[2.68378,42.3854],[2.68162,42.37263],[2.68585,42.34679],[2.66719,42.33008],[2.58106,42.34418],[2.56777,42.34173],[2.5338,42.32197],[2.47795,42.32986],[2.41933,42.37658],[2.41222,42.38021],[2.26719,42.42055],[2.25973,42.42117],[2.20694,42.41558],[2.20653,42.41526],[2.20526,42.41541],[2.16028,42.41065],[2.14881,42.40545],[2.09393,42.35474],[2.00861,42.33818],[1.965,42.36473],[1.93076,42.42442],[1.92089,42.43302],[1.88467,42.44761],[1.88459,42.44762],[1.88444,42.4477],[1.82774,42.47056],[1.72567,42.48452],[1.71561,42.50125],[1.7272,42.56103],[1.72479,42.57499],[1.71011,42.59992],[1.69377,42.60975],[1.60283,42.61382],[1.56069,42.6392],[1.54636,42.64166],[1.50444,42.6331],[1.4921,42.62502],[1.47238,42.59703],[1.43792,42.59264],[1.41936,42.60643],[1.38032,42.67415],[1.37335,42.68127],[1.33313,42.70563],[1.32364,42.7085],[1.23221,42.71248],[1.16554,42.69928],[1.08546,42.76635],[1.07564,42.77079],[0.95937,42.78852],[0.95073,42.78794],[0.92265,42.7797],[0.84606,42.8157],[0.71511,42.8464],[0.70017,42.84402],[0.69117,42.83186],[0.67409,42.76479],[0.67474,42.75286],[0.69192,42.70684],[0.669,42.67901],[0.43024,42.67863],[0.3715,42.70308],[0.35954,42.70415],[0.34912,42.69817],[0.32567,42.67274],[0.29571,42.66388],[0.24594,42.70175],[0.23972,42.70494],[0.18967,42.72039],[0.17919,42.72075],[-0.01993,42.67389],[-0.06726,42.6848],[-0.16949,42.77157],[-0.29987,42.82697],[-0.31683,42.82635],[-0.39208,42.78766],[-0.44354,42.78453],[-0.48842,42.80255],[-0.50868,42.79935],[-0.54499,42.76906],[-0.56721,42.76937],[-0.67446,42.86392],[-0.68094,42.86775],[-0.73372,42.88666],[-0.7476,42.93879],[-0.75711,42.95107],[-0.77253,42.95284],[-0.82114,42.93865],[-0.94508,42.94192],[-1.02313,42.98206],[-1.10852,43.00409],[-1.1156,43.00461],[-1.14775,43.00124],[-1.15845,43.01452],[-1.16736,43.02083],[-1.21622,43.0381],[-1.22612,43.03898],[-1.26236,43.03303],[-1.30643,43.05531],[-1.31992,43.05696],[-1.33135,43.0496],[-1.3542,43.0197],[-1.43868,43.03371],[-1.4775,43.06889],[-1.48311,43.08561],[-1.47641,43.10248],[-1.43479,43.13087],[-1.42732,43.1404],[-1.39411,43.22935],[-1.39531,43.24596],[-1.40868,43.25591],[-1.52629,43.28099],[-1.54626,43.2737],[-1.57149,43.2412],[-1.61053,43.24223],[-1.65,43.29323],[-1.66953,43.30065],[-1.73359,43.28856],[-1.75606,43.31966],[-1.76297,43.32565],[-1.79156,43.34067],[-1.80099,43.37017],[-1.78509,43.39037],[-1.7835,43.39686],[-2.7,43.9]]],terms_url:"https://wiki.openstreetmap.org/wiki/FR:WikiProject_France/WikiProject_Base_Adresses_Nationale_Ouverte_(BANO)#Licence_du_r.C3.A9sultat",terms_text:"Tiles © cquest@Openstreetmap France, data © OpenStreetMap contributors, ODBL",description:"French address registry or Base Adresses Nationale Ouverte",overlay:true},{id:"lu.geoportail.opendata.basemap",name:"Basemap geoportail.lu",type:"tms",template:"https://{switch:wmts3,wmts4}.geoportail.lu/opendata/wmts/basemap/GLOBAL_WEBMERCATOR_4_V3/{zoom}/{x}/{y}.png",endDate:"2010-07-20T00:00:00.000Z",startDate:"2013-07-19T00:00:00.000Z",zoomExtent:[0,20],polygon:[[[5.96175,50.17631],[6.02627,50.18496],[6.03318,50.16395],[6.06069,50.15536],[6.07668,50.15913],[6.07824,50.17255],[6.10176,50.17199],[6.1225,50.16437],[6.1201,50.15594],[6.1277,50.14993],[6.11323,50.13739],[6.12369,50.13719],[6.14093,50.1305],[6.13555,50.11899],[6.13808,50.10263],[6.13108,50.09964],[6.13547,50.09119],[6.12194,50.09059],[6.12634,50.07817],[6.13186,50.07348],[6.12117,50.064],[6.11444,50.06139],[6.11563,50.05817],[6.12361,50.06323],[6.13661,50.04178],[6.13034,50.02975],[6.14821,50.02307],[6.13868,50.01572],[6.13594,50.01485],[6.13138,50.01905],[6.13024,50.01819],[6.13934,50.01116],[6.1517,50.01058],[6.14546,49.99689],[6.13966,49.9994],[6.13852,49.99829],[6.14218,49.99535],[6.15023,49.99518],[6.15625,49.98867],[6.17305,49.98589],[6.17348,49.98344],[6.17035,49.98376],[6.16549,49.97115],[6.17151,49.96298],[6.1763,49.962],[6.17995,49.95386],[6.18339,49.9548],[6.17983,49.96307],[6.18331,49.9686],[6.19277,49.97158],[6.19978,49.95352],[6.20707,49.95672],[6.21269,49.9514],[6.22502,49.95039],[6.22044,49.94369],[6.22824,49.93726],[6.22635,49.92766],[6.21913,49.92354],[6.22986,49.92125],[6.23603,49.91355],[6.23187,49.91064],[6.22769,49.91062],[6.23229,49.9072],[6.23381,49.90028],[6.24692,49.89535],[6.25781,49.88724],[6.26301,49.88101],[6.27646,49.87725],[6.28113,49.87957],[6.29166,49.87548],[6.2977,49.86673],[6.30989,49.87107],[6.31532,49.8673],[6.31465,49.86057],[6.32361,49.85188],[6.32158,49.8409],[6.32741,49.83673],[6.33656,49.83998],[6.33937,49.8507],[6.36465,49.85164],[6.4022,49.82098],[6.42643,49.81629],[6.42807,49.81186],[6.43097,49.81129],[6.44161,49.81547],[6.44344,49.81233],[6.45366,49.81275],[6.46454,49.81975],[6.47057,49.82385],[6.49681,49.81277],[6.50669,49.80993],[6.51155,49.80238],[6.51485,49.80513],[6.5196,49.81446],[6.52981,49.81048],[6.53225,49.80686],[6.53083,49.80116],[6.50622,49.78899],[6.51917,49.78344],[6.51105,49.77422],[6.52056,49.76818],[6.52052,49.76134],[6.50373,49.75086],[6.50263,49.73298],[6.50727,49.72938],[6.51809,49.7242],[6.51642,49.72129],[6.51176,49.72016],[6.50479,49.725],[6.49891,49.72639],[6.49558,49.72443],[6.50712,49.71655],[6.50788,49.71215],[6.5046,49.71227],[6.42714,49.66237],[6.4399,49.66025],[6.44251,49.65591],[6.42178,49.61809],[6.39898,49.60094],[6.37941,49.59526],[6.37551,49.58809],[6.38443,49.5801],[6.38119,49.57509],[6.36909,49.5783],[6.35791,49.57166],[6.3849,49.55817],[6.38009,49.54856],[6.35855,49.53296],[6.35932,49.52481],[6.37076,49.50545],[6.37056,49.45732],[6.3334,49.46493],[6.32189,49.47244],[6.29503,49.47928],[6.28789,49.48379],[6.27191,49.49995],[6.24133,49.50693],[6.19669,49.50331],[6.17337,49.50577],[6.16086,49.50085],[6.1671,49.49006],[6.14018,49.48525],[6.12937,49.48803],[6.12725,49.47081],[6.1014,49.46726],[6.10483,49.45076],[6.08167,49.45417],[6.07722,49.46139],[6.05917,49.46306],[6.05222,49.46028],[6.04421,49.44553],[6.02529,49.44703],[6.02154,49.45127],[6.01574,49.44885],[5.99412,49.45301],[5.97657,49.44885],[5.97773,49.45955],[5.97232,49.46087],[5.96891,49.48202],[5.9616,49.49026],[5.91578,49.49835],[5.89033,49.4948],[5.86332,49.50006],[5.84897,49.50826],[5.84828,49.51397],[5.83641,49.51817],[5.83187,49.52639],[5.84308,49.53081],[5.83562,49.54114],[5.81625,49.53325],[5.8052,49.54272],[5.85943,49.57158],[5.86866,49.587],[5.86289,49.58525],[5.8511,49.58379],[5.84712,49.58961],[5.84565,49.5981],[5.8694,49.6106],[5.88182,49.63815],[5.89998,49.63907],[5.89934,49.66239],[5.85656,49.67628],[5.85628,49.68211],[5.8757,49.71118],[5.86481,49.72331],[5.84325,49.71822],[5.82191,49.72128],[5.82489,49.73767],[5.82073,49.74878],[5.78626,49.79079],[5.76517,49.78961],[5.75094,49.79094],[5.74159,49.82126],[5.74581,49.82435],[5.7372,49.83353],[5.74053,49.84142],[5.74701,49.84048],[5.74624,49.84783],[5.75399,49.84878],[5.74066,49.85152],[5.75229,49.85922],[5.74955,49.87554],[5.77567,49.87438],[5.77505,49.88057],[5.7346,49.89341],[5.73303,49.90285],[5.75783,49.91737],[5.76039,49.93252],[5.77073,49.93711],[5.76878,49.94239],[5.7688,49.96104],[5.78672,49.96816],[5.80524,49.96677],[5.80652,49.97321],[5.83129,49.97995],[5.83462,49.98656],[5.81806,49.99936],[5.81561,50.01437],[5.84792,50.02809],[5.86189,50.04581],[5.85087,50.0563],[5.85781,50.07186],[5.881,50.08069],[5.89196,50.12041],[5.95286,50.13384],[5.96175,50.17631]]],terms_url:"https://data.public.lu/en/datasets/carte-de-base-webservices-wms-et-wmts",terms_text:"Administration du Cadastre et de la Topographie",icon:"https://www.geoportail.lu/static/img/lion.png"},{id:"basemap.at",name:"basemap.at",type:"tms",template:"https://maps{switch:1,2,3,4}.wien.gv.at/basemap/geolandbasemap/normal/google3857/{zoom}/{y}/{x}.png",zoomExtent:[0,19],polygon:[[[16.50733,46.99293],[16.28342,46.99293],[16.13584,46.8713],[15.98317,46.81909],[16.04933,46.65517],[15.86104,46.71801],[15.75926,46.69009],[15.56079,46.67962],[15.57606,46.63421],[15.47937,46.60276],[15.43357,46.65168],[15.22493,46.63421],[15.04682,46.64819],[14.99084,46.58877],[14.9603,46.62373],[14.85344,46.60276],[14.83308,46.50127],[14.75166,46.49776],[14.68041,46.43818],[14.61426,46.43818],[14.57864,46.37853],[14.44124,46.43116],[14.16135,46.42766],[14.12573,46.47674],[14.01886,46.47674],[13.91199,46.52578],[13.82548,46.50477],[13.44381,46.56078],[13.30641,46.55028],[13.1283,46.58877],[12.84332,46.61324],[12.72628,46.6412],[12.51255,46.66565],[12.35988,46.70405],[12.36497,46.77032],[12.28863,46.77729],[12.27337,46.88522],[12.20721,46.87478],[12.13088,46.90261],[12.11561,46.99987],[12.25301,47.06577],[12.2123,47.0935],[11.9833,47.04497],[11.73394,46.96168],[11.63217,47.01028],[11.54057,46.97557],[11.49986,47.00681],[11.41843,46.96515],[11.25559,46.97557],[11.1131,46.91304],[11.04185,46.76335],[10.88919,46.75986],[10.74161,46.78426],[10.70599,46.86435],[10.57877,46.83998],[10.45663,46.85043],[10.47699,46.92694],[10.38539,46.98946],[10.23272,46.86435],[10.12076,46.83302],[9.86632,46.94084],[9.90194,47.00334],[9.68312,47.05884],[9.61188,47.03804],[9.63223,47.12813],[9.58134,47.1662],[9.54063,47.26644],[9.60679,47.34926],[9.67294,47.36994],[9.64241,47.44571],[9.56608,47.48011],[9.71365,47.52824],[9.7849,47.59692],[9.83579,47.54542],[9.94774,47.53855],[10.09023,47.44915],[10.11059,47.36649],[10.2429,47.38717],[10.18692,47.2699],[10.32432,47.29751],[10.48208,47.44915],[10.43119,47.48699],[10.44137,47.59005],[10.48717,47.55229],[10.54823,47.53511],[10.59912,47.56602],[10.75688,47.53168],[10.88919,47.54542],[10.94008,47.48699],[10.99605,47.39061],[11.23523,47.44227],[11.28103,47.3975],[11.42352,47.51449],[11.57619,47.50762],[11.60672,47.59005],[11.83572,47.58662],[12.00366,47.62436],[12.20721,47.60378],[12.16141,47.69634],[12.2581,47.74427],[12.25301,47.67921],[12.43112,47.71004],[12.49219,47.63122],[12.56852,47.62779],[12.62959,47.68949],[12.77208,47.66893],[12.83315,47.54198],[12.97564,47.47323],[13.04179,47.49387],[13.0367,47.55572],[13.09777,47.64151],[13.03161,47.71004],[12.90439,47.72031],[13.00617,47.84683],[12.9451,47.93555],[12.86368,47.95941],[12.86368,48.00369],[12.75172,48.09894],[12.87386,48.21097],[12.96037,48.21097],[13.04179,48.2652],[13.18428,48.29907],[13.26061,48.2923],[13.39801,48.35659],[13.44381,48.41742],[13.43872,48.55234],[13.50997,48.58601],[13.61175,48.57255],[13.72879,48.5119],[13.78477,48.57255],[13.82039,48.62639],[13.79495,48.71713],[13.85093,48.77417],[14.05957,48.66338],[14.01377,48.63312],[14.07484,48.59274],[14.21733,48.59611],[14.3649,48.54897],[14.46668,48.64993],[14.55828,48.59611],[14.59899,48.62639],[14.72113,48.57591],[14.72113,48.6869],[14.8229,48.7272],[14.81782,48.77753],[14.96472,48.78518],[14.98936,49.01266],[15.14859,48.99503],[15.19439,48.93155],[15.30635,48.98501],[15.39286,48.98501],[15.48446,48.92821],[15.74908,48.8546],[15.84068,48.88807],[16.00862,48.78088],[16.20708,48.73391],[16.39537,48.73727],[16.49206,48.81105],[16.69053,48.77417],[16.7058,48.73391],[16.89917,48.71377],[16.97551,48.51527],[16.84828,48.45118],[16.85337,48.34644],[16.95515,48.25165],[16.99077,48.1499],[17.09255,48.13971],[17.08237,48.02412],[17.17397,48.02071],[17.08237,47.87414],[16.98568,47.86732],[17.08237,47.80925],[17.09255,47.70319],[16.74142,47.67921],[16.7058,47.75112],[16.53786,47.75454],[16.54804,47.70662],[16.42082,47.66893],[16.57348,47.6175],[16.67017,47.63122],[16.71088,47.53855],[16.66,47.44915],[16.54295,47.39406],[16.46153,47.39406],[16.49206,47.2768],[16.42591,47.19733],[16.47171,47.1489],[16.54804,47.1489],[16.47679,47.07964],[16.52768,47.05884],[16.50733,46.99293]]],terms_url:"https://basemap.at",terms_text:"basemap.at",description:"Basemap of Austria, based on government data.",icon:"https://www.basemap.at/images/logo_basemap.jpg"},{id:"basemap.at-overlay",name:"basemap.at Beschriftungen (annotations)",type:"tms",template:"https://maps{switch:1,2,3,4}.wien.gv.at/basemap/bmapoverlay/normal/google3857/{zoom}/{y}/{x}.png",zoomExtent:[0,19],polygon:[[[16.50733,46.99293],[16.28342,46.99293],[16.13584,46.8713],[15.98317,46.81909],[16.04933,46.65517],[15.86104,46.71801],[15.75926,46.69009],[15.56079,46.67962],[15.57606,46.63421],[15.47937,46.60276],[15.43357,46.65168],[15.22493,46.63421],[15.04682,46.64819],[14.99084,46.58877],[14.9603,46.62373],[14.85344,46.60276],[14.83308,46.50127],[14.75166,46.49776],[14.68041,46.43818],[14.61426,46.43818],[14.57864,46.37853],[14.44124,46.43116],[14.16135,46.42766],[14.12573,46.47674],[14.01886,46.47674],[13.91199,46.52578],[13.82548,46.50477],[13.44381,46.56078],[13.30641,46.55028],[13.1283,46.58877],[12.84332,46.61324],[12.72628,46.6412],[12.51255,46.66565],[12.35988,46.70405],[12.36497,46.77032],[12.28863,46.77729],[12.27337,46.88522],[12.20721,46.87478],[12.13088,46.90261],[12.11561,46.99987],[12.25301,47.06577],[12.2123,47.0935],[11.9833,47.04497],[11.73394,46.96168],[11.63217,47.01028],[11.54057,46.97557],[11.49986,47.00681],[11.41843,46.96515],[11.25559,46.97557],[11.1131,46.91304],[11.04185,46.76335],[10.88919,46.75986],[10.74161,46.78426],[10.70599,46.86435],[10.57877,46.83998],[10.45663,46.85043],[10.47699,46.92694],[10.38539,46.98946],[10.23272,46.86435],[10.12076,46.83302],[9.86632,46.94084],[9.90194,47.00334],[9.68312,47.05884],[9.61188,47.03804],[9.63223,47.12813],[9.58134,47.1662],[9.54063,47.26644],[9.60679,47.34926],[9.67294,47.36994],[9.64241,47.44571],[9.56608,47.48011],[9.71365,47.52824],[9.7849,47.59692],[9.83579,47.54542],[9.94774,47.53855],[10.09023,47.44915],[10.11059,47.36649],[10.2429,47.38717],[10.18692,47.2699],[10.32432,47.29751],[10.48208,47.44915],[10.43119,47.48699],[10.44137,47.59005],[10.48717,47.55229],[10.54823,47.53511],[10.59912,47.56602],[10.75688,47.53168],[10.88919,47.54542],[10.94008,47.48699],[10.99605,47.39061],[11.23523,47.44227],[11.28103,47.3975],[11.42352,47.51449],[11.57619,47.50762],[11.60672,47.59005],[11.83572,47.58662],[12.00366,47.62436],[12.20721,47.60378],[12.16141,47.69634],[12.2581,47.74427],[12.25301,47.67921],[12.43112,47.71004],[12.49219,47.63122],[12.56852,47.62779],[12.62959,47.68949],[12.77208,47.66893],[12.83315,47.54198],[12.97564,47.47323],[13.04179,47.49387],[13.0367,47.55572],[13.09777,47.64151],[13.03161,47.71004],[12.90439,47.72031],[13.00617,47.84683],[12.9451,47.93555],[12.86368,47.95941],[12.86368,48.00369],[12.75172,48.09894],[12.87386,48.21097],[12.96037,48.21097],[13.04179,48.2652],[13.18428,48.29907],[13.26061,48.2923],[13.39801,48.35659],[13.44381,48.41742],[13.43872,48.55234],[13.50997,48.58601],[13.61175,48.57255],[13.72879,48.5119],[13.78477,48.57255],[13.82039,48.62639],[13.79495,48.71713],[13.85093,48.77417],[14.05957,48.66338],[14.01377,48.63312],[14.07484,48.59274],[14.21733,48.59611],[14.3649,48.54897],[14.46668,48.64993],[14.55828,48.59611],[14.59899,48.62639],[14.72113,48.57591],[14.72113,48.6869],[14.8229,48.7272],[14.81782,48.77753],[14.96472,48.78518],[14.98936,49.01266],[15.14859,48.99503],[15.19439,48.93155],[15.30635,48.98501],[15.39286,48.98501],[15.48446,48.92821],[15.74908,48.8546],[15.84068,48.88807],[16.00862,48.78088],[16.20708,48.73391],[16.39537,48.73727],[16.49206,48.81105],[16.69053,48.77417],[16.7058,48.73391],[16.89917,48.71377],[16.97551,48.51527],[16.84828,48.45118],[16.85337,48.34644],[16.95515,48.25165],[16.99077,48.1499],[17.09255,48.13971],[17.08237,48.02412],[17.17397,48.02071],[17.08237,47.87414],[16.98568,47.86732],[17.08237,47.80925],[17.09255,47.70319],[16.74142,47.67921],[16.7058,47.75112],[16.53786,47.75454],[16.54804,47.70662],[16.42082,47.66893],[16.57348,47.6175],[16.67017,47.63122],[16.71088,47.53855],[16.66,47.44915],[16.54295,47.39406],[16.46153,47.39406],[16.49206,47.2768],[16.42591,47.19733],[16.47171,47.1489],[16.54804,47.1489],[16.47679,47.07964],[16.52768,47.05884],[16.50733,46.99293]]],terms_url:"https://basemap.at/",terms_text:"basemap.at",description:"Annotation overlay provided by basemap.at.",icon:"https://www.basemap.at/images/logo_basemap.jpg",overlay:true},{id:"basemap.at-orthofoto",name:"basemap.at Orthofoto",type:"tms",template:"https://maps{switch:1,2,3,4}.wien.gv.at/basemap/bmaporthofoto30cm/normal/google3857/{zoom}/{y}/{x}.jpeg",zoomExtent:[0,19],polygon:[[[16.50733,46.99293],[16.28342,46.99293],[16.13584,46.8713],[15.98317,46.81909],[16.04933,46.65517],[15.86104,46.71801],[15.75926,46.69009],[15.56079,46.67962],[15.57606,46.63421],[15.47937,46.60276],[15.43357,46.65168],[15.22493,46.63421],[15.04682,46.64819],[14.99084,46.58877],[14.9603,46.62373],[14.85344,46.60276],[14.83308,46.50127],[14.75166,46.49776],[14.68041,46.43818],[14.61426,46.43818],[14.57864,46.37853],[14.44124,46.43116],[14.16135,46.42766],[14.12573,46.47674],[14.01886,46.47674],[13.91199,46.52578],[13.82548,46.50477],[13.44381,46.56078],[13.30641,46.55028],[13.1283,46.58877],[12.84332,46.61324],[12.72628,46.6412],[12.51255,46.66565],[12.35988,46.70405],[12.36497,46.77032],[12.28863,46.77729],[12.27337,46.88522],[12.20721,46.87478],[12.13088,46.90261],[12.11561,46.99987],[12.25301,47.06577],[12.2123,47.0935],[11.9833,47.04497],[11.73394,46.96168],[11.63217,47.01028],[11.54057,46.97557],[11.49986,47.00681],[11.41843,46.96515],[11.25559,46.97557],[11.1131,46.91304],[11.04185,46.76335],[10.88919,46.75986],[10.74161,46.78426],[10.70599,46.86435],[10.57877,46.83998],[10.45663,46.85043],[10.47699,46.92694],[10.38539,46.98946],[10.23272,46.86435],[10.12076,46.83302],[9.86632,46.94084],[9.90194,47.00334],[9.68312,47.05884],[9.61188,47.03804],[9.63223,47.12813],[9.58134,47.1662],[9.54063,47.26644],[9.60679,47.34926],[9.67294,47.36994],[9.64241,47.44571],[9.56608,47.48011],[9.71365,47.52824],[9.7849,47.59692],[9.83579,47.54542],[9.94774,47.53855],[10.09023,47.44915],[10.11059,47.36649],[10.2429,47.38717],[10.18692,47.2699],[10.32432,47.29751],[10.48208,47.44915],[10.43119,47.48699],[10.44137,47.59005],[10.48717,47.55229],[10.54823,47.53511],[10.59912,47.56602],[10.75688,47.53168],[10.88919,47.54542],[10.94008,47.48699],[10.99605,47.39061],[11.23523,47.44227],[11.28103,47.3975],[11.42352,47.51449],[11.57619,47.50762],[11.60672,47.59005],[11.83572,47.58662],[12.00366,47.62436],[12.20721,47.60378],[12.16141,47.69634],[12.2581,47.74427],[12.25301,47.67921],[12.43112,47.71004],[12.49219,47.63122],[12.56852,47.62779],[12.62959,47.68949],[12.77208,47.66893],[12.83315,47.54198],[12.97564,47.47323],[13.04179,47.49387],[13.0367,47.55572],[13.09777,47.64151],[13.03161,47.71004],[12.90439,47.72031],[13.00617,47.84683],[12.9451,47.93555],[12.86368,47.95941],[12.86368,48.00369],[12.75172,48.09894],[12.87386,48.21097],[12.96037,48.21097],[13.04179,48.2652],[13.18428,48.29907],[13.26061,48.2923],[13.39801,48.35659],[13.44381,48.41742],[13.43872,48.55234],[13.50997,48.58601],[13.61175,48.57255],[13.72879,48.5119],[13.78477,48.57255],[13.82039,48.62639],[13.79495,48.71713],[13.85093,48.77417],[14.05957,48.66338],[14.01377,48.63312],[14.07484,48.59274],[14.21733,48.59611],[14.3649,48.54897],[14.46668,48.64993],[14.55828,48.59611],[14.59899,48.62639],[14.72113,48.57591],[14.72113,48.6869],[14.8229,48.7272],[14.81782,48.77753],[14.96472,48.78518],[14.98936,49.01266],[15.14859,48.99503],[15.19439,48.93155],[15.30635,48.98501],[15.39286,48.98501],[15.48446,48.92821],[15.74908,48.8546],[15.84068,48.88807],[16.00862,48.78088],[16.20708,48.73391],[16.39537,48.73727],[16.49206,48.81105],[16.69053,48.77417],[16.7058,48.73391],[16.89917,48.71377],[16.97551,48.51527],[16.84828,48.45118],[16.85337,48.34644],[16.95515,48.25165],[16.99077,48.1499],[17.09255,48.13971],[17.08237,48.02412],[17.17397,48.02071],[17.08237,47.87414],[16.98568,47.86732],[17.08237,47.80925],[17.09255,47.70319],[16.74142,47.67921],[16.7058,47.75112],[16.53786,47.75454],[16.54804,47.70662],[16.42082,47.66893],[16.57348,47.6175],[16.67017,47.63122],[16.71088,47.53855],[16.66,47.44915],[16.54295,47.39406],[16.46153,47.39406],[16.49206,47.2768],[16.42591,47.19733],[16.47171,47.1489],[16.54804,47.1489],[16.47679,47.07964],[16.52768,47.05884],[16.50733,46.99293]]],terms_url:"https://basemap.at",terms_text:"basemap.at",best:true,description:"Orthofoto layer provided by basemap.at. \"Successor\" of geoimage.at imagery.",icon:"https://www.basemap.at/images/logo_basemap.jpg"},{id:"bavaria-80cm",name:"Bavaria (80 cm)",type:"wms",template:"https://geoservices.bayern.de/wms/v2/ogc_dop80_oa.cgi?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=by_dop80c&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",zoomExtent:[7,18],polygon:[[[10.12359,50.56846],[10.14286,50.55078],[10.20281,50.55742],[10.25205,50.51796],[10.32698,50.49345],[10.41048,50.41848],[10.60317,50.33109],[10.62244,50.2271],[10.72521,50.21066],[10.72949,50.24765],[10.85153,50.24354],[10.71879,50.32015],[10.71236,50.36524],[10.85581,50.39664],[10.93717,50.39664],[10.99069,50.36661],[11.12772,50.36661],[11.1791,50.31332],[11.16197,50.29417],[11.24119,50.2928],[11.24975,50.37344],[11.24119,50.47982],[11.35895,50.5234],[11.43816,50.50979],[11.44244,50.48936],[11.42532,50.4771],[11.42532,50.44166],[11.48955,50.42257],[11.49169,50.39801],[11.51952,50.39801],[11.52594,50.37617],[11.59874,50.40347],[11.63727,50.38845],[11.79357,50.4212],[11.83639,50.39255],[11.92203,50.42802],[11.98626,50.38709],[11.98412,50.35705],[12.04835,50.33109],[12.09331,50.32972],[12.1297,50.29828],[12.14041,50.27228],[12.10615,50.25586],[12.11258,50.23532],[12.14897,50.23669],[12.19822,50.20107],[12.22391,50.16406],[12.20464,50.14348],[12.20678,50.10779],[12.24318,50.09955],[12.27743,50.07208],[12.49367,49.98543],[12.49796,49.94136],[12.55576,49.92206],[12.54934,49.86827],[12.48083,49.78817],[12.41018,49.75775],[12.46156,49.70655],[12.5472,49.68023],[12.58788,49.55261],[12.65425,49.53455],[12.66281,49.43302],[12.75274,49.41073],[12.7977,49.34661],[12.90475,49.35638],[12.99681,49.33685],[13.05462,49.27543],[13.13169,49.21952],[13.19164,49.14395],[13.2366,49.12153],[13.29655,49.12293],[13.37148,49.08088],[13.4143,49.02897],[13.4143,48.97981],[13.57916,48.96997],[13.63483,48.94326],[13.67765,48.88698],[13.73759,48.89261],[13.7847,48.83346],[13.84036,48.77423],[13.81681,48.70646],[13.84464,48.70081],[13.8425,48.60038],[13.76543,48.5423],[13.75258,48.50401],[13.67122,48.50543],[13.64339,48.54371],[13.45712,48.5508],[13.45712,48.41598],[13.40574,48.36053],[13.2837,48.27511],[13.09315,48.26941],[12.95827,48.19097],[12.87691,48.18526],[12.772,48.09382],[12.86407,48.01368],[12.89832,47.95492],[12.94543,47.95636],[12.99681,47.88461],[13.01394,47.83434],[12.93472,47.7322],[13.0589,47.72499],[13.11885,47.63851],[13.06532,47.56922],[13.05676,47.47379],[13.00323,47.45208],[12.76772,47.55044],[12.76986,47.63274],[12.73989,47.67312],[12.6671,47.67024],[12.57503,47.6212],[12.48083,47.61975],[12.41446,47.67024],[12.24318,47.67745],[12.2132,47.69186],[12.19179,47.68177],[12.2132,47.66591],[12.21106,47.60388],[12.17467,47.59521],[12.13827,47.60388],[11.89205,47.60388],[11.85137,47.57933],[11.63942,47.58222],[11.59445,47.54899],[11.59017,47.51285],[11.51738,47.49839],[11.4403,47.50417],[11.39534,47.47524],[11.42746,47.44484],[11.3461,47.44339],[11.27973,47.39559],[11.21336,47.38834],[11.24761,47.43181],[11.10203,47.39269],[10.965,47.38979],[10.97785,47.43615],[10.9179,47.47524],[10.8708,47.47524],[10.85581,47.49405],[10.90077,47.5143],[10.87294,47.53598],[10.81085,47.51285],[10.64385,47.54899],[10.59461,47.55477],[10.57962,47.52876],[10.46187,47.54032],[10.46615,47.48392],[10.48756,47.47813],[10.48756,47.41298],[10.45973,47.40283],[10.45973,47.37529],[10.41048,47.37384],[10.40834,47.34339],[10.32056,47.28678],[10.28202,47.27806],[10.28416,47.26208],[10.14714,47.26208],[10.1921,47.30275],[10.19424,47.37384],[10.16641,47.37384],[10.16641,47.34629],[10.10004,47.34339],[10.0615,47.36369],[10.06792,47.41877],[10.09361,47.42601],[10.09576,47.44194],[9.978,47.48537],[9.95659,47.52731],[9.8945,47.52876],[9.85596,47.50851],[9.81743,47.54465],[9.82171,47.57644],[9.77461,47.58222],[9.73821,47.52586],[9.67398,47.53454],[9.58406,47.56488],[9.63972,47.60532],[9.7168,47.60388],[9.85596,47.676],[9.978,47.65582],[10.02938,47.68177],[10.10004,47.66735],[10.13215,47.676],[10.14286,47.70195],[10.0615,47.7725],[10.11288,47.8099],[10.08291,47.85302],[10.1086,47.90902],[10.07649,47.96496],[10.13001,48.02084],[10.13429,48.10669],[10.10004,48.12813],[10.05508,48.26228],[9.96944,48.36765],[10.03153,48.42593],[10.02938,48.46144],[10.12359,48.47705],[10.15356,48.4515],[10.23492,48.51252],[10.31628,48.51678],[10.29915,48.61878],[10.24563,48.6683],[10.27346,48.70646],[10.3698,48.68385],[10.43189,48.69939],[10.45116,48.72765],[10.40192,48.746],[10.44046,48.84896],[10.43403,48.95873],[10.33769,49.02055],[10.24991,49.03599],[10.24991,49.07387],[10.20066,49.10331],[10.25205,49.13274],[10.12359,49.19714],[10.11931,49.26285],[10.15142,49.28939],[10.10432,49.34522],[10.14072,49.39401],[10.1086,49.44555],[10.11074,49.50537],[10.0722,49.53316],[10.01654,49.47616],[9.92662,49.47894],[9.92448,49.55678],[9.89878,49.58177],[9.85596,49.53872],[9.80672,49.55678],[9.86667,49.60675],[9.85382,49.6442],[9.81743,49.66083],[9.83455,49.68993],[9.79602,49.72039],[9.75748,49.70793],[9.74035,49.68577],[9.70609,49.71624],[9.67826,49.71624],[9.68254,49.68854],[9.62045,49.69131],[9.64615,49.78955],[9.55836,49.77434],[9.57121,49.73561],[9.50698,49.75222],[9.49199,49.77987],[9.46844,49.76051],[9.42562,49.77849],[9.40421,49.76466],[9.33356,49.7702],[9.32928,49.73423],[9.4085,49.72593],[9.42776,49.69824],[9.41492,49.6442],[9.38066,49.63865],[9.35925,49.64974],[9.33998,49.63727],[9.31215,49.64836],[9.27789,49.62617],[9.28432,49.60814],[9.2415,49.57483],[9.09805,49.57205],[9.06594,49.60814],[9.10019,49.65113],[9.09163,49.6927],[9.13017,49.71208],[9.13873,49.74253],[9.10876,49.75637],[9.13659,49.79093],[9.10019,49.78955],[9.07236,49.82824],[9.03596,49.83514],[9.01669,50.02671],[8.96317,50.03084],[8.95674,50.05971],[9.00171,50.0707],[9.02097,50.11054],[9.1216,50.12289],[9.15586,50.11328],[9.19654,50.11878],[9.18583,50.13525],[9.23507,50.1476],[9.37638,50.12701],[9.4085,50.0817],[9.52197,50.09543],[9.50484,50.14211],[9.53267,50.16406],[9.48985,50.16954],[9.49413,50.24354],[9.61403,50.22163],[9.66541,50.23532],[9.63544,50.24901],[9.66756,50.27228],[9.74249,50.30922],[9.72964,50.35841],[9.77032,50.42939],[9.86881,50.40074],[9.91805,50.40893],[10.03581,50.47982],[10.03795,50.51115],[10.12359,50.56846]]],terms_url:"https://www.ldbv.bayern.de/",terms_text:"Bayerische Vermessungsverwaltung",best:true},{id:"bavaria-DOP80",name:"Bavaria DOP 80cm",type:"tms",template:"https://mapproxy.osm.ch/tiles/BAYERNDOP80/EPSG900913/{zoom}/{x}/{y}.png?origin=nw",zoomExtent:[7,18],polygon:[[[10.12359,50.56846],[10.14286,50.55078],[10.20281,50.55742],[10.25205,50.51796],[10.32698,50.49345],[10.41048,50.41848],[10.60317,50.33109],[10.62244,50.2271],[10.72521,50.21066],[10.72949,50.24765],[10.85153,50.24354],[10.71879,50.32015],[10.71236,50.36524],[10.85581,50.39664],[10.93717,50.39664],[10.99069,50.36661],[11.12772,50.36661],[11.1791,50.31332],[11.16197,50.29417],[11.24119,50.2928],[11.24975,50.37344],[11.24119,50.47982],[11.35895,50.5234],[11.43816,50.50979],[11.44244,50.48936],[11.42532,50.4771],[11.42532,50.44166],[11.48955,50.42257],[11.49169,50.39801],[11.51952,50.39801],[11.52594,50.37617],[11.59874,50.40347],[11.63727,50.38845],[11.79357,50.4212],[11.83639,50.39255],[11.92203,50.42802],[11.98626,50.38709],[11.98412,50.35705],[12.04835,50.33109],[12.09331,50.32972],[12.1297,50.29828],[12.14041,50.27228],[12.10615,50.25586],[12.11258,50.23532],[12.14897,50.23669],[12.19822,50.20107],[12.22391,50.16406],[12.20464,50.14348],[12.20678,50.10779],[12.24318,50.09955],[12.27743,50.07208],[12.49367,49.98543],[12.49796,49.94136],[12.55576,49.92206],[12.54934,49.86827],[12.48083,49.78817],[12.41018,49.75775],[12.46156,49.70655],[12.5472,49.68023],[12.58788,49.55261],[12.65425,49.53455],[12.66281,49.43302],[12.75274,49.41073],[12.7977,49.34661],[12.90475,49.35638],[12.99681,49.33685],[13.05462,49.27543],[13.13169,49.21952],[13.19164,49.14395],[13.2366,49.12153],[13.29655,49.12293],[13.37148,49.08088],[13.4143,49.02897],[13.4143,48.97981],[13.57916,48.96997],[13.63483,48.94326],[13.67765,48.88698],[13.73759,48.89261],[13.7847,48.83346],[13.84036,48.77423],[13.81681,48.70646],[13.84464,48.70081],[13.8425,48.60038],[13.76543,48.5423],[13.75258,48.50401],[13.67122,48.50543],[13.64339,48.54371],[13.45712,48.5508],[13.45712,48.41598],[13.40574,48.36053],[13.2837,48.27511],[13.09315,48.26941],[12.95827,48.19097],[12.87691,48.18526],[12.772,48.09382],[12.86407,48.01368],[12.89832,47.95492],[12.94543,47.95636],[12.99681,47.88461],[13.01394,47.83434],[12.93472,47.7322],[13.0589,47.72499],[13.11885,47.63851],[13.06532,47.56922],[13.05676,47.47379],[13.00323,47.45208],[12.76772,47.55044],[12.76986,47.63274],[12.73989,47.67312],[12.6671,47.67024],[12.57503,47.6212],[12.48083,47.61975],[12.41446,47.67024],[12.24318,47.67745],[12.2132,47.69186],[12.19179,47.68177],[12.2132,47.66591],[12.21106,47.60388],[12.17467,47.59521],[12.13827,47.60388],[11.89205,47.60388],[11.85137,47.57933],[11.63942,47.58222],[11.59445,47.54899],[11.59017,47.51285],[11.51738,47.49839],[11.4403,47.50417],[11.39534,47.47524],[11.42746,47.44484],[11.3461,47.44339],[11.27973,47.39559],[11.21336,47.38834],[11.24761,47.43181],[11.10203,47.39269],[10.965,47.38979],[10.97785,47.43615],[10.9179,47.47524],[10.8708,47.47524],[10.85581,47.49405],[10.90077,47.5143],[10.87294,47.53598],[10.81085,47.51285],[10.64385,47.54899],[10.59461,47.55477],[10.57962,47.52876],[10.46187,47.54032],[10.46615,47.48392],[10.48756,47.47813],[10.48756,47.41298],[10.45973,47.40283],[10.45973,47.37529],[10.41048,47.37384],[10.40834,47.34339],[10.32056,47.28678],[10.28202,47.27806],[10.28416,47.26208],[10.14714,47.26208],[10.1921,47.30275],[10.19424,47.37384],[10.16641,47.37384],[10.16641,47.34629],[10.10004,47.34339],[10.0615,47.36369],[10.06792,47.41877],[10.09361,47.42601],[10.09576,47.44194],[9.978,47.48537],[9.95659,47.52731],[9.8945,47.52876],[9.85596,47.50851],[9.81743,47.54465],[9.82171,47.57644],[9.77461,47.58222],[9.73821,47.52586],[9.67398,47.53454],[9.58406,47.56488],[9.63972,47.60532],[9.7168,47.60388],[9.85596,47.676],[9.978,47.65582],[10.02938,47.68177],[10.10004,47.66735],[10.13215,47.676],[10.14286,47.70195],[10.0615,47.7725],[10.11288,47.8099],[10.08291,47.85302],[10.1086,47.90902],[10.07649,47.96496],[10.13001,48.02084],[10.13429,48.10669],[10.10004,48.12813],[10.05508,48.26228],[9.96944,48.36765],[10.03153,48.42593],[10.02938,48.46144],[10.12359,48.47705],[10.15356,48.4515],[10.23492,48.51252],[10.31628,48.51678],[10.29915,48.61878],[10.24563,48.6683],[10.27346,48.70646],[10.3698,48.68385],[10.43189,48.69939],[10.45116,48.72765],[10.40192,48.746],[10.44046,48.84896],[10.43403,48.95873],[10.33769,49.02055],[10.24991,49.03599],[10.24991,49.07387],[10.20066,49.10331],[10.25205,49.13274],[10.12359,49.19714],[10.11931,49.26285],[10.15142,49.28939],[10.10432,49.34522],[10.14072,49.39401],[10.1086,49.44555],[10.11074,49.50537],[10.0722,49.53316],[10.01654,49.47616],[9.92662,49.47894],[9.92448,49.55678],[9.89878,49.58177],[9.85596,49.53872],[9.80672,49.55678],[9.86667,49.60675],[9.85382,49.6442],[9.81743,49.66083],[9.83455,49.68993],[9.79602,49.72039],[9.75748,49.70793],[9.74035,49.68577],[9.70609,49.71624],[9.67826,49.71624],[9.68254,49.68854],[9.62045,49.69131],[9.64615,49.78955],[9.55836,49.77434],[9.57121,49.73561],[9.50698,49.75222],[9.49199,49.77987],[9.46844,49.76051],[9.42562,49.77849],[9.40421,49.76466],[9.33356,49.7702],[9.32928,49.73423],[9.4085,49.72593],[9.42776,49.69824],[9.41492,49.6442],[9.38066,49.63865],[9.35925,49.64974],[9.33998,49.63727],[9.31215,49.64836],[9.27789,49.62617],[9.28432,49.60814],[9.2415,49.57483],[9.09805,49.57205],[9.06594,49.60814],[9.10019,49.65113],[9.09163,49.6927],[9.13017,49.71208],[9.13873,49.74253],[9.10876,49.75637],[9.13659,49.79093],[9.10019,49.78955],[9.07236,49.82824],[9.03596,49.83514],[9.01669,50.02671],[8.96317,50.03084],[8.95674,50.05971],[9.00171,50.0707],[9.02097,50.11054],[9.1216,50.12289],[9.15586,50.11328],[9.19654,50.11878],[9.18583,50.13525],[9.23507,50.1476],[9.37638,50.12701],[9.4085,50.0817],[9.52197,50.09543],[9.50484,50.14211],[9.53267,50.16406],[9.48985,50.16954],[9.49413,50.24354],[9.61403,50.22163],[9.66541,50.23532],[9.63544,50.24901],[9.66756,50.27228],[9.74249,50.30922],[9.72964,50.35841],[9.77032,50.42939],[9.86881,50.40074],[9.91805,50.40893],[10.03581,50.47982],[10.03795,50.51115],[10.12359,50.56846]]],terms_url:"https://www.ldbv.bayern.de/",terms_text:"Bayerische Vermessungsverwaltung",best:true,description:"This imagery is provided via a proxy operated by https://sosm.ch/"},{id:"route500hydro",name:"BD Carthage",type:"tms",template:"https://{switch:a,b,c}.tile.openstreetmap.fr/route500hydro/{zoom}/{x}/{y}.png",zoomExtent:[6,20],polygon:[[[-2.7,43.9],[-6.3,48.98],[-2.25,50.09],[1.31,50.88],[2.35816,51.32937],[2.5488,51.09759],[2.57048,51.07409],[2.58741,51.01763],[2.59845,51.0051],[2.61558,50.99749],[2.63986,50.95766],[2.64225,50.94578],[2.62452,50.9256],[2.61962,50.91067],[2.62396,50.86071],[2.62781,50.85054],[2.63786,50.83696],[2.6511,50.82906],[2.73267,50.81738],[2.79995,50.73795],[2.81655,50.73092],[2.85265,50.73335],[2.89072,50.7162],[2.90492,50.71536],[2.9161,50.72418],[2.93508,50.75592],[3.00718,50.78377],[3.08218,50.78749],[3.09244,50.79092],[3.11412,50.80566],[3.14877,50.80195],[3.2154,50.73111],[3.22149,50.7267],[3.27051,50.70375],[3.27545,50.67757],[3.26576,50.6604],[3.26588,50.64054],[3.28922,50.60028],[3.29219,50.55037],[3.3056,50.53267],[3.37551,50.50839],[3.3898,50.50884],[3.4748,50.54445],[3.52173,50.53459],[3.53266,50.51873],[3.54779,50.51012],[3.61523,50.50558],[3.67378,50.45642],[3.68415,50.35277],[3.6901,50.34044],[3.70258,50.33482],[3.71576,50.33854],[3.74935,50.36279],[3.84109,50.36558],[3.90189,50.3436],[3.91317,50.34291],[4.02672,50.36904],[4.13761,50.29984],[4.14388,50.29727],[4.21444,50.28167],[4.22904,50.26664],[4.23078,50.25233],[4.17084,50.18579],[4.16601,50.16888],[4.1764,50.1547],[4.21195,50.13602],[4.24074,50.07102],[4.23193,50.05551],[4.18164,50.03436],[4.17177,50.02537],[4.16976,50.01217],[4.1765,50.00065],[4.20633,49.97546],[4.22164,49.97089],[4.30877,49.98145],[4.44542,49.9523],[4.45469,49.95251],[4.6581,50.00609],[4.66936,50.01392],[4.67293,50.02716],[4.66924,50.06972],[4.69517,50.10472],[4.83123,50.17941],[4.8815,50.16436],[4.90479,50.14451],[4.90426,50.12639],[4.88076,50.0815],[4.86277,50.0745],[4.85104,50.06216],[4.84331,50.03884],[4.84331,50.03883],[4.8433,50.03881],[4.82678,49.989],[4.82662,49.97692],[4.83343,49.96696],[4.89654,49.91753],[4.89755,49.89424],[4.87913,49.86942],[4.87625,49.85111],[4.88924,49.81266],[4.89769,49.80204],[4.91098,49.79926],[4.99534,49.81116],[5.01867,49.79272],[5.02686,49.78886],[5.09944,49.77323],[5.13458,49.73462],[5.1412,49.72984],[5.18761,49.70906],[5.19602,49.70732],[5.28157,49.70836],[5.33363,49.67308],[5.344,49.65049],[5.3544,49.64041],[5.43141,49.60791],[5.48205,49.52815],[5.49294,49.51979],[5.50666,49.52042],[5.55401,49.54025],[5.59311,49.53424],[5.6076,49.53761],[5.641,49.56095],[5.70676,49.55267],[5.71578,49.55361],[5.77526,49.57414],[5.8399,49.55321],[5.86126,49.52038],[5.876,49.5114],[5.97516,49.50129],[5.99801,49.47317],[6.01627,49.46597],[6.08635,49.47562],[6.09319,49.47787],[6.17397,49.52187],[6.24643,49.52511],[6.334,49.48235],[6.34423,49.48037],[6.43515,49.487],[6.5451,49.44384],[6.60639,49.37868],[6.60497,49.33739],[6.61627,49.31869],[6.67013,49.29269],[6.72996,49.22917],[6.74328,49.19086],[6.76026,49.17752],[6.80904,49.17284],[6.82473,49.17826],[6.83093,49.19366],[6.82982,49.21802],[6.85119,49.23136],[6.88453,49.2239],[6.89322,49.22389],[6.93753,49.23369],[7.04055,49.19794],[7.0463,49.17503],[7.05478,49.16313],[7.06908,49.16018],[7.10494,49.16634],[7.14315,49.14159],[7.1535,49.13839],[7.28683,49.13488],[7.29893,49.13856],[7.36095,49.18259],[7.45012,49.19517],[7.50113,49.17672],[7.54379,49.10572],[7.5579,49.09626],[7.6296,49.08527],[7.64722,49.06722],[7.6612,49.06119],[7.75401,49.05963],[7.76073,49.06067],[7.80291,49.07489],[7.85525,49.05329],[7.8673,49.05227],[7.93826,49.06832],[8.08069,49.00688],[8.2225,48.98787],[8.23704,48.97683],[8.23589,48.95817],[8.20888,48.94863],[8.20089,48.94339],[8.15824,48.89753],[8.10087,48.7993],[7.99071,48.74478],[7.98534,48.7409],[7.90422,48.65865],[7.85605,48.63606],[7.8484,48.62977],[7.81842,48.58883],[7.81456,48.57704],[7.81449,48.50968],[7.78547,48.48337],[7.78055,48.47652],[7.74506,48.39484],[7.74357,48.38427],[7.75159,48.32322],[7.71085,48.29841],[7.70241,48.28803],[7.67661,48.21555],[7.59605,48.11698],[7.59165,48.10648],[7.58522,48.04694],[7.59127,48.03035],[7.62437,47.99865],[7.63205,47.97081],[7.57554,47.87436],[7.5728,47.86435],[7.57267,47.83631],[7.54581,47.78793],[7.54418,47.77232],[7.55758,47.72899],[7.53526,47.6989],[7.53136,47.68564],[7.537,47.67302],[7.60016,47.60822],[7.58967,47.56755],[7.55424,47.55128],[7.54511,47.54283],[7.51256,47.48439],[7.38747,47.42111],[7.32653,47.4273],[7.24435,47.40939],[7.16708,47.4335],[7.15212,47.47612],[7.14279,47.48707],[7.12853,47.48893],[7.0801,47.47718],[7.03557,47.48695],[7.02102,47.48458],[7.01205,47.47287],[7.003,47.44095],[6.9551,47.40808],[6.94716,47.39698],[6.94818,47.38337],[6.95769,47.37359],[6.97126,47.37218],[7.018,47.38386],[7.05623,47.37035],[7.07007,47.35005],[7.05958,47.32257],[6.97424,47.27856],[6.96347,47.26233],[6.96134,47.23479],[6.89443,47.19393],[6.88913,47.18922],[6.85545,47.14636],[6.76907,47.10751],[6.76011,47.09953],[6.72561,47.0418],[6.62355,46.9811],[6.4812,46.9445],[6.46892,46.93522],[6.46686,46.91997],[6.47548,46.88771],[6.4535,46.8239],[6.45644,46.80534],[6.46722,46.79104],[6.46098,46.76887],[6.15817,46.59343],[6.14872,46.58069],[6.15152,46.56508],[6.16549,46.54399],[6.15811,46.52456],[6.10174,46.46979],[6.09572,46.45418],[6.09704,46.43317],[6.10829,46.41643],[6.16622,46.38839],[6.17817,46.36922],[6.13748,46.31297],[6.13371,46.30227],[6.13038,46.23737],[6.1103,46.22344],[6.08865,46.23081],[6.07717,46.23123],[6.01857,46.21601],[6.00681,46.20752],[6.00388,46.19332],[6.00787,46.16977],[6.01783,46.15564],[6.03509,46.15456],[6.05564,46.16288],[6.12468,46.15415],[6.13778,46.15702],[6.24026,46.22094],[6.24906,46.23299],[6.24707,46.24777],[6.21148,46.31057],[6.21219,46.32485],[6.23946,46.36705],[6.31648,46.41557],[6.41083,46.42495],[6.41748,46.42682],[6.50498,46.46871],[6.63047,46.47435],[6.74665,46.45695],[6.82244,46.42925],[6.81832,46.38181],[6.80484,46.36179],[6.80189,46.34639],[6.81095,46.33359],[6.86491,46.30038],[6.87504,46.28007],[6.86092,46.2439],[6.82698,46.21188],[6.82075,46.19862],[6.81863,46.16592],[6.82259,46.15261],[6.83427,46.14509],[6.90382,46.12971],[6.90491,46.09595],[6.90932,46.08406],[6.92001,46.07721],[6.94898,46.0699],[7.01556,46.00883],[7.05191,45.93066],[7.04533,45.92217],[7.04497,45.92064],[7.04394,45.92036],[6.99582,45.85822],[6.94097,45.83551],[6.84376,45.82387],[6.83102,45.81711],[6.82614,45.80353],[6.82787,45.73217],[6.83174,45.72082],[6.8414,45.71373],[6.90729,45.69124],[6.92419,45.66935],[6.94247,45.66172],[6.97131,45.66528],[7.00597,45.64945],[7.01151,45.63652],[6.9978,45.60877],[6.99643,45.59465],[7.0158,45.52354],[7.02774,45.5102],[7.1072,45.47877],[7.1228,45.44924],[7.13304,45.44001],[7.1856,45.41894],[7.19515,45.40409],[7.17075,45.35069],[7.14232,45.32298],[7.13649,45.30576],[7.14458,45.25048],[7.08417,45.20279],[6.99279,45.19823],[6.98106,45.19368],[6.90009,45.12689],[6.85843,45.11699],[6.78283,45.14228],[6.77056,45.14242],[6.67751,45.11356],[6.6653,45.10289],[6.66501,45.08667],[6.68237,45.04558],[6.69602,45.03395],[6.75744,45.01884],[6.78375,44.9146],[6.7942,44.90161],[6.86698,44.86519],[6.8798,44.86346],[6.93633,44.87461],[7.01795,44.84402],[7.03453,44.82282],[7.03711,44.75009],[7.0496,44.73226],[7.07224,44.72311],[7.08651,44.6968],[7.08666,44.68085],[7.07671,44.67134],[6.99007,44.67203],[6.97413,44.66431],[6.97056,44.64696],[6.97819,44.61784],[6.94659,44.57124],[6.88235,44.53479],[6.87233,44.5195],[6.87892,44.50245],[6.95894,44.43129],[6.95872,44.42908],[6.92167,44.41436],[6.91223,44.40659],[6.90907,44.39477],[6.90972,44.38195],[6.91637,44.36804],[6.99909,44.29414],[7.01181,44.256],[7.01983,44.24558],[7.03259,44.2424],[7.07312,44.2461],[7.1651,44.22112],[7.24533,44.18544],[7.26053,44.16682],[7.27537,44.15947],[7.33878,44.1574],[7.36278,44.13834],[7.37776,44.13416],[7.56283,44.15792],[7.5642,44.15836],[7.56478,44.15817],[7.60548,44.1634],[7.6162,44.16827],[7.63989,44.18928],[7.68608,44.1861],[7.69422,44.17795],[7.68937,44.13869],[7.69445,44.12276],[7.72786,44.08615],[7.72403,44.05704],[7.68603,44.02371],[7.68077,44.0164],[7.66016,43.9672],[7.59624,43.94466],[7.58419,43.93287],[7.56858,43.89159],[7.5271,43.87434],[7.51649,43.86397],[7.51594,43.84915],[7.53622,43.79234],[9.8,43.1],[9.63227,41.43244],[9.36968,41.35052],[9.27311,41.29196],[8.94186,41.27688],[5.8,41.64],[3.17358,42.41768],[3.16081,42.42757],[3.0944,42.41457],[3.03402,42.45331],[3.02214,42.45645],[2.87822,42.4487],[2.87019,42.44653],[2.78424,42.40256],[2.7413,42.41128],[2.72928,42.40998],[2.69331,42.39417],[2.68378,42.3854],[2.68162,42.37263],[2.68585,42.34679],[2.66719,42.33008],[2.58106,42.34418],[2.56777,42.34173],[2.5338,42.32197],[2.47795,42.32986],[2.41933,42.37658],[2.41222,42.38021],[2.26719,42.42055],[2.25973,42.42117],[2.20694,42.41558],[2.20653,42.41526],[2.20526,42.41541],[2.16028,42.41065],[2.14881,42.40545],[2.09393,42.35474],[2.00861,42.33818],[1.965,42.36473],[1.93076,42.42442],[1.92089,42.43302],[1.88467,42.44761],[1.88459,42.44762],[1.88444,42.4477],[1.82774,42.47056],[1.72567,42.48452],[1.71561,42.50125],[1.7272,42.56103],[1.72479,42.57499],[1.71011,42.59992],[1.69377,42.60975],[1.60283,42.61382],[1.56069,42.6392],[1.54636,42.64166],[1.50444,42.6331],[1.4921,42.62502],[1.47238,42.59703],[1.43792,42.59264],[1.41936,42.60643],[1.38032,42.67415],[1.37335,42.68127],[1.33313,42.70563],[1.32364,42.7085],[1.23221,42.71248],[1.16554,42.69928],[1.08546,42.76635],[1.07564,42.77079],[0.95937,42.78852],[0.95073,42.78794],[0.92265,42.7797],[0.84606,42.8157],[0.71511,42.8464],[0.70017,42.84402],[0.69117,42.83186],[0.67409,42.76479],[0.67474,42.75286],[0.69192,42.70684],[0.669,42.67901],[0.43024,42.67863],[0.3715,42.70308],[0.35954,42.70415],[0.34912,42.69817],[0.32567,42.67274],[0.29571,42.66388],[0.24594,42.70175],[0.23972,42.70494],[0.18967,42.72039],[0.17919,42.72075],[-0.01993,42.67389],[-0.06726,42.6848],[-0.16949,42.77157],[-0.29987,42.82697],[-0.31683,42.82635],[-0.39208,42.78766],[-0.44354,42.78453],[-0.48842,42.80255],[-0.50868,42.79935],[-0.54499,42.76906],[-0.56721,42.76937],[-0.67446,42.86392],[-0.68094,42.86775],[-0.73372,42.88666],[-0.7476,42.93879],[-0.75711,42.95107],[-0.77253,42.95284],[-0.82114,42.93865],[-0.94508,42.94192],[-1.02313,42.98206],[-1.10852,43.00409],[-1.1156,43.00461],[-1.14775,43.00124],[-1.15845,43.01452],[-1.16736,43.02083],[-1.21622,43.0381],[-1.22612,43.03898],[-1.26236,43.03303],[-1.30643,43.05531],[-1.31992,43.05696],[-1.33135,43.0496],[-1.3542,43.0197],[-1.43868,43.03371],[-1.4775,43.06889],[-1.48311,43.08561],[-1.47641,43.10248],[-1.43479,43.13087],[-1.42732,43.1404],[-1.39411,43.22935],[-1.39531,43.24596],[-1.40868,43.25591],[-1.52629,43.28099],[-1.54626,43.2737],[-1.57149,43.2412],[-1.61053,43.24223],[-1.65,43.29323],[-1.66953,43.30065],[-1.73359,43.28856],[-1.75606,43.31966],[-1.76297,43.32565],[-1.79156,43.34067],[-1.80099,43.37017],[-1.78509,43.39037],[-1.7835,43.39686],[-2.7,43.9]]],terms_url:"http://www.sandre.eaufrance.fr/actualite/la-bd-carthage-en-licence-ouverte-open-licence",terms_text:"Tiles © cquest@Openstreetmap France, data © Onema - IGN, LO/OL",description:"Réseau hydrographique: cours et plans d'eau et POI",overlay:true},{id:"fr.ign.bdortho",name:"BDOrtho IGN",type:"tms",template:"https://proxy-ign.openstreetmap.fr/94GjiyqD/bdortho/{zoom}/{x}/{y}.jpg",zoomExtent:[2,21],polygon:[[[-2.7,43.9],[-6.3,48.98],[-2.25,50.09],[1.31,50.88],[2.35816,51.32937],[2.5488,51.09759],[2.57048,51.07409],[2.58741,51.01763],[2.59845,51.0051],[2.61558,50.99749],[2.63986,50.95766],[2.64225,50.94578],[2.62452,50.9256],[2.61962,50.91067],[2.62396,50.86071],[2.62781,50.85054],[2.63786,50.83696],[2.6511,50.82906],[2.73267,50.81738],[2.79995,50.73795],[2.81655,50.73092],[2.85265,50.73335],[2.89072,50.7162],[2.90492,50.71536],[2.9161,50.72418],[2.93508,50.75592],[3.00718,50.78377],[3.08218,50.78749],[3.09244,50.79092],[3.11412,50.80566],[3.14877,50.80195],[3.2154,50.73111],[3.22149,50.7267],[3.27051,50.70375],[3.27545,50.67757],[3.26576,50.6604],[3.26588,50.64054],[3.28922,50.60028],[3.29219,50.55037],[3.3056,50.53267],[3.37551,50.50839],[3.3898,50.50884],[3.4748,50.54445],[3.52173,50.53459],[3.53266,50.51873],[3.54779,50.51012],[3.61523,50.50558],[3.67378,50.45642],[3.68415,50.35277],[3.6901,50.34044],[3.70258,50.33482],[3.71576,50.33854],[3.74935,50.36279],[3.84109,50.36558],[3.90189,50.3436],[3.91317,50.34291],[4.02672,50.36904],[4.13761,50.29984],[4.14388,50.29727],[4.21444,50.28167],[4.22904,50.26664],[4.23078,50.25233],[4.17084,50.18579],[4.16601,50.16888],[4.1764,50.1547],[4.21195,50.13602],[4.24074,50.07102],[4.23193,50.05551],[4.18164,50.03436],[4.17177,50.02537],[4.16976,50.01217],[4.1765,50.00065],[4.20633,49.97546],[4.22164,49.97089],[4.30877,49.98145],[4.44542,49.9523],[4.45469,49.95251],[4.6581,50.00609],[4.66936,50.01392],[4.67293,50.02716],[4.66924,50.06972],[4.69517,50.10472],[4.83123,50.17941],[4.8815,50.16436],[4.90479,50.14451],[4.90426,50.12639],[4.88076,50.0815],[4.86277,50.0745],[4.85104,50.06216],[4.84331,50.03884],[4.84331,50.03883],[4.8433,50.03881],[4.82678,49.989],[4.82662,49.97692],[4.83343,49.96696],[4.89654,49.91753],[4.89755,49.89424],[4.87913,49.86942],[4.87625,49.85111],[4.88924,49.81266],[4.89769,49.80204],[4.91098,49.79926],[4.99534,49.81116],[5.01867,49.79272],[5.02686,49.78886],[5.09944,49.77323],[5.13458,49.73462],[5.1412,49.72984],[5.18761,49.70906],[5.19602,49.70732],[5.28157,49.70836],[5.33363,49.67308],[5.344,49.65049],[5.3544,49.64041],[5.43141,49.60791],[5.48205,49.52815],[5.49294,49.51979],[5.50666,49.52042],[5.55401,49.54025],[5.59311,49.53424],[5.6076,49.53761],[5.641,49.56095],[5.70676,49.55267],[5.71578,49.55361],[5.77526,49.57414],[5.8399,49.55321],[5.86126,49.52038],[5.876,49.5114],[5.97516,49.50129],[5.99801,49.47317],[6.01627,49.46597],[6.08635,49.47562],[6.09319,49.47787],[6.17397,49.52187],[6.24643,49.52511],[6.334,49.48235],[6.34423,49.48037],[6.43515,49.487],[6.5451,49.44384],[6.60639,49.37868],[6.60497,49.33739],[6.61627,49.31869],[6.67013,49.29269],[6.72996,49.22917],[6.74328,49.19086],[6.76026,49.17752],[6.80904,49.17284],[6.82473,49.17826],[6.83093,49.19366],[6.82982,49.21802],[6.85119,49.23136],[6.88453,49.2239],[6.89322,49.22389],[6.93753,49.23369],[7.04055,49.19794],[7.0463,49.17503],[7.05478,49.16313],[7.06908,49.16018],[7.10494,49.16634],[7.14315,49.14159],[7.1535,49.13839],[7.28683,49.13488],[7.29893,49.13856],[7.36095,49.18259],[7.45012,49.19517],[7.50113,49.17672],[7.54379,49.10572],[7.5579,49.09626],[7.6296,49.08527],[7.64722,49.06722],[7.6612,49.06119],[7.75401,49.05963],[7.76073,49.06067],[7.80291,49.07489],[7.85525,49.05329],[7.8673,49.05227],[7.93826,49.06832],[8.08069,49.00688],[8.2225,48.98787],[8.23704,48.97683],[8.23589,48.95817],[8.20888,48.94863],[8.20089,48.94339],[8.15824,48.89753],[8.10087,48.7993],[7.99071,48.74478],[7.98534,48.7409],[7.90422,48.65865],[7.85605,48.63606],[7.8484,48.62977],[7.81842,48.58883],[7.81456,48.57704],[7.81449,48.50968],[7.78547,48.48337],[7.78055,48.47652],[7.74506,48.39484],[7.74357,48.38427],[7.75159,48.32322],[7.71085,48.29841],[7.70241,48.28803],[7.67661,48.21555],[7.59605,48.11698],[7.59165,48.10648],[7.58522,48.04694],[7.59127,48.03035],[7.62437,47.99865],[7.63205,47.97081],[7.57554,47.87436],[7.5728,47.86435],[7.57267,47.83631],[7.54581,47.78793],[7.54418,47.77232],[7.55758,47.72899],[7.53526,47.6989],[7.53136,47.68564],[7.537,47.67302],[7.60016,47.60822],[7.58967,47.56755],[7.55424,47.55128],[7.54511,47.54283],[7.51256,47.48439],[7.38747,47.42111],[7.32653,47.4273],[7.24435,47.40939],[7.16708,47.4335],[7.15212,47.47612],[7.14279,47.48707],[7.12853,47.48893],[7.0801,47.47718],[7.03557,47.48695],[7.02102,47.48458],[7.01205,47.47287],[7.003,47.44095],[6.9551,47.40808],[6.94716,47.39698],[6.94818,47.38337],[6.95769,47.37359],[6.97126,47.37218],[7.018,47.38386],[7.05623,47.37035],[7.07007,47.35005],[7.05958,47.32257],[6.97424,47.27856],[6.96347,47.26233],[6.96134,47.23479],[6.89443,47.19393],[6.88913,47.18922],[6.85545,47.14636],[6.76907,47.10751],[6.76011,47.09953],[6.72561,47.0418],[6.62355,46.9811],[6.4812,46.9445],[6.46892,46.93522],[6.46686,46.91997],[6.47548,46.88771],[6.4535,46.8239],[6.45644,46.80534],[6.46722,46.79104],[6.46098,46.76887],[6.15817,46.59343],[6.14872,46.58069],[6.15152,46.56508],[6.16549,46.54399],[6.15811,46.52456],[6.10174,46.46979],[6.09572,46.45418],[6.09704,46.43317],[6.10829,46.41643],[6.16622,46.38839],[6.17817,46.36922],[6.13748,46.31297],[6.13371,46.30227],[6.13038,46.23737],[6.1103,46.22344],[6.08865,46.23081],[6.07717,46.23123],[6.01857,46.21601],[6.00681,46.20752],[6.00388,46.19332],[6.00787,46.16977],[6.01783,46.15564],[6.03509,46.15456],[6.05564,46.16288],[6.12468,46.15415],[6.13778,46.15702],[6.24026,46.22094],[6.24906,46.23299],[6.24707,46.24777],[6.21148,46.31057],[6.21219,46.32485],[6.23946,46.36705],[6.31648,46.41557],[6.41083,46.42495],[6.41748,46.42682],[6.50498,46.46871],[6.63047,46.47435],[6.74665,46.45695],[6.82244,46.42925],[6.81832,46.38181],[6.80484,46.36179],[6.80189,46.34639],[6.81095,46.33359],[6.86491,46.30038],[6.87504,46.28007],[6.86092,46.2439],[6.82698,46.21188],[6.82075,46.19862],[6.81863,46.16592],[6.82259,46.15261],[6.83427,46.14509],[6.90382,46.12971],[6.90491,46.09595],[6.90932,46.08406],[6.92001,46.07721],[6.94898,46.0699],[7.01556,46.00883],[7.05191,45.93066],[7.04533,45.92217],[7.04497,45.92064],[7.04394,45.92036],[6.99582,45.85822],[6.94097,45.83551],[6.84376,45.82387],[6.83102,45.81711],[6.82614,45.80353],[6.82787,45.73217],[6.83174,45.72082],[6.8414,45.71373],[6.90729,45.69124],[6.92419,45.66935],[6.94247,45.66172],[6.97131,45.66528],[7.00597,45.64945],[7.01151,45.63652],[6.9978,45.60877],[6.99643,45.59465],[7.0158,45.52354],[7.02774,45.5102],[7.1072,45.47877],[7.1228,45.44924],[7.13304,45.44001],[7.1856,45.41894],[7.19515,45.40409],[7.17075,45.35069],[7.14232,45.32298],[7.13649,45.30576],[7.14458,45.25048],[7.08417,45.20279],[6.99279,45.19823],[6.98106,45.19368],[6.90009,45.12689],[6.85843,45.11699],[6.78283,45.14228],[6.77056,45.14242],[6.67751,45.11356],[6.6653,45.10289],[6.66501,45.08667],[6.68237,45.04558],[6.69602,45.03395],[6.75744,45.01884],[6.78375,44.9146],[6.7942,44.90161],[6.86698,44.86519],[6.8798,44.86346],[6.93633,44.87461],[7.01795,44.84402],[7.03453,44.82282],[7.03711,44.75009],[7.0496,44.73226],[7.07224,44.72311],[7.08651,44.6968],[7.08666,44.68085],[7.07671,44.67134],[6.99007,44.67203],[6.97413,44.66431],[6.97056,44.64696],[6.97819,44.61784],[6.94659,44.57124],[6.88235,44.53479],[6.87233,44.5195],[6.87892,44.50245],[6.95894,44.43129],[6.95872,44.42908],[6.92167,44.41436],[6.91223,44.40659],[6.90907,44.39477],[6.90972,44.38195],[6.91637,44.36804],[6.99909,44.29414],[7.01181,44.256],[7.01983,44.24558],[7.03259,44.2424],[7.07312,44.2461],[7.1651,44.22112],[7.24533,44.18544],[7.26053,44.16682],[7.27537,44.15947],[7.33878,44.1574],[7.36278,44.13834],[7.37776,44.13416],[7.56283,44.15792],[7.5642,44.15836],[7.56478,44.15817],[7.60548,44.1634],[7.6162,44.16827],[7.63989,44.18928],[7.68608,44.1861],[7.69422,44.17795],[7.68937,44.13869],[7.69445,44.12276],[7.72786,44.08615],[7.72403,44.05704],[7.68603,44.02371],[7.68077,44.0164],[7.66016,43.9672],[7.59624,43.94466],[7.58419,43.93287],[7.56858,43.89159],[7.5271,43.87434],[7.51649,43.86397],[7.51594,43.84915],[7.53622,43.79234],[9.8,43.1],[9.63227,41.43244],[9.36968,41.35052],[9.27311,41.29196],[8.94186,41.27688],[5.8,41.64],[3.17358,42.41768],[3.16081,42.42757],[3.0944,42.41457],[3.03402,42.45331],[3.02214,42.45645],[2.87822,42.4487],[2.87019,42.44653],[2.78424,42.40256],[2.7413,42.41128],[2.72928,42.40998],[2.69331,42.39417],[2.68378,42.3854],[2.68162,42.37263],[2.68585,42.34679],[2.66719,42.33008],[2.58106,42.34418],[2.56777,42.34173],[2.5338,42.32197],[2.47795,42.32986],[2.41933,42.37658],[2.41222,42.38021],[2.26719,42.42055],[2.25973,42.42117],[2.20694,42.41558],[2.20653,42.41526],[2.20526,42.41541],[2.16028,42.41065],[2.14881,42.40545],[2.09393,42.35474],[2.00861,42.33818],[1.965,42.36473],[1.93076,42.42442],[1.92089,42.43302],[1.88467,42.44761],[1.88459,42.44762],[1.88444,42.4477],[1.82774,42.47056],[1.72567,42.48452],[1.71561,42.50125],[1.7272,42.56103],[1.72479,42.57499],[1.71011,42.59992],[1.69377,42.60975],[1.60283,42.61382],[1.56069,42.6392],[1.54636,42.64166],[1.50444,42.6331],[1.4921,42.62502],[1.47238,42.59703],[1.43792,42.59264],[1.41936,42.60643],[1.38032,42.67415],[1.37335,42.68127],[1.33313,42.70563],[1.32364,42.7085],[1.23221,42.71248],[1.16554,42.69928],[1.08546,42.76635],[1.07564,42.77079],[0.95937,42.78852],[0.95073,42.78794],[0.92265,42.7797],[0.84606,42.8157],[0.71511,42.8464],[0.70017,42.84402],[0.69117,42.83186],[0.67409,42.76479],[0.67474,42.75286],[0.69192,42.70684],[0.669,42.67901],[0.43024,42.67863],[0.3715,42.70308],[0.35954,42.70415],[0.34912,42.69817],[0.32567,42.67274],[0.29571,42.66388],[0.24594,42.70175],[0.23972,42.70494],[0.18967,42.72039],[0.17919,42.72075],[-0.01993,42.67389],[-0.06726,42.6848],[-0.16949,42.77157],[-0.29987,42.82697],[-0.31683,42.82635],[-0.39208,42.78766],[-0.44354,42.78453],[-0.48842,42.80255],[-0.50868,42.79935],[-0.54499,42.76906],[-0.56721,42.76937],[-0.67446,42.86392],[-0.68094,42.86775],[-0.73372,42.88666],[-0.7476,42.93879],[-0.75711,42.95107],[-0.77253,42.95284],[-0.82114,42.93865],[-0.94508,42.94192],[-1.02313,42.98206],[-1.10852,43.00409],[-1.1156,43.00461],[-1.14775,43.00124],[-1.15845,43.01452],[-1.16736,43.02083],[-1.21622,43.0381],[-1.22612,43.03898],[-1.26236,43.03303],[-1.30643,43.05531],[-1.31992,43.05696],[-1.33135,43.0496],[-1.3542,43.0197],[-1.43868,43.03371],[-1.4775,43.06889],[-1.48311,43.08561],[-1.47641,43.10248],[-1.43479,43.13087],[-1.42732,43.1404],[-1.39411,43.22935],[-1.39531,43.24596],[-1.40868,43.25591],[-1.52629,43.28099],[-1.54626,43.2737],[-1.57149,43.2412],[-1.61053,43.24223],[-1.65,43.29323],[-1.66953,43.30065],[-1.73359,43.28856],[-1.75606,43.31966],[-1.76297,43.32565],[-1.79156,43.34067],[-1.80099,43.37017],[-1.78509,43.39037],[-1.7835,43.39686],[-2.7,43.9]],[[-61.27501,14.90218],[-60.72368,14.90101],[-60.72489,14.36686],[-61.27622,14.36803],[-61.27501,14.90218]],[[-61.92802,16.58618],[-61.92686,15.7394],[-60.88128,15.74072],[-60.88243,16.5875],[-61.92802,16.58618]],[[-53.89344,6.004],[-52.46522,5.4465],[-51.52039,4.51072],[-51.53687,4.11633],[-52.2345,3.10213],[-52.641,2.25162],[-52.92664,2.07597],[-53.72864,2.21869],[-54.20106,2.03205],[-54.8053,2.27358],[-54.31092,2.80589],[-54.31641,3.20085],[-54.12415,3.46408],[-54.12964,3.59567],[-54.42078,4.00127],[-54.58008,4.95962],[-53.89344,6.004]],[[55.08816,-20.77935],[55.95959,-20.77281],[55.96576,-21.49],[55.09434,-21.49651],[55.08816,-20.77935]],[[44.92054,-12.57363],[45.34826,-12.57029],[45.35274,-13.1163],[44.92502,-13.11963],[44.92054,-12.57363]],[[-178.57728,-14.70582],[-178.42568,-14.00334],[-176.34156,-12.83858],[-175.71534,-12.9189],[-175.91858,-13.58726],[-177.84638,-14.64983],[-178.57728,-14.70582]]],terms_url:"https://openstreetmap.fr/bdortho",terms_text:"BDOrtho IGN",best:true,icon:"http://www.ign.fr/institut/sites/all/themes/ign_institut/logo.png"},{id:"Benin_cotonou_pleiade_2016",name:"Benin: Cotonou Pleiade 2016",type:"tms",template:"https://geoxxx.agrocampus-ouest.fr/owsifl/gwc/service/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=Benin:cotonou_pleiade_2016&STYLE=&FORMAT=image/jpeg&tileMatrixSet=EPSG:3857&tileMatrix=EPSG:3857:{zoom}&tileRow={y}&tileCol={x}",endDate:"2016-01-01T00:00:00.000Z",startDate:"2016-01-01T00:00:00.000Z",zoomExtent:[0,21],polygon:[[[2.31954,6.55745],[2.33645,6.56024],[2.36377,6.56211],[2.36738,6.56068],[2.37777,6.5494],[2.37779,6.53485],[2.36994,6.49332],[2.37038,6.45527],[2.36958,6.45269],[2.36188,6.44177],[2.35392,6.40545],[2.36749,6.4015],[2.39526,6.40072],[2.40128,6.40374],[2.40588,6.40341],[2.42046,6.39383],[2.42485,6.39794],[2.42949,6.39887],[2.43625,6.39628],[2.43958,6.40042],[2.44439,6.40189],[2.45376,6.39899],[2.47145,6.39632],[2.48162,6.39106],[2.49453,6.3874],[2.50893,6.38888],[2.50719,6.39229],[2.5012,6.39162],[2.4963,6.39521],[2.4951,6.40123],[2.49543,6.40401],[2.4983,6.41022],[2.50191,6.41282],[2.51087,6.41321],[2.52219,6.40849],[2.53352,6.40517],[2.5381,6.40961],[2.54111,6.4109],[2.54651,6.41099],[2.54654,6.40651],[2.57639,6.40724],[2.57642,6.41177],[2.58576,6.41196],[2.58868,6.41095],[2.60877,6.39414],[2.6257,6.39488],[2.64555,6.39729],[2.65039,6.39339],[2.65367,6.36823],[2.64312,6.36659],[2.61251,6.36289],[2.56868,6.3607],[2.54683,6.36055],[2.54687,6.35546],[2.50207,6.35461],[2.47064,6.35596],[2.46777,6.35203],[2.46423,6.3502],[2.45254,6.35006],[2.45113,6.34813],[2.44737,6.34629],[2.43757,6.34654],[2.43298,6.33841],[2.43016,6.33707],[2.42245,6.33707],[2.39236,6.34115],[2.39315,6.34115],[2.36528,6.34445],[2.35386,6.3453],[2.34377,6.34458],[2.34094,6.34534],[2.31086,6.36567],[2.28435,6.37465],[2.28147,6.37762],[2.27599,6.39517],[2.27612,6.3982],[2.31529,6.49261],[2.3158,6.55307],[2.31954,6.55745]],[[1.69563,6.25076],[1.7001,6.24712],[1.70418,6.24697],[1.75875,6.25836],[1.77079,6.25995],[1.81712,6.27161],[1.84457,6.27657],[1.85768,6.27945],[1.88843,6.28326],[1.90482,6.28595],[1.90618,6.29435],[1.90083,6.29721],[1.89881,6.29954],[1.89404,6.30085],[1.89048,6.2997],[1.88748,6.29636],[1.88344,6.29622],[1.8697,6.29227],[1.8564,6.29198],[1.85207,6.28675],[1.84991,6.28906],[1.84691,6.29203],[1.84353,6.29333],[1.84041,6.29315],[1.83627,6.29129],[1.8341,6.28733],[1.83417,6.2852],[1.8323,6.28456],[1.82786,6.28644],[1.82182,6.29084],[1.81563,6.28998],[1.81211,6.29143],[1.80758,6.29571],[1.80472,6.29693],[1.80074,6.2971],[1.79776,6.29612],[1.79625,6.29492],[1.7949,6.28965],[1.79641,6.28608],[1.80098,6.28338],[1.79567,6.28013],[1.79156,6.28174],[1.78499,6.28122],[1.78092,6.27753],[1.77588,6.2755],[1.76745,6.27696],[1.75653,6.27496],[1.74833,6.27239],[1.74762,6.27726],[1.74572,6.27938],[1.73948,6.27985],[1.7368,6.27761],[1.73572,6.27892],[1.72902,6.27911],[1.72435,6.27422],[1.72449,6.26786],[1.72556,6.26683],[1.69934,6.26159],[1.69573,6.25726],[1.69563,6.25076]]],best:true},{id:"Berlin-2011",name:"Berlin aerial photography 2011",type:"wms",template:"https://fbinter.stadt-berlin.de/fb/wms/senstadt/k_luftbild2011_20?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",endDate:"2011-01-01T00:00:00.000Z",startDate:"2011-01-01T00:00:00.000Z",polygon:[[[13.48699,52.68076],[13.52584,52.65196],[13.5299,52.64437],[13.54209,52.60921],[13.58109,52.58134],[13.59674,52.55936],[13.63477,52.55121],[13.66547,52.52854],[13.67199,52.50379],[13.65806,52.50372],[13.65796,52.49324],[13.7547,52.4565],[13.76644,52.43884],[13.76627,52.42973],[13.74494,52.39909],[13.65235,52.33133],[13.6417,52.33103],[13.62609,52.35491],[13.59432,52.37455],[13.53198,52.38376],[13.51948,52.39236],[13.48536,52.39227],[13.43552,52.38016],[13.42885,52.37401],[13.38689,52.37388],[13.38642,52.38667],[13.36857,52.38728],[13.37045,52.39349],[13.33968,52.40887],[13.31243,52.39775],[13.30557,52.40452],[13.23622,52.40342],[13.18886,52.40417],[13.17719,52.39067],[13.14859,52.38971],[13.14868,52.38421],[13.11889,52.38385],[13.11935,52.40025],[13.10487,52.40723],[13.07371,52.40668],[13.07367,52.41403],[13.10516,52.47897],[13.11685,52.47881],[13.112,52.55915],[13.11865,52.59156],[13.15251,52.60489],[13.16282,52.60462],[13.21264,52.6321],[13.22139,52.63215],[13.27292,52.66444],[13.31376,52.66442],[13.32714,52.64692],[13.36783,52.6468],[13.39158,52.65382],[13.42728,52.6549],[13.47594,52.68122],[13.48699,52.68076]]],terms_text:"Geoportal Berlin/Digitale farbige Orthophotos 2011"},{id:"Berlin-2014",name:"Berlin aerial photography 2014",type:"tms",template:"https://tiles.codefor.de/berlin-2014/{zoom}/{x}/{y}.png",endDate:"2014-01-01T00:00:00.000Z",startDate:"2014-01-01T00:00:00.000Z",polygon:[[[13.19746,52.64206],[13.25639,52.64285],[13.2558,52.66101],[13.31391,52.66185],[13.31476,52.64353],[13.37431,52.64462],[13.37386,52.66269],[13.4026,52.663],[13.40332,52.64501],[13.4334,52.64555],[13.43227,52.68001],[13.49082,52.68111],[13.49147,52.66428],[13.52092,52.66457],[13.5216,52.6465],[13.55096,52.6469],[13.55147,52.62938],[13.52219,52.62898],[13.52335,52.59248],[13.58263,52.59329],[13.58307,52.57535],[13.61246,52.57582],[13.61324,52.55784],[13.64268,52.55813],[13.64296,52.5401],[13.67253,52.54048],[13.67375,52.50475],[13.64413,52.5045],[13.64476,52.48608],[13.7037,52.48683],[13.70415,52.46901],[13.73362,52.4692],[13.73399,52.45121],[13.76358,52.45156],[13.76447,52.40209],[13.73546,52.39753],[13.73611,52.37963],[13.70678,52.37935],[13.70731,52.36136],[13.67785,52.36104],[13.67898,52.33017],[13.62102,52.32946],[13.61999,52.36033],[13.59046,52.36007],[13.5901,52.37806],[13.53116,52.37735],[13.53064,52.39525],[13.47168,52.39459],[13.47149,52.4125],[13.44101,52.41219],[13.44257,52.37604],[13.35487,52.37498],[13.35427,52.39306],[13.23667,52.39114],[13.23609,52.40922],[13.17635,52.40836],[13.17752,52.39029],[13.14791,52.38987],[13.14876,52.37459],[13.11971,52.37422],[13.11941,52.38955],[13.08981,52.38899],[13.08938,52.40707],[13.0618,52.40662],[13.06075,52.42408],[13.08842,52.42449],[13.086,52.47853],[13.11546,52.47896],[13.11462,52.49695],[13.1441,52.49729],[13.14332,52.5157],[13.1137,52.51528],[13.11077,52.6047],[13.19862,52.6062],[13.19746,52.64206]]],terms_text:"Geoportal Berlin/Digitale farbige Orthophotos 2014"},{id:"Berlin-2015",name:"Berlin aerial photography 2015",type:"tms",template:"https://tiles.codefor.de/berlin-2015/{zoom}/{x}/{y}.png",endDate:"2015-08-03T00:00:00.000Z",startDate:"2015-08-02T00:00:00.000Z",polygon:[[[13.11068,52.59538],[13.13975,52.60527],[13.18355,52.61488],[13.21262,52.63315],[13.24167,52.64282],[13.256,52.65201],[13.27004,52.67021],[13.31368,52.67072],[13.32914,52.66204],[13.32948,52.6529],[13.43284,52.65414],[13.44733,52.6816],[13.50561,52.68244],[13.50654,52.65531],[13.53605,52.65572],[13.5376,52.61991],[13.52229,52.61977],[13.52304,52.60165],[13.59776,52.58469],[13.59865,52.55769],[13.62817,52.55805],[13.64303,52.5492],[13.65813,52.54042],[13.67312,52.53144],[13.67356,52.51358],[13.65913,52.51344],[13.65998,52.48643],[13.68931,52.48687],[13.73386,52.46933],[13.73405,52.46034],[13.76362,52.46068],[13.76431,52.42464],[13.74941,52.42474],[13.75045,52.39778],[13.73585,52.39762],[13.70661,52.37944],[13.707,52.3614],[13.67782,52.36125],[13.66405,52.33395],[13.62073,52.33337],[13.62031,52.36042],[13.58986,52.3781],[13.53149,52.37748],[13.53133,52.38641],[13.44223,52.38484],[13.42813,52.3667],[13.38464,52.3662],[13.35432,52.39301],[13.29537,52.39209],[13.29531,52.40103],[13.19171,52.39957],[13.19222,52.39056],[13.14774,52.38996],[13.14839,52.38095],[13.11964,52.38041],[13.0744,52.40683],[13.07392,52.42426],[13.10275,52.43374],[13.10123,52.47874],[13.11558,52.47897],[13.11068,52.59538]]],terms_text:"Geoportal Berlin/Digitale farbige Orthophotos 2015"},{id:"Berlin-2016",name:"Berlin aerial photography 2016",type:"tms",template:"https://tiles.codefor.de/berlin-2016/{zoom}/{x}/{y}.png",endDate:"2016-04-03T00:00:00.000Z",startDate:"2016-04-02T00:00:00.000Z",polygon:[[[13.29535,52.392],[13.29502,52.40083],[13.19206,52.39937],[13.19241,52.39035],[13.14839,52.3897],[13.14877,52.38046],[13.11926,52.38001],[13.11888,52.38921],[13.08906,52.40693],[13.07431,52.4067],[13.07356,52.42447],[13.10259,52.43394],[13.10073,52.47912],[13.11534,52.47934],[13.11055,52.59579],[13.13972,52.60527],[13.18403,52.60593],[13.21212,52.63346],[13.27041,52.65222],[13.26973,52.67025],[13.31405,52.67086],[13.32953,52.65323],[13.43315,52.65458],[13.43254,52.67251],[13.44682,52.68189],[13.50593,52.68261],[13.50681,52.65545],[13.53643,52.6558],[13.53757,52.61964],[13.52288,52.61946],[13.52345,52.6017],[13.53842,52.59279],[13.56782,52.59313],[13.59798,52.58464],[13.5988,52.55755],[13.62826,52.55788],[13.65822,52.53124],[13.67314,52.53139],[13.67365,52.51359],[13.65912,52.51344],[13.65989,52.48661],[13.68929,52.48692],[13.7188,52.47807],[13.73406,52.4604],[13.7636,52.46069],[13.76454,52.42482],[13.75027,52.42468],[13.75097,52.39814],[13.70722,52.37923],[13.70772,52.36111],[13.67826,52.36081],[13.67876,52.34302],[13.66428,52.34287],[13.66454,52.33367],[13.62038,52.33319],[13.61959,52.36012],[13.58956,52.37786],[13.5313,52.37719],[13.53103,52.38581],[13.44254,52.38473],[13.42861,52.36674],[13.38418,52.36617],[13.35417,52.39279],[13.29535,52.392]]],terms_text:"Geoportal Berlin/Digitale farbige Orthophotos 2016"},{id:"Berlin-2016-infrared",name:"Berlin aerial photography 2016 (infrared)",type:"tms",template:"https://tiles.codefor.de/berlin-2016i/{zoom}/{x}/{y}.png",endDate:"2016-04-03T00:00:00.000Z",startDate:"2016-04-02T00:00:00.000Z",polygon:[[[13.29535,52.392],[13.29502,52.40083],[13.19206,52.39937],[13.19241,52.39035],[13.14839,52.3897],[13.14877,52.38046],[13.11926,52.38001],[13.11888,52.38921],[13.08906,52.40693],[13.07431,52.4067],[13.07356,52.42447],[13.10259,52.43394],[13.10073,52.47912],[13.11534,52.47934],[13.11055,52.59579],[13.13972,52.60527],[13.18403,52.60593],[13.21212,52.63346],[13.27041,52.65222],[13.26973,52.67025],[13.31405,52.67086],[13.32953,52.65323],[13.43315,52.65458],[13.43254,52.67251],[13.44682,52.68189],[13.50593,52.68261],[13.50681,52.65545],[13.53643,52.6558],[13.53757,52.61964],[13.52288,52.61946],[13.52345,52.6017],[13.53842,52.59279],[13.56782,52.59313],[13.59798,52.58464],[13.5988,52.55755],[13.62826,52.55788],[13.65822,52.53124],[13.67314,52.53139],[13.67365,52.51359],[13.65912,52.51344],[13.65989,52.48661],[13.68929,52.48692],[13.7188,52.47807],[13.73406,52.4604],[13.7636,52.46069],[13.76454,52.42482],[13.75027,52.42468],[13.75097,52.39814],[13.70722,52.37923],[13.70772,52.36111],[13.67826,52.36081],[13.67876,52.34302],[13.66428,52.34287],[13.66454,52.33367],[13.62038,52.33319],[13.61959,52.36012],[13.58956,52.37786],[13.5313,52.37719],[13.53103,52.38581],[13.44254,52.38473],[13.42861,52.36674],[13.38418,52.36617],[13.35417,52.39279],[13.29535,52.392]]],terms_text:"Geoportal Berlin/Digitale Color-Infrarot-Orthophotos 2016"},{id:"Berlin-2017",name:"Berlin aerial photography 2017",type:"tms",template:"https://tiles.codefor.de/berlin-2017/{zoom}/{x}/{y}.png",endDate:"2017-03-28T00:00:00.000Z",startDate:"2017-03-27T00:00:00.000Z",polygon:[[[13.29535,52.392],[13.29502,52.40083],[13.19206,52.39937],[13.19241,52.39035],[13.14839,52.3897],[13.14877,52.38046],[13.11926,52.38001],[13.11888,52.38921],[13.08906,52.40693],[13.07431,52.4067],[13.07356,52.42447],[13.10259,52.43394],[13.10073,52.47912],[13.11534,52.47934],[13.11055,52.59579],[13.13972,52.60527],[13.18403,52.60593],[13.21212,52.63346],[13.27041,52.65222],[13.26973,52.67025],[13.31405,52.67086],[13.32953,52.65323],[13.43315,52.65458],[13.43254,52.67251],[13.44682,52.68189],[13.50593,52.68261],[13.50681,52.65545],[13.53643,52.6558],[13.53757,52.61964],[13.52288,52.61946],[13.52345,52.6017],[13.53842,52.59279],[13.56782,52.59313],[13.59798,52.58464],[13.5988,52.55755],[13.62826,52.55788],[13.65822,52.53124],[13.67314,52.53139],[13.67365,52.51359],[13.65912,52.51344],[13.65989,52.48661],[13.68929,52.48692],[13.7188,52.47807],[13.73406,52.4604],[13.7636,52.46069],[13.76454,52.42482],[13.75027,52.42468],[13.75097,52.39814],[13.70722,52.37923],[13.70772,52.36111],[13.67826,52.36081],[13.67876,52.34302],[13.66428,52.34287],[13.66454,52.33367],[13.62038,52.33319],[13.61959,52.36012],[13.58956,52.37786],[13.5313,52.37719],[13.53103,52.38581],[13.44254,52.38473],[13.42861,52.36674],[13.38418,52.36617],[13.35417,52.39279],[13.29535,52.392]]],terms_text:"Geoportal Berlin/Digitale farbige Orthophotos 2017"},{id:"Berlin-2018",name:"Berlin aerial photography 2018",type:"tms",template:"https://tiles.codefor.de/berlin-2018/{zoom}/{x}/{y}.png",endDate:"2018-04-07T00:00:00.000Z",startDate:"2018-03-19T00:00:00.000Z",polygon:[[[13.29535,52.392],[13.29502,52.40083],[13.19206,52.39937],[13.19241,52.39035],[13.14839,52.3897],[13.14877,52.38046],[13.11926,52.38001],[13.11888,52.38921],[13.08906,52.40693],[13.07431,52.4067],[13.07356,52.42447],[13.10259,52.43394],[13.10073,52.47912],[13.11534,52.47934],[13.11055,52.59579],[13.13972,52.60527],[13.18403,52.60593],[13.21212,52.63346],[13.27041,52.65222],[13.26973,52.67025],[13.31405,52.67086],[13.32953,52.65323],[13.43315,52.65458],[13.43254,52.67251],[13.44682,52.68189],[13.50593,52.68261],[13.50681,52.65545],[13.53643,52.6558],[13.53757,52.61964],[13.52288,52.61946],[13.52345,52.6017],[13.53842,52.59279],[13.56782,52.59313],[13.59798,52.58464],[13.5988,52.55755],[13.62826,52.55788],[13.65822,52.53124],[13.67314,52.53139],[13.67365,52.51359],[13.65912,52.51344],[13.65989,52.48661],[13.68929,52.48692],[13.7188,52.47807],[13.73406,52.4604],[13.7636,52.46069],[13.76454,52.42482],[13.75027,52.42468],[13.75097,52.39814],[13.70722,52.37923],[13.70772,52.36111],[13.67826,52.36081],[13.67876,52.34302],[13.66428,52.34287],[13.66454,52.33367],[13.62038,52.33319],[13.61959,52.36012],[13.58956,52.37786],[13.5313,52.37719],[13.53103,52.38581],[13.44254,52.38473],[13.42861,52.36674],[13.38418,52.36617],[13.35417,52.39279],[13.29535,52.392]]],terms_text:"Geoportal Berlin/Digitale farbige Orthophotos 2018",best:true},{id:"Bing",name:"Bing aerial imagery",type:"bing",template:"https://www.bing.com/maps",zoomExtent:[1,22],"default":true,description:"Satellite and aerial imagery.",icon:"https://osmlab.github.io/editor-layer-index/sources/world/Bing.png"},{id:"Bologna-Orthophoto-2017",name:"Bologna ortofoto 2017",type:"tms",template:"https://sitmappe.comune.bologna.it/tms/tileserver/Ortofoto2017/{zoom}/{x}/{y}.png",endDate:"2017-01-01T00:00:00.000Z",startDate:"2017-01-01T00:00:00.000Z",zoomExtent:[0,19],polygon:[[[11.22962,44.53077],[11.23184,44.52461],[11.24123,44.52167],[11.23251,44.50893],[11.23572,44.50323],[11.25009,44.50116],[11.24765,44.49644],[11.25708,44.49765],[11.25653,44.49294],[11.29461,44.48981],[11.29676,44.4857],[11.28807,44.47586],[11.29226,44.4609],[11.28447,44.45459],[11.28228,44.42572],[11.29347,44.4276],[11.29254,44.43377],[11.31339,44.42103],[11.32504,44.42274],[11.33695,44.42772],[11.33765,44.43167],[11.3315,44.43273],[11.33453,44.43867],[11.34466,44.43594],[11.34498,44.44093],[11.36235,44.45099],[11.37312,44.44935],[11.37498,44.45897],[11.39499,44.46368],[11.4011,44.46122],[11.39464,44.46803],[11.41577,44.48376],[11.42559,44.4845],[11.42717,44.48921],[11.41727,44.4906],[11.43363,44.51312],[11.42692,44.51532],[11.43034,44.5196],[11.42466,44.51959],[11.41987,44.52934],[11.4143,44.52564],[11.40739,44.52851],[11.41487,44.53999],[11.38871,44.54145],[11.39082,44.54553],[11.36474,44.55253],[11.36414,44.55609],[11.3573,44.5519],[11.34375,44.55333],[11.33589,44.54299],[11.33145,44.54734],[11.31349,44.54722],[11.30929,44.5295],[11.29104,44.53581],[11.28179,44.54851],[11.26911,44.53248],[11.25118,44.55578],[11.24499,44.55569],[11.22962,44.53077]]],terms_url:"http://dati.comune.bologna.it/node/3449",terms_text:"© Comune di Bologna cc-by 4.0 ODbL compliant",best:true},{id:"Bonvillars-2013",name:"Bonvillars Orthophoto 2013",type:"tms",template:"http://osmdata.asitvd.ch/tiles/bonvillars2013/{zoom}/{x}/{y}.png",endDate:"2013-01-01T00:00:00.000Z",startDate:"2013-01-01T00:00:00.000Z",zoomExtent:[14,20],polygon:[[[6.66713,46.83358],[6.66313,46.83833],[6.67213,46.84191],[6.6749,46.84226],[6.67843,46.83807],[6.66713,46.83358]]],terms_url:"http://osmdata.asitvd.ch/",terms_text:"Bonvillars - Orthophoto technique 2013"},{id:"Bordeaux_2012",name:"Bordeaux - 2012",type:"tms",template:"http://wms.openstreetmap.fr/tms/1.0.0/bordeaux_2012/{zoom}/{x}/{y}",endDate:"2012-01-01T00:00:00.000Z",startDate:"2012-01-01T00:00:00.000Z",zoomExtent:[0,20],polygon:[[[-0.59923,45.04193],[-0.54231,45.02757],[-0.50979,45.00601],[-0.47727,45.00206],[-0.47066,44.97367],[-0.45542,44.95102],[-0.46456,44.91792],[-0.4732,44.91936],[-0.48794,44.90928],[-0.4981,44.89057],[-0.48946,44.87797],[-0.4666,44.87076],[-0.47625,44.84735],[-0.49505,44.83978],[-0.49099,44.83186],[-0.46965,44.82537],[-0.49709,44.80446],[-0.52453,44.80013],[-0.5103,44.76767],[-0.53469,44.76515],[-0.56213,44.75107],[-0.5601,44.74169],[-0.5728,44.74133],[-0.59465,44.7601],[-0.63429,44.73989],[-0.65004,44.77705],[-0.67901,44.77489],[-0.68816,44.77922],[-0.71509,44.76839],[-0.75168,44.7471],[-0.76336,44.75577],[-0.73846,44.77561],[-0.74202,44.78571],[-0.72779,44.81239],[-0.73999,44.82861],[-0.76438,44.82933],[-0.803,44.82176],[-0.8401,44.82753],[-0.83908,44.84014],[-0.87567,44.85023],[-0.88532,44.85852],[-0.88685,44.88769],[-0.86601,44.88697],[-0.84569,44.89669],[-0.83349,44.92764],[-0.81825,44.92764],[-0.80198,44.92224],[-0.79843,44.9485],[-0.78725,44.94814],[-0.75574,44.97007],[-0.72169,44.95785],[-0.69578,44.93087],[-0.68866,44.93447],[-0.67139,44.93267],[-0.66935,44.94095],[-0.62514,44.95066],[-0.63226,44.95893],[-0.63124,44.9672],[-0.60024,44.96756],[-0.55146,44.97834],[-0.54079,44.97726],[-0.55451,44.99739],[-0.59364,45.01751],[-0.60787,45.03403],[-0.59923,45.04193]]],terms_text:"Communauté urbaine de Bordeaux - 2012"},{id:"Bordeaux_2016",name:"Bordeaux 2016",type:"tms",template:"http://tms.bordeaux.inria.fr/bdx2016/{zoom}/{x}/{y}.jpg",endDate:"2016-01-01T00:00:00.000Z",startDate:"2016-01-01T00:00:00.000Z",zoomExtent:[14,20],polygon:[[[-0.59923,45.04193],[-0.54231,45.02757],[-0.50979,45.00601],[-0.47727,45.00206],[-0.47066,44.97367],[-0.45542,44.95102],[-0.46456,44.91792],[-0.4732,44.91936],[-0.48794,44.90928],[-0.4981,44.89057],[-0.48946,44.87797],[-0.4666,44.87076],[-0.47625,44.84735],[-0.49505,44.83978],[-0.49099,44.83186],[-0.46965,44.82537],[-0.49709,44.80446],[-0.52453,44.80013],[-0.5103,44.76767],[-0.53469,44.76515],[-0.56213,44.75107],[-0.5601,44.74169],[-0.5728,44.74133],[-0.59465,44.7601],[-0.63429,44.73989],[-0.65004,44.77705],[-0.67901,44.77489],[-0.68816,44.77922],[-0.71509,44.76839],[-0.75168,44.7471],[-0.76336,44.75577],[-0.73846,44.77561],[-0.74202,44.78571],[-0.72779,44.81239],[-0.73999,44.82861],[-0.76438,44.82933],[-0.803,44.82176],[-0.8401,44.82753],[-0.83908,44.84014],[-0.87567,44.85023],[-0.88532,44.85852],[-0.88685,44.88769],[-0.86601,44.88697],[-0.84569,44.89669],[-0.83349,44.92764],[-0.81825,44.92764],[-0.80198,44.92224],[-0.79843,44.9485],[-0.78725,44.94814],[-0.75574,44.97007],[-0.72169,44.95785],[-0.69578,44.93087],[-0.68866,44.93447],[-0.67139,44.93267],[-0.66935,44.94095],[-0.62514,44.95066],[-0.63226,44.95893],[-0.63124,44.9672],[-0.60024,44.96756],[-0.55146,44.97834],[-0.54079,44.97726],[-0.55451,44.99739],[-0.59364,45.01751],[-0.60787,45.03403],[-0.59923,45.04193]]],terms_text:"Bordeaux Métropole - 2016"},{id:"branquinha_al",name:"Branquinha AL",type:"wms",template:"http://geoserver.dados.al.gov.br:8080/geoserver/Alagoas/ows?service=WMS&version=1.1.0&request=GetMap&layers=Branquinha&SERVICE=WMS&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.0&REQUEST=GetMap&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[-35.96968,-9.2928],[-35.97063,-9.20261],[-35.97727,-9.20264],[-35.98365,-9.2027],[-35.98765,-9.20266],[-35.99159,-9.20274],[-36.00498,-9.20284],[-36.01473,-9.20293],[-36.01651,-9.20296],[-36.01871,-9.20293],[-36.02487,-9.20286],[-36.02892,-9.20297],[-36.03308,-9.20289],[-36.03769,-9.20294],[-36.04581,-9.203],[-36.05161,-9.20305],[-36.05457,-9.20301],[-36.06022,-9.20304],[-36.06191,-9.20304],[-36.0618,-9.21319],[-36.06167,-9.21806],[-36.06156,-9.21915],[-36.06163,-9.22156],[-36.06144,-9.22277],[-36.06139,-9.22716],[-36.06134,-9.23227],[-36.0614,-9.23391],[-36.06145,-9.23494],[-36.06131,-9.23646],[-36.06133,-9.23773],[-36.06142,-9.23905],[-36.06145,-9.24133],[-36.06136,-9.2423],[-36.06141,-9.24358],[-36.06139,-9.2453],[-36.06126,-9.24726],[-36.06123,-9.24949],[-36.06127,-9.25107],[-36.06121,-9.25517],[-36.06119,-9.25795],[-36.06107,-9.25945],[-36.06109,-9.26183],[-36.06106,-9.26493],[-36.06086,-9.27146],[-36.06083,-9.2751],[-36.06074,-9.28274],[-36.0608,-9.29234],[-36.06074,-9.29363],[-36.05477,-9.29357],[-36.04621,-9.29349],[-36.03941,-9.29348],[-36.03501,-9.29339],[-36.02979,-9.29341],[-36.02167,-9.29332],[-36.01278,-9.29328],[-36.00468,-9.29321],[-35.99678,-9.29314],[-35.98969,-9.29312],[-35.98483,-9.29305],[-35.98305,-9.29289],[-35.98173,-9.29294],[-35.97884,-9.29282],[-35.96968,-9.2928]]],terms_url:"http://www.seplag.al.gov.br",terms_text:"Secretaria de Estado do Planejamento, Gestão e Patrimônio"},{id:"British_Columbia_Mosaic",name:"British Columbia Mosaic",type:"tms",template:"http://{switch:a,b,c,d}.imagery.paulnorman.ca/tiles/bc_mosaic/{zoom}/{x}/{y}.png",endDate:"2013-06-01T00:00:00.000Z",startDate:"2009-01-01T00:00:00.000Z",zoomExtent:[9,20],polygon:[[[-123.3176,49.32726],[-123.44053,49.32682],[-123.44072,49.33844],[-123.43984,49.34304],[-123.44013,49.34354],[-123.44011,49.34399],[-123.44063,49.34445],[-123.44047,49.34558],[-123.43978,49.34606],[-123.43897,49.34613],[-123.43729,49.35672],[-123.43748,49.37108],[-123.43353,49.37094],[-123.43304,49.37373],[-123.43327,49.37512],[-123.43228,49.3761],[-123.43175,49.37917],[-123.43143,49.37959],[-123.43078,49.38239],[-123.43134,49.38274],[-123.43121,49.38385],[-123.43004,49.38459],[-123.41899,49.38471],[-123.41922,49.41352],[-123.39725,49.41357],[-123.39728,49.42435],[-123.40069,49.42433],[-123.40077,49.57035],[-123.40008,49.57035],[-123.40108,49.59338],[-123.37604,49.59328],[-123.37698,49.67561],[-123.35073,49.67564],[-123.3508,49.70868],[-123.33289,49.70872],[-123.33279,49.72563],[-123.30071,49.72556],[-123.30092,49.73754],[-123.2886,49.73764],[-123.28878,49.82492],[-123.2998,49.82492],[-123.30117,49.84978],[-123.32182,49.85067],[-123.32733,49.85777],[-123.32767,49.97589],[-123.30083,49.97522],[-123.30072,50.0997],[-123.25017,50.10074],[-123.25091,50.27549],[-123.02243,50.27556],[-123.02249,50.32549],[-123.00093,50.32547],[-123.00078,50.34239],[-122.9775,50.34234],[-122.97748,50.35043],[-122.95081,50.3505],[-122.95079,50.3712],[-122.93252,50.37115],[-122.9321,50.39979],[-122.88742,50.39997],[-122.88734,50.42561],[-122.66202,50.4257],[-122.66231,50.39945],[-122.59903,50.39924],[-122.59883,50.37552],[-122.57248,50.37537],[-122.57356,50.24939],[-122.59904,50.24946],[-122.59915,50.22657],[-122.6185,50.22664],[-122.61857,50.22441],[-122.64906,50.22451],[-122.64922,50.19935],[-122.73086,50.19938],[-122.73116,50.12443],[-122.74904,50.12451],[-122.74905,50.0903],[-122.76878,50.09034],[-122.76898,49.94945],[-122.99905,49.94947],[-122.99912,49.87546],[-122.97759,49.87546],[-122.97781,49.69951],[-122.99924,49.69948],[-122.99925,49.65165],[-123.02215,49.65165],[-123.02212,49.59951],[-123.04919,49.59946],[-123.04919,49.59405],[-123.06646,49.59404],[-123.06636,49.54519],[-123.06999,49.54512],[-123.0699,49.54132],[-123.07068,49.53928],[-123.07089,49.53799],[-123.07115,49.53688],[-123.07111,49.53581],[-123.07138,49.53282],[-123.07165,49.53211],[-123.07171,49.53139],[-123.07203,49.53042],[-123.07396,49.53035],[-123.0748,49.5295],[-123.07482,49.52881],[-123.07434,49.52806],[-123.07353,49.52746],[-123.07337,49.52704],[-123.07329,49.52559],[-123.07371,49.52496],[-123.07362,49.52449],[-123.09926,49.52449],[-123.09916,49.47545],[-123.07105,49.47553],[-123.07109,49.4663],[-123.07392,49.46631],[-123.07422,49.4505],[-123.07463,49.45009],[-123.07465,49.44933],[-123.0746,49.44902],[-123.07446,49.44869],[-123.07433,49.44799],[-123.07424,49.44777],[-123.07431,49.44475],[-123.07471,49.44476],[-123.07464,49.43773],[-122.99965,49.43774],[-122.99965,49.43692],[-122.86062,49.44153],[-122.81026,49.4424],[-122.8099,49.37667],[-122.40361,49.37666],[-122.40363,49.37719],[-122.26474,49.3773],[-122.26354,49.23601],[-122.21557,49.23614],[-122.0581,49.23588],[-121.95383,49.29665],[-121.94009,49.30454],[-121.92358,49.31423],[-121.89909,49.32254],[-121.88834,49.32598],[-121.8553,49.33636],[-121.8327,49.34415],[-121.76713,49.36544],[-121.67367,49.36546],[-121.64042,49.37438],[-121.5962,49.38605],[-121.58612,49.38792],[-121.52137,49.39946],[-121.51174,49.40384],[-121.46793,49.4229],[-121.44168,49.43456],[-121.42243,49.43458],[-121.34629,49.39323],[-121.34801,49.34124],[-121.5135,49.32058],[-121.60317,49.27717],[-121.65841,49.18561],[-121.67995,49.16541],[-121.78158,49.07026],[-121.80762,49.06225],[-121.9394,49.06362],[-121.97255,49.04242],[-121.99214,49.03329],[-122.00353,49.02734],[-122.01786,49.02411],[-122.11086,48.99928],[-122.14931,48.99953],[-122.14927,48.99915],[-122.19914,48.9996],[-122.19918,48.9992],[-122.23436,48.99948],[-122.23436,49.00017],[-122.39947,49.00124],[-122.45213,49.00163],[-122.45213,49.00088],[-122.45841,49.00093],[-122.45848,48.99931],[-122.49925,48.9995],[-122.49925,48.99929],[-122.54926,48.99951],[-122.54926,48.99932],[-122.65808,48.99942],[-122.65811,48.9954],[-122.70676,48.99553],[-122.75198,48.99564],[-122.79221,48.99572],[-122.79219,48.99943],[-123.03504,48.99957],[-123.03504,49.0001],[-123.03971,49.00005],[-123.03974,49.00018],[-123.04855,49.00013],[-123.04853,49.00047],[-123.05571,49.00045],[-123.05563,49.00023],[-123.06414,49.00013],[-123.06416,48.99994],[-123.0749,48.99969],[-123.07507,49.00062],[-123.08996,49.00037],[-123.10923,48.99994],[-123.12712,49.0003],[-123.136,48.99987],[-123.13627,49.00058],[-123.15385,48.99981],[-123.15405,49.00068],[-123.171,49.00013],[-123.20009,48.99968],[-123.20034,49.04978],[-123.21088,49.04972],[-123.21122,49.05199],[-123.20705,49.05209],[-123.20789,49.06079],[-123.21917,49.0601],[-123.21896,49.06127],[-123.22518,49.06127],[-123.22539,49.06224],[-123.22971,49.06203],[-123.22981,49.06859],[-123.23319,49.06873],[-123.2335,49.07059],[-123.24931,49.07025],[-123.24973,49.08026],[-123.27514,49.0804],[-123.27514,49.08709],[-123.29948,49.0873],[-123.29944,49.08025],[-123.32545,49.08039],[-123.32544,49.11547],[-123.2751,49.15033],[-123.27518,49.18733],[-123.27881,49.18711],[-123.27889,49.19107],[-123.30048,49.19107],[-123.30042,49.26229],[-123.31262,49.26224],[-123.3126,49.27149],[-123.31543,49.27147],[-123.31566,49.28189],[-123.31747,49.28188],[-123.3175,49.29185],[-123.31904,49.29185],[-123.31907,49.2986],[-123.32023,49.29857],[-123.32028,49.30197],[-123.32227,49.30196],[-123.32239,49.31183],[-123.3254,49.31181],[-123.32539,49.32017],[-123.31927,49.3202],[-123.31922,49.32467],[-123.31794,49.32466],[-123.31799,49.32541],[-123.3176,49.32726]]],terms_url:"http://imagery.paulnorman.ca/tiles/about.html",terms_text:"Copyright Province of British Columbia, City of Surrey"},{id:"Budapest_XI_2015",name:"Budapest district XI orthophoto 2015",type:"wms",template:"http://terinfo.ujbuda.hu/mapproxy/service?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=orto2015_20160304&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",endDate:"2015-01-01T00:00:00.000Z",startDate:"2015-01-01T00:00:00.000Z",polygon:[[[19.04767,47.48789],[19.05157,47.4899],[19.06434,47.4792],[19.0665,47.47632],[19.06766,47.47343],[19.06837,47.47077],[19.06846,47.46876],[19.06722,47.46501],[19.05683,47.45259],[19.0549,47.44906],[19.05176,47.43499],[19.04863,47.429],[19.04384,47.42968],[19.04023,47.42932],[19.03509,47.43818],[19.03221,47.43779],[19.0252,47.442],[19.0207,47.44576],[19.01915,47.44658],[19.01545,47.44759],[19.01347,47.44361],[19.01266,47.44271],[19.01178,47.44247],[19.0119,47.44188],[19.0098,47.43944],[19.0057,47.43111],[19.00046,47.43097],[18.99534,47.42821],[18.97545,47.42818],[18.97343,47.42904],[18.97361,47.42998],[18.97548,47.43067],[18.97719,47.43402],[18.97823,47.43817],[18.97733,47.44657],[18.97004,47.44988],[18.96861,47.45142],[18.97568,47.45506],[18.97586,47.45556],[18.97625,47.45584],[18.97658,47.45594],[18.97763,47.45597],[18.98017,47.45605],[18.98162,47.46067],[18.97793,47.46857],[18.96867,47.47643],[18.97745,47.48194],[18.98035,47.48169],[18.98565,47.4782],[18.98907,47.47838],[18.99117,47.47898],[18.99177,47.48102],[18.99288,47.48182],[18.99836,47.48238],[18.99902,47.483],[19.004,47.48189],[19.00416,47.48399],[19.01027,47.48535],[19.01237,47.48404],[19.0138,47.48351],[19.01674,47.48465],[19.0163,47.48539],[19.01689,47.48595],[19.01808,47.48605],[19.02108,47.48492],[19.02124,47.48612],[19.02301,47.48741],[19.02637,47.48885],[19.02995,47.48904],[19.03135,47.48855],[19.03189,47.48759],[19.03286,47.48712],[19.03364,47.48702],[19.03514,47.48725],[19.03585,47.48729],[19.03616,47.48751],[19.03665,47.48767],[19.03748,47.48774],[19.03847,47.48737],[19.03918,47.48679],[19.04105,47.48649],[19.04181,47.48737],[19.04387,47.4881],[19.04542,47.48817],[19.04695,47.4881],[19.04767,47.48789]]],terms_url:"http://terinfo.ujbuda.hu",terms_text:"Budapest XI. kerület önkormányzata",description:"5 cm resolution bald image"},{id:"Budapest_XI_2017",name:"Budapest district XI orthophoto 2017",type:"wms",template:"http://terinfo.ujbuda.hu/mapproxy/service?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=orto_2017&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",endDate:"2017-03-01T00:00:00.000Z",startDate:"2017-03-01T00:00:00.000Z",polygon:[[[19.04767,47.48789],[19.05157,47.4899],[19.06434,47.4792],[19.0665,47.47632],[19.06766,47.47343],[19.06837,47.47077],[19.06846,47.46876],[19.06722,47.46501],[19.05683,47.45259],[19.0549,47.44906],[19.05176,47.43499],[19.04863,47.429],[19.04384,47.42968],[19.04023,47.42932],[19.03509,47.43818],[19.03221,47.43779],[19.0252,47.442],[19.0207,47.44576],[19.01915,47.44658],[19.01545,47.44759],[19.01347,47.44361],[19.01266,47.44271],[19.01178,47.44247],[19.0119,47.44188],[19.0098,47.43944],[19.0057,47.43111],[19.00046,47.43097],[18.99534,47.42821],[18.97545,47.42818],[18.97343,47.42904],[18.97361,47.42998],[18.97548,47.43067],[18.97719,47.43402],[18.97823,47.43817],[18.97733,47.44657],[18.97004,47.44988],[18.96861,47.45142],[18.97568,47.45506],[18.97586,47.45556],[18.97625,47.45584],[18.97658,47.45594],[18.97763,47.45597],[18.98017,47.45605],[18.98162,47.46067],[18.97793,47.46857],[18.96867,47.47643],[18.97745,47.48194],[18.98035,47.48169],[18.98565,47.4782],[18.98907,47.47838],[18.99117,47.47898],[18.99177,47.48102],[18.99288,47.48182],[18.99836,47.48238],[18.99902,47.483],[19.004,47.48189],[19.00416,47.48399],[19.01027,47.48535],[19.01237,47.48404],[19.0138,47.48351],[19.01674,47.48465],[19.0163,47.48539],[19.01689,47.48595],[19.01808,47.48605],[19.02108,47.48492],[19.02124,47.48612],[19.02301,47.48741],[19.02637,47.48885],[19.02995,47.48904],[19.03135,47.48855],[19.03189,47.48759],[19.03286,47.48712],[19.03364,47.48702],[19.03514,47.48725],[19.03585,47.48729],[19.03616,47.48751],[19.03665,47.48767],[19.03748,47.48774],[19.03847,47.48737],[19.03918,47.48679],[19.04105,47.48649],[19.04181,47.48737],[19.04387,47.4881],[19.04542,47.48817],[19.04695,47.4881],[19.04767,47.48789]]],terms_url:"http://terinfo.ujbuda.hu",terms_text:"Budapest XI. kerület önkormányzata",best:true,description:"5 cm resolution bald image"},{id:"Cadastre",name:"Cadastre",type:"tms",template:"http://tms.cadastre.openstreetmap.fr/*/tout/{zoom}/{x}/{y}.png",zoomExtent:[12,22],polygon:[[[-2.7,43.9],[-6.3,48.98],[-2.25,50.09],[1.31,50.88],[2.35816,51.32937],[2.5488,51.09759],[2.57048,51.07409],[2.58741,51.01763],[2.59845,51.0051],[2.61558,50.99749],[2.63986,50.95766],[2.64225,50.94578],[2.62452,50.9256],[2.61962,50.91067],[2.62396,50.86071],[2.62781,50.85054],[2.63786,50.83696],[2.6511,50.82906],[2.73267,50.81738],[2.79995,50.73795],[2.81655,50.73092],[2.85265,50.73335],[2.89072,50.7162],[2.90492,50.71536],[2.9161,50.72418],[2.93508,50.75592],[3.00718,50.78377],[3.08218,50.78749],[3.09244,50.79092],[3.11412,50.80566],[3.14877,50.80195],[3.2154,50.73111],[3.22149,50.7267],[3.27051,50.70375],[3.27545,50.67757],[3.26576,50.6604],[3.26588,50.64054],[3.28922,50.60028],[3.29219,50.55037],[3.3056,50.53267],[3.37551,50.50839],[3.3898,50.50884],[3.4748,50.54445],[3.52173,50.53459],[3.53266,50.51873],[3.54779,50.51012],[3.61523,50.50558],[3.67378,50.45642],[3.68415,50.35277],[3.6901,50.34044],[3.70258,50.33482],[3.71576,50.33854],[3.74935,50.36279],[3.84109,50.36558],[3.90189,50.3436],[3.91317,50.34291],[4.02672,50.36904],[4.13761,50.29984],[4.14388,50.29727],[4.21444,50.28167],[4.22904,50.26664],[4.23078,50.25233],[4.17084,50.18579],[4.16601,50.16888],[4.1764,50.1547],[4.21195,50.13602],[4.24074,50.07102],[4.23193,50.05551],[4.18164,50.03436],[4.17177,50.02537],[4.16976,50.01217],[4.1765,50.00065],[4.20633,49.97546],[4.22164,49.97089],[4.30877,49.98145],[4.44542,49.9523],[4.45469,49.95251],[4.6581,50.00609],[4.66936,50.01392],[4.67293,50.02716],[4.66924,50.06972],[4.69517,50.10472],[4.83123,50.17941],[4.8815,50.16436],[4.90479,50.14451],[4.90426,50.12639],[4.88076,50.0815],[4.86277,50.0745],[4.85104,50.06216],[4.84331,50.03884],[4.84331,50.03883],[4.8433,50.03881],[4.82678,49.989],[4.82662,49.97692],[4.83343,49.96696],[4.89654,49.91753],[4.89755,49.89424],[4.87913,49.86942],[4.87625,49.85111],[4.88924,49.81266],[4.89769,49.80204],[4.91098,49.79926],[4.99534,49.81116],[5.01867,49.79272],[5.02686,49.78886],[5.09944,49.77323],[5.13458,49.73462],[5.1412,49.72984],[5.18761,49.70906],[5.19602,49.70732],[5.28157,49.70836],[5.33363,49.67308],[5.344,49.65049],[5.3544,49.64041],[5.43141,49.60791],[5.48205,49.52815],[5.49294,49.51979],[5.50666,49.52042],[5.55401,49.54025],[5.59311,49.53424],[5.6076,49.53761],[5.641,49.56095],[5.70676,49.55267],[5.71578,49.55361],[5.77526,49.57414],[5.8399,49.55321],[5.86126,49.52038],[5.876,49.5114],[5.97516,49.50129],[5.99801,49.47317],[6.01627,49.46597],[6.08635,49.47562],[6.09319,49.47787],[6.17397,49.52187],[6.24643,49.52511],[6.334,49.48235],[6.34423,49.48037],[6.43515,49.487],[6.5451,49.44384],[6.60639,49.37868],[6.60497,49.33739],[6.61627,49.31869],[6.67013,49.29269],[6.72996,49.22917],[6.74328,49.19086],[6.76026,49.17752],[6.80904,49.17284],[6.82473,49.17826],[6.83093,49.19366],[6.82982,49.21802],[6.85119,49.23136],[6.88453,49.2239],[6.89322,49.22389],[6.93753,49.23369],[7.04055,49.19794],[7.0463,49.17503],[7.05478,49.16313],[7.06908,49.16018],[7.10494,49.16634],[7.14315,49.14159],[7.1535,49.13839],[7.28683,49.13488],[7.29893,49.13856],[7.36095,49.18259],[7.45012,49.19517],[7.50113,49.17672],[7.54379,49.10572],[7.5579,49.09626],[7.6296,49.08527],[7.64722,49.06722],[7.6612,49.06119],[7.75401,49.05963],[7.76073,49.06067],[7.80291,49.07489],[7.85525,49.05329],[7.8673,49.05227],[7.93826,49.06832],[8.08069,49.00688],[8.2225,48.98787],[8.23704,48.97683],[8.23589,48.95817],[8.20888,48.94863],[8.20089,48.94339],[8.15824,48.89753],[8.10087,48.7993],[7.99071,48.74478],[7.98534,48.7409],[7.90422,48.65865],[7.85605,48.63606],[7.8484,48.62977],[7.81842,48.58883],[7.81456,48.57704],[7.81449,48.50968],[7.78547,48.48337],[7.78055,48.47652],[7.74506,48.39484],[7.74357,48.38427],[7.75159,48.32322],[7.71085,48.29841],[7.70241,48.28803],[7.67661,48.21555],[7.59605,48.11698],[7.59165,48.10648],[7.58522,48.04694],[7.59127,48.03035],[7.62437,47.99865],[7.63205,47.97081],[7.57554,47.87436],[7.5728,47.86435],[7.57267,47.83631],[7.54581,47.78793],[7.54418,47.77232],[7.55758,47.72899],[7.53526,47.6989],[7.53136,47.68564],[7.537,47.67302],[7.60016,47.60822],[7.58967,47.56755],[7.55424,47.55128],[7.54511,47.54283],[7.51256,47.48439],[7.38747,47.42111],[7.32653,47.4273],[7.24435,47.40939],[7.16708,47.4335],[7.15212,47.47612],[7.14279,47.48707],[7.12853,47.48893],[7.0801,47.47718],[7.03557,47.48695],[7.02102,47.48458],[7.01205,47.47287],[7.003,47.44095],[6.9551,47.40808],[6.94716,47.39698],[6.94818,47.38337],[6.95769,47.37359],[6.97126,47.37218],[7.018,47.38386],[7.05623,47.37035],[7.07007,47.35005],[7.05958,47.32257],[6.97424,47.27856],[6.96347,47.26233],[6.96134,47.23479],[6.89443,47.19393],[6.88913,47.18922],[6.85545,47.14636],[6.76907,47.10751],[6.76011,47.09953],[6.72561,47.0418],[6.62355,46.9811],[6.4812,46.9445],[6.46892,46.93522],[6.46686,46.91997],[6.47548,46.88771],[6.4535,46.8239],[6.45644,46.80534],[6.46722,46.79104],[6.46098,46.76887],[6.15817,46.59343],[6.14872,46.58069],[6.15152,46.56508],[6.16549,46.54399],[6.15811,46.52456],[6.10174,46.46979],[6.09572,46.45418],[6.09704,46.43317],[6.10829,46.41643],[6.16622,46.38839],[6.17817,46.36922],[6.13748,46.31297],[6.13371,46.30227],[6.13038,46.23737],[6.1103,46.22344],[6.08865,46.23081],[6.07717,46.23123],[6.01857,46.21601],[6.00681,46.20752],[6.00388,46.19332],[6.00787,46.16977],[6.01783,46.15564],[6.03509,46.15456],[6.05564,46.16288],[6.12468,46.15415],[6.13778,46.15702],[6.24026,46.22094],[6.24906,46.23299],[6.24707,46.24777],[6.21148,46.31057],[6.21219,46.32485],[6.23946,46.36705],[6.31648,46.41557],[6.41083,46.42495],[6.41748,46.42682],[6.50498,46.46871],[6.63047,46.47435],[6.74665,46.45695],[6.82244,46.42925],[6.81832,46.38181],[6.80484,46.36179],[6.80189,46.34639],[6.81095,46.33359],[6.86491,46.30038],[6.87504,46.28007],[6.86092,46.2439],[6.82698,46.21188],[6.82075,46.19862],[6.81863,46.16592],[6.82259,46.15261],[6.83427,46.14509],[6.90382,46.12971],[6.90491,46.09595],[6.90932,46.08406],[6.92001,46.07721],[6.94898,46.0699],[7.01556,46.00883],[7.05191,45.93066],[7.04533,45.92217],[7.04497,45.92064],[7.04394,45.92036],[6.99582,45.85822],[6.94097,45.83551],[6.84376,45.82387],[6.83102,45.81711],[6.82614,45.80353],[6.82787,45.73217],[6.83174,45.72082],[6.8414,45.71373],[6.90729,45.69124],[6.92419,45.66935],[6.94247,45.66172],[6.97131,45.66528],[7.00597,45.64945],[7.01151,45.63652],[6.9978,45.60877],[6.99643,45.59465],[7.0158,45.52354],[7.02774,45.5102],[7.1072,45.47877],[7.1228,45.44924],[7.13304,45.44001],[7.1856,45.41894],[7.19515,45.40409],[7.17075,45.35069],[7.14232,45.32298],[7.13649,45.30576],[7.14458,45.25048],[7.08417,45.20279],[6.99279,45.19823],[6.98106,45.19368],[6.90009,45.12689],[6.85843,45.11699],[6.78283,45.14228],[6.77056,45.14242],[6.67751,45.11356],[6.6653,45.10289],[6.66501,45.08667],[6.68237,45.04558],[6.69602,45.03395],[6.75744,45.01884],[6.78375,44.9146],[6.7942,44.90161],[6.86698,44.86519],[6.8798,44.86346],[6.93633,44.87461],[7.01795,44.84402],[7.03453,44.82282],[7.03711,44.75009],[7.0496,44.73226],[7.07224,44.72311],[7.08651,44.6968],[7.08666,44.68085],[7.07671,44.67134],[6.99007,44.67203],[6.97413,44.66431],[6.97056,44.64696],[6.97819,44.61784],[6.94659,44.57124],[6.88235,44.53479],[6.87233,44.5195],[6.87892,44.50245],[6.95894,44.43129],[6.95872,44.42908],[6.92167,44.41436],[6.91223,44.40659],[6.90907,44.39477],[6.90972,44.38195],[6.91637,44.36804],[6.99909,44.29414],[7.01181,44.256],[7.01983,44.24558],[7.03259,44.2424],[7.07312,44.2461],[7.1651,44.22112],[7.24533,44.18544],[7.26053,44.16682],[7.27537,44.15947],[7.33878,44.1574],[7.36278,44.13834],[7.37776,44.13416],[7.56283,44.15792],[7.5642,44.15836],[7.56478,44.15817],[7.60548,44.1634],[7.6162,44.16827],[7.63989,44.18928],[7.68608,44.1861],[7.69422,44.17795],[7.68937,44.13869],[7.69445,44.12276],[7.72786,44.08615],[7.72403,44.05704],[7.68603,44.02371],[7.68077,44.0164],[7.66016,43.9672],[7.59624,43.94466],[7.58419,43.93287],[7.56858,43.89159],[7.5271,43.87434],[7.51649,43.86397],[7.51594,43.84915],[7.53622,43.79234],[9.8,43.1],[9.63227,41.43244],[9.36968,41.35052],[9.27311,41.29196],[8.94186,41.27688],[5.8,41.64],[3.17358,42.41768],[3.16081,42.42757],[3.0944,42.41457],[3.03402,42.45331],[3.02214,42.45645],[2.87822,42.4487],[2.87019,42.44653],[2.78424,42.40256],[2.7413,42.41128],[2.72928,42.40998],[2.69331,42.39417],[2.68378,42.3854],[2.68162,42.37263],[2.68585,42.34679],[2.66719,42.33008],[2.58106,42.34418],[2.56777,42.34173],[2.5338,42.32197],[2.47795,42.32986],[2.41933,42.37658],[2.41222,42.38021],[2.26719,42.42055],[2.25973,42.42117],[2.20694,42.41558],[2.20653,42.41526],[2.20526,42.41541],[2.16028,42.41065],[2.14881,42.40545],[2.09393,42.35474],[2.00861,42.33818],[1.965,42.36473],[1.93076,42.42442],[1.92089,42.43302],[1.88467,42.44761],[1.88459,42.44762],[1.88444,42.4477],[1.82774,42.47056],[1.72567,42.48452],[1.71561,42.50125],[1.7272,42.56103],[1.72479,42.57499],[1.71011,42.59992],[1.69377,42.60975],[1.60283,42.61382],[1.56069,42.6392],[1.54636,42.64166],[1.50444,42.6331],[1.4921,42.62502],[1.47238,42.59703],[1.43792,42.59264],[1.41936,42.60643],[1.38032,42.67415],[1.37335,42.68127],[1.33313,42.70563],[1.32364,42.7085],[1.23221,42.71248],[1.16554,42.69928],[1.08546,42.76635],[1.07564,42.77079],[0.95937,42.78852],[0.95073,42.78794],[0.92265,42.7797],[0.84606,42.8157],[0.71511,42.8464],[0.70017,42.84402],[0.69117,42.83186],[0.67409,42.76479],[0.67474,42.75286],[0.69192,42.70684],[0.669,42.67901],[0.43024,42.67863],[0.3715,42.70308],[0.35954,42.70415],[0.34912,42.69817],[0.32567,42.67274],[0.29571,42.66388],[0.24594,42.70175],[0.23972,42.70494],[0.18967,42.72039],[0.17919,42.72075],[-0.01993,42.67389],[-0.06726,42.6848],[-0.16949,42.77157],[-0.29987,42.82697],[-0.31683,42.82635],[-0.39208,42.78766],[-0.44354,42.78453],[-0.48842,42.80255],[-0.50868,42.79935],[-0.54499,42.76906],[-0.56721,42.76937],[-0.67446,42.86392],[-0.68094,42.86775],[-0.73372,42.88666],[-0.7476,42.93879],[-0.75711,42.95107],[-0.77253,42.95284],[-0.82114,42.93865],[-0.94508,42.94192],[-1.02313,42.98206],[-1.10852,43.00409],[-1.1156,43.00461],[-1.14775,43.00124],[-1.15845,43.01452],[-1.16736,43.02083],[-1.21622,43.0381],[-1.22612,43.03898],[-1.26236,43.03303],[-1.30643,43.05531],[-1.31992,43.05696],[-1.33135,43.0496],[-1.3542,43.0197],[-1.43868,43.03371],[-1.4775,43.06889],[-1.48311,43.08561],[-1.47641,43.10248],[-1.43479,43.13087],[-1.42732,43.1404],[-1.39411,43.22935],[-1.39531,43.24596],[-1.40868,43.25591],[-1.52629,43.28099],[-1.54626,43.2737],[-1.57149,43.2412],[-1.61053,43.24223],[-1.65,43.29323],[-1.66953,43.30065],[-1.73359,43.28856],[-1.75606,43.31966],[-1.76297,43.32565],[-1.79156,43.34067],[-1.80099,43.37017],[-1.78509,43.39037],[-1.7835,43.39686],[-2.7,43.9]]],terms_url:"https://wiki.openstreetmap.org/wiki/WikiProject_Cadastre_Fran%C3%A7ais/Conditions_d%27utilisation",terms_text:"cadastre-dgi-fr source : Direction Générale des Impôts - Cadastre. Mise à jour : 2019",description:"French land registry",icon:"https://svn.openstreetmap.org/applications/editors/josm/plugins/cadastre-fr/images/cadastre_small.png"},{id:"lu.geoportail.opendata.cadastre",name:"Cadastre geoportail.lu",type:"tms",template:"https://{switch:wmts3,wmts4}.geoportail.lu/opendata/wmts/cadastre/GLOBAL_WEBMERCATOR_4_V3/{zoom}/{x}/{y}.png",zoomExtent:[0,20],polygon:[[[5.96175,50.17631],[6.02627,50.18496],[6.03318,50.16395],[6.06069,50.15536],[6.07668,50.15913],[6.07824,50.17255],[6.10176,50.17199],[6.1225,50.16437],[6.1201,50.15594],[6.1277,50.14993],[6.11323,50.13739],[6.12369,50.13719],[6.14093,50.1305],[6.13555,50.11899],[6.13808,50.10263],[6.13108,50.09964],[6.13547,50.09119],[6.12194,50.09059],[6.12634,50.07817],[6.13186,50.07348],[6.12117,50.064],[6.11444,50.06139],[6.11563,50.05817],[6.12361,50.06323],[6.13661,50.04178],[6.13034,50.02975],[6.14821,50.02307],[6.13868,50.01572],[6.13594,50.01485],[6.13138,50.01905],[6.13024,50.01819],[6.13934,50.01116],[6.1517,50.01058],[6.14546,49.99689],[6.13966,49.9994],[6.13852,49.99829],[6.14218,49.99535],[6.15023,49.99518],[6.15625,49.98867],[6.17305,49.98589],[6.17348,49.98344],[6.17035,49.98376],[6.16549,49.97115],[6.17151,49.96298],[6.1763,49.962],[6.17995,49.95386],[6.18339,49.9548],[6.17983,49.96307],[6.18331,49.9686],[6.19277,49.97158],[6.19978,49.95352],[6.20707,49.95672],[6.21269,49.9514],[6.22502,49.95039],[6.22044,49.94369],[6.22824,49.93726],[6.22635,49.92766],[6.21913,49.92354],[6.22986,49.92125],[6.23603,49.91355],[6.23187,49.91064],[6.22769,49.91062],[6.23229,49.9072],[6.23381,49.90028],[6.24692,49.89535],[6.25781,49.88724],[6.26301,49.88101],[6.27646,49.87725],[6.28113,49.87957],[6.29166,49.87548],[6.2977,49.86673],[6.30989,49.87107],[6.31532,49.8673],[6.31465,49.86057],[6.32361,49.85188],[6.32158,49.8409],[6.32741,49.83673],[6.33656,49.83998],[6.33937,49.8507],[6.36465,49.85164],[6.4022,49.82098],[6.42643,49.81629],[6.42807,49.81186],[6.43097,49.81129],[6.44161,49.81547],[6.44344,49.81233],[6.45366,49.81275],[6.46454,49.81975],[6.47057,49.82385],[6.49681,49.81277],[6.50669,49.80993],[6.51155,49.80238],[6.51485,49.80513],[6.5196,49.81446],[6.52981,49.81048],[6.53225,49.80686],[6.53083,49.80116],[6.50622,49.78899],[6.51917,49.78344],[6.51105,49.77422],[6.52056,49.76818],[6.52052,49.76134],[6.50373,49.75086],[6.50263,49.73298],[6.50727,49.72938],[6.51809,49.7242],[6.51642,49.72129],[6.51176,49.72016],[6.50479,49.725],[6.49891,49.72639],[6.49558,49.72443],[6.50712,49.71655],[6.50788,49.71215],[6.5046,49.71227],[6.42714,49.66237],[6.4399,49.66025],[6.44251,49.65591],[6.42178,49.61809],[6.39898,49.60094],[6.37941,49.59526],[6.37551,49.58809],[6.38443,49.5801],[6.38119,49.57509],[6.36909,49.5783],[6.35791,49.57166],[6.3849,49.55817],[6.38009,49.54856],[6.35855,49.53296],[6.35932,49.52481],[6.37076,49.50545],[6.37056,49.45732],[6.3334,49.46493],[6.32189,49.47244],[6.29503,49.47928],[6.28789,49.48379],[6.27191,49.49995],[6.24133,49.50693],[6.19669,49.50331],[6.17337,49.50577],[6.16086,49.50085],[6.1671,49.49006],[6.14018,49.48525],[6.12937,49.48803],[6.12725,49.47081],[6.1014,49.46726],[6.10483,49.45076],[6.08167,49.45417],[6.07722,49.46139],[6.05917,49.46306],[6.05222,49.46028],[6.04421,49.44553],[6.02529,49.44703],[6.02154,49.45127],[6.01574,49.44885],[5.99412,49.45301],[5.97657,49.44885],[5.97773,49.45955],[5.97232,49.46087],[5.96891,49.48202],[5.9616,49.49026],[5.91578,49.49835],[5.89033,49.4948],[5.86332,49.50006],[5.84897,49.50826],[5.84828,49.51397],[5.83641,49.51817],[5.83187,49.52639],[5.84308,49.53081],[5.83562,49.54114],[5.81625,49.53325],[5.8052,49.54272],[5.85943,49.57158],[5.86866,49.587],[5.86289,49.58525],[5.8511,49.58379],[5.84712,49.58961],[5.84565,49.5981],[5.8694,49.6106],[5.88182,49.63815],[5.89998,49.63907],[5.89934,49.66239],[5.85656,49.67628],[5.85628,49.68211],[5.8757,49.71118],[5.86481,49.72331],[5.84325,49.71822],[5.82191,49.72128],[5.82489,49.73767],[5.82073,49.74878],[5.78626,49.79079],[5.76517,49.78961],[5.75094,49.79094],[5.74159,49.82126],[5.74581,49.82435],[5.7372,49.83353],[5.74053,49.84142],[5.74701,49.84048],[5.74624,49.84783],[5.75399,49.84878],[5.74066,49.85152],[5.75229,49.85922],[5.74955,49.87554],[5.77567,49.87438],[5.77505,49.88057],[5.7346,49.89341],[5.73303,49.90285],[5.75783,49.91737],[5.76039,49.93252],[5.77073,49.93711],[5.76878,49.94239],[5.7688,49.96104],[5.78672,49.96816],[5.80524,49.96677],[5.80652,49.97321],[5.83129,49.97995],[5.83462,49.98656],[5.81806,49.99936],[5.81561,50.01437],[5.84792,50.02809],[5.86189,50.04581],[5.85087,50.0563],[5.85781,50.07186],[5.881,50.08069],[5.89196,50.12041],[5.95286,50.13384],[5.96175,50.17631]]],terms_url:"https://data.public.lu/en/datasets/plan-cadastral-numerise-pcn-webservices-wms-et-wmts",terms_text:"Administration du Cadastre et de la Topographie",icon:"https://www.geoportail.lu/static/img/lion.png"},{id:"cajueiro_al",name:"Cajueiro AL",type:"wms",template:"http://geoserver.dados.al.gov.br:8080/geoserver/Alagoas/ows?LAYERS=Cajueiro&SERVICE=WMS&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.0&SERVICE=WMS&REQUEST=GetMap&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[-36.10753,-9.43884],[-36.10752,-9.43421],[-36.10767,-9.42959],[-36.10779,-9.42361],[-36.10769,-9.41927],[-36.10781,-9.41391],[-36.10803,-9.41094],[-36.1081,-9.40965],[-36.10811,-9.40747],[-36.10816,-9.40693],[-36.10819,-9.40418],[-36.10811,-9.40176],[-36.10817,-9.40002],[-36.10827,-9.39952],[-36.10827,-9.39646],[-36.10833,-9.39475],[-36.10832,-9.39273],[-36.10836,-9.3904],[-36.10841,-9.38447],[-36.10847,-9.38165],[-36.10846,-9.37767],[-36.10835,-9.37573],[-36.10845,-9.37432],[-36.10849,-9.37234],[-36.10845,-9.3697],[-36.10867,-9.36278],[-36.10863,-9.36102],[-36.10873,-9.35928],[-36.10874,-9.35736],[-36.10855,-9.35479],[-36.1087,-9.3523],[-36.10871,-9.34996],[-36.10873,-9.34893],[-36.11269,-9.34908],[-36.11726,-9.34912],[-36.12138,-9.34905],[-36.12806,-9.3491],[-36.13217,-9.34906],[-36.13694,-9.34915],[-36.14025,-9.34914],[-36.14134,-9.34932],[-36.14458,-9.34916],[-36.14684,-9.34914],[-36.14842,-9.34905],[-36.15276,-9.34907],[-36.154,-9.34922],[-36.15627,-9.34923],[-36.16026,-9.34921],[-36.16086,-9.34929],[-36.166,-9.34933],[-36.16938,-9.34942],[-36.17176,-9.34936],[-36.17628,-9.34945],[-36.18028,-9.34937],[-36.18227,-9.34946],[-36.18826,-9.34938],[-36.19039,-9.34945],[-36.19354,-9.34946],[-36.19552,-9.34941],[-36.19918,-9.34951],[-36.19926,-9.35146],[-36.19913,-9.35234],[-36.19912,-9.35353],[-36.19919,-9.35646],[-36.19922,-9.35771],[-36.1993,-9.35832],[-36.19933,-9.36112],[-36.19922,-9.36177],[-36.19918,-9.36258],[-36.19931,-9.364],[-36.19926,-9.36499],[-36.19922,-9.36563],[-36.19928,-9.3666],[-36.19917,-9.36796],[-36.19917,-9.36868],[-36.19922,-9.36911],[-36.19912,-9.37017],[-36.19887,-9.37149],[-36.19886,-9.37264],[-36.19902,-9.37322],[-36.19915,-9.37504],[-36.19911,-9.37688],[-36.19896,-9.37747],[-36.19899,-9.37915],[-36.19917,-9.38053],[-36.19919,-9.38124],[-36.19926,-9.38175],[-36.19928,-9.38302],[-36.19913,-9.38374],[-36.19908,-9.38592],[-36.19879,-9.38787],[-36.19881,-9.38935],[-36.19902,-9.39092],[-36.19904,-9.392],[-36.19899,-9.39348],[-36.1988,-9.39451],[-36.19867,-9.39705],[-36.19845,-9.39949],[-36.19864,-9.40313],[-36.19866,-9.40476],[-36.19865,-9.40836],[-36.19875,-9.40902],[-36.19857,-9.41058],[-36.19859,-9.41273],[-36.19874,-9.41446],[-36.19868,-9.41711],[-36.1986,-9.41902],[-36.19846,-9.41965],[-36.1985,-9.42235],[-36.19871,-9.42429],[-36.19858,-9.42697],[-36.1984,-9.42895],[-36.19857,-9.43412],[-36.19871,-9.4347],[-36.19865,-9.43595],[-36.19857,-9.43626],[-36.19859,-9.43667],[-36.19876,-9.43749],[-36.19889,-9.43905],[-36.19882,-9.43995],[-36.1785,-9.43977],[-36.17718,-9.43968],[-36.17265,-9.43967],[-36.17099,-9.43971],[-36.16396,-9.43963],[-36.15386,-9.4395],[-36.13983,-9.4393],[-36.12875,-9.43913],[-36.11497,-9.43892],[-36.10753,-9.43884]]],terms_url:"http://www.seplag.al.gov.br",terms_text:"Secretaria de Estado do Planejamento, Gestão e Patrimônio"},{id:"osm-cambodia_laos_thailand_vietnam-bilingual",name:"Cambodia, Laos, Thailand, Vietnam, Malaysia, Myanmar bilingual",type:"tms",template:"https://{switch:a,b,c,d}.tile.osm-tools.org/osm/{zoom}/{x}/{y}.png",zoomExtent:[0,20],polygon:[[[92.10238,20.81356],[93.56905,24.09755],[94.1733,23.92695],[95.19503,26.70727],[96.75509,27.52867],[97.58456,28.5806],[98.73812,27.51405],[98.74362,25.87992],[97.67794,24.75774],[97.96359,24.04238],[98.82052,24.16272],[99.52364,22.95934],[100.36959,21.50514],[101.79232,22.48305],[105.36288,23.33311],[106.81857,22.84801],[108.19735,21.36197],[107.43895,18.85398],[117.14537,7.46562],[119.6173,5.28754],[118.12315,4.05023],[117.25523,4.36249],[115.86546,4.34606],[115.50841,3.02498],[114.5526,1.5101],[113.54186,1.25748],[112.96507,1.5705],[112.24547,1.5101],[111.67418,1.01583],[110.4547,0.90049],[109.49889,1.9219],[103.22569,1.12568],[100.46263,3.23889],[97.6721,8.05888],[93.89281,15.93987],[92.10238,20.81356]]],terms_url:"http://www.osm-tools.org",terms_text:"© osm-tools.org & OpenStreetMap contributors, CC-BY-SA"},{id:"campo_alegre_al",name:"Campo Alegre AL",type:"wms",template:"http://geoserver.dados.al.gov.br:8080/geoserver/Alagoas/ows?LAYERS=Campo%20Alegre&SERVICE=WMS&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.0&SERVICE=WMS&REQUEST=GetMap&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[-36.30643,-9.82332],[-36.30603,-9.78597],[-36.30602,-9.78263],[-36.30609,-9.78168],[-36.30604,-9.78081],[-36.3059,-9.77531],[-36.30586,-9.76496],[-36.30545,-9.73336],[-36.39634,-9.73248],[-36.39627,-9.73744],[-36.39636,-9.74336],[-36.39644,-9.75535],[-36.3966,-9.75856],[-36.39665,-9.75979],[-36.39655,-9.76244],[-36.39661,-9.76489],[-36.39658,-9.76648],[-36.39661,-9.76684],[-36.39659,-9.7696],[-36.3967,-9.77896],[-36.39675,-9.78464],[-36.39684,-9.79067],[-36.39693,-9.79681],[-36.39703,-9.80298],[-36.39719,-9.82033],[-36.39722,-9.82234],[-36.39392,-9.82233],[-36.35375,-9.82279],[-36.34822,-9.82286],[-36.31697,-9.82317],[-36.31191,-9.82324],[-36.30879,-9.82327],[-36.30643,-9.82332]]],terms_url:"http://www.seplag.al.gov.br",terms_text:"Secretaria de Estado do Planejamento, Gestão e Patrimônio"},{id:"canaan_drone_red_cross_201712",name:"Canaan - American Red Cross, Dec-2017",type:"tms",template:"https://tiles.openaerialmap.org/5ac65a9f91b5310010e0d489/0/5ac65a9f91b5310010e0d48a/{zoom}/{x}/{y}.png",endDate:"2017-12-20T00:00:00.000Z",startDate:"2017-12-11T00:00:00.000Z",zoomExtent:[0,21],polygon:[[[-72.26734,18.63561],[-72.2636,18.6373],[-72.26116,18.64141],[-72.25983,18.64588],[-72.25811,18.64742],[-72.24502,18.64795],[-72.23433,18.64807],[-72.22734,18.6482],[-72.21953,18.65438],[-72.2161,18.65446],[-72.21584,18.66222],[-72.21725,18.66739],[-72.21889,18.67019],[-72.22309,18.66958],[-72.22343,18.67312],[-72.22502,18.6732],[-72.22545,18.67609],[-72.23288,18.67597],[-72.23339,18.67877],[-72.23674,18.67857],[-72.23854,18.67975],[-72.24,18.68129],[-72.24463,18.68207],[-72.24682,18.6817],[-72.24605,18.67698],[-72.25094,18.67698],[-72.25511,18.67902],[-72.25961,18.67898],[-72.26081,18.67743],[-72.27038,18.67711],[-72.27901,18.67682],[-72.28373,18.67893],[-72.28613,18.68154],[-72.29665,18.68178],[-72.30184,18.68568],[-72.3012,18.68824],[-72.30802,18.69324],[-72.30948,18.69308],[-72.31699,18.69682],[-72.32806,18.70528],[-72.3384,18.69902],[-72.34012,18.69666],[-72.33961,18.69426],[-72.33377,18.68357],[-72.33135,18.68192],[-72.32551,18.68093],[-72.32027,18.67741],[-72.31626,18.67477],[-72.31167,18.672],[-72.308,18.66995],[-72.30534,18.66926],[-72.30068,18.66499],[-72.29796,18.66479],[-72.29609,18.66129],[-72.29315,18.65999],[-72.29519,18.65497],[-72.28414,18.64962],[-72.27804,18.64523],[-72.27487,18.64212],[-72.27352,18.64057],[-72.2706,18.63901],[-72.26734,18.63561]]],terms_url:"http://americanredcross.github.io/",terms_text:"American Red Cross",description:"Drone imagery collected December 2017 for Canaan, Haiti by American Red Cross in coordination with the Haitian Red Cross."},{id:"Geneve-SITG-2011",name:"Canton de Génève 5cm (SITG 2011)",type:"wms",template:"https://ge.ch/ags2/services/Orthophotos_2011/MapServer/WMSServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&Layers=0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2011-01-01T00:00:00.000Z",startDate:"2011-01-01T00:00:00.000Z",polygon:[[[6.18221,46.22618],[6.18348,46.22772],[6.18929,46.23329],[6.19196,46.23858],[6.19253,46.24239],[6.19061,46.24397],[6.19046,46.24654],[6.19256,46.25045],[6.19186,46.25262],[6.19325,46.256],[6.19287,46.25776],[6.19543,46.26181],[6.1979,46.26454],[6.20045,46.26569],[6.20917,46.26634],[6.21716,46.27388],[6.22046,46.27895],[6.2275,46.28649],[6.23433,46.28955],[6.23643,46.2932],[6.24074,46.29774],[6.23958,46.30396],[6.2413,46.30529],[6.2432,46.30453],[6.24513,46.30492],[6.24627,46.30372],[6.24983,46.3027],[6.25032,46.3014],[6.24938,46.30018],[6.25146,46.29647],[6.25063,46.29451],[6.25223,46.29382],[6.25429,46.2907],[6.25231,46.28735],[6.25032,46.2868],[6.24974,46.28574],[6.24636,46.28433],[6.24323,46.28428],[6.23985,46.28098],[6.23934,46.27627],[6.24372,46.27356],[6.25113,46.26258],[6.26244,46.2553],[6.26301,46.25457],[6.262,46.25215],[6.26736,46.24887],[6.27732,46.25211],[6.27725,46.25298],[6.2832,46.25503],[6.28231,46.25568],[6.28278,46.25677],[6.28868,46.26046],[6.29154,46.2644],[6.29457,46.26556],[6.29729,46.26489],[6.29783,46.2631],[6.29541,46.25827],[6.29663,46.2566],[6.3024,46.2558],[6.30678,46.25753],[6.311,46.25666],[6.30768,46.25184],[6.31046,46.25057],[6.31011,46.24749],[6.31156,46.24386],[6.29606,46.22501],[6.29012,46.22241],[6.27773,46.21493],[6.26707,46.21276],[6.25668,46.20926],[6.25089,46.20574],[6.25076,46.20456],[6.2495,46.20404],[6.24643,46.20454],[6.24251,46.20364],[6.23594,46.20541],[6.23347,46.20509],[6.22889,46.20172],[6.22323,46.20005],[6.22355,46.19881],[6.22257,46.19791],[6.21935,46.19765],[6.21688,46.19448],[6.21259,46.19189],[6.20727,46.19137],[6.20588,46.18908],[6.2034,46.18806],[6.20282,46.18642],[6.20035,46.18504],[6.19905,46.18296],[6.19615,46.18288],[6.1885,46.17967],[6.18751,46.17539],[6.18982,46.16584],[6.1748,46.15694],[6.1688,46.15624],[6.15829,46.15195],[6.15434,46.15141],[6.14952,46.14933],[6.14805,46.14748],[6.14832,46.14619],[6.14561,46.14417],[6.14244,46.14493],[6.13768,46.14217],[6.13692,46.14071],[6.13074,46.13946],[6.12598,46.13966],[6.12014,46.14181],[6.1077,46.14203],[6.10537,46.14313],[6.09746,46.14325],[6.09151,46.15095],[6.07476,46.14795],[6.07188,46.14908],[6.05295,46.15046],[6.04973,46.1468],[6.04862,46.14153],[6.04571,46.13916],[6.04287,46.14006],[6.04013,46.13894],[6.03783,46.13716],[6.03647,46.13381],[6.03531,46.13344],[6.03,46.13816],[6.02079,46.14024],[6.01693,46.14191],[6.01282,46.14119],[6.00814,46.14171],[6.00364,46.14088],[5.99338,46.1432],[5.98728,46.14171],[5.98464,46.14232],[5.98309,46.13712],[5.97603,46.1319],[5.97314,46.13081],[5.97037,46.13108],[5.96536,46.12882],[5.96163,46.12976],[5.9573,46.12767],[5.95575,46.12836],[5.95484,46.13214],[5.9589,46.13553],[5.96446,46.13738],[5.96517,46.13845],[5.9631,46.14241],[5.96383,46.14656],[5.97157,46.1558],[5.97884,46.16721],[5.98022,46.17354],[5.98322,46.17507],[5.98537,46.17478],[5.98754,46.17306],[5.99029,46.17955],[5.9936,46.18203],[5.98976,46.18692],[5.98287,46.18822],[5.98068,46.1904],[5.96282,46.1963],[5.96225,46.19719],[5.96465,46.20022],[5.97164,46.20302],[5.96985,46.20383],[5.96794,46.20675],[5.97227,46.21418],[5.97364,46.21563],[5.97897,46.21821],[6.00857,46.24444],[6.01422,46.24855],[6.06593,46.28345],[6.11511,46.31511],[6.12573,46.31843],[6.12972,46.31568],[6.12978,46.31407],[6.13604,46.30896],[6.14179,46.30555],[6.15393,46.30014],[6.17157,46.29507],[6.17125,46.29223],[6.17277,46.28629],[6.17018,46.28533],[6.16834,46.28109],[6.17201,46.27554],[6.1722,46.27301],[6.1691,46.26785],[6.16746,46.26217],[6.16531,46.26195],[6.16455,46.26274],[6.15943,46.25898],[6.15532,46.25216],[6.15387,46.25212],[6.15273,46.25037],[6.15311,46.2477],[6.15494,46.24591],[6.1521,46.23878],[6.15217,46.23273],[6.15034,46.22659],[6.15454,46.22191],[6.15483,46.22044],[6.15296,46.21738],[6.154,46.21355],[6.1571,46.21097],[6.16263,46.21043],[6.16387,46.2097],[6.16911,46.21191],[6.16867,46.21318],[6.17073,46.21478],[6.17471,46.21603],[6.18221,46.22618]],[[6.18834,46.34901],[6.18696,46.34862],[6.18195,46.35015],[6.17961,46.352],[6.17142,46.35444],[6.17022,46.35911],[6.17415,46.36036],[6.17272,46.36189],[6.17348,46.36288],[6.17999,46.36547],[6.1877,46.36132],[6.19447,46.36175],[6.19905,46.36086],[6.20113,46.35634],[6.20258,46.35567],[6.20791,46.35583],[6.21374,46.35379],[6.21247,46.35085],[6.20846,46.34665],[6.2086,46.33991],[6.20659,46.33792],[6.20493,46.33861],[6.20348,46.33793],[6.19181,46.34333],[6.19318,46.34787],[6.19076,46.3477],[6.18834,46.34901]],[[6.18182,46.34281],[6.18016,46.34318],[6.1752,46.34532],[6.17341,46.34398],[6.17324,46.34054],[6.1714,46.33952],[6.16588,46.34254],[6.16564,46.34339],[6.17091,46.35054],[6.17341,46.35029],[6.17458,46.35192],[6.17587,46.35205],[6.18579,46.34593],[6.18182,46.34281]]],terms_url:"http://ge.ch/sitg/donnees/conditions-d-utilisation/open-data",terms_text:"Orthophotos du SITG 2011"},{id:"CTFRIBOURG2016",name:"Canton Fribourg 2016",type:"tms",template:"https://mapproxy.osm.ch/tiles/fribourg_2016/EPSG900913/{zoom}/{x}/{y}.png?origin=nw",endDate:"2016-01-01T00:00:00.000Z",startDate:"2016-01-01T00:00:00.000Z",zoomExtent:[1,21],polygon:[[[6.79478,46.57542],[6.79949,46.57407],[6.80256,46.57491],[6.80336,46.57687],[6.80427,46.57664],[6.80489,46.57792],[6.80794,46.57761],[6.8094,46.57885],[6.81084,46.57896],[6.81322,46.57823],[6.81153,46.58099],[6.8142,46.58396],[6.81411,46.58567],[6.8206,46.58368],[6.82371,46.57747],[6.82693,46.57796],[6.82927,46.57637],[6.83485,46.57533],[6.83744,46.57677],[6.83691,46.57748],[6.83982,46.57896],[6.84239,46.58244],[6.84532,46.58276],[6.84644,46.58394],[6.84857,46.58331],[6.85087,46.58113],[6.85262,46.58197],[6.85996,46.57987],[6.86554,46.57725],[6.86507,46.57623],[6.8679,46.57515],[6.87446,46.56497],[6.8845,46.56195],[6.88686,46.56341],[6.89214,46.5679],[6.89918,46.56671],[6.89885,46.56499],[6.89393,46.55991],[6.88822,46.55815],[6.86839,46.54164],[6.86498,46.53896],[6.86015,46.53597],[6.85563,46.54086],[6.85501,46.54144],[6.85087,46.54111],[6.8407,46.53819],[6.83032,46.53744],[6.82783,46.54298],[6.82553,46.54357],[6.81278,46.52707],[6.81088,46.52513],[6.81534,46.52139],[6.8181,46.5165],[6.82263,46.51411],[6.82429,46.51207],[6.83034,46.51246],[6.83239,46.50544],[6.83503,46.50231],[6.84126,46.49706],[6.84294,46.49632],[6.84554,46.49667],[6.84775,46.49369],[6.84891,46.49337],[6.85729,46.49305],[6.86276,46.49384],[6.86634,46.50079],[6.87244,46.50431],[6.88168,46.51257],[6.8967,46.52044],[6.89773,46.52005],[6.89711,46.51766],[6.89767,46.51483],[6.89522,46.51079],[6.89572,46.50773],[6.89974,46.51039],[6.90142,46.51233],[6.92517,46.50769],[6.92759,46.50467],[6.93363,46.50167],[6.93674,46.50096],[6.95614,46.49949],[6.97239,46.48879],[6.97581,46.4784],[6.97783,46.47289],[6.97815,46.46833],[6.97906,46.46107],[6.98016,46.45896],[6.99212,46.44891],[6.98361,46.43873],[6.98394,46.43799],[6.98746,46.43794],[7.01786,46.44707],[7.02103,46.45729],[7.06583,46.48904],[7.0724,46.4864],[7.10037,46.48699],[7.12279,46.49869],[7.1264,46.50317],[7.13096,46.50466],[7.13624,46.50861],[7.13704,46.51308],[7.14005,46.51688],[7.14044,46.51988],[7.14318,46.52183],[7.1437,46.52475],[7.1453,46.52701],[7.14835,46.52846],[7.15834,46.52681],[7.16346,46.52855],[7.16709,46.53101],[7.18234,46.53837],[7.19218,46.54656],[7.20081,46.54169],[7.20108,46.543],[7.20765,46.53291],[7.21417,46.53762],[7.21811,46.54211],[7.22171,46.54481],[7.22311,46.5476],[7.22543,46.54923],[7.2322,46.55123],[7.23614,46.554],[7.24047,46.55424],[7.24705,46.55623],[7.25574,46.56029],[7.26385,46.56752],[7.2681,46.57369],[7.28136,46.58411],[7.2992,46.5791],[7.30805,46.58132],[7.31254,46.58917],[7.3207,46.59183],[7.31479,46.60042],[7.3162,46.60937],[7.31826,46.61615],[7.3178,46.61856],[7.31213,46.6217],[7.31327,46.63662],[7.32284,46.63731],[7.32684,46.63873],[7.32975,46.64171],[7.32787,46.64616],[7.321,46.65465],[7.32345,46.65526],[7.32914,46.65459],[7.33116,46.65522],[7.33403,46.65471],[7.34549,46.6553],[7.34756,46.65307],[7.35063,46.65164],[7.35079,46.64799],[7.35456,46.64669],[7.3558,46.64533],[7.35528,46.64193],[7.35714,46.63927],[7.35877,46.64418],[7.36209,46.64683],[7.36229,46.64791],[7.36608,46.64898],[7.37747,46.65636],[7.36933,46.65564],[7.36953,46.65748],[7.37103,46.65907],[7.37083,46.66085],[7.37187,46.66283],[7.37122,46.66375],[7.37252,46.66757],[7.37108,46.66942],[7.37649,46.67503],[7.37293,46.68012],[7.37777,46.68357],[7.37587,46.68645],[7.376,46.6878],[7.38027,46.69018],[7.37693,46.69272],[7.3686,46.69265],[7.3649,46.69505],[7.36261,46.69928],[7.3598,46.69802],[7.34598,46.69895],[7.34604,46.7019],[7.34939,46.70555],[7.35037,46.70874],[7.35021,46.71119],[7.34903,46.71249],[7.34065,46.71464],[7.33277,46.71491],[7.32868,46.71641],[7.31011,46.71815],[7.30785,46.71717],[7.30002,46.72247],[7.29683,46.72737],[7.29685,46.73565],[7.29834,46.74013],[7.30304,46.74517],[7.30454,46.74816],[7.30486,46.75026],[7.30335,46.7514],[7.30309,46.75261],[7.30359,46.75919],[7.29987,46.76375],[7.29881,46.76513],[7.29307,46.77136],[7.29532,46.77537],[7.29639,46.77729],[7.30081,46.77905],[7.30053,46.78064],[7.30113,46.78134],[7.30447,46.78321],[7.30447,46.78415],[7.30207,46.78638],[7.30351,46.78887],[7.30201,46.79079],[7.30159,46.79283],[7.30732,46.79872],[7.31044,46.80823],[7.31537,46.81246],[7.32028,46.8149],[7.32047,46.81564],[7.32072,46.82011],[7.31981,46.82515],[7.32891,46.829],[7.3302,46.82968],[7.33123,46.83177],[7.33103,46.8328],[7.32926,46.83563],[7.32333,46.84041],[7.30755,46.84704],[7.30775,46.84808],[7.30613,46.84999],[7.31207,46.85557],[7.31351,46.85936],[7.31739,46.8606],[7.32087,46.86154],[7.32576,46.85681],[7.323,46.85476],[7.32603,46.85163],[7.33181,46.8512],[7.33536,46.85043],[7.33678,46.84979],[7.33821,46.84946],[7.34726,46.85375],[7.34934,46.85331],[7.35167,46.85502],[7.35444,46.85875],[7.35772,46.86065],[7.35925,46.86311],[7.35794,46.86513],[7.35838,46.8688],[7.35738,46.8701],[7.35386,46.87129],[7.35253,46.87555],[7.35339,46.88676],[7.34843,46.88934],[7.32573,46.89373],[7.30935,46.89152],[7.29618,46.89377],[7.28938,46.89377],[7.28639,46.89269],[7.28245,46.8898],[7.2802,46.8896],[7.27259,46.89249],[7.26634,46.89361],[7.25931,46.89797],[7.24433,46.90037],[7.24314,46.89792],[7.23633,46.89809],[7.23203,46.90029],[7.2309,46.9024],[7.23032,46.90394],[7.22351,46.90276],[7.21755,46.89735],[7.21244,46.90173],[7.2088,46.9026],[7.20781,46.90913],[7.20578,46.91477],[7.20692,46.92481],[7.2111,46.92527],[7.21854,46.92434],[7.2342,46.92939],[7.23411,46.93669],[7.23477,46.93827],[7.2302,46.93995],[7.2282,46.93881],[7.22555,46.93633],[7.2174,46.93307],[7.2093,46.93334],[7.20823,46.93323],[7.2058,46.94023],[7.2055,46.94112],[7.20951,46.94188],[7.21027,46.94302],[7.21044,46.94569],[7.21011,46.94781],[7.20885,46.95435],[7.21102,46.95652],[7.20838,46.95768],[7.20742,46.95967],[7.19764,46.96065],[7.19459,46.96135],[7.19463,46.9629],[7.19552,46.96416],[7.19633,46.96365],[7.19794,46.96445],[7.1993,46.9638],[7.20646,46.96413],[7.20745,46.96751],[7.21422,46.96692],[7.21467,46.97133],[7.21739,46.97147],[7.21686,46.97271],[7.22247,46.97454],[7.22163,46.97556],[7.22821,46.97836],[7.23569,46.98456],[7.23486,46.98675],[7.22594,46.9924],[7.22625,46.99868],[7.22575,46.99915],[7.21779,47.00641],[7.21299,47.0068],[7.09058,46.978],[7.03295,46.98265],[6.73785,46.81195],[6.73908,46.71021],[6.81908,46.65533],[6.82741,46.65982],[6.82089,46.65179],[6.81729,46.64923],[6.81851,46.6478],[6.81458,46.64747],[6.81344,46.64953],[6.81194,46.6492],[6.81081,46.65038],[6.80674,46.65059],[6.80203,46.64889],[6.79891,46.64914],[6.79879,46.64781],[6.80367,46.64567],[6.80325,46.6448],[6.8038,46.64451],[6.80321,46.64376],[6.80171,46.64421],[6.79895,46.63959],[6.79692,46.63314],[6.79838,46.63016],[6.80043,46.62991],[6.80065,46.62843],[6.80172,46.62854],[6.80228,46.62775],[6.80197,46.62507],[6.80355,46.62124],[6.80244,46.61877],[6.80296,46.61615],[6.80185,46.61555],[6.80389,46.60903],[6.80239,46.60142],[6.79833,46.59986],[6.8002,46.59362],[6.80124,46.5925],[6.79848,46.58616],[6.79948,46.58559],[6.79894,46.58205],[6.79611,46.57932],[6.79626,46.57728],[6.79478,46.57542]]],terms_text:"Canton Fribourg 2016 'orthophoto technique'",description:"This imagery is provided via a proxy operated by https://sosm.ch/"},{id:"Canvec",name:"Canvec - English",type:"wms",template:"https://maps.geogratis.gc.ca/wms/canvec_en?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=canvec&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[-141.0678,60.2442],[-139.3842,60.10331],[-137.4746,58.82791],[-135.4766,59.65971],[-134.399,58.86279],[-132.5239,57.08342],[-130.1435,55.27452],[-130.7734,54.75597],[-132.4355,54.71514],[-134.5711,54.38827],[-141.7761,53.58405],[-128.9768,46.41459],[-124.8087,48.42976],[-123.4286,48.17889],[-123.0256,48.40444],[-123.19237,48.65504],[-122.99582,48.51065],[-122.4869,48.4098],[-122.32915,48.4528],[-122.22939,48.50649],[-122.17908,48.52965],[-122.1842,48.5669],[-121.77833,48.57593],[-121.66578,48.42791],[-121.33068,48.35714],[-121.02713,48.34977],[-121.03054,48.49406],[-120.698,48.51497],[-120.51041,48.8718],[-119.97579,48.88134],[-119.95447,48.51497],[-119.90758,48.29421],[-119.73193,48.15503],[-119.74386,48.07419],[-119.62279,48.10951],[-119.60232,48.14707],[-119.25273,48.16243],[-114.1499,48.99487],[-95.12094,48.98405],[-95.13419,49.35564],[-94.94415,49.34356],[-94.8839,49.29522],[-94.71704,48.87631],[-94.71791,48.7485],[-93.83204,48.49765],[-93.43778,48.53066],[-93.38216,48.59507],[-92.98471,48.60312],[-92.73847,48.50725],[-92.7095,48.42081],[-92.54293,48.40158],[-92.38361,48.20406],[-92.11564,48.27641],[-91.58697,48.02516],[-91.24658,48.05422],[-90.86275,48.20889],[-90.78308,48.0639],[-90.0774,48.07435],[-89.93835,47.96584],[-89.75469,47.99609],[-89.32745,47.93943],[-88.41489,48.26677],[-84.9566,46.86086],[-84.84795,46.6762],[-84.55904,46.45441],[-84.47642,46.44972],[-84.43758,46.48872],[-84.3669,46.5055],[-84.34899,46.5055],[-84.29026,46.49077],[-84.25742,46.49386],[-84.22507,46.53187],[-84.1962,46.53804],[-84.18027,46.52468],[-84.15987,46.52468],[-84.13449,46.52879],[-84.11558,46.50653],[-84.15944,46.42769],[-84.10024,46.20338],[-83.95558,46.05132],[-83.8864,46.06125],[-83.8203,46.11181],[-83.76975,46.09563],[-83.67498,46.11391],[-83.58084,46.09921],[-83.44747,45.99521],[-83.60888,45.81772],[-82.14271,43.57905],[-82.39133,43.06666],[-82.41252,43.01127],[-82.42522,42.99864],[-82.42618,42.99374],[-82.42363,42.98536],[-82.41503,42.97697],[-82.41853,42.96578],[-82.43064,42.95203],[-82.44911,42.93711],[-82.45739,42.92568],[-82.46472,42.90562],[-82.47228,42.8877],[-82.47228,42.84743],[-82.48536,42.80967],[-82.46844,42.76365],[-82.48586,42.73697],[-82.49155,42.71168],[-82.51488,42.66652],[-82.51224,42.63893],[-82.52421,42.61103],[-82.56854,42.58184],[-82.59498,42.55148],[-82.61286,42.56409],[-82.65158,42.55707],[-82.83439,42.3763],[-83.01489,42.33457],[-83.07244,42.31502],[-83.09647,42.29542],[-83.12823,42.24126],[-83.14167,42.18582],[-83.12799,42.12172],[-83.16266,42.04963],[-83.05136,41.70911],[-82.41932,41.6377],[-81.22563,42.19633],[-80.06688,42.37121],[-78.86642,42.825],[-78.90301,42.92307],[-78.92063,42.95234],[-78.93331,42.95708],[-78.96058,42.9595],[-78.98479,42.9761],[-79.01825,42.9964],[-79.01969,43.01561],[-79.00695,43.0333],[-78.99599,43.06448],[-79.07335,43.07876],[-79.07286,43.083],[-79.0652,43.0917],[-79.05623,43.10825],[-79.05982,43.11563],[-79.06764,43.11992],[-79.05411,43.12801],[-79.04112,43.13986],[-79.04465,43.16192],[-79.05101,43.17037],[-79.04758,43.19974],[-79.05511,43.25682],[-79.18688,43.44858],[-78.68836,43.62502],[-76.77647,43.61369],[-76.41665,44.08498],[-75.49023,44.70772],[-75.29544,44.82587],[-75.16845,44.88548],[-75.1275,44.8975],[-75.00499,44.95265],[-74.98159,44.97728],[-74.90496,44.98222],[-74.8313,45.01108],[-74.77954,45.00158],[-74.74562,44.98526],[-74.70475,44.99877],[-74.49079,44.99343],[-74.23203,44.98552],[-73.93713,44.99512],[-73.01809,45.0121],[-72.63177,45.0121],[-72.54779,45.00506],[-72.32259,45.00286],[-71.49404,45.01093],[-71.48648,45.06221],[-71.42303,45.12765],[-71.43112,45.14037],[-71.37175,45.22117],[-71.28959,45.28578],[-71.23613,45.24302],[-71.11683,45.22933],[-71.0531,45.29866],[-70.98936,45.31088],[-70.90246,45.22525],[-70.82473,45.22714],[-70.77626,45.40013],[-70.7119,45.3754],[-70.63387,45.37346],[-70.60302,45.41179],[-70.67659,45.56319],[-70.3752,45.73075],[-70.36334,45.82013],[-70.25417,45.87468],[-70.22569,45.94403],[-70.27316,45.99022],[-70.17586,46.33538],[-70.06195,46.4107],[-69.98891,46.69363],[-69.22424,47.44463],[-69.06999,47.41092],[-69.07473,47.24202],[-68.89684,47.17469],[-68.78685,47.21493],[-68.72415,47.23217],[-68.68583,47.24028],[-68.66044,47.23183],[-68.62162,47.24028],[-68.59425,47.24974],[-68.59226,47.27001],[-68.57385,47.28486],[-68.55941,47.2798],[-68.542,47.2798],[-68.51214,47.29195],[-68.47381,47.29229],[-68.46038,47.28149],[-68.43898,47.27777],[-68.37229,47.2825],[-68.3703,47.34796],[-68.33173,47.35822],[-68.29664,47.352],[-68.2399,47.34897],[-68.0906,47.26798],[-68.00002,47.21223],[-67.96344,47.19753],[-67.93582,47.15947],[-67.88619,47.10424],[-67.80218,47.06386],[-67.79415,45.93923],[-67.82753,45.8489],[-67.82753,45.6704],[-67.54943,45.57445],[-67.45302,45.58742],[-67.44189,45.52251],[-67.54201,45.49393],[-67.4456,45.38726],[-67.51605,45.29343],[-67.38257,45.11839],[-67.3047,45.11316],[-67.26762,45.18116],[-67.12671,45.09484],[-66.94835,44.78406],[-66.52283,43.61294],[-65.02339,42.10691],[-42.53366,47.50263],[-75.90901,77.3176],[-71.86482,78.7359],[-67.20011,80.66812],[-66.20727,80.78637],[-54.82473,83.07464],[-57.62518,85.04043],[-106.7949,85.04625],[-141.3957,79.2514],[-141.0678,60.2442]]]},{id:"Canvec_French",name:"Canvec - French",type:"wms",template:"https://maps.geogratis.gc.ca/wms/canvec_fr?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=canvec&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[-141.0678,60.2442],[-139.3842,60.10331],[-137.4746,58.82791],[-135.4766,59.65971],[-134.399,58.86279],[-132.5239,57.08342],[-130.1435,55.27452],[-130.7734,54.75597],[-132.4355,54.71514],[-134.5711,54.38827],[-141.7761,53.58405],[-128.9768,46.41459],[-124.8087,48.42976],[-123.4286,48.17889],[-123.0256,48.40444],[-123.19237,48.65504],[-122.99582,48.51065],[-122.4869,48.4098],[-122.32915,48.4528],[-122.22939,48.50649],[-122.17908,48.52965],[-122.1842,48.5669],[-121.77833,48.57593],[-121.66578,48.42791],[-121.33068,48.35714],[-121.02713,48.34977],[-121.03054,48.49406],[-120.698,48.51497],[-120.51041,48.8718],[-119.97579,48.88134],[-119.95447,48.51497],[-119.90758,48.29421],[-119.73193,48.15503],[-119.74386,48.07419],[-119.62279,48.10951],[-119.60232,48.14707],[-119.25273,48.16243],[-114.1499,48.99487],[-95.12094,48.98405],[-95.13419,49.35564],[-94.94415,49.34356],[-94.8839,49.29522],[-94.71704,48.87631],[-94.71791,48.7485],[-93.83204,48.49765],[-93.43778,48.53066],[-93.38216,48.59507],[-92.98471,48.60312],[-92.73847,48.50725],[-92.7095,48.42081],[-92.54293,48.40158],[-92.38361,48.20406],[-92.11564,48.27641],[-91.58697,48.02516],[-91.24658,48.05422],[-90.86275,48.20889],[-90.78308,48.0639],[-90.0774,48.07435],[-89.93835,47.96584],[-89.75469,47.99609],[-89.32745,47.93943],[-88.41489,48.26677],[-84.9566,46.86086],[-84.84795,46.6762],[-84.55904,46.45441],[-84.47642,46.44972],[-84.43758,46.48872],[-84.3669,46.5055],[-84.34899,46.5055],[-84.29026,46.49077],[-84.25742,46.49386],[-84.22507,46.53187],[-84.1962,46.53804],[-84.18027,46.52468],[-84.15987,46.52468],[-84.13449,46.52879],[-84.11558,46.50653],[-84.15944,46.42769],[-84.10024,46.20338],[-83.95558,46.05132],[-83.8864,46.06125],[-83.8203,46.11181],[-83.76975,46.09563],[-83.67498,46.11391],[-83.58084,46.09921],[-83.44747,45.99521],[-83.60888,45.81772],[-82.14271,43.57905],[-82.39133,43.06666],[-82.41252,43.01127],[-82.42522,42.99864],[-82.42618,42.99374],[-82.42363,42.98536],[-82.41503,42.97697],[-82.41853,42.96578],[-82.43064,42.95203],[-82.44911,42.93711],[-82.45739,42.92568],[-82.46472,42.90562],[-82.47228,42.8877],[-82.47228,42.84743],[-82.48536,42.80967],[-82.46844,42.76365],[-82.48586,42.73697],[-82.49155,42.71168],[-82.51488,42.66652],[-82.51224,42.63893],[-82.52421,42.61103],[-82.56854,42.58184],[-82.59498,42.55148],[-82.61286,42.56409],[-82.65158,42.55707],[-82.83439,42.3763],[-83.01489,42.33457],[-83.07244,42.31502],[-83.09647,42.29542],[-83.12823,42.24126],[-83.14167,42.18582],[-83.12799,42.12172],[-83.16266,42.04963],[-83.05136,41.70911],[-82.41932,41.6377],[-81.22563,42.19633],[-80.06688,42.37121],[-78.86642,42.825],[-78.90301,42.92307],[-78.92063,42.95234],[-78.93331,42.95708],[-78.96058,42.9595],[-78.98479,42.9761],[-79.01825,42.9964],[-79.01969,43.01561],[-79.00695,43.0333],[-78.99599,43.06448],[-79.07335,43.07876],[-79.07286,43.083],[-79.0652,43.0917],[-79.05623,43.10825],[-79.05982,43.11563],[-79.06764,43.11992],[-79.05411,43.12801],[-79.04112,43.13986],[-79.04465,43.16192],[-79.05101,43.17037],[-79.04758,43.19974],[-79.05511,43.25682],[-79.18688,43.44858],[-78.68836,43.62502],[-76.77647,43.61369],[-76.41665,44.08498],[-75.49023,44.70772],[-75.29544,44.82587],[-75.16845,44.88548],[-75.1275,44.8975],[-75.00499,44.95265],[-74.98159,44.97728],[-74.90496,44.98222],[-74.8313,45.01108],[-74.77954,45.00158],[-74.74562,44.98526],[-74.70475,44.99877],[-74.49079,44.99343],[-74.23203,44.98552],[-73.93713,44.99512],[-73.01809,45.0121],[-72.63177,45.0121],[-72.54779,45.00506],[-72.32259,45.00286],[-71.49404,45.01093],[-71.48648,45.06221],[-71.42303,45.12765],[-71.43112,45.14037],[-71.37175,45.22117],[-71.28959,45.28578],[-71.23613,45.24302],[-71.11683,45.22933],[-71.0531,45.29866],[-70.98936,45.31088],[-70.90246,45.22525],[-70.82473,45.22714],[-70.77626,45.40013],[-70.7119,45.3754],[-70.63387,45.37346],[-70.60302,45.41179],[-70.67659,45.56319],[-70.3752,45.73075],[-70.36334,45.82013],[-70.25417,45.87468],[-70.22569,45.94403],[-70.27316,45.99022],[-70.17586,46.33538],[-70.06195,46.4107],[-69.98891,46.69363],[-69.22424,47.44463],[-69.06999,47.41092],[-69.07473,47.24202],[-68.89684,47.17469],[-68.78685,47.21493],[-68.72415,47.23217],[-68.68583,47.24028],[-68.66044,47.23183],[-68.62162,47.24028],[-68.59425,47.24974],[-68.59226,47.27001],[-68.57385,47.28486],[-68.55941,47.2798],[-68.542,47.2798],[-68.51214,47.29195],[-68.47381,47.29229],[-68.46038,47.28149],[-68.43898,47.27777],[-68.37229,47.2825],[-68.3703,47.34796],[-68.33173,47.35822],[-68.29664,47.352],[-68.2399,47.34897],[-68.0906,47.26798],[-68.00002,47.21223],[-67.96344,47.19753],[-67.93582,47.15947],[-67.88619,47.10424],[-67.80218,47.06386],[-67.79415,45.93923],[-67.82753,45.8489],[-67.82753,45.6704],[-67.54943,45.57445],[-67.45302,45.58742],[-67.44189,45.52251],[-67.54201,45.49393],[-67.4456,45.38726],[-67.51605,45.29343],[-67.38257,45.11839],[-67.3047,45.11316],[-67.26762,45.18116],[-67.12671,45.09484],[-66.94835,44.78406],[-66.52283,43.61294],[-65.02339,42.10691],[-42.53366,47.50263],[-75.90901,77.3176],[-71.86482,78.7359],[-67.20011,80.66812],[-66.20727,80.78637],[-54.82473,83.07464],[-57.62518,85.04043],[-106.7949,85.04625],[-141.3957,79.2514],[-141.0678,60.2442]]]},{id:"capela_al",name:"Capela AL",type:"wms",template:"http://geoserver.dados.al.gov.br:8080/geoserver/Alagoas/ows?LAYERS=Capela&SERVICE=WMS&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.0&SERVICE=WMS&REQUEST=GetMap&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[-36.03321,-9.45741],[-36.03322,-9.45581],[-36.03336,-9.45483],[-36.0334,-9.45291],[-36.03327,-9.45141],[-36.03336,-9.44287],[-36.0335,-9.43821],[-36.03353,-9.42881],[-36.03363,-9.42027],[-36.03389,-9.41091],[-36.03389,-9.40032],[-36.03401,-9.3888],[-36.03413,-9.38528],[-36.03428,-9.38265],[-36.03417,-9.37849],[-36.03444,-9.36688],[-36.05246,-9.3671],[-36.05791,-9.36711],[-36.0716,-9.36727],[-36.08622,-9.36731],[-36.103,-9.3675],[-36.11652,-9.36755],[-36.12515,-9.36768],[-36.12522,-9.37473],[-36.12521,-9.37721],[-36.12511,-9.38038],[-36.12514,-9.38529],[-36.12505,-9.39026],[-36.12504,-9.39477],[-36.12506,-9.40172],[-36.12499,-9.40382],[-36.1248,-9.40679],[-36.12463,-9.41123],[-36.12474,-9.4136],[-36.12456,-9.4163],[-36.12459,-9.42461],[-36.12466,-9.42691],[-36.12465,-9.42925],[-36.12457,-9.4297],[-36.12464,-9.43538],[-36.12438,-9.44109],[-36.12446,-9.44387],[-36.12452,-9.44579],[-36.12438,-9.44736],[-36.12448,-9.44856],[-36.12448,-9.45095],[-36.12436,-9.45392],[-36.12434,-9.45791],[-36.11758,-9.45783],[-36.1089,-9.45778],[-36.10419,-9.4578],[-36.10116,-9.45773],[-36.0953,-9.45773],[-36.08461,-9.45767],[-36.07361,-9.45757],[-36.05726,-9.45741],[-36.04816,-9.45747],[-36.04177,-9.45739],[-36.03767,-9.45739],[-36.03321,-9.45741]]],terms_url:"http://www.seplag.al.gov.br",terms_text:"Secretaria de Estado do Planejamento, Gestão e Patrimônio"},{id:"COS2010_v1.0",name:"Carta de Uso do Solo 2010 (WMS)",type:"wms",template:"http://mapas.dgterritorio.pt/wms-inspire/cos2010v1?language=por&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=COS2010_v1.0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2010-01-01T00:00:00.000Z",startDate:"2010-01-01T00:00:00.000Z",zoomExtent:[14,18],polygon:[[[-7.31278,36.98391],[-7.44461,37.5718],[-7.1933,37.97019],[-6.97357,38.00807],[-6.90628,38.24142],[-7.06627,38.20743],[-7.27158,38.45628],[-7.20429,38.72356],[-7.0134,38.85468],[-6.91315,39.03839],[-6.97357,39.13113],[-7.17957,39.23651],[-7.28668,39.48497],[-7.44873,39.61838],[-7.34162,39.60886],[-6.99692,39.64906],[-6.81839,40.0192],[-7.01065,40.19986],[-6.85272,40.24285],[-6.76209,40.35073],[-6.77994,40.8886],[-6.88637,41.01151],[-6.79642,41.01721],[-6.63849,41.21689],[-6.4531,41.24116],[-6.29311,41.38763],[-6.15715,41.5908],[-6.31165,41.68932],[-6.51215,41.71188],[-6.49841,41.88081],[-6.56296,41.97991],[-6.80191,42.00951],[-7.20497,42.00135],[-7.22763,41.8849],[-7.36908,41.87058],[-7.72751,41.92885],[-7.92526,41.94009],[-8.07907,41.84706],[-8.1601,41.91812],[-8.01796,42.05031],[-8.19924,42.18681],[-8.39356,42.1023],[-8.66066,42.07886],[-8.88382,41.88081],[-9.17084,41.86956],[-9.04175,41.43655],[-9.01978,40.65981],[-9.15711,40.26695],[-9.81903,39.52099],[-9.74213,38.6512],[-9.12964,37.88136],[-9.27246,36.99378],[-9.09394,36.68604],[-7.80579,36.74989],[-7.31278,36.98391]]],terms_url:"http://www.dgterritorio.pt/dados_abertos/cos/",terms_text:"Direcção-Geral do Território",icon:"http://www.igeo.pt/favicon.ico"},{id:"Cartoriviera-2012",name:"Cartoriviera - Orthophoto 2012",type:"tms",template:"http://osmdata.asitvd.ch/tiles/cartoriviera2012/{zoom}/{x}/{y}.png",endDate:"2012-01-01T00:00:00.000Z",startDate:"2012-01-01T00:00:00.000Z",zoomExtent:[14,20],polygon:[[[7.02235,46.42856],[7.0224,46.42045],[7.02176,46.41955],[7.02225,46.41954],[7.02161,46.41749],[7.02242,46.4174],[7.02242,46.41681],[7.02113,46.41443],[7.02164,46.41259],[7.0216,46.41188],[7.01918,46.41055],[7.01896,46.41004],[7.01757,46.40826],[7.01426,46.40696],[7.00948,46.40695],[7.00952,46.40451],[7.00368,46.40153],[6.97052,46.40139],[6.97056,46.39354],[6.96507,46.38333],[6.89379,46.383],[6.89327,46.39209],[6.8968,46.4],[6.89678,46.40097],[6.89395,46.401],[6.89768,46.40888],[6.89246,46.41386],[6.89237,46.41807],[6.8949,46.4193],[6.89285,46.41948],[6.89395,46.42312],[6.89225,46.42339],[6.89219,46.42802],[6.88743,46.428],[6.87652,46.43163],[6.86624,46.43633],[6.84003,46.44591],[6.83504,46.44934],[6.827,46.45204],[6.82695,46.45379],[6.81953,46.45655],[6.80361,46.45993],[6.78775,46.46253],[6.78697,46.5246],[6.82604,46.5248],[6.82609,46.52662],[6.83907,46.5267],[6.83888,46.55006],[6.90658,46.55042],[6.912,46.54301],[6.91083,46.53983],[6.90979,46.53512],[6.90931,46.53517],[6.90867,46.53373],[6.91195,46.53297],[6.91335,46.53604],[6.9268,46.53364],[6.92723,46.5349],[6.93714,46.53311],[6.93691,46.5327],[6.94028,46.53196],[6.94164,46.53477],[6.94309,46.53455],[6.94345,46.53528],[6.95641,46.53003],[6.95632,46.52733],[6.95111,46.52725],[6.95301,46.52611],[6.94341,46.52605],[6.94343,46.52546],[7.01629,46.52568],[7.02158,46.52211],[7.02196,46.47355],[7.07099,46.47368],[7.07402,46.4719],[7.07383,46.4326],[7.05947,46.43233],[7.05278,46.42879],[7.02235,46.42856]]],terms_url:"https://map.cartoriviera.ch/?baselayer_ref=orthos_2012_mobile&baselayer_opacity=100",terms_text:"Cartoriviera"},{id:"Catastro-Spain",name:"Catastro Spain",type:"wms",template:"http://ovc.catastro.meh.es/Cartografia/WMS/ServidorWMS.aspx?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&Layers=Catastro&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[-17.88463,28.44606],[-17.89395,28.52255],[-18.02125,28.74819],[-18.02241,28.80384],[-17.9424,28.87261],[-17.89118,28.87371],[-17.89033,28.85151],[-17.76759,28.85378],[-17.76698,28.83122],[-17.74127,28.832],[-17.73949,28.76422],[-17.71398,28.76497],[-17.71293,28.73037],[-17.75744,28.69318],[-17.75708,28.67413],[-17.74579,28.67435],[-17.74573,28.61656],[-17.75197,28.58337],[-17.76225,28.5592],[-17.78331,28.54167],[-17.78316,28.49366],[-17.80861,28.4925],[-17.80601,28.4469],[-17.88463,28.44606]],[[-18.1661,27.78516],[-18.16349,27.69492],[-18.08898,27.69634],[-18.08734,27.67387],[-18.03641,27.67537],[-18.03501,27.63026],[-17.959,27.6324],[-17.86033,27.7926],[-17.86303,27.83688],[-17.8884,27.83649],[-17.88913,27.85905],[-17.99065,27.85675],[-18.03868,27.76558],[-18.11464,27.76379],[-18.11546,27.78636],[-18.1661,27.78516]],[[-17.36038,28.06398],[-17.36297,28.17572],[-17.33756,28.17637],[-17.33846,28.2213],[-17.18579,28.22388],[-17.08208,28.13518],[-17.08084,28.068],[-17.13154,28.06681],[-17.15633,28.02146],[-17.23211,28.02037],[-17.23199,27.99804],[-17.25768,27.99784],[-17.25785,28.01997],[-17.30867,28.01923],[-17.36038,28.06398]],[[-16.92782,28.32758],[-16.92866,28.37219],[-16.87767,28.37293],[-16.87807,28.39542],[-16.52143,28.42261],[-16.44571,28.49113],[-16.44625,28.53597],[-16.42059,28.53627],[-16.42092,28.55884],[-16.34433,28.55976],[-16.3446,28.58221],[-16.19125,28.58372],[-16.19162,28.60684],[-16.12793,28.60782],[-16.1278,28.59218],[-16.09951,28.5925],[-16.09934,28.51638],[-16.16481,28.51612],[-16.16475,28.49386],[-16.23858,28.44847],[-16.26535,28.44761],[-16.26586,28.403],[-16.31675,28.40176],[-16.31631,28.38019],[-16.34208,28.37951],[-16.34083,28.2893],[-16.41584,28.19761],[-16.4151,28.13113],[-16.51533,28.01648],[-16.61684,28.01532],[-16.61681,27.99305],[-16.71842,27.99192],[-16.7191,28.03714],[-16.7447,28.03679],[-16.74534,28.08181],[-16.7707,28.08161],[-16.8224,28.1259],[-16.82317,28.17087],[-16.8487,28.17075],[-16.85028,28.26079],[-16.87565,28.26055],[-16.87608,28.28322],[-16.90151,28.28277],[-16.90239,28.32793],[-16.92782,28.32758]],[[-15.85374,27.90089],[-15.8542,27.99018],[-15.82895,27.99066],[-15.82911,28.03558],[-15.7783,28.03632],[-15.75328,28.08143],[-15.72788,28.08157],[-15.72826,28.17186],[-15.49897,28.1728],[-15.49874,28.15041],[-15.44978,28.15075],[-15.45016,28.19614],[-15.39728,28.19614],[-15.39644,28.03836],[-15.37103,28.03802],[-15.37065,28.01532],[-15.34578,28.01532],[-15.34548,27.92544],[-15.3708,27.92524],[-15.37057,27.83521],[-15.39598,27.83474],[-15.421,27.78797],[-15.47181,27.78939],[-15.47188,27.76665],[-15.52277,27.76678],[-15.54771,27.72161],[-15.62361,27.72134],[-15.62415,27.74199],[-15.70075,27.74335],[-15.80167,27.81105],[-15.85374,27.90089]],[[-14.52156,28.04678],[-14.52244,28.11841],[-14.41575,28.11561],[-14.21688,28.22788],[-14.21537,28.33903],[-14.16417,28.45283],[-14.11151,28.4748],[-14.03358,28.72267],[-13.95652,28.74494],[-13.95617,28.76659],[-13.82902,28.76643],[-13.82896,28.78798],[-13.80007,28.78793],[-13.8013,28.71899],[-13.82757,28.71935],[-13.82786,28.6518],[-13.80258,28.6519],[-13.80339,28.53842],[-13.82885,28.53847],[-13.83151,28.39702],[-13.91582,28.22414],[-13.98564,28.22357],[-14.03696,28.17958],[-14.13871,28.17999],[-14.13866,28.15791],[-14.21537,28.15781],[-14.21472,28.11189],[-14.29132,28.04524],[-14.33197,28.03687],[-14.44578,28.04698],[-14.44666,28.0658],[-14.49628,28.06826],[-14.49593,28.04585],[-14.52156,28.04678]],[[-13.80066,28.84566],[-13.80093,28.82311],[-13.77569,28.82305],[-13.69729,28.88982],[-13.69729,28.91277],[-13.60725,28.9118],[-13.43886,29.00024],[-13.43746,29.13513],[-13.4117,29.13499],[-13.41056,29.22298],[-13.45928,29.25559],[-13.45974,29.2942],[-13.50913,29.29456],[-13.51006,29.31635],[-13.56354,29.31729],[-13.56406,29.27138],[-13.53892,29.2712],[-13.53897,29.25004],[-13.56613,29.25013],[-13.5666,29.203],[-13.51565,29.20223],[-13.51565,29.18206],[-13.5398,29.18278],[-13.54089,29.13753],[-13.65782,29.13685],[-13.71322,29.09351],[-13.76634,29.09345],[-13.85025,29.01659],[-13.85182,28.98343],[-13.85244,28.91486],[-13.90131,28.89245],[-13.9024,28.84698],[-13.80066,28.84566]],[[1.64799,38.99907],[1.73217,38.99936],[1.73147,39.04417],[1.64895,39.04319],[1.64816,39.12764],[1.39486,39.12657],[1.39544,39.08642],[1.22811,39.08526],[1.22911,39.0029],[1.14487,39.0018],[1.14528,38.832],[1.31136,38.83316],[1.31219,38.79065],[1.39469,38.79162],[1.39519,38.75296],[1.31128,38.75193],[1.31259,38.62388],[1.6489,38.62511],[1.64807,38.71115],[1.58456,38.71012],[1.58116,38.70054],[1.54915,38.70028],[1.51972,38.70921],[1.50355,38.72532],[1.48133,38.91551],[1.55189,38.92544],[1.56673,38.95666],[1.64874,38.95833],[1.64799,38.99907]],[[2.54507,39.41667],[2.43933,39.41611],[2.43871,39.48469],[2.43902,39.49934],[2.31223,39.49934],[2.31192,39.54179],[2.22907,39.541],[2.22835,39.62606],[2.34601,39.62709],[2.92704,39.96016],[3.14566,39.96005],[3.14608,40.00198],[3.23139,40.00198],[3.23129,39.83292],[3.14823,39.83316],[3.14844,39.79357],[3.48148,39.79318],[3.48035,39.5959],[3.31506,39.47846],[3.31462,39.37855],[3.08302,39.24994],[2.97986,39.25015],[2.97904,39.3335],[2.72874,39.33342],[2.72885,39.45814],[2.64569,39.45774],[2.64538,39.49966],[2.54528,39.49942],[2.54507,39.41667]],[[3.81204,40.04344],[3.72908,40.0438],[3.72862,39.95842],[3.81266,39.9576],[3.81228,39.91644],[3.9609,39.91598],[4.19381,39.79131],[4.31503,39.79058],[4.31599,39.83293],[4.39874,39.83204],[4.39737,39.91858],[4.3158,39.91933],[4.31619,40.0434],[4.2319,40.04436],[4.23248,40.08478],[4.14915,40.08611],[4.14906,40.12552],[4.0628,40.12722],[4.06242,40.08499],[3.81287,40.08529],[3.81204,40.04344]],[[-8.89106,41.82289],[-9.1092,42.57511],[-9.03655,42.73066],[-9.08834,42.72696],[-9.14661,42.77503],[-9.21855,42.90163],[-9.2761,42.86051],[-9.30991,42.93113],[-9.27898,42.9822],[-9.30991,43.06004],[-9.25236,43.10417],[-9.2315,43.17032],[-9.14733,43.21018],[-9.06748,43.19916],[-9.03367,43.24267],[-8.99842,43.24477],[-8.99986,43.29558],[-8.93727,43.30553],[-8.92936,43.32699],[-8.8639,43.32908],[-8.87613,43.37407],[-8.82217,43.37354],[-8.78548,43.31914],[-8.70635,43.305],[-8.60996,43.3296],[-8.55097,43.32332],[-8.52435,43.3364],[-8.52507,43.36465],[-8.45745,43.39184],[-8.36105,43.41118],[-8.36033,43.46342],[-8.33444,43.57974],[-8.27761,43.57088],[-8.06467,43.72392],[-7.99921,43.7234],[-7.9172,43.78264],[-7.85605,43.79146],[-7.83591,43.73743],[-7.66284,43.80982],[-7.31889,43.67827],[-7.19975,43.58308],[-6.24882,43.6075],[-6.12293,43.57901],[-5.85204,43.6799],[-5.60363,43.57087],[-5.28553,43.56191],[-5.17875,43.49916],[-4.90899,43.48367],[-4.61562,43.4192],[-4.18399,43.42492],[-3.80295,43.51954],[-3.74,43.48693],[-3.56128,43.54236],[-3.1083,43.38163],[-2.93857,43.46246],[-2.74524,43.47551],[-2.30462,43.31706],[-1.9854,43.3563],[-1.85528,43.39725],[-1.7698,43.39644],[-1.77005,43.37605],[-1.71005,43.37569],[-1.71135,43.33125],[-1.72259,43.31318],[-1.68904,43.31291],[-1.68811,43.33413],[-1.64467,43.33372],[-1.64498,43.31332],[-1.60299,43.31295],[-1.60344,43.29266],[-1.56359,43.29212],[-1.56305,43.31338],[-1.47799,43.31284],[-1.36677,43.27614],[-1.35688,43.23815],[-1.37037,43.1713],[-1.44231,43.08336],[-1.41983,43.06036],[-1.37307,43.05117],[-1.36407,43.11159],[-1.30203,43.13522],[-1.23549,43.13325],[-1.27955,43.07744],[-1.19232,43.06496],[-1.00619,43.00778],[-0.94234,42.9749],[-0.7562,42.98213],[-0.71484,42.96108],[-0.69685,42.90314],[-0.55118,42.82207],[-0.50442,42.84845],[-0.42889,42.82009],[-0.31648,42.86558],[-0.14563,42.81086],[-0.03143,42.71249],[0.18618,42.7541],[0.30218,42.71777],[0.36422,42.74287],[0.44875,42.71447],[0.62769,42.7224],[0.64118,42.85767],[0.71492,42.88272],[0.9676,42.81811],[1.10878,42.79898],[1.17532,42.73429],[1.36326,42.74155],[1.41137,42.70939],[1.48061,42.71034],[1.4813,42.50107],[1.64436,42.50203],[1.64328,42.54245],[1.73041,42.54342],[1.73164,42.50118],[2.06386,42.50164],[2.06456,42.45902],[2.39693,42.45994],[2.39768,42.41784],[2.48048,42.41797],[2.48098,42.37594],[2.64479,42.37626],[2.64448,42.45924],[2.81133,42.45961],[2.81126,42.50104],[3.06388,42.50085],[3.06388,42.45915],[3.23078,42.45934],[3.23049,42.37644],[3.31415,42.37604],[3.31412,42.33399],[3.39785,42.33404],[3.39739,42.29009],[3.31389,42.29084],[3.31397,42.20702],[3.14759,42.2073],[3.14759,42.12606],[3.23055,42.126],[3.24668,41.95294],[3.19452,41.85589],[3.06054,41.76474],[2.78358,41.63718],[2.26293,41.42716],[2.16492,41.29893],[1.86008,41.22322],[1.3763,41.11627],[1.17937,41.04646],[1.08585,41.04849],[0.75854,40.81956],[0.9114,40.73376],[0.87813,40.67514],[0.66502,40.53587],[0.55801,40.55022],[0.43392,40.37576],[0.26756,40.19192],[0.16415,40.06472],[0.07513,40.01447],[0.01039,39.89522],[-0.09392,39.81169],[-0.18474,39.63117],[-0.29085,39.50363],[-0.28636,39.33343],[-0.18564,39.17746],[-0.21352,39.15585],[-0.11101,38.97222],[0.00949,38.88268],[0.12189,38.87218],[0.23429,38.79864],[0.25587,38.72642],[0.09581,38.61338],[-0.0022,38.60706],[-0.05705,38.52691],[-0.27197,38.47624],[-0.37987,38.39312],[-0.38347,38.33813],[-0.45091,38.33108],[-0.50487,38.28309],[-0.48238,38.19481],[-0.42933,38.16583],[-0.45451,38.14886],[-0.584,38.17219],[-0.61367,38.11986],[-0.63705,37.96122],[-0.68111,37.94562],[-0.73237,37.88107],[-0.72158,37.78306],[-0.68831,37.734],[-0.66415,37.62315],[-0.71939,37.58784],[-0.91963,37.53758],[-1.11071,37.51641],[-1.33832,37.52867],[-1.44089,37.39037],[-1.6767,37.27652],[-1.85408,36.91229],[-2.06835,36.69291],[-2.21588,36.66192],[-2.37219,36.78018],[-2.68129,36.65911],[-2.92015,36.66756],[-3.09402,36.71263],[-3.46108,36.65488],[-3.72804,36.69291],[-4.37435,36.66333],[-4.65712,36.44042],[-4.9188,36.45313],[-5.16995,36.35135],[-5.28411,36.19702],[-5.26809,36.12418],[-5.35248,36.12247],[-5.35161,36.04014],[-5.43658,36.03889],[-5.43532,36.00344],[-5.68886,36.00365],[-5.68996,36.04053],[-5.85506,36.03856],[-5.85668,36.12421],[-5.93848,36.12215],[-5.94003,36.16556],[-5.99834,36.1645],[-6.03573,36.1781],[-6.07752,36.22241],[-6.15061,36.28646],[-6.23154,36.37701],[-6.33585,36.53106],[-6.32146,36.58163],[-6.40419,36.6235],[-6.47433,36.74897],[-6.41588,36.79939],[-6.49052,36.91738],[-6.62989,37.0194],[-6.87448,37.10838],[-7.04264,37.18507],[-7.26474,37.18435],[-7.37535,37.15354],[-7.40832,37.16822],[-7.42029,37.21183],[-7.42492,37.23505],[-7.43805,37.2452],[-7.44597,37.33261],[-7.4481,37.39094],[-7.46963,37.40758],[-7.4647,37.45305],[-7.50197,37.51641],[-7.51916,37.52292],[-7.52196,37.57237],[-7.45013,37.66958],[-7.4249,37.75992],[-7.31666,37.83997],[-7.26833,37.98895],[-7.15368,38.01552],[-7.11771,38.05536],[-7.0143,38.02438],[-6.99632,38.10756],[-6.96147,38.20125],[-7.08062,38.15708],[-7.34027,38.44024],[-7.26383,38.73807],[-7.04352,38.87297],[-7.06151,38.90796],[-6.96934,39.01983],[-7.00081,39.08879],[-7.15368,39.09577],[-7.15255,39.16029],[-7.24472,39.19689],[-7.25596,39.28133],[-7.33689,39.35351],[-7.3279,39.45599],[-7.51449,39.58865],[-7.55271,39.67954],[-7.05027,39.67522],[-6.99519,39.81954],[-6.92213,39.87909],[-6.88616,40.02299],[-7.04128,40.13479],[-7.01767,40.26615],[-6.8086,40.34501],[-6.86818,40.44516],[-6.85356,40.60664],[-6.83783,40.87576],[-6.9536,41.03704],[-6.80186,41.03959],[-6.76814,41.13871],[-6.64112,41.26556],[-6.56244,41.26303],[-6.21737,41.5791],[-6.31628,41.64465],[-6.51523,41.64129],[-6.58717,41.68832],[-6.54783,41.85597],[-6.62988,41.91121],[-7.13345,41.94048],[-7.16829,41.87188],[-7.42569,41.78477],[-7.95398,41.84593],[-8.13045,41.78058],[-8.25185,41.90786],[-8.12933,42.03488],[-8.24848,42.1008],[-8.36762,42.05575],[-8.60704,42.03405],[-8.89106,41.82289]]]},{id:"Chorzow-buildings",name:"Chorzów: Buildings",type:"wms",template:"http://e-odgik.chorzow.eu/services/wms/wms_funkcje_bud/MapServer/WMSServer?FORMAT=image/png&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=3,2,1,8,7,6&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",polygon:[[[18.94562,50.31836],[18.94349,50.32385],[18.95466,50.32599],[18.96426,50.33307],[18.96521,50.33777],[18.98692,50.33621],[18.98468,50.32501],[18.99777,50.32204],[18.99686,50.31716],[18.98774,50.31736],[18.98695,50.30989],[18.99736,50.30031],[18.99744,50.29722],[19.00546,50.29548],[19.0073,50.28342],[19.00574,50.27871],[18.99236,50.27091],[18.96792,50.28661],[18.96215,50.27972],[18.96169,50.27337],[18.95824,50.27291],[18.95492,50.26193],[18.96014,50.24927],[18.95672,50.2452],[18.95555,50.23891],[18.94132,50.243],[18.93475,50.25314],[18.93324,50.26032],[18.93262,50.26588],[18.9296,50.26774],[18.92976,50.27131],[18.92669,50.27289],[18.92632,50.27623],[18.93071,50.27619],[18.93437,50.28729],[18.92383,50.29533],[18.92635,50.29986],[18.91905,50.30212],[18.91955,50.30576],[18.92463,50.31192],[18.9262,50.31883],[18.94562,50.31836]]],terms_text:"Urząd Miasta Chorzowa"},{id:"South_Africa-CapeTown-Aerial-2013",name:"City of Cape Town 2013 Aerial",type:"tms",template:"https://{switch:a,b,c}.coct.aerial.openstreetmap.org.za/layer/za_coct_aerial_2013/{zoom}/{x}/{y}.jpg",endDate:"2015-01-01T00:00:00.000Z",startDate:"2013-01-01T00:00:00.000Z",zoomExtent:[1,21],polygon:[[[18.44866,-33.89362],[18.44859,-33.90264],[18.4702,-33.90277],[18.48139,-33.84724],[18.44925,-33.80107],[18.42815,-33.73564],[18.43914,-33.71772],[18.40719,-33.65899],[18.33224,-33.57752],[18.33245,-33.55045],[18.354,-33.55059],[18.35425,-33.5236],[18.36524,-33.52366],[18.36503,-33.5148],[18.37601,-33.51477],[18.37605,-33.5058],[18.42966,-33.50594],[18.4297,-33.48785],[18.44049,-33.48789],[18.4406,-33.46988],[18.49437,-33.4701],[18.49433,-33.47916],[18.51583,-33.47917],[18.51574,-33.48819],[18.52647,-33.4883],[18.52632,-33.52435],[18.54793,-33.52443],[18.54795,-33.51539],[18.56937,-33.5155],[18.56937,-33.52448],[18.58012,-33.52453],[18.58007,-33.5426],[18.59078,-33.5426],[18.59074,-33.56064],[18.57995,-33.56053],[18.57988,-33.56962],[18.5907,-33.56962],[18.59065,-33.57868],[18.62301,-33.57873],[18.62292,-33.58773],[18.66597,-33.58789],[18.66593,-33.61493],[18.67672,-33.61497],[18.67658,-33.65103],[18.6873,-33.65102],[18.68734,-33.66004],[18.69807,-33.66009],[18.69807,-33.66907],[18.75204,-33.66925],[18.75208,-33.64219],[18.77364,-33.64225],[18.77371,-33.63319],[18.82746,-33.6333],[18.82752,-33.6603],[18.81667,-33.66029],[18.8166,-33.67832],[18.80581,-33.67831],[18.80581,-33.70539],[18.8274,-33.70544],[18.82733,-33.72347],[18.83812,-33.72343],[18.83804,-33.74139],[18.81652,-33.74137],[18.81637,-33.79551],[18.80559,-33.79551],[18.80551,-33.81357],[18.79476,-33.81355],[18.79472,-33.83154],[18.77311,-33.83152],[18.77313,-33.84052],[18.76236,-33.84052],[18.76227,-33.90359],[18.75146,-33.90352],[18.75108,-33.98478],[18.76191,-33.9848],[18.76178,-34.02988],[18.7726,-34.0299],[18.77258,-34.03891],[18.79403,-34.03894],[18.79388,-34.0407],[18.79845,-34.04119],[18.80324,-34.04118],[18.80341,-34.03892],[18.81594,-34.03897],[18.81634,-34.02993],[18.83798,-34.03165],[18.838,-34.03],[18.84842,-34.03001],[18.84847,-34.02185],[18.85993,-34.02347],[18.85986,-34.02101],[18.86827,-34.02208],[18.86819,-34.02117],[18.88546,-34.02343],[18.88518,-34.02132],[18.90252,-34.02103],[18.90258,-34.012],[18.91342,-34.012],[18.91348,-33.99396],[18.94588,-33.99403],[18.94586,-34.0031],[18.96743,-34.003],[18.96747,-34.01208],[18.97822,-34.01208],[18.97833,-34.02114],[18.98914,-34.02114],[18.98916,-34.03913],[19.00002,-34.03913],[19.00002,-34.05718],[19.01084,-34.05725],[19.01079,-34.08414],[19,-34.08413],[19.00002,-34.0932],[18.98915,-34.09317],[18.98918,-34.1022],[18.97832,-34.10218],[18.97832,-34.11123],[18.9675,-34.11121],[18.96749,-34.12925],[18.9566,-34.12924],[18.95656,-34.13824],[18.96742,-34.13831],[18.96742,-34.14732],[18.98918,-34.1473],[18.98918,-34.1653],[18.97827,-34.16529],[18.97832,-34.17429],[18.96742,-34.17427],[18.96746,-34.1833],[18.95656,-34.18332],[18.95656,-34.19236],[18.94574,-34.19232],[18.9457,-34.20132],[18.93487,-34.20137],[18.93489,-34.21933],[18.90236,-34.21935],[18.90176,-34.23626],[18.88784,-34.23735],[18.88942,-34.25541],[18.88059,-34.25534],[18.87927,-34.26443],[18.86969,-34.26441],[18.86971,-34.27344],[18.83714,-34.27342],[18.83712,-34.26438],[18.84802,-34.2644],[18.84803,-34.23739],[18.81549,-34.21028],[18.81565,-34.17413],[18.85488,-34.15627],[18.76176,-34.08405],[18.65337,-34.07748],[18.47974,-34.11012],[18.44637,-34.13423],[18.44445,-34.16409],[18.436,-34.16405],[18.43597,-34.18202],[18.44681,-34.18211],[18.44673,-34.19111],[18.46593,-34.19121],[18.48662,-34.24539],[18.47889,-34.25437],[18.486,-34.25437],[18.46771,-34.29941],[18.48922,-34.34458],[18.50011,-34.34458],[18.49992,-34.36262],[18.46743,-34.36251],[18.46737,-34.35349],[18.3916,-34.31707],[18.39177,-34.29002],[18.37016,-34.28087],[18.37068,-34.21789],[18.34923,-34.18162],[18.32747,-34.18149],[18.32767,-34.16346],[18.31187,-34.15438],[18.3114,-34.14353],[18.32367,-34.13469],[18.34993,-34.10421],[18.33932,-34.08828],[18.36125,-34.05972],[18.35505,-34.05538],[18.34275,-34.06433],[18.32,-34.06443],[18.29607,-34.04513],[18.30682,-34.02526],[18.32877,-34.0192],[18.32892,-34.00125],[18.33974,-34.00127],[18.3398,-33.98663],[18.36287,-33.97351],[18.36381,-33.92925],[18.37262,-33.92927],[18.37284,-33.91776],[18.39773,-33.89335],[18.44866,-33.89362]]],terms_url:"https://www.capetown.gov.za",terms_text:"City of Cape Town Aerial - OPENSTREETMAP USE ONLY",description:"OpenStreetMap use only. City of Cape Town Aerial ortho-photography of the municipal area. 12cm ground sample distance"},{id:"South_Africa-CapeTown-Aerial",name:"City of Cape Town 2015 Aerial",type:"tms",template:"https://{switch:a,b,c}.coct.aerial.openstreetmap.org.za/layer/za_coct_aerial_2015/{zoom}/{x}/{y}.jpg",endDate:"2016-01-01T00:00:00.000Z",startDate:"2015-01-01T00:00:00.000Z",zoomExtent:[1,21],polygon:[[[18.44866,-33.89362],[18.44859,-33.90264],[18.4702,-33.90277],[18.48139,-33.84724],[18.44925,-33.80107],[18.42815,-33.73564],[18.43914,-33.71772],[18.40719,-33.65899],[18.33224,-33.57752],[18.33245,-33.55045],[18.354,-33.55059],[18.35425,-33.5236],[18.36524,-33.52366],[18.36503,-33.5148],[18.37601,-33.51477],[18.37605,-33.5058],[18.42966,-33.50594],[18.4297,-33.48785],[18.44049,-33.48789],[18.4406,-33.46988],[18.49437,-33.4701],[18.49433,-33.47916],[18.51583,-33.47917],[18.51574,-33.48819],[18.52647,-33.4883],[18.52632,-33.52435],[18.54793,-33.52443],[18.54795,-33.51539],[18.56937,-33.5155],[18.56937,-33.52448],[18.58012,-33.52453],[18.58007,-33.5426],[18.59078,-33.5426],[18.59074,-33.56064],[18.57995,-33.56053],[18.57988,-33.56962],[18.5907,-33.56962],[18.59065,-33.57868],[18.62301,-33.57873],[18.62292,-33.58773],[18.66597,-33.58789],[18.66593,-33.61493],[18.67672,-33.61497],[18.67658,-33.65103],[18.6873,-33.65102],[18.68734,-33.66004],[18.69807,-33.66009],[18.69807,-33.66907],[18.75204,-33.66925],[18.75208,-33.64219],[18.77364,-33.64225],[18.77371,-33.63319],[18.82746,-33.6333],[18.82752,-33.6603],[18.81667,-33.66029],[18.8166,-33.67832],[18.80581,-33.67831],[18.80581,-33.70539],[18.8274,-33.70544],[18.82733,-33.72347],[18.83812,-33.72343],[18.83804,-33.74139],[18.81652,-33.74137],[18.81637,-33.79551],[18.80559,-33.79551],[18.80551,-33.81357],[18.79476,-33.81355],[18.79472,-33.83154],[18.77311,-33.83152],[18.77313,-33.84052],[18.76236,-33.84052],[18.76227,-33.90359],[18.75146,-33.90352],[18.75108,-33.98478],[18.76191,-33.9848],[18.76178,-34.02988],[18.7726,-34.0299],[18.77258,-34.03891],[18.79403,-34.03894],[18.79388,-34.0407],[18.79845,-34.04119],[18.80324,-34.04118],[18.80341,-34.03892],[18.81594,-34.03897],[18.81634,-34.02993],[18.83798,-34.03165],[18.838,-34.03],[18.84842,-34.03001],[18.84847,-34.02185],[18.85993,-34.02347],[18.85986,-34.02101],[18.86827,-34.02208],[18.86819,-34.02117],[18.88546,-34.02343],[18.88518,-34.02132],[18.90252,-34.02103],[18.90258,-34.012],[18.91342,-34.012],[18.91348,-33.99396],[18.94588,-33.99403],[18.94586,-34.0031],[18.96743,-34.003],[18.96747,-34.01208],[18.97822,-34.01208],[18.97833,-34.02114],[18.98914,-34.02114],[18.98916,-34.03913],[19.00002,-34.03913],[19.00002,-34.05718],[19.01084,-34.05725],[19.01079,-34.08414],[19,-34.08413],[19.00002,-34.0932],[18.98915,-34.09317],[18.98918,-34.1022],[18.97832,-34.10218],[18.97832,-34.11123],[18.9675,-34.11121],[18.96749,-34.12925],[18.9566,-34.12924],[18.95656,-34.13824],[18.96742,-34.13831],[18.96742,-34.14732],[18.98918,-34.1473],[18.98918,-34.1653],[18.97827,-34.16529],[18.97832,-34.17429],[18.96742,-34.17427],[18.96746,-34.1833],[18.95656,-34.18332],[18.95656,-34.19236],[18.94574,-34.19232],[18.9457,-34.20132],[18.93487,-34.20137],[18.93489,-34.21933],[18.90236,-34.21935],[18.90176,-34.23626],[18.88784,-34.23735],[18.88942,-34.25541],[18.88059,-34.25534],[18.87927,-34.26443],[18.86969,-34.26441],[18.86971,-34.27344],[18.83714,-34.27342],[18.83712,-34.26438],[18.84802,-34.2644],[18.84803,-34.23739],[18.81549,-34.21028],[18.81565,-34.17413],[18.85488,-34.15627],[18.76176,-34.08405],[18.65337,-34.07748],[18.47974,-34.11012],[18.44637,-34.13423],[18.44445,-34.16409],[18.436,-34.16405],[18.43597,-34.18202],[18.44681,-34.18211],[18.44673,-34.19111],[18.46593,-34.19121],[18.48662,-34.24539],[18.47889,-34.25437],[18.486,-34.25437],[18.46771,-34.29941],[18.48922,-34.34458],[18.50011,-34.34458],[18.49992,-34.36262],[18.46743,-34.36251],[18.46737,-34.35349],[18.3916,-34.31707],[18.39177,-34.29002],[18.37016,-34.28087],[18.37068,-34.21789],[18.34923,-34.18162],[18.32747,-34.18149],[18.32767,-34.16346],[18.31187,-34.15438],[18.3114,-34.14353],[18.32367,-34.13469],[18.34993,-34.10421],[18.33932,-34.08828],[18.36125,-34.05972],[18.35505,-34.05538],[18.34275,-34.06433],[18.32,-34.06443],[18.29607,-34.04513],[18.30682,-34.02526],[18.32877,-34.0192],[18.32892,-34.00125],[18.33974,-34.00127],[18.3398,-33.98663],[18.36287,-33.97351],[18.36381,-33.92925],[18.37262,-33.92927],[18.37284,-33.91776],[18.39773,-33.89335],[18.44866,-33.89362]]],terms_url:"https://www.capetown.gov.za",terms_text:"City of Cape Town Aerial - OPENSTREETMAP USE ONLY",best:true,description:"OpenStreetMap use only. City of Cape Town Aerial ortho-photography of the municipal area. 8cm ground sample distance"},{id:"City_of_Melbourne_May_2018",name:"City of Melbourne",type:"tms",template:"https://{switch:a,b,c,d}.tiles.mapbox.com/v4/openstreetmapau.gdbhzo3g/{zoom}/{x}/{y}.jpg?access_token=pk.eyJ1Ijoib3BlbnN0cmVldG1hcGF1IiwiYSI6ImNqbWl3bXZ6aDA0MTkzd21xdnV1d2k0azEifQ.HYkMOqH_E2fYd1b0oXRe6w",endDate:"2018-05-01T00:00:00.000Z",startDate:"2018-05-01T00:00:00.000Z",zoomExtent:[10,22],polygon:[[[144.9146,-37.79929],[144.9139,-37.79888],[144.91276,-37.79858],[144.91138,-37.79876],[144.90975,-37.79976],[144.90604,-37.80641],[144.90428,-37.81261],[144.9042,-37.81421],[144.90561,-37.82089],[144.90426,-37.82245],[144.89902,-37.82728],[144.89686,-37.83007],[144.89598,-37.83355],[144.89602,-37.83873],[144.89703,-37.84192],[144.90113,-37.84692],[144.9052,-37.85019],[144.90684,-37.85056],[144.90802,-37.8502],[144.9084,-37.84948],[144.90701,-37.84771],[144.90763,-37.84693],[144.90448,-37.84165],[144.90529,-37.84139],[144.90806,-37.8458],[144.91181,-37.8502],[144.91274,-37.85039],[144.91548,-37.84892],[144.91553,-37.84814],[144.91396,-37.84594],[144.91619,-37.84451],[144.91396,-37.84131],[144.91634,-37.83985],[144.91651,-37.83841],[144.91508,-37.83441],[144.91829,-37.83307],[144.91947,-37.83258],[144.92102,-37.83087],[144.92186,-37.83002],[144.92297,-37.8295],[144.92937,-37.82816],[144.93529,-37.82702],[144.94112,-37.82692],[144.94181,-37.82679],[144.94585,-37.8275],[144.94707,-37.82794],[144.94784,-37.82779],[144.95786,-37.82953],[144.95921,-37.82941],[144.9613,-37.82902],[144.96254,-37.82972],[144.96477,-37.83184],[144.96565,-37.83229],[144.96621,-37.83231],[144.97033,-37.83121],[144.97052,-37.83228],[144.97106,-37.83307],[144.97346,-37.83507],[144.97428,-37.83595],[144.97943,-37.85002],[144.97968,-37.85081],[144.98061,-37.85117],[144.98425,-37.85151],[144.98483,-37.85139],[144.98537,-37.85085],[144.98923,-37.83109],[144.98891,-37.83038],[144.99226,-37.81041],[144.99243,-37.80983],[144.99187,-37.80895],[144.97449,-37.80714],[144.97683,-37.79327],[144.97674,-37.7928],[144.97642,-37.79232],[144.97589,-37.79219],[144.96977,-37.79146],[144.97076,-37.78566],[144.97041,-37.785],[144.9699,-37.78477],[144.96488,-37.7842],[144.96511,-37.78252],[144.96507,-37.78198],[144.96421,-37.78142],[144.96398,-37.78082],[144.96389,-37.77964],[144.96355,-37.7785],[144.96267,-37.77779],[144.96136,-37.77724],[144.93919,-37.77456],[144.93836,-37.77458],[144.93801,-37.77485],[144.93728,-37.77601],[144.93658,-37.77692],[144.93613,-37.77728],[144.93598,-37.77791],[144.93778,-37.78142],[144.93827,-37.78421],[144.93911,-37.78654],[144.93885,-37.78672],[144.93881,-37.7873],[144.93773,-37.78801],[144.93216,-37.7874],[144.93123,-37.78783],[144.93076,-37.78786],[144.93003,-37.78735],[144.92181,-37.78642],[144.91488,-37.77938],[144.91428,-37.77865],[144.9137,-37.77853],[144.91293,-37.77855],[144.90819,-37.78135],[144.90722,-37.78206],[144.90572,-37.7845],[144.90529,-37.78637],[144.90428,-37.78657],[144.90375,-37.78718],[144.90319,-37.78827],[144.90201,-37.78883],[144.90143,-37.78964],[144.90188,-37.79103],[144.90257,-37.79198],[144.90415,-37.79288],[144.90645,-37.79383],[144.90814,-37.79456],[144.91046,-37.79519],[144.9127,-37.79605],[144.91429,-37.79695],[144.91525,-37.79783],[144.91539,-37.79815],[144.91531,-37.79848],[144.91518,-37.79872],[144.9148,-37.79914],[144.9146,-37.79929]]],terms_url:"https://data.melbourne.vic.gov.au/Property-Planning/2018-Aerial-Imagery-True-Ortho-/qa5h-sfgh",terms_text:"City of Melbourne",best:true,icon:"https://www.melbourne.vic.gov.au/_catalogs/masterpage/android-icon.png"},{id:"Zuerich-aerial_2011",name:"City of Zürich Orthophoto 2011",type:"wms",template:"https://www.gis.stadt-zuerich.ch/maps/services/wms/WMS-ZH-STZH-OGD/MapServer/WmsServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Luftbild_2011&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2011-01-01T00:00:00.000Z",startDate:"2011-01-01T00:00:00.000Z",zoomExtent:[0,21],polygon:[[[8.44624,47.44143],[8.63178,47.43968],[8.62895,47.31377],[8.44381,47.31555],[8.44624,47.44143]]],terms_text:"Stadt Zürich Open Government Data"},{id:"Zuerich-overview",name:"City of Zürich Overview map (Steets, buildings, house numbers)",type:"wms",template:"https://www.gis.stadt-zuerich.ch/maps/services/wms/WMS-ZH-STZH-OGD/MapServer/WmsServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Uebersichtsplan&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[0,21],polygon:[[[8.45788,47.44582],[8.57392,47.44477],[8.57362,47.43124],[8.60266,47.43096],[8.6023,47.41746],[8.6318,47.41716],[8.6295,47.33628],[8.57162,47.33678],[8.57152,47.32292],[8.54236,47.3236],[8.54212,47.31013],[8.48418,47.31062],[8.48478,47.33762],[8.45582,47.33787],[8.45609,47.35135],[8.42713,47.35161],[8.42864,47.43259],[8.45745,47.43231],[8.45788,47.44582]]],terms_text:"Stadt Zürich Open Government Data"},{id:"Czech_CUZK-KM",name:"Czech CUZK:KM",type:"wms",template:"https://wms.cuzk.cz/wms.asp?service=WMS&VERSION=1.1.1&REQUEST=GetMap&SRS={proj}&LAYERS=parcelni_cisla_i,obrazy_parcel_i,RST_KMD_I,hranice_parcel_i,DEF_BUDOVY,RST_KN_I,dalsi_p_mapy_i,prehledka_kat_prac,prehledka_kat_uz,prehledka_kraju-linie&FORMAT=image/png&transparent=TRUE&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[15.00637,49.01774],[15.15599,49.00138],[15.1909,48.94246],[15.31059,48.98829],[15.40535,48.9752],[15.54,48.91624],[15.71456,48.86706],[15.83425,48.88018],[15.9689,48.81782],[16.0886,48.74553],[16.39781,48.74553],[16.48758,48.81454],[16.6721,48.7784],[16.68208,48.73566],[16.90152,48.71263],[16.9464,48.6237],[17.11597,48.83752],[17.21072,48.88018],[17.40523,48.81782],[17.48004,48.85393],[17.52991,48.81782],[17.70446,48.86706],[17.81418,48.9359],[17.884,48.9359],[17.94385,49.02101],[18.06354,49.03409],[18.1184,49.09944],[18.1982,49.30473],[18.38771,49.33399],[18.57723,49.50917],[18.75677,49.49946],[18.84654,49.52536],[18.87646,49.57066],[18.79666,49.69341],[18.64206,49.70954],[18.5872,49.83515],[18.61214,49.88338],[18.56226,49.93477],[18.51239,49.90587],[18.36277,49.95403],[18.32786,49.92193],[18.26303,49.97328],[18.1184,50.00534],[18.06354,50.07581],[17.91392,49.97969],[17.77927,50.03098],[17.71444,50.12379],[17.60472,50.16534],[17.75932,50.21962],[17.73438,50.34391],[17.63963,50.28021],[17.38029,50.28021],[17.35037,50.34391],[17.28055,50.33754],[17.18579,50.40752],[16.90152,50.46152],[16.86661,50.41388],[16.96635,50.31844],[17.03617,50.23238],[16.83668,50.21962],[16.712,50.1046],[16.58233,50.15895],[16.56238,50.23876],[16.43272,50.33754],[16.35292,50.39163],[16.27811,50.39163],[16.20829,50.44565],[16.39781,50.53449],[16.44768,50.59785],[16.35292,50.6706],[16.23821,50.67692],[16.21827,50.63266],[16.1285,50.68324],[16.0487,50.60734],[15.98885,50.7022],[15.87415,50.68324],[15.82926,50.76533],[15.72952,50.74324],[15.45023,50.81577],[15.39039,50.77479],[15.38041,50.85987],[15.29563,50.88504],[15.29563,50.98876],[15.17095,51.02014],[14.99141,51.00131],[15.00637,50.88819],[14.84179,50.8756],[14.7969,50.82522],[14.63233,50.85672],[14.66225,50.93536],[14.57248,50.92278],[14.61238,50.98562],[14.49767,51.04837],[14.41788,51.02328],[14.30816,51.06717],[14.2533,51.00445],[14.40291,50.93221],[14.37299,50.89763],[14.24332,50.90706],[14.20841,50.84412],[14.03386,50.81262],[13.979,50.82522],[13.90419,50.79686],[13.87427,50.74009],[13.53514,50.7243],[13.53015,50.65796],[13.4703,50.61367],[13.39051,50.66428],[13.32567,50.58835],[13.25086,50.61051],[13.196,50.50595],[13.05137,50.52181],[12.96659,50.4107],[12.82695,50.47105],[12.70227,50.41388],[12.50777,50.40116],[12.34319,50.25471],[12.32324,50.18451],[12.24843,50.27384],[12.17362,50.33118],[12.09881,50.33436],[12.11876,50.25152],[12.22349,50.16534],[12.20354,50.12379],[12.50278,49.97328],[12.47784,49.93798],[12.54766,49.91551],[12.46787,49.80298],[12.40802,49.76111],[12.48283,49.68696],[12.5327,49.68696],[12.51774,49.62885],[12.60751,49.54155],[12.67234,49.43788],[12.81199,49.34699],[12.94664,49.34374],[13.23091,49.12882],[13.32567,49.10597],[13.43539,49.0439],[13.41544,48.99484],[13.50022,48.94901],[13.56506,48.98829],[13.68475,48.88346],[13.7446,48.90313],[13.82439,48.77511],[13.8992,48.77511],[14.05879,48.67642],[14.04383,48.63029],[14.14358,48.59072],[14.37299,48.56103],[14.48271,48.65007],[14.57747,48.60721],[14.62734,48.63359],[14.70713,48.58083],[14.74703,48.70276],[14.81187,48.73895],[14.81685,48.79483],[14.98642,48.76525],[15.00637,49.01774]]],overlay:true},{id:"Czech_CUZK-KM-tms",name:"Czech CUZK:KM tiles proxy",type:"tms",template:"https://osm-{switch:a,b,c}.zby.cz/tiles_cuzk.php/{zoom}/{x}/{y}.png",zoomExtent:[13,18],polygon:[[[15.00637,49.01774],[15.15599,49.00138],[15.1909,48.94246],[15.31059,48.98829],[15.40535,48.9752],[15.54,48.91624],[15.71456,48.86706],[15.83425,48.88018],[15.9689,48.81782],[16.0886,48.74553],[16.39781,48.74553],[16.48758,48.81454],[16.6721,48.7784],[16.68208,48.73566],[16.90152,48.71263],[16.9464,48.6237],[17.11597,48.83752],[17.21072,48.88018],[17.40523,48.81782],[17.48004,48.85393],[17.52991,48.81782],[17.70446,48.86706],[17.81418,48.9359],[17.884,48.9359],[17.94385,49.02101],[18.06354,49.03409],[18.1184,49.09944],[18.1982,49.30473],[18.38771,49.33399],[18.57723,49.50917],[18.75677,49.49946],[18.84654,49.52536],[18.87646,49.57066],[18.79666,49.69341],[18.64206,49.70954],[18.5872,49.83515],[18.61214,49.88338],[18.56226,49.93477],[18.51239,49.90587],[18.36277,49.95403],[18.32786,49.92193],[18.26303,49.97328],[18.1184,50.00534],[18.06354,50.07581],[17.91392,49.97969],[17.77927,50.03098],[17.71444,50.12379],[17.60472,50.16534],[17.75932,50.21962],[17.73438,50.34391],[17.63963,50.28021],[17.38029,50.28021],[17.35037,50.34391],[17.28055,50.33754],[17.18579,50.40752],[16.90152,50.46152],[16.86661,50.41388],[16.96635,50.31844],[17.03617,50.23238],[16.83668,50.21962],[16.712,50.1046],[16.58233,50.15895],[16.56238,50.23876],[16.43272,50.33754],[16.35292,50.39163],[16.27811,50.39163],[16.20829,50.44565],[16.39781,50.53449],[16.44768,50.59785],[16.35292,50.6706],[16.23821,50.67692],[16.21827,50.63266],[16.1285,50.68324],[16.0487,50.60734],[15.98885,50.7022],[15.87415,50.68324],[15.82926,50.76533],[15.72952,50.74324],[15.45023,50.81577],[15.39039,50.77479],[15.38041,50.85987],[15.29563,50.88504],[15.29563,50.98876],[15.17095,51.02014],[14.99141,51.00131],[15.00637,50.88819],[14.84179,50.8756],[14.7969,50.82522],[14.63233,50.85672],[14.66225,50.93536],[14.57248,50.92278],[14.61238,50.98562],[14.49767,51.04837],[14.41788,51.02328],[14.30816,51.06717],[14.2533,51.00445],[14.40291,50.93221],[14.37299,50.89763],[14.24332,50.90706],[14.20841,50.84412],[14.03386,50.81262],[13.979,50.82522],[13.90419,50.79686],[13.87427,50.74009],[13.53514,50.7243],[13.53015,50.65796],[13.4703,50.61367],[13.39051,50.66428],[13.32567,50.58835],[13.25086,50.61051],[13.196,50.50595],[13.05137,50.52181],[12.96659,50.4107],[12.82695,50.47105],[12.70227,50.41388],[12.50777,50.40116],[12.34319,50.25471],[12.32324,50.18451],[12.24843,50.27384],[12.17362,50.33118],[12.09881,50.33436],[12.11876,50.25152],[12.22349,50.16534],[12.20354,50.12379],[12.50278,49.97328],[12.47784,49.93798],[12.54766,49.91551],[12.46787,49.80298],[12.40802,49.76111],[12.48283,49.68696],[12.5327,49.68696],[12.51774,49.62885],[12.60751,49.54155],[12.67234,49.43788],[12.81199,49.34699],[12.94664,49.34374],[13.23091,49.12882],[13.32567,49.10597],[13.43539,49.0439],[13.41544,48.99484],[13.50022,48.94901],[13.56506,48.98829],[13.68475,48.88346],[13.7446,48.90313],[13.82439,48.77511],[13.8992,48.77511],[14.05879,48.67642],[14.04383,48.63029],[14.14358,48.59072],[14.37299,48.56103],[14.48271,48.65007],[14.57747,48.60721],[14.62734,48.63359],[14.70713,48.58083],[14.74703,48.70276],[14.81187,48.73895],[14.81685,48.79483],[14.98642,48.76525],[15.00637,49.01774]]],overlay:true},{id:"Czech_pLPIS",name:"Czech pLPIS",type:"wms",template:"https://eagri.cz/public/app/wms/plpis.fcgi?FORMAT=image/png&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=LPIS_FB4,LPIS_FB4_KOD&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}&TRANSPARENT=true",projection:"EPSG:4326",polygon:[[[15.00637,49.01774],[15.15599,49.00138],[15.1909,48.94246],[15.31059,48.98829],[15.40535,48.9752],[15.54,48.91624],[15.71456,48.86706],[15.83425,48.88018],[15.9689,48.81782],[16.0886,48.74553],[16.39781,48.74553],[16.48758,48.81454],[16.6721,48.7784],[16.68208,48.73566],[16.90152,48.71263],[16.9464,48.6237],[17.11597,48.83752],[17.21072,48.88018],[17.40523,48.81782],[17.48004,48.85393],[17.52991,48.81782],[17.70446,48.86706],[17.81418,48.9359],[17.884,48.9359],[17.94385,49.02101],[18.06354,49.03409],[18.1184,49.09944],[18.1982,49.30473],[18.38771,49.33399],[18.57723,49.50917],[18.75677,49.49946],[18.84654,49.52536],[18.87646,49.57066],[18.79666,49.69341],[18.64206,49.70954],[18.5872,49.83515],[18.61214,49.88338],[18.56226,49.93477],[18.51239,49.90587],[18.36277,49.95403],[18.32786,49.92193],[18.26303,49.97328],[18.1184,50.00534],[18.06354,50.07581],[17.91392,49.97969],[17.77927,50.03098],[17.71444,50.12379],[17.60472,50.16534],[17.75932,50.21962],[17.73438,50.34391],[17.63963,50.28021],[17.38029,50.28021],[17.35037,50.34391],[17.28055,50.33754],[17.18579,50.40752],[16.90152,50.46152],[16.86661,50.41388],[16.96635,50.31844],[17.03617,50.23238],[16.83668,50.21962],[16.712,50.1046],[16.58233,50.15895],[16.56238,50.23876],[16.43272,50.33754],[16.35292,50.39163],[16.27811,50.39163],[16.20829,50.44565],[16.39781,50.53449],[16.44768,50.59785],[16.35292,50.6706],[16.23821,50.67692],[16.21827,50.63266],[16.1285,50.68324],[16.0487,50.60734],[15.98885,50.7022],[15.87415,50.68324],[15.82926,50.76533],[15.72952,50.74324],[15.45023,50.81577],[15.39039,50.77479],[15.38041,50.85987],[15.29563,50.88504],[15.29563,50.98876],[15.17095,51.02014],[14.99141,51.00131],[15.00637,50.88819],[14.84179,50.8756],[14.7969,50.82522],[14.63233,50.85672],[14.66225,50.93536],[14.57248,50.92278],[14.61238,50.98562],[14.49767,51.04837],[14.41788,51.02328],[14.30816,51.06717],[14.2533,51.00445],[14.40291,50.93221],[14.37299,50.89763],[14.24332,50.90706],[14.20841,50.84412],[14.03386,50.81262],[13.979,50.82522],[13.90419,50.79686],[13.87427,50.74009],[13.53514,50.7243],[13.53015,50.65796],[13.4703,50.61367],[13.39051,50.66428],[13.32567,50.58835],[13.25086,50.61051],[13.196,50.50595],[13.05137,50.52181],[12.96659,50.4107],[12.82695,50.47105],[12.70227,50.41388],[12.50777,50.40116],[12.34319,50.25471],[12.32324,50.18451],[12.24843,50.27384],[12.17362,50.33118],[12.09881,50.33436],[12.11876,50.25152],[12.22349,50.16534],[12.20354,50.12379],[12.50278,49.97328],[12.47784,49.93798],[12.54766,49.91551],[12.46787,49.80298],[12.40802,49.76111],[12.48283,49.68696],[12.5327,49.68696],[12.51774,49.62885],[12.60751,49.54155],[12.67234,49.43788],[12.81199,49.34699],[12.94664,49.34374],[13.23091,49.12882],[13.32567,49.10597],[13.43539,49.0439],[13.41544,48.99484],[13.50022,48.94901],[13.56506,48.98829],[13.68475,48.88346],[13.7446,48.90313],[13.82439,48.77511],[13.8992,48.77511],[14.05879,48.67642],[14.04383,48.63029],[14.14358,48.59072],[14.37299,48.56103],[14.48271,48.65007],[14.57747,48.60721],[14.62734,48.63359],[14.70713,48.58083],[14.74703,48.70276],[14.81187,48.73895],[14.81685,48.79483],[14.98642,48.76525],[15.00637,49.01774]]]},{id:"Czech_RUIAN-budovy",name:"Czech RUIAN budovy",type:"tms",template:"https://tile.poloha.net/budovy/{zoom}/{x}/{y}.png",zoomExtent:[12,20],polygon:[[[15.00637,49.01774],[15.15599,49.00138],[15.1909,48.94246],[15.31059,48.98829],[15.40535,48.9752],[15.54,48.91624],[15.71456,48.86706],[15.83425,48.88018],[15.9689,48.81782],[16.0886,48.74553],[16.39781,48.74553],[16.48758,48.81454],[16.6721,48.7784],[16.68208,48.73566],[16.90152,48.71263],[16.9464,48.6237],[17.11597,48.83752],[17.21072,48.88018],[17.40523,48.81782],[17.48004,48.85393],[17.52991,48.81782],[17.70446,48.86706],[17.81418,48.9359],[17.884,48.9359],[17.94385,49.02101],[18.06354,49.03409],[18.1184,49.09944],[18.1982,49.30473],[18.38771,49.33399],[18.57723,49.50917],[18.75677,49.49946],[18.84654,49.52536],[18.87646,49.57066],[18.79666,49.69341],[18.64206,49.70954],[18.5872,49.83515],[18.61214,49.88338],[18.56226,49.93477],[18.51239,49.90587],[18.36277,49.95403],[18.32786,49.92193],[18.26303,49.97328],[18.1184,50.00534],[18.06354,50.07581],[17.91392,49.97969],[17.77927,50.03098],[17.71444,50.12379],[17.60472,50.16534],[17.75932,50.21962],[17.73438,50.34391],[17.63963,50.28021],[17.38029,50.28021],[17.35037,50.34391],[17.28055,50.33754],[17.18579,50.40752],[16.90152,50.46152],[16.86661,50.41388],[16.96635,50.31844],[17.03617,50.23238],[16.83668,50.21962],[16.712,50.1046],[16.58233,50.15895],[16.56238,50.23876],[16.43272,50.33754],[16.35292,50.39163],[16.27811,50.39163],[16.20829,50.44565],[16.39781,50.53449],[16.44768,50.59785],[16.35292,50.6706],[16.23821,50.67692],[16.21827,50.63266],[16.1285,50.68324],[16.0487,50.60734],[15.98885,50.7022],[15.87415,50.68324],[15.82926,50.76533],[15.72952,50.74324],[15.45023,50.81577],[15.39039,50.77479],[15.38041,50.85987],[15.29563,50.88504],[15.29563,50.98876],[15.17095,51.02014],[14.99141,51.00131],[15.00637,50.88819],[14.84179,50.8756],[14.7969,50.82522],[14.63233,50.85672],[14.66225,50.93536],[14.57248,50.92278],[14.61238,50.98562],[14.49767,51.04837],[14.41788,51.02328],[14.30816,51.06717],[14.2533,51.00445],[14.40291,50.93221],[14.37299,50.89763],[14.24332,50.90706],[14.20841,50.84412],[14.03386,50.81262],[13.979,50.82522],[13.90419,50.79686],[13.87427,50.74009],[13.53514,50.7243],[13.53015,50.65796],[13.4703,50.61367],[13.39051,50.66428],[13.32567,50.58835],[13.25086,50.61051],[13.196,50.50595],[13.05137,50.52181],[12.96659,50.4107],[12.82695,50.47105],[12.70227,50.41388],[12.50777,50.40116],[12.34319,50.25471],[12.32324,50.18451],[12.24843,50.27384],[12.17362,50.33118],[12.09881,50.33436],[12.11876,50.25152],[12.22349,50.16534],[12.20354,50.12379],[12.50278,49.97328],[12.47784,49.93798],[12.54766,49.91551],[12.46787,49.80298],[12.40802,49.76111],[12.48283,49.68696],[12.5327,49.68696],[12.51774,49.62885],[12.60751,49.54155],[12.67234,49.43788],[12.81199,49.34699],[12.94664,49.34374],[13.23091,49.12882],[13.32567,49.10597],[13.43539,49.0439],[13.41544,48.99484],[13.50022,48.94901],[13.56506,48.98829],[13.68475,48.88346],[13.7446,48.90313],[13.82439,48.77511],[13.8992,48.77511],[14.05879,48.67642],[14.04383,48.63029],[14.14358,48.59072],[14.37299,48.56103],[14.48271,48.65007],[14.57747,48.60721],[14.62734,48.63359],[14.70713,48.58083],[14.74703,48.70276],[14.81187,48.73895],[14.81685,48.79483],[14.98642,48.76525],[15.00637,49.01774]]],terms_url:"https://poloha.net/",terms_text:"Czech RUIAN"},{id:"Czech_RUIAN-parcely",name:"Czech RUIAN parcely",type:"tms",template:"https://tile.poloha.net/parcely/{zoom}/{x}/{y}.png",zoomExtent:[12,20],polygon:[[[15.00637,49.01774],[15.15599,49.00138],[15.1909,48.94246],[15.31059,48.98829],[15.40535,48.9752],[15.54,48.91624],[15.71456,48.86706],[15.83425,48.88018],[15.9689,48.81782],[16.0886,48.74553],[16.39781,48.74553],[16.48758,48.81454],[16.6721,48.7784],[16.68208,48.73566],[16.90152,48.71263],[16.9464,48.6237],[17.11597,48.83752],[17.21072,48.88018],[17.40523,48.81782],[17.48004,48.85393],[17.52991,48.81782],[17.70446,48.86706],[17.81418,48.9359],[17.884,48.9359],[17.94385,49.02101],[18.06354,49.03409],[18.1184,49.09944],[18.1982,49.30473],[18.38771,49.33399],[18.57723,49.50917],[18.75677,49.49946],[18.84654,49.52536],[18.87646,49.57066],[18.79666,49.69341],[18.64206,49.70954],[18.5872,49.83515],[18.61214,49.88338],[18.56226,49.93477],[18.51239,49.90587],[18.36277,49.95403],[18.32786,49.92193],[18.26303,49.97328],[18.1184,50.00534],[18.06354,50.07581],[17.91392,49.97969],[17.77927,50.03098],[17.71444,50.12379],[17.60472,50.16534],[17.75932,50.21962],[17.73438,50.34391],[17.63963,50.28021],[17.38029,50.28021],[17.35037,50.34391],[17.28055,50.33754],[17.18579,50.40752],[16.90152,50.46152],[16.86661,50.41388],[16.96635,50.31844],[17.03617,50.23238],[16.83668,50.21962],[16.712,50.1046],[16.58233,50.15895],[16.56238,50.23876],[16.43272,50.33754],[16.35292,50.39163],[16.27811,50.39163],[16.20829,50.44565],[16.39781,50.53449],[16.44768,50.59785],[16.35292,50.6706],[16.23821,50.67692],[16.21827,50.63266],[16.1285,50.68324],[16.0487,50.60734],[15.98885,50.7022],[15.87415,50.68324],[15.82926,50.76533],[15.72952,50.74324],[15.45023,50.81577],[15.39039,50.77479],[15.38041,50.85987],[15.29563,50.88504],[15.29563,50.98876],[15.17095,51.02014],[14.99141,51.00131],[15.00637,50.88819],[14.84179,50.8756],[14.7969,50.82522],[14.63233,50.85672],[14.66225,50.93536],[14.57248,50.92278],[14.61238,50.98562],[14.49767,51.04837],[14.41788,51.02328],[14.30816,51.06717],[14.2533,51.00445],[14.40291,50.93221],[14.37299,50.89763],[14.24332,50.90706],[14.20841,50.84412],[14.03386,50.81262],[13.979,50.82522],[13.90419,50.79686],[13.87427,50.74009],[13.53514,50.7243],[13.53015,50.65796],[13.4703,50.61367],[13.39051,50.66428],[13.32567,50.58835],[13.25086,50.61051],[13.196,50.50595],[13.05137,50.52181],[12.96659,50.4107],[12.82695,50.47105],[12.70227,50.41388],[12.50777,50.40116],[12.34319,50.25471],[12.32324,50.18451],[12.24843,50.27384],[12.17362,50.33118],[12.09881,50.33436],[12.11876,50.25152],[12.22349,50.16534],[12.20354,50.12379],[12.50278,49.97328],[12.47784,49.93798],[12.54766,49.91551],[12.46787,49.80298],[12.40802,49.76111],[12.48283,49.68696],[12.5327,49.68696],[12.51774,49.62885],[12.60751,49.54155],[12.67234,49.43788],[12.81199,49.34699],[12.94664,49.34374],[13.23091,49.12882],[13.32567,49.10597],[13.43539,49.0439],[13.41544,48.99484],[13.50022,48.94901],[13.56506,48.98829],[13.68475,48.88346],[13.7446,48.90313],[13.82439,48.77511],[13.8992,48.77511],[14.05879,48.67642],[14.04383,48.63029],[14.14358,48.59072],[14.37299,48.56103],[14.48271,48.65007],[14.57747,48.60721],[14.62734,48.63359],[14.70713,48.58083],[14.74703,48.70276],[14.81187,48.73895],[14.81685,48.79483],[14.98642,48.76525],[15.00637,49.01774]]],terms_url:"https://poloha.net/",terms_text:"Czech RUIAN"},{id:"Czestochowa-buildings",name:"Częstochowa: Buildings",type:"wms",template:"http://geoportal.czestochowa.um.gov.pl/isdp/scripts/isdp.dll/wms?FORMAT=image/png&transparent=true&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=ieg_budynek&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",polygon:[[[19.08183,50.8554],[19.0888,50.86563],[19.11082,50.86616],[19.10961,50.86092],[19.11709,50.85933],[19.11531,50.86283],[19.11997,50.86327],[19.1227,50.85452],[19.12938,50.85519],[19.12566,50.86165],[19.13364,50.86147],[19.14318,50.86815],[19.1498,50.87916],[19.16507,50.8794],[19.16816,50.88501],[19.17265,50.88477],[19.18346,50.87706],[19.18084,50.86562],[19.18711,50.84712],[19.19973,50.84395],[19.19637,50.83678],[19.19358,50.83357],[19.19454,50.83145],[19.20696,50.82985],[19.20838,50.82484],[19.21831,50.82571],[19.22564,50.82475],[19.23075,50.82509],[19.2308,50.82666],[19.23351,50.82683],[19.23303,50.82335],[19.21868,50.80115],[19.21753,50.79272],[19.22592,50.78822],[19.20889,50.77561],[19.19891,50.76355],[19.19521,50.75182],[19.19074,50.75211],[19.18245,50.7545],[19.16504,50.7535],[19.16417,50.75586],[19.14559,50.75805],[19.14282,50.75543],[19.13021,50.75786],[19.127,50.75314],[19.1216,50.75363],[19.12066,50.74981],[19.10348,50.75228],[19.09598,50.75201],[19.0956,50.74912],[19.09351,50.7488],[19.09285,50.75027],[19.08442,50.74986],[19.08473,50.74349],[19.08382,50.73741],[19.07878,50.73668],[19.07503,50.73465],[19.07284,50.73708],[19.07153,50.74042],[19.0685,50.74339],[19.06632,50.74233],[19.06392,50.74554],[19.06595,50.7466],[19.06548,50.7496],[19.06202,50.75041],[19.06018,50.74455],[19.04257,50.74466],[19.0333,50.74827],[19.01869,50.76252],[19.01554,50.77044],[19.01101,50.7718],[19.01353,50.77766],[19.01159,50.78077],[19.01081,50.78759],[19.01362,50.79262],[19.01972,50.79555],[19.01896,50.80703],[19.03439,50.80116],[19.03453,50.804],[19.02593,50.80731],[19.02308,50.81499],[19.03154,50.81614],[19.02909,50.82435],[19.03787,50.82584],[19.03921,50.84083],[19.04676,50.84934],[19.05993,50.8532],[19.06209,50.8596],[19.06492,50.86134],[19.08183,50.8554]]],terms_text:"Urząd Miasta Częstochowy"},{id:"Duna_2013",name:"Danube flood orthophoto 2013",type:"tms",template:"http://e.tile.openstreetmap.hu/dunai-arviz-2013/{zoom}/{x}/{y}.jpg",endDate:"2013-01-01T00:00:00.000Z",startDate:"2013-01-01T00:00:00.000Z",zoomExtent:[10,20],polygon:[[[19.07732,47.69597],[19.07799,47.69598],[19.09462,47.69446],[19.08056,47.59587],[19.07434,47.58909],[19.07952,47.58883],[19.07717,47.57241],[19.05779,47.57209],[19.07732,47.69597]]],terms_url:"http://fototerkep.hu",terms_text:"Fotótérkép.hu",description:"Riverbank of Danube at Budapest, Szentendre and Szigetmonostor"},{id:"Delaware2012Orthophotography",name:"Delaware 2012 Orthophotography",type:"wms",template:"https://firstmap.delaware.gov/arcgis/services/DE_Imagery/DE_Imagery_2012/ImageServer/WMSServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2012-01-01T00:00:00.000Z",startDate:"2012-01-01T00:00:00.000Z",polygon:[[[-75.01771,38.45189],[-75.74174,38.44996],[-75.807,39.73907],[-75.75559,39.80106],[-75.64692,39.85638],[-75.47115,39.84646],[-75.37726,39.81478],[-75.48746,39.67181],[-75.50901,39.43446],[-75.39327,39.27784],[-75.30707,39.01667],[-75.19317,38.82219],[-75.05341,38.80876],[-75.01771,38.45189]]],terms_url:"https://firstmap.delaware.gov/arcgis/rest/services/DE_Imagery/DE_Imagery_2012/ImageServer",terms_text:"Digital Aerial Solutions, LLC",description:"This data set consists of 0.3-meter pixel resolution (approximately 1-foot), 4-band true color and near infrared (R, G, B, IR) orthoimages covering New Castle, Kent and Sussex Counties in Delaware."},{id:"Delaware2017Orthophotography",name:"Delaware 2017 Orthophotography",type:"wms",template:"https://firstmap.delaware.gov/arcgis/services/DE_Imagery/DE_Imagery_2017/ImageServer/WMSServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2017-01-01T00:00:00.000Z",startDate:"2017-01-01T00:00:00.000Z",polygon:[[[-75.01771,38.45189],[-75.74174,38.44996],[-75.807,39.73907],[-75.75559,39.80106],[-75.64692,39.85638],[-75.47115,39.84646],[-75.37726,39.81478],[-75.48746,39.67181],[-75.50901,39.43446],[-75.39327,39.27784],[-75.30707,39.01667],[-75.19317,38.82219],[-75.05341,38.80876],[-75.01771,38.45189]]],terms_url:"https://firstmap.delaware.gov/arcgis/rest/services/DE_Imagery/DE_Imagery_2017/ImageServer",terms_text:"Digital Aerial Solutions, LLC",description:"This data set consists of 0.3-meter pixel resolution (approximately 1-foot), 4-band true color and near infrared (R, G, B, IR) orthoimages covering New Castle, Kent and Sussex Counties in Delaware."},{id:"delmiro_gouveia",name:"Delmiro Gouveia AL",type:"wms",template:"http://geoserver.dados.al.gov.br:8080/geoserver/Alagoas/ows?LAYERS=Delmiro%20Gouveia&SERVICE=WMS&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.0&SERVICE=WMS&REQUEST=GetMap&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[-37.94962,-9.42957],[-37.94834,-9.33972],[-38.03903,-9.33834],[-38.04034,-9.42846],[-37.94962,-9.42957]]],terms_url:"http://www.seplag.al.gov.br",terms_text:"Secretaria de Estado do Planejamento, Gestão e Patrimônio"},{id:"der-es",name:"DER-ES",type:"wms",template:"http://portal.der.es.gov.br/geoserver/wms?SERVICE=WMS&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=deres-ext:TRECHOINFO&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[-40.94577,-21.31404],[-40.6231,-20.86278],[-40.38882,-20.65177],[-40.22209,-20.29831],[-39.80383,-19.66412],[-39.69603,-19.42573],[-39.67304,-19.30437],[-39.70538,-18.61384],[-39.65292,-18.33096],[-40.22281,-17.97587],[-40.34282,-17.9198],[-40.45278,-17.91502],[-40.46499,-17.92049],[-40.48368,-17.90408],[-40.50164,-17.90681],[-40.51602,-17.88903],[-40.53326,-17.88903],[-40.54548,-17.90134],[-40.58932,-17.91502],[-40.58932,-17.93211],[-40.61519,-17.93416],[-40.62956,-17.9868],[-40.64609,-17.9868],[-40.65903,-18.00731],[-40.68777,-18.00594],[-40.70574,-18.01756],[-40.71365,-18.00184],[-40.72155,-17.99774],[-40.75102,-18.00252],[-40.76754,-17.99842],[-40.76754,-17.98133],[-40.80923,-17.94852],[-40.82432,-17.96014],[-40.83151,-17.94989],[-40.86528,-17.9827],[-40.88397,-17.96766],[-40.90912,-17.98475],[-40.77761,-18.10775],[-40.77832,-18.15146],[-40.79054,-18.15351],[-40.8351,-18.14531],[-40.89547,-18.10365],[-40.93283,-18.12755],[-40.95583,-18.1255],[-40.95296,-18.14463],[-40.96014,-18.15009],[-40.96374,-18.14326],[-40.97955,-18.13643],[-40.99248,-18.15009],[-40.99105,-18.16307],[-41.00901,-18.16307],[-41.05788,-18.1658],[-41.05788,-18.17536],[-41.09597,-18.19243],[-41.09597,-18.2054],[-41.1089,-18.21291],[-41.09812,-18.22997],[-41.10531,-18.2327],[-41.09884,-18.25591],[-41.12903,-18.27502],[-41.16137,-18.30572],[-41.15059,-18.37394],[-41.16424,-18.37939],[-41.16424,-18.4019],[-41.15059,-18.40735],[-41.15849,-18.41144],[-41.17358,-18.41144],[-41.18868,-18.44485],[-41.02123,-18.46667],[-41.04638,-18.60362],[-41.03776,-18.61452],[-41.05788,-18.62678],[-41.0471,-18.64857],[-41.03488,-18.65402],[-40.99895,-18.67716],[-40.94505,-18.69418],[-40.94433,-18.76973],[-40.92134,-18.81055],[-40.93715,-18.82347],[-40.94721,-18.82143],[-40.97092,-18.83572],[-41.08375,-18.83232],[-41.10675,-18.83572],[-41.11753,-18.80783],[-41.13118,-18.79286],[-41.23611,-18.7949],[-41.2512,-18.81667],[-41.2476,-18.85544],[-41.2203,-18.87992],[-41.20808,-18.87992],[-41.20664,-18.86632],[-41.16424,-18.867],[-41.15634,-18.88876],[-41.12903,-18.9044],[-41.12112,-18.92412],[-41.0392,-18.98665],[-41.07585,-19.00567],[-41.06507,-19.06342],[-40.96877,-19.12726],[-40.96158,-19.15102],[-40.92996,-19.206],[-40.94649,-19.22296],[-40.94793,-19.24264],[-40.92565,-19.26299],[-40.94936,-19.2786],[-40.92277,-19.31048],[-40.94361,-19.35252],[-40.93427,-19.381],[-40.95727,-19.39184],[-40.9738,-19.42641],[-40.95439,-19.46165],[-40.97883,-19.50298],[-41.01332,-19.50298],[-41.04638,-19.48333],[-41.05429,-19.48401],[-41.04135,-19.56664],[-41.09238,-19.58966],[-41.14627,-19.656],[-41.16496,-19.65871],[-41.17933,-19.6939],[-41.19658,-19.74599],[-41.16999,-19.80618],[-41.18939,-19.82375],[-41.18868,-19.88526],[-41.21239,-19.89743],[-41.22964,-19.90216],[-41.24689,-19.93324],[-41.25479,-19.92919],[-41.26988,-19.93797],[-41.30653,-19.93392],[-41.31516,-19.96972],[-41.3245,-19.97647],[-41.313,-20.01226],[-41.33672,-20.05548],[-41.34822,-20.08653],[-41.3554,-20.12094],[-41.37768,-20.15805],[-41.38702,-20.18638],[-41.41074,-20.19448],[-41.4208,-20.20257],[-41.7636,-20.2046],[-41.78516,-20.28483],[-41.85055,-20.3246],[-41.86349,-20.37513],[-41.85127,-20.38187],[-41.84337,-20.40949],[-41.80887,-20.42498],[-41.80672,-20.47211],[-41.83115,-20.47885],[-41.81103,-20.54212],[-41.83115,-20.55086],[-41.86205,-20.61814],[-41.82109,-20.64437],[-41.85343,-20.68068],[-41.87139,-20.72102],[-41.8678,-20.73849],[-41.88002,-20.73984],[-41.88289,-20.76739],[-41.85415,-20.77478],[-41.83331,-20.7983],[-41.80887,-20.80905],[-41.78444,-20.80569],[-41.75138,-20.82382],[-41.74707,-20.87487],[-41.72335,-20.87554],[-41.74132,-20.92723],[-41.72335,-20.97757],[-41.74347,-21.09763],[-41.7291,-21.12579],[-41.594,-21.16332],[-41.57244,-21.18678],[-41.49051,-21.18879],[-41.48332,-21.20085],[-41.43948,-21.22095],[-41.41289,-21.20956],[-41.34965,-21.21291],[-41.27994,-21.2464],[-41.24473,-21.23234],[-41.17718,-21.25511],[-41.09238,-21.2243],[-41.04854,-21.25913],[-41.01548,-21.25578],[-41.00254,-21.28726],[-40.94577,-21.31404]]],terms_url:"https://der.es.gov.br",terms_text:"Departamento de Estradas de Rodagem do Estado do Espírito Santo",overlay:true},{id:"db-inspire-2013-11",name:"Deutsche Bahn VzG lines January 2017",type:"wms",template:"https://wms.michreichert.de/vzg-strecken-2017?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=vzg_strecken,station_codes,level_crossings&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2013-11-01T00:00:00.000Z",startDate:"2013-11-01T00:00:00.000Z",polygon:[[[8.19422,48.97504],[7.97355,49.02623],[7.94677,49.06313],[7.44328,49.18928],[7.05679,49.11163],[6.94302,49.21345],[6.81633,49.16389],[6.68209,49.24061],[6.3501,49.46202],[6.35353,49.57302],[6.42632,49.67177],[6.50254,49.71885],[6.45241,50.61258],[6.03871,50.71215],[6.00369,50.753],[6.05742,50.8559],[6.0787,50.90247],[6.0727,51.06792],[6.17123,51.33853],[6.22548,51.36554],[6.15715,51.5509],[6.12763,51.91069],[6.79985,51.86661],[7.02851,52.31255],[6.72947,52.64179],[7.07486,52.75269],[7.20532,53.18442],[7.04464,53.33106],[6.5173,53.65785],[8.23529,54.99001],[11.92257,54.52963],[14.1679,54.59631],[14.46591,53.24712],[14.14318,52.83946],[14.64375,52.58613],[14.57646,52.32756],[14.74537,52.06577],[14.66847,51.7353],[14.7234,51.53927],[15.03926,51.28745],[14.98845,51.09207],[14.88922,50.93856],[14.81593,50.87729],[14.63671,50.89116],[14.59311,50.91887],[14.57217,51.01076],[14.26283,51.06473],[14.28086,50.98024],[14.22816,50.85796],[13.69532,50.72883],[13.03442,50.50085],[12.49077,50.34582],[12.32632,50.29277],[12.35379,50.21462],[12.32701,50.16363],[12.1677,50.34889],[12.07707,50.2524],[12.18195,50.21136],[12.26014,50.09069],[12.53892,49.4164],[12.88808,49.3385],[13.21287,49.12439],[13.73952,48.83688],[13.45371,48.56222],[13.40555,48.37812],[13.03648,48.25986],[12.71376,48.10856],[12.93108,47.9376],[13.00455,47.84506],[12.90671,47.73249],[13.05228,47.59329],[12.15792,47.7087],[12.20393,47.61667],[12.17783,47.59815],[11.61753,47.60093],[11.26666,47.39124],[10.9247,47.46811],[10.91578,47.55623],[10.59031,47.5567],[10.29848,47.39937],[9.78144,47.61274],[9.74024,47.52842],[9.00278,47.69137],[8.68933,47.72371],[8.63809,47.70261],[8.63079,47.69359],[8.62127,47.69177],[8.62414,47.68221],[8.61243,47.68115],[8.35382,47.61367],[8.27485,47.619],[8.23709,47.61023],[8.22808,47.60583],[8.20284,47.61555],[8.10834,47.58251],[8.08568,47.5583],[8.06714,47.56444],[8.04981,47.55645],[8.02749,47.55112],[7.98097,47.55494],[7.91917,47.54787],[7.88862,47.58888],[7.81257,47.57122],[7.79455,47.55558],[7.71404,47.54063],[7.66043,47.54485],[7.65219,47.54702],[7.63439,47.56173],[7.61499,47.55669],[7.5834,47.57048],[7.58559,47.5845],[7.59366,47.60048],[7.58761,47.608],[7.51491,47.6652],[7.5434,47.81539],[7.57671,48.02454],[7.56812,48.06012],[7.80639,48.52438],[7.79987,48.58029],[7.80665,48.60106],[8.11014,48.84977],[8.19422,48.97504]]],terms_url:"https://data.deutschebahn.com/dataset/data-streckennetz",terms_text:"Data CC-BY 4.0 Deutsche Bahn AG",overlay:true},{id:"db-inspire-2015-11",name:"Deutsche Bahn VzG lines Nov 2015",type:"wms",template:"https://wms.michreichert.de/vzg-strecken-2015?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=vzg_strecken,station_codes,level_crossings&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2015-11-01T00:00:00.000Z",startDate:"2015-11-01T00:00:00.000Z",polygon:[[[8.19422,48.97504],[7.97355,49.02623],[7.94677,49.06313],[7.44328,49.18928],[7.05679,49.11163],[6.94302,49.21345],[6.81633,49.16389],[6.68209,49.24061],[6.3501,49.46202],[6.35353,49.57302],[6.42632,49.67177],[6.50254,49.71885],[6.45241,50.61258],[6.03871,50.71215],[6.00369,50.753],[6.05742,50.8559],[6.0787,50.90247],[6.0727,51.06792],[6.17123,51.33853],[6.22548,51.36554],[6.15715,51.5509],[6.12763,51.91069],[6.79985,51.86661],[7.02851,52.31255],[6.72947,52.64179],[7.07486,52.75269],[7.20532,53.18442],[7.04464,53.33106],[6.5173,53.65785],[8.23529,54.99001],[11.92257,54.52963],[14.1679,54.59631],[14.46591,53.24712],[14.14318,52.83946],[14.64375,52.58613],[14.57646,52.32756],[14.74537,52.06577],[14.66847,51.7353],[14.7234,51.53927],[15.03926,51.28745],[14.98845,51.09207],[14.88922,50.93856],[14.81593,50.87729],[14.63671,50.89116],[14.59311,50.91887],[14.57217,51.01076],[14.26283,51.06473],[14.28086,50.98024],[14.22816,50.85796],[13.69532,50.72883],[13.03442,50.50085],[12.49077,50.34582],[12.32632,50.29277],[12.35379,50.21462],[12.32701,50.16363],[12.1677,50.34889],[12.07707,50.2524],[12.18195,50.21136],[12.26014,50.09069],[12.53892,49.4164],[12.88808,49.3385],[13.21287,49.12439],[13.73952,48.83688],[13.45371,48.56222],[13.40555,48.37812],[13.03648,48.25986],[12.71376,48.10856],[12.93108,47.9376],[13.00455,47.84506],[12.90671,47.73249],[13.05228,47.59329],[12.15792,47.7087],[12.20393,47.61667],[12.17783,47.59815],[11.61753,47.60093],[11.26666,47.39124],[10.9247,47.46811],[10.91578,47.55623],[10.59031,47.5567],[10.29848,47.39937],[9.78144,47.61274],[9.74024,47.52842],[9.00278,47.69137],[8.68933,47.72371],[8.63809,47.70261],[8.63079,47.69359],[8.62127,47.69177],[8.62414,47.68221],[8.61243,47.68115],[8.35382,47.61367],[8.27485,47.619],[8.23709,47.61023],[8.22808,47.60583],[8.20284,47.61555],[8.10834,47.58251],[8.08568,47.5583],[8.06714,47.56444],[8.04981,47.55645],[8.02749,47.55112],[7.98097,47.55494],[7.91917,47.54787],[7.88862,47.58888],[7.81257,47.57122],[7.79455,47.55558],[7.71404,47.54063],[7.66043,47.54485],[7.65219,47.54702],[7.63439,47.56173],[7.61499,47.55669],[7.5834,47.57048],[7.58559,47.5845],[7.59366,47.60048],[7.58761,47.608],[7.51491,47.6652],[7.5434,47.81539],[7.57671,48.02454],[7.56812,48.06012],[7.80639,48.52438],[7.79987,48.58029],[7.80665,48.60106],[8.11014,48.84977],[8.19422,48.97504]]],terms_url:"https://data.deutschebahn.com/dataset/data-streckennetz",terms_text:"Data CC-BY 4.0 Deutsche Bahn AG",overlay:true},{id:"DigitalGlobe-Premium",name:"DigitalGlobe Premium Imagery",type:"tms",template:"https://{switch:a,b,c,d}.tiles.mapbox.com/v4/digitalglobe.316c9a2e/{zoom}/{x}/{y}.png?access_token=pk.eyJ1IjoiZGlnaXRhbGdsb2JlIiwiYSI6ImNqZGFrZ2c2dzFlMWgyd2x0ZHdmMDB6NzYifQ.9Pl3XOO82ArX94fHV289Pg",zoomExtent:[0,22],terms_url:"https://wiki.openstreetmap.org/wiki/DigitalGlobe",terms_text:"Terms & Feedback","default":true,description:"DigitalGlobe-Premium is a mosaic composed of DigitalGlobe basemap with select regions filled with +Vivid or custom area of interest imagery, 50cm resolution or better, and refreshed more frequently with ongoing updates.",icon:"https://osmlab.github.io/editor-layer-index/sources/world/DigitalGlobePremiumImagery.png"},{id:"DigitalGlobe-Premium-vintage",name:"DigitalGlobe Premium Imagery Vintage",type:"tms",template:"https://{switch:a,b,c,d}.tiles.mapbox.com/v4/digitalglobe.2850d66c/{zoom}/{x}/{y}.png?access_token=pk.eyJ1IjoiZGlnaXRhbGdsb2JlIiwiYSI6ImNqOTBkcmZjNzJ5ZnozNHF6NnVkOGd6ODYifQ.grAnqgpCjOaeq-ozqt4QNw",zoomExtent:[0,22],terms_url:"https://wiki.openstreetmap.org/wiki/DigitalGlobe",terms_text:"Terms & Feedback",description:"Imagery boundaries and capture dates. Labels appear at zoom level 13 and higher.",icon:"https://osmlab.github.io/editor-layer-index/sources/world/DigitalGlobePremiumImagery.png",overlay:true},{id:"DigitalGlobe-Standard",name:"DigitalGlobe Standard Imagery",type:"tms",template:"https://{switch:a,b,c,d}.tiles.mapbox.com/v4/digitalglobe.0a8e44ba/{zoom}/{x}/{y}.png?access_token=pk.eyJ1IjoiZGlnaXRhbGdsb2JlIiwiYSI6ImNqZGFrZ3pjczNpaHYycXFyMGo0djY3N2IifQ.90uebT4-ow1uqZKTUrf6RQ",zoomExtent:[0,22],terms_url:"https://wiki.openstreetmap.org/wiki/DigitalGlobe",terms_text:"Terms & Feedback","default":true,description:"DigitalGlobe-Standard is a curated set of imagery covering 86% of the earth’s landmass, with 30-60cm resolution where available, backfilled by Landsat. Average age is 2.31 years, with some areas updated 2x per year.",icon:"https://osmlab.github.io/editor-layer-index/sources/world/DigitalGlobePremiumImagery.png"},{id:"DigitalGlobe-Standard-vintage",name:"DigitalGlobe Standard Imagery Vintage",type:"tms",template:"https://{switch:a,b,c,d}.tiles.mapbox.com/v4/digitalglobe.1412531a/{zoom}/{x}/{y}.png?access_token=pk.eyJ1IjoiZGlnaXRhbGdsb2JlIiwiYSI6ImNqOTBlYWJ1ZDAza2YyeG14NWVodTA4OWUifQ.wVc8ZOuPuYVw39lhS2j3_g",zoomExtent:[0,22],terms_url:"https://wiki.openstreetmap.org/wiki/DigitalGlobe",terms_text:"Terms & Feedback",description:"Imagery boundaries and capture dates. Labels appear at zoom level 13 and higher.",icon:"https://osmlab.github.io/editor-layer-index/sources/world/DigitalGlobePremiumImagery.png",overlay:true},{id:"DigitalGlobe-Vivid",name:"DigitalGlobe Vivid Imagery",type:"tms",template:"https://earthwatch.digitalglobe.com/earthservice/tmsaccess/tms/1.0.0/DigitalGlobe:ImageryTileService@EPSG:3857@jpg/{zoom}/{x}/{-y}.jpg?connectId=99a584e0-2be9-4684-be15-1d85c2a26a3e",zoomExtent:[0,22],terms_url:"https://wiki.openstreetmap.org/wiki/DigitalGlobe",terms_text:"Terms & Feedback","default":true,description:"DigitalGlobe-Vivid is a mosaic with optimal aesthetics and currency for any area on the globe, 50cm resolution or better, and image currency <20 month average globally.",icon:"https://osmlab.github.io/editor-layer-index/sources/world/DigitalGlobeVivid.png"},{id:"drone-imagery-2014",name:"Drone Imagery 2014 (Haiti)",type:"tms",template:"http://wms.openstreetmap.fr/tms/1.0.0/haiti_2014/{zoom}/{x}/{y}",endDate:"2014-01-01T00:00:00.000Z",startDate:"2014-01-01T00:00:00.000Z",polygon:[[[-72.3286,18.69461],[-72.33034,18.69412],[-72.33117,18.69284],[-72.33413,18.68542],[-72.33452,18.68414],[-72.33443,18.68355],[-72.33375,18.68235],[-72.32147,18.67721],[-72.32027,18.67698],[-72.31909,18.67713],[-72.3183,18.67804],[-72.31508,18.68457],[-72.31394,18.689],[-72.31553,18.68993],[-72.3286,18.69461]],[[-72.34695,18.61833],[-72.34553,18.62166],[-72.34355,18.62447],[-72.34245,18.62553],[-72.34076,18.62658],[-72.33786,18.62639],[-72.33649,18.62597],[-72.33589,18.62504],[-72.33482,18.62559],[-72.33472,18.6255],[-72.33459,18.62513],[-72.33343,18.62438],[-72.33174,18.62469],[-72.3313,18.62457],[-72.33126,18.62321],[-72.33088,18.62276],[-72.33066,18.62277],[-72.32985,18.62345],[-72.32862,18.62186],[-72.32829,18.6218],[-72.32817,18.62193],[-72.32809,18.6218],[-72.32734,18.62261],[-72.32541,18.62101],[-72.32422,18.62122],[-72.32396,18.61869],[-72.32354,18.61815],[-72.32325,18.61818],[-72.32351,18.61877],[-72.32058,18.62031],[-72.32043,18.61993],[-72.31978,18.62066],[-72.31807,18.61907],[-72.31742,18.61958],[-72.31523,18.61782],[-72.31463,18.61844],[-72.31324,18.6165],[-72.31275,18.61677],[-72.31232,18.6172],[-72.31198,18.61704],[-72.31042,18.61764],[-72.31062,18.61564],[-72.30996,18.61526],[-72.30936,18.61623],[-72.30786,18.61542],[-72.30669,18.61623],[-72.30604,18.61704],[-72.30419,18.61545],[-72.30288,18.61688],[-72.30191,18.61637],[-72.30131,18.61552],[-72.30118,18.6158],[-72.30087,18.61546],[-72.30076,18.61567],[-72.30062,18.6156],[-72.30012,18.61609],[-72.29198,18.61365],[-72.29194,18.61347],[-72.29143,18.61342],[-72.29094,18.61323],[-72.29105,18.61199],[-72.29057,18.61152],[-72.28772,18.61145],[-72.28801,18.6096],[-72.2865,18.60968],[-72.28635,18.60799],[-72.28448,18.60844],[-72.28436,18.60789],[-72.283,18.60808],[-72.283,18.60658],[-72.2828,18.60676],[-72.2816,18.60537],[-72.28106,18.60533],[-72.27973,18.60682],[-72.27805,18.60525],[-72.27793,18.6053],[-72.2778,18.60524],[-72.2772,18.60638],[-72.27589,18.60564],[-72.27544,18.60629],[-72.27385,18.60508],[-72.27341,18.60508],[-72.27241,18.60593],[-72.27099,18.60442],[-72.27047,18.60429],[-72.27038,18.60446],[-72.27024,18.60427],[-72.27011,18.60433],[-72.26862,18.60368],[-72.26778,18.6037],[-72.26751,18.60429],[-72.2655,18.60318],[-72.26539,18.60336],[-72.26515,18.60309],[-72.26471,18.603],[-72.26436,18.60331],[-72.26312,18.60193],[-72.26258,18.60188],[-72.262,18.60251],[-72.26139,18.60184],[-72.26106,18.60182],[-72.26106,18.60148],[-72.26014,18.6005],[-72.25994,18.60049],[-72.25803,18.60079],[-72.2576,18.60054],[-72.25691,18.60094],[-72.25413,18.59992],[-72.25093,18.59739],[-72.25062,18.59676],[-72.25033,18.59701],[-72.24451,18.59231],[-72.24215,18.58872],[-72.24167,18.58756],[-72.24077,18.58654],[-72.24147,18.58592],[-72.2413,18.58543],[-72.2395,18.58424],[-72.24007,18.58358],[-72.2382,18.58197],[-72.23868,18.58157],[-72.2385,18.58119],[-72.23703,18.58054],[-72.23612,18.57894],[-72.23646,18.57825],[-72.23636,18.5777],[-72.23467,18.57684],[-72.2353,18.57562],[-72.235,18.57499],[-72.23335,18.57423],[-72.23399,18.57293],[-72.23182,18.57169],[-72.23188,18.57137],[-72.23175,18.57127],[-72.23198,18.5708],[-72.23072,18.5694],[-72.23097,18.56874],[-72.23082,18.56844],[-72.23046,18.56855],[-72.23009,18.56754],[-72.22942,18.56715],[-72.22972,18.56651],[-72.22961,18.566],[-72.22908,18.56612],[-72.22848,18.56396],[-72.22818,18.56395],[-72.22733,18.56421],[-72.2265,18.56179],[-72.22623,18.56191],[-72.22436,18.55908],[-72.22471,18.55882],[-72.22357,18.55689],[-72.22379,18.55675],[-72.22325,18.55579],[-72.22387,18.55544],[-72.22382,18.55528],[-72.22458,18.55483],[-72.22453,18.55439],[-72.22625,18.55408],[-72.22705,18.55349],[-72.22692,18.55333],[-72.2271,18.55324],[-72.22687,18.55273],[-72.22592,18.55308],[-72.22465,18.55027],[-72.22483,18.5501],[-72.22457,18.54956],[-72.22327,18.55014],[-72.22261,18.54869],[-72.2208,18.54918],[-72.22051,18.54852],[-72.22034,18.54865],[-72.2201,18.54845],[-72.21952,18.54876],[-72.21862,18.54755],[-72.2174,18.5478],[-72.21714,18.54733],[-72.21694,18.54734],[-72.21583,18.54517],[-72.21505,18.54533],[-72.21477,18.54494],[-72.21442,18.54218],[-72.21421,18.54233],[-72.21293,18.5401],[-72.21199,18.5404],[-72.21188,18.54025],[-72.21145,18.53781],[-72.21085,18.53797],[-72.21028,18.53545],[-72.20993,18.53465],[-72.20942,18.53478],[-72.20942,18.53456],[-72.20851,18.53472],[-72.2057,18.53039],[-72.20444,18.52693],[-72.20438,18.52643],[-72.20418,18.52637],[-72.20399,18.52572],[-72.20263,18.5222],[-72.20182,18.5197],[-72.20148,18.51742],[-72.20301,18.51606],[-72.20503,18.51506],[-72.20767,18.51432],[-72.20936,18.5142],[-72.2095,18.51448],[-72.21082,18.51416],[-72.21095,18.51444],[-72.21189,18.51412],[-72.21266,18.51403],[-72.21277,18.51417],[-72.21462,18.51393],[-72.21697,18.51569],[-72.21731,18.51648],[-72.21787,18.51642],[-72.21818,18.51975],[-72.21798,18.51984],[-72.21909,18.52189],[-72.22031,18.52152],[-72.22096,18.52382],[-72.22209,18.52355],[-72.22251,18.52685],[-72.22229,18.52693],[-72.22271,18.52726],[-72.22289,18.52707],[-72.2231,18.52722],[-72.22404,18.52681],[-72.22551,18.52936],[-72.22596,18.5297],[-72.22642,18.52964],[-72.2265,18.53018],[-72.2275,18.53118],[-72.22673,18.53171],[-72.22885,18.53383],[-72.22811,18.53435],[-72.22981,18.53623],[-72.22912,18.5367],[-72.22935,18.53731],[-72.23059,18.53875],[-72.23222,18.54189],[-72.23215,18.5421],[-72.23258,18.54324],[-72.23311,18.54304],[-72.2342,18.54558],[-72.23436,18.5455],[-72.23554,18.54776],[-72.23571,18.54779],[-72.23601,18.54899],[-72.23839,18.55165],[-72.23747,18.55231],[-72.23951,18.55397],[-72.23918,18.55413],[-72.2407,18.55661],[-72.24014,18.5568],[-72.24079,18.55824],[-72.24063,18.55835],[-72.24067,18.55845],[-72.24117,18.55815],[-72.24161,18.55898],[-72.24216,18.55882],[-72.24242,18.56062],[-72.24262,18.56101],[-72.24294,18.56089],[-72.24399,18.56371],[-72.24466,18.56356],[-72.24475,18.56413],[-72.24536,18.56445],[-72.2449,18.56525],[-72.24518,18.56549],[-72.245,18.56581],[-72.24499,18.56607],[-72.24543,18.56633],[-72.24559,18.56618],[-72.24588,18.56662],[-72.24687,18.56727],[-72.24662,18.56749],[-72.24781,18.56897],[-72.24728,18.56938],[-72.24859,18.57137],[-72.24894,18.57159],[-72.24865,18.57222],[-72.2488,18.57219],[-72.24885,18.5723],[-72.24945,18.57197],[-72.25068,18.57411],[-72.25147,18.5737],[-72.25251,18.57598],[-72.25339,18.57551],[-72.25491,18.57848],[-72.25462,18.57863],[-72.25467,18.57878],[-72.25505,18.57894],[-72.25495,18.57913],[-72.256,18.58074],[-72.2563,18.58054],[-72.25752,18.58237],[-72.25769,18.58227],[-72.2578,18.5824],[-72.25808,18.5823],[-72.25857,18.5821],[-72.25862,18.58222],[-72.25889,18.58219],[-72.25894,18.58302],[-72.25958,18.58445],[-72.25984,18.58472],[-72.26072,18.58443],[-72.26094,18.58565],[-72.2622,18.58722],[-72.26351,18.58643],[-72.2643,18.58738],[-72.26474,18.58708],[-72.26594,18.58862],[-72.26756,18.58877],[-72.26742,18.58917],[-72.27039,18.58893],[-72.27021,18.5903],[-72.2722,18.59048],[-72.27211,18.59145],[-72.27381,18.59188],[-72.27384,18.59168],[-72.27729,18.59169],[-72.28014,18.59129],[-72.28059,18.59048],[-72.28106,18.59071],[-72.28226,18.58989],[-72.28286,18.59047],[-72.28367,18.58966],[-72.28401,18.59014],[-72.28468,18.59029],[-72.2851,18.58997],[-72.2857,18.59062],[-72.28661,18.59068],[-72.28681,18.59014],[-72.28728,18.59032],[-72.28741,18.59013],[-72.28801,18.59052],[-72.28991,18.59071],[-72.29077,18.58997],[-72.29196,18.59186],[-72.2945,18.59148],[-72.29454,18.59361],[-72.29654,18.59322],[-72.29689,18.59586],[-72.2976,18.59675],[-72.29824,18.59722],[-72.29871,18.5962],[-72.30053,18.59733],[-72.30081,18.59675],[-72.30113,18.59691],[-72.30131,18.59676],[-72.30175,18.59721],[-72.30303,18.59774],[-72.3033,18.59729],[-72.30394,18.59761],[-72.30394,18.59736],[-72.30555,18.59794],[-72.30598,18.59756],[-72.30703,18.59838],[-72.30723,18.59799],[-72.30862,18.59833],[-72.30938,18.59752],[-72.31013,18.5981],[-72.31037,18.59739],[-72.3121,18.5983],[-72.3122,18.59807],[-72.31424,18.59902],[-72.31456,18.59873],[-72.31524,18.59922],[-72.31681,18.59952],[-72.31662,18.60004],[-72.31958,18.60072],[-72.31907,18.60202],[-72.32042,18.60247],[-72.32061,18.60242],[-72.32082,18.60267],[-72.3211,18.6027],[-72.32105,18.60298],[-72.32144,18.60347],[-72.32368,18.60322],[-72.32375,18.60432],[-72.32584,18.60436],[-72.32588,18.60522],[-72.32617,18.60585],[-72.32864,18.60525],[-72.32897,18.60527],[-72.32916,18.60727],[-72.33006,18.60812],[-72.3294,18.60867],[-72.33004,18.60959],[-72.33282,18.60949],[-72.33258,18.61058],[-72.33302,18.61005],[-72.3335,18.61054],[-72.33477,18.61035],[-72.33485,18.61167],[-72.33735,18.61174],[-72.33725,18.61237],[-72.33767,18.61298],[-72.34038,18.61306],[-72.34016,18.6138],[-72.34153,18.61384],[-72.34258,18.61457],[-72.3426,18.61512],[-72.34306,18.61499],[-72.34682,18.61792],[-72.34695,18.61833]],[[-72.72363,19.09461],[-72.72302,19.09518],[-72.72206,19.0965],[-72.72169,19.09612],[-72.72164,19.0962],[-72.72132,19.09609],[-72.72073,19.0967],[-72.7198,19.09587],[-72.71965,19.09591],[-72.7197,19.09601],[-72.71955,19.09602],[-72.71911,19.09623],[-72.71906,19.09627],[-72.71904,19.09625],[-72.71888,19.09631],[-72.71886,19.09626],[-72.71817,19.09643],[-72.71776,19.09679],[-72.71756,19.09657],[-72.71693,19.09705],[-72.71713,19.09735],[-72.71495,19.0988],[-72.71479,19.09852],[-72.71483,19.09849],[-72.7148,19.0984],[-72.71455,19.09859],[-72.71449,19.09851],[-72.71413,19.09877],[-72.71413,19.09893],[-72.71419,19.09891],[-72.71417,19.09978],[-72.71324,19.09971],[-72.71287,19.09974],[-72.71295,19.09967],[-72.71278,19.09968],[-72.71278,19.09977],[-72.71282,19.09976],[-72.71285,19.09988],[-72.71266,19.09989],[-72.71266,19.09987],[-72.71245,19.09987],[-72.71182,19.09991],[-72.71178,19.10012],[-72.71157,19.10009],[-72.71147,19.10102],[-72.71042,19.10086],[-72.71039,19.10119],[-72.7103,19.1012],[-72.71031,19.10151],[-72.7097,19.10156],[-72.7097,19.10162],[-72.70917,19.10169],[-72.70917,19.1021],[-72.70828,19.10211],[-72.70809,19.10289],[-72.70788,19.10284],[-72.70798,19.10367],[-72.70724,19.1038],[-72.70731,19.10501],[-72.70723,19.10501],[-72.70736,19.10565],[-72.70637,19.10584],[-72.7062,19.10714],[-72.70588,19.10706],[-72.70591,19.10747],[-72.7053,19.10757],[-72.7054,19.10813],[-72.70568,19.10809],[-72.70568,19.10928],[-72.70591,19.11013],[-72.70589,19.11022],[-72.70574,19.11025],[-72.70574,19.11116],[-72.70538,19.11114],[-72.70557,19.11247],[-72.70499,19.11256],[-72.70537,19.11361],[-72.7047,19.11388],[-72.70496,19.11563],[-72.70418,19.11564],[-72.70442,19.11762],[-72.70371,19.11764],[-72.70371,19.1178],[-72.70352,19.11779],[-72.70339,19.12227],[-72.70264,19.12205],[-72.70253,19.12301],[-72.70289,19.12592],[-72.70308,19.12595],[-72.70316,19.12864],[-72.70234,19.12997],[-72.70206,19.1301],[-72.69987,19.1305],[-72.69325,19.13064],[-72.687,19.13075],[-72.68456,19.13073],[-72.68338,19.13056],[-72.6828,19.1297],[-72.68203,19.1283],[-72.68201,19.12715],[-72.68158,19.12714],[-72.68187,19.12508],[-72.68185,19.12507],[-72.68215,19.12414],[-72.68253,19.12295],[-72.68265,19.12243],[-72.68263,19.12185],[-72.68302,19.12185],[-72.68301,19.12132],[-72.68286,19.12133],[-72.68293,19.11947],[-72.68251,19.11946],[-72.68256,19.11803],[-72.68265,19.11751],[-72.68265,19.11703],[-72.68318,19.11704],[-72.68319,19.11685],[-72.68371,19.11687],[-72.68384,19.11684],[-72.684,19.11685],[-72.68398,19.11689],[-72.68426,19.11688],[-72.68426,19.11679],[-72.68481,19.11674],[-72.68546,19.11667],[-72.68557,19.11664],[-72.68551,19.11664],[-72.6856,19.11662],[-72.68595,19.11658],[-72.68596,19.11654],[-72.68608,19.11654],[-72.68661,19.11663],[-72.68662,19.11656],[-72.68713,19.11665],[-72.68721,19.11666],[-72.68721,19.11663],[-72.6878,19.11666],[-72.68779,19.11659],[-72.68833,19.11663],[-72.68832,19.11658],[-72.68928,19.11657],[-72.6897,19.11656],[-72.68998,19.11644],[-72.6902,19.11644],[-72.69019,19.11615],[-72.69027,19.11563],[-72.69029,19.11541],[-72.69017,19.11543],[-72.69018,19.11493],[-72.69018,19.11458],[-72.69019,19.11445],[-72.69022,19.11433],[-72.6902,19.11406],[-72.68972,19.11398],[-72.68968,19.11397],[-72.68973,19.11415],[-72.68974,19.1142],[-72.68937,19.11417],[-72.68872,19.11412],[-72.688,19.11412],[-72.68758,19.11409],[-72.68759,19.11401],[-72.68736,19.11403],[-72.68711,19.11406],[-72.68682,19.11406],[-72.68677,19.11405],[-72.68591,19.11422],[-72.68554,19.11421],[-72.68557,19.11369],[-72.68554,19.11308],[-72.68533,19.11314],[-72.6852,19.11316],[-72.68519,19.1132],[-72.68504,19.11325],[-72.68495,19.1127],[-72.68474,19.11278],[-72.68468,19.11277],[-72.68446,19.11281],[-72.68416,19.1128],[-72.6836,19.11254],[-72.68353,19.11102],[-72.68363,19.11007],[-72.68338,19.11003],[-72.68344,19.10974],[-72.68295,19.1096],[-72.68305,19.10892],[-72.68111,19.10826],[-72.68112,19.1081],[-72.67965,19.10781],[-72.67968,19.10765],[-72.67923,19.10749],[-72.67916,19.10802],[-72.67838,19.10755],[-72.67779,19.10753],[-72.67775,19.10769],[-72.67623,19.10765],[-72.67606,19.10762],[-72.67621,19.10797],[-72.67549,19.10804],[-72.67548,19.1079],[-72.67431,19.10804],[-72.67432,19.10795],[-72.67398,19.10794],[-72.67382,19.10798],[-72.6739,19.10864],[-72.67319,19.10856],[-72.67307,19.10852],[-72.67284,19.10855],[-72.67276,19.10855],[-72.67286,19.10907],[-72.67284,19.10915],[-72.67251,19.10903],[-72.67236,19.10906],[-72.6723,19.10905],[-72.67224,19.10913],[-72.67179,19.10912],[-72.67051,19.10679],[-72.6704,19.10401],[-72.67048,19.10396],[-72.67032,19.10223],[-72.67034,19.1016],[-72.67062,19.09856],[-72.67121,19.09697],[-72.67278,19.09595],[-72.67277,19.09629],[-72.67364,19.09636],[-72.6736,19.09662],[-72.67484,19.09623],[-72.67489,19.09666],[-72.67566,19.09655],[-72.67566,19.09648],[-72.67655,19.09642],[-72.67772,19.09626],[-72.67786,19.09675],[-72.67784,19.09689],[-72.67826,19.09677],[-72.67837,19.09698],[-72.67858,19.09698],[-72.67853,19.09665],[-72.67878,19.09666],[-72.67861,19.09635],[-72.67927,19.09633],[-72.67973,19.0962],[-72.68015,19.09604],[-72.68058,19.09598],[-72.68029,19.09501],[-72.68072,19.095],[-72.68066,19.09474],[-72.68048,19.09418],[-72.68037,19.09335],[-72.68064,19.09335],[-72.68064,19.09266],[-72.67973,19.09263],[-72.67972,19.09269],[-72.67943,19.09266],[-72.67966,19.09132],[-72.67977,19.09107],[-72.68249,19.0892],[-72.68272,19.08907],[-72.68506,19.0888],[-72.68508,19.08888],[-72.68616,19.08873],[-72.6862,19.08887],[-72.68718,19.08866],[-72.68717,19.0886],[-72.68849,19.08844],[-72.68852,19.08847],[-72.69006,19.0884],[-72.69018,19.08871],[-72.69227,19.08828],[-72.69229,19.08887],[-72.69218,19.08924],[-72.69222,19.08928],[-72.69277,19.08923],[-72.69279,19.08933],[-72.69335,19.08934],[-72.69289,19.0888],[-72.69274,19.0883],[-72.69496,19.08857],[-72.69571,19.08831],[-72.69579,19.08892],[-72.69625,19.08904],[-72.69649,19.08889],[-72.69849,19.08845],[-72.69849,19.08866],[-72.6988,19.08858],[-72.69885,19.08895],[-72.69884,19.08903],[-72.69926,19.08895],[-72.70023,19.08884],[-72.70023,19.08893],[-72.70088,19.08892],[-72.7014,19.08887],[-72.70128,19.08828],[-72.70257,19.08859],[-72.70282,19.08874],[-72.70309,19.08883],[-72.70293,19.08855],[-72.70341,19.08862],[-72.70557,19.08863],[-72.70552,19.08906],[-72.70665,19.08889],[-72.70666,19.08938],[-72.70902,19.08917],[-72.70898,19.0891],[-72.71116,19.08894],[-72.71121,19.0892],[-72.71281,19.08912],[-72.71286,19.0898],[-72.71502,19.08882],[-72.71569,19.08838],[-72.71573,19.08847],[-72.7161,19.08824],[-72.71598,19.08795],[-72.71653,19.0877],[-72.71653,19.08761],[-72.71579,19.08781],[-72.71676,19.08727],[-72.71671,19.08717],[-72.71815,19.08638],[-72.71795,19.08602],[-72.71954,19.08518],[-72.71954,19.08511],[-72.72217,19.08467],[-72.72327,19.08506],[-72.72622,19.08712],[-72.72763,19.0891],[-72.72752,19.08973],[-72.72548,19.09295],[-72.72482,19.09403],[-72.72399,19.09495],[-72.72363,19.09461]],[[-72.06537,19.65239],[-72.06565,19.6518],[-72.06603,19.65128],[-72.06697,19.65109],[-72.0676,19.6511],[-72.07102,19.65223],[-72.0719,19.65254],[-72.07189,19.65255],[-72.07264,19.6528],[-72.07262,19.65284],[-72.07268,19.65286],[-72.07269,19.65283],[-72.0733,19.65305],[-72.07393,19.65327],[-72.07416,19.65347],[-72.07418,19.65351],[-72.07435,19.65395],[-72.07432,19.65425],[-72.07419,19.65495],[-72.07399,19.65583],[-72.07384,19.65648],[-72.07307,19.65805],[-72.07274,19.65866],[-72.0727,19.65869],[-72.07228,19.65915],[-72.07221,19.65917],[-72.07196,19.65916],[-72.0714,19.65909],[-72.07012,19.65866],[-72.07017,19.65856],[-72.06983,19.65852],[-72.06984,19.65848],[-72.06939,19.65841],[-72.06944,19.65823],[-72.06941,19.65823],[-72.06937,19.65836],[-72.06842,19.65807],[-72.06707,19.65759],[-72.06451,19.65663],[-72.06434,19.65632],[-72.06421,19.65547],[-72.06422,19.65541],[-72.06472,19.65379],[-72.06487,19.65351],[-72.06537,19.65239]],[[-72.23222,18.69173],[-72.23182,18.69172],[-72.23115,18.69168],[-72.23128,18.69161],[-72.23072,18.69152],[-72.23068,18.69147],[-72.23135,18.69159],[-72.23157,18.69149],[-72.23162,18.69137],[-72.23165,18.69134],[-72.23165,18.69164],[-72.23222,18.69173]],[[-72.2406,18.69192],[-72.23953,18.6921],[-72.23891,18.69207],[-72.23878,18.69207],[-72.23856,18.692],[-72.23818,18.69192],[-72.23186,18.69054],[-72.22977,18.69113],[-72.21709,18.68967],[-72.21618,18.68724],[-72.21599,18.68673],[-72.21602,18.68659],[-72.2159,18.68601],[-72.21581,18.68593],[-72.21561,18.68483],[-72.21569,18.6847],[-72.21578,18.68435],[-72.21595,18.68347],[-72.21629,18.68289],[-72.2164,18.68221],[-72.21633,18.68211],[-72.21641,18.68208],[-72.21642,18.68189],[-72.21694,18.6813],[-72.21685,18.68096],[-72.21693,18.68099],[-72.21722,18.68091],[-72.21734,18.6808],[-72.21731,18.67964],[-72.21749,18.67958],[-72.21749,18.67946],[-72.21747,18.67908],[-72.21743,18.67853],[-72.21739,18.6785],[-72.21718,18.6786],[-72.2171,18.67856],[-72.21708,18.67838],[-72.21724,18.67767],[-72.21724,18.67745],[-72.21721,18.67744],[-72.21681,18.67754],[-72.21671,18.67688],[-72.21662,18.67612],[-72.21642,18.67621],[-72.21601,18.67548],[-72.21596,18.67551],[-72.21589,18.67549],[-72.21552,18.6756],[-72.2154,18.67561],[-72.21529,18.6757],[-72.21521,18.67571],[-72.21491,18.67472],[-72.21464,18.67387],[-72.21456,18.6737],[-72.21447,18.67348],[-72.21413,18.67301],[-72.21427,18.67293],[-72.21413,18.67271],[-72.21383,18.67278],[-72.21339,18.67181],[-72.21178,18.67209],[-72.21169,18.67172],[-72.21135,18.67183],[-72.21116,18.67196],[-72.21077,18.67121],[-72.21058,18.67129],[-72.20984,18.66963],[-72.20972,18.6697],[-72.20966,18.66968],[-72.20918,18.66838],[-72.20895,18.66773],[-72.2093,18.66606],[-72.20937,18.66571],[-72.20974,18.66536],[-72.21031,18.66477],[-72.21021,18.66416],[-72.21042,18.66401],[-72.2111,18.66329],[-72.21167,18.66268],[-72.21179,18.66236],[-72.21206,18.66242],[-72.21193,18.66185],[-72.21188,18.66155],[-72.21199,18.66147],[-72.21239,18.66137],[-72.21331,18.66103],[-72.21393,18.66039],[-72.21376,18.65992],[-72.21355,18.65956],[-72.21376,18.65943],[-72.21349,18.65869],[-72.21296,18.65736],[-72.21357,18.6572],[-72.21312,18.65639],[-72.21281,18.65534],[-72.21317,18.6551],[-72.21308,18.65459],[-72.21347,18.65438],[-72.21374,18.65436],[-72.21382,18.65416],[-72.2135,18.65353],[-72.21304,18.65171],[-72.21345,18.65143],[-72.21341,18.65133],[-72.21364,18.65105],[-72.21418,18.65077],[-72.21378,18.65016],[-72.21364,18.64989],[-72.21372,18.64975],[-72.21429,18.64943],[-72.21379,18.64934],[-72.21362,18.64922],[-72.21382,18.64869],[-72.21354,18.64765],[-72.21331,18.64717],[-72.21366,18.64552],[-72.21389,18.64539],[-72.21377,18.6451],[-72.214,18.64399],[-72.21412,18.64378],[-72.21437,18.64347],[-72.2158,18.64222],[-72.21601,18.64217],[-72.21761,18.64218],[-72.21778,18.64272],[-72.21798,18.64256],[-72.21816,18.64236],[-72.21821,18.6422],[-72.22119,18.64222],[-72.22125,18.6423],[-72.22135,18.64224],[-72.2215,18.64223],[-72.22293,18.64229],[-72.22299,18.64235],[-72.22311,18.64227],[-72.22717,18.64249],[-72.22828,18.64281],[-72.22811,18.6432],[-72.22848,18.64325],[-72.22919,18.64258],[-72.2304,18.64263],[-72.23711,18.64295],[-72.23719,18.64317],[-72.23807,18.64322],[-72.23828,18.64298],[-72.23988,18.64306],[-72.24332,18.6434],[-72.24367,18.64387],[-72.24518,18.64437],[-72.2456,18.64364],[-72.24562,18.64372],[-72.24574,18.64363],[-72.24723,18.64378],[-72.24853,18.64441],[-72.24918,18.64397],[-72.25155,18.64418],[-72.25382,18.64516],[-72.2546,18.64564],[-72.25517,18.64642],[-72.2554,18.64807],[-72.25531,18.64812],[-72.2552,18.64828],[-72.2555,18.64881],[-72.25586,18.64847],[-72.25603,18.64856],[-72.25625,18.64848],[-72.25685,18.64755],[-72.25965,18.64494],[-72.26253,18.64336],[-72.26304,18.64362],[-72.26388,18.64308],[-72.26486,18.64445],[-72.26525,18.64373],[-72.26533,18.64378],[-72.26576,18.64259],[-72.26652,18.64289],[-72.26641,18.64135],[-72.26714,18.64137],[-72.26737,18.6407],[-72.26824,18.64023],[-72.26853,18.6403],[-72.26901,18.63988],[-72.26908,18.63978],[-72.26948,18.63958],[-72.27214,18.63895],[-72.27383,18.63988],[-72.27375,18.64004],[-72.27476,18.64088],[-72.27501,18.64054],[-72.27622,18.64161],[-72.27639,18.64131],[-72.27652,18.64138],[-72.27845,18.643],[-72.27896,18.64273],[-72.2823,18.64457],[-72.28387,18.64607],[-72.28384,18.64611],[-72.28412,18.64641],[-72.28401,18.64647],[-72.28455,18.6471],[-72.28538,18.64803],[-72.28569,18.64785],[-72.28642,18.64857],[-72.28724,18.64936],[-72.28775,18.65003],[-72.28724,18.65028],[-72.28768,18.65089],[-72.28708,18.65122],[-72.28656,18.65188],[-72.28736,18.6532],[-72.2872,18.65332],[-72.2873,18.65355],[-72.28905,18.65383],[-72.28882,18.65459],[-72.28889,18.6546],[-72.28878,18.65512],[-72.29013,18.65481],[-72.29084,18.65766],[-72.2902,18.65767],[-72.29076,18.66015],[-72.28998,18.66022],[-72.29045,18.66151],[-72.29022,18.66161],[-72.29033,18.66256],[-72.29138,18.66227],[-72.29155,18.66276],[-72.29368,18.66243],[-72.29377,18.663],[-72.29441,18.66289],[-72.29444,18.66273],[-72.29656,18.66246],[-72.29662,18.66262],[-72.29708,18.66261],[-72.29692,18.66184],[-72.30025,18.66195],[-72.30141,18.66311],[-72.30141,18.66397],[-72.30192,18.66392],[-72.30197,18.66454],[-72.30311,18.66471],[-72.30471,18.66632],[-72.30471,18.66668],[-72.30505,18.66666],[-72.30529,18.66692],[-72.30519,18.66768],[-72.30607,18.66759],[-72.30749,18.66901],[-72.30782,18.67109],[-72.30784,18.67216],[-72.30757,18.67405],[-72.30716,18.67526],[-72.30674,18.67537],[-72.30687,18.67599],[-72.30657,18.67612],[-72.30611,18.67602],[-72.30585,18.67705],[-72.30607,18.67726],[-72.3061,18.67744],[-72.30635,18.678],[-72.30609,18.67871],[-72.30587,18.67881],[-72.3059,18.67951],[-72.30556,18.68062],[-72.30395,18.68368],[-72.30377,18.68373],[-72.30139,18.68415],[-72.29912,18.68452],[-72.29899,18.68432],[-72.29826,18.6844],[-72.29828,18.6845],[-72.29502,18.68412],[-72.29419,18.68422],[-72.29408,18.68376],[-72.29202,18.68398],[-72.29191,18.68364],[-72.29101,18.68377],[-72.29095,18.68347],[-72.29037,18.68378],[-72.29035,18.68363],[-72.28936,18.68384],[-72.28913,18.68345],[-72.28766,18.6835],[-72.2877,18.68329],[-72.28538,18.68344],[-72.2849,18.68243],[-72.28449,18.68243],[-72.28376,18.68198],[-72.28268,18.68186],[-72.2822,18.68284],[-72.28268,18.68296],[-72.28164,18.68413],[-72.28111,18.68523],[-72.28129,18.68628],[-72.28089,18.68726],[-72.28036,18.68726],[-72.28036,18.68762],[-72.2715,18.688],[-72.2715,18.68774],[-72.27171,18.6875],[-72.27193,18.68611],[-72.2713,18.68611],[-72.27115,18.68635],[-72.27115,18.68735],[-72.26903,18.68805],[-72.26661,18.68821],[-72.26315,18.68817],[-72.25798,18.6868],[-72.25503,18.68501],[-72.25415,18.68242],[-72.25408,18.68278],[-72.25266,18.68732],[-72.25106,18.68819],[-72.24828,18.68927],[-72.24695,18.68917],[-72.24718,18.68966],[-72.24628,18.68966],[-72.24632,18.68997],[-72.24527,18.69032],[-72.24487,18.69045],[-72.24361,18.69036],[-72.24351,18.69029],[-72.24321,18.6903],[-72.24318,18.69051],[-72.24324,18.69061],[-72.24325,18.691],[-72.24303,18.69122],[-72.24166,18.69171],[-72.24149,18.69178],[-72.2406,18.69192]],[[-72.27545,18.56614],[-72.27419,18.56701],[-72.27356,18.56701],[-72.27297,18.56706],[-72.27227,18.56707],[-72.27191,18.56707],[-72.27178,18.56718],[-72.2709,18.56724],[-72.27064,18.56724],[-72.26998,18.56708],[-72.26875,18.56671],[-72.2684,18.56661],[-72.26809,18.56639],[-72.26781,18.56611],[-72.26744,18.5652],[-72.26739,18.56308],[-72.26738,18.5626],[-72.26742,18.56195],[-72.26799,18.56064],[-72.26822,18.56014],[-72.26856,18.55975],[-72.26871,18.55962],[-72.2702,18.55963],[-72.27181,18.55967],[-72.27491,18.55982],[-72.27579,18.55986],[-72.27588,18.55999],[-72.2758,18.56491],[-72.27578,18.56541],[-72.27575,18.56556],[-72.27552,18.56608],[-72.27545,18.56614]],[[-72.33318,18.56014],[-72.33166,18.55959],[-72.33021,18.55904],[-72.32919,18.55866],[-72.3292,18.55861],[-72.32887,18.55838],[-72.32868,18.55826],[-72.3282,18.55827],[-72.32815,18.55828],[-72.3261,18.55752],[-72.32604,18.5575],[-72.32604,18.55745],[-72.32589,18.55732],[-72.32551,18.5573],[-72.32437,18.55688],[-72.32411,18.55678],[-72.32379,18.55662],[-72.32348,18.55633],[-72.32315,18.55628],[-72.32174,18.55556],[-72.32143,18.55541],[-72.3205,18.55488],[-72.32019,18.5547],[-72.32007,18.55453],[-72.31984,18.55412],[-72.31984,18.55385],[-72.31998,18.55322],[-72.32046,18.55124],[-72.32056,18.55083],[-72.32066,18.55047],[-72.32068,18.55039],[-72.32111,18.54857],[-72.32127,18.54791],[-72.32147,18.54719],[-72.32153,18.54699],[-72.322,18.5458],[-72.32203,18.54575],[-72.32354,18.54486],[-72.3236,18.54483],[-72.3236,18.54481],[-72.32486,18.54407],[-72.32534,18.54378],[-72.32533,18.5439],[-72.32534,18.54392],[-72.32555,18.54416],[-72.32588,18.54452],[-72.3259,18.54453],[-72.32621,18.54452],[-72.3266,18.54452],[-72.32666,18.54398],[-72.32669,18.54367],[-72.32666,18.54361],[-72.32666,18.54356],[-72.32669,18.54356],[-72.32677,18.5436],[-72.32704,18.54363],[-72.32714,18.5432],[-72.32713,18.54314],[-72.32704,18.54317],[-72.32697,18.54316],[-72.32698,18.54296],[-72.32697,18.54293],[-72.32697,18.54281],[-72.32728,18.54263],[-72.32814,18.5424],[-72.32864,18.54226],[-72.3297,18.54228],[-72.32979,18.54228],[-72.33174,18.54279],[-72.33242,18.54298],[-72.33329,18.54319],[-72.33328,18.54321],[-72.33529,18.54372],[-72.33589,18.54387],[-72.33689,18.54504],[-72.33734,18.54555],[-72.33761,18.546],[-72.33783,18.54639],[-72.33788,18.54658],[-72.33791,18.54693],[-72.33792,18.54705],[-72.33763,18.54705],[-72.33749,18.54705],[-72.33751,18.54753],[-72.33751,18.54764],[-72.33747,18.54764],[-72.33748,18.54773],[-72.33742,18.54773],[-72.33739,18.54776],[-72.33735,18.54773],[-72.33734,18.54774],[-72.33726,18.54774],[-72.33725,18.54782],[-72.33725,18.54804],[-72.33728,18.548],[-72.3373,18.54798],[-72.3373,18.54796],[-72.33737,18.54788],[-72.33739,18.54789],[-72.33741,18.5478],[-72.33744,18.5478],[-72.33755,18.5477],[-72.33752,18.54764],[-72.33773,18.54741],[-72.33775,18.54741],[-72.33775,18.54737],[-72.33789,18.54721],[-72.3389,18.54828],[-72.33902,18.54842],[-72.34008,18.55026],[-72.34014,18.55034],[-72.34028,18.55068],[-72.34041,18.55099],[-72.34029,18.55156],[-72.34021,18.55185],[-72.33985,18.55283],[-72.33973,18.55315],[-72.33927,18.55425],[-72.33914,18.55457],[-72.33915,18.55458],[-72.3391,18.5547],[-72.33896,18.55506],[-72.33847,18.55626],[-72.33842,18.55625],[-72.33844,18.55631],[-72.33832,18.55661],[-72.33822,18.55686],[-72.33821,18.55687],[-72.33816,18.55699],[-72.33815,18.55698],[-72.33807,18.557],[-72.33803,18.557],[-72.33806,18.55726],[-72.338,18.55742],[-72.33716,18.5593],[-72.33709,18.55945],[-72.33843,18.55931],[-72.33929,18.55922],[-72.33982,18.55941],[-72.33983,18.55943],[-72.34028,18.55975],[-72.34092,18.5598],[-72.34096,18.5598],[-72.34413,18.5609],[-72.3446,18.56107],[-72.34472,18.56111],[-72.34472,18.56109],[-72.34829,18.5623],[-72.34912,18.5626],[-72.35035,18.56335],[-72.35302,18.56496],[-72.35333,18.56616],[-72.35351,18.56901],[-72.35337,18.56949],[-72.35156,18.57185],[-72.35042,18.57341],[-72.35036,18.57338],[-72.34849,18.57592],[-72.34815,18.57636],[-72.34756,18.57636],[-72.34753,18.57634],[-72.34746,18.57647],[-72.34745,18.57639],[-72.34705,18.57703],[-72.34659,18.57672],[-72.34649,18.57683],[-72.34544,18.57618],[-72.34365,18.57629],[-72.34361,18.57636],[-72.34354,18.57631],[-72.34258,18.5764],[-72.34252,18.57699],[-72.3428,18.57707],[-72.343,18.57715],[-72.3429,18.57737],[-72.34338,18.5774],[-72.34321,18.57803],[-72.34324,18.57803],[-72.3432,18.57816],[-72.3444,18.57852],[-72.34395,18.57972],[-72.34414,18.57976],[-72.34377,18.58067],[-72.34424,18.58074],[-72.34398,18.58155],[-72.34388,18.58181],[-72.34392,18.5818],[-72.34371,18.5823],[-72.34375,18.58229],[-72.34371,18.58237],[-72.34283,18.58355],[-72.3424,18.58413],[-72.34238,18.58411],[-72.34234,18.58411],[-72.34209,18.58403],[-72.34207,18.58434],[-72.342,18.58433],[-72.34192,18.58474],[-72.34192,18.58477],[-72.34118,18.58575],[-72.3408,18.58627],[-72.34024,18.58655],[-72.33983,18.58675],[-72.33542,18.58843],[-72.33539,18.58845],[-72.33539,18.58843],[-72.33517,18.58851],[-72.3346,18.58806],[-72.33372,18.58896],[-72.33361,18.58917],[-72.33295,18.58941],[-72.33253,18.58912],[-72.33252,18.58916],[-72.33168,18.58889],[-72.33157,18.5891],[-72.33152,18.58918],[-72.33153,18.58917],[-72.33152,18.5892],[-72.33158,18.58929],[-72.33161,18.58934],[-72.33136,18.58951],[-72.33134,18.58953],[-72.33135,18.58954],[-72.3313,18.58963],[-72.33132,18.58976],[-72.33112,18.58977],[-72.33118,18.58983],[-72.33097,18.59017],[-72.33011,18.5905],[-72.32965,18.59068],[-72.32418,18.59182],[-72.3238,18.59189],[-72.32228,18.59068],[-72.32079,18.58947],[-72.32076,18.58801],[-72.32078,18.588],[-72.32078,18.58706],[-72.32073,18.58691],[-72.32073,18.58626],[-72.32092,18.58625],[-72.32081,18.58589],[-72.32074,18.58593],[-72.3207,18.58531],[-72.32114,18.58437],[-72.32185,18.58274],[-72.32202,18.58277],[-72.3222,18.58276],[-72.32211,18.58251],[-72.32196,18.58249],[-72.32242,18.5815],[-72.32245,18.5815],[-72.32295,18.58034],[-72.32368,18.579],[-72.32465,18.57947],[-72.32575,18.57852],[-72.32661,18.5778],[-72.32721,18.57838],[-72.32824,18.57817],[-72.32848,18.57756],[-72.32855,18.5776],[-72.32938,18.57666],[-72.32907,18.57629],[-72.32936,18.57607],[-72.32877,18.57563],[-72.32975,18.57451],[-72.32968,18.57443],[-72.32989,18.57408],[-72.32994,18.57359],[-72.3296,18.57363],[-72.32997,18.57247],[-72.33009,18.57153],[-72.33017,18.57152],[-72.33047,18.57045],[-72.3314,18.57052],[-72.33167,18.56999],[-72.33027,18.56999],[-72.33025,18.57003],[-72.33006,18.57004],[-72.3297,18.57],[-72.32981,18.56877],[-72.32877,18.56765],[-72.32858,18.56749],[-72.32877,18.56711],[-72.32912,18.5668],[-72.32897,18.56664],[-72.32938,18.56572],[-72.32946,18.56554],[-72.33052,18.56424],[-72.33056,18.56424],[-72.33056,18.5642],[-72.33105,18.56367],[-72.33112,18.56374],[-72.33111,18.56376],[-72.33117,18.56377],[-72.33131,18.56391],[-72.33153,18.5641],[-72.33154,18.56385],[-72.33161,18.56365],[-72.33168,18.56329],[-72.33169,18.56322],[-72.33171,18.56319],[-72.33181,18.5628],[-72.33187,18.5626],[-72.33299,18.56123],[-72.33318,18.561],[-72.33365,18.56064],[-72.33393,18.56042],[-72.33367,18.56033],[-72.33367,18.56027],[-72.33332,18.56011],[-72.33318,18.56014]],[[-72.31173,18.56168],[-72.31195,18.56259],[-72.31221,18.56365],[-72.31259,18.56628],[-72.31254,18.5663],[-72.31264,18.56654],[-72.31266,18.56682],[-72.3127,18.56687],[-72.31276,18.56734],[-72.31256,18.56746],[-72.31232,18.56754],[-72.31229,18.56757],[-72.31199,18.5677],[-72.31216,18.56801],[-72.31227,18.56815],[-72.31231,18.56828],[-72.31239,18.56841],[-72.31291,18.56909],[-72.31281,18.56916],[-72.31306,18.56945],[-72.31309,18.56956],[-72.31323,18.57061],[-72.31325,18.57137],[-72.31325,18.57213],[-72.31234,18.57268],[-72.31117,18.57341],[-72.30971,18.5739],[-72.30911,18.5739],[-72.30894,18.57369],[-72.3086,18.57389],[-72.30712,18.57389],[-72.307,18.57357],[-72.30666,18.57388],[-72.30605,18.57389],[-72.30581,18.57367],[-72.30555,18.57388],[-72.3007,18.57387],[-72.30059,18.57369],[-72.30044,18.57386],[-72.29691,18.57388],[-72.29518,18.57386],[-72.295,18.57371],[-72.29473,18.57341],[-72.29387,18.5722],[-72.29341,18.57156],[-72.29338,18.57142],[-72.2933,18.57075],[-72.29338,18.57008],[-72.29349,18.56992],[-72.29361,18.56978],[-72.29361,18.56985],[-72.29378,18.56959],[-72.29364,18.56957],[-72.29345,18.56951],[-72.29358,18.56919],[-72.29389,18.56859],[-72.29373,18.56847],[-72.29359,18.56827],[-72.29359,18.5681],[-72.29379,18.5679],[-72.29403,18.56774],[-72.29387,18.56762],[-72.29368,18.56743],[-72.29396,18.56457],[-72.29411,18.56426],[-72.29401,18.56418],[-72.29402,18.5638],[-72.29412,18.56283],[-72.29451,18.56209],[-72.29462,18.56196],[-72.29767,18.5617],[-72.29849,18.56192],[-72.29864,18.56184],[-72.29857,18.56174],[-72.2988,18.56157],[-72.30144,18.56133],[-72.30181,18.56176],[-72.30228,18.56125],[-72.30275,18.56122],[-72.30427,18.56126],[-72.30505,18.56147],[-72.30522,18.5613],[-72.30609,18.56132],[-72.30821,18.56138],[-72.31173,18.56168]]]},{id:"DroneImageryCanaanHaitiNovember2015",name:"Drone Imagery Canaan(Haiti) November 2015",type:"tms",template:"http://wms.openstreetmap.fr/tms/1.0.0/haiti_canaan_nov2015/{zoom}/{x}/{y}",endDate:"2015-11-01T00:00:00.000Z",startDate:"2015-11-01T00:00:00.000Z",polygon:[[[-72.23109,18.67676],[-72.23101,18.67675],[-72.23108,18.67675],[-72.23104,18.67669],[-72.23105,18.67665],[-72.23151,18.67663],[-72.23153,18.67665],[-72.23146,18.67676],[-72.23285,18.67669],[-72.23506,18.67641],[-72.23507,18.67638],[-72.23507,18.67635],[-72.23505,18.67635],[-72.23511,18.6762],[-72.23509,18.67614],[-72.23523,18.67613],[-72.23522,18.67611],[-72.23523,18.67606],[-72.2352,18.67598],[-72.23515,18.6758],[-72.23629,18.67565],[-72.23625,18.67553],[-72.23624,18.67551],[-72.23648,18.67548],[-72.23648,18.67565],[-72.23648,18.67581],[-72.23689,18.67575],[-72.2372,18.67571],[-72.23747,18.67567],[-72.23772,18.67563],[-72.23805,18.6756],[-72.23854,18.67555],[-72.23888,18.67552],[-72.239,18.67551],[-72.23897,18.67565],[-72.23897,18.67571],[-72.23901,18.67576],[-72.239,18.67576],[-72.23902,18.67584],[-72.23905,18.67589],[-72.23929,18.67587],[-72.23981,18.67581],[-72.24059,18.67571],[-72.24142,18.67561],[-72.24177,18.67556],[-72.24179,18.67553],[-72.2421,18.67551],[-72.24272,18.67545],[-72.24276,18.67536],[-72.24278,18.67537],[-72.24279,18.67537],[-72.24299,18.67536],[-72.24334,18.67535],[-72.24339,18.67535],[-72.2434,18.67534],[-72.24372,18.67532],[-72.24424,18.67525],[-72.24443,18.67509],[-72.2474,18.67253],[-72.24731,18.67233],[-72.24681,18.67157],[-72.2469,18.67061],[-72.24652,18.67055],[-72.24661,18.66991],[-72.24669,18.66991],[-72.24688,18.66884],[-72.24707,18.66789],[-72.24709,18.66749],[-72.24728,18.66743],[-72.24716,18.66691],[-72.24717,18.66642],[-72.24703,18.66644],[-72.24701,18.66616],[-72.24971,18.66598],[-72.24947,18.66475],[-72.24989,18.66489],[-72.24989,18.66507],[-72.25113,18.66515],[-72.25102,18.66548],[-72.25111,18.66548],[-72.25111,18.66559],[-72.25219,18.66551],[-72.25387,18.66554],[-72.25387,18.66563],[-72.25551,18.66559],[-72.25638,18.66484],[-72.25719,18.66359],[-72.25763,18.66208],[-72.25768,18.65694],[-72.25779,18.64996],[-72.25713,18.64563],[-72.25696,18.64517],[-72.25564,18.64352],[-72.2493,18.64358],[-72.2482,18.64361],[-72.24637,18.64397],[-72.24629,18.64462],[-72.24454,18.64436],[-72.24442,18.64527],[-72.24311,18.6455],[-72.24326,18.64639],[-72.24286,18.64794],[-72.24272,18.64801],[-72.24282,18.6482],[-72.24257,18.64894],[-72.24109,18.64902],[-72.24109,18.64918],[-72.2405,18.64906],[-72.24036,18.6495],[-72.2403,18.64863],[-72.23753,18.64915],[-72.23664,18.64899],[-72.23666,18.64883],[-72.23582,18.64888],[-72.23488,18.64878],[-72.23487,18.64893],[-72.2338,18.649],[-72.23384,18.64932],[-72.23262,18.64927],[-72.2325,18.64824],[-72.23028,18.64837],[-72.23028,18.64821],[-72.22743,18.64815],[-72.2263,18.64775],[-72.22608,18.64845],[-72.22583,18.64841],[-72.22576,18.64828],[-72.22417,18.64849],[-72.22417,18.64805],[-72.22166,18.64804],[-72.21921,18.6485],[-72.21767,18.64995],[-72.21719,18.6509],[-72.21637,18.65422],[-72.21633,18.65888],[-72.21633,18.66198],[-72.2171,18.66448],[-72.21737,18.66441],[-72.21814,18.66454],[-72.21864,18.66568],[-72.21837,18.66588],[-72.21881,18.66817],[-72.21881,18.66893],[-72.21846,18.66888],[-72.21884,18.67018],[-72.22015,18.67173],[-72.22175,18.67311],[-72.22175,18.67288],[-72.2225,18.67317],[-72.22257,18.67357],[-72.22241,18.67368],[-72.22489,18.67588],[-72.2287,18.67693],[-72.23073,18.6768],[-72.23111,18.67678],[-72.23109,18.67676]]]},{id:"drone-imagery-2016",name:"Drone Imagery Matthew(Haiti) October 2016",type:"tms",template:"https://imagery.openstreetmap.fr/tms/1.0.0/haiti_uav_201610/{zoom}/{x}/{y}",endDate:"2016-10-01T00:00:00.000Z",startDate:"2016-10-01T00:00:00.000Z",polygon:[[[-74.11291,18.64948],[-74.10903,18.64598],[-74.10873,18.64446],[-74.1095,18.64452],[-74.1095,18.64181],[-74.10968,18.64187],[-74.11053,18.64103],[-74.10988,18.64034],[-74.11005,18.64014],[-74.11005,18.64009],[-74.11011,18.64002],[-74.10949,18.63959],[-74.1095,18.63924],[-74.10904,18.63926],[-74.10894,18.63917],[-74.10905,18.63912],[-74.10898,18.63899],[-74.10782,18.63839],[-74.10823,18.63775],[-74.10812,18.63764],[-74.10786,18.63774],[-74.10768,18.63733],[-74.10748,18.63719],[-74.10722,18.63559],[-74.10901,18.63394],[-74.11678,18.62847],[-74.11952,18.62815],[-74.12251,18.63132],[-74.12731,18.63703],[-74.12684,18.6374],[-74.12731,18.63771],[-74.12768,18.63756],[-74.13403,18.64671],[-74.13401,18.64897],[-74.13087,18.65167],[-74.13076,18.65153],[-74.13053,18.65179],[-74.13054,18.65195],[-74.12878,18.65342],[-74.1274,18.65412],[-74.12514,18.65497],[-74.11997,18.65432],[-74.11938,18.65429],[-74.11291,18.64948]],[[-74.11305,18.4922],[-74.10884,18.49216],[-74.10118,18.49095],[-74.10105,18.49057],[-74.10131,18.4902],[-74.10101,18.48996],[-74.10142,18.48933],[-74.10099,18.48931],[-74.1009,18.48886],[-74.10166,18.48725],[-74.10108,18.48713],[-74.10133,18.48664],[-74.10058,18.48654],[-74.10048,18.48552],[-74.10062,18.4849],[-74.10037,18.48478],[-74.10012,18.4827],[-74.09994,18.48123],[-74.10033,18.48114],[-74.10242,18.48116],[-74.10492,18.48149],[-74.10771,18.48189],[-74.1099,18.48226],[-74.10987,18.48243],[-74.10992,18.48246],[-74.11018,18.48232],[-74.11196,18.48261],[-74.11247,18.48278],[-74.11316,18.48382],[-74.1134,18.48521],[-74.11349,18.48709],[-74.11338,18.48704],[-74.11336,18.48717],[-74.11349,18.48727],[-74.11355,18.48931],[-74.11349,18.48949],[-74.1135,18.48951],[-74.11349,18.48952],[-74.11347,18.48951],[-74.11334,18.48957],[-74.11336,18.48962],[-74.11341,18.48958],[-74.11344,18.48959],[-74.11349,18.48956],[-74.11352,18.48957],[-74.11355,18.48956],[-74.11357,18.48998],[-74.11359,18.49067],[-74.11354,18.49108],[-74.11322,18.492],[-74.11305,18.4922]],[[-74.10198,18.24954],[-74.09767,18.24744],[-74.09419,18.2474],[-74.09338,18.24885],[-74.09638,18.25292],[-74.09934,18.25335],[-74.10198,18.24954]],[[-74.02901,18.59744],[-74.02881,18.60255],[-74.00847,18.60182],[-74.00867,18.59671],[-74.02901,18.59744]],[[-73.91991,18.07466],[-73.91468,18.07482],[-73.91535,18.07742],[-73.91478,18.08009],[-73.91997,18.08014],[-73.91924,18.07802],[-73.91999,18.07637],[-73.91991,18.07466]],[[-74.22365,18.3081],[-74.22061,18.30272],[-74.21902,18.30278],[-74.21592,18.30364],[-74.21615,18.30804],[-74.22365,18.3081]],[[-74.00508,18.17646],[-74.00072,18.17657],[-74.00186,18.18175],[-74.00269,18.18344],[-74.00653,18.18336],[-74.00715,18.18218],[-74.00649,18.18056],[-74.0052,18.17922],[-74.00508,18.17646]],[[-74.0653,18.22881],[-74.06361,18.2268],[-74.06114,18.22672],[-74.05968,18.22853],[-74.06281,18.23083],[-74.06446,18.23034],[-74.0653,18.22881]],[[-74.11371,18.47184],[-74.11002,18.47177],[-74.10959,18.47536],[-74.11341,18.47497],[-74.11371,18.47184]],[[-73.95852,18.47452],[-73.95446,18.47465],[-73.95548,18.4794],[-73.95965,18.47878],[-73.95852,18.47452]],[[-74.16719,18.27229],[-74.16196,18.27232],[-74.16175,18.27303],[-74.16255,18.27452],[-74.16372,18.27542],[-74.16341,18.27749],[-74.16404,18.27854],[-74.16756,18.27868],[-74.16742,18.27592],[-74.16775,18.27416],[-74.16719,18.27229]],[[-74.11091,18.45286],[-74.10701,18.45258],[-74.10684,18.4586],[-74.11102,18.45781],[-74.11091,18.45286]],[[-73.76854,18.18022],[-73.75773,18.18006],[-73.73559,18.19311],[-73.73567,18.20143],[-73.74563,18.20191],[-73.74468,18.22311],[-73.77121,18.22417],[-73.77129,18.20844],[-73.76915,18.2064],[-73.76854,18.18022]],[[-74.13455,18.60914],[-74.1388,18.60929],[-74.13871,18.61165],[-74.13447,18.6115],[-74.13455,18.60914]],[[-74.04228,18.20945],[-74.042,18.20484],[-74.04155,18.20239],[-74.03959,18.20051],[-74.03836,18.20028],[-74.03764,18.20242],[-74.03792,18.20562],[-74.03918,18.20932],[-74.04228,18.20945]],[[-74.08668,18.61121],[-74.08669,18.61217],[-74.09146,18.61689],[-74.09211,18.61603],[-74.09313,18.61699],[-74.09603,18.62025],[-74.09627,18.6206],[-74.0967,18.62202],[-74.09337,18.62651],[-74.09237,18.62754],[-74.08862,18.62596],[-74.08863,18.62561],[-74.08778,18.62561],[-74.08661,18.6251],[-74.08662,18.62368],[-74.08514,18.62367],[-74.08462,18.62289],[-74.08463,18.62175],[-74.08339,18.62174],[-74.08261,18.62057],[-74.08262,18.61982],[-74.07659,18.6198],[-74.07658,18.61596],[-74.07255,18.61591],[-74.07259,18.61403],[-74.07062,18.61402],[-74.06858,18.6129],[-74.06855,18.61208],[-74.06614,18.61207],[-74.06414,18.61206],[-74.0625,18.61105],[-74.06254,18.61011],[-74.05927,18.61013],[-74.0545,18.60876],[-74.05451,18.60817],[-74.05168,18.60816],[-74.04932,18.60776],[-74.04647,18.60664],[-74.04646,18.6062],[-74.04243,18.6062],[-74.04133,18.60592],[-74.03625,18.60378],[-74.03597,18.60345],[-74.03642,18.60252],[-74.03719,18.6019],[-74.04003,18.60217],[-74.05608,18.60473],[-74.05851,18.6054],[-74.05861,18.60623],[-74.0611,18.60627],[-74.06481,18.60745],[-74.06518,18.60686],[-74.06679,18.60802],[-74.0696,18.60885],[-74.07142,18.60711],[-74.07239,18.60736],[-74.07515,18.61024],[-74.07701,18.61019],[-74.07798,18.61096],[-74.07901,18.61013],[-74.08109,18.61234],[-74.08234,18.60896],[-74.08383,18.60922],[-74.08513,18.60977],[-74.08668,18.61121]],[[-74.45922,18.4663],[-74.45589,18.46471],[-74.44779,18.47],[-74.44693,18.4713],[-74.44726,18.47934],[-74.44554,18.47915],[-74.44515,18.48326],[-74.43968,18.4839],[-74.439,18.48762],[-74.44299,18.49004],[-74.44906,18.49104],[-74.45382,18.49311],[-74.45571,18.49635],[-74.45786,18.49725],[-74.46052,18.49523],[-74.46241,18.49143],[-74.46198,18.48799],[-74.45537,18.48597],[-74.45526,18.47111],[-74.45944,18.46871],[-74.45922,18.4663]],[[-74.41888,18.57551],[-74.41499,18.57331],[-74.41045,18.57648],[-74.40824,18.58233],[-74.40954,18.58894],[-74.4112,18.59195],[-74.41081,18.59689],[-74.41663,18.60063],[-74.42178,18.59671],[-74.42146,18.59416],[-74.41745,18.59419],[-74.41753,18.59067],[-74.41538,18.59002],[-74.41533,18.58382],[-74.41652,18.58382],[-74.41756,18.5814],[-74.41756,18.57967],[-74.41924,18.57754],[-74.41888,18.57551]]]},{id:"Erlangen-2011",name:"Erlangen Luftbild (2011 5,0 cm)",type:"wms",template:"https://secure.erlangen.de/arcgiser/services/Luftbilder2011/MapServer/WmsServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Erlangen_ratio10_5cm_gk4.jp2&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2011-01-01T00:00:00.000Z",startDate:"2011-01-01T00:00:00.000Z",polygon:[[[10.92791,49.53196],[10.97194,49.52969],[10.97821,49.53568],[10.99934,49.53589],[11.03214,49.53089],[11.04425,49.54317],[11.03842,49.55239],[11.03663,49.57167],[11.04029,49.58572],[11.07287,49.58587],[11.07243,49.63486],[11.0054,49.6344],[11.00397,49.62599],[10.9748,49.62541],[10.94293,49.64563],[10.92532,49.64876],[10.91002,49.63793],[10.92235,49.60463],[10.91949,49.57823],[10.91135,49.57095],[10.91256,49.5606],[10.92907,49.55674],[10.92791,49.53196]]],terms_text:"© Stadt Erlangen | © Aerowest GmbH"},{id:"Erlangen-2013",name:"Erlangen Luftbild (2013 6,25 cm)",type:"wms",template:"https://secure.erlangen.de/arcgiser/services/Luftbilder2013/MapServer/WmsServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Erlangen_ratio5_6.25cm.jp2&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2013-01-01T00:00:00.000Z",startDate:"2013-01-01T00:00:00.000Z",polygon:[[[10.92791,49.53196],[10.9726,49.52939],[10.97909,49.53475],[10.99934,49.53589],[11.03214,49.53089],[11.04425,49.54317],[11.03842,49.55239],[11.03743,49.57873],[11.0568,49.592],[11.05748,49.61358],[11.04681,49.61447],[11.04788,49.6187],[11.00308,49.62367],[10.98107,49.62339],[10.98069,49.62617],[10.96737,49.62781],[10.96539,49.63415],[10.94293,49.64563],[10.92532,49.64876],[10.91002,49.63793],[10.92235,49.60463],[10.91949,49.57823],[10.91135,49.57095],[10.91256,49.5606],[10.92907,49.55674],[10.92791,49.53196]]],terms_text:"© Stadt Erlangen | © Aerowest GmbH"},{id:"Erlangen-2016",name:"Erlangen Luftbild (2016 5,0 cm)",type:"tms",template:"https://osm.rrze.fau.de/protected/YgktSWTTo6HS9nKi/lbe2016/{zoom}/{x}/{y}.jpg",endDate:"2016-03-18T00:00:00.000Z",startDate:"2016-03-18T00:00:00.000Z",zoomExtent:[0,21],polygon:[[[10.97664,49.53765],[10.99101,49.53392],[10.99389,49.53835],[11.02784,49.53254],[11.0346,49.53462],[11.03407,49.53759],[11.04318,49.54321],[11.03557,49.55303],[11.0384,49.55842],[11.03508,49.56929],[11.03791,49.58659],[11.04797,49.5902],[11.04922,49.5937],[11.05749,49.59521],[11.05623,49.59905],[11.05127,49.6003],[11.05351,49.60904],[11.04309,49.61381],[11.04076,49.61823],[11.0285,49.61735],[11.01929,49.61896],[11.0152,49.61372],[11.00581,49.61448],[11.00639,49.61931],[11.00083,49.6221],[10.9856,49.61651],[10.97837,49.61753],[10.9737,49.62495],[10.96539,49.62557],[10.96063,49.62856],[10.96382,49.63176],[10.95474,49.6379],[10.94837,49.637],[10.94185,49.64377],[10.9273,49.64837],[10.92063,49.63963],[10.91136,49.63773],[10.92429,49.60505],[10.92205,49.58004],[10.91221,49.57008],[10.91441,49.5618],[10.92353,49.55842],[10.92712,49.55976],[10.93345,49.55892],[10.93071,49.54467],[10.93067,49.53225],[10.9406,49.53325],[10.95488,49.53021],[10.97199,49.53126],[10.97664,49.53765]]],terms_text:"© Stadt Erlangen | © GEOCART GmbH"},{id:"Erlangen-2018",name:"Erlangen Luftbild (2018 5,0 cm)",type:"tms",template:"https://osm.rrze.fau.de/protected/YgktSWTTo6HS9nKi/lbe2018/{zoom}/{x}/{y}.jpg",endDate:"2018-04-09T00:00:00.000Z",startDate:"2018-04-09T00:00:00.000Z",zoomExtent:[0,21],polygon:[[[10.85157,49.55172],[10.93037,49.55272],[10.9326,49.55818],[10.91627,49.55882],[10.91144,49.56652],[10.92281,49.60584],[10.9108,49.63751],[10.92775,49.64838],[10.94444,49.64321],[10.96487,49.63317],[10.96384,49.62711],[10.9745,49.62483],[10.9786,49.61794],[10.98478,49.61694],[10.998,49.62228],[11.00813,49.62194],[11.0071,49.61449],[11.01448,49.61394],[11.02081,49.62292],[11.05757,49.63993],[11.08136,49.62614],[11.08312,49.62034],[11.10419,49.61524],[11.11767,49.61449],[11.11997,49.60377],[11.13132,49.60348],[11.1272,49.58815],[11.10271,49.58378],[11.08898,49.59124],[11.07988,49.60837],[11.05808,49.60971],[11.06049,49.59803],[11.06512,49.59614],[11.0689,49.58879],[11.06031,49.58556],[11.04469,49.58913],[11.03851,49.58556],[11.03577,49.57276],[11.03937,49.55785],[11.04272,49.5432],[11.03465,49.5324],[10.97531,49.53467],[10.97158,49.53084],[10.94279,49.52986],[10.94273,49.50582],[10.92163,49.50566],[10.91245,49.51829],[10.88818,49.52834],[10.87518,49.51725],[10.84872,49.52291],[10.84652,49.52797],[10.84637,49.53223],[10.85157,49.55172]]],terms_text:"© Stadt Erlangen | © Hansa Luftbild AG",best:true},{id:"EsriWorldImagery",name:"Esri World Imagery",type:"tms",template:"https://{switch:services,server}.arcgisonline.com/arcgis/rest/services/World_Imagery/MapServer/tile/{zoom}/{y}/{x}",zoomExtent:[0,22],terms_url:"https://wiki.openstreetmap.org/wiki/Esri",terms_text:"Terms & Feedback","default":true,description:"Esri world imagery.",icon:"https://osmlab.github.io/editor-layer-index/sources/world/EsriImageryClarity.png"},{id:"EsriWorldImageryClarity",name:"Esri World Imagery (Clarity) Beta",type:"tms",template:"https://clarity.maptiles.arcgis.com/arcgis/rest/services/World_Imagery/MapServer/tile/{zoom}/{y}/{x}",zoomExtent:[0,22],terms_url:"https://wiki.openstreetmap.org/wiki/Esri",terms_text:"Terms & Feedback","default":true,description:"Esri archive imagery that may be clearer and more accurate than the default layer.",icon:"https://osmlab.github.io/editor-layer-index/sources/world/EsriImageryClarity.png"},{id:"maaamet.ee-pohi_vr2",name:"Estonia Basemap (Maaamet)",type:"wms",template:"https://kaart.maaamet.ee/wms/alus-geo?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&Layers=pohi_vr2&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",polygon:[[[22.35364,58.85385],[22.09411,58.85038],[22.09179,58.8951],[22.00503,58.89371],[21.99979,58.98374],[22.34754,58.98845],[22.34535,59.03337],[22.51935,59.03538],[22.51556,59.1251],[22.69017,59.12686],[22.69212,59.08218],[22.77912,59.083],[22.78083,59.03814],[22.86808,59.03877],[22.8693,58.99399],[22.9563,58.99487],[22.95495,59.03959],[23.12895,59.04097],[23.12786,59.08582],[23.47671,59.0877],[23.47415,59.26726],[23.64924,59.26788],[23.64888,59.31281],[23.73698,59.313],[23.73649,59.3578],[23.91158,59.35787],[23.91207,59.4028],[24.176,59.4028],[24.17637,59.4478],[24.26446,59.44767],[24.26471,59.49236],[24.70605,59.49082],[24.70898,59.62553],[24.79744,59.62497],[24.79659,59.58009],[24.97327,59.57885],[24.97462,59.62386],[24.88603,59.62473],[24.88725,59.66918],[24.9762,59.66863],[24.9773,59.71346],[25.06601,59.71259],[25.0632,59.62306],[25.24037,59.62145],[25.24184,59.66647],[25.33055,59.66548],[25.32884,59.62078],[25.41755,59.61979],[25.41938,59.66468],[25.6855,59.66148],[25.68757,59.70613],[25.86511,59.70386],[25.86279,59.65901],[26.12855,59.65507],[26.12575,59.6101],[26.39114,59.60565],[26.38809,59.56099],[26.82967,59.55215],[26.82626,59.50729],[26.91423,59.50549],[26.91057,59.46051],[27.96689,59.43303],[27.9719,59.4778],[28.03669,59.4757],[28.04377,59.47223],[28.04767,59.46578],[28.05182,59.46342],[28.06915,59.46256],[28.08452,59.45939],[28.12174,59.44091],[28.13577,59.4277],[28.13711,59.42267],[28.14163,59.41901],[28.16652,59.41205],[28.17225,59.40789],[28.19275,59.4015],[28.21069,59.3836],[28.21069,59.37994],[28.20386,59.37459],[28.21057,59.37235],[28.21105,59.36937],[28.20678,59.36719],[28.20703,59.36377],[28.19971,59.36091],[28.20203,59.35731],[28.19263,59.35227],[28.19397,59.34642],[28.16969,59.33354],[28.13626,59.29244],[28.12515,59.28901],[28.11722,59.28895],[28.1099,59.29063],[28.05353,59.2902],[28.02022,59.28334],[27.99825,59.2753],[27.97983,59.27293],[27.96433,59.27268],[27.95335,59.26863],[27.9492,59.26533],[27.90564,59.24044],[27.90113,59.23488],[27.901,59.22639],[27.89783,59.21746],[27.90235,59.20728],[27.89234,59.19222],[27.88978,59.18379],[27.87648,59.17372],[27.87184,59.16841],[27.86818,59.16159],[27.84414,59.14814],[27.83206,59.14401],[27.82035,59.13362],[27.80986,59.12905],[27.80595,59.12166],[27.80534,59.1127],[27.81071,59.10819],[27.8101,59.10606],[27.80205,59.1028],[27.78887,59.0909],[27.7907,59.08112],[27.79375,59.07842],[27.79411,59.07566],[27.79277,59.0729],[27.79302,59.06927],[27.7885,59.06657],[27.78265,59.065],[27.77508,59.0581],[27.77313,59.05107],[27.77667,59.04743],[27.76983,59.03325],[27.76605,59.03155],[27.75153,59.03017],[27.74628,59.02716],[27.74567,59.01705],[27.74165,59.00951],[27.74787,58.99267],[27.74274,58.98845],[27.73213,58.9855],[27.6544,58.98783],[27.65501,58.99241],[27.39414,58.99964],[27.38974,58.95474],[27.12935,58.96135],[27.12557,58.9164],[27.03882,58.91841],[27.0271,58.7841],[27.11361,58.78183],[27.10934,58.73709],[27.19537,58.73512],[27.18731,58.64533],[27.27309,58.64305],[27.25259,58.41883],[27.53397,58.41142],[27.5552,58.36575],[27.51762,58.33265],[27.51408,58.32214],[27.49993,58.32246],[27.48687,58.18803],[27.52872,58.18687],[27.59205,58.11875],[27.63695,58.09735],[27.60938,58.05399],[27.62268,58.0058],[27.64489,58.00205],[27.65294,58.00644],[27.64781,58.01426],[27.64781,58.02086],[27.66172,58.01866],[27.66856,58.01045],[27.68393,58.00845],[27.6965,58.0045],[27.70065,57.99862],[27.69882,57.98827],[27.69125,57.98549],[27.68064,57.97449],[27.6821,57.9719],[27.68893,57.97184],[27.68588,57.95928],[27.65892,57.9554],[27.66758,57.951],[27.67161,57.94627],[27.66917,57.94174],[27.67649,57.93552],[27.68247,57.93655],[27.68613,57.92794],[27.68247,57.92437],[27.71078,57.92392],[27.72029,57.92036],[27.72054,57.91174],[27.70834,57.90616],[27.69882,57.90616],[27.70614,57.90136],[27.72896,57.90739],[27.74677,57.90169],[27.7536,57.90409],[27.75739,57.90318],[27.75592,57.89806],[27.76959,57.89566],[27.78094,57.89832],[27.799,57.89961],[27.81852,57.89579],[27.82096,57.89047],[27.81949,57.888],[27.81059,57.88612],[27.81827,57.88249],[27.81169,57.87204],[27.81583,57.87166],[27.8184,57.8651],[27.81632,57.86134],[27.79875,57.85205],[27.7946,57.84634],[27.80058,57.8442],[27.7957,57.84017],[27.78862,57.84186],[27.78411,57.83725],[27.77715,57.8325],[27.75849,57.83536],[27.74165,57.82679],[27.72383,57.83179],[27.70541,57.84192],[27.68771,57.83419],[27.66636,57.83653],[27.66026,57.83893],[27.64818,57.8377],[27.63634,57.83978],[27.62487,57.83751],[27.62207,57.83874],[27.59791,57.83328],[27.56252,57.83023],[27.5563,57.83127],[27.55227,57.82113],[27.54446,57.82204],[27.5452,57.81808],[27.55056,57.81769],[27.55667,57.81366],[27.5408,57.81288],[27.54471,57.808],[27.53726,57.80644],[27.53958,57.80144],[27.53592,57.79663],[27.53861,57.79396],[27.52921,57.78856],[27.5175,57.78876],[27.51847,57.79201],[27.50298,57.78798],[27.50005,57.78973],[27.4959,57.78869],[27.50774,57.78349],[27.51457,57.77516],[27.5081,57.77158],[27.51115,57.76416],[27.51591,57.7639],[27.52018,57.75993],[27.52811,57.75818],[27.53007,57.75368],[27.53116,57.74073],[27.548,57.7333],[27.5419,57.73037],[27.52799,57.72946],[27.5236,57.71616],[27.52762,57.70899],[27.5236,57.70802],[27.51652,57.70873],[27.51066,57.71101],[27.50859,57.70723],[27.49993,57.70495],[27.49529,57.70749],[27.48711,57.7191],[27.47357,57.71545],[27.47064,57.70802],[27.46149,57.70619],[27.44807,57.71616],[27.43086,57.70756],[27.42818,57.69902],[27.41341,57.69915],[27.41647,57.69524],[27.40744,57.69276],[27.40231,57.68493],[27.39133,57.68539],[27.39377,57.67913],[27.39145,57.67671],[27.38193,57.67332],[27.37779,57.66836],[27.38364,57.66059],[27.3801,57.65883],[27.38755,57.6555],[27.38047,57.6495],[27.38352,57.64799],[27.38157,57.64368],[27.39072,57.6431],[27.38816,57.64009],[27.40085,57.63742],[27.40317,57.62905],[27.40182,57.62376],[27.39597,57.62115],[27.39023,57.62036],[27.39084,57.6169],[27.40195,57.61775],[27.40634,57.61546],[27.40683,57.61246],[27.38572,57.60304],[27.37827,57.59513],[27.35692,57.59696],[27.3413,57.58984],[27.34179,57.58539],[27.32886,57.5797],[27.32141,57.57898],[27.3341,57.56596],[27.33178,57.56066],[27.33776,57.56007],[27.33886,57.54671],[27.34386,57.5454],[27.35472,57.52575],[27.35131,57.51632],[27.34569,57.52104],[27.32446,57.52274],[27.29664,57.53859],[27.28017,57.53643],[27.2737,57.54311],[27.26431,57.54377],[27.2637,57.54841],[27.25772,57.54979],[27.24796,57.54769],[27.2249,57.55385],[27.19329,57.54966],[27.16145,57.55922],[27.11654,57.56118],[27.10092,57.5653],[27.08506,57.57538],[27.07262,57.57734],[27.07225,57.57989],[27.0559,57.58251],[27.05285,57.58087],[27.04687,57.58048],[27.04492,57.58251],[27.0332,57.58532],[27.04126,57.58761],[27.04418,57.5967],[27.03101,57.60461],[26.99513,57.60461],[26.99233,57.61076],[26.98696,57.60867],[26.98366,57.61174],[26.97549,57.612],[26.97097,57.60448],[26.9595,57.60625],[26.9578,57.60468],[26.94596,57.60272],[26.93961,57.60932],[26.95133,57.61579],[26.94999,57.62056],[26.94059,57.61978],[26.92961,57.62376],[26.92644,57.6331],[26.90679,57.63304],[26.89971,57.63056],[26.90057,57.62918],[26.89581,57.62572],[26.88849,57.62357],[26.88898,57.62193],[26.87458,57.61906],[26.87275,57.61736],[26.86555,57.61592],[26.85786,57.60997],[26.86469,57.6084],[26.85811,57.60049],[26.85994,57.59598],[26.86433,57.59415],[26.86177,57.59108],[26.84688,57.5884],[26.83504,57.58244],[26.81589,57.58153],[26.80954,57.58473],[26.79685,57.58179],[26.79929,57.58002],[26.79295,57.57315],[26.78685,57.57525],[26.7766,57.55994],[26.76915,57.56039],[26.76354,57.56314],[26.75366,57.56249],[26.75817,57.5653],[26.76891,57.57041],[26.77379,57.57473],[26.76769,57.57754],[26.74804,57.5778],[26.75317,57.58009],[26.73816,57.58774],[26.72901,57.58016],[26.73828,57.57584],[26.73072,57.56903],[26.72388,57.57244],[26.71107,57.56596],[26.69972,57.57106],[26.69753,57.5706],[26.69741,57.56733],[26.69155,57.56615],[26.67569,57.56668],[26.67105,57.56327],[26.6719,57.55385],[26.66531,57.55287],[26.64652,57.55391],[26.64262,57.54658],[26.63444,57.54357],[26.61443,57.52909],[26.61712,57.50885],[26.60467,57.51212],[26.60479,57.51442],[26.5954,57.51376],[26.59479,57.51592],[26.58808,57.51619],[26.59015,57.52516],[26.58698,57.52621],[26.58771,57.53781],[26.58381,57.53957],[26.57978,57.53695],[26.57966,57.53375],[26.56123,57.5285],[26.56184,57.52261],[26.5666,57.51946],[26.55794,57.5137],[26.52585,57.51619],[26.49961,57.52451],[26.49095,57.54534],[26.46996,57.57551],[26.40151,57.57237],[26.34489,57.58408],[26.33476,57.5797],[26.32781,57.57963],[26.32635,57.58277],[26.3117,57.58473],[26.30853,57.59291],[26.3006,57.59343],[26.29291,57.59114],[26.28352,57.59232],[26.28217,57.5952],[26.27754,57.595],[26.27034,57.6001],[26.27022,57.60461],[26.25423,57.61383],[26.24715,57.62082],[26.24813,57.62775],[26.23947,57.63408],[26.24203,57.63539],[26.24667,57.63559],[26.23959,57.64649],[26.23239,57.6461],[26.23117,57.64904],[26.24215,57.65146],[26.2363,57.65753],[26.23032,57.65805],[26.21043,57.66601],[26.21372,57.66888],[26.21092,57.67071],[26.21018,57.67906],[26.20079,57.68102],[26.19896,57.68356],[26.19444,57.68519],[26.18541,57.68454],[26.17712,57.68761],[26.18871,57.69472],[26.19859,57.70906],[26.20567,57.71486],[26.1726,57.72867],[26.141,57.73278],[26.13563,57.73923],[26.13905,57.74548],[26.13551,57.7503],[26.10537,57.757],[26.08035,57.76547],[26.07974,57.76384],[26.07328,57.76371],[26.07047,57.7656],[26.05912,57.75987],[26.049,57.7611],[26.0435,57.76703],[26.03326,57.77054],[26.02374,57.76761],[26.01776,57.7723],[26.02459,57.77516],[26.02496,57.7816],[26.02252,57.78355],[26.02776,57.7898],[26.03081,57.79097],[26.03338,57.80105],[26.03679,57.80592],[26.03606,57.8108],[26.04851,57.82289],[26.05705,57.83842],[26.05558,57.84764],[26.03667,57.84926],[26.02008,57.84517],[26.00958,57.85731],[25.99848,57.85816],[25.96273,57.84491],[25.931,57.85244],[25.89537,57.84972],[25.8883,57.84595],[25.88085,57.84946],[25.88573,57.85277],[25.88427,57.85595],[25.87561,57.85796],[25.87475,57.86322],[25.8595,57.85614],[25.81923,57.86419],[25.78312,57.89948],[25.78629,57.90428],[25.77165,57.91206],[25.75102,57.91692],[25.73724,57.92295],[25.72833,57.92133],[25.72247,57.91245],[25.70356,57.90331],[25.67916,57.90461],[25.67549,57.91277],[25.66207,57.91511],[25.65609,57.91439],[25.64889,57.91666],[25.64987,57.91841],[25.63828,57.93059],[25.57983,57.9442],[25.59399,57.95961],[25.58935,57.96504],[25.58239,57.96783],[25.58044,57.9721],[25.57483,57.9741],[25.56556,57.96718],[25.56604,57.96258],[25.55714,57.96038],[25.55567,57.96711],[25.55079,57.97255],[25.53725,57.97139],[25.52566,57.97184],[25.5226,57.96802],[25.51638,57.96737],[25.51211,57.96977],[25.52212,57.97488],[25.51943,57.98031],[25.48539,57.97475],[25.47843,57.98006],[25.47843,57.98264],[25.44219,57.99616],[25.44817,58.00114],[25.46648,58.00515],[25.44817,58.01698],[25.40693,58.02893],[25.37155,58.02926],[25.36374,58.03171],[25.35336,58.04334],[25.34482,58.04676],[25.33604,58.05709],[25.3292,58.05858],[25.32664,58.0638],[25.31981,58.066],[25.31908,58.06929],[25.29553,58.08161],[25.28686,58.08149],[25.28113,58.07019],[25.266,58.06716],[25.26502,58.06],[25.27991,58.05063],[25.29309,58.0467],[25.30431,58.03449],[25.30114,58.01504],[25.29748,58.01459],[25.30285,58.00011],[25.29577,57.99972],[25.29736,57.99661],[25.30358,57.99396],[25.30138,57.99273],[25.29187,57.99286],[25.28308,57.98963],[25.26722,57.99454],[25.25611,57.9939],[25.25502,58.00347],[25.2455,58.00302],[25.22768,58.01782],[25.24587,58.01872],[25.23562,58.02286],[25.23635,58.02441],[25.22732,58.02435],[25.22537,58.02195],[25.21902,58.02977],[25.21658,58.04088],[25.22695,58.04799],[25.22817,58.05348],[25.22122,58.05302],[25.22146,58.05051],[25.2178,58.04908],[25.21597,58.05954],[25.21219,58.06226],[25.20523,58.06122],[25.20389,58.0651],[25.21621,58.07413],[25.21207,58.08052],[25.19962,58.08536],[25.18949,58.08007],[25.19169,58.07613],[25.1535,58.07478],[25.15154,58.07703],[25.13397,58.07974],[25.10579,58.07749],[25.10518,58.06645],[25.07662,58.06645],[25.02037,58.01769],[24.99512,58.01084],[24.94863,58.00942],[24.83234,57.97177],[24.80806,57.99066],[24.74229,57.98187],[24.74339,57.96491],[24.7329,57.96239],[24.71508,57.96271],[24.6919,57.94653],[24.67335,57.95896],[24.64468,57.95889],[24.64187,57.95423],[24.64577,57.95268],[24.62869,57.94193],[24.61612,57.94368],[24.60892,57.95125],[24.58464,57.96174],[24.57317,57.95436],[24.54792,57.94938],[24.54352,57.94478],[24.5301,57.94705],[24.5207,57.94303],[24.51839,57.93675],[24.5096,57.93442],[24.51326,57.93066],[24.4625,57.92496],[24.44579,57.90798],[24.46018,57.90662],[24.45225,57.89942],[24.46006,57.87977],[24.41138,57.86491],[24.40906,57.87191],[24.33707,57.87393],[24.33829,58.0109],[24.42272,58.01097],[24.42614,58.28002],[24.51155,58.2797],[24.51216,58.32471],[24.42638,58.32503],[24.42712,58.36972],[24.34182,58.37017],[24.34048,58.23547],[24.17014,58.23572],[24.17014,58.1908],[24.08485,58.19092],[24.0851,58.23605],[24.00066,58.23579],[23.99993,58.28092],[23.82971,58.28047],[23.82947,58.32554],[23.65864,58.32496],[23.65791,58.41493],[23.57225,58.41468],[23.57127,58.50436],[23.39935,58.50359],[23.40106,58.41391],[23.14421,58.41238],[23.14567,58.36735],[23.05989,58.36703],[23.06172,58.32221],[22.9757,58.32157],[22.97716,58.27681],[22.89187,58.27598],[22.89358,58.23103],[22.80865,58.2302],[22.81012,58.18539],[22.89529,58.1861],[22.89663,58.1413],[22.72641,58.13982],[22.72495,58.18475],[22.55522,58.18276],[22.55693,58.13744],[22.64173,58.13886],[22.64344,58.094],[22.38903,58.0909],[22.38525,58.18063],[22.29995,58.17967],[22.30679,58.04527],[22.22198,58.0436],[22.22626,57.95404],[22.14206,57.95281],[22.1445,57.90804],[22.06007,57.90681],[22.06263,57.86186],[21.97807,57.86043],[21.96831,58.04004],[22.05274,58.04134],[22.04506,58.17581],[21.96038,58.17471],[21.95781,58.21941],[21.78723,58.21638],[21.78211,58.30631],[21.69681,58.3049],[21.69401,58.34975],[21.77942,58.35122],[21.76795,58.53074],[22.02566,58.53488],[22.02797,58.49001],[22.11375,58.49167],[22.11144,58.53621],[22.19709,58.53742],[22.19453,58.5823],[22.45236,58.58573],[22.44638,58.7203],[22.36023,58.71916],[22.35364,58.85385]],[[23.47415,59.26726],[23.29868,59.26632],[23.29795,59.31138],[23.47293,59.31194],[23.47415,59.26726]],[[24.17014,58.1908],[24.25507,58.19073],[24.25458,58.14581],[24.17002,58.14588],[24.17014,58.1908]],[[24.08485,58.19092],[24.08497,58.10129],[23.99968,58.10116],[23.99993,58.05632],[23.91525,58.05612],[23.915,58.14613],[23.83032,58.146],[23.82971,58.23572],[23.91451,58.23585],[23.91476,58.19099],[24.08485,58.19092]],[[24.61854,59.53612],[24.44183,59.5368],[24.44309,59.62659],[24.62016,59.6258],[24.61854,59.53612]],[[26.40403,59.7852],[26.31501,59.78667],[26.31814,59.83152],[26.40732,59.82994],[26.40403,59.7852]],[[26.48308,59.649],[26.48647,59.69383],[26.57514,59.69202],[26.57166,59.64719],[26.48308,59.649]],[[23.15944,57.78408],[23.24346,57.78461],[23.24445,57.73971],[23.32848,57.74031],[23.32679,57.82998],[23.15845,57.82885],[23.15944,57.78408]]],terms_text:"Maa-Ameti põhikaart"},{id:"Maaamet-Estonia_Cadastre",name:"Estonia Cadastre (Maaamet)",type:"wms",template:"https://kaart.maaamet.ee/wms/alus-geo?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&Layers=of10000,TOPOYKSUS_6569,TOPOYKSUS_6573&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",polygon:[[[22.35364,58.85385],[22.09411,58.85038],[22.09179,58.8951],[22.00503,58.89371],[21.99979,58.98374],[22.34754,58.98845],[22.34535,59.03337],[22.51935,59.03538],[22.51556,59.1251],[22.69017,59.12686],[22.69212,59.08218],[22.77912,59.083],[22.78083,59.03814],[22.86808,59.03877],[22.8693,58.99399],[22.9563,58.99487],[22.95495,59.03959],[23.12895,59.04097],[23.12786,59.08582],[23.47671,59.0877],[23.47415,59.26726],[23.64924,59.26788],[23.64888,59.31281],[23.73698,59.313],[23.73649,59.3578],[23.91158,59.35787],[23.91207,59.4028],[24.176,59.4028],[24.17637,59.4478],[24.26446,59.44767],[24.26471,59.49236],[24.70605,59.49082],[24.70898,59.62553],[24.79744,59.62497],[24.79659,59.58009],[24.97327,59.57885],[24.97462,59.62386],[24.88603,59.62473],[24.88725,59.66918],[24.9762,59.66863],[24.9773,59.71346],[25.06601,59.71259],[25.0632,59.62306],[25.24037,59.62145],[25.24184,59.66647],[25.33055,59.66548],[25.32884,59.62078],[25.41755,59.61979],[25.41938,59.66468],[25.6855,59.66148],[25.68757,59.70613],[25.86511,59.70386],[25.86279,59.65901],[26.12855,59.65507],[26.12575,59.6101],[26.39114,59.60565],[26.38809,59.56099],[26.82967,59.55215],[26.82626,59.50729],[26.91423,59.50549],[26.91057,59.46051],[27.96689,59.43303],[27.9719,59.4778],[28.03669,59.4757],[28.04377,59.47223],[28.04767,59.46578],[28.05182,59.46342],[28.06915,59.46256],[28.08452,59.45939],[28.12174,59.44091],[28.13577,59.4277],[28.13711,59.42267],[28.14163,59.41901],[28.16652,59.41205],[28.17225,59.40789],[28.19275,59.4015],[28.21069,59.3836],[28.21069,59.37994],[28.20386,59.37459],[28.21057,59.37235],[28.21105,59.36937],[28.20678,59.36719],[28.20703,59.36377],[28.19971,59.36091],[28.20203,59.35731],[28.19263,59.35227],[28.19397,59.34642],[28.16969,59.33354],[28.13626,59.29244],[28.12515,59.28901],[28.11722,59.28895],[28.1099,59.29063],[28.05353,59.2902],[28.02022,59.28334],[27.99825,59.2753],[27.97983,59.27293],[27.96433,59.27268],[27.95335,59.26863],[27.9492,59.26533],[27.90564,59.24044],[27.90113,59.23488],[27.901,59.22639],[27.89783,59.21746],[27.90235,59.20728],[27.89234,59.19222],[27.88978,59.18379],[27.87648,59.17372],[27.87184,59.16841],[27.86818,59.16159],[27.84414,59.14814],[27.83206,59.14401],[27.82035,59.13362],[27.80986,59.12905],[27.80595,59.12166],[27.80534,59.1127],[27.81071,59.10819],[27.8101,59.10606],[27.80205,59.1028],[27.78887,59.0909],[27.7907,59.08112],[27.79375,59.07842],[27.79411,59.07566],[27.79277,59.0729],[27.79302,59.06927],[27.7885,59.06657],[27.78265,59.065],[27.77508,59.0581],[27.77313,59.05107],[27.77667,59.04743],[27.76983,59.03325],[27.76605,59.03155],[27.75153,59.03017],[27.74628,59.02716],[27.74567,59.01705],[27.74165,59.00951],[27.74787,58.99267],[27.74274,58.98845],[27.73213,58.9855],[27.6544,58.98783],[27.65501,58.99241],[27.39414,58.99964],[27.38974,58.95474],[27.12935,58.96135],[27.12557,58.9164],[27.03882,58.91841],[27.0271,58.7841],[27.11361,58.78183],[27.10934,58.73709],[27.19537,58.73512],[27.18731,58.64533],[27.27309,58.64305],[27.25259,58.41883],[27.53397,58.41142],[27.5552,58.36575],[27.51762,58.33265],[27.51408,58.32214],[27.49993,58.32246],[27.48687,58.18803],[27.52872,58.18687],[27.59205,58.11875],[27.63695,58.09735],[27.60938,58.05399],[27.62268,58.0058],[27.64489,58.00205],[27.65294,58.00644],[27.64781,58.01426],[27.64781,58.02086],[27.66172,58.01866],[27.66856,58.01045],[27.68393,58.00845],[27.6965,58.0045],[27.70065,57.99862],[27.69882,57.98827],[27.69125,57.98549],[27.68064,57.97449],[27.6821,57.9719],[27.68893,57.97184],[27.68588,57.95928],[27.65892,57.9554],[27.66758,57.951],[27.67161,57.94627],[27.66917,57.94174],[27.67649,57.93552],[27.68247,57.93655],[27.68613,57.92794],[27.68247,57.92437],[27.71078,57.92392],[27.72029,57.92036],[27.72054,57.91174],[27.70834,57.90616],[27.69882,57.90616],[27.70614,57.90136],[27.72896,57.90739],[27.74677,57.90169],[27.7536,57.90409],[27.75739,57.90318],[27.75592,57.89806],[27.76959,57.89566],[27.78094,57.89832],[27.799,57.89961],[27.81852,57.89579],[27.82096,57.89047],[27.81949,57.888],[27.81059,57.88612],[27.81827,57.88249],[27.81169,57.87204],[27.81583,57.87166],[27.8184,57.8651],[27.81632,57.86134],[27.79875,57.85205],[27.7946,57.84634],[27.80058,57.8442],[27.7957,57.84017],[27.78862,57.84186],[27.78411,57.83725],[27.77715,57.8325],[27.75849,57.83536],[27.74165,57.82679],[27.72383,57.83179],[27.70541,57.84192],[27.68771,57.83419],[27.66636,57.83653],[27.66026,57.83893],[27.64818,57.8377],[27.63634,57.83978],[27.62487,57.83751],[27.62207,57.83874],[27.59791,57.83328],[27.56252,57.83023],[27.5563,57.83127],[27.55227,57.82113],[27.54446,57.82204],[27.5452,57.81808],[27.55056,57.81769],[27.55667,57.81366],[27.5408,57.81288],[27.54471,57.808],[27.53726,57.80644],[27.53958,57.80144],[27.53592,57.79663],[27.53861,57.79396],[27.52921,57.78856],[27.5175,57.78876],[27.51847,57.79201],[27.50298,57.78798],[27.50005,57.78973],[27.4959,57.78869],[27.50774,57.78349],[27.51457,57.77516],[27.5081,57.77158],[27.51115,57.76416],[27.51591,57.7639],[27.52018,57.75993],[27.52811,57.75818],[27.53007,57.75368],[27.53116,57.74073],[27.548,57.7333],[27.5419,57.73037],[27.52799,57.72946],[27.5236,57.71616],[27.52762,57.70899],[27.5236,57.70802],[27.51652,57.70873],[27.51066,57.71101],[27.50859,57.70723],[27.49993,57.70495],[27.49529,57.70749],[27.48711,57.7191],[27.47357,57.71545],[27.47064,57.70802],[27.46149,57.70619],[27.44807,57.71616],[27.43086,57.70756],[27.42818,57.69902],[27.41341,57.69915],[27.41647,57.69524],[27.40744,57.69276],[27.40231,57.68493],[27.39133,57.68539],[27.39377,57.67913],[27.39145,57.67671],[27.38193,57.67332],[27.37779,57.66836],[27.38364,57.66059],[27.3801,57.65883],[27.38755,57.6555],[27.38047,57.6495],[27.38352,57.64799],[27.38157,57.64368],[27.39072,57.6431],[27.38816,57.64009],[27.40085,57.63742],[27.40317,57.62905],[27.40182,57.62376],[27.39597,57.62115],[27.39023,57.62036],[27.39084,57.6169],[27.40195,57.61775],[27.40634,57.61546],[27.40683,57.61246],[27.38572,57.60304],[27.37827,57.59513],[27.35692,57.59696],[27.3413,57.58984],[27.34179,57.58539],[27.32886,57.5797],[27.32141,57.57898],[27.3341,57.56596],[27.33178,57.56066],[27.33776,57.56007],[27.33886,57.54671],[27.34386,57.5454],[27.35472,57.52575],[27.35131,57.51632],[27.34569,57.52104],[27.32446,57.52274],[27.29664,57.53859],[27.28017,57.53643],[27.2737,57.54311],[27.26431,57.54377],[27.2637,57.54841],[27.25772,57.54979],[27.24796,57.54769],[27.2249,57.55385],[27.19329,57.54966],[27.16145,57.55922],[27.11654,57.56118],[27.10092,57.5653],[27.08506,57.57538],[27.07262,57.57734],[27.07225,57.57989],[27.0559,57.58251],[27.05285,57.58087],[27.04687,57.58048],[27.04492,57.58251],[27.0332,57.58532],[27.04126,57.58761],[27.04418,57.5967],[27.03101,57.60461],[26.99513,57.60461],[26.99233,57.61076],[26.98696,57.60867],[26.98366,57.61174],[26.97549,57.612],[26.97097,57.60448],[26.9595,57.60625],[26.9578,57.60468],[26.94596,57.60272],[26.93961,57.60932],[26.95133,57.61579],[26.94999,57.62056],[26.94059,57.61978],[26.92961,57.62376],[26.92644,57.6331],[26.90679,57.63304],[26.89971,57.63056],[26.90057,57.62918],[26.89581,57.62572],[26.88849,57.62357],[26.88898,57.62193],[26.87458,57.61906],[26.87275,57.61736],[26.86555,57.61592],[26.85786,57.60997],[26.86469,57.6084],[26.85811,57.60049],[26.85994,57.59598],[26.86433,57.59415],[26.86177,57.59108],[26.84688,57.5884],[26.83504,57.58244],[26.81589,57.58153],[26.80954,57.58473],[26.79685,57.58179],[26.79929,57.58002],[26.79295,57.57315],[26.78685,57.57525],[26.7766,57.55994],[26.76915,57.56039],[26.76354,57.56314],[26.75366,57.56249],[26.75817,57.5653],[26.76891,57.57041],[26.77379,57.57473],[26.76769,57.57754],[26.74804,57.5778],[26.75317,57.58009],[26.73816,57.58774],[26.72901,57.58016],[26.73828,57.57584],[26.73072,57.56903],[26.72388,57.57244],[26.71107,57.56596],[26.69972,57.57106],[26.69753,57.5706],[26.69741,57.56733],[26.69155,57.56615],[26.67569,57.56668],[26.67105,57.56327],[26.6719,57.55385],[26.66531,57.55287],[26.64652,57.55391],[26.64262,57.54658],[26.63444,57.54357],[26.61443,57.52909],[26.61712,57.50885],[26.60467,57.51212],[26.60479,57.51442],[26.5954,57.51376],[26.59479,57.51592],[26.58808,57.51619],[26.59015,57.52516],[26.58698,57.52621],[26.58771,57.53781],[26.58381,57.53957],[26.57978,57.53695],[26.57966,57.53375],[26.56123,57.5285],[26.56184,57.52261],[26.5666,57.51946],[26.55794,57.5137],[26.52585,57.51619],[26.49961,57.52451],[26.49095,57.54534],[26.46996,57.57551],[26.40151,57.57237],[26.34489,57.58408],[26.33476,57.5797],[26.32781,57.57963],[26.32635,57.58277],[26.3117,57.58473],[26.30853,57.59291],[26.3006,57.59343],[26.29291,57.59114],[26.28352,57.59232],[26.28217,57.5952],[26.27754,57.595],[26.27034,57.6001],[26.27022,57.60461],[26.25423,57.61383],[26.24715,57.62082],[26.24813,57.62775],[26.23947,57.63408],[26.24203,57.63539],[26.24667,57.63559],[26.23959,57.64649],[26.23239,57.6461],[26.23117,57.64904],[26.24215,57.65146],[26.2363,57.65753],[26.23032,57.65805],[26.21043,57.66601],[26.21372,57.66888],[26.21092,57.67071],[26.21018,57.67906],[26.20079,57.68102],[26.19896,57.68356],[26.19444,57.68519],[26.18541,57.68454],[26.17712,57.68761],[26.18871,57.69472],[26.19859,57.70906],[26.20567,57.71486],[26.1726,57.72867],[26.141,57.73278],[26.13563,57.73923],[26.13905,57.74548],[26.13551,57.7503],[26.10537,57.757],[26.08035,57.76547],[26.07974,57.76384],[26.07328,57.76371],[26.07047,57.7656],[26.05912,57.75987],[26.049,57.7611],[26.0435,57.76703],[26.03326,57.77054],[26.02374,57.76761],[26.01776,57.7723],[26.02459,57.77516],[26.02496,57.7816],[26.02252,57.78355],[26.02776,57.7898],[26.03081,57.79097],[26.03338,57.80105],[26.03679,57.80592],[26.03606,57.8108],[26.04851,57.82289],[26.05705,57.83842],[26.05558,57.84764],[26.03667,57.84926],[26.02008,57.84517],[26.00958,57.85731],[25.99848,57.85816],[25.96273,57.84491],[25.931,57.85244],[25.89537,57.84972],[25.8883,57.84595],[25.88085,57.84946],[25.88573,57.85277],[25.88427,57.85595],[25.87561,57.85796],[25.87475,57.86322],[25.8595,57.85614],[25.81923,57.86419],[25.78312,57.89948],[25.78629,57.90428],[25.77165,57.91206],[25.75102,57.91692],[25.73724,57.92295],[25.72833,57.92133],[25.72247,57.91245],[25.70356,57.90331],[25.67916,57.90461],[25.67549,57.91277],[25.66207,57.91511],[25.65609,57.91439],[25.64889,57.91666],[25.64987,57.91841],[25.63828,57.93059],[25.57983,57.9442],[25.59399,57.95961],[25.58935,57.96504],[25.58239,57.96783],[25.58044,57.9721],[25.57483,57.9741],[25.56556,57.96718],[25.56604,57.96258],[25.55714,57.96038],[25.55567,57.96711],[25.55079,57.97255],[25.53725,57.97139],[25.52566,57.97184],[25.5226,57.96802],[25.51638,57.96737],[25.51211,57.96977],[25.52212,57.97488],[25.51943,57.98031],[25.48539,57.97475],[25.47843,57.98006],[25.47843,57.98264],[25.44219,57.99616],[25.44817,58.00114],[25.46648,58.00515],[25.44817,58.01698],[25.40693,58.02893],[25.37155,58.02926],[25.36374,58.03171],[25.35336,58.04334],[25.34482,58.04676],[25.33604,58.05709],[25.3292,58.05858],[25.32664,58.0638],[25.31981,58.066],[25.31908,58.06929],[25.29553,58.08161],[25.28686,58.08149],[25.28113,58.07019],[25.266,58.06716],[25.26502,58.06],[25.27991,58.05063],[25.29309,58.0467],[25.30431,58.03449],[25.30114,58.01504],[25.29748,58.01459],[25.30285,58.00011],[25.29577,57.99972],[25.29736,57.99661],[25.30358,57.99396],[25.30138,57.99273],[25.29187,57.99286],[25.28308,57.98963],[25.26722,57.99454],[25.25611,57.9939],[25.25502,58.00347],[25.2455,58.00302],[25.22768,58.01782],[25.24587,58.01872],[25.23562,58.02286],[25.23635,58.02441],[25.22732,58.02435],[25.22537,58.02195],[25.21902,58.02977],[25.21658,58.04088],[25.22695,58.04799],[25.22817,58.05348],[25.22122,58.05302],[25.22146,58.05051],[25.2178,58.04908],[25.21597,58.05954],[25.21219,58.06226],[25.20523,58.06122],[25.20389,58.0651],[25.21621,58.07413],[25.21207,58.08052],[25.19962,58.08536],[25.18949,58.08007],[25.19169,58.07613],[25.1535,58.07478],[25.15154,58.07703],[25.13397,58.07974],[25.10579,58.07749],[25.10518,58.06645],[25.07662,58.06645],[25.02037,58.01769],[24.99512,58.01084],[24.94863,58.00942],[24.83234,57.97177],[24.80806,57.99066],[24.74229,57.98187],[24.74339,57.96491],[24.7329,57.96239],[24.71508,57.96271],[24.6919,57.94653],[24.67335,57.95896],[24.64468,57.95889],[24.64187,57.95423],[24.64577,57.95268],[24.62869,57.94193],[24.61612,57.94368],[24.60892,57.95125],[24.58464,57.96174],[24.57317,57.95436],[24.54792,57.94938],[24.54352,57.94478],[24.5301,57.94705],[24.5207,57.94303],[24.51839,57.93675],[24.5096,57.93442],[24.51326,57.93066],[24.4625,57.92496],[24.44579,57.90798],[24.46018,57.90662],[24.45225,57.89942],[24.46006,57.87977],[24.41138,57.86491],[24.40906,57.87191],[24.33707,57.87393],[24.33829,58.0109],[24.42272,58.01097],[24.42614,58.28002],[24.51155,58.2797],[24.51216,58.32471],[24.42638,58.32503],[24.42712,58.36972],[24.34182,58.37017],[24.34048,58.23547],[24.17014,58.23572],[24.17014,58.1908],[24.08485,58.19092],[24.0851,58.23605],[24.00066,58.23579],[23.99993,58.28092],[23.82971,58.28047],[23.82947,58.32554],[23.65864,58.32496],[23.65791,58.41493],[23.57225,58.41468],[23.57127,58.50436],[23.39935,58.50359],[23.40106,58.41391],[23.14421,58.41238],[23.14567,58.36735],[23.05989,58.36703],[23.06172,58.32221],[22.9757,58.32157],[22.97716,58.27681],[22.89187,58.27598],[22.89358,58.23103],[22.80865,58.2302],[22.81012,58.18539],[22.89529,58.1861],[22.89663,58.1413],[22.72641,58.13982],[22.72495,58.18475],[22.55522,58.18276],[22.55693,58.13744],[22.64173,58.13886],[22.64344,58.094],[22.38903,58.0909],[22.38525,58.18063],[22.29995,58.17967],[22.30679,58.04527],[22.22198,58.0436],[22.22626,57.95404],[22.14206,57.95281],[22.1445,57.90804],[22.06007,57.90681],[22.06263,57.86186],[21.97807,57.86043],[21.96831,58.04004],[22.05274,58.04134],[22.04506,58.17581],[21.96038,58.17471],[21.95781,58.21941],[21.78723,58.21638],[21.78211,58.30631],[21.69681,58.3049],[21.69401,58.34975],[21.77942,58.35122],[21.76795,58.53074],[22.02566,58.53488],[22.02797,58.49001],[22.11375,58.49167],[22.11144,58.53621],[22.19709,58.53742],[22.19453,58.5823],[22.45236,58.58573],[22.44638,58.7203],[22.36023,58.71916],[22.35364,58.85385]],[[23.47415,59.26726],[23.29868,59.26632],[23.29795,59.31138],[23.47293,59.31194],[23.47415,59.26726]],[[24.17014,58.1908],[24.25507,58.19073],[24.25458,58.14581],[24.17002,58.14588],[24.17014,58.1908]],[[24.08485,58.19092],[24.08497,58.10129],[23.99968,58.10116],[23.99993,58.05632],[23.91525,58.05612],[23.915,58.14613],[23.83032,58.146],[23.82971,58.23572],[23.91451,58.23585],[23.91476,58.19099],[24.08485,58.19092]],[[24.61854,59.53612],[24.44183,59.5368],[24.44309,59.62659],[24.62016,59.6258],[24.61854,59.53612]],[[26.40403,59.7852],[26.31501,59.78667],[26.31814,59.83152],[26.40732,59.82994],[26.40403,59.7852]],[[26.48308,59.649],[26.48647,59.69383],[26.57514,59.69202],[26.57166,59.64719],[26.48308,59.649]],[[23.15944,57.78408],[23.24346,57.78461],[23.24445,57.73971],[23.32848,57.74031],[23.32679,57.82998],[23.15845,57.82885],[23.15944,57.78408]]],terms_text:"Maa-Ameti katastrikaart ortofoto alusel"},{id:"maaamet.ee-cir_ngr",name:"Estonia Forestry (Maaamet)",type:"wms",template:"https://kaart.maaamet.ee/wms/alus-geo?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&Layers=cir_ngr&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",polygon:[[[22.35364,58.85385],[22.09411,58.85038],[22.09179,58.8951],[22.00503,58.89371],[21.99979,58.98374],[22.34754,58.98845],[22.34535,59.03337],[22.51935,59.03538],[22.51556,59.1251],[22.69017,59.12686],[22.69212,59.08218],[22.77912,59.083],[22.78083,59.03814],[22.86808,59.03877],[22.8693,58.99399],[22.9563,58.99487],[22.95495,59.03959],[23.12895,59.04097],[23.12786,59.08582],[23.47671,59.0877],[23.47415,59.26726],[23.64924,59.26788],[23.64888,59.31281],[23.73698,59.313],[23.73649,59.3578],[23.91158,59.35787],[23.91207,59.4028],[24.176,59.4028],[24.17637,59.4478],[24.26446,59.44767],[24.26471,59.49236],[24.70605,59.49082],[24.70898,59.62553],[24.79744,59.62497],[24.79659,59.58009],[24.97327,59.57885],[24.97462,59.62386],[24.88603,59.62473],[24.88725,59.66918],[24.9762,59.66863],[24.9773,59.71346],[25.06601,59.71259],[25.0632,59.62306],[25.24037,59.62145],[25.24184,59.66647],[25.33055,59.66548],[25.32884,59.62078],[25.41755,59.61979],[25.41938,59.66468],[25.6855,59.66148],[25.68757,59.70613],[25.86511,59.70386],[25.86279,59.65901],[26.12855,59.65507],[26.12575,59.6101],[26.39114,59.60565],[26.38809,59.56099],[26.82967,59.55215],[26.82626,59.50729],[26.91423,59.50549],[26.91057,59.46051],[27.96689,59.43303],[27.9719,59.4778],[28.03669,59.4757],[28.04377,59.47223],[28.04767,59.46578],[28.05182,59.46342],[28.06915,59.46256],[28.08452,59.45939],[28.12174,59.44091],[28.13577,59.4277],[28.13711,59.42267],[28.14163,59.41901],[28.16652,59.41205],[28.17225,59.40789],[28.19275,59.4015],[28.21069,59.3836],[28.21069,59.37994],[28.20386,59.37459],[28.21057,59.37235],[28.21105,59.36937],[28.20678,59.36719],[28.20703,59.36377],[28.19971,59.36091],[28.20203,59.35731],[28.19263,59.35227],[28.19397,59.34642],[28.16969,59.33354],[28.13626,59.29244],[28.12515,59.28901],[28.11722,59.28895],[28.1099,59.29063],[28.05353,59.2902],[28.02022,59.28334],[27.99825,59.2753],[27.97983,59.27293],[27.96433,59.27268],[27.95335,59.26863],[27.9492,59.26533],[27.90564,59.24044],[27.90113,59.23488],[27.901,59.22639],[27.89783,59.21746],[27.90235,59.20728],[27.89234,59.19222],[27.88978,59.18379],[27.87648,59.17372],[27.87184,59.16841],[27.86818,59.16159],[27.84414,59.14814],[27.83206,59.14401],[27.82035,59.13362],[27.80986,59.12905],[27.80595,59.12166],[27.80534,59.1127],[27.81071,59.10819],[27.8101,59.10606],[27.80205,59.1028],[27.78887,59.0909],[27.7907,59.08112],[27.79375,59.07842],[27.79411,59.07566],[27.79277,59.0729],[27.79302,59.06927],[27.7885,59.06657],[27.78265,59.065],[27.77508,59.0581],[27.77313,59.05107],[27.77667,59.04743],[27.76983,59.03325],[27.76605,59.03155],[27.75153,59.03017],[27.74628,59.02716],[27.74567,59.01705],[27.74165,59.00951],[27.74787,58.99267],[27.74274,58.98845],[27.73213,58.9855],[27.6544,58.98783],[27.65501,58.99241],[27.39414,58.99964],[27.38974,58.95474],[27.12935,58.96135],[27.12557,58.9164],[27.03882,58.91841],[27.0271,58.7841],[27.11361,58.78183],[27.10934,58.73709],[27.19537,58.73512],[27.18731,58.64533],[27.27309,58.64305],[27.25259,58.41883],[27.53397,58.41142],[27.5552,58.36575],[27.51762,58.33265],[27.51408,58.32214],[27.49993,58.32246],[27.48687,58.18803],[27.52872,58.18687],[27.59205,58.11875],[27.63695,58.09735],[27.60938,58.05399],[27.62268,58.0058],[27.64489,58.00205],[27.65294,58.00644],[27.64781,58.01426],[27.64781,58.02086],[27.66172,58.01866],[27.66856,58.01045],[27.68393,58.00845],[27.6965,58.0045],[27.70065,57.99862],[27.69882,57.98827],[27.69125,57.98549],[27.68064,57.97449],[27.6821,57.9719],[27.68893,57.97184],[27.68588,57.95928],[27.65892,57.9554],[27.66758,57.951],[27.67161,57.94627],[27.66917,57.94174],[27.67649,57.93552],[27.68247,57.93655],[27.68613,57.92794],[27.68247,57.92437],[27.71078,57.92392],[27.72029,57.92036],[27.72054,57.91174],[27.70834,57.90616],[27.69882,57.90616],[27.70614,57.90136],[27.72896,57.90739],[27.74677,57.90169],[27.7536,57.90409],[27.75739,57.90318],[27.75592,57.89806],[27.76959,57.89566],[27.78094,57.89832],[27.799,57.89961],[27.81852,57.89579],[27.82096,57.89047],[27.81949,57.888],[27.81059,57.88612],[27.81827,57.88249],[27.81169,57.87204],[27.81583,57.87166],[27.8184,57.8651],[27.81632,57.86134],[27.79875,57.85205],[27.7946,57.84634],[27.80058,57.8442],[27.7957,57.84017],[27.78862,57.84186],[27.78411,57.83725],[27.77715,57.8325],[27.75849,57.83536],[27.74165,57.82679],[27.72383,57.83179],[27.70541,57.84192],[27.68771,57.83419],[27.66636,57.83653],[27.66026,57.83893],[27.64818,57.8377],[27.63634,57.83978],[27.62487,57.83751],[27.62207,57.83874],[27.59791,57.83328],[27.56252,57.83023],[27.5563,57.83127],[27.55227,57.82113],[27.54446,57.82204],[27.5452,57.81808],[27.55056,57.81769],[27.55667,57.81366],[27.5408,57.81288],[27.54471,57.808],[27.53726,57.80644],[27.53958,57.80144],[27.53592,57.79663],[27.53861,57.79396],[27.52921,57.78856],[27.5175,57.78876],[27.51847,57.79201],[27.50298,57.78798],[27.50005,57.78973],[27.4959,57.78869],[27.50774,57.78349],[27.51457,57.77516],[27.5081,57.77158],[27.51115,57.76416],[27.51591,57.7639],[27.52018,57.75993],[27.52811,57.75818],[27.53007,57.75368],[27.53116,57.74073],[27.548,57.7333],[27.5419,57.73037],[27.52799,57.72946],[27.5236,57.71616],[27.52762,57.70899],[27.5236,57.70802],[27.51652,57.70873],[27.51066,57.71101],[27.50859,57.70723],[27.49993,57.70495],[27.49529,57.70749],[27.48711,57.7191],[27.47357,57.71545],[27.47064,57.70802],[27.46149,57.70619],[27.44807,57.71616],[27.43086,57.70756],[27.42818,57.69902],[27.41341,57.69915],[27.41647,57.69524],[27.40744,57.69276],[27.40231,57.68493],[27.39133,57.68539],[27.39377,57.67913],[27.39145,57.67671],[27.38193,57.67332],[27.37779,57.66836],[27.38364,57.66059],[27.3801,57.65883],[27.38755,57.6555],[27.38047,57.6495],[27.38352,57.64799],[27.38157,57.64368],[27.39072,57.6431],[27.38816,57.64009],[27.40085,57.63742],[27.40317,57.62905],[27.40182,57.62376],[27.39597,57.62115],[27.39023,57.62036],[27.39084,57.6169],[27.40195,57.61775],[27.40634,57.61546],[27.40683,57.61246],[27.38572,57.60304],[27.37827,57.59513],[27.35692,57.59696],[27.3413,57.58984],[27.34179,57.58539],[27.32886,57.5797],[27.32141,57.57898],[27.3341,57.56596],[27.33178,57.56066],[27.33776,57.56007],[27.33886,57.54671],[27.34386,57.5454],[27.35472,57.52575],[27.35131,57.51632],[27.34569,57.52104],[27.32446,57.52274],[27.29664,57.53859],[27.28017,57.53643],[27.2737,57.54311],[27.26431,57.54377],[27.2637,57.54841],[27.25772,57.54979],[27.24796,57.54769],[27.2249,57.55385],[27.19329,57.54966],[27.16145,57.55922],[27.11654,57.56118],[27.10092,57.5653],[27.08506,57.57538],[27.07262,57.57734],[27.07225,57.57989],[27.0559,57.58251],[27.05285,57.58087],[27.04687,57.58048],[27.04492,57.58251],[27.0332,57.58532],[27.04126,57.58761],[27.04418,57.5967],[27.03101,57.60461],[26.99513,57.60461],[26.99233,57.61076],[26.98696,57.60867],[26.98366,57.61174],[26.97549,57.612],[26.97097,57.60448],[26.9595,57.60625],[26.9578,57.60468],[26.94596,57.60272],[26.93961,57.60932],[26.95133,57.61579],[26.94999,57.62056],[26.94059,57.61978],[26.92961,57.62376],[26.92644,57.6331],[26.90679,57.63304],[26.89971,57.63056],[26.90057,57.62918],[26.89581,57.62572],[26.88849,57.62357],[26.88898,57.62193],[26.87458,57.61906],[26.87275,57.61736],[26.86555,57.61592],[26.85786,57.60997],[26.86469,57.6084],[26.85811,57.60049],[26.85994,57.59598],[26.86433,57.59415],[26.86177,57.59108],[26.84688,57.5884],[26.83504,57.58244],[26.81589,57.58153],[26.80954,57.58473],[26.79685,57.58179],[26.79929,57.58002],[26.79295,57.57315],[26.78685,57.57525],[26.7766,57.55994],[26.76915,57.56039],[26.76354,57.56314],[26.75366,57.56249],[26.75817,57.5653],[26.76891,57.57041],[26.77379,57.57473],[26.76769,57.57754],[26.74804,57.5778],[26.75317,57.58009],[26.73816,57.58774],[26.72901,57.58016],[26.73828,57.57584],[26.73072,57.56903],[26.72388,57.57244],[26.71107,57.56596],[26.69972,57.57106],[26.69753,57.5706],[26.69741,57.56733],[26.69155,57.56615],[26.67569,57.56668],[26.67105,57.56327],[26.6719,57.55385],[26.66531,57.55287],[26.64652,57.55391],[26.64262,57.54658],[26.63444,57.54357],[26.61443,57.52909],[26.61712,57.50885],[26.60467,57.51212],[26.60479,57.51442],[26.5954,57.51376],[26.59479,57.51592],[26.58808,57.51619],[26.59015,57.52516],[26.58698,57.52621],[26.58771,57.53781],[26.58381,57.53957],[26.57978,57.53695],[26.57966,57.53375],[26.56123,57.5285],[26.56184,57.52261],[26.5666,57.51946],[26.55794,57.5137],[26.52585,57.51619],[26.49961,57.52451],[26.49095,57.54534],[26.46996,57.57551],[26.40151,57.57237],[26.34489,57.58408],[26.33476,57.5797],[26.32781,57.57963],[26.32635,57.58277],[26.3117,57.58473],[26.30853,57.59291],[26.3006,57.59343],[26.29291,57.59114],[26.28352,57.59232],[26.28217,57.5952],[26.27754,57.595],[26.27034,57.6001],[26.27022,57.60461],[26.25423,57.61383],[26.24715,57.62082],[26.24813,57.62775],[26.23947,57.63408],[26.24203,57.63539],[26.24667,57.63559],[26.23959,57.64649],[26.23239,57.6461],[26.23117,57.64904],[26.24215,57.65146],[26.2363,57.65753],[26.23032,57.65805],[26.21043,57.66601],[26.21372,57.66888],[26.21092,57.67071],[26.21018,57.67906],[26.20079,57.68102],[26.19896,57.68356],[26.19444,57.68519],[26.18541,57.68454],[26.17712,57.68761],[26.18871,57.69472],[26.19859,57.70906],[26.20567,57.71486],[26.1726,57.72867],[26.141,57.73278],[26.13563,57.73923],[26.13905,57.74548],[26.13551,57.7503],[26.10537,57.757],[26.08035,57.76547],[26.07974,57.76384],[26.07328,57.76371],[26.07047,57.7656],[26.05912,57.75987],[26.049,57.7611],[26.0435,57.76703],[26.03326,57.77054],[26.02374,57.76761],[26.01776,57.7723],[26.02459,57.77516],[26.02496,57.7816],[26.02252,57.78355],[26.02776,57.7898],[26.03081,57.79097],[26.03338,57.80105],[26.03679,57.80592],[26.03606,57.8108],[26.04851,57.82289],[26.05705,57.83842],[26.05558,57.84764],[26.03667,57.84926],[26.02008,57.84517],[26.00958,57.85731],[25.99848,57.85816],[25.96273,57.84491],[25.931,57.85244],[25.89537,57.84972],[25.8883,57.84595],[25.88085,57.84946],[25.88573,57.85277],[25.88427,57.85595],[25.87561,57.85796],[25.87475,57.86322],[25.8595,57.85614],[25.81923,57.86419],[25.78312,57.89948],[25.78629,57.90428],[25.77165,57.91206],[25.75102,57.91692],[25.73724,57.92295],[25.72833,57.92133],[25.72247,57.91245],[25.70356,57.90331],[25.67916,57.90461],[25.67549,57.91277],[25.66207,57.91511],[25.65609,57.91439],[25.64889,57.91666],[25.64987,57.91841],[25.63828,57.93059],[25.57983,57.9442],[25.59399,57.95961],[25.58935,57.96504],[25.58239,57.96783],[25.58044,57.9721],[25.57483,57.9741],[25.56556,57.96718],[25.56604,57.96258],[25.55714,57.96038],[25.55567,57.96711],[25.55079,57.97255],[25.53725,57.97139],[25.52566,57.97184],[25.5226,57.96802],[25.51638,57.96737],[25.51211,57.96977],[25.52212,57.97488],[25.51943,57.98031],[25.48539,57.97475],[25.47843,57.98006],[25.47843,57.98264],[25.44219,57.99616],[25.44817,58.00114],[25.46648,58.00515],[25.44817,58.01698],[25.40693,58.02893],[25.37155,58.02926],[25.36374,58.03171],[25.35336,58.04334],[25.34482,58.04676],[25.33604,58.05709],[25.3292,58.05858],[25.32664,58.0638],[25.31981,58.066],[25.31908,58.06929],[25.29553,58.08161],[25.28686,58.08149],[25.28113,58.07019],[25.266,58.06716],[25.26502,58.06],[25.27991,58.05063],[25.29309,58.0467],[25.30431,58.03449],[25.30114,58.01504],[25.29748,58.01459],[25.30285,58.00011],[25.29577,57.99972],[25.29736,57.99661],[25.30358,57.99396],[25.30138,57.99273],[25.29187,57.99286],[25.28308,57.98963],[25.26722,57.99454],[25.25611,57.9939],[25.25502,58.00347],[25.2455,58.00302],[25.22768,58.01782],[25.24587,58.01872],[25.23562,58.02286],[25.23635,58.02441],[25.22732,58.02435],[25.22537,58.02195],[25.21902,58.02977],[25.21658,58.04088],[25.22695,58.04799],[25.22817,58.05348],[25.22122,58.05302],[25.22146,58.05051],[25.2178,58.04908],[25.21597,58.05954],[25.21219,58.06226],[25.20523,58.06122],[25.20389,58.0651],[25.21621,58.07413],[25.21207,58.08052],[25.19962,58.08536],[25.18949,58.08007],[25.19169,58.07613],[25.1535,58.07478],[25.15154,58.07703],[25.13397,58.07974],[25.10579,58.07749],[25.10518,58.06645],[25.07662,58.06645],[25.02037,58.01769],[24.99512,58.01084],[24.94863,58.00942],[24.83234,57.97177],[24.80806,57.99066],[24.74229,57.98187],[24.74339,57.96491],[24.7329,57.96239],[24.71508,57.96271],[24.6919,57.94653],[24.67335,57.95896],[24.64468,57.95889],[24.64187,57.95423],[24.64577,57.95268],[24.62869,57.94193],[24.61612,57.94368],[24.60892,57.95125],[24.58464,57.96174],[24.57317,57.95436],[24.54792,57.94938],[24.54352,57.94478],[24.5301,57.94705],[24.5207,57.94303],[24.51839,57.93675],[24.5096,57.93442],[24.51326,57.93066],[24.4625,57.92496],[24.44579,57.90798],[24.46018,57.90662],[24.45225,57.89942],[24.46006,57.87977],[24.41138,57.86491],[24.40906,57.87191],[24.33707,57.87393],[24.33829,58.0109],[24.42272,58.01097],[24.42614,58.28002],[24.51155,58.2797],[24.51216,58.32471],[24.42638,58.32503],[24.42712,58.36972],[24.34182,58.37017],[24.34048,58.23547],[24.17014,58.23572],[24.17014,58.1908],[24.08485,58.19092],[24.0851,58.23605],[24.00066,58.23579],[23.99993,58.28092],[23.82971,58.28047],[23.82947,58.32554],[23.65864,58.32496],[23.65791,58.41493],[23.57225,58.41468],[23.57127,58.50436],[23.39935,58.50359],[23.40106,58.41391],[23.14421,58.41238],[23.14567,58.36735],[23.05989,58.36703],[23.06172,58.32221],[22.9757,58.32157],[22.97716,58.27681],[22.89187,58.27598],[22.89358,58.23103],[22.80865,58.2302],[22.81012,58.18539],[22.89529,58.1861],[22.89663,58.1413],[22.72641,58.13982],[22.72495,58.18475],[22.55522,58.18276],[22.55693,58.13744],[22.64173,58.13886],[22.64344,58.094],[22.38903,58.0909],[22.38525,58.18063],[22.29995,58.17967],[22.30679,58.04527],[22.22198,58.0436],[22.22626,57.95404],[22.14206,57.95281],[22.1445,57.90804],[22.06007,57.90681],[22.06263,57.86186],[21.97807,57.86043],[21.96831,58.04004],[22.05274,58.04134],[22.04506,58.17581],[21.96038,58.17471],[21.95781,58.21941],[21.78723,58.21638],[21.78211,58.30631],[21.69681,58.3049],[21.69401,58.34975],[21.77942,58.35122],[21.76795,58.53074],[22.02566,58.53488],[22.02797,58.49001],[22.11375,58.49167],[22.11144,58.53621],[22.19709,58.53742],[22.19453,58.5823],[22.45236,58.58573],[22.44638,58.7203],[22.36023,58.71916],[22.35364,58.85385]],[[23.47415,59.26726],[23.29868,59.26632],[23.29795,59.31138],[23.47293,59.31194],[23.47415,59.26726]],[[24.17014,58.1908],[24.25507,58.19073],[24.25458,58.14581],[24.17002,58.14588],[24.17014,58.1908]],[[24.08485,58.19092],[24.08497,58.10129],[23.99968,58.10116],[23.99993,58.05632],[23.91525,58.05612],[23.915,58.14613],[23.83032,58.146],[23.82971,58.23572],[23.91451,58.23585],[23.91476,58.19099],[24.08485,58.19092]],[[24.61854,59.53612],[24.44183,59.5368],[24.44309,59.62659],[24.62016,59.6258],[24.61854,59.53612]],[[26.40403,59.7852],[26.31501,59.78667],[26.31814,59.83152],[26.40732,59.82994],[26.40403,59.7852]],[[26.48308,59.649],[26.48647,59.69383],[26.57514,59.69202],[26.57166,59.64719],[26.48308,59.649]],[[23.15944,57.78408],[23.24346,57.78461],[23.24445,57.73971],[23.32848,57.74031],[23.32679,57.82998],[23.15845,57.82885],[23.15944,57.78408]]],terms_text:"Maa-Ameti metsanduslik ortofoto"},{id:"maaamet.ee-reljeef",name:"Estonia Hillshading (Maaamet)",type:"wms",template:"https://kaart.maaamet.ee/wms/alus-geo?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&Layers=reljeef&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",polygon:[[[22.35364,58.85385],[22.09411,58.85038],[22.09179,58.8951],[22.00503,58.89371],[21.99979,58.98374],[22.34754,58.98845],[22.34535,59.03337],[22.51935,59.03538],[22.51556,59.1251],[22.69017,59.12686],[22.69212,59.08218],[22.77912,59.083],[22.78083,59.03814],[22.86808,59.03877],[22.8693,58.99399],[22.9563,58.99487],[22.95495,59.03959],[23.12895,59.04097],[23.12786,59.08582],[23.47671,59.0877],[23.47415,59.26726],[23.64924,59.26788],[23.64888,59.31281],[23.73698,59.313],[23.73649,59.3578],[23.91158,59.35787],[23.91207,59.4028],[24.176,59.4028],[24.17637,59.4478],[24.26446,59.44767],[24.26471,59.49236],[24.70605,59.49082],[24.70898,59.62553],[24.79744,59.62497],[24.79659,59.58009],[24.97327,59.57885],[24.97462,59.62386],[24.88603,59.62473],[24.88725,59.66918],[24.9762,59.66863],[24.9773,59.71346],[25.06601,59.71259],[25.0632,59.62306],[25.24037,59.62145],[25.24184,59.66647],[25.33055,59.66548],[25.32884,59.62078],[25.41755,59.61979],[25.41938,59.66468],[25.6855,59.66148],[25.68757,59.70613],[25.86511,59.70386],[25.86279,59.65901],[26.12855,59.65507],[26.12575,59.6101],[26.39114,59.60565],[26.38809,59.56099],[26.82967,59.55215],[26.82626,59.50729],[26.91423,59.50549],[26.91057,59.46051],[27.96689,59.43303],[27.9719,59.4778],[28.03669,59.4757],[28.04377,59.47223],[28.04767,59.46578],[28.05182,59.46342],[28.06915,59.46256],[28.08452,59.45939],[28.12174,59.44091],[28.13577,59.4277],[28.13711,59.42267],[28.14163,59.41901],[28.16652,59.41205],[28.17225,59.40789],[28.19275,59.4015],[28.21069,59.3836],[28.21069,59.37994],[28.20386,59.37459],[28.21057,59.37235],[28.21105,59.36937],[28.20678,59.36719],[28.20703,59.36377],[28.19971,59.36091],[28.20203,59.35731],[28.19263,59.35227],[28.19397,59.34642],[28.16969,59.33354],[28.13626,59.29244],[28.12515,59.28901],[28.11722,59.28895],[28.1099,59.29063],[28.05353,59.2902],[28.02022,59.28334],[27.99825,59.2753],[27.97983,59.27293],[27.96433,59.27268],[27.95335,59.26863],[27.9492,59.26533],[27.90564,59.24044],[27.90113,59.23488],[27.901,59.22639],[27.89783,59.21746],[27.90235,59.20728],[27.89234,59.19222],[27.88978,59.18379],[27.87648,59.17372],[27.87184,59.16841],[27.86818,59.16159],[27.84414,59.14814],[27.83206,59.14401],[27.82035,59.13362],[27.80986,59.12905],[27.80595,59.12166],[27.80534,59.1127],[27.81071,59.10819],[27.8101,59.10606],[27.80205,59.1028],[27.78887,59.0909],[27.7907,59.08112],[27.79375,59.07842],[27.79411,59.07566],[27.79277,59.0729],[27.79302,59.06927],[27.7885,59.06657],[27.78265,59.065],[27.77508,59.0581],[27.77313,59.05107],[27.77667,59.04743],[27.76983,59.03325],[27.76605,59.03155],[27.75153,59.03017],[27.74628,59.02716],[27.74567,59.01705],[27.74165,59.00951],[27.74787,58.99267],[27.74274,58.98845],[27.73213,58.9855],[27.6544,58.98783],[27.65501,58.99241],[27.39414,58.99964],[27.38974,58.95474],[27.12935,58.96135],[27.12557,58.9164],[27.03882,58.91841],[27.0271,58.7841],[27.11361,58.78183],[27.10934,58.73709],[27.19537,58.73512],[27.18731,58.64533],[27.27309,58.64305],[27.25259,58.41883],[27.53397,58.41142],[27.5552,58.36575],[27.51762,58.33265],[27.51408,58.32214],[27.49993,58.32246],[27.48687,58.18803],[27.52872,58.18687],[27.59205,58.11875],[27.63695,58.09735],[27.60938,58.05399],[27.62268,58.0058],[27.64489,58.00205],[27.65294,58.00644],[27.64781,58.01426],[27.64781,58.02086],[27.66172,58.01866],[27.66856,58.01045],[27.68393,58.00845],[27.6965,58.0045],[27.70065,57.99862],[27.69882,57.98827],[27.69125,57.98549],[27.68064,57.97449],[27.6821,57.9719],[27.68893,57.97184],[27.68588,57.95928],[27.65892,57.9554],[27.66758,57.951],[27.67161,57.94627],[27.66917,57.94174],[27.67649,57.93552],[27.68247,57.93655],[27.68613,57.92794],[27.68247,57.92437],[27.71078,57.92392],[27.72029,57.92036],[27.72054,57.91174],[27.70834,57.90616],[27.69882,57.90616],[27.70614,57.90136],[27.72896,57.90739],[27.74677,57.90169],[27.7536,57.90409],[27.75739,57.90318],[27.75592,57.89806],[27.76959,57.89566],[27.78094,57.89832],[27.799,57.89961],[27.81852,57.89579],[27.82096,57.89047],[27.81949,57.888],[27.81059,57.88612],[27.81827,57.88249],[27.81169,57.87204],[27.81583,57.87166],[27.8184,57.8651],[27.81632,57.86134],[27.79875,57.85205],[27.7946,57.84634],[27.80058,57.8442],[27.7957,57.84017],[27.78862,57.84186],[27.78411,57.83725],[27.77715,57.8325],[27.75849,57.83536],[27.74165,57.82679],[27.72383,57.83179],[27.70541,57.84192],[27.68771,57.83419],[27.66636,57.83653],[27.66026,57.83893],[27.64818,57.8377],[27.63634,57.83978],[27.62487,57.83751],[27.62207,57.83874],[27.59791,57.83328],[27.56252,57.83023],[27.5563,57.83127],[27.55227,57.82113],[27.54446,57.82204],[27.5452,57.81808],[27.55056,57.81769],[27.55667,57.81366],[27.5408,57.81288],[27.54471,57.808],[27.53726,57.80644],[27.53958,57.80144],[27.53592,57.79663],[27.53861,57.79396],[27.52921,57.78856],[27.5175,57.78876],[27.51847,57.79201],[27.50298,57.78798],[27.50005,57.78973],[27.4959,57.78869],[27.50774,57.78349],[27.51457,57.77516],[27.5081,57.77158],[27.51115,57.76416],[27.51591,57.7639],[27.52018,57.75993],[27.52811,57.75818],[27.53007,57.75368],[27.53116,57.74073],[27.548,57.7333],[27.5419,57.73037],[27.52799,57.72946],[27.5236,57.71616],[27.52762,57.70899],[27.5236,57.70802],[27.51652,57.70873],[27.51066,57.71101],[27.50859,57.70723],[27.49993,57.70495],[27.49529,57.70749],[27.48711,57.7191],[27.47357,57.71545],[27.47064,57.70802],[27.46149,57.70619],[27.44807,57.71616],[27.43086,57.70756],[27.42818,57.69902],[27.41341,57.69915],[27.41647,57.69524],[27.40744,57.69276],[27.40231,57.68493],[27.39133,57.68539],[27.39377,57.67913],[27.39145,57.67671],[27.38193,57.67332],[27.37779,57.66836],[27.38364,57.66059],[27.3801,57.65883],[27.38755,57.6555],[27.38047,57.6495],[27.38352,57.64799],[27.38157,57.64368],[27.39072,57.6431],[27.38816,57.64009],[27.40085,57.63742],[27.40317,57.62905],[27.40182,57.62376],[27.39597,57.62115],[27.39023,57.62036],[27.39084,57.6169],[27.40195,57.61775],[27.40634,57.61546],[27.40683,57.61246],[27.38572,57.60304],[27.37827,57.59513],[27.35692,57.59696],[27.3413,57.58984],[27.34179,57.58539],[27.32886,57.5797],[27.32141,57.57898],[27.3341,57.56596],[27.33178,57.56066],[27.33776,57.56007],[27.33886,57.54671],[27.34386,57.5454],[27.35472,57.52575],[27.35131,57.51632],[27.34569,57.52104],[27.32446,57.52274],[27.29664,57.53859],[27.28017,57.53643],[27.2737,57.54311],[27.26431,57.54377],[27.2637,57.54841],[27.25772,57.54979],[27.24796,57.54769],[27.2249,57.55385],[27.19329,57.54966],[27.16145,57.55922],[27.11654,57.56118],[27.10092,57.5653],[27.08506,57.57538],[27.07262,57.57734],[27.07225,57.57989],[27.0559,57.58251],[27.05285,57.58087],[27.04687,57.58048],[27.04492,57.58251],[27.0332,57.58532],[27.04126,57.58761],[27.04418,57.5967],[27.03101,57.60461],[26.99513,57.60461],[26.99233,57.61076],[26.98696,57.60867],[26.98366,57.61174],[26.97549,57.612],[26.97097,57.60448],[26.9595,57.60625],[26.9578,57.60468],[26.94596,57.60272],[26.93961,57.60932],[26.95133,57.61579],[26.94999,57.62056],[26.94059,57.61978],[26.92961,57.62376],[26.92644,57.6331],[26.90679,57.63304],[26.89971,57.63056],[26.90057,57.62918],[26.89581,57.62572],[26.88849,57.62357],[26.88898,57.62193],[26.87458,57.61906],[26.87275,57.61736],[26.86555,57.61592],[26.85786,57.60997],[26.86469,57.6084],[26.85811,57.60049],[26.85994,57.59598],[26.86433,57.59415],[26.86177,57.59108],[26.84688,57.5884],[26.83504,57.58244],[26.81589,57.58153],[26.80954,57.58473],[26.79685,57.58179],[26.79929,57.58002],[26.79295,57.57315],[26.78685,57.57525],[26.7766,57.55994],[26.76915,57.56039],[26.76354,57.56314],[26.75366,57.56249],[26.75817,57.5653],[26.76891,57.57041],[26.77379,57.57473],[26.76769,57.57754],[26.74804,57.5778],[26.75317,57.58009],[26.73816,57.58774],[26.72901,57.58016],[26.73828,57.57584],[26.73072,57.56903],[26.72388,57.57244],[26.71107,57.56596],[26.69972,57.57106],[26.69753,57.5706],[26.69741,57.56733],[26.69155,57.56615],[26.67569,57.56668],[26.67105,57.56327],[26.6719,57.55385],[26.66531,57.55287],[26.64652,57.55391],[26.64262,57.54658],[26.63444,57.54357],[26.61443,57.52909],[26.61712,57.50885],[26.60467,57.51212],[26.60479,57.51442],[26.5954,57.51376],[26.59479,57.51592],[26.58808,57.51619],[26.59015,57.52516],[26.58698,57.52621],[26.58771,57.53781],[26.58381,57.53957],[26.57978,57.53695],[26.57966,57.53375],[26.56123,57.5285],[26.56184,57.52261],[26.5666,57.51946],[26.55794,57.5137],[26.52585,57.51619],[26.49961,57.52451],[26.49095,57.54534],[26.46996,57.57551],[26.40151,57.57237],[26.34489,57.58408],[26.33476,57.5797],[26.32781,57.57963],[26.32635,57.58277],[26.3117,57.58473],[26.30853,57.59291],[26.3006,57.59343],[26.29291,57.59114],[26.28352,57.59232],[26.28217,57.5952],[26.27754,57.595],[26.27034,57.6001],[26.27022,57.60461],[26.25423,57.61383],[26.24715,57.62082],[26.24813,57.62775],[26.23947,57.63408],[26.24203,57.63539],[26.24667,57.63559],[26.23959,57.64649],[26.23239,57.6461],[26.23117,57.64904],[26.24215,57.65146],[26.2363,57.65753],[26.23032,57.65805],[26.21043,57.66601],[26.21372,57.66888],[26.21092,57.67071],[26.21018,57.67906],[26.20079,57.68102],[26.19896,57.68356],[26.19444,57.68519],[26.18541,57.68454],[26.17712,57.68761],[26.18871,57.69472],[26.19859,57.70906],[26.20567,57.71486],[26.1726,57.72867],[26.141,57.73278],[26.13563,57.73923],[26.13905,57.74548],[26.13551,57.7503],[26.10537,57.757],[26.08035,57.76547],[26.07974,57.76384],[26.07328,57.76371],[26.07047,57.7656],[26.05912,57.75987],[26.049,57.7611],[26.0435,57.76703],[26.03326,57.77054],[26.02374,57.76761],[26.01776,57.7723],[26.02459,57.77516],[26.02496,57.7816],[26.02252,57.78355],[26.02776,57.7898],[26.03081,57.79097],[26.03338,57.80105],[26.03679,57.80592],[26.03606,57.8108],[26.04851,57.82289],[26.05705,57.83842],[26.05558,57.84764],[26.03667,57.84926],[26.02008,57.84517],[26.00958,57.85731],[25.99848,57.85816],[25.96273,57.84491],[25.931,57.85244],[25.89537,57.84972],[25.8883,57.84595],[25.88085,57.84946],[25.88573,57.85277],[25.88427,57.85595],[25.87561,57.85796],[25.87475,57.86322],[25.8595,57.85614],[25.81923,57.86419],[25.78312,57.89948],[25.78629,57.90428],[25.77165,57.91206],[25.75102,57.91692],[25.73724,57.92295],[25.72833,57.92133],[25.72247,57.91245],[25.70356,57.90331],[25.67916,57.90461],[25.67549,57.91277],[25.66207,57.91511],[25.65609,57.91439],[25.64889,57.91666],[25.64987,57.91841],[25.63828,57.93059],[25.57983,57.9442],[25.59399,57.95961],[25.58935,57.96504],[25.58239,57.96783],[25.58044,57.9721],[25.57483,57.9741],[25.56556,57.96718],[25.56604,57.96258],[25.55714,57.96038],[25.55567,57.96711],[25.55079,57.97255],[25.53725,57.97139],[25.52566,57.97184],[25.5226,57.96802],[25.51638,57.96737],[25.51211,57.96977],[25.52212,57.97488],[25.51943,57.98031],[25.48539,57.97475],[25.47843,57.98006],[25.47843,57.98264],[25.44219,57.99616],[25.44817,58.00114],[25.46648,58.00515],[25.44817,58.01698],[25.40693,58.02893],[25.37155,58.02926],[25.36374,58.03171],[25.35336,58.04334],[25.34482,58.04676],[25.33604,58.05709],[25.3292,58.05858],[25.32664,58.0638],[25.31981,58.066],[25.31908,58.06929],[25.29553,58.08161],[25.28686,58.08149],[25.28113,58.07019],[25.266,58.06716],[25.26502,58.06],[25.27991,58.05063],[25.29309,58.0467],[25.30431,58.03449],[25.30114,58.01504],[25.29748,58.01459],[25.30285,58.00011],[25.29577,57.99972],[25.29736,57.99661],[25.30358,57.99396],[25.30138,57.99273],[25.29187,57.99286],[25.28308,57.98963],[25.26722,57.99454],[25.25611,57.9939],[25.25502,58.00347],[25.2455,58.00302],[25.22768,58.01782],[25.24587,58.01872],[25.23562,58.02286],[25.23635,58.02441],[25.22732,58.02435],[25.22537,58.02195],[25.21902,58.02977],[25.21658,58.04088],[25.22695,58.04799],[25.22817,58.05348],[25.22122,58.05302],[25.22146,58.05051],[25.2178,58.04908],[25.21597,58.05954],[25.21219,58.06226],[25.20523,58.06122],[25.20389,58.0651],[25.21621,58.07413],[25.21207,58.08052],[25.19962,58.08536],[25.18949,58.08007],[25.19169,58.07613],[25.1535,58.07478],[25.15154,58.07703],[25.13397,58.07974],[25.10579,58.07749],[25.10518,58.06645],[25.07662,58.06645],[25.02037,58.01769],[24.99512,58.01084],[24.94863,58.00942],[24.83234,57.97177],[24.80806,57.99066],[24.74229,57.98187],[24.74339,57.96491],[24.7329,57.96239],[24.71508,57.96271],[24.6919,57.94653],[24.67335,57.95896],[24.64468,57.95889],[24.64187,57.95423],[24.64577,57.95268],[24.62869,57.94193],[24.61612,57.94368],[24.60892,57.95125],[24.58464,57.96174],[24.57317,57.95436],[24.54792,57.94938],[24.54352,57.94478],[24.5301,57.94705],[24.5207,57.94303],[24.51839,57.93675],[24.5096,57.93442],[24.51326,57.93066],[24.4625,57.92496],[24.44579,57.90798],[24.46018,57.90662],[24.45225,57.89942],[24.46006,57.87977],[24.41138,57.86491],[24.40906,57.87191],[24.33707,57.87393],[24.33829,58.0109],[24.42272,58.01097],[24.42614,58.28002],[24.51155,58.2797],[24.51216,58.32471],[24.42638,58.32503],[24.42712,58.36972],[24.34182,58.37017],[24.34048,58.23547],[24.17014,58.23572],[24.17014,58.1908],[24.08485,58.19092],[24.0851,58.23605],[24.00066,58.23579],[23.99993,58.28092],[23.82971,58.28047],[23.82947,58.32554],[23.65864,58.32496],[23.65791,58.41493],[23.57225,58.41468],[23.57127,58.50436],[23.39935,58.50359],[23.40106,58.41391],[23.14421,58.41238],[23.14567,58.36735],[23.05989,58.36703],[23.06172,58.32221],[22.9757,58.32157],[22.97716,58.27681],[22.89187,58.27598],[22.89358,58.23103],[22.80865,58.2302],[22.81012,58.18539],[22.89529,58.1861],[22.89663,58.1413],[22.72641,58.13982],[22.72495,58.18475],[22.55522,58.18276],[22.55693,58.13744],[22.64173,58.13886],[22.64344,58.094],[22.38903,58.0909],[22.38525,58.18063],[22.29995,58.17967],[22.30679,58.04527],[22.22198,58.0436],[22.22626,57.95404],[22.14206,57.95281],[22.1445,57.90804],[22.06007,57.90681],[22.06263,57.86186],[21.97807,57.86043],[21.96831,58.04004],[22.05274,58.04134],[22.04506,58.17581],[21.96038,58.17471],[21.95781,58.21941],[21.78723,58.21638],[21.78211,58.30631],[21.69681,58.3049],[21.69401,58.34975],[21.77942,58.35122],[21.76795,58.53074],[22.02566,58.53488],[22.02797,58.49001],[22.11375,58.49167],[22.11144,58.53621],[22.19709,58.53742],[22.19453,58.5823],[22.45236,58.58573],[22.44638,58.7203],[22.36023,58.71916],[22.35364,58.85385]],[[23.47415,59.26726],[23.29868,59.26632],[23.29795,59.31138],[23.47293,59.31194],[23.47415,59.26726]],[[24.17014,58.1908],[24.25507,58.19073],[24.25458,58.14581],[24.17002,58.14588],[24.17014,58.1908]],[[24.08485,58.19092],[24.08497,58.10129],[23.99968,58.10116],[23.99993,58.05632],[23.91525,58.05612],[23.915,58.14613],[23.83032,58.146],[23.82971,58.23572],[23.91451,58.23585],[23.91476,58.19099],[24.08485,58.19092]],[[24.61854,59.53612],[24.44183,59.5368],[24.44309,59.62659],[24.62016,59.6258],[24.61854,59.53612]],[[26.40403,59.7852],[26.31501,59.78667],[26.31814,59.83152],[26.40732,59.82994],[26.40403,59.7852]],[[26.48308,59.649],[26.48647,59.69383],[26.57514,59.69202],[26.57166,59.64719],[26.48308,59.649]],[[23.15944,57.78408],[23.24346,57.78461],[23.24445,57.73971],[23.32848,57.74031],[23.32679,57.82998],[23.15845,57.82885],[23.15944,57.78408]]],terms_text:"Maa-Ameti reljeefikaart"},{id:"maaamet.ee-orto",name:"Estonia Ortho (Maaamet)",type:"tms",template:"https://tiles.maaamet.ee/tm/tms/1.0.0/foto@GMC/{zoom}/{x}/{-y}.png",zoomExtent:[6,18],polygon:[[[22.35364,58.85385],[22.09411,58.85038],[22.09179,58.8951],[22.00503,58.89371],[21.99979,58.98374],[22.34754,58.98845],[22.34535,59.03337],[22.51935,59.03538],[22.51556,59.1251],[22.69017,59.12686],[22.69212,59.08218],[22.77912,59.083],[22.78083,59.03814],[22.86808,59.03877],[22.8693,58.99399],[22.9563,58.99487],[22.95495,59.03959],[23.12895,59.04097],[23.12786,59.08582],[23.47671,59.0877],[23.47415,59.26726],[23.64924,59.26788],[23.64888,59.31281],[23.73698,59.313],[23.73649,59.3578],[23.91158,59.35787],[23.91207,59.4028],[24.176,59.4028],[24.17637,59.4478],[24.26446,59.44767],[24.26471,59.49236],[24.70605,59.49082],[24.70898,59.62553],[24.79744,59.62497],[24.79659,59.58009],[24.97327,59.57885],[24.97462,59.62386],[24.88603,59.62473],[24.88725,59.66918],[24.9762,59.66863],[24.9773,59.71346],[25.06601,59.71259],[25.0632,59.62306],[25.24037,59.62145],[25.24184,59.66647],[25.33055,59.66548],[25.32884,59.62078],[25.41755,59.61979],[25.41938,59.66468],[25.6855,59.66148],[25.68757,59.70613],[25.86511,59.70386],[25.86279,59.65901],[26.12855,59.65507],[26.12575,59.6101],[26.39114,59.60565],[26.38809,59.56099],[26.82967,59.55215],[26.82626,59.50729],[26.91423,59.50549],[26.91057,59.46051],[27.96689,59.43303],[27.9719,59.4778],[28.03669,59.4757],[28.04377,59.47223],[28.04767,59.46578],[28.05182,59.46342],[28.06915,59.46256],[28.08452,59.45939],[28.12174,59.44091],[28.13577,59.4277],[28.13711,59.42267],[28.14163,59.41901],[28.16652,59.41205],[28.17225,59.40789],[28.19275,59.4015],[28.21069,59.3836],[28.21069,59.37994],[28.20386,59.37459],[28.21057,59.37235],[28.21105,59.36937],[28.20678,59.36719],[28.20703,59.36377],[28.19971,59.36091],[28.20203,59.35731],[28.19263,59.35227],[28.19397,59.34642],[28.16969,59.33354],[28.13626,59.29244],[28.12515,59.28901],[28.11722,59.28895],[28.1099,59.29063],[28.05353,59.2902],[28.02022,59.28334],[27.99825,59.2753],[27.97983,59.27293],[27.96433,59.27268],[27.95335,59.26863],[27.9492,59.26533],[27.90564,59.24044],[27.90113,59.23488],[27.901,59.22639],[27.89783,59.21746],[27.90235,59.20728],[27.89234,59.19222],[27.88978,59.18379],[27.87648,59.17372],[27.87184,59.16841],[27.86818,59.16159],[27.84414,59.14814],[27.83206,59.14401],[27.82035,59.13362],[27.80986,59.12905],[27.80595,59.12166],[27.80534,59.1127],[27.81071,59.10819],[27.8101,59.10606],[27.80205,59.1028],[27.78887,59.0909],[27.7907,59.08112],[27.79375,59.07842],[27.79411,59.07566],[27.79277,59.0729],[27.79302,59.06927],[27.7885,59.06657],[27.78265,59.065],[27.77508,59.0581],[27.77313,59.05107],[27.77667,59.04743],[27.76983,59.03325],[27.76605,59.03155],[27.75153,59.03017],[27.74628,59.02716],[27.74567,59.01705],[27.74165,59.00951],[27.74787,58.99267],[27.74274,58.98845],[27.73213,58.9855],[27.6544,58.98783],[27.65501,58.99241],[27.39414,58.99964],[27.38974,58.95474],[27.12935,58.96135],[27.12557,58.9164],[27.03882,58.91841],[27.0271,58.7841],[27.11361,58.78183],[27.10934,58.73709],[27.19537,58.73512],[27.18731,58.64533],[27.27309,58.64305],[27.25259,58.41883],[27.53397,58.41142],[27.5552,58.36575],[27.51762,58.33265],[27.51408,58.32214],[27.49993,58.32246],[27.48687,58.18803],[27.52872,58.18687],[27.59205,58.11875],[27.63695,58.09735],[27.60938,58.05399],[27.62268,58.0058],[27.64489,58.00205],[27.65294,58.00644],[27.64781,58.01426],[27.64781,58.02086],[27.66172,58.01866],[27.66856,58.01045],[27.68393,58.00845],[27.6965,58.0045],[27.70065,57.99862],[27.69882,57.98827],[27.69125,57.98549],[27.68064,57.97449],[27.6821,57.9719],[27.68893,57.97184],[27.68588,57.95928],[27.65892,57.9554],[27.66758,57.951],[27.67161,57.94627],[27.66917,57.94174],[27.67649,57.93552],[27.68247,57.93655],[27.68613,57.92794],[27.68247,57.92437],[27.71078,57.92392],[27.72029,57.92036],[27.72054,57.91174],[27.70834,57.90616],[27.69882,57.90616],[27.70614,57.90136],[27.72896,57.90739],[27.74677,57.90169],[27.7536,57.90409],[27.75739,57.90318],[27.75592,57.89806],[27.76959,57.89566],[27.78094,57.89832],[27.799,57.89961],[27.81852,57.89579],[27.82096,57.89047],[27.81949,57.888],[27.81059,57.88612],[27.81827,57.88249],[27.81169,57.87204],[27.81583,57.87166],[27.8184,57.8651],[27.81632,57.86134],[27.79875,57.85205],[27.7946,57.84634],[27.80058,57.8442],[27.7957,57.84017],[27.78862,57.84186],[27.78411,57.83725],[27.77715,57.8325],[27.75849,57.83536],[27.74165,57.82679],[27.72383,57.83179],[27.70541,57.84192],[27.68771,57.83419],[27.66636,57.83653],[27.66026,57.83893],[27.64818,57.8377],[27.63634,57.83978],[27.62487,57.83751],[27.62207,57.83874],[27.59791,57.83328],[27.56252,57.83023],[27.5563,57.83127],[27.55227,57.82113],[27.54446,57.82204],[27.5452,57.81808],[27.55056,57.81769],[27.55667,57.81366],[27.5408,57.81288],[27.54471,57.808],[27.53726,57.80644],[27.53958,57.80144],[27.53592,57.79663],[27.53861,57.79396],[27.52921,57.78856],[27.5175,57.78876],[27.51847,57.79201],[27.50298,57.78798],[27.50005,57.78973],[27.4959,57.78869],[27.50774,57.78349],[27.51457,57.77516],[27.5081,57.77158],[27.51115,57.76416],[27.51591,57.7639],[27.52018,57.75993],[27.52811,57.75818],[27.53007,57.75368],[27.53116,57.74073],[27.548,57.7333],[27.5419,57.73037],[27.52799,57.72946],[27.5236,57.71616],[27.52762,57.70899],[27.5236,57.70802],[27.51652,57.70873],[27.51066,57.71101],[27.50859,57.70723],[27.49993,57.70495],[27.49529,57.70749],[27.48711,57.7191],[27.47357,57.71545],[27.47064,57.70802],[27.46149,57.70619],[27.44807,57.71616],[27.43086,57.70756],[27.42818,57.69902],[27.41341,57.69915],[27.41647,57.69524],[27.40744,57.69276],[27.40231,57.68493],[27.39133,57.68539],[27.39377,57.67913],[27.39145,57.67671],[27.38193,57.67332],[27.37779,57.66836],[27.38364,57.66059],[27.3801,57.65883],[27.38755,57.6555],[27.38047,57.6495],[27.38352,57.64799],[27.38157,57.64368],[27.39072,57.6431],[27.38816,57.64009],[27.40085,57.63742],[27.40317,57.62905],[27.40182,57.62376],[27.39597,57.62115],[27.39023,57.62036],[27.39084,57.6169],[27.40195,57.61775],[27.40634,57.61546],[27.40683,57.61246],[27.38572,57.60304],[27.37827,57.59513],[27.35692,57.59696],[27.3413,57.58984],[27.34179,57.58539],[27.32886,57.5797],[27.32141,57.57898],[27.3341,57.56596],[27.33178,57.56066],[27.33776,57.56007],[27.33886,57.54671],[27.34386,57.5454],[27.35472,57.52575],[27.35131,57.51632],[27.34569,57.52104],[27.32446,57.52274],[27.29664,57.53859],[27.28017,57.53643],[27.2737,57.54311],[27.26431,57.54377],[27.2637,57.54841],[27.25772,57.54979],[27.24796,57.54769],[27.2249,57.55385],[27.19329,57.54966],[27.16145,57.55922],[27.11654,57.56118],[27.10092,57.5653],[27.08506,57.57538],[27.07262,57.57734],[27.07225,57.57989],[27.0559,57.58251],[27.05285,57.58087],[27.04687,57.58048],[27.04492,57.58251],[27.0332,57.58532],[27.04126,57.58761],[27.04418,57.5967],[27.03101,57.60461],[26.99513,57.60461],[26.99233,57.61076],[26.98696,57.60867],[26.98366,57.61174],[26.97549,57.612],[26.97097,57.60448],[26.9595,57.60625],[26.9578,57.60468],[26.94596,57.60272],[26.93961,57.60932],[26.95133,57.61579],[26.94999,57.62056],[26.94059,57.61978],[26.92961,57.62376],[26.92644,57.6331],[26.90679,57.63304],[26.89971,57.63056],[26.90057,57.62918],[26.89581,57.62572],[26.88849,57.62357],[26.88898,57.62193],[26.87458,57.61906],[26.87275,57.61736],[26.86555,57.61592],[26.85786,57.60997],[26.86469,57.6084],[26.85811,57.60049],[26.85994,57.59598],[26.86433,57.59415],[26.86177,57.59108],[26.84688,57.5884],[26.83504,57.58244],[26.81589,57.58153],[26.80954,57.58473],[26.79685,57.58179],[26.79929,57.58002],[26.79295,57.57315],[26.78685,57.57525],[26.7766,57.55994],[26.76915,57.56039],[26.76354,57.56314],[26.75366,57.56249],[26.75817,57.5653],[26.76891,57.57041],[26.77379,57.57473],[26.76769,57.57754],[26.74804,57.5778],[26.75317,57.58009],[26.73816,57.58774],[26.72901,57.58016],[26.73828,57.57584],[26.73072,57.56903],[26.72388,57.57244],[26.71107,57.56596],[26.69972,57.57106],[26.69753,57.5706],[26.69741,57.56733],[26.69155,57.56615],[26.67569,57.56668],[26.67105,57.56327],[26.6719,57.55385],[26.66531,57.55287],[26.64652,57.55391],[26.64262,57.54658],[26.63444,57.54357],[26.61443,57.52909],[26.61712,57.50885],[26.60467,57.51212],[26.60479,57.51442],[26.5954,57.51376],[26.59479,57.51592],[26.58808,57.51619],[26.59015,57.52516],[26.58698,57.52621],[26.58771,57.53781],[26.58381,57.53957],[26.57978,57.53695],[26.57966,57.53375],[26.56123,57.5285],[26.56184,57.52261],[26.5666,57.51946],[26.55794,57.5137],[26.52585,57.51619],[26.49961,57.52451],[26.49095,57.54534],[26.46996,57.57551],[26.40151,57.57237],[26.34489,57.58408],[26.33476,57.5797],[26.32781,57.57963],[26.32635,57.58277],[26.3117,57.58473],[26.30853,57.59291],[26.3006,57.59343],[26.29291,57.59114],[26.28352,57.59232],[26.28217,57.5952],[26.27754,57.595],[26.27034,57.6001],[26.27022,57.60461],[26.25423,57.61383],[26.24715,57.62082],[26.24813,57.62775],[26.23947,57.63408],[26.24203,57.63539],[26.24667,57.63559],[26.23959,57.64649],[26.23239,57.6461],[26.23117,57.64904],[26.24215,57.65146],[26.2363,57.65753],[26.23032,57.65805],[26.21043,57.66601],[26.21372,57.66888],[26.21092,57.67071],[26.21018,57.67906],[26.20079,57.68102],[26.19896,57.68356],[26.19444,57.68519],[26.18541,57.68454],[26.17712,57.68761],[26.18871,57.69472],[26.19859,57.70906],[26.20567,57.71486],[26.1726,57.72867],[26.141,57.73278],[26.13563,57.73923],[26.13905,57.74548],[26.13551,57.7503],[26.10537,57.757],[26.08035,57.76547],[26.07974,57.76384],[26.07328,57.76371],[26.07047,57.7656],[26.05912,57.75987],[26.049,57.7611],[26.0435,57.76703],[26.03326,57.77054],[26.02374,57.76761],[26.01776,57.7723],[26.02459,57.77516],[26.02496,57.7816],[26.02252,57.78355],[26.02776,57.7898],[26.03081,57.79097],[26.03338,57.80105],[26.03679,57.80592],[26.03606,57.8108],[26.04851,57.82289],[26.05705,57.83842],[26.05558,57.84764],[26.03667,57.84926],[26.02008,57.84517],[26.00958,57.85731],[25.99848,57.85816],[25.96273,57.84491],[25.931,57.85244],[25.89537,57.84972],[25.8883,57.84595],[25.88085,57.84946],[25.88573,57.85277],[25.88427,57.85595],[25.87561,57.85796],[25.87475,57.86322],[25.8595,57.85614],[25.81923,57.86419],[25.78312,57.89948],[25.78629,57.90428],[25.77165,57.91206],[25.75102,57.91692],[25.73724,57.92295],[25.72833,57.92133],[25.72247,57.91245],[25.70356,57.90331],[25.67916,57.90461],[25.67549,57.91277],[25.66207,57.91511],[25.65609,57.91439],[25.64889,57.91666],[25.64987,57.91841],[25.63828,57.93059],[25.57983,57.9442],[25.59399,57.95961],[25.58935,57.96504],[25.58239,57.96783],[25.58044,57.9721],[25.57483,57.9741],[25.56556,57.96718],[25.56604,57.96258],[25.55714,57.96038],[25.55567,57.96711],[25.55079,57.97255],[25.53725,57.97139],[25.52566,57.97184],[25.5226,57.96802],[25.51638,57.96737],[25.51211,57.96977],[25.52212,57.97488],[25.51943,57.98031],[25.48539,57.97475],[25.47843,57.98006],[25.47843,57.98264],[25.44219,57.99616],[25.44817,58.00114],[25.46648,58.00515],[25.44817,58.01698],[25.40693,58.02893],[25.37155,58.02926],[25.36374,58.03171],[25.35336,58.04334],[25.34482,58.04676],[25.33604,58.05709],[25.3292,58.05858],[25.32664,58.0638],[25.31981,58.066],[25.31908,58.06929],[25.29553,58.08161],[25.28686,58.08149],[25.28113,58.07019],[25.266,58.06716],[25.26502,58.06],[25.27991,58.05063],[25.29309,58.0467],[25.30431,58.03449],[25.30114,58.01504],[25.29748,58.01459],[25.30285,58.00011],[25.29577,57.99972],[25.29736,57.99661],[25.30358,57.99396],[25.30138,57.99273],[25.29187,57.99286],[25.28308,57.98963],[25.26722,57.99454],[25.25611,57.9939],[25.25502,58.00347],[25.2455,58.00302],[25.22768,58.01782],[25.24587,58.01872],[25.23562,58.02286],[25.23635,58.02441],[25.22732,58.02435],[25.22537,58.02195],[25.21902,58.02977],[25.21658,58.04088],[25.22695,58.04799],[25.22817,58.05348],[25.22122,58.05302],[25.22146,58.05051],[25.2178,58.04908],[25.21597,58.05954],[25.21219,58.06226],[25.20523,58.06122],[25.20389,58.0651],[25.21621,58.07413],[25.21207,58.08052],[25.19962,58.08536],[25.18949,58.08007],[25.19169,58.07613],[25.1535,58.07478],[25.15154,58.07703],[25.13397,58.07974],[25.10579,58.07749],[25.10518,58.06645],[25.07662,58.06645],[25.02037,58.01769],[24.99512,58.01084],[24.94863,58.00942],[24.83234,57.97177],[24.80806,57.99066],[24.74229,57.98187],[24.74339,57.96491],[24.7329,57.96239],[24.71508,57.96271],[24.6919,57.94653],[24.67335,57.95896],[24.64468,57.95889],[24.64187,57.95423],[24.64577,57.95268],[24.62869,57.94193],[24.61612,57.94368],[24.60892,57.95125],[24.58464,57.96174],[24.57317,57.95436],[24.54792,57.94938],[24.54352,57.94478],[24.5301,57.94705],[24.5207,57.94303],[24.51839,57.93675],[24.5096,57.93442],[24.51326,57.93066],[24.4625,57.92496],[24.44579,57.90798],[24.46018,57.90662],[24.45225,57.89942],[24.46006,57.87977],[24.41138,57.86491],[24.40906,57.87191],[24.33707,57.87393],[24.33829,58.0109],[24.42272,58.01097],[24.42614,58.28002],[24.51155,58.2797],[24.51216,58.32471],[24.42638,58.32503],[24.42712,58.36972],[24.34182,58.37017],[24.34048,58.23547],[24.17014,58.23572],[24.17014,58.1908],[24.08485,58.19092],[24.0851,58.23605],[24.00066,58.23579],[23.99993,58.28092],[23.82971,58.28047],[23.82947,58.32554],[23.65864,58.32496],[23.65791,58.41493],[23.57225,58.41468],[23.57127,58.50436],[23.39935,58.50359],[23.40106,58.41391],[23.14421,58.41238],[23.14567,58.36735],[23.05989,58.36703],[23.06172,58.32221],[22.9757,58.32157],[22.97716,58.27681],[22.89187,58.27598],[22.89358,58.23103],[22.80865,58.2302],[22.81012,58.18539],[22.89529,58.1861],[22.89663,58.1413],[22.72641,58.13982],[22.72495,58.18475],[22.55522,58.18276],[22.55693,58.13744],[22.64173,58.13886],[22.64344,58.094],[22.38903,58.0909],[22.38525,58.18063],[22.29995,58.17967],[22.30679,58.04527],[22.22198,58.0436],[22.22626,57.95404],[22.14206,57.95281],[22.1445,57.90804],[22.06007,57.90681],[22.06263,57.86186],[21.97807,57.86043],[21.96831,58.04004],[22.05274,58.04134],[22.04506,58.17581],[21.96038,58.17471],[21.95781,58.21941],[21.78723,58.21638],[21.78211,58.30631],[21.69681,58.3049],[21.69401,58.34975],[21.77942,58.35122],[21.76795,58.53074],[22.02566,58.53488],[22.02797,58.49001],[22.11375,58.49167],[22.11144,58.53621],[22.19709,58.53742],[22.19453,58.5823],[22.45236,58.58573],[22.44638,58.7203],[22.36023,58.71916],[22.35364,58.85385]],[[23.47415,59.26726],[23.29868,59.26632],[23.29795,59.31138],[23.47293,59.31194],[23.47415,59.26726]],[[24.17014,58.1908],[24.25507,58.19073],[24.25458,58.14581],[24.17002,58.14588],[24.17014,58.1908]],[[24.08485,58.19092],[24.08497,58.10129],[23.99968,58.10116],[23.99993,58.05632],[23.91525,58.05612],[23.915,58.14613],[23.83032,58.146],[23.82971,58.23572],[23.91451,58.23585],[23.91476,58.19099],[24.08485,58.19092]],[[24.61854,59.53612],[24.44183,59.5368],[24.44309,59.62659],[24.62016,59.6258],[24.61854,59.53612]],[[26.40403,59.7852],[26.31501,59.78667],[26.31814,59.83152],[26.40732,59.82994],[26.40403,59.7852]],[[26.48308,59.649],[26.48647,59.69383],[26.57514,59.69202],[26.57166,59.64719],[26.48308,59.649]],[[23.15944,57.78408],[23.24346,57.78461],[23.24445,57.73971],[23.32848,57.74031],[23.32679,57.82998],[23.15845,57.82885],[23.15944,57.78408]]],terms_text:"Maa-Ameti ortofoto"},{id:"estrela_de_alagoas",name:"Estrela de Alagoas",type:"wms",template:"http://geoserver.dados.al.gov.br:8080/geoserver/Alagoas/ows?LAYERS=Estrela%20de%20Alagoas&SERVICE=WMS&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.0&SERVICE=WMS&REQUEST=GetMap&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[-36.71382,-9.43476],[-36.71477,-9.34443],[-36.80586,-9.34498],[-36.80525,-9.43542],[-36.71382,-9.43476]]],terms_url:"http://www.seplag.al.gov.br",terms_text:"Secretaria de Estado do Planejamento, Gestão e Patrimônio"},{id:"eufar-balaton",name:"EUFAR Balaton orthophotos",type:"tms",template:"http://e.tile.openstreetmap.hu/balaton/0/{zoom}/{x}/{y}.jpg",endDate:"2010-08-31T00:00:00.000Z",startDate:"2010-08-01T00:00:00.000Z",zoomExtent:[12,19],polygon:[[[18.17918,46.98502],[18.17773,47.01816],[18.08176,47.05643],[18.10281,47.06311],[18.08152,47.09344],[18.06436,47.09049],[18.03537,47.07983],[18.03344,47.08262],[17.9582,47.05567],[17.99436,47.00449],[17.86441,46.95517],[17.80274,47.0103],[17.67184,46.97207],[17.23875,46.77079],[17.22244,46.6796],[17.47175,46.70306],[18.16735,46.94133],[18.17918,46.98502]]],terms_url:"http://www.bli.okologia.mta.hu/",terms_text:"EUFAR Balaton ortofotó 2010",best:true,description:"1940 geo-tagged photography from Balaton Limnological Institute."},{id:"Fiez-2013",name:"Fiez Orthophoto 2013",type:"tms",template:"http://osmdata.asitvd.ch/tiles/fiez2013/{zoom}/{x}/{y}.png",endDate:"2013-01-01T00:00:00.000Z",startDate:"2013-01-01T00:00:00.000Z",zoomExtent:[14,20],polygon:[[[6.62313,46.82339],[6.62899,46.82484],[6.62882,46.82674],[6.62531,46.83274],[6.62382,46.83317],[6.61839,46.83194],[6.62313,46.82339]]],terms_url:"http://osmdata.asitvd.ch/",terms_text:"Fiez - Orthophoto technique 2013"},{id:"fiskeridir-akvakultur",name:"Fiskeridirektoratet Aquaculture overlay",type:"wms",template:"https://ogc.fiskeridir.no/wms.ashx?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=layer_262&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[3,22],polygon:[[[31.90425,70.43681],[28.47652,71.32896],[23.6865,71.25143],[16.80906,70.07308],[11.16207,67.52539],[9.97554,64.81158],[4.21871,62.145],[4.37254,59.1872],[6.17431,57.8915],[7.93212,57.73936],[10.77758,58.86491],[11.7224,58.76251],[12.72216,60.11415],[13.05175,61.34935],[12.52439,63.61699],[14.23826,63.98561],[15.11717,65.90166],[18.69871,68.37491],[20.06101,68.26126],[21.00584,68.78415],[25.24656,68.3506],[26.93845,69.8472],[28.76219,69.61121],[28.5864,68.8556],[31.06931,69.51915],[31.90425,70.43681]]],terms_url:"https://www.fiskeridir.no/Kart",terms_text:"© Fiskeridirektoratet",description:"Aquaculture/marine farms (licensed sites, may not yet have any installations)",icon:"https://upload.wikimedia.org/wikipedia/commons/thumb/9/9c/Emblem_of_the_Norwegian_Directorate_of_Fisheries.svg/175px-Emblem_of_the_Norwegian_Directorate_of_Fisheries.svg.png",overlay:true},{id:"FOMI_2000",name:"FÖMI orthophoto 2000",type:"tms",template:"http://e.tile.openstreetmap.hu/ortofoto2000/{zoom}/{x}/{y}.jpg",endDate:"2000-01-01T00:00:00.000Z",startDate:"2000-01-01T00:00:00.000Z",zoomExtent:[0,17],polygon:[[[16.11391,46.8691],[16.17897,46.90662],[16.20004,46.94151],[16.22175,46.93554],[16.24628,46.94639],[16.25532,46.96421],[16.27647,46.96261],[16.29058,47.01398],[16.30162,46.99923],[16.34146,46.99652],[16.35052,47.01063],[16.3734,46.99859],[16.41277,47.00475],[16.43327,46.99274],[16.44781,47.00389],[16.48,46.99412],[16.5122,47.00117],[16.46356,47.03227],[16.44786,47.02275],[16.43912,47.02966],[16.44567,47.03887],[16.52032,47.0561],[16.47321,47.07362],[16.46372,47.09392],[16.5008,47.11006],[16.50004,47.12329],[16.52953,47.12874],[16.51716,47.14969],[16.45495,47.14259],[16.46487,47.16833],[16.45556,47.18756],[16.43056,47.1847],[16.4195,47.19491],[16.41892,47.21071],[16.43713,47.2097],[16.44263,47.23371],[16.43131,47.25276],[16.46715,47.25317],[16.48923,47.27989],[16.46463,47.33385],[16.4337,47.35281],[16.45851,47.36705],[16.44546,47.40702],[16.48317,47.40936],[16.49638,47.38927],[16.51709,47.41002],[16.57491,47.40542],[16.58073,47.41917],[16.66185,47.4556],[16.67064,47.47422],[16.65234,47.50034],[16.68956,47.51016],[16.71478,47.5402],[16.66354,47.56773],[16.6732,47.60495],[16.65953,47.6061],[16.65276,47.62285],[16.63142,47.62832],[16.57391,47.61967],[16.51474,47.6462],[16.49675,47.63931],[16.42546,47.66217],[16.44374,47.67421],[16.44805,47.69647],[16.4747,47.68116],[16.48722,47.69798],[16.55217,47.72255],[16.53638,47.73678],[16.54798,47.75154],[16.60952,47.76037],[16.63441,47.75908],[16.65729,47.74149],[16.72094,47.73536],[16.75341,47.68282],[16.83016,47.68106],[16.83943,47.70451],[16.86689,47.72115],[16.87668,47.68765],[17.09374,47.70777],[17.07066,47.72854],[17.0516,47.79385],[17.07495,47.8085],[17.04714,47.82856],[17.05195,47.83777],[17.01055,47.85818],[17.01639,47.86733],[17.08575,47.87462],[17.11317,47.92716],[17.09171,47.93429],[17.11838,47.96011],[17.09466,47.97088],[17.20103,48.01999],[17.24177,48.02247],[17.25795,47.99865],[17.33465,47.99312],[17.40299,47.94785],[17.45392,47.88526],[17.52674,47.86551],[17.56758,47.81513],[17.6084,47.82189],[17.70858,47.75668],[17.77987,47.73949],[17.8661,47.74575],[17.90013,47.73926],[17.94687,47.74467],[17.97087,47.75784],[18.00441,47.74634],[18.03806,47.75768],[18.29588,47.73146],[18.45407,47.76512],[18.49316,47.75276],[18.55908,47.766],[18.64609,47.75909],[18.72607,47.78904],[18.74118,47.81382],[18.792,47.82309],[18.84854,47.81672],[18.85588,47.82608],[18.82801,47.83429],[18.81357,47.85555],[18.76353,47.8716],[18.75686,47.89684],[18.77675,47.95509],[18.75525,47.97635],[18.81574,47.99344],[18.82,48.03968],[18.83327,48.04824],[18.87494,48.04707],[18.88667,48.05868],[18.90898,48.05114],[18.9439,48.05886],[18.98161,48.0536],[19.01486,48.07818],[19.05852,48.05735],[19.08436,48.07278],[19.1074,48.0656],[19.13529,48.07415],[19.24137,48.05365],[19.25578,48.07156],[19.30311,48.08871],[19.3866,48.09191],[19.40002,48.0823],[19.45405,48.10144],[19.46735,48.08393],[19.49442,48.10991],[19.49238,48.13966],[19.51282,48.15466],[19.50452,48.17344],[19.52897,48.19036],[19.52604,48.20313],[19.5775,48.21601],[19.63083,48.25007],[19.64452,48.23917],[19.66986,48.23921],[19.69122,48.20389],[19.72113,48.20147],[19.74618,48.21651],[19.78716,48.19253],[19.79873,48.19482],[19.80528,48.18373],[19.78242,48.16504],[19.79481,48.15353],[19.82133,48.16908],[19.84528,48.16274],[19.85517,48.17843],[19.86013,48.16941],[19.89875,48.16631],[19.91454,48.14686],[19.8983,48.1249],[19.93738,48.13112],[19.97439,48.166],[19.98871,48.16217],[20.02904,48.17768],[20.04945,48.1672],[20.07299,48.17961],[20.07004,48.1917],[20.13409,48.22518],[20.13319,48.25398],[20.20616,48.25098],[20.20383,48.26191],[20.22847,48.26278],[20.23495,48.27993],[20.28686,48.26164],[20.32571,48.27279],[20.33746,48.30167],[20.36566,48.31661],[20.38408,48.35118],[20.40983,48.36586],[20.40253,48.38256],[20.42053,48.40386],[20.41623,48.41854],[20.50793,48.48936],[20.50651,48.53442],[20.53747,48.52788],[20.54649,48.54429],[20.58659,48.53576],[20.65387,48.56141],[20.83636,48.58284],[20.8378,48.57421],[20.85044,48.58163],[20.84533,48.5665],[20.86815,48.55182],[20.92232,48.55945],[20.93463,48.53834],[20.95588,48.53396],[20.9562,48.52167],[20.98158,48.51777],[21.01511,48.53231],[21.06632,48.52589],[21.11745,48.49105],[21.16087,48.5215],[21.17963,48.51823],[21.22106,48.5375],[21.30549,48.52225],[21.31338,48.55084],[21.32688,48.55413],[21.31938,48.5612],[21.41545,48.55895],[21.42266,48.57882],[21.44061,48.5851],[21.51409,48.55107],[21.54202,48.5084],[21.61393,48.50942],[21.62019,48.46983],[21.66355,48.41796],[21.66456,48.39216],[21.70174,48.3807],[21.71187,48.35762],[21.81741,48.33279],[21.8352,48.33464],[21.83721,48.36325],[21.8843,48.35605],[21.88484,48.36754],[21.89788,48.36256],[21.8998,48.37022],[21.92819,48.3616],[21.92681,48.3709],[21.9492,48.37873],[21.99446,48.37732],[22.02133,48.39275],[22.0546,48.37753],[22.07649,48.38724],[22.08674,48.37156],[22.13591,48.38052],[22.13106,48.39123],[22.15277,48.39624],[22.15619,48.40931],[22.21257,48.42565],[22.23714,48.41004],[22.26549,48.40987],[22.23988,48.38701],[22.26757,48.36116],[22.31781,48.35454],[22.31329,48.32507],[22.33729,48.30791],[22.33843,48.27921],[22.38475,48.23396],[22.40064,48.2492],[22.43284,48.25252],[22.45639,48.24231],[22.4899,48.25342],[22.49722,48.23955],[22.51615,48.23797],[22.53111,48.20943],[22.57114,48.19614],[22.56164,48.18161],[22.59824,48.14476],[22.59028,48.10734],[22.67545,48.092],[22.73472,48.11985],[22.75762,48.12006],[22.77039,48.10902],[22.77232,48.12187],[22.80277,48.12211],[22.80253,48.10708],[22.82543,48.11751],[22.83644,48.08025],[22.86113,48.07503],[22.8678,48.05243],[22.88204,48.05481],[22.86597,48.01132],[22.83556,47.9906],[22.84076,47.98136],[22.87257,47.97527],[22.86973,47.96596],[22.89157,47.96724],[22.89744,47.95406],[22.84733,47.90776],[22.79281,47.89086],[22.75869,47.89414],[22.77775,47.84225],[22.71363,47.83609],[22.68019,47.78775],[22.61112,47.77175],[22.549,47.77222],[22.48121,47.81089],[22.45131,47.80339],[22.43133,47.73981],[22.35662,47.74862],[22.31777,47.76609],[22.31762,47.74337],[22.28514,47.72928],[22.26432,47.73107],[22.259,47.69791],[22.23068,47.6932],[22.17965,47.59161],[22.12892,47.5979],[22.09428,47.55836],[22.07826,47.56213],[22.05345,47.54748],[22.07122,47.53807],[22.06179,47.5288],[22.04513,47.53989],[22.03672,47.53267],[22.00719,47.48362],[22.03279,47.45084],[22.02388,47.39086],[22.01198,47.3758],[21.96274,47.38105],[21.93825,47.37253],[21.87779,47.28578],[21.88728,47.27305],[21.85349,47.23976],[21.85807,47.18736],[21.81248,47.16675],[21.79241,47.10598],[21.72683,47.09839],[21.6976,47.05792],[21.65042,47.04083],[21.68887,47.002],[21.66787,46.97123],[21.68149,46.96521],[21.6382,46.93305],[21.59845,46.92747],[21.61429,46.88673],[21.60167,46.86682],[21.52033,46.83737],[21.51861,46.80007],[21.48318,46.76502],[21.52634,46.73932],[21.52937,46.72097],[21.49233,46.68597],[21.47284,46.69591],[21.4299,46.69394],[21.43096,46.67814],[21.45467,46.66086],[21.41624,46.64262],[21.4098,46.62181],[21.3657,46.63795],[21.33005,46.63182],[21.31397,46.61767],[21.30124,46.59087],[21.32079,46.58286],[21.2743,46.54074],[21.26003,46.50216],[21.27442,46.47673],[21.29645,46.4763],[21.31743,46.45073],[21.28952,46.41548],[21.29633,46.40696],[21.22501,46.41369],[21.20642,46.40338],[21.19926,46.3479],[21.17623,46.33577],[21.1805,46.30445],[21.11554,46.30185],[21.10305,46.26246],[21.07088,46.2539],[21.06608,46.24294],[21.03662,46.24804],[21.02467,46.26653],[20.96082,46.2623],[20.94658,46.2793],[20.92507,46.27662],[20.92181,46.26181],[20.87327,46.28776],[20.77565,46.27596],[20.74905,46.25085],[20.76186,46.20456],[20.7274,46.20775],[20.73411,46.19394],[20.71405,46.16605],[20.68436,46.14478],[20.65492,46.14977],[20.63945,46.12676],[20.54505,46.17909],[20.50148,46.19033],[20.49494,46.17099],[20.45923,46.14288],[20.39751,46.15747],[20.36853,46.15286],[20.35571,46.16963],[20.29681,46.15215],[20.2549,46.11585],[20.24848,46.1301],[20.23301,46.12417],[20.18174,46.16011],[20.1365,46.14495],[20.10097,46.17728],[20.06362,46.14373],[20.03461,46.14589],[20.01581,46.17684],[19.93541,46.17642],[19.85335,46.15],[19.81797,46.12817],[19.75854,46.14798],[19.69821,46.18793],[19.68277,46.18004],[19.66151,46.19044],[19.63174,46.1693],[19.56765,46.17911],[19.5604,46.16658],[19.50266,46.14245],[19.52712,46.12103],[19.4645,46.09538],[19.46658,46.08204],[19.416,46.04605],[19.3804,46.03587],[19.36409,46.0523],[19.2819,46.0148],[19.29653,45.98812],[19.28565,45.9969],[19.14799,45.99634],[19.13384,46.0371],[19.10487,46.04017],[19.06604,46.0002],[19.07968,45.96364],[19.00598,45.95907],[19.00927,45.92366],[18.90613,45.93538],[18.87946,45.91668],[18.86471,45.92085],[18.86856,45.91134],[18.82768,45.90517],[18.822,45.91459],[18.80751,45.90361],[18.80925,45.87962],[18.79562,45.87845],[18.70489,45.91819],[18.67002,45.91084],[18.65966,45.91689],[18.66513,45.89928],[18.64128,45.88904],[18.65502,45.87424],[18.62777,45.87338],[18.61484,45.85314],[18.62367,45.83985],[18.57324,45.81376],[18.57498,45.80043],[18.55972,45.8038],[18.52235,45.78269],[18.49067,45.79472],[18.48219,45.7655],[18.45628,45.76952],[18.44508,45.76052],[18.44685,45.73713],[18.40763,45.73971],[18.39189,45.7617],[18.36423,45.77294],[18.33942,45.74716],[18.29682,45.76122],[18.24405,45.76123],[18.23073,45.77903],[18.19087,45.78788],[18.16819,45.77627],[18.12465,45.78963],[18.10681,45.77083],[18.08189,45.76452],[17.99588,45.79573],[17.93021,45.78633],[17.90668,45.79257],[17.86531,45.76701],[17.82627,45.81],[17.80898,45.8041],[17.78091,45.81749],[17.76034,45.81192],[17.74086,45.8296],[17.66329,45.83818],[17.62762,45.89794],[17.57007,45.93582],[17.43783,45.95038],[17.4259,45.92727],[17.41081,45.93997],[17.39215,45.93021],[17.38287,45.94757],[17.34762,45.94234],[17.34388,45.96053],[17.35377,45.9525],[17.39054,45.95819],[17.38742,45.96618],[17.35835,45.96427],[17.37549,45.96869],[17.37519,45.98811],[17.36357,45.99154],[17.35672,45.97358],[17.33396,45.99608],[17.33198,45.97289],[17.313,45.96653],[17.32365,45.98878],[17.29877,45.98387],[17.3042,46.00211],[17.25797,46.01103],[17.29632,46.02852],[17.25415,46.03001],[17.27096,46.05671],[17.23248,46.0592],[17.25251,46.06647],[17.23131,46.07903],[17.20199,46.07655],[17.23313,46.09896],[17.2104,46.10017],[17.21297,46.11386],[17.17593,46.10846],[17.17434,46.12876],[17.18652,46.13323],[17.1811,46.15055],[17.15623,46.15858],[17.15929,46.16968],[17.1261,46.16845],[17.12274,46.17898],[17.07525,46.18895],[17.06616,46.2023],[16.97354,46.2252],[16.97395,46.24311],[16.95041,46.24153],[16.88624,46.28146],[16.87137,46.32528],[16.88021,46.3357],[16.86154,46.34524],[16.86562,46.35565],[16.8522,46.35172],[16.84986,46.36262],[16.83529,46.36382],[16.83765,46.3748],[16.82617,46.3671],[16.79334,46.38739],[16.75921,46.37766],[16.72987,46.40149],[16.71821,46.38987],[16.67729,46.44945],[16.66318,46.4487],[16.66637,46.4583],[16.61879,46.46199],[16.60447,46.47608],[16.5236,46.50538],[16.53258,46.5314],[16.51767,46.53635],[16.50841,46.56527],[16.483,46.56604],[16.4834,46.5786],[16.44557,46.61095],[16.42486,46.61316],[16.38594,46.64425],[16.39154,46.66373],[16.41985,46.65848],[16.42863,46.69397],[16.36892,46.70401],[16.37983,46.71539],[16.37109,46.72229],[16.35706,46.71424],[16.3186,46.75414],[16.33054,46.77521],[16.31216,46.778],[16.31277,46.79731],[16.34064,46.80519],[16.35084,46.83006],[16.34033,46.84688],[16.3015,46.85951],[16.29139,46.87283],[16.23323,46.87667],[16.15609,46.85371],[16.12657,46.85691],[16.11391,46.8691]]],terms_url:"https://www.fomi.hu",terms_text:"Földmérési és Távérzékelési Intézet"},{id:"FOMI_2005",name:"FÖMI orthophoto 2005",type:"tms",template:"http://e.tile.openstreetmap.hu/ortofoto2005/{zoom}/{x}/{y}.jpg",endDate:"2005-01-01T00:00:00.000Z",startDate:"2005-01-01T00:00:00.000Z",zoomExtent:[0,17],polygon:[[[16.11391,46.8691],[16.17897,46.90662],[16.20004,46.94151],[16.22175,46.93554],[16.24628,46.94639],[16.25532,46.96421],[16.27647,46.96261],[16.29058,47.01398],[16.30162,46.99923],[16.34146,46.99652],[16.35052,47.01063],[16.3734,46.99859],[16.41277,47.00475],[16.43327,46.99274],[16.44781,47.00389],[16.48,46.99412],[16.5122,47.00117],[16.46356,47.03227],[16.44786,47.02275],[16.43912,47.02966],[16.44567,47.03887],[16.52032,47.0561],[16.47321,47.07362],[16.46372,47.09392],[16.5008,47.11006],[16.50004,47.12329],[16.52953,47.12874],[16.51716,47.14969],[16.45495,47.14259],[16.46487,47.16833],[16.45556,47.18756],[16.43056,47.1847],[16.4195,47.19491],[16.41892,47.21071],[16.43713,47.2097],[16.44263,47.23371],[16.43131,47.25276],[16.46715,47.25317],[16.48923,47.27989],[16.46463,47.33385],[16.4337,47.35281],[16.45851,47.36705],[16.44546,47.40702],[16.48317,47.40936],[16.49638,47.38927],[16.51709,47.41002],[16.57491,47.40542],[16.58073,47.41917],[16.66185,47.4556],[16.67064,47.47422],[16.65234,47.50034],[16.68956,47.51016],[16.71478,47.5402],[16.66354,47.56773],[16.6732,47.60495],[16.65953,47.6061],[16.65276,47.62285],[16.63142,47.62832],[16.57391,47.61967],[16.51474,47.6462],[16.49675,47.63931],[16.42546,47.66217],[16.44374,47.67421],[16.44805,47.69647],[16.4747,47.68116],[16.48722,47.69798],[16.55217,47.72255],[16.53638,47.73678],[16.54798,47.75154],[16.60952,47.76037],[16.63441,47.75908],[16.65729,47.74149],[16.72094,47.73536],[16.75341,47.68282],[16.83016,47.68106],[16.83943,47.70451],[16.86689,47.72115],[16.87668,47.68765],[17.09374,47.70777],[17.07066,47.72854],[17.0516,47.79385],[17.07495,47.8085],[17.04714,47.82856],[17.05195,47.83777],[17.01055,47.85818],[17.01639,47.86733],[17.08575,47.87462],[17.11317,47.92716],[17.09171,47.93429],[17.11838,47.96011],[17.09466,47.97088],[17.20103,48.01999],[17.24177,48.02247],[17.25795,47.99865],[17.33465,47.99312],[17.40299,47.94785],[17.45392,47.88526],[17.52674,47.86551],[17.56758,47.81513],[17.6084,47.82189],[17.70858,47.75668],[17.77987,47.73949],[17.8661,47.74575],[17.90013,47.73926],[17.94687,47.74467],[17.97087,47.75784],[18.00441,47.74634],[18.03806,47.75768],[18.29588,47.73146],[18.45407,47.76512],[18.49316,47.75276],[18.55908,47.766],[18.64609,47.75909],[18.72607,47.78904],[18.74118,47.81382],[18.792,47.82309],[18.84854,47.81672],[18.85588,47.82608],[18.82801,47.83429],[18.81357,47.85555],[18.76353,47.8716],[18.75686,47.89684],[18.77675,47.95509],[18.75525,47.97635],[18.81574,47.99344],[18.82,48.03968],[18.83327,48.04824],[18.87494,48.04707],[18.88667,48.05868],[18.90898,48.05114],[18.9439,48.05886],[18.98161,48.0536],[19.01486,48.07818],[19.05852,48.05735],[19.08436,48.07278],[19.1074,48.0656],[19.13529,48.07415],[19.24137,48.05365],[19.25578,48.07156],[19.30311,48.08871],[19.3866,48.09191],[19.40002,48.0823],[19.45405,48.10144],[19.46735,48.08393],[19.49442,48.10991],[19.49238,48.13966],[19.51282,48.15466],[19.50452,48.17344],[19.52897,48.19036],[19.52604,48.20313],[19.5775,48.21601],[19.63083,48.25007],[19.64452,48.23917],[19.66986,48.23921],[19.69122,48.20389],[19.72113,48.20147],[19.74618,48.21651],[19.78716,48.19253],[19.79873,48.19482],[19.80528,48.18373],[19.78242,48.16504],[19.79481,48.15353],[19.82133,48.16908],[19.84528,48.16274],[19.85517,48.17843],[19.86013,48.16941],[19.89875,48.16631],[19.91454,48.14686],[19.8983,48.1249],[19.93738,48.13112],[19.97439,48.166],[19.98871,48.16217],[20.02904,48.17768],[20.04945,48.1672],[20.07299,48.17961],[20.07004,48.1917],[20.13409,48.22518],[20.13319,48.25398],[20.20616,48.25098],[20.20383,48.26191],[20.22847,48.26278],[20.23495,48.27993],[20.28686,48.26164],[20.32571,48.27279],[20.33746,48.30167],[20.36566,48.31661],[20.38408,48.35118],[20.40983,48.36586],[20.40253,48.38256],[20.42053,48.40386],[20.41623,48.41854],[20.50793,48.48936],[20.50651,48.53442],[20.53747,48.52788],[20.54649,48.54429],[20.58659,48.53576],[20.65387,48.56141],[20.83636,48.58284],[20.8378,48.57421],[20.85044,48.58163],[20.84533,48.5665],[20.86815,48.55182],[20.92232,48.55945],[20.93463,48.53834],[20.95588,48.53396],[20.9562,48.52167],[20.98158,48.51777],[21.01511,48.53231],[21.06632,48.52589],[21.11745,48.49105],[21.16087,48.5215],[21.17963,48.51823],[21.22106,48.5375],[21.30549,48.52225],[21.31338,48.55084],[21.32688,48.55413],[21.31938,48.5612],[21.41545,48.55895],[21.42266,48.57882],[21.44061,48.5851],[21.51409,48.55107],[21.54202,48.5084],[21.61393,48.50942],[21.62019,48.46983],[21.66355,48.41796],[21.66456,48.39216],[21.70174,48.3807],[21.71187,48.35762],[21.81741,48.33279],[21.8352,48.33464],[21.83721,48.36325],[21.8843,48.35605],[21.88484,48.36754],[21.89788,48.36256],[21.8998,48.37022],[21.92819,48.3616],[21.92681,48.3709],[21.9492,48.37873],[21.99446,48.37732],[22.02133,48.39275],[22.0546,48.37753],[22.07649,48.38724],[22.08674,48.37156],[22.13591,48.38052],[22.13106,48.39123],[22.15277,48.39624],[22.15619,48.40931],[22.21257,48.42565],[22.23714,48.41004],[22.26549,48.40987],[22.23988,48.38701],[22.26757,48.36116],[22.31781,48.35454],[22.31329,48.32507],[22.33729,48.30791],[22.33843,48.27921],[22.38475,48.23396],[22.40064,48.2492],[22.43284,48.25252],[22.45639,48.24231],[22.4899,48.25342],[22.49722,48.23955],[22.51615,48.23797],[22.53111,48.20943],[22.57114,48.19614],[22.56164,48.18161],[22.59824,48.14476],[22.59028,48.10734],[22.67545,48.092],[22.73472,48.11985],[22.75762,48.12006],[22.77039,48.10902],[22.77232,48.12187],[22.80277,48.12211],[22.80253,48.10708],[22.82543,48.11751],[22.83644,48.08025],[22.86113,48.07503],[22.8678,48.05243],[22.88204,48.05481],[22.86597,48.01132],[22.83556,47.9906],[22.84076,47.98136],[22.87257,47.97527],[22.86973,47.96596],[22.89157,47.96724],[22.89744,47.95406],[22.84733,47.90776],[22.79281,47.89086],[22.75869,47.89414],[22.77775,47.84225],[22.71363,47.83609],[22.68019,47.78775],[22.61112,47.77175],[22.549,47.77222],[22.48121,47.81089],[22.45131,47.80339],[22.43133,47.73981],[22.35662,47.74862],[22.31777,47.76609],[22.31762,47.74337],[22.28514,47.72928],[22.26432,47.73107],[22.259,47.69791],[22.23068,47.6932],[22.17965,47.59161],[22.12892,47.5979],[22.09428,47.55836],[22.07826,47.56213],[22.05345,47.54748],[22.07122,47.53807],[22.06179,47.5288],[22.04513,47.53989],[22.03672,47.53267],[22.00719,47.48362],[22.03279,47.45084],[22.02388,47.39086],[22.01198,47.3758],[21.96274,47.38105],[21.93825,47.37253],[21.87779,47.28578],[21.88728,47.27305],[21.85349,47.23976],[21.85807,47.18736],[21.81248,47.16675],[21.79241,47.10598],[21.72683,47.09839],[21.6976,47.05792],[21.65042,47.04083],[21.68887,47.002],[21.66787,46.97123],[21.68149,46.96521],[21.6382,46.93305],[21.59845,46.92747],[21.61429,46.88673],[21.60167,46.86682],[21.52033,46.83737],[21.51861,46.80007],[21.48318,46.76502],[21.52634,46.73932],[21.52937,46.72097],[21.49233,46.68597],[21.47284,46.69591],[21.4299,46.69394],[21.43096,46.67814],[21.45467,46.66086],[21.41624,46.64262],[21.4098,46.62181],[21.3657,46.63795],[21.33005,46.63182],[21.31397,46.61767],[21.30124,46.59087],[21.32079,46.58286],[21.2743,46.54074],[21.26003,46.50216],[21.27442,46.47673],[21.29645,46.4763],[21.31743,46.45073],[21.28952,46.41548],[21.29633,46.40696],[21.22501,46.41369],[21.20642,46.40338],[21.19926,46.3479],[21.17623,46.33577],[21.1805,46.30445],[21.11554,46.30185],[21.10305,46.26246],[21.07088,46.2539],[21.06608,46.24294],[21.03662,46.24804],[21.02467,46.26653],[20.96082,46.2623],[20.94658,46.2793],[20.92507,46.27662],[20.92181,46.26181],[20.87327,46.28776],[20.77565,46.27596],[20.74905,46.25085],[20.76186,46.20456],[20.7274,46.20775],[20.73411,46.19394],[20.71405,46.16605],[20.68436,46.14478],[20.65492,46.14977],[20.63945,46.12676],[20.54505,46.17909],[20.50148,46.19033],[20.49494,46.17099],[20.45923,46.14288],[20.39751,46.15747],[20.36853,46.15286],[20.35571,46.16963],[20.29681,46.15215],[20.2549,46.11585],[20.24848,46.1301],[20.23301,46.12417],[20.18174,46.16011],[20.1365,46.14495],[20.10097,46.17728],[20.06362,46.14373],[20.03461,46.14589],[20.01581,46.17684],[19.93541,46.17642],[19.85335,46.15],[19.81797,46.12817],[19.75854,46.14798],[19.69821,46.18793],[19.68277,46.18004],[19.66151,46.19044],[19.63174,46.1693],[19.56765,46.17911],[19.5604,46.16658],[19.50266,46.14245],[19.52712,46.12103],[19.4645,46.09538],[19.46658,46.08204],[19.416,46.04605],[19.3804,46.03587],[19.36409,46.0523],[19.2819,46.0148],[19.29653,45.98812],[19.28565,45.9969],[19.14799,45.99634],[19.13384,46.0371],[19.10487,46.04017],[19.06604,46.0002],[19.07968,45.96364],[19.00598,45.95907],[19.00927,45.92366],[18.90613,45.93538],[18.87946,45.91668],[18.86471,45.92085],[18.86856,45.91134],[18.82768,45.90517],[18.822,45.91459],[18.80751,45.90361],[18.80925,45.87962],[18.79562,45.87845],[18.70489,45.91819],[18.67002,45.91084],[18.65966,45.91689],[18.66513,45.89928],[18.64128,45.88904],[18.65502,45.87424],[18.62777,45.87338],[18.61484,45.85314],[18.62367,45.83985],[18.57324,45.81376],[18.57498,45.80043],[18.55972,45.8038],[18.52235,45.78269],[18.49067,45.79472],[18.48219,45.7655],[18.45628,45.76952],[18.44508,45.76052],[18.44685,45.73713],[18.40763,45.73971],[18.39189,45.7617],[18.36423,45.77294],[18.33942,45.74716],[18.29682,45.76122],[18.24405,45.76123],[18.23073,45.77903],[18.19087,45.78788],[18.16819,45.77627],[18.12465,45.78963],[18.10681,45.77083],[18.08189,45.76452],[17.99588,45.79573],[17.93021,45.78633],[17.90668,45.79257],[17.86531,45.76701],[17.82627,45.81],[17.80898,45.8041],[17.78091,45.81749],[17.76034,45.81192],[17.74086,45.8296],[17.66329,45.83818],[17.62762,45.89794],[17.57007,45.93582],[17.43783,45.95038],[17.4259,45.92727],[17.41081,45.93997],[17.39215,45.93021],[17.38287,45.94757],[17.34762,45.94234],[17.34388,45.96053],[17.35377,45.9525],[17.39054,45.95819],[17.38742,45.96618],[17.35835,45.96427],[17.37549,45.96869],[17.37519,45.98811],[17.36357,45.99154],[17.35672,45.97358],[17.33396,45.99608],[17.33198,45.97289],[17.313,45.96653],[17.32365,45.98878],[17.29877,45.98387],[17.3042,46.00211],[17.25797,46.01103],[17.29632,46.02852],[17.25415,46.03001],[17.27096,46.05671],[17.23248,46.0592],[17.25251,46.06647],[17.23131,46.07903],[17.20199,46.07655],[17.23313,46.09896],[17.2104,46.10017],[17.21297,46.11386],[17.17593,46.10846],[17.17434,46.12876],[17.18652,46.13323],[17.1811,46.15055],[17.15623,46.15858],[17.15929,46.16968],[17.1261,46.16845],[17.12274,46.17898],[17.07525,46.18895],[17.06616,46.2023],[16.97354,46.2252],[16.97395,46.24311],[16.95041,46.24153],[16.88624,46.28146],[16.87137,46.32528],[16.88021,46.3357],[16.86154,46.34524],[16.86562,46.35565],[16.8522,46.35172],[16.84986,46.36262],[16.83529,46.36382],[16.83765,46.3748],[16.82617,46.3671],[16.79334,46.38739],[16.75921,46.37766],[16.72987,46.40149],[16.71821,46.38987],[16.67729,46.44945],[16.66318,46.4487],[16.66637,46.4583],[16.61879,46.46199],[16.60447,46.47608],[16.5236,46.50538],[16.53258,46.5314],[16.51767,46.53635],[16.50841,46.56527],[16.483,46.56604],[16.4834,46.5786],[16.44557,46.61095],[16.42486,46.61316],[16.38594,46.64425],[16.39154,46.66373],[16.41985,46.65848],[16.42863,46.69397],[16.36892,46.70401],[16.37983,46.71539],[16.37109,46.72229],[16.35706,46.71424],[16.3186,46.75414],[16.33054,46.77521],[16.31216,46.778],[16.31277,46.79731],[16.34064,46.80519],[16.35084,46.83006],[16.34033,46.84688],[16.3015,46.85951],[16.29139,46.87283],[16.23323,46.87667],[16.15609,46.85371],[16.12657,46.85691],[16.11391,46.8691]]],terms_url:"https://www.fomi.hu",terms_text:"Földmérési és Távérzékelési Intézet"},{id:"Freemap.sk-Car",name:"Freemap.sk Car",type:"tms",template:"https://{switch:a,b,c,d}.freemap.sk/A/{zoom}/{x}/{y}.jpeg",zoomExtent:[8,16],polygon:[[[19.83682,49.25529],[19.80075,49.42385],[19.60437,49.48058],[19.49179,49.63961],[19.21831,49.52604],[19.16778,49.42521],[19.00308,49.42236],[18.97611,49.5308],[18.54685,49.51425],[18.31432,49.33818],[18.15913,49.2961],[18.05564,49.11134],[17.56396,48.84938],[17.17929,48.88816],[17.058,48.81105],[16.90426,48.61947],[16.79685,48.38561],[17.06762,48.01116],[17.32787,47.97749],[17.51699,47.82535],[17.74776,47.73093],[18.29515,47.72075],[18.67959,47.75541],[18.89755,47.81203],[18.79463,47.88245],[18.84318,48.04046],[19.46212,48.05333],[19.62064,48.22938],[19.89585,48.09387],[20.33766,48.2643],[20.55395,48.52358],[20.82335,48.55714],[21.10271,48.47096],[21.45863,48.55513],[21.74536,48.31435],[22.15293,48.37179],[22.61255,49.08914],[22.09997,49.23814],[21.9686,49.36363],[21.6244,49.46989],[21.06873,49.46402],[20.94336,49.31088],[20.73052,49.44006],[20.22804,49.41714],[20.05234,49.23052],[19.83682,49.25529]]],terms_text:"Copyright ©2007-2012 Freemap Slovakia (www.freemap.sk). Some rights reserved.",icon:"https://raw.githubusercontent.com/FreemapSlovakia/freemap-v3-react/master/src/images/freemap-logo-small.png"},{id:"Freemap.sk-Cyclo",name:"Freemap.sk Cyclo",type:"tms",template:"https://{switch:a,b,c,d}.freemap.sk/C/{zoom}/{x}/{y}.jpeg",zoomExtent:[8,16],polygon:[[[19.83682,49.25529],[19.80075,49.42385],[19.60437,49.48058],[19.49179,49.63961],[19.21831,49.52604],[19.16778,49.42521],[19.00308,49.42236],[18.97611,49.5308],[18.54685,49.51425],[18.31432,49.33818],[18.15913,49.2961],[18.05564,49.11134],[17.56396,48.84938],[17.17929,48.88816],[17.058,48.81105],[16.90426,48.61947],[16.79685,48.38561],[17.06762,48.01116],[17.32787,47.97749],[17.51699,47.82535],[17.74776,47.73093],[18.29515,47.72075],[18.67959,47.75541],[18.89755,47.81203],[18.79463,47.88245],[18.84318,48.04046],[19.46212,48.05333],[19.62064,48.22938],[19.89585,48.09387],[20.33766,48.2643],[20.55395,48.52358],[20.82335,48.55714],[21.10271,48.47096],[21.45863,48.55513],[21.74536,48.31435],[22.15293,48.37179],[22.61255,49.08914],[22.09997,49.23814],[21.9686,49.36363],[21.6244,49.46989],[21.06873,49.46402],[20.94336,49.31088],[20.73052,49.44006],[20.22804,49.41714],[20.05234,49.23052],[19.83682,49.25529]]],terms_text:"Copyright ©2007-2012 Freemap Slovakia (www.freemap.sk). Some rights reserved.",icon:"https://raw.githubusercontent.com/FreemapSlovakia/freemap-v3-react/master/src/images/freemap-logo-small.png"},{id:"Freemap.sk-Hiking",name:"Freemap.sk Hiking",type:"tms",template:"https://{switch:a,b,c,d}.freemap.sk/T/{zoom}/{x}/{y}.jpeg",zoomExtent:[8,16],polygon:[[[19.83682,49.25529],[19.80075,49.42385],[19.60437,49.48058],[19.49179,49.63961],[19.21831,49.52604],[19.16778,49.42521],[19.00308,49.42236],[18.97611,49.5308],[18.54685,49.51425],[18.31432,49.33818],[18.15913,49.2961],[18.05564,49.11134],[17.56396,48.84938],[17.17929,48.88816],[17.058,48.81105],[16.90426,48.61947],[16.79685,48.38561],[17.06762,48.01116],[17.32787,47.97749],[17.51699,47.82535],[17.74776,47.73093],[18.29515,47.72075],[18.67959,47.75541],[18.89755,47.81203],[18.79463,47.88245],[18.84318,48.04046],[19.46212,48.05333],[19.62064,48.22938],[19.89585,48.09387],[20.33766,48.2643],[20.55395,48.52358],[20.82335,48.55714],[21.10271,48.47096],[21.45863,48.55513],[21.74536,48.31435],[22.15293,48.37179],[22.61255,49.08914],[22.09997,49.23814],[21.9686,49.36363],[21.6244,49.46989],[21.06873,49.46402],[20.94336,49.31088],[20.73052,49.44006],[20.22804,49.41714],[20.05234,49.23052],[19.83682,49.25529]]],terms_text:"Copyright ©2007-2012 Freemap Slovakia (www.freemap.sk). Some rights reserved.",icon:"https://raw.githubusercontent.com/FreemapSlovakia/freemap-v3-react/master/src/images/freemap-logo-small.png"},{id:"Freemap.sk-Ski",name:"Freemap.sk Ski",type:"tms",template:"https://{switch:a,b,c,d}.freemap.sk/K/{zoom}/{x}/{y}.jpeg",zoomExtent:[8,16],polygon:[[[19.83682,49.25529],[19.80075,49.42385],[19.60437,49.48058],[19.49179,49.63961],[19.21831,49.52604],[19.16778,49.42521],[19.00308,49.42236],[18.97611,49.5308],[18.54685,49.51425],[18.31432,49.33818],[18.15913,49.2961],[18.05564,49.11134],[17.56396,48.84938],[17.17929,48.88816],[17.058,48.81105],[16.90426,48.61947],[16.79685,48.38561],[17.06762,48.01116],[17.32787,47.97749],[17.51699,47.82535],[17.74776,47.73093],[18.29515,47.72075],[18.67959,47.75541],[18.89755,47.81203],[18.79463,47.88245],[18.84318,48.04046],[19.46212,48.05333],[19.62064,48.22938],[19.89585,48.09387],[20.33766,48.2643],[20.55395,48.52358],[20.82335,48.55714],[21.10271,48.47096],[21.45863,48.55513],[21.74536,48.31435],[22.15293,48.37179],[22.61255,49.08914],[22.09997,49.23814],[21.9686,49.36363],[21.6244,49.46989],[21.06873,49.46402],[20.94336,49.31088],[20.73052,49.44006],[20.22804,49.41714],[20.05234,49.23052],[19.83682,49.25529]]],terms_text:"Copyright ©2007-2012 Freemap Slovakia (www.freemap.sk). Some rights reserved.",icon:"https://raw.githubusercontent.com/FreemapSlovakia/freemap-v3-react/master/src/images/freemap-logo-small.png"},{id:"fta-digiroad-functional",name:"FTA Road Network",type:"wms",template:"https://extranet.liikennevirasto.fi/inspirepalvelu/beta/wms?SERVICE=WMS&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=dr_tielinkki_toim_lk&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[3,20],polygon:[[[27.96569,70.0988],[27.57431,70.07728],[27.10876,69.93548],[26.70913,69.97549],[26.45507,69.94207],[25.87142,69.6671],[25.94833,69.61024],[25.83023,69.55323],[25.66955,69.20794],[25.73822,69.01797],[25.60089,68.90309],[25.45806,68.91199],[25.11749,68.80699],[25.07354,68.64355],[24.88128,68.62003],[23.97491,68.84568],[23.74969,68.8308],[23.63433,68.71645],[23.18939,68.68053],[22.52197,68.7553],[21.63894,69.28191],[21.26953,69.31783],[20.94131,69.21622],[21.08963,69.09307],[21.05941,69.04352],[20.72296,69.12491],[20.54443,69.0558],[20.84655,68.97416],[20.81634,68.91742],[21.38754,68.68461],[22.04734,68.47066],[22.80212,68.35464],[23.12072,68.13169],[23.5437,67.9633],[23.44757,67.8393],[23.48602,67.59352],[23.36517,67.46545],[23.71124,67.41592],[23.72772,67.32186],[23.54644,67.26885],[23.53128,67.16724],[23.89251,66.86863],[23.84582,66.57775],[23.61843,66.44562],[23.67171,66.20303],[23.87191,66.14551],[24.09988,65.87247],[24.1658,65.66959],[24.11636,65.39143],[21.37939,63.68037],[20.17639,63.29787],[19.08325,60.16064],[20.22033,59.44786],[22.29125,59.44507],[25.82336,59.933],[27.52075,60.23435],[27.83386,60.53229],[29.29641,61.26165],[31.20803,62.44759],[31.62826,62.90585],[31.2635,63.22106],[29.99605,63.75387],[30.28656,63.81704],[30.58319,64.0782],[30.5104,64.26428],[30.09979,64.39218],[30.02563,64.58736],[30.16845,64.63329],[30.09429,64.79518],[29.78393,64.79811],[29.65347,64.89733],[29.65759,65.05939],[29.91027,65.09527],[29.93225,65.20895],[29.72076,65.27853],[29.91577,65.63788],[30.1863,65.66223],[29.9913,66.09771],[29.07119,66.91983],[30.11077,67.63431],[29.3486,68.08099],[28.67568,68.20166],[28.46547,68.54039],[28.72375,68.72642],[28.82675,68.87341],[28.44985,68.90792],[28.95996,69.05089],[28.83324,69.10563],[28.87207,69.22132],[29.36096,69.46526],[29.15634,69.69667],[28.38455,69.83488],[28.35845,69.88312],[28.17169,69.92511],[28.00415,70.01495],[27.96569,70.0988]]],terms_url:"https://www.liikennevirasto.fi/web/en/open-data/digiroad/",terms_text:"© Liikennevirasto",description:"Digiroad national road network from the Finnish Transport Agency, functional road classes.",icon:"https://www.liikennevirasto.fi/livi-theme/images/general/liikennevirasto_logo_2x.png",overlay:true},{id:"gaza_pleiades_20140706",name:"Gaza Strip - Pléiades - 2014/07/06",type:"tms",template:"https://imagery.openstreetmap.fr/tms/1.0.0/gaza_pleiades_20140706/{zoom}/{x}/{y}",endDate:"2014-07-06T00:00:00.000Z",startDate:"2014-07-06T00:00:00.000Z",zoomExtent:[0,22],polygon:[[[34.49022,31.59487],[34.49339,31.59263],[34.5678,31.5401],[34.5653,31.53226],[34.55613,31.52552],[34.54729,31.5121],[34.53011,31.5066],[34.5255,31.50251],[34.51369,31.50067],[34.505,31.49543],[34.4887,31.48263],[34.48532,31.48028],[34.47962,31.47778],[34.47471,31.47207],[34.4674,31.46448],[34.46576,31.46275],[34.45308,31.45139],[34.44585,31.4441],[34.44216,31.44327],[34.43798,31.44112],[34.43226,31.43458],[34.43164,31.43265],[34.4268,31.42804],[34.42211,31.42437],[34.41326,31.41862],[34.41329,31.41758],[34.41174,31.41604],[34.40918,31.41542],[34.4067,31.41295],[34.40506,31.41295],[34.40197,31.4112],[34.40134,31.40986],[34.39492,31.40391],[34.39351,31.40113],[34.38824,31.39599],[34.38037,31.38951],[34.38074,31.38791],[34.37407,31.37915],[34.37338,31.37422],[34.37159,31.37209],[34.37214,31.37093],[34.37158,31.36972],[34.3704,31.36909],[34.36827,31.36992],[34.36685,31.36914],[34.36497,31.36137],[34.37438,31.30609],[34.36708,31.29074],[34.34339,31.27846],[34.33119,31.26149],[34.31931,31.25317],[34.29093,31.24009],[34.26762,31.21894],[34.25915,31.22131],[34.231,31.26295],[34.21113,31.32157],[34.2434,31.34554],[34.29954,31.39629],[34.34172,31.43251],[34.36439,31.45715],[34.41099,31.50162],[34.42619,31.52686],[34.44463,31.54193],[34.49022,31.59487]]],terms_url:"https://wiki.openstreetmap.org/wiki/2014_Gaza_Strip",terms_text:"Copyright CNES 2014, Distribution Airbus Defence and Space"},{id:"gaza_pleiades_20140706_nir",name:"Gaza Strip - Pléiades - 2014/07/06 (NIR)",type:"tms",template:"https://imagery.openstreetmap.fr/tms/1.0.0/gaza_pleiades_20140706_nir/{zoom}/{x}/{y}",endDate:"2014-07-06T00:00:00.000Z",startDate:"2014-07-06T00:00:00.000Z",zoomExtent:[0,22],polygon:[[[34.49022,31.59487],[34.49339,31.59263],[34.5678,31.5401],[34.5653,31.53226],[34.55613,31.52552],[34.54729,31.5121],[34.53011,31.5066],[34.5255,31.50251],[34.51369,31.50067],[34.505,31.49543],[34.4887,31.48263],[34.48532,31.48028],[34.47962,31.47778],[34.47471,31.47207],[34.4674,31.46448],[34.46576,31.46275],[34.45308,31.45139],[34.44585,31.4441],[34.44216,31.44327],[34.43798,31.44112],[34.43226,31.43458],[34.43164,31.43265],[34.4268,31.42804],[34.42211,31.42437],[34.41326,31.41862],[34.41329,31.41758],[34.41174,31.41604],[34.40918,31.41542],[34.4067,31.41295],[34.40506,31.41295],[34.40197,31.4112],[34.40134,31.40986],[34.39492,31.40391],[34.39351,31.40113],[34.38824,31.39599],[34.38037,31.38951],[34.38074,31.38791],[34.37407,31.37915],[34.37338,31.37422],[34.37159,31.37209],[34.37214,31.37093],[34.37158,31.36972],[34.3704,31.36909],[34.36827,31.36992],[34.36685,31.36914],[34.36497,31.36137],[34.37438,31.30609],[34.36708,31.29074],[34.34339,31.27846],[34.33119,31.26149],[34.31931,31.25317],[34.29093,31.24009],[34.26762,31.21894],[34.25915,31.22131],[34.231,31.26295],[34.21113,31.32157],[34.2434,31.34554],[34.29954,31.39629],[34.34172,31.43251],[34.36439,31.45715],[34.41099,31.50162],[34.42619,31.52686],[34.44463,31.54193],[34.49022,31.59487]]],terms_url:"https://wiki.openstreetmap.org/wiki/2014_Gaza_Strip",terms_text:"Copyright CNES 2014, Distribution Airbus Defence and Space"},{id:"Geobase_Hydrography",name:"Geobase Hydrography - English",type:"wms",template:"https://maps.geogratis.gc.ca/wms/hydro_network_en?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=nhn:nhn&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[-141.0678,60.2442],[-139.3842,60.10331],[-137.4746,58.82791],[-135.4766,59.65971],[-134.399,58.86279],[-132.5239,57.08342],[-130.1435,55.27452],[-130.7734,54.75597],[-132.4355,54.71514],[-134.5711,54.38827],[-141.7761,53.58405],[-128.9768,46.41459],[-124.8087,48.42976],[-123.4286,48.17889],[-123.0256,48.40444],[-123.19237,48.65504],[-122.99582,48.51065],[-122.4869,48.4098],[-122.32915,48.4528],[-122.22939,48.50649],[-122.17908,48.52965],[-122.1842,48.5669],[-121.77833,48.57593],[-121.66578,48.42791],[-121.33068,48.35714],[-121.02713,48.34977],[-121.03054,48.49406],[-120.698,48.51497],[-120.51041,48.8718],[-119.97579,48.88134],[-119.95447,48.51497],[-119.90758,48.29421],[-119.73193,48.15503],[-119.74386,48.07419],[-119.62279,48.10951],[-119.60232,48.14707],[-119.25273,48.16243],[-114.1499,48.99487],[-95.12094,48.98405],[-95.13419,49.35564],[-94.94415,49.34356],[-94.8839,49.29522],[-94.71704,48.87631],[-94.71791,48.7485],[-93.83204,48.49765],[-93.43778,48.53066],[-93.38216,48.59507],[-92.98471,48.60312],[-92.73847,48.50725],[-92.7095,48.42081],[-92.54293,48.40158],[-92.38361,48.20406],[-92.11564,48.27641],[-91.58697,48.02516],[-91.24658,48.05422],[-90.86275,48.20889],[-90.78308,48.0639],[-90.0774,48.07435],[-89.93835,47.96584],[-89.75469,47.99609],[-89.32745,47.93943],[-88.41489,48.26677],[-84.9566,46.86086],[-84.84795,46.6762],[-84.55904,46.45441],[-84.47642,46.44972],[-84.43758,46.48872],[-84.3669,46.5055],[-84.34899,46.5055],[-84.29026,46.49077],[-84.25742,46.49386],[-84.22507,46.53187],[-84.1962,46.53804],[-84.18027,46.52468],[-84.15987,46.52468],[-84.13449,46.52879],[-84.11558,46.50653],[-84.15944,46.42769],[-84.10024,46.20338],[-83.95558,46.05132],[-83.8864,46.06125],[-83.8203,46.11181],[-83.76975,46.09563],[-83.67498,46.11391],[-83.58084,46.09921],[-83.44747,45.99521],[-83.60888,45.81772],[-82.14271,43.57905],[-82.39133,43.06666],[-82.41252,43.01127],[-82.42522,42.99864],[-82.42618,42.99374],[-82.42363,42.98536],[-82.41503,42.97697],[-82.41853,42.96578],[-82.43064,42.95203],[-82.44911,42.93711],[-82.45739,42.92568],[-82.46472,42.90562],[-82.47228,42.8877],[-82.47228,42.84743],[-82.48536,42.80967],[-82.46844,42.76365],[-82.48586,42.73697],[-82.49155,42.71168],[-82.51488,42.66652],[-82.51224,42.63893],[-82.52421,42.61103],[-82.56854,42.58184],[-82.59498,42.55148],[-82.61286,42.56409],[-82.65158,42.55707],[-82.83439,42.3763],[-83.01489,42.33457],[-83.07244,42.31502],[-83.09647,42.29542],[-83.12823,42.24126],[-83.14167,42.18582],[-83.12799,42.12172],[-83.16266,42.04963],[-83.05136,41.70911],[-82.41932,41.6377],[-81.22563,42.19633],[-80.06688,42.37121],[-78.86642,42.825],[-78.90301,42.92307],[-78.92063,42.95234],[-78.93331,42.95708],[-78.96058,42.9595],[-78.98479,42.9761],[-79.01825,42.9964],[-79.01969,43.01561],[-79.00695,43.0333],[-78.99599,43.06448],[-79.07335,43.07876],[-79.07286,43.083],[-79.0652,43.0917],[-79.05623,43.10825],[-79.05982,43.11563],[-79.06764,43.11992],[-79.05411,43.12801],[-79.04112,43.13986],[-79.04465,43.16192],[-79.05101,43.17037],[-79.04758,43.19974],[-79.05511,43.25682],[-79.18688,43.44858],[-78.68836,43.62502],[-76.77647,43.61369],[-76.41665,44.08498],[-75.49023,44.70772],[-75.29544,44.82587],[-75.16845,44.88548],[-75.1275,44.8975],[-75.00499,44.95265],[-74.98159,44.97728],[-74.90496,44.98222],[-74.8313,45.01108],[-74.77954,45.00158],[-74.74562,44.98526],[-74.70475,44.99877],[-74.49079,44.99343],[-74.23203,44.98552],[-73.93713,44.99512],[-73.01809,45.0121],[-72.63177,45.0121],[-72.54779,45.00506],[-72.32259,45.00286],[-71.49404,45.01093],[-71.48648,45.06221],[-71.42303,45.12765],[-71.43112,45.14037],[-71.37175,45.22117],[-71.28959,45.28578],[-71.23613,45.24302],[-71.11683,45.22933],[-71.0531,45.29866],[-70.98936,45.31088],[-70.90246,45.22525],[-70.82473,45.22714],[-70.77626,45.40013],[-70.7119,45.3754],[-70.63387,45.37346],[-70.60302,45.41179],[-70.67659,45.56319],[-70.3752,45.73075],[-70.36334,45.82013],[-70.25417,45.87468],[-70.22569,45.94403],[-70.27316,45.99022],[-70.17586,46.33538],[-70.06195,46.4107],[-69.98891,46.69363],[-69.22424,47.44463],[-69.06999,47.41092],[-69.07473,47.24202],[-68.89684,47.17469],[-68.78685,47.21493],[-68.72415,47.23217],[-68.68583,47.24028],[-68.66044,47.23183],[-68.62162,47.24028],[-68.59425,47.24974],[-68.59226,47.27001],[-68.57385,47.28486],[-68.55941,47.2798],[-68.542,47.2798],[-68.51214,47.29195],[-68.47381,47.29229],[-68.46038,47.28149],[-68.43898,47.27777],[-68.37229,47.2825],[-68.3703,47.34796],[-68.33173,47.35822],[-68.29664,47.352],[-68.2399,47.34897],[-68.0906,47.26798],[-68.00002,47.21223],[-67.96344,47.19753],[-67.93582,47.15947],[-67.88619,47.10424],[-67.80218,47.06386],[-67.79415,45.93923],[-67.82753,45.8489],[-67.82753,45.6704],[-67.54943,45.57445],[-67.45302,45.58742],[-67.44189,45.52251],[-67.54201,45.49393],[-67.4456,45.38726],[-67.51605,45.29343],[-67.38257,45.11839],[-67.3047,45.11316],[-67.26762,45.18116],[-67.12671,45.09484],[-66.94835,44.78406],[-66.52283,43.61294],[-65.02339,42.10691],[-42.53366,47.50263],[-75.90901,77.3176],[-71.86482,78.7359],[-67.20011,80.66812],[-66.20727,80.78637],[-54.82473,83.07464],[-57.62518,85.04043],[-106.7949,85.04625],[-141.3957,79.2514],[-141.0678,60.2442]]],overlay:true},{id:"Geobase_Hydrography_French",name:"Geobase Hydrography - French",type:"wms",template:"https://maps.geogratis.gc.ca/wms/hydro_network_fr?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=nhn:nhn&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[-141.0678,60.2442],[-139.3842,60.10331],[-137.4746,58.82791],[-135.4766,59.65971],[-134.399,58.86279],[-132.5239,57.08342],[-130.1435,55.27452],[-130.7734,54.75597],[-132.4355,54.71514],[-134.5711,54.38827],[-141.7761,53.58405],[-128.9768,46.41459],[-124.8087,48.42976],[-123.4286,48.17889],[-123.0256,48.40444],[-123.19237,48.65504],[-122.99582,48.51065],[-122.4869,48.4098],[-122.32915,48.4528],[-122.22939,48.50649],[-122.17908,48.52965],[-122.1842,48.5669],[-121.77833,48.57593],[-121.66578,48.42791],[-121.33068,48.35714],[-121.02713,48.34977],[-121.03054,48.49406],[-120.698,48.51497],[-120.51041,48.8718],[-119.97579,48.88134],[-119.95447,48.51497],[-119.90758,48.29421],[-119.73193,48.15503],[-119.74386,48.07419],[-119.62279,48.10951],[-119.60232,48.14707],[-119.25273,48.16243],[-114.1499,48.99487],[-95.12094,48.98405],[-95.13419,49.35564],[-94.94415,49.34356],[-94.8839,49.29522],[-94.71704,48.87631],[-94.71791,48.7485],[-93.83204,48.49765],[-93.43778,48.53066],[-93.38216,48.59507],[-92.98471,48.60312],[-92.73847,48.50725],[-92.7095,48.42081],[-92.54293,48.40158],[-92.38361,48.20406],[-92.11564,48.27641],[-91.58697,48.02516],[-91.24658,48.05422],[-90.86275,48.20889],[-90.78308,48.0639],[-90.0774,48.07435],[-89.93835,47.96584],[-89.75469,47.99609],[-89.32745,47.93943],[-88.41489,48.26677],[-84.9566,46.86086],[-84.84795,46.6762],[-84.55904,46.45441],[-84.47642,46.44972],[-84.43758,46.48872],[-84.3669,46.5055],[-84.34899,46.5055],[-84.29026,46.49077],[-84.25742,46.49386],[-84.22507,46.53187],[-84.1962,46.53804],[-84.18027,46.52468],[-84.15987,46.52468],[-84.13449,46.52879],[-84.11558,46.50653],[-84.15944,46.42769],[-84.10024,46.20338],[-83.95558,46.05132],[-83.8864,46.06125],[-83.8203,46.11181],[-83.76975,46.09563],[-83.67498,46.11391],[-83.58084,46.09921],[-83.44747,45.99521],[-83.60888,45.81772],[-82.14271,43.57905],[-82.39133,43.06666],[-82.41252,43.01127],[-82.42522,42.99864],[-82.42618,42.99374],[-82.42363,42.98536],[-82.41503,42.97697],[-82.41853,42.96578],[-82.43064,42.95203],[-82.44911,42.93711],[-82.45739,42.92568],[-82.46472,42.90562],[-82.47228,42.8877],[-82.47228,42.84743],[-82.48536,42.80967],[-82.46844,42.76365],[-82.48586,42.73697],[-82.49155,42.71168],[-82.51488,42.66652],[-82.51224,42.63893],[-82.52421,42.61103],[-82.56854,42.58184],[-82.59498,42.55148],[-82.61286,42.56409],[-82.65158,42.55707],[-82.83439,42.3763],[-83.01489,42.33457],[-83.07244,42.31502],[-83.09647,42.29542],[-83.12823,42.24126],[-83.14167,42.18582],[-83.12799,42.12172],[-83.16266,42.04963],[-83.05136,41.70911],[-82.41932,41.6377],[-81.22563,42.19633],[-80.06688,42.37121],[-78.86642,42.825],[-78.90301,42.92307],[-78.92063,42.95234],[-78.93331,42.95708],[-78.96058,42.9595],[-78.98479,42.9761],[-79.01825,42.9964],[-79.01969,43.01561],[-79.00695,43.0333],[-78.99599,43.06448],[-79.07335,43.07876],[-79.07286,43.083],[-79.0652,43.0917],[-79.05623,43.10825],[-79.05982,43.11563],[-79.06764,43.11992],[-79.05411,43.12801],[-79.04112,43.13986],[-79.04465,43.16192],[-79.05101,43.17037],[-79.04758,43.19974],[-79.05511,43.25682],[-79.18688,43.44858],[-78.68836,43.62502],[-76.77647,43.61369],[-76.41665,44.08498],[-75.49023,44.70772],[-75.29544,44.82587],[-75.16845,44.88548],[-75.1275,44.8975],[-75.00499,44.95265],[-74.98159,44.97728],[-74.90496,44.98222],[-74.8313,45.01108],[-74.77954,45.00158],[-74.74562,44.98526],[-74.70475,44.99877],[-74.49079,44.99343],[-74.23203,44.98552],[-73.93713,44.99512],[-73.01809,45.0121],[-72.63177,45.0121],[-72.54779,45.00506],[-72.32259,45.00286],[-71.49404,45.01093],[-71.48648,45.06221],[-71.42303,45.12765],[-71.43112,45.14037],[-71.37175,45.22117],[-71.28959,45.28578],[-71.23613,45.24302],[-71.11683,45.22933],[-71.0531,45.29866],[-70.98936,45.31088],[-70.90246,45.22525],[-70.82473,45.22714],[-70.77626,45.40013],[-70.7119,45.3754],[-70.63387,45.37346],[-70.60302,45.41179],[-70.67659,45.56319],[-70.3752,45.73075],[-70.36334,45.82013],[-70.25417,45.87468],[-70.22569,45.94403],[-70.27316,45.99022],[-70.17586,46.33538],[-70.06195,46.4107],[-69.98891,46.69363],[-69.22424,47.44463],[-69.06999,47.41092],[-69.07473,47.24202],[-68.89684,47.17469],[-68.78685,47.21493],[-68.72415,47.23217],[-68.68583,47.24028],[-68.66044,47.23183],[-68.62162,47.24028],[-68.59425,47.24974],[-68.59226,47.27001],[-68.57385,47.28486],[-68.55941,47.2798],[-68.542,47.2798],[-68.51214,47.29195],[-68.47381,47.29229],[-68.46038,47.28149],[-68.43898,47.27777],[-68.37229,47.2825],[-68.3703,47.34796],[-68.33173,47.35822],[-68.29664,47.352],[-68.2399,47.34897],[-68.0906,47.26798],[-68.00002,47.21223],[-67.96344,47.19753],[-67.93582,47.15947],[-67.88619,47.10424],[-67.80218,47.06386],[-67.79415,45.93923],[-67.82753,45.8489],[-67.82753,45.6704],[-67.54943,45.57445],[-67.45302,45.58742],[-67.44189,45.52251],[-67.54201,45.49393],[-67.4456,45.38726],[-67.51605,45.29343],[-67.38257,45.11839],[-67.3047,45.11316],[-67.26762,45.18116],[-67.12671,45.09484],[-66.94835,44.78406],[-66.52283,43.61294],[-65.02339,42.10691],[-42.53366,47.50263],[-75.90901,77.3176],[-71.86482,78.7359],[-67.20011,80.66812],[-66.20727,80.78637],[-54.82473,83.07464],[-57.62518,85.04043],[-106.7949,85.04625],[-141.3957,79.2514],[-141.0678,60.2442]]],overlay:true},{id:"Geobase_Roads",name:"Geobase Roads - English",type:"wms",template:"https://maps.geogratis.gc.ca/wms/roads_en?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=roads&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[4,20],polygon:[[[-141.0678,60.2442],[-139.3842,60.10331],[-137.4746,58.82791],[-135.4766,59.65971],[-134.399,58.86279],[-132.5239,57.08342],[-130.1435,55.27452],[-130.7734,54.75597],[-132.4355,54.71514],[-134.5711,54.38827],[-141.7761,53.58405],[-128.9768,46.41459],[-124.8087,48.42976],[-123.4286,48.17889],[-123.0256,48.40444],[-123.19237,48.65504],[-122.99582,48.51065],[-122.4869,48.4098],[-122.32915,48.4528],[-122.22939,48.50649],[-122.17908,48.52965],[-122.1842,48.5669],[-121.77833,48.57593],[-121.66578,48.42791],[-121.33068,48.35714],[-121.02713,48.34977],[-121.03054,48.49406],[-120.698,48.51497],[-120.51041,48.8718],[-119.97579,48.88134],[-119.95447,48.51497],[-119.90758,48.29421],[-119.73193,48.15503],[-119.74386,48.07419],[-119.62279,48.10951],[-119.60232,48.14707],[-119.25273,48.16243],[-114.1499,48.99487],[-95.12094,48.98405],[-95.13419,49.35564],[-94.94415,49.34356],[-94.8839,49.29522],[-94.71704,48.87631],[-94.71791,48.7485],[-93.83204,48.49765],[-93.43778,48.53066],[-93.38216,48.59507],[-92.98471,48.60312],[-92.73847,48.50725],[-92.7095,48.42081],[-92.54293,48.40158],[-92.38361,48.20406],[-92.11564,48.27641],[-91.58697,48.02516],[-91.24658,48.05422],[-90.86275,48.20889],[-90.78308,48.0639],[-90.0774,48.07435],[-89.93835,47.96584],[-89.75469,47.99609],[-89.32745,47.93943],[-88.41489,48.26677],[-84.9566,46.86086],[-84.84795,46.6762],[-84.55904,46.45441],[-84.47642,46.44972],[-84.43758,46.48872],[-84.3669,46.5055],[-84.34899,46.5055],[-84.29026,46.49077],[-84.25742,46.49386],[-84.22507,46.53187],[-84.1962,46.53804],[-84.18027,46.52468],[-84.15987,46.52468],[-84.13449,46.52879],[-84.11558,46.50653],[-84.15944,46.42769],[-84.10024,46.20338],[-83.95558,46.05132],[-83.8864,46.06125],[-83.8203,46.11181],[-83.76975,46.09563],[-83.67498,46.11391],[-83.58084,46.09921],[-83.44747,45.99521],[-83.60888,45.81772],[-82.14271,43.57905],[-82.39133,43.06666],[-82.41252,43.01127],[-82.42522,42.99864],[-82.42618,42.99374],[-82.42363,42.98536],[-82.41503,42.97697],[-82.41853,42.96578],[-82.43064,42.95203],[-82.44911,42.93711],[-82.45739,42.92568],[-82.46472,42.90562],[-82.47228,42.8877],[-82.47228,42.84743],[-82.48536,42.80967],[-82.46844,42.76365],[-82.48586,42.73697],[-82.49155,42.71168],[-82.51488,42.66652],[-82.51224,42.63893],[-82.52421,42.61103],[-82.56854,42.58184],[-82.59498,42.55148],[-82.61286,42.56409],[-82.65158,42.55707],[-82.83439,42.3763],[-83.01489,42.33457],[-83.07244,42.31502],[-83.09647,42.29542],[-83.12823,42.24126],[-83.14167,42.18582],[-83.12799,42.12172],[-83.16266,42.04963],[-83.05136,41.70911],[-82.41932,41.6377],[-81.22563,42.19633],[-80.06688,42.37121],[-78.86642,42.825],[-78.90301,42.92307],[-78.92063,42.95234],[-78.93331,42.95708],[-78.96058,42.9595],[-78.98479,42.9761],[-79.01825,42.9964],[-79.01969,43.01561],[-79.00695,43.0333],[-78.99599,43.06448],[-79.07335,43.07876],[-79.07286,43.083],[-79.0652,43.0917],[-79.05623,43.10825],[-79.05982,43.11563],[-79.06764,43.11992],[-79.05411,43.12801],[-79.04112,43.13986],[-79.04465,43.16192],[-79.05101,43.17037],[-79.04758,43.19974],[-79.05511,43.25682],[-79.18688,43.44858],[-78.68836,43.62502],[-76.77647,43.61369],[-76.41665,44.08498],[-75.49023,44.70772],[-75.29544,44.82587],[-75.16845,44.88548],[-75.1275,44.8975],[-75.00499,44.95265],[-74.98159,44.97728],[-74.90496,44.98222],[-74.8313,45.01108],[-74.77954,45.00158],[-74.74562,44.98526],[-74.70475,44.99877],[-74.49079,44.99343],[-74.23203,44.98552],[-73.93713,44.99512],[-73.01809,45.0121],[-72.63177,45.0121],[-72.54779,45.00506],[-72.32259,45.00286],[-71.49404,45.01093],[-71.48648,45.06221],[-71.42303,45.12765],[-71.43112,45.14037],[-71.37175,45.22117],[-71.28959,45.28578],[-71.23613,45.24302],[-71.11683,45.22933],[-71.0531,45.29866],[-70.98936,45.31088],[-70.90246,45.22525],[-70.82473,45.22714],[-70.77626,45.40013],[-70.7119,45.3754],[-70.63387,45.37346],[-70.60302,45.41179],[-70.67659,45.56319],[-70.3752,45.73075],[-70.36334,45.82013],[-70.25417,45.87468],[-70.22569,45.94403],[-70.27316,45.99022],[-70.17586,46.33538],[-70.06195,46.4107],[-69.98891,46.69363],[-69.22424,47.44463],[-69.06999,47.41092],[-69.07473,47.24202],[-68.89684,47.17469],[-68.78685,47.21493],[-68.72415,47.23217],[-68.68583,47.24028],[-68.66044,47.23183],[-68.62162,47.24028],[-68.59425,47.24974],[-68.59226,47.27001],[-68.57385,47.28486],[-68.55941,47.2798],[-68.542,47.2798],[-68.51214,47.29195],[-68.47381,47.29229],[-68.46038,47.28149],[-68.43898,47.27777],[-68.37229,47.2825],[-68.3703,47.34796],[-68.33173,47.35822],[-68.29664,47.352],[-68.2399,47.34897],[-68.0906,47.26798],[-68.00002,47.21223],[-67.96344,47.19753],[-67.93582,47.15947],[-67.88619,47.10424],[-67.80218,47.06386],[-67.79415,45.93923],[-67.82753,45.8489],[-67.82753,45.6704],[-67.54943,45.57445],[-67.45302,45.58742],[-67.44189,45.52251],[-67.54201,45.49393],[-67.4456,45.38726],[-67.51605,45.29343],[-67.38257,45.11839],[-67.3047,45.11316],[-67.26762,45.18116],[-67.12671,45.09484],[-66.94835,44.78406],[-66.52283,43.61294],[-65.02339,42.10691],[-42.53366,47.50263],[-75.90901,77.3176],[-71.86482,78.7359],[-67.20011,80.66812],[-66.20727,80.78637],[-54.82473,83.07464],[-57.62518,85.04043],[-106.7949,85.04625],[-141.3957,79.2514],[-141.0678,60.2442]]]},{id:"Geobase_Roads_French",name:"Geobase Roads - French",type:"wms",template:"https://cartes.geogratis.gc.ca/wms/roads_fr?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=routes&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[4,20],polygon:[[[-141.0678,60.2442],[-139.3842,60.10331],[-137.4746,58.82791],[-135.4766,59.65971],[-134.399,58.86279],[-132.5239,57.08342],[-130.1435,55.27452],[-130.7734,54.75597],[-132.4355,54.71514],[-134.5711,54.38827],[-141.7761,53.58405],[-128.9768,46.41459],[-124.8087,48.42976],[-123.4286,48.17889],[-123.0256,48.40444],[-123.19237,48.65504],[-122.99582,48.51065],[-122.4869,48.4098],[-122.32915,48.4528],[-122.22939,48.50649],[-122.17908,48.52965],[-122.1842,48.5669],[-121.77833,48.57593],[-121.66578,48.42791],[-121.33068,48.35714],[-121.02713,48.34977],[-121.03054,48.49406],[-120.698,48.51497],[-120.51041,48.8718],[-119.97579,48.88134],[-119.95447,48.51497],[-119.90758,48.29421],[-119.73193,48.15503],[-119.74386,48.07419],[-119.62279,48.10951],[-119.60232,48.14707],[-119.25273,48.16243],[-114.1499,48.99487],[-95.12094,48.98405],[-95.13419,49.35564],[-94.94415,49.34356],[-94.8839,49.29522],[-94.71704,48.87631],[-94.71791,48.7485],[-93.83204,48.49765],[-93.43778,48.53066],[-93.38216,48.59507],[-92.98471,48.60312],[-92.73847,48.50725],[-92.7095,48.42081],[-92.54293,48.40158],[-92.38361,48.20406],[-92.11564,48.27641],[-91.58697,48.02516],[-91.24658,48.05422],[-90.86275,48.20889],[-90.78308,48.0639],[-90.0774,48.07435],[-89.93835,47.96584],[-89.75469,47.99609],[-89.32745,47.93943],[-88.41489,48.26677],[-84.9566,46.86086],[-84.84795,46.6762],[-84.55904,46.45441],[-84.47642,46.44972],[-84.43758,46.48872],[-84.3669,46.5055],[-84.34899,46.5055],[-84.29026,46.49077],[-84.25742,46.49386],[-84.22507,46.53187],[-84.1962,46.53804],[-84.18027,46.52468],[-84.15987,46.52468],[-84.13449,46.52879],[-84.11558,46.50653],[-84.15944,46.42769],[-84.10024,46.20338],[-83.95558,46.05132],[-83.8864,46.06125],[-83.8203,46.11181],[-83.76975,46.09563],[-83.67498,46.11391],[-83.58084,46.09921],[-83.44747,45.99521],[-83.60888,45.81772],[-82.14271,43.57905],[-82.39133,43.06666],[-82.41252,43.01127],[-82.42522,42.99864],[-82.42618,42.99374],[-82.42363,42.98536],[-82.41503,42.97697],[-82.41853,42.96578],[-82.43064,42.95203],[-82.44911,42.93711],[-82.45739,42.92568],[-82.46472,42.90562],[-82.47228,42.8877],[-82.47228,42.84743],[-82.48536,42.80967],[-82.46844,42.76365],[-82.48586,42.73697],[-82.49155,42.71168],[-82.51488,42.66652],[-82.51224,42.63893],[-82.52421,42.61103],[-82.56854,42.58184],[-82.59498,42.55148],[-82.61286,42.56409],[-82.65158,42.55707],[-82.83439,42.3763],[-83.01489,42.33457],[-83.07244,42.31502],[-83.09647,42.29542],[-83.12823,42.24126],[-83.14167,42.18582],[-83.12799,42.12172],[-83.16266,42.04963],[-83.05136,41.70911],[-82.41932,41.6377],[-81.22563,42.19633],[-80.06688,42.37121],[-78.86642,42.825],[-78.90301,42.92307],[-78.92063,42.95234],[-78.93331,42.95708],[-78.96058,42.9595],[-78.98479,42.9761],[-79.01825,42.9964],[-79.01969,43.01561],[-79.00695,43.0333],[-78.99599,43.06448],[-79.07335,43.07876],[-79.07286,43.083],[-79.0652,43.0917],[-79.05623,43.10825],[-79.05982,43.11563],[-79.06764,43.11992],[-79.05411,43.12801],[-79.04112,43.13986],[-79.04465,43.16192],[-79.05101,43.17037],[-79.04758,43.19974],[-79.05511,43.25682],[-79.18688,43.44858],[-78.68836,43.62502],[-76.77647,43.61369],[-76.41665,44.08498],[-75.49023,44.70772],[-75.29544,44.82587],[-75.16845,44.88548],[-75.1275,44.8975],[-75.00499,44.95265],[-74.98159,44.97728],[-74.90496,44.98222],[-74.8313,45.01108],[-74.77954,45.00158],[-74.74562,44.98526],[-74.70475,44.99877],[-74.49079,44.99343],[-74.23203,44.98552],[-73.93713,44.99512],[-73.01809,45.0121],[-72.63177,45.0121],[-72.54779,45.00506],[-72.32259,45.00286],[-71.49404,45.01093],[-71.48648,45.06221],[-71.42303,45.12765],[-71.43112,45.14037],[-71.37175,45.22117],[-71.28959,45.28578],[-71.23613,45.24302],[-71.11683,45.22933],[-71.0531,45.29866],[-70.98936,45.31088],[-70.90246,45.22525],[-70.82473,45.22714],[-70.77626,45.40013],[-70.7119,45.3754],[-70.63387,45.37346],[-70.60302,45.41179],[-70.67659,45.56319],[-70.3752,45.73075],[-70.36334,45.82013],[-70.25417,45.87468],[-70.22569,45.94403],[-70.27316,45.99022],[-70.17586,46.33538],[-70.06195,46.4107],[-69.98891,46.69363],[-69.22424,47.44463],[-69.06999,47.41092],[-69.07473,47.24202],[-68.89684,47.17469],[-68.78685,47.21493],[-68.72415,47.23217],[-68.68583,47.24028],[-68.66044,47.23183],[-68.62162,47.24028],[-68.59425,47.24974],[-68.59226,47.27001],[-68.57385,47.28486],[-68.55941,47.2798],[-68.542,47.2798],[-68.51214,47.29195],[-68.47381,47.29229],[-68.46038,47.28149],[-68.43898,47.27777],[-68.37229,47.2825],[-68.3703,47.34796],[-68.33173,47.35822],[-68.29664,47.352],[-68.2399,47.34897],[-68.0906,47.26798],[-68.00002,47.21223],[-67.96344,47.19753],[-67.93582,47.15947],[-67.88619,47.10424],[-67.80218,47.06386],[-67.79415,45.93923],[-67.82753,45.8489],[-67.82753,45.6704],[-67.54943,45.57445],[-67.45302,45.58742],[-67.44189,45.52251],[-67.54201,45.49393],[-67.4456,45.38726],[-67.51605,45.29343],[-67.38257,45.11839],[-67.3047,45.11316],[-67.26762,45.18116],[-67.12671,45.09484],[-66.94835,44.78406],[-66.52283,43.61294],[-65.02339,42.10691],[-42.53366,47.50263],[-75.90901,77.3176],[-71.86482,78.7359],[-67.20011,80.66812],[-66.20727,80.78637],[-54.82473,83.07464],[-57.62518,85.04043],[-106.7949,85.04625],[-141.3957,79.2514],[-141.0678,60.2442]]]},{id:"geoimage.at",name:"Geoimage.at MaxRes",type:"wms",template:"https://gis.bmlfuw.gv.at/wmsgw/?key=4d80de696cd562a63ce463a58a61488d&FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&Layers=Luftbild_MR,Luftbild_1m,Luftbild_8m,Satellitenbild_30m&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[16.50733,46.99293],[16.28342,46.99293],[16.13584,46.8713],[15.98317,46.81909],[16.04933,46.65517],[15.86104,46.71801],[15.75926,46.69009],[15.56079,46.67962],[15.57606,46.63421],[15.47937,46.60276],[15.43357,46.65168],[15.22493,46.63421],[15.04682,46.64819],[14.99084,46.58877],[14.9603,46.62373],[14.85344,46.60276],[14.83308,46.50127],[14.75166,46.49776],[14.68041,46.43818],[14.61426,46.43818],[14.57864,46.37853],[14.44124,46.43116],[14.16135,46.42766],[14.12573,46.47674],[14.01886,46.47674],[13.91199,46.52578],[13.82548,46.50477],[13.44381,46.56078],[13.30641,46.55028],[13.1283,46.58877],[12.84332,46.61324],[12.72628,46.6412],[12.51255,46.66565],[12.35988,46.70405],[12.36497,46.77032],[12.28863,46.77729],[12.27337,46.88522],[12.20721,46.87478],[12.13088,46.90261],[12.11561,46.99987],[12.25301,47.06577],[12.2123,47.0935],[11.9833,47.04497],[11.73394,46.96168],[11.63217,47.01028],[11.54057,46.97557],[11.49986,47.00681],[11.41843,46.96515],[11.25559,46.97557],[11.1131,46.91304],[11.04185,46.76335],[10.88919,46.75986],[10.74161,46.78426],[10.70599,46.86435],[10.57877,46.83998],[10.45663,46.85043],[10.47699,46.92694],[10.38539,46.98946],[10.23272,46.86435],[10.12076,46.83302],[9.86632,46.94084],[9.90194,47.00334],[9.68312,47.05884],[9.61188,47.03804],[9.63223,47.12813],[9.58134,47.1662],[9.54063,47.26644],[9.60679,47.34926],[9.67294,47.36994],[9.64241,47.44571],[9.56608,47.48011],[9.71365,47.52824],[9.7849,47.59692],[9.83579,47.54542],[9.94774,47.53855],[10.09023,47.44915],[10.11059,47.36649],[10.2429,47.38717],[10.18692,47.2699],[10.32432,47.29751],[10.48208,47.44915],[10.43119,47.48699],[10.44137,47.59005],[10.48717,47.55229],[10.54823,47.53511],[10.59912,47.56602],[10.75688,47.53168],[10.88919,47.54542],[10.94008,47.48699],[10.99605,47.39061],[11.23523,47.44227],[11.28103,47.3975],[11.42352,47.51449],[11.57619,47.50762],[11.60672,47.59005],[11.83572,47.58662],[12.00366,47.62436],[12.20721,47.60378],[12.16141,47.69634],[12.2581,47.74427],[12.25301,47.67921],[12.43112,47.71004],[12.49219,47.63122],[12.56852,47.62779],[12.62959,47.68949],[12.77208,47.66893],[12.83315,47.54198],[12.97564,47.47323],[13.04179,47.49387],[13.0367,47.55572],[13.09777,47.64151],[13.03161,47.71004],[12.90439,47.72031],[13.00617,47.84683],[12.9451,47.93555],[12.86368,47.95941],[12.86368,48.00369],[12.75172,48.09894],[12.87386,48.21097],[12.96037,48.21097],[13.04179,48.2652],[13.18428,48.29907],[13.26061,48.2923],[13.39801,48.35659],[13.44381,48.41742],[13.43872,48.55234],[13.50997,48.58601],[13.61175,48.57255],[13.72879,48.5119],[13.78477,48.57255],[13.82039,48.62639],[13.79495,48.71713],[13.85093,48.77417],[14.05957,48.66338],[14.01377,48.63312],[14.07484,48.59274],[14.21733,48.59611],[14.3649,48.54897],[14.46668,48.64993],[14.55828,48.59611],[14.59899,48.62639],[14.72113,48.57591],[14.72113,48.6869],[14.8229,48.7272],[14.81782,48.77753],[14.96472,48.78518],[14.98936,49.01266],[15.14859,48.99503],[15.19439,48.93155],[15.30635,48.98501],[15.39286,48.98501],[15.48446,48.92821],[15.74908,48.8546],[15.84068,48.88807],[16.00862,48.78088],[16.20708,48.73391],[16.39537,48.73727],[16.49206,48.81105],[16.69053,48.77417],[16.7058,48.73391],[16.89917,48.71377],[16.97551,48.51527],[16.84828,48.45118],[16.85337,48.34644],[16.95515,48.25165],[16.99077,48.1499],[17.09255,48.13971],[17.08237,48.02412],[17.17397,48.02071],[17.08237,47.87414],[16.98568,47.86732],[17.08237,47.80925],[17.09255,47.70319],[16.74142,47.67921],[16.7058,47.75112],[16.53786,47.75454],[16.54804,47.70662],[16.42082,47.66893],[16.57348,47.6175],[16.67017,47.63122],[16.71088,47.53855],[16.66,47.44915],[16.54295,47.39406],[16.46153,47.39406],[16.49206,47.2768],[16.42591,47.19733],[16.47171,47.1489],[16.54804,47.1489],[16.47679,47.07964],[16.52768,47.05884],[16.50733,46.99293]]],terms_url:"http://geoimage.at",terms_text:"geoimage.at",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/at/GeoimageatMaxRes.png"},{id:"Geolittoral-Orthophotos2000",name:"Géolittoral - Orthophotos 2000",type:"wms",template:"http://geolittoral.din.developpement-durable.gouv.fr/wxs?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=ortholittorale&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2000-01-01T00:00:00.000Z",startDate:"2000-01-01T00:00:00.000Z",polygon:[[[-1.07962,46.10959],[-0.94115,46.01474],[-0.56306,45.15178],[-0.7266,45.08425],[-0.87904,45.34094],[-0.99794,45.33779],[-0.95558,44.69982],[-1.15862,44.19865],[-1.21512,44.20558],[-1.24654,44.1162],[-1.27903,44.03937],[-1.28825,44.02304],[-1.32117,43.94094],[-1.32151,43.92296],[-1.3092,43.92337],[-1.3085,43.91439],[-1.28366,43.91514],[-1.28302,43.90624],[-1.2761,43.90655],[-1.28211,43.89254],[-1.30102,43.85159],[-1.30384,43.8424],[-1.30923,43.83498],[-1.33474,43.76946],[-1.34407,43.74875],[-1.3456,43.74214],[-1.34673,43.73688],[-1.43284,43.53152],[-1.42806,43.46812],[-1.60627,43.40591],[-1.6061,43.36012],[-1.77441,43.30357],[-1.82995,43.38484],[-1.58551,43.46856],[-1.35706,44.03374],[-1.40217,44.06461],[-1.33584,44.22832],[-1.21836,44.23033],[-1.16795,44.41097],[-1.30744,44.41847],[-1.16979,45.59107],[-1.48685,46.06042],[-1.36364,46.09146],[-1.60176,46.17019],[-1.64442,46.22375],[-1.58595,46.30426],[-1.51008,46.33888],[-1.75643,46.42214],[-2.1872,46.81857],[-2.16423,46.85534],[-2.23654,46.9337],[-2.39769,46.96718],[-2.282,47.07631],[-2.12563,47.01875],[-2.09013,47.06562],[-2.18487,47.10698],[-2.2647,47.10763],[-2.24489,47.18562],[-2.56779,47.24467],[-2.66727,47.46686],[-2.74787,47.47122],[-2.75771,47.43461],[-2.89321,47.4629],[-2.90369,47.50905],[-3.03383,47.53833],[-3.07113,47.51185],[-3.01653,47.49873],[-3.12502,47.42693],[-3.18803,47.48441],[-3.22791,47.61132],[-3.2967,47.63161],[-3.2876,47.67154],[-3.34074,47.66893],[-3.38912,47.59473],[-3.55087,47.63827],[-3.53384,47.72488],[-3.76577,47.76476],[-3.77595,47.7371],[-3.91168,47.75915],[-3.8959,47.79911],[-3.97236,47.81526],[-3.99722,47.7975],[-3.97956,47.76268],[-3.8945,47.72193],[-3.9162,47.67831],[-4.10163,47.70921],[-4.08989,47.78944],[-4.03798,47.79909],[-4.04125,47.83109],[-4.08765,47.84221],[-4.14781,47.82525],[-4.14314,47.78847],[-4.35162,47.7415],[-4.47962,47.9776],[-4.98565,47.99896],[-4.96938,48.08972],[-4.63576,48.07798],[-4.60147,48.11469],[-4.385,48.10962],[-4.38955,48.14543],[-4.30925,48.15009],[-4.31268,48.17694],[-4.46369,48.18468],[-4.49748,48.1453],[-4.5921,48.14758],[-4.57537,48.22488],[-4.67101,48.2331],[-4.65434,48.31049],[-4.84243,48.3005],[-5.19867,48.44926],[-5.10346,48.51722],[-4.81465,48.39413],[-4.83515,48.54319],[-4.63387,48.66373],[-3.96692,48.77978],[-3.94939,48.74715],[-3.6502,48.75356],[-3.65853,48.82527],[-3.53931,48.85834],[-3.54444,48.90297],[-3.40954,48.91866],[-3.40755,48.87366],[-3.02769,48.9275],[-2.67861,48.58841],[-2.28475,48.71909],[-2.17543,48.65016],[-2.0137,48.73221],[-1.80953,48.73178],[-1.80392,48.66126],[-1.61161,48.68582],[-1.71645,49.24781],[-1.8026,49.32721],[-1.85748,49.3253],[-1.9262,49.65573],[-2.03908,49.67872],[-2.00445,49.76087],[-1.61759,49.68498],[-1.28373,49.76067],[-1.1492,49.63504],[-1.17134,49.55412],[-1.27353,49.55245],[-1.1328,49.3934],[-0.93059,49.40804],[-0.74827,49.35976],[-0.38935,49.34167],[-0.24704,49.29995],[-0.12454,49.29353],[0.02731,49.37619],[0.01801,49.54656],[0.12211,49.69292],[0.51713,49.86466],[1.05727,49.94904],[1.43908,50.11819],[1.53177,50.46437],[1.52549,50.85867],[1.64118,50.95919],[2.4521,51.12144],[2.59286,51.12124],[2.60683,51.05779],[1.7976,50.89906],[1.66458,50.82379],[1.70786,50.1282],[1.05936,49.85],[0.61607,49.79062],[0.24731,49.65027],[0.1709,49.53174],[0.57065,49.49622],[0.41115,49.3396],[0.19504,49.35736],[0.01718,49.25479],[-0.24453,49.26312],[-0.38408,49.30495],[-0.74091,49.32438],[-0.9954,49.37133],[-1.05453,49.25175],[-1.27704,49.29022],[-1.25966,49.43463],[-1.39141,49.53985],[-1.27535,49.62056],[-1.29775,49.65946],[-1.4905,49.57139],[-1.77517,49.63398],[-1.74601,49.48155],[-1.51294,49.24691],[-1.48261,48.72607],[-1.30574,48.72531],[-1.28323,48.59731],[-2.76114,48.43471],[-3.00174,48.67646],[-3.21062,48.72097],[-3.95404,48.56051],[-4.15643,48.60792],[-4.44475,48.55852],[-4.63683,48.48299],[-4.6319,48.44727],[-4.25022,48.43088],[-4.06141,48.21805],[-4.1757,48.05165],[-4.31904,48.0141],[-4.26781,47.89977],[-3.88484,47.98172],[-3.76375,47.86403],[-2.32727,47.52634],[-2.36911,47.3339],[-1.74067,47.33507],[-1.77062,47.20451],[-2.03678,47.21942],[-2.0968,47.15548],[-1.88786,47.01239],[-2.08797,46.83007],[-2.01214,46.83436],[-1.84079,46.69651],[-1.87318,46.65484],[-1.68859,46.50392],[-1.62117,46.51513],[-1.42428,46.41675],[-1.01761,46.35917],[-1.07962,46.10959]],[[-2.41232,46.69242],[-2.37197,46.67611],[-2.26749,46.68033],[-2.27007,46.70705],[-2.29827,46.73286],[-2.41655,46.73711],[-2.41232,46.69242]],[[-3.06018,47.40542],[-2.82587,47.29635],[-2.78787,47.33417],[-3.02436,47.44563],[-3.06018,47.40542]],[[-3.26482,47.4295],[-3.3343,47.35928],[-3.29614,47.34133],[-3.31489,47.30057],[-3.19941,47.24492],[-3.16567,47.27751],[-3.08686,47.23612],[-3.00637,47.30855],[-3.26482,47.4295]],[[-1.93966,48.86346],[-1.93993,48.91179],[-1.701,48.91105],[-1.69726,48.86173],[-1.93966,48.86346]]],terms_url:"https://wiki.openstreetmap.org/wiki/WikiProject_France/G%C3%A9oLittoral",terms_text:"Ortho littorale 2000"},{id:"Geolittoral-Sentiers",name:"Géolittoral - Sentiers",type:"wms",template:"http://geolittoral.din.developpement-durable.gouv.fr/wxs?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=n_sentier_littoral_l&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[-0.98385,46.18807],[-0.89497,46.15628],[-0.93455,46.10163],[-0.84388,46.06949],[-0.88241,46.01637],[-0.53787,45.89558],[-0.63498,45.76444],[-0.86666,45.8479],[-0.76264,45.6245],[-0.69695,45.62659],[-0.69397,45.60184],[-0.68755,45.60174],[-0.688,45.50986],[-0.63799,45.50892],[-0.63978,45.44747],[-0.61574,45.44695],[-0.61619,45.38586],[-0.58544,45.38596],[-0.58529,45.32334],[-0.55379,45.32344],[-0.55275,45.19661],[-0.49094,45.19577],[-0.49184,45.13315],[-0.45661,45.13325],[-0.45512,45.07161],[-0.41611,45.07089],[-0.41621,45.02696],[-0.2907,44.98278],[-0.22,45.06771],[-0.12252,45.02563],[-0.18925,44.94591],[-0.09266,44.91019],[-0.14521,44.8392],[-0.15491,44.84238],[-0.19387,44.78678],[-0.43541,44.87317],[-0.39048,44.68413],[-0.58798,44.66014],[-0.66628,44.99129],[-0.77838,44.99263],[-0.77764,45.05389],[-0.81584,45.05321],[-0.81838,45.11962],[-0.88393,45.12051],[-0.88171,45.18081],[-0.93438,45.18185],[-0.9328,45.24484],[-1.00163,45.24439],[-1.00247,45.30827],[-1.0524,45.31013],[-1.04828,45.36911],[-1.06412,45.36911],[-1.05039,45.18252],[-1.10761,44.80787],[-1.01514,44.80113],[-1.01946,44.76914],[-0.93365,44.76149],[-0.9404,44.7018],[-0.96035,44.56434],[-1.01408,44.56765],[-1.09916,44.1456],[-1.22689,44.14022],[-1.21853,44.03249],[-1.30762,44.029],[-1.39572,43.74301],[-1.31296,43.72951],[-1.37439,43.53109],[-1.34589,43.50606],[-1.59964,43.35423],[-1.76549,43.25548],[-1.79281,43.28038],[-1.80281,43.40425],[-1.72832,43.45033],[-1.58531,43.489],[-1.33584,44.22832],[-1.30744,44.41847],[-1.22511,45.44416],[-1.48685,46.06042],[-1.60176,46.17019],[-1.64442,46.22375],[-1.75643,46.42214],[-2.03483,46.61895],[-2.3466,46.62382],[-2.46561,46.71196],[-2.3233,46.83812],[-2.45286,46.93856],[-2.31733,47.16214],[-2.92848,47.28413],[-2.96742,47.22147],[-3.35602,47.32474],[-3.18803,47.48441],[-3.22791,47.61132],[-3.38912,47.59473],[-3.9162,47.67831],[-4.10163,47.70921],[-4.14314,47.78847],[-4.37619,47.71067],[-4.47962,47.9776],[-4.98565,47.99896],[-4.96938,48.08972],[-4.60147,48.11469],[-4.5921,48.14758],[-4.67101,48.2331],[-4.84243,48.3005],[-5.19867,48.44926],[-5.10346,48.51722],[-4.83515,48.54319],[-4.63117,48.66129],[-3.96692,48.77978],[-3.94939,48.74715],[-3.67013,48.89508],[-3.54444,48.90297],[-3.40954,48.91866],[-3.33344,48.90458],[-3.02769,48.9275],[-2.80207,48.79793],[-2.69353,48.76722],[-2.45786,48.70896],[-2.28475,48.71909],[-2.17543,48.65016],[-2.0137,48.73221],[-1.80953,48.73178],[-1.7243,48.75828],[-1.70557,48.84512],[-1.90304,48.86288],[-1.91027,48.92348],[-1.68714,48.93249],[-1.74277,49.24473],[-1.85748,49.3253],[-1.9262,49.65573],[-2.03908,49.67872],[-2.00445,49.76087],[-1.61759,49.68498],[-1.28373,49.76067],[-1.1492,49.63504],[-1.18545,49.54836],[-0.96463,49.42509],[-0.74429,49.36802],[-0.39014,49.3622],[-0.24976,49.3158],[-0.13342,49.31293],[0.02731,49.37619],[0.01801,49.54656],[0.12211,49.69292],[0.51713,49.86466],[1.05727,49.94904],[1.43908,50.11819],[1.53177,50.46437],[1.52549,50.85867],[1.64118,50.95919],[2.59712,51.17355],[2.66071,51.0196],[2.07124,50.92022],[2.05937,50.94709],[1.7976,50.89906],[1.68089,50.8717],[1.65569,50.59729],[1.75357,50.5932],[1.72295,50.24702],[1.82156,50.24262],[1.80149,50.05116],[1.54565,50.06311],[1.54155,50.01267],[1.42462,50.01747],[1.42667,50.05276],[1.03838,49.84609],[0.9827,49.88916],[0.57961,49.82133],[0.42063,49.76297],[0.4281,49.75445],[0.20831,49.67269],[0.14765,49.57767],[0.13461,49.5809],[0.11117,49.54365],[0.56598,49.52045],[0.5632,49.49989],[0.63001,49.49666],[0.61478,49.37441],[0.54825,49.37851],[0.54254,49.33461],[0.45741,49.33938],[0.45843,49.34492],[0.32597,49.35456],[0.32846,49.38128],[0.28011,49.38433],[0.27689,49.36334],[0.21095,49.36658],[0.20817,49.35084],[0.14326,49.35532],[0.13769,49.3115],[0.07204,49.31532],[0.0675,49.28713],[0.00274,49.29076],[0.00508,49.25711],[-0.02027,49.26036],[-0.03492,49.1973],[-0.19448,49.21463],[-0.38966,49.12726],[-0.45369,49.18792],[-0.3561,49.23214],[-0.82088,49.28331],[-0.99778,49.30149],[-1.16728,49.24545],[-1.19515,49.28183],[-1.26768,49.24099],[-1.34114,49.2975],[-1.24768,49.35025],[-1.44583,49.60689],[-1.81105,49.61757],[-1.77479,49.44333],[-1.72775,49.46509],[-1.5339,49.29098],[-1.47909,49.29233],[-1.47608,49.24027],[-1.43557,49.20326],[-1.47225,49.1822],[-1.45091,48.75725],[-1.31155,48.76408],[-1.30533,48.70216],[-1.2584,48.70421],[-1.25229,48.64353],[-1.23519,48.64435],[-1.2269,48.56824],[-1.85218,48.53086],[-1.84908,48.4975],[-1.92326,48.49187],[-1.92813,48.44096],[-2.04272,48.43601],[-2.03889,48.48191],[-2.2895,48.46102],[-2.3021,48.52433],[-2.40863,48.51618],[-2.42035,48.56954],[-2.43084,48.57852],[-2.49083,48.54924],[-2.47353,48.53326],[-2.54978,48.49647],[-2.54005,48.48747],[-2.70681,48.40746],[-3.02979,48.69115],[-4.01034,48.53179],[-4.05342,48.64412],[-4.38281,48.57349],[-4.35482,48.5118],[-4.38853,48.50473],[-4.13495,48.44868],[-4.16411,48.38936],[-4.01832,48.35685],[-4.04733,48.29918],[-3.98814,48.2867],[-4.0214,48.21606],[-4.03634,48.21958],[-4.06623,48.16028],[-4.16675,48.18247],[-4.18331,48.14934],[-4.17232,48.1065],[-4.20111,48.10285],[-4.18643,48.04389],[-4.18806,48.04061],[-4.35686,48.02305],[-4.25657,47.93997],[-4.23363,47.93497],[-4.21371,47.97598],[-4.21854,47.97726],[-4.1806,48.05569],[-3.6172,47.93124],[-2.17991,47.58642],[-2.25449,47.44501],[-2.30182,47.4568],[-2.32043,47.42092],[-2.30372,47.41755],[-2.34753,47.33499],[-2.36219,47.33837],[-2.38079,47.3039],[-2.35852,47.29854],[-2.29962,47.29784],[-2.29742,47.3618],[-2.13199,47.35852],[-2.13478,47.39107],[-2.01565,47.39623],[-2.01404,47.38095],[-1.92862,47.38254],[-1.92891,47.37956],[-1.8322,47.38184],[-1.82986,47.34165],[-1.73608,47.34304],[-1.73418,47.305],[-1.64084,47.30639],[-1.64011,47.29427],[-1.58355,47.29566],[-1.58531,47.33708],[-1.4612,47.33966],[-1.46003,47.32924],[-1.37211,47.33221],[-1.36054,47.11239],[-1.48567,47.11149],[-1.48582,47.11877],[-1.66897,47.11688],[-1.66971,47.12864],[-1.72553,47.12764],[-1.72612,47.13761],[-1.93975,47.13263],[-1.94019,47.1422],[-1.9925,47.14309],[-1.81066,47.00588],[-1.94723,46.92078],[-1.92891,46.90677],[-1.99529,46.86461],[-1.73652,46.66839],[-1.77535,46.64386],[-1.82678,46.64174],[-1.82473,46.62071],[-1.18192,46.39987],[-0.91261,46.3048],[-0.95481,46.2489],[-0.94235,46.24424],[-0.98385,46.18807]],[[3.14769,42.40072],[3.14949,42.40015],[3.15305,42.40052],[3.15804,42.40243],[3.1877,42.42805],[3.14227,42.5248],[3.06837,42.54635],[3.04884,42.6942],[3.0799,43.03073],[3.22641,43.18727],[3.40916,43.26032],[3.52104,43.25877],[3.66429,43.37628],[3.73841,43.39054],[4.00979,43.53607],[4.17692,43.45636],[4.54355,43.43349],[4.54943,43.35401],[4.83506,43.30891],[4.97506,43.38309],[5.03219,43.31928],[5.25919,43.31928],[5.31082,43.20504],[5.35682,43.18645],[5.36882,43.16785],[5.40232,43.16211],[5.41382,43.17123],[5.40919,43.19921],[5.54232,43.18827],[5.60582,43.14797],[5.6197,43.1529],[5.63832,43.17159],[5.67157,43.1674],[5.69095,43.13411],[5.77607,43.10637],[5.7762,43.09432],[5.75407,43.08328],[5.75707,43.0725],[5.77032,43.06465],[5.85933,43.03469],[5.8877,43.06273],[5.9567,43.06109],[5.96383,43.09277],[6.00033,43.09186],[6.01745,43.06849],[6.10233,43.07415],[6.10483,43.0526],[6.0666,43.04318],[6.06722,43.03785],[6.1427,43.00923],[6.15676,42.98715],[6.19635,42.97331],[6.22221,42.9801],[6.26891,42.99651],[6.25515,43.03627],[6.2019,43.02713],[6.18378,43.09188],[6.30153,43.09909],[6.32478,43.07974],[6.37778,43.08011],[6.38866,43.13395],[6.51341,43.14608],[6.57704,43.17881],[6.62291,43.14563],[6.69779,43.19969],[6.68016,43.23357],[6.72116,43.26007],[6.72241,43.27472],[6.67054,43.29192],[6.68741,43.33113],[6.72416,43.34267],[6.75291,43.409],[6.79104,43.39674],[6.90629,43.41672],[6.96767,43.50273],[6.96617,43.52812],[7.00617,43.53845],[7.03554,43.4982],[7.06892,43.5001],[7.09079,43.51642],[7.06267,43.53672],[7.08254,43.5456],[7.1238,43.53074],[7.1558,43.5437],[7.1433,43.62284],[7.16867,43.64636],[7.2138,43.63469],[7.25417,43.68497],[7.3403,43.66744],[7.36442,43.6894],[7.35305,43.7082],[7.4163,43.71091],[7.45405,43.74506],[7.4943,43.74524],[7.57943,43.78424],[7.60552,43.78603],[7.60368,43.78898],[7.59588,43.79528],[7.59628,43.79549],[7.53853,43.84195],[7.45996,43.79988],[7.44781,43.80934],[7.32353,43.74806],[7.30822,43.76357],[6.64878,43.3885],[6.66865,43.37178],[6.51003,43.27803],[6.56584,43.22509],[6.12681,43.10527],[5.48229,43.24939],[5.47267,43.2309],[5.41567,43.24657],[5.45267,43.3451],[4.80191,43.48158],[4.76416,43.39244],[4.65716,43.42368],[4.67228,43.45608],[4.43203,43.52419],[4.41453,43.49255],[4.16102,43.56433],[4.14452,43.57067],[4.14165,43.57393],[4.18677,43.59946],[4.10565,43.68196],[3.79689,43.52165],[3.77851,43.51313],[3.76464,43.50597],[3.76201,43.50334],[3.74226,43.49328],[3.71601,43.52075],[3.26213,43.28143],[3.24638,43.29735],[3.18388,43.28052],[3.10675,43.24083],[3.15475,43.19419],[2.90625,43.19383],[2.90675,42.76189],[2.94613,42.76208],[2.9465,42.61516],[2.99238,42.61497],[2.99238,42.5125],[3.041,42.51259],[3.04121,42.50093],[3.09086,42.50082],[3.14769,42.40072]],[[6.35945,43.02321],[6.42477,43.02444],[6.45244,43.03504],[6.46985,43.05461],[6.51121,43.05765],[6.52156,43.04318],[6.48364,43.02444],[6.47179,43.00725],[6.41178,42.9918],[6.39852,42.98048],[6.35178,42.99905],[6.35945,43.02321]]],terms_url:"https://wiki.openstreetmap.org/wiki/WikiProject_France/G%C3%A9oLittoral",terms_text:"Ortho littorale 2000"},{id:"GeolittoralV2-Orthophotos",name:"Géolittoral V2 - Orthophotos 2011-2014",type:"wms",template:"http://geolittoral.din.developpement-durable.gouv.fr/wxs?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=ortholittorale_v2_rvb&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2014-01-01T00:00:00.000Z",startDate:"2011-01-01T00:00:00.000Z",polygon:[[[-0.98385,46.18807],[-0.89497,46.15628],[-0.93455,46.10163],[-0.84388,46.06949],[-0.88241,46.01637],[-0.53787,45.89558],[-0.63498,45.76444],[-0.86666,45.8479],[-0.76264,45.6245],[-0.69695,45.62659],[-0.69397,45.60184],[-0.68755,45.60174],[-0.688,45.50986],[-0.63799,45.50892],[-0.63978,45.44747],[-0.61574,45.44695],[-0.61619,45.38586],[-0.58544,45.38596],[-0.58529,45.32334],[-0.55379,45.32344],[-0.55275,45.19661],[-0.49094,45.19577],[-0.49184,45.13315],[-0.45661,45.13325],[-0.45512,45.07161],[-0.41611,45.07089],[-0.41621,45.02696],[-0.2907,44.98278],[-0.22,45.06771],[-0.12252,45.02563],[-0.18925,44.94591],[-0.09266,44.91019],[-0.14521,44.8392],[-0.15491,44.84238],[-0.19387,44.78678],[-0.43541,44.87317],[-0.39048,44.68413],[-0.58798,44.66014],[-0.66628,44.99129],[-0.77838,44.99263],[-0.77764,45.05389],[-0.81584,45.05321],[-0.81838,45.11962],[-0.88393,45.12051],[-0.88171,45.18081],[-0.93438,45.18185],[-0.9328,45.24484],[-1.00163,45.24439],[-1.00247,45.30827],[-1.0524,45.31013],[-1.04828,45.36911],[-1.06412,45.36911],[-1.05039,45.18252],[-1.10761,44.80787],[-1.01514,44.80113],[-1.01946,44.76914],[-0.93365,44.76149],[-0.9404,44.7018],[-0.96035,44.56434],[-1.01408,44.56765],[-1.09916,44.1456],[-1.22689,44.14022],[-1.21853,44.03249],[-1.30762,44.029],[-1.39572,43.74301],[-1.31296,43.72951],[-1.37439,43.53109],[-1.34589,43.50606],[-1.59964,43.35423],[-1.76549,43.25548],[-1.79281,43.28038],[-1.80281,43.40425],[-1.72832,43.45033],[-1.58531,43.489],[-1.33584,44.22832],[-1.30744,44.41847],[-1.22511,45.44416],[-1.48685,46.06042],[-1.60176,46.17019],[-1.64442,46.22375],[-1.75643,46.42214],[-2.03483,46.61895],[-2.3466,46.62382],[-2.46561,46.71196],[-2.3233,46.83812],[-2.45286,46.93856],[-2.31733,47.16214],[-2.92848,47.28413],[-2.96742,47.22147],[-3.35602,47.32474],[-3.18803,47.48441],[-3.22791,47.61132],[-3.38912,47.59473],[-3.9162,47.67831],[-4.10163,47.70921],[-4.14314,47.78847],[-4.37619,47.71067],[-4.47962,47.9776],[-4.98565,47.99896],[-4.96938,48.08972],[-4.60147,48.11469],[-4.5921,48.14758],[-4.67101,48.2331],[-4.84243,48.3005],[-5.19867,48.44926],[-5.10346,48.51722],[-4.83515,48.54319],[-4.63117,48.66129],[-3.96692,48.77978],[-3.94939,48.74715],[-3.67013,48.89508],[-3.54444,48.90297],[-3.40954,48.91866],[-3.33344,48.90458],[-3.02769,48.9275],[-2.80207,48.79793],[-2.69353,48.76722],[-2.45786,48.70896],[-2.28475,48.71909],[-2.17543,48.65016],[-2.0137,48.73221],[-1.80953,48.73178],[-1.7243,48.75828],[-1.70557,48.84512],[-1.90304,48.86288],[-1.91027,48.92348],[-1.68714,48.93249],[-1.74277,49.24473],[-1.85748,49.3253],[-1.9262,49.65573],[-2.03908,49.67872],[-2.00445,49.76087],[-1.61759,49.68498],[-1.28373,49.76067],[-1.1492,49.63504],[-1.18545,49.54836],[-0.96463,49.42509],[-0.74429,49.36802],[-0.39014,49.3622],[-0.24976,49.3158],[-0.13342,49.31293],[0.02731,49.37619],[0.01801,49.54656],[0.12211,49.69292],[0.51713,49.86466],[1.05727,49.94904],[1.43908,50.11819],[1.53177,50.46437],[1.52549,50.85867],[1.64118,50.95919],[2.59712,51.17355],[2.66071,51.0196],[2.07124,50.92022],[2.05937,50.94709],[1.7976,50.89906],[1.68089,50.8717],[1.65569,50.59729],[1.75357,50.5932],[1.72295,50.24702],[1.82156,50.24262],[1.80149,50.05116],[1.54565,50.06311],[1.54155,50.01267],[1.42462,50.01747],[1.42667,50.05276],[1.03838,49.84609],[0.9827,49.88916],[0.57961,49.82133],[0.42063,49.76297],[0.4281,49.75445],[0.20831,49.67269],[0.14765,49.57767],[0.13461,49.5809],[0.11117,49.54365],[0.56598,49.52045],[0.5632,49.49989],[0.63001,49.49666],[0.61478,49.37441],[0.54825,49.37851],[0.54254,49.33461],[0.45741,49.33938],[0.45843,49.34492],[0.32597,49.35456],[0.32846,49.38128],[0.28011,49.38433],[0.27689,49.36334],[0.21095,49.36658],[0.20817,49.35084],[0.14326,49.35532],[0.13769,49.3115],[0.07204,49.31532],[0.0675,49.28713],[0.00274,49.29076],[0.00508,49.25711],[-0.02027,49.26036],[-0.03492,49.1973],[-0.19448,49.21463],[-0.38966,49.12726],[-0.45369,49.18792],[-0.3561,49.23214],[-0.82088,49.28331],[-0.99778,49.30149],[-1.16728,49.24545],[-1.19515,49.28183],[-1.26768,49.24099],[-1.34114,49.2975],[-1.24768,49.35025],[-1.44583,49.60689],[-1.81105,49.61757],[-1.77479,49.44333],[-1.72775,49.46509],[-1.5339,49.29098],[-1.47909,49.29233],[-1.47608,49.24027],[-1.43557,49.20326],[-1.47225,49.1822],[-1.45091,48.75725],[-1.31155,48.76408],[-1.30533,48.70216],[-1.2584,48.70421],[-1.25229,48.64353],[-1.23519,48.64435],[-1.2269,48.56824],[-1.85218,48.53086],[-1.84908,48.4975],[-1.92326,48.49187],[-1.92813,48.44096],[-2.04272,48.43601],[-2.03889,48.48191],[-2.2895,48.46102],[-2.3021,48.52433],[-2.40863,48.51618],[-2.42035,48.56954],[-2.43084,48.57852],[-2.49083,48.54924],[-2.47353,48.53326],[-2.54978,48.49647],[-2.54005,48.48747],[-2.70681,48.40746],[-3.02979,48.69115],[-4.01034,48.53179],[-4.05342,48.64412],[-4.38281,48.57349],[-4.35482,48.5118],[-4.38853,48.50473],[-4.13495,48.44868],[-4.16411,48.38936],[-4.01832,48.35685],[-4.04733,48.29918],[-3.98814,48.2867],[-4.0214,48.21606],[-4.03634,48.21958],[-4.06623,48.16028],[-4.16675,48.18247],[-4.18331,48.14934],[-4.17232,48.1065],[-4.20111,48.10285],[-4.18643,48.04389],[-4.18806,48.04061],[-4.35686,48.02305],[-4.25657,47.93997],[-4.23363,47.93497],[-4.21371,47.97598],[-4.21854,47.97726],[-4.1806,48.05569],[-3.6172,47.93124],[-2.17991,47.58642],[-2.25449,47.44501],[-2.30182,47.4568],[-2.32043,47.42092],[-2.30372,47.41755],[-2.34753,47.33499],[-2.36219,47.33837],[-2.38079,47.3039],[-2.35852,47.29854],[-2.29962,47.29784],[-2.29742,47.3618],[-2.13199,47.35852],[-2.13478,47.39107],[-2.01565,47.39623],[-2.01404,47.38095],[-1.92862,47.38254],[-1.92891,47.37956],[-1.8322,47.38184],[-1.82986,47.34165],[-1.73608,47.34304],[-1.73418,47.305],[-1.64084,47.30639],[-1.64011,47.29427],[-1.58355,47.29566],[-1.58531,47.33708],[-1.4612,47.33966],[-1.46003,47.32924],[-1.37211,47.33221],[-1.36054,47.11239],[-1.48567,47.11149],[-1.48582,47.11877],[-1.66897,47.11688],[-1.66971,47.12864],[-1.72553,47.12764],[-1.72612,47.13761],[-1.93975,47.13263],[-1.94019,47.1422],[-1.9925,47.14309],[-1.81066,47.00588],[-1.94723,46.92078],[-1.92891,46.90677],[-1.99529,46.86461],[-1.73652,46.66839],[-1.77535,46.64386],[-1.82678,46.64174],[-1.82473,46.62071],[-1.18192,46.39987],[-0.91261,46.3048],[-0.95481,46.2489],[-0.94235,46.24424],[-0.98385,46.18807]],[[3.14769,42.40072],[3.14949,42.40015],[3.15305,42.40052],[3.15804,42.40243],[3.1877,42.42805],[3.14227,42.5248],[3.06837,42.54635],[3.04884,42.6942],[3.0799,43.03073],[3.22641,43.18727],[3.40916,43.26032],[3.52104,43.25877],[3.66429,43.37628],[3.73841,43.39054],[4.00979,43.53607],[4.17692,43.45636],[4.54355,43.43349],[4.54943,43.35401],[4.83506,43.30891],[4.97506,43.38309],[5.03219,43.31928],[5.25919,43.31928],[5.31082,43.20504],[5.35682,43.18645],[5.36882,43.16785],[5.40232,43.16211],[5.41382,43.17123],[5.40919,43.19921],[5.54232,43.18827],[5.60582,43.14797],[5.6197,43.1529],[5.63832,43.17159],[5.67157,43.1674],[5.69095,43.13411],[5.77607,43.10637],[5.7762,43.09432],[5.75407,43.08328],[5.75707,43.0725],[5.77032,43.06465],[5.85933,43.03469],[5.8877,43.06273],[5.9567,43.06109],[5.96383,43.09277],[6.00033,43.09186],[6.01745,43.06849],[6.10233,43.07415],[6.10483,43.0526],[6.0666,43.04318],[6.06722,43.03785],[6.1427,43.00923],[6.15676,42.98715],[6.19635,42.97331],[6.22221,42.9801],[6.26891,42.99651],[6.25515,43.03627],[6.2019,43.02713],[6.18378,43.09188],[6.30153,43.09909],[6.32478,43.07974],[6.37778,43.08011],[6.38866,43.13395],[6.51341,43.14608],[6.57704,43.17881],[6.62291,43.14563],[6.69779,43.19969],[6.68016,43.23357],[6.72116,43.26007],[6.72241,43.27472],[6.67054,43.29192],[6.68741,43.33113],[6.72416,43.34267],[6.75291,43.409],[6.79104,43.39674],[6.90629,43.41672],[6.96767,43.50273],[6.96617,43.52812],[7.00617,43.53845],[7.03554,43.4982],[7.06892,43.5001],[7.09079,43.51642],[7.06267,43.53672],[7.08254,43.5456],[7.1238,43.53074],[7.1558,43.5437],[7.1433,43.62284],[7.16867,43.64636],[7.2138,43.63469],[7.25417,43.68497],[7.3403,43.66744],[7.36442,43.6894],[7.35305,43.7082],[7.4163,43.71091],[7.45405,43.74506],[7.4943,43.74524],[7.57943,43.78424],[7.60552,43.78603],[7.60368,43.78898],[7.59588,43.79528],[7.59628,43.79549],[7.53853,43.84195],[7.45996,43.79988],[7.44781,43.80934],[7.32353,43.74806],[7.30822,43.76357],[6.64878,43.3885],[6.66865,43.37178],[6.51003,43.27803],[6.56584,43.22509],[6.12681,43.10527],[5.48229,43.24939],[5.47267,43.2309],[5.41567,43.24657],[5.45267,43.3451],[4.80191,43.48158],[4.76416,43.39244],[4.65716,43.42368],[4.67228,43.45608],[4.43203,43.52419],[4.41453,43.49255],[4.16102,43.56433],[4.14452,43.57067],[4.14165,43.57393],[4.18677,43.59946],[4.10565,43.68196],[3.79689,43.52165],[3.77851,43.51313],[3.76464,43.50597],[3.76201,43.50334],[3.74226,43.49328],[3.71601,43.52075],[3.26213,43.28143],[3.24638,43.29735],[3.18388,43.28052],[3.10675,43.24083],[3.15475,43.19419],[2.90625,43.19383],[2.90675,42.76189],[2.94613,42.76208],[2.9465,42.61516],[2.99238,42.61497],[2.99238,42.5125],[3.041,42.51259],[3.04121,42.50093],[3.09086,42.50082],[3.14769,42.40072]],[[6.35945,43.02321],[6.42477,43.02444],[6.45244,43.03504],[6.46985,43.05461],[6.51121,43.05765],[6.52156,43.04318],[6.48364,43.02444],[6.47179,43.00725],[6.41178,42.9918],[6.39852,42.98048],[6.35178,42.99905],[6.35945,43.02321]]],terms_url:"https://wiki.openstreetmap.org/wiki/WikiProject_France/G%C3%A9oLittoral",terms_text:"Ortho Littorale V2 - MEDDE"},{id:"lu.geoportail.opendata.ortho_10cm_proto_lidar",name:"geoportail.lu LIDAR prototype Nordstad 2017",type:"tms",template:"https://{switch:wmts1,wmts2}.geoportail.lu/opendata/wmts/ortho_10cm_proto_lidar/GLOBAL_WEBMERCATOR_4_V3/{zoom}/{x}/{y}.jpeg",endDate:"2017-04-09T00:00:00.000Z",startDate:"2017-04-09T00:00:00.000Z",zoomExtent:[0,21],polygon:[[[6.05001,49.82175],[6.04979,49.91166],[6.18901,49.91172],[6.18897,49.82181],[6.05001,49.82175]]],terms_url:"https://act.public.lu/fr/cartographie/lidar",terms_text:"Administration du Cadastre et de la Topographie",icon:"https://www.geoportail.lu/static/img/lion.png"},{id:"Geoportal2-PL-aerial_image",name:"Geoportal 2: Orthophotomap (aerial image)",type:"wms",template:"http://mapy.geoportal.gov.pl/wss/service/img/guest/ORTO/MapServer/WMSServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Raster&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}{header(User-Agent,Mozilla/5.0 (JOSM)}",projection:"EPSG:4326",zoomExtent:[0,23],polygon:[[[15.9751,54.37092],[16.31116,54.55618],[17.13919,54.78457],[18.34485,54.90227],[19.66137,54.47372],[20.28152,54.42135],[21.46639,54.34064],[22.77599,54.37698],[22.8626,54.42336],[23.29567,54.26786],[23.53472,54.09553],[23.52086,53.97752],[23.71834,53.46296],[23.92968,53.18567],[23.92968,52.68873],[23.7322,52.60675],[23.5659,52.58781],[23.20905,52.33026],[23.19519,52.23701],[23.50354,52.18606],[23.69062,52.00301],[23.59708,51.7399],[23.66291,51.38886],[23.9366,50.98278],[24.16873,50.86048],[24.01975,50.80358],[24.10983,50.66105],[24.05786,50.41884],[23.61787,50.30834],[22.68244,49.51635],[22.73788,49.20949],[22.90417,49.07804],[22.8626,48.99401],[22.60969,49.03718],[22.07615,49.20044],[21.84749,49.37219],[21.37631,49.44883],[21.10262,49.37219],[20.91207,49.3022],[20.6453,49.39023],[20.18451,49.33156],[20.11869,49.20044],[19.942,49.13021],[19.76531,49.21176],[19.74798,49.39925],[19.60247,49.41503],[19.50893,49.58154],[19.42925,49.59052],[19.23177,49.41503],[18.99618,49.38798],[18.93382,49.4916],[18.83681,49.49386],[18.80216,49.66234],[18.6428,49.70941],[18.52154,49.89947],[18.08154,50.01092],[17.88753,49.98865],[17.73855,50.06877],[17.6069,50.17096],[17.74548,50.21532],[17.71084,50.3017],[17.41635,50.26407],[16.94864,50.44533],[16.89321,50.40339],[17.00061,50.31055],[17.01793,50.22419],[16.81352,50.18649],[16.64029,50.09767],[16.43242,50.28621],[16.19683,50.42767],[16.42203,50.58852],[16.33888,50.66324],[16.22802,50.63688],[16.05479,50.61271],[15.57322,50.76415],[15.26834,50.89764],[15.24409,50.9806],[15.02929,51.0133],[15.00157,50.85829],[14.81102,50.87359],[14.95653,51.07212],[15.01889,51.29146],[14.93921,51.46015],[14.72094,51.55718],[14.75212,51.62606],[14.59968,51.84276],[14.70362,52.07334],[14.55811,52.24974],[14.51654,52.42544],[14.60315,52.58781],[14.11465,52.82083],[14.15276,52.9734],[14.35024,53.07342],[14.42299,53.26656],[14.1978,53.87348],[14.22205,53.99585],[15.9751,54.37092]]],terms_url:"https://geoportal.gov.pl/web/guest/regulamin",terms_text:"Główny Urząd Geodezji i Kartografii",best:true,icon:"https://wiki.openstreetmap.org/w/images/2/25/Geoportal-josm.png"},{id:"Geoportal2-PL-prng",name:"Geoportal 2: PRNG (geo names)",type:"wms",template:"http://mapy.geoportal.gov.pl/wss/service/pub/guest/G2_PRNG_WMS/MapServer/WMSServer?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=PozostaleObiektyFizjograficzne,Hydrografia,PozostaleMiejscowosci,Wies,UksztaltowanieTerenu&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}{header(User-Agent,Mozilla/5.0 (JOSM)}",projection:"EPSG:4326",polygon:[[[15.9751,54.37092],[16.31116,54.55618],[17.13919,54.78457],[18.34485,54.90227],[19.66137,54.47372],[20.28152,54.42135],[21.46639,54.34064],[22.77599,54.37698],[22.8626,54.42336],[23.29567,54.26786],[23.53472,54.09553],[23.52086,53.97752],[23.71834,53.46296],[23.92968,53.18567],[23.92968,52.68873],[23.7322,52.60675],[23.5659,52.58781],[23.20905,52.33026],[23.19519,52.23701],[23.50354,52.18606],[23.69062,52.00301],[23.59708,51.7399],[23.66291,51.38886],[23.9366,50.98278],[24.16873,50.86048],[24.01975,50.80358],[24.10983,50.66105],[24.05786,50.41884],[23.61787,50.30834],[22.68244,49.51635],[22.73788,49.20949],[22.90417,49.07804],[22.8626,48.99401],[22.60969,49.03718],[22.07615,49.20044],[21.84749,49.37219],[21.37631,49.44883],[21.10262,49.37219],[20.91207,49.3022],[20.6453,49.39023],[20.18451,49.33156],[20.11869,49.20044],[19.942,49.13021],[19.76531,49.21176],[19.74798,49.39925],[19.60247,49.41503],[19.50893,49.58154],[19.42925,49.59052],[19.23177,49.41503],[18.99618,49.38798],[18.93382,49.4916],[18.83681,49.49386],[18.80216,49.66234],[18.6428,49.70941],[18.52154,49.89947],[18.08154,50.01092],[17.88753,49.98865],[17.73855,50.06877],[17.6069,50.17096],[17.74548,50.21532],[17.71084,50.3017],[17.41635,50.26407],[16.94864,50.44533],[16.89321,50.40339],[17.00061,50.31055],[17.01793,50.22419],[16.81352,50.18649],[16.64029,50.09767],[16.43242,50.28621],[16.19683,50.42767],[16.42203,50.58852],[16.33888,50.66324],[16.22802,50.63688],[16.05479,50.61271],[15.57322,50.76415],[15.26834,50.89764],[15.24409,50.9806],[15.02929,51.0133],[15.00157,50.85829],[14.81102,50.87359],[14.95653,51.07212],[15.01889,51.29146],[14.93921,51.46015],[14.72094,51.55718],[14.75212,51.62606],[14.59968,51.84276],[14.70362,52.07334],[14.55811,52.24974],[14.51654,52.42544],[14.60315,52.58781],[14.11465,52.82083],[14.15276,52.9734],[14.35024,53.07342],[14.42299,53.26656],[14.1978,53.87348],[14.22205,53.99585],[15.9751,54.37092]]],terms_url:"http://www.codgik.gov.pl/index.php/darmowe-dane/prng.html",terms_text:"Centralny Ośrodek Dokumentacji Geodezyjnej i Kartograficznej",icon:"https://wiki.openstreetmap.org/w/images/2/25/Geoportal-josm.png",overlay:true},{id:"Geoportal-PL-aerial_image",name:"Geoportal.gov.pl (Orthophotomap)",type:"tms",template:"https://wms.misek.pl/geoportal.orto/tms/{zoom}/{x}/{y}",zoomExtent:[6,24],polygon:[[[15.9751,54.37092],[16.31116,54.55618],[17.13919,54.78457],[18.34485,54.90227],[19.66137,54.47372],[20.28152,54.42135],[21.46639,54.34064],[22.77599,54.37698],[22.8626,54.42336],[23.29567,54.26786],[23.53472,54.09553],[23.52086,53.97752],[23.71834,53.46296],[23.92968,53.18567],[23.92968,52.68873],[23.7322,52.60675],[23.5659,52.58781],[23.20905,52.33026],[23.19519,52.23701],[23.50354,52.18606],[23.69062,52.00301],[23.59708,51.7399],[23.66291,51.38886],[23.9366,50.98278],[24.16873,50.86048],[24.01975,50.80358],[24.10983,50.66105],[24.05786,50.41884],[23.61787,50.30834],[22.68244,49.51635],[22.73788,49.20949],[22.90417,49.07804],[22.8626,48.99401],[22.60969,49.03718],[22.07615,49.20044],[21.84749,49.37219],[21.37631,49.44883],[21.10262,49.37219],[20.91207,49.3022],[20.6453,49.39023],[20.18451,49.33156],[20.11869,49.20044],[19.942,49.13021],[19.76531,49.21176],[19.74798,49.39925],[19.60247,49.41503],[19.50893,49.58154],[19.42925,49.59052],[19.23177,49.41503],[18.99618,49.38798],[18.93382,49.4916],[18.83681,49.49386],[18.80216,49.66234],[18.6428,49.70941],[18.52154,49.89947],[18.08154,50.01092],[17.88753,49.98865],[17.73855,50.06877],[17.6069,50.17096],[17.74548,50.21532],[17.71084,50.3017],[17.41635,50.26407],[16.94864,50.44533],[16.89321,50.40339],[17.00061,50.31055],[17.01793,50.22419],[16.81352,50.18649],[16.64029,50.09767],[16.43242,50.28621],[16.19683,50.42767],[16.42203,50.58852],[16.33888,50.66324],[16.22802,50.63688],[16.05479,50.61271],[15.57322,50.76415],[15.26834,50.89764],[15.24409,50.9806],[15.02929,51.0133],[15.00157,50.85829],[14.81102,50.87359],[14.95653,51.07212],[15.01889,51.29146],[14.93921,51.46015],[14.72094,51.55718],[14.75212,51.62606],[14.59968,51.84276],[14.70362,52.07334],[14.55811,52.24974],[14.51654,52.42544],[14.60315,52.58781],[14.11465,52.82083],[14.15276,52.9734],[14.35024,53.07342],[14.42299,53.26656],[14.1978,53.87348],[14.22205,53.99585],[15.9751,54.37092]]],terms_text:"Copyright © Główny Urząd Geodezji i Kartografii.",best:true,icon:"https://i.imgur.com/aFlvMpM.png"},{id:"girau_do_pnciano",name:"Girau do Ponciano",type:"wms",template:"http://geoserver.dados.al.gov.br:8080/geoserver/Alagoas/ows?LAYERS=Girau%20do%20Ponciano&SERVICE=WMS&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.0&SERVICE=WMS&REQUEST=GetMap&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[-36.78013,-9.92939],[-36.78087,-9.83892],[-36.87233,-9.83917],[-36.87173,-9.90542],[-36.87037,-9.92989],[-36.86156,-9.92994],[-36.85566,-9.92981],[-36.85146,-9.92973],[-36.84575,-9.92977],[-36.83213,-9.92967],[-36.81456,-9.9296],[-36.78013,-9.92939]]],terms_url:"http://www.seplag.al.gov.br",terms_text:"Secretaria de Estado do Planejamento, Gestão e Patrimônio"},{id:"Gliwice-buildings",name:"Gliwice: Buildings",type:"wms",template:"http://185.60.246.14:9090/isdp/gs/ows?FORMAT=image/png&transparent=true&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=default:EGIB_budynek,default:pkt_adr&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",polygon:[[[18.57376,50.34828],[18.58723,50.35464],[18.58421,50.3601],[18.59264,50.37522],[18.65228,50.38297],[18.67384,50.37675],[18.67672,50.36174],[18.69218,50.34467],[18.70805,50.33799],[18.74154,50.3391],[18.75145,50.33046],[18.74679,50.31236],[18.75512,50.30193],[18.76358,50.29989],[18.76539,50.26873],[18.744,50.26541],[18.73482,50.25377],[18.72775,50.22843],[18.71439,50.22835],[18.71426,50.21978],[18.67522,50.21969],[18.67607,50.22562],[18.65098,50.23169],[18.6288,50.22539],[18.61744,50.24044],[18.62699,50.24369],[18.6315,50.25487],[18.61406,50.2576],[18.60319,50.25206],[18.56536,50.24763],[18.54841,50.2492],[18.55857,50.2826],[18.5459,50.29947],[18.52896,50.33687],[18.55118,50.35332],[18.57376,50.34828]]],terms_text:"Urząd Miasta Gliwice"},{id:"GRAFCAN-Canary_Islands",name:"GRAFCAN - Canary Islands",type:"wms",template:"https://idecan1.grafcan.es/ServicioWMS/OrtoUrb?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&Layers=OU&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",polygon:[[[-17.92917,28.89106],[-18.03334,28.79981],[-18.03743,28.73178],[-17.87811,28.43224],[-17.83113,28.41787],[-17.72696,28.56328],[-17.73105,28.67982],[-17.68407,28.73715],[-17.75352,28.86781],[-17.85768,28.86065],[-17.92917,28.89106]],[[-18.07818,27.77211],[-18.13707,27.78751],[-18.17054,27.76441],[-18.1779,27.70695],[-18.15782,27.68799],[-18.0581,27.6791],[-18.00656,27.62574],[-17.96105,27.62218],[-17.93896,27.70814],[-17.90751,27.7194],[-17.86199,27.80468],[-17.8727,27.84079],[-17.92558,27.86801],[-18.00522,27.83605],[-18.01392,27.8035],[-18.07818,27.77211]],[[-17.26878,28.23996],[-17.33403,28.21933],[-17.36331,28.1537],[-17.36666,28.08803],[-17.33069,28.04742],[-17.27296,28.00681],[-17.20017,28.00533],[-17.14412,28.02896],[-17.07803,28.0836],[-17.08723,28.1537],[-17.1826,28.2149],[-17.26878,28.23996]],[[-16.9358,28.37623],[-16.945,28.33574],[-16.71995,27.98317],[-16.62541,27.98317],[-16.52753,28.01641],[-16.39953,28.14632],[-16.33594,28.30922],[-16.33009,28.36445],[-16.10253,28.52408],[-16.09834,28.5814],[-16.14268,28.62547],[-16.33929,28.59609],[-16.43801,28.53143],[-16.53924,28.44025],[-16.83959,28.41229],[-16.9358,28.37623]],[[-15.68833,28.20585],[-15.47395,28.16437],[-15.42427,28.21046],[-15.36283,28.17244],[-15.38375,28.05598],[-15.33146,27.98444],[-15.3576,27.8042],[-15.5916,27.69777],[-15.7001,27.73365],[-15.79944,27.80305],[-15.87134,27.92439],[-15.84781,28.03637],[-15.74716,28.08943],[-15.73147,28.18396],[-15.68833,28.20585]],[[-14.50882,28.13448],[-14.41078,28.13448],[-14.24868,28.24278],[-14.23822,28.34637],[-14.03953,28.73911],[-13.89442,28.78265],[-13.78592,28.77692],[-13.82122,28.38433],[-13.91534,28.19095],[-14.18593,28.13563],[-14.30881,28.00529],[-14.54019,28.05144],[-14.50882,28.13448]],[[-13.5525,29.37727],[-13.50868,29.36824],[-13.47955,29.38728],[-13.47543,29.40963],[-13.5003,29.42807],[-13.5505,29.40712],[-13.5525,29.37727]],[[-13.3976,29.16102],[-13.42814,29.12157],[-13.44174,28.99084],[-13.53899,28.91947],[-13.70841,28.88468],[-13.77116,28.80865],[-13.90083,28.83522],[-13.90711,28.88926],[-13.85796,28.93686],[-13.85691,29.03657],[-13.67599,29.14988],[-13.56723,29.15719],[-13.55428,29.35073],[-13.39988,29.21806],[-13.3976,29.16102]],[[-13.33792,29.28667],[-13.35035,29.27436],[-13.3386,29.26533],[-13.32617,29.27765],[-13.33792,29.28667]]],terms_text:"GRAFCAN OrtoExpress Urbana 2009"},{id:"GRAFCAN_Express-Canary_Islands",name:"GRAFCAN Express - Canary Islands",type:"wms",template:"https://idecan1.grafcan.es/ServicioWMS/OrtoExpress?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&Layers=ortoexpress&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",polygon:[[[-17.92917,28.89106],[-18.03334,28.79981],[-18.03743,28.73178],[-17.87811,28.43224],[-17.83113,28.41787],[-17.72696,28.56328],[-17.73105,28.67982],[-17.68407,28.73715],[-17.75352,28.86781],[-17.85768,28.86065],[-17.92917,28.89106]],[[-18.07818,27.77211],[-18.13707,27.78751],[-18.17054,27.76441],[-18.1779,27.70695],[-18.15782,27.68799],[-18.0581,27.6791],[-18.00656,27.62574],[-17.96105,27.62218],[-17.93896,27.70814],[-17.90751,27.7194],[-17.86199,27.80468],[-17.8727,27.84079],[-17.92558,27.86801],[-18.00522,27.83605],[-18.01392,27.8035],[-18.07818,27.77211]],[[-17.26878,28.23996],[-17.33403,28.21933],[-17.36331,28.1537],[-17.36666,28.08803],[-17.33069,28.04742],[-17.27296,28.00681],[-17.20017,28.00533],[-17.14412,28.02896],[-17.07803,28.0836],[-17.08723,28.1537],[-17.1826,28.2149],[-17.26878,28.23996]],[[-16.9358,28.37623],[-16.945,28.33574],[-16.71995,27.98317],[-16.62541,27.98317],[-16.52753,28.01641],[-16.39953,28.14632],[-16.33594,28.30922],[-16.33009,28.36445],[-16.10253,28.52408],[-16.09834,28.5814],[-16.14268,28.62547],[-16.33929,28.59609],[-16.43801,28.53143],[-16.53924,28.44025],[-16.83959,28.41229],[-16.9358,28.37623]],[[-15.68833,28.20585],[-15.47395,28.16437],[-15.42427,28.21046],[-15.36283,28.17244],[-15.38375,28.05598],[-15.33146,27.98444],[-15.3576,27.8042],[-15.5916,27.69777],[-15.7001,27.73365],[-15.79944,27.80305],[-15.87134,27.92439],[-15.84781,28.03637],[-15.74716,28.08943],[-15.73147,28.18396],[-15.68833,28.20585]],[[-14.50882,28.13448],[-14.41078,28.13448],[-14.24868,28.24278],[-14.23822,28.34637],[-14.03953,28.73911],[-13.89442,28.78265],[-13.78592,28.77692],[-13.82122,28.38433],[-13.91534,28.19095],[-14.18593,28.13563],[-14.30881,28.00529],[-14.54019,28.05144],[-14.50882,28.13448]],[[-13.5525,29.37727],[-13.50868,29.36824],[-13.47955,29.38728],[-13.47543,29.40963],[-13.5003,29.42807],[-13.5505,29.40712],[-13.5525,29.37727]],[[-13.3976,29.16102],[-13.42814,29.12157],[-13.44174,28.99084],[-13.53899,28.91947],[-13.70841,28.88468],[-13.77116,28.80865],[-13.90083,28.83522],[-13.90711,28.88926],[-13.85796,28.93686],[-13.85691,29.03657],[-13.67599,29.14988],[-13.56723,29.15719],[-13.55428,29.35073],[-13.39988,29.21806],[-13.3976,29.16102]],[[-13.33792,29.28667],[-13.35035,29.27436],[-13.3386,29.26533],[-13.32617,29.27765],[-13.33792,29.28667]]],terms_text:"GRAFCAN OrtoExpress"},{id:"GrandNancy_Orthophotographie_2012",name:"GrandNancy - Orthophoto - 2012",type:"tms",template:"http://wms.openstreetmap.fr/tms/1.0.0/nancy_2012/{zoom}/{x}/{y}",endDate:"2012-01-01T00:00:00.000Z",startDate:"2012-01-01T00:00:00.000Z",zoomExtent:[0,22],polygon:[[[6.06066,48.60554],[6.29717,48.59923],[6.30611,48.74077],[6.06896,48.7471],[6.06066,48.60554]]],terms_url:"https://wiki.openstreetmap.org/wiki/Nancy/Orthophotographie",terms_text:"GrandNancy Orthophotographie 2012"},{id:"GURS-buildings",name:"GURS: Building outlines",type:"tms",template:"https://wms.openstreetmap.de/tms/GURS-building-outlines/{zoom}/{x}/{y}.png",zoomExtent:[8,19],polygon:[[[15.17101,45.41273],[15.06731,45.4781],[14.98353,45.48726],[14.93027,45.51869],[14.91295,45.46869],[14.81398,45.45019],[14.77755,45.49724],[14.71885,45.52386],[14.68383,45.51924],[14.68367,45.57107],[14.58902,45.61966],[14.59477,45.65727],[14.51653,45.5974],[14.49636,45.52968],[14.32388,45.46048],[14.28251,45.47949],[14.26083,45.47352],[14.2367,45.49569],[14.21022,45.45962],[14.1328,45.46542],[14.06694,45.47615],[14.01187,45.50769],[13.98752,45.49945],[14.00668,45.4739],[13.99154,45.44854],[13.91789,45.44329],[13.88867,45.416],[13.81063,45.42531],[13.7856,45.45577],[13.67553,45.43241],[13.38,45.5666],[13.63822,45.64153],[13.72158,45.60472],[13.83759,45.59226],[13.89962,45.63295],[13.82754,45.67917],[13.82429,45.70266],[13.78961,45.73525],[13.66355,45.79008],[13.62279,45.78613],[13.58835,45.80154],[13.56531,45.85522],[13.62633,45.93894],[13.62975,45.97662],[13.59233,45.97929],[13.57124,45.9591],[13.52998,45.95627],[13.46729,46.00147],[13.49765,46.03741],[13.4896,46.06574],[13.58839,46.11268],[13.63712,46.14524],[13.65358,46.17505],[13.57147,46.17434],[13.54859,46.19982],[13.48189,46.21479],[13.42003,46.19662],[13.40026,46.21037],[13.40304,46.23284],[13.36653,46.30266],[13.43369,46.33243],[13.43247,46.36779],[13.56263,46.40895],[13.59357,46.44846],[13.68393,46.44947],[13.71321,46.53296],[13.79725,46.5164],[13.91305,46.53108],[14.00849,46.49169],[14.09406,46.49538],[14.12664,46.4852],[14.16569,46.44341],[14.28242,46.45347],[14.3259,46.44111],[14.43178,46.4568],[14.45113,46.43239],[14.52618,46.43623],[14.56677,46.38549],[14.58993,46.44479],[14.65658,46.45447],[14.71191,46.50954],[14.80818,46.51778],[14.81442,46.55093],[14.86094,46.61239],[14.9102,46.61569],[14.95398,46.64257],[14.98376,46.61868],[15.02973,46.65796],[15.10645,46.66965],[15.23727,46.64973],[15.41364,46.66553],[15.46237,46.64732],[15.47411,46.6226],[15.53427,46.64346],[15.53636,46.6761],[15.59201,46.69952],[15.62405,46.69039],[15.65624,46.71643],[15.767,46.70899],[15.83801,46.73237],[15.91476,46.71958],[16.02919,46.67033],[16.02955,46.68778],[15.99495,46.71178],[15.97505,46.74967],[15.98671,46.84189],[16.0553,46.85049],[16.11022,46.87912],[16.15425,46.86525],[16.23302,46.88667],[16.29431,46.8824],[16.34649,46.85476],[16.36058,46.8278],[16.34711,46.79707],[16.32245,46.79068],[16.33977,46.7799],[16.33186,46.75896],[16.38893,46.70785],[16.4383,46.69655],[16.42822,46.65301],[16.40159,46.6439],[16.51477,46.57299],[16.54136,46.53627],[16.5416,46.50887],[16.611,46.48393],[16.61889,46.46203],[16.52219,46.45842],[16.47451,46.50108],[16.36776,46.53371],[16.2582,46.489],[16.28533,46.42441],[16.3168,46.40141],[16.30574,46.36921],[16.18689,46.36804],[16.14548,46.39515],[16.06959,46.38154],[16.08614,46.34087],[16.04058,46.32708],[16.01819,46.29964],[15.80777,46.25091],[15.79649,46.21296],[15.77128,46.19937],[15.67996,46.21707],[15.65737,46.20838],[15.65639,46.18456],[15.62037,46.16163],[15.61899,46.11595],[15.63483,46.09529],[15.71869,46.06873],[15.74241,46.04578],[15.71612,45.99489],[15.71645,45.9178],[15.69237,45.90013],[15.69375,45.87111],[15.71776,45.8416],[15.6441,45.81058],[15.57467,45.83999],[15.52333,45.81155],[15.49115,45.82041],[15.47514,45.78666],[15.40343,45.78216],[15.28683,45.73391],[15.27435,45.72408],[15.29763,45.70782],[15.36329,45.72191],[15.41517,45.65443],[15.39705,45.62929],[15.31501,45.62356],[15.31503,45.60696],[15.29266,45.60163],[15.30852,45.58653],[15.31145,45.5423],[15.39496,45.48325],[15.34824,45.44665],[15.27515,45.45599],[15.22848,45.41683],[15.17101,45.41273]]],terms_url:"http://egp.gu.gov.si/",terms_text:"CC-BY ©2019 Geodetska uprava Republike Slovenije (gu.gov.si).",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/si/GURSRoadlines.png",overlay:true},{id:"GURS-roads",name:"GURS: Road lines",type:"tms",template:"https://wms.openstreetmap.de/tms/GURS-road-lines/{zoom}/{x}/{y}.png",zoomExtent:[8,19],polygon:[[[15.17101,45.41273],[15.06731,45.4781],[14.98353,45.48726],[14.93027,45.51869],[14.91295,45.46869],[14.81398,45.45019],[14.77755,45.49724],[14.71885,45.52386],[14.68383,45.51924],[14.68367,45.57107],[14.58902,45.61966],[14.59477,45.65727],[14.51653,45.5974],[14.49636,45.52968],[14.32388,45.46048],[14.28251,45.47949],[14.26083,45.47352],[14.2367,45.49569],[14.21022,45.45962],[14.1328,45.46542],[14.06694,45.47615],[14.01187,45.50769],[13.98752,45.49945],[14.00668,45.4739],[13.99154,45.44854],[13.91789,45.44329],[13.88867,45.416],[13.81063,45.42531],[13.7856,45.45577],[13.67553,45.43241],[13.38,45.5666],[13.63822,45.64153],[13.72158,45.60472],[13.83759,45.59226],[13.89962,45.63295],[13.82754,45.67917],[13.82429,45.70266],[13.78961,45.73525],[13.66355,45.79008],[13.62279,45.78613],[13.58835,45.80154],[13.56531,45.85522],[13.62633,45.93894],[13.62975,45.97662],[13.59233,45.97929],[13.57124,45.9591],[13.52998,45.95627],[13.46729,46.00147],[13.49765,46.03741],[13.4896,46.06574],[13.58839,46.11268],[13.63712,46.14524],[13.65358,46.17505],[13.57147,46.17434],[13.54859,46.19982],[13.48189,46.21479],[13.42003,46.19662],[13.40026,46.21037],[13.40304,46.23284],[13.36653,46.30266],[13.43369,46.33243],[13.43247,46.36779],[13.56263,46.40895],[13.59357,46.44846],[13.68393,46.44947],[13.71321,46.53296],[13.79725,46.5164],[13.91305,46.53108],[14.00849,46.49169],[14.09406,46.49538],[14.12664,46.4852],[14.16569,46.44341],[14.28242,46.45347],[14.3259,46.44111],[14.43178,46.4568],[14.45113,46.43239],[14.52618,46.43623],[14.56677,46.38549],[14.58993,46.44479],[14.65658,46.45447],[14.71191,46.50954],[14.80818,46.51778],[14.81442,46.55093],[14.86094,46.61239],[14.9102,46.61569],[14.95398,46.64257],[14.98376,46.61868],[15.02973,46.65796],[15.10645,46.66965],[15.23727,46.64973],[15.41364,46.66553],[15.46237,46.64732],[15.47411,46.6226],[15.53427,46.64346],[15.53636,46.6761],[15.59201,46.69952],[15.62405,46.69039],[15.65624,46.71643],[15.767,46.70899],[15.83801,46.73237],[15.91476,46.71958],[16.02919,46.67033],[16.02955,46.68778],[15.99495,46.71178],[15.97505,46.74967],[15.98671,46.84189],[16.0553,46.85049],[16.11022,46.87912],[16.15425,46.86525],[16.23302,46.88667],[16.29431,46.8824],[16.34649,46.85476],[16.36058,46.8278],[16.34711,46.79707],[16.32245,46.79068],[16.33977,46.7799],[16.33186,46.75896],[16.38893,46.70785],[16.4383,46.69655],[16.42822,46.65301],[16.40159,46.6439],[16.51477,46.57299],[16.54136,46.53627],[16.5416,46.50887],[16.611,46.48393],[16.61889,46.46203],[16.52219,46.45842],[16.47451,46.50108],[16.36776,46.53371],[16.2582,46.489],[16.28533,46.42441],[16.3168,46.40141],[16.30574,46.36921],[16.18689,46.36804],[16.14548,46.39515],[16.06959,46.38154],[16.08614,46.34087],[16.04058,46.32708],[16.01819,46.29964],[15.80777,46.25091],[15.79649,46.21296],[15.77128,46.19937],[15.67996,46.21707],[15.65737,46.20838],[15.65639,46.18456],[15.62037,46.16163],[15.61899,46.11595],[15.63483,46.09529],[15.71869,46.06873],[15.74241,46.04578],[15.71612,45.99489],[15.71645,45.9178],[15.69237,45.90013],[15.69375,45.87111],[15.71776,45.8416],[15.6441,45.81058],[15.57467,45.83999],[15.52333,45.81155],[15.49115,45.82041],[15.47514,45.78666],[15.40343,45.78216],[15.28683,45.73391],[15.27435,45.72408],[15.29763,45.70782],[15.36329,45.72191],[15.41517,45.65443],[15.39705,45.62929],[15.31501,45.62356],[15.31503,45.60696],[15.29266,45.60163],[15.30852,45.58653],[15.31145,45.5423],[15.39496,45.48325],[15.34824,45.44665],[15.27515,45.45599],[15.22848,45.41683],[15.17101,45.41273]]],terms_url:"http://egp.gu.gov.si/",terms_text:"CC-BY ©2019 Geodetska uprava Republike Slovenije (gu.gov.si).",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/si/GURSRoadlines.png",overlay:true},{id:"hamburg-20cm",name:"Hamburg (20 cm)",type:"wms",template:"https://geodienste.hamburg.de/HH_WMS_DOP20?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=1&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[8.4826,53.9356],[8.48274,53.90924],[8.5275,53.90941],[8.52792,53.93577],[8.4826,53.9356]],[[9.77232,53.54352],[9.77434,53.55433],[9.76314,53.55521],[9.73047,53.55787],[9.73465,53.56536],[9.75793,53.61828],[9.77129,53.63131],[9.7707,53.61607],[9.79634,53.6103],[9.78993,53.60386],[9.81817,53.58591],[9.83773,53.59198],[9.84498,53.59498],[9.85416,53.59805],[9.86814,53.6093],[9.86931,53.61323],[9.88505,53.62199],[9.88697,53.6252],[9.89356,53.63026],[9.89637,53.63122],[9.89688,53.63492],[9.90678,53.65231],[9.93115,53.65262],[9.94552,53.65276],[9.95024,53.65085],[9.95155,53.65065],[9.97795,53.64887],[9.98492,53.6483],[9.98739,53.65072],[9.9996,53.68153],[10.02282,53.68157],[10.04338,53.68198],[10.05148,53.67759],[10.06925,53.67955],[10.0604,53.68833],[10.071,53.69585],[10.0707,53.70996],[10.08198,53.72044],[10.11908,53.71324],[10.16939,53.73896],[10.19369,53.731],[10.1779,53.70992],[10.15694,53.70451],[10.15829,53.68944],[10.14342,53.68057],[10.14176,53.67744],[10.14473,53.67613],[10.14643,53.67588],[10.14955,53.67545],[10.17153,53.66869],[10.19885,53.64675],[10.18973,53.63838],[10.22202,53.63349],[10.18887,53.61316],[10.19236,53.59474],[10.20117,53.58392],[10.15169,53.57619],[10.15067,53.56973],[10.148,53.5639],[10.15308,53.56242],[10.15942,53.56091],[10.15189,53.5417],[10.15465,53.53657],[10.16874,53.5374],[10.16327,53.52185],[10.16611,53.52013],[10.16919,53.51965],[10.18951,53.51148],[10.21043,53.51996],[10.21828,53.49923],[10.2367,53.49629],[10.25008,53.47898],[10.26592,53.47079],[10.29043,53.45512],[10.30962,53.44309],[10.31223,53.45229],[10.32514,53.44979],[10.30799,53.43332],[10.25598,53.41623],[10.25089,53.41024],[10.24578,53.40261],[10.24155,53.39797],[10.16555,53.39933],[10.14506,53.41614],[10.10949,53.42649],[10.1068,53.42658],[10.07581,53.45436],[10.05155,53.46394],[10.03517,53.4469],[10.01449,53.44203],[10.02294,53.43228],[9.99754,53.42546],[9.98243,53.41478],[9.97873,53.4142],[9.9581,53.42708],[9.92953,53.42007],[9.92552,53.41924],[9.90667,53.41596],[9.92305,53.43631],[9.91704,53.44664],[9.90436,53.45707],[9.89493,53.45583],[9.86885,53.44462],[9.86211,53.42942],[9.84872,53.44111],[9.80663,53.46648],[9.80021,53.47372],[9.8028,53.49383],[9.78203,53.49236],[9.76885,53.5053],[9.77107,53.52185],[9.78105,53.51838],[9.77352,53.52796],[9.77232,53.54352]]],terms_url:"https://www.hamburg.de/bsw/landesbetrieb-geoinformation-und-vermessung",terms_text:"Freie und Hansestadt Hamburg, Landesbetrieb Geoinformation und Vermessung"},{id:"Hamburg-DK5",name:"Hamburg (DK5)",type:"wms",template:"https://geodienste.hamburg.de/HH_WMS_DK5?FORMAT=image/png&TRANSPARENT=false&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=1&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[8.4826,53.9356],[8.48274,53.90924],[8.5275,53.90941],[8.52792,53.93577],[8.4826,53.9356]],[[9.77232,53.54352],[9.77434,53.55433],[9.76314,53.55521],[9.73047,53.55787],[9.73465,53.56536],[9.75793,53.61828],[9.77129,53.63131],[9.7707,53.61607],[9.79634,53.6103],[9.78993,53.60386],[9.81817,53.58591],[9.83773,53.59198],[9.84498,53.59498],[9.85416,53.59805],[9.86814,53.6093],[9.86931,53.61323],[9.88505,53.62199],[9.88697,53.6252],[9.89356,53.63026],[9.89637,53.63122],[9.89688,53.63492],[9.90678,53.65231],[9.93115,53.65262],[9.94552,53.65276],[9.95024,53.65085],[9.95155,53.65065],[9.97795,53.64887],[9.98492,53.6483],[9.98739,53.65072],[9.9996,53.68153],[10.02282,53.68157],[10.04338,53.68198],[10.05148,53.67759],[10.06925,53.67955],[10.0604,53.68833],[10.071,53.69585],[10.0707,53.70996],[10.08198,53.72044],[10.11908,53.71324],[10.16939,53.73896],[10.19369,53.731],[10.1779,53.70992],[10.15694,53.70451],[10.15829,53.68944],[10.14342,53.68057],[10.14176,53.67744],[10.14473,53.67613],[10.14643,53.67588],[10.14955,53.67545],[10.17153,53.66869],[10.19885,53.64675],[10.18973,53.63838],[10.22202,53.63349],[10.18887,53.61316],[10.19236,53.59474],[10.20117,53.58392],[10.15169,53.57619],[10.15067,53.56973],[10.148,53.5639],[10.15308,53.56242],[10.15942,53.56091],[10.15189,53.5417],[10.15465,53.53657],[10.16874,53.5374],[10.16327,53.52185],[10.16611,53.52013],[10.16919,53.51965],[10.18951,53.51148],[10.21043,53.51996],[10.21828,53.49923],[10.2367,53.49629],[10.25008,53.47898],[10.26592,53.47079],[10.29043,53.45512],[10.30962,53.44309],[10.31223,53.45229],[10.32514,53.44979],[10.30799,53.43332],[10.25598,53.41623],[10.25089,53.41024],[10.24578,53.40261],[10.24155,53.39797],[10.16555,53.39933],[10.14506,53.41614],[10.10949,53.42649],[10.1068,53.42658],[10.07581,53.45436],[10.05155,53.46394],[10.03517,53.4469],[10.01449,53.44203],[10.02294,53.43228],[9.99754,53.42546],[9.98243,53.41478],[9.97873,53.4142],[9.9581,53.42708],[9.92953,53.42007],[9.92552,53.41924],[9.90667,53.41596],[9.92305,53.43631],[9.91704,53.44664],[9.90436,53.45707],[9.89493,53.45583],[9.86885,53.44462],[9.86211,53.42942],[9.84872,53.44111],[9.80663,53.46648],[9.80021,53.47372],[9.8028,53.49383],[9.78203,53.49236],[9.76885,53.5053],[9.77107,53.52185],[9.78105,53.51838],[9.77352,53.52796],[9.77232,53.54352]]],terms_url:"https://www.hamburg.de/bsw/landesbetrieb-geoinformation-und-vermessung",terms_text:"Freie und Hansestadt Hamburg, Landesbetrieb Geoinformation und Vermessung"},{id:"Hampshire-Aerial-FCIR",name:"Hampshire Aerial FCIR",type:"tms",template:"https://{switch:a,b,c}.hampshire.aerial.openstreetmap.org.uk/layer/gb_hampshire_aerial_fcir/{zoom}/{x}/{y}.png",endDate:"2014-01-01T00:00:00.000Z",startDate:"2013-01-01T00:00:00.000Z",zoomExtent:[8,20],polygon:[[[-1.31567,50.77809],[-1.49139,50.73027],[-1.57113,50.69041],[-1.68095,50.71748],[-1.69338,50.73484],[-1.69528,50.74065],[-1.68689,50.74999],[-1.71068,50.74812],[-1.7195,50.75261],[-1.746,50.74452],[-1.74845,50.75675],[-1.74287,50.76397],[-1.75101,50.77577],[-1.78525,50.76177],[-1.79911,50.77236],[-1.82256,50.77225],[-1.82678,50.78077],[-1.8225,50.79933],[-1.80732,50.80074],[-1.81566,50.80752],[-1.80889,50.81358],[-1.80579,50.83249],[-1.79816,50.83535],[-1.80649,50.84414],[-1.80988,50.86189],[-1.81378,50.85591],[-1.83052,50.85261],[-1.85271,50.85651],[-1.85655,50.86684],[-1.8492,50.87802],[-1.85082,50.89178],[-1.84077,50.90051],[-1.82693,50.89939],[-1.82006,50.90492],[-1.82151,50.91691],[-1.81689,50.92412],[-1.84114,50.92886],[-1.87446,50.91441],[-1.91129,50.9439],[-1.92339,50.95917],[-1.95751,50.97575],[-1.9591,50.99152],[-1.94907,50.98649],[-1.92879,51.00055],[-1.88709,51.0026],[-1.87393,51.0097],[-1.8717,50.99083],[-1.85433,51.00786],[-1.83567,51.01238],[-1.81502,50.9899],[-1.80031,50.99457],[-1.75184,50.98133],[-1.71927,50.98047],[-1.69142,50.95943],[-1.66829,50.95041],[-1.6526,50.95029],[-1.63536,50.96269],[-1.62397,50.95903],[-1.6089,50.97686],[-1.62172,50.98099],[-1.63115,50.99984],[-1.60984,51.01225],[-1.60173,51.01042],[-1.60787,51.01582],[-1.6057,51.02271],[-1.63542,51.03176],[-1.63858,51.04126],[-1.63107,51.07819],[-1.64025,51.09201],[-1.6306,51.10359],[-1.63408,51.11099],[-1.63067,51.11652],[-1.64109,51.12237],[-1.66525,51.12546],[-1.65724,51.15539],[-1.67474,51.177],[-1.67213,51.18708],[-1.69679,51.20233],[-1.69247,51.21617],[-1.65288,51.22301],[-1.63564,51.22019],[-1.62395,51.24136],[-1.61402,51.24467],[-1.60741,51.25513],[-1.57717,51.25863],[-1.54443,51.24826],[-1.5384,51.25085],[-1.53436,51.25919],[-1.54345,51.25957],[-1.54007,51.27602],[-1.54596,51.28095],[-1.53591,51.28978],[-1.52595,51.28975],[-1.53093,51.29948],[-1.53008,51.3111],[-1.53628,51.31596],[-1.52986,51.34057],[-1.51552,51.34219],[-1.49498,51.33228],[-1.43599,51.33861],[-1.44759,51.3464],[-1.4463,51.35699],[-1.43056,51.35941],[-1.41608,51.37517],[-1.34899,51.37045],[-1.31472,51.37627],[-1.27555,51.3707],[-1.25116,51.37511],[-1.24118,51.36938],[-1.22209,51.37271],[-1.17602,51.36102],[-1.14321,51.36028],[-1.11875,51.36156],[-1.12096,51.36859],[-1.11678,51.3767],[-1.08363,51.38712],[-1.04754,51.36122],[-0.9904,51.36619],[-0.97264,51.36297],[-0.92376,51.36937],[-0.87681,51.3555],[-0.86549,51.35947],[-0.82728,51.35574],[-0.81122,51.34418],[-0.78322,51.34084],[-0.76325,51.32721],[-0.76005,51.32013],[-0.74183,51.31112],[-0.72842,51.28238],[-0.72631,51.25653],[-0.73713,51.23126],[-0.74898,51.2277],[-0.77712,51.23901],[-0.80193,51.23628],[-0.80611,51.24056],[-0.82491,51.23137],[-0.82701,51.22315],[-0.84493,51.20998],[-0.82268,51.18268],[-0.83042,51.15022],[-0.81952,51.15047],[-0.80504,51.15847],[-0.79382,51.15491],[-0.78879,51.14141],[-0.77846,51.13664],[-0.77813,51.13063],[-0.76654,51.11946],[-0.74365,51.11491],[-0.74715,51.10131],[-0.75411,51.10116],[-0.75122,51.09547],[-0.75506,51.08987],[-0.75076,51.0852],[-0.7785,51.07715],[-0.78645,51.06467],[-0.79954,51.06078],[-0.82645,51.05881],[-0.83646,51.0664],[-0.84519,51.06052],[-0.8499,51.0436],[-0.89485,51.01978],[-0.89065,51.00194],[-0.90461,50.99327],[-0.91461,50.97806],[-0.91278,50.9708],[-0.93246,50.94278],[-0.92119,50.9232],[-0.93793,50.91615],[-0.95132,50.89178],[-0.92368,50.86513],[-0.92976,50.85365],[-0.92903,50.84245],[-0.94342,50.82191],[-0.9299,50.78445],[-0.93275,50.77435],[-0.95347,50.73682],[-1.31567,50.77809]]]},{id:"Hampshire-Aerial-RGB",name:"Hampshire Aerial RGB",type:"tms",template:"https://{switch:a,b,c}.hampshire.aerial.openstreetmap.org.uk/layer/gb_hampshire_aerial_rgb/{zoom}/{x}/{y}.png",endDate:"2013-01-01T00:00:00.000Z",startDate:"2013-01-01T00:00:00.000Z",zoomExtent:[8,20],polygon:[[[-1.31567,50.77809],[-1.49139,50.73027],[-1.57113,50.69041],[-1.68095,50.71748],[-1.69338,50.73484],[-1.69528,50.74065],[-1.68689,50.74999],[-1.71068,50.74812],[-1.7195,50.75261],[-1.746,50.74452],[-1.74845,50.75675],[-1.74287,50.76397],[-1.75101,50.77577],[-1.78525,50.76177],[-1.79911,50.77236],[-1.82256,50.77225],[-1.82678,50.78077],[-1.8225,50.79933],[-1.80732,50.80074],[-1.81566,50.80752],[-1.80889,50.81358],[-1.80579,50.83249],[-1.79816,50.83535],[-1.80649,50.84414],[-1.80988,50.86189],[-1.81378,50.85591],[-1.83052,50.85261],[-1.85271,50.85651],[-1.85655,50.86684],[-1.8492,50.87802],[-1.85082,50.89178],[-1.84077,50.90051],[-1.82693,50.89939],[-1.82006,50.90492],[-1.82151,50.91691],[-1.81689,50.92412],[-1.84114,50.92886],[-1.87446,50.91441],[-1.91129,50.9439],[-1.92339,50.95917],[-1.95751,50.97575],[-1.9591,50.99152],[-1.94907,50.98649],[-1.92879,51.00055],[-1.88709,51.0026],[-1.87393,51.0097],[-1.8717,50.99083],[-1.85433,51.00786],[-1.83567,51.01238],[-1.81502,50.9899],[-1.80031,50.99457],[-1.75184,50.98133],[-1.71927,50.98047],[-1.69142,50.95943],[-1.66829,50.95041],[-1.6526,50.95029],[-1.63536,50.96269],[-1.62397,50.95903],[-1.6089,50.97686],[-1.62172,50.98099],[-1.63115,50.99984],[-1.60984,51.01225],[-1.60173,51.01042],[-1.60787,51.01582],[-1.6057,51.02271],[-1.63542,51.03176],[-1.63858,51.04126],[-1.63107,51.07819],[-1.64025,51.09201],[-1.6306,51.10359],[-1.63408,51.11099],[-1.63067,51.11652],[-1.64109,51.12237],[-1.66525,51.12546],[-1.65724,51.15539],[-1.67474,51.177],[-1.67213,51.18708],[-1.69679,51.20233],[-1.69247,51.21617],[-1.65288,51.22301],[-1.63564,51.22019],[-1.62395,51.24136],[-1.61402,51.24467],[-1.60741,51.25513],[-1.57717,51.25863],[-1.54443,51.24826],[-1.5384,51.25085],[-1.53436,51.25919],[-1.54345,51.25957],[-1.54007,51.27602],[-1.54596,51.28095],[-1.53591,51.28978],[-1.52595,51.28975],[-1.53093,51.29948],[-1.53008,51.3111],[-1.53628,51.31596],[-1.52986,51.34057],[-1.51552,51.34219],[-1.49498,51.33228],[-1.43599,51.33861],[-1.44759,51.3464],[-1.4463,51.35699],[-1.43056,51.35941],[-1.41608,51.37517],[-1.34899,51.37045],[-1.31472,51.37627],[-1.27555,51.3707],[-1.25116,51.37511],[-1.24118,51.36938],[-1.22209,51.37271],[-1.17602,51.36102],[-1.14321,51.36028],[-1.11875,51.36156],[-1.12096,51.36859],[-1.11678,51.3767],[-1.08363,51.38712],[-1.04754,51.36122],[-0.9904,51.36619],[-0.97264,51.36297],[-0.92376,51.36937],[-0.87681,51.3555],[-0.86549,51.35947],[-0.82728,51.35574],[-0.81122,51.34418],[-0.78322,51.34084],[-0.76325,51.32721],[-0.76005,51.32013],[-0.74183,51.31112],[-0.72842,51.28238],[-0.72631,51.25653],[-0.73713,51.23126],[-0.74898,51.2277],[-0.77712,51.23901],[-0.80193,51.23628],[-0.80611,51.24056],[-0.82491,51.23137],[-0.82701,51.22315],[-0.84493,51.20998],[-0.82268,51.18268],[-0.83042,51.15022],[-0.81952,51.15047],[-0.80504,51.15847],[-0.79382,51.15491],[-0.78879,51.14141],[-0.77846,51.13664],[-0.77813,51.13063],[-0.76654,51.11946],[-0.74365,51.11491],[-0.74715,51.10131],[-0.75411,51.10116],[-0.75122,51.09547],[-0.75506,51.08987],[-0.75076,51.0852],[-0.7785,51.07715],[-0.78645,51.06467],[-0.79954,51.06078],[-0.82645,51.05881],[-0.83646,51.0664],[-0.84519,51.06052],[-0.8499,51.0436],[-0.89485,51.01978],[-0.89065,51.00194],[-0.90461,50.99327],[-0.91461,50.97806],[-0.91278,50.9708],[-0.93246,50.94278],[-0.92119,50.9232],[-0.93793,50.91615],[-0.95132,50.89178],[-0.92368,50.86513],[-0.92976,50.85365],[-0.92903,50.84245],[-0.94342,50.82191],[-0.9299,50.78445],[-0.93275,50.77435],[-0.95347,50.73682],[-1.31567,50.77809]]]},{id:"helsingborg-orto",name:"Helsingborg Orthophoto",type:"tms",template:"http://mapproxy.openstreetmap.se/tiles/1.0.0/hborg2016_EPSG3857/{zoom}/{x}/{y}.jpeg",zoomExtent:[5,20],polygon:[[[12.74345,55.94997],[12.93777,55.90804],[13.00369,55.96842],[12.79083,56.25022],[12.56698,56.1356],[12.74345,55.94997]]],terms_url:"https://helsingborg.opendatasoft.com/",terms_text:"© Helsingborg municipality",best:true,description:"Orthophotos from the municipality of Helsingborg 2016, public domain",icon:"https://upload.wikimedia.org/wikipedia/commons/thumb/1/18/Helsingborg_vapen.svg/198px-Helsingborg_vapen.svg.png"},{id:"hri-orto",name:"Helsinki region orthophoto",type:"wms",template:"https://kartta.hsy.fi/geoserver/ows?SERVICE=WMS&FORMAT=image/jpeg&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=taustakartat_ja_aluejaot:Ortoilmakuva_2017&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[0,19],polygon:[[[24.26948,59.8593],[24.26674,60.22549],[24.55307,60.36703],[24.50363,60.49038],[24.76387,60.60079],[25.00625,60.54175],[24.90051,60.38197],[24.9884,60.35073],[25.06943,60.44096],[25.17517,60.45248],[25.18066,60.34122],[25.27954,60.2943],[25.19577,60.08813],[24.26948,59.8593]]],terms_url:"https://hri.fi/data/en_GB/dataset/paakaupunkiseudun-ortokuva-2017",terms_text:"© Espoon, Helsingin ja Vantaan kaupungit, Kirkkonummen ja Nurmijärven kunnat sekä HSL ja HSY",best:true,description:"Ortophotos from the municipalities of Espoo, Helsinki, Vantaa, Kirkkonummi and Nurmijärvi + HSL and HSY",icon:"https://raw.githubusercontent.com/osmlab/editor-layer-index/gh-pages/sources/europe/fi/hri_logo.png"},{id:"hu-hillshade",name:"Hillshade Hungary",type:"tms",template:"https://{switch:a,b,c}.map.turistautak.hu/tiles/shading/{zoom}/{x}/{y}.png",zoomExtent:[0,18],polygon:[[[15,45],[24,45],[24,49],[15,49],[15,45]]],terms_text:"SRTM",overlay:true},{id:"IBGE_DF_Addresses",name:"IBGE Distrito Federal",type:"tms",template:"https://{switch:a,b,c,d}.tiles.mapbox.com/styles/v1/wille/cirnnxni1000jg8nfppc8g7pm/tiles/256/{zoom}/{x}/{y}?access_token=pk.eyJ1Ijoid2lsbGUiLCJhIjoicFNVWk5VWSJ9.hluCd0YGvYHNlFi_utWe2g",zoomExtent:[0,20],polygon:[[[-48.2444,-16.0508],[-48.2444,-15.5005],[-47.5695,-15.5005],[-47.5695,-16.0508],[-48.2444,-16.0508]]],terms_text:"IBGE",description:"Addresses data from IBGE",overlay:true},{id:"IBGE_Setores_Rurais",name:"IBGE Mapa de Setores Rurais",type:"tms",template:"https://{switch:a,b,c,d}.tiles.mapbox.com/v4/tmpsantos.i00mo1kj/{zoom}/{x}/{y}.png?access_token=pk.eyJ1Ijoib3BlbnN0cmVldG1hcCIsImEiOiJjaml5MjVyb3MwMWV0M3hxYmUzdGdwbzE4In0.q548FjhsSJzvXsGlPsFxAQ",zoomExtent:[0,14],polygon:[[[-69.94793,-4.23168],[-69.45659,-1.49119],[-69.3973,-1.36508],[-69.42989,-1.22173],[-69.39523,-1.12555],[-69.44292,-1.03351],[-69.41861,-0.99827],[-69.528,-0.92514],[-69.52577,-0.86807],[-69.62491,-0.74667],[-69.56179,-0.63692],[-69.60783,-0.5008],[-69.8446,-0.33732],[-69.92054,-0.32573],[-70.04323,-0.18998],[-70.04302,0.56359],[-69.80272,0.57162],[-69.6711,0.66759],[-69.60529,0.61328],[-69.59701,0.6542],[-69.48002,0.73577],[-69.35277,0.61416],[-69.28914,0.64997],[-69.29484,0.60389],[-69.19975,0.60591],[-69.19425,0.64982],[-69.11563,0.64484],[-69.19001,0.74056],[-69.14881,0.76751],[-69.13576,0.87204],[-69.18846,0.91324],[-69.1646,0.94156],[-69.21679,0.97245],[-69.19773,0.99974],[-69.24494,1.05655],[-69.37641,1.08794],[-69.42312,1.04265],[-69.60989,1.09826],[-69.67718,1.06994],[-69.70963,1.11817],[-69.84266,1.07272],[-69.83972,1.71893],[-69.78236,1.69244],[-69.53464,1.77691],[-69.39109,1.72935],[-68.1645,1.72945],[-68.19207,1.7797],[-68.23954,1.77044],[-68.22688,1.82918],[-68.28555,1.83084],[-68.19583,2.03479],[-68.18033,1.9767],[-68.14417,1.97854],[-68.09043,1.89774],[-67.90162,1.81165],[-67.76942,2.00924],[-67.55095,2.04769],[-67.49519,2.16312],[-67.39404,2.22894],[-67.32672,2.06387],[-67.33083,1.94158],[-67.22831,1.84127],[-67.15384,1.8315],[-67.15922,1.67504],[-67.08017,1.38546],[-67.13923,1.32002],[-67.08675,1.16704],[-66.85119,1.22896],[-66.31032,0.74494],[-66.19737,0.78161],[-66.07783,0.76174],[-66.07024,0.8123],[-65.96712,0.81511],[-65.88369,0.94159],[-65.77261,0.95859],[-65.7421,1.00125],[-65.58894,1.00471],[-65.49624,0.87415],[-65.60623,0.70748],[-65.54116,0.64881],[-65.44499,0.68921],[-65.39213,0.75692],[-65.41198,0.82415],[-65.32734,0.93596],[-65.21302,0.90282],[-65.1749,0.94131],[-65.15831,1.1246],[-65.07232,1.15303],[-65.06317,1.11205],[-65.01361,1.10905],[-64.97445,1.20288],[-64.90439,1.25153],[-64.86966,1.22713],[-64.80053,1.31527],[-64.74446,1.22569],[-64.5789,1.34041],[-64.52608,1.44322],[-64.43586,1.47006],[-64.3939,1.52901],[-64.35111,1.52921],[-64.34777,1.49508],[-64.41019,1.40301],[-64.33791,1.36134],[-64.3136,1.45617],[-64.19707,1.52071],[-64.0735,1.64902],[-64.05781,1.92899],[-63.97219,1.99194],[-63.83555,1.96644],[-63.71155,2.04645],[-63.66501,2.01861],[-63.6268,2.11222],[-63.56474,2.13571],[-63.44059,2.126],[-63.36742,2.26864],[-63.37088,2.41121],[-63.42123,2.45102],[-63.46036,2.39684],[-63.56398,2.44573],[-63.76805,2.43994],[-63.84358,2.4916],[-64.01914,2.46135],[-64.0573,2.49752],[-63.98033,2.7237],[-64.07709,2.87262],[-64.07156,2.92142],[-64.12349,2.99048],[-64.15754,2.98243],[-64.14592,3.03459],[-64.22642,3.12356],[-64.19795,3.20121],[-64.2444,3.43036],[-64.17437,3.56841],[-64.281,3.70928],[-64.54357,3.85713],[-64.72239,4.11775],[-64.80203,4.17422],[-64.81123,4.27048],[-64.69522,4.25323],[-64.623,4.135],[-64.5565,4.10529],[-64.164,4.127],[-63.964,3.868],[-63.928,3.925],[-63.85,3.95],[-63.682,3.908],[-63.676,4.019],[-63.591,3.886],[-63.497,3.84],[-63.489,3.874],[-63.434,3.865],[-63.428,3.977],[-63.204,3.952],[-63.226,3.836],[-63.103,3.794],[-63.059,3.748],[-63.081,3.694],[-62.96,3.608],[-62.835,3.739],[-62.743,3.674],[-62.729,3.805],[-62.788,3.894],[-62.753,4.032],[-62.555,4.019],[-62.552,4.109],[-62.437,4.183],[-62.14308,4.07768],[-62.071,4.126],[-62.076,4.154],[-61.982,4.181],[-61.93175,4.12009],[-61.92213,4.16126],[-61.824,4.164],[-61.802,4.229],[-61.724,4.27],[-61.56,4.252],[-61.508,4.322],[-61.513,4.406],[-61.288,4.458],[-61.323,4.535],[-61.217,4.536],[-61.14559,4.48016],[-61.095,4.522],[-60.994,4.519],[-60.932,4.587],[-60.949,4.653],[-60.899,4.717],[-60.751,4.756],[-60.591,4.927],[-60.661,5.164],[-60.73197,5.21203],[-60.434,5.182],[-60.20825,5.28346],[-60.172,5.227],[-60.135,5.249],[-60.094,5.14],[-59.96984,5.06334],[-60.02524,4.7065],[-60.0705,4.61688],[-60.15725,4.57247],[-60.16114,4.51773],[-59.79503,4.46554],[-59.66948,4.37629],[-59.7319,4.28587],[-59.73069,4.18076],[-59.61818,4.13166],[-59.65406,4.06943],[-59.58417,3.96851],[-59.5153,3.94493],[-59.59279,3.88538],[-59.59631,3.79386],[-59.66555,3.78126],[-59.66842,3.70277],[-59.86728,3.57776],[-59.80205,3.50156],[-59.8408,3.43174],[-59.80488,3.35695],[-59.907,3.212],[-59.98944,2.88185],[-59.99,2.686],[-59.895,2.482],[-59.89872,2.36245],[-59.72315,2.27614],[-59.751,1.859],[-59.677,1.839],[-59.663,1.871],[-59.69,1.757],[-59.539,1.723],[-59.381,1.507],[-59.329,1.514],[-59.327,1.464],[-59.284,1.45],[-59.253,1.389],[-58.978,1.302],[-58.918,1.317],[-58.886,1.261],[-58.912,1.239],[-58.82512,1.17127],[-58.73956,1.1999],[-58.69456,1.29732],[-58.49622,1.26796],[-58.45787,1.37145],[-58.50511,1.40317],[-58.50873,1.46295],[-58.38559,1.46999],[-58.39472,1.52651],[-58.32237,1.59702],[-58.236,1.54669],[-58.16064,1.56011],[-58.12942,1.4989],[-58.00423,1.50303],[-57.99009,1.65844],[-57.85206,1.66782],[-57.77431,1.72973],[-57.70509,1.73093],[-57.65042,1.68237],[-57.5376,1.7005],[-57.50187,1.78609],[-57.43776,1.82681],[-57.43343,1.90598],[-57.36768,1.92372],[-57.36912,1.95638],[-57.30712,1.99665],[-57.22923,1.93759],[-57.08668,2.02644],[-57.01421,1.91489],[-56.91971,1.93036],[-56.79793,1.85336],[-56.72096,1.92582],[-56.62145,1.94588],[-56.57976,1.90588],[-56.45126,1.95614],[-56.24404,1.87808],[-56.1709,1.90048],[-56.11762,1.85097],[-55.95638,1.84509],[-55.90385,1.88803],[-55.93635,1.98647],[-55.9031,2.04108],[-56.00307,2.1676],[-56.05505,2.18464],[-56.04288,2.22778],[-56.13887,2.26574],[-56.09012,2.37228],[-56.02181,2.34247],[-55.97052,2.52931],[-55.76663,2.45524],[-55.71028,2.39917],[-55.49971,2.44324],[-55.38533,2.41836],[-55.32019,2.51537],[-55.23474,2.50338],[-55.1234,2.56762],[-55.10302,2.52564],[-54.95424,2.58359],[-54.86846,2.43989],[-54.68917,2.45389],[-54.68861,2.32472],[-54.54667,2.31833],[-54.53778,2.26556],[-54.46861,2.21306],[-54.24917,2.14667],[-54.18056,2.1725],[-54.11083,2.11222],[-54.06139,2.19167],[-53.94083,2.21917],[-53.93194,2.27194],[-53.88667,2.26778],[-53.745,2.37389],[-53.73389,2.31222],[-53.52972,2.24917],[-53.45861,2.2575],[-53.32833,2.35333],[-53.21667,2.25333],[-53.27899,2.18603],[-53.11861,2.2225],[-52.99472,2.17528],[-52.90972,2.19583],[-52.84722,2.28556],[-52.67528,2.37389],[-52.59444,2.47389],[-52.54028,2.57028],[-52.56417,2.63944],[-52.43944,2.87778],[-52.39583,2.90222],[-52.33187,3.16938],[-52.21472,3.26833],[-51.97104,3.70696],[-51.92148,3.72422],[-51.922,3.7792],[-51.79731,3.88888],[-51.77783,3.97406],[-51.65867,4.05276],[-51.61325,4.17437],[-51.63716,4.50834],[-51.49427,4.67426],[-51.11466,4.42286],[-50.94232,4.20165],[-50.85475,3.92491],[-50.85507,3.45573],[-50.75331,2.94057],[-50.29908,2.33079],[-49.73896,1.79143],[-48.23746,-0.07449],[-44.84728,-1.07246],[-43.54602,-2.04705],[-43.24389,-2.12403],[-42.78189,-2.33053],[-41.78084,-2.51859],[-41.5085,-2.68486],[-40.66365,-2.63829],[-40.50396,-2.57531],[-39.8907,-2.65328],[-39.15187,-3.04444],[-38.57151,-3.48047],[-38.34306,-3.54434],[-38.21421,-3.74103],[-38.12555,-3.80544],[-37.90182,-4.07265],[-37.77934,-4.18046],[-37.63401,-4.24454],[-37.51218,-4.41535],[-37.22122,-4.51045],[-37.07874,-4.71355],[-36.91716,-4.71372],[-36.62299,-4.85815],[-36.18969,-4.88505],[-35.93627,-4.83327],[-35.56471,-4.90758],[-35.33677,-4.99239],[-35.17659,-5.12497],[-34.79469,-6.33583],[-34.71587,-6.74615],[-34.62306,-6.90323],[-34.59953,-7.11133],[-34.64374,-7.98735],[-34.81497,-8.62472],[-35.0253,-9.13761],[-35.55848,-9.81261],[-35.69663,-9.90026],[-35.96401,-10.31281],[-36.06155,-10.37447],[-36.26639,-10.64593],[-36.61764,-10.81082],[-36.78725,-10.95151],[-36.99511,-11.29602],[-37.11368,-11.41261],[-37.46002,-12.10275],[-37.89668,-12.75844],[-38.22146,-13.09717],[-38.61146,-13.26537],[-38.85337,-14.65508],[-38.74388,-15.60089],[-38.66456,-15.74741],[-38.64697,-15.88327],[-38.8013,-16.24838],[-38.92933,-16.80775],[-38.53193,-17.80026],[-38.49171,-18.0046],[-38.53661,-18.09683],[-38.67053,-18.16855],[-39.35288,-18.10892],[-39.4675,-18.30359],[-39.54529,-18.78548],[-39.49227,-19.40134],[-39.63477,-19.74403],[-39.86353,-19.88681],[-40.17827,-20.75426],[-40.81442,-21.67672],[-40.76948,-21.87786],[-40.81442,-22.09702],[-41.5086,-22.52638],[-41.59666,-22.83627],[-41.79292,-23.08823],[-41.91484,-23.18527],[-43.19603,-23.26703],[-44.07735,-23.40501],[-45.13508,-24.12014],[-46.61368,-24.67512],[-47.85376,-25.47012],[-48.2801,-26.23036],[-48.34897,-26.75081],[-48.11076,-27.28208],[-48.21148,-27.85592],[-48.40713,-28.43255],[-48.68615,-28.76016],[-48.9156,-28.86305],[-49.1579,-29.02871],[-49.52748,-29.42005],[-49.82565,-29.86559],[-50.17344,-30.64282],[-50.60441,-31.24135],[-51.18785,-31.77646],[-51.74211,-32.10539],[-51.89236,-32.29596],[-52.06117,-32.38504],[-52.27087,-32.92102],[-52.45986,-33.25369],[-52.61505,-33.42291],[-53.18109,-33.86891],[-53.43053,-33.73947],[-53.43951,-33.69347],[-53.53228,-33.6888],[-53.51819,-33.15342],[-53.44438,-33.05296],[-53.24468,-32.93489],[-53.31008,-32.91875],[-53.29454,-32.89931],[-53.18496,-32.85043],[-53.14569,-32.79202],[-53.0858,-32.78835],[-53.07558,-32.74088],[-53.24992,-32.6041],[-53.39137,-32.58573],[-53.46423,-32.48446],[-53.58321,-32.45192],[-53.74599,-32.07848],[-53.83375,-32.05524],[-53.84978,-32.00064],[-53.96073,-31.95532],[-53.96972,-31.91765],[-54.10019,-31.92825],[-54.4549,-31.65295],[-54.4528,-31.59959],[-54.58676,-31.45656],[-54.8367,-31.442],[-54.88623,-31.3773],[-54.94087,-31.38068],[-55.00723,-31.26692],[-55.07446,-31.33216],[-55.24003,-31.26062],[-55.29118,-31.14226],[-55.34037,-31.13144],[-55.34981,-31.03922],[-55.42306,-31.01823],[-55.57742,-30.83309],[-55.65834,-30.864],[-55.66621,-30.95395],[-55.723,-30.943],[-55.727,-30.979],[-55.882,-31.077],[-56.00989,-31.08267],[-56.02241,-30.78565],[-56.12508,-30.73871],[-56.17074,-30.61517],[-56.26095,-30.58509],[-56.29193,-30.51967],[-56.38177,-30.49956],[-56.46126,-30.38486],[-56.54706,-30.35946],[-56.54115,-30.31291],[-56.6187,-30.30054],[-56.64628,-30.20346],[-56.77662,-30.1633],[-56.80777,-30.10301],[-57.07113,-30.08671],[-57.22081,-30.28928],[-57.31303,-30.25785],[-57.39229,-30.30474],[-57.46574,-30.26589],[-57.52431,-30.28569],[-57.56087,-30.21134],[-57.64744,-30.19483],[-57.48047,-30.12315],[-57.33713,-29.99284],[-57.294,-29.831],[-57.121,-29.765],[-56.89888,-29.53179],[-56.81905,-29.48816],[-56.76618,-29.37768],[-56.70164,-29.35913],[-56.59315,-29.12516],[-56.418,-29.075],[-56.40775,-28.9748],[-56.29995,-28.89614],[-56.29652,-28.8027],[-56.17858,-28.75922],[-56.00984,-28.60718],[-56.01249,-28.50873],[-55.88357,-28.47923],[-55.87739,-28.36159],[-55.75157,-28.37095],[-55.69433,-28.42204],[-55.67047,-28.33218],[-55.77415,-28.27414],[-55.7757,-28.24481],[-55.63167,-28.17719],[-55.60747,-28.11604],[-55.55957,-28.16523],[-55.4952,-28.07682],[-55.44611,-28.09787],[-55.368,-28.029],[-55.38299,-27.97948],[-55.343,-27.972],[-55.32706,-27.92664],[-55.26574,-27.92969],[-55.196,-27.856],[-55.133,-27.897],[-55.106,-27.846],[-55.035,-27.858],[-55.081,-27.779],[-54.936,-27.772],[-54.90617,-27.63871],[-54.85,-27.624],[-54.814,-27.533],[-54.775,-27.586],[-54.67926,-27.57394],[-54.67709,-27.508],[-54.621,-27.541],[-54.574,-27.453],[-54.5246,-27.5059],[-54.444,-27.472],[-54.47081,-27.42674],[-54.41,-27.405],[-54.35466,-27.46528],[-54.34067,-27.40311],[-54.28484,-27.44819],[-54.261,-27.397],[-54.21736,-27.38603],[-54.172,-27.254],[-54.15619,-27.29619],[-54.08872,-27.30149],[-54.01026,-27.19978],[-53.96219,-27.19698],[-53.95195,-27.15169],[-53.79879,-27.14629],[-53.80233,-27.04028],[-53.76087,-27.06543],[-53.78585,-27.02674],[-53.7473,-27.03218],[-53.7092,-26.93414],[-53.67125,-26.94222],[-53.69684,-26.86015],[-53.66059,-26.85814],[-53.75814,-26.72045],[-53.7205,-26.65099],[-53.75864,-26.64113],[-53.63739,-26.24968],[-53.742,-26.108],[-53.73409,-26.04333],[-53.83619,-25.97166],[-53.82214,-25.79377],[-53.89113,-25.62286],[-53.94895,-25.6117],[-53.95638,-25.64628],[-54.01,-25.567],[-54.07592,-25.55766],[-54.098,-25.619],[-54.099,-25.495],[-54.206,-25.541],[-54.178,-25.584],[-54.23,-25.562],[-54.25,-25.597],[-54.28,-25.556],[-54.38395,-25.59747],[-54.43288,-25.69756],[-54.4927,-25.6181],[-54.59354,-25.59275],[-54.61941,-25.45312],[-54.4295,-25.15915],[-54.43548,-24.94769],[-54.32437,-24.66059],[-54.32714,-24.47073],[-54.25877,-24.36377],[-54.34537,-24.14705],[-54.28223,-24.07336],[-54.43984,-23.90446],[-54.66978,-23.81262],[-54.70533,-23.86452],[-54.89,-23.898],[-54.924,-23.959],[-55.06223,-23.99335],[-55.107,-23.961],[-55.22907,-24.01383],[-55.30415,-23.96504],[-55.34542,-23.99458],[-55.41423,-23.9645],[-55.44167,-23.70084],[-55.47306,-23.64834],[-55.53989,-23.625],[-55.52356,-23.19733],[-55.54199,-23.1561],[-55.59635,-23.14993],[-55.66578,-22.85274],[-55.61432,-22.65521],[-55.72364,-22.55166],[-55.74302,-22.39266],[-55.78939,-22.3846],[-55.84304,-22.28725],[-56.20983,-22.27805],[-56.36485,-22.16949],[-56.39404,-22.07434],[-56.50711,-22.09561],[-56.63705,-22.26341],[-56.70344,-22.21693],[-56.72026,-22.26479],[-56.79344,-22.24238],[-56.84285,-22.30155],[-56.88343,-22.24755],[-56.9967,-22.22246],[-57.3744,-22.23204],[-57.5804,-22.17534],[-57.6106,-22.09462],[-57.70751,-22.09111],[-57.80183,-22.15072],[-57.99384,-22.09023],[-58.00946,-22.04038],[-57.91281,-21.88266],[-57.96603,-21.85045],[-57.90866,-21.77355],[-57.94714,-21.74413],[-57.88329,-21.68903],[-57.93436,-21.65037],[-57.91387,-21.59021],[-57.96795,-21.52432],[-57.8535,-21.33109],[-57.92019,-21.27655],[-57.85066,-21.22407],[-57.86834,-21.04417],[-57.81919,-20.94066],[-57.92836,-20.90036],[-57.8552,-20.83403],[-57.89863,-20.78872],[-57.96183,-20.7916],[-57.93478,-20.74565],[-57.86732,-20.73265],[-57.92414,-20.66392],[-57.98848,-20.69879],[-57.99847,-20.43551],[-58.09339,-20.35554],[-58.09596,-20.25445],[-58.16216,-20.25953],[-58.12152,-20.19246],[-58.16932,-20.1694],[-57.95347,-20.02094],[-57.90248,-20.04207],[-57.85796,-19.9703],[-58.131,-19.758],[-57.784,-19.033],[-57.694,-19.011],[-57.719,-18.899],[-57.766,-18.899],[-57.557,-18.24],[-57.453,-18.231],[-57.574,-18.131],[-57.72302,-17.83074],[-57.68472,-17.8306],[-57.70991,-17.72702],[-57.783,-17.639],[-57.73696,-17.5583],[-57.883,-17.449],[-57.996,-17.515],[-58.06,-17.45],[-58.116,-17.451],[-58.151,-17.384],[-58.263,-17.344],[-58.396,-17.181],[-58.423,-16.989],[-58.474,-16.935],[-58.47,-16.703],[-58.436,-16.592],[-58.333,-16.49],[-58.32227,-16.26559],[-58.388,-16.261],[-58.43059,-16.32264],[-60.17335,-16.26672],[-60.238,-15.473],[-60.57543,-15.09677],[-60.244,-15.096],[-60.272,-14.62],[-60.321,-14.608],[-60.492,-14.188],[-60.479,-14.097],[-60.38066,-13.9888],[-60.45062,-13.9364],[-60.45599,-13.85422],[-60.49068,-13.85782],[-60.46776,-13.79446],[-60.76755,-13.68329],[-60.87678,-13.62149],[-60.91857,-13.54334],[-61.0056,-13.552],[-61.0129,-13.48925],[-61.0938,-13.49081],[-61.10314,-13.53056],[-61.18155,-13.50557],[-61.19236,-13.53695],[-61.29954,-13.47718],[-61.46527,-13.55427],[-61.57927,-13.48711],[-61.852,-13.538],[-61.892,-13.431],[-61.96968,-13.40759],[-61.97592,-13.36695],[-62.11498,-13.25932],[-62.115,-13.163],[-62.15254,-13.15993],[-62.16703,-13.11346],[-62.19,-13.153],[-62.214,-13.111],[-62.27269,-13.15687],[-62.39178,-13.13471],[-62.453,-13.064],[-62.612,-13.041],[-62.65,-12.965],[-62.729,-13.02],[-62.779,-13.009],[-62.89672,-12.8539],[-63.01134,-12.83602],[-63.08186,-12.72323],[-63.06163,-12.68584],[-63.15726,-12.6138],[-63.24621,-12.66222],[-63.23713,-12.69043],[-63.30125,-12.68138],[-63.44052,-12.608],[-63.43627,-12.56526],[-63.50641,-12.56562],[-63.55295,-12.50598],[-63.7848,-12.42871],[-63.88957,-12.44745],[-63.89949,-12.50204],[-63.95144,-12.53179],[-64.13464,-12.47732],[-64.16781,-12.51503],[-64.17504,-12.46675],[-64.22945,-12.45419],[-64.29018,-12.50313],[-64.29452,-12.4582],[-64.41057,-12.44436],[-64.51217,-12.3551],[-64.51256,-12.22562],[-64.70406,-12.1827],[-64.70719,-12.08684],[-64.75486,-12.15762],[-64.7688,-12.09356],[-64.83747,-12.11786],[-64.80954,-12.05633],[-64.84077,-12.01027],[-65.03548,-11.99408],[-65.01398,-11.90303],[-65.0727,-11.86587],[-65.08672,-11.7082],[-65.18953,-11.72353],[-65.18216,-11.75609],[-65.2593,-11.71053],[-65.21178,-11.52857],[-65.3074,-11.49957],[-65.33276,-11.33986],[-65.29053,-11.32275],[-65.34347,-11.3082],[-65.35834,-11.26834],[-65.35938,-11.22067],[-65.31294,-11.19578],[-65.35387,-11.18419],[-65.36177,-11.14031],[-65.28269,-11.09009],[-65.30071,-11.03142],[-65.25053,-10.98506],[-65.27476,-10.87302],[-65.35376,-10.78881],[-65.34667,-10.68155],[-65.40569,-10.63935],[-65.43011,-10.48505],[-65.288,-10.219],[-65.333,-9.965],[-65.28588,-9.84413],[-65.39313,-9.68683],[-65.44394,-9.66957],[-65.4883,-9.71015],[-65.55611,-9.84498],[-65.627,-9.83804],[-65.66963,-9.78129],[-65.71023,-9.80857],[-65.68395,-9.74992],[-65.7432,-9.78296],[-65.77013,-9.73442],[-65.79437,-9.79295],[-65.79962,-9.75663],[-65.86532,-9.79533],[-65.87184,-9.75307],[-65.91976,-9.75314],[-65.98222,-9.81011],[-66.151,-9.785],[-66.426,-9.899],[-66.435,-9.866],[-66.61995,-9.89353],[-66.63701,-9.94983],[-66.8751,-10.08268],[-66.9528,-10.18886],[-66.99683,-10.20017],[-67.01537,-10.25919],[-67.17745,-10.33923],[-67.31545,-10.31932],[-67.31155,-10.37716],[-67.40717,-10.37386],[-67.44361,-10.45492],[-67.57925,-10.5028],[-67.64028,-10.59807],[-67.67631,-10.60484],[-67.70825,-10.71083],[-67.86386,-10.64067],[-68.03289,-10.65486],[-68.10456,-10.71426],[-68.10333,-10.77541],[-68.27819,-10.98926],[-68.71576,-11.14483],[-68.75767,-11.00079],[-68.9118,-11.02192],[-69.41453,-10.92575],[-69.73653,-10.97445],[-69.76903,-10.92972],[-69.93442,-10.9219],[-70.15869,-11.04096],[-70.30672,-11.06983],[-70.43675,-11.03923],[-70.53033,-10.93465],[-70.62103,-10.99982],[-70.62338,-9.82054],[-70.53663,-9.76584],[-70.59972,-9.56264],[-70.55282,-9.57093],[-70.56894,-9.53127],[-70.50506,-9.50557],[-70.49665,-9.42489],[-70.59581,-9.4425],[-70.6632,-9.52601],[-70.75067,-9.56043],[-70.79332,-9.63846],[-70.96337,-9.74891],[-70.99391,-9.81721],[-71.13974,-9.85702],[-71.22052,-9.96968],[-72.1804,-9.99967],[-72.15136,-9.79742],[-72.26296,-9.75085],[-72.25282,-9.61633],[-72.28821,-9.60316],[-72.2829,-9.53995],[-72.35688,-9.4946],[-72.51954,-9.49128],[-72.71676,-9.4122],[-73.2038,-9.40715],[-73.07352,-9.23461],[-73.0093,-9.22236],[-73.02612,-9.17786],[-72.9582,-9.14302],[-72.94091,-8.98494],[-72.99931,-8.91778],[-73.05901,-8.90561],[-73.14992,-8.6839],[-73.20907,-8.6857],[-73.28745,-8.61948],[-73.3055,-8.47197],[-73.38956,-8.46878],[-73.41286,-8.41099],[-73.53744,-8.34587],[-73.62739,-8.02187],[-73.73175,-7.9684],[-73.7725,-7.90237],[-73.76164,-7.85803],[-73.69706,-7.86527],[-73.6843,-7.77644],[-73.82217,-7.71788],[-73.99094,-7.53635],[-73.948,-7.52661],[-73.91981,-7.46568],[-73.96394,-7.34764],[-73.87014,-7.37882],[-73.7003,-7.30429],[-73.79842,-7.11306],[-73.71046,-6.84019],[-73.53639,-6.6834],[-73.39115,-6.64193],[-73.35281,-6.59327],[-73.22741,-6.58884],[-73.18797,-6.52302],[-73.13523,-6.51046],[-73.10473,-6.40666],[-73.24664,-6.14963],[-73.23821,-6.04399],[-73.1868,-6.00512],[-73.15207,-5.86796],[-73.05303,-5.79517],[-72.95912,-5.65689],[-72.95888,-5.46613],[-72.86052,-5.27117],[-72.88725,-5.16307],[-72.73986,-5.08859],[-72.72765,-5.05199],[-72.6212,-5.0518],[-72.598,-4.98386],[-72.38202,-4.87296],[-72.36895,-4.80387],[-72.12601,-4.73454],[-72.04335,-4.62384],[-72.00689,-4.64622],[-71.99464,-4.60996],[-71.94743,-4.60877],[-71.91909,-4.5298],[-71.88549,-4.53803],[-71.9073,-4.51644],[-71.76637,-4.50446],[-71.75109,-4.46887],[-71.70817,-4.51165],[-71.65479,-4.47246],[-71.65032,-4.50395],[-71.61548,-4.4687],[-71.6335,-4.51524],[-71.59625,-4.52928],[-71.53703,-4.46442],[-71.49428,-4.48701],[-71.50716,-4.43909],[-71.43438,-4.42882],[-71.42562,-4.47058],[-71.35026,-4.42728],[-71.30752,-4.46288],[-71.32091,-4.42009],[-71.27782,-4.44217],[-71.26975,-4.385],[-71.20263,-4.37987],[-71.19422,-4.42471],[-71.14478,-4.38158],[-71.11491,-4.41119],[-71.10616,-4.37764],[-70.99389,-4.38654],[-70.99595,-4.34632],[-70.9357,-4.38432],[-70.84483,-4.27905],[-70.86447,-4.25245],[-70.81677,-4.23005],[-70.8458,-4.21872],[-70.75901,-4.15944],[-70.68147,-4.20791],[-70.64256,-4.12805],[-70.62521,-4.19151],[-70.56118,-4.1775],[-70.57357,-4.21169],[-70.54796,-4.13671],[-70.51036,-4.14824],[-70.50417,-4.20098],[-70.48535,-4.16132],[-70.43435,-4.16266],[-70.43146,-4.13217],[-70.33892,-4.17997],[-70.32281,-4.14206],[-70.28769,-4.16555],[-70.29141,-4.28709],[-70.21457,-4.29749],[-70.19194,-4.36179],[-70.15508,-4.27308],[-70.11749,-4.28585],[-70.10881,-4.25454],[-70.04189,-4.29409],[-70.07948,-4.31428],[-70.02826,-4.3703],[-69.99182,-4.37482],[-69.94793,-4.23168]],[[-34.00035,-3.76654],[-34.01797,-3.84985],[-34.00664,-3.91809],[-33.98608,-3.95952],[-33.95923,-3.99217],[-33.8921,-4.03653],[-33.81658,-4.05077],[-33.72931,-4.03151],[-33.66638,-3.9838],[-33.62736,-3.9185],[-33.61519,-3.84985],[-33.63239,-3.76864],[-33.68693,-3.69537],[-33.74987,-3.65978],[-33.81658,-3.6489],[-33.89336,-3.66397],[-33.96007,-3.70877],[-34.00035,-3.76654]],[[-32.5538,-4.00884],[-32.59937,-3.9531],[-32.64061,-3.87309],[-32.61755,-3.73712],[-32.58338,-3.70527],[-32.54228,-3.65606],[-32.4592,-3.63029],[-32.35174,-3.63887],[-32.30049,-3.67684],[-32.24749,-3.75266],[-32.23155,-3.81889],[-32.2357,-3.90247],[-32.30194,-3.9883],[-32.42898,-4.0384],[-32.5538,-4.00884]],[[-29.50321,0.79391],[-29.54097,0.8689],[-29.54727,0.92553],[-29.52367,0.99422],[-29.48958,1.06134],[-29.43136,1.10224],[-29.35899,1.1206],[-29.29238,1.11378],[-29.22158,1.0776],[-29.16285,1.00314],[-29.14501,0.92605],[-29.14764,0.88358],[-29.17176,0.8196],[-29.24885,0.74357],[-29.29448,0.72521],[-29.36371,0.71892],[-29.43556,0.73937],[-29.50321,0.79391]],[[-29.09537,-20.42649],[-29.19756,-20.33509],[-29.3343,-20.28932],[-29.46741,-20.3288],[-29.54604,-20.42958],[-29.55396,-20.52706],[-29.51696,-20.62613],[-29.40995,-20.68955],[-29.27599,-20.72578],[-29.15968,-20.66209],[-29.07188,-20.57088],[-28.9712,-20.64769],[-28.83286,-20.69814],[-28.67968,-20.62099],[-28.63549,-20.49284],[-28.63412,-20.47146],[-28.7431,-20.30094],[-28.8683,-20.27288],[-29.0031,-20.32416],[-29.09537,-20.42649]]],terms_text:"IBGE",icon:"https://osmlab.github.io/editor-layer-index/sources/south-america/br/IBGE_Setores_Rurais.png"},{id:"IBGE_Setores_Urbanos",name:"IBGE Mapa de Setores Urbanos",type:"tms",template:"https://{switch:a,b,c,d}.tiles.mapbox.com/v4/tmpsantos.hgda0m6h/{zoom}/{x}/{y}.png?access_token=pk.eyJ1Ijoib3BlbnN0cmVldG1hcCIsImEiOiJjaml5MjVyb3MwMWV0M3hxYmUzdGdwbzE4In0.q548FjhsSJzvXsGlPsFxAQ",zoomExtent:[0,19],polygon:[[[-69.94793,-4.23168],[-69.45659,-1.49119],[-69.3973,-1.36508],[-69.42989,-1.22173],[-69.39523,-1.12555],[-69.44292,-1.03351],[-69.41861,-0.99827],[-69.528,-0.92514],[-69.52577,-0.86807],[-69.62491,-0.74667],[-69.56179,-0.63692],[-69.60783,-0.5008],[-69.8446,-0.33732],[-69.92054,-0.32573],[-70.04323,-0.18998],[-70.04302,0.56359],[-69.80272,0.57162],[-69.6711,0.66759],[-69.60529,0.61328],[-69.59701,0.6542],[-69.48002,0.73577],[-69.35277,0.61416],[-69.28914,0.64997],[-69.29484,0.60389],[-69.19975,0.60591],[-69.19425,0.64982],[-69.11563,0.64484],[-69.19001,0.74056],[-69.14881,0.76751],[-69.13576,0.87204],[-69.18846,0.91324],[-69.1646,0.94156],[-69.21679,0.97245],[-69.19773,0.99974],[-69.24494,1.05655],[-69.37641,1.08794],[-69.42312,1.04265],[-69.60989,1.09826],[-69.67718,1.06994],[-69.70963,1.11817],[-69.84266,1.07272],[-69.83972,1.71893],[-69.78236,1.69244],[-69.53464,1.77691],[-69.39109,1.72935],[-68.1645,1.72945],[-68.19207,1.7797],[-68.23954,1.77044],[-68.22688,1.82918],[-68.28555,1.83084],[-68.19583,2.03479],[-68.18033,1.9767],[-68.14417,1.97854],[-68.09043,1.89774],[-67.90162,1.81165],[-67.76942,2.00924],[-67.55095,2.04769],[-67.49519,2.16312],[-67.39404,2.22894],[-67.32672,2.06387],[-67.33083,1.94158],[-67.22831,1.84127],[-67.15384,1.8315],[-67.15922,1.67504],[-67.08017,1.38546],[-67.13923,1.32002],[-67.08675,1.16704],[-66.85119,1.22896],[-66.31032,0.74494],[-66.19737,0.78161],[-66.07783,0.76174],[-66.07024,0.8123],[-65.96712,0.81511],[-65.88369,0.94159],[-65.77261,0.95859],[-65.7421,1.00125],[-65.58894,1.00471],[-65.49624,0.87415],[-65.60623,0.70748],[-65.54116,0.64881],[-65.44499,0.68921],[-65.39213,0.75692],[-65.41198,0.82415],[-65.32734,0.93596],[-65.21302,0.90282],[-65.1749,0.94131],[-65.15831,1.1246],[-65.07232,1.15303],[-65.06317,1.11205],[-65.01361,1.10905],[-64.97445,1.20288],[-64.90439,1.25153],[-64.86966,1.22713],[-64.80053,1.31527],[-64.74446,1.22569],[-64.5789,1.34041],[-64.52608,1.44322],[-64.43586,1.47006],[-64.3939,1.52901],[-64.35111,1.52921],[-64.34777,1.49508],[-64.41019,1.40301],[-64.33791,1.36134],[-64.3136,1.45617],[-64.19707,1.52071],[-64.0735,1.64902],[-64.05781,1.92899],[-63.97219,1.99194],[-63.83555,1.96644],[-63.71155,2.04645],[-63.66501,2.01861],[-63.6268,2.11222],[-63.56474,2.13571],[-63.44059,2.126],[-63.36742,2.26864],[-63.37088,2.41121],[-63.42123,2.45102],[-63.46036,2.39684],[-63.56398,2.44573],[-63.76805,2.43994],[-63.84358,2.4916],[-64.01914,2.46135],[-64.0573,2.49752],[-63.98033,2.7237],[-64.07709,2.87262],[-64.07156,2.92142],[-64.12349,2.99048],[-64.15754,2.98243],[-64.14592,3.03459],[-64.22642,3.12356],[-64.19795,3.20121],[-64.2444,3.43036],[-64.17437,3.56841],[-64.281,3.70928],[-64.54357,3.85713],[-64.72239,4.11775],[-64.80203,4.17422],[-64.81123,4.27048],[-64.69522,4.25323],[-64.623,4.135],[-64.5565,4.10529],[-64.164,4.127],[-63.964,3.868],[-63.928,3.925],[-63.85,3.95],[-63.682,3.908],[-63.676,4.019],[-63.591,3.886],[-63.497,3.84],[-63.489,3.874],[-63.434,3.865],[-63.428,3.977],[-63.204,3.952],[-63.226,3.836],[-63.103,3.794],[-63.059,3.748],[-63.081,3.694],[-62.96,3.608],[-62.835,3.739],[-62.743,3.674],[-62.729,3.805],[-62.788,3.894],[-62.753,4.032],[-62.555,4.019],[-62.552,4.109],[-62.437,4.183],[-62.14308,4.07768],[-62.071,4.126],[-62.076,4.154],[-61.982,4.181],[-61.93175,4.12009],[-61.92213,4.16126],[-61.824,4.164],[-61.802,4.229],[-61.724,4.27],[-61.56,4.252],[-61.508,4.322],[-61.513,4.406],[-61.288,4.458],[-61.323,4.535],[-61.217,4.536],[-61.14559,4.48016],[-61.095,4.522],[-60.994,4.519],[-60.932,4.587],[-60.949,4.653],[-60.899,4.717],[-60.751,4.756],[-60.591,4.927],[-60.661,5.164],[-60.73197,5.21203],[-60.434,5.182],[-60.20825,5.28346],[-60.172,5.227],[-60.135,5.249],[-60.094,5.14],[-59.96984,5.06334],[-60.02524,4.7065],[-60.0705,4.61688],[-60.15725,4.57247],[-60.16114,4.51773],[-59.79503,4.46554],[-59.66948,4.37629],[-59.7319,4.28587],[-59.73069,4.18076],[-59.61818,4.13166],[-59.65406,4.06943],[-59.58417,3.96851],[-59.5153,3.94493],[-59.59279,3.88538],[-59.59631,3.79386],[-59.66555,3.78126],[-59.66842,3.70277],[-59.86728,3.57776],[-59.80205,3.50156],[-59.8408,3.43174],[-59.80488,3.35695],[-59.907,3.212],[-59.98944,2.88185],[-59.99,2.686],[-59.895,2.482],[-59.89872,2.36245],[-59.72315,2.27614],[-59.751,1.859],[-59.677,1.839],[-59.663,1.871],[-59.69,1.757],[-59.539,1.723],[-59.381,1.507],[-59.329,1.514],[-59.327,1.464],[-59.284,1.45],[-59.253,1.389],[-58.978,1.302],[-58.918,1.317],[-58.886,1.261],[-58.912,1.239],[-58.82512,1.17127],[-58.73956,1.1999],[-58.69456,1.29732],[-58.49622,1.26796],[-58.45787,1.37145],[-58.50511,1.40317],[-58.50873,1.46295],[-58.38559,1.46999],[-58.39472,1.52651],[-58.32237,1.59702],[-58.236,1.54669],[-58.16064,1.56011],[-58.12942,1.4989],[-58.00423,1.50303],[-57.99009,1.65844],[-57.85206,1.66782],[-57.77431,1.72973],[-57.70509,1.73093],[-57.65042,1.68237],[-57.5376,1.7005],[-57.50187,1.78609],[-57.43776,1.82681],[-57.43343,1.90598],[-57.36768,1.92372],[-57.36912,1.95638],[-57.30712,1.99665],[-57.22923,1.93759],[-57.08668,2.02644],[-57.01421,1.91489],[-56.91971,1.93036],[-56.79793,1.85336],[-56.72096,1.92582],[-56.62145,1.94588],[-56.57976,1.90588],[-56.45126,1.95614],[-56.24404,1.87808],[-56.1709,1.90048],[-56.11762,1.85097],[-55.95638,1.84509],[-55.90385,1.88803],[-55.93635,1.98647],[-55.9031,2.04108],[-56.00307,2.1676],[-56.05505,2.18464],[-56.04288,2.22778],[-56.13887,2.26574],[-56.09012,2.37228],[-56.02181,2.34247],[-55.97052,2.52931],[-55.76663,2.45524],[-55.71028,2.39917],[-55.49971,2.44324],[-55.38533,2.41836],[-55.32019,2.51537],[-55.23474,2.50338],[-55.1234,2.56762],[-55.10302,2.52564],[-54.95424,2.58359],[-54.86846,2.43989],[-54.68917,2.45389],[-54.68861,2.32472],[-54.54667,2.31833],[-54.53778,2.26556],[-54.46861,2.21306],[-54.24917,2.14667],[-54.18056,2.1725],[-54.11083,2.11222],[-54.06139,2.19167],[-53.94083,2.21917],[-53.93194,2.27194],[-53.88667,2.26778],[-53.745,2.37389],[-53.73389,2.31222],[-53.52972,2.24917],[-53.45861,2.2575],[-53.32833,2.35333],[-53.21667,2.25333],[-53.27899,2.18603],[-53.11861,2.2225],[-52.99472,2.17528],[-52.90972,2.19583],[-52.84722,2.28556],[-52.67528,2.37389],[-52.59444,2.47389],[-52.54028,2.57028],[-52.56417,2.63944],[-52.43944,2.87778],[-52.39583,2.90222],[-52.33187,3.16938],[-52.21472,3.26833],[-51.97104,3.70696],[-51.92148,3.72422],[-51.922,3.7792],[-51.79731,3.88888],[-51.77783,3.97406],[-51.65867,4.05276],[-51.61325,4.17437],[-51.63716,4.50834],[-51.49427,4.67426],[-51.11466,4.42286],[-50.94232,4.20165],[-50.85475,3.92491],[-50.85507,3.45573],[-50.75331,2.94057],[-50.29908,2.33079],[-49.73896,1.79143],[-48.23746,-0.07449],[-44.84728,-1.07246],[-43.54602,-2.04705],[-43.24389,-2.12403],[-42.78189,-2.33053],[-41.78084,-2.51859],[-41.5085,-2.68486],[-40.66365,-2.63829],[-40.50396,-2.57531],[-39.8907,-2.65328],[-39.15187,-3.04444],[-38.57151,-3.48047],[-38.34306,-3.54434],[-38.21421,-3.74103],[-38.12555,-3.80544],[-37.90182,-4.07265],[-37.77934,-4.18046],[-37.63401,-4.24454],[-37.51218,-4.41535],[-37.22122,-4.51045],[-37.07874,-4.71355],[-36.91716,-4.71372],[-36.62299,-4.85815],[-36.18969,-4.88505],[-35.93627,-4.83327],[-35.56471,-4.90758],[-35.33677,-4.99239],[-35.17659,-5.12497],[-34.79469,-6.33583],[-34.71587,-6.74615],[-34.62306,-6.90323],[-34.59953,-7.11133],[-34.64374,-7.98735],[-34.81497,-8.62472],[-35.0253,-9.13761],[-35.55848,-9.81261],[-35.69663,-9.90026],[-35.96401,-10.31281],[-36.06155,-10.37447],[-36.26639,-10.64593],[-36.61764,-10.81082],[-36.78725,-10.95151],[-36.99511,-11.29602],[-37.11368,-11.41261],[-37.46002,-12.10275],[-37.89668,-12.75844],[-38.22146,-13.09717],[-38.61146,-13.26537],[-38.85337,-14.65508],[-38.74388,-15.60089],[-38.66456,-15.74741],[-38.64697,-15.88327],[-38.8013,-16.24838],[-38.92933,-16.80775],[-38.53193,-17.80026],[-38.49171,-18.0046],[-38.53661,-18.09683],[-38.67053,-18.16855],[-39.35288,-18.10892],[-39.4675,-18.30359],[-39.54529,-18.78548],[-39.49227,-19.40134],[-39.63477,-19.74403],[-39.86353,-19.88681],[-40.17827,-20.75426],[-40.81442,-21.67672],[-40.76948,-21.87786],[-40.81442,-22.09702],[-41.5086,-22.52638],[-41.59666,-22.83627],[-41.79292,-23.08823],[-41.91484,-23.18527],[-43.19603,-23.26703],[-44.07735,-23.40501],[-45.13508,-24.12014],[-46.61368,-24.67512],[-47.85376,-25.47012],[-48.2801,-26.23036],[-48.34897,-26.75081],[-48.11076,-27.28208],[-48.21148,-27.85592],[-48.40713,-28.43255],[-48.68615,-28.76016],[-48.9156,-28.86305],[-49.1579,-29.02871],[-49.52748,-29.42005],[-49.82565,-29.86559],[-50.17344,-30.64282],[-50.60441,-31.24135],[-51.18785,-31.77646],[-51.74211,-32.10539],[-51.89236,-32.29596],[-52.06117,-32.38504],[-52.27087,-32.92102],[-52.45986,-33.25369],[-52.61505,-33.42291],[-53.18109,-33.86891],[-53.43053,-33.73947],[-53.43951,-33.69347],[-53.53228,-33.6888],[-53.51819,-33.15342],[-53.44438,-33.05296],[-53.24468,-32.93489],[-53.31008,-32.91875],[-53.29454,-32.89931],[-53.18496,-32.85043],[-53.14569,-32.79202],[-53.0858,-32.78835],[-53.07558,-32.74088],[-53.24992,-32.6041],[-53.39137,-32.58573],[-53.46423,-32.48446],[-53.58321,-32.45192],[-53.74599,-32.07848],[-53.83375,-32.05524],[-53.84978,-32.00064],[-53.96073,-31.95532],[-53.96972,-31.91765],[-54.10019,-31.92825],[-54.4549,-31.65295],[-54.4528,-31.59959],[-54.58676,-31.45656],[-54.8367,-31.442],[-54.88623,-31.3773],[-54.94087,-31.38068],[-55.00723,-31.26692],[-55.07446,-31.33216],[-55.24003,-31.26062],[-55.29118,-31.14226],[-55.34037,-31.13144],[-55.34981,-31.03922],[-55.42306,-31.01823],[-55.57742,-30.83309],[-55.65834,-30.864],[-55.66621,-30.95395],[-55.723,-30.943],[-55.727,-30.979],[-55.882,-31.077],[-56.00989,-31.08267],[-56.02241,-30.78565],[-56.12508,-30.73871],[-56.17074,-30.61517],[-56.26095,-30.58509],[-56.29193,-30.51967],[-56.38177,-30.49956],[-56.46126,-30.38486],[-56.54706,-30.35946],[-56.54115,-30.31291],[-56.6187,-30.30054],[-56.64628,-30.20346],[-56.77662,-30.1633],[-56.80777,-30.10301],[-57.07113,-30.08671],[-57.22081,-30.28928],[-57.31303,-30.25785],[-57.39229,-30.30474],[-57.46574,-30.26589],[-57.52431,-30.28569],[-57.56087,-30.21134],[-57.64744,-30.19483],[-57.48047,-30.12315],[-57.33713,-29.99284],[-57.294,-29.831],[-57.121,-29.765],[-56.89888,-29.53179],[-56.81905,-29.48816],[-56.76618,-29.37768],[-56.70164,-29.35913],[-56.59315,-29.12516],[-56.418,-29.075],[-56.40775,-28.9748],[-56.29995,-28.89614],[-56.29652,-28.8027],[-56.17858,-28.75922],[-56.00984,-28.60718],[-56.01249,-28.50873],[-55.88357,-28.47923],[-55.87739,-28.36159],[-55.75157,-28.37095],[-55.69433,-28.42204],[-55.67047,-28.33218],[-55.77415,-28.27414],[-55.7757,-28.24481],[-55.63167,-28.17719],[-55.60747,-28.11604],[-55.55957,-28.16523],[-55.4952,-28.07682],[-55.44611,-28.09787],[-55.368,-28.029],[-55.38299,-27.97948],[-55.343,-27.972],[-55.32706,-27.92664],[-55.26574,-27.92969],[-55.196,-27.856],[-55.133,-27.897],[-55.106,-27.846],[-55.035,-27.858],[-55.081,-27.779],[-54.936,-27.772],[-54.90617,-27.63871],[-54.85,-27.624],[-54.814,-27.533],[-54.775,-27.586],[-54.67926,-27.57394],[-54.67709,-27.508],[-54.621,-27.541],[-54.574,-27.453],[-54.5246,-27.5059],[-54.444,-27.472],[-54.47081,-27.42674],[-54.41,-27.405],[-54.35466,-27.46528],[-54.34067,-27.40311],[-54.28484,-27.44819],[-54.261,-27.397],[-54.21736,-27.38603],[-54.172,-27.254],[-54.15619,-27.29619],[-54.08872,-27.30149],[-54.01026,-27.19978],[-53.96219,-27.19698],[-53.95195,-27.15169],[-53.79879,-27.14629],[-53.80233,-27.04028],[-53.76087,-27.06543],[-53.78585,-27.02674],[-53.7473,-27.03218],[-53.7092,-26.93414],[-53.67125,-26.94222],[-53.69684,-26.86015],[-53.66059,-26.85814],[-53.75814,-26.72045],[-53.7205,-26.65099],[-53.75864,-26.64113],[-53.63739,-26.24968],[-53.742,-26.108],[-53.73409,-26.04333],[-53.83619,-25.97166],[-53.82214,-25.79377],[-53.89113,-25.62286],[-53.94895,-25.6117],[-53.95638,-25.64628],[-54.01,-25.567],[-54.07592,-25.55766],[-54.098,-25.619],[-54.099,-25.495],[-54.206,-25.541],[-54.178,-25.584],[-54.23,-25.562],[-54.25,-25.597],[-54.28,-25.556],[-54.38395,-25.59747],[-54.43288,-25.69756],[-54.4927,-25.6181],[-54.59354,-25.59275],[-54.61941,-25.45312],[-54.4295,-25.15915],[-54.43548,-24.94769],[-54.32437,-24.66059],[-54.32714,-24.47073],[-54.25877,-24.36377],[-54.34537,-24.14705],[-54.28223,-24.07336],[-54.43984,-23.90446],[-54.66978,-23.81262],[-54.70533,-23.86452],[-54.89,-23.898],[-54.924,-23.959],[-55.06223,-23.99335],[-55.107,-23.961],[-55.22907,-24.01383],[-55.30415,-23.96504],[-55.34542,-23.99458],[-55.41423,-23.9645],[-55.44167,-23.70084],[-55.47306,-23.64834],[-55.53989,-23.625],[-55.52356,-23.19733],[-55.54199,-23.1561],[-55.59635,-23.14993],[-55.66578,-22.85274],[-55.61432,-22.65521],[-55.72364,-22.55166],[-55.74302,-22.39266],[-55.78939,-22.3846],[-55.84304,-22.28725],[-56.20983,-22.27805],[-56.36485,-22.16949],[-56.39404,-22.07434],[-56.50711,-22.09561],[-56.63705,-22.26341],[-56.70344,-22.21693],[-56.72026,-22.26479],[-56.79344,-22.24238],[-56.84285,-22.30155],[-56.88343,-22.24755],[-56.9967,-22.22246],[-57.3744,-22.23204],[-57.5804,-22.17534],[-57.6106,-22.09462],[-57.70751,-22.09111],[-57.80183,-22.15072],[-57.99384,-22.09023],[-58.00946,-22.04038],[-57.91281,-21.88266],[-57.96603,-21.85045],[-57.90866,-21.77355],[-57.94714,-21.74413],[-57.88329,-21.68903],[-57.93436,-21.65037],[-57.91387,-21.59021],[-57.96795,-21.52432],[-57.8535,-21.33109],[-57.92019,-21.27655],[-57.85066,-21.22407],[-57.86834,-21.04417],[-57.81919,-20.94066],[-57.92836,-20.90036],[-57.8552,-20.83403],[-57.89863,-20.78872],[-57.96183,-20.7916],[-57.93478,-20.74565],[-57.86732,-20.73265],[-57.92414,-20.66392],[-57.98848,-20.69879],[-57.99847,-20.43551],[-58.09339,-20.35554],[-58.09596,-20.25445],[-58.16216,-20.25953],[-58.12152,-20.19246],[-58.16932,-20.1694],[-57.95347,-20.02094],[-57.90248,-20.04207],[-57.85796,-19.9703],[-58.131,-19.758],[-57.784,-19.033],[-57.694,-19.011],[-57.719,-18.899],[-57.766,-18.899],[-57.557,-18.24],[-57.453,-18.231],[-57.574,-18.131],[-57.72302,-17.83074],[-57.68472,-17.8306],[-57.70991,-17.72702],[-57.783,-17.639],[-57.73696,-17.5583],[-57.883,-17.449],[-57.996,-17.515],[-58.06,-17.45],[-58.116,-17.451],[-58.151,-17.384],[-58.263,-17.344],[-58.396,-17.181],[-58.423,-16.989],[-58.474,-16.935],[-58.47,-16.703],[-58.436,-16.592],[-58.333,-16.49],[-58.32227,-16.26559],[-58.388,-16.261],[-58.43059,-16.32264],[-60.17335,-16.26672],[-60.238,-15.473],[-60.57543,-15.09677],[-60.244,-15.096],[-60.272,-14.62],[-60.321,-14.608],[-60.492,-14.188],[-60.479,-14.097],[-60.38066,-13.9888],[-60.45062,-13.9364],[-60.45599,-13.85422],[-60.49068,-13.85782],[-60.46776,-13.79446],[-60.76755,-13.68329],[-60.87678,-13.62149],[-60.91857,-13.54334],[-61.0056,-13.552],[-61.0129,-13.48925],[-61.0938,-13.49081],[-61.10314,-13.53056],[-61.18155,-13.50557],[-61.19236,-13.53695],[-61.29954,-13.47718],[-61.46527,-13.55427],[-61.57927,-13.48711],[-61.852,-13.538],[-61.892,-13.431],[-61.96968,-13.40759],[-61.97592,-13.36695],[-62.11498,-13.25932],[-62.115,-13.163],[-62.15254,-13.15993],[-62.16703,-13.11346],[-62.19,-13.153],[-62.214,-13.111],[-62.27269,-13.15687],[-62.39178,-13.13471],[-62.453,-13.064],[-62.612,-13.041],[-62.65,-12.965],[-62.729,-13.02],[-62.779,-13.009],[-62.89672,-12.8539],[-63.01134,-12.83602],[-63.08186,-12.72323],[-63.06163,-12.68584],[-63.15726,-12.6138],[-63.24621,-12.66222],[-63.23713,-12.69043],[-63.30125,-12.68138],[-63.44052,-12.608],[-63.43627,-12.56526],[-63.50641,-12.56562],[-63.55295,-12.50598],[-63.7848,-12.42871],[-63.88957,-12.44745],[-63.89949,-12.50204],[-63.95144,-12.53179],[-64.13464,-12.47732],[-64.16781,-12.51503],[-64.17504,-12.46675],[-64.22945,-12.45419],[-64.29018,-12.50313],[-64.29452,-12.4582],[-64.41057,-12.44436],[-64.51217,-12.3551],[-64.51256,-12.22562],[-64.70406,-12.1827],[-64.70719,-12.08684],[-64.75486,-12.15762],[-64.7688,-12.09356],[-64.83747,-12.11786],[-64.80954,-12.05633],[-64.84077,-12.01027],[-65.03548,-11.99408],[-65.01398,-11.90303],[-65.0727,-11.86587],[-65.08672,-11.7082],[-65.18953,-11.72353],[-65.18216,-11.75609],[-65.2593,-11.71053],[-65.21178,-11.52857],[-65.3074,-11.49957],[-65.33276,-11.33986],[-65.29053,-11.32275],[-65.34347,-11.3082],[-65.35834,-11.26834],[-65.35938,-11.22067],[-65.31294,-11.19578],[-65.35387,-11.18419],[-65.36177,-11.14031],[-65.28269,-11.09009],[-65.30071,-11.03142],[-65.25053,-10.98506],[-65.27476,-10.87302],[-65.35376,-10.78881],[-65.34667,-10.68155],[-65.40569,-10.63935],[-65.43011,-10.48505],[-65.288,-10.219],[-65.333,-9.965],[-65.28588,-9.84413],[-65.39313,-9.68683],[-65.44394,-9.66957],[-65.4883,-9.71015],[-65.55611,-9.84498],[-65.627,-9.83804],[-65.66963,-9.78129],[-65.71023,-9.80857],[-65.68395,-9.74992],[-65.7432,-9.78296],[-65.77013,-9.73442],[-65.79437,-9.79295],[-65.79962,-9.75663],[-65.86532,-9.79533],[-65.87184,-9.75307],[-65.91976,-9.75314],[-65.98222,-9.81011],[-66.151,-9.785],[-66.426,-9.899],[-66.435,-9.866],[-66.61995,-9.89353],[-66.63701,-9.94983],[-66.8751,-10.08268],[-66.9528,-10.18886],[-66.99683,-10.20017],[-67.01537,-10.25919],[-67.17745,-10.33923],[-67.31545,-10.31932],[-67.31155,-10.37716],[-67.40717,-10.37386],[-67.44361,-10.45492],[-67.57925,-10.5028],[-67.64028,-10.59807],[-67.67631,-10.60484],[-67.70825,-10.71083],[-67.86386,-10.64067],[-68.03289,-10.65486],[-68.10456,-10.71426],[-68.10333,-10.77541],[-68.27819,-10.98926],[-68.71576,-11.14483],[-68.75767,-11.00079],[-68.9118,-11.02192],[-69.41453,-10.92575],[-69.73653,-10.97445],[-69.76903,-10.92972],[-69.93442,-10.9219],[-70.15869,-11.04096],[-70.30672,-11.06983],[-70.43675,-11.03923],[-70.53033,-10.93465],[-70.62103,-10.99982],[-70.62338,-9.82054],[-70.53663,-9.76584],[-70.59972,-9.56264],[-70.55282,-9.57093],[-70.56894,-9.53127],[-70.50506,-9.50557],[-70.49665,-9.42489],[-70.59581,-9.4425],[-70.6632,-9.52601],[-70.75067,-9.56043],[-70.79332,-9.63846],[-70.96337,-9.74891],[-70.99391,-9.81721],[-71.13974,-9.85702],[-71.22052,-9.96968],[-72.1804,-9.99967],[-72.15136,-9.79742],[-72.26296,-9.75085],[-72.25282,-9.61633],[-72.28821,-9.60316],[-72.2829,-9.53995],[-72.35688,-9.4946],[-72.51954,-9.49128],[-72.71676,-9.4122],[-73.2038,-9.40715],[-73.07352,-9.23461],[-73.0093,-9.22236],[-73.02612,-9.17786],[-72.9582,-9.14302],[-72.94091,-8.98494],[-72.99931,-8.91778],[-73.05901,-8.90561],[-73.14992,-8.6839],[-73.20907,-8.6857],[-73.28745,-8.61948],[-73.3055,-8.47197],[-73.38956,-8.46878],[-73.41286,-8.41099],[-73.53744,-8.34587],[-73.62739,-8.02187],[-73.73175,-7.9684],[-73.7725,-7.90237],[-73.76164,-7.85803],[-73.69706,-7.86527],[-73.6843,-7.77644],[-73.82217,-7.71788],[-73.99094,-7.53635],[-73.948,-7.52661],[-73.91981,-7.46568],[-73.96394,-7.34764],[-73.87014,-7.37882],[-73.7003,-7.30429],[-73.79842,-7.11306],[-73.71046,-6.84019],[-73.53639,-6.6834],[-73.39115,-6.64193],[-73.35281,-6.59327],[-73.22741,-6.58884],[-73.18797,-6.52302],[-73.13523,-6.51046],[-73.10473,-6.40666],[-73.24664,-6.14963],[-73.23821,-6.04399],[-73.1868,-6.00512],[-73.15207,-5.86796],[-73.05303,-5.79517],[-72.95912,-5.65689],[-72.95888,-5.46613],[-72.86052,-5.27117],[-72.88725,-5.16307],[-72.73986,-5.08859],[-72.72765,-5.05199],[-72.6212,-5.0518],[-72.598,-4.98386],[-72.38202,-4.87296],[-72.36895,-4.80387],[-72.12601,-4.73454],[-72.04335,-4.62384],[-72.00689,-4.64622],[-71.99464,-4.60996],[-71.94743,-4.60877],[-71.91909,-4.5298],[-71.88549,-4.53803],[-71.9073,-4.51644],[-71.76637,-4.50446],[-71.75109,-4.46887],[-71.70817,-4.51165],[-71.65479,-4.47246],[-71.65032,-4.50395],[-71.61548,-4.4687],[-71.6335,-4.51524],[-71.59625,-4.52928],[-71.53703,-4.46442],[-71.49428,-4.48701],[-71.50716,-4.43909],[-71.43438,-4.42882],[-71.42562,-4.47058],[-71.35026,-4.42728],[-71.30752,-4.46288],[-71.32091,-4.42009],[-71.27782,-4.44217],[-71.26975,-4.385],[-71.20263,-4.37987],[-71.19422,-4.42471],[-71.14478,-4.38158],[-71.11491,-4.41119],[-71.10616,-4.37764],[-70.99389,-4.38654],[-70.99595,-4.34632],[-70.9357,-4.38432],[-70.84483,-4.27905],[-70.86447,-4.25245],[-70.81677,-4.23005],[-70.8458,-4.21872],[-70.75901,-4.15944],[-70.68147,-4.20791],[-70.64256,-4.12805],[-70.62521,-4.19151],[-70.56118,-4.1775],[-70.57357,-4.21169],[-70.54796,-4.13671],[-70.51036,-4.14824],[-70.50417,-4.20098],[-70.48535,-4.16132],[-70.43435,-4.16266],[-70.43146,-4.13217],[-70.33892,-4.17997],[-70.32281,-4.14206],[-70.28769,-4.16555],[-70.29141,-4.28709],[-70.21457,-4.29749],[-70.19194,-4.36179],[-70.15508,-4.27308],[-70.11749,-4.28585],[-70.10881,-4.25454],[-70.04189,-4.29409],[-70.07948,-4.31428],[-70.02826,-4.3703],[-69.99182,-4.37482],[-69.94793,-4.23168]],[[-34.00035,-3.76654],[-34.01797,-3.84985],[-34.00664,-3.91809],[-33.98608,-3.95952],[-33.95923,-3.99217],[-33.8921,-4.03653],[-33.81658,-4.05077],[-33.72931,-4.03151],[-33.66638,-3.9838],[-33.62736,-3.9185],[-33.61519,-3.84985],[-33.63239,-3.76864],[-33.68693,-3.69537],[-33.74987,-3.65978],[-33.81658,-3.6489],[-33.89336,-3.66397],[-33.96007,-3.70877],[-34.00035,-3.76654]],[[-32.5538,-4.00884],[-32.59937,-3.9531],[-32.64061,-3.87309],[-32.61755,-3.73712],[-32.58338,-3.70527],[-32.54228,-3.65606],[-32.4592,-3.63029],[-32.35174,-3.63887],[-32.30049,-3.67684],[-32.24749,-3.75266],[-32.23155,-3.81889],[-32.2357,-3.90247],[-32.30194,-3.9883],[-32.42898,-4.0384],[-32.5538,-4.00884]],[[-29.50321,0.79391],[-29.54097,0.8689],[-29.54727,0.92553],[-29.52367,0.99422],[-29.48958,1.06134],[-29.43136,1.10224],[-29.35899,1.1206],[-29.29238,1.11378],[-29.22158,1.0776],[-29.16285,1.00314],[-29.14501,0.92605],[-29.14764,0.88358],[-29.17176,0.8196],[-29.24885,0.74357],[-29.29448,0.72521],[-29.36371,0.71892],[-29.43556,0.73937],[-29.50321,0.79391]],[[-29.09537,-20.42649],[-29.19756,-20.33509],[-29.3343,-20.28932],[-29.46741,-20.3288],[-29.54604,-20.42958],[-29.55396,-20.52706],[-29.51696,-20.62613],[-29.40995,-20.68955],[-29.27599,-20.72578],[-29.15968,-20.66209],[-29.07188,-20.57088],[-28.9712,-20.64769],[-28.83286,-20.69814],[-28.67968,-20.62099],[-28.63549,-20.49284],[-28.63412,-20.47146],[-28.7431,-20.30094],[-28.8683,-20.27288],[-29.0031,-20.32416],[-29.09537,-20.42649]]],terms_text:"IBGE",icon:"https://osmlab.github.io/editor-layer-index/sources/south-america/br/IBGE_Setores_Rurais.png"},{id:"IBGE_BC250_Aglomerado_Rural",name:"IBGE-BC250-Aglomerado Rural Isolado",type:"wms",template:"http://www.geoservicos.ibge.gov.br/geoserver/wms?service=WMS&version=1.1.0&request=GetMap&layers=CCAR:BC250_Aglomerado_Rural_Isolado_P&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}&FORMAT=image%2Fpng&TRANSPARENT=TRUE",projection:"EPSG:3857",polygon:[[[-29.3325,2.33596],[-28.72472,2.03155],[-27.76041,-8.93703],[-27.67249,-22.20839],[-51.11495,-35.46552],[-53.39394,-33.85064],[-53.62553,-33.72493],[-53.62503,-33.15428],[-53.24498,-32.73392],[-53.65747,-32.51873],[-53.8329,-32.16592],[-54.64174,-31.55507],[-55.29638,-31.3429],[-55.57371,-30.99691],[-56.06384,-31.16749],[-56.10468,-30.86436],[-56.86862,-30.20752],[-57.39671,-30.40464],[-57.74384,-30.22142],[-55.83724,-28.16598],[-54.86969,-27.44994],[-53.9016,-27.02998],[-53.74972,-26.25781],[-53.97158,-25.74513],[-54.44723,-25.79609],[-54.67802,-25.64668],[-54.36097,-24.35145],[-54.41679,-24.06527],[-54.64355,-23.94107],[-55.22163,-24.11355],[-55.49138,-24.02797],[-55.71734,-22.68488],[-55.90555,-22.39886],[-56.45255,-22.21731],[-56.8256,-22.4002],[-57.34109,-22.34351],[-58.08472,-22.13075],[-57.95766,-20.99818],[-58.26551,-20.24147],[-58.03577,-19.95871],[-58.23083,-19.75211],[-57.64739,-18.19828],[-57.89356,-17.57377],[-58.16997,-17.53519],[-58.48825,-17.21961],[-58.57691,-16.81466],[-58.45563,-16.42158],[-60.2541,-16.32571],[-60.33481,-15.51483],[-60.67423,-15.1122],[-60.34999,-14.99707],[-60.63603,-13.84119],[-61.07283,-13.62569],[-61.9025,-13.62647],[-62.21395,-13.25048],[-62.80185,-13.10905],[-63.17194,-12.76568],[-63.74229,-12.54071],[-64.32845,-12.59578],[-65.10261,-12.0682],[-65.45781,-11.27865],[-65.41641,-9.83894],[-66.52331,-9.98587],[-67.66452,-10.80093],[-67.99778,-10.75991],[-68.52286,-11.20807],[-69.88988,-11.02776],[-70.30957,-11.1699],[-70.71896,-11.02003],[-70.68128,-9.66908],[-71.27536,-10.08971],[-72.18053,-10.09967],[-72.41623,-9.5874],[-73.29207,-9.45415],[-73.0625,-9.01727],[-73.61432,-8.40982],[-74.09056,-7.52755],[-74.03652,-7.27885],[-73.84718,-7.23829],[-73.78618,-6.77487],[-73.22362,-6.43011],[-73.33719,-6.02974],[-72.93016,-5.03871],[-71.93973,-4.42503],[-70.96802,-4.24829],[-70.79598,-4.06493],[-70.02393,-4.16735],[-69.51025,-1.13409],[-69.70776,-0.56762],[-70.13645,-0.22616],[-70.14083,0.5844],[-69.26594,0.8065],[-69.34226,0.96892],[-69.92481,1.01571],[-69.92343,1.77385],[-68.38511,1.82943],[-68.24848,2.11981],[-67.94571,1.94842],[-67.37696,2.32747],[-67.05751,1.85834],[-67.00579,1.2916],[-66.79967,1.31468],[-66.28683,0.85771],[-65.67671,1.11115],[-65.42494,0.96655],[-65.15671,1.24203],[-64.27483,1.60159],[-64.0486,2.06514],[-63.47236,2.27936],[-64.13446,2.43391],[-64.10005,2.72378],[-64.32628,3.11828],[-64.28142,3.54198],[-64.88451,4.11767],[-64.88064,4.34246],[-64.13653,4.22315],[-63.95465,4.02132],[-63.17706,4.0483],[-62.96093,3.76366],[-62.82024,4.10602],[-62.49922,4.27081],[-61.91181,4.26284],[-61.35393,4.6301],[-61.04904,4.62312],[-60.70452,4.96985],[-60.78709,5.29676],[-60.22457,5.37121],[-59.89857,5.10754],[-59.97549,4.60302],[-59.59676,4.43987],[-59.41942,3.96994],[-59.71017,3.54201],[-59.88955,2.72301],[-59.63006,2.31633],[-59.63382,1.96658],[-59.18812,1.47808],[-58.80545,1.32073],[-58.35933,1.68993],[-57.6,1.80391],[-57.39854,2.06512],[-57.12392,2.12876],[-56.02925,1.94945],[-56.23884,2.26335],[-55.98195,2.62866],[-55.64816,2.51995],[-54.93958,2.68251],[-54.24988,2.25056],[-53.73937,2.47373],[-52.98578,2.28049],[-52.65712,2.56407],[-52.41739,3.22121],[-51.73983,4.11916],[-51.7246,4.55687],[-51.0112,5.5229],[-43.48209,5.33583],[-29.3325,2.33596]]],terms_text:"IBGE",overlay:true},{id:"IBGE_BC250_Pista_Pouso",name:"IBGE-BC250-Pista de Pouso",type:"wms",template:"http://geoservicos.ibge.gov.br/geoserver/wms?service=WMS&version=1.1.0&request=GetMap&layers=CCAR:BC250_Pista_Ponto_Pouso_L&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}&FORMAT=image%2Fpng&TRANSPARENT=TRUE",projection:"EPSG:3857",polygon:[[[-29.3325,2.33596],[-28.72472,2.03155],[-27.76041,-8.93703],[-27.67249,-22.20839],[-51.11495,-35.46552],[-53.39394,-33.85064],[-53.62553,-33.72493],[-53.62503,-33.15428],[-53.24498,-32.73392],[-53.65747,-32.51873],[-53.8329,-32.16592],[-54.64174,-31.55507],[-55.29638,-31.3429],[-55.57371,-30.99691],[-56.06384,-31.16749],[-56.10468,-30.86436],[-56.86862,-30.20752],[-57.39671,-30.40464],[-57.74384,-30.22142],[-55.83724,-28.16598],[-54.86969,-27.44994],[-53.9016,-27.02998],[-53.74972,-26.25781],[-53.97158,-25.74513],[-54.44723,-25.79609],[-54.67802,-25.64668],[-54.36097,-24.35145],[-54.41679,-24.06527],[-54.64355,-23.94107],[-55.22163,-24.11355],[-55.49138,-24.02797],[-55.71734,-22.68488],[-55.90555,-22.39886],[-56.45255,-22.21731],[-56.8256,-22.4002],[-57.34109,-22.34351],[-58.08472,-22.13075],[-57.95766,-20.99818],[-58.26551,-20.24147],[-58.03577,-19.95871],[-58.23083,-19.75211],[-57.64739,-18.19828],[-57.89356,-17.57377],[-58.16997,-17.53519],[-58.48825,-17.21961],[-58.57691,-16.81466],[-58.45563,-16.42158],[-60.2541,-16.32571],[-60.33481,-15.51483],[-60.67423,-15.1122],[-60.34999,-14.99707],[-60.63603,-13.84119],[-61.07283,-13.62569],[-61.9025,-13.62647],[-62.21395,-13.25048],[-62.80185,-13.10905],[-63.17194,-12.76568],[-63.74229,-12.54071],[-64.32845,-12.59578],[-65.10261,-12.0682],[-65.45781,-11.27865],[-65.41641,-9.83894],[-66.52331,-9.98587],[-67.66452,-10.80093],[-67.99778,-10.75991],[-68.52286,-11.20807],[-69.88988,-11.02776],[-70.30957,-11.1699],[-70.71896,-11.02003],[-70.68128,-9.66908],[-71.27536,-10.08971],[-72.18053,-10.09967],[-72.41623,-9.5874],[-73.29207,-9.45415],[-73.0625,-9.01727],[-73.61432,-8.40982],[-74.09056,-7.52755],[-74.03652,-7.27885],[-73.84718,-7.23829],[-73.78618,-6.77487],[-73.22362,-6.43011],[-73.33719,-6.02974],[-72.93016,-5.03871],[-71.93973,-4.42503],[-70.96802,-4.24829],[-70.79598,-4.06493],[-70.02393,-4.16735],[-69.51025,-1.13409],[-69.70776,-0.56762],[-70.13645,-0.22616],[-70.14083,0.5844],[-69.26594,0.8065],[-69.34226,0.96892],[-69.92481,1.01571],[-69.92343,1.77385],[-68.38511,1.82943],[-68.24848,2.11981],[-67.94571,1.94842],[-67.37696,2.32747],[-67.05751,1.85834],[-67.00579,1.2916],[-66.79967,1.31468],[-66.28683,0.85771],[-65.67671,1.11115],[-65.42494,0.96655],[-65.15671,1.24203],[-64.27483,1.60159],[-64.0486,2.06514],[-63.47236,2.27936],[-64.13446,2.43391],[-64.10005,2.72378],[-64.32628,3.11828],[-64.28142,3.54198],[-64.88451,4.11767],[-64.88064,4.34246],[-64.13653,4.22315],[-63.95465,4.02132],[-63.17706,4.0483],[-62.96093,3.76366],[-62.82024,4.10602],[-62.49922,4.27081],[-61.91181,4.26284],[-61.35393,4.6301],[-61.04904,4.62312],[-60.70452,4.96985],[-60.78709,5.29676],[-60.22457,5.37121],[-59.89857,5.10754],[-59.97549,4.60302],[-59.59676,4.43987],[-59.41942,3.96994],[-59.71017,3.54201],[-59.88955,2.72301],[-59.63006,2.31633],[-59.63382,1.96658],[-59.18812,1.47808],[-58.80545,1.32073],[-58.35933,1.68993],[-57.6,1.80391],[-57.39854,2.06512],[-57.12392,2.12876],[-56.02925,1.94945],[-56.23884,2.26335],[-55.98195,2.62866],[-55.64816,2.51995],[-54.93958,2.68251],[-54.24988,2.25056],[-53.73937,2.47373],[-52.98578,2.28049],[-52.65712,2.56407],[-52.41739,3.22121],[-51.73983,4.11916],[-51.7246,4.55687],[-51.0112,5.5229],[-43.48209,5.33583],[-29.3325,2.33596]]],terms_text:"IBGE",overlay:true},{id:"IBGE_BC250_Rios_Drenagem",name:"IBGE-BC250-Rios Drenagem",type:"wms",template:"http://www.geoservicos.ibge.gov.br/geoserver/wms?service=WMS&version=1.1.0&request=GetMap&layers=CCAR:BC250_Trecho_Drenagem_L&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}&FORMAT=image%2Fpng&TRANSPARENT=TRUE",projection:"EPSG:3857",polygon:[[[-29.3325,2.33596],[-28.72472,2.03155],[-27.76041,-8.93703],[-27.67249,-22.20839],[-51.11495,-35.46552],[-53.39394,-33.85064],[-53.62553,-33.72493],[-53.62503,-33.15428],[-53.24498,-32.73392],[-53.65747,-32.51873],[-53.8329,-32.16592],[-54.64174,-31.55507],[-55.29638,-31.3429],[-55.57371,-30.99691],[-56.06384,-31.16749],[-56.10468,-30.86436],[-56.86862,-30.20752],[-57.39671,-30.40464],[-57.74384,-30.22142],[-55.83724,-28.16598],[-54.86969,-27.44994],[-53.9016,-27.02998],[-53.74972,-26.25781],[-53.97158,-25.74513],[-54.44723,-25.79609],[-54.67802,-25.64668],[-54.36097,-24.35145],[-54.41679,-24.06527],[-54.64355,-23.94107],[-55.22163,-24.11355],[-55.49138,-24.02797],[-55.71734,-22.68488],[-55.90555,-22.39886],[-56.45255,-22.21731],[-56.8256,-22.4002],[-57.34109,-22.34351],[-58.08472,-22.13075],[-57.95766,-20.99818],[-58.26551,-20.24147],[-58.03577,-19.95871],[-58.23083,-19.75211],[-57.64739,-18.19828],[-57.89356,-17.57377],[-58.16997,-17.53519],[-58.48825,-17.21961],[-58.57691,-16.81466],[-58.45563,-16.42158],[-60.2541,-16.32571],[-60.33481,-15.51483],[-60.67423,-15.1122],[-60.34999,-14.99707],[-60.63603,-13.84119],[-61.07283,-13.62569],[-61.9025,-13.62647],[-62.21395,-13.25048],[-62.80185,-13.10905],[-63.17194,-12.76568],[-63.74229,-12.54071],[-64.32845,-12.59578],[-65.10261,-12.0682],[-65.45781,-11.27865],[-65.41641,-9.83894],[-66.52331,-9.98587],[-67.66452,-10.80093],[-67.99778,-10.75991],[-68.52286,-11.20807],[-69.88988,-11.02776],[-70.30957,-11.1699],[-70.71896,-11.02003],[-70.68128,-9.66908],[-71.27536,-10.08971],[-72.18053,-10.09967],[-72.41623,-9.5874],[-73.29207,-9.45415],[-73.0625,-9.01727],[-73.61432,-8.40982],[-74.09056,-7.52755],[-74.03652,-7.27885],[-73.84718,-7.23829],[-73.78618,-6.77487],[-73.22362,-6.43011],[-73.33719,-6.02974],[-72.93016,-5.03871],[-71.93973,-4.42503],[-70.96802,-4.24829],[-70.79598,-4.06493],[-70.02393,-4.16735],[-69.51025,-1.13409],[-69.70776,-0.56762],[-70.13645,-0.22616],[-70.14083,0.5844],[-69.26594,0.8065],[-69.34226,0.96892],[-69.92481,1.01571],[-69.92343,1.77385],[-68.38511,1.82943],[-68.24848,2.11981],[-67.94571,1.94842],[-67.37696,2.32747],[-67.05751,1.85834],[-67.00579,1.2916],[-66.79967,1.31468],[-66.28683,0.85771],[-65.67671,1.11115],[-65.42494,0.96655],[-65.15671,1.24203],[-64.27483,1.60159],[-64.0486,2.06514],[-63.47236,2.27936],[-64.13446,2.43391],[-64.10005,2.72378],[-64.32628,3.11828],[-64.28142,3.54198],[-64.88451,4.11767],[-64.88064,4.34246],[-64.13653,4.22315],[-63.95465,4.02132],[-63.17706,4.0483],[-62.96093,3.76366],[-62.82024,4.10602],[-62.49922,4.27081],[-61.91181,4.26284],[-61.35393,4.6301],[-61.04904,4.62312],[-60.70452,4.96985],[-60.78709,5.29676],[-60.22457,5.37121],[-59.89857,5.10754],[-59.97549,4.60302],[-59.59676,4.43987],[-59.41942,3.96994],[-59.71017,3.54201],[-59.88955,2.72301],[-59.63006,2.31633],[-59.63382,1.96658],[-59.18812,1.47808],[-58.80545,1.32073],[-58.35933,1.68993],[-57.6,1.80391],[-57.39854,2.06512],[-57.12392,2.12876],[-56.02925,1.94945],[-56.23884,2.26335],[-55.98195,2.62866],[-55.64816,2.51995],[-54.93958,2.68251],[-54.24988,2.25056],[-53.73937,2.47373],[-52.98578,2.28049],[-52.65712,2.56407],[-52.41739,3.22121],[-51.73983,4.11916],[-51.7246,4.55687],[-51.0112,5.5229],[-43.48209,5.33583],[-29.3325,2.33596]]],terms_text:"IBGE",overlay:true},{id:"IBGE_BC250_Terra_Indegina",name:"IBGE-BC250-Terra Indigena",type:"wms",template:"http://geoservicos.ibge.gov.br/geoserver/wms?service=WMS&version=1.1.0&request=GetMap&layers=CCAR:BC250_Terra_Indigena_A&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}&FORMAT=image%2Fpng&TRANSPARENT=TRUE",projection:"EPSG:3857",polygon:[[[-29.3325,2.33596],[-28.72472,2.03155],[-27.76041,-8.93703],[-27.67249,-22.20839],[-51.11495,-35.46552],[-53.39394,-33.85064],[-53.62553,-33.72493],[-53.62503,-33.15428],[-53.24498,-32.73392],[-53.65747,-32.51873],[-53.8329,-32.16592],[-54.64174,-31.55507],[-55.29638,-31.3429],[-55.57371,-30.99691],[-56.06384,-31.16749],[-56.10468,-30.86436],[-56.86862,-30.20752],[-57.39671,-30.40464],[-57.74384,-30.22142],[-55.83724,-28.16598],[-54.86969,-27.44994],[-53.9016,-27.02998],[-53.74972,-26.25781],[-53.97158,-25.74513],[-54.44723,-25.79609],[-54.67802,-25.64668],[-54.36097,-24.35145],[-54.41679,-24.06527],[-54.64355,-23.94107],[-55.22163,-24.11355],[-55.49138,-24.02797],[-55.71734,-22.68488],[-55.90555,-22.39886],[-56.45255,-22.21731],[-56.8256,-22.4002],[-57.34109,-22.34351],[-58.08472,-22.13075],[-57.95766,-20.99818],[-58.26551,-20.24147],[-58.03577,-19.95871],[-58.23083,-19.75211],[-57.64739,-18.19828],[-57.89356,-17.57377],[-58.16997,-17.53519],[-58.48825,-17.21961],[-58.57691,-16.81466],[-58.45563,-16.42158],[-60.2541,-16.32571],[-60.33481,-15.51483],[-60.67423,-15.1122],[-60.34999,-14.99707],[-60.63603,-13.84119],[-61.07283,-13.62569],[-61.9025,-13.62647],[-62.21395,-13.25048],[-62.80185,-13.10905],[-63.17194,-12.76568],[-63.74229,-12.54071],[-64.32845,-12.59578],[-65.10261,-12.0682],[-65.45781,-11.27865],[-65.41641,-9.83894],[-66.52331,-9.98587],[-67.66452,-10.80093],[-67.99778,-10.75991],[-68.52286,-11.20807],[-69.88988,-11.02776],[-70.30957,-11.1699],[-70.71896,-11.02003],[-70.68128,-9.66908],[-71.27536,-10.08971],[-72.18053,-10.09967],[-72.41623,-9.5874],[-73.29207,-9.45415],[-73.0625,-9.01727],[-73.61432,-8.40982],[-74.09056,-7.52755],[-74.03652,-7.27885],[-73.84718,-7.23829],[-73.78618,-6.77487],[-73.22362,-6.43011],[-73.33719,-6.02974],[-72.93016,-5.03871],[-71.93973,-4.42503],[-70.96802,-4.24829],[-70.79598,-4.06493],[-70.02393,-4.16735],[-69.51025,-1.13409],[-69.70776,-0.56762],[-70.13645,-0.22616],[-70.14083,0.5844],[-69.26594,0.8065],[-69.34226,0.96892],[-69.92481,1.01571],[-69.92343,1.77385],[-68.38511,1.82943],[-68.24848,2.11981],[-67.94571,1.94842],[-67.37696,2.32747],[-67.05751,1.85834],[-67.00579,1.2916],[-66.79967,1.31468],[-66.28683,0.85771],[-65.67671,1.11115],[-65.42494,0.96655],[-65.15671,1.24203],[-64.27483,1.60159],[-64.0486,2.06514],[-63.47236,2.27936],[-64.13446,2.43391],[-64.10005,2.72378],[-64.32628,3.11828],[-64.28142,3.54198],[-64.88451,4.11767],[-64.88064,4.34246],[-64.13653,4.22315],[-63.95465,4.02132],[-63.17706,4.0483],[-62.96093,3.76366],[-62.82024,4.10602],[-62.49922,4.27081],[-61.91181,4.26284],[-61.35393,4.6301],[-61.04904,4.62312],[-60.70452,4.96985],[-60.78709,5.29676],[-60.22457,5.37121],[-59.89857,5.10754],[-59.97549,4.60302],[-59.59676,4.43987],[-59.41942,3.96994],[-59.71017,3.54201],[-59.88955,2.72301],[-59.63006,2.31633],[-59.63382,1.96658],[-59.18812,1.47808],[-58.80545,1.32073],[-58.35933,1.68993],[-57.6,1.80391],[-57.39854,2.06512],[-57.12392,2.12876],[-56.02925,1.94945],[-56.23884,2.26335],[-55.98195,2.62866],[-55.64816,2.51995],[-54.93958,2.68251],[-54.24988,2.25056],[-53.73937,2.47373],[-52.98578,2.28049],[-52.65712,2.56407],[-52.41739,3.22121],[-51.73983,4.11916],[-51.7246,4.55687],[-51.0112,5.5229],[-43.48209,5.33583],[-29.3325,2.33596]]],terms_text:"IBGE",overlay:true},{id:"IBGE_BC250_Rodoviario",name:"IBGE-BC250-Trecho Rodoviario",type:"wms",template:"http://geoservicos.ibge.gov.br/geoserver/wms?service=WMS&version=1.1.0&request=GetMap&layers=CCAR:BC250_Trecho_Rodoviario_L&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}&FORMAT=image/png&TRANSPARENT=TRUE",projection:"EPSG:3857",polygon:[[[-29.3325,2.33596],[-28.72472,2.03155],[-27.76041,-8.93703],[-27.67249,-22.20839],[-51.11495,-35.46552],[-53.39394,-33.85064],[-53.62553,-33.72493],[-53.62503,-33.15428],[-53.24498,-32.73392],[-53.65747,-32.51873],[-53.8329,-32.16592],[-54.64174,-31.55507],[-55.29638,-31.3429],[-55.57371,-30.99691],[-56.06384,-31.16749],[-56.10468,-30.86436],[-56.86862,-30.20752],[-57.39671,-30.40464],[-57.74384,-30.22142],[-55.83724,-28.16598],[-54.86969,-27.44994],[-53.9016,-27.02998],[-53.74972,-26.25781],[-53.97158,-25.74513],[-54.44723,-25.79609],[-54.67802,-25.64668],[-54.36097,-24.35145],[-54.41679,-24.06527],[-54.64355,-23.94107],[-55.22163,-24.11355],[-55.49138,-24.02797],[-55.71734,-22.68488],[-55.90555,-22.39886],[-56.45255,-22.21731],[-56.8256,-22.4002],[-57.34109,-22.34351],[-58.08472,-22.13075],[-57.95766,-20.99818],[-58.26551,-20.24147],[-58.03577,-19.95871],[-58.23083,-19.75211],[-57.64739,-18.19828],[-57.89356,-17.57377],[-58.16997,-17.53519],[-58.48825,-17.21961],[-58.57691,-16.81466],[-58.45563,-16.42158],[-60.2541,-16.32571],[-60.33481,-15.51483],[-60.67423,-15.1122],[-60.34999,-14.99707],[-60.63603,-13.84119],[-61.07283,-13.62569],[-61.9025,-13.62647],[-62.21395,-13.25048],[-62.80185,-13.10905],[-63.17194,-12.76568],[-63.74229,-12.54071],[-64.32845,-12.59578],[-65.10261,-12.0682],[-65.45781,-11.27865],[-65.41641,-9.83894],[-66.52331,-9.98587],[-67.66452,-10.80093],[-67.99778,-10.75991],[-68.52286,-11.20807],[-69.88988,-11.02776],[-70.30957,-11.1699],[-70.71896,-11.02003],[-70.68128,-9.66908],[-71.27536,-10.08971],[-72.18053,-10.09967],[-72.41623,-9.5874],[-73.29207,-9.45415],[-73.0625,-9.01727],[-73.61432,-8.40982],[-74.09056,-7.52755],[-74.03652,-7.27885],[-73.84718,-7.23829],[-73.78618,-6.77487],[-73.22362,-6.43011],[-73.33719,-6.02974],[-72.93016,-5.03871],[-71.93973,-4.42503],[-70.96802,-4.24829],[-70.79598,-4.06493],[-70.02393,-4.16735],[-69.51025,-1.13409],[-69.70776,-0.56762],[-70.13645,-0.22616],[-70.14083,0.5844],[-69.26594,0.8065],[-69.34226,0.96892],[-69.92481,1.01571],[-69.92343,1.77385],[-68.38511,1.82943],[-68.24848,2.11981],[-67.94571,1.94842],[-67.37696,2.32747],[-67.05751,1.85834],[-67.00579,1.2916],[-66.79967,1.31468],[-66.28683,0.85771],[-65.67671,1.11115],[-65.42494,0.96655],[-65.15671,1.24203],[-64.27483,1.60159],[-64.0486,2.06514],[-63.47236,2.27936],[-64.13446,2.43391],[-64.10005,2.72378],[-64.32628,3.11828],[-64.28142,3.54198],[-64.88451,4.11767],[-64.88064,4.34246],[-64.13653,4.22315],[-63.95465,4.02132],[-63.17706,4.0483],[-62.96093,3.76366],[-62.82024,4.10602],[-62.49922,4.27081],[-61.91181,4.26284],[-61.35393,4.6301],[-61.04904,4.62312],[-60.70452,4.96985],[-60.78709,5.29676],[-60.22457,5.37121],[-59.89857,5.10754],[-59.97549,4.60302],[-59.59676,4.43987],[-59.41942,3.96994],[-59.71017,3.54201],[-59.88955,2.72301],[-59.63006,2.31633],[-59.63382,1.96658],[-59.18812,1.47808],[-58.80545,1.32073],[-58.35933,1.68993],[-57.6,1.80391],[-57.39854,2.06512],[-57.12392,2.12876],[-56.02925,1.94945],[-56.23884,2.26335],[-55.98195,2.62866],[-55.64816,2.51995],[-54.93958,2.68251],[-54.24988,2.25056],[-53.73937,2.47373],[-52.98578,2.28049],[-52.65712,2.56407],[-52.41739,3.22121],[-51.73983,4.11916],[-51.7246,4.55687],[-51.0112,5.5229],[-43.48209,5.33583],[-29.3325,2.33596]]],terms_text:"IBGE",overlay:true},{id:"IBGE_BC250_Uso_Sustentavel",name:"IBGE-BC250-Unidade de Uso Sistentável - APA",type:"wms",template:"http://geoservicos.ibge.gov.br/geoserver/wms?service=WMS&version=1.1.0&request=GetMap&layers=CCAR:BC250_Unidade_Uso_Sustentavel_A&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}&FORMAT=image%2Fpng&TRANSPARENT=TRUE",projection:"EPSG:3857",polygon:[[[-29.3325,2.33596],[-28.72472,2.03155],[-27.76041,-8.93703],[-27.67249,-22.20839],[-51.11495,-35.46552],[-53.39394,-33.85064],[-53.62553,-33.72493],[-53.62503,-33.15428],[-53.24498,-32.73392],[-53.65747,-32.51873],[-53.8329,-32.16592],[-54.64174,-31.55507],[-55.29638,-31.3429],[-55.57371,-30.99691],[-56.06384,-31.16749],[-56.10468,-30.86436],[-56.86862,-30.20752],[-57.39671,-30.40464],[-57.74384,-30.22142],[-55.83724,-28.16598],[-54.86969,-27.44994],[-53.9016,-27.02998],[-53.74972,-26.25781],[-53.97158,-25.74513],[-54.44723,-25.79609],[-54.67802,-25.64668],[-54.36097,-24.35145],[-54.41679,-24.06527],[-54.64355,-23.94107],[-55.22163,-24.11355],[-55.49138,-24.02797],[-55.71734,-22.68488],[-55.90555,-22.39886],[-56.45255,-22.21731],[-56.8256,-22.4002],[-57.34109,-22.34351],[-58.08472,-22.13075],[-57.95766,-20.99818],[-58.26551,-20.24147],[-58.03577,-19.95871],[-58.23083,-19.75211],[-57.64739,-18.19828],[-57.89356,-17.57377],[-58.16997,-17.53519],[-58.48825,-17.21961],[-58.57691,-16.81466],[-58.45563,-16.42158],[-60.2541,-16.32571],[-60.33481,-15.51483],[-60.67423,-15.1122],[-60.34999,-14.99707],[-60.63603,-13.84119],[-61.07283,-13.62569],[-61.9025,-13.62647],[-62.21395,-13.25048],[-62.80185,-13.10905],[-63.17194,-12.76568],[-63.74229,-12.54071],[-64.32845,-12.59578],[-65.10261,-12.0682],[-65.45781,-11.27865],[-65.41641,-9.83894],[-66.52331,-9.98587],[-67.66452,-10.80093],[-67.99778,-10.75991],[-68.52286,-11.20807],[-69.88988,-11.02776],[-70.30957,-11.1699],[-70.71896,-11.02003],[-70.68128,-9.66908],[-71.27536,-10.08971],[-72.18053,-10.09967],[-72.41623,-9.5874],[-73.29207,-9.45415],[-73.0625,-9.01727],[-73.61432,-8.40982],[-74.09056,-7.52755],[-74.03652,-7.27885],[-73.84718,-7.23829],[-73.78618,-6.77487],[-73.22362,-6.43011],[-73.33719,-6.02974],[-72.93016,-5.03871],[-71.93973,-4.42503],[-70.96802,-4.24829],[-70.79598,-4.06493],[-70.02393,-4.16735],[-69.51025,-1.13409],[-69.70776,-0.56762],[-70.13645,-0.22616],[-70.14083,0.5844],[-69.26594,0.8065],[-69.34226,0.96892],[-69.92481,1.01571],[-69.92343,1.77385],[-68.38511,1.82943],[-68.24848,2.11981],[-67.94571,1.94842],[-67.37696,2.32747],[-67.05751,1.85834],[-67.00579,1.2916],[-66.79967,1.31468],[-66.28683,0.85771],[-65.67671,1.11115],[-65.42494,0.96655],[-65.15671,1.24203],[-64.27483,1.60159],[-64.0486,2.06514],[-63.47236,2.27936],[-64.13446,2.43391],[-64.10005,2.72378],[-64.32628,3.11828],[-64.28142,3.54198],[-64.88451,4.11767],[-64.88064,4.34246],[-64.13653,4.22315],[-63.95465,4.02132],[-63.17706,4.0483],[-62.96093,3.76366],[-62.82024,4.10602],[-62.49922,4.27081],[-61.91181,4.26284],[-61.35393,4.6301],[-61.04904,4.62312],[-60.70452,4.96985],[-60.78709,5.29676],[-60.22457,5.37121],[-59.89857,5.10754],[-59.97549,4.60302],[-59.59676,4.43987],[-59.41942,3.96994],[-59.71017,3.54201],[-59.88955,2.72301],[-59.63006,2.31633],[-59.63382,1.96658],[-59.18812,1.47808],[-58.80545,1.32073],[-58.35933,1.68993],[-57.6,1.80391],[-57.39854,2.06512],[-57.12392,2.12876],[-56.02925,1.94945],[-56.23884,2.26335],[-55.98195,2.62866],[-55.64816,2.51995],[-54.93958,2.68251],[-54.24988,2.25056],[-53.73937,2.47373],[-52.98578,2.28049],[-52.65712,2.56407],[-52.41739,3.22121],[-51.73983,4.11916],[-51.7246,4.55687],[-51.0112,5.5229],[-43.48209,5.33583],[-29.3325,2.33596]]],terms_text:"IBGE",overlay:true},{id:"IBGE_BC250_Villa",name:"IBGE-BC250-Villa",type:"wms",template:"http://geoservicos.ibge.gov.br/geoserver/wms?service=WMS&version=1.1.0&request=GetMap&layers=CCAR:BC250_Vila_P&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}&FORMAT=image%2Fpng&TRANSPARENT=TRUE",projection:"EPSG:3857",polygon:[[[-29.3325,2.33596],[-28.72472,2.03155],[-27.76041,-8.93703],[-27.67249,-22.20839],[-51.11495,-35.46552],[-53.39394,-33.85064],[-53.62553,-33.72493],[-53.62503,-33.15428],[-53.24498,-32.73392],[-53.65747,-32.51873],[-53.8329,-32.16592],[-54.64174,-31.55507],[-55.29638,-31.3429],[-55.57371,-30.99691],[-56.06384,-31.16749],[-56.10468,-30.86436],[-56.86862,-30.20752],[-57.39671,-30.40464],[-57.74384,-30.22142],[-55.83724,-28.16598],[-54.86969,-27.44994],[-53.9016,-27.02998],[-53.74972,-26.25781],[-53.97158,-25.74513],[-54.44723,-25.79609],[-54.67802,-25.64668],[-54.36097,-24.35145],[-54.41679,-24.06527],[-54.64355,-23.94107],[-55.22163,-24.11355],[-55.49138,-24.02797],[-55.71734,-22.68488],[-55.90555,-22.39886],[-56.45255,-22.21731],[-56.8256,-22.4002],[-57.34109,-22.34351],[-58.08472,-22.13075],[-57.95766,-20.99818],[-58.26551,-20.24147],[-58.03577,-19.95871],[-58.23083,-19.75211],[-57.64739,-18.19828],[-57.89356,-17.57377],[-58.16997,-17.53519],[-58.48825,-17.21961],[-58.57691,-16.81466],[-58.45563,-16.42158],[-60.2541,-16.32571],[-60.33481,-15.51483],[-60.67423,-15.1122],[-60.34999,-14.99707],[-60.63603,-13.84119],[-61.07283,-13.62569],[-61.9025,-13.62647],[-62.21395,-13.25048],[-62.80185,-13.10905],[-63.17194,-12.76568],[-63.74229,-12.54071],[-64.32845,-12.59578],[-65.10261,-12.0682],[-65.45781,-11.27865],[-65.41641,-9.83894],[-66.52331,-9.98587],[-67.66452,-10.80093],[-67.99778,-10.75991],[-68.52286,-11.20807],[-69.88988,-11.02776],[-70.30957,-11.1699],[-70.71896,-11.02003],[-70.68128,-9.66908],[-71.27536,-10.08971],[-72.18053,-10.09967],[-72.41623,-9.5874],[-73.29207,-9.45415],[-73.0625,-9.01727],[-73.61432,-8.40982],[-74.09056,-7.52755],[-74.03652,-7.27885],[-73.84718,-7.23829],[-73.78618,-6.77487],[-73.22362,-6.43011],[-73.33719,-6.02974],[-72.93016,-5.03871],[-71.93973,-4.42503],[-70.96802,-4.24829],[-70.79598,-4.06493],[-70.02393,-4.16735],[-69.51025,-1.13409],[-69.70776,-0.56762],[-70.13645,-0.22616],[-70.14083,0.5844],[-69.26594,0.8065],[-69.34226,0.96892],[-69.92481,1.01571],[-69.92343,1.77385],[-68.38511,1.82943],[-68.24848,2.11981],[-67.94571,1.94842],[-67.37696,2.32747],[-67.05751,1.85834],[-67.00579,1.2916],[-66.79967,1.31468],[-66.28683,0.85771],[-65.67671,1.11115],[-65.42494,0.96655],[-65.15671,1.24203],[-64.27483,1.60159],[-64.0486,2.06514],[-63.47236,2.27936],[-64.13446,2.43391],[-64.10005,2.72378],[-64.32628,3.11828],[-64.28142,3.54198],[-64.88451,4.11767],[-64.88064,4.34246],[-64.13653,4.22315],[-63.95465,4.02132],[-63.17706,4.0483],[-62.96093,3.76366],[-62.82024,4.10602],[-62.49922,4.27081],[-61.91181,4.26284],[-61.35393,4.6301],[-61.04904,4.62312],[-60.70452,4.96985],[-60.78709,5.29676],[-60.22457,5.37121],[-59.89857,5.10754],[-59.97549,4.60302],[-59.59676,4.43987],[-59.41942,3.96994],[-59.71017,3.54201],[-59.88955,2.72301],[-59.63006,2.31633],[-59.63382,1.96658],[-59.18812,1.47808],[-58.80545,1.32073],[-58.35933,1.68993],[-57.6,1.80391],[-57.39854,2.06512],[-57.12392,2.12876],[-56.02925,1.94945],[-56.23884,2.26335],[-55.98195,2.62866],[-55.64816,2.51995],[-54.93958,2.68251],[-54.24988,2.25056],[-53.73937,2.47373],[-52.98578,2.28049],[-52.65712,2.56407],[-52.41739,3.22121],[-51.73983,4.11916],[-51.7246,4.55687],[-51.0112,5.5229],[-43.48209,5.33583],[-29.3325,2.33596]]],terms_text:"IBGE",overlay:true},{id:"IBGE_BCIM_Gerador_Eletrica",name:"IBGE-BCIM-Estações Geradora de Energia Elétrica",type:"wms",template:"http://www.geoservicos.ibge.gov.br/geoserver/wms?service=WMS&version=1.1.0&request=GetMap&layers=CCAR:BCIM_Est_Gerad_Energia_Eletrica_P&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}&FORMAT=image%2Fpng&TRANSPARENT=TRUE",projection:"EPSG:3857",polygon:[[[-29.3325,2.33596],[-28.72472,2.03155],[-27.76041,-8.93703],[-27.67249,-22.20839],[-51.11495,-35.46552],[-53.39394,-33.85064],[-53.62553,-33.72493],[-53.62503,-33.15428],[-53.24498,-32.73392],[-53.65747,-32.51873],[-53.8329,-32.16592],[-54.64174,-31.55507],[-55.29638,-31.3429],[-55.57371,-30.99691],[-56.06384,-31.16749],[-56.10468,-30.86436],[-56.86862,-30.20752],[-57.39671,-30.40464],[-57.74384,-30.22142],[-55.83724,-28.16598],[-54.86969,-27.44994],[-53.9016,-27.02998],[-53.74972,-26.25781],[-53.97158,-25.74513],[-54.44723,-25.79609],[-54.67802,-25.64668],[-54.36097,-24.35145],[-54.41679,-24.06527],[-54.64355,-23.94107],[-55.22163,-24.11355],[-55.49138,-24.02797],[-55.71734,-22.68488],[-55.90555,-22.39886],[-56.45255,-22.21731],[-56.8256,-22.4002],[-57.34109,-22.34351],[-58.08472,-22.13075],[-57.95766,-20.99818],[-58.26551,-20.24147],[-58.03577,-19.95871],[-58.23083,-19.75211],[-57.64739,-18.19828],[-57.89356,-17.57377],[-58.16997,-17.53519],[-58.48825,-17.21961],[-58.57691,-16.81466],[-58.45563,-16.42158],[-60.2541,-16.32571],[-60.33481,-15.51483],[-60.67423,-15.1122],[-60.34999,-14.99707],[-60.63603,-13.84119],[-61.07283,-13.62569],[-61.9025,-13.62647],[-62.21395,-13.25048],[-62.80185,-13.10905],[-63.17194,-12.76568],[-63.74229,-12.54071],[-64.32845,-12.59578],[-65.10261,-12.0682],[-65.45781,-11.27865],[-65.41641,-9.83894],[-66.52331,-9.98587],[-67.66452,-10.80093],[-67.99778,-10.75991],[-68.52286,-11.20807],[-69.88988,-11.02776],[-70.30957,-11.1699],[-70.71896,-11.02003],[-70.68128,-9.66908],[-71.27536,-10.08971],[-72.18053,-10.09967],[-72.41623,-9.5874],[-73.29207,-9.45415],[-73.0625,-9.01727],[-73.61432,-8.40982],[-74.09056,-7.52755],[-74.03652,-7.27885],[-73.84718,-7.23829],[-73.78618,-6.77487],[-73.22362,-6.43011],[-73.33719,-6.02974],[-72.93016,-5.03871],[-71.93973,-4.42503],[-70.96802,-4.24829],[-70.79598,-4.06493],[-70.02393,-4.16735],[-69.51025,-1.13409],[-69.70776,-0.56762],[-70.13645,-0.22616],[-70.14083,0.5844],[-69.26594,0.8065],[-69.34226,0.96892],[-69.92481,1.01571],[-69.92343,1.77385],[-68.38511,1.82943],[-68.24848,2.11981],[-67.94571,1.94842],[-67.37696,2.32747],[-67.05751,1.85834],[-67.00579,1.2916],[-66.79967,1.31468],[-66.28683,0.85771],[-65.67671,1.11115],[-65.42494,0.96655],[-65.15671,1.24203],[-64.27483,1.60159],[-64.0486,2.06514],[-63.47236,2.27936],[-64.13446,2.43391],[-64.10005,2.72378],[-64.32628,3.11828],[-64.28142,3.54198],[-64.88451,4.11767],[-64.88064,4.34246],[-64.13653,4.22315],[-63.95465,4.02132],[-63.17706,4.0483],[-62.96093,3.76366],[-62.82024,4.10602],[-62.49922,4.27081],[-61.91181,4.26284],[-61.35393,4.6301],[-61.04904,4.62312],[-60.70452,4.96985],[-60.78709,5.29676],[-60.22457,5.37121],[-59.89857,5.10754],[-59.97549,4.60302],[-59.59676,4.43987],[-59.41942,3.96994],[-59.71017,3.54201],[-59.88955,2.72301],[-59.63006,2.31633],[-59.63382,1.96658],[-59.18812,1.47808],[-58.80545,1.32073],[-58.35933,1.68993],[-57.6,1.80391],[-57.39854,2.06512],[-57.12392,2.12876],[-56.02925,1.94945],[-56.23884,2.26335],[-55.98195,2.62866],[-55.64816,2.51995],[-54.93958,2.68251],[-54.24988,2.25056],[-53.73937,2.47373],[-52.98578,2.28049],[-52.65712,2.56407],[-52.41739,3.22121],[-51.73983,4.11916],[-51.7246,4.55687],[-51.0112,5.5229],[-43.48209,5.33583],[-29.3325,2.33596]]],terms_text:"IBGE",overlay:true},{id:"IBGE_BCIM_Municipio",name:"IBGE-BCIM-Município",type:"wms",template:"http://www.geoservicos.ibge.gov.br/geoserver/wms?service=WMS&version=1.1.0&request=GetMap&layers=CCAR:BCIM_Municipio_A&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}&FORMAT=image%2Fpng&TRANSPARENT=TRUE",projection:"EPSG:3857",polygon:[[[-29.3325,2.33596],[-28.72472,2.03155],[-27.76041,-8.93703],[-27.67249,-22.20839],[-51.11495,-35.46552],[-53.39394,-33.85064],[-53.62553,-33.72493],[-53.62503,-33.15428],[-53.24498,-32.73392],[-53.65747,-32.51873],[-53.8329,-32.16592],[-54.64174,-31.55507],[-55.29638,-31.3429],[-55.57371,-30.99691],[-56.06384,-31.16749],[-56.10468,-30.86436],[-56.86862,-30.20752],[-57.39671,-30.40464],[-57.74384,-30.22142],[-55.83724,-28.16598],[-54.86969,-27.44994],[-53.9016,-27.02998],[-53.74972,-26.25781],[-53.97158,-25.74513],[-54.44723,-25.79609],[-54.67802,-25.64668],[-54.36097,-24.35145],[-54.41679,-24.06527],[-54.64355,-23.94107],[-55.22163,-24.11355],[-55.49138,-24.02797],[-55.71734,-22.68488],[-55.90555,-22.39886],[-56.45255,-22.21731],[-56.8256,-22.4002],[-57.34109,-22.34351],[-58.08472,-22.13075],[-57.95766,-20.99818],[-58.26551,-20.24147],[-58.03577,-19.95871],[-58.23083,-19.75211],[-57.64739,-18.19828],[-57.89356,-17.57377],[-58.16997,-17.53519],[-58.48825,-17.21961],[-58.57691,-16.81466],[-58.45563,-16.42158],[-60.2541,-16.32571],[-60.33481,-15.51483],[-60.67423,-15.1122],[-60.34999,-14.99707],[-60.63603,-13.84119],[-61.07283,-13.62569],[-61.9025,-13.62647],[-62.21395,-13.25048],[-62.80185,-13.10905],[-63.17194,-12.76568],[-63.74229,-12.54071],[-64.32845,-12.59578],[-65.10261,-12.0682],[-65.45781,-11.27865],[-65.41641,-9.83894],[-66.52331,-9.98587],[-67.66452,-10.80093],[-67.99778,-10.75991],[-68.52286,-11.20807],[-69.88988,-11.02776],[-70.30957,-11.1699],[-70.71896,-11.02003],[-70.68128,-9.66908],[-71.27536,-10.08971],[-72.18053,-10.09967],[-72.41623,-9.5874],[-73.29207,-9.45415],[-73.0625,-9.01727],[-73.61432,-8.40982],[-74.09056,-7.52755],[-74.03652,-7.27885],[-73.84718,-7.23829],[-73.78618,-6.77487],[-73.22362,-6.43011],[-73.33719,-6.02974],[-72.93016,-5.03871],[-71.93973,-4.42503],[-70.96802,-4.24829],[-70.79598,-4.06493],[-70.02393,-4.16735],[-69.51025,-1.13409],[-69.70776,-0.56762],[-70.13645,-0.22616],[-70.14083,0.5844],[-69.26594,0.8065],[-69.34226,0.96892],[-69.92481,1.01571],[-69.92343,1.77385],[-68.38511,1.82943],[-68.24848,2.11981],[-67.94571,1.94842],[-67.37696,2.32747],[-67.05751,1.85834],[-67.00579,1.2916],[-66.79967,1.31468],[-66.28683,0.85771],[-65.67671,1.11115],[-65.42494,0.96655],[-65.15671,1.24203],[-64.27483,1.60159],[-64.0486,2.06514],[-63.47236,2.27936],[-64.13446,2.43391],[-64.10005,2.72378],[-64.32628,3.11828],[-64.28142,3.54198],[-64.88451,4.11767],[-64.88064,4.34246],[-64.13653,4.22315],[-63.95465,4.02132],[-63.17706,4.0483],[-62.96093,3.76366],[-62.82024,4.10602],[-62.49922,4.27081],[-61.91181,4.26284],[-61.35393,4.6301],[-61.04904,4.62312],[-60.70452,4.96985],[-60.78709,5.29676],[-60.22457,5.37121],[-59.89857,5.10754],[-59.97549,4.60302],[-59.59676,4.43987],[-59.41942,3.96994],[-59.71017,3.54201],[-59.88955,2.72301],[-59.63006,2.31633],[-59.63382,1.96658],[-59.18812,1.47808],[-58.80545,1.32073],[-58.35933,1.68993],[-57.6,1.80391],[-57.39854,2.06512],[-57.12392,2.12876],[-56.02925,1.94945],[-56.23884,2.26335],[-55.98195,2.62866],[-55.64816,2.51995],[-54.93958,2.68251],[-54.24988,2.25056],[-53.73937,2.47373],[-52.98578,2.28049],[-52.65712,2.56407],[-52.41739,3.22121],[-51.73983,4.11916],[-51.7246,4.55687],[-51.0112,5.5229],[-43.48209,5.33583],[-29.3325,2.33596]]],terms_text:"IBGE",overlay:true},{id:"ign-topografico-tms",name:"IGN topographical map (TMS)",type:"tms",template:"https://ide.ign.gob.ar/geoservicios/rest/services/Mapas_IGN/mapa_topografico/MapServer/tile/{zoom}/{y}/{x}",zoomExtent:[1,20],polygon:[[[-55.5438,-35.77219],[-64.31743,-49.44788],[-61.52546,-55.68296],[-66.04226,-55.24192],[-66.6896,-55.17191],[-66.86233,-55.04496],[-67.23387,-54.9245],[-67.47633,-54.92785],[-67.71808,-54.91261],[-67.96138,-54.88571],[-68.18753,-54.89288],[-68.61804,-54.92151],[-68.66375,-52.66716],[-68.51023,-52.39432],[-70.01629,-52.05707],[-72.05562,-52.01749],[-72.09055,-51.93758],[-72.02273,-51.88832],[-72.49598,-51.597],[-72.3623,-51.25935],[-72.46252,-51.08654],[-72.31217,-50.90093],[-72.39293,-50.69005],[-72.49148,-50.66866],[-72.59646,-50.73916],[-72.76983,-50.68829],[-73.22154,-50.87193],[-73.22709,-50.66897],[-73.39438,-50.58008],[-73.57703,-50.15788],[-73.53993,-50.01443],[-73.61453,-49.91795],[-73.52684,-49.7716],[-73.02779,-49.70085],[-73.02788,-49.23743],[-73.16148,-49.13062],[-72.96385,-48.89084],[-72.80952,-48.90039],[-72.59462,-48.77255],[-72.63621,-48.45823],[-72.46698,-48.45706],[-72.42158,-48.31422],[-72.3428,-48.29046],[-72.37166,-48.15995],[-72.57678,-47.96054],[-72.5731,-47.72062],[-72.3839,-47.57888],[-72.38448,-47.41759],[-72.07162,-47.2755],[-72.04726,-47.14867],[-71.93566,-47.15037],[-72.00956,-47.08473],[-72.00759,-46.78833],[-71.71488,-46.64453],[-71.7985,-46.26925],[-71.97019,-46.14972],[-71.63332,-45.97063],[-71.66595,-45.89232],[-71.77408,-45.85187],[-71.8548,-45.61169],[-71.7885,-45.50505],[-71.58354,-45.45607],[-71.58236,-45.36316],[-71.40574,-45.27206],[-71.61593,-45.03146],[-72.07949,-44.93988],[-72.11766,-44.73884],[-71.47444,-44.68048],[-71.2897,-44.75036],[-71.28469,-44.60892],[-71.20209,-44.5359],[-71.40536,-44.44891],[-71.86374,-44.44274],[-71.9047,-44.10354],[-71.70007,-43.98287],[-71.78725,-43.80985],[-71.63263,-43.65888],[-71.87866,-43.56195],[-71.95542,-43.44292],[-71.91512,-43.319],[-71.80268,-43.29535],[-71.73869,-43.19234],[-71.94149,-43.11061],[-72.18001,-42.8948],[-72.18733,-42.66619],[-72.06314,-42.53751],[-72.0441,-42.41231],[-72.14365,-42.40333],[-72.20024,-42.17229],[-72.17802,-42.13207],[-72.06032,-42.10593],[-71.78041,-42.12128],[-71.83133,-41.78089],[-71.94135,-41.60926],[-71.9023,-41.06778],[-72.02097,-40.73647],[-71.91507,-40.61832],[-71.87117,-40.38959],[-71.76665,-40.35676],[-71.87961,-40.24227],[-71.8856,-40.10093],[-71.67779,-39.92156],[-71.74365,-39.86164],[-71.77001,-39.61946],[-71.68665,-39.50983],[-71.58545,-39.55159],[-71.45202,-39.31025],[-71.47673,-38.89162],[-71.25594,-38.74909],[-70.95844,-38.70272],[-70.89411,-38.57644],[-71.03346,-38.45451],[-71.08724,-38.09054],[-71.23505,-37.86541],[-71.26668,-37.68295],[-71.18031,-37.4828],[-71.27241,-37.28686],[-71.17697,-37.1077],[-71.27586,-36.9637],[-71.20495,-36.91075],[-71.2345,-36.83303],[-71.07654,-36.43571],[-70.96469,-36.43366],[-70.90086,-36.34336],[-70.77062,-36.35412],[-70.59553,-36.12118],[-70.44219,-36.14876],[-70.42788,-35.73781],[-70.50607,-35.38014],[-70.59764,-35.34459],[-70.63128,-35.23712],[-70.42629,-35.12462],[-70.32933,-34.83081],[-70.35687,-34.72532],[-70.07752,-34.38253],[-70.06901,-34.24694],[-69.87771,-34.20233],[-69.95948,-33.77235],[-69.83371,-33.34911],[-70.02502,-33.37388],[-70.14906,-33.04145],[-70.06223,-33.01233],[-70.00981,-32.90747],[-70.19517,-32.75732],[-70.19589,-32.50891],[-70.28486,-32.45564],[-70.44343,-32.05325],[-70.41077,-31.9809],[-70.29402,-31.95849],[-70.5117,-31.85844],[-70.62295,-31.59949],[-70.59941,-31.29869],[-70.5377,-31.08557],[-70.35748,-31.0002],[-70.20264,-30.32249],[-69.97775,-30.32288],[-69.847,-30.16294],[-70.01824,-30.10003],[-69.95038,-29.73744],[-70.03755,-29.35428],[-69.97565,-29.18743],[-69.85112,-29.06923],[-69.70118,-28.37779],[-69.20484,-27.90816],[-68.84844,-27.13115],[-68.76133,-27.08588],[-68.60693,-27.09636],[-68.3489,-26.92771],[-68.64137,-26.50722],[-68.60352,-26.25391],[-68.45177,-26.1377],[-68.63052,-25.43524],[-68.55582,-25.14476],[-68.44595,-25.0658],[-68.62011,-24.81717],[-68.55162,-24.58836],[-68.28078,-24.34935],[-67.32648,-24.02538],[-66.99882,-23.00044],[-67.18775,-22.81375],[-67.08088,-22.62433],[-67.03366,-22.53815],[-66.84345,-22.39746],[-66.73734,-22.22282],[-66.38248,-22.07602],[-66.28978,-21.76554],[-66.21845,-21.72575],[-65.89675,-21.88263],[-65.71368,-22.09054],[-65.61493,-22.09152],[-65.60973,-22.09505],[-65.60607,-22.09358],[-65.60256,-22.09658],[-65.60015,-22.09543],[-65.59229,-22.09511],[-65.59015,-22.09735],[-65.58691,-22.09645],[-65.58512,-22.08432],[-65.57523,-22.07312],[-65.47487,-22.08487],[-64.99026,-22.06739],[-64.59768,-22.19269],[-64.52643,-22.29504],[-64.33114,-22.68517],[-64.10381,-22.34114],[-64.10712,-22.32023],[-64.06522,-22.23093],[-64.04702,-22.23757],[-64.03654,-22.19469],[-64.0029,-22.10735],[-63.99022,-22.07925],[-63.97147,-22.07619],[-63.94118,-21.99823],[-63.70932,-21.99896],[-63.68839,-22.01037],[-63.68079,-22.03116],[-63.68507,-22.04019],[-63.68156,-22.05185],[-63.67659,-22.03287],[-63.67201,-22.02293],[-63.66821,-22.01634],[-63.67191,-22.01399],[-63.66566,-21.99839],[-62.79606,-21.98778],[-62.74618,-22.10033],[-62.18511,-22.50843],[-61.93761,-22.97376],[-61.45605,-23.36182],[-61.05842,-23.56621],[-60.95137,-23.75997],[-60.28746,-24.01906],[-60.03728,-24.00408],[-59.46607,-24.33428],[-59.12256,-24.59772],[-58.46645,-24.84584],[-58.332,-24.98132],[-58.2349,-24.91756],[-57.8565,-25.08005],[-57.76981,-25.15013],[-57.75374,-25.17277],[-57.71597,-25.26456],[-57.71837,-25.27146],[-57.71111,-25.27265],[-57.71008,-25.28146],[-57.70692,-25.2845],[-57.70438,-25.28159],[-57.70273,-25.28239],[-57.70175,-25.28459],[-57.69741,-25.28283],[-57.69281,-25.28588],[-57.69733,-25.29337],[-57.70246,-25.29847],[-57.69612,-25.30832],[-57.69763,-25.3199],[-57.69143,-25.32127],[-57.67993,-25.33318],[-57.64822,-25.3679],[-57.63902,-25.38287],[-57.61504,-25.38841],[-57.59954,-25.39704],[-57.57673,-25.42029],[-57.56698,-25.43147],[-57.55477,-25.43999],[-57.55285,-25.44705],[-57.55811,-25.45717],[-57.55763,-25.46897],[-57.56523,-25.48014],[-57.56806,-25.49501],[-57.57722,-25.50575],[-57.57566,-25.52264],[-57.5661,-25.54112],[-57.56809,-25.55797],[-57.58142,-25.57145],[-57.59952,-25.57438],[-57.60444,-25.59855],[-57.6122,-25.61963],[-57.6367,-25.61807],[-57.66569,-25.60273],[-57.67006,-25.65579],[-57.67513,-25.66052],[-57.68626,-25.66287],[-57.69808,-25.65933],[-57.71855,-25.64914],[-57.72537,-25.71924],[-57.77786,-25.77559],[-57.84986,-26.01142],[-58.08597,-26.14202],[-58.13896,-26.66834],[-58.28224,-26.80127],[-58.32056,-26.82169],[-58.3167,-26.86081],[-58.32384,-26.87074],[-58.56858,-27.20629],[-57.90834,-27.24265],[-56.99114,-27.41858],[-56.60886,-27.36586],[-56.40607,-27.52701],[-56.32355,-27.36897],[-56.09353,-27.25219],[-55.76168,-27.38106],[-55.65541,-27.30153],[-55.67524,-27.17004],[-55.59643,-27.06538],[-55.40826,-26.91763],[-55.20788,-26.89214],[-54.97304,-26.63717],[-54.8532,-26.59894],[-54.72264,-26.31238],[-54.73235,-25.98554],[-54.65309,-25.84138],[-54.71357,-25.66721],[-54.62995,-25.55106],[-54.44288,-25.5795],[-54.11451,-25.4396],[-53.80059,-25.65093],[-53.766,-25.94301],[-53.59024,-26.19274],[-53.67264,-26.61495],[-53.61669,-26.95395],[-53.76351,-27.18917],[-54.15393,-27.36033],[-54.26461,-27.49923],[-54.79439,-27.6397],[-55.0044,-27.90341],[-55.19076,-27.92946],[-55.41589,-28.14304],[-55.66542,-28.26547],[-55.61633,-28.32205],[-55.65957,-28.46539],[-55.83413,-28.42136],[-55.87339,-28.49468],[-56.13558,-28.7265],[-56.37343,-29.10817],[-56.569,-29.13892],[-56.76306,-29.48638],[-57.05958,-29.72263],[-57.24463,-29.86452],[-57.3045,-30.03966],[-57.61942,-30.20517],[-57.60863,-30.32424],[-57.82983,-30.53118],[-57.75241,-30.68756],[-57.75273,-30.91942],[-57.93419,-31.27388],[-57.99,-31.36053],[-57.98302,-31.3734],[-57.97736,-31.38022],[-57.97778,-31.38599],[-57.98203,-31.39213],[-58.00944,-31.41341],[-58.06637,-31.47395],[-57.92613,-31.57745],[-57.98622,-31.77449],[-58.12179,-31.89772],[-58.11905,-32.14059],[-58.04227,-32.29153],[-58.14327,-32.45845],[-58.0758,-33.00587],[-58.18964,-33.09402],[-58.2723,-33.1061],[-58.31012,-33.1048],[-58.35418,-33.1221],[-58.37567,-33.17644],[-58.44465,-33.5853],[-58.43016,-33.71813],[-58.42434,-33.86887],[-58.41858,-33.91742],[-58.33697,-34.00477],[-58.241,-34.16246],[-57.84696,-34.50017],[-55.5438,-35.77219]]],terms_url:"http://www.ign.gob.ar/",terms_text:"Instituto Geográfico Nacional de la República Argentina",icon:"http://www.ign.gob.ar/sites/default/files/favicon.png"},{id:"Haiti-Drone",name:"Imagerie Drone (Haiti)",type:"tms",template:"http://wms.openstreetmap.fr/tms/1.0.0/iomhaiti/{zoom}/{x}/{y}",zoomExtent:[0,21],polygon:[[[-72.15474,19.6879],[-72.15458,19.6878],[-72.15485,19.68776],[-72.15472,19.68685],[-72.15431,19.68707],[-72.15463,19.68544],[-72.15301,19.68499],[-72.15086,19.68435],[-72.15045,19.68479],[-72.15078,19.68315],[-72.15223,19.6833],[-72.15282,19.68066],[-72.15186,19.68051],[-72.15191,19.68034],[-72.15227,19.68035],[-72.15238,19.67972],[-72.15328,19.67965],[-72.15333,19.67698],[-72.15308,19.67694],[-72.15348,19.67638],[-72.14878,19.67107],[-72.13664,19.67081],[-72.13557,19.67408],[-72.13573,19.68351],[-72.13679,19.68407],[-72.13695,19.68559],[-72.13778,19.685],[-72.13782,19.68727],[-72.13888,19.68767],[-72.13881,19.69013],[-72.13853,19.68949],[-72.13806,19.68964],[-72.13869,19.69232],[-72.13825,19.69276],[-72.13948,19.69737],[-72.14101,19.7],[-72.1437,19.70112],[-72.14851,19.70015],[-72.14772,19.70268],[-72.14874,19.7029],[-72.1616,19.70357],[-72.16578,19.698],[-72.165,19.69324],[-72.16223,19.68901],[-72.15474,19.6879]],[[-72.13106,19.67189],[-72.12598,19.67728],[-72.12554,19.67762],[-72.12169,19.67764],[-72.11497,19.6726],[-72.11527,19.66872],[-72.11982,19.66275],[-72.12278,19.66257],[-72.1249,19.6627],[-72.12858,19.66454],[-72.13081,19.66617],[-72.13167,19.66879],[-72.13156,19.671],[-72.13106,19.67189]],[[-71.84579,19.67098],[-71.84294,19.67595],[-71.841,19.67595],[-71.83802,19.67553],[-71.83787,19.6745],[-71.83905,19.67439],[-71.83901,19.67411],[-71.83984,19.67395],[-71.83891,19.67361],[-71.83802,19.67209],[-71.83801,19.67263],[-71.83767,19.67272],[-71.83763,19.67254],[-71.83544,19.67321],[-71.83533,19.673],[-71.83312,19.67346],[-71.83267,19.67168],[-71.83216,19.67209],[-71.83072,19.66949],[-71.8306,19.66976],[-71.83022,19.66989],[-71.82918,19.66721],[-71.82907,19.66721],[-71.82891,19.66679],[-71.82895,19.66662],[-71.82883,19.66635],[-71.82856,19.66648],[-71.82887,19.66725],[-71.82876,19.66741],[-71.8278,19.66782],[-71.82771,19.66786],[-71.82783,19.66796],[-71.82718,19.66812],[-71.82718,19.66809],[-71.82644,19.66839],[-71.82641,19.66832],[-71.8262,19.66843],[-71.82618,19.66836],[-71.82589,19.66842],[-71.82589,19.66866],[-71.82516,19.66875],[-71.82545,19.66916],[-71.82293,19.66957],[-71.82271,19.66967],[-71.82277,19.66976],[-71.82018,19.67099],[-71.81985,19.67045],[-71.8198,19.6706],[-71.81947,19.67076],[-71.81825,19.67134],[-71.81814,19.67114],[-71.81758,19.67143],[-71.81696,19.67077],[-71.81764,19.6719],[-71.81714,19.67204],[-71.81582,19.6718],[-71.81384,19.67119],[-71.81233,19.6707],[-71.81218,19.67043],[-71.81243,19.67015],[-71.81192,19.67001],[-71.81188,19.67058],[-71.81117,19.67035],[-71.80959,19.66985],[-71.8078,19.66928],[-71.8056,19.66861],[-71.80514,19.66689],[-71.80512,19.66523],[-71.80523,19.66198],[-71.80656,19.65239],[-71.80734,19.64829],[-71.80997,19.64683],[-71.81475,19.64545],[-71.81477,19.64556],[-71.815,19.64551],[-71.81495,19.64538],[-71.81599,19.64502],[-71.81589,19.64489],[-71.81659,19.64461],[-71.81901,19.6438],[-71.82115,19.64345],[-71.82216,19.64333],[-71.8269,19.64321],[-71.82805,19.64322],[-71.83045,19.64408],[-71.83064,19.64486],[-71.82953,19.64504],[-71.82961,19.64561],[-71.82994,19.64557],[-71.83037,19.64517],[-71.83047,19.64535],[-71.83081,19.6452],[-71.83102,19.64511],[-71.83125,19.64585],[-71.83111,19.64582],[-71.83137,19.64659],[-71.83289,19.64619],[-71.83446,19.64571],[-71.83447,19.64631],[-71.83422,19.64619],[-71.8342,19.64655],[-71.83467,19.6463],[-71.83491,19.64639],[-71.8348,19.64622],[-71.83544,19.64585],[-71.8355,19.6458],[-71.83647,19.64613],[-71.83764,19.64727],[-71.83791,19.64789],[-71.83905,19.6508],[-71.84569,19.66962],[-71.84579,19.67098]],[[-72.09888,18.54843],[-72.09907,18.54838],[-72.09991,18.54809],[-72.10234,18.54813],[-72.10252,18.54814],[-72.10229,18.54826],[-72.10229,18.54828],[-72.10256,18.54815],[-72.10272,18.54814],[-72.10343,18.54871],[-72.10354,18.5489],[-72.10352,18.54974],[-72.10349,18.54974],[-72.10351,18.55003],[-72.10285,18.55018],[-72.1029,18.55025],[-72.10287,18.55031],[-72.10352,18.55024],[-72.1035,18.55152],[-72.10338,18.55152],[-72.10308,18.55161],[-72.10348,18.55162],[-72.10342,18.55435],[-72.10243,18.5555],[-72.10149,18.55562],[-72.10062,18.55559],[-72.0979,18.55521],[-72.09688,18.55466],[-72.09652,18.55421],[-72.09661,18.55417],[-72.09651,18.55417],[-72.09654,18.55398],[-72.09644,18.55355],[-72.09628,18.55357],[-72.09621,18.5532],[-72.09599,18.55337],[-72.09564,18.55267],[-72.09556,18.55185],[-72.09685,18.55035],[-72.09729,18.55032],[-72.09699,18.5502],[-72.09888,18.54843]],[[-72.25425,18.56826],[-72.25603,18.57178],[-72.25579,18.5748],[-72.2535,18.57555],[-72.25228,18.57555],[-72.24999,18.57409],[-72.24739,18.56983],[-72.24601,18.56673],[-72.24585,18.56295],[-72.24794,18.56254],[-72.25015,18.5628],[-72.25192,18.56508],[-72.25425,18.56826]],[[-72.30315,18.53327],[-72.30313,18.53318],[-72.30483,18.53111],[-72.30974,18.53111],[-72.31643,18.53243],[-72.32341,18.53661],[-72.32614,18.53878],[-72.32619,18.54264],[-72.31705,18.55406],[-72.31309,18.55406],[-72.29875,18.54533],[-72.29886,18.54073],[-72.2963,18.54047],[-72.29546,18.53952],[-72.29619,18.53386],[-72.29719,18.53322],[-72.3007,18.53328],[-72.30227,18.53423],[-72.30285,18.53352],[-72.3031,18.53334],[-72.30318,18.5334],[-72.30358,18.53356],[-72.30308,18.53465],[-72.30371,18.53399],[-72.30453,18.53441],[-72.3044,18.53451],[-72.30627,18.53526],[-72.30631,18.53527],[-72.30612,18.53576],[-72.30612,18.53582],[-72.30637,18.53589],[-72.30627,18.53549],[-72.30667,18.53509],[-72.3062,18.53497],[-72.30589,18.53494],[-72.30554,18.53468],[-72.30549,18.53461],[-72.30556,18.53451],[-72.30467,18.53423],[-72.30476,18.53388],[-72.30433,18.53375],[-72.30426,18.53363],[-72.30315,18.53327]],[[-72.29814,18.4775],[-72.29357,18.49486],[-72.29222,18.49643],[-72.29317,18.49725],[-72.28923,18.50571],[-72.28781,18.5081],[-72.28505,18.51199],[-72.28402,18.51132],[-72.28086,18.51588],[-72.27732,18.5176],[-72.27235,18.51752],[-72.26627,18.51446],[-72.26659,18.50668],[-72.26926,18.50462],[-72.2662,18.50298],[-72.26882,18.49652],[-72.26915,18.49594],[-72.27027,18.49615],[-72.27027,18.4956],[-72.26907,18.49557],[-72.26929,18.49377],[-72.2737,18.486],[-72.27467,18.48504],[-72.27518,18.4834],[-72.27654,18.48134],[-72.27735,18.4815],[-72.2783,18.48097],[-72.27785,18.4807],[-72.2771,18.48012],[-72.279,18.47758],[-72.27972,18.47729],[-72.28064,18.47764],[-72.28137,18.47716],[-72.28084,18.47698],[-72.28128,18.47584],[-72.28232,18.47518],[-72.28516,18.4751],[-72.28499,18.47637],[-72.28544,18.47698],[-72.28628,18.47563],[-72.28693,18.47547],[-72.2866,18.47519],[-72.2866,18.475],[-72.29098,18.47473],[-72.29466,18.47494],[-72.29739,18.47684],[-72.29814,18.4775]],[[-72.34667,18.52224],[-72.34683,18.52443],[-72.34753,18.52776],[-72.34555,18.52911],[-72.34031,18.52922],[-72.33833,18.52803],[-72.3369,18.53012],[-72.33381,18.52967],[-72.32893,18.52708],[-72.32865,18.52533],[-72.32921,18.52327],[-72.33041,18.52205],[-72.33216,18.52218],[-72.33225,18.5192],[-72.33692,18.51836],[-72.3382,18.51847],[-72.33815,18.51818],[-72.3412,18.51779],[-72.34549,18.5172],[-72.34926,18.51728],[-72.35043,18.51889],[-72.35035,18.52061],[-72.34968,18.52204],[-72.34667,18.52224]],[[-72.33031,18.54865],[-72.34297,18.55081],[-72.34332,18.55306],[-72.34131,18.56143],[-72.33906,18.56136],[-72.33847,18.56383],[-72.33753,18.56543],[-72.33484,18.56506],[-72.33118,18.56383],[-72.33121,18.56162],[-72.32321,18.56069],[-72.32124,18.5596],[-72.3208,18.5587],[-72.32088,18.55788],[-72.32595,18.55803],[-72.32662,18.5582],[-72.32592,18.55775],[-72.3251,18.55738],[-72.32338,18.55226],[-72.3246,18.54785],[-72.3289,18.54837],[-72.32998,18.54895],[-72.33031,18.54865]],[[-72.32314,18.52698],[-72.32234,18.52807],[-72.32096,18.52797],[-72.32078,18.52713],[-72.32085,18.52537],[-72.32146,18.52496],[-72.32257,18.52489],[-72.32285,18.52533],[-72.32324,18.52648],[-72.32314,18.52698]],[[-72.21608,18.64578],[-72.21596,18.65538],[-72.20303,18.65583],[-72.19471,18.65534],[-72.19222,18.65456],[-72.19206,18.65213],[-72.19348,18.64776],[-72.20125,18.63852],[-72.20693,18.63882],[-72.2121,18.64241],[-72.21181,18.64306],[-72.21217,18.64269],[-72.2128,18.64276],[-72.21347,18.64313],[-72.21356,18.64375],[-72.21542,18.64439],[-72.21589,18.64503],[-72.21608,18.64578]],[[-72.28677,18.6482],[-72.2901,18.65274],[-72.28981,18.65365],[-72.29007,18.65427],[-72.29072,18.65377],[-72.29103,18.65447],[-72.29125,18.65422],[-72.29168,18.65589],[-72.29122,18.65661],[-72.29227,18.65597],[-72.29269,18.65675],[-72.29307,18.65673],[-72.29413,18.65818],[-72.29602,18.66084],[-72.29597,18.66191],[-72.29329,18.66457],[-72.29067,18.666],[-72.28959,18.66613],[-72.28959,18.66657],[-72.2877,18.66647],[-72.28758,18.66766],[-72.28312,18.66972],[-72.27965,18.66965],[-72.27843,18.66908],[-72.2784,18.66877],[-72.27774,18.66917],[-72.27744,18.66914],[-72.27701,18.66832],[-72.27656,18.66811],[-72.27654,18.66806],[-72.27523,18.66852],[-72.27493,18.66746],[-72.27464,18.66743],[-72.27347,18.66821],[-72.27323,18.66827],[-72.27268,18.66716],[-72.27191,18.66743],[-72.27188,18.66734],[-72.26881,18.66819],[-72.26883,18.66718],[-72.26908,18.66682],[-72.26881,18.66679],[-72.26811,18.66707],[-72.26763,18.66738],[-72.26756,18.66669],[-72.26686,18.66695],[-72.26559,18.66736],[-72.26545,18.66701],[-72.26475,18.66741],[-72.26299,18.66819],[-72.26285,18.66818],[-72.26265,18.66761],[-72.2623,18.66771],[-72.26248,18.66792],[-72.26248,18.66823],[-72.26231,18.66826],[-72.2621,18.66797],[-72.26228,18.66892],[-72.26015,18.6689],[-72.25427,18.66879],[-72.25054,18.66835],[-72.25044,18.66954],[-72.24779,18.66989],[-72.24152,18.66979],[-72.24142,18.67419],[-72.23892,18.67398],[-72.23872,18.67346],[-72.23837,18.67331],[-72.2387,18.67395],[-72.23755,18.6739],[-72.23742,18.67351],[-72.23774,18.67334],[-72.23751,18.67326],[-72.23684,18.67349],[-72.23644,18.67241],[-72.23551,18.6726],[-72.2354,18.67242],[-72.2353,18.6729],[-72.23455,18.67269],[-72.23431,18.67246],[-72.23424,18.67347],[-72.23341,18.67346],[-72.23329,18.6733],[-72.23274,18.67329],[-72.23271,18.6735],[-72.2277,18.67253],[-72.22653,18.67165],[-72.2268,18.67157],[-72.2275,18.67159],[-72.22749,18.67145],[-72.22729,18.67146],[-72.22728,18.6713],[-72.22721,18.67136],[-72.22618,18.67137],[-72.2256,18.67088],[-72.22551,18.66945],[-72.22611,18.66969],[-72.22618,18.66959],[-72.22598,18.66955],[-72.22578,18.66914],[-72.22533,18.66946],[-72.22497,18.66947],[-72.22458,18.66788],[-72.22355,18.6677],[-72.22359,18.66759],[-72.22246,18.66763],[-72.22237,18.66702],[-72.22233,18.66709],[-72.22192,18.66703],[-72.22081,18.6669],[-72.22081,18.66653],[-72.22087,18.66636],[-72.2206,18.66681],[-72.22039,18.66664],[-72.21843,18.66505],[-72.21829,18.6641],[-72.21835,18.66084],[-72.21872,18.66065],[-72.21869,18.6606],[-72.21873,18.66045],[-72.21898,18.66032],[-72.21878,18.6602],[-72.2187,18.66024],[-72.21858,18.66004],[-72.21861,18.66],[-72.21878,18.66013],[-72.219,18.66002],[-72.21891,18.65991],[-72.21897,18.65979],[-72.21838,18.65958],[-72.21847,18.65397],[-72.2201,18.65116],[-72.2258,18.64695],[-72.2283,18.64573],[-72.23793,18.64586],[-72.23776,18.6447],[-72.24004,18.64325],[-72.2456,18.64335],[-72.24827,18.64504],[-72.24875,18.64367],[-72.25111,18.64298],[-72.25124,18.64334],[-72.25126,18.64316],[-72.25148,18.64314],[-72.25133,18.64297],[-72.25336,18.64235],[-72.25352,18.64268],[-72.25395,18.64254],[-72.25415,18.64293],[-72.25439,18.64287],[-72.25438,18.64275],[-72.25642,18.64232],[-72.25669,18.64314],[-72.25688,18.64286],[-72.25682,18.64253],[-72.25884,18.6421],[-72.25889,18.64225],[-72.25926,18.64223],[-72.25965,18.64241],[-72.25922,18.64069],[-72.25995,18.64048],[-72.26012,18.64063],[-72.26012,18.63994],[-72.26153,18.63947],[-72.26261,18.6391],[-72.26545,18.63873],[-72.27194,18.63868],[-72.2722,18.63886],[-72.27303,18.63942],[-72.27317,18.64126],[-72.27387,18.64103],[-72.27422,18.64161],[-72.27522,18.6417],[-72.27545,18.64157],[-72.27555,18.64169],[-72.27554,18.64175],[-72.27647,18.64186],[-72.27675,18.6419],[-72.2763,18.6426],[-72.27742,18.643],[-72.27798,18.64272],[-72.27858,18.64313],[-72.27857,18.64323],[-72.2789,18.64335],[-72.27985,18.64397],[-72.28587,18.64697],[-72.28677,18.6482]],[[-72.55572,18.53059],[-72.55559,18.5367],[-72.555,18.53797],[-72.5488,18.53792],[-72.54866,18.53728],[-72.54884,18.53063],[-72.54937,18.5301],[-72.55513,18.53012],[-72.55572,18.53059]],[[-72.62353,18.50799],[-72.62344,18.50952],[-72.62261,18.51043],[-72.62049,18.51185],[-72.61834,18.51075],[-72.61622,18.50832],[-72.61626,18.50647],[-72.61866,18.50444],[-72.6204,18.5045],[-72.62283,18.507],[-72.62353,18.50799]]]},{id:"osmim-imagicode-S2A_R119_N09_20160327T050917",name:"imagico.de: Adams Bridge",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=S2A_R119_N09_20160327T050917&z={zoom}&x={x}&y={-y}",endDate:"2016-03-27T00:00:00.000Z",startDate:"2016-03-27T00:00:00.000Z",zoomExtent:[0,14],polygon:[[[79.01779,8.82757],[79.01402,9.64678],[80.17642,9.65042],[80.17728,8.8313],[79.01779,8.82757]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Supplementing incomplete coverage in other sources (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-LC80700162014211LGN00",name:"imagico.de: Alaska Range",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=LC80700162014211LGN00&z={zoom}&x={x}&y={-y}",endDate:"2014-07-31T00:00:00.000Z",startDate:"2014-07-31T00:00:00.000Z",zoomExtent:[0,12],polygon:[[[-152.70873,62.30357],[-152.70839,62.58153],[-152.00835,63.54646],[-148.99432,63.5333],[-148.99432,62.30357],[-152.70873,62.30357]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Recent summer image of the Alaska Range for mapping natural features (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-aral2",name:"imagico.de: Aral Sea (high water level)",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=aral2&z={zoom}&x={x}&y={-y}",endDate:"2016-03-03T00:00:00.000Z",startDate:"2016-03-03T00:00:00.000Z",zoomExtent:[0,13],polygon:[[[58.049,43.2623],[58.049,46.7189],[58.1014,46.8645],[61.5524,46.8629],[61.5524,46.3896],[61.4675,45.3416],[60.6317,43.2623],[58.049,43.2623]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Water and wetland extents, dams etc. - some remaining winter ice in the north (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-aral1",name:"imagico.de: Aral Sea (low water level)",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=aral1&z={zoom}&x={x}&y={-y}",endDate:"2016-09-09T00:00:00.000Z",startDate:"2016-09-09T00:00:00.000Z",zoomExtent:[0,13],polygon:[[[58.049,43.2623],[58.049,46.7334],[58.096,46.8645],[61.5524,46.8629],[61.5524,46.3896],[61.4685,45.3544],[60.6267,43.2623],[58.049,43.2623]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Water and wetland extents, dams etc. (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-S2A_R067_S40_20170417T140051",name:"imagico.de: Bahía Blanca (high tide)",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=S2A_R067_S40_20170417T140051&z={zoom}&x={x}&y={-y}",endDate:"2017-04-17T00:00:00.000Z",startDate:"2017-04-17T00:00:00.000Z",zoomExtent:[0,14],polygon:[[[-62.9988,-40.7327],[-62.9988,-37.9476],[-61.7505,-37.9474],[-61.7501,-40.7322],[-62.9988,-40.7327]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Tidal flats and islands at the coast (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-S2A_R067_S40_20170127T140051",name:"imagico.de: Bahía Blanca (low tide)",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=S2A_R067_S40_20170127T140051&z={zoom}&x={x}&y={-y}",endDate:"2017-01-27T00:00:00.000Z",startDate:"2017-01-27T00:00:00.000Z",zoomExtent:[0,14],polygon:[[[-62.9988,-40.7327],[-62.9988,-37.9476],[-61.7505,-37.9474],[-61.7501,-40.7322],[-62.9988,-40.7327]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Tidal flats and islands at the coast (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-LC81190582014075LGN00",name:"imagico.de: Bakun Reservoir",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=LC81190582014075LGN00&z={zoom}&x={x}&y={-y}",endDate:"2014-03-16T00:00:00.000Z",startDate:"2014-03-16T00:00:00.000Z",zoomExtent:[0,13],polygon:[[[114.36,2.02846],[113.53448,2.03],[113.53619,3.07077],[114.76512,3.06751],[114.76254,2.08816],[114.36,2.02846]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Missing in older pre-2011 images (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-LC81250592016107LGN00",name:"imagico.de: Batam",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=LC81250592016107LGN00&z={zoom}&x={x}&y={-y}",endDate:"2016-01-01T00:00:00.000Z",startDate:"2014-01-01T00:00:00.000Z",zoomExtent:[0,13],polygon:[[[104.00155,-0.00008],[104.00137,1.45099],[104.91015,1.45116],[104.91015,-0.00008],[104.00155,-0.00008]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Missing Islands in OSM (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-LC80770232017156LGN00",name:"imagico.de: Bogoslof Island",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=LC80770232017156LGN00&z={zoom}&x={x}&y={-y}",endDate:"2017-06-05T00:00:00.000Z",startDate:"2017-06-05T00:00:00.000Z",zoomExtent:[0,13],polygon:[[[-168.2544,53.8749],[-168.2544,54.0213],[-167.8591,54.0213],[-167.8591,53.8749],[-168.2544,53.8749]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Recent image from after the eruption (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-LC81800982013291LGN00",name:"imagico.de: Bouvet Island",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=LC81800982013291LGN00&z={zoom}&x={x}&y={-y}",endDate:"2013-10-18T00:00:00.000Z",startDate:"2013-10-18T00:00:00.000Z",zoomExtent:[0,13],polygon:[[[3.24653,-54.47047],[3.24653,-54.37539],[3.46385,-54.37539],[3.46385,-54.47047],[3.24653,-54.47047]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",best:true,description:"For more accurate coastline and glacier mapping (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-S2A_R017_S67_20170223T022551",name:"imagico.de: Bunger Hills",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=S2A_R017_S67_20170223T022551&z={zoom}&x={x}&y={-y}",endDate:"2017-02-23T00:00:00.000Z",startDate:"2017-02-23T00:00:00.000Z",zoomExtent:[0,13],polygon:[[[96.1197,-67.6542],[96.1201,-67.1899],[98.7331,-65.044],[105.1028,-65.044],[105.1028,-65.7224],[103.3017,-67.6542],[96.1197,-67.6542]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Largest ice free area at the East Antarctic coast - shows considerable amounts of non-permanent ice. (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-S2A_R065_N47_20160929T102022",name:"imagico.de: Central Alps in late September 2016",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=S2A_R065_N47_20160929T102022&z={zoom}&x={x}&y={-y}",endDate:"2016-09-29T00:00:00.000Z",startDate:"2016-09-29T00:00:00.000Z",zoomExtent:[0,13],polygon:[[[10.55906,45.95485],[7.47396,45.95533],[7.55585,46.2708],[8.0547,47.66469],[11.75245,47.66481],[11.75245,46.81334],[11.38424,45.95509],[10.55906,45.95485]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Up-to-date image for glacier mapping - beware of some fresh snow at higher altitudes (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-LC82050982015344LGN00",name:"imagico.de: Clerke Rocks",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=LC82050982015344LGN00&z={zoom}&x={x}&y={-y}",endDate:"2015-12-10T00:00:00.000Z",startDate:"2015-12-10T00:00:00.000Z",zoomExtent:[0,13],polygon:[[[-34.17701,-55.29693],[-35.19599,-55.28285],[-35.16664,-54.72097],[-34.12517,-54.73465],[-34.1401,-55.29693],[-34.17701,-55.29693]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Missing in other image sources (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-S2A_R086_N60_20160831T213532",name:"imagico.de: Cook Inlet",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=S2A_R086_N60_20160831T213532&z={zoom}&x={x}&y={-y}",endDate:"2016-08-31T00:00:00.000Z",startDate:"2016-08-31T00:00:00.000Z",zoomExtent:[0,13],polygon:[[[-154.5102,59.4577],[-154.5097,60.6888],[-153.5403,62.1718],[-148.0423,62.1718],[-148.0445,61.5342],[-149.7291,59.4584],[-154.5102,59.4577]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Tidal flats and glaciers in surrounding mountains (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-EO1A0040712016264110KF",name:"imagico.de: Coropuna",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=EO1A0040712016264110KF&z={zoom}&x={x}&y={-y}",endDate:"2016-09-21T00:00:00.000Z",startDate:"2016-09-21T00:00:00.000Z",zoomExtent:[0,14],polygon:[[[-72.75945,-15.68684],[-72.75945,-15.4957],[-72.74434,-15.4263],[-72.41286,-15.4263],[-72.41286,-15.65296],[-72.42411,-15.68667],[-72.75945,-15.68684]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Up-to-date image for glacier mapping (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-S2A_R022_N06_20151221T103009",name:"imagico.de: Cotonou",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=S2A_R022_N06_20151221T103009&z={zoom}&x={x}&y={-y}",endDate:"2015-12-21T00:00:00.000Z",startDate:"2015-12-21T00:00:00.000Z",zoomExtent:[0,14],polygon:[[[1.83975,6.2578],[1.83975,7.11427],[2.5494,7.11427],[2.5494,6.48905],[2.49781,6.25806],[1.83975,6.2578]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Patchy and partly cloudy coverage in usual sources (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-S2A_R040_N01_20160311T164128",name:"imagico.de: Darwin and Wolf islands, Galapagos",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=S2A_R040_N01_20160311T164128&z={zoom}&x={x}&y={-y}",endDate:"2016-03-11T00:00:00.000Z",startDate:"2016-03-11T00:00:00.000Z",zoomExtent:[0,14],polygon:[[[-92.05216,1.3213],[-92.05216,1.72181],[-91.74849,1.72181],[-91.74849,1.3213],[-92.05216,1.3213]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Recent image, only old and poor images in other sources currently (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-LC80360072014245LGN00",name:"imagico.de: Eastern Devon Island coast",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=LC80360072014245LGN00&z={zoom}&x={x}&y={-y}",endDate:"2014-09-02T00:00:00.000Z",startDate:"2014-09-02T00:00:00.000Z",zoomExtent:[0,11],polygon:[[[-84.34799,74.38946],[-84.34799,75.8903],[-79.14871,75.8903],[-79.14871,74.38946],[-84.34799,74.38946]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Coastline mostly mapped meanwhile (false color IR)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-LC82160152013239LGN00",name:"imagico.de: Eastern Iceland",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=LC82160152013239LGN00&z={zoom}&x={x}&y={-y}",endDate:"2013-08-27T00:00:00.000Z",startDate:"2013-08-27T00:00:00.000Z",zoomExtent:[0,12],polygon:[[[-13.04701,64.21109],[-15.16496,64.22408],[-15.16805,64.81573],[-13.04357,64.8036],[-13.04701,64.21109]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Missing islets and inaccurate coast (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-AST_L1T_00302052007154424_20150518041444_91492",name:"imagico.de: El Altar",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=AST_L1T_00302052007154424_20150518041444_91492&z={zoom}&x={x}&y={-y}",endDate:"2012-02-05T00:00:00.000Z",startDate:"2012-02-05T00:00:00.000Z",zoomExtent:[0,14],polygon:[[[-78.532,-1.80509],[-78.532,-1.60811],[-78.33562,-1.60811],[-78.33562,-1.80509],[-78.532,-1.80509]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"2007 ASTER image offering better glacier coverage than common sources (true color with estimated blue)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-S2A_R009_S61_20160109",name:"imagico.de: Elephant Island/Clarence Island",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=S2A_R009_S61_20160109&z={zoom}&x={x}&y={-y}",endDate:"2016-01-09T00:00:00.000Z",startDate:"2016-01-09T00:00:00.000Z",zoomExtent:[0,13],polygon:[[[-56.13476,-61.63472],[-56.13476,-61.19936],[-55.83264,-60.84015],[-53.72343,-60.83982],[-53.72343,-61.63472],[-56.13476,-61.63472]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Fairly clear up-to-date image for updating glacier edges (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-enderby",name:"imagico.de: Enderby Land and Kemp Coast",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=enderby&z={zoom}&x={x}&y={-y}",endDate:"2017-03-27T00:00:00.000Z",startDate:"2017-01-25T00:00:00.000Z",zoomExtent:[0,13],polygon:[[[45.4547,-68.5091],[45.4547,-67.5724],[49.7155,-65.7176],[59.2693,-65.7176],[67.3735,-67.3449],[67.3735,-68.2581],[67.088,-68.5091],[45.4547,-68.5091]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Sentinel-2 images of Enderby Land and Kemp Coast (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-LC82100502015347LGN00",name:"imagico.de: Fogo, Cape Verde",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=LC82100502015347LGN00&z={zoom}&x={x}&y={-y}",endDate:"2015-12-13T00:00:00.000Z",startDate:"2015-12-13T00:00:00.000Z",zoomExtent:[0,14],polygon:[[[-24.75878,14.74814],[-24.75878,15.09249],[-24.26706,15.09249],[-24.26706,14.74814],[-24.75878,14.74814]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Image from after the 2014/2015 eruption (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-greenland",name:"imagico.de: Greenland mosaic",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=greenland&z={zoom}&x={x}&y={-y}",endDate:"2015-01-01T00:00:00.000Z",startDate:"2013-01-01T00:00:00.000Z",zoomExtent:[0,12],polygon:[[[-43.9774,59.7171],[-44.545,59.7302],[-44.9203,59.7672],[-45.3587,59.8218],[-45.763,59.8848],[-46.0859,59.9827],[-46.3381,60.119],[-46.577,60.2652],[-46.8114,60.4418],[-47.2635,60.5314],[-47.6937,60.5549],[-48.1457,60.6192],[-48.5771,60.7015],[-48.8689,60.8506],[-49.0578,61.0555],[-49.396,61.2957],[-49.7601,61.4934],[-50.2064,61.7324],[-50.4699,61.9539],[-50.8647,62.1596],[-51.0631,62.3869],[-51.2121,62.6001],[-51.3005,62.8389],[-51.4238,62.9979],[-51.6767,63.1944],[-51.9465,63.4079],[-52.0253,63.6377],[-52.2255,63.8378],[-52.3658,64.0705],[-52.4829,64.3792],[-52.4988,64.6788],[-52.789,64.9063],[-53.2046,65.1321],[-53.6649,65.4753],[-53.9977,65.8019],[-54.1348,66.1568],[-54.1441,66.5235],[-54.2285,66.8319],[-54.4519,67.303],[-54.5141,67.7648],[-54.604,68.2021],[-54.568,68.5698],[-54.598,68.8347],[-54.7606,69.1207],[-55.0028,69.4125],[-55.2735,69.6187],[-55.3808,69.8283],[-55.3945,70.0838],[-55.3094,70.2573],[-55.4307,70.479],[-55.5501,70.6707],[-55.7654,70.861],[-56.2489,71.2343],[-56.5018,71.5429],[-56.5867,71.9015],[-56.5189,72.2355],[-56.5085,72.5258],[-56.8923,72.8144],[-57.4027,73.1054],[-57.8066,73.4566],[-58.1461,73.7696],[-58.3554,74.0972],[-58.5125,74.3783],[-58.7336,74.6328],[-59.3551,74.8869],[-60.1412,75.102],[-61.0067,75.2763],[-61.911,75.3886],[-62.4706,75.5595],[-62.9776,75.7454],[-64.1463,75.779],[-65.4481,75.7235],[-66.7068,75.6792],[-67.8379,75.6525],[-69.0456,75.6195],[-70.055,75.5344],[-71.0898,75.4705],[-72.1119,75.4476],[-74.2311,76.4102],[-74.5601,76.5328],[-74.5601,82.6959],[-14.4462,82.6959],[-14.3994,82.5997],[-13.5339,82.4379],[-12.0312,82.3426],[-10.7796,82.3196],[-10.7796,80.1902],[-11.2123,80.069],[-11.136,79.8103],[-10.7796,79.5176],[-10.7796,79.0441],[-11.2626,78.7128],[-12.2579,78.3558],[-13.2398,78.1272],[-13.7649,77.9279],[-14.1169,77.6779],[-14.7129,77.5278],[-15.5507,77.3655],[-16.0936,77.0771],[-16.0586,76.5548],[-15.838,75.9611],[-15.6879,75.4726],[-16.253,75.058],[-17.0427,74.6425],[-18.3155,74.2702],[-19.4463,73.9378],[-19.8329,73.632],[-20.2938,73.3524],[-20.7831,73.0446],[-21.01,72.6766],[-20.8774,72.2926],[-20.7672,71.8726],[-20.7765,71.4304],[-20.9411,70.9802],[-21.219,70.6126],[-21.5326,70.3001],[-21.8039,70.0911],[-22.166,69.8947],[-22.4831,69.7539],[-22.9027,69.6585],[-23.3545,69.544],[-23.9177,69.4036],[-24.1794,69.3088],[-24.6745,69.1084],[-25.1222,68.9555],[-25.6659,68.7995],[-26.0994,68.583],[-26.6316,68.4043],[-27.7638,68.2813],[-28.4575,68.0023],[-29.353,67.8135],[-30.6456,67.4911],[-31.7673,67.0005],[-32.9783,66.2596],[-33.9313,66.0156],[-34.8956,65.7403],[-35.5914,65.5208],[-36.1483,65.372],[-36.7532,65.2559],[-37.1858,65.1349],[-37.6032,64.9727],[-38.0624,64.4901],[-38.5304,64.1244],[-39.0545,63.7213],[-39.3131,63.4405],[-39.5739,62.7506],[-39.9532,62.2739],[-40.2757,61.8547],[-40.714,61.3365],[-41.2091,60.8495],[-41.821,60.5526],[-42.4368,60.3264],[-42.8643,60.0299],[-43.1131,59.9147],[-43.3282,59.83],[-43.5459,59.7695],[-43.797,59.7284],[-43.9774,59.7171]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Landsat mosaic of Greenland (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-S2A_R047_S54_20160411T044330",name:"imagico.de: Heard Island coast",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=S2A_R047_S54_20160411T044330&z={zoom}&x={x}&y={-y}",endDate:"2016-04-12T00:00:00.000Z",startDate:"2016-04-12T00:00:00.000Z",zoomExtent:[0,13],polygon:[[[73.06897,-53.27059],[73.06897,-52.87549],[73.67338,-52.87673],[74.08863,-52.9495],[74.08863,-53.27059],[73.06897,-53.27059]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Recent image of Heard island with interior mostly cloud covered but mostly well visible coast (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-LC82280982013259LGN00",name:"imagico.de: Isla Londonderry",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=LC82280982013259LGN00&z={zoom}&x={x}&y={-y}",endDate:"2013-09-16T00:00:00.000Z",startDate:"2013-09-16T00:00:00.000Z",zoomExtent:[0,12],polygon:[[[-69.8568,-55.55949],[-72.26521,-55.14943],[-72.26521,-54.51089],[-72.08531,-54.17909],[-69.49116,-54.17889],[-69.4915,-55.28379],[-69.62231,-55.5591],[-69.8568,-55.55949]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"A lot of very coarse coastlines could be improved here, much snow cover though so no use for glacier mapping (false color IR)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-dms_kangerlussuaq_20151008",name:"imagico.de: Kangerlussuaq Autumn",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=dms_kangerlussuaq_20151008&z={zoom}&x={x}&y={-y}",endDate:"2015-10-08T00:00:00.000Z",startDate:"2015-10-08T00:00:00.000Z",zoomExtent:[0,17],polygon:[[[-50.6992,66.9888],[-50.721,67.0017],[-50.7341,67.0125],[-50.7396,67.0193],[-50.7396,67.0212],[-50.7158,67.0265],[-50.7017,67.0265],[-50.6829,67.0176],[-50.6686,67.0077],[-50.6638,66.998],[-50.6642,66.9946],[-50.6891,66.9888],[-50.6992,66.9888]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Icebridge DMS image of the airport and settlement - alignment might be poor",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-dms_kangerlussuaq_20160518",name:"imagico.de: Kangerlussuaq Spring",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=dms_kangerlussuaq_20160518&z={zoom}&x={x}&y={-y}",endDate:"2016-05-18T00:00:00.000Z",startDate:"2016-05-18T00:00:00.000Z",zoomExtent:[0,18],polygon:[[[-50.7519,66.9996],[-50.7555,67.0023],[-50.7555,67.0033],[-50.6395,67.0297],[-50.6162,67.0339],[-50.6097,67.0281],[-50.6331,67.022],[-50.7323,66.9996],[-50.7519,66.9996]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Icebridge DMS image of the airport and roads - alignment might be poor",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-S2A_R021_N44_20160807T083013",name:"imagico.de: Kerch Strait",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=S2A_R021_N44_20160807T083013&z={zoom}&x={x}&y={-y}",endDate:"2016-08-07T00:00:00.000Z",startDate:"2016-08-07T00:00:00.000Z",zoomExtent:[0,14],polygon:[[[35.93259,44.96237],[35.93259,45.55926],[37.36991,45.55926],[37.36991,44.96237],[35.93259,44.96237]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"State of bridge construction in August 2016 (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-S2A_R021_N44_20180429T082601",name:"imagico.de: Kerch Strait 2018",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=S2A_R021_N44_20180429T082601&z={zoom}&x={x}&y={-y}",endDate:"2018-04-29T00:00:00.000Z",startDate:"2018-04-29T00:00:00.000Z",zoomExtent:[0,14],polygon:[[[35.8787,45.0348],[35.8787,45.6095],[36.9208,45.6095],[36.9208,45.0348],[35.8787,45.0348]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Bridge and surrounding after completion in April 2018 (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-ls_polar2",name:"imagico.de: Landsat off-nadir July 2016",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=ls_polar2&z={zoom}&x={x}&y={-y}",endDate:"2016-07-17T00:00:00.000Z",startDate:"2016-07-17T00:00:00.000Z",zoomExtent:[0,10],polygon:[[[-79.05175,81.91484],[-79.05175,83.43339],[-73.6039,83.80225],[-26.42449,83.80225],[-21.493,83.50352],[-16.88835,83.15095],[-16.88835,81.91484],[-79.05175,81.91484]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Latest images north of the regular Landsat limit (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-larsen_2018",name:"imagico.de: Larsen C ice shelf after calving",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=larsen_2018&z={zoom}&x={x}&y={-y}",endDate:"2018-01-06T00:00:00.000Z",startDate:"2018-01-06T00:00:00.000Z",zoomExtent:[0,12],polygon:[[[-62.7282,-68.9652],[-64.0489,-68.7318],[-64.0486,-68.5373],[-60.8845,-65.9399],[-59.9187,-65.9389],[-59.1088,-66.0775],[-59.1088,-68.8359],[-59.2544,-68.9652],[-62.7282,-68.9652]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"For updating the ice edge after the 2017 iceberg calving (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-AST_L1T_00311162013112731_20150618142416_109190",name:"imagico.de: Leskov Island ASTER",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=AST_L1T_00311162013112731_20150618142416_109190&z={zoom}&x={x}&y={-y}",endDate:"2013-11-16T00:00:00.000Z",startDate:"2013-11-16T00:00:00.000Z",zoomExtent:[0,13],polygon:[[[-28.21075,-56.72108],[-28.21075,-56.62498],[-27.96956,-56.62498],[-27.96956,-56.72108],[-28.21075,-56.72108]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Missing in other image sources (true color with estimated blue)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-LC81991002015286LGN00",name:"imagico.de: Leskov Island Landsat",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=LC81991002015286LGN00&z={zoom}&x={x}&y={-y}",endDate:"2015-10-13T00:00:00.000Z",startDate:"2015-10-13T00:00:00.000Z",zoomExtent:[0,13],polygon:[[[-27.99293,-56.73479],[-28.22776,-56.73262],[-28.22416,-56.60075],[-27.96975,-56.60283],[-27.97319,-56.73479],[-27.99293,-56.73479]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Missing in other image sources (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-S2B_R005_S69_20180222T061749",name:"imagico.de: Lützow-Holm Bay",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=S2B_R005_S69_20180222T061749&z={zoom}&x={x}&y={-y}",endDate:"2018-02-22T00:00:00.000Z",startDate:"2018-02-22T00:00:00.000Z",zoomExtent:[0,13],polygon:[[[35.124,-70.3693],[35.1241,-69.2795],[36.3864,-68.4765],[42.2208,-68.4762],[42.2208,-70.3651],[35.124,-70.3693]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Up-to-date late season image or an area poorly mapped in OSM at the moment - lots of sea ice, be careful with distinguishing sea ice from ice shelves and floating glacier tongues. (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-ls_polar",name:"imagico.de: May 2013 off-nadir Landsat",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=ls_polar&z={zoom}&x={x}&y={-y}",endDate:"2013-05-17T00:00:00.000Z",startDate:"2013-05-17T00:00:00.000Z",zoomExtent:[0,10],polygon:[[[-85.76109,81.39333],[-89.83016,82.14952],[-89.83153,82.24405],[-84.99342,82.73099],[-79.95207,83.13108],[-74.55641,83.46267],[-69.35851,83.70451],[-28.20784,83.70451],[-23.06624,83.46532],[-17.96584,83.15518],[-17.96721,82.72386],[-22.78197,81.4419],[-85.76109,81.39333]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"First available image north of the regular Landsat limit, mostly with seasonal snow cover so difficult to interpret (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-S2A_R042_S78_20170214T202521",name:"imagico.de: McMurdo Sound and Dry Valleys",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=S2A_R042_S78_20170214T202521&z={zoom}&x={x}&y={-y}",endDate:"2017-02-14T00:00:00.000Z",startDate:"2017-02-14T00:00:00.000Z",zoomExtent:[0,12],polygon:[[[162.9125,-78.4514],[162.6595,-78.4257],[159.2712,-77.6013],[159.2712,-77.4108],[164.157,-76.477],[169.7813,-76.4764],[169.7813,-78.4514],[162.9125,-78.4514]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Up-to-date late season image - not ice minimum, be careful with distinguishing sea ice from ice shelves. (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-S2A_R092_S02_20160613T075613",name:"imagico.de: Mount Kenya 2016",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=S2A_R092_S02_20160613T075613&z={zoom}&x={x}&y={-y}",endDate:"2016-06-13T00:00:00.000Z",startDate:"2016-06-13T00:00:00.000Z",zoomExtent:[0,14],polygon:[[[37.20666,-0.26685],[37.20666,-0.01193],[37.56552,-0.01193],[37.56552,-0.26685],[37.20666,-0.26685]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Up-to-date image for glacier mapping (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-S2A_R092_S05_20160802T075556",name:"imagico.de: Mount Kilimanjaro 2016",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=S2A_R092_S05_20160802T075556&z={zoom}&x={x}&y={-y}",endDate:"2016-08-02T00:00:00.000Z",startDate:"2016-08-02T00:00:00.000Z",zoomExtent:[0,14],polygon:[[[37.24769,-3.22921],[37.24769,-2.96816],[37.61581,-2.96816],[37.61581,-3.22921],[37.24769,-3.22921]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Up-to-date image for glacier mapping (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-LC80940622015159LGN00",name:"imagico.de: New Ireland",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=LC80940622015159LGN00&z={zoom}&x={x}&y={-y}",endDate:"2015-06-08T00:00:00.000Z",startDate:"2015-06-08T00:00:00.000Z",zoomExtent:[0,14],polygon:[[[150.38853,-2.80053],[150.38853,-2.3834],[150.83348,-2.3834],[150.83348,-2.80053],[150.38853,-2.80053]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Many missing islands in OSM (mostly mapped meanwhile) (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-northsea_s2_2016",name:"imagico.de: North Sea Coast 2016",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=northsea_s2_2016&z={zoom}&x={x}&y={-y}",endDate:"2016-09-25T00:00:00.000Z",startDate:"2016-09-25T00:00:00.000Z",zoomExtent:[0,13],polygon:[[[5.1562,52.8755],[5.1615,53.0325],[6.4155,55.7379],[9.8813,55.7459],[9.8813,53.2428],[9.6846,52.8877],[5.1562,52.8755]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Up-to-date low tide imagery of the coast for updating mapping of tidalflats and shoals (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-northsea_s2_2017",name:"imagico.de: North Sea Coast 2017",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=northsea_s2_2017&z={zoom}&x={x}&y={-y}",endDate:"2017-06-02T00:00:00.000Z",startDate:"2017-06-02T00:00:00.000Z",zoomExtent:[0,13],polygon:[[[5.1713,53.0918],[6.477,55.8973],[9.8813,55.8973],[9.8813,53.2761],[9.7789,53.0918],[5.1713,53.0918]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Up-to-date low tide imagery of the coast for updating mapping of tidalflats and shoals (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-northsea_s2_2018",name:"imagico.de: North Sea Coast spring 2018",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=northsea_s2_2018&z={zoom}&x={x}&y={-y}",endDate:"2018-05-08T00:00:00.000Z",startDate:"2018-05-08T00:00:00.000Z",zoomExtent:[0,13],polygon:[[[5.3179,53.0918],[5.322,53.4418],[6.7023,56.3572],[9.8813,56.3578],[9.8813,53.2819],[9.7758,53.0921],[5.3179,53.0918]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Up-to-date low tide imagery of the coast for updating mapping of tidalflats and shoals (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-caspian_2018",name:"imagico.de: Northeast Caspian Sea 2018",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=caspian_2018&z={zoom}&x={x}&y={-y}",endDate:"2018-05-16T00:00:00.000Z",startDate:"2018-05-16T00:00:00.000Z",zoomExtent:[0,14],polygon:[[[51.0243,45.0729],[51.0243,46.569],[52.4259,46.5687],[53.6471,46.3177],[53.6474,45.0729],[51.0243,45.0729]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Coastal contruction and Kashagan oil field in Kazakhstan in May 2018 (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-ural_s2_2016",name:"imagico.de: Northern and Polar Ural mountains August 2016",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=ural_s2_2016&z={zoom}&x={x}&y={-y}",endDate:"2016-08-12T00:00:00.000Z",startDate:"2016-08-12T00:00:00.000Z",zoomExtent:[0,13],polygon:[[[59.19898,64.89205],[59.19898,66.91656],[60.73329,68.44289],[67.73295,68.44327],[67.73295,67.74883],[64.21647,64.91957],[59.19898,64.89205]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Up-to-date late summer imagery with few clouds - caution: not all visible snow is glaciers (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-ndvina",name:"imagico.de: Northern Dvina delta at low tide",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=ndvina&z={zoom}&x={x}&y={-y}",endDate:"2015-09-13T00:00:00.000Z",startDate:"2015-09-13T00:00:00.000Z",zoomExtent:[0,12],polygon:[[[37.7291,64.1971],[37.7291,65.1161],[37.8592,65.2705],[41.3223,65.2705],[41.3223,64.3142],[41.2114,64.1973],[37.7291,64.1971]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Beaches, tidal flats and other costal forms (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-nellesmere_ast",name:"imagico.de: Northern Ellesmere Island",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=nellesmere_ast&z={zoom}&x={x}&y={-y}",endDate:"2012-07-09T00:00:00.000Z",startDate:"2012-07-09T00:00:00.000Z",zoomExtent:[0,10],polygon:[[[-81.62923,82.4597],[-83.03136,82.47986],[-83.03136,83.05876],[-72.80309,83.09567],[-65.65786,83.03232],[-65.81167,82.4597],[-81.62923,82.4597]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Assembled from July 2012 ASTER imagery (true color with estimated blue)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-nellesmere_ast_2016",name:"imagico.de: Northern Ellesmere Island July 2016",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=nellesmere_ast_2016&z={zoom}&x={x}&y={-y}",endDate:"2012-07-15T00:00:00.000Z",startDate:"2012-07-08T00:00:00.000Z",zoomExtent:[0,10],polygon:[[[-78.89729,82.17577],[-82.64501,82.19426],[-82.64501,83.08067],[-66.58986,83.08497],[-63.78011,82.98908],[-63.78011,82.72198],[-65.0092,82.17577],[-78.89729,82.17577]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Assembled from July 2016 ASTER imagery (true color with estimated blue)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-LC81960222015233LGN00vis",name:"imagico.de: Northern German west coast tidalflats",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=LC81960222015233LGN00vis&z={zoom}&x={x}&y={-y}",endDate:"2015-08-21T00:00:00.000Z",startDate:"2015-08-21T00:00:00.000Z",zoomExtent:[0,12],polygon:[[[7.63568,53.28027],[7.63568,53.6677],[8.49433,55.50246],[9.20775,55.48106],[9.20775,53.28027],[7.63568,53.28027]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Up-to-date low tide imagery of the coast for updating mapping of tidalflats and shoals (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-LC81960222015233LGN00ir",name:"imagico.de: Northern German west coast tidalflats (infrared)",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=LC81960222015233LGN00ir&z={zoom}&x={x}&y={-y}",endDate:"2015-08-21T00:00:00.000Z",startDate:"2015-08-21T00:00:00.000Z",zoomExtent:[0,12],polygon:[[[7.63568,53.28027],[7.63568,53.66811],[8.49433,55.50246],[9.20775,55.48106],[9.20775,53.28027],[7.63568,53.28027]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Up-to-date low tide imagery of the coast for updating mapping of tidalflats and shoals (false color IR)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-ngreenland_ast",name:"imagico.de: Northern Greenland ASTER",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=ngreenland_ast&z={zoom}&x={x}&y={-y}",endDate:"2012-08-13T00:00:00.000Z",startDate:"2005-06-21T00:00:00.000Z",zoomExtent:[0,10],polygon:[[[-52.49222,82.48972],[-52.49222,82.94295],[-49.28696,83.47312],[-44.5285,83.73214],[-29.5253,83.73214],[-25.26398,83.58271],[-21.18393,83.39776],[-21.18393,82.74312],[-23.40454,82.48972],[-52.49222,82.48972]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Assembled from mostly 2012 ASTER imagery, some 2005 images mainly in the northeast (true color with estimated blue)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-EO1A1350972013086110KF",name:"imagico.de: Northwest Heard Island",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=EO1A1350972013086110KF&z={zoom}&x={x}&y={-y}",endDate:"2013-03-13T00:00:00.000Z",startDate:"2013-03-13T00:00:00.000Z",zoomExtent:[0,13],polygon:[[[73.2279,-53.20333],[73.2279,-53.01073],[73.25949,-52.94944],[73.78992,-52.94944],[73.78992,-53.06048],[73.71783,-53.20333],[73.2279,-53.20333]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Glaciers of Northwest Heard Island (mapped meanwhile) (false color IR)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-S2A_R111_N09_20160604T154554",name:"imagico.de: Panama Canal",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=S2A_R111_N09_20160604T154554&z={zoom}&x={x}&y={-y}",endDate:"2016-06-07T00:00:00.000Z",startDate:"2016-06-07T00:00:00.000Z",zoomExtent:[0,14],polygon:[[[-80.01654,8.84898],[-80.01654,9.41481],[-79.46859,9.41481],[-79.46859,8.84898],[-80.01654,8.84898]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Images of the new locks (but partly cloudy) (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-EO1A0120532016364110KF",name:"imagico.de: Panama Canal - Pacific side",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=EO1A0120532016364110KF&z={zoom}&x={x}&y={-y}",endDate:"2016-12-30T00:00:00.000Z",startDate:"2016-12-30T00:00:00.000Z",zoomExtent:[0,14],polygon:[[[-79.62539,8.77083],[-79.68684,8.82197],[-79.68667,8.93705],[-79.65363,9.09294],[-79.26816,9.09294],[-79.32833,8.77083],[-79.62539,8.77083]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"New locks with less clouds than in the Sentinel-2 image - make sure to check image alignment (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-S2A_R078_N68_20160930T081002",name:"imagico.de: Pechora Sea Coast",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=S2A_R078_N68_20160930T081002&z={zoom}&x={x}&y={-y}",endDate:"2016-09-30T00:00:00.000Z",startDate:"2016-09-30T00:00:00.000Z",zoomExtent:[0,13],polygon:[[[53.1802,67.5344],[53.1821,68.414],[54.2107,69.3367],[55.3584,70.2786],[59.004,70.2786],[60.6947,69.977],[61.9837,69.7161],[61.9823,68.9395],[59.9153,67.5344],[53.1802,67.5344]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Sentinel-2 image of the Pechora Sea coast in autumn 2016 (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-LC81511242016033LGN00",name:"imagico.de: Pensacola Mountains",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=LC81511242016033LGN00&z={zoom}&x={x}&y={-y}",endDate:"2016-02-02T00:00:00.000Z",startDate:"2016-02-02T00:00:00.000Z",zoomExtent:[0,10],polygon:[[[-53.20922,-84.12525],[-60.61538,-83.78609],[-60.61538,-82.29969],[-48.72405,-82.29987],[-44.52178,-82.43683],[-44.51354,-84.12525],[-53.20922,-84.12525]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Outside regular Landsat coverage and therefore not in LIMA and Bing/Mapbox (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-S2A_R136_N41_20150831T093006",name:"imagico.de: Prokletije Mountains",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=S2A_R136_N41_20150831T093006&z={zoom}&x={x}&y={-y}",endDate:"2015-08-31T00:00:00.000Z",startDate:"2015-08-31T00:00:00.000Z",zoomExtent:[0,14],polygon:[[[19.11233,42.15316],[19.08426,43.08074],[20.63299,43.09603],[20.63788,42.16779],[19.11233,42.15316]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Late summer imagery where usual sources are severely limited by clouds and snow (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-DMS_1142622_03746_20110415_17533956",name:"imagico.de: Qasigiannguit",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=DMS_1142622_03746_20110415_17533956&z={zoom}&x={x}&y={-y}",endDate:"2011-04-15T00:00:00.000Z",startDate:"2011-04-15T00:00:00.000Z",zoomExtent:[0,15],polygon:[[[-51.23857,68.79972],[-51.24334,68.85303],[-51.15167,68.85303],[-51.14038,68.80116],[-51.23857,68.79972]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Icebridge DMS image of the settlement - alignment might be poor",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-LC81510432015030LGN00",name:"imagico.de: Rann of Kutch",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=LC81510432015030LGN00&z={zoom}&x={x}&y={-y}",endDate:"2015-01-01T00:00:00.000Z",startDate:"2015-01-01T00:00:00.000Z",zoomExtent:[0,12],polygon:[[[67.9684,22.36265],[67.86231,22.38392],[67.86231,24.88693],[71.48986,24.88693],[71.48986,22.36265],[67.9684,22.36265]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Land/water distinction difficult to properly map based on Bing/Mapbox images (false color IR)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-S2A_R093_N41_20150828T092005",name:"imagico.de: Rila and Pirin Mountains",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=S2A_R093_N41_20150828T092005&z={zoom}&x={x}&y={-y}",endDate:"2015-08-28T00:00:00.000Z",startDate:"2015-08-28T00:00:00.000Z",zoomExtent:[0,14],polygon:[[[23.80811,41.58488],[22.99238,41.60195],[23.01186,42.29984],[23.99402,42.28339],[23.96561,41.58488],[23.80811,41.58488]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Late summer imagery where usual sources are severely limited by clouds and snow (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-LC81730602015040LGN00",name:"imagico.de: Rwenzori Mountains",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=LC81730602015040LGN00&z={zoom}&x={x}&y={-y}",endDate:"2015-02-09T00:00:00.000Z",startDate:"2015-02-09T00:00:00.000Z",zoomExtent:[0,13],polygon:[[[29.7663,0.20689],[29.7663,0.50918],[30.0346,0.50918],[30.0346,0.20689],[29.7663,0.20689]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Recent image of most of the remaining Rwenzori Mountains glaciers (false color IR)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-S2A_R078_N01_20160702T082522",name:"imagico.de: Rwenzori Mountains 2016",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=S2A_R078_N01_20160702T082522&z={zoom}&x={x}&y={-y}",endDate:"2016-07-02T00:00:00.000Z",startDate:"2016-07-02T00:00:00.000Z",zoomExtent:[0,14],polygon:[[[29.80514,0.23586],[29.80514,0.46709],[30.02503,0.46709],[30.02503,0.23586],[29.80514,0.23586]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Up-to-date image for glacier mapping (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-LC80611072014036LGN00",name:"imagico.de: Scott Island",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=LC80611072014036LGN00&z={zoom}&x={x}&y={-y}",endDate:"2014-02-05T00:00:00.000Z",startDate:"2014-02-05T00:00:00.000Z",zoomExtent:[0,13],polygon:[[[-180,-67.42635],[-180,-67.32544],[-179.82473,-67.32538],[-179.82473,-67.42635],[-180,-67.42635]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Missing in other image sources (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-LC82100972015347LGN00",name:"imagico.de: Shag Rocks",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=LC82100972015347LGN00&z={zoom}&x={x}&y={-y}",endDate:"2015-12-13T00:00:00.000Z",startDate:"2015-12-13T00:00:00.000Z",zoomExtent:[0,13],polygon:[[[-42.12875,-53.7205],[-42.14626,-53.45782],[-41.67573,-53.44586],[-41.65582,-53.70872],[-42.12875,-53.7205]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Missing in other image sources (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-LC81130622013270LGN00",name:"imagico.de: Southeastern Sulawesi",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=LC81130622013270LGN00&z={zoom}&x={x}&y={-y}",endDate:"2013-09-27T00:00:00.000Z",startDate:"2013-09-27T00:00:00.000Z",zoomExtent:[0,13],polygon:[[[120.84382,-3.59545],[120.84382,-3.15985],[120.98184,-2.51468],[122.62618,-2.51468],[122.62618,-3.00215],[122.5007,-3.59545],[120.84382,-3.59545]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Missing islands and coarse coastline due to cloud cover in Bing, lakes could also use additional detail (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-LC80281222016035LGN00",name:"imagico.de: Southern Transantarctic Mountains",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=LC80281222016035LGN00&z={zoom}&x={x}&y={-y}",endDate:"2016-02-04T00:00:00.000Z",startDate:"2016-02-04T00:00:00.000Z",zoomExtent:[0,10],polygon:[[[156.96951,-84.50098],[154.50858,-84.46255],[154.50858,-82.60681],[175.46774,-82.58505],[177.00583,-83.52807],[177.00583,-84.19262],[171.93839,-84.34633],[166.83798,-84.4437],[161.67029,-84.50045],[156.96951,-84.50098]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Outside regular Landsat coverage and therefore not in LIMA and Bing/Mapbox (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-LC81030632015286LGN00",name:"imagico.de: Sudirman Range 2015",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=LC81030632015286LGN00&z={zoom}&x={x}&y={-y}",endDate:"2015-10-13T00:00:00.000Z",startDate:"2015-10-13T00:00:00.000Z",zoomExtent:[0,13],polygon:[[[136.4226,-4.2853],[136.4226,-3.6447],[137.7971,-3.6447],[137.7971,-4.2853],[136.4226,-4.2853]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Older image of the Sudirman Range with no fresh snow showing glacier extent (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-S2A_R088_S05_20160812T011732",name:"imagico.de: Sudirman Range 2016",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=S2A_R088_S05_20160812T011732&z={zoom}&x={x}&y={-y}",endDate:"2016-08-12T00:00:00.000Z",startDate:"2016-08-12T00:00:00.000Z",zoomExtent:[0,14],polygon:[[[136.8044,-4.2585],[136.8044,-3.7836],[137.7701,-3.7836],[137.7701,-4.2585],[136.8044,-4.2585]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Cloud free image of the Sudirman Range but with fresh snow (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-s2sval",name:"imagico.de: Svalbard mosaic",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=s2sval&z={zoom}&x={x}&y={-y}",endDate:"2016-01-01T00:00:00.000Z",startDate:"2016-01-01T00:00:00.000Z",zoomExtent:[0,12],polygon:[[[16.6108,76.4137],[16.4731,76.4268],[16.3788,76.4589],[14.4124,77.1324],[14.0784,77.2536],[10.9875,78.4054],[10.631,78.5605],[10.2314,78.8392],[10.3952,79.6074],[10.516,79.7731],[10.9632,79.8707],[20.2294,80.849],[20.4702,80.8493],[25.1752,80.6817],[33.4391,80.3438],[33.7809,80.3016],[34.0395,80.239],[33.977,80.1527],[25.5722,76.5917],[25.2739,76.481],[25.1416,76.4327],[24.937,76.4176],[16.6108,76.4137]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Sentinel-2 mosaic of Svalbard (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-DMS_1142636_160xx_20110507_1822xxxx",name:"imagico.de: Thule Air Base",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=DMS_1142636_160xx_20110507_1822xxxx&z={zoom}&x={x}&y={-y}",endDate:"2011-05-07T00:00:00.000Z",startDate:"2011-05-07T00:00:00.000Z",zoomExtent:[0,15],polygon:[[[-68.93977,76.51133],[-68.93977,76.5499],[-68.76635,76.55176],[-68.50993,76.55176],[-68.50744,76.51612],[-68.67897,76.51194],[-68.93977,76.51133]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Icebridge DMS image - alignment might be poor",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-dms_thule2_2015.09.25",name:"imagico.de: Thule Airbase DMS low altitude overflight September 2015",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=dms_thule2_2015.09.25&z={zoom}&x={x}&y={-y}",endDate:"2015-09-25T00:00:00.000Z",startDate:"2015-09-25T00:00:00.000Z",zoomExtent:[0,17],polygon:[[[-68.74292,76.52636],[-68.74446,76.5284],[-68.74807,76.54939],[-68.74615,76.56017],[-68.72276,76.56022],[-68.72017,76.55775],[-68.71853,76.52921],[-68.71978,76.52637],[-68.74292,76.52636]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Icebridge DMS aerial images from Thule Airbase - alignment might be poor",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-dms_thule_2015.10.06",name:"imagico.de: Thule Airbase DMS overflight October 2015",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=dms_thule_2015.10.06&z={zoom}&x={x}&y={-y}",endDate:"2015-10-06T00:00:00.000Z",startDate:"2015-10-06T00:00:00.000Z",zoomExtent:[0,16],polygon:[[[-68.81924,76.5251],[-68.82651,76.54177],[-68.77345,76.5439],[-68.7021,76.54545],[-68.59177,76.5456],[-68.59183,76.52793],[-68.6597,76.5251],[-68.81924,76.5251]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Icebridge DMS aerial images from Thule Airbase - alignment might be poor",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-dms_thule_2015.09.25",name:"imagico.de: Thule Airbase DMS overflight September 2015",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=dms_thule_2015.09.25&z={zoom}&x={x}&y={-y}",endDate:"2015-09-25T00:00:00.000Z",startDate:"2015-09-25T00:00:00.000Z",zoomExtent:[0,16],polygon:[[[-68.77771,76.50688],[-68.77662,76.57064],[-68.68115,76.57065],[-68.6763,76.55384],[-68.6762,76.53074],[-68.68523,76.50688],[-68.77771,76.50688]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Icebridge DMS aerial images from Thule Airbase - alignment might be poor",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-S2A_R094_N79_20160812T105622",name:"imagico.de: Ushakov Island August 2016",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=S2A_R094_N79_20160812T105622&z={zoom}&x={x}&y={-y}",endDate:"2016-08-12T00:00:00.000Z",startDate:"2016-08-12T00:00:00.000Z",zoomExtent:[0,12],polygon:[[[78.45886,80.72643],[78.45886,80.9099],[80.48892,80.9099],[80.48892,80.72643],[78.45886,80.72643]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Up-to-date late summer imagery with few clouds (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-LC80910682014358LGN00",name:"imagico.de: Vanatinai",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=LC80910682014358LGN00&z={zoom}&x={x}&y={-y}",endDate:"2014-12-24T00:00:00.000Z",startDate:"2014-12-24T00:00:00.000Z",zoomExtent:[0,13],polygon:[[[153.06138,-11.78923],[153.06138,-11.28869],[153.10927,-11.07229],[154.41201,-11.07229],[154.41201,-11.78923],[153.06138,-11.78923]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Coarse coastline due to cloud cover in Bing/Mapbox (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-LC82330892016031LGN00",name:"imagico.de: Volcán Calbuco",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=LC82330892016031LGN00&z={zoom}&x={x}&y={-y}",endDate:"2016-01-31T00:00:00.000Z",startDate:"2016-01-31T00:00:00.000Z",zoomExtent:[0,13],polygon:[[[-72.86696,-41.51741],[-72.86696,-41.04527],[-72.23181,-41.04527],[-71.8751,-41.10829],[-72.00007,-41.51741],[-72.86696,-41.51741]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Image from after the 2015 eruption (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-S2A_R089_N52_20160623T024048",name:"imagico.de: Vostochny Cosmodrome",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=S2A_R089_N52_20160623T024048&z={zoom}&x={x}&y={-y}",endDate:"2016-06-23T00:00:00.000Z",startDate:"2016-06-23T00:00:00.000Z",zoomExtent:[0,13],polygon:[[[126.36143,51.37553],[126.34804,52.33932],[128.60762,52.3409],[128.61174,51.37553],[126.36143,51.37553]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Recent image showing newest features (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-walps_autumn_2017",name:"imagico.de: Western Alps autumn colors 2017",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=walps_autumn_2017&z={zoom}&x={x}&y={-y}",endDate:"2017-10-17T00:00:00.000Z",startDate:"2017-10-17T00:00:00.000Z",zoomExtent:[0,13],polygon:[[[4.6412,43.2493],[4.3118,43.2653],[4.3118,44.2167],[5.2562,46.965],[5.9151,48.7177],[7.3866,48.7467],[10.088,48.7467],[10.088,48.7032],[7.7819,43.2813],[7.76,43.2653],[7.3646,43.2493],[4.6412,43.2493]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Autumn colors in the Alps, Jura and southwestern Germany  (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-LC81490352013282LGN00",name:"imagico.de: Western Karakoram",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=LC81490352013282LGN00&z={zoom}&x={x}&y={-y}",endDate:"2013-10-09T00:00:00.000Z",startDate:"2013-10-09T00:00:00.000Z",zoomExtent:[0,13],polygon:[[[75.98364,34.97851],[73.96164,35.36957],[74.44281,37.09391],[76.50601,36.70267],[75.98364,34.97851]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Represents approximately minimum snow cover so can be well used for glacier mapping (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-S2A_R039_S15_20160510T145731",name:"imagico.de: Willkanuta Mountains and Quelccaya Ice Cap",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=S2A_R039_S15_20160510T145731&z={zoom}&x={x}&y={-y}",endDate:"2016-05-10T00:00:00.000Z",startDate:"2016-05-10T00:00:00.000Z",zoomExtent:[0,14],polygon:[[[-71.18071,-14.49785],[-71.17976,-13.71029],[-70.55637,-13.71263],[-70.55637,-14.49785],[-71.18071,-14.49785]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Poor and outdated imagery in other sources (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"IPR-orotofoto-last-tms",name:"IPR ortofoto LAST (tmsproxy)",type:"tms",template:"https://osm-{switch:a,b,c}.zby.cz/tiles_ipr_last.php/{zoom}/{x}/{y}.jpg",zoomExtent:[1,20],polygon:[[[14.81232,49.93089],[14.18755,49.87687],[14.12025,50.19882],[14.74502,50.25247],[14.81232,49.93089]]]},{id:"IPR-orotofoto-vege-tms",name:"IPR ortofoto Low-Vegetation (tmsproxy)",type:"tms",template:"https://osm-{switch:a,b,c}.zby.cz/tiles_ipr_vege.php/{zoom}/{x}/{y}.jpg",zoomExtent:[1,20],polygon:[[[14.30454,49.99538],[14.31604,49.94205],[14.35,49.94508],[14.35384,49.92726],[14.42385,49.93352],[14.42009,49.95097],[14.48865,49.95709],[14.48479,49.97501],[14.55386,49.98117],[14.55012,49.99852],[14.58455,50.00159],[14.5883,49.98424],[14.69168,49.99346],[14.67634,50.06453],[14.71279,50.06777],[14.70115,50.12158],[14.6647,50.11834],[14.661,50.13543],[14.62755,50.13246],[14.61965,50.16895],[14.58543,50.16591],[14.58163,50.18344],[14.40776,50.168],[14.41156,50.15045],[14.37765,50.14744],[14.3738,50.16524],[14.33893,50.16214],[14.34278,50.14434],[14.27368,50.1382],[14.27749,50.12058],[14.2088,50.11447],[14.21289,50.09557],[14.24656,50.09857],[14.25417,50.06336],[14.21987,50.0603],[14.2237,50.04259],[14.258,50.04565],[14.26953,49.99226],[14.30454,49.99538]]]},{id:"GSGS3906",name:"Ireland British War Office 1:25k GSGS 3906",type:"tms",template:"https://mapwarper.net/layers/tile/101/{zoom}/{x}/{y}.png",zoomExtent:[0,18],polygon:[[[-9.31139,51.43828],[-7.36131,51.99302],[-7.33934,52.13149],[-6.9658,52.06231],[-6.23796,52.1534],[-6.21049,52.52928],[-5.98253,52.80079],[-5.96056,53.67037],[-6.20775,53.67851],[-6.22423,53.95255],[-5.86442,54.12513],[-5.85893,54.20392],[-5.53483,54.23122],[-5.39476,54.44739],[-5.50188,54.70052],[-6.21873,55.38194],[-6.86418,55.2162],[-7.25145,55.46455],[-7.53435,55.30853],[-8.25395,55.26787],[-8.61101,54.97259],[-8.49016,54.89369],[-8.83897,54.68306],[-8.42699,54.52397],[-8.75108,54.31302],[-9.29765,54.38985],[-10.05296,54.37866],[-10.30015,54.05747],[-10.02275,53.79386],[-10.30565,53.55142],[-9.99803,53.24354],[-9.09166,53.19256],[-9.81676,53.1102],[-9.48167,52.96984],[-9.70415,52.68107],[-10.00627,52.63608],[-9.78929,52.52426],[-9.99803,52.32663],[-10.64348,52.1753],[-10.39629,51.9761],[-10.16832,51.64668],[-10.28642,51.57334],[-9.88542,51.57163],[-9.79204,51.44684],[-9.31139,51.43828]]],terms_url:"https://wiki.openstreetmap.org/wiki/Ireland/Background_Imagery#Trinity_College_Dublin",terms_text:"Glucksman Map Library, Trinity College Dublin",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/ie/IrelandBritishWarOffice-GSGS3906.png"},{id:"Israel_Hiking",name:"Israel Hiking",type:"tms",template:"https://israelhiking.osm.org.il/Tiles/{zoom}/{x}/{y}.png",zoomExtent:[7,16],polygon:[[[34.64563,32.92073],[34.98374,33.13352],[35.15662,33.09994],[35.31781,33.11463],[35.36541,33.06285],[35.46229,33.09994],[35.51741,33.12652],[35.5266,33.21531],[35.53893,33.25442],[35.56446,33.2969],[35.61264,33.27918],[35.67429,33.30627],[35.70785,33.34269],[35.75363,33.35091],[35.81509,33.3392],[35.91531,32.9406],[35.80834,32.772],[35.77835,32.72446],[35.59491,32.62828],[35.5729,32.36541],[35.59461,32.21856],[35.55452,32.02901],[35.57225,31.75415],[35.48771,31.41951],[35.4209,31.25116],[35.47936,31.1783],[35.42771,30.95172],[35.3321,30.77107],[35.20709,30.53307],[35.17202,30.11204],[35.07514,29.83713],[35.02336,29.64569],[34.93992,29.39946],[34.89517,29.37711],[34.84785,29.59084],[34.69667,30.10714],[34.52423,30.40912],[34.48879,30.64515],[34.07929,31.52265],[34.64563,32.92073]]],terms_url:"https://israelhiking.osm.org.il/",terms_text:"Tiles © IsraelHiking, CC BY-SA-NC 3.0. Data by OpenStreetMap under ODbL.",description:"Israel Hiking map",icon:"https://israelhiking.osm.org.il/content/favicons/favicon.ico"},{id:"Israel_MTB",name:"Israel MTB",type:"tms",template:"https://israelhiking.osm.org.il/MTBTiles/{zoom}/{x}/{y}.png",zoomExtent:[7,16],polygon:[[[34.64563,32.92073],[34.98374,33.13352],[35.15662,33.09994],[35.31781,33.11463],[35.36541,33.06285],[35.46229,33.09994],[35.51741,33.12652],[35.5266,33.21531],[35.53893,33.25442],[35.56446,33.2969],[35.61264,33.27918],[35.67429,33.30627],[35.70785,33.34269],[35.75363,33.35091],[35.81509,33.3392],[35.91531,32.9406],[35.80834,32.772],[35.77835,32.72446],[35.59491,32.62828],[35.5729,32.36541],[35.59461,32.21856],[35.55452,32.02901],[35.57225,31.75415],[35.48771,31.41951],[35.4209,31.25116],[35.47936,31.1783],[35.42771,30.95172],[35.3321,30.77107],[35.20709,30.53307],[35.17202,30.11204],[35.07514,29.83713],[35.02336,29.64569],[34.93992,29.39946],[34.89517,29.37711],[34.84785,29.59084],[34.69667,30.10714],[34.52423,30.40912],[34.48879,30.64515],[34.07929,31.52265],[34.64563,32.92073]]],terms_url:"https://israelhiking.osm.org.il/",terms_text:"Tiles © IsraelHiking, CC BY-SA-NC 3.0. Data by OpenStreetMap under ODbL.",description:"Israel MTB map",icon:"https://israelhiking.osm.org.il/content/favicons/favicon.ico"},{id:"ITACyL-Castile-and-Leon",name:"ITACyL - Castile and León",type:"wms",template:"http://orto.wms.itacyl.es/WMS?REQUEST=GetMap&SERVICE=WMS&VERSION=1.1.1&LAYERS=Ortofoto_CyL&SRS={proj}&FORMAT=image/jpeg&STYLES=Default&TRANSPARENT=TRUE&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",polygon:[[[-1.9358,41.43834],[-1.89601,41.43869],[-1.89536,41.39687],[-1.9767,41.39616],[-1.97639,41.37623],[-2.06201,41.37548],[-2.06262,41.41471],[-2.10458,41.41434],[-2.10363,41.35367],[-2.14448,41.35331],[-2.1419,41.18683],[-2.06204,41.18753],[-2.06171,41.16624],[-2.02046,41.16661],[-2.01887,41.06334],[-2.10083,41.06262],[-2.10114,41.08296],[-2.22733,41.08185],[-2.22704,41.0635],[-2.26912,41.06313],[-2.2688,41.04257],[-2.35325,41.04182],[-2.35356,41.06148],[-2.39487,41.06112],[-2.39457,41.04206],[-2.43722,41.04168],[-2.43756,41.06315],[-2.47928,41.06278],[-2.47991,41.10369],[-2.52078,41.10333],[-2.5211,41.12429],[-2.60415,41.12357],[-2.60481,41.16628],[-2.6471,41.16591],[-2.64808,41.22931],[-2.72874,41.2286],[-2.72907,41.24974],[-2.89552,41.24828],[-2.89649,41.31063],[-2.9363,41.31028],[-2.93571,41.27231],[-3.14692,41.27046],[-3.14723,41.29045],[-3.22828,41.28974],[-3.22767,41.25008],[-3.39581,41.2486],[-3.39518,41.20808],[-3.43492,41.20773],[-3.43429,41.16696],[-3.47877,41.16657],[-3.47844,41.14556],[-3.60336,41.14446],[-3.6027,41.10169],[-3.64539,41.10131],[-3.64508,41.08159],[-3.68735,41.08122],[-3.68673,41.04104],[-3.72866,41.04067],[-3.72803,40.9998],[-3.76896,40.99944],[-3.76864,40.97886],[-3.85473,40.97811],[-3.8544,40.95653],[-3.89857,40.95615],[-3.89764,40.89575],[-3.93906,40.89539],[-3.93716,40.77204],[-4.06198,40.77093],[-4.06133,40.72926],[-4.10372,40.72888],[-4.10311,40.68918],[-4.14628,40.6888],[-4.14498,40.60421],[-4.19025,40.60381],[-4.18994,40.58362],[-4.22946,40.58327],[-4.22979,40.60487],[-4.27054,40.60451],[-4.26958,40.54211],[-4.31384,40.54171],[-4.31163,40.39758],[-4.39376,40.39685],[-4.39345,40.37677],[-4.43723,40.37638],[-4.43623,40.31123],[-4.52192,40.31046],[-4.52037,40.20897],[-4.56131,40.2086],[-4.56099,40.18763],[-4.68895,40.18649],[-4.68933,40.21101],[-4.73192,40.21063],[-4.73252,40.24966],[-4.76838,40.24934],[-4.76809,40.23035],[-4.81104,40.22996],[-4.81147,40.20726],[-4.8542,40.18414],[-4.85264,40.12563],[-4.93699,40.12488],[-4.93638,40.08529],[-5.35538,40.08155],[-5.35606,40.12562],[-5.44027,40.12487],[-5.44091,40.16673],[-5.60382,40.16527],[-5.60448,40.20881],[-5.68646,40.20808],[-5.68712,40.25131],[-6.02166,40.24834],[-6.02295,40.33257],[-6.10433,40.33184],[-6.1056,40.41451],[-6.18951,40.41376],[-6.19018,40.45745],[-6.26971,40.45675],[-6.26909,40.41653],[-6.35192,40.41579],[-6.35128,40.37422],[-6.43325,40.37349],[-6.43264,40.33361],[-6.52245,40.33281],[-6.52116,40.24849],[-6.59942,40.24779],[-6.59886,40.21128],[-6.85568,40.20899],[-6.85634,40.25257],[-6.93622,40.25186],[-6.93751,40.33657],[-6.85111,40.33734],[-6.86001,40.91672],[-6.93544,40.91605],[-6.93741,41.0435],[-6.85482,41.04423],[-6.85548,41.08706],[-6.77015,41.08781],[-6.77245,41.23623],[-6.68379,41.23701],[-6.60436,41.2377],[-6.60524,41.29474],[-6.5193,41.29549],[-6.51991,41.33479],[-6.43673,41.33552],[-6.43801,41.41814],[-6.35318,41.41888],[-6.35447,41.50141],[-6.26889,41.50216],[-6.2708,41.6245],[-6.35661,41.62375],[-6.35724,41.66401],[-6.43548,41.66333],[-6.4349,41.62651],[-6.52279,41.62575],[-6.52343,41.66635],[-6.6034,41.66565],[-6.60733,41.9166],[-7.02209,41.913],[-7.02406,42.03872],[-7.1054,42.03801],[-7.10613,42.08421],[-7.0208,42.08495],[-7.02276,42.2094],[-6.93699,42.21014],[-6.93763,42.25087],[-6.8548,42.25159],[-6.85545,42.29329],[-6.77342,42.294],[-6.77403,42.33244],[-6.85325,42.33176],[-6.85523,42.4569],[-7.10341,42.45477],[-7.10811,42.75115],[-7.02199,42.75189],[-7.02241,42.77825],[-6.93976,42.77896],[-6.94199,42.91962],[-6.77302,42.92106],[-6.77363,42.95958],[-6.52329,42.96172],[-6.52391,43.00095],[-6.43893,43.00167],[-6.44024,43.08361],[-5.93782,43.08789],[-5.93708,43.04189],[-5.85421,43.0426],[-5.85357,43.00258],[-5.77236,43.00327],[-5.77363,43.08308],[-5.6027,43.08453],[-5.60202,43.04222],[-5.52161,43.04291],[-5.52226,43.08409],[-5.4376,43.08481],[-5.43827,43.12651],[-5.10444,43.12935],[-5.10573,43.2099],[-5.02386,43.2106],[-5.02451,43.25117],[-4.90017,43.25222],[-4.89941,43.20501],[-4.81126,43.20576],[-4.80966,43.10538],[-4.76975,43.10571],[-4.76937,43.08168],[-4.72945,43.08202],[-4.72881,43.04219],[-4.56322,43.0436],[-4.56353,43.06296],[-4.39599,43.06438],[-4.39566,43.04336],[-4.3537,43.04371],[-4.35266,42.97836],[-4.23013,42.9794],[-4.22913,42.91625],[-4.18774,42.9166],[-4.18706,42.87407],[-4.10552,42.87476],[-4.10486,42.83348],[-3.97801,42.83457],[-3.97733,42.79214],[-3.9375,42.79248],[-3.93781,42.81183],[-3.85397,42.81254],[-3.85427,42.83193],[-3.89573,42.83158],[-3.89607,42.85343],[-3.93821,42.85307],[-3.93889,42.89577],[-3.9806,42.89542],[-3.98093,42.91627],[-4.0222,42.91591],[-4.0229,42.96014],[-3.97851,42.96052],[-3.97946,43.01999],[-3.93883,43.02034],[-3.93918,43.04239],[-3.89704,43.04275],[-3.89738,43.06414],[-3.85424,43.06451],[-3.8549,43.10583],[-3.77086,43.10654],[-3.77116,43.12515],[-3.72819,43.12551],[-3.72853,43.14656],[-3.68713,43.14691],[-3.68778,43.18786],[-3.60365,43.18858],[-3.60331,43.16747],[-3.52278,43.16815],[-3.52243,43.14619],[-3.39669,43.14726],[-3.39699,43.16601],[-3.35444,43.16637],[-3.35479,43.18837],[-3.31268,43.18873],[-3.31299,43.20828],[-3.22993,43.20899],[-3.22959,43.18768],[-3.10343,43.18875],[-3.10274,43.14562],[-3.14546,43.14526],[-3.14516,43.1271],[-3.10617,43.12743],[-3.10445,43.01915],[-3.02075,43.01987],[-3.0201,42.97903],[-2.9811,42.97936],[-2.97977,42.8958],[-3.10476,42.89473],[-3.10276,42.76928],[-3.02199,42.76997],[-3.02168,42.74983],[-2.98024,42.75019],[-2.97988,42.7275],[-2.89613,42.72822],[-2.89679,42.76967],[-2.8534,42.77004],[-2.85405,42.81087],[-2.68577,42.81231],[-2.68544,42.79159],[-2.64523,42.79194],[-2.64489,42.77024],[-2.52005,42.7713],[-2.51936,42.72827],[-2.5607,42.72791],[-2.56038,42.7076],[-2.51944,42.70795],[-2.5181,42.62357],[-2.60404,42.62283],[-2.60439,42.64497],[-2.77154,42.64353],[-2.77188,42.66544],[-2.81176,42.6651],[-2.8121,42.68624],[-2.85469,42.68588],[-2.85337,42.60302],[-2.89413,42.60267],[-2.89379,42.58159],[-3.0619,42.58015],[-3.06031,42.47952],[-3.02191,42.47985],[-3.0199,42.3525],[-3.06255,42.35213],[-3.06029,42.20906],[-3.1012,42.20871],[-3.10086,42.18682],[-3.06175,42.18716],[-3.0611,42.14559],[-3.02029,42.14594],[-3.01963,42.10375],[-2.89602,42.10482],[-2.89501,42.04071],[-2.81222,42.04143],[-2.81353,42.1246],[-2.76871,42.12499],[-2.76905,42.14674],[-2.72695,42.14711],[-2.7266,42.12485],[-2.68706,42.12519],[-2.68605,42.06109],[-2.72804,42.06073],[-2.72739,42.0193],[-2.60343,42.02037],[-2.60376,42.04135],[-2.561,42.04173],[-2.56198,42.10411],[-2.52266,42.10445],[-2.52299,42.12577],[-2.47933,42.12615],[-2.47963,42.145],[-2.35517,42.14608],[-2.3555,42.16747],[-2.31184,42.16785],[-2.3115,42.14605],[-2.2699,42.14641],[-2.26924,42.1048],[-2.2295,42.10515],[-2.22981,42.12514],[-2.14467,42.12587],[-2.14432,42.10386],[-2.10385,42.10421],[-2.10156,41.95811],[-1.97689,41.95919],[-1.97655,41.93765],[-1.93473,41.93801],[-1.93504,41.95776],[-1.89453,41.95811],[-1.89483,41.97715],[-1.854,41.97751],[-1.85304,41.91638],[-1.81381,41.91672],[-1.81151,41.76984],[-1.7706,41.77019],[-1.76866,41.64582],[-1.85335,41.64508],[-1.85305,41.62567],[-1.89471,41.6253],[-1.89403,41.58215],[-1.97716,41.58142],[-1.97683,41.56021],[-1.9377,41.56055],[-1.9358,41.43834]]],terms_text:"ITACyL"},{id:"gsi.go.jp_airphoto",name:"Japan GSI airphoto Imagery",type:"tms",template:"http://cyberjapandata.gsi.go.jp/xyz/airphoto/{zoom}/{x}/{y}.png",zoomExtent:[14,18],polygon:[[[140.88867,45.67548],[140.71289,45.41388],[141.04248,43.80282],[139.96582,43.35714],[138.99902,42.01665],[139.04297,41.26129],[137.5708,38.58253],[132.69287,36.86204],[130.84717,34.93999],[129.74854,34.994],[129.02344,34.56086],[128.36426,33.21112],[127.90283,31.87756],[128.4082,29.89781],[125.8374,26.78485],[123.33252,25.0657],[122.58545,24.42715],[123.53027,23.44309],[125.88135,24.10665],[129.96826,26.31311],[132.1875,30.20211],[134.42871,32.43561],[136.82373,33.28462],[137.85645,34.21634],[138.64746,33.24788],[138.58154,32.00808],[139.6582,28.67131],[141.65771,29.66896],[142.0752,32.06396],[141.21826,33.37641],[141.56982,35.44277],[141.43799,36.52729],[142.82227,39.16414],[143.04199,40.89691],[145.92041,42.40723],[146.18408,43.03678],[145.74463,43.54855],[145.32715,43.67582],[145.30518,43.91372],[145.61279,44.2452],[145.41504,44.62175],[144.38232,44.52784],[142.31689,45.53714],[141.3501,45.70618],[140.88867,45.67548]]],terms_url:"http://www.gsi.go.jp/kikakuchousei/kikakuchousei40182.html",terms_text:"GSI Japan",description:"Japan GSI airphoto Imagery. Not fully orthorectified, but a bit newer and/or differently covered than GSI ortho Imagery."},{id:"finds.jp_KBN_2500",name:"Japan GSI KIBAN 2500",type:"tms",template:"http://www.finds.jp/ws/tmc/1.0.0/KBN2500FN-900913-L/{zoom}/{x}/{y}.png",zoomExtent:[15,20],polygon:[[[140.88867,45.67548],[140.71289,45.41388],[141.04248,43.80282],[139.96582,43.35714],[138.99902,42.01665],[139.04297,41.26129],[137.5708,38.58253],[132.69287,36.86204],[130.84717,34.93999],[129.74854,34.994],[129.02344,34.56086],[128.36426,33.21112],[127.90283,31.87756],[128.4082,29.89781],[125.8374,26.78485],[123.33252,25.0657],[122.58545,24.42715],[123.53027,23.44309],[125.88135,24.10665],[129.96826,26.31311],[132.1875,30.20211],[134.42871,32.43561],[136.82373,33.28462],[137.85645,34.21634],[138.64746,33.24788],[138.58154,32.00808],[139.6582,28.67131],[141.65771,29.66896],[142.0752,32.06396],[141.21826,33.37641],[141.56982,35.44277],[141.43799,36.52729],[142.82227,39.16414],[143.04199,40.89691],[145.92041,42.40723],[146.18408,43.03678],[145.74463,43.54855],[145.32715,43.67582],[145.30518,43.91372],[145.61279,44.2452],[145.41504,44.62175],[144.38232,44.52784],[142.31689,45.53714],[141.3501,45.70618],[140.88867,45.67548]]],terms_url:"http://www.finds.jp/siteinfo/c_tou.html.ja",terms_text:"GSI KIBAN 2500",description:"GSI Kiban 2500 via finds.jp. Good for tracing, but a bit older."},{id:"gsi.go.jp",name:"Japan GSI ortho Imagery",type:"tms",template:"https://cyberjapandata.gsi.go.jp/xyz/ort/{zoom}/{x}/{y}.jpg",zoomExtent:[5,19],polygon:[[[130.35021,31.45741],[130.26851,31.45817],[130.20875,31.44939],[130.1002,31.44996],[130.09237,31.3919],[130.13355,31.37528],[130.35043,31.37528],[130.35021,31.45741]],[[130.4193,31.41715],[130.417,31.41672],[130.41677,31.47525],[130.34179,31.47506],[130.34179,31.48374],[130.33362,31.48374],[130.33329,31.50044],[130.36675,31.49997],[130.36664,31.52458],[130.35019,31.52544],[130.35041,31.54986],[130.32523,31.55024],[130.32501,31.60029],[130.31661,31.63336],[130.31634,31.65084],[130.3752,31.65084],[130.31164,31.67599],[130.29194,31.69179],[130.29105,31.73235],[130.2521,31.73387],[130.24986,31.71693],[130.24427,31.71712],[130.21629,31.75804],[130.17533,31.75919],[130.17422,31.78259],[130.18384,31.79096],[130.23644,31.79096],[130.26911,31.77003],[130.36334,31.75785],[130.42668,31.70893],[130.62409,31.7076],[130.62588,31.68627],[130.61088,31.62245],[130.55582,31.50249],[130.54239,31.41715],[130.42158,31.41715],[130.4193,31.41715]],[[130.52516,31.24184],[130.54441,31.24107],[130.56858,31.21715],[130.59924,31.21657],[130.59924,31.26633],[130.57641,31.26633],[130.57351,31.31625],[130.6308,31.28393],[130.68989,31.27666],[130.66706,31.26059],[130.66594,31.21925],[130.64401,31.18135],[130.59007,31.14688],[130.54239,31.17503],[130.54239,31.1913],[130.50009,31.19207],[130.50009,31.21581],[130.52494,31.21715],[130.52516,31.24184]],[[130.74987,31.16622],[130.74965,31.24107],[130.77449,31.25887],[130.77718,31.33307],[130.75122,31.37455],[130.74898,31.41658],[130.67557,31.46852],[130.67489,31.50077],[131.40006,31.5002],[131.40834,31.45916],[131.36694,31.40932],[131.3656,31.35142],[131.31703,31.34206],[131.29957,31.36595],[131.24317,31.36633],[131.19952,31.43358],[131.14782,31.45019],[131.13394,31.45],[131.1326,31.42899],[131.10059,31.42536],[131.05091,31.41639],[131.04912,31.39155],[131.08403,31.35085],[131.11626,31.35085],[131.11783,31.33422],[130.99943,31.33365],[130.99965,31.25102],[130.87521,31.25064],[130.87454,31.16679],[130.74987,31.16622]],[[130.86625,30.47468],[130.86602,30.49937],[130.93362,30.57493],[130.93227,30.61597],[131.00636,30.61655],[131.04933,30.59112],[131.04933,30.54275],[130.99203,30.50843],[130.99114,30.47526],[130.86625,30.47468]],[[137.87486,36.37519],[138.00005,36.37494],[138.00005,36.30839],[138.04159,36.30827],[138.04191,36.29175],[138.08306,36.29162],[138.08353,36.2499],[138.13307,36.24996],[138.13354,36.16677],[138.16654,36.1667],[138.16694,36.12485],[138.04167,36.12491],[138.04144,36.04158],[137.87479,36.04152],[137.87486,36.37519]],[[138.37446,35.83393],[138.4998,35.83285],[138.4998,35.75042],[138.74936,35.7506],[138.7507,35.58332],[138.62447,35.58386],[138.62536,35.49991],[138.37491,35.49972],[138.37446,35.83393]],[[135.79179,35.64165],[135.8006,35.64923],[135.834,35.65052],[135.8916,35.62003],[135.89271,35.6091],[135.95776,35.60858],[135.9834,35.6172],[135.98435,35.641],[135.95095,35.6419],[135.95048,35.68305],[135.94225,35.69204],[135.94178,35.73239],[136.00809,35.77516],[136.03167,35.77503],[136.05018,35.75012],[136.05003,35.66646],[136.0084,35.65836],[136.00856,35.61694],[136.03404,35.60022],[136.06664,35.59996],[136.06617,35.61656],[136.1002,35.62492],[136.1002,35.69127],[136.07598,35.69166],[136.07503,35.74922],[136.08342,35.76694],[136.12441,35.76605],[136.15021,35.7004],[136.15875,35.64216],[136.17442,35.62492],[136.17553,35.58342],[136.1749,35.55813],[136.15859,35.55832],[136.15875,35.56701],[136.1165,35.56675],[136.11626,35.52555],[136.04045,35.5247],[136.01684,35.50311],[136.01661,35.48334],[135.97543,35.48334],[135.94141,35.50885],[135.94186,35.56641],[135.93358,35.57487],[135.90873,35.57514],[135.90851,35.59953],[135.83185,35.59972],[135.7928,35.62519],[135.79179,35.64165]],[[135.80916,35.47505],[135.77044,35.53345],[135.7579,35.53326],[135.74168,35.51641],[135.70072,35.51705],[135.67464,35.53363],[135.67543,35.56659],[135.6996,35.58333],[135.81654,35.58343],[135.81654,35.56804],[135.85817,35.54956],[135.85851,35.52543],[135.8509,35.5247],[135.85012,35.47514],[135.80916,35.47505]],[[135.58333,35.44132],[135.61656,35.44989],[135.64163,35.47496],[135.71639,35.47478],[135.71728,35.46703],[135.81442,35.46539],[135.86668,35.44187],[135.86679,35.40868],[135.81722,35.40822],[135.81677,35.38496],[135.77548,35.3835],[135.75835,35.40804],[135.59183,35.4084],[135.58322,35.42536],[135.58333,35.44132]],[[135.40011,35.43312],[135.42496,35.44189],[135.45803,35.45008],[135.45899,35.49164],[135.46642,35.49184],[135.46619,35.50807],[135.44181,35.51709],[135.43968,35.53293],[135.45843,35.55804],[135.52324,35.55811],[135.52498,35.5091],[135.54152,35.50008],[135.54152,35.4834],[135.57515,35.48366],[135.57491,35.49164],[135.60878,35.49171],[135.60894,35.46684],[135.59208,35.45826],[135.53305,35.45826],[135.50029,35.45008],[135.50045,35.4415],[135.50789,35.42506],[135.53337,35.42513],[135.53297,35.38346],[135.5416,35.38333],[135.54176,35.36688],[135.5086,35.35836],[135.50892,35.34216],[135.50013,35.34164],[135.50013,35.41662],[135.39987,35.41655],[135.40011,35.43312]],[[133.70822,35.45816],[133.70822,35.33319],[133.12484,35.33328],[133.12495,35.3749],[132.95877,35.37508],[132.95821,35.4578],[132.87506,35.45853],[132.87461,35.52504],[132.95015,35.52522],[132.9497,35.55819],[133.01674,35.55855],[133.01685,35.56675],[133.03352,35.56693],[133.03308,35.59205],[133.06687,35.59187],[133.06654,35.6168],[133.14135,35.61671],[133.14151,35.59181],[133.36667,35.59186],[133.36689,35.57484],[133.34216,35.57447],[133.34194,35.558],[133.33321,35.55026],[133.28363,35.55017],[133.28341,35.49178],[133.33354,35.4916],[133.33354,35.47529],[133.41714,35.47492],[133.41714,35.37516],[133.49995,35.37534],[133.49973,35.45806],[133.45854,35.45806],[133.45854,35.51629],[133.49212,35.5335],[133.54136,35.54161],[133.58343,35.54197],[133.58355,35.45843],[133.70822,35.45816]],[[133.84174,35.46646],[133.84158,35.58367],[133.975,35.58329],[133.97532,35.5086],[134.00823,35.50834],[134.0334,35.49971],[134.0421,35.47497],[134.04432,35.45834],[134.08357,35.4586],[134.08309,35.53359],[134.13326,35.54969],[134.23328,35.55999],[134.27491,35.58342],[134.33299,35.58367],[134.33521,35.49172],[134.36654,35.49224],[134.36654,35.49997],[134.41718,35.49971],[134.41592,35.5417],[134.6253,35.54157],[134.62514,35.37554],[134.70839,35.37463],[134.70823,35.33398],[134.41655,35.33359],[134.41592,35.37528],[134.39218,35.37541],[134.39155,35.35011],[134.37477,35.33346],[134.20005,35.33359],[134.19939,35.35874],[134.24997,35.39971],[134.27515,35.39962],[134.27504,35.39205],[134.35819,35.39314],[134.35852,35.3999],[134.3752,35.39999],[134.37441,35.42489],[134.33256,35.42507],[134.33278,35.41659],[134.04954,35.41659],[134.05077,35.39178],[134.0661,35.39187],[134.06711,35.39999],[134.14187,35.40017],[134.14164,35.36678],[134.18339,35.35847],[134.18372,35.33337],[133.78309,35.33364],[133.78331,35.34159],[133.82472,35.3592],[133.82505,35.38311],[133.84173,35.40838],[133.89981,35.40893],[133.89981,35.41677],[133.85829,35.41659],[133.8574,35.46646],[133.84174,35.46646]],[[133.24987,33.66667],[133.41786,33.66674],[133.52485,33.66674],[133.52493,33.79178],[133.64157,33.79185],[133.64188,33.66681],[133.75006,33.66687],[133.75029,33.62517],[133.79152,33.62498],[133.79168,33.5084],[133.73336,33.5084],[133.73328,33.51658],[133.64196,33.51671],[133.60833,33.48346],[133.52493,33.46682],[133.47492,33.41935],[133.43313,33.38321],[133.37497,33.38334],[133.37497,33.49157],[133.20817,33.49191],[133.20824,33.55827],[133.24947,33.55833],[133.24987,33.66667]],[[134.3501,33.73355],[134.4832,33.73368],[134.48336,33.66732],[134.43366,33.65033],[134.43287,33.63412],[134.35279,33.63347],[134.3501,33.73355]],[[140.31656,36.21656],[140.31671,36.44984],[140.34973,36.44994],[140.35012,36.51668],[140.47467,36.51671],[140.47483,36.59159],[140.62489,36.59204],[140.62467,36.63354],[140.64974,36.6348],[140.65041,36.71684],[140.69912,36.81554],[140.71006,36.91306],[140.70838,36.95687],[140.74956,36.95866],[140.75323,37.06176],[140.75001,37.16671],[141.00832,37.16666],[141.00837,37.0917],[140.98331,37.05828],[140.98333,36.95834],[140.90834,36.90002],[140.81672,36.89999],[140.80828,36.87498],[140.80833,36.85],[140.81655,36.85004],[140.81669,36.8415],[140.81669,36.81816],[140.79988,36.80832],[140.7834,36.79992],[140.775,36.79523],[140.77498,36.78339],[140.75836,36.775],[140.75825,36.75837],[140.75002,36.75831],[140.74689,36.71939],[140.73336,36.65048],[140.69167,36.58337],[140.65003,36.51336],[140.64998,36.38351],[140.59986,36.27483],[140.57499,36.24796],[140.57463,36.21729],[140.31656,36.21656]],[[141.2166,41.24992],[141.41662,41.24971],[141.39858,41.17052],[141.40426,41.0968],[141.39503,41.04046],[141.39858,40.97185],[141.40625,40.91003],[141.41136,40.83011],[141.41307,40.80204],[141.42245,40.74987],[141.34161,40.75084],[141.3149,40.74556],[141.29203,40.74169],[141.23322,40.7419],[141.23307,40.85837],[141.25026,40.85858],[141.24941,40.91647],[141.17412,40.9169],[141.22498,40.9948],[141.23819,41.0696],[141.2497,41.1258],[141.27143,41.15875],[141.23336,41.22995],[141.2166,41.24992]],[[141.25854,41.3166],[141.15015,41.31672],[141.1499,41.39163],[141.18877,41.39205],[141.21625,41.37916],[141.25849,41.36012],[141.25854,41.3166]],[[141.05841,45.2584],[141.03453,45.25833],[141.00874,45.25815],[141.0083,45.27495],[140.99994,45.27495],[141.00002,45.30371],[140.99999,45.30828],[140.99196,45.30846],[140.99171,45.34162],[140.98351,45.34172],[140.98336,45.34998],[140.97477,45.35008],[140.97502,45.3667],[140.96664,45.36675],[140.96685,45.39818],[140.9665,45.42499],[140.9584,45.42484],[140.95816,45.43314],[140.95012,45.4335],[140.94967,45.51651],[140.97443,45.51672],[140.97448,45.50014],[140.98307,45.50042],[140.98332,45.46697],[140.99045,45.46704],[140.99135,45.45876],[141.00019,45.45813],[141.00035,45.45002],[141.01627,45.4502],[141.01637,45.47496],[141.04992,45.47532],[141.04992,45.46676],[141.06614,45.46679],[141.0665,45.4502],[141.07463,45.44999],[141.07498,45.34178],[141.0666,45.34168],[141.06418,45.30611],[141.06644,45.30565],[141.06629,45.28484],[141.05906,45.28357],[141.05841,45.2584]],[[144.27488,42.96671],[144.27502,42.99155],[144.25861,42.99145],[144.25805,42.98314],[144.20818,42.98319],[144.20854,42.97472],[144.16684,42.97503],[144.16684,43.00496],[144.16642,43.04178],[144.07486,43.04188],[144.07493,43.10025],[144.24988,43.1],[144.24988,43.1168],[144.29179,43.11675],[144.292,43.0919],[144.4168,43.09185],[144.4168,43.1168],[144.56654,43.1168],[144.56675,42.99171],[144.50005,42.9915],[144.5002,42.92481],[144.46653,42.92501],[144.31739,42.96675],[144.27488,42.96671]],[[140.69973,42.57513],[140.70015,42.61647],[140.84451,42.61673],[140.99961,42.61669],[141.00006,42.54168],[141.24984,42.54168],[141.24994,42.58336],[141.29163,42.58332],[141.29158,42.6251],[141.37501,42.62498],[141.37501,42.66662],[141.49992,42.66666],[141.49992,42.8165],[141.47496,42.8165],[141.47511,42.83341],[141.81236,42.83357],[141.95752,42.83328],[141.94355,42.77977],[141.95762,42.77896],[141.95832,42.7502],[141.99991,42.75086],[141.9992,42.71493],[142.00031,42.67632],[142.01799,42.65076],[142.09082,42.65002],[142.09122,42.5251],[142.02472,42.5251],[141.96033,42.52495],[141.8665,42.52518],[141.8656,42.57713],[141.83577,42.58519],[141.80482,42.57417],[141.74646,42.57705],[141.73069,42.61477],[141.61707,42.61055],[141.52134,42.60331],[141.45615,42.57587],[141.3562,42.52866],[141.27523,42.48822],[141.19507,42.43791],[141.10476,42.3914],[141.05393,42.33165],[141.0254,42.29161],[140.95187,42.29146],[140.9147,42.32682],[140.89451,42.37174],[140.88426,42.42723],[140.85041,42.46096],[140.76643,42.49978],[140.76663,42.52821],[140.69973,42.57513]],[[140.75005,43.23374],[140.82762,43.2135],[140.88245,43.22531],[140.97338,43.24601],[141.02139,43.24311],[141.04213,43.20211],[141.08346,43.18205],[141.17267,43.16382],[141.25678,43.19366],[141.37528,43.33327],[141.62491,43.33335],[141.62451,43.4168],[141.79146,43.4168],[141.79197,43.83339],[142.12487,43.83332],[142.12487,43.75022],[142.16656,43.74993],[142.16656,43.83317],[142.24954,43.83325],[142.24984,43.8581],[142.27465,43.8581],[142.27465,43.87425],[142.26671,43.8749],[142.26651,43.91688],[142.24994,43.9171],[142.25001,44.5],[142.49997,44.50013],[142.49977,43.88366],[142.51674,43.88344],[142.51644,43.83346],[142.62473,43.83346],[142.62473,43.58331],[142.54176,43.58403],[142.54196,43.50008],[142.50057,43.50022],[142.50037,43.25006],[142.25054,43.25014],[142.25004,43.45838],[142.00031,43.45816],[142.00001,43.41724],[141.91703,43.41688],[141.91703,43.33342],[141.87494,43.33327],[141.87454,43.17487],[141.93351,43.17473],[141.93391,43.15868],[141.99137,43.15802],[141.99207,43.1334],[141.87524,43.13332],[141.87484,43.00012],[141.49984,43.00027],[141.50015,42.91683],[141.25021,42.91631],[141.25001,42.9999],[141.12505,43.00005],[141.12525,43.08323],[140.99988,43.0836],[141.00008,43.16638],[140.75086,43.1666],[140.75005,43.23374]],[[140.59121,41.78353],[140.58382,41.8334],[140.58453,41.87732],[140.59092,41.91613],[140.60797,41.94403],[140.57544,41.95914],[140.58439,41.99979],[140.7104,42.00011],[140.86894,42.00011],[140.91724,42.00053],[140.99041,41.91909],[141.04737,41.90693],[141.12722,41.88398],[141.17552,41.83732],[141.20194,41.81488],[141.18418,41.78321],[141.11301,41.76711],[141.05689,41.71559],[140.99382,41.69968],[140.94267,41.70414],[140.89238,41.73563],[140.84806,41.74326],[140.80018,41.75672],[140.73299,41.74634],[140.69705,41.73234],[140.6881,41.76986],[140.59121,41.78353]],[[140.2418,42.2338],[140.24159,42.25827],[140.21005,42.25797],[140.20804,42.27485],[140.26611,42.27514],[140.2651,42.29179],[140.29001,42.2912],[140.29182,42.26779],[140.33914,42.24139],[140.34145,42.21662],[140.29323,42.21662],[140.2418,42.2338]],[[140.55007,42.08447],[140.54977,42.11387],[140.58066,42.11193],[140.62636,42.12069],[140.63365,42.12136],[140.6336,42.10061],[140.60853,42.09964],[140.60848,42.08327],[140.54972,42.08312],[140.55007,42.08447]],[[140.6583,41.06668],[140.67117,40.91974],[140.84492,40.91652],[140.91726,40.91688],[140.91712,40.87597],[140.9846,40.87533],[140.98503,40.79278],[141.13391,40.79192],[141.13972,40.68034],[141.17424,40.68174],[141.18504,40.60057],[141.43351,40.60078],[141.43308,40.51757],[141.18305,40.51649],[141.18362,40.58223],[141.16714,40.59172],[141.04397,40.59237],[141.04283,40.65825],[140.98402,40.65836],[140.72646,40.65857],[140.72589,40.57521],[140.66849,40.57467],[140.60883,40.57489],[140.60925,40.48311],[140.55058,40.483],[140.54888,40.51757],[140.40028,40.51692],[140.40013,40.5832],[140.25665,40.58233],[140.24898,40.63292],[140.33251,40.63292],[140.33251,40.66687],[140.41676,40.66698],[140.41704,40.73311],[140.33194,40.73375],[140.33351,40.75851],[140.28421,40.75818],[140.28037,40.85679],[140.30254,40.98507],[140.31845,41.00019],[140.42443,41.0004],[140.42443,40.90029],[140.55044,40.89975],[140.54994,41.06668],[140.6583,41.06668]],[[140.01669,40.33381],[140.25252,40.33381],[140.25006,39.33298],[139.98341,39.3332],[140.05622,39.72433],[140.00614,39.77043],[139.94073,39.88023],[139.94158,40.01081],[139.94055,40.08509],[139.94116,40.10876],[140.01669,40.33381]],[[139.85814,39.04176],[139.87552,39.04137],[139.87703,39.00009],[139.91671,39.00001],[139.9167,38.79173],[139.75493,38.79165],[139.7502,38.79386],[139.79376,38.89687],[139.79014,38.9254],[139.83615,38.99102],[139.85814,39.04176]],[[139.37551,38.1174],[139.38053,37.95893],[139.417,37.95845],[139.417,37.87413],[139.37571,37.8746],[139.37611,37.83296],[139.29234,37.83145],[139.30007,37.78074],[139.29173,37.68357],[139.29193,37.66473],[139.22935,37.6594],[139.18113,37.61024],[139.14537,37.60769],[139.12367,37.62671],[139.09816,37.65018],[139.08831,37.6664],[138.99951,37.66656],[138.99942,37.79171],[138.81261,37.79199],[138.86834,37.84689],[138.9915,37.91333],[139.08231,37.9775],[139.27679,38.03417],[139.37551,38.1174]],[[139.96008,38.49993],[140.50033,38.50009],[140.50023,38.16654],[140.37496,38.16654],[140.37536,38.08348],[140.2504,38.08293],[140.21705,38.07407],[140.22136,38.0422],[140.2512,38.04196],[140.2504,38.00017],[140.23372,37.99962],[140.23352,37.94197],[140.20861,37.9411],[140.20841,37.90013],[140.19253,37.89965],[140.19123,37.88372],[140.15838,37.883],[140.15828,37.85811],[140.0753,37.85945],[140.0741,37.87476],[140.05019,37.87571],[140.05019,37.89252],[140.05762,37.89355],[140.05813,37.92541],[140.0741,37.92573],[140.0742,37.94197],[140.09871,37.95369],[140.09821,37.99234],[140.10182,38.00041],[140.12282,38.00081],[140.11549,38.01806],[140.08977,38.02795],[140.0747,38.04133],[140.06727,38.03492],[140.06707,37.99186],[140.01634,37.9917],[140.01584,38.066],[139.99805,38.06656],[139.99966,38.13739],[139.99956,38.17514],[139.99795,38.3337],[139.95787,38.33378],[139.95837,38.50028],[139.96008,38.49993]],[[140.70822,38.7833],[140.70837,39.15023],[141.04194,39.14957],[141.04167,39.50008],[141.00147,39.49986],[140.99893,39.91638],[141.25077,39.91692],[141.25037,39.5007],[141.16709,39.50008],[141.16699,39.45627],[141.16669,39.40273],[141.16689,39.25073],[141.20798,39.24996],[141.20898,38.87471],[141.03399,38.8751],[141.03339,38.78354],[140.86794,38.78315],[140.70822,38.7833]],[[141.3759,38.36972],[141.37476,38.49992],[141.24904,38.50025],[141.25134,38.66886],[141.52524,38.66653],[141.54981,38.63369],[141.55052,38.55563],[141.55549,38.47938],[141.56558,38.39559],[141.54626,38.37398],[141.55919,38.32429],[141.59854,38.31226],[141.59527,38.26063],[141.50762,38.23664],[141.46983,38.24479],[141.39226,38.27725],[141.41158,38.34781],[141.3759,38.36972]],[[131.04175,33.7381],[131.0413,33.70887],[130.99956,33.70858],[131.00035,33.68392],[131.04959,33.68392],[131.05014,33.64171],[131.0751,33.64201],[131.07588,33.61683],[131.10039,33.61666],[131.10084,33.60082],[131.17448,33.60007],[131.19999,33.58422],[131.20066,33.55868],[131.2405,33.55868],[131.28258,33.54207],[131.33137,33.52528],[131.41821,33.55065],[131.51625,33.55084],[131.51692,33.5667],[131.63353,33.56688],[131.63308,33.47545],[131.7423,33.47452],[131.74946,33.45939],[131.75014,33.33289],[131.60756,33.33401],[131.60801,33.37421],[131.52565,33.37458],[131.52467,33.26691],[131.5769,33.25843],[131.64942,33.28332],[131.71634,33.28388],[131.77497,33.26687],[131.78385,33.25028],[131.83291,33.25015],[131.88403,33.2745],[131.90825,33.2749],[131.90809,33.25849],[131.87517,33.20607],[131.84985,33.18276],[131.85032,33.14964],[131.87525,33.15038],[131.90777,33.14129],[131.9171,33.13332],[131.91733,33.10858],[131.9505,33.09967],[131.95019,33.08349],[131.98279,33.08336],[131.98279,33.10007],[132.00036,33.1169],[132.0252,33.1169],[132.02473,33.0998],[132.00843,33.09172],[132.00843,33.06718],[132.01745,33.06705],[132.01715,33.04988],[131.99181,33.04211],[131.92518,33.04092],[131.9255,33.025],[131.95003,33.025],[131.95045,33.01347],[131.95034,32.97482],[131.98326,32.97536],[131.98492,32.95941],[132.0261,32.95922],[132.05828,32.95862],[132.05844,32.99142],[132.07198,32.9917],[132.08297,32.98332],[132.09168,32.92635],[132.02473,32.92542],[132.02473,32.90058],[132.03349,32.88294],[132.00795,32.88357],[131.98326,32.85871],[131.99988,32.8498],[132.01715,32.8429],[132.01603,32.82654],[131.97551,32.78396],[131.93411,32.76746],[131.8992,32.76614],[131.89179,32.71661],[131.83317,32.6507],[131.78369,32.64894],[131.78415,32.58396],[131.74185,32.58283],[131.7082,32.56669],[131.70773,32.54294],[131.74159,32.50852],[131.74141,32.45129],[131.70804,32.44216],[131.70112,32.40878],[131.65787,32.39219],[131.64226,32.33355],[131.59948,32.27572],[131.57492,32.18338],[131.54184,32.08474],[131.542,32.00009],[131.49975,32.00023],[131.50038,31.74971],[131.4586,31.75011],[131.45876,31.79182],[131.24969,31.79169],[131.24969,32.16704],[131.37488,32.16717],[131.37504,32.25046],[131.49991,32.25019],[131.49991,32.33341],[131.54137,32.33341],[131.54167,32.62506],[131.66645,32.62515],[131.66633,32.66662],[131.74993,32.66652],[131.75006,32.91664],[131.5977,32.91688],[131.25044,32.91663],[131.24902,33.00042],[131.49971,33.00002],[131.49987,33.06345],[131.50018,33.13915],[131.4804,33.16631],[131.284,33.16618],[131.26706,33.20035],[131.26627,33.25039],[131.29966,33.26985],[131.29951,33.31999],[131.24427,33.34114],[131.17511,33.34154],[131.17527,33.35806],[131.07525,33.35806],[131.07572,33.33347],[131.00055,33.33321],[131.00007,33.2496],[130.91445,33.2496],[130.7497,33.25013],[130.7497,33.08374],[130.62546,33.08321],[130.62546,33.00002],[130.72796,33.00171],[130.87492,33.00018],[130.8753,32.79131],[130.96677,32.79185],[130.96709,32.85808],[130.92531,32.85781],[130.92531,32.95029],[130.96679,32.95831],[131.00012,32.91683],[131.00017,32.50007],[130.66647,32.50046],[130.66669,32.33306],[130.62506,32.33306],[130.62461,32.24943],[130.49972,32.25037],[130.50039,32.12517],[130.33275,32.12498],[130.3437,32.16133],[130.34954,32.20815],[130.42748,32.29423],[130.46637,32.40054],[130.4939,32.40073],[130.523,32.43304],[130.54941,32.44456],[130.54986,32.4659],[130.48383,32.46647],[130.47421,32.47535],[130.4751,32.50064],[130.5089,32.54197],[130.62439,32.62571],[130.62484,32.6666],[130.52569,32.66679],[130.52524,32.68337],[130.55859,32.71671],[130.55903,32.7745],[130.57493,32.78372],[130.57493,32.82172],[130.50935,32.84185],[130.50778,32.86986],[130.44155,32.89158],[130.41624,32.94258],[130.41579,32.97488],[130.37438,33.00098],[130.37528,33.08315],[130.24927,33.08372],[130.24905,33.16076],[130.15863,33.09741],[130.17775,33.07174],[130.18369,33.06684],[130.18369,33.03401],[130.19958,33.025],[130.19977,33.00001],[130.12479,33.00001],[130.12457,32.96678],[130.0409,32.9407],[130.02501,32.94164],[130.02456,32.91647],[130.12457,32.9172],[130.12457,32.86739],[130.15031,32.86683],[130.19578,32.8661],[130.23334,32.89183],[130.29198,32.89183],[130.29243,32.84991],[130.29153,32.7916],[130.2922,32.71725],[130.18343,32.65791],[130.15034,32.65002],[130.11539,32.64962],[130.11744,32.70014],[130.15903,32.71706],[130.24856,32.75867],[130.24968,32.79085],[130.1333,32.79235],[130.12569,32.76751],[130.00147,32.74963],[129.9294,32.67317],[129.80048,32.57459],[129.80003,32.54704],[129.77425,32.54749],[129.71767,32.54987],[129.71632,32.59043],[129.7499,32.67487],[129.75012,32.72459],[129.80025,32.72553],[129.74161,32.77523],[129.62411,32.8501],[129.62646,32.91787],[129.83159,32.91738],[129.87121,32.91644],[129.89269,32.94105],[129.93343,33.00827],[129.967,33.07469],[130.05809,33.12025],[130.05876,33.21693],[130.24946,33.21674],[130.2499,33.33331],[130.21566,33.3335],[130.0422,33.33331],[129.92559,33.33294],[129.90836,33.35837],[129.90791,33.38304],[129.86695,33.38285],[129.86697,33.36012],[129.83338,33.34079],[129.80093,33.34098],[129.80003,33.31592],[129.75057,33.31686],[129.75034,33.27533],[129.72572,33.27477],[129.6917,33.30807],[129.69237,33.25025],[129.87479,33.25025],[129.8759,33.21299],[129.87521,33.11856],[129.87523,33.03323],[129.80831,33.03305],[129.7499,33.05031],[129.734,33.058],[129.72658,33.08172],[129.69842,33.09982],[129.62413,33.09928],[129.62374,33.12377],[129.62501,33.24201],[129.59255,33.24108],[129.59255,33.29928],[129.54197,33.3004],[129.50012,33.31761],[129.49989,33.41686],[129.59949,33.41593],[129.66753,33.40864],[129.66775,33.43274],[129.8336,33.56656],[129.93208,33.56787],[129.93522,33.40827],[130.04131,33.3836],[130.04108,33.48428],[130.24901,33.48465],[130.25057,33.61681],[130.28504,33.63405],[130.28303,33.69151],[130.30888,33.69151],[130.32365,33.66712],[130.39225,33.69179],[130.41777,33.72484],[130.43388,33.77546],[130.39024,33.87047],[130.39113,33.92509],[130.50774,33.92621],[130.60555,33.89166],[130.66665,33.9496],[130.74991,34.00844],[130.84973,34.00825],[130.8504,34.14155],[130.88308,34.19192],[130.85801,34.27519],[130.83228,34.36706],[130.97127,34.45052],[131.08608,34.43336],[131.19307,34.44166],[131.29356,34.44092],[131.36518,34.44591],[131.37548,34.5328],[131.44934,34.55013],[131.57445,34.69176],[131.62526,34.69158],[131.78596,34.70078],[131.86989,34.77435],[131.99545,34.88146],[132.37594,35.16739],[132.74972,35.16684],[132.75084,35.08318],[132.6255,35.08337],[132.62505,34.91671],[132.3755,34.91689],[132.37527,34.83426],[132.12482,34.83298],[132.12482,34.75008],[132.00038,34.7499],[132.00038,34.5833],[131.74989,34.58326],[131.75139,34.37954],[131.75147,34.1671],[132.12497,34.16683],[132.12481,34.2914],[132.25016,34.29193],[132.24929,34.40917],[132.25016,34.49983],[132.37249,34.49996],[132.37503,34.58339],[132.49167,34.58339],[132.49182,34.70831],[132.59177,34.70824],[132.58365,34.5417],[132.84148,34.54133],[132.84193,34.66623],[133.08343,34.66678],[133.08365,34.76631],[133.20743,34.76687],[133.20787,34.66678],[133.49973,34.66642],[133.50026,34.83314],[133.7012,34.83357],[133.69941,34.87526],[133.74984,34.87535],[133.74984,34.9999],[133.8751,35.00003],[133.87518,35.12504],[133.97425,35.12517],[133.97546,35.00097],[134.0585,34.99997],[134.05816,35.07464],[134.16654,35.0748],[134.1667,35.00016],[134.75338,35.00016],[134.83324,34.99997],[134.8333,35.04176],[135.24494,35.04176],[135.37472,35.04153],[135.37535,35.0836],[135.74948,35.08335],[135.75066,35.25004],[135.87474,35.2503],[135.87529,35.33388],[136.00001,35.33356],[136.00024,35.2587],[135.98331,35.24255],[135.93361,35.20027],[135.93306,35.1667],[135.97539,35.16664],[135.97523,35.15597],[136.04993,35.15829],[136.04993,35.21663],[136.05895,35.22484],[136.12455,35.23344],[136.12536,35.25011],[136.16667,35.24997],[136.16651,35.36441],[136.16664,35.45873],[136.33347,35.45857],[136.37478,35.33382],[136.49981,35.33356],[136.49965,35.49981],[136.74991,35.58365],[137.00003,35.58344],[136.99984,35.41254],[136.99999,35.33351],[137.24995,35.33357],[137.24998,34.91665],[137.6249,34.91658],[137.62516,35.00034],[137.69186,35.00052],[137.69182,35.06711],[137.74199,35.06668],[137.74222,35.10789],[137.77489,35.10844],[137.77474,35.15015],[138.16671,35.15021],[138.16666,35.2918],[138.38224,35.29138],[138.50029,35.29187],[138.50119,35.33333],[138.38256,35.33369],[138.38319,35.44169],[138.49985,35.44208],[138.49988,35.4584],[138.66644,35.45855],[138.66704,35.37476],[138.70818,35.37519],[138.70818,35.33348],[138.8334,35.33357],[138.83329,35.40832],[139.0082,35.40836],[139.00858,35.39192],[139.1243,35.39228],[139.12498,35.41668],[139.25001,35.41667],[139.24995,35.49996],[139.12487,35.50005],[139.12492,35.5833],[138.99999,35.58333],[138.99999,35.6667],[139.1249,35.66678],[139.12504,35.8092],[139.12474,35.91713],[139.00053,35.91713],[139.00006,36.00001],[139.12492,36.00012],[139.12547,36.11894],[139.12495,36.16664],[139,36.16668],[138.99941,36.25031],[138.95831,36.25002],[138.95822,36.29127],[138.91663,36.29166],[138.91678,36.37496],[138.95845,36.37565],[138.95836,36.45832],[139.08379,36.45868],[139.08334,36.5],[139.25009,36.50012],[139.2496,36.54136],[139.37464,36.54189],[139.37505,36.62499],[139.45022,36.62528],[139.44999,36.66667],[139.66374,36.66671],[139.75002,36.66665],[139.75005,36.75003],[140,36.75001],[139.99998,36.62209],[140.00001,36.41668],[140.25001,36.41666],[140.24999,36.04158],[140.50004,36.04158],[140.49989,35.83349],[140.41632,35.83374],[140.4168,35.7919],[140.45874,35.79113],[140.45874,35.72461],[140.51666,35.72486],[140.51691,35.7417],[140.59144,35.74174],[140.5915,35.94177],[140.65002,35.94164],[140.64994,36.00837],[140.67503,36.00834],[140.71403,35.92326],[140.77327,35.83877],[140.81532,35.78508],[140.89133,35.7501],[140.89211,35.71717],[140.86632,35.67853],[140.80694,35.70622],[140.72767,35.6761],[140.68235,35.68891],[140.60194,35.63074],[140.48545,35.54409],[140.4095,35.42897],[140.40816,35.33353],[140.30722,35.33371],[140.30767,35.41748],[140.30946,35.45851],[140.20762,35.45905],[140.20829,35.37478],[140.12503,35.37478],[140.12436,35.33408],[140.29155,35.33316],[140.29245,35.20909],[140.31707,35.20836],[140.31662,35.18422],[140.35042,35.18257],[140.3431,35.13152],[140.23201,35.10096],[140.13697,35.09271],[140.05542,35.03643],[139.98865,34.98849],[139.96379,34.91688],[139.91222,34.88262],[139.82272,34.89218],[139.78337,34.93633],[139.73961,34.95322],[139.7443,34.99303],[139.81476,35.00932],[139.7963,35.05283],[139.80169,35.09108],[139.80766,35.1529],[139.80866,35.19667],[139.85153,35.24127],[139.8325,35.29189],[139.74927,35.2961],[139.76149,35.33517],[139.79232,35.35267],[139.81035,35.49933],[140.0035,35.49988],[140.03349,35.53668],[140.06639,35.58384],[139.79714,35.58311],[139.80005,35.50079],[139.77087,35.47343],[139.70992,35.44207],[139.6987,35.40282],[139.66887,35.36715],[139.68478,35.30781],[139.73549,35.2728],[139.75069,35.25934],[139.73734,35.23092],[139.74388,35.20852],[139.69714,35.18971],[139.67426,35.1702],[139.68932,35.15394],[139.68151,35.13477],[139.62355,35.12199],[139.59783,35.1285],[139.60224,35.17253],[139.58363,35.18959],[139.59033,35.24164],[139.5496,35.28403],[139.49879,35.30084],[139.42314,35.30942],[139.29131,35.30066],[139.23074,35.27778],[139.15546,35.23542],[139.15031,35.17507],[139.16665,35.13316],[139.12502,35.13298],[139.09436,35.13335],[139.05832,35.13316],[139.05671,35.00443],[139.03348,34.98385],[138.99968,34.98367],[139.00057,34.88274],[139.14136,34.88348],[139.11002,34.84602],[139.08129,34.79529],[139.01691,34.74107],[138.9999,34.64151],[138.90044,34.6097],[138.87367,34.59159],[138.80026,34.59988],[138.75773,34.65881],[138.72528,34.67575],[138.72528,34.72506],[138.83316,34.72598],[138.83383,34.74952],[138.7419,34.75106],[138.7338,34.8136],[138.74985,34.90057],[138.76065,34.93773],[138.75028,34.98313],[138.77855,35.04352],[138.87546,35.03316],[138.87703,35.04929],[138.85845,35.04984],[138.76804,35.12107],[138.68294,35.12223],[138.61873,35.09015],[138.55409,35.05201],[138.54926,34.99442],[138.49996,34.95392],[138.39142,34.91129],[138.35562,34.86759],[138.33929,34.80042],[138.27635,34.72246],[138.24467,34.66616],[138.24396,34.58503],[138.12662,34.58573],[138.01467,34.62561],[137.88184,34.65541],[137.79532,34.63718],[137.68991,34.65307],[137.57654,34.66441],[137.38135,34.64618],[137.18402,34.58409],[137.03187,34.5662],[137.00794,34.57573],[137.0254,34.61792],[137.0599,34.66613],[137.17517,34.66686],[137.30767,34.75996],[137.29894,34.77595],[137.29088,34.79231],[137.25037,34.79213],[137.21635,34.76768],[137.15816,34.74911],[137.08318,34.75076],[137.03215,34.76345],[136.94061,34.80848],[136.93456,34.77522],[136.98335,34.72575],[137.06751,34.74212],[137.06773,34.70183],[137.02454,34.70809],[137.01581,34.64937],[136.98179,34.65029],[136.82601,34.74911],[136.84884,34.82319],[136.79266,34.82521],[136.79132,35.00048],[136.75081,35.00012],[136.74991,34.95849],[136.68277,34.96069],[136.6624,34.89701],[136.59078,34.80003],[136.53863,34.72704],[136.58294,34.62506],[136.75682,34.54181],[136.85798,34.54126],[136.93945,34.54347],[136.91675,34.49231],[136.94081,34.46687],[136.94113,34.40866],[136.92404,34.35876],[136.90742,34.30209],[136.90045,34.2666],[136.84981,34.23416],[136.81693,34.1923],[136.79948,34.19254],[136.79996,34.22906],[136.74203,34.25863],[136.73325,34.28285],[136.70896,34.28334],[136.64264,34.25902],[136.5594,34.22605],[136.53564,34.22167],[136.50068,34.20864],[136.44007,34.20053],[136.38325,34.16675],[136.3334,34.14802],[136.31583,34.08487],[136.2674,34.08316],[136.12497,34.08343],[136.12449,34.16688],[136.24968,34.16688],[136.24984,34.25012],[136.37486,34.25025],[136.37468,34.33331],[136.50021,34.33302],[136.49973,34.49192],[136.45843,34.49127],[136.45811,34.5416],[136.4168,34.54186],[136.41664,34.62516],[136.37494,34.62464],[136.37469,34.68106],[136.37485,34.74974],[136.33402,34.75026],[136.33354,34.79109],[136.37485,34.79213],[136.37533,34.95858],[136.33323,34.95858],[136.33323,34.83345],[136.29239,34.83371],[136.29208,34.792],[136.24966,34.79213],[136.24998,34.70838],[136.29192,34.70851],[136.2916,34.62475],[136.12487,34.62512],[136.12498,34.66674],[136.04161,34.66655],[136.04094,34.7499],[136.00023,34.75009],[135.99991,34.65993],[135.99975,34.58387],[136.04153,34.58374],[136.04185,34.50017],[136.04989,34.49997],[136.05005,34.42503],[135.91674,34.425],[135.91667,34.35836],[135.81665,34.35837],[135.81661,34.31668],[135.74991,34.31672],[135.75007,34.29167],[135.64152,34.29176],[135.64186,34.27512],[135.53325,34.27489],[135.53348,34.25834],[135.475,34.25834],[135.47511,34.22498],[135.37507,34.22512],[135.3749,34.20814],[135.50001,34.20837],[135.50001,33.66652],[135.87502,33.66661],[135.87558,33.74983],[136.03371,33.75021],[136.01272,33.71062],[135.99681,33.67327],[135.97948,33.63389],[135.97195,33.61271],[135.95831,33.56798],[135.85332,33.50522],[135.85353,33.48302],[135.87591,33.4814],[135.86057,33.44051],[135.77718,33.42558],[135.7418,33.42534],[135.74163,33.4665],[135.68498,33.47915],[135.59008,33.49633],[135.47373,33.52819],[135.3902,33.5752],[135.37485,33.61633],[135.37533,33.64967],[135.33371,33.6498],[135.32468,33.66653],[135.45794,33.66666],[135.45842,33.74987],[135.41727,33.75],[135.41663,33.78802],[135.41743,33.83273],[135.37517,33.83326],[135.37517,33.79171],[135.3284,33.78999],[135.28777,33.75622],[135.21503,33.7698],[135.14371,33.85113],[135.12013,33.87826],[135.05776,33.87991],[135.05947,33.96479],[135.07709,34.00837],[135.11345,34.05029],[135.06515,34.06759],[135.07041,34.121],[135.15522,34.16286],[135.1163,34.18742],[135.06316,34.25849],[135.04915,34.27082],[134.99554,34.27152],[134.9955,34.29122],[134.99945,34.29894],[135.00904,34.30357],[135.1457,34.34721],[135.20804,34.35108],[135.24174,34.39165],[135.19145,34.42482],[135.25012,34.46056],[135.29487,34.42658],[135.30902,34.44119],[135.36647,34.53277],[135.39147,34.53394],[135.38308,34.63128],[135.36409,34.66669],[135.29161,34.66695],[135.29061,34.6245],[135.08349,34.62463],[135.04725,34.61643],[134.92905,34.64799],[134.826,34.69662],[134.75874,34.74267],[134.71632,34.74982],[134.52561,34.74969],[134.41657,34.70885],[134.31671,34.66669],[134.25055,34.66656],[134.24992,34.68309],[134.15797,34.68348],[134.15781,34.70013],[134.12505,34.7],[134.12474,34.58386],[134.11666,34.55845],[134.02519,34.55024],[134.02535,34.44785],[134.02788,34.41639],[134.19168,34.41678],[134.19152,34.38401],[134.28347,34.38296],[134.28347,34.33371],[134.38082,34.29415],[134.40952,34.26539],[134.43268,34.24648],[134.56265,34.25055],[134.66663,34.24963],[134.64146,34.04963],[134.70809,33.96554],[134.74006,33.92825],[134.71221,33.86773],[134.76918,33.86691],[134.76712,33.82524],[134.66742,33.7754],[134.63102,33.77487],[134.50018,33.77493],[134.49978,33.95855],[134.4582,33.95874],[134.45816,34.00006],[134.34679,33.99889],[134.06047,33.99988],[133.74955,34.00047],[133.74998,34.33337],[133.875,34.33342],[133.87494,34.41668],[133.95888,34.41683],[133.95843,34.44157],[133.85055,34.44157],[133.84966,34.46621],[133.82537,34.46704],[133.81642,34.44222],[133.84205,34.43326],[133.84194,34.41656],[133.75822,34.41715],[133.74122,34.44175],[133.6913,34.44152],[133.69085,34.45739],[133.69097,34.46639],[133.70004,34.48346],[133.61655,34.48355],[133.61689,34.45827],[133.53351,34.45887],[133.53329,34.41752],[133.4897,34.41743],[133.46642,34.43313],[133.46631,34.44992],[133.4503,34.45002],[133.45008,34.4166],[133.41713,34.41696],[133.41668,34.35786],[133.34174,34.3583],[133.30304,34.37515],[133.2748,34.35876],[133.21655,34.35],[133.16694,34.35007],[133.16662,34.36659],[133.09184,34.36659],[133.09176,34.3417],[133.05837,34.34164],[133.05829,34.32491],[132.90003,34.32517],[132.89148,34.29164],[132.7917,34.29164],[132.79133,34.28281],[132.792,34.24212],[132.77492,34.22513],[132.71629,34.22499],[132.71652,34.21655],[132.75854,34.21636],[132.775,34.20877],[132.79218,34.20095],[132.79223,34.14177],[132.74138,34.14173],[132.70838,34.16655],[132.63354,34.16665],[132.61664,34.1917],[132.59185,34.1916],[132.5749,34.1666],[132.54155,34.16674],[132.54178,34.14196],[132.42515,34.14165],[132.42503,34.16657],[132.3749,34.16663],[132.37515,34.18348],[132.40833,34.18343],[132.3752,34.2168],[132.34991,34.23331],[132.35014,34.25834],[132.35814,34.25843],[132.35819,34.27503],[132.33922,34.25834],[132.29166,34.22494],[132.24992,34.22494],[132.25003,34.2043],[132.25809,34.18324],[132.28327,34.18352],[132.28321,34.19995],[132.29183,34.20837],[132.32501,34.20847],[132.31684,34.1753],[132.25843,34.17533],[132.25843,34.14171],[132.2502,34.11675],[132.21669,34.11684],[132.21685,34.0585],[132.22491,34.05827],[132.22502,33.99163],[132.21669,33.99177],[132.21652,33.97516],[132.25037,33.97526],[132.25014,33.91622],[131.95761,33.91733],[131.95783,33.92512],[131.91755,33.92495],[131.91586,33.95863],[131.88699,33.96671],[131.87569,33.95891],[131.84973,33.92502],[131.80049,33.92439],[131.79948,33.95046],[131.7752,33.95057],[131.75058,33.9668],[131.70828,33.97508],[131.70918,33.92551],[131.68366,33.92513],[131.68321,33.95056],[131.6916,33.96717],[131.69988,33.98323],[131.68332,33.99937],[131.68354,34.01681],[131.69999,34.017],[131.70011,34.03314],[131.68209,34.03352],[131.67515,34.02581],[131.62513,34.02488],[131.59122,33.97515],[131.38721,33.97497],[131.29981,33.91685],[131.16675,33.91667],[131.1172,33.97473],[131.06078,34.02462],[131.03349,34.02557],[131.04198,34.00848],[131.04175,33.7381]],[[135.98583,35.86595],[135.93905,35.95517],[135.95723,36.1316],[136.15271,36.29666],[136.6596,36.75695],[136.65846,37.00603],[136.66642,37.33477],[136.85167,37.42328],[137.11307,37.5288],[137.31877,37.54953],[137.39151,37.50356],[137.34765,37.35791],[137.20218,37.24762],[137.09307,37.06828],[137.0223,36.83795],[137.09532,36.80133],[137.22971,36.77368],[137.35387,36.80451],[137.39706,36.90966],[137.50588,36.95883],[137.72267,37.01579],[137.95199,37.10656],[138.053,37.16975],[138.18626,37.18254],[138.28854,37.24861],[138.43501,37.34512],[138.54909,37.41229],[138.61842,37.49225],[138.73903,37.51536],[138.78378,37.5674],[138.82185,37.62796],[138.91491,37.63009],[138.924,37.6032],[139.01321,37.59757],[139.01421,37.53507],[139.03452,37.52325],[139.03793,37.45798],[139.04887,37.42358],[139.13027,37.42312],[139.23881,37.4326],[139.26282,37.33326],[139.12289,37.32784],[139.11408,37.26354],[139.11422,37.16748],[139.05555,37.16658],[138.82825,37.17133],[138.87072,37.2338],[138.89104,37.31316],[138.72965,37.33259],[138.71403,37.29474],[138.71715,37.1642],[138.53517,37.16533],[138.39907,37.16692],[138.37478,37.13261],[138.3725,36.99907],[138.08823,36.99839],[138.08596,36.91586],[137.89233,36.91768],[137.87798,36.83517],[137.66517,36.8321],[137.52111,36.83142],[137.51216,36.74222],[137.39482,36.74427],[137.37138,36.58325],[137.29367,36.58371],[137.18016,36.55028],[137.21383,36.53133],[137.26384,36.33176],[136.63321,36.33496],[136.50436,36.29227],[136.39412,36.29444],[136.38034,36.25493],[136.37778,36.17665],[136.38218,36.09507],[136.38758,36.00065],[136.2593,35.99399],[136.25532,35.90923],[136.24992,35.83337],[136.12207,35.82876],[136.11184,35.88725],[136.05984,35.91165],[136.01793,35.86676],[135.98583,35.86595]],[[140.03281,37.29986],[140.03344,37.34643],[140.03344,37.47427],[140.03407,37.48281],[139.99973,37.48356],[140.00036,37.44198],[139.94212,37.44173],[139.94197,37.35007],[139.89116,37.35007],[139.89116,37.41698],[139.81725,37.41647],[139.81266,37.57468],[139.74192,37.57556],[139.74224,37.79174],[139.81789,37.79162],[139.98296,37.79112],[139.98359,37.58334],[140.0412,37.58334],[140.04151,37.47502],[140.1591,37.47528],[140.15815,37.63311],[140.3745,37.63399],[140.37481,37.83338],[140.5,37.83525],[140.49989,37.91662],[140.53144,37.9168],[140.62489,37.9167],[140.62489,37.84641],[140.62534,37.33359],[140.57502,37.33284],[140.57486,37.25881],[140.4579,37.25855],[140.45774,37.2084],[140.2501,37.20866],[140.24994,37.29998],[140.03281,37.29986]],[[141.00075,38.16707],[140.84264,38.16752],[140.68779,38.16405],[140.70788,38.09499],[140.70868,38.03346],[140.61627,38.03362],[140.53369,38.11364],[140.5359,38.14478],[140.61948,38.14478],[140.62471,38.2048],[140.6231,38.27376],[140.63073,38.33902],[140.81255,38.33698],[141.00362,38.33398],[141.00075,38.16707]],[[129.44454,34.73675],[129.52524,34.65452],[129.35703,34.19046],[129.23088,34.06063],[129.15132,34.11616],[129.27179,34.63488],[129.44454,34.73675]]],terms_url:"http://www.gsi.go.jp/kikakuchousei/kikakuchousei40182.html",terms_text:"GSI Japan",description:"Japan GSI ortho Imagery. Usually better than bing, but a bit older."},{id:"gsi.go.jp_seamlessphoto",name:"Japan GSI seamlessphoto Imagery",type:"tms",template:"https://cyberjapandata.gsi.go.jp/xyz/seamlessphoto/{zoom}/{x}/{y}.jpg",zoomExtent:[14,18],polygon:[[[140.88867,45.67548],[140.71289,45.41388],[141.04248,43.80282],[139.96582,43.35714],[138.99902,42.01665],[139.04297,41.26129],[137.5708,38.58253],[132.69287,36.86204],[130.84717,34.93999],[129.74854,34.994],[129.02344,34.56086],[128.36426,33.21112],[127.90283,31.87756],[128.4082,29.89781],[125.8374,26.78485],[123.33252,25.0657],[122.58545,24.42715],[123.53027,23.44309],[125.88135,24.10665],[129.96826,26.31311],[132.1875,30.20211],[134.42871,32.43561],[136.82373,33.28462],[137.85645,34.21634],[138.64746,33.24788],[138.58154,32.00808],[139.6582,28.67131],[141.65771,29.66896],[142.0752,32.06396],[141.21826,33.37641],[141.56982,35.44277],[141.43799,36.52729],[142.82227,39.16414],[143.04199,40.89691],[145.92041,42.40723],[146.18408,43.03678],[145.74463,43.54855],[145.32715,43.67582],[145.30518,43.91372],[145.61279,44.2452],[145.41504,44.62175],[144.38232,44.52784],[142.31689,45.53714],[141.3501,45.70618],[140.88867,45.67548]]],terms_url:"http://www.gsi.go.jp/kikakuchousei/kikakuchousei40182.html",terms_text:"GSI Japan seamless photo",description:"Japan GSI seamlessphoto Imagery. The collection of latest imageries of GSI ortho, airphoto, post disaster and others."},{id:"gsi.go.jp_std_map",name:"Japan GSI Standard Map",type:"tms",template:"https://cyberjapandata.gsi.go.jp/xyz/std/{zoom}/{x}/{y}.png",zoomExtent:[5,18],polygon:[[[141.85547,44.64912],[140.22949,43.9691],[138.95508,41.80408],[139.48242,40.17887],[138.86719,38.30718],[136.31836,37.19533],[132.14355,35.13788],[128.93555,33.35806],[129.50684,32.4727],[129.77051,31.69078],[130.20996,30.90223],[131.2207,30.78904],[131.66016,32.32428],[132.71484,32.87959],[133.76953,33.17434],[136.75781,33.87042],[139.30664,35.06597],[140.88867,35.17381],[141.15234,36.5626],[142.11914,39.94344],[141.76758,42.68243],[141.85547,44.64912]]],terms_url:"https://maps.gsi.go.jp/help/use.html",terms_text:"GSI Japan",description:"Japan GSI Standard Map. Widely covered."},{id:"juno-gps",name:"Juno GPS traces",type:"tms",template:"https://gps-tile.junolab.net/{zoom}/{x}/{y}.png",startDate:"2019-01-01T00:00:00.000Z",zoomExtent:[0,19],polygon:[[[-74.337,40.484],[-73.572,40.484],[-73.572,40.957],[-74.337,40.957],[-74.337,40.484]]],terms_url:"https://gps-tile.junolab.net/about.html",terms_text:"© 2019 Juno",description:"Juno drivers' GPS traces from two days ago, updated daily",icon:"https://osmlab.github.io/editor-layer-index/sources/north-america/us/ny/Juno-GPS.png",overlay:true},{id:"kalmar-orto-2014",name:"Kalmar North Orthophoto 2014",type:"wms",template:"https://kartportal.kalmar.se/arcgisserver/services/Ortofoto/Kalmar_2014/ImageServer/WMSServer?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",endDate:"2014-01-01T00:00:00.000Z",startDate:"2014-01-01T00:00:00.000Z",zoomExtent:[9,22],polygon:[[[16.28473,56.70827],[16.38856,56.70798],[16.40843,56.7615],[16.46269,56.75672],[16.47753,56.76023],[16.48815,56.77023],[16.48754,56.79231],[16.48254,56.79547],[16.47667,56.8223],[16.4687,56.82614],[16.48584,56.86271],[16.48809,56.87369],[16.45694,56.87786],[16.46288,56.88769],[16.42696,56.88757],[16.39809,56.89604],[16.36791,56.8952],[16.36717,56.85985],[16.36431,56.84636],[16.36001,56.83657],[16.34423,56.82532],[16.32675,56.79284],[16.26114,56.74422],[16.28473,56.70827]]],terms_url:"http://data-kalmar.opendata.arcgis.com/",terms_text:"© Kalmar municipality",best:true,description:"Orthophotos for the north coast of the municipality of Kalmar 2014",icon:"https://upload.wikimedia.org/wikipedia/commons/thumb/6/67/Kalmarvapen_1a.svg/206px-Kalmarvapen_1a.svg.png"},{id:"kalmar-orto-2016",name:"Kalmar South Orthophoto 2016",type:"wms",template:"https://kartportal.kalmar.se/arcgisserver/services/Ortofoto/Kalmar_2016/ImageServer/WMSServer?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",endDate:"2016-01-01T00:00:00.000Z",startDate:"2016-01-01T00:00:00.000Z",zoomExtent:[9,22],polygon:[[[16.156,56.45834],[16.11389,56.46083],[16.09246,56.46633],[16.0724,56.4662],[16.07126,56.51153],[16.08516,56.56847],[16.14417,56.63933],[16.21168,56.68491],[16.28412,56.71655],[16.25135,56.74358],[16.25045,56.75062],[16.29558,56.7512],[16.33516,56.72511],[16.38922,56.71885],[16.41137,56.67602],[16.4053,56.66294],[16.33101,56.625],[16.28048,56.613],[16.21561,56.51967],[16.156,56.45834]]],terms_url:"http://data-kalmar.opendata.arcgis.com/",terms_text:"© Kalmar municipality",best:true,description:"Orthophotos for the south coast of the municipality of Kalmar 2016",icon:"https://upload.wikimedia.org/wikipedia/commons/thumb/6/67/Kalmarvapen_1a.svg/206px-Kalmarvapen_1a.svg.png"},{id:"kalmar-orto-2018",name:"Kalmar Urban Orthophoto 2018",type:"wms",template:"https://kartportal.kalmar.se/arcgisserver/services/Ortofoto/Kalmar_2018/ImageServer/WMSServer?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",endDate:"2018-01-01T00:00:00.000Z",startDate:"2018-01-01T00:00:00.000Z",zoomExtent:[9,22],polygon:[[[16.3416,56.81756],[16.32773,56.7973],[16.36692,56.78706],[16.37105,56.79153],[16.36978,56.80511],[16.35645,56.8133],[16.3416,56.81756]],[[16.39207,56.79339],[16.4608,56.78944],[16.48817,56.79067],[16.4833,56.76986],[16.46612,56.76711],[16.45409,56.76774],[16.43173,56.77309],[16.43178,56.77663],[16.40554,56.77214],[16.39325,56.77349],[16.39207,56.79339]],[[16.29836,56.79102],[16.28796,56.7883],[16.27727,56.78367],[16.27623,56.77952],[16.2862,56.7761],[16.3108,56.77696],[16.3118,56.78086],[16.30364,56.78883],[16.29836,56.79102]],[[16.20686,56.63637],[16.22098,56.62389],[16.2453,56.62467],[16.26751,56.62951],[16.28724,56.63831],[16.37871,56.65462],[16.38806,56.6897],[16.38664,56.72867],[16.31586,56.72879],[16.29956,56.7219],[16.29331,56.70021],[16.26799,56.66889],[16.23945,56.66991],[16.2266,56.6624],[16.21411,56.64972],[16.20686,56.63637]],[[16.15172,56.67843],[16.15712,56.69334],[16.15268,56.70297],[16.13274,56.71254],[16.10987,56.71964],[16.08638,56.7112],[16.07969,56.70056],[16.08149,56.69566],[16.09534,56.69599],[16.12877,56.67766],[16.15172,56.67843]],[[15.97369,56.62759],[16.00164,56.63215],[16.04126,56.62999],[16.05658,56.62489],[16.06201,56.61794],[16.09186,56.60378],[16.10527,56.5926],[16.09581,56.58161],[16.03481,56.60405],[16.0305,56.61252],[16.0088,56.60223],[15.98755,56.59742],[15.98449,56.57141],[15.94887,56.57264],[15.91878,56.55184],[15.90892,56.55393],[15.89921,56.56867],[15.9188,56.57287],[15.94612,56.57491],[15.96371,56.59004],[15.9496,56.59724],[15.94308,56.60903],[15.95726,56.61598],[15.97589,56.62005],[15.97369,56.62759]]],terms_url:"http://data-kalmar.opendata.arcgis.com/",terms_text:"© Kalmar municipality",best:true,description:"Orthophotos for urban areas of the municipality of Kalmar 2018",icon:"https://upload.wikimedia.org/wikipedia/commons/thumb/6/67/Kalmarvapen_1a.svg/206px-Kalmarvapen_1a.svg.png"},{id:"Aargau-AGIS-2014",name:"Kanton Aargau 25cm (AGIS 2014)",type:"tms",template:"https://mapproxy.osm.ch/tiles/AGIS2014/EPSG900913/{zoom}/{x}/{y}.png?origin=nw",endDate:"2014-01-01T00:00:00.000Z",startDate:"2014-01-01T00:00:00.000Z",zoomExtent:[8,19],polygon:[[[8.09602,47.57882],[8.10323,47.57879],[8.10323,47.58583],[8.10591,47.58732],[8.11019,47.58878],[8.11589,47.5893],[8.12168,47.58916],[8.12546,47.58873],[8.12959,47.58888],[8.13023,47.59122],[8.132,47.59358],[8.13506,47.59546],[8.13831,47.59698],[8.14161,47.59939],[8.14534,47.60076],[8.14961,47.60144],[8.15438,47.60127],[8.15751,47.60063],[8.16119,47.59914],[8.16255,47.59976],[8.16438,47.60148],[8.16653,47.60399],[8.17087,47.60673],[8.17608,47.60838],[8.17912,47.60868],[8.18153,47.6118],[8.18304,47.61489],[8.18498,47.6176],[8.18953,47.62151],[8.19212,47.62321],[8.22261,47.623],[8.22561,47.6212],[8.22849,47.61842],[8.22959,47.61621],[8.23008,47.61501],[8.23261,47.61686],[8.23657,47.61803],[8.24,47.61835],[8.24351,47.61783],[8.24749,47.61877],[8.25066,47.61988],[8.25708,47.6208],[8.26104,47.62069],[8.26491,47.61935],[8.26732,47.61769],[8.26902,47.61531],[8.27579,47.61702],[8.28106,47.61707],[8.28772,47.61626],[8.29421,47.61442],[8.29947,47.61221],[8.30311,47.60977],[8.30287,47.59447],[8.30438,47.59227],[8.30591,47.59109],[8.30791,47.59019],[8.31236,47.58917],[8.31655,47.58713],[8.32049,47.58436],[8.32598,47.57888],[8.32864,47.57716],[8.33219,47.57604],[8.33902,47.57577],[8.34702,47.57628],[8.35962,47.57552],[8.36475,47.57436],[8.37207,47.57377],[8.38002,47.57233],[8.38194,47.57496],[8.38387,47.57686],[8.38879,47.58027],[8.39232,47.58174],[8.39611,47.58247],[8.40013,47.58255],[8.40432,47.58158],[8.41158,47.57928],[8.418,47.57602],[8.42381,47.57452],[8.43039,47.57228],[8.43275,47.57035],[8.4336,47.56849],[8.43353,47.56669],[8.4319,47.56444],[8.4286,47.56217],[8.42575,47.56121],[8.4259,47.55854],[8.42498,47.55624],[8.42353,47.55469],[8.42296,47.5537],[8.4246,47.5517],[8.42492,47.54981],[8.42434,47.54836],[8.42539,47.54679],[8.425,47.54418],[8.4233,47.5422],[8.421,47.54106],[8.41832,47.54049],[8.41551,47.54062],[8.4139,47.53924],[8.41283,47.5372],[8.41194,47.53626],[8.41241,47.53415],[8.41185,47.53237],[8.41117,47.53158],[8.40143,47.53169],[8.40124,47.52443],[8.39936,47.5222],[8.39666,47.52082],[8.39385,47.51988],[8.39085,47.51973],[8.38877,47.52014],[8.38809,47.5146],[8.38551,47.51075],[8.38366,47.50944],[8.36776,47.50953],[8.36739,47.48709],[8.3751,47.48689],[8.37889,47.4853],[8.38196,47.48188],[8.38184,47.47521],[8.38328,47.47192],[8.38244,47.46879],[8.37943,47.46643],[8.37751,47.4659],[8.37787,47.46496],[8.38238,47.46423],[8.38671,47.46097],[8.39171,47.45743],[8.39315,47.45349],[8.39514,47.45031],[8.39418,47.44722],[8.39171,47.44535],[8.3896,47.44449],[8.38996,47.44339],[8.39111,47.4416],[8.39213,47.43924],[8.39339,47.4359],[8.39249,47.43411],[8.39369,47.43143],[8.39568,47.42854],[8.39959,47.42463],[8.39953,47.41954],[8.449,47.41897],[8.45369,47.41233],[8.45369,47.40451],[8.44858,47.39649],[8.40362,47.39685],[8.40483,47.39392],[8.4029,47.38903],[8.4035,47.38553],[8.40314,47.38304],[8.40483,47.37905],[8.40844,47.37575],[8.41379,47.37338],[8.4159,47.37016],[8.41584,47.36539],[8.4144,47.36327],[8.41494,47.35912],[8.41722,47.35573],[8.41632,47.35231],[8.41355,47.34913],[8.41367,47.34688],[8.41476,47.3448],[8.41885,47.34244],[8.42264,47.34052],[8.42469,47.33718],[8.42421,47.33163],[8.42914,47.33286],[8.4351,47.33192],[8.43763,47.33281],[8.44328,47.33506],[8.44527,47.33746],[8.45213,47.3402],[8.45761,47.33975],[8.46212,47.33649],[8.46278,47.33322],[8.46043,47.32829],[8.45797,47.32457],[8.45556,47.32005],[8.44918,47.31495],[8.44713,47.31217],[8.44021,47.30948],[8.43624,47.29817],[8.43311,47.29593],[8.42806,47.29397],[8.42318,47.29001],[8.41656,47.28789],[8.41024,47.28728],[8.4035,47.28409],[8.40188,47.2805],[8.40862,47.27593],[8.41066,47.2716],[8.40892,47.26613],[8.41235,47.2618],[8.41235,47.25873],[8.41109,47.25608],[8.41698,47.25142],[8.41885,47.2475],[8.41801,47.24305],[8.4144,47.23904],[8.41373,47.23565],[8.4106,47.23226],[8.40435,47.22797],[8.40296,47.2256],[8.40398,47.22127],[8.40856,47.21718],[8.40928,47.21326],[8.40844,47.20945],[8.41012,47.20258],[8.41319,47.19678],[8.41271,47.1924],[8.4088,47.18799],[8.40814,47.18475],[8.4091,47.1812],[8.41518,47.17915],[8.41915,47.17563],[8.42294,47.16553],[8.42294,47.15747],[8.42011,47.15325],[8.42246,47.14838],[8.42276,47.14392],[8.42053,47.13954],[8.41584,47.13524],[8.40898,47.13274],[8.40386,47.13201],[8.40116,47.13258],[8.39532,47.1327],[8.38437,47.1345],[8.37895,47.13385],[8.37245,47.13442],[8.36908,47.13659],[8.368,47.13876],[8.35656,47.14228],[8.35409,47.14564],[8.35331,47.14916],[8.3506,47.15161],[8.3503,47.15419],[8.34772,47.15669],[8.34561,47.15923],[8.34086,47.16164],[8.33935,47.16512],[8.3373,47.16896],[8.33315,47.17154],[8.33261,47.17351],[8.33062,47.17792],[8.33002,47.18717],[8.32924,47.18786],[8.32936,47.19494],[8.32292,47.19514],[8.32148,47.19854],[8.32196,47.20115],[8.31835,47.21043],[8.31413,47.21178],[8.31089,47.2153],[8.31107,47.21857],[8.31221,47.2198],[8.30884,47.22433],[8.30932,47.22646],[8.30715,47.23042],[8.30727,47.2321],[8.30595,47.23582],[8.30607,47.23949],[8.30378,47.24366],[8.30144,47.24677],[8.29554,47.24836],[8.29187,47.25293],[8.28814,47.25869],[8.28766,47.26143],[8.28627,47.26519],[8.28723,47.26805],[8.28838,47.26964],[8.2823,47.27478],[8.27718,47.27576],[8.27273,47.27531],[8.26749,47.27593],[8.26533,47.27719],[8.2616,47.27695],[8.25793,47.27781],[8.25576,47.27887],[8.25317,47.27678],[8.25034,47.27548],[8.2501,47.27348],[8.24956,47.27017],[8.24559,47.26715],[8.24095,47.26678],[8.23452,47.26727],[8.23145,47.26278],[8.2309,47.25931],[8.22663,47.24942],[8.222,47.24713],[8.21526,47.24431],[8.21363,47.24203],[8.21309,47.23602],[8.21123,47.23246],[8.21285,47.22548],[8.21117,47.22266],[8.20689,47.22053],[8.19762,47.22065],[8.19149,47.21861],[8.16976,47.21865],[8.16543,47.22315],[8.16085,47.22405],[8.15351,47.2294],[8.15171,47.2332],[8.14822,47.23647],[8.14798,47.241],[8.14635,47.24203],[8.13823,47.24166],[8.13558,47.23941],[8.12673,47.23606],[8.1218,47.23631],[8.11614,47.23872],[8.10675,47.23945],[8.10266,47.24113],[8.09983,47.24436],[8.09766,47.2493],[8.09797,47.25069],[8.09339,47.25567],[8.08852,47.2569],[8.08485,47.25583],[8.08323,47.25405],[8.07995,47.25246],[8.0769,47.25054],[8.06854,47.24284],[8.06325,47.24098],[8.05134,47.23865],[8.04857,47.23886],[8.03575,47.23747],[8.0322,47.23555],[8.02714,47.23534],[8.01139,47.23967],[8.00927,47.24116],[8.00791,47.24312],[8.00783,47.24821],[8.00857,47.25042],[8.0084,47.25769],[8.00712,47.25922],[8.00299,47.26162],[8.00052,47.26486],[7.99759,47.26789],[7.99627,47.27271],[7.99474,47.27369],[7.98993,47.27121],[7.97278,47.26907],[7.96857,47.27008],[7.96737,47.27098],[7.95861,47.27112],[7.9601,47.26748],[7.96274,47.26396],[7.96576,47.26171],[7.96699,47.25879],[7.96695,47.25001],[7.95963,47.24582],[7.95112,47.23918],[7.94469,47.236],[7.93733,47.23106],[7.93405,47.23051],[7.9298,47.23077],[7.9178,47.23305],[7.90784,47.23837],[7.89793,47.2377],[7.8695,47.23207],[7.85478,47.22719],[7.85137,47.22713],[7.83958,47.22947],[7.83584,47.22976],[7.83082,47.23259],[7.82707,47.23505],[7.82431,47.23831],[7.82129,47.24042],[7.82014,47.24264],[7.81822,47.24562],[7.81771,47.24917],[7.81822,47.25082],[7.81835,47.25371],[7.81988,47.25587],[7.82116,47.2568],[7.82112,47.25778],[7.8192,47.26058],[7.81912,47.26154],[7.81686,47.26486],[7.8175,47.26731],[7.81958,47.26982],[7.82439,47.27158],[7.82805,47.2721],[7.83592,47.27837],[7.83707,47.28342],[7.84005,47.2872],[7.84201,47.29067],[7.84588,47.29427],[7.84763,47.2982],[7.85137,47.30299],[7.8529,47.30741],[7.85571,47.31032],[7.86065,47.31254],[7.86422,47.31349],[7.87018,47.31672],[7.87631,47.31736],[7.88082,47.31716],[7.88337,47.31667],[7.88588,47.31941],[7.88886,47.32131],[7.88805,47.32443],[7.88907,47.3287],[7.8915,47.33262],[7.8978,47.34014],[7.9001,47.34156],[7.90005,47.3432],[7.90222,47.34557],[7.90635,47.34704],[7.90963,47.34735],[7.91359,47.34626],[7.91618,47.34456],[7.91699,47.34303],[7.92401,47.33899],[7.93839,47.33792],[7.94929,47.33784],[7.95431,47.33596],[7.95593,47.33317],[7.95691,47.32968],[7.95571,47.32535],[7.96993,47.32797],[7.97308,47.33017],[7.98333,47.33432],[7.98563,47.33692],[7.98954,47.33818],[7.99248,47.33827],[7.99784,47.34017],[7.99635,47.34257],[7.99601,47.34588],[7.99733,47.34859],[8.00116,47.35081],[8.00137,47.3569],[8.00261,47.3577],[8.00418,47.36044],[8.00976,47.36419],[8.01125,47.36598],[8.01746,47.36926],[8.01912,47.37157],[8.0198,47.37376],[8.02023,47.37598],[8.02172,47.37837],[8.02193,47.38093],[8.02282,47.38286],[8.02078,47.38857],[8.01606,47.38929],[8.01265,47.38897],[8.00772,47.39012],[8.00367,47.39205],[8.00163,47.39479],[8.00155,47.39998],[8.00023,47.40306],[7.99801,47.40453],[7.99261,47.40551],[7.98776,47.40637],[7.98418,47.40839],[7.98027,47.4081],[7.9732,47.41127],[7.96963,47.41383],[7.95695,47.41893],[7.95529,47.4218],[7.95593,47.42402],[7.95746,47.42621],[7.96274,47.42828],[7.97746,47.43254],[7.97567,47.43732],[7.97614,47.44138],[7.97431,47.44368],[7.95129,47.45111],[7.94861,47.4539],[7.94818,47.4566],[7.94678,47.45755],[7.94039,47.45669],[7.93588,47.45738],[7.93631,47.47625],[7.9318,47.47605],[7.92469,47.47717],[7.91571,47.47743],[7.90903,47.47947],[7.90316,47.47967],[7.90295,47.48965],[7.8969,47.4898],[7.8918,47.49405],[7.89086,47.49765],[7.8878,47.49931],[7.88631,47.5023],[7.87999,47.50397],[7.87403,47.50787],[7.86994,47.50944],[7.87006,47.51239],[7.86435,47.51245],[7.85851,47.51543],[7.8558,47.51854],[7.85625,47.52147],[7.8549,47.52474],[7.85183,47.5285],[7.84647,47.52714],[7.84148,47.52777],[7.8413,47.52406],[7.84015,47.51587],[7.83943,47.51259],[7.83688,47.51256],[7.83679,47.51049],[7.83352,47.50949],[7.83156,47.50765],[7.82981,47.50552],[7.82522,47.50354],[7.82049,47.5004],[7.81475,47.49491],[7.81181,47.49261],[7.80645,47.4914],[7.80403,47.49146],[7.80049,47.49014],[7.77977,47.49028],[7.77871,47.49304],[7.7796,47.496],[7.78386,47.5004],[7.78203,47.50368],[7.78088,47.5073],[7.78109,47.51018],[7.77977,47.51265],[7.77969,47.51529],[7.77045,47.51802],[7.75905,47.52003],[7.75266,47.52009],[7.74781,47.51957],[7.73368,47.52291],[7.72781,47.52719],[7.71985,47.52978],[7.71262,47.53095],[7.70764,47.5344],[7.70551,47.53917],[7.70696,47.54279],[7.71415,47.54627],[7.72245,47.54756],[7.749,47.54977],[7.75428,47.55339],[7.76654,47.55615],[7.77168,47.55761],[7.78007,47.55836],[7.78577,47.55982],[7.7902,47.5616],[7.79398,47.56634],[7.80492,47.57237],[7.80611,47.57989],[7.81173,47.58954],[7.81577,47.59218],[7.82211,47.59352],[7.83645,47.59163],[7.83952,47.59045],[7.84305,47.58778],[7.84875,47.58899],[7.85624,47.59189],[7.86488,47.59393],[7.87126,47.5943],[7.87726,47.59367],[7.88535,47.59424],[7.89343,47.59301],[7.90109,47.58976],[7.90833,47.58514],[7.91386,47.57923],[7.91867,47.57194],[7.91956,47.56772],[7.91875,47.56433],[7.9156,47.56008],[7.91577,47.55715],[7.91841,47.55405],[7.92126,47.55261],[7.92552,47.55227],[7.93471,47.55221],[7.9405,47.55078],[7.94326,47.54968],[7.94356,47.55052],[7.94458,47.55589],[7.94841,47.55979],[7.95394,47.56229],[7.96003,47.56333],[7.96577,47.56272],[7.97203,47.5612],[7.97833,47.56057],[7.98624,47.56094],[7.99718,47.56212],[8.0045,47.56137],[8.01114,47.55974],[8.01641,47.55701],[8.02046,47.55574],[8.0262,47.55741],[8.03799,47.55876],[8.04254,47.56028],[8.0485,47.56333],[8.05454,47.56798],[8.05931,47.56921],[8.0622,47.56895],[8.06693,47.57002],[8.07242,47.56973],[8.07739,47.56795],[8.08182,47.56436],[8.08522,47.56281],[8.08791,47.56298],[8.09259,47.56559],[8.09395,47.56809],[8.09484,47.57587],[8.09602,47.57882]]],terms_text:"AGIS OF2014",description:"This imagery is provided via a proxy operated by https://sosm.ch/"},{id:"Aargau-AGIS-2016",name:"Kanton Aargau 25cm (AGIS 2016)",type:"tms",template:"https://mapproxy.osm.ch/tiles/AGIS2016/EPSG900913/{zoom}/{x}/{y}.png?origin=nw",endDate:"2016-01-01T00:00:00.000Z",startDate:"2016-01-01T00:00:00.000Z",zoomExtent:[8,19],polygon:[[[7.70438,47.55794],[7.77076,47.55772],[7.77103,47.58025],[7.80408,47.58017],[7.80433,47.60248],[7.93713,47.60217],[7.93703,47.57962],[8.00374,47.57917],[8.00338,47.55687],[8.0364,47.55665],[8.03681,47.57928],[8.10313,47.57881],[8.10387,47.60112],[8.17011,47.60086],[8.17036,47.6235],[8.30311,47.62235],[8.30305,47.59988],[8.3362,47.59927],[8.33585,47.5771],[8.36913,47.57694],[8.36943,47.59931],[8.43564,47.59877],[8.43454,47.53133],[8.40144,47.53162],[8.40096,47.50926],[8.3678,47.50959],[8.3675,47.48698],[8.40042,47.48666],[8.39939,47.41929],[8.46558,47.4187],[8.46515,47.39647],[8.43206,47.39654],[8.43125,47.3516],[8.46434,47.35128],[8.46327,47.28387],[8.42997,47.28421],[8.42714,47.12676],[8.3293,47.12753],[8.32937,47.13007],[8.32833,47.13007],[8.3285,47.14529],[8.3294,47.19502],[8.2964,47.19526],[8.29714,47.24022],[8.2641,47.24046],[8.26446,47.26297],[8.23141,47.26316],[8.23075,47.21822],[8.09886,47.21912],[8.09874,47.24135],[8.066,47.24176],[8.06552,47.2192],[7.99993,47.21952],[8.00003,47.26433],[7.96735,47.26462],[7.96675,47.21961],[7.80153,47.22029],[7.80244,47.28791],[7.83518,47.28772],[7.83543,47.31017],[7.86837,47.31017],[7.86885,47.35542],[8.00097,47.3543],[8.00156,47.39928],[7.9353,47.39976],[7.93607,47.46716],[7.90278,47.46729],[7.90303,47.48981],[7.86987,47.48998],[7.86993,47.5125],[7.83689,47.51258],[7.83665,47.4901],[7.77027,47.49026],[7.77045,47.51274],[7.70452,47.51307],[7.70438,47.55794]]],terms_text:"AGIS OF2016",description:"This imagery is provided via a proxy operated by https://sosm.ch/"},{id:"Aargau-AGIS-2017",name:"Kanton Aargau 25cm (AGIS 2017)",type:"tms",template:"https://mapproxy.osm.ch/tiles/AGIS2017/EPSG900913/{zoom}/{x}/{y}.png?origin=nw",endDate:"2017-01-01T00:00:00.000Z",startDate:"2017-01-01T00:00:00.000Z",zoomExtent:[8,19],polygon:[[[7.70438,47.55794],[7.77076,47.55772],[7.77103,47.58025],[7.80408,47.58017],[7.80433,47.60248],[7.93713,47.60217],[7.93703,47.57962],[8.00374,47.57917],[8.00338,47.55687],[8.0364,47.55665],[8.03681,47.57928],[8.10313,47.57881],[8.10387,47.60112],[8.17011,47.60086],[8.17036,47.6235],[8.30311,47.62235],[8.30305,47.59988],[8.3362,47.59927],[8.33585,47.5771],[8.36913,47.57694],[8.36943,47.59931],[8.43564,47.59877],[8.43454,47.53133],[8.40144,47.53162],[8.40096,47.50926],[8.3678,47.50959],[8.3675,47.48698],[8.40042,47.48666],[8.39939,47.41929],[8.46558,47.4187],[8.46515,47.39647],[8.43206,47.39654],[8.43125,47.3516],[8.46434,47.35128],[8.46327,47.28387],[8.42997,47.28421],[8.42714,47.12676],[8.3293,47.12753],[8.32937,47.13007],[8.32833,47.13007],[8.3285,47.14529],[8.3294,47.19502],[8.2964,47.19526],[8.29714,47.24022],[8.2641,47.24046],[8.26446,47.26297],[8.23141,47.26316],[8.23075,47.21822],[8.09886,47.21912],[8.09874,47.24135],[8.066,47.24176],[8.06552,47.2192],[7.99993,47.21952],[8.00003,47.26433],[7.96735,47.26462],[7.96675,47.21961],[7.80153,47.22029],[7.80244,47.28791],[7.83518,47.28772],[7.83543,47.31017],[7.86837,47.31017],[7.86885,47.35542],[8.00097,47.3543],[8.00156,47.39928],[7.9353,47.39976],[7.93607,47.46716],[7.90278,47.46729],[7.90303,47.48981],[7.86987,47.48998],[7.86993,47.5125],[7.83689,47.51258],[7.83665,47.4901],[7.77027,47.49026],[7.77045,47.51274],[7.70452,47.51307],[7.70438,47.55794]]],terms_text:"AGIS OF2017",best:true,description:"This imagery is provided via a proxy operated by https://sosm.ch/"},{id:"Basel-Landschaft-2015",name:"Kanton Basel-Landschaft 10cm (2015)",type:"tms",template:"https://mapproxy.osm.ch/tiles/KTBASELLANDSCHAFT2015/EPSG900913/{zoom}/{x}/{y}.png?origin=nw",endDate:"2015-01-01T00:00:00.000Z",startDate:"2015-01-01T00:00:00.000Z",zoomExtent:[18,21],polygon:[[[7.37028,47.41368],[7.35758,47.41508],[7.35792,47.41827],[7.35354,47.41961],[7.34488,47.42402],[7.33973,47.42971],[7.33269,47.43024],[7.32685,47.43192],[7.32528,47.43489],[7.3305,47.44176],[7.33899,47.44109],[7.34496,47.43608],[7.35266,47.43436],[7.3812,47.43208],[7.37599,47.41431],[7.37815,47.414],[7.38204,47.41331],[7.38839,47.41398],[7.41371,47.41093],[7.42074,47.4111],[7.42748,47.41448],[7.43811,47.41274],[7.4484,47.41507],[7.45558,47.42792],[7.45062,47.43534],[7.43784,47.44632],[7.42542,47.44328],[7.4209,47.44594],[7.42242,47.45072],[7.4288,47.45388],[7.43003,47.45949],[7.44577,47.46197],[7.44717,47.45696],[7.45651,47.44926],[7.49236,47.45897],[7.53068,47.46119],[7.52745,47.47391],[7.53633,47.48383],[7.53623,47.49105],[7.5326,47.49097],[7.53179,47.4974],[7.52004,47.49678],[7.51223,47.49892],[7.50935,47.50888],[7.49908,47.51628],[7.49787,47.52125],[7.50228,47.51491],[7.51746,47.51728],[7.5222,47.51409],[7.53096,47.52905],[7.51935,47.53472],[7.51075,47.52899],[7.5023,47.5284],[7.49804,47.53615],[7.50545,47.54438],[7.51676,47.54541],[7.52732,47.55278],[7.55466,47.56437],[7.56458,47.55704],[7.56124,47.55172],[7.55875,47.55235],[7.55588,47.54434],[7.56479,47.54569],[7.58726,47.5419],[7.58269,47.53247],[7.58948,47.52792],[7.59025,47.51979],[7.59478,47.51929],[7.61378,47.53925],[7.6223,47.53977],[7.62285,47.55004],[7.61774,47.55437],[7.61762,47.55865],[7.63273,47.56149],[7.63997,47.55816],[7.649,47.5483],[7.66131,47.54483],[7.66586,47.53746],[7.67467,47.53375],[7.69494,47.5325],[7.71347,47.53978],[7.71596,47.53582],[7.72362,47.53675],[7.72716,47.53293],[7.73322,47.53275],[7.73797,47.52732],[7.74902,47.52498],[7.75786,47.52605],[7.78763,47.52012],[7.79014,47.51864],[7.78887,47.50683],[7.7928,47.50068],[7.78663,47.49312],[7.79889,47.49565],[7.79816,47.4994],[7.7994,47.49748],[7.80742,47.49714],[7.81471,47.5048],[7.83198,47.51474],[7.83321,47.53382],[7.84653,47.53266],[7.85233,47.53524],[7.86257,47.52692],[7.86396,47.51931],[7.87666,47.52269],[7.87567,47.51319],[7.89399,47.50606],[7.90477,47.49218],[7.90482,47.48491],[7.93329,47.48141],[7.94702,47.48489],[7.94003,47.46202],[7.94885,47.46378],[7.95761,47.45881],[7.95785,47.45128],[7.94678,47.44319],[7.95003,47.43172],[7.96183,47.42183],[7.95657,47.41968],[7.95504,47.41561],[7.94839,47.41627],[7.93493,47.41177],[7.93672,47.40806],[7.93266,47.40527],[7.90974,47.39852],[7.89022,47.40714],[7.88333,47.4061],[7.88344,47.4012],[7.8777,47.40126],[7.86914,47.39551],[7.87943,47.38799],[7.87881,47.38351],[7.86265,47.38198],[7.84012,47.37476],[7.83055,47.36512],[7.80217,47.3611],[7.79637,47.35347],[7.79356,47.33905],[7.78529,47.33788],[7.76896,47.33891],[7.76642,47.34273],[7.75152,47.34433],[7.73415,47.35776],[7.72791,47.36886],[7.70195,47.37245],[7.6442,47.36721],[7.64176,47.38047],[7.63558,47.38059],[7.63332,47.38291],[7.63331,47.38534],[7.63725,47.38607],[7.63272,47.41003],[7.66405,47.41002],[7.6798,47.41751],[7.68658,47.43366],[7.68297,47.43872],[7.68485,47.44784],[7.69227,47.45421],[7.69883,47.45586],[7.69993,47.46191],[7.70988,47.46938],[7.69976,47.48063],[7.66833,47.48635],[7.66612,47.49687],[7.65217,47.49581],[7.64865,47.49183],[7.65539,47.49021],[7.65051,47.48826],[7.65593,47.48739],[7.64442,47.48564],[7.64097,47.48273],[7.6073,47.4894],[7.60885,47.48353],[7.60563,47.47936],[7.60815,47.47521],[7.60449,47.47045],[7.61887,47.46745],[7.62607,47.46291],[7.62217,47.46195],[7.61646,47.44523],[7.6158,47.43275],[7.59207,47.43271],[7.58121,47.42878],[7.57842,47.43491],[7.5689,47.4369],[7.5683,47.42233],[7.58074,47.4147],[7.52524,47.41163],[7.53117,47.40353],[7.51862,47.38822],[7.5113,47.38974],[7.50226,47.38481],[7.49233,47.38523],[7.47841,47.39056],[7.47747,47.40128],[7.46448,47.40251],[7.46092,47.40068],[7.45002,47.40393],[7.44951,47.39976],[7.4434,47.40231],[7.44131,47.40018],[7.44357,47.3889],[7.43732,47.38089],[7.41169,47.38057],[7.41628,47.38479],[7.41449,47.3943],[7.39894,47.39684],[7.39592,47.40338],[7.38869,47.40302],[7.38405,47.41236],[7.37968,47.41281],[7.37584,47.41401],[7.37028,47.41368]]],terms_url:"https://www.geo.bl.ch/fileadmin/user_upload/Geodaten/Nutzungsbedingungen_GBD_BL_V3p2.pdf",terms_text:"Geodaten des Kantons Basel-Landschaft 2015",best:true,description:"This imagery is provided via a proxy operated by https://sosm.ch/"},{id:"KTBASELSTADT2015",name:"Kanton Basel-Stadt 2015",type:"tms",template:"https://mapproxy.osm.ch/tiles/KTBASELSTADT2015/EPSG900913/{zoom}/{x}/{y}.png?origin=nw",endDate:"2015-01-01T00:00:00.000Z",startDate:"2015-01-01T00:00:00.000Z",zoomExtent:[8,21],polygon:[[[7.492,47.4817],[7.492,47.6342],[7.784,47.6342],[7.784,47.4817],[7.492,47.4817]]],terms_text:"Kanton Basel-Stadt OF 2015",description:"This imagery is provided via a proxy operated by https://sosm.ch/"},{id:"KTBASELSTADT2017",name:"Kanton Basel-Stadt 2017",type:"tms",template:"https://mapproxy.osm.ch/tiles/KTBASELSTADT2017/EPSG900913/{zoom}/{x}/{y}.png?origin=nw",endDate:"2017-01-01T00:00:00.000Z",startDate:"2017-01-01T00:00:00.000Z",zoomExtent:[8,21],polygon:[[[7.67138,47.59522],[7.67996,47.60078],[7.68451,47.60182],[7.69438,47.60171],[7.69395,47.59667],[7.68708,47.59355],[7.67884,47.58712],[7.68571,47.58538],[7.68906,47.57612],[7.69412,47.5734],[7.6924,47.56691],[7.6847,47.5617],[7.66425,47.56164],[7.64872,47.55689],[7.63035,47.55869],[7.62357,47.55666],[7.62786,47.55145],[7.62738,47.53658],[7.61833,47.53662],[7.61335,47.53262],[7.59962,47.51911],[7.58503,47.51917],[7.58409,47.52636],[7.57713,47.53163],[7.58125,47.53986],[7.5719,47.54148],[7.55387,47.54148],[7.55379,47.55122],[7.55653,47.55828],[7.5537,47.56031],[7.55379,47.57473],[7.56434,47.58122],[7.57936,47.57988],[7.58331,47.59019],[7.58563,47.59233],[7.59207,47.59239],[7.59851,47.59071],[7.60915,47.58643],[7.60923,47.5811],[7.6191,47.58046],[7.63687,47.59314],[7.63782,47.59557],[7.64168,47.59887],[7.64528,47.60026],[7.66494,47.59618],[7.67138,47.59522]]],terms_text:"Kanton Basel-Stadt OF 2017",best:true,description:"This imagery is provided via a proxy operated by https://sosm.ch/"},{id:"Bern-dsm-hillshade-2015",name:"Kanton Bern, Digitales Oberflaechenmodell 50cm, Relief",type:"wms",template:"https://www.geoservice.apps.be.ch/geoservice2/services/a42geo/a42geo_hoehenwms_d_fk/MapServer/WmsServer?LAYERS=GEODB.LDOM50CM_LORELIEF&SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&STYLES=default&FORMAT=image/jpeg&CRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2015-01-01T00:00:00.000Z",startDate:"2015-01-01T00:00:00.000Z",zoomExtent:[8,22],polygon:[[[6.82526,47.07901],[7.28497,46.74221],[7.06335,46.27329],[8.20129,46.43975],[8.44334,46.59001],[8.47595,46.76315],[8.41244,46.79841],[8.13984,46.7869],[7.96543,46.80687],[7.90089,46.8914],[7.97676,47.00414],[7.88784,47.05609],[7.90363,47.17665],[7.81952,47.29413],[7.55859,47.33231],[7.16583,47.31183],[6.82388,47.18131],[6.82526,47.07901]]],terms_text:"Digitales Oberflächenmodell LIDAR 50cm © Amt für Wald des Kantons Bern"},{id:"Bern-dtm-hillshade-2015",name:"Kanton Bern, Digitales Terrainmodell 50cm, Relief",type:"wms",template:"https://www.geoservice.apps.be.ch/geoservice2/services/a42geo/a42geo_hoehenwms_d_fk/MapServer/WmsServer?LAYERS=GEODB.LDTM50CM_LTRELIEF&SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&STYLES=default&FORMAT=image/jpeg&CRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2015-01-01T00:00:00.000Z",startDate:"2015-01-01T00:00:00.000Z",zoomExtent:[8,22],polygon:[[[6.82526,47.07901],[7.28497,46.74221],[7.06335,46.27329],[8.20129,46.43975],[8.44334,46.59001],[8.47595,46.76315],[8.41244,46.79841],[8.13984,46.7869],[7.96543,46.80687],[7.90089,46.8914],[7.97676,47.00414],[7.88784,47.05609],[7.90363,47.17665],[7.81952,47.29413],[7.55859,47.33231],[7.16583,47.31183],[6.82388,47.18131],[6.82526,47.07901]]],terms_text:"Digitales Terrainmodell LIDAR 50cm © Amt für Wald des Kantons Bern"},{id:"Solothurn-sogis2014-tms",name:"Kanton Solothurn (SOGIS)",type:"tms",template:"https://mapproxy.osm.ch/tiles/sogis2014/EPSG900913/{zoom}/{x}/{y}.png?origin=nw",endDate:"2017-01-01T00:00:00.000Z",startDate:"2015-01-01T00:00:00.000Z",zoomExtent:[15,19],polygon:[[[7.95595,47.47162],[7.98239,47.47155],[7.98239,47.45353],[7.99553,47.45353],[7.99521,47.41747],[8.0218,47.41743],[8.02155,47.39935],[8.03456,47.39926],[8.03468,47.39028],[8.04788,47.39022],[8.04769,47.37224],[8.03456,47.37232],[8.03437,47.3544],[8.02117,47.35427],[8.02072,47.32739],[7.99445,47.32747],[7.99426,47.31857],[7.96773,47.31866],[7.96767,47.30966],[7.94122,47.30978],[7.94133,47.32778],[7.91486,47.32786],[7.91467,47.30988],[7.9016,47.31005],[7.9014,47.30097],[7.87501,47.3011],[7.87501,47.29223],[7.86165,47.29212],[7.86154,47.27409],[7.84832,47.27416],[7.8483,47.26523],[7.83502,47.2652],[7.83502,47.25624],[7.79535,47.25636],[7.7953,47.24741],[7.72924,47.24756],[7.72929,47.25652],[7.71623,47.25667],[7.71618,47.26559],[7.70304,47.26559],[7.70304,47.27461],[7.68975,47.27467],[7.68989,47.28368],[7.66341,47.28371],[7.66332,47.2747],[7.61055,47.27476],[7.61041,47.24787],[7.62352,47.24777],[7.62356,47.23879],[7.64986,47.23876],[7.64999,47.22977],[7.6499,47.22083],[7.66308,47.22073],[7.6631,47.21178],[7.66297,47.20273],[7.67617,47.2027],[7.67623,47.19372],[7.68938,47.19369],[7.68924,47.17572],[7.70243,47.1756],[7.70234,47.14869],[7.66267,47.14881],[7.66281,47.13978],[7.63633,47.1399],[7.63647,47.14869],[7.5968,47.14893],[7.59684,47.13996],[7.57041,47.13999],[7.57042,47.15792],[7.55736,47.15795],[7.55732,47.14888],[7.54421,47.14895],[7.54417,47.13991],[7.53098,47.13991],[7.53095,47.13097],[7.51767,47.13097],[7.51765,47.12196],[7.51769,47.11292],[7.49131,47.11301],[7.49135,47.10403],[7.4782,47.104],[7.47813,47.07705],[7.46493,47.07708],[7.46498,47.06807],[7.42552,47.06801],[7.42543,47.08601],[7.37279,47.08598],[7.37288,47.10403],[7.3596,47.10403],[7.35955,47.131],[7.41228,47.131],[7.41223,47.14901],[7.42538,47.14901],[7.42552,47.15801],[7.3727,47.15796],[7.3727,47.18498],[7.34627,47.18492],[7.34636,47.20287],[7.33307,47.2029],[7.33307,47.22096],[7.34614,47.22096],[7.34614,47.22991],[7.37256,47.22991],[7.3727,47.2389],[7.399,47.23896],[7.39913,47.24792],[7.41228,47.24792],[7.41228,47.26592],[7.45186,47.26589],[7.45195,47.2749],[7.46505,47.27493],[7.4651,47.28385],[7.47829,47.28385],[7.47834,47.29293],[7.5046,47.29288],[7.50473,47.30183],[7.5312,47.30181],[7.53129,47.31979],[7.54448,47.31985],[7.54453,47.3288],[7.55768,47.32883],[7.55768,47.33786],[7.53125,47.33786],[7.53133,47.35586],[7.51801,47.35583],[7.5181,47.36483],[7.3988,47.36484],[7.39889,47.39182],[7.38564,47.39181],[7.38564,47.4008],[7.37234,47.4008],[7.37234,47.40978],[7.34584,47.40978],[7.34584,47.41878],[7.31925,47.41878],[7.31925,47.44578],[7.4121,47.44578],[7.4121,47.49078],[7.42535,47.49078],[7.42535,47.49981],[7.43856,47.49981],[7.43856,47.50876],[7.49177,47.50876],[7.49178,47.63468],[7.7845,47.63428],[7.78415,47.57123],[7.81074,47.57114],[7.81074,47.56216],[7.82395,47.56206],[7.82387,47.54414],[7.86368,47.54397],[7.86363,47.53498],[7.87679,47.53495],[7.87675,47.52599],[7.8901,47.52596],[7.89006,47.51695],[7.90319,47.51692],[7.9031,47.49886],[7.91649,47.49883],[7.91645,47.48976],[7.95612,47.48967],[7.95595,47.47162]]],terms_text:"Orthofoto WMS Solothurn",best:true,description:"This imagery is provided via a proxy operated by https://sosm.ch/",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/ch/KantonSolothurn-SOGIS-wms.png"},{id:"Solothurn-infrared-SOGIS",name:"Kanton Solothurn Infrarot (SOGIS)",type:"wms",template:"https://geoweb.so.ch/wms/sogis_orthofoto.wms?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Orthofoto_CIR_SO&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",endDate:"2017-01-01T00:00:00.000Z",startDate:"2015-01-01T00:00:00.000Z",zoomExtent:[15,19],polygon:[[[7.57042,47.15792],[7.55736,47.15795],[7.55732,47.14888],[7.54421,47.14895],[7.54417,47.13991],[7.53098,47.13991],[7.53093,47.12196],[7.51765,47.12196],[7.51769,47.11292],[7.49131,47.11301],[7.49135,47.10403],[7.4782,47.104],[7.47816,47.09496],[7.49144,47.09499],[7.4914,47.07702],[7.47816,47.07705],[7.4782,47.06804],[7.42552,47.06801],[7.42543,47.08601],[7.37279,47.08598],[7.37288,47.10403],[7.3596,47.10403],[7.35955,47.131],[7.41228,47.131],[7.41223,47.14901],[7.42538,47.14901],[7.42552,47.15801],[7.39913,47.15804],[7.39913,47.14901],[7.3727,47.14898],[7.3727,47.18498],[7.34627,47.18492],[7.34636,47.19391],[7.33307,47.19394],[7.33307,47.22991],[7.37256,47.22991],[7.3727,47.2389],[7.399,47.23896],[7.39913,47.24792],[7.41228,47.24792],[7.41228,47.26592],[7.45186,47.26589],[7.45195,47.2749],[7.46505,47.27493],[7.4651,47.28385],[7.47829,47.28385],[7.47834,47.29293],[7.49149,47.29289],[7.49162,47.30184],[7.5312,47.30181],[7.53129,47.31979],[7.54448,47.31985],[7.54453,47.3288],[7.55768,47.32883],[7.55768,47.33786],[7.53125,47.33786],[7.53133,47.35586],[7.51801,47.35583],[7.5181,47.36483],[7.43862,47.36492],[7.43867,47.37389],[7.42538,47.37395],[7.42543,47.40081],[7.38558,47.4009],[7.38567,47.4098],[7.35915,47.4098],[7.35915,47.41878],[7.37239,47.41884],[7.37247,47.43682],[7.38571,47.43682],[7.38571,47.44104],[7.39563,47.44016],[7.3963,47.44258],[7.40761,47.4411],[7.40793,47.44225],[7.40313,47.44246],[7.39738,47.44331],[7.39832,47.44583],[7.41214,47.44583],[7.41228,47.45478],[7.43867,47.45488],[7.4388,47.47053],[7.45007,47.46941],[7.45007,47.47223],[7.44647,47.47223],[7.44647,47.47381],[7.44293,47.4739],[7.44288,47.47553],[7.43921,47.4756],[7.43921,47.4772],[7.43557,47.47729],[7.43548,47.47899],[7.4174,47.47896],[7.41744,47.48573],[7.42099,47.48573],[7.42108,47.49082],[7.42763,47.49073],[7.42852,47.49349],[7.43099,47.49643],[7.43485,47.49889],[7.4419,47.49552],[7.44665,47.49455],[7.45011,47.49176],[7.45087,47.4907],[7.46451,47.49073],[7.46456,47.48903],[7.46819,47.489],[7.46819,47.48566],[7.47187,47.48573],[7.47192,47.48233],[7.48269,47.48239],[7.48264,47.48388],[7.48623,47.48397],[7.48637,47.48566],[7.48991,47.48566],[7.49,47.4907],[7.4997,47.49073],[7.49965,47.4914],[7.49175,47.49194],[7.49175,47.49513],[7.49822,47.49479],[7.49889,47.49585],[7.49566,47.49628],[7.49171,47.49625],[7.4918,47.49973],[7.50504,47.4997],[7.50504,47.50874],[7.5448,47.50871],[7.54474,47.45482],[7.49169,47.45469],[7.49175,47.44581],[7.46529,47.44577],[7.46522,47.40983],[7.49156,47.40979],[7.49175,47.39192],[7.50489,47.39183],[7.50489,47.40068],[7.51821,47.40077],[7.51834,47.41876],[7.55794,47.41872],[7.55813,47.44581],[7.58453,47.44572],[7.58441,47.43667],[7.61094,47.43662],[7.611,47.4637],[7.59767,47.4637],[7.59793,47.49964],[7.62433,47.49969],[7.62445,47.4906],[7.63778,47.49055],[7.63784,47.4996],[7.67757,47.49947],[7.67745,47.49047],[7.70385,47.49043],[7.70391,47.48146],[7.71711,47.48129],[7.71711,47.45452],[7.70397,47.45452],[7.70385,47.44559],[7.69046,47.44551],[7.69033,47.40957],[7.67713,47.40949],[7.67713,47.40068],[7.65066,47.40068],[7.65047,47.37365],[7.67706,47.37357],[7.67706,47.38251],[7.71667,47.38251],[7.71679,47.37344],[7.74307,47.3734],[7.74307,47.35538],[7.7562,47.35534],[7.75633,47.3464],[7.78261,47.34627],[7.78292,47.36433],[7.79612,47.36428],[7.79619,47.37327],[7.82265,47.37314],[7.82271,47.38229],[7.84912,47.38212],[7.84924,47.39106],[7.86251,47.39097],[7.86263,47.40906],[7.8759,47.40897],[7.87602,47.41803],[7.90242,47.41795],[7.90242,47.40897],[7.92889,47.4088],[7.92914,47.41782],[7.94215,47.41769],[7.94266,47.46276],[7.95592,47.46259],[7.95612,47.47164],[7.98239,47.47155],[7.98239,47.45353],[7.99553,47.45353],[7.99521,47.41747],[8.0218,47.41743],[8.02155,47.39935],[8.03456,47.39926],[8.03468,47.39028],[8.04788,47.39015],[8.04769,47.37224],[8.03456,47.37232],[8.03437,47.3544],[8.02117,47.35427],[8.02072,47.32739],[7.99445,47.32747],[7.99426,47.31857],[7.96773,47.31866],[7.96767,47.30966],[7.9412,47.30992],[7.94133,47.32778],[7.91486,47.32786],[7.91467,47.30988],[7.9016,47.31005],[7.9014,47.30097],[7.87501,47.3011],[7.87501,47.29223],[7.86165,47.29212],[7.86154,47.27409],[7.84843,47.27415],[7.8483,47.26523],[7.83502,47.2652],[7.83502,47.25624],[7.79535,47.25636],[7.7953,47.24741],[7.72924,47.24756],[7.72929,47.25652],[7.71623,47.25667],[7.71618,47.26559],[7.70304,47.26559],[7.70304,47.27461],[7.68975,47.27467],[7.68989,47.28368],[7.66341,47.28371],[7.66332,47.2747],[7.61055,47.27476],[7.61041,47.24787],[7.62352,47.24765],[7.62356,47.23879],[7.64986,47.23876],[7.64999,47.22977],[7.66305,47.22971],[7.6631,47.21178],[7.67621,47.21169],[7.67623,47.19372],[7.68938,47.19369],[7.68924,47.17572],[7.70243,47.1756],[7.70248,47.16663],[7.71567,47.16663],[7.71558,47.15769],[7.70239,47.15766],[7.70234,47.14869],[7.66267,47.14881],[7.66281,47.13978],[7.63633,47.1399],[7.63647,47.14869],[7.5968,47.14893],[7.59684,47.13996],[7.57041,47.13999],[7.57042,47.15792]]],terms_text:"Orthofoto WMS Solothurn",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/ch/KantonSolothurn-SOGIS-wms.png"},{id:"Solothurn-sogis2014-dom-wms",name:"Kanton Solothurn, DOM Relief 2014 50cm",type:"wms",template:"https://geoweb.so.ch/wms/wms_lidar?LAYERS=dom_relief2014_50cm&SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&FORMAT=image/jpeg&CRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2014-01-01T00:00:00.000Z",startDate:"2014-01-01T00:00:00.000Z",zoomExtent:[8,22],polygon:[[[7.95595,47.47162],[7.98239,47.47155],[7.98239,47.45353],[7.99553,47.45353],[7.99521,47.41747],[8.0218,47.41743],[8.02155,47.39935],[8.03456,47.39926],[8.03468,47.39028],[8.04788,47.39022],[8.04769,47.37224],[8.03456,47.37232],[8.03437,47.3544],[8.02117,47.35427],[8.02072,47.32739],[7.99445,47.32747],[7.99426,47.31857],[7.96773,47.31866],[7.96767,47.30966],[7.94122,47.30978],[7.94133,47.32778],[7.91486,47.32786],[7.91467,47.30988],[7.9016,47.31005],[7.9014,47.30097],[7.87501,47.3011],[7.87501,47.29223],[7.86165,47.29212],[7.86154,47.27409],[7.84832,47.27416],[7.8483,47.26523],[7.83502,47.2652],[7.83502,47.25624],[7.79535,47.25636],[7.7953,47.24741],[7.72924,47.24756],[7.72929,47.25652],[7.71623,47.25667],[7.71618,47.26559],[7.70304,47.26559],[7.70304,47.27461],[7.68975,47.27467],[7.68989,47.28368],[7.66341,47.28371],[7.66332,47.2747],[7.61055,47.27476],[7.61041,47.24787],[7.62352,47.24777],[7.62356,47.23879],[7.64986,47.23876],[7.64999,47.22977],[7.6499,47.22083],[7.66308,47.22073],[7.6631,47.21178],[7.66297,47.20273],[7.67617,47.2027],[7.67623,47.19372],[7.68938,47.19369],[7.68924,47.17572],[7.70243,47.1756],[7.70234,47.14869],[7.66267,47.14881],[7.66281,47.13978],[7.63633,47.1399],[7.63647,47.14869],[7.5968,47.14893],[7.59684,47.13996],[7.57041,47.13999],[7.57042,47.15792],[7.55736,47.15795],[7.55732,47.14888],[7.54421,47.14895],[7.54417,47.13991],[7.53098,47.13991],[7.53095,47.13097],[7.51767,47.13097],[7.51765,47.12196],[7.51769,47.11292],[7.49131,47.11301],[7.49135,47.10403],[7.4782,47.104],[7.47813,47.07705],[7.46493,47.07708],[7.46498,47.06807],[7.42552,47.06801],[7.42543,47.08601],[7.37279,47.08598],[7.37288,47.10403],[7.3596,47.10403],[7.35955,47.131],[7.41228,47.131],[7.41223,47.14901],[7.42538,47.14901],[7.42552,47.15801],[7.3727,47.15796],[7.3727,47.18498],[7.34627,47.18492],[7.34636,47.20287],[7.33307,47.2029],[7.33307,47.22096],[7.34614,47.22096],[7.34614,47.22991],[7.37256,47.22991],[7.3727,47.2389],[7.399,47.23896],[7.39913,47.24792],[7.41228,47.24792],[7.41228,47.26592],[7.45186,47.26589],[7.45195,47.2749],[7.46505,47.27493],[7.4651,47.28385],[7.47829,47.28385],[7.47834,47.29293],[7.5046,47.29288],[7.50473,47.30183],[7.5312,47.30181],[7.53129,47.31979],[7.54448,47.31985],[7.54453,47.3288],[7.55768,47.32883],[7.55768,47.33786],[7.53125,47.33786],[7.53133,47.35586],[7.51801,47.35583],[7.5181,47.36483],[7.3988,47.36484],[7.39889,47.39182],[7.38564,47.39181],[7.38564,47.4008],[7.37234,47.4008],[7.37234,47.40978],[7.34584,47.40978],[7.34584,47.41878],[7.31925,47.41878],[7.31925,47.44578],[7.4121,47.44578],[7.4121,47.49078],[7.42535,47.49078],[7.42535,47.49981],[7.43856,47.49981],[7.43856,47.50876],[7.49177,47.50876],[7.49178,47.63468],[7.7845,47.63428],[7.78415,47.57123],[7.81074,47.57114],[7.81074,47.56216],[7.82395,47.56206],[7.82387,47.54414],[7.86368,47.54397],[7.86363,47.53498],[7.87679,47.53495],[7.87675,47.52599],[7.8901,47.52596],[7.89006,47.51695],[7.90319,47.51692],[7.9031,47.49886],[7.91649,47.49883],[7.91645,47.48976],[7.95612,47.48967],[7.95595,47.47162]]],terms_text:"DOM Relief 2014 - Auflösung 50cm, WMS Solothurn (SOGIS)"},{id:"Solothurn-sogis2014-dtm-wms",name:"Kanton Solothurn, DTM Relief 2014 50cm",type:"wms",template:"https://geoweb.so.ch/wms/wms_lidar?LAYERS=dtm_relief2014_50cm&SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&FORMAT=image/jpeg&CRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2014-01-01T00:00:00.000Z",startDate:"2014-01-01T00:00:00.000Z",zoomExtent:[8,22],polygon:[[[7.95595,47.47162],[7.98239,47.47155],[7.98239,47.45353],[7.99553,47.45353],[7.99521,47.41747],[8.0218,47.41743],[8.02155,47.39935],[8.03456,47.39926],[8.03468,47.39028],[8.04788,47.39022],[8.04769,47.37224],[8.03456,47.37232],[8.03437,47.3544],[8.02117,47.35427],[8.02072,47.32739],[7.99445,47.32747],[7.99426,47.31857],[7.96773,47.31866],[7.96767,47.30966],[7.94122,47.30978],[7.94133,47.32778],[7.91486,47.32786],[7.91467,47.30988],[7.9016,47.31005],[7.9014,47.30097],[7.87501,47.3011],[7.87501,47.29223],[7.86165,47.29212],[7.86154,47.27409],[7.84832,47.27416],[7.8483,47.26523],[7.83502,47.2652],[7.83502,47.25624],[7.79535,47.25636],[7.7953,47.24741],[7.72924,47.24756],[7.72929,47.25652],[7.71623,47.25667],[7.71618,47.26559],[7.70304,47.26559],[7.70304,47.27461],[7.68975,47.27467],[7.68989,47.28368],[7.66341,47.28371],[7.66332,47.2747],[7.61055,47.27476],[7.61041,47.24787],[7.62352,47.24777],[7.62356,47.23879],[7.64986,47.23876],[7.64999,47.22977],[7.6499,47.22083],[7.66308,47.22073],[7.6631,47.21178],[7.66297,47.20273],[7.67617,47.2027],[7.67623,47.19372],[7.68938,47.19369],[7.68924,47.17572],[7.70243,47.1756],[7.70234,47.14869],[7.66267,47.14881],[7.66281,47.13978],[7.63633,47.1399],[7.63647,47.14869],[7.5968,47.14893],[7.59684,47.13996],[7.57041,47.13999],[7.57042,47.15792],[7.55736,47.15795],[7.55732,47.14888],[7.54421,47.14895],[7.54417,47.13991],[7.53098,47.13991],[7.53095,47.13097],[7.51767,47.13097],[7.51765,47.12196],[7.51769,47.11292],[7.49131,47.11301],[7.49135,47.10403],[7.4782,47.104],[7.47813,47.07705],[7.46493,47.07708],[7.46498,47.06807],[7.42552,47.06801],[7.42543,47.08601],[7.37279,47.08598],[7.37288,47.10403],[7.3596,47.10403],[7.35955,47.131],[7.41228,47.131],[7.41223,47.14901],[7.42538,47.14901],[7.42552,47.15801],[7.3727,47.15796],[7.3727,47.18498],[7.34627,47.18492],[7.34636,47.20287],[7.33307,47.2029],[7.33307,47.22096],[7.34614,47.22096],[7.34614,47.22991],[7.37256,47.22991],[7.3727,47.2389],[7.399,47.23896],[7.39913,47.24792],[7.41228,47.24792],[7.41228,47.26592],[7.45186,47.26589],[7.45195,47.2749],[7.46505,47.27493],[7.4651,47.28385],[7.47829,47.28385],[7.47834,47.29293],[7.5046,47.29288],[7.50473,47.30183],[7.5312,47.30181],[7.53129,47.31979],[7.54448,47.31985],[7.54453,47.3288],[7.55768,47.32883],[7.55768,47.33786],[7.53125,47.33786],[7.53133,47.35586],[7.51801,47.35583],[7.5181,47.36483],[7.3988,47.36484],[7.39889,47.39182],[7.38564,47.39181],[7.38564,47.4008],[7.37234,47.4008],[7.37234,47.40978],[7.34584,47.40978],[7.34584,47.41878],[7.31925,47.41878],[7.31925,47.44578],[7.4121,47.44578],[7.4121,47.49078],[7.42535,47.49078],[7.42535,47.49981],[7.43856,47.49981],[7.43856,47.50876],[7.49177,47.50876],[7.49178,47.63468],[7.7845,47.63428],[7.78415,47.57123],[7.81074,47.57114],[7.81074,47.56216],[7.82395,47.56206],[7.82387,47.54414],[7.86368,47.54397],[7.86363,47.53498],[7.87679,47.53495],[7.87675,47.52599],[7.8901,47.52596],[7.89006,47.51695],[7.90319,47.51692],[7.9031,47.49886],[7.91649,47.49883],[7.91645,47.48976],[7.95612,47.48967],[7.95595,47.47162]]],terms_text:"DTM Relief 2014 - Auflösung 50cm, WMS Solothurn (SOGIS)"},{id:"KTTHURGAU2017",name:"Kanton Thurgau OF 2017",type:"tms",template:"https://mapproxy.osm.ch/tiles/KTTHURGAU2017/EPSG900913/{zoom}/{x}/{y}.png?origin=nw",zoomExtent:[8,21],polygon:[[[8.63768,47.70041],[8.78328,47.6988],[8.78304,47.68533],[8.87027,47.68427],[8.86997,47.6709],[8.89901,47.67047],[8.89867,47.65698],[8.9277,47.65661],[8.92828,47.67015],[8.95726,47.66973],[8.95774,47.68327],[9.19061,47.67994],[9.19027,47.66645],[9.21922,47.66603],[9.21899,47.65256],[9.24784,47.6521],[9.24747,47.63864],[9.3057,47.63765],[9.30526,47.6242],[9.33417,47.62371],[9.33348,47.59674],[9.39151,47.59577],[9.39114,47.58235],[9.42007,47.58176],[9.4186,47.54139],[9.44754,47.54084],[9.44717,47.5273],[9.47605,47.52681],[9.47519,47.49986],[9.50414,47.49935],[9.5031,47.47242],[9.41596,47.47392],[9.41554,47.46045],[9.3576,47.46141],[9.35818,47.47498],[9.32896,47.47534],[9.32864,47.46188],[9.18361,47.4642],[9.18411,47.47769],[9.15492,47.4781],[9.15466,47.46463],[9.06736,47.46583],[9.06718,47.45234],[9.09609,47.45193],[9.09582,47.43853],[9.06663,47.43883],[9.06642,47.42537],[9.00829,47.4262],[9.00714,47.38573],[8.97811,47.38616],[8.9774,47.35913],[8.9194,47.35989],[8.92032,47.38697],[8.89136,47.38725],[8.89286,47.44117],[8.86398,47.44149],[8.86604,47.52251],[8.80784,47.52317],[8.80894,47.56373],[8.77985,47.56403],[8.78024,47.57751],[8.72209,47.57814],[8.72337,47.63213],[8.6652,47.63273],[8.6658,47.6598],[8.63674,47.66],[8.63768,47.70041]]],terms_text:"Kanton Thurgau OF 2017",best:true,description:"This imagery is provided via a proxy operated by https://sosm.ch/"},{id:"Zug-2011",name:"Kanton Zug 2011",type:"wms",template:"https://services.geo.zg.ch:443/ows/Orthofotos?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=zg.orthofoto_2011_kt_zg&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2011-01-01T00:00:00.000Z",startDate:"2011-01-01T00:00:00.000Z",zoomExtent:[10,21],polygon:[[[8.38726,47.10908],[8.38983,47.25303],[8.42944,47.25265],[8.42894,47.22567],[8.60057,47.22407],[8.60037,47.21507],[8.61357,47.21495],[8.61338,47.20594],[8.62658,47.20582],[8.62618,47.18783],[8.63934,47.18769],[8.63914,47.1787],[8.66555,47.17844],[8.66534,47.16943],[8.7049,47.16899],[8.70427,47.14203],[8.69105,47.14215],[8.69046,47.11516],[8.67731,47.1153],[8.67706,47.10634],[8.66389,47.10647],[8.66371,47.0975],[8.65052,47.09761],[8.65031,47.08863],[8.59764,47.08915],[8.59746,47.08015],[8.49204,47.0812],[8.49245,47.09917],[8.43969,47.09967],[8.43996,47.10863],[8.38726,47.10908]]],terms_text:"GIS Kanton Zug",best:true},{id:"Zug-2018",name:"Kanton Zug Gemeinde Zug Süd 2018",type:"wms",template:"https://services.geo.zg.ch:443/ows/Orthofotos?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=zg.orthofoto_2018_kt_zg&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2018-01-01T00:00:00.000Z",startDate:"2018-01-01T00:00:00.000Z",zoomExtent:[10,21],polygon:[[[8.50052,47.11291],[8.49638,47.11761],[8.49451,47.12364],[8.49538,47.12653],[8.50462,47.13724],[8.50322,47.13933],[8.50466,47.14722],[8.51099,47.15916],[8.56415,47.15299],[8.5652,47.14929],[8.54924,47.13843],[8.55098,47.12132],[8.50052,47.11291]]],terms_text:"GIS Kanton Zug",best:true},{id:"Zug-2016",name:"Kanton Zug Nord 2016",type:"wms",template:"https://services.geo.zg.ch:443/ows/Orthofotos?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=zg.orthofoto_2016_kt_zg&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2016-01-01T00:00:00.000Z",startDate:"2016-01-01T00:00:00.000Z",zoomExtent:[10,21],polygon:[[[8.41093,47.16521],[8.40759,47.16918],[8.40754,47.23725],[8.419,47.23722],[8.42336,47.22958],[8.43891,47.22945],[8.48056,47.2125],[8.5294,47.22688],[8.57951,47.22275],[8.57946,47.17083],[8.57535,47.14926],[8.56428,47.14944],[8.53594,47.15205],[8.50658,47.15268],[8.50686,47.162],[8.44723,47.16256],[8.41093,47.16521]]],terms_text:"GIS Kanton Zug",best:true},{id:"OGDLidarZH-DOM",name:"Kanton Zurich, Oberflächenschummerung 50cm",type:"wms",template:"https://wms.zh.ch/OGDLidarZH?FORMAT=image/jpeg&VERSION=1.3.0&SERVICE=WMS&REQUEST=GetMap&LAYERS=dom2014hillshade&CRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2014-01-01T00:00:00.000Z",startDate:"2014-01-01T00:00:00.000Z",zoomExtent:[8,22],polygon:[[[8.71338,47.21388],[8.7137,47.22737],[8.8117,47.22626],[8.80337,47.23858],[8.80866,47.2431],[8.82448,47.24656],[8.82971,47.24539],[8.83652,47.24257],[8.84568,47.24253],[8.84837,47.24322],[8.85232,47.24034],[8.86206,47.23882],[8.86472,47.23966],[8.86863,47.23968],[8.87339,47.24125],[8.87882,47.24476],[8.88054,47.24791],[8.89878,47.24976],[8.90281,47.25094],[8.91025,47.25003],[8.92735,47.25406],[8.93644,47.25499],[8.94233,47.25849],[8.94423,47.26173],[8.94882,47.26536],[8.95094,47.2686],[8.95068,47.27108],[8.953,47.27285],[8.95411,47.27505],[8.95504,47.28251],[8.95171,47.28527],[8.94664,47.28647],[8.95258,47.28844],[8.95454,47.28982],[8.96141,47.30098],[8.97552,47.30245],[8.98006,47.30416],[8.99153,47.31893],[8.99069,47.32183],[8.98637,47.32542],[8.98548,47.32778],[8.98364,47.32931],[8.98592,47.33815],[8.98464,47.34061],[8.98079,47.34237],[8.98088,47.34835],[8.97785,47.35437],[8.9759,47.35606],[8.97002,47.35843],[8.96572,47.3589],[8.96238,47.36252],[8.95665,47.37432],[8.9521,47.37836],[8.94778,47.37971],[8.95023,47.38346],[8.95018,47.38596],[8.9488,47.38836],[8.9397,47.39403],[8.93637,47.39496],[8.93251,47.39871],[8.92801,47.40148],[8.92278,47.4038],[8.91388,47.40569],[8.91924,47.41213],[8.92049,47.41915],[8.91829,47.42323],[8.92094,47.42544],[8.92107,47.42828],[8.92571,47.42695],[8.93437,47.42796],[8.93877,47.43173],[8.93974,47.43411],[8.93889,47.43725],[8.93511,47.43973],[8.92349,47.43953],[8.91973,47.44081],[8.91322,47.44119],[8.91162,47.44347],[8.91527,47.44628],[8.91499,47.45004],[8.91196,47.45378],[8.90517,47.45791],[8.90183,47.46435],[8.89735,47.46898],[8.89581,47.47219],[8.89135,47.4738],[8.89143,47.47821],[8.90142,47.48133],[8.90428,47.48449],[8.90314,47.48928],[8.90001,47.49187],[8.89967,47.49885],[8.90357,47.50404],[8.90413,47.50745],[8.90322,47.51948],[8.90497,47.52447],[8.90365,47.52691],[8.89982,47.52965],[8.88423,47.53392],[8.87883,47.53277],[8.87061,47.53477],[8.8602,47.53488],[8.85674,47.53594],[8.84782,47.5358],[8.84614,47.54087],[8.8403,47.54654],[8.83728,47.55278],[8.84275,47.5537],[8.84648,47.5562],[8.85269,47.55645],[8.8562,47.55792],[8.85775,47.56141],[8.85728,47.56489],[8.85511,47.56721],[8.85079,47.56818],[8.84763,47.57023],[8.84538,47.57061],[8.8448,47.57309],[8.84211,47.57513],[8.83326,47.57769],[8.82962,47.57778],[8.82661,47.57662],[8.82137,47.57756],[8.81432,47.57598],[8.81234,47.5778],[8.81222,47.58473],[8.81067,47.58639],[8.80812,47.58738],[8.76818,47.59674],[8.7543,47.59729],[8.75529,47.60108],[8.75416,47.60273],[8.74883,47.60588],[8.74829,47.60874],[8.7507,47.60981],[8.75255,47.61292],[8.75575,47.61217],[8.76102,47.61335],[8.78169,47.60634],[8.78165,47.60345],[8.78467,47.59993],[8.80168,47.5966],[8.80512,47.59686],[8.80895,47.59938],[8.81074,47.60981],[8.81866,47.61372],[8.82001,47.61526],[8.82089,47.62058],[8.82015,47.62415],[8.82415,47.6256],[8.83079,47.63206],[8.83448,47.64099],[8.83182,47.64945],[8.82695,47.65206],[8.81168,47.65599],[8.81112,47.6621],[8.81192,47.66454],[8.81041,47.66752],[8.80881,47.66857],[8.80293,47.66978],[8.79299,47.66919],[8.78685,47.66978],[8.78453,47.66899],[8.78216,47.66659],[8.77921,47.65695],[8.77763,47.65563],[8.77398,47.65435],[8.76623,47.65438],[8.76108,47.65257],[8.75852,47.65033],[8.75464,47.64883],[8.7534,47.64733],[8.74839,47.64613],[8.74329,47.64749],[8.73882,47.64651],[8.72376,47.64753],[8.72063,47.64664],[8.71492,47.64885],[8.70826,47.64764],[8.70481,47.65039],[8.70053,47.65199],[8.69427,47.65307],[8.69242,47.65581],[8.68632,47.66094],[8.68485,47.66413],[8.68574,47.66799],[8.68326,47.67315],[8.68056,47.67561],[8.67521,47.6776],[8.67642,47.68177],[8.67561,47.68661],[8.67427,47.68799],[8.67227,47.68891],[8.66273,47.69029],[8.64644,47.69847],[8.63968,47.69877],[8.6355,47.69743],[8.62162,47.69554],[8.61818,47.69279],[8.61744,47.69087],[8.62007,47.68134],[8.61478,47.68308],[8.60917,47.68188],[8.60199,47.67451],[8.59954,47.66923],[8.60275,47.66132],[8.60979,47.6568],[8.6141,47.6564],[8.61574,47.65557],[8.62231,47.65104],[8.62227,47.65024],[8.62048,47.64758],[8.61939,47.65043],[8.61521,47.65452],[8.6093,47.65677],[8.60324,47.65654],[8.60069,47.65541],[8.59788,47.65276],[8.59645,47.64876],[8.59092,47.64623],[8.58937,47.6444],[8.58874,47.63936],[8.59116,47.62755],[8.59325,47.62233],[8.59838,47.61587],[8.59854,47.6145],[8.59114,47.60917],[8.58937,47.60682],[8.58796,47.60319],[8.58788,47.59909],[8.58203,47.59793],[8.57398,47.59329],[8.57146,47.58988],[8.57035,47.58633],[8.57203,47.57985],[8.56771,47.57799],[8.56506,47.57524],[8.56117,47.56407],[8.55707,47.55947],[8.55616,47.56336],[8.55206,47.56904],[8.55334,47.57146],[8.5526,47.57599],[8.55007,47.57806],[8.54666,47.57923],[8.5435,47.58228],[8.54319,47.5851],[8.54888,47.5879],[8.55175,47.58777],[8.55764,47.58963],[8.56114,47.59151],[8.56265,47.5946],[8.56668,47.59565],[8.56902,47.59748],[8.56953,47.60049],[8.57237,47.60386],[8.57308,47.60641],[8.57562,47.60676],[8.579,47.60845],[8.58076,47.61031],[8.58125,47.61203],[8.58025,47.61456],[8.57712,47.61636],[8.57525,47.61957],[8.57277,47.6211],[8.56785,47.62164],[8.56341,47.62697],[8.56105,47.62838],[8.54803,47.62998],[8.54558,47.63122],[8.54498,47.63297],[8.54288,47.63458],[8.53995,47.63565],[8.52769,47.63634],[8.52112,47.63887],[8.51478,47.6385],[8.50932,47.63559],[8.50829,47.62942],[8.50161,47.62597],[8.5007,47.62421],[8.50149,47.62154],[8.49253,47.61893],[8.48884,47.61953],[8.47669,47.61937],[8.47439,47.61838],[8.47154,47.61495],[8.47129,47.61307],[8.46785,47.61272],[8.46446,47.61109],[8.46173,47.60659],[8.45519,47.60676],[8.45061,47.60411],[8.4499,47.60164],[8.4507,47.59584],[8.45382,47.59343],[8.45428,47.5866],[8.4563,47.5848],[8.46014,47.58382],[8.46332,47.58044],[8.46881,47.5795],[8.46219,47.57653],[8.45419,47.57668],[8.43642,47.57154],[8.43161,47.57102],[8.42476,47.57231],[8.41477,47.56879],[8.41304,47.56745],[8.41034,47.56194],[8.41039,47.55972],[8.40789,47.55465],[8.40846,47.55018],[8.39964,47.54444],[8.39609,47.543],[8.39469,47.54094],[8.39495,47.53674],[8.39136,47.53568],[8.38835,47.53305],[8.38525,47.53316],[8.38113,47.53219],[8.3774,47.52969],[8.37518,47.52679],[8.37279,47.51651],[8.36579,47.51663],[8.35666,47.51348],[8.35439,47.51104],[8.35103,47.50314],[8.3524,47.49957],[8.35163,47.4973],[8.35274,47.49484],[8.3545,47.49355],[8.3557,47.48979],[8.35533,47.48525],[8.35698,47.47931],[8.35891,47.47743],[8.36187,47.47645],[8.36722,47.47654],[8.36702,47.47487],[8.36073,47.47222],[8.35903,47.46604],[8.35996,47.46381],[8.36326,47.46204],[8.3673,47.45653],[8.36975,47.45504],[8.37393,47.45472],[8.37754,47.45201],[8.37583,47.45068],[8.37441,47.44614],[8.37623,47.43818],[8.37168,47.43675],[8.36855,47.43406],[8.3681,47.43158],[8.36904,47.42863],[8.37222,47.42603],[8.38283,47.42346],[8.38371,47.42251],[8.38073,47.42207],[8.37555,47.4178],[8.37598,47.41378],[8.37441,47.40906],[8.36067,47.40664],[8.35789,47.40542],[8.35629,47.40377],[8.35661,47.39961],[8.36195,47.39516],[8.36577,47.39429],[8.37601,47.3947],[8.37743,47.39218],[8.38036,47.39048],[8.38761,47.39035],[8.38832,47.38012],[8.39034,47.37527],[8.39355,47.3719],[8.39387,47.36945],[8.39574,47.3671],[8.39902,47.36608],[8.39836,47.36408],[8.40012,47.36094],[8.40103,47.35433],[8.39728,47.34677],[8.39779,47.34475],[8.40186,47.3391],[8.40931,47.33409],[8.4061,47.32975],[8.40578,47.32667],[8.40689,47.32447],[8.41295,47.3205],[8.41611,47.31996],[8.42948,47.32227],[8.43556,47.32083],[8.43437,47.31954],[8.43155,47.31851],[8.42609,47.31375],[8.42276,47.30706],[8.42311,47.30368],[8.41745,47.3015],[8.41372,47.29824],[8.40012,47.29564],[8.39768,47.29392],[8.39518,47.29516],[8.39108,47.29552],[8.38602,47.29437],[8.38272,47.29225],[8.38198,47.29034],[8.38255,47.2881],[8.38508,47.28565],[8.38977,47.27507],[8.39563,47.271],[8.39407,47.26672],[8.39415,47.26361],[8.39756,47.25986],[8.39614,47.25481],[8.39742,47.25189],[8.40647,47.24452],[8.40826,47.24118],[8.40761,47.23957],[8.4096,47.23585],[8.41073,47.22799],[8.41248,47.22433],[8.41695,47.22014],[8.41959,47.21902],[8.42269,47.21886],[8.42977,47.22],[8.43936,47.21937],[8.45,47.21363],[8.4546,47.21334],[8.45625,47.21081],[8.4591,47.20934],[8.46447,47.20928],[8.46609,47.20862],[8.46868,47.20533],[8.47329,47.20398],[8.47693,47.20458],[8.48399,47.20392],[8.49489,47.20738],[8.504,47.20768],[8.51538,47.21152],[8.51753,47.21271],[8.51906,47.21495],[8.5306,47.21306],[8.53307,47.21325],[8.5415,47.21778],[8.54456,47.21707],[8.55407,47.21726],[8.55858,47.21517],[8.56984,47.2139],[8.57491,47.21255],[8.57749,47.20771],[8.58044,47.2064],[8.58408,47.20603],[8.59012,47.20714],[8.58965,47.2046],[8.59074,47.20195],[8.59358,47.1986],[8.59581,47.19753],[8.60168,47.19722],[8.60653,47.1992],[8.60725,47.19885],[8.61097,47.19387],[8.61128,47.19059],[8.61391,47.18838],[8.61522,47.18515],[8.61938,47.18045],[8.61976,47.17918],[8.61721,47.17359],[8.6196,47.1698],[8.62292,47.16821],[8.6339,47.16715],[8.63561,47.16578],[8.63965,47.16459],[8.64287,47.16443],[8.65216,47.16598],[8.65425,47.16552],[8.6549,47.15967],[8.65649,47.15783],[8.65882,47.15658],[8.66853,47.15492],[8.67847,47.15558],[8.68241,47.15759],[8.69361,47.15898],[8.69804,47.16134],[8.69886,47.16303],[8.6977,47.17033],[8.69599,47.17232],[8.68919,47.17566],[8.6872,47.17959],[8.6879,47.18229],[8.69186,47.18485],[8.69824,47.19205],[8.70323,47.19326],[8.70852,47.19602],[8.71423,47.19693],[8.71692,47.19893],[8.74212,47.2071],[8.74218,47.21355],[8.71338,47.21388]]],terms_text:"Geographisches Informationssystem des Kantons Zürich (GIS-ZH), Oberflächenschummerung"},{id:"OGDOrthoZH2016",name:"Kanton Zurich, Orthofoto ZH Frühjahr 2015/16 RGB 10cm",type:"wms",template:"https://wms.zh.ch/OGDOrthoZH?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&LAYERS=ortho_w_15&FORMAT=image/jpeg&CRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2016-01-01T00:00:00.000Z",startDate:"2015-01-01T00:00:00.000Z",zoomExtent:[8,22],polygon:[[[8.71338,47.21388],[8.7137,47.22737],[8.8117,47.22626],[8.80337,47.23858],[8.80866,47.2431],[8.82448,47.24656],[8.82971,47.24539],[8.83652,47.24257],[8.84568,47.24253],[8.84837,47.24322],[8.85232,47.24034],[8.86206,47.23882],[8.86472,47.23966],[8.86863,47.23968],[8.87339,47.24125],[8.87882,47.24476],[8.88054,47.24791],[8.89878,47.24976],[8.90281,47.25094],[8.91025,47.25003],[8.92735,47.25406],[8.93644,47.25499],[8.94233,47.25849],[8.94423,47.26173],[8.94882,47.26536],[8.95094,47.2686],[8.95068,47.27108],[8.953,47.27285],[8.95411,47.27505],[8.95504,47.28251],[8.95171,47.28527],[8.94664,47.28647],[8.95258,47.28844],[8.95454,47.28982],[8.96141,47.30098],[8.97552,47.30245],[8.98006,47.30416],[8.99153,47.31893],[8.99069,47.32183],[8.98637,47.32542],[8.98548,47.32778],[8.98364,47.32931],[8.98592,47.33815],[8.98464,47.34061],[8.98079,47.34237],[8.98088,47.34835],[8.97785,47.35437],[8.9759,47.35606],[8.97002,47.35843],[8.96572,47.3589],[8.96238,47.36252],[8.95665,47.37432],[8.9521,47.37836],[8.94778,47.37971],[8.95023,47.38346],[8.95018,47.38596],[8.9488,47.38836],[8.9397,47.39403],[8.93637,47.39496],[8.93251,47.39871],[8.92801,47.40148],[8.92278,47.4038],[8.91388,47.40569],[8.91924,47.41213],[8.92049,47.41915],[8.91829,47.42323],[8.92094,47.42544],[8.92107,47.42828],[8.92571,47.42695],[8.93437,47.42796],[8.93877,47.43173],[8.93974,47.43411],[8.93889,47.43725],[8.93511,47.43973],[8.92349,47.43953],[8.91973,47.44081],[8.91322,47.44119],[8.91162,47.44347],[8.91527,47.44628],[8.91499,47.45004],[8.91196,47.45378],[8.90517,47.45791],[8.90183,47.46435],[8.89735,47.46898],[8.89581,47.47219],[8.89135,47.4738],[8.89143,47.47821],[8.90142,47.48133],[8.90428,47.48449],[8.90314,47.48928],[8.90001,47.49187],[8.89967,47.49885],[8.90357,47.50404],[8.90413,47.50745],[8.90322,47.51948],[8.90497,47.52447],[8.90365,47.52691],[8.89982,47.52965],[8.88423,47.53392],[8.87883,47.53277],[8.87061,47.53477],[8.8602,47.53488],[8.85674,47.53594],[8.84782,47.5358],[8.84614,47.54087],[8.8403,47.54654],[8.83728,47.55278],[8.84275,47.5537],[8.84648,47.5562],[8.85269,47.55645],[8.8562,47.55792],[8.85775,47.56141],[8.85728,47.56489],[8.85511,47.56721],[8.85079,47.56818],[8.84763,47.57023],[8.84538,47.57061],[8.8448,47.57309],[8.84211,47.57513],[8.83326,47.57769],[8.82962,47.57778],[8.82661,47.57662],[8.82137,47.57756],[8.81432,47.57598],[8.81234,47.5778],[8.81222,47.58473],[8.81067,47.58639],[8.80812,47.58738],[8.76818,47.59674],[8.7543,47.59729],[8.75529,47.60108],[8.75416,47.60273],[8.74883,47.60588],[8.74829,47.60874],[8.7507,47.60981],[8.75255,47.61292],[8.75575,47.61217],[8.76102,47.61335],[8.78169,47.60634],[8.78165,47.60345],[8.78467,47.59993],[8.80168,47.5966],[8.80512,47.59686],[8.80895,47.59938],[8.81074,47.60981],[8.81866,47.61372],[8.82001,47.61526],[8.82089,47.62058],[8.82015,47.62415],[8.82415,47.6256],[8.83079,47.63206],[8.83448,47.64099],[8.83182,47.64945],[8.82695,47.65206],[8.81168,47.65599],[8.81112,47.6621],[8.81192,47.66454],[8.81041,47.66752],[8.80881,47.66857],[8.80293,47.66978],[8.79299,47.66919],[8.78685,47.66978],[8.78453,47.66899],[8.78216,47.66659],[8.77921,47.65695],[8.77763,47.65563],[8.77398,47.65435],[8.76623,47.65438],[8.76108,47.65257],[8.75852,47.65033],[8.75464,47.64883],[8.7534,47.64733],[8.74839,47.64613],[8.74329,47.64749],[8.73882,47.64651],[8.72376,47.64753],[8.72063,47.64664],[8.71492,47.64885],[8.70826,47.64764],[8.70481,47.65039],[8.70053,47.65199],[8.69427,47.65307],[8.69242,47.65581],[8.68632,47.66094],[8.68485,47.66413],[8.68574,47.66799],[8.68326,47.67315],[8.68056,47.67561],[8.67521,47.6776],[8.67642,47.68177],[8.67561,47.68661],[8.67427,47.68799],[8.67227,47.68891],[8.66273,47.69029],[8.64644,47.69847],[8.63968,47.69877],[8.6355,47.69743],[8.62162,47.69554],[8.61818,47.69279],[8.61744,47.69087],[8.62007,47.68134],[8.61478,47.68308],[8.60917,47.68188],[8.60199,47.67451],[8.59954,47.66923],[8.60275,47.66132],[8.60979,47.6568],[8.6141,47.6564],[8.61574,47.65557],[8.62231,47.65104],[8.62227,47.65024],[8.62048,47.64758],[8.61939,47.65043],[8.61521,47.65452],[8.6093,47.65677],[8.60324,47.65654],[8.60069,47.65541],[8.59788,47.65276],[8.59645,47.64876],[8.59092,47.64623],[8.58937,47.6444],[8.58874,47.63936],[8.59116,47.62755],[8.59325,47.62233],[8.59838,47.61587],[8.59854,47.6145],[8.59114,47.60917],[8.58937,47.60682],[8.58796,47.60319],[8.58788,47.59909],[8.58203,47.59793],[8.57398,47.59329],[8.57146,47.58988],[8.57035,47.58633],[8.57203,47.57985],[8.56771,47.57799],[8.56506,47.57524],[8.56117,47.56407],[8.55707,47.55947],[8.55616,47.56336],[8.55206,47.56904],[8.55334,47.57146],[8.5526,47.57599],[8.55007,47.57806],[8.54666,47.57923],[8.5435,47.58228],[8.54319,47.5851],[8.54888,47.5879],[8.55175,47.58777],[8.55764,47.58963],[8.56114,47.59151],[8.56265,47.5946],[8.56668,47.59565],[8.56902,47.59748],[8.56953,47.60049],[8.57237,47.60386],[8.57308,47.60641],[8.57562,47.60676],[8.579,47.60845],[8.58076,47.61031],[8.58125,47.61203],[8.58025,47.61456],[8.57712,47.61636],[8.57525,47.61957],[8.57277,47.6211],[8.56785,47.62164],[8.56341,47.62697],[8.56105,47.62838],[8.54803,47.62998],[8.54558,47.63122],[8.54498,47.63297],[8.54288,47.63458],[8.53995,47.63565],[8.52769,47.63634],[8.52112,47.63887],[8.51478,47.6385],[8.50932,47.63559],[8.50829,47.62942],[8.50161,47.62597],[8.5007,47.62421],[8.50149,47.62154],[8.49253,47.61893],[8.48884,47.61953],[8.47669,47.61937],[8.47439,47.61838],[8.47154,47.61495],[8.47129,47.61307],[8.46785,47.61272],[8.46446,47.61109],[8.46173,47.60659],[8.45519,47.60676],[8.45061,47.60411],[8.4499,47.60164],[8.4507,47.59584],[8.45382,47.59343],[8.45428,47.5866],[8.4563,47.5848],[8.46014,47.58382],[8.46332,47.58044],[8.46881,47.5795],[8.46219,47.57653],[8.45419,47.57668],[8.43642,47.57154],[8.43161,47.57102],[8.42476,47.57231],[8.41477,47.56879],[8.41304,47.56745],[8.41034,47.56194],[8.41039,47.55972],[8.40789,47.55465],[8.40846,47.55018],[8.39964,47.54444],[8.39609,47.543],[8.39469,47.54094],[8.39495,47.53674],[8.39136,47.53568],[8.38835,47.53305],[8.38525,47.53316],[8.38113,47.53219],[8.3774,47.52969],[8.37518,47.52679],[8.37279,47.51651],[8.36579,47.51663],[8.35666,47.51348],[8.35439,47.51104],[8.35103,47.50314],[8.3524,47.49957],[8.35163,47.4973],[8.35274,47.49484],[8.3545,47.49355],[8.3557,47.48979],[8.35533,47.48525],[8.35698,47.47931],[8.35891,47.47743],[8.36187,47.47645],[8.36722,47.47654],[8.36702,47.47487],[8.36073,47.47222],[8.35903,47.46604],[8.35996,47.46381],[8.36326,47.46204],[8.3673,47.45653],[8.36975,47.45504],[8.37393,47.45472],[8.37754,47.45201],[8.37583,47.45068],[8.37441,47.44614],[8.37623,47.43818],[8.37168,47.43675],[8.36855,47.43406],[8.3681,47.43158],[8.36904,47.42863],[8.37222,47.42603],[8.38283,47.42346],[8.38371,47.42251],[8.38073,47.42207],[8.37555,47.4178],[8.37598,47.41378],[8.37441,47.40906],[8.36067,47.40664],[8.35789,47.40542],[8.35629,47.40377],[8.35661,47.39961],[8.36195,47.39516],[8.36577,47.39429],[8.37601,47.3947],[8.37743,47.39218],[8.38036,47.39048],[8.38761,47.39035],[8.38832,47.38012],[8.39034,47.37527],[8.39355,47.3719],[8.39387,47.36945],[8.39574,47.3671],[8.39902,47.36608],[8.39836,47.36408],[8.40012,47.36094],[8.40103,47.35433],[8.39728,47.34677],[8.39779,47.34475],[8.40186,47.3391],[8.40931,47.33409],[8.4061,47.32975],[8.40578,47.32667],[8.40689,47.32447],[8.41295,47.3205],[8.41611,47.31996],[8.42948,47.32227],[8.43556,47.32083],[8.43437,47.31954],[8.43155,47.31851],[8.42609,47.31375],[8.42276,47.30706],[8.42311,47.30368],[8.41745,47.3015],[8.41372,47.29824],[8.40012,47.29564],[8.39768,47.29392],[8.39518,47.29516],[8.39108,47.29552],[8.38602,47.29437],[8.38272,47.29225],[8.38198,47.29034],[8.38255,47.2881],[8.38508,47.28565],[8.38977,47.27507],[8.39563,47.271],[8.39407,47.26672],[8.39415,47.26361],[8.39756,47.25986],[8.39614,47.25481],[8.39742,47.25189],[8.40647,47.24452],[8.40826,47.24118],[8.40761,47.23957],[8.4096,47.23585],[8.41073,47.22799],[8.41248,47.22433],[8.41695,47.22014],[8.41959,47.21902],[8.42269,47.21886],[8.42977,47.22],[8.43936,47.21937],[8.45,47.21363],[8.4546,47.21334],[8.45625,47.21081],[8.4591,47.20934],[8.46447,47.20928],[8.46609,47.20862],[8.46868,47.20533],[8.47329,47.20398],[8.47693,47.20458],[8.48399,47.20392],[8.49489,47.20738],[8.504,47.20768],[8.51538,47.21152],[8.51753,47.21271],[8.51906,47.21495],[8.5306,47.21306],[8.53307,47.21325],[8.5415,47.21778],[8.54456,47.21707],[8.55407,47.21726],[8.55858,47.21517],[8.56984,47.2139],[8.57491,47.21255],[8.57749,47.20771],[8.58044,47.2064],[8.58408,47.20603],[8.59012,47.20714],[8.58965,47.2046],[8.59074,47.20195],[8.59358,47.1986],[8.59581,47.19753],[8.60168,47.19722],[8.60653,47.1992],[8.60725,47.19885],[8.61097,47.19387],[8.61128,47.19059],[8.61391,47.18838],[8.61522,47.18515],[8.61938,47.18045],[8.61976,47.17918],[8.61721,47.17359],[8.6196,47.1698],[8.62292,47.16821],[8.6339,47.16715],[8.63561,47.16578],[8.63965,47.16459],[8.64287,47.16443],[8.65216,47.16598],[8.65425,47.16552],[8.6549,47.15967],[8.65649,47.15783],[8.65882,47.15658],[8.66853,47.15492],[8.67847,47.15558],[8.68241,47.15759],[8.69361,47.15898],[8.69804,47.16134],[8.69886,47.16303],[8.6977,47.17033],[8.69599,47.17232],[8.68919,47.17566],[8.6872,47.17959],[8.6879,47.18229],[8.69186,47.18485],[8.69824,47.19205],[8.70323,47.19326],[8.70852,47.19602],[8.71423,47.19693],[8.71692,47.19893],[8.74212,47.2071],[8.74218,47.21355],[8.71338,47.21388]]],terms_text:"Geographisches Informationssystem des Kantons Zürich (GIS-ZH), Orthofoto ZH Frühjahr 2015/16 RGB"},{id:"OGDOrthoZH2015",name:"Kanton Zurich, Orthofoto ZH Sommer 2014/15 RGB 10cm",type:"wms",template:"https://wms.zh.ch/OGDOrthoZH?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&LAYERS=ortho_s_14&FORMAT=image/jpeg&CRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2015-01-01T00:00:00.000Z",startDate:"2014-01-01T00:00:00.000Z",zoomExtent:[8,22],polygon:[[[8.71338,47.21388],[8.7137,47.22737],[8.8117,47.22626],[8.80337,47.23858],[8.80866,47.2431],[8.82448,47.24656],[8.82971,47.24539],[8.83652,47.24257],[8.84568,47.24253],[8.84837,47.24322],[8.85232,47.24034],[8.86206,47.23882],[8.86472,47.23966],[8.86863,47.23968],[8.87339,47.24125],[8.87882,47.24476],[8.88054,47.24791],[8.89878,47.24976],[8.90281,47.25094],[8.91025,47.25003],[8.92735,47.25406],[8.93644,47.25499],[8.94233,47.25849],[8.94423,47.26173],[8.94882,47.26536],[8.95094,47.2686],[8.95068,47.27108],[8.953,47.27285],[8.95411,47.27505],[8.95504,47.28251],[8.95171,47.28527],[8.94664,47.28647],[8.95258,47.28844],[8.95454,47.28982],[8.96141,47.30098],[8.97552,47.30245],[8.98006,47.30416],[8.99153,47.31893],[8.99069,47.32183],[8.98637,47.32542],[8.98548,47.32778],[8.98364,47.32931],[8.98592,47.33815],[8.98464,47.34061],[8.98079,47.34237],[8.98088,47.34835],[8.97785,47.35437],[8.9759,47.35606],[8.97002,47.35843],[8.96572,47.3589],[8.96238,47.36252],[8.95665,47.37432],[8.9521,47.37836],[8.94778,47.37971],[8.95023,47.38346],[8.95018,47.38596],[8.9488,47.38836],[8.9397,47.39403],[8.93637,47.39496],[8.93251,47.39871],[8.92801,47.40148],[8.92278,47.4038],[8.91388,47.40569],[8.91924,47.41213],[8.92049,47.41915],[8.91829,47.42323],[8.92094,47.42544],[8.92107,47.42828],[8.92571,47.42695],[8.93437,47.42796],[8.93877,47.43173],[8.93974,47.43411],[8.93889,47.43725],[8.93511,47.43973],[8.92349,47.43953],[8.91973,47.44081],[8.91322,47.44119],[8.91162,47.44347],[8.91527,47.44628],[8.91499,47.45004],[8.91196,47.45378],[8.90517,47.45791],[8.90183,47.46435],[8.89735,47.46898],[8.89581,47.47219],[8.89135,47.4738],[8.89143,47.47821],[8.90142,47.48133],[8.90428,47.48449],[8.90314,47.48928],[8.90001,47.49187],[8.89967,47.49885],[8.90357,47.50404],[8.90413,47.50745],[8.90322,47.51948],[8.90497,47.52447],[8.90365,47.52691],[8.89982,47.52965],[8.88423,47.53392],[8.87883,47.53277],[8.87061,47.53477],[8.8602,47.53488],[8.85674,47.53594],[8.84782,47.5358],[8.84614,47.54087],[8.8403,47.54654],[8.83728,47.55278],[8.84275,47.5537],[8.84648,47.5562],[8.85269,47.55645],[8.8562,47.55792],[8.85775,47.56141],[8.85728,47.56489],[8.85511,47.56721],[8.85079,47.56818],[8.84763,47.57023],[8.84538,47.57061],[8.8448,47.57309],[8.84211,47.57513],[8.83326,47.57769],[8.82962,47.57778],[8.82661,47.57662],[8.82137,47.57756],[8.81432,47.57598],[8.81234,47.5778],[8.81222,47.58473],[8.81067,47.58639],[8.80812,47.58738],[8.76818,47.59674],[8.7543,47.59729],[8.75529,47.60108],[8.75416,47.60273],[8.74883,47.60588],[8.74829,47.60874],[8.7507,47.60981],[8.75255,47.61292],[8.75575,47.61217],[8.76102,47.61335],[8.78169,47.60634],[8.78165,47.60345],[8.78467,47.59993],[8.80168,47.5966],[8.80512,47.59686],[8.80895,47.59938],[8.81074,47.60981],[8.81866,47.61372],[8.82001,47.61526],[8.82089,47.62058],[8.82015,47.62415],[8.82415,47.6256],[8.83079,47.63206],[8.83448,47.64099],[8.83182,47.64945],[8.82695,47.65206],[8.81168,47.65599],[8.81112,47.6621],[8.81192,47.66454],[8.81041,47.66752],[8.80881,47.66857],[8.80293,47.66978],[8.79299,47.66919],[8.78685,47.66978],[8.78453,47.66899],[8.78216,47.66659],[8.77921,47.65695],[8.77763,47.65563],[8.77398,47.65435],[8.76623,47.65438],[8.76108,47.65257],[8.75852,47.65033],[8.75464,47.64883],[8.7534,47.64733],[8.74839,47.64613],[8.74329,47.64749],[8.73882,47.64651],[8.72376,47.64753],[8.72063,47.64664],[8.71492,47.64885],[8.70826,47.64764],[8.70481,47.65039],[8.70053,47.65199],[8.69427,47.65307],[8.69242,47.65581],[8.68632,47.66094],[8.68485,47.66413],[8.68574,47.66799],[8.68326,47.67315],[8.68056,47.67561],[8.67521,47.6776],[8.67642,47.68177],[8.67561,47.68661],[8.67427,47.68799],[8.67227,47.68891],[8.66273,47.69029],[8.64644,47.69847],[8.63968,47.69877],[8.6355,47.69743],[8.62162,47.69554],[8.61818,47.69279],[8.61744,47.69087],[8.62007,47.68134],[8.61478,47.68308],[8.60917,47.68188],[8.60199,47.67451],[8.59954,47.66923],[8.60275,47.66132],[8.60979,47.6568],[8.6141,47.6564],[8.61574,47.65557],[8.62231,47.65104],[8.62227,47.65024],[8.62048,47.64758],[8.61939,47.65043],[8.61521,47.65452],[8.6093,47.65677],[8.60324,47.65654],[8.60069,47.65541],[8.59788,47.65276],[8.59645,47.64876],[8.59092,47.64623],[8.58937,47.6444],[8.58874,47.63936],[8.59116,47.62755],[8.59325,47.62233],[8.59838,47.61587],[8.59854,47.6145],[8.59114,47.60917],[8.58937,47.60682],[8.58796,47.60319],[8.58788,47.59909],[8.58203,47.59793],[8.57398,47.59329],[8.57146,47.58988],[8.57035,47.58633],[8.57203,47.57985],[8.56771,47.57799],[8.56506,47.57524],[8.56117,47.56407],[8.55707,47.55947],[8.55616,47.56336],[8.55206,47.56904],[8.55334,47.57146],[8.5526,47.57599],[8.55007,47.57806],[8.54666,47.57923],[8.5435,47.58228],[8.54319,47.5851],[8.54888,47.5879],[8.55175,47.58777],[8.55764,47.58963],[8.56114,47.59151],[8.56265,47.5946],[8.56668,47.59565],[8.56902,47.59748],[8.56953,47.60049],[8.57237,47.60386],[8.57308,47.60641],[8.57562,47.60676],[8.579,47.60845],[8.58076,47.61031],[8.58125,47.61203],[8.58025,47.61456],[8.57712,47.61636],[8.57525,47.61957],[8.57277,47.6211],[8.56785,47.62164],[8.56341,47.62697],[8.56105,47.62838],[8.54803,47.62998],[8.54558,47.63122],[8.54498,47.63297],[8.54288,47.63458],[8.53995,47.63565],[8.52769,47.63634],[8.52112,47.63887],[8.51478,47.6385],[8.50932,47.63559],[8.50829,47.62942],[8.50161,47.62597],[8.5007,47.62421],[8.50149,47.62154],[8.49253,47.61893],[8.48884,47.61953],[8.47669,47.61937],[8.47439,47.61838],[8.47154,47.61495],[8.47129,47.61307],[8.46785,47.61272],[8.46446,47.61109],[8.46173,47.60659],[8.45519,47.60676],[8.45061,47.60411],[8.4499,47.60164],[8.4507,47.59584],[8.45382,47.59343],[8.45428,47.5866],[8.4563,47.5848],[8.46014,47.58382],[8.46332,47.58044],[8.46881,47.5795],[8.46219,47.57653],[8.45419,47.57668],[8.43642,47.57154],[8.43161,47.57102],[8.42476,47.57231],[8.41477,47.56879],[8.41304,47.56745],[8.41034,47.56194],[8.41039,47.55972],[8.40789,47.55465],[8.40846,47.55018],[8.39964,47.54444],[8.39609,47.543],[8.39469,47.54094],[8.39495,47.53674],[8.39136,47.53568],[8.38835,47.53305],[8.38525,47.53316],[8.38113,47.53219],[8.3774,47.52969],[8.37518,47.52679],[8.37279,47.51651],[8.36579,47.51663],[8.35666,47.51348],[8.35439,47.51104],[8.35103,47.50314],[8.3524,47.49957],[8.35163,47.4973],[8.35274,47.49484],[8.3545,47.49355],[8.3557,47.48979],[8.35533,47.48525],[8.35698,47.47931],[8.35891,47.47743],[8.36187,47.47645],[8.36722,47.47654],[8.36702,47.47487],[8.36073,47.47222],[8.35903,47.46604],[8.35996,47.46381],[8.36326,47.46204],[8.3673,47.45653],[8.36975,47.45504],[8.37393,47.45472],[8.37754,47.45201],[8.37583,47.45068],[8.37441,47.44614],[8.37623,47.43818],[8.37168,47.43675],[8.36855,47.43406],[8.3681,47.43158],[8.36904,47.42863],[8.37222,47.42603],[8.38283,47.42346],[8.38371,47.42251],[8.38073,47.42207],[8.37555,47.4178],[8.37598,47.41378],[8.37441,47.40906],[8.36067,47.40664],[8.35789,47.40542],[8.35629,47.40377],[8.35661,47.39961],[8.36195,47.39516],[8.36577,47.39429],[8.37601,47.3947],[8.37743,47.39218],[8.38036,47.39048],[8.38761,47.39035],[8.38832,47.38012],[8.39034,47.37527],[8.39355,47.3719],[8.39387,47.36945],[8.39574,47.3671],[8.39902,47.36608],[8.39836,47.36408],[8.40012,47.36094],[8.40103,47.35433],[8.39728,47.34677],[8.39779,47.34475],[8.40186,47.3391],[8.40931,47.33409],[8.4061,47.32975],[8.40578,47.32667],[8.40689,47.32447],[8.41295,47.3205],[8.41611,47.31996],[8.42948,47.32227],[8.43556,47.32083],[8.43437,47.31954],[8.43155,47.31851],[8.42609,47.31375],[8.42276,47.30706],[8.42311,47.30368],[8.41745,47.3015],[8.41372,47.29824],[8.40012,47.29564],[8.39768,47.29392],[8.39518,47.29516],[8.39108,47.29552],[8.38602,47.29437],[8.38272,47.29225],[8.38198,47.29034],[8.38255,47.2881],[8.38508,47.28565],[8.38977,47.27507],[8.39563,47.271],[8.39407,47.26672],[8.39415,47.26361],[8.39756,47.25986],[8.39614,47.25481],[8.39742,47.25189],[8.40647,47.24452],[8.40826,47.24118],[8.40761,47.23957],[8.4096,47.23585],[8.41073,47.22799],[8.41248,47.22433],[8.41695,47.22014],[8.41959,47.21902],[8.42269,47.21886],[8.42977,47.22],[8.43936,47.21937],[8.45,47.21363],[8.4546,47.21334],[8.45625,47.21081],[8.4591,47.20934],[8.46447,47.20928],[8.46609,47.20862],[8.46868,47.20533],[8.47329,47.20398],[8.47693,47.20458],[8.48399,47.20392],[8.49489,47.20738],[8.504,47.20768],[8.51538,47.21152],[8.51753,47.21271],[8.51906,47.21495],[8.5306,47.21306],[8.53307,47.21325],[8.5415,47.21778],[8.54456,47.21707],[8.55407,47.21726],[8.55858,47.21517],[8.56984,47.2139],[8.57491,47.21255],[8.57749,47.20771],[8.58044,47.2064],[8.58408,47.20603],[8.59012,47.20714],[8.58965,47.2046],[8.59074,47.20195],[8.59358,47.1986],[8.59581,47.19753],[8.60168,47.19722],[8.60653,47.1992],[8.60725,47.19885],[8.61097,47.19387],[8.61128,47.19059],[8.61391,47.18838],[8.61522,47.18515],[8.61938,47.18045],[8.61976,47.17918],[8.61721,47.17359],[8.6196,47.1698],[8.62292,47.16821],[8.6339,47.16715],[8.63561,47.16578],[8.63965,47.16459],[8.64287,47.16443],[8.65216,47.16598],[8.65425,47.16552],[8.6549,47.15967],[8.65649,47.15783],[8.65882,47.15658],[8.66853,47.15492],[8.67847,47.15558],[8.68241,47.15759],[8.69361,47.15898],[8.69804,47.16134],[8.69886,47.16303],[8.6977,47.17033],[8.69599,47.17232],[8.68919,47.17566],[8.6872,47.17959],[8.6879,47.18229],[8.69186,47.18485],[8.69824,47.19205],[8.70323,47.19326],[8.70852,47.19602],[8.71423,47.19693],[8.71692,47.19893],[8.74212,47.2071],[8.74218,47.21355],[8.71338,47.21388]]],terms_text:"Geographisches Informationssystem des Kantons Zürich (GIS-ZH), Orthofoto ZH Sommer 2014/15 RGB"},{id:"OGDOrthoZH2018",name:"Kanton Zurich, Orthofoto ZH Sommer 2018 RGB 10cm",type:"wms",template:"https://wms.zh.ch/OGDOrthoZH?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&LAYERS=ortho&FORMAT=image/jpeg&CRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2018-01-01T00:00:00.000Z",startDate:"2018-01-01T00:00:00.000Z",zoomExtent:[8,22],polygon:[[[8.71338,47.21388],[8.7137,47.22737],[8.8117,47.22626],[8.80337,47.23858],[8.80866,47.2431],[8.82448,47.24656],[8.82971,47.24539],[8.83652,47.24257],[8.84568,47.24253],[8.84837,47.24322],[8.85232,47.24034],[8.86206,47.23882],[8.86472,47.23966],[8.86863,47.23968],[8.87339,47.24125],[8.87882,47.24476],[8.88054,47.24791],[8.89878,47.24976],[8.90281,47.25094],[8.91025,47.25003],[8.92735,47.25406],[8.93644,47.25499],[8.94233,47.25849],[8.94423,47.26173],[8.94882,47.26536],[8.95094,47.2686],[8.95068,47.27108],[8.953,47.27285],[8.95411,47.27505],[8.95504,47.28251],[8.95171,47.28527],[8.94664,47.28647],[8.95258,47.28844],[8.95454,47.28982],[8.96141,47.30098],[8.97552,47.30245],[8.98006,47.30416],[8.99153,47.31893],[8.99069,47.32183],[8.98637,47.32542],[8.98548,47.32778],[8.98364,47.32931],[8.98592,47.33815],[8.98464,47.34061],[8.98079,47.34237],[8.98088,47.34835],[8.97785,47.35437],[8.9759,47.35606],[8.97002,47.35843],[8.96572,47.3589],[8.96238,47.36252],[8.95665,47.37432],[8.9521,47.37836],[8.94778,47.37971],[8.95023,47.38346],[8.95018,47.38596],[8.9488,47.38836],[8.9397,47.39403],[8.93637,47.39496],[8.93251,47.39871],[8.92801,47.40148],[8.92278,47.4038],[8.91388,47.40569],[8.91924,47.41213],[8.92049,47.41915],[8.91829,47.42323],[8.92094,47.42544],[8.92107,47.42828],[8.92571,47.42695],[8.93437,47.42796],[8.93877,47.43173],[8.93974,47.43411],[8.93889,47.43725],[8.93511,47.43973],[8.92349,47.43953],[8.91973,47.44081],[8.91322,47.44119],[8.91162,47.44347],[8.91527,47.44628],[8.91499,47.45004],[8.91196,47.45378],[8.90517,47.45791],[8.90183,47.46435],[8.89735,47.46898],[8.89581,47.47219],[8.89135,47.4738],[8.89143,47.47821],[8.90142,47.48133],[8.90428,47.48449],[8.90314,47.48928],[8.90001,47.49187],[8.89967,47.49885],[8.90357,47.50404],[8.90413,47.50745],[8.90322,47.51948],[8.90497,47.52447],[8.90365,47.52691],[8.89982,47.52965],[8.88423,47.53392],[8.87883,47.53277],[8.87061,47.53477],[8.8602,47.53488],[8.85674,47.53594],[8.84782,47.5358],[8.84614,47.54087],[8.8403,47.54654],[8.83728,47.55278],[8.84275,47.5537],[8.84648,47.5562],[8.85269,47.55645],[8.8562,47.55792],[8.85775,47.56141],[8.85728,47.56489],[8.85511,47.56721],[8.85079,47.56818],[8.84763,47.57023],[8.84538,47.57061],[8.8448,47.57309],[8.84211,47.57513],[8.83326,47.57769],[8.82962,47.57778],[8.82661,47.57662],[8.82137,47.57756],[8.81432,47.57598],[8.81234,47.5778],[8.81222,47.58473],[8.81067,47.58639],[8.80812,47.58738],[8.76818,47.59674],[8.7543,47.59729],[8.75529,47.60108],[8.75416,47.60273],[8.74883,47.60588],[8.74829,47.60874],[8.7507,47.60981],[8.75255,47.61292],[8.75575,47.61217],[8.76102,47.61335],[8.78169,47.60634],[8.78165,47.60345],[8.78467,47.59993],[8.80168,47.5966],[8.80512,47.59686],[8.80895,47.59938],[8.81074,47.60981],[8.81866,47.61372],[8.82001,47.61526],[8.82089,47.62058],[8.82015,47.62415],[8.82415,47.6256],[8.83079,47.63206],[8.83448,47.64099],[8.83182,47.64945],[8.82695,47.65206],[8.81168,47.65599],[8.81112,47.6621],[8.81192,47.66454],[8.81041,47.66752],[8.80881,47.66857],[8.80293,47.66978],[8.79299,47.66919],[8.78685,47.66978],[8.78453,47.66899],[8.78216,47.66659],[8.77921,47.65695],[8.77763,47.65563],[8.77398,47.65435],[8.76623,47.65438],[8.76108,47.65257],[8.75852,47.65033],[8.75464,47.64883],[8.7534,47.64733],[8.74839,47.64613],[8.74329,47.64749],[8.73882,47.64651],[8.72376,47.64753],[8.72063,47.64664],[8.71492,47.64885],[8.70826,47.64764],[8.70481,47.65039],[8.70053,47.65199],[8.69427,47.65307],[8.69242,47.65581],[8.68632,47.66094],[8.68485,47.66413],[8.68574,47.66799],[8.68326,47.67315],[8.68056,47.67561],[8.67521,47.6776],[8.67642,47.68177],[8.67561,47.68661],[8.67427,47.68799],[8.67227,47.68891],[8.66273,47.69029],[8.64644,47.69847],[8.63968,47.69877],[8.6355,47.69743],[8.62162,47.69554],[8.61818,47.69279],[8.61744,47.69087],[8.62007,47.68134],[8.61478,47.68308],[8.60917,47.68188],[8.60199,47.67451],[8.59954,47.66923],[8.60275,47.66132],[8.60979,47.6568],[8.6141,47.6564],[8.61574,47.65557],[8.62231,47.65104],[8.62227,47.65024],[8.62048,47.64758],[8.61939,47.65043],[8.61521,47.65452],[8.6093,47.65677],[8.60324,47.65654],[8.60069,47.65541],[8.59788,47.65276],[8.59645,47.64876],[8.59092,47.64623],[8.58937,47.6444],[8.58874,47.63936],[8.59116,47.62755],[8.59325,47.62233],[8.59838,47.61587],[8.59854,47.6145],[8.59114,47.60917],[8.58937,47.60682],[8.58796,47.60319],[8.58788,47.59909],[8.58203,47.59793],[8.57398,47.59329],[8.57146,47.58988],[8.57035,47.58633],[8.57203,47.57985],[8.56771,47.57799],[8.56506,47.57524],[8.56117,47.56407],[8.55707,47.55947],[8.55616,47.56336],[8.55206,47.56904],[8.55334,47.57146],[8.5526,47.57599],[8.55007,47.57806],[8.54666,47.57923],[8.5435,47.58228],[8.54319,47.5851],[8.54888,47.5879],[8.55175,47.58777],[8.55764,47.58963],[8.56114,47.59151],[8.56265,47.5946],[8.56668,47.59565],[8.56902,47.59748],[8.56953,47.60049],[8.57237,47.60386],[8.57308,47.60641],[8.57562,47.60676],[8.579,47.60845],[8.58076,47.61031],[8.58125,47.61203],[8.58025,47.61456],[8.57712,47.61636],[8.57525,47.61957],[8.57277,47.6211],[8.56785,47.62164],[8.56341,47.62697],[8.56105,47.62838],[8.54803,47.62998],[8.54558,47.63122],[8.54498,47.63297],[8.54288,47.63458],[8.53995,47.63565],[8.52769,47.63634],[8.52112,47.63887],[8.51478,47.6385],[8.50932,47.63559],[8.50829,47.62942],[8.50161,47.62597],[8.5007,47.62421],[8.50149,47.62154],[8.49253,47.61893],[8.48884,47.61953],[8.47669,47.61937],[8.47439,47.61838],[8.47154,47.61495],[8.47129,47.61307],[8.46785,47.61272],[8.46446,47.61109],[8.46173,47.60659],[8.45519,47.60676],[8.45061,47.60411],[8.4499,47.60164],[8.4507,47.59584],[8.45382,47.59343],[8.45428,47.5866],[8.4563,47.5848],[8.46014,47.58382],[8.46332,47.58044],[8.46881,47.5795],[8.46219,47.57653],[8.45419,47.57668],[8.43642,47.57154],[8.43161,47.57102],[8.42476,47.57231],[8.41477,47.56879],[8.41304,47.56745],[8.41034,47.56194],[8.41039,47.55972],[8.40789,47.55465],[8.40846,47.55018],[8.39964,47.54444],[8.39609,47.543],[8.39469,47.54094],[8.39495,47.53674],[8.39136,47.53568],[8.38835,47.53305],[8.38525,47.53316],[8.38113,47.53219],[8.3774,47.52969],[8.37518,47.52679],[8.37279,47.51651],[8.36579,47.51663],[8.35666,47.51348],[8.35439,47.51104],[8.35103,47.50314],[8.3524,47.49957],[8.35163,47.4973],[8.35274,47.49484],[8.3545,47.49355],[8.3557,47.48979],[8.35533,47.48525],[8.35698,47.47931],[8.35891,47.47743],[8.36187,47.47645],[8.36722,47.47654],[8.36702,47.47487],[8.36073,47.47222],[8.35903,47.46604],[8.35996,47.46381],[8.36326,47.46204],[8.3673,47.45653],[8.36975,47.45504],[8.37393,47.45472],[8.37754,47.45201],[8.37583,47.45068],[8.37441,47.44614],[8.37623,47.43818],[8.37168,47.43675],[8.36855,47.43406],[8.3681,47.43158],[8.36904,47.42863],[8.37222,47.42603],[8.38283,47.42346],[8.38371,47.42251],[8.38073,47.42207],[8.37555,47.4178],[8.37598,47.41378],[8.37441,47.40906],[8.36067,47.40664],[8.35789,47.40542],[8.35629,47.40377],[8.35661,47.39961],[8.36195,47.39516],[8.36577,47.39429],[8.37601,47.3947],[8.37743,47.39218],[8.38036,47.39048],[8.38761,47.39035],[8.38832,47.38012],[8.39034,47.37527],[8.39355,47.3719],[8.39387,47.36945],[8.39574,47.3671],[8.39902,47.36608],[8.39836,47.36408],[8.40012,47.36094],[8.40103,47.35433],[8.39728,47.34677],[8.39779,47.34475],[8.40186,47.3391],[8.40931,47.33409],[8.4061,47.32975],[8.40578,47.32667],[8.40689,47.32447],[8.41295,47.3205],[8.41611,47.31996],[8.42948,47.32227],[8.43556,47.32083],[8.43437,47.31954],[8.43155,47.31851],[8.42609,47.31375],[8.42276,47.30706],[8.42311,47.30368],[8.41745,47.3015],[8.41372,47.29824],[8.40012,47.29564],[8.39768,47.29392],[8.39518,47.29516],[8.39108,47.29552],[8.38602,47.29437],[8.38272,47.29225],[8.38198,47.29034],[8.38255,47.2881],[8.38508,47.28565],[8.38977,47.27507],[8.39563,47.271],[8.39407,47.26672],[8.39415,47.26361],[8.39756,47.25986],[8.39614,47.25481],[8.39742,47.25189],[8.40647,47.24452],[8.40826,47.24118],[8.40761,47.23957],[8.4096,47.23585],[8.41073,47.22799],[8.41248,47.22433],[8.41695,47.22014],[8.41959,47.21902],[8.42269,47.21886],[8.42977,47.22],[8.43936,47.21937],[8.45,47.21363],[8.4546,47.21334],[8.45625,47.21081],[8.4591,47.20934],[8.46447,47.20928],[8.46609,47.20862],[8.46868,47.20533],[8.47329,47.20398],[8.47693,47.20458],[8.48399,47.20392],[8.49489,47.20738],[8.504,47.20768],[8.51538,47.21152],[8.51753,47.21271],[8.51906,47.21495],[8.5306,47.21306],[8.53307,47.21325],[8.5415,47.21778],[8.54456,47.21707],[8.55407,47.21726],[8.55858,47.21517],[8.56984,47.2139],[8.57491,47.21255],[8.57749,47.20771],[8.58044,47.2064],[8.58408,47.20603],[8.59012,47.20714],[8.58965,47.2046],[8.59074,47.20195],[8.59358,47.1986],[8.59581,47.19753],[8.60168,47.19722],[8.60653,47.1992],[8.60725,47.19885],[8.61097,47.19387],[8.61128,47.19059],[8.61391,47.18838],[8.61522,47.18515],[8.61938,47.18045],[8.61976,47.17918],[8.61721,47.17359],[8.6196,47.1698],[8.62292,47.16821],[8.6339,47.16715],[8.63561,47.16578],[8.63965,47.16459],[8.64287,47.16443],[8.65216,47.16598],[8.65425,47.16552],[8.6549,47.15967],[8.65649,47.15783],[8.65882,47.15658],[8.66853,47.15492],[8.67847,47.15558],[8.68241,47.15759],[8.69361,47.15898],[8.69804,47.16134],[8.69886,47.16303],[8.6977,47.17033],[8.69599,47.17232],[8.68919,47.17566],[8.6872,47.17959],[8.6879,47.18229],[8.69186,47.18485],[8.69824,47.19205],[8.70323,47.19326],[8.70852,47.19602],[8.71423,47.19693],[8.71692,47.19893],[8.74212,47.2071],[8.74218,47.21355],[8.71338,47.21388]]],terms_text:"Geographisches Informationssystem des Kantons Zürich (GIS-ZH), Orthofoto ZH Sommer 2018 RGB",best:true},{id:"OGDLidarZH-DTM",name:"Kanton Zurich, Terrainschummerung 50cm",type:"wms",template:"https://wms.zh.ch/OGDLidarZH?FORMAT=image/jpeg&VERSION=1.3.0&SERVICE=WMS&REQUEST=GetMap&LAYERS=dtm2014hillshade&CRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2014-01-01T00:00:00.000Z",startDate:"2014-01-01T00:00:00.000Z",zoomExtent:[8,22],polygon:[[[8.71338,47.21388],[8.7137,47.22737],[8.8117,47.22626],[8.80337,47.23858],[8.80866,47.2431],[8.82448,47.24656],[8.82971,47.24539],[8.83652,47.24257],[8.84568,47.24253],[8.84837,47.24322],[8.85232,47.24034],[8.86206,47.23882],[8.86472,47.23966],[8.86863,47.23968],[8.87339,47.24125],[8.87882,47.24476],[8.88054,47.24791],[8.89878,47.24976],[8.90281,47.25094],[8.91025,47.25003],[8.92735,47.25406],[8.93644,47.25499],[8.94233,47.25849],[8.94423,47.26173],[8.94882,47.26536],[8.95094,47.2686],[8.95068,47.27108],[8.953,47.27285],[8.95411,47.27505],[8.95504,47.28251],[8.95171,47.28527],[8.94664,47.28647],[8.95258,47.28844],[8.95454,47.28982],[8.96141,47.30098],[8.97552,47.30245],[8.98006,47.30416],[8.99153,47.31893],[8.99069,47.32183],[8.98637,47.32542],[8.98548,47.32778],[8.98364,47.32931],[8.98592,47.33815],[8.98464,47.34061],[8.98079,47.34237],[8.98088,47.34835],[8.97785,47.35437],[8.9759,47.35606],[8.97002,47.35843],[8.96572,47.3589],[8.96238,47.36252],[8.95665,47.37432],[8.9521,47.37836],[8.94778,47.37971],[8.95023,47.38346],[8.95018,47.38596],[8.9488,47.38836],[8.9397,47.39403],[8.93637,47.39496],[8.93251,47.39871],[8.92801,47.40148],[8.92278,47.4038],[8.91388,47.40569],[8.91924,47.41213],[8.92049,47.41915],[8.91829,47.42323],[8.92094,47.42544],[8.92107,47.42828],[8.92571,47.42695],[8.93437,47.42796],[8.93877,47.43173],[8.93974,47.43411],[8.93889,47.43725],[8.93511,47.43973],[8.92349,47.43953],[8.91973,47.44081],[8.91322,47.44119],[8.91162,47.44347],[8.91527,47.44628],[8.91499,47.45004],[8.91196,47.45378],[8.90517,47.45791],[8.90183,47.46435],[8.89735,47.46898],[8.89581,47.47219],[8.89135,47.4738],[8.89143,47.47821],[8.90142,47.48133],[8.90428,47.48449],[8.90314,47.48928],[8.90001,47.49187],[8.89967,47.49885],[8.90357,47.50404],[8.90413,47.50745],[8.90322,47.51948],[8.90497,47.52447],[8.90365,47.52691],[8.89982,47.52965],[8.88423,47.53392],[8.87883,47.53277],[8.87061,47.53477],[8.8602,47.53488],[8.85674,47.53594],[8.84782,47.5358],[8.84614,47.54087],[8.8403,47.54654],[8.83728,47.55278],[8.84275,47.5537],[8.84648,47.5562],[8.85269,47.55645],[8.8562,47.55792],[8.85775,47.56141],[8.85728,47.56489],[8.85511,47.56721],[8.85079,47.56818],[8.84763,47.57023],[8.84538,47.57061],[8.8448,47.57309],[8.84211,47.57513],[8.83326,47.57769],[8.82962,47.57778],[8.82661,47.57662],[8.82137,47.57756],[8.81432,47.57598],[8.81234,47.5778],[8.81222,47.58473],[8.81067,47.58639],[8.80812,47.58738],[8.76818,47.59674],[8.7543,47.59729],[8.75529,47.60108],[8.75416,47.60273],[8.74883,47.60588],[8.74829,47.60874],[8.7507,47.60981],[8.75255,47.61292],[8.75575,47.61217],[8.76102,47.61335],[8.78169,47.60634],[8.78165,47.60345],[8.78467,47.59993],[8.80168,47.5966],[8.80512,47.59686],[8.80895,47.59938],[8.81074,47.60981],[8.81866,47.61372],[8.82001,47.61526],[8.82089,47.62058],[8.82015,47.62415],[8.82415,47.6256],[8.83079,47.63206],[8.83448,47.64099],[8.83182,47.64945],[8.82695,47.65206],[8.81168,47.65599],[8.81112,47.6621],[8.81192,47.66454],[8.81041,47.66752],[8.80881,47.66857],[8.80293,47.66978],[8.79299,47.66919],[8.78685,47.66978],[8.78453,47.66899],[8.78216,47.66659],[8.77921,47.65695],[8.77763,47.65563],[8.77398,47.65435],[8.76623,47.65438],[8.76108,47.65257],[8.75852,47.65033],[8.75464,47.64883],[8.7534,47.64733],[8.74839,47.64613],[8.74329,47.64749],[8.73882,47.64651],[8.72376,47.64753],[8.72063,47.64664],[8.71492,47.64885],[8.70826,47.64764],[8.70481,47.65039],[8.70053,47.65199],[8.69427,47.65307],[8.69242,47.65581],[8.68632,47.66094],[8.68485,47.66413],[8.68574,47.66799],[8.68326,47.67315],[8.68056,47.67561],[8.67521,47.6776],[8.67642,47.68177],[8.67561,47.68661],[8.67427,47.68799],[8.67227,47.68891],[8.66273,47.69029],[8.64644,47.69847],[8.63968,47.69877],[8.6355,47.69743],[8.62162,47.69554],[8.61818,47.69279],[8.61744,47.69087],[8.62007,47.68134],[8.61478,47.68308],[8.60917,47.68188],[8.60199,47.67451],[8.59954,47.66923],[8.60275,47.66132],[8.60979,47.6568],[8.6141,47.6564],[8.61574,47.65557],[8.62231,47.65104],[8.62227,47.65024],[8.62048,47.64758],[8.61939,47.65043],[8.61521,47.65452],[8.6093,47.65677],[8.60324,47.65654],[8.60069,47.65541],[8.59788,47.65276],[8.59645,47.64876],[8.59092,47.64623],[8.58937,47.6444],[8.58874,47.63936],[8.59116,47.62755],[8.59325,47.62233],[8.59838,47.61587],[8.59854,47.6145],[8.59114,47.60917],[8.58937,47.60682],[8.58796,47.60319],[8.58788,47.59909],[8.58203,47.59793],[8.57398,47.59329],[8.57146,47.58988],[8.57035,47.58633],[8.57203,47.57985],[8.56771,47.57799],[8.56506,47.57524],[8.56117,47.56407],[8.55707,47.55947],[8.55616,47.56336],[8.55206,47.56904],[8.55334,47.57146],[8.5526,47.57599],[8.55007,47.57806],[8.54666,47.57923],[8.5435,47.58228],[8.54319,47.5851],[8.54888,47.5879],[8.55175,47.58777],[8.55764,47.58963],[8.56114,47.59151],[8.56265,47.5946],[8.56668,47.59565],[8.56902,47.59748],[8.56953,47.60049],[8.57237,47.60386],[8.57308,47.60641],[8.57562,47.60676],[8.579,47.60845],[8.58076,47.61031],[8.58125,47.61203],[8.58025,47.61456],[8.57712,47.61636],[8.57525,47.61957],[8.57277,47.6211],[8.56785,47.62164],[8.56341,47.62697],[8.56105,47.62838],[8.54803,47.62998],[8.54558,47.63122],[8.54498,47.63297],[8.54288,47.63458],[8.53995,47.63565],[8.52769,47.63634],[8.52112,47.63887],[8.51478,47.6385],[8.50932,47.63559],[8.50829,47.62942],[8.50161,47.62597],[8.5007,47.62421],[8.50149,47.62154],[8.49253,47.61893],[8.48884,47.61953],[8.47669,47.61937],[8.47439,47.61838],[8.47154,47.61495],[8.47129,47.61307],[8.46785,47.61272],[8.46446,47.61109],[8.46173,47.60659],[8.45519,47.60676],[8.45061,47.60411],[8.4499,47.60164],[8.4507,47.59584],[8.45382,47.59343],[8.45428,47.5866],[8.4563,47.5848],[8.46014,47.58382],[8.46332,47.58044],[8.46881,47.5795],[8.46219,47.57653],[8.45419,47.57668],[8.43642,47.57154],[8.43161,47.57102],[8.42476,47.57231],[8.41477,47.56879],[8.41304,47.56745],[8.41034,47.56194],[8.41039,47.55972],[8.40789,47.55465],[8.40846,47.55018],[8.39964,47.54444],[8.39609,47.543],[8.39469,47.54094],[8.39495,47.53674],[8.39136,47.53568],[8.38835,47.53305],[8.38525,47.53316],[8.38113,47.53219],[8.3774,47.52969],[8.37518,47.52679],[8.37279,47.51651],[8.36579,47.51663],[8.35666,47.51348],[8.35439,47.51104],[8.35103,47.50314],[8.3524,47.49957],[8.35163,47.4973],[8.35274,47.49484],[8.3545,47.49355],[8.3557,47.48979],[8.35533,47.48525],[8.35698,47.47931],[8.35891,47.47743],[8.36187,47.47645],[8.36722,47.47654],[8.36702,47.47487],[8.36073,47.47222],[8.35903,47.46604],[8.35996,47.46381],[8.36326,47.46204],[8.3673,47.45653],[8.36975,47.45504],[8.37393,47.45472],[8.37754,47.45201],[8.37583,47.45068],[8.37441,47.44614],[8.37623,47.43818],[8.37168,47.43675],[8.36855,47.43406],[8.3681,47.43158],[8.36904,47.42863],[8.37222,47.42603],[8.38283,47.42346],[8.38371,47.42251],[8.38073,47.42207],[8.37555,47.4178],[8.37598,47.41378],[8.37441,47.40906],[8.36067,47.40664],[8.35789,47.40542],[8.35629,47.40377],[8.35661,47.39961],[8.36195,47.39516],[8.36577,47.39429],[8.37601,47.3947],[8.37743,47.39218],[8.38036,47.39048],[8.38761,47.39035],[8.38832,47.38012],[8.39034,47.37527],[8.39355,47.3719],[8.39387,47.36945],[8.39574,47.3671],[8.39902,47.36608],[8.39836,47.36408],[8.40012,47.36094],[8.40103,47.35433],[8.39728,47.34677],[8.39779,47.34475],[8.40186,47.3391],[8.40931,47.33409],[8.4061,47.32975],[8.40578,47.32667],[8.40689,47.32447],[8.41295,47.3205],[8.41611,47.31996],[8.42948,47.32227],[8.43556,47.32083],[8.43437,47.31954],[8.43155,47.31851],[8.42609,47.31375],[8.42276,47.30706],[8.42311,47.30368],[8.41745,47.3015],[8.41372,47.29824],[8.40012,47.29564],[8.39768,47.29392],[8.39518,47.29516],[8.39108,47.29552],[8.38602,47.29437],[8.38272,47.29225],[8.38198,47.29034],[8.38255,47.2881],[8.38508,47.28565],[8.38977,47.27507],[8.39563,47.271],[8.39407,47.26672],[8.39415,47.26361],[8.39756,47.25986],[8.39614,47.25481],[8.39742,47.25189],[8.40647,47.24452],[8.40826,47.24118],[8.40761,47.23957],[8.4096,47.23585],[8.41073,47.22799],[8.41248,47.22433],[8.41695,47.22014],[8.41959,47.21902],[8.42269,47.21886],[8.42977,47.22],[8.43936,47.21937],[8.45,47.21363],[8.4546,47.21334],[8.45625,47.21081],[8.4591,47.20934],[8.46447,47.20928],[8.46609,47.20862],[8.46868,47.20533],[8.47329,47.20398],[8.47693,47.20458],[8.48399,47.20392],[8.49489,47.20738],[8.504,47.20768],[8.51538,47.21152],[8.51753,47.21271],[8.51906,47.21495],[8.5306,47.21306],[8.53307,47.21325],[8.5415,47.21778],[8.54456,47.21707],[8.55407,47.21726],[8.55858,47.21517],[8.56984,47.2139],[8.57491,47.21255],[8.57749,47.20771],[8.58044,47.2064],[8.58408,47.20603],[8.59012,47.20714],[8.58965,47.2046],[8.59074,47.20195],[8.59358,47.1986],[8.59581,47.19753],[8.60168,47.19722],[8.60653,47.1992],[8.60725,47.19885],[8.61097,47.19387],[8.61128,47.19059],[8.61391,47.18838],[8.61522,47.18515],[8.61938,47.18045],[8.61976,47.17918],[8.61721,47.17359],[8.6196,47.1698],[8.62292,47.16821],[8.6339,47.16715],[8.63561,47.16578],[8.63965,47.16459],[8.64287,47.16443],[8.65216,47.16598],[8.65425,47.16552],[8.6549,47.15967],[8.65649,47.15783],[8.65882,47.15658],[8.66853,47.15492],[8.67847,47.15558],[8.68241,47.15759],[8.69361,47.15898],[8.69804,47.16134],[8.69886,47.16303],[8.6977,47.17033],[8.69599,47.17232],[8.68919,47.17566],[8.6872,47.17959],[8.6879,47.18229],[8.69186,47.18485],[8.69824,47.19205],[8.70323,47.19326],[8.70852,47.19602],[8.71423,47.19693],[8.71692,47.19893],[8.74212,47.2071],[8.74218,47.21355],[8.71338,47.21388]]],terms_text:"Geographisches Informationssystem des Kantons Zürich (GIS-ZH), Terrainschummerung"},{id:"kartverket-abas",name:"Kartverket Administrative Boundaries overlay",type:"wms",template:"https://openwms.statkart.no/skwms1/wms.adm_enheter?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=avtaltavgrensningslinje,territorialgrense,riksgrense,fylker,kommuner&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[0,22],polygon:[[[31.90425,70.43681],[28.47652,71.32896],[23.6865,71.25143],[16.80906,70.07308],[11.16207,67.52539],[9.97554,64.81158],[4.21871,62.145],[4.37254,59.1872],[6.17431,57.8915],[7.93212,57.73936],[10.77758,58.86491],[11.7224,58.76251],[12.72216,60.11415],[13.05175,61.34935],[12.52439,63.61699],[14.23826,63.98561],[15.11717,65.90166],[18.69871,68.37491],[20.06101,68.26126],[21.00584,68.78415],[25.24656,68.3506],[26.93845,69.8472],[28.76219,69.61121],[28.5864,68.8556],[31.06931,69.51915],[31.90425,70.43681]]],terms_url:"https://www.kartverket.no/data/Kartdata/Grenser/",terms_text:"© Kartverket",description:"Official administrative boundaries at the national, county and municipality levels",icon:"https://www.kartverket.no/Content/Images/logo-graphic-512.png",overlay:true},{id:"kartverket-luftfartshindre",name:"Kartverket Aviation Obstructions overlay",type:"wms",template:"https://openwms.statkart.no/skwms1/wms.nrl?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=nrl3_wms&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[7,20],polygon:[[[31.90425,70.43681],[28.47652,71.32896],[23.6865,71.25143],[16.80906,70.07308],[11.16207,67.52539],[9.97554,64.81158],[4.21871,62.145],[4.37254,59.1872],[6.17431,57.8915],[7.93212,57.73936],[10.77758,58.86491],[11.7224,58.76251],[12.72216,60.11415],[13.05175,61.34935],[12.52439,63.61699],[14.23826,63.98561],[15.11717,65.90166],[18.69871,68.37491],[20.06101,68.26126],[21.00584,68.78415],[25.24656,68.3506],[26.93845,69.8472],[28.76219,69.61121],[28.5864,68.8556],[31.06931,69.51915],[31.90425,70.43681]]],terms_url:"https://kartverket.no/kart/Nasjonalt-register-over-luftfartshindre/",terms_text:"© Kartverket",description:"Vertical obstructions to aircrafts, above 15m in rural areas and 30m in urban areas (e.g. masts, towers, high buildings, power lines)",icon:"https://www.kartverket.no/Content/Images/logo-graphic-512.png",overlay:true},{id:"kartverket-matrikkel",name:"Kartverket Cadastral overlay",type:"wms",template:"https://wms.geonorge.no/skwms1/wms.matrikkel?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=matrikkel_WMS&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[14,20],polygon:[[[31.90425,70.43681],[28.47652,71.32896],[23.6865,71.25143],[16.80906,70.07308],[11.16207,67.52539],[9.97554,64.81158],[4.21871,62.145],[4.37254,59.1872],[6.17431,57.8915],[7.93212,57.73936],[10.77758,58.86491],[11.7224,58.76251],[12.72216,60.11415],[13.05175,61.34935],[12.52439,63.61699],[14.23826,63.98561],[15.11717,65.90166],[18.69871,68.37491],[20.06101,68.26126],[21.00584,68.78415],[25.24656,68.3506],[26.93845,69.8472],[28.76219,69.61121],[28.5864,68.8556],[31.06931,69.51915],[31.90425,70.43681]]],terms_url:"http://www.seeiendom.no/",terms_text:"© Kartverket",description:"Real estate boundaries from the official land register (`matrikkelen´). Monthly update.",icon:"https://www.kartverket.no/Content/Images/logo-graphic-512.png",overlay:true},{id:"kartverket-hoydekurver",name:"Kartverket Contour Lines overlay",type:"wms",template:"https://openwms.statkart.no/skwms1/wms.topo4?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=hoydetall5linje,hoydetall5punkt,hoydepunkt,vannpunkt,hoydekurver_1m,hoydekurver_5m,N50Hoydekurver,N250Hoydekurver,N500Hoydekurver,N1000Hoydekurver,N2000Hoydekurver&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[9,22],polygon:[[[31.90425,70.43681],[28.47652,71.32896],[23.6865,71.25143],[16.80906,70.07308],[11.16207,67.52539],[9.97554,64.81158],[4.21871,62.145],[4.37254,59.1872],[6.17431,57.8915],[7.93212,57.73936],[10.77758,58.86491],[11.7224,58.76251],[12.72216,60.11415],[13.05175,61.34935],[12.52439,63.61699],[14.23826,63.98561],[15.11717,65.90166],[18.69871,68.37491],[20.06101,68.26126],[21.00584,68.78415],[25.24656,68.3506],[26.93845,69.8472],[28.76219,69.61121],[28.5864,68.8556],[31.06931,69.51915],[31.90425,70.43681]]],terms_url:"https://www.kartverket.no/Prosjekter/Nasjonal-detaljert-hoydemodell/",terms_text:"© Kartverket",description:"Contours for Norway",icon:"https://www.kartverket.no/Content/Images/logo-graphic-512.png",overlay:true},{id:"kartverket-dom-skygge",name:"Kartverket DOM Digital Surface Model",type:"wms",template:"https://wms.geonorge.no/skwms1/wms.hoyde-dom_somlos_skyggerelieff?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=las_dom_skyggerelieff_somlos&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[0,24],polygon:[[[11.53568,58.86659],[11.66192,58.89784],[11.7935,59.09471],[11.84243,59.239],[11.82877,59.34509],[11.71279,59.60387],[11.86205,59.63771],[11.95608,59.69196],[11.93389,59.86895],[12.17881,59.8786],[12.46948,60.03124],[12.55438,60.18972],[12.51237,60.31659],[12.61793,60.40065],[12.61883,60.51512],[12.25387,61.01106],[12.69195,61.04632],[12.90756,61.34802],[12.57493,61.57623],[12.42465,61.57175],[12.15233,61.72694],[12.31212,62.26512],[12.07078,62.61109],[12.14907,62.7455],[12.08883,62.89668],[12.23464,62.99952],[11.99225,63.26684],[12.23327,63.47505],[12.17971,63.57117],[12.69313,63.96344],[13.21378,64.0839],[13.99183,64.00514],[14.17035,64.18236],[14.13253,64.47516],[13.67658,64.58356],[14.02455,64.88119],[14.33572,65.11098],[14.51699,65.30365],[14.54177,65.67762],[14.63674,65.81299],[14.53903,66.12496],[15.03881,66.14245],[15.50033,66.27956],[15.39368,66.4795],[15.63473,66.59685],[16.04695,66.90283],[16.39832,67.03827],[16.41439,67.21036],[16.10744,67.43617],[16.16455,67.5087],[16.42318,67.52589],[16.5866,67.64528],[16.7471,67.90466],[17.34741,68.09995],[17.90583,67.95885],[18.16489,68.19424],[18.13721,68.52675],[18.40761,68.57059],[18.62222,68.49607],[18.98574,68.50591],[19.92752,68.34558],[20.24505,68.49201],[19.99237,68.55586],[20.21137,68.65685],[20.34848,68.79976],[20.31623,68.93227],[20.10322,69.0359],[20.55694,69.04926],[20.7206,69.10837],[21.06178,69.02541],[21.12098,69.10587],[21.01135,69.21086],[21.2824,69.30076],[21.62645,69.26589],[22.33512,68.81965],[22.37485,68.70596],[22.5377,68.73329],[22.80161,68.67674],[23.04635,68.67833],[23.16467,68.61903],[23.68789,68.70049],[23.79776,68.81592],[23.96804,68.82287],[24.17541,68.7314],[24.76043,68.63655],[24.8544,68.55285],[24.90827,68.54387],[24.93347,68.6025],[25.12435,68.62003],[25.1667,68.79008],[25.43334,68.87886],[25.62945,68.88103],[25.79589,69.01157],[25.73272,69.19428],[26.02249,69.66758],[26.56631,69.94207],[27.10601,69.89539],[27.63679,70.05317],[27.93548,70.07401],[27.96569,70.00415],[28.40312,69.80824],[29.1014,69.69095],[29.328,69.47585],[28.82859,69.2316],[28.7931,69.0943],[29.04485,68.99986],[29.25292,69.10601],[29.32641,69.22982],[29.29229,69.27632],[29.39117,69.31298],[29.57038,69.31201],[29.85191,69.41631],[29.96795,69.39916],[30.13069,69.4667],[30.2008,69.5658],[30.13137,69.6609],[30.15678,69.66496],[30.51589,69.53787],[30.82077,69.52371],[30.95329,69.55563],[30.96221,69.67832],[30.83578,69.79192],[31.65161,70.17579],[31.78344,70.4662],[30.49255,70.86989],[28.43261,71.30079],[25.66406,71.40266],[23.81835,71.29374],[18.30322,70.40734],[14.24926,69.07641],[11.18408,67.47913],[11.74438,66.90852],[9.95361,64.88393],[4.72961,62.3649],[4.12948,61.69247],[4.08142,61.02637],[4.4577,59.19421],[5.31188,58.4276],[6.47094,57.84475],[7.56408,57.72468],[8.4375,57.91776],[10.59792,58.75006],[10.64905,58.88203],[11.09035,58.97673],[11.16173,59.06743],[11.34175,59.10293],[11.44922,58.99078],[11.45194,58.88136],[11.53568,58.86659]]],terms_url:"https://hoydedata.no/",terms_text:"© Kartverket",description:"Shaded relief representation of the Norwegian digital surface model (DOM), i.e. earth surface including trees, buildings and other objects on top of it.",icon:"https://www.kartverket.no/Content/Images/logo-graphic-512.png"},{id:"kartverket-dtm-skygge",name:"Kartverket DTM Digital Terrain Model",type:"wms",template:"https://wms.geonorge.no/skwms1/wms.hoyde-dtm_somlos_skyggerelieff?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=las_dtm_skyggerelieff_somlos&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[0,24],polygon:[[[11.53568,58.86659],[11.66192,58.89784],[11.7935,59.09471],[11.84243,59.239],[11.82877,59.34509],[11.71279,59.60387],[11.86205,59.63771],[11.95608,59.69196],[11.93389,59.86895],[12.17881,59.8786],[12.46948,60.03124],[12.55438,60.18972],[12.51237,60.31659],[12.61793,60.40065],[12.61883,60.51512],[12.25387,61.01106],[12.69195,61.04632],[12.90756,61.34802],[12.57493,61.57623],[12.42465,61.57175],[12.15233,61.72694],[12.31212,62.26512],[12.07078,62.61109],[12.14907,62.7455],[12.08883,62.89668],[12.23464,62.99952],[11.99225,63.26684],[12.23327,63.47505],[12.17971,63.57117],[12.69313,63.96344],[13.21378,64.0839],[13.99183,64.00514],[14.17035,64.18236],[14.13253,64.47516],[13.67658,64.58356],[14.02455,64.88119],[14.33572,65.11098],[14.51699,65.30365],[14.54177,65.67762],[14.63674,65.81299],[14.53903,66.12496],[15.03881,66.14245],[15.50033,66.27956],[15.39368,66.4795],[15.63473,66.59685],[16.04695,66.90283],[16.39832,67.03827],[16.41439,67.21036],[16.10744,67.43617],[16.16455,67.5087],[16.42318,67.52589],[16.5866,67.64528],[16.7471,67.90466],[17.34741,68.09995],[17.90583,67.95885],[18.16489,68.19424],[18.13721,68.52675],[18.40761,68.57059],[18.62222,68.49607],[18.98574,68.50591],[19.92752,68.34558],[20.24505,68.49201],[19.99237,68.55586],[20.21137,68.65685],[20.34848,68.79976],[20.31623,68.93227],[20.10322,69.0359],[20.55694,69.04926],[20.7206,69.10837],[21.06178,69.02541],[21.12098,69.10587],[21.01135,69.21086],[21.2824,69.30076],[21.62645,69.26589],[22.33512,68.81965],[22.37485,68.70596],[22.5377,68.73329],[22.80161,68.67674],[23.04635,68.67833],[23.16467,68.61903],[23.68789,68.70049],[23.79776,68.81592],[23.96804,68.82287],[24.17541,68.7314],[24.76043,68.63655],[24.8544,68.55285],[24.90827,68.54387],[24.93347,68.6025],[25.12435,68.62003],[25.1667,68.79008],[25.43334,68.87886],[25.62945,68.88103],[25.79589,69.01157],[25.73272,69.19428],[26.02249,69.66758],[26.56631,69.94207],[27.10601,69.89539],[27.63679,70.05317],[27.93548,70.07401],[27.96569,70.00415],[28.40312,69.80824],[29.1014,69.69095],[29.328,69.47585],[28.82859,69.2316],[28.7931,69.0943],[29.04485,68.99986],[29.25292,69.10601],[29.32641,69.22982],[29.29229,69.27632],[29.39117,69.31298],[29.57038,69.31201],[29.85191,69.41631],[29.96795,69.39916],[30.13069,69.4667],[30.2008,69.5658],[30.13137,69.6609],[30.15678,69.66496],[30.51589,69.53787],[30.82077,69.52371],[30.95329,69.55563],[30.96221,69.67832],[30.83578,69.79192],[31.65161,70.17579],[31.78344,70.4662],[30.49255,70.86989],[28.43261,71.30079],[25.66406,71.40266],[23.81835,71.29374],[18.30322,70.40734],[14.24926,69.07641],[11.18408,67.47913],[11.74438,66.90852],[9.95361,64.88393],[4.72961,62.3649],[4.12948,61.69247],[4.08142,61.02637],[4.4577,59.19421],[5.31188,58.4276],[6.47094,57.84475],[7.56408,57.72468],[8.4375,57.91776],[10.59792,58.75006],[10.64905,58.88203],[11.09035,58.97673],[11.16173,59.06743],[11.34175,59.10293],[11.44922,58.99078],[11.45194,58.88136],[11.53568,58.86659]]],terms_url:"https://hoydedata.no/",terms_text:"© Kartverket",description:"Shaded relief representation of the Norwegian digital terrain model (DTM), i.e. earth surface without trees, buildings and other objects.",icon:"https://www.kartverket.no/Content/Images/logo-graphic-512.png"},{id:"kartverket-ok-1st",name:"Kartverket Economic Maps (historic)",type:"wms",template:"https://wms.geonorge.no/skwms1/wms.n5raster2?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=n5raster_foerstegang_metadata,n5raster_foerstegang&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[11,20],polygon:[[[31.90425,70.43681],[28.47652,71.32896],[23.6865,71.25143],[16.80906,70.07308],[11.16207,67.52539],[9.97554,64.81158],[4.21871,62.145],[4.37254,59.1872],[6.17431,57.8915],[7.93212,57.73936],[10.77758,58.86491],[11.7224,58.76251],[12.72216,60.11415],[13.05175,61.34935],[12.52439,63.61699],[14.23826,63.98561],[15.11717,65.90166],[18.69871,68.37491],[20.06101,68.26126],[21.00584,68.78415],[25.24656,68.3506],[26.93845,69.8472],[28.76219,69.61121],[28.5864,68.8556],[31.06931,69.51915],[31.90425,70.43681]]],terms_url:"https://www.kartverket.no/kunnskap/historie/kartverkets-historiske-arkiv/",terms_text:"© Kartverket",description:"1st edition of historic Economic maps for Norway 1960-90s (`Økonomisk kartverk´). Available from zoom 16. Please correct local imagery offset.",icon:"https://www.kartverket.no/Content/Images/logo-graphic-512.png"},{id:"kartverket-friluft",name:"Kartverket Hiking Trails",type:"wms",template:"https://wms.geonorge.no/skwms1/wms.friluftsruter2?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Fotrute&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[6,24],polygon:[[[11.53568,58.86659],[11.66192,58.89784],[11.7935,59.09471],[11.84243,59.239],[11.82877,59.34509],[11.71279,59.60387],[11.86205,59.63771],[11.95608,59.69196],[11.93389,59.86895],[12.17881,59.8786],[12.46948,60.03124],[12.55438,60.18972],[12.51237,60.31659],[12.61793,60.40065],[12.61883,60.51512],[12.25387,61.01106],[12.69195,61.04632],[12.90756,61.34802],[12.57493,61.57623],[12.42465,61.57175],[12.15233,61.72694],[12.31212,62.26512],[12.07078,62.61109],[12.14907,62.7455],[12.08883,62.89668],[12.23464,62.99952],[11.99225,63.26684],[12.23327,63.47505],[12.17971,63.57117],[12.69313,63.96344],[13.21378,64.0839],[13.99183,64.00514],[14.17035,64.18236],[14.13253,64.47516],[13.67658,64.58356],[14.02455,64.88119],[14.33572,65.11098],[14.51699,65.30365],[14.54177,65.67762],[14.63674,65.81299],[14.53903,66.12496],[15.03881,66.14245],[15.50033,66.27956],[15.39368,66.4795],[15.63473,66.59685],[16.04695,66.90283],[16.39832,67.03827],[16.41439,67.21036],[16.10744,67.43617],[16.16455,67.5087],[16.42318,67.52589],[16.5866,67.64528],[16.7471,67.90466],[17.34741,68.09995],[17.90583,67.95885],[18.16489,68.19424],[18.13721,68.52675],[18.40761,68.57059],[18.62222,68.49607],[18.98574,68.50591],[19.92752,68.34558],[20.24505,68.49201],[19.99237,68.55586],[20.21137,68.65685],[20.34848,68.79976],[20.31623,68.93227],[20.10322,69.0359],[20.55694,69.04926],[20.7206,69.10837],[21.06178,69.02541],[21.12098,69.10587],[21.01135,69.21086],[21.2824,69.30076],[21.62645,69.26589],[22.33512,68.81965],[22.37485,68.70596],[22.5377,68.73329],[22.80161,68.67674],[23.04635,68.67833],[23.16467,68.61903],[23.68789,68.70049],[23.79776,68.81592],[23.96804,68.82287],[24.17541,68.7314],[24.76043,68.63655],[24.8544,68.55285],[24.90827,68.54387],[24.93347,68.6025],[25.12435,68.62003],[25.1667,68.79008],[25.43334,68.87886],[25.62945,68.88103],[25.79589,69.01157],[25.73272,69.19428],[26.02249,69.66758],[26.56631,69.94207],[27.10601,69.89539],[27.63679,70.05317],[27.93548,70.07401],[27.96569,70.00415],[28.40312,69.80824],[29.1014,69.69095],[29.328,69.47585],[28.82859,69.2316],[28.7931,69.0943],[29.04485,68.99986],[29.25292,69.10601],[29.32641,69.22982],[29.29229,69.27632],[29.39117,69.31298],[29.57038,69.31201],[29.85191,69.41631],[29.96795,69.39916],[30.13069,69.4667],[30.2008,69.5658],[30.13137,69.6609],[30.15678,69.66496],[30.51589,69.53787],[30.82077,69.52371],[30.95329,69.55563],[30.96221,69.67832],[30.83578,69.79192],[31.65161,70.17579],[31.78344,70.4662],[30.49255,70.86989],[28.43261,71.30079],[25.66406,71.40266],[23.81835,71.29374],[18.30322,70.40734],[14.24926,69.07641],[11.18408,67.47913],[11.74438,66.90852],[9.95361,64.88393],[4.72961,62.3649],[4.12948,61.69247],[4.08142,61.02637],[4.4577,59.19421],[5.31188,58.4276],[6.47094,57.84475],[7.56408,57.72468],[8.4375,57.91776],[10.59792,58.75006],[10.64905,58.88203],[11.09035,58.97673],[11.16173,59.06743],[11.34175,59.10293],[11.44922,58.99078],[11.45194,58.88136],[11.53568,58.86659]]],terms_url:"https://kartverket.no/geodataarbeid/temadata/nasjonal-database-for-tur--og-friluftsruter/",terms_text:"© Kartverket",description:"Hiking trails from the Norwegian database `Tur- og Friluftsruter´, including DNT routes.",icon:"https://www.kartverket.no/Content/Images/logo-graphic-512.png",overlay:true},{id:"kartverket-fjellskygge",name:"Kartverket Hillshade overlay",type:"tms",template:"https://opencache{switch:,2,3}.statkart.no/gatekeeper/gk/gk.open_gmaps?layers=fjellskygge&zoom={zoom}&x={x}&y={y}",zoomExtent:[9,15],polygon:[[[31.90425,70.43681],[28.47652,71.32896],[23.6865,71.25143],[16.80906,70.07308],[11.16207,67.52539],[9.97554,64.81158],[4.21871,62.145],[4.37254,59.1872],[6.17431,57.8915],[7.93212,57.73936],[10.77758,58.86491],[11.7224,58.76251],[12.72216,60.11415],[13.05175,61.34935],[12.52439,63.61699],[14.23826,63.98561],[15.11717,65.90166],[18.69871,68.37491],[20.06101,68.26126],[21.00584,68.78415],[25.24656,68.3506],[26.93845,69.8472],[28.76219,69.61121],[28.5864,68.8556],[31.06931,69.51915],[31.90425,70.43681]]],terms_url:"https://kartkatalog.geonorge.no/metadata/kartverket/fjellskygge-cache/cca7c129-fe66-4c96-9091-40d92290dd81",terms_text:"© Kartverket",description:"Hillshade for Norway",icon:"https://www.kartverket.no/Content/Images/logo-graphic-512.png",overlay:true},{id:"kartverket-historic",name:"Kartverket Historic maps",type:"wms",template:"https://wms.geonorge.no/skwms1/wms.historiskekart?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=amt1&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[5,15],polygon:[[[31.90425,70.43681],[28.47652,71.32896],[23.6865,71.25143],[16.80906,70.07308],[11.16207,67.52539],[9.97554,64.81158],[4.21871,62.145],[4.37254,59.1872],[6.17431,57.8915],[7.93212,57.73936],[10.77758,58.86491],[11.7224,58.76251],[12.72216,60.11415],[13.05175,61.34935],[12.52439,63.61699],[14.23826,63.98561],[15.11717,65.90166],[18.69871,68.37491],[20.06101,68.26126],[21.00584,68.78415],[25.24656,68.3506],[26.93845,69.8472],[28.76219,69.61121],[28.5864,68.8556],[31.06931,69.51915],[31.90425,70.43681]]],terms_url:"https://www.kartverket.no/kart/historiske-kart/",terms_text:"© Kartverket",description:"Historic maps - for the time being `Amtskartserien´ 1826-1917.",icon:"https://www.kartverket.no/Content/Images/logo-graphic-512.png"},{id:"kartverket-topo4",name:"Kartverket N50 topo",type:"tms",template:"https://opencache{switch:,2,3}.statkart.no/gatekeeper/gk/gk.open_gmaps?layers=topo4&zoom={zoom}&x={x}&y={y}",zoomExtent:[3,15],polygon:[[[11.53568,58.86659],[11.66192,58.89784],[11.7935,59.09471],[11.84243,59.239],[11.82877,59.34509],[11.71279,59.60387],[11.86205,59.63771],[11.95608,59.69196],[11.93389,59.86895],[12.17881,59.8786],[12.46948,60.03124],[12.55438,60.18972],[12.51237,60.31659],[12.61793,60.40065],[12.61883,60.51512],[12.25387,61.01106],[12.69195,61.04632],[12.90756,61.34802],[12.57493,61.57623],[12.42465,61.57175],[12.15233,61.72694],[12.31212,62.26512],[12.07078,62.61109],[12.14907,62.7455],[12.08883,62.89668],[12.23464,62.99952],[11.99225,63.26684],[12.23327,63.47505],[12.17971,63.57117],[12.69313,63.96344],[13.21378,64.0839],[13.99183,64.00514],[14.17035,64.18236],[14.13253,64.47516],[13.67658,64.58356],[14.02455,64.88119],[14.33572,65.11098],[14.51699,65.30365],[14.54177,65.67762],[14.63674,65.81299],[14.53903,66.12496],[15.03881,66.14245],[15.50033,66.27956],[15.39368,66.4795],[15.63473,66.59685],[16.04695,66.90283],[16.39832,67.03827],[16.41439,67.21036],[16.10744,67.43617],[16.16455,67.5087],[16.42318,67.52589],[16.5866,67.64528],[16.7471,67.90466],[17.34741,68.09995],[17.90583,67.95885],[18.16489,68.19424],[18.13721,68.52675],[18.40761,68.57059],[18.62222,68.49607],[18.98574,68.50591],[19.92752,68.34558],[20.24505,68.49201],[19.99237,68.55586],[20.21137,68.65685],[20.34848,68.79976],[20.31623,68.93227],[20.10322,69.0359],[20.55694,69.04926],[20.7206,69.10837],[21.06178,69.02541],[21.12098,69.10587],[21.01135,69.21086],[21.2824,69.30076],[21.62645,69.26589],[22.33512,68.81965],[22.37485,68.70596],[22.5377,68.73329],[22.80161,68.67674],[23.04635,68.67833],[23.16467,68.61903],[23.68789,68.70049],[23.79776,68.81592],[23.96804,68.82287],[24.17541,68.7314],[24.76043,68.63655],[24.8544,68.55285],[24.90827,68.54387],[24.93347,68.6025],[25.12435,68.62003],[25.1667,68.79008],[25.43334,68.87886],[25.62945,68.88103],[25.79589,69.01157],[25.73272,69.19428],[26.02249,69.66758],[26.56631,69.94207],[27.10601,69.89539],[27.63679,70.05317],[27.93548,70.07401],[27.96569,70.00415],[28.40312,69.80824],[29.1014,69.69095],[29.328,69.47585],[28.82859,69.2316],[28.7931,69.0943],[29.04485,68.99986],[29.25292,69.10601],[29.32641,69.22982],[29.29229,69.27632],[29.39117,69.31298],[29.57038,69.31201],[29.85191,69.41631],[29.96795,69.39916],[30.13069,69.4667],[30.2008,69.5658],[30.13137,69.6609],[30.15678,69.66496],[30.51589,69.53787],[30.82077,69.52371],[30.95329,69.55563],[30.96221,69.67832],[30.83578,69.79192],[31.65161,70.17579],[31.78344,70.4662],[30.49255,70.86989],[28.43261,71.30079],[25.66406,71.40266],[23.81835,71.29374],[18.30322,70.40734],[14.24926,69.07641],[11.18408,67.47913],[11.74438,66.90852],[9.95361,64.88393],[4.72961,62.3649],[4.12948,61.69247],[4.08142,61.02637],[4.4577,59.19421],[5.31188,58.4276],[6.47094,57.84475],[7.56408,57.72468],[8.4375,57.91776],[10.59792,58.75006],[10.64905,58.88203],[11.09035,58.97673],[11.16173,59.06743],[11.34175,59.10293],[11.44922,58.99078],[11.45194,58.88136],[11.53568,58.86659]]],terms_url:"https://wiki.openstreetmap.org/wiki/No:Kartverket_import",terms_text:"© Kartverket",description:"Topographic map N50, equivalent to Norway 1:50.000 paper map series.",icon:"https://www.kartverket.no/Content/Images/logo-graphic-512.png"},{id:"kartverket-sjokart",name:"Kartverket Nautical Charts",type:"tms",template:"https://opencache{switch:,2,3}.statkart.no/gatekeeper/gk/gk.open_gmaps?layers=sjokartraster&zoom={zoom}&x={x}&y={y}",zoomExtent:[3,20],polygon:[[[-15.01273,-60.16205],[33.3326,-60.17016],[33.32144,-73.0009],[-15.0239,-72.99613],[-15.01273,-60.16205]],[[-173.00076,-70.54952],[-125.00321,-70.54878],[-125.00167,-78.99977],[-172.99922,-79.0002],[-173.00076,-70.54952]],[[3.24857,56.08599],[2.60924,56.59428],[1.47215,58.45924],[1.77704,61.36251],[-0.49301,63.88665],[-13.73292,69.76376],[-12.43655,72.58741],[-5.11965,74.39626],[-3.60356,79.12998],[5.85587,82.34863],[34.98861,82.3401],[37.96874,78.62784],[37.99619,75.79673],[36.95796,73.68962],[32.07458,70.27336],[30.3511,69.56882],[21.46179,69.57098],[18.3032,68.36681],[14.47997,66.2558],[11.50266,63.28307],[11.50166,58.95444],[11.08246,58.96771],[10.03051,58.25173],[8.88244,57.69534],[3.24857,56.08599]]],terms_url:"https://www.kartverket.no/Kart/Sjokart/",terms_text:"© Kartverket",description:"Norwegian nautical charts (includes Spitsbergen/Svalbard and Antarctica). Raster representation of paper charts. Updated biweekly.",icon:"https://www.kartverket.no/Content/Images/logo-graphic-512.png"},{id:"kartverket-vegnett",name:"Kartverket Road Network",type:"wms",template:"https://openwms.statkart.no/skwms1/wms.vegnett?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=all&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[3,24],polygon:[[[11.53568,58.86659],[11.66192,58.89784],[11.7935,59.09471],[11.84243,59.239],[11.82877,59.34509],[11.71279,59.60387],[11.86205,59.63771],[11.95608,59.69196],[11.93389,59.86895],[12.17881,59.8786],[12.46948,60.03124],[12.55438,60.18972],[12.51237,60.31659],[12.61793,60.40065],[12.61883,60.51512],[12.25387,61.01106],[12.69195,61.04632],[12.90756,61.34802],[12.57493,61.57623],[12.42465,61.57175],[12.15233,61.72694],[12.31212,62.26512],[12.07078,62.61109],[12.14907,62.7455],[12.08883,62.89668],[12.23464,62.99952],[11.99225,63.26684],[12.23327,63.47505],[12.17971,63.57117],[12.69313,63.96344],[13.21378,64.0839],[13.99183,64.00514],[14.17035,64.18236],[14.13253,64.47516],[13.67658,64.58356],[14.02455,64.88119],[14.33572,65.11098],[14.51699,65.30365],[14.54177,65.67762],[14.63674,65.81299],[14.53903,66.12496],[15.03881,66.14245],[15.50033,66.27956],[15.39368,66.4795],[15.63473,66.59685],[16.04695,66.90283],[16.39832,67.03827],[16.41439,67.21036],[16.10744,67.43617],[16.16455,67.5087],[16.42318,67.52589],[16.5866,67.64528],[16.7471,67.90466],[17.34741,68.09995],[17.90583,67.95885],[18.16489,68.19424],[18.13721,68.52675],[18.40761,68.57059],[18.62222,68.49607],[18.98574,68.50591],[19.92752,68.34558],[20.24505,68.49201],[19.99237,68.55586],[20.21137,68.65685],[20.34848,68.79976],[20.31623,68.93227],[20.10322,69.0359],[20.55694,69.04926],[20.7206,69.10837],[21.06178,69.02541],[21.12098,69.10587],[21.01135,69.21086],[21.2824,69.30076],[21.62645,69.26589],[22.33512,68.81965],[22.37485,68.70596],[22.5377,68.73329],[22.80161,68.67674],[23.04635,68.67833],[23.16467,68.61903],[23.68789,68.70049],[23.79776,68.81592],[23.96804,68.82287],[24.17541,68.7314],[24.76043,68.63655],[24.8544,68.55285],[24.90827,68.54387],[24.93347,68.6025],[25.12435,68.62003],[25.1667,68.79008],[25.43334,68.87886],[25.62945,68.88103],[25.79589,69.01157],[25.73272,69.19428],[26.02249,69.66758],[26.56631,69.94207],[27.10601,69.89539],[27.63679,70.05317],[27.93548,70.07401],[27.96569,70.00415],[28.40312,69.80824],[29.1014,69.69095],[29.328,69.47585],[28.82859,69.2316],[28.7931,69.0943],[29.04485,68.99986],[29.25292,69.10601],[29.32641,69.22982],[29.29229,69.27632],[29.39117,69.31298],[29.57038,69.31201],[29.85191,69.41631],[29.96795,69.39916],[30.13069,69.4667],[30.2008,69.5658],[30.13137,69.6609],[30.15678,69.66496],[30.51589,69.53787],[30.82077,69.52371],[30.95329,69.55563],[30.96221,69.67832],[30.83578,69.79192],[31.65161,70.17579],[31.78344,70.4662],[30.49255,70.86989],[28.43261,71.30079],[25.66406,71.40266],[23.81835,71.29374],[18.30322,70.40734],[14.24926,69.07641],[11.18408,67.47913],[11.74438,66.90852],[9.95361,64.88393],[4.72961,62.3649],[4.12948,61.69247],[4.08142,61.02637],[4.4577,59.19421],[5.31188,58.4276],[6.47094,57.84475],[7.56408,57.72468],[8.4375,57.91776],[10.59792,58.75006],[10.64905,58.88203],[11.09035,58.97673],[11.16173,59.06743],[11.34175,59.10293],[11.44922,58.99078],[11.45194,58.88136],[11.53568,58.86659]]],terms_url:"https://www.kartverket.no/data/kartdata/vegdata/",terms_text:"© Kartverket",description:"Norwegian road network from the National Road database (NVDB). Colours represent national, county, municipal, private and forest roads + footways/cycleways.",icon:"https://www.kartverket.no/Content/Images/logo-graphic-512.png",overlay:true},{id:"Katowice-buildings",name:"Katowice: Buildings",type:"wms",template:"http://mapserver.um.katowice.pl/services/ortowms/MapServer/WMSServer?FORMAT=image/png&transparent=true&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=4,5,6&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",polygon:[[[18.90884,50.24006],[18.90851,50.23542],[18.94279,50.23515],[18.94399,50.27138],[18.95469,50.27485],[18.95571,50.2894],[18.96692,50.29364],[18.98752,50.2848],[18.99888,50.2847],[18.99907,50.29368],[18.98892,50.29377],[18.98934,50.30244],[19.0094,50.30196],[19.03401,50.28842],[19.05533,50.30139],[19.07901,50.30087],[19.07908,50.29297],[19.12296,50.27784],[19.12267,50.25523],[19.11079,50.2428],[19.1098,50.17946],[19.12065,50.17936],[19.11957,50.14359],[19.10777,50.14386],[19.0973,50.13916],[19.09656,50.12786],[19.06379,50.12786],[19.02985,50.14009],[19.03007,50.16177],[19.01909,50.16698],[19.00848,50.16707],[18.96329,50.1498],[18.92907,50.15008],[18.92915,50.15426],[18.91854,50.15419],[18.91878,50.20421],[18.90792,50.20429],[18.90808,50.21297],[18.88588,50.21314],[18.88639,50.24024],[18.90884,50.24006]]],terms_text:"Urząd Miasta Katowic"},{id:"Katowice-aerial_image",name:"Katowice: Orthophotomap (aerial image)",type:"wms",template:"http://mapserver.um.katowice.pl/services/ortowms/MapServer/WMSServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=2&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",zoomExtent:[0,23],polygon:[[[18.90884,50.24006],[18.90851,50.23542],[18.94279,50.23515],[18.94399,50.27138],[18.95469,50.27485],[18.95571,50.2894],[18.96692,50.29364],[18.98752,50.2848],[18.99888,50.2847],[18.99907,50.29368],[18.98892,50.29377],[18.98934,50.30244],[19.0094,50.30196],[19.03401,50.28842],[19.05533,50.30139],[19.07901,50.30087],[19.07908,50.29297],[19.12296,50.27784],[19.12267,50.25523],[19.11079,50.2428],[19.1098,50.17946],[19.12065,50.17936],[19.11957,50.14359],[19.10777,50.14386],[19.0973,50.13916],[19.09656,50.12786],[19.06379,50.12786],[19.02985,50.14009],[19.03007,50.16177],[19.01909,50.16698],[19.00848,50.16707],[18.96329,50.1498],[18.92907,50.15008],[18.92915,50.15426],[18.91854,50.15419],[18.91878,50.20421],[18.90792,50.20429],[18.90808,50.21297],[18.88588,50.21314],[18.88639,50.24024],[18.90884,50.24006]]],terms_text:"Urząd Miasta Katowic"},{id:"kelowna_2012",name:"Kelowna 2012",type:"tms",template:"http://{switch:a,b,c,d}.tile.paulnorman.ca/kelowna2012/{zoom}/{x}/{y}.png",endDate:"2012-05-14T00:00:00.000Z",startDate:"2012-05-13T00:00:00.000Z",zoomExtent:[9,20],polygon:[[[-119.58673,49.79281],[-119.54657,49.79281],[-119.54657,49.80138],[-119.53434,49.80138],[-119.53434,49.80473],[-119.52962,49.80473],[-119.52962,49.81196],[-119.51045,49.81196],[-119.51157,49.87443],[-119.51089,49.87449],[-119.51141,49.88433],[-119.51141,49.92218],[-119.49386,49.92235],[-119.49405,49.9313],[-119.48039,49.93175],[-119.48046,49.94075],[-119.46667,49.94099],[-119.46928,49.99137],[-119.45513,49.99161],[-119.45567,50.01212],[-119.44167,50.01239],[-119.44173,50.01363],[-119.42215,50.01404],[-119.4221,50.01193],[-119.41213,50.01217],[-119.41261,50.02169],[-119.41234,50.02169],[-119.41248,50.02508],[-119.41209,50.02508],[-119.4122,50.02708],[-119.41261,50.02707],[-119.41283,50.03219],[-119.39363,50.03264],[-119.39353,50.03078],[-119.37957,50.03101],[-119.37954,50.02876],[-119.37358,50.02886],[-119.37154,49.97936],[-119.35735,49.97936],[-119.35484,49.92561],[-119.32681,49.92572],[-119.32566,49.88041],[-119.31389,49.88065],[-119.31371,49.87717],[-119.31322,49.87722],[-119.31315,49.87497],[-119.31245,49.87491],[-119.31223,49.87236],[-119.31176,49.87233],[-119.3116,49.86961],[-119.31122,49.86942],[-119.31092,49.86324],[-119.31037,49.86327],[-119.30951,49.85124],[-119.31064,49.85123],[-119.31039,49.84626],[-119.32453,49.846],[-119.3246,49.84507],[-119.3367,49.84488],[-119.33675,49.84351],[-119.33794,49.84347],[-119.3378,49.83821],[-119.33836,49.8381],[-119.33837,49.83512],[-119.33909,49.83511],[-119.3388,49.83212],[-119.33915,49.83206],[-119.33917,49.82933],[-119.33946,49.82933],[-119.33959,49.82679],[-119.35001,49.82658],[-119.34937,49.81806],[-119.4047,49.81638],[-119.40457,49.8099],[-119.41016,49.8099],[-119.41029,49.80728],[-119.43195,49.80691],[-119.43226,49.7908],[-119.44598,49.79055],[-119.44529,49.78202],[-119.49674,49.78116],[-119.49661,49.77849],[-119.54184,49.77751],[-119.54159,49.77183],[-119.55603,49.77149],[-119.55612,49.77184],[-119.57157,49.77151],[-119.57162,49.77173],[-119.58192,49.77149],[-119.58201,49.77177],[-119.5923,49.77152],[-119.59234,49.77181],[-119.60038,49.7716],[-119.60119,49.78391],[-119.58644,49.78439],[-119.58673,49.79281]]],description:"High quality aerial imagery taken for the City of Kelowna"},{id:"kelowna_roads",name:"Kelowna Roads overlay",type:"tms",template:"http://{switch:a,b,c,d}.tile.paulnorman.ca/kelowna_overlay/{zoom}/{x}/{y}.png",zoomExtent:[9,20],polygon:[[[-119.58673,49.79281],[-119.54657,49.79281],[-119.54657,49.80138],[-119.53434,49.80138],[-119.53434,49.80473],[-119.52962,49.80473],[-119.52962,49.81196],[-119.51045,49.81196],[-119.51157,49.87443],[-119.51089,49.87449],[-119.51141,49.88433],[-119.51141,49.92218],[-119.49386,49.92235],[-119.49405,49.9313],[-119.48039,49.93175],[-119.48046,49.94075],[-119.46667,49.94099],[-119.46928,49.99137],[-119.45513,49.99161],[-119.45567,50.01212],[-119.44167,50.01239],[-119.44173,50.01363],[-119.42215,50.01404],[-119.4221,50.01193],[-119.41213,50.01217],[-119.41261,50.02169],[-119.41234,50.02169],[-119.41248,50.02508],[-119.41209,50.02508],[-119.4122,50.02708],[-119.41261,50.02707],[-119.41283,50.03219],[-119.39363,50.03264],[-119.39353,50.03078],[-119.37957,50.03101],[-119.37954,50.02876],[-119.37358,50.02886],[-119.37154,49.97936],[-119.35735,49.97936],[-119.35484,49.92561],[-119.32681,49.92572],[-119.32566,49.88041],[-119.31389,49.88065],[-119.31371,49.87717],[-119.31322,49.87722],[-119.31315,49.87497],[-119.31245,49.87491],[-119.31223,49.87236],[-119.31176,49.87233],[-119.3116,49.86961],[-119.31122,49.86942],[-119.31092,49.86324],[-119.31037,49.86327],[-119.30951,49.85124],[-119.31064,49.85123],[-119.31039,49.84626],[-119.32453,49.846],[-119.3246,49.84507],[-119.3367,49.84488],[-119.33675,49.84351],[-119.33794,49.84347],[-119.3378,49.83821],[-119.33836,49.8381],[-119.33837,49.83512],[-119.33909,49.83511],[-119.3388,49.83212],[-119.33915,49.83206],[-119.33917,49.82933],[-119.33946,49.82933],[-119.33959,49.82679],[-119.35001,49.82658],[-119.34937,49.81806],[-119.4047,49.81638],[-119.40457,49.8099],[-119.41016,49.8099],[-119.41029,49.80728],[-119.43195,49.80691],[-119.43226,49.7908],[-119.44598,49.79055],[-119.44529,49.78202],[-119.49674,49.78116],[-119.49661,49.77849],[-119.54184,49.77751],[-119.54159,49.77183],[-119.55603,49.77149],[-119.55612,49.77184],[-119.57157,49.77151],[-119.57162,49.77173],[-119.58192,49.77149],[-119.58201,49.77177],[-119.5923,49.77152],[-119.59234,49.77181],[-119.60038,49.7716],[-119.60119,49.78391],[-119.58644,49.78439],[-119.58673,49.79281]]],overlay:true},{id:"kystverket-navigasjon",name:"Kystverket Navigational Aid overlay",type:"wms",template:"https://nfs.kystverket.no/arcgis/services/nfs/NFSSistOperativ/MapServer/WmsServer?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=17,16,15,14,12,10,9,8,7,4&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[12,19],polygon:[[[3.24857,56.08599],[2.60924,56.59428],[1.47215,58.45924],[1.77704,61.36251],[-0.49301,63.88665],[-13.73292,69.76376],[-12.43655,72.58741],[-5.11965,74.39626],[-3.60356,79.12998],[5.85587,82.34863],[34.98861,82.3401],[37.96874,78.62784],[37.99619,75.79673],[36.95796,73.68962],[32.07458,70.27336],[30.3511,69.56882],[21.46179,69.57098],[18.3032,68.36681],[14.47997,66.2558],[11.50266,63.28307],[11.50166,58.95444],[11.08246,58.96771],[10.03051,58.25173],[8.88244,57.69534],[3.24857,56.08599]]],terms_url:"http://kystverket.no/Maritim-infrastruktur/Fyr-og-merker-/",terms_text:"© Kystverket",description:"Beacons, buoys, lights and fairways maintained by the Norwegian Coastal Administration",icon:"https://upload.wikimedia.org/wikipedia/commons/thumb/6/68/Coat_of_arms_of_the_Norwegian_Coastal_Administration.svg/143px-Coat_of_arms_of_the_Norwegian_Coastal_Administration.svg.png",overlay:true},{id:"landsat_233055",name:"Landsat 233055",type:"tms",template:"http://{switch:a,b,c,d}.tile.paulnorman.ca/landsat_233055/{zoom}/{x}/{y}.png",endDate:"2013-09-03T00:00:00.000Z",startDate:"2013-09-03T00:00:00.000Z",zoomExtent:[5,14],polygon:[[[-60.855,6.1765],[-60.47626,7.91883],[-62.16169,8.27787],[-62.53225,6.53755],[-60.855,6.1765]]],description:"Recent Landsat imagery"},{id:"osmse-ekonomiska",name:"Lantmäteriet Economic Map 1950–1980",type:"tms",template:"https://mapproxy.openstreetmap.se/tms/1.0.0/ek_EPSG3857/{zoom}/{x}/{-y}.jpeg",zoomExtent:[3,17],polygon:[[[12.71117,55.2666],[14.38109,55.29163],[19.65453,57.24934],[19.85228,59.75087],[17.77587,61.13794],[18.06151,62.27815],[20.97289,63.5779],[24.35668,65.60842],[23.96117,66.79191],[20.61034,66.45189],[17.13866,63.96632],[11.99706,61.03702],[12.29369,60.31607],[10.70067,58.81375],[12.71117,55.2666]]],terms_url:"https://www.lantmateriet.se",terms_text:"© Lantmäteriet",description:"Scan of \"Economic maps\" ca. 1950–1980",icon:"https://raw.githubusercontent.com/osmlab/editor-layer-index/gh-pages/sources/europe/se/lantmateriet_icon.png"},{id:"lantmateriet-orto1960",name:"Lantmäteriet Historic Orthophoto 1960",type:"wms",template:"https://api.lantmateriet.se/historiska-ortofoton/wms/v1/token/9b342b7d9f12d4ddb92277be9869d860/?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=OI.Histortho_60&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[5,19],polygon:[[[12.80182,55.19612],[14.22729,55.27286],[18.44604,56.69244],[19.74242,57.98481],[20.0061,59.5371],[19.08394,60.19308],[20.49499,63.2497],[24.25231,65.57437],[23.81835,67.92514],[23.23607,68.34655],[20.43456,69.17038],[18.08349,68.5644],[16.50145,67.88382],[14.43602,66.14275],[11.82128,63.30775],[12.20031,60.31063],[10.62377,58.5482],[12.64251,56.03062],[12.80182,55.19612]]],terms_url:"https://www.lantmateriet.se/",terms_text:"© Lantmäteriet, CC0",description:"Mosaic of Swedish orthophotos from the period 1955–1965. Older and younger pictures may occur.",icon:"https://raw.githubusercontent.com/osmlab/editor-layer-index/gh-pages/sources/europe/se/lantmateriet_icon.png"},{id:"lantmateriet-orto1975",name:"Lantmäteriet Historic Orthophoto 1975",type:"wms",template:"https://api.lantmateriet.se/historiska-ortofoton/wms/v1/token/9b342b7d9f12d4ddb92277be9869d860/?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=OI.Histortho_75&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[5,19],polygon:[[[12.80182,55.19612],[14.22729,55.27286],[18.44604,56.69244],[19.74242,57.98481],[20.0061,59.5371],[17.85131,60.87407],[14.74558,60.53889],[11.60239,59.56416],[10.51799,58.66559],[12.64251,56.03062],[12.80182,55.19612]]],terms_url:"https://www.lantmateriet.se/",terms_text:"© Lantmäteriet, CC0",description:"Mosaic of Swedish orthophotos from the period 1970–1980. Is under construction.",icon:"https://raw.githubusercontent.com/osmlab/editor-layer-index/gh-pages/sources/europe/se/lantmateriet_icon.png"},{id:"lantmateriet-topowebb",name:"Lantmäteriet Topographic Map",type:"tms",template:"https://api.lantmateriet.se/open/topowebb-ccby/v1/wmts/token/9b342b7d9f12d4ddb92277be9869d860/1.0.0/topowebb/default/3857/{zoom}/{y}/{x}.png",zoomExtent:[3,15],polygon:[[[12.80182,55.19612],[14.22729,55.27286],[18.44604,56.69244],[19.74242,57.98481],[20.0061,59.5371],[19.08394,60.19308],[20.49499,63.2497],[24.25231,65.57437],[23.81835,67.92514],[23.23607,68.34655],[20.43456,69.17038],[18.08349,68.5644],[16.50145,67.88382],[14.43602,66.14275],[11.82128,63.30775],[12.20031,60.31063],[10.62377,58.5482],[12.64251,56.03062],[12.80182,55.19612]]],terms_url:"https://www.lantmateriet.se/",terms_text:"© Lantmäteriet, CC0",description:"Topographic map of Sweden 1:50 000",icon:"https://raw.githubusercontent.com/osmlab/editor-layer-index/gh-pages/sources/europe/se/lantmateriet_icon.png"},{id:"lu.geoportail.opendata.ortholatest",name:"Latest available ortho geoportail.lu",type:"tms",template:"https://{switch:wmts1,wmts2}.geoportail.lu/opendata/wmts/ortho_latest/GLOBAL_WEBMERCATOR_4_V3/{zoom}/{x}/{y}.jpeg",endDate:"2017-06-22T00:00:00.000Z",startDate:"2017-06-14T00:00:00.000Z",zoomExtent:[0,20],polygon:[[[5.96175,50.17631],[6.02627,50.18496],[6.03318,50.16395],[6.06069,50.15536],[6.07668,50.15913],[6.07824,50.17255],[6.10176,50.17199],[6.1225,50.16437],[6.1201,50.15594],[6.1277,50.14993],[6.11323,50.13739],[6.12369,50.13719],[6.14093,50.1305],[6.13555,50.11899],[6.13808,50.10263],[6.13108,50.09964],[6.13547,50.09119],[6.12194,50.09059],[6.12634,50.07817],[6.13186,50.07348],[6.12117,50.064],[6.11444,50.06139],[6.11563,50.05817],[6.12361,50.06323],[6.13661,50.04178],[6.13034,50.02975],[6.14821,50.02307],[6.13868,50.01572],[6.13594,50.01485],[6.13138,50.01905],[6.13024,50.01819],[6.13934,50.01116],[6.1517,50.01058],[6.14546,49.99689],[6.13966,49.9994],[6.13852,49.99829],[6.14218,49.99535],[6.15023,49.99518],[6.15625,49.98867],[6.17305,49.98589],[6.17348,49.98344],[6.17035,49.98376],[6.16549,49.97115],[6.17151,49.96298],[6.1763,49.962],[6.17995,49.95386],[6.18339,49.9548],[6.17983,49.96307],[6.18331,49.9686],[6.19277,49.97158],[6.19978,49.95352],[6.20707,49.95672],[6.21269,49.9514],[6.22502,49.95039],[6.22044,49.94369],[6.22824,49.93726],[6.22635,49.92766],[6.21913,49.92354],[6.22986,49.92125],[6.23603,49.91355],[6.23187,49.91064],[6.22769,49.91062],[6.23229,49.9072],[6.23381,49.90028],[6.24692,49.89535],[6.25781,49.88724],[6.26301,49.88101],[6.27646,49.87725],[6.28113,49.87957],[6.29166,49.87548],[6.2977,49.86673],[6.30989,49.87107],[6.31532,49.8673],[6.31465,49.86057],[6.32361,49.85188],[6.32158,49.8409],[6.32741,49.83673],[6.33656,49.83998],[6.33937,49.8507],[6.36465,49.85164],[6.4022,49.82098],[6.42643,49.81629],[6.42807,49.81186],[6.43097,49.81129],[6.44161,49.81547],[6.44344,49.81233],[6.45366,49.81275],[6.46454,49.81975],[6.47057,49.82385],[6.49681,49.81277],[6.50669,49.80993],[6.51155,49.80238],[6.51485,49.80513],[6.5196,49.81446],[6.52981,49.81048],[6.53225,49.80686],[6.53083,49.80116],[6.50622,49.78899],[6.51917,49.78344],[6.51105,49.77422],[6.52056,49.76818],[6.52052,49.76134],[6.50373,49.75086],[6.50263,49.73298],[6.50727,49.72938],[6.51809,49.7242],[6.51642,49.72129],[6.51176,49.72016],[6.50479,49.725],[6.49891,49.72639],[6.49558,49.72443],[6.50712,49.71655],[6.50788,49.71215],[6.5046,49.71227],[6.42714,49.66237],[6.4399,49.66025],[6.44251,49.65591],[6.42178,49.61809],[6.39898,49.60094],[6.37941,49.59526],[6.37551,49.58809],[6.38443,49.5801],[6.38119,49.57509],[6.36909,49.5783],[6.35791,49.57166],[6.3849,49.55817],[6.38009,49.54856],[6.35855,49.53296],[6.35932,49.52481],[6.37076,49.50545],[6.37056,49.45732],[6.3334,49.46493],[6.32189,49.47244],[6.29503,49.47928],[6.28789,49.48379],[6.27191,49.49995],[6.24133,49.50693],[6.19669,49.50331],[6.17337,49.50577],[6.16086,49.50085],[6.1671,49.49006],[6.14018,49.48525],[6.12937,49.48803],[6.12725,49.47081],[6.1014,49.46726],[6.10483,49.45076],[6.08167,49.45417],[6.07722,49.46139],[6.05917,49.46306],[6.05222,49.46028],[6.04421,49.44553],[6.02529,49.44703],[6.02154,49.45127],[6.01574,49.44885],[5.99412,49.45301],[5.97657,49.44885],[5.97773,49.45955],[5.97232,49.46087],[5.96891,49.48202],[5.9616,49.49026],[5.91578,49.49835],[5.89033,49.4948],[5.86332,49.50006],[5.84897,49.50826],[5.84828,49.51397],[5.83641,49.51817],[5.83187,49.52639],[5.84308,49.53081],[5.83562,49.54114],[5.81625,49.53325],[5.8052,49.54272],[5.85943,49.57158],[5.86866,49.587],[5.86289,49.58525],[5.8511,49.58379],[5.84712,49.58961],[5.84565,49.5981],[5.8694,49.6106],[5.88182,49.63815],[5.89998,49.63907],[5.89934,49.66239],[5.85656,49.67628],[5.85628,49.68211],[5.8757,49.71118],[5.86481,49.72331],[5.84325,49.71822],[5.82191,49.72128],[5.82489,49.73767],[5.82073,49.74878],[5.78626,49.79079],[5.76517,49.78961],[5.75094,49.79094],[5.74159,49.82126],[5.74581,49.82435],[5.7372,49.83353],[5.74053,49.84142],[5.74701,49.84048],[5.74624,49.84783],[5.75399,49.84878],[5.74066,49.85152],[5.75229,49.85922],[5.74955,49.87554],[5.77567,49.87438],[5.77505,49.88057],[5.7346,49.89341],[5.73303,49.90285],[5.75783,49.91737],[5.76039,49.93252],[5.77073,49.93711],[5.76878,49.94239],[5.7688,49.96104],[5.78672,49.96816],[5.80524,49.96677],[5.80652,49.97321],[5.83129,49.97995],[5.83462,49.98656],[5.81806,49.99936],[5.81561,50.01437],[5.84792,50.02809],[5.86189,50.04581],[5.85087,50.0563],[5.85781,50.07186],[5.881,50.08069],[5.89196,50.12041],[5.95286,50.13384],[5.96175,50.17631]]],terms_url:"https://data.public.lu/en/datasets/bd-l-ortho-webservices-wms-et-wmts",terms_text:"Administration du Cadastre et de la Topographie",best:true,icon:"https://www.geoportail.lu/static/img/lion.png"},{id:"landsat_047026",name:"Latest southwest British Columbia Landsat",type:"tms",template:"http://{switch:a,b,c,d}.tile.paulnorman.ca/landsat_047026/{zoom}/{x}/{y}.png",endDate:"2013-09-12T00:00:00.000Z",startDate:"2013-09-12T00:00:00.000Z",zoomExtent:[5,13],polygon:[[[-121.93555,47.78206],[-121.57206,48.64101],[-121.20155,49.48462],[-121.83755,49.60232],[-122.4767,49.71617],[-123.11891,49.82688],[-123.76023,49.93358],[-124.08877,49.08705],[-124.41289,48.22526],[-123.79277,48.11973],[-123.17279,48.01096],[-122.55355,47.89823],[-121.93555,47.78206]]],description:"Recent lower-resolution landsat imagery for southwest British Columbia"},{id:"Lausanne-2012",name:"Lausanne - Orthophoto technique 2012",type:"tms",template:"http://osmdata.asitvd.ch/tiles/lausanne2012/{zoom}/{x}/{y}.png",endDate:"2012-01-01T00:00:00.000Z",startDate:"2012-01-01T00:00:00.000Z",zoomExtent:[14,20],polygon:[[[6.66668,46.49441],[6.61637,46.49406],[6.61636,46.49836],[6.60135,46.49825],[6.60131,46.50227],[6.55923,46.50194],[6.55773,46.59687],[6.72895,46.59805],[6.7304,46.49004],[6.67702,46.48978],[6.67703,46.49011],[6.67345,46.49006],[6.67347,46.49041],[6.66672,46.49036],[6.66668,46.49441]]],terms_url:"http://carto.lausanne.ch/lausanne-gc/",terms_text:"Ville de Lausanne - Orthophoto technique 2012"},{id:"linkoping-orto",name:"Linköping Orthophoto",type:"wms",template:"http://kartan.linkoping.se/wms?servicename=wms_ortofoto&FORMAT=image/jpeg&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Kommun_2010_25cm&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[13,20],polygon:[[[15.36884,58.6305],[15.41279,58.65623],[15.46635,58.6339],[15.54291,58.64408],[15.54119,58.60672],[15.58376,58.6414],[15.7592,58.55267],[15.76675,58.52006],[15.91438,58.51755],[16.08089,58.37148],[15.82718,58.30588],[15.84915,58.21449],[15.65861,58.15513],[15.56763,58.19134],[15.55939,58.14661],[15.50171,58.07679],[15.37777,58.05881],[15.28713,58.1031],[15.27203,58.13483],[15.35889,58.16455],[15.32387,58.38012],[15.24971,58.40027],[15.3582,58.47288],[15.36884,58.6305]]],terms_url:"https://www.linkoping.se/open/",terms_text:"© Linköping municipality",best:true,description:"Orthophotos from the municipality of Linköping 2010, open data",icon:"https://upload.wikimedia.org/wikipedia/commons/thumb/2/29/Linköping_vapen.svg/198px-Linköping_vapen.svg.png"},{id:"LINZ_NZ_Aerial_Imagery",name:"LINZ NZ Aerial Imagery",type:"tms",template:"https://tiles-a.data-cdn.linz.govt.nz/services;key=3197c6d0e5cb494a95d58dc2de3216c2/tiles/v4/set=2/EPSG:3857/{zoom}/{x}/{y}.png",zoomExtent:[0,21],polygon:[[[167.25037,-47.21957],[167.24487,-47.28016],[167.50305,-47.37975],[168.25012,-47.1561],[168.74451,-46.7963],[169.32678,-46.75492],[169.78271,-46.60417],[170.42542,-46.11133],[170.80444,-45.95115],[170.95276,-45.44086],[171.30981,-44.91036],[171.40869,-44.39062],[172.56226,-43.92955],[172.90283,-43.9691],[173.16101,-43.90977],[173.25989,-43.69568],[172.97424,-43.5366],[172.76001,-43.37711],[173.15002,-43.17714],[173.70483,-42.63396],[174.36401,-41.7836],[174.32007,-41.40978],[174.84741,-41.52914],[175.07263,-41.70573],[175.50659,-41.67291],[176.2262,-41.10833],[176.83044,-40.42604],[177.17102,-39.67337],[177.03918,-39.39375],[177.44568,-39.18118],[177.60498,-39.33005],[177.97852,-39.36828],[178.33557,-38.65978],[178.70911,-37.74466],[178.62671,-37.54458],[178.3136,-37.43125],[177.62146,-37.37889],[177.03918,-37.39635],[176.56128,-37.37016],[176.33606,-37.05956],[176.00647,-36.29742],[175.67688,-36.05354],[174.67163,-35.1783],[173.19397,-34.28445],[172.67761,-34.23451],[172.38647,-34.40238],[172.47986,-34.71904],[172.98523,-35.32185],[173.56201,-36.14231],[174.30908,-37.07709],[174.55627,-38.05242],[174.47937,-38.65549],[174.32556,-38.86537],[173.79822,-38.95941],[173.60596,-39.23225],[173.69934,-39.56335],[174.58923,-39.95607],[174.98474,-40.21664],[174.98474,-40.49292],[174.72107,-40.80549],[174.14978,-40.65147],[173.28186,-40.4344],[172.58972,-40.35073],[172.08435,-40.53468],[171.76575,-40.82628],[171.57349,-41.39742],[171.28235,-41.65239],[170.87585,-42.53284],[170.354,-42.87194],[168.27759,-43.92955],[167.6239,-44.47691],[166.55273,-45.38688],[166.27258,-45.91677],[166.48132,-46.22545],[167.67883,-46.47192],[167.25037,-47.21957]]],terms_url:"https://www.linz.govt.nz/data/licensing-and-using-data/attributing-elevation-or-aerial-imagery-data",terms_text:"Sourced from LINZ CC-BY 4.0",best:true,icon:"https://koordinates.a.ssl.fastly.net/media/settings/branding/favicon-lds.ico"},{id:"LINZ_NZ_Topo50_Gridless_Maps",name:"LINZ NZ Topo50 Gridless Maps",type:"tms",template:"https://tiles-a.data-cdn.linz.govt.nz/services;key=3197c6d0e5cb494a95d58dc2de3216c2/tiles/v4/layer=2343/EPSG:3857/{zoom}/{x}/{y}.png",zoomExtent:[0,21],polygon:[[[167.25037,-47.21957],[167.24487,-47.28016],[167.50305,-47.37975],[168.25012,-47.1561],[168.74451,-46.7963],[169.32678,-46.75492],[169.78271,-46.60417],[170.42542,-46.11133],[170.80444,-45.95115],[170.95276,-45.44086],[171.30981,-44.91036],[171.40869,-44.39062],[172.56226,-43.92955],[172.90283,-43.9691],[173.16101,-43.90977],[173.25989,-43.69568],[172.97424,-43.5366],[172.76001,-43.37711],[173.15002,-43.17714],[173.70483,-42.63396],[174.36401,-41.7836],[174.32007,-41.40978],[174.84741,-41.52914],[175.07263,-41.70573],[175.50659,-41.67291],[176.2262,-41.10833],[176.83044,-40.42604],[177.17102,-39.67337],[177.03918,-39.39375],[177.44568,-39.18118],[177.60498,-39.33005],[177.97852,-39.36828],[178.33557,-38.65978],[178.70911,-37.74466],[178.62671,-37.54458],[178.3136,-37.43125],[177.62146,-37.37889],[177.03918,-37.39635],[176.56128,-37.37016],[176.33606,-37.05956],[176.00647,-36.29742],[175.67688,-36.05354],[174.67163,-35.1783],[173.19397,-34.28445],[172.67761,-34.23451],[172.38647,-34.40238],[172.47986,-34.71904],[172.98523,-35.32185],[173.56201,-36.14231],[174.30908,-37.07709],[174.55627,-38.05242],[174.47937,-38.65549],[174.32556,-38.86537],[173.79822,-38.95941],[173.60596,-39.23225],[173.69934,-39.56335],[174.58923,-39.95607],[174.98474,-40.21664],[174.98474,-40.49292],[174.72107,-40.80549],[174.14978,-40.65147],[173.28186,-40.4344],[172.58972,-40.35073],[172.08435,-40.53468],[171.76575,-40.82628],[171.57349,-41.39742],[171.28235,-41.65239],[170.87585,-42.53284],[170.354,-42.87194],[168.27759,-43.92955],[167.6239,-44.47691],[166.55273,-45.38688],[166.27258,-45.91677],[166.48132,-46.22545],[167.67883,-46.47192],[167.25037,-47.21957]]],terms_url:"https://data.linz.govt.nz/layer/2343-nz-mainland-topo50-gridless-maps",terms_text:"CC BY 4.0 Land Information New Zealand",icon:"https://koordinates.a.ssl.fastly.net/media/settings/branding/favicon-lds.ico"},{id:"ORT10LT",name:"Lithuania - NŽT ORT10LT",type:"tms",template:"https://ort10lt.openmap.lt/g16/{zoom}/{x}/{y}.jpeg",endDate:"2016-01-01T00:00:00.000Z",startDate:"2010-01-01T00:00:00.000Z",zoomExtent:[4,18],polygon:[[[26.21384,55.85075],[26.38583,55.70453],[26.63036,55.68067],[26.62053,55.56892],[26.52422,55.50992],[26.55415,55.38883],[26.43993,55.34794],[26.79197,55.3212],[26.82913,55.27635],[26.74346,55.25399],[26.67648,55.15883],[26.46112,55.12856],[26.35774,55.15054],[26.22963,55.10732],[26.27138,55.07759],[26.20851,54.99741],[26.06191,54.94161],[25.85782,54.9276],[25.74298,54.81506],[25.76261,54.5769],[25.53194,54.34182],[25.67716,54.32381],[25.78573,54.23362],[25.78588,54.15506],[25.55508,54.14619],[25.51095,54.17503],[25.58967,54.22858],[25.51362,54.30785],[25.26893,54.27447],[25.0706,54.13363],[24.95737,54.17206],[24.81338,54.14486],[24.77902,54.09991],[24.87128,54.0349],[24.81957,53.99772],[24.68459,53.96211],[24.69787,54.01714],[24.62591,54.0105],[24.43426,53.90144],[24.35206,53.89679],[24.20161,53.97001],[23.96833,53.9267],[23.91302,53.96968],[23.77812,53.89892],[23.70977,53.93945],[23.53704,53.94307],[23.48224,53.98938],[23.52734,54.04735],[23.48586,54.15323],[23.38679,54.22484],[23.04212,54.31597],[23.01021,54.3828],[22.85469,54.4104],[22.792,54.36332],[22.70234,54.4529],[22.68386,54.58597],[22.74897,54.63198],[22.74297,54.72682],[22.88668,54.8135],[22.8204,54.91198],[22.6424,54.97134],[22.58924,55.07024],[22.0806,55.02448],[22.03241,55.0841],[21.91307,55.08168],[21.64919,55.18081],[21.50151,55.18682],[21.38437,55.2937],[21.27098,55.24501],[21.09836,55.25639],[20.94217,55.28245],[21.08635,55.56183],[21.03995,55.83636],[21.06403,56.06995],[21.20478,56.08117],[21.2308,56.16233],[21.5021,56.2955],[21.72359,56.31382],[21.83566,56.37162],[21.96954,56.37665],[22.0153,56.42428],[22.43727,56.4064],[22.68,56.35159],[22.91917,56.37902],[22.94668,56.41465],[23.09325,56.30464],[23.17034,56.36677],[23.30645,56.38305],[23.55717,56.33382],[23.7648,56.37332],[23.76669,56.32381],[24.019,56.32976],[24.12146,56.2489],[24.28574,56.30064],[24.45415,56.25816],[24.57947,56.28824],[24.62841,56.37533],[24.90238,56.48053],[25.12774,56.20591],[25.57714,56.18241],[25.67312,56.14937],[26.21384,55.85075]]],terms_url:"https://www.geoportal.lt",terms_text:"NŽT ORT10LT",best:true},{id:"mapbox_locator_overlay",name:"Locator Overlay",type:"tms",template:"https://{switch:a,b,c,d}.tiles.mapbox.com/v4/openstreetmap.map-inh76ba2/{zoom}/{x}/{y}.png?access_token=pk.eyJ1Ijoib3BlbnN0cmVldG1hcCIsImEiOiJjaml5MjVyb3MwMWV0M3hxYmUzdGdwbzE4In0.q548FjhsSJzvXsGlPsFxAQ",zoomExtent:[0,16],overzoom:false,terms_url:"https://www.mapbox.com/about/maps",terms_text:"Terms & Feedback","default":true,description:"Shows major features to help orient you.",overlay:true},{id:"Lodz-buildings",name:"Łódź: Buildings",type:"wms",template:"http://gis.mapa.lodz.pl/awiskts/services/WMS_publikowane/LODZ/MapServer/WMSServer?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Budynki,Ulice,Adresy&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",polygon:[[[19.55046,51.68509],[19.53843,51.68518],[19.53858,51.68067],[19.50381,51.68085],[19.50351,51.68564],[19.48084,51.68589],[19.48063,51.6815],[19.43517,51.68168],[19.43517,51.67754],[19.41155,51.67791],[19.41214,51.68703],[19.37723,51.68739],[19.37723,51.69172],[19.34216,51.692],[19.34291,51.70544],[19.33132,51.70572],[19.33176,51.71474],[19.31988,51.71493],[19.32077,51.74612],[19.33206,51.74612],[19.33251,51.75513],[19.32107,51.75532],[19.32225,51.79108],[19.31052,51.79126],[19.31141,51.81387],[19.323,51.81359],[19.32389,51.82709],[19.33488,51.82718],[19.33473,51.84481],[19.39342,51.84444],[19.39342,51.84022],[19.42789,51.83985],[19.42834,51.85738],[19.4634,51.85701],[19.4634,51.86133],[19.47499,51.86133],[19.47529,51.86601],[19.52194,51.86509],[19.52238,51.85619],[19.568,51.85582],[19.56785,51.85105],[19.57944,51.85105],[19.57825,51.82397],[19.63649,51.82342],[19.63411,51.76488],[19.65759,51.7647],[19.65714,51.74676],[19.64496,51.74695],[19.64421,51.7152],[19.63337,51.7152],[19.63322,51.70167],[19.62059,51.70167],[19.62044,51.68868],[19.55032,51.68942],[19.55046,51.68509]]],terms_text:"Urząd Miasta Łodzi",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/pl/dOrthophotomap2017(aerialimage).png"},{id:"Lodz-2015",name:"Łódź: Orthophotomap 2015 (aerial image)",type:"wms",template:"http://gis.mapa.lodz.pl/awiskts/services/Ortofotomapa/Ortofotomapa/MapServer/WMSServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",endDate:"2015-01-01T00:00:00.000Z",startDate:"2015-01-01T00:00:00.000Z",zoomExtent:[0,22],polygon:[[[19.55046,51.68509],[19.53843,51.68518],[19.53858,51.68067],[19.50381,51.68085],[19.50351,51.68564],[19.48084,51.68589],[19.48063,51.6815],[19.43517,51.68168],[19.43517,51.67754],[19.41155,51.67791],[19.41214,51.68703],[19.37723,51.68739],[19.37723,51.69172],[19.34216,51.692],[19.34291,51.70544],[19.33132,51.70572],[19.33176,51.71474],[19.31988,51.71493],[19.32077,51.74612],[19.33206,51.74612],[19.33251,51.75513],[19.32107,51.75532],[19.32225,51.79108],[19.31052,51.79126],[19.31141,51.81387],[19.323,51.81359],[19.32389,51.82709],[19.33488,51.82718],[19.33473,51.84481],[19.39342,51.84444],[19.39342,51.84022],[19.42789,51.83985],[19.42834,51.85738],[19.4634,51.85701],[19.4634,51.86133],[19.47499,51.86133],[19.47529,51.86601],[19.52194,51.86509],[19.52238,51.85619],[19.568,51.85582],[19.56785,51.85105],[19.57944,51.85105],[19.57825,51.82397],[19.63649,51.82342],[19.63411,51.76488],[19.65759,51.7647],[19.65714,51.74676],[19.64496,51.74695],[19.64421,51.7152],[19.63337,51.7152],[19.63322,51.70167],[19.62059,51.70167],[19.62044,51.68868],[19.55032,51.68942],[19.55046,51.68509]]],terms_text:"Urząd Miasta Łodzi",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/pl/dOrthophotomap2017(aerialimage).png"},{id:"Lodz-2017",name:"Łódź: Orthophotomap 2017 (aerial image)",type:"wms",template:"https://mapa.lodz.pl/3/services/OGC/Ortofotomapa/MapServer/WmsServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",endDate:"2017-01-01T00:00:00.000Z",startDate:"2017-01-01T00:00:00.000Z",zoomExtent:[0,22],polygon:[[[19.55046,51.68509],[19.53843,51.68518],[19.53858,51.68067],[19.50381,51.68085],[19.50351,51.68564],[19.48084,51.68589],[19.48063,51.6815],[19.43517,51.68168],[19.43517,51.67754],[19.41155,51.67791],[19.41214,51.68703],[19.37723,51.68739],[19.37723,51.69172],[19.34216,51.692],[19.34291,51.70544],[19.33132,51.70572],[19.33176,51.71474],[19.31988,51.71493],[19.32077,51.74612],[19.33206,51.74612],[19.33251,51.75513],[19.32107,51.75532],[19.32225,51.79108],[19.31052,51.79126],[19.31141,51.81387],[19.323,51.81359],[19.32389,51.82709],[19.33488,51.82718],[19.33473,51.84481],[19.39342,51.84444],[19.39342,51.84022],[19.42789,51.83985],[19.42834,51.85738],[19.4634,51.85701],[19.4634,51.86133],[19.47499,51.86133],[19.47529,51.86601],[19.52194,51.86509],[19.52238,51.85619],[19.568,51.85582],[19.56785,51.85105],[19.57944,51.85105],[19.57825,51.82397],[19.63649,51.82342],[19.63411,51.76488],[19.65759,51.7647],[19.65714,51.74676],[19.64496,51.74695],[19.64421,51.7152],[19.63337,51.7152],[19.63322,51.70167],[19.62059,51.70167],[19.62044,51.68868],[19.55032,51.68942],[19.55046,51.68509]]],terms_text:"Urząd Miasta Łodzi",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/pl/dOrthophotomap2017(aerialimage).png"},{id:"Loire_Atlantique-Orthophotos-2012",name:"Loire-Atlantique - Orthophotos 2012 - 20 cm",type:"tms",template:"http://{switch:a,b,c,d,e,f,g,h}.tiles.cg44.makina-corpus.net/ortho-2012/{zoom}/{x}/{-y}.jpg",endDate:"2012-01-01T00:00:00.000Z",startDate:"2012-01-01T00:00:00.000Z",zoomExtent:[0,19],polygon:[[[-1.48638,46.87691],[-1.54437,46.84873],[-1.73468,46.87246],[-1.89276,46.94234],[-1.95475,46.98084],[-2.07067,47.08521],[-2.2678,47.12656],[-2.22627,47.17124],[-2.19217,47.16914],[-2.19341,47.25546],[-2.29694,47.22769],[-2.41658,47.25336],[-2.54862,47.28575],[-2.63913,47.41678],[-2.50573,47.50812],[-2.31063,47.53021],[-2.24836,47.52384],[-2.23223,47.51499],[-2.12109,47.54674],[-2.11783,47.60126],[-2.1001,47.61123],[-2.09981,47.62005],[-2.11141,47.62873],[-2.10055,47.65141],[-2.08121,47.66578],[-1.98016,47.70751],[-1.83077,47.72419],[-1.67455,47.72544],[-1.63735,47.77463],[-1.49601,47.81752],[-1.49911,47.84166],[-1.38133,47.84415],[-1.346,47.81086],[-1.23007,47.78587],[-1.21643,47.75838],[-1.22635,47.73628],[-1.21086,47.7317],[-1.18668,47.73462],[-1.15196,47.69332],[-1.13151,47.63654],[-1.09121,47.6332],[-0.99265,47.6027],[-0.98459,47.58598],[-1.0317,47.55001],[-1.13585,47.55628],[-1.13275,47.5161],[-1.0317,47.51778],[-0.94863,47.50103],[-0.93686,47.47715],[-0.93376,47.43859],[-0.9009,47.39874],[-0.92694,47.37482],[-0.97157,47.35845],[-1.28339,47.32736],[-1.23379,47.26093],[-1.20032,47.26935],[-1.16498,47.24957],[-1.14143,47.1763],[-1.1563,47.15818],[-1.20652,47.12402],[-1.20838,47.10968],[-1.15568,47.10504],[-1.14081,47.08056],[-1.09431,47.0717],[-1.09989,47.03199],[-1.14453,47.01636],[-1.21582,47.02904],[-1.26727,47.06325],[-1.28524,47.02185],[-1.34972,47.02397],[-1.33918,46.969],[-1.3491,46.94446],[-1.45014,46.91186],[-1.47504,46.9176],[-1.48775,46.93063],[-1.49235,46.98433],[-1.48644,46.99943],[-1.49213,47.02722],[-1.52764,47.00541],[-1.52961,46.97252],[-1.50507,46.94439],[-1.50222,46.92973],[-1.51142,46.91371],[-1.48622,46.89724],[-1.48638,46.87691]]],terms_url:"http://data2.loire-atlantique.fr/licences/",terms_text:"Département de Loire-Atlantique"},{id:"Loire_Atlantique-Orthophotos-2016",name:"Loire-Atlantique - Orthophotos 2016 - 10 cm",type:"wms",template:"https://wms-vuduciel2.makina-corpus.net/geoserver/wms?SERVICE=WMS&FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=cg44:ortho44-2016&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2016-01-01T00:00:00.000Z",startDate:"2016-01-01T00:00:00.000Z",zoomExtent:[0,20],polygon:[[[-1.48638,46.87691],[-1.54437,46.84873],[-1.73468,46.87246],[-1.89276,46.94234],[-1.95475,46.98084],[-2.07067,47.08521],[-2.2678,47.12656],[-2.22627,47.17124],[-2.19217,47.16914],[-2.19341,47.25546],[-2.29694,47.22769],[-2.41658,47.25336],[-2.54862,47.28575],[-2.63913,47.41678],[-2.50573,47.50812],[-2.31063,47.53021],[-2.24836,47.52384],[-2.23223,47.51499],[-2.12109,47.54674],[-2.11783,47.60126],[-2.1001,47.61123],[-2.09981,47.62005],[-2.11141,47.62873],[-2.10055,47.65141],[-2.08121,47.66578],[-1.98016,47.70751],[-1.83077,47.72419],[-1.67455,47.72544],[-1.63735,47.77463],[-1.49601,47.81752],[-1.49911,47.84166],[-1.38133,47.84415],[-1.346,47.81086],[-1.23007,47.78587],[-1.21643,47.75838],[-1.22635,47.73628],[-1.21086,47.7317],[-1.18668,47.73462],[-1.15196,47.69332],[-1.13151,47.63654],[-1.09121,47.6332],[-0.99265,47.6027],[-0.98459,47.58598],[-1.0317,47.55001],[-1.13585,47.55628],[-1.13275,47.5161],[-1.0317,47.51778],[-0.94863,47.50103],[-0.93686,47.47715],[-0.93376,47.43859],[-0.9009,47.39874],[-0.92694,47.37482],[-0.97157,47.35845],[-1.28339,47.32736],[-1.23379,47.26093],[-1.20032,47.26935],[-1.16498,47.24957],[-1.14143,47.1763],[-1.1563,47.15818],[-1.20652,47.12402],[-1.20838,47.10968],[-1.15568,47.10504],[-1.14081,47.08056],[-1.09431,47.0717],[-1.09989,47.03199],[-1.14453,47.01636],[-1.21582,47.02904],[-1.26727,47.06325],[-1.28524,47.02185],[-1.34972,47.02397],[-1.33918,46.969],[-1.3491,46.94446],[-1.45014,46.91186],[-1.47504,46.9176],[-1.48775,46.93063],[-1.49235,46.98433],[-1.48644,46.99943],[-1.49213,47.02722],[-1.52764,47.00541],[-1.52961,46.97252],[-1.50507,46.94439],[-1.50222,46.92973],[-1.51142,46.91371],[-1.48622,46.89724],[-1.48638,46.87691]]],terms_url:"http://data2.loire-atlantique.fr/licences/",terms_text:"© Loire-Atlantique ouverture des données publiques"},{id:"Lombardia-Italy-CTR-DBT",name:"Lombardia - Italy (CTR DBT)",type:"wms",template:"https://www.cartografia.servizirl.it/arcgis/services/wms/ctr_wms/MapServer/WmsServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Sfondo%20C.T.R.%2010000&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[8.4816,45.28938],[8.63085,45.01372],[8.78009,44.98189],[8.86775,45.02712],[9.07148,44.80063],[9.14966,44.79055],[9.19467,44.67106],[9.31549,44.65758],[9.36997,44.698],[9.37945,44.82752],[9.33207,44.91483],[9.41025,45.03716],[9.78692,45.04386],[9.78692,45.00032],[9.93853,45.002],[9.93379,45.08903],[10.00013,45.09071],[10.00013,44.99697],[10.20149,45.002],[10.20149,44.95004],[10.40523,44.9534],[10.40523,44.90476],[10.49288,44.90308],[10.49288,44.8628],[10.6516,44.85776],[10.64686,44.90308],[11.35282,44.89469],[11.35519,44.93663],[11.45706,44.93328],[11.44758,44.97351],[11.3623,45.00032],[11.35282,45.09238],[11.25806,45.09572],[11.25806,45.13752],[11.16094,45.14253],[11.16094,45.18262],[11.05196,45.19097],[11.05196,45.23436],[10.9572,45.23269],[10.9572,45.28605],[10.8577,45.28438],[10.85534,45.32271],[10.74636,45.32937],[10.75347,45.47408],[10.64686,45.48073],[10.60301,45.51074],[10.57636,45.47379],[10.53549,45.50036],[10.59116,45.53148],[10.61666,45.61304],[10.87429,45.84001],[10.82217,45.85982],[10.67529,45.85817],[10.57342,45.8103],[10.58624,46.00773],[10.5016,46.01596],[10.59325,46.11529],[10.60896,46.35583],[10.65634,46.38688],[10.64686,46.46037],[10.4147,46.57285],[10.32705,46.56797],[10.25124,46.65422],[10.07357,46.62494],[10.02382,46.53212],[10.02855,46.43588],[10.07357,46.39832],[10.12095,46.39669],[10.0783,46.32802],[10.14464,46.26582],[10.10436,46.24781],[9.97407,46.40812],[9.71111,46.3689],[9.68742,46.32312],[9.61872,46.30675],[9.55712,46.32475],[9.50264,46.39015],[9.47895,46.5256],[9.25626,46.51582],[9.22546,46.44078],[9.27284,46.34438],[9.17098,46.19044],[9.04305,46.12808],[9.062,46.09195],[8.97435,46.04593],[8.98856,46.00152],[8.93882,45.97354],[9.04068,45.8961],[9.01936,45.84827],[8.84879,46.0081],[8.89854,46.07059],[8.8251,46.11823],[8.70902,46.11659],[8.67823,46.07552],[8.7185,46.01468],[8.55504,45.90434],[8.59768,45.83836],[8.53372,45.79378],[8.6877,45.49235],[8.78009,45.41591],[8.68533,45.37931],[8.71139,45.34103],[8.69481,45.32104],[8.62848,45.37765],[8.5124,45.35768],[8.4816,45.28938]]],terms_url:"https://www.dati.gov.it/content/italian-open-data-license-v20",terms_text:"CTR DBT 10000 Regione Lombardia"},{id:"Lombardia-Italy-CTR",name:"Lombardia - Italy (CTR)",type:"wms",template:"https://www.cartografia.regione.lombardia.it/ArcGIS10/services/wms/ctr_wms/MapServer/WMSServer?STYLES=&FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&Layers=0&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[8.4816,45.28938],[8.63085,45.01372],[8.78009,44.98189],[8.86775,45.02712],[9.07148,44.80063],[9.14966,44.79055],[9.19467,44.67106],[9.31549,44.65758],[9.36997,44.698],[9.37945,44.82752],[9.33207,44.91483],[9.41025,45.03716],[9.78692,45.04386],[9.78692,45.00032],[9.93853,45.002],[9.93379,45.08903],[10.00013,45.09071],[10.00013,44.99697],[10.20149,45.002],[10.20149,44.95004],[10.40523,44.9534],[10.40523,44.90476],[10.49288,44.90308],[10.49288,44.8628],[10.6516,44.85776],[10.64686,44.90308],[11.35282,44.89469],[11.35519,44.93663],[11.45706,44.93328],[11.44758,44.97351],[11.3623,45.00032],[11.35282,45.09238],[11.25806,45.09572],[11.25806,45.13752],[11.16094,45.14253],[11.16094,45.18262],[11.05196,45.19097],[11.05196,45.23436],[10.9572,45.23269],[10.9572,45.28605],[10.8577,45.28438],[10.85534,45.32271],[10.74636,45.32937],[10.75347,45.47408],[10.64686,45.48073],[10.60301,45.51074],[10.57636,45.47379],[10.53549,45.50036],[10.59116,45.53148],[10.61666,45.61304],[10.87429,45.84001],[10.82217,45.85982],[10.67529,45.85817],[10.57342,45.8103],[10.58624,46.00773],[10.5016,46.01596],[10.59325,46.11529],[10.60896,46.35583],[10.65634,46.38688],[10.64686,46.46037],[10.4147,46.57285],[10.32705,46.56797],[10.25124,46.65422],[10.07357,46.62494],[10.02382,46.53212],[10.02855,46.43588],[10.07357,46.39832],[10.12095,46.39669],[10.0783,46.32802],[10.14464,46.26582],[10.10436,46.24781],[9.97407,46.40812],[9.71111,46.3689],[9.68742,46.32312],[9.61872,46.30675],[9.55712,46.32475],[9.50264,46.39015],[9.47895,46.5256],[9.25626,46.51582],[9.22546,46.44078],[9.27284,46.34438],[9.17098,46.19044],[9.04305,46.12808],[9.062,46.09195],[8.97435,46.04593],[8.98856,46.00152],[8.93882,45.97354],[9.04068,45.8961],[9.01936,45.84827],[8.84879,46.0081],[8.89854,46.07059],[8.8251,46.11823],[8.70902,46.11659],[8.67823,46.07552],[8.7185,46.01468],[8.55504,45.90434],[8.59768,45.83836],[8.53372,45.79378],[8.6877,45.49235],[8.78009,45.41591],[8.68533,45.37931],[8.71139,45.34103],[8.69481,45.32104],[8.62848,45.37765],[8.5124,45.35768],[8.4816,45.28938]]],terms_url:"https://www.dati.gov.it/content/italian-open-data-license-v20",terms_text:"Regione Lombardia - Infrastruttura per l'informazione territoriale"},{id:"londrina2011",name:"Londrina Ortofoto 2011",type:"tms",template:"https://siglon.londrina.pr.gov.br/arcgis/rest/services/Imagens/Ortofotos_2011_Paranacidade/MapServer/WMTS/tile/1.0.0/Imagens_Ortofotos_2011_Paranacidade/default/GoogleMapsCompatible/{zoom}/{y}/{x}",endDate:"2011-01-01T00:00:00.000Z",startDate:"2011-01-01T00:00:00.000Z",zoomExtent:[0,19],polygon:[[[-51.10903,-23.39275],[-51.11015,-23.39112],[-51.11198,-23.3896],[-51.11358,-23.38977],[-51.121,-23.38593],[-51.12225,-23.38511],[-51.12483,-23.3835],[-51.12538,-23.38187],[-51.12482,-23.3777],[-51.12446,-23.37505],[-51.12437,-23.3723],[-51.12244,-23.37033],[-51.12302,-23.36643],[-51.12856,-23.36548],[-51.12832,-23.35884],[-51.12477,-23.35476],[-51.12703,-23.35091],[-51.12412,-23.3468],[-51.12025,-23.34781],[-51.11765,-23.33969],[-51.11265,-23.34129],[-51.1094,-23.33489],[-51.10756,-23.33409],[-51.10486,-23.33398],[-51.10253,-23.33419],[-51.09987,-23.33102],[-51.09801,-23.32936],[-51.09999,-23.32831],[-51.10323,-23.32532],[-51.10473,-23.32319],[-51.10466,-23.32129],[-51.10515,-23.31844],[-51.10636,-23.31575],[-51.10661,-23.31467],[-51.1105,-23.31167],[-51.11158,-23.30842],[-51.0995,-23.30947],[-51.0974,-23.30863],[-51.09512,-23.30745],[-51.09202,-23.30494],[-51.09036,-23.30371],[-51.09205,-23.29875],[-51.09269,-23.2975],[-51.09408,-23.29295],[-51.10074,-23.29332],[-51.10102,-23.28871],[-51.10068,-23.28837],[-51.10085,-23.28778],[-51.09938,-23.28664],[-51.09632,-23.27791],[-51.10285,-23.27302],[-51.10836,-23.27034],[-51.1131,-23.2684],[-51.1316,-23.26534],[-51.13188,-23.26201],[-51.13173,-23.25506],[-51.1329,-23.25468],[-51.13296,-23.25075],[-51.13474,-23.25127],[-51.13534,-23.25133],[-51.13517,-23.24359],[-51.13535,-23.24118],[-51.13752,-23.24219],[-51.13885,-23.2435],[-51.14109,-23.24521],[-51.14717,-23.24318],[-51.14761,-23.23828],[-51.14908,-23.23588],[-51.14977,-23.23681],[-51.15139,-23.23854],[-51.15289,-23.23884],[-51.15384,-23.23895],[-51.1582,-23.23814],[-51.16045,-23.23816],[-51.16035,-23.24658],[-51.15912,-23.24783],[-51.16131,-23.24777],[-51.16659,-23.24594],[-51.17193,-23.24582],[-51.17205,-23.24956],[-51.17424,-23.2484],[-51.17514,-23.24932],[-51.17686,-23.24816],[-51.17947,-23.25169],[-51.18135,-23.25381],[-51.18274,-23.25363],[-51.18379,-23.25326],[-51.18496,-23.2533],[-51.18627,-23.25215],[-51.18665,-23.24748],[-51.19118,-23.24914],[-51.19142,-23.25286],[-51.19369,-23.25278],[-51.19384,-23.26074],[-51.20097,-23.26055],[-51.20127,-23.2426],[-51.20994,-23.24278],[-51.2109,-23.26988],[-51.21969,-23.27222],[-51.22597,-23.27453],[-51.22934,-23.2786],[-51.23452,-23.2816],[-51.23498,-23.28325],[-51.23507,-23.28544],[-51.23371,-23.2859],[-51.23216,-23.28802],[-51.2287,-23.29229],[-51.2274,-23.2946],[-51.22679,-23.29548],[-51.2256,-23.29657],[-51.22393,-23.29721],[-51.22048,-23.30073],[-51.21864,-23.3013],[-51.21668,-23.30212],[-51.21424,-23.30441],[-51.21097,-23.30697],[-51.22328,-23.3183],[-51.22439,-23.31459],[-51.22521,-23.31289],[-51.22512,-23.31258],[-51.22521,-23.31251],[-51.22553,-23.31253],[-51.22595,-23.31239],[-51.22617,-23.31183],[-51.22936,-23.31489],[-51.22802,-23.31661],[-51.22789,-23.31902],[-51.22767,-23.32023],[-51.22723,-23.32151],[-51.22739,-23.32223],[-51.22725,-23.32285],[-51.23033,-23.32558],[-51.23046,-23.32671],[-51.22954,-23.32789],[-51.22916,-23.3305],[-51.22929,-23.33178],[-51.22681,-23.33447],[-51.22602,-23.33657],[-51.22473,-23.33839],[-51.2221,-23.34023],[-51.22257,-23.34196],[-51.22381,-23.34339],[-51.22384,-23.34531],[-51.22441,-23.347],[-51.22454,-23.34829],[-51.22404,-23.34968],[-51.22351,-23.35011],[-51.22382,-23.35077],[-51.22305,-23.35174],[-51.2226,-23.35296],[-51.22587,-23.35481],[-51.2265,-23.36706],[-51.22354,-23.36915],[-51.22367,-23.37968],[-51.22038,-23.38163],[-51.21647,-23.3817],[-51.21416,-23.37995],[-51.20928,-23.37395],[-51.20738,-23.36814],[-51.20629,-23.36723],[-51.20472,-23.36627],[-51.19823,-23.36668],[-51.19297,-23.36651],[-51.18986,-23.36544],[-51.18806,-23.36464],[-51.18718,-23.36453],[-51.1858,-23.36374],[-51.18304,-23.36359],[-51.18071,-23.36376],[-51.17907,-23.36158],[-51.17764,-23.35836],[-51.16684,-23.35626],[-51.16614,-23.35854],[-51.16476,-23.36039],[-51.16077,-23.35922],[-51.15983,-23.3666],[-51.16204,-23.36861],[-51.16276,-23.37416],[-51.15845,-23.3758],[-51.15505,-23.37631],[-51.15396,-23.37903],[-51.15299,-23.38105],[-51.15119,-23.38208],[-51.14917,-23.38251],[-51.14722,-23.38216],[-51.14518,-23.38259],[-51.1441,-23.38376],[-51.14512,-23.38808],[-51.1418,-23.3894],[-51.14031,-23.3888],[-51.14068,-23.39161],[-51.14127,-23.39354],[-51.14094,-23.39443],[-51.14046,-23.39536],[-51.13939,-23.3951],[-51.13739,-23.39315],[-51.13609,-23.3898],[-51.13429,-23.38976],[-51.13216,-23.39007],[-51.13172,-23.39286],[-51.12259,-23.38864],[-51.12228,-23.39166],[-51.11883,-23.39317],[-51.11568,-23.39335],[-51.10903,-23.39275]],[[-51.13829,-23.41601],[-51.13331,-23.41867],[-51.13209,-23.41644],[-51.13002,-23.41829],[-51.12869,-23.41901],[-51.12824,-23.42103],[-51.12696,-23.42186],[-51.12533,-23.42269],[-51.12445,-23.42097],[-51.12151,-23.42411],[-51.12063,-23.42327],[-51.11971,-23.42312],[-51.11977,-23.42157],[-51.1188,-23.42155],[-51.11643,-23.42084],[-51.11943,-23.41917],[-51.11787,-23.41678],[-51.11655,-23.41731],[-51.1157,-23.4157],[-51.11512,-23.41309],[-51.11908,-23.41111],[-51.1196,-23.4117],[-51.12052,-23.41489],[-51.12148,-23.41714],[-51.12309,-23.41863],[-51.12755,-23.41654],[-51.12803,-23.4174],[-51.1312,-23.41557],[-51.1308,-23.41477],[-51.13279,-23.41264],[-51.13522,-23.41106],[-51.13586,-23.41096],[-51.13682,-23.41119],[-51.13721,-23.41158],[-51.1373,-23.41324],[-51.13743,-23.41471],[-51.13829,-23.41601]],[[-51.18929,-23.61469],[-51.18869,-23.61385],[-51.18818,-23.61339],[-51.18731,-23.61302],[-51.18629,-23.61314],[-51.18402,-23.61396],[-51.18349,-23.61397],[-51.18183,-23.61284],[-51.1814,-23.61344],[-51.18063,-23.61314],[-51.18001,-23.61409],[-51.17866,-23.61329],[-51.18065,-23.6106],[-51.17972,-23.61018],[-51.18062,-23.60849],[-51.18212,-23.6085],[-51.18261,-23.60775],[-51.1832,-23.60804],[-51.18415,-23.60628],[-51.18511,-23.60666],[-51.18649,-23.6047],[-51.18902,-23.6061],[-51.18821,-23.60742],[-51.18919,-23.60802],[-51.1889,-23.60953],[-51.18962,-23.60993],[-51.19119,-23.61119],[-51.19015,-23.61245],[-51.19054,-23.61276],[-51.19029,-23.61378],[-51.18929,-23.61469]],[[-51.08006,-23.52984],[-51.07962,-23.52205],[-51.08468,-23.52194],[-51.08582,-23.52404],[-51.08589,-23.52704],[-51.08579,-23.52777],[-51.0853,-23.52806],[-51.08514,-23.52857],[-51.08512,-23.52982],[-51.08471,-23.53024],[-51.08343,-23.53024],[-51.0833,-23.52978],[-51.08006,-23.52984]]],terms_url:"http://siglon.londrina.pr.gov.br",terms_text:"Prefeitura do Londrinas, PR"},{id:"LPI_NSW_Administrative_Boundaries_County",name:"LPI NSW Administrative Boundaries County",type:"wms",template:"https://maps.six.nsw.gov.au/arcgis/services/public/NSW_Administrative_Boundaries/MapServer/WMSServer?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&CRS={proj}&BBOX={bbox}&WIDTH={width}&HEIGHT={height}&LAYERS=4&STYLES=&FORMAT=image/png32&DPI=96&MAP_RESOLUTION=96&FORMAT_OPTIONS=dpi:96&TRANSPARENT=TRUE",projection:"EPSG:3857",zoomExtent:[1,21],polygon:[[[159.00339,-31.48767],[159.03789,-31.70558],[159.31098,-31.85952],[159.37278,-31.77892],[159.17443,-31.4374],[159.00339,-31.48767]],[[140.99865,-28.99893],[148.9452,-28.99487],[149.48562,-28.5615],[150.29914,-28.53373],[151.0954,-28.71792],[151.39436,-28.97978],[151.98941,-28.73557],[151.92904,-28.49836],[152.49246,-28.2353],[153.57907,-28.14156],[153.69692,-28.64983],[153.25847,-30.97354],[152.75437,-32.50849],[151.90879,-33.05535],[151.25834,-34.38081],[151.01442,-35.11568],[150.46154,-36.1203],[150.41275,-36.61786],[149.97847,-37.507],[148.20135,-36.80566],[148.07918,-36.81716],[147.88542,-36.09019],[147.69029,-36.04418],[146.82844,-36.18868],[145.23484,-35.98499],[144.84457,-36.21492],[144.51935,-36.1296],[143.20218,-35.13174],[142.47856,-34.81194],[140.9937,-34.07017],[141.0026,-34.01974],[140.99865,-28.99893]]],terms_url:"http://spatialservices.finance.nsw.gov.au/mapping_and_imagery/lpi_web_services",terms_text:"© Land and Property Information 2019",icon:"http://spatialservices.finance.nsw.gov.au/__data/assets/file/0010/210520/favicon.ico",overlay:true},{id:"LPI_NSW_Administrative_Boundaries_LGA",name:"LPI NSW Administrative Boundaries LGA",type:"wms",template:"https://maps.six.nsw.gov.au/arcgis/services/public/NSW_Administrative_Boundaries/MapServer/WMSServer?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&CRS={proj}&BBOX={bbox}&WIDTH={width}&HEIGHT={height}&LAYERS=6&STYLES=&FORMAT=image/png32&DPI=96&MAP_RESOLUTION=96&FORMAT_OPTIONS=dpi:96&TRANSPARENT=TRUE",projection:"EPSG:3857",zoomExtent:[1,21],polygon:[[[159.00339,-31.48767],[159.03789,-31.70558],[159.31098,-31.85952],[159.37278,-31.77892],[159.17443,-31.4374],[159.00339,-31.48767]],[[140.99865,-28.99893],[148.9452,-28.99487],[149.48562,-28.5615],[150.29914,-28.53373],[151.0954,-28.71792],[151.39436,-28.97978],[151.98941,-28.73557],[151.92904,-28.49836],[152.49246,-28.2353],[153.57907,-28.14156],[153.69692,-28.64983],[153.25847,-30.97354],[152.75437,-32.50849],[151.90879,-33.05535],[151.25834,-34.38081],[151.01442,-35.11568],[150.46154,-36.1203],[150.41275,-36.61786],[149.97847,-37.507],[148.20135,-36.80566],[148.07918,-36.81716],[147.88542,-36.09019],[147.69029,-36.04418],[146.82844,-36.18868],[145.23484,-35.98499],[144.84457,-36.21492],[144.51935,-36.1296],[143.20218,-35.13174],[142.47856,-34.81194],[140.9937,-34.07017],[141.0026,-34.01974],[140.99865,-28.99893]]],terms_url:"http://spatialservices.finance.nsw.gov.au/mapping_and_imagery/lpi_web_services",terms_text:"© Land and Property Information 2019",icon:"http://spatialservices.finance.nsw.gov.au/__data/assets/file/0010/210520/favicon.ico",overlay:true},{id:"LPI_NSW_Administrative_Boundaries_NPWS_Reserve",name:"LPI NSW Administrative Boundaries NPWS Reserve",type:"wms",template:"https://maps.six.nsw.gov.au/arcgis/services/public/NSW_Administrative_Boundaries/MapServer/WMSServer?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&CRS={proj}&BBOX={bbox}&WIDTH={width}&HEIGHT={height}&LAYERS=1&STYLES=&FORMAT=image/png32&DPI=96&MAP_RESOLUTION=96&FORMAT_OPTIONS=dpi:96&TRANSPARENT=TRUE",projection:"EPSG:3857",zoomExtent:[1,21],polygon:[[[159.00339,-31.48767],[159.03789,-31.70558],[159.31098,-31.85952],[159.37278,-31.77892],[159.17443,-31.4374],[159.00339,-31.48767]],[[140.99865,-28.99893],[148.9452,-28.99487],[149.48562,-28.5615],[150.29914,-28.53373],[151.0954,-28.71792],[151.39436,-28.97978],[151.98941,-28.73557],[151.92904,-28.49836],[152.49246,-28.2353],[153.57907,-28.14156],[153.69692,-28.64983],[153.25847,-30.97354],[152.75437,-32.50849],[151.90879,-33.05535],[151.25834,-34.38081],[151.01442,-35.11568],[150.46154,-36.1203],[150.41275,-36.61786],[149.97847,-37.507],[148.20135,-36.80566],[148.07918,-36.81716],[147.88542,-36.09019],[147.69029,-36.04418],[146.82844,-36.18868],[145.23484,-35.98499],[144.84457,-36.21492],[144.51935,-36.1296],[143.20218,-35.13174],[142.47856,-34.81194],[140.9937,-34.07017],[141.0026,-34.01974],[140.99865,-28.99893]]],terms_url:"http://spatialservices.finance.nsw.gov.au/mapping_and_imagery/lpi_web_services",terms_text:"© Land and Property Information 2019",icon:"http://spatialservices.finance.nsw.gov.au/__data/assets/file/0010/210520/favicon.ico",overlay:true},{id:"LPI_NSW_Administrative_Boundaries_Parish",name:"LPI NSW Administrative Boundaries Parish",type:"wms",template:"https://maps.six.nsw.gov.au/arcgis/services/public/NSW_Administrative_Boundaries/MapServer/WMSServer?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&CRS={proj}&BBOX={bbox}&WIDTH={width}&HEIGHT={height}&LAYERS=3&STYLES=&FORMAT=image/png32&DPI=96&MAP_RESOLUTION=96&FORMAT_OPTIONS=dpi:96&TRANSPARENT=TRUE",projection:"EPSG:3857",zoomExtent:[1,21],polygon:[[[159.00339,-31.48767],[159.03789,-31.70558],[159.31098,-31.85952],[159.37278,-31.77892],[159.17443,-31.4374],[159.00339,-31.48767]],[[140.99865,-28.99893],[148.9452,-28.99487],[149.48562,-28.5615],[150.29914,-28.53373],[151.0954,-28.71792],[151.39436,-28.97978],[151.98941,-28.73557],[151.92904,-28.49836],[152.49246,-28.2353],[153.57907,-28.14156],[153.69692,-28.64983],[153.25847,-30.97354],[152.75437,-32.50849],[151.90879,-33.05535],[151.25834,-34.38081],[151.01442,-35.11568],[150.46154,-36.1203],[150.41275,-36.61786],[149.97847,-37.507],[148.20135,-36.80566],[148.07918,-36.81716],[147.88542,-36.09019],[147.69029,-36.04418],[146.82844,-36.18868],[145.23484,-35.98499],[144.84457,-36.21492],[144.51935,-36.1296],[143.20218,-35.13174],[142.47856,-34.81194],[140.9937,-34.07017],[141.0026,-34.01974],[140.99865,-28.99893]]],terms_url:"http://spatialservices.finance.nsw.gov.au/mapping_and_imagery/lpi_web_services",terms_text:"© Land and Property Information 2019",icon:"http://spatialservices.finance.nsw.gov.au/__data/assets/file/0010/210520/favicon.ico",overlay:true},{id:"LPI_NSW_Administrative_Boundaries_StateForest",name:"LPI NSW Administrative Boundaries State Forest",type:"wms",template:"https://maps.six.nsw.gov.au/arcgis/services/public/NSW_Administrative_Boundaries/MapServer/WMSServer?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&CRS={proj}&BBOX={bbox}&WIDTH={width}&HEIGHT={height}&LAYERS=2&STYLES=&FORMAT=image/png32&DPI=96&MAP_RESOLUTION=96&FORMAT_OPTIONS=dpi:96&TRANSPARENT=TRUE",projection:"EPSG:3857",zoomExtent:[1,21],polygon:[[[159.00339,-31.48767],[159.03789,-31.70558],[159.31098,-31.85952],[159.37278,-31.77892],[159.17443,-31.4374],[159.00339,-31.48767]],[[140.99865,-28.99893],[148.9452,-28.99487],[149.48562,-28.5615],[150.29914,-28.53373],[151.0954,-28.71792],[151.39436,-28.97978],[151.98941,-28.73557],[151.92904,-28.49836],[152.49246,-28.2353],[153.57907,-28.14156],[153.69692,-28.64983],[153.25847,-30.97354],[152.75437,-32.50849],[151.90879,-33.05535],[151.25834,-34.38081],[151.01442,-35.11568],[150.46154,-36.1203],[150.41275,-36.61786],[149.97847,-37.507],[148.20135,-36.80566],[148.07918,-36.81716],[147.88542,-36.09019],[147.69029,-36.04418],[146.82844,-36.18868],[145.23484,-35.98499],[144.84457,-36.21492],[144.51935,-36.1296],[143.20218,-35.13174],[142.47856,-34.81194],[140.9937,-34.07017],[141.0026,-34.01974],[140.99865,-28.99893]]],terms_url:"http://spatialservices.finance.nsw.gov.au/mapping_and_imagery/lpi_web_services",terms_text:"© Land and Property Information 2019",icon:"http://spatialservices.finance.nsw.gov.au/__data/assets/file/0010/210520/favicon.ico",overlay:true},{id:"LPI_NSW_Administrative_Boundaries_Suburb",name:"LPI NSW Administrative Boundaries Suburb",type:"wms",template:"https://maps.six.nsw.gov.au/arcgis/services/public/NSW_Administrative_Boundaries/MapServer/WMSServer?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&CRS={proj}&BBOX={bbox}&WIDTH={width}&HEIGHT={height}&LAYERS=7&STYLES=&FORMAT=image/png32&DPI=96&MAP_RESOLUTION=96&FORMAT_OPTIONS=dpi:96&TRANSPARENT=TRUE",projection:"EPSG:3857",zoomExtent:[1,21],polygon:[[[159.00339,-31.48767],[159.03789,-31.70558],[159.31098,-31.85952],[159.37278,-31.77892],[159.17443,-31.4374],[159.00339,-31.48767]],[[140.99865,-28.99893],[148.9452,-28.99487],[149.48562,-28.5615],[150.29914,-28.53373],[151.0954,-28.71792],[151.39436,-28.97978],[151.98941,-28.73557],[151.92904,-28.49836],[152.49246,-28.2353],[153.57907,-28.14156],[153.69692,-28.64983],[153.25847,-30.97354],[152.75437,-32.50849],[151.90879,-33.05535],[151.25834,-34.38081],[151.01442,-35.11568],[150.46154,-36.1203],[150.41275,-36.61786],[149.97847,-37.507],[148.20135,-36.80566],[148.07918,-36.81716],[147.88542,-36.09019],[147.69029,-36.04418],[146.82844,-36.18868],[145.23484,-35.98499],[144.84457,-36.21492],[144.51935,-36.1296],[143.20218,-35.13174],[142.47856,-34.81194],[140.9937,-34.07017],[141.0026,-34.01974],[140.99865,-28.99893]]],terms_url:"http://spatialservices.finance.nsw.gov.au/mapping_and_imagery/lpi_web_services",terms_text:"© Land and Property Information 2019",icon:"http://spatialservices.finance.nsw.gov.au/__data/assets/file/0010/210520/favicon.ico",overlay:true},{id:"NSW_LPI_BaseMap",name:"LPI NSW Base Map",type:"tms",template:"https://maps.six.nsw.gov.au/arcgis/rest/services/public/NSW_Base_Map/MapServer/tile/{zoom}/{y}/{x}",zoomExtent:[1,19],polygon:[[[140.99486,-28.95297],[148.96114,-28.89977],[148.98701,-28.48623],[151.01361,-28.47865],[151.10847,-28.70329],[151.87599,-28.68312],[151.93348,-28.40788],[152.25544,-28.23327],[153.06608,-28.21047],[153.14082,-28.1091],[153.47351,-28.11648],[153.35765,-27.69361],[159.49383,-27.69925],[159.4857,-37.84741],[149.52569,-37.82815],[149.91596,-37.487],[148.04859,-36.81317],[147.9681,-36.15679],[146.71477,-36.28666],[145.30046,-36.15679],[144.53007,-36.14751],[142.8398,-35.02543],[142.35686,-34.78025],[141.97741,-34.40162],[140.99503,-34.13718],[140.99486,-28.95297]]],terms_url:"http://spatialservices.finance.nsw.gov.au/mapping_and_imagery/lpi_web_services",terms_text:"© Land and Property Information 2019",icon:"http://spatialservices.finance.nsw.gov.au/__data/assets/file/0010/210520/favicon.ico"},{id:"NSW_LPI_Imagery",name:"LPI NSW Imagery",type:"tms",template:"https://maps.six.nsw.gov.au/arcgis/rest/services/public/NSW_Imagery/MapServer/tile/{zoom}/{y}/{x}",zoomExtent:[1,21],polygon:[[[140.98687,-28.98878],[148.99515,-28.97275],[148.99667,-28.49151],[151.0029,-28.49307],[151.0029,-28.72617],[151.49151,-28.73239],[151.49187,-28.71553],[151.92282,-28.71964],[151.92516,-28.48971],[151.99559,-28.48987],[151.99899,-28.11927],[152.49676,-28.12209],[152.49682,-28.11464],[153.00446,-28.11544],[153.00446,-28.1204],[153.50386,-28.11934],[153.50393,-28.12271],[153.59194,-28.12236],[153.59266,-28.17769],[153.61112,-28.17579],[153.61139,-28.18252],[153.74268,-28.21621],[153.77873,-28.71091],[152.6238,-32.58772],[152.3124,-32.63288],[151.41419,-33.57904],[150.89299,-35.26487],[150.46207,-35.77773],[150.01565,-37.51036],[149.99181,-37.51268],[149.51978,-37.51307],[149.51996,-37.52169],[149.4463,-37.53537],[149.06334,-37.5358],[148.98366,-37.52176],[148.98169,-37.5192],[148.98638,-37.2585],[148.48754,-37.26585],[148.48248,-37.00927],[147.99439,-37.01434],[147.98829,-36.53322],[147.95297,-36.52607],[147.94865,-36.0686],[147.5035,-36.07168],[147.50477,-36.2651],[146.492,-36.26613],[146.49225,-36.2565],[145.99298,-36.25343],[145.99659,-36.01881],[145.98316,-36.01871],[145.96245,-36.0219],[145.94624,-36.01209],[145.94543,-36.00603],[145.50415,-36.00136],[145.50379,-36.01091],[145.0072,-36.00362],[145.00354,-36.15204],[144.48608,-36.14231],[144.48741,-36.01375],[143.98747,-36.00241],[143.99329,-35.57238],[143.49717,-35.58371],[143.4918,-35.40656],[143.46134,-35.36749],[143.45856,-35.35559],[143.48978,-35.33965],[143.48955,-35.33221],[143.4317,-35.25706],[143.25055,-35.26066],[143.24384,-35.01327],[142.99333,-35.01772],[142.99198,-34.79619],[142.49714,-34.80323],[142.49732,-34.80076],[142.42114,-34.80176],[142.42092,-34.78383],[142.23309,-34.78592],[142.23077,-34.78075],[142.227,-34.50613],[141.99753,-34.50837],[141.9946,-34.25267],[141.49823,-34.25569],[141.49817,-34.25228],[140.99454,-34.25284],[140.98687,-28.98878]],[[159.22678,-31.74407],[159.26398,-31.74399],[159.28989,-31.77428],[159.28993,-31.79393],[159.26157,-31.79395],[159.22682,-31.75483],[159.22678,-31.74407]],[[159.03784,-31.49819],[159.04448,-31.5006],[159.04619,-31.49734],[159.04888,-31.49829],[159.04884,-31.48423],[159.06882,-31.48423],[159.06991,-31.482],[159.08317,-31.48203],[159.08203,-31.48434],[159.08205,-31.49567],[159.08564,-31.49703],[159.08383,-31.50058],[159.09007,-31.5026],[159.08682,-31.50859],[159.09433,-31.51136],[159.09174,-31.51585],[159.09537,-31.51724],[159.10276,-31.52611],[159.1161,-31.53006],[159.11422,-31.5342],[159.11875,-31.53417],[159.1193,-31.54888],[159.12618,-31.55796],[159.11841,-31.56323],[159.11553,-31.55983],[159.1115,-31.55983],[159.11154,-31.60158],[159.08954,-31.6016],[159.08626,-31.60845],[159.07954,-31.60611],[159.07714,-31.61149],[159.05943,-31.61155],[159.05296,-31.60369],[159.05893,-31.59087],[159.05891,-31.57897],[159.05541,-31.57773],[159.05735,-31.57387],[159.05585,-31.57333],[159.05038,-31.57335],[159.05035,-31.56329],[159.0463,-31.5619],[159.04847,-31.55793],[159.04237,-31.55601],[159.04533,-31.55038],[159.03783,-31.54763],[159.03802,-31.54723],[159.03487,-31.54724],[159.03487,-31.54383],[159.03244,-31.54297],[159.03461,-31.53808],[159.02754,-31.53554],[159.02964,-31.53159],[159.02305,-31.52935],[159.03784,-31.49819]]],terms_url:"http://spatialservices.finance.nsw.gov.au/mapping_and_imagery/lpi_web_services",terms_text:"© Land and Property Information 2019",best:true,icon:"http://spatialservices.finance.nsw.gov.au/__data/assets/file/0010/210520/favicon.ico"},{id:"NSW_LPI_Imagery_Dates",name:"LPI NSW Imagery Dates",type:"wms",template:"https://maps.six.nsw.gov.au/arcgis/services/public/NSW_Imagery_Dates/MapServer/WMSServer?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&CRS={proj}&BBOX={bbox}&WIDTH={width}&HEIGHT={height}&LAYERS=0&STYLES=&FORMAT=image/png32&DPI=96&MAP_RESOLUTION=96&FORMAT_OPTIONS=dpi:96&TRANSPARENT=TRUE",projection:"EPSG:3857",zoomExtent:[0,21],polygon:[[[140.98687,-28.98878],[148.99515,-28.97275],[148.99667,-28.49151],[151.0029,-28.49307],[151.0029,-28.72617],[151.49151,-28.73239],[151.49187,-28.71553],[151.92282,-28.71964],[151.92516,-28.48971],[151.99559,-28.48987],[151.99899,-28.11927],[152.49676,-28.12209],[152.49682,-28.11464],[153.00446,-28.11544],[153.00446,-28.1204],[153.50386,-28.11934],[153.50393,-28.12271],[153.59194,-28.12236],[153.59266,-28.17769],[153.61112,-28.17579],[153.61139,-28.18252],[153.74268,-28.21621],[153.77873,-28.71091],[152.6238,-32.58772],[152.3124,-32.63288],[151.41419,-33.57904],[150.89299,-35.26487],[150.46207,-35.77773],[150.01565,-37.51036],[149.99181,-37.51268],[149.51978,-37.51307],[149.51996,-37.52169],[149.4463,-37.53537],[149.06334,-37.5358],[148.98366,-37.52176],[148.98169,-37.5192],[148.98638,-37.2585],[148.48754,-37.26585],[148.48248,-37.00927],[147.99439,-37.01434],[147.98829,-36.53322],[147.95297,-36.52607],[147.94865,-36.0686],[147.5035,-36.07168],[147.50477,-36.2651],[146.492,-36.26613],[146.49225,-36.2565],[145.99298,-36.25343],[145.99659,-36.01881],[145.98316,-36.01871],[145.96245,-36.0219],[145.94624,-36.01209],[145.94543,-36.00603],[145.50415,-36.00136],[145.50379,-36.01091],[145.0072,-36.00362],[145.00354,-36.15204],[144.48608,-36.14231],[144.48741,-36.01375],[143.98747,-36.00241],[143.99329,-35.57238],[143.49717,-35.58371],[143.4918,-35.40656],[143.46134,-35.36749],[143.45856,-35.35559],[143.48978,-35.33965],[143.48955,-35.33221],[143.4317,-35.25706],[143.25055,-35.26066],[143.24384,-35.01327],[142.99333,-35.01772],[142.99198,-34.79619],[142.49714,-34.80323],[142.49732,-34.80076],[142.42114,-34.80176],[142.42092,-34.78383],[142.23309,-34.78592],[142.23077,-34.78075],[142.227,-34.50613],[141.99753,-34.50837],[141.9946,-34.25267],[141.49823,-34.25569],[141.49817,-34.25228],[140.99454,-34.25284],[140.98687,-28.98878]],[[159.22678,-31.74407],[159.26398,-31.74399],[159.28989,-31.77428],[159.28993,-31.79393],[159.26157,-31.79395],[159.22682,-31.75483],[159.22678,-31.74407]],[[159.03784,-31.49819],[159.04448,-31.5006],[159.04619,-31.49734],[159.04888,-31.49829],[159.04884,-31.48423],[159.06882,-31.48423],[159.06991,-31.482],[159.08317,-31.48203],[159.08203,-31.48434],[159.08205,-31.49567],[159.08564,-31.49703],[159.08383,-31.50058],[159.09007,-31.5026],[159.08682,-31.50859],[159.09433,-31.51136],[159.09174,-31.51585],[159.09537,-31.51724],[159.10276,-31.52611],[159.1161,-31.53006],[159.11422,-31.5342],[159.11875,-31.53417],[159.1193,-31.54888],[159.12618,-31.55796],[159.11841,-31.56323],[159.11553,-31.55983],[159.1115,-31.55983],[159.11154,-31.60158],[159.08954,-31.6016],[159.08626,-31.60845],[159.07954,-31.60611],[159.07714,-31.61149],[159.05943,-31.61155],[159.05296,-31.60369],[159.05893,-31.59087],[159.05891,-31.57897],[159.05541,-31.57773],[159.05735,-31.57387],[159.05585,-31.57333],[159.05038,-31.57335],[159.05035,-31.56329],[159.0463,-31.5619],[159.04847,-31.55793],[159.04237,-31.55601],[159.04533,-31.55038],[159.03783,-31.54763],[159.03802,-31.54723],[159.03487,-31.54724],[159.03487,-31.54383],[159.03244,-31.54297],[159.03461,-31.53808],[159.02754,-31.53554],[159.02964,-31.53159],[159.02305,-31.52935],[159.03784,-31.49819]]],terms_url:"http://spatialservices.finance.nsw.gov.au/mapping_and_imagery/lpi_web_services",terms_text:"© Land and Property Information 2019",icon:"http://spatialservices.finance.nsw.gov.au/__data/assets/file/0010/210520/favicon.ico",overlay:true},{id:"NSW_LPI_TopographicMap",name:"LPI NSW Topographic Map",type:"tms",template:"https://maps.six.nsw.gov.au/arcgis/rest/services/public/NSW_Topo_Map/MapServer/tile/{zoom}/{y}/{x}",zoomExtent:[1,16],polygon:[[[140.99884,-28.99924],[148.95024,-28.99937],[148.94988,-28.96653],[148.99983,-28.96653],[149.00009,-28.81658],[149.10007,-28.81658],[149.0997,-28.74885],[148.99985,-28.74974],[148.99982,-28.50003],[151.00005,-28.50052],[151.00059,-28.73258],[151.02395,-28.73274],[151.02413,-28.74188],[151.03293,-28.74188],[151.03383,-28.75054],[151.99998,-28.74953],[151.99998,-28.71645],[152.0334,-28.71661],[152.03322,-28.6832],[152.00007,-28.68335],[151.99988,-28.64163],[151.98299,-28.64139],[151.98317,-28.62491],[151.93313,-28.62475],[151.93341,-28.50007],[151.99989,-28.50023],[151.99986,-28.37496],[152.24997,-28.37507],[152.24994,-28.25001],[152.99972,-28.24986],[152.9999,-28.28324],[153.1165,-28.2834],[153.11659,-28.24986],[153.16663,-28.25001],[153.16672,-28.23316],[153.24999,-28.23324],[153.25003,-28.12497],[153.62496,-28.12508],[153.62484,-28.49991],[153.7498,-28.49999],[153.74959,-28.7498],[153.62481,-28.75011],[153.62497,-28.99993],[153.49977,-29.00006],[153.49984,-29.49951],[153.3748,-29.50005],[153.37541,-29.87503],[153.49991,-29.87514],[153.49991,-30.00009],[153.24989,-29.99976],[153.25002,-30.19177],[153.27482,-30.19162],[153.27482,-30.21685],[153.21661,-30.21661],[153.21661,-30.25006],[153.25002,-30.25006],[153.24975,-30.37519],[153.12436,-30.37497],[153.12465,-30.62504],[153.03317,-30.62505],[153.03339,-30.87508],[153.12492,-30.87503],[153.12493,-31.12505],[153.00824,-31.12497],[153.00829,-31.24998],[153,-31.25],[152.99994,-31.62499],[152.87494,-31.62505],[152.87496,-31.74995],[152.78329,-31.75],[152.7832,-31.87486],[152.74991,-31.87501],[152.75004,-32.00002],[152.6249,-31.99994],[152.62491,-32.5],[152.49998,-32.49996],[152.50003,-32.56664],[152.41667,-32.56634],[152.41676,-32.625],[152.34985,-32.62499],[152.34985,-32.63323],[152.28308,-32.63322],[152.28326,-32.62498],[152.24948,-32.62498],[152.24981,-32.87491],[151.87457,-32.87504],[151.87485,-33.00001],[151.74977,-33.00015],[151.75047,-33.25004],[151.62524,-33.24974],[151.62508,-33.37516],[151.49958,-33.37514],[151.50031,-33.62494],[151.37415,-33.62437],[151.37279,-34.00196],[151.24778,-34.00112],[151.24778,-34.24931],[150.99573,-34.25015],[151.00081,-34.62483],[150.87174,-34.6265],[150.87276,-35.12427],[150.76706,-35.12344],[150.76909,-35.24638],[150.62579,-35.2497],[150.62803,-35.37515],[150.49997,-35.37515],[150.49591,-35.6275],[150.37192,-35.62503],[150.37497,-35.7538],[150.26724,-35.75132],[150.2652,-35.87412],[150.24792,-35.87083],[150.24589,-36.37488],[150.12292,-36.37488],[150.12597,-36.62243],[150.02535,-36.62407],[150.0284,-36.74713],[149.99283,-36.74958],[150.00401,-37.12245],[150.05889,-37.12731],[150.05686,-37.37809],[149.99791,-37.37324],[149.99994,-37.48301],[149.98774,-37.48462],[149.98571,-37.508],[148.06846,-36.80624],[147.99306,-36.138],[147.81483,-36.00556],[147.38939,-36.01137],[147.38221,-36.13103],[146.99725,-36.12755],[146.98863,-36.25283],[146.49564,-36.24471],[146.50426,-36.12639],[145.00118,-36.00795],[145.01541,-36.25421],[144.50725,-36.24765],[144.49912,-36.0211],[143.99654,-35.98105],[143.33826,-35.23318],[142.40976,-34.76694],[142.03614,-34.37588],[140.99652,-34.13858],[140.99884,-28.99924]]],terms_url:"http://spatialservices.finance.nsw.gov.au/mapping_and_imagery/lpi_web_services",terms_text:"© Land and Property Information 2019",icon:"http://spatialservices.finance.nsw.gov.au/__data/assets/file/0010/210520/favicon.ico"},{id:"orthophoto_lyon_2012",name:"Lyon Orthophoto 2012-03 10cm",type:"wms",template:"https://download.data.grandlyon.com/wms/grandlyon?language=fre&FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=1830_5150_10cm_CC46,1830_5155_10cm_CC46,1830_5160_10cm_CC46,1830_5165_10cm_CC46,1830_5170_10cm_CC46,1830_5175_10cm_CC46,1830_5180_10cm_CC46,1830_5185_10cm_CC46,1830_5190_10cm_CC46,1835_5150_10cm_CC46,1835_5155_10cm_CC46,1835_5160_10cm_CC46,1835_5165_10cm_CC46,1835_5170_10cm_CC46,1835_5175_10cm_CC46,1835_5180_10cm_CC46,1835_5185_10cm_CC46,1835_5190_10cm_CC46,1840_5150_10cm_CC46,1840_5155_10cm_CC46,1840_5160_10cm_CC46,1840_5165_10cm_CC46,1840_5170_10cm_CC46,1840_5175_10cm_CC46,1840_5180_10cm_CC46,1840_5185_10cm_CC46,1840_5190_10cm_CC46,1845_5150_10cm_CC46,1845_5155_10cm_CC46,1845_5160_10cm_CC46,1845_5165_10cm_CC46,1845_5170_10cm_CC46,1845_5175_10cm_CC46,1845_5180_10cm_CC46,1845_5185_10cm_CC46,1845_5190_10cm_CC46,1850_5155_10cm_CC46,1850_5160_10cm_CC46,1850_5165_10cm_CC46,1850_5170_10cm_CC46,1850_5175_10cm_CC46,1850_5180_10cm_CC46,1850_5185_10cm_CC46,1855_5155_10cm_CC46,1855_5165_10cm_CC46,1855_5170_10cm_CC46,1855_5175_10cm_CC46,1855_5180_10cm_CC46,1855_5185_10cm_CC46,1860_5155_10cm_CC46,1860_5160_10cm_CC46,1860_5165_10cm_CC46,1860_5170_10cm_CC46,1860_5175_10cm_CC46,1860_5180_10cm_CC46,1860_5185_10cm_CC46,1865_5155_10cm_CC46,1865_5160_10cm_CC46,1865_5165_10cm_CC46,1865_5170_10cm_CC46&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2012-03-01T00:00:00.000Z",startDate:"2012-03-01T00:00:00.000Z",polygon:[[[4.69049,45.54652],[4.83131,45.54652],[4.83131,45.57131],[4.88344,45.57131],[4.88344,45.59745],[5.16622,45.59745],[5.16622,45.74533],[5.10793,45.74533],[5.10793,45.88145],[4.90698,45.88145],[4.90698,45.92107],[4.84377,45.92107],[4.84377,45.94011],[4.71543,45.94011],[4.71543,45.87018],[4.67458,45.87018],[4.67458,45.7178],[4.69567,45.7178],[4.69049,45.54652]]],terms_url:"https://data.grandlyon.com/imagerie/orthophotographie-2012-du-grand-lyon",terms_text:"Grand Lyon Smart Data DSIT"},{id:"orthophoto_lyon",name:"Lyon Orthophoto 8cm",type:"tms",template:"http://wms.openstreetmap.fr/tms/1.0.0/lyon/{zoom}/{x}/{y}",endDate:"2018-01-01T00:00:00.000Z",startDate:"2015-05-01T00:00:00.000Z",zoomExtent:[2,22],polygon:[[[4.66489,45.54688],[4.88253,45.54348],[4.88435,45.59745],[5.16623,45.59242],[5.17217,45.74532],[5.10793,45.74653],[5.11305,45.88145],[4.90698,45.88508],[4.90822,45.92106],[4.84377,45.92212],[4.84497,45.9581],[4.67729,45.96069],[4.66489,45.54688]]],terms_url:"https://data.grandlyon.com/imagerie/orthophotographie-2015-du-grand-lyon/",terms_text:"Métropole de Lyon DINSI",best:true},{id:"MainRoadsWA_Road_Hierarchy",name:"Main Roads WA Road Hierarchy",type:"wms",template:"https://services.slip.wa.gov.au/public/services/SLIP_Public_Services/Transport/MapServer/WMSServer?LAYERS=8&TRANSPARENT=TRUE&SERVICE=WMS&VERSION=1.1.1&REQUEST=GetMap&STYLES=&FORMAT=image%2Fpng&SRS={proj}&BBOX={bbox}&WIDTH={width}&HEIGHT={height}",projection:"EPSG:3857",zoomExtent:[0,21],polygon:[[[129.00009,-31.68764],[128.99872,-14.58225],[127.08984,-12.29707],[124.76074,-12.98315],[121.24512,-15.70766],[119.0918,-17.60214],[115.53223,-18.85431],[112.41211,-20.46819],[111.24756,-22.83695],[111.00586,-25.62172],[111.64307,-29.66896],[111.68701,-32.3614],[112.14844,-34.47034],[113.35693,-36.10238],[116.98242,-36.70366],[119.44336,-36.94989],[122.27783,-36.61553],[125.99121,-35.40696],[127.59521,-34.57895],[128.86963,-33.59632],[129.00009,-31.68764]]],terms_url:"https://catalogue.data.wa.gov.au/dataset/clss-road-hierarchy",terms_text:"Main Roads Western Australia",overlay:true},{id:"mainzlatestaerialimagery",name:"Mainz latest aerial imagery",type:"wms",template:"https://gint.mainz.de/gint1-cgi/mapserv?map=/data/mapbender-int/umn-www/client/a62/luftbild.map&FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Luftbild_f_mz_2018&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",zoomExtent:[17,22],polygon:[[[8.10355,49.865],[8.38356,49.865],[8.38356,50.0466],[8.10355,50.0466],[8.10355,49.865]]],terms_url:"https://www.mainz.de/vv/oe/100140100000035141.php#tab-infos",terms_text:"Vermessung und Geoinformation Mainz",icon:"https://www.mainz.de/configuration.inc.php.media/27432/Logo-72px.png"},{id:"major_isidoro",name:"Major Isidoro AL",type:"wms",template:"http://geoserver.dados.al.gov.br:8080/geoserver/Alagoas/ows?LAYERS=Major%20Isidoro&SERVICE=WMS&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.0&SERVICE=WMS&REQUEST=GetMap&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[-36.94048,-9.57588],[-36.94106,-9.48536],[-37.03215,-9.48606],[-37.03164,-9.57639],[-36.94048,-9.57588]]],terms_url:"http://www.seplag.al.gov.br",terms_text:"Secretaria de Estado do Planejamento, Gestão e Patrimônio"},{id:"Mapbox",name:"Mapbox Satellite",type:"tms",template:"https://{switch:a,b,c,d}.tiles.mapbox.com/v4/mapbox.satellite/{zoom}/{x}/{y}@2x.jpg?access_token=pk.eyJ1Ijoib3BlbnN0cmVldG1hcCIsImEiOiJjaml5MjVyb3MwMWV0M3hxYmUzdGdwbzE4In0.q548FjhsSJzvXsGlPsFxAQ",tileSize:512,zoomExtent:[0,22],terms_url:"https://www.mapbox.com/about/maps",terms_text:"Terms & Feedback","default":true,description:"Satellite and aerial imagery.",icon:"https://osmlab.github.io/editor-layer-index/sources/world/MapBoxSatellite.png"},{id:"Maps4BW-LGL_BW",name:"Maps4BW (LGL-BW, www.lgl-bw.de)",type:"wms",template:"https://owsproxy.lgl-bw.de/owsproxy/ows/WMS_Maps4BW?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=webatlasde&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[9.06954,49.57679],[9.10577,49.57952],[9.16079,49.58263],[9.24212,49.58402],[9.27192,49.63515],[9.30454,49.65561],[9.36753,49.65893],[9.38253,49.64341],[9.41191,49.66033],[9.39602,49.67143],[9.41828,49.69706],[9.40378,49.71957],[9.37769,49.70357],[9.35828,49.70334],[9.29438,49.73958],[9.31467,49.76859],[9.42435,49.79099],[9.50417,49.78962],[9.51808,49.78214],[9.65623,49.79286],[9.65317,49.73944],[9.63435,49.70076],[9.67054,49.69515],[9.67721,49.71846],[9.71079,49.72918],[9.8014,49.73429],[9.83728,49.70237],[9.87656,49.61362],[9.83362,49.55607],[9.84954,49.54793],[9.87463,49.5836],[9.91419,49.58955],[9.93066,49.56097],[9.92482,49.48951],[10.01787,49.48673],[10.03352,49.52978],[10.06372,49.55129],[10.09052,49.54218],[10.12792,49.51192],[10.11027,49.49272],[10.16753,49.38589],[10.12627,49.3809],[10.14385,49.32772],[10.16061,49.27043],[10.13569,49.26189],[10.14311,49.20387],[10.25161,49.15031],[10.26279,49.12959],[10.26869,49.05202],[10.36527,49.02557],[10.45894,48.93581],[10.46208,48.83947],[10.42886,48.74973],[10.46648,48.73627],[10.49761,48.68581],[10.45007,48.66277],[10.3553,48.65068],[10.32297,48.68241],[10.26028,48.67842],[10.32542,48.60763],[10.31448,48.52323],[10.17973,48.45977],[10.12892,48.45301],[10.10938,48.47445],[10.06355,48.45381],[10.03918,48.45125],[10.04492,48.43158],[10.0152,48.40323],[9.98709,48.38565],[9.97328,48.37944],[9.97549,48.36558],[9.99071,48.3734],[10.00265,48.3632],[9.99992,48.35572],[10.06698,48.28172],[10.08111,48.2253],[10.11306,48.12632],[10.13966,48.11307],[10.14695,48.07455],[10.13763,48.01938],[10.11725,47.9755],[10.11359,47.93422],[10.10709,47.86711],[10.14174,47.80956],[10.0732,47.78686],[10.11825,47.76126],[10.14213,47.70165],[10.13262,47.67678],[10.07445,47.63472],[10.06303,47.66923],[10.00359,47.67526],[9.95808,47.64376],[9.84481,47.67533],[9.83488,47.66042],[9.74926,47.60206],[9.70817,47.60007],[9.65788,47.60599],[9.64742,47.58931],[9.61389,47.57809],[9.56602,47.53274],[9.51199,47.53246],[9.25717,47.65752],[9.18684,47.65697],[9.17591,47.65379],[9.17028,47.65474],[9.15555,47.666],[9.1494,47.66713],[9.13947,47.66367],[9.02005,47.68616],[8.94127,47.65569],[8.89825,47.64821],[8.88263,47.65327],[8.87474,47.6545],[8.87235,47.66971],[8.84949,47.68089],[8.84993,47.70233],[8.81816,47.71242],[8.80108,47.72811],[8.77231,47.71606],[8.81295,47.6959],[8.79373,47.67216],[8.7533,47.68997],[8.72575,47.6917],[8.71002,47.68829],[8.68937,47.69318],[8.67046,47.68235],[8.65783,47.68883],[8.66161,47.71454],[8.70596,47.71584],[8.70932,47.73275],[8.73033,47.75527],[8.72003,47.76273],[8.68871,47.75314],[8.67898,47.78306],[8.64981,47.79435],[8.65592,47.76948],[8.63132,47.75749],[8.61918,47.76216],[8.61351,47.78451],[8.61686,47.79705],[8.568,47.79977],[8.57611,47.79015],[8.57847,47.78102],[8.56315,47.77654],[8.48889,47.76458],[8.45742,47.74126],[8.4623,47.72909],[8.44929,47.71663],[8.41471,47.69991],[8.4273,47.68562],[8.41061,47.6743],[8.46839,47.6568],[8.52474,47.64677],[8.5269,47.66373],[8.56441,47.67261],[8.57853,47.66373],[8.60454,47.6751],[8.63333,47.65212],[8.62386,47.63922],[8.60395,47.63193],[8.61281,47.61327],[8.57951,47.59306],[8.5602,47.59867],[8.56765,47.61442],[8.53394,47.62984],[8.51208,47.61641],[8.46581,47.60137],[8.46631,47.58666],[8.48985,47.59139],[8.5,47.58062],[8.43414,47.5629],[8.39882,47.57559],[8.38525,47.56408],[8.32701,47.56893],[8.29483,47.59077],[8.2948,47.60497],[8.26293,47.60823],[8.22435,47.60446],[8.18644,47.60508],[8.16904,47.59394],[8.13615,47.58246],[8.10503,47.56795],[8.09873,47.55933],[8.08261,47.55624],[8.07095,47.56299],[8.0274,47.54931],[7.94632,47.54209],[7.90966,47.54825],[7.90676,47.5603],[7.88681,47.58765],[7.83987,47.58122],[7.79648,47.55517],[7.69208,47.53137],[7.66583,47.53403],[7.63159,47.56044],[7.63879,47.56619],[7.68607,47.57205],[7.65278,47.59418],[7.62247,47.57767],[7.60473,47.57822],[7.58771,47.59015],[7.52156,47.65161],[7.50399,47.70235],[7.52096,47.77685],[7.55712,47.84839],[7.54946,47.8792],[7.57461,47.93028],[7.61318,47.96804],[7.6119,47.9871],[7.56124,48.03836],[7.57491,48.1258],[7.59534,48.15977],[7.63305,48.19717],[7.66275,48.22473],[7.68466,48.30305],[7.76346,48.49158],[7.80046,48.5126],[7.79958,48.5878],[7.83409,48.64439],[7.91211,48.68899],[7.96723,48.75716],[8.02069,48.78879],[8.04302,48.7956],[8.08647,48.81306],[8.13644,48.89782],[8.19706,48.96021],[8.28161,48.9949],[8.29967,49.02597],[8.31243,49.05996],[8.38654,49.23497],[8.46083,49.28407],[8.48783,49.29326],[8.47577,49.3079],[8.44839,49.31693],[8.45152,49.33135],[8.46288,49.3869],[8.49407,49.40186],[8.49762,49.41583],[8.50721,49.43414],[8.49834,49.44187],[8.47977,49.44391],[8.46414,49.44151],[8.44696,49.44516],[8.43947,49.45214],[8.44407,49.46085],[8.45992,49.46498],[8.46312,49.47135],[8.4554,49.48107],[8.44184,49.49297],[8.41194,49.55852],[8.42193,49.5843],[8.44117,49.59081],[8.45482,49.59157],[8.47738,49.5874],[8.56161,49.52237],[8.61486,49.54175],[8.59165,49.59179],[8.58706,49.61156],[8.65189,49.6209],[8.69494,49.62762],[8.70105,49.59869],[8.68726,49.57096],[8.72597,49.53085],[8.78493,49.51775],[8.81467,49.53187],[8.88863,49.51091],[8.90168,49.50363],[8.90315,49.486],[8.87995,49.46561],[8.83117,49.42147],[8.80845,49.40981],[8.82075,49.39647],[8.83009,49.41316],[8.85107,49.39663],[8.90247,49.44632],[8.93863,49.48179],[8.95154,49.50562],[8.98498,49.51153],[9.03553,49.50079],[9.05731,49.532],[9.10023,49.52728],[9.11009,49.51213],[9.12424,49.51722],[9.11286,49.53337],[9.08284,49.54211],[9.06694,49.56433],[9.06954,49.57679]]],terms_url:"https://www.lgl-bw.de/",terms_text:"Datengrundlage: LGL, www.lgl-bw.de"},{id:"mar_vermelho_al",name:"Mar Vermelho AL",type:"wms",template:"http://geoserver.dados.al.gov.br:8080/geoserver/Alagoas/ows?LAYERS=Mar%20Vermelho&SERVICE=WMS&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.0&SERVICE=WMS&REQUEST=GetMap&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[-36.34201,-9.49289],[-36.3422,-9.47533],[-36.34275,-9.4029],[-36.34473,-9.4029],[-36.34537,-9.40279],[-36.34702,-9.40293],[-36.3508,-9.40291],[-36.359,-9.40307],[-36.36109,-9.403],[-36.36289,-9.40307],[-36.3659,-9.40305],[-36.36713,-9.40301],[-36.37571,-9.40307],[-36.38049,-9.40308],[-36.38663,-9.4032],[-36.38852,-9.40312],[-36.39286,-9.40325],[-36.39656,-9.40322],[-36.40309,-9.40327],[-36.41973,-9.40338],[-36.43368,-9.4034],[-36.43355,-9.41685],[-36.43344,-9.42386],[-36.43338,-9.43753],[-36.43329,-9.45012],[-36.433,-9.49359],[-36.40839,-9.4935],[-36.40442,-9.49354],[-36.40008,-9.49351],[-36.39787,-9.49342],[-36.39168,-9.49328],[-36.38757,-9.49331],[-36.38536,-9.49341],[-36.37673,-9.49331],[-36.37427,-9.49319],[-36.36707,-9.49299],[-36.36502,-9.493],[-36.36043,-9.49299],[-36.35955,-9.49295],[-36.35895,-9.49304],[-36.35703,-9.49294],[-36.35665,-9.493],[-36.3526,-9.493],[-36.34767,-9.49297],[-36.34201,-9.49289]]],terms_url:"http://www.seplag.al.gov.br",terms_text:"Secretaria de Estado do Planejamento, Gestão e Patrimônio"},{id:"MassGIS-L3-Parcels",name:"MassGIS L3 Parcels",type:"tms",template:"https://tiles.arcgis.com/tiles/hGdibHYSPO59RG1h/arcgis/rest/services/MassGIS_Level3_Parcels/MapServer/tile/{zoom}/{y}/{x}",zoomExtent:[15,20],polygon:[[[-72.13569,42.03025],[-72.53156,42.03458],[-72.57278,42.03022],[-72.58216,42.02474],[-72.60717,42.02515],[-72.60797,42.03108],[-72.64019,42.03205],[-72.69933,42.03696],[-72.75714,42.03635],[-72.75868,42.02439],[-72.76572,42.02276],[-72.76673,42.00327],[-72.81705,41.99769],[-72.81378,42.03674],[-73.03678,42.03929],[-73.43281,42.05059],[-73.49688,42.04968],[-73.50814,42.08626],[-73.26496,42.74594],[-72.6872,42.73348],[-71.97286,42.71307],[-71.69663,42.70572],[-71.29464,42.69704],[-71.27894,42.71136],[-71.26787,42.72603],[-71.25526,42.73659],[-71.24598,42.74231],[-71.23732,42.74491],[-71.22391,42.74643],[-71.18181,42.73732],[-71.18617,42.79088],[-71.16667,42.80891],[-71.13277,42.82145],[-71.06442,42.80626],[-71.05395,42.83337],[-71.04483,42.84869],[-71.03128,42.85924],[-70.96702,42.86887],[-70.94967,42.87588],[-70.92973,42.88504],[-70.91465,42.88661],[-70.90348,42.88671],[-70.88566,42.88288],[-70.84776,42.86088],[-70.82963,42.86875],[-70.81567,42.87204],[-70.45842,42.67694],[-70.8759,42.35302],[-69.88713,42.0519],[-69.89537,41.21643],[-70.81959,41.23192],[-71.09996,41.43386],[-71.12047,41.49717],[-71.13131,41.59231],[-71.14059,41.6051],[-71.14047,41.62389],[-71.13569,41.6284],[-71.13291,41.6601],[-71.17605,41.6681],[-71.17588,41.67154],[-71.1954,41.67514],[-71.26139,41.7523],[-71.32885,41.7811],[-71.33407,41.79455],[-71.34156,41.79817],[-71.33914,41.80842],[-71.3472,41.8231],[-71.3449,41.828],[-71.3352,41.8355],[-71.3422,41.8448],[-71.33392,41.86229],[-71.34086,41.87872],[-71.33865,41.89865],[-71.38174,41.8932],[-71.38127,42.01885],[-71.49744,42.01725],[-71.52888,42.01499],[-71.79925,42.00807],[-71.80067,42.02351],[-72.0635,42.02735],[-72.13569,42.03025]]],overlay:true},{id:"geodata.md.gov-MD_SixInchImagery",name:"MD Latest 6 Inch Aerial Imagery",type:"wms",template:"https://geodata.md.gov/imap/services/Imagery/MD_SixInchImagery/MapServer/WmsServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=MD_SixInchImagery&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2016-01-01T00:00:00.000Z",startDate:"2013-01-01T00:00:00.000Z",zoomExtent:[0,20],polygon:[[[-76.23413,37.92037],[-76.59805,38.15832],[-76.94,38.27053],[-77.03819,38.41379],[-77.23526,38.33627],[-77.31216,38.41056],[-77.26273,38.56642],[-77.043,38.71338],[-77.04987,38.7937],[-76.92627,38.8925],[-77.04094,38.9845],[-77.12162,38.92523],[-77.15012,38.95514],[-77.25243,38.97543],[-77.25929,39.02425],[-77.34581,39.05492],[-77.46185,39.07038],[-77.53738,39.13965],[-77.47421,39.22481],[-77.57275,39.30428],[-77.72347,39.32899],[-77.77702,39.46323],[-77.86148,39.51622],[-77.84088,39.60886],[-77.95624,39.59299],[-78.16635,39.69556],[-78.27003,39.62156],[-78.3387,39.64007],[-78.46641,39.52364],[-78.6628,39.54006],[-78.79875,39.60622],[-78.9814,39.4468],[-79.06723,39.47649],[-79.48505,39.19954],[-79.48557,39.72158],[-75.78836,39.72181],[-75.69099,38.46058],[-75.04924,38.45816],[-75.04984,38.40222],[-75.08151,38.32321],[-75.09773,38.30907],[-75.187,38.09755],[-75.23798,38.0224],[-75.61821,37.98967],[-75.86369,37.90953],[-76.23413,37.92037]]],terms_url:"http://imap.maryland.gov/Pages/imagery-products.aspx",terms_text:"DoIT, MD iMap, MDP",description:"Six Inch resolution aerial imagery for the State of Maryland"},{id:"geodata.md.gov-MD_ThreeInchImagery",name:"MD Three Inch Aerial Imagery",type:"wms",template:"https://geodata.md.gov/imap/services/Imagery/MD_ThreeInchImagery/MapServer/WmsServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=MD_ThreeInchImagery&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[0,20],polygon:[[[-76.46299,38.9808],[-76.46326,38.94779],[-76.49499,38.9369],[-76.51617,38.93697],[-76.54763,38.9591],[-76.54745,38.98667],[-76.51559,39.00306],[-76.4839,39.00292],[-76.46299,38.9808]],[[-76.09548,38.84133],[-76.0428,38.8409],[-76.04289,38.8298],[-76.03229,38.8297],[-76.03277,38.79667],[-76.02545,38.79664],[-76.02541,38.77462],[-76.03308,38.77472],[-76.03366,38.73073],[-76.05462,38.73094],[-76.0548,38.72005],[-76.10753,38.72043],[-76.10714,38.75338],[-76.11754,38.75346],[-76.11701,38.79731],[-76.09601,38.79715],[-76.09548,38.84133]],[[-77.23397,39.16838],[-77.25516,39.14647],[-77.25496,39.11343],[-77.18093,39.05337],[-77.14907,39.0477],[-77.12798,39.04779],[-77.10683,39.05325],[-77.10688,39.0917],[-77.11775,39.10827],[-77.16011,39.12485],[-77.15975,39.15214],[-77.17048,39.16302],[-77.21284,39.17272],[-77.23397,39.16838]]],terms_url:"http://imap.maryland.gov/Pages/imagery-products.aspx",terms_text:"DoIT, MD iMap, MDP",description:"Three Inch Resolution Imagery for the cities of Rockville, Gaithersburg and Annapolis"},{id:"geodata.md.gov-MD_ColorBasemap",name:"MD Transportation Basemap",type:"wms",template:"https://geodata.md.gov/imap/services/Transportation/MD_ColorBasemap/MapServer/WmsServer?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&FORMAT=image/png&TRANSPARENT=true&LAYERS=MD_ColorBasemap&WIDTH={width}&HEIGHT={height}&CRS={proj}&STYLES=&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[-76.23413,37.92037],[-76.59805,38.15832],[-76.94,38.27053],[-77.03819,38.41379],[-77.23526,38.33627],[-77.31216,38.41056],[-77.26273,38.56642],[-77.043,38.71338],[-77.04987,38.7937],[-76.92627,38.8925],[-77.04094,38.9845],[-77.12162,38.92523],[-77.15012,38.95514],[-77.25243,38.97543],[-77.25929,39.02425],[-77.34581,39.05492],[-77.46185,39.07038],[-77.53738,39.13965],[-77.47421,39.22481],[-77.57275,39.30428],[-77.72347,39.32899],[-77.77702,39.46323],[-77.86148,39.51622],[-77.84088,39.60886],[-77.95624,39.59299],[-78.16635,39.69556],[-78.27003,39.62156],[-78.3387,39.64007],[-78.46641,39.52364],[-78.6628,39.54006],[-78.79875,39.60622],[-78.9814,39.4468],[-79.06723,39.47649],[-79.48505,39.19954],[-79.48557,39.72158],[-75.78836,39.72181],[-75.69099,38.46058],[-75.04924,38.45816],[-75.04984,38.40222],[-75.08151,38.32321],[-75.09773,38.30907],[-75.187,38.09755],[-75.23798,38.0224],[-75.61821,37.98967],[-75.86369,37.90953],[-76.23413,37.92037]]],terms_url:"http://imap.maryland.gov/Pages/imagery-products.aspx",terms_text:"DoIT, MD iMap, MDP",description:"Maryland State Highway Administration road features and additional Maryland focused landmarks"},{id:"MCGIS-County-NAIP-Imagery-2015",name:"Mesa County GIS NAIP 2015",type:"wms",template:"https://mcgis.mesacounty.us/image/services/Mosaic_Datasets/MesaCounty_2015/ImageServer/WMSServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",endDate:"2015-01-01T00:00:00.000Z",startDate:"2015-01-01T00:00:00.000Z",zoomExtent:[0,20],polygon:[[[-109.06765,39.37875],[-107.37012,39.37962],[-107.36995,39.18422],[-107.49574,39.18416],[-107.49568,39.12133],[-107.62081,39.12126],[-107.62076,39.05974],[-107.68231,39.05971],[-107.68226,38.99652],[-107.81774,38.99645],[-107.81779,39.05859],[-107.86948,39.05856],[-107.86943,38.99769],[-108.05698,38.99759],[-108.05688,38.87126],[-108.18204,38.8712],[-108.18198,38.8081],[-108.37142,38.808],[-108.3711,38.43452],[-109.06685,38.43416],[-109.06765,39.37875]]],terms_url:"http://gis.mesacounty.us/",terms_text:"Mesa County GIS",icon:"https://gis.mesacounty.us/globalassets/images/county-logos/mesa-county-logo.png"},{id:"MCGIS-County-NAIP-Imagery-2017",name:"Mesa County GIS NAIP 2017",type:"wms",template:"https://mcgis.mesacounty.us/image/services/Mosaic_Datasets/NAIP_2017/ImageServer/WMSServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",endDate:"2017-10-24T00:00:00.000Z",startDate:"2017-08-26T00:00:00.000Z",zoomExtent:[0,13],polygon:[[[-109.06765,39.37875],[-107.37012,39.37962],[-107.36995,39.18422],[-107.49574,39.18416],[-107.49568,39.12133],[-107.62081,39.12126],[-107.62076,39.05974],[-107.68231,39.05971],[-107.68226,38.99652],[-107.81774,38.99645],[-107.81779,39.05859],[-107.86948,39.05856],[-107.86943,38.99769],[-108.05698,38.99759],[-108.05688,38.87126],[-108.18204,38.8712],[-108.18198,38.8081],[-108.37142,38.808],[-108.3711,38.43452],[-109.06685,38.43416],[-109.06765,39.37875]]],terms_url:"http://gis.mesacounty.us/",terms_text:"Mesa County GIS",icon:"https://gis.mesacounty.us/globalassets/images/county-logos/mesa-county-logo.png"},{id:"MCGIS-County-Valleywide-Imagery-2018",name:"Mesa County GIS Valleywide 2018",type:"wms",template:"https://mcgis.mesacounty.us/image/services/Mosaic_Datasets/City_Color_2018/ImageServer/WMSServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",endDate:"2018-01-01T00:00:00.000Z",startDate:"2018-01-01T00:00:00.000Z",zoomExtent:[0,20],polygon:[[[-108.93915,39.23931],[-108.86841,39.23846],[-108.86843,39.23734],[-108.81245,39.23666],[-108.81274,39.22256],[-108.79405,39.22234],[-108.79432,39.20857],[-108.70096,39.20745],[-108.70123,39.1939],[-108.60764,39.19277],[-108.60791,39.17906],[-108.58915,39.17884],[-108.58943,39.1649],[-108.53332,39.16422],[-108.53361,39.14993],[-108.51461,39.14971],[-108.51489,39.13611],[-108.44076,39.13522],[-108.44104,39.12109],[-108.42192,39.12086],[-108.42201,39.1163],[-108.3984,39.11602],[-108.39798,39.13708],[-108.32446,39.13619],[-108.32416,39.15107],[-108.30718,39.15087],[-108.3066,39.18],[-108.28866,39.17979],[-108.28807,39.20939],[-108.26868,39.20916],[-108.26957,39.16484],[-108.2864,39.16505],[-108.28699,39.13571],[-108.30312,39.13591],[-108.3038,39.10194],[-108.32335,39.10218],[-108.32328,39.10574],[-108.32914,39.10581],[-108.32943,39.09121],[-108.34736,39.09142],[-108.34764,39.07715],[-108.36637,39.07738],[-108.36666,39.06268],[-108.38569,39.06291],[-108.38599,39.04799],[-108.42216,39.04843],[-108.42245,39.03377],[-108.44051,39.03399],[-108.44137,38.99101],[-108.42193,38.99077],[-108.42252,38.96127],[-108.44162,38.9615],[-108.44133,38.97595],[-108.46034,38.97618],[-108.46006,38.99024],[-108.47877,38.99047],[-108.47848,39.00485],[-108.51515,39.0053],[-108.51519,39.00287],[-108.51825,39.00291],[-108.51821,39.00517],[-108.53414,39.00536],[-108.53397,39.0139],[-108.54342,39.01401],[-108.54336,39.01733],[-108.5455,39.01735],[-108.54548,39.01855],[-108.65864,39.01991],[-108.65778,39.06287],[-108.67867,39.06313],[-108.67837,39.07793],[-108.69699,39.07816],[-108.69671,39.09203],[-108.71557,39.09225],[-108.71529,39.10619],[-108.7388,39.10648],[-108.73853,39.12033],[-108.75744,39.12056],[-108.75686,39.14927],[-108.79422,39.14972],[-108.79393,39.16386],[-108.83224,39.16432],[-108.83196,39.17845],[-108.85061,39.17868],[-108.85033,39.19302],[-108.86938,39.19325],[-108.86906,39.20925],[-108.90237,39.20965],[-108.90208,39.22384],[-108.93946,39.22429],[-108.93915,39.23931]]],terms_url:"http://gis.mesacounty.us/",terms_text:"Mesa County GIS",icon:"https://gis.mesacounty.us/globalassets/images/county-logos/mesa-county-logo.png"},{id:"Metropole_Ruhr_RVR-DOP10",name:"Metropole Ruhr: Luftbilder (10 cm)",type:"wms",template:"https://geodaten.metropoleruhr.de/dop/dop?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=DOP&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[6.51691,51.81714],[6.52258,51.81469],[6.52281,51.81041],[6.52834,51.81053],[6.53991,51.80134],[6.5511,51.799],[6.56818,51.78992],[6.57476,51.79606],[6.58457,51.79369],[6.59102,51.8024],[6.60911,51.80019],[6.61081,51.79423],[6.63264,51.79981],[6.65946,51.7892],[6.66837,51.77738],[6.7138,51.78084],[6.70876,51.77131],[6.72131,51.76899],[6.7475,51.77035],[6.74862,51.77551],[6.75824,51.77656],[6.7698,51.76649],[6.77219,51.74596],[6.78862,51.74884],[6.79861,51.74217],[6.81927,51.74341],[6.81956,51.73741],[6.82683,51.72983],[6.8403,51.73694],[6.84995,51.73712],[6.85551,51.73636],[6.8586,51.72956],[6.9103,51.74592],[6.90861,51.75275],[6.91511,51.76144],[6.9157,51.7786],[6.93527,51.7738],[6.95606,51.77245],[6.97559,51.79936],[6.98794,51.80129],[6.99485,51.80141],[6.99497,51.79884],[7.02118,51.80014],[7.0244,51.7899],[7.03141,51.78745],[7.0316,51.78317],[7.03847,51.78414],[7.05392,51.77839],[7.06079,51.77936],[7.0609,51.77679],[7.07333,51.777],[7.07867,51.78137],[7.11433,51.78795],[7.13435,51.80542],[7.1616,51.81528],[7.16419,51.8196],[7.19177,51.82174],[7.2141,51.81694],[7.22121,51.81191],[7.23658,51.80785],[7.23668,51.80528],[7.24916,51.80461],[7.2535,51.79953],[7.26179,51.79966],[7.26485,51.79198],[7.26245,51.78252],[7.27229,51.77838],[7.26002,51.77391],[7.26012,51.77134],[7.2688,51.76118],[7.27577,51.75957],[7.27889,51.75019],[7.31079,51.74636],[7.3151,51.74214],[7.31519,51.73957],[7.31102,51.74036],[7.3125,51.73781],[7.32081,51.73707],[7.31169,51.72237],[7.29963,51.71277],[7.2985,51.70589],[7.31069,51.71207],[7.30825,51.70346],[7.32762,51.70202],[7.33057,51.69692],[7.34427,51.69969],[7.34599,51.69028],[7.33919,51.68761],[7.35589,51.68356],[7.35877,51.68017],[7.3781,51.67959],[7.39086,51.66947],[7.40617,51.6654],[7.41031,51.66545],[7.4101,51.67145],[7.43089,51.6683],[7.43892,51.67527],[7.44854,51.67625],[7.44933,51.69341],[7.44094,51.69673],[7.43792,51.7044],[7.42406,51.70593],[7.42245,51.71277],[7.43451,51.72321],[7.44825,51.72511],[7.46718,51.7365],[7.47273,51.73572],[7.4771,51.72892],[7.4826,51.72985],[7.47877,51.72037],[7.48435,51.71872],[7.48449,51.71444],[7.49119,51.72053],[7.49947,51.72063],[7.50214,51.72324],[7.51738,51.72172],[7.51788,51.70629],[7.53035,51.70473],[7.52922,51.69701],[7.53349,51.69277],[7.54458,51.6912],[7.5378,51.68768],[7.54477,51.6852],[7.5528,51.69301],[7.56651,51.69575],[7.56642,51.69832],[7.58706,51.70029],[7.59379,51.70551],[7.6048,51.7065],[7.60743,51.71082],[7.6143,51.71176],[7.61419,51.71518],[7.62663,51.71447],[7.62814,51.7102],[7.64321,51.71381],[7.6531,51.70621],[7.65428,51.71308],[7.668,51.71581],[7.66915,51.72353],[7.68832,51.72889],[7.69283,51.71608],[7.7012,51.71275],[7.71352,51.71631],[7.71481,51.71976],[7.71899,51.71809],[7.71749,51.72236],[7.72163,51.7224],[7.72555,51.73016],[7.73659,51.73028],[7.73638,51.73799],[7.75154,51.73901],[7.7699,51.72378],[7.77119,51.72722],[7.78908,51.72912],[7.79037,51.73256],[7.80282,51.73183],[7.80137,51.73439],[7.80825,51.73531],[7.81228,51.73964],[7.82058,51.73887],[7.82457,51.74491],[7.83287,51.74413],[7.83314,51.73385],[7.83739,51.72961],[7.85815,51.72724],[7.85822,51.72467],[7.86374,51.72472],[7.87187,51.7308],[7.87745,51.72828],[7.88038,51.72145],[7.88875,51.7181],[7.88912,51.70267],[7.90148,51.70536],[7.90568,51.70283],[7.91249,51.70632],[7.92768,51.7056],[7.92912,51.70305],[7.94014,51.704],[7.93746,51.70055],[7.94296,51.70146],[7.96108,51.69305],[7.97631,51.69061],[7.97779,51.68633],[7.9875,51.68385],[7.98761,51.67871],[7.99732,51.67622],[7.9974,51.67279],[7.98365,51.67096],[7.96286,51.67592],[7.95466,51.67242],[7.95366,51.65612],[7.94689,51.65092],[7.94984,51.64237],[7.94443,51.63804],[7.93477,51.6388],[7.93224,51.62935],[7.92406,51.62585],[7.92414,51.62242],[7.91195,51.61374],[7.91632,51.60349],[7.91378,51.59489],[7.87529,51.59282],[7.86837,51.59446],[7.85742,51.59179],[7.85889,51.58837],[7.82749,51.57863],[7.84327,51.55307],[7.83262,51.53925],[7.83277,51.53325],[7.84115,51.52819],[7.8345,51.51955],[7.83755,51.50758],[7.83212,51.50496],[7.83912,51.49988],[7.83923,51.4956],[7.84474,51.49479],[7.8506,51.48028],[7.83418,51.4784],[7.82198,51.47228],[7.80819,51.47471],[7.79876,51.46776],[7.78906,51.47109],[7.76169,51.46823],[7.74785,51.47237],[7.7425,51.46717],[7.73567,51.46623],[7.72864,51.47216],[7.69838,51.4744],[7.67525,51.46728],[7.65606,51.46621],[7.65347,51.46103],[7.63843,51.45914],[7.63589,51.45226],[7.62083,51.45122],[7.61407,51.44772],[7.61977,51.44092],[7.62525,51.44099],[7.62127,51.43666],[7.62825,51.43245],[7.62561,51.42899],[7.63125,51.42391],[7.61633,51.41859],[7.62183,51.4178],[7.62196,51.41352],[7.63313,51.40679],[7.61322,51.38512],[7.60485,51.39017],[7.60609,51.39447],[7.59647,51.39521],[7.58704,51.38995],[7.59,51.38313],[7.58465,51.37878],[7.58644,51.36509],[7.59234,51.35144],[7.59934,51.34638],[7.59257,51.34373],[7.59407,51.33946],[7.58186,51.33588],[7.58334,51.33247],[7.57655,51.33067],[7.57816,51.32298],[7.58373,51.31962],[7.57837,51.31612],[7.58134,51.30844],[7.58547,51.30763],[7.58305,51.29732],[7.56826,51.28942],[7.56582,51.27996],[7.55089,51.27635],[7.54977,51.26862],[7.52923,51.27008],[7.52797,51.26663],[7.51302,51.26387],[7.51049,51.25784],[7.50371,51.25604],[7.50385,51.25175],[7.49563,51.2525],[7.49438,51.24906],[7.49708,51.24995],[7.50271,51.24488],[7.50143,51.24229],[7.48262,51.23262],[7.469,51.23158],[7.46505,51.22724],[7.45129,51.23049],[7.44191,51.22522],[7.44478,51.22098],[7.43534,51.21742],[7.43816,51.21489],[7.43413,51.21312],[7.42995,51.21563],[7.42962,51.22506],[7.42408,51.22756],[7.41182,51.22653],[7.41342,51.2197],[7.39824,51.22463],[7.39521,51.23317],[7.40319,51.23928],[7.3934,51.246],[7.38793,51.24593],[7.38672,51.24162],[7.37853,51.24151],[7.37289,51.24657],[7.35526,51.2429],[7.35405,51.23859],[7.34849,51.24109],[7.339,51.23924],[7.33872,51.24695],[7.32904,51.25024],[7.3238,51.24417],[7.31284,51.24487],[7.31027,51.24054],[7.30481,51.24046],[7.29643,51.24549],[7.29764,51.24979],[7.28262,51.24957],[7.27541,51.25975],[7.2715,51.25455],[7.26734,51.25621],[7.26578,51.26133],[7.27623,51.27434],[7.26764,51.2845],[7.25531,51.28518],[7.26537,51.30847],[7.26521,51.31276],[7.25974,51.31268],[7.26511,51.31533],[7.26365,51.31788],[7.23393,51.308],[7.22973,51.31051],[7.2271,51.3079],[7.22296,51.3087],[7.22309,51.30527],[7.20682,51.30159],[7.20026,51.29463],[7.18792,51.2953],[7.18232,51.29864],[7.16869,51.29757],[7.18065,51.30633],[7.16674,51.31211],[7.16924,51.31815],[7.16503,51.32066],[7.1662,51.32582],[7.15645,51.32996],[7.15351,51.33505],[7.14807,51.33411],[7.14927,51.33842],[7.14513,51.33921],[7.15292,51.34962],[7.14882,51.34956],[7.14731,51.35296],[7.15665,51.35911],[7.15911,51.36601],[7.15189,51.37532],[7.14634,51.37695],[7.13957,51.37513],[7.13802,51.37939],[7.13262,51.37759],[7.127,51.38093],[7.12163,51.37827],[7.12153,51.38084],[7.11742,51.38078],[7.11626,51.37561],[7.11215,51.37555],[7.11205,51.37812],[7.1039,51.37627],[7.09853,51.37361],[7.10004,51.37021],[7.0919,51.36836],[7.08765,51.37172],[7.08088,51.3699],[7.07796,51.37414],[7.0552,51.36176],[7.04973,51.36167],[7.04404,51.36671],[7.03604,51.36144],[7.01944,51.36544],[7.01,51.36185],[7.00745,51.35752],[6.98689,51.35803],[6.98301,51.35282],[6.97743,51.35529],[6.97621,51.35184],[6.96545,51.34737],[6.95033,51.34882],[6.94748,51.35134],[6.9257,51.34839],[6.92422,51.35093],[6.92825,51.35272],[6.92137,51.35346],[6.92391,51.35779],[6.90565,51.36775],[6.90022,51.3668],[6.8904,51.37176],[6.87848,51.36297],[6.86745,51.36449],[6.85115,51.36162],[6.84552,51.36495],[6.84991,51.35903],[6.83385,51.35101],[6.82295,51.34995],[6.81731,51.35328],[6.81615,51.34897],[6.80939,51.34713],[6.80649,51.3505],[6.7941,51.35198],[6.79314,51.34339],[6.77673,51.34308],[6.7475,51.35281],[6.73831,51.34492],[6.72749,51.34214],[6.71287,51.33328],[6.69193,51.34144],[6.66428,51.3469],[6.65435,51.35356],[6.65789,51.36477],[6.67409,51.36938],[6.67794,51.3746],[6.67511,51.37626],[6.6684,51.37356],[6.67309,51.38908],[6.66081,51.38798],[6.65693,51.38362],[6.64602,51.38254],[6.64443,51.3868],[6.63626,51.38577],[6.63586,51.39348],[6.611,51.39726],[6.59479,51.39265],[6.57148,51.39302],[6.56618,51.38948],[6.55797,51.38931],[6.55496,51.39439],[6.54679,51.39337],[6.54505,51.40019],[6.53816,51.4009],[6.52939,51.41101],[6.52596,51.42379],[6.5149,51.42527],[6.51453,51.43213],[6.51987,51.43481],[6.52092,51.44084],[6.51119,51.4432],[6.50821,51.44743],[6.50273,51.44731],[6.50198,51.46101],[6.50709,51.46798],[6.49868,51.47123],[6.49698,51.4772],[6.49012,51.47705],[6.48714,51.48127],[6.4818,51.47859],[6.47608,51.48275],[6.47404,51.49471],[6.46699,51.49799],[6.46245,51.50561],[6.45407,51.508],[6.45497,51.51659],[6.44796,51.51901],[6.45326,51.52255],[6.44876,51.52931],[6.45562,51.52946],[6.47816,51.51966],[6.47499,51.52731],[6.48673,51.53871],[6.46262,51.55191],[6.49612,51.56806],[6.46176,51.56732],[6.42276,51.5759],[6.41912,51.56725],[6.40847,51.56101],[6.38918,51.56144],[6.37657,51.56545],[6.36951,51.56872],[6.36916,51.57471],[6.37726,51.57747],[6.37284,51.58251],[6.37372,51.59111],[6.35235,51.60349],[6.33482,51.59709],[6.32362,51.60026],[6.32067,51.60363],[6.33275,51.60905],[6.33392,51.6125],[6.30035,51.62117],[6.30143,51.62633],[6.29113,51.63725],[6.29225,51.64156],[6.29903,51.64343],[6.32563,51.63632],[6.32819,51.63981],[6.35403,51.64554],[6.35313,51.66095],[6.36553,51.66123],[6.36262,51.66374],[6.37069,51.66735],[6.38091,51.6813],[6.38062,51.68643],[6.37195,51.6931],[6.35808,51.6945],[6.35482,51.703],[6.3682,51.71016],[6.37642,51.7112],[6.38041,51.71387],[6.37731,51.7198],[6.38829,51.7209],[6.38789,51.72775],[6.40932,51.73937],[6.41055,51.74197],[6.40346,51.74524],[6.40597,51.74959],[6.40178,51.75035],[6.40287,51.75552],[6.41405,51.75319],[6.42134,51.7465],[6.42188,51.73708],[6.40877,51.72478],[6.40921,51.71708],[6.4164,51.71209],[6.44839,51.70765],[6.46246,51.70281],[6.47677,51.71855],[6.48908,51.72053],[6.48418,51.73414],[6.48942,51.7394],[6.48908,51.74539],[6.48171,51.75381],[6.53363,51.76434],[6.52478,51.77444],[6.50784,51.78094],[6.4898,51.80714],[6.48961,51.81056],[6.51162,51.81274],[6.51691,51.81714]]],terms_url:"https://www.metropoleruhr.de/regionalverband-ruhr.html",terms_text:"Datengrundlage: Regionalverband Ruhr"},{id:"miljodirektoratet-vern",name:"Miljødirektoratet Protected Areas overlay",type:"wms",template:"https://kart.miljodirektoratet.no/arcgis/services/vern/MapServer/WmsServer?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=naturvern_klasser_omrade&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[0,22],polygon:[[[-10.95725,71.60964],[-6.16765,71.62095],[-6.13756,70.30991],[-10.92717,70.29784],[-10.95725,71.60964]],[[16.81947,74.9482],[21.25771,74.94213],[21.23712,73.8918],[16.79889,73.89828],[16.81947,74.9482]],[[4.04288,79.93593],[20.65421,81.54417],[36.6503,80.40108],[26.76265,75.8129],[13.88667,75.79135],[4.04288,79.93593]],[[31.90425,70.43681],[28.47652,71.32896],[23.6865,71.25143],[16.80906,70.07308],[11.16207,67.52539],[9.97554,64.81158],[4.21871,62.145],[4.37254,59.1872],[6.17431,57.8915],[7.93212,57.73936],[10.77758,58.86491],[11.7224,58.76251],[12.72216,60.11415],[13.05175,61.34935],[12.52439,63.61699],[14.23826,63.98561],[15.11717,65.90166],[18.69871,68.37491],[20.06101,68.26126],[21.00584,68.78415],[25.24656,68.3506],[26.93845,69.8472],[28.76219,69.61121],[28.5864,68.8556],[31.06931,69.51915],[31.90425,70.43681]]],terms_url:"https://kart.naturbase.no",terms_text:"© Miljødirektoratet",description:"Norwegian national parks, nature reserves and other protected areas and objects from Naturbase, including Svalbard/Spitsbergen",icon:"http://www.miljodirektoratet.no/Framework/favicon-32.png",overlay:true},{id:"miljodirektoratet-friluftsomrader",name:"Miljødirektoratet Public Recreation Areas overlay",type:"wms",template:"https://kart.miljodirektoratet.no/arcgis/services/friluftsliv_statlig_sikra/MapServer/WmsServer?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=friluftsliv_statlig_sikra&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",zoomExtent:[0,22],polygon:[[[31.90425,70.43681],[28.47652,71.32896],[23.6865,71.25143],[16.80906,70.07308],[11.16207,67.52539],[9.97554,64.81158],[4.21871,62.145],[4.37254,59.1872],[6.17431,57.8915],[7.93212,57.73936],[10.77758,58.86491],[11.7224,58.76251],[12.72216,60.11415],[13.05175,61.34935],[12.52439,63.61699],[14.23826,63.98561],[15.11717,65.90166],[18.69871,68.37491],[20.06101,68.26126],[21.00584,68.78415],[25.24656,68.3506],[26.93845,69.8472],[28.76219,69.61121],[28.5864,68.8556],[31.06931,69.51915],[31.90425,70.43681]]],terms_url:"http://www.miljostatus.no/tema/friluftsliv/statlig-sikra-friluftlivsomrader/",terms_text:"© Miljødirektoratet",description:"Public recreation areas with State ownership (\"friluftsområder\").",icon:"http://www.miljodirektoratet.no/Framework/favicon-32.png",overlay:true},{id:"minador_do_negrao",name:"Minador do Negrão",type:"wms",template:"http://geoserver.dados.al.gov.br:8080/geoserver/Alagoas/ows?LAYERS=Minador%20do%20Negrao&SERVICE=WMS&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.0&SERVICE=WMS&REQUEST=GetMap&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[-36.8196,-9.35174],[-36.82017,-9.26142],[-36.82465,-9.26133],[-36.83064,-9.26147],[-36.83673,-9.2615],[-36.84228,-9.26148],[-36.84562,-9.2616],[-36.85564,-9.2616],[-36.86214,-9.26159],[-36.8659,-9.26147],[-36.86724,-9.2615],[-36.86952,-9.26149],[-36.87127,-9.26157],[-36.87476,-9.26153],[-36.87816,-9.26163],[-36.88321,-9.2617],[-36.88565,-9.26167],[-36.88857,-9.26148],[-36.89217,-9.26151],[-36.89383,-9.26163],[-36.8974,-9.26175],[-36.91122,-9.26183],[-36.9111,-9.26651],[-36.91112,-9.28542],[-36.91121,-9.29066],[-36.91118,-9.29368],[-36.91099,-9.29929],[-36.91091,-9.30729],[-36.9109,-9.3123],[-36.91083,-9.31597],[-36.91084,-9.32013],[-36.91098,-9.32395],[-36.91099,-9.32587],[-36.91079,-9.32964],[-36.91079,-9.33523],[-36.91074,-9.33944],[-36.91092,-9.34311],[-36.91084,-9.34471],[-36.91066,-9.35229],[-36.89277,-9.35225],[-36.87735,-9.35212],[-36.86463,-9.35203],[-36.85761,-9.35194],[-36.84344,-9.35191],[-36.83115,-9.3518],[-36.8196,-9.35174]]],terms_url:"http://www.seplag.al.gov.br",terms_text:"Secretaria de Estado do Planejamento, Gestão e Patrimônio"},{id:"mml-tausta",name:"MML Background Map",type:"tms",template:"http://tiles.kartat.kapsi.fi/taustakartta/{zoom}/{x}/{y}.jpg",zoomExtent:[2,19],polygon:[[[27.96569,70.0988],[27.57431,70.07728],[27.10876,69.93548],[26.70913,69.97549],[26.45507,69.94207],[25.87142,69.6671],[25.94833,69.61024],[25.83023,69.55323],[25.66955,69.20794],[25.73822,69.01797],[25.60089,68.90309],[25.45806,68.91199],[25.11749,68.80699],[25.07354,68.64355],[24.88128,68.62003],[23.97491,68.84568],[23.74969,68.8308],[23.63433,68.71645],[23.18939,68.68053],[22.52197,68.7553],[21.63894,69.28191],[21.26953,69.31783],[20.94131,69.21622],[21.08963,69.09307],[21.05941,69.04352],[20.72296,69.12491],[20.54443,69.0558],[20.84655,68.97416],[20.81634,68.91742],[21.38754,68.68461],[22.04734,68.47066],[22.80212,68.35464],[23.12072,68.13169],[23.5437,67.9633],[23.44757,67.8393],[23.48602,67.59352],[23.36517,67.46545],[23.71124,67.41592],[23.72772,67.32186],[23.54644,67.26885],[23.53128,67.16724],[23.89251,66.86863],[23.84582,66.57775],[23.61843,66.44562],[23.67171,66.20303],[23.87191,66.14551],[24.09988,65.87247],[24.1658,65.66959],[24.11636,65.39143],[21.37939,63.68037],[20.17639,63.29787],[19.08325,60.16064],[20.22033,59.44786],[22.29125,59.44507],[25.82336,59.933],[27.52075,60.23435],[27.83386,60.53229],[29.29641,61.26165],[31.20803,62.44759],[31.62826,62.90585],[31.2635,63.22106],[29.99605,63.75387],[30.28656,63.81704],[30.58319,64.0782],[30.5104,64.26428],[30.09979,64.39218],[30.02563,64.58736],[30.16845,64.63329],[30.09429,64.79518],[29.78393,64.79811],[29.65347,64.89733],[29.65759,65.05939],[29.91027,65.09527],[29.93225,65.20895],[29.72076,65.27853],[29.91577,65.63788],[30.1863,65.66223],[29.9913,66.09771],[29.07119,66.91983],[30.11077,67.63431],[29.3486,68.08099],[28.67568,68.20166],[28.46547,68.54039],[28.72375,68.72642],[28.82675,68.87341],[28.44985,68.90792],[28.95996,69.05089],[28.83324,69.10563],[28.87207,69.22132],[29.36096,69.46526],[29.15634,69.69667],[28.38455,69.83488],[28.35845,69.88312],[28.17169,69.92511],[28.00415,70.01495],[27.96569,70.0988]]],terms_url:"https://www.maanmittauslaitos.fi/en/",terms_text:"© Maanmittauslaitos",description:"Background map from the National Land Survey of Finland",icon:"https://www.maanmittauslaitos.fi/apple-touch-icon.png"},{id:"mml-orto",name:"MML Orthophoto",type:"tms",template:"http://tiles.kartat.kapsi.fi/ortokuva/{zoom}/{x}/{y}.jpg",zoomExtent:[2,19],polygon:[[[27.96569,70.0988],[27.57431,70.07728],[27.10876,69.93548],[26.70913,69.97549],[26.45507,69.94207],[25.87142,69.6671],[25.94833,69.61024],[25.83023,69.55323],[25.66955,69.20794],[25.73822,69.01797],[25.60089,68.90309],[25.45806,68.91199],[25.11749,68.80699],[25.07354,68.64355],[24.88128,68.62003],[23.97491,68.84568],[23.74969,68.8308],[23.63433,68.71645],[23.18939,68.68053],[22.52197,68.7553],[21.63894,69.28191],[21.26953,69.31783],[20.94131,69.21622],[21.08963,69.09307],[21.05941,69.04352],[20.72296,69.12491],[20.54443,69.0558],[20.84655,68.97416],[20.81634,68.91742],[21.38754,68.68461],[22.04734,68.47066],[22.80212,68.35464],[23.12072,68.13169],[23.5437,67.9633],[23.44757,67.8393],[23.48602,67.59352],[23.36517,67.46545],[23.71124,67.41592],[23.72772,67.32186],[23.54644,67.26885],[23.53128,67.16724],[23.89251,66.86863],[23.84582,66.57775],[23.61843,66.44562],[23.67171,66.20303],[23.87191,66.14551],[24.09988,65.87247],[24.1658,65.66959],[24.11636,65.39143],[21.37939,63.68037],[20.17639,63.29787],[19.08325,60.16064],[20.22033,59.44786],[22.29125,59.44507],[25.82336,59.933],[27.52075,60.23435],[27.83386,60.53229],[29.29641,61.26165],[31.20803,62.44759],[31.62826,62.90585],[31.2635,63.22106],[29.99605,63.75387],[30.28656,63.81704],[30.58319,64.0782],[30.5104,64.26428],[30.09979,64.39218],[30.02563,64.58736],[30.16845,64.63329],[30.09429,64.79518],[29.78393,64.79811],[29.65347,64.89733],[29.65759,65.05939],[29.91027,65.09527],[29.93225,65.20895],[29.72076,65.27853],[29.91577,65.63788],[30.1863,65.66223],[29.9913,66.09771],[29.07119,66.91983],[30.11077,67.63431],[29.3486,68.08099],[28.67568,68.20166],[28.46547,68.54039],[28.72375,68.72642],[28.82675,68.87341],[28.44985,68.90792],[28.95996,69.05089],[28.83324,69.10563],[28.87207,69.22132],[29.36096,69.46526],[29.15634,69.69667],[28.38455,69.83488],[28.35845,69.88312],[28.17169,69.92511],[28.00415,70.01495],[27.96569,70.0988]]],terms_url:"https://www.maanmittauslaitos.fi/en/",terms_text:"© Maanmittauslaitos",best:true,description:"Ortophotos from the National Land Survey of Finland",icon:"https://www.maanmittauslaitos.fi/apple-touch-icon.png"},{id:"mml-topo",name:"MML Topographic Map",type:"tms",template:"http://tiles.kartat.kapsi.fi/peruskartta/{zoom}/{x}/{y}.jpg",zoomExtent:[2,19],polygon:[[[27.96569,70.0988],[27.57431,70.07728],[27.10876,69.93548],[26.70913,69.97549],[26.45507,69.94207],[25.87142,69.6671],[25.94833,69.61024],[25.83023,69.55323],[25.66955,69.20794],[25.73822,69.01797],[25.60089,68.90309],[25.45806,68.91199],[25.11749,68.80699],[25.07354,68.64355],[24.88128,68.62003],[23.97491,68.84568],[23.74969,68.8308],[23.63433,68.71645],[23.18939,68.68053],[22.52197,68.7553],[21.63894,69.28191],[21.26953,69.31783],[20.94131,69.21622],[21.08963,69.09307],[21.05941,69.04352],[20.72296,69.12491],[20.54443,69.0558],[20.84655,68.97416],[20.81634,68.91742],[21.38754,68.68461],[22.04734,68.47066],[22.80212,68.35464],[23.12072,68.13169],[23.5437,67.9633],[23.44757,67.8393],[23.48602,67.59352],[23.36517,67.46545],[23.71124,67.41592],[23.72772,67.32186],[23.54644,67.26885],[23.53128,67.16724],[23.89251,66.86863],[23.84582,66.57775],[23.61843,66.44562],[23.67171,66.20303],[23.87191,66.14551],[24.09988,65.87247],[24.1658,65.66959],[24.11636,65.39143],[21.37939,63.68037],[20.17639,63.29787],[19.08325,60.16064],[20.22033,59.44786],[22.29125,59.44507],[25.82336,59.933],[27.52075,60.23435],[27.83386,60.53229],[29.29641,61.26165],[31.20803,62.44759],[31.62826,62.90585],[31.2635,63.22106],[29.99605,63.75387],[30.28656,63.81704],[30.58319,64.0782],[30.5104,64.26428],[30.09979,64.39218],[30.02563,64.58736],[30.16845,64.63329],[30.09429,64.79518],[29.78393,64.79811],[29.65347,64.89733],[29.65759,65.05939],[29.91027,65.09527],[29.93225,65.20895],[29.72076,65.27853],[29.91577,65.63788],[30.1863,65.66223],[29.9913,66.09771],[29.07119,66.91983],[30.11077,67.63431],[29.3486,68.08099],[28.67568,68.20166],[28.46547,68.54039],[28.72375,68.72642],[28.82675,68.87341],[28.44985,68.90792],[28.95996,69.05089],[28.83324,69.10563],[28.87207,69.22132],[29.36096,69.46526],[29.15634,69.69667],[28.38455,69.83488],[28.35845,69.88312],[28.17169,69.92511],[28.00415,70.01495],[27.96569,70.0988]]],terms_url:"https://www.maanmittauslaitos.fi/en/",terms_text:"© Maanmittauslaitos",description:"Topographic map from the National Land Survey of Finland",icon:"https://www.maanmittauslaitos.fi/apple-touch-icon.png"},{id:"mtbmap-no",name:"MTBmap.no",type:"tms",template:"https://mtbmap.no/tiles/osm/mtbmap/{zoom}/{x}/{y}.jpg",tileSize:512,zoomExtent:[3,14],polygon:[[[31.90425,70.43681],[28.47652,71.32896],[23.6865,71.25143],[16.80906,70.07308],[11.16207,67.52539],[9.97554,64.81158],[4.21871,62.145],[4.37254,59.1872],[6.17431,57.8915],[7.93212,57.73936],[10.77758,58.86491],[11.7224,58.76251],[12.72216,60.11415],[13.05175,61.34935],[12.52439,63.61699],[14.23826,63.98561],[15.11717,65.90166],[18.69871,68.37491],[20.06101,68.26126],[21.00584,68.78415],[25.24656,68.3506],[26.93845,69.8472],[28.76219,69.61121],[28.5864,68.8556],[31.06931,69.51915],[31.90425,70.43681]]],terms_url:"https://www.mtbmap.no/",terms_text:"© MTBmap.no",description:"Norwegian mountain biking map from OSM (max zoom 14-16, varies per region)",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/no/MTBmapno.png"},{id:"MunichLatestAerialImagery",name:"Munich latest aerial imagery 60cm",type:"wms",template:"https://ogc.muenchen.de/wms/opendata_luftbild?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=bgl0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2015-01-01T00:00:00.000Z",startDate:"2015-01-01T00:00:00.000Z",zoomExtent:[11,22],polygon:[[[11.48878,48.053],[11.55589,48.05323],[11.55583,48.06224],[11.56915,48.06229],[11.56908,48.07128],[11.64986,48.07155],[11.64993,48.06256],[11.70326,48.06274],[11.70313,48.08074],[11.71673,48.08079],[11.71667,48.08968],[11.7299,48.08972],[11.72963,48.12566],[11.74313,48.1257],[11.74292,48.15276],[11.72943,48.15271],[11.72936,48.16152],[11.71612,48.16147],[11.71592,48.18859],[11.7027,48.18855],[11.70263,48.19752],[11.67558,48.19743],[11.67537,48.22446],[11.66176,48.22441],[11.66169,48.23355],[11.64863,48.2335],[11.64857,48.24246],[11.54064,48.2421],[11.54058,48.25093],[11.52735,48.25088],[11.52728,48.26001],[11.47335,48.25983],[11.47356,48.23291],[11.46014,48.23287],[11.46021,48.22373],[11.43336,48.22364],[11.43343,48.21439],[11.3798,48.21421],[11.37987,48.20518],[11.36607,48.20514],[11.36621,48.18741],[11.35259,48.18737],[11.35266,48.17817],[11.33946,48.17813],[11.33973,48.14216],[11.36684,48.14225],[11.36697,48.12443],[11.38083,48.12448],[11.3809,48.11558],[11.44769,48.1158],[11.44804,48.07087],[11.46186,48.07091],[11.46193,48.06193],[11.48872,48.06202],[11.48878,48.053]]],terms_url:"http://www.geodatenservice-muenchen.de/",terms_text:"Datenquelle: dl-de/by-2-0: Landeshauptstadt München – Kommunalreferat – GeodatenService – www.geodatenservice-muenchen.de",icon:"https://www.muenchen.de/media/css/images/favicon_114x114.png"},{id:"openlabs-geoportal-public-transport",name:"Municipality of Tirana - Public Transport (Open Labs GeoPortal) (overlay)",type:"tms",template:"https://geoportal.openlabs.cc/mapcache/tms/1.0.0/public-transport@GoogleMapsCompatibleExtended/{zoom}/{x}/{-y}.png",endDate:"2017-01-01T00:00:00.000Z",startDate:"2017-01-01T00:00:00.000Z",zoomExtent:[0,21],polygon:[[[19.73762,41.30154],[19.88628,41.27213],[19.86877,41.38582],[19.68338,41.3732],[19.73762,41.30154]]],terms_url:"https://geoportal.openlabs.cc/",terms_text:"Data provided by the Muncipality of Tirana hosted by Open Labs",description:"Bus stops & lines provided by the Muncipality of Tirana hosted by Open Labs",overlay:true},{id:"openlabs-geoportal-tirana",name:"Municipality of Tirana (Open Labs GeoPortal)",type:"tms",template:"https://geoportal.openlabs.cc/mapcache/tms/1.0.0/tirana@GoogleMapsCompatibleExtended/{zoom}/{x}/{-y}.png",endDate:"2017-01-01T00:00:00.000Z",startDate:"2017-01-01T00:00:00.000Z",zoomExtent:[0,21],polygon:[[[19.70226,41.1404],[19.77573,41.11868],[19.86431,41.12126],[20.24986,41.3495],[20.03082,41.41184],[19.92577,41.5204],[19.88869,41.50755],[19.88937,41.42265],[19.81659,41.46177],[19.7335,41.43037],[19.74174,41.37887],[19.65797,41.37475],[19.57214,41.24322],[19.61815,41.22567],[19.67171,41.22722],[19.70226,41.1404]]],terms_url:"https://geoportal.openlabs.cc",terms_text:"Data provided by the Muncipality of Tirana hosted by Open Labs",description:"Streets & Builings provided by the Muncipality of Tirana hosted by Open Labs"},{id:"NC-US",name:"NC Latest Orthoimagery",type:"wms",template:"https://services.nconemap.gov/secure/services/Imagery/Orthoimagery_Latest/ImageServer/WMSServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2014-01-01T00:00:00.000Z",startDate:"2010-01-01T00:00:00.000Z",polygon:[[[-81.6792,36.5974],[-80.25359,36.54793],[-75.8409,36.5671],[-75.4323,35.6441],[-75.50475,35.18806],[-75.70525,35.17684],[-76.14745,34.94077],[-76.53472,34.55487],[-76.69676,34.66789],[-77.27904,34.53224],[-77.68828,34.26482],[-77.9435,33.8269],[-78.21288,33.89402],[-78.5301,33.8304],[-79.6693,34.7916],[-80.8122,34.8085],[-80.84685,34.96329],[-80.95122,35.05552],[-81.06383,35.01729],[-81.07482,35.13417],[-82.3632,35.1805],[-82.9989,34.9919],[-84.3333,34.9767],[-84.27184,35.28229],[-84.09056,35.27332],[-83.91478,35.53301],[-83.55498,35.5911],[-83.2556,35.73392],[-82.98644,35.81414],[-82.92327,35.96767],[-82.67882,36.0854],[-82.60192,36.08984],[-82.536,35.96989],[-82.35472,36.14752],[-82.04436,36.14309],[-81.90428,36.33803],[-81.74224,36.37342],[-81.6792,36.5974]]],description:"Most recent true color imagery for the state of North Carolina. The imagery has a pixel resolution of 6 inches and is comprised of imagery flown in 2010, 2012, 2013, and 2014"},{id:"landsat-niger-2012_10",name:"Niger Delta Oct 2012 Landsat",type:"tms",template:"http://{switch:a,b,c,d}.imagery.paulnorman.ca/tiles/niger_oct_2012_321/{zoom}/{x}/{y}.png",endDate:"2012-10-01T00:00:00.000Z",startDate:"2012-10-01T00:00:00.000Z",zoomExtent:[1,13],polygon:[[[-6.92922,13.78574],[-5.13295,13.51884],[-5.07802,13.74039],[-3.60036,13.52418],[-3.54543,13.74039],[-2.06227,13.52685],[-1.3564,16.58454],[-3.17464,16.85285],[-3.22408,16.62665],[-4.72371,16.85022],[-4.76766,16.63455],[-6.27553,16.84759],[-6.92922,13.78574]]]},{id:"img.nj.gov-Infrared2015",name:"NJ 2015 Aerial Imagery (Infrared)",type:"wms",template:"https://img.nj.gov/imagerywms/Infrared2015?FORMAT=image/png&SERVICE=WMS&VERSION=1.1.1&REQUEST=GetMap&SRS={proj}&WIDTH={width}&HEIGHT={height}&LAYERS=Infrared2015&BBOX={bbox}",projection:"EPSG:3857",endDate:"2015-05-03T00:00:00.000Z",startDate:"2015-03-29T00:00:00.000Z",zoomExtent:[0,20],polygon:[[[-74.86599,40.08543],[-74.93534,40.07256],[-75.05653,40.00868],[-75.14236,39.95791],[-75.14456,39.88322],[-75.18515,39.88042],[-75.24499,39.85486],[-75.33339,39.8495],[-75.41531,39.80156],[-75.45131,39.78304],[-75.57744,39.62346],[-75.54245,39.56827],[-75.57847,39.48183],[-74.91678,38.84647],[-74.31702,39.38739],[-74.06708,39.75155],[-73.92141,40.49222],[-74.2382,40.49378],[-74.23859,40.54916],[-74.20211,40.54924],[-74.20228,40.57648],[-74.18406,40.57609],[-74.18436,40.63146],[-74.07587,40.63078],[-74.07532,40.64457],[-74.02124,40.65811],[-74.02081,40.69919],[-74.00265,40.69929],[-74.00247,40.74037],[-73.98434,40.74026],[-73.98402,40.78145],[-73.96591,40.78158],[-73.96597,40.80868],[-73.94777,40.80861],[-73.94769,40.82232],[-73.92966,40.82225],[-73.92906,40.86355],[-73.91104,40.86329],[-73.91061,40.91838],[-73.8923,40.91831],[-73.89215,40.95961],[-73.87413,40.95942],[-73.87386,40.99251],[-74.70601,41.36513],[-74.75716,41.34769],[-74.79801,41.32268],[-74.84024,41.27864],[-74.90547,41.17038],[-74.98152,41.1126],[-75.03902,41.03819],[-75.13515,40.99441],[-75.13773,40.97309],[-75.05705,40.86757],[-75.06846,40.85037],[-75.09687,40.85096],[-75.10099,40.83927],[-75.09018,40.82238],[-75.1367,40.77729],[-75.1724,40.78067],[-75.19833,40.75389],[-75.20506,40.69131],[-75.20373,40.61832],[-75.19764,40.57367],[-75.16777,40.55907],[-75.10237,40.56702],[-75.06906,40.5365],[-75.07421,40.45505],[-75.06134,40.4165],[-75.02684,40.40252],[-74.9671,40.3952],[-74.94461,40.33817],[-74.86839,40.29157],[-74.84402,40.24796],[-74.77552,40.21428],[-74.76334,40.19172],[-74.72918,40.16392],[-74.72609,40.14949],[-74.78805,40.12468],[-74.8229,40.13033],[-74.86599,40.08543]]],terms_url:"https://njgin.state.nj.us/NJ_NJGINExplorer/ShowMetadata.jsp?docId=188471FF-2803-4145-A5AD-605DE86D3B4D",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:"img.nj.gov-Natural2015",name:"NJ 2015 Aerial Imagery (Natural Color)",type:"wms",template:"https://img.nj.gov/imagerywms/Natural2015?FORMAT=image/png&SERVICE=WMS&VERSION=1.1.1&REQUEST=GetMap&SRS={proj}&WIDTH={width}&HEIGHT={height}&LAYERS=Natural2015&BBOX={bbox}",projection:"EPSG:3857",endDate:"2015-05-03T00:00:00.000Z",startDate:"2015-03-29T00:00:00.000Z",zoomExtent:[0,20],polygon:[[[-74.86599,40.08543],[-74.93534,40.07256],[-75.05653,40.00868],[-75.14236,39.95791],[-75.14456,39.88322],[-75.18515,39.88042],[-75.24499,39.85486],[-75.33339,39.8495],[-75.41531,39.80156],[-75.45131,39.78304],[-75.57744,39.62346],[-75.54245,39.56827],[-75.57847,39.48183],[-74.91678,38.84647],[-74.31702,39.38739],[-74.06708,39.75155],[-73.92141,40.49222],[-74.2382,40.49378],[-74.23859,40.54916],[-74.20211,40.54924],[-74.20228,40.57648],[-74.18406,40.57609],[-74.18436,40.63146],[-74.07587,40.63078],[-74.07532,40.64457],[-74.02124,40.65811],[-74.02081,40.69919],[-74.00265,40.69929],[-74.00247,40.74037],[-73.98434,40.74026],[-73.98402,40.78145],[-73.96591,40.78158],[-73.96597,40.80868],[-73.94777,40.80861],[-73.94769,40.82232],[-73.92966,40.82225],[-73.92906,40.86355],[-73.91104,40.86329],[-73.91061,40.91838],[-73.8923,40.91831],[-73.89215,40.95961],[-73.87413,40.95942],[-73.87386,40.99251],[-74.70601,41.36513],[-74.75716,41.34769],[-74.79801,41.32268],[-74.84024,41.27864],[-74.90547,41.17038],[-74.98152,41.1126],[-75.03902,41.03819],[-75.13515,40.99441],[-75.13773,40.97309],[-75.05705,40.86757],[-75.06846,40.85037],[-75.09687,40.85096],[-75.10099,40.83927],[-75.09018,40.82238],[-75.1367,40.77729],[-75.1724,40.78067],[-75.19833,40.75389],[-75.20506,40.69131],[-75.20373,40.61832],[-75.19764,40.57367],[-75.16777,40.55907],[-75.10237,40.56702],[-75.06906,40.5365],[-75.07421,40.45505],[-75.06134,40.4165],[-75.02684,40.40252],[-74.9671,40.3952],[-74.94461,40.33817],[-74.86839,40.29157],[-74.84402,40.24796],[-74.77552,40.21428],[-74.76334,40.19172],[-74.72918,40.16392],[-74.72609,40.14949],[-74.78805,40.12468],[-74.8229,40.13033],[-74.86599,40.08543]]],terms_url:"https://njgin.state.nj.us/NJ_NJGINExplorer/ShowMetadata.jsp?docId=188471FF-2803-4145-A5AD-605DE86D3B4D",terms_text:"NJ Office of Information Technology (NJOIT), Office of Geographic Information Systems (OGIS)",description:"Digital orthophotography of New Jersey, Natural Color, 1 foot resolution"},{id:"NLSC-EMAP5",name:"NLSC General Map with Contour line",type:"tms",template:"https://wmts.nlsc.gov.tw/wmts/EMAP5_OPENDATA/default/EPSG:3857/{zoom}/{y}/{x}",startDate:"2015-01-01T00:00:00.000Z",zoomExtent:[0,15],polygon:[[[121.2237,25.76997],[122.2251,26.60305],[122.9312,22.57058],[120.6771,20.72799],[118.2509,23.26265],[118.3036,23.30751],[118.1978,24.34453],[118.1036,24.36172],[118.2283,24.49486],[118.4416,24.55302],[118.6024,24.46068],[120.0474,25.38843],[119.8935,25.78169],[119.787,26.2048],[120.4578,26.53253],[121.2237,25.76997]]],terms_url:"https://maps.nlsc.gov.tw",terms_text:"© National Land Surveying and Mapping Center, Taiwan OGDL 1.0",description:"The emap from Taiwan National Land Surveying and Mapping Center",icon:"https://osmlab.github.io/editor-layer-index/sources/asia/tw/Taiwane-MapOpenData.png"},{id:"IBGE_Salvador_Streets",name:"Nomes de Ruas IBGE Salvador-BA",type:"tms",template:"https://api.mapbox.com/styles/v1/wille/cj8lp78dn62wl2rquim47qo0g/tiles/256/{zoom}/{x}/{y}?access_token=pk.eyJ1Ijoid2lsbGUiLCJhIjoicFNVWk5VWSJ9.hluCd0YGvYHNlFi_utWe2g",zoomExtent:[0,20],polygon:[[[-38.48974,-12.81113],[-38.54485,-13.01392],[-38.47755,-13.03466],[-38.33473,-12.94685],[-38.30006,-12.90669],[-38.33954,-12.90435],[-38.35482,-12.83021],[-38.38091,-12.82184],[-38.40717,-12.86754],[-38.46537,-12.81599],[-38.48974,-12.81113]]],description:"Streets geometry and names of Salvador, Bahia. Source: Faces de Logradouro - IBGE.",overlay:true},{id:"kelkkareitit",name:"Nordic snowmobile overlay",type:"tms",template:"https://tiles.kelkkareitit.fi/kelkkareitit/{zoom}/{x}/{y}.png",zoomExtent:[3,18],polygon:[[[27.53173,60.21799],[31.35496,62.51233],[31.63513,62.90773],[30.09154,64.91889],[30.21239,65.87473],[29.13573,66.90422],[30.19041,67.67609],[28.70726,68.42748],[29.02587,68.9505],[31.04735,69.53452],[31.78344,70.44784],[28.32274,71.32192],[23.76342,71.29023],[17.1826,69.99806],[12.10691,68.01581],[9.97556,64.85828],[4.13084,61.95963],[4.57029,59.00664],[6.21826,57.95859],[8.14086,57.8506],[10.41502,58.75682],[12.63702,56.0383],[12.7716,55.25095],[14.2932,55.19769],[18.58886,56.84297],[20.69823,59.3444],[27.53173,60.21799]]],terms_url:"https://kelkkareitit.fi/",terms_text:"© Kelkkareitit.fi",description:"Kelkkareitit.fi snowmobile trails from OSM (Nordic coverage)",icon:"https://kelkkareitit.fi/img/favicon.png",overlay:true},{id:"geovekst-nib",name:"Norway Orthophoto",type:"tms",template:"https://waapi.webatlas.no/maptiles/tiles/webatlas-orto-newup/wa_grid/{zoom}/{x}/{y}.jpeg?api_key=b8e36d51-119a-423b-b156-d744d54123d5",zoomExtent:[0,21],polygon:[[[11.53568,58.86659],[11.66192,58.89784],[11.7935,59.09471],[11.84243,59.239],[11.82877,59.34509],[11.71279,59.60387],[11.86205,59.63771],[11.95608,59.69196],[11.93389,59.86895],[12.17881,59.8786],[12.46948,60.03124],[12.55438,60.18972],[12.51237,60.31659],[12.61793,60.40065],[12.61883,60.51512],[12.25387,61.01106],[12.69195,61.04632],[12.90756,61.34802],[12.57493,61.57623],[12.42465,61.57175],[12.15233,61.72694],[12.31212,62.26512],[12.07078,62.61109],[12.14907,62.7455],[12.08883,62.89668],[12.23464,62.99952],[11.99225,63.26684],[12.23327,63.47505],[12.17971,63.57117],[12.69313,63.96344],[13.21378,64.0839],[13.99183,64.00514],[14.17035,64.18236],[14.13253,64.47516],[13.67658,64.58356],[14.02455,64.88119],[14.33572,65.11098],[14.51699,65.30365],[14.54177,65.67762],[14.63674,65.81299],[14.53903,66.12496],[15.03881,66.14245],[15.50033,66.27956],[15.39368,66.4795],[15.63473,66.59685],[16.04695,66.90283],[16.39832,67.03827],[16.41439,67.21036],[16.10744,67.43617],[16.16455,67.5087],[16.42318,67.52589],[16.5866,67.64528],[16.7471,67.90466],[17.34741,68.09995],[17.90583,67.95885],[18.16489,68.19424],[18.13721,68.52675],[18.40761,68.57059],[18.62222,68.49607],[18.98574,68.50591],[19.92752,68.34558],[20.24505,68.49201],[19.99237,68.55586],[20.21137,68.65685],[20.34848,68.79976],[20.31623,68.93227],[20.10322,69.0359],[20.55694,69.04926],[20.7206,69.10837],[21.06178,69.02541],[21.12098,69.10587],[21.01135,69.21086],[21.2824,69.30076],[21.62645,69.26589],[22.33512,68.81965],[22.37485,68.70596],[22.5377,68.73329],[22.80161,68.67674],[23.04635,68.67833],[23.16467,68.61903],[23.68789,68.70049],[23.79776,68.81592],[23.96804,68.82287],[24.17541,68.7314],[24.76043,68.63655],[24.8544,68.55285],[24.90827,68.54387],[24.93347,68.6025],[25.12435,68.62003],[25.1667,68.79008],[25.43334,68.87886],[25.62945,68.88103],[25.79589,69.01157],[25.73272,69.19428],[26.02249,69.66758],[26.56631,69.94207],[27.10601,69.89539],[27.63679,70.05317],[27.93548,70.07401],[27.96569,70.00415],[28.40312,69.80824],[29.1014,69.69095],[29.328,69.47585],[28.82859,69.2316],[28.7931,69.0943],[29.04485,68.99986],[29.25292,69.10601],[29.32641,69.22982],[29.29229,69.27632],[29.39117,69.31298],[29.57038,69.31201],[29.85191,69.41631],[29.96795,69.39916],[30.13069,69.4667],[30.2008,69.5658],[30.13137,69.6609],[30.15678,69.66496],[30.51589,69.53787],[30.82077,69.52371],[30.95329,69.55563],[30.96221,69.67832],[30.83578,69.79192],[31.65161,70.17579],[31.78344,70.4662],[30.49255,70.86989],[28.43261,71.30079],[25.66406,71.40266],[23.81835,71.29374],[18.30322,70.40734],[14.24926,69.07641],[11.18408,67.47913],[11.74438,66.90852],[9.95361,64.88393],[4.72961,62.3649],[4.12948,61.69247],[4.08142,61.02637],[4.4577,59.19421],[5.31188,58.4276],[6.47094,57.84475],[7.56408,57.72468],[8.4375,57.91776],[10.59792,58.75006],[10.64905,58.88203],[11.09035,58.97673],[11.16173,59.06743],[11.34175,59.10293],[11.44922,58.99078],[11.45194,58.88136],[11.53568,58.86659]]],terms_url:"https://www.norgeibilder.no",terms_text:"© Geovekst",best:true,description:"Norwegian orthophotos (max zoom 21), courtesy of Geovekst and Norkart.",icon:"https://register.geonorge.no/data/organizations/_L_norgeibilder96x96.png"},{id:"geovekst-nib2",name:"Norway Orthophoto (more recent, less zoom)",type:"tms",template:"https://opencache{switch:,2,3}.statkart.no/gatekeeper/gk/gk.open_nib_web_mercator_wmts_v2?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=Nibcache_web_mercator_v2&STYLE=default&FORMAT=image/jpgpng&tileMatrixSet=default028mm&tileMatrix={zoom}&tileRow={y}&tileCol={x}",zoomExtent:[0,19],polygon:[[[11.53568,58.86659],[11.66192,58.89784],[11.7935,59.09471],[11.84243,59.239],[11.82877,59.34509],[11.71279,59.60387],[11.86205,59.63771],[11.95608,59.69196],[11.93389,59.86895],[12.17881,59.8786],[12.46948,60.03124],[12.55438,60.18972],[12.51237,60.31659],[12.61793,60.40065],[12.61883,60.51512],[12.25387,61.01106],[12.69195,61.04632],[12.90756,61.34802],[12.57493,61.57623],[12.42465,61.57175],[12.15233,61.72694],[12.31212,62.26512],[12.07078,62.61109],[12.14907,62.7455],[12.08883,62.89668],[12.23464,62.99952],[11.99225,63.26684],[12.23327,63.47505],[12.17971,63.57117],[12.69313,63.96344],[13.21378,64.0839],[13.99183,64.00514],[14.17035,64.18236],[14.13253,64.47516],[13.67658,64.58356],[14.02455,64.88119],[14.33572,65.11098],[14.51699,65.30365],[14.54177,65.67762],[14.63674,65.81299],[14.53903,66.12496],[15.03881,66.14245],[15.50033,66.27956],[15.39368,66.4795],[15.63473,66.59685],[16.04695,66.90283],[16.39832,67.03827],[16.41439,67.21036],[16.10744,67.43617],[16.16455,67.5087],[16.42318,67.52589],[16.5866,67.64528],[16.7471,67.90466],[17.34741,68.09995],[17.90583,67.95885],[18.16489,68.19424],[18.13721,68.52675],[18.40761,68.57059],[18.62222,68.49607],[18.98574,68.50591],[19.92752,68.34558],[20.24505,68.49201],[19.99237,68.55586],[20.21137,68.65685],[20.34848,68.79976],[20.31623,68.93227],[20.10322,69.0359],[20.55694,69.04926],[20.7206,69.10837],[21.06178,69.02541],[21.12098,69.10587],[21.01135,69.21086],[21.2824,69.30076],[21.62645,69.26589],[22.33512,68.81965],[22.37485,68.70596],[22.5377,68.73329],[22.80161,68.67674],[23.04635,68.67833],[23.16467,68.61903],[23.68789,68.70049],[23.79776,68.81592],[23.96804,68.82287],[24.17541,68.7314],[24.76043,68.63655],[24.8544,68.55285],[24.90827,68.54387],[24.93347,68.6025],[25.12435,68.62003],[25.1667,68.79008],[25.43334,68.87886],[25.62945,68.88103],[25.79589,69.01157],[25.73272,69.19428],[26.02249,69.66758],[26.56631,69.94207],[27.10601,69.89539],[27.63679,70.05317],[27.93548,70.07401],[27.96569,70.00415],[28.40312,69.80824],[29.1014,69.69095],[29.328,69.47585],[28.82859,69.2316],[28.7931,69.0943],[29.04485,68.99986],[29.25292,69.10601],[29.32641,69.22982],[29.29229,69.27632],[29.39117,69.31298],[29.57038,69.31201],[29.85191,69.41631],[29.96795,69.39916],[30.13069,69.4667],[30.2008,69.5658],[30.13137,69.6609],[30.15678,69.66496],[30.51589,69.53787],[30.82077,69.52371],[30.95329,69.55563],[30.96221,69.67832],[30.83578,69.79192],[31.65161,70.17579],[31.78344,70.4662],[30.49255,70.86989],[28.43261,71.30079],[25.66406,71.40266],[23.81835,71.29374],[18.30322,70.40734],[14.24926,69.07641],[11.18408,67.47913],[11.74438,66.90852],[9.95361,64.88393],[4.72961,62.3649],[4.12948,61.69247],[4.08142,61.02637],[4.4577,59.19421],[5.31188,58.4276],[6.47094,57.84475],[7.56408,57.72468],[8.4375,57.91776],[10.59792,58.75006],[10.64905,58.88203],[11.09035,58.97673],[11.16173,59.06743],[11.34175,59.10293],[11.44922,58.99078],[11.45194,58.88136],[11.53568,58.86659]]],terms_url:"https://www.norgeibilder.no",terms_text:"© Geovekst",best:true,description:"Most recent Norwegian orthophotos (max zoom 19), courtesy of Geovekst and Kartverket.",icon:"https://register.geonorge.no/data/organizations/_L_norgeibilder96x96.png"},{id:"npd-offshore",name:"NPD Offshore Installations overlay",type:"wms",template:"http://gis.npd.no/ogc/factmaps/2_0?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=fclFixed,pplAll,fldByStatus&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[6,20],polygon:[[[8.51989,57.6454],[3.25195,56.08737],[2.61185,56.59434],[1.96321,57.90482],[1.48178,58.42936],[1.98303,60.31063],[1.78802,61.35659],[-0.49061,63.88725],[1.36226,67.01603],[14.99771,74.50082],[36.99371,74.50155],[36.99989,73.68633],[32.06909,70.27429],[23.97215,70.47356],[16.25974,68.58447],[12.12888,64.81157],[5.38328,61.92862],[5.7678,58.85355],[8.51989,57.6454]]],terms_url:"http://www.npd.no/no/Kart/Faktakart/",terms_text:"© Oljedirektoratet",description:"Production platforms and oil/natural gas fields on the Norwegian continental shelf",icon:"https://register.geonorge.no/data/organizations/870917732_od_liten.png",overlay:true},{id:"nve-snoskred",name:"NVE Avalanche Danger Areas overlay",type:"wms",template:"https://gis3.nve.no/map/services/SkredSnoAktR/MapServer/WmsServer?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Snoskred-Aktsomhetsomrader&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[5,13],polygon:[[[31.90425,70.43681],[28.47652,71.32896],[23.6865,71.25143],[16.80906,70.07308],[11.16207,67.52539],[9.97554,64.81158],[4.21871,62.145],[4.37254,59.1872],[6.17431,57.8915],[7.93212,57.73936],[10.77758,58.86491],[11.7224,58.76251],[12.72216,60.11415],[13.05175,61.34935],[12.52439,63.61699],[14.23826,63.98561],[15.11717,65.90166],[18.69871,68.37491],[20.06101,68.26126],[21.00584,68.78415],[25.24656,68.3506],[26.93845,69.8472],[28.76219,69.61121],[28.5864,68.8556],[31.06931,69.51915],[31.90425,70.43681]]],terms_url:"https://www.nve.no/flaum-og-skred/kartlegging/aktsemdkart/aktsomhetskart-for-snoskred/",terms_text:"© NVE",description:"Potential snowslide areas, computed from theoretical height model. Valid for drops higher than 20-50 meters. Dark red=trigger area.",icon:"https://www.nve.no/Content/Images/nve-logo.png",overlay:true},{id:"nve-nettanlegg",name:"NVE Electricity Network overlay",type:"wms",template:"https://gis3.nve.no/map/services/Nettanlegg1/MapServer/WmsServer?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Sentralnett,Regionalnett,Distribusjonsnett,Sjokabler,Master og stolper,Transformatorstasjoner&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[6,22],polygon:[[[31.90425,70.43681],[28.47652,71.32896],[23.6865,71.25143],[16.80906,70.07308],[11.16207,67.52539],[9.97554,64.81158],[4.21871,62.145],[4.37254,59.1872],[6.17431,57.8915],[7.93212,57.73936],[10.77758,58.86491],[11.7224,58.76251],[12.72216,60.11415],[13.05175,61.34935],[12.52439,63.61699],[14.23826,63.98561],[15.11717,65.90166],[18.69871,68.37491],[20.06101,68.26126],[21.00584,68.78415],[25.24656,68.3506],[26.93845,69.8472],[28.76219,69.61121],[28.5864,68.8556],[31.06931,69.51915],[31.90425,70.43681]]],terms_url:"https://www.nve.no/karttjenester/",terms_text:"© NVE",description:"Power lines (high voltage network) including transformers, submarine cables and pylons. Local distribution network is not included.",icon:"https://www.nve.no/Content/Images/nve-logo.png",overlay:true},{id:"nve-vannkraft",name:"NVE Hydropower Plants overlay",type:"wms",template:"https://gis3.nve.no/map/services/Vannkraft1/MapServer/WmsServer?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Vannkraftverk,Vannvei,Dam&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[6,22],polygon:[[[31.90425,70.43681],[28.47652,71.32896],[23.6865,71.25143],[16.80906,70.07308],[11.16207,67.52539],[9.97554,64.81158],[4.21871,62.145],[4.37254,59.1872],[6.17431,57.8915],[7.93212,57.73936],[10.77758,58.86491],[11.7224,58.76251],[12.72216,60.11415],[13.05175,61.34935],[12.52439,63.61699],[14.23826,63.98561],[15.11717,65.90166],[18.69871,68.37491],[20.06101,68.26126],[21.00584,68.78415],[25.24656,68.3506],[26.93845,69.8472],[28.76219,69.61121],[28.5864,68.8556],[31.06931,69.51915],[31.90425,70.43681]]],terms_url:"https://www.nve.no/karttjenester/",terms_text:"© NVE",description:"Hydropower plants including waterways (tunnel, canal, pipeline) and dams",icon:"https://www.nve.no/Content/Images/nve-logo.png",overlay:true},{id:"nve-vindkraft",name:"NVE Wind Power Plants overlay",type:"wms",template:"https://gis3.nve.no/map/services/Vindkraft2/MapServer/WmsServer?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Vindkraft_konsesjon_gitt_ikke_utbygd,Vindkraft_under_bygging,Vindkraft_utbygd,Vindkraftomrade,Vindturbin&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[6,22],polygon:[[[31.90425,70.43681],[28.47652,71.32896],[23.6865,71.25143],[16.80906,70.07308],[11.16207,67.52539],[9.97554,64.81158],[4.21871,62.145],[4.37254,59.1872],[6.17431,57.8915],[7.93212,57.73936],[10.77758,58.86491],[11.7224,58.76251],[12.72216,60.11415],[13.05175,61.34935],[12.52439,63.61699],[14.23826,63.98561],[15.11717,65.90166],[18.69871,68.37491],[20.06101,68.26126],[21.00584,68.78415],[25.24656,68.3506],[26.93845,69.8472],[28.76219,69.61121],[28.5864,68.8556],[31.06931,69.51915],[31.90425,70.43681]]],terms_url:"https://www.nve.no/karttjenester/",terms_text:"© NVE",description:"Wind power turbines, farms and concession areas (blue: planned, light green: construction, dark green: built).",icon:"https://www.nve.no/Content/Images/nve-logo.png",overlay:true},{id:"orthos.dhses.ny.gov_latest",name:"NYS Orthos Online",type:"wms",template:"https://orthos.dhses.ny.gov/arcgis/services/Latest/MapServer/WmsServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=0,1,2,3,4&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2018-01-01T00:00:00.000Z",startDate:"2013-01-01T00:00:00.000Z",zoomExtent:[0,19],polygon:[[[-74.91231,45.03606],[-73.47788,45.02996],[-73.33846,45.03098],[-73.31978,45.00558],[-73.32265,44.98525],[-73.34852,44.9283],[-73.36721,44.8397],[-73.34277,44.81727],[-73.34565,44.77647],[-73.37296,44.73463],[-73.37008,44.67946],[-73.39739,44.64471],[-73.39308,44.60276],[-73.39739,44.54543],[-73.34996,44.51264],[-73.34565,44.49521],[-73.37871,44.4706],[-73.30828,44.43572],[-73.30397,44.41827],[-73.33271,44.33917],[-73.30828,44.27128],[-73.30828,44.25172],[-73.38014,44.14868],[-73.40458,44.04133],[-73.3399,43.79596],[-73.28097,43.64222],[-73.2091,43.54957],[-73.21342,43.51206],[-73.24647,42.67557],[-73.45919,42.14284],[-73.47069,42.03938],[-73.48794,41.73764],[-73.49944,41.64319],[-73.47788,41.62708],[-73.43189,41.57979],[-73.42614,41.56366],[-73.42685,41.45926],[-73.43979,41.40322],[-73.44985,41.38328],[-73.43835,41.37033],[-73.42757,41.35901],[-73.41751,41.3439],[-73.41895,41.27642],[-73.43045,41.24455],[-73.46566,41.19752],[-73.52962,41.14505],[-73.55477,41.13368],[-73.61586,41.13531],[-73.62664,41.10878],[-73.62736,41.05407],[-73.63958,40.99118],[-73.61873,40.98195],[-73.59933,40.96568],[-73.59933,40.93474],[-73.63455,40.91682],[-73.68054,40.89183],[-73.69851,40.87988],[-73.68629,40.87064],[-73.66257,40.87934],[-73.63814,40.90541],[-73.59789,40.91193],[-73.57562,40.9179],[-73.52675,40.92388],[-73.50159,40.94288],[-73.4901,40.95374],[-73.41751,40.96079],[-73.38374,40.96133],[-73.33702,40.95591],[-73.30828,40.93637],[-73.27091,40.92659],[-73.2091,40.91953],[-73.18682,40.92714],[-73.16814,40.93148],[-73.16598,40.95971],[-73.16886,40.97002],[-73.12933,40.98195],[-73.10777,40.98195],[-73.06681,40.9749],[-72.8584,40.97436],[-72.71826,40.98195],[-72.65574,41.00528],[-72.64424,41.00473],[-72.62628,40.99226],[-72.54148,41.03889],[-72.4768,41.06328],[-72.45811,41.08928],[-72.41859,41.09308],[-72.36612,41.13856],[-72.36037,41.1418],[-72.32229,41.15479],[-72.29067,41.16399],[-72.21449,41.18238],[-72.20083,41.19157],[-72.04848,41.25914],[-72.02548,41.2937],[-71.93924,41.30774],[-71.92343,41.30666],[-71.90259,41.2991],[-71.90187,41.28939],[-71.99458,41.24509],[-72.10453,41.19806],[-72.18287,41.16723],[-72.18934,41.16237],[-72.25186,41.12232],[-72.30432,41.10445],[-72.31582,41.09524],[-72.27917,41.08441],[-72.2727,41.08062],[-72.26839,41.04973],[-72.21736,41.04811],[-72.19652,41.04215],[-72.18646,41.05298],[-72.17137,41.0584],[-72.14981,41.05895],[-72.15628,41.09633],[-72.15268,41.1077],[-72.14909,41.14667],[-72.134,41.14505],[-72.07076,41.10553],[-72.07435,41.05678],[-72.08657,41.03185],[-72.10957,41.0069],[-72.08729,41.01287],[-72.06213,41.02534],[-72.04561,41.03239],[-72.01902,41.03293],[-72.00895,41.04215],[-72.00177,41.05136],[-71.96368,41.07737],[-71.922,41.08874],[-71.88966,41.08766],[-71.85588,41.08062],[-71.84582,41.07466],[-71.85588,41.05298],[-71.89038,41.03727],[-71.91625,41.03022],[-71.99099,41.00365],[-72.07938,40.97273],[-72.31941,40.88205],[-72.4423,40.8402],[-72.62771,40.7869],[-72.76569,40.75043],[-72.88499,40.71286],[-72.95973,40.68671],[-73.03735,40.66],[-73.08118,40.64855],[-73.22994,40.61637],[-73.32193,40.6131],[-73.35211,40.61855],[-73.55477,40.56944],[-73.75959,40.57708],[-73.88248,40.54815],[-73.9335,40.53449],[-73.945,40.53395],[-73.94572,40.56289],[-74.08227,40.56234],[-74.08011,40.54924],[-74.12251,40.52084],[-74.15772,40.51373],[-74.18719,40.50117],[-74.22887,40.48696],[-74.26121,40.48532],[-74.2763,40.4957],[-74.27918,40.54378],[-74.26983,40.56671],[-74.25834,40.57217],[-74.22528,40.57217],[-74.226,40.58309],[-74.25115,40.59564],[-74.25259,40.62237],[-74.24324,40.64091],[-74.2339,40.64909],[-74.20228,40.654],[-74.12538,40.65673],[-74.11532,40.69107],[-74.09951,40.68998],[-74.07795,40.71068],[-74.06286,40.7183],[-74.05208,40.7439],[-74.02549,40.79288],[-73.98094,40.86901],[-73.96225,40.92551],[-73.94931,40.96459],[-73.94644,40.99877],[-73.98165,41.01612],[-74.04561,41.04323],[-74.18072,41.09524],[-74.30792,41.14938],[-74.44087,41.21537],[-74.52783,41.25914],[-74.61335,41.30234],[-74.65791,41.31098],[-74.70246,41.33581],[-74.76714,41.38975],[-74.79661,41.41023],[-74.85338,41.42263],[-74.90728,41.43179],[-74.99783,41.47111],[-75.04167,41.52708],[-75.08479,41.59323],[-75.08407,41.61848],[-75.07329,41.66467],[-75.08766,41.70278],[-75.08766,41.71351],[-75.12144,41.76177],[-75.11928,41.79232],[-75.13078,41.81696],[-75.18755,41.83838],[-75.25295,41.84962],[-75.28745,41.85497],[-75.29823,41.88227],[-75.30613,41.9304],[-75.34063,41.94003],[-75.3665,41.9566],[-75.37225,41.97744],[-75.58066,41.97957],[-75.58137,41.92399],[-75.78906,41.92666],[-75.78691,41.98278],[-79.77687,41.98118],[-79.7819,42.20994],[-79.77184,42.28017],[-79.72153,42.29824],[-79.57349,42.36731],[-79.42976,42.46599],[-79.3737,42.49991],[-79.25728,42.54546],[-79.18973,42.5624],[-79.16529,42.56981],[-79.12074,42.62483],[-79.0963,42.64598],[-79.06899,42.6967],[-79.03162,42.71043],[-78.98851,42.72311],[-78.88358,42.77693],[-78.88646,42.8149],[-78.93964,42.88655],[-78.93964,42.93603],[-79.04887,42.96969],[-79.04743,43.05167],[-79.09343,43.05272],[-79.09199,43.09262],[-79.08624,43.26556],[-79.06468,43.27602],[-78.84909,43.33041],[-78.72979,43.35237],[-78.63924,43.37013],[-78.54869,43.37953],[-78.47826,43.38789],[-77.95508,43.38476],[-77.73158,43.34714],[-77.71146,43.34034],[-77.66259,43.31159],[-77.61516,43.28387],[-77.55336,43.253],[-77.5282,43.25509],[-77.45634,43.27864],[-77.42256,43.28492],[-77.16385,43.29433],[-77.0503,43.29381],[-76.94178,43.29329],[-76.91447,43.30793],[-76.85051,43.3163],[-76.80236,43.32832],[-76.75996,43.35184],[-76.64785,43.42809],[-76.54509,43.48026],[-76.51993,43.49486],[-76.44304,43.52717],[-76.4222,43.53811],[-76.28206,43.53863],[-76.23822,43.55686],[-76.24038,43.74147],[-76.30649,43.82915],[-76.31152,43.8675],[-76.34602,43.8618],[-76.40064,43.86128],[-76.47178,43.88408],[-76.46675,43.90893],[-76.4186,43.93119],[-76.37189,43.93223],[-76.36974,43.90272],[-76.33308,43.92964],[-76.27847,43.92964],[-76.27847,43.90427],[-76.26697,43.89599],[-76.23607,43.91204],[-76.19295,43.93326],[-76.19007,43.95086],[-76.21523,43.96017],[-76.25044,43.94982],[-76.31224,43.94775],[-76.30578,43.9762],[-76.33093,44.00464],[-76.39561,44.0248],[-76.39848,44.06251],[-76.37548,44.06457],[-76.3762,44.0909],[-76.47107,44.09297],[-76.46604,44.10948],[-76.44232,44.1296],[-76.39848,44.13218],[-76.39776,44.20435],[-76.3762,44.21671],[-76.23966,44.21929],[-76.23966,44.22804],[-76.21738,44.22856],[-76.21523,44.3479],[-76.11893,44.37103],[-76.04634,44.39157],[-75.93423,44.43418],[-75.83721,44.50341],[-75.76822,44.55823],[-75.69923,44.60379],[-75.63168,44.64829],[-75.56772,44.70501],[-75.50448,44.74586],[-75.45274,44.78157],[-75.31763,44.8723],[-75.15378,44.93745],[-75.09054,44.97305],[-74.97411,45.02793],[-74.91985,45.03682],[-74.91231,45.03606]]],terms_url:"https://gis.ny.gov/gateway/orthoprogram/index.cfm",terms_text:"New York State Statewide Digital Orthoimagery Program",description:"New York State High Resolution Digital Orthoimagery, 1 foot resolution",icon:"https://osmlab.github.io/editor-layer-index/sources/north-america/us/ny/NYS_Orthos_Online.png"},{id:"olho_dagua_do_casado",name:"Olho d'Agua do Casado AL",type:"wms",template:"http://geoserver.dados.al.gov.br:8080/geoserver/Alagoas/ows?LAYERS=Olho%20Dagua%20do%20Casado&SERVICE=WMS&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.0&SERVICE=WMS&REQUEST=GetMap&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[-37.7822,-9.54444],[-37.7826,-9.45388],[-37.81147,-9.45412],[-37.81735,-9.45451],[-37.82057,-9.45416],[-37.87394,-9.45428],[-37.87358,-9.54475],[-37.7822,-9.54444]]],terms_url:"http://www.seplag.al.gov.br",terms_text:"Secretaria de Estado do Planejamento, Gestão e Patrimônio"},{id:"osmbe-nl",name:"OpenStreetMap (Belgian Style - Dutch)",type:"tms",template:"https://tile.openstreetmap.be/osmbe-nl/{zoom}/{x}/{y}.png",zoomExtent:[0,18],polygon:[[[5.47007,49.49196],[5.44409,49.51409],[5.46213,49.53677],[5.43766,49.54766],[5.42566,49.59145],[5.40775,49.60448],[5.35207,49.62396],[5.34232,49.61192],[5.30544,49.60645],[5.3026,49.63608],[5.32535,49.6575],[5.27025,49.68827],[5.24458,49.67985],[5.16215,49.6918],[5.16164,49.71172],[5.12622,49.70442],[5.09058,49.75946],[5.06262,49.75724],[5.01261,49.77534],[4.9921,49.79533],[4.95485,49.79586],[4.94404,49.78583],[4.90589,49.78055],[4.84827,49.78972],[4.86599,49.81918],[4.84266,49.86913],[4.85659,49.86973],[4.87961,49.91078],[4.84433,49.94482],[4.78844,49.95381],[4.78535,49.97018],[4.79004,49.98569],[4.81194,49.99563],[4.81579,50.02853],[4.83599,50.04069],[4.82339,50.04664],[4.81641,50.06702],[4.83456,50.06856],[4.83709,50.09442],[4.84472,50.10023],[4.85447,50.1029],[4.866,50.09623],[4.86587,50.12038],[4.8776,50.13223],[4.89443,50.13779],[4.88043,50.1403],[4.87725,50.15205],[4.8529,50.15168],[4.83169,50.1526],[4.82334,50.15923],[4.78067,50.14092],[4.76486,50.13634],[4.75217,50.11158],[4.71293,50.09598],[4.70278,50.09336],[4.68851,50.06595],[4.70309,50.05587],[4.68731,50.01802],[4.69495,49.99662],[4.69461,49.99504],[4.63074,49.98584],[4.58965,49.98336],[4.55981,49.96757],[4.54315,49.9679],[4.52365,49.94973],[4.51156,49.94579],[4.47953,49.94584],[4.44588,49.93656],[4.40593,49.94785],[4.39149,49.94697],[4.38072,49.95088],[4.34921,49.95202],[4.3137,49.96541],[4.19616,49.9536],[4.19304,49.95746],[4.19582,49.96629],[4.13704,49.97691],[4.15996,49.99544],[4.13683,50.00786],[4.13272,50.01973],[4.16174,50.05032],[4.17458,50.04772],[4.22857,50.06873],[4.19529,50.10571],[4.19766,50.12037],[4.19566,50.13394],[4.15448,50.12716],[4.13656,50.12909],[4.12568,50.13511],[4.13677,50.15213],[4.14989,50.1647],[4.14686,50.17314],[4.15567,50.19785],[4.14799,50.21344],[4.15979,50.21579],[4.19179,50.24106],[4.21836,50.25492],[4.20676,50.27068],[4.17487,50.27492],[4.16567,50.28779],[4.155,50.27742],[4.16937,50.26848],[4.16851,50.25626],[4.13426,50.25572],[4.13228,50.26754],[4.12086,50.27276],[4.12139,50.29732],[4.10928,50.30112],[4.0977,50.31201],[4.08017,50.30809],[4.07339,50.31754],[4.03817,50.33987],[4.02738,50.35491],[3.98611,50.34137],[3.96482,50.34012],[3.96355,50.34742],[3.90223,50.3257],[3.88419,50.32554],[3.88429,50.33511],[3.85645,50.34099],[3.84244,50.35243],[3.81321,50.34251],[3.80551,50.35098],[3.74124,50.34624],[3.73556,50.32532],[3.73175,50.30705],[3.70911,50.3021],[3.68231,50.31988],[3.66397,50.34724],[3.65542,50.37075],[3.66788,50.38597],[3.67276,50.40227],[3.66777,50.42262],[3.66743,50.43635],[3.65685,50.4464],[3.66129,50.45399],[3.64419,50.4618],[3.6099,50.4935],[3.58162,50.48917],[3.56897,50.4982],[3.49868,50.48577],[3.49448,50.49918],[3.51582,50.52075],[3.4742,50.53204],[3.44739,50.50415],[3.43663,50.5083],[3.42736,50.50327],[3.37405,50.48993],[3.35949,50.50325],[3.32767,50.50732],[3.31872,50.51788],[3.30319,50.51966],[3.28718,50.52552],[3.27549,50.53872],[3.27524,50.59381],[3.25497,50.62115],[3.24349,50.64031],[3.23893,50.65864],[3.24019,50.67023],[3.26029,50.67692],[3.25131,50.69091],[3.25881,50.69312],[3.24518,50.71225],[3.23779,50.71086],[3.22148,50.70958],[3.20498,50.71072],[3.18953,50.72603],[3.19445,50.7316],[3.14457,50.78871],[3.12547,50.78553],[3.11348,50.79278],[3.10455,50.78042],[3.08585,50.77064],[3.05758,50.77987],[3.04064,50.77484],[3.03691,50.77003],[3.02927,50.76813],[3.01945,50.77263],[2.99536,50.76043],[2.96822,50.74763],[2.9557,50.75181],[2.93962,50.74441],[2.94602,50.73167],[2.9349,50.72822],[2.92939,50.70786],[2.92206,50.70224],[2.91184,50.70267],[2.91281,50.69463],[2.90742,50.69209],[2.90017,50.69202],[2.88533,50.70547],[2.87992,50.70199],[2.86855,50.70242],[2.84646,50.72043],[2.81843,50.71386],[2.78869,50.72508],[2.77811,50.74686],[2.76469,50.75397],[2.75409,50.76251],[2.75922,50.77052],[2.73745,50.77967],[2.7236,50.79079],[2.71636,50.8123],[2.6788,50.81207],[2.67057,50.81562],[2.63543,50.80987],[2.61055,50.84419],[2.59427,50.84743],[2.60628,50.86565],[2.60151,50.90993],[2.58525,50.91825],[2.62479,50.94743],[2.62148,50.95406],[2.60263,50.98638],[2.56946,51.00113],[2.55892,51.06596],[2.34072,51.31453],[3.01078,51.59839],[3.32658,51.43728],[3.37581,51.3584],[3.38739,51.33392],[3.36094,51.31523],[3.3789,51.30251],[3.36832,51.29778],[3.38177,51.28732],[3.38342,51.27485],[3.38922,51.27329],[3.41852,51.25984],[3.43471,51.24621],[3.45031,51.24219],[3.527,51.24651],[3.51433,51.28799],[3.54179,51.29123],[3.56145,51.29637],[3.57559,51.29428],[3.58905,51.30652],[3.63839,51.29078],[3.6582,51.29056],[3.69139,51.28043],[3.71763,51.27428],[3.77605,51.26777],[3.79652,51.25635],[3.79031,51.24163],[3.78934,51.22711],[3.79294,51.21546],[3.85827,51.21334],[3.88901,51.22423],[3.89467,51.21743],[3.88782,51.20283],[3.91256,51.20837],[3.91482,51.21509],[3.9281,51.22508],[3.93751,51.2174],[3.95603,51.22117],[4.01551,51.24825],[4.0551,51.24402],[4.1651,51.2938],[4.23804,51.35274],[4.21772,51.36206],[4.21546,51.37487],[4.33535,51.37775],[4.34197,51.36012],[4.38556,51.35574],[4.39906,51.35785],[4.42462,51.3668],[4.42309,51.37577],[4.38147,51.41805],[4.39426,51.44251],[4.37771,51.44595],[4.38055,51.45075],[4.4768,51.47912],[4.53739,51.48358],[4.54967,51.47364],[4.53097,51.44965],[4.53758,51.42456],[4.57427,51.43404],[4.6431,51.42478],[4.64951,51.42741],[4.66744,51.42777],[4.66465,51.44625],[4.69115,51.45283],[4.70175,51.46691],[4.72792,51.48435],[4.74476,51.48977],[4.74945,51.49905],[4.75827,51.50302],[4.7766,51.50625],[4.81666,51.49552],[4.82318,51.48441],[4.84355,51.48177],[4.83884,51.46588],[4.84529,51.45817],[4.82521,51.44674],[4.83103,51.42488],[4.88072,51.4166],[4.91431,51.45952],[4.95767,51.4548],[4.94134,51.42928],[4.93775,51.40655],[4.96007,51.42194],[4.99955,51.44324],[5.00816,51.47134],[5.01937,51.48074],[5.03235,51.48827],[5.04093,51.4876],[5.04722,51.47217],[5.08032,51.47226],[5.10643,51.43135],[5.0727,51.39365],[5.11662,51.36118],[5.13225,51.3472],[5.13581,51.31594],[5.15592,51.31278],[5.20039,51.32325],[5.24326,51.3057],[5.22742,51.26844],[5.238,51.26255],[5.26216,51.26778],[5.335,51.26474],[5.34493,51.27681],[5.41551,51.2639],[5.44065,51.28246],[5.48215,51.30064],[5.51628,51.29599],[5.55816,51.26613],[5.56283,51.22287],[5.65253,51.19899],[5.65947,51.19052],[5.71011,51.18671],[5.74598,51.19455],[5.76873,51.18843],[5.78118,51.18082],[5.78447,51.15925],[5.82594,51.16827],[5.85709,51.14477],[5.83976,51.12993],[5.81435,51.11524],[5.83555,51.10842],[5.8338,51.09577],[5.82291,51.09124],[5.8119,51.0943],[5.79816,51.09023],[5.80612,51.07955],[5.80458,51.05888],[5.77731,51.05804],[5.76027,51.03223],[5.77383,51.02859],[5.77829,51.02399],[5.76759,51.00526],[5.76846,50.9985],[5.76419,50.99502],[5.74816,50.98087],[5.72174,50.96128],[5.73469,50.95683],[5.7426,50.96113],[5.74604,50.96209],[5.75617,50.95898],[5.76011,50.95227],[5.73223,50.9221],[5.72625,50.9059],[5.70051,50.90955],[5.69711,50.8958],[5.68051,50.88068],[5.64516,50.86533],[5.64337,50.84974],[5.64049,50.84701],[5.64576,50.83961],[5.64567,50.83789],[5.65094,50.83431],[5.65568,50.82591],[5.70296,50.80821],[5.69338,50.79687],[5.70259,50.78396],[5.69204,50.75629],[5.7218,50.76538],[5.73762,50.75842],[5.73912,50.76522],[5.76476,50.7837],[5.77748,50.78344],[5.78519,50.7684],[5.7927,50.77138],[5.80759,50.75681],[5.84525,50.76609],[5.84901,50.75975],[5.88667,50.77108],[5.89689,50.75501],[5.95896,50.76308],[6.02001,50.75521],[6.04208,50.74557],[6.03953,50.7295],[6.11623,50.72364],[6.1491,50.68465],[6.16312,50.67169],[6.17755,50.65576],[6.18715,50.6505],[6.18348,50.6457],[6.18205,50.63583],[6.26822,50.62829],[6.27251,50.62033],[6.24102,50.58657],[6.22795,50.58535],[6.18304,50.55597],[6.1833,50.54646],[6.19789,50.53715],[6.22586,50.49832],[6.26954,50.50961],[6.35349,50.49244],[6.34706,50.46422],[6.37423,50.45989],[6.3825,50.43975],[6.37408,50.40637],[6.35129,50.38206],[6.40305,50.34866],[6.41162,50.32769],[6.40783,50.31893],[6.38558,50.31658],[6.36388,50.30021],[6.32792,50.3186],[6.31289,50.31636],[6.29335,50.2909],[6.29547,50.27422],[6.28111,50.26236],[6.23624,50.25692],[6.21151,50.24816],[6.1981,50.23275],[6.18166,50.23125],[6.1789,50.22147],[6.19337,50.20761],[6.19683,50.17988],[6.15231,50.16841],[6.15923,50.14002],[6.13978,50.12527],[6.10856,50.1326],[6.11273,50.16093],[6.10156,50.16551],[6.08452,50.16697],[6.0821,50.15275],[6.06344,50.14834],[6.03055,50.15829],[6.02136,50.17685],[5.96932,50.16795],[5.96515,50.12813],[5.90347,50.11172],[5.89064,50.07554],[5.86237,50.06368],[5.8749,50.04624],[5.86392,50.02594],[5.82586,50.00934],[5.82665,50.00135],[5.8448,49.99123],[5.83952,49.9756],[5.80883,49.95773],[5.78215,49.957],[5.76822,49.91307],[5.74481,49.89975],[5.78087,49.88794],[5.78897,49.87213],[5.77636,49.86265],[5.75667,49.8703],[5.76191,49.85693],[5.75803,49.84287],[5.74291,49.83555],[5.75151,49.81985],[5.75473,49.79514],[5.7909,49.79765],[5.8179,49.75977],[5.83544,49.74713],[5.82702,49.72616],[5.86996,49.72777],[5.88817,49.70952],[5.86372,49.68213],[5.91262,49.66488],[5.90382,49.65192],[5.90876,49.63876],[5.89899,49.63401],[5.89117,49.63469],[5.87663,49.60771],[5.84953,49.59399],[5.87403,49.58991],[5.8736,49.57435],[5.84053,49.55222],[5.82582,49.54931],[5.81858,49.5461],[5.79504,49.55029],[5.77149,49.55832],[5.76226,49.554],[5.76126,49.53952],[5.74792,49.53452],[5.73009,49.53954],[5.6987,49.53744],[5.66008,49.55039],[5.64371,49.54565],[5.6228,49.5283],[5.62589,49.51698],[5.61175,49.50102],[5.59116,49.51734],[5.55638,49.52373],[5.54257,49.5105],[5.47007,49.49196]]],terms_url:"https://openstreetmap.org/",terms_text:"© OpenStreetMap contributors, CC-BY-SA; Tiles courtesy of GEO-6",icon:"https://osmlab.github.io/editor-layer-index/sources/world/OpenStreetMap-GPS.png"},{id:"osmbe-fr",name:"OpenStreetMap (Belgian Style - French)",type:"tms",template:"https://tile.openstreetmap.be/osmbe-fr/{zoom}/{x}/{y}.png",zoomExtent:[0,18],polygon:[[[5.47007,49.49196],[5.44409,49.51409],[5.46213,49.53677],[5.43766,49.54766],[5.42566,49.59145],[5.40775,49.60448],[5.35207,49.62396],[5.34232,49.61192],[5.30544,49.60645],[5.3026,49.63608],[5.32535,49.6575],[5.27025,49.68827],[5.24458,49.67985],[5.16215,49.6918],[5.16164,49.71172],[5.12622,49.70442],[5.09058,49.75946],[5.06262,49.75724],[5.01261,49.77534],[4.9921,49.79533],[4.95485,49.79586],[4.94404,49.78583],[4.90589,49.78055],[4.84827,49.78972],[4.86599,49.81918],[4.84266,49.86913],[4.85659,49.86973],[4.87961,49.91078],[4.84433,49.94482],[4.78844,49.95381],[4.78535,49.97018],[4.79004,49.98569],[4.81194,49.99563],[4.81579,50.02853],[4.83599,50.04069],[4.82339,50.04664],[4.81641,50.06702],[4.83456,50.06856],[4.83709,50.09442],[4.84472,50.10023],[4.85447,50.1029],[4.866,50.09623],[4.86587,50.12038],[4.8776,50.13223],[4.89443,50.13779],[4.88043,50.1403],[4.87725,50.15205],[4.8529,50.15168],[4.83169,50.1526],[4.82334,50.15923],[4.78067,50.14092],[4.76486,50.13634],[4.75217,50.11158],[4.71293,50.09598],[4.70278,50.09336],[4.68851,50.06595],[4.70309,50.05587],[4.68731,50.01802],[4.69495,49.99662],[4.69461,49.99504],[4.63074,49.98584],[4.58965,49.98336],[4.55981,49.96757],[4.54315,49.9679],[4.52365,49.94973],[4.51156,49.94579],[4.47953,49.94584],[4.44588,49.93656],[4.40593,49.94785],[4.39149,49.94697],[4.38072,49.95088],[4.34921,49.95202],[4.3137,49.96541],[4.19616,49.9536],[4.19304,49.95746],[4.19582,49.96629],[4.13704,49.97691],[4.15996,49.99544],[4.13683,50.00786],[4.13272,50.01973],[4.16174,50.05032],[4.17458,50.04772],[4.22857,50.06873],[4.19529,50.10571],[4.19766,50.12037],[4.19566,50.13394],[4.15448,50.12716],[4.13656,50.12909],[4.12568,50.13511],[4.13677,50.15213],[4.14989,50.1647],[4.14686,50.17314],[4.15567,50.19785],[4.14799,50.21344],[4.15979,50.21579],[4.19179,50.24106],[4.21836,50.25492],[4.20676,50.27068],[4.17487,50.27492],[4.16567,50.28779],[4.155,50.27742],[4.16937,50.26848],[4.16851,50.25626],[4.13426,50.25572],[4.13228,50.26754],[4.12086,50.27276],[4.12139,50.29732],[4.10928,50.30112],[4.0977,50.31201],[4.08017,50.30809],[4.07339,50.31754],[4.03817,50.33987],[4.02738,50.35491],[3.98611,50.34137],[3.96482,50.34012],[3.96355,50.34742],[3.90223,50.3257],[3.88419,50.32554],[3.88429,50.33511],[3.85645,50.34099],[3.84244,50.35243],[3.81321,50.34251],[3.80551,50.35098],[3.74124,50.34624],[3.73556,50.32532],[3.73175,50.30705],[3.70911,50.3021],[3.68231,50.31988],[3.66397,50.34724],[3.65542,50.37075],[3.66788,50.38597],[3.67276,50.40227],[3.66777,50.42262],[3.66743,50.43635],[3.65685,50.4464],[3.66129,50.45399],[3.64419,50.4618],[3.6099,50.4935],[3.58162,50.48917],[3.56897,50.4982],[3.49868,50.48577],[3.49448,50.49918],[3.51582,50.52075],[3.4742,50.53204],[3.44739,50.50415],[3.43663,50.5083],[3.42736,50.50327],[3.37405,50.48993],[3.35949,50.50325],[3.32767,50.50732],[3.31872,50.51788],[3.30319,50.51966],[3.28718,50.52552],[3.27549,50.53872],[3.27524,50.59381],[3.25497,50.62115],[3.24349,50.64031],[3.23893,50.65864],[3.24019,50.67023],[3.26029,50.67692],[3.25131,50.69091],[3.25881,50.69312],[3.24518,50.71225],[3.23779,50.71086],[3.22148,50.70958],[3.20498,50.71072],[3.18953,50.72603],[3.19445,50.7316],[3.14457,50.78871],[3.12547,50.78553],[3.11348,50.79278],[3.10455,50.78042],[3.08585,50.77064],[3.05758,50.77987],[3.04064,50.77484],[3.03691,50.77003],[3.02927,50.76813],[3.01945,50.77263],[2.99536,50.76043],[2.96822,50.74763],[2.9557,50.75181],[2.93962,50.74441],[2.94602,50.73167],[2.9349,50.72822],[2.92939,50.70786],[2.92206,50.70224],[2.91184,50.70267],[2.91281,50.69463],[2.90742,50.69209],[2.90017,50.69202],[2.88533,50.70547],[2.87992,50.70199],[2.86855,50.70242],[2.84646,50.72043],[2.81843,50.71386],[2.78869,50.72508],[2.77811,50.74686],[2.76469,50.75397],[2.75409,50.76251],[2.75922,50.77052],[2.73745,50.77967],[2.7236,50.79079],[2.71636,50.8123],[2.6788,50.81207],[2.67057,50.81562],[2.63543,50.80987],[2.61055,50.84419],[2.59427,50.84743],[2.60628,50.86565],[2.60151,50.90993],[2.58525,50.91825],[2.62479,50.94743],[2.62148,50.95406],[2.60263,50.98638],[2.56946,51.00113],[2.55892,51.06596],[2.34072,51.31453],[3.01078,51.59839],[3.32658,51.43728],[3.37581,51.3584],[3.38739,51.33392],[3.36094,51.31523],[3.3789,51.30251],[3.36832,51.29778],[3.38177,51.28732],[3.38342,51.27485],[3.38922,51.27329],[3.41852,51.25984],[3.43471,51.24621],[3.45031,51.24219],[3.527,51.24651],[3.51433,51.28799],[3.54179,51.29123],[3.56145,51.29637],[3.57559,51.29428],[3.58905,51.30652],[3.63839,51.29078],[3.6582,51.29056],[3.69139,51.28043],[3.71763,51.27428],[3.77605,51.26777],[3.79652,51.25635],[3.79031,51.24163],[3.78934,51.22711],[3.79294,51.21546],[3.85827,51.21334],[3.88901,51.22423],[3.89467,51.21743],[3.88782,51.20283],[3.91256,51.20837],[3.91482,51.21509],[3.9281,51.22508],[3.93751,51.2174],[3.95603,51.22117],[4.01551,51.24825],[4.0551,51.24402],[4.1651,51.2938],[4.23804,51.35274],[4.21772,51.36206],[4.21546,51.37487],[4.33535,51.37775],[4.34197,51.36012],[4.38556,51.35574],[4.39906,51.35785],[4.42462,51.3668],[4.42309,51.37577],[4.38147,51.41805],[4.39426,51.44251],[4.37771,51.44595],[4.38055,51.45075],[4.4768,51.47912],[4.53739,51.48358],[4.54967,51.47364],[4.53097,51.44965],[4.53758,51.42456],[4.57427,51.43404],[4.6431,51.42478],[4.64951,51.42741],[4.66744,51.42777],[4.66465,51.44625],[4.69115,51.45283],[4.70175,51.46691],[4.72792,51.48435],[4.74476,51.48977],[4.74945,51.49905],[4.75827,51.50302],[4.7766,51.50625],[4.81666,51.49552],[4.82318,51.48441],[4.84355,51.48177],[4.83884,51.46588],[4.84529,51.45817],[4.82521,51.44674],[4.83103,51.42488],[4.88072,51.4166],[4.91431,51.45952],[4.95767,51.4548],[4.94134,51.42928],[4.93775,51.40655],[4.96007,51.42194],[4.99955,51.44324],[5.00816,51.47134],[5.01937,51.48074],[5.03235,51.48827],[5.04093,51.4876],[5.04722,51.47217],[5.08032,51.47226],[5.10643,51.43135],[5.0727,51.39365],[5.11662,51.36118],[5.13225,51.3472],[5.13581,51.31594],[5.15592,51.31278],[5.20039,51.32325],[5.24326,51.3057],[5.22742,51.26844],[5.238,51.26255],[5.26216,51.26778],[5.335,51.26474],[5.34493,51.27681],[5.41551,51.2639],[5.44065,51.28246],[5.48215,51.30064],[5.51628,51.29599],[5.55816,51.26613],[5.56283,51.22287],[5.65253,51.19899],[5.65947,51.19052],[5.71011,51.18671],[5.74598,51.19455],[5.76873,51.18843],[5.78118,51.18082],[5.78447,51.15925],[5.82594,51.16827],[5.85709,51.14477],[5.83976,51.12993],[5.81435,51.11524],[5.83555,51.10842],[5.8338,51.09577],[5.82291,51.09124],[5.8119,51.0943],[5.79816,51.09023],[5.80612,51.07955],[5.80458,51.05888],[5.77731,51.05804],[5.76027,51.03223],[5.77383,51.02859],[5.77829,51.02399],[5.76759,51.00526],[5.76846,50.9985],[5.76419,50.99502],[5.74816,50.98087],[5.72174,50.96128],[5.73469,50.95683],[5.7426,50.96113],[5.74604,50.96209],[5.75617,50.95898],[5.76011,50.95227],[5.73223,50.9221],[5.72625,50.9059],[5.70051,50.90955],[5.69711,50.8958],[5.68051,50.88068],[5.64516,50.86533],[5.64337,50.84974],[5.64049,50.84701],[5.64576,50.83961],[5.64567,50.83789],[5.65094,50.83431],[5.65568,50.82591],[5.70296,50.80821],[5.69338,50.79687],[5.70259,50.78396],[5.69204,50.75629],[5.7218,50.76538],[5.73762,50.75842],[5.73912,50.76522],[5.76476,50.7837],[5.77748,50.78344],[5.78519,50.7684],[5.7927,50.77138],[5.80759,50.75681],[5.84525,50.76609],[5.84901,50.75975],[5.88667,50.77108],[5.89689,50.75501],[5.95896,50.76308],[6.02001,50.75521],[6.04208,50.74557],[6.03953,50.7295],[6.11623,50.72364],[6.1491,50.68465],[6.16312,50.67169],[6.17755,50.65576],[6.18715,50.6505],[6.18348,50.6457],[6.18205,50.63583],[6.26822,50.62829],[6.27251,50.62033],[6.24102,50.58657],[6.22795,50.58535],[6.18304,50.55597],[6.1833,50.54646],[6.19789,50.53715],[6.22586,50.49832],[6.26954,50.50961],[6.35349,50.49244],[6.34706,50.46422],[6.37423,50.45989],[6.3825,50.43975],[6.37408,50.40637],[6.35129,50.38206],[6.40305,50.34866],[6.41162,50.32769],[6.40783,50.31893],[6.38558,50.31658],[6.36388,50.30021],[6.32792,50.3186],[6.31289,50.31636],[6.29335,50.2909],[6.29547,50.27422],[6.28111,50.26236],[6.23624,50.25692],[6.21151,50.24816],[6.1981,50.23275],[6.18166,50.23125],[6.1789,50.22147],[6.19337,50.20761],[6.19683,50.17988],[6.15231,50.16841],[6.15923,50.14002],[6.13978,50.12527],[6.10856,50.1326],[6.11273,50.16093],[6.10156,50.16551],[6.08452,50.16697],[6.0821,50.15275],[6.06344,50.14834],[6.03055,50.15829],[6.02136,50.17685],[5.96932,50.16795],[5.96515,50.12813],[5.90347,50.11172],[5.89064,50.07554],[5.86237,50.06368],[5.8749,50.04624],[5.86392,50.02594],[5.82586,50.00934],[5.82665,50.00135],[5.8448,49.99123],[5.83952,49.9756],[5.80883,49.95773],[5.78215,49.957],[5.76822,49.91307],[5.74481,49.89975],[5.78087,49.88794],[5.78897,49.87213],[5.77636,49.86265],[5.75667,49.8703],[5.76191,49.85693],[5.75803,49.84287],[5.74291,49.83555],[5.75151,49.81985],[5.75473,49.79514],[5.7909,49.79765],[5.8179,49.75977],[5.83544,49.74713],[5.82702,49.72616],[5.86996,49.72777],[5.88817,49.70952],[5.86372,49.68213],[5.91262,49.66488],[5.90382,49.65192],[5.90876,49.63876],[5.89899,49.63401],[5.89117,49.63469],[5.87663,49.60771],[5.84953,49.59399],[5.87403,49.58991],[5.8736,49.57435],[5.84053,49.55222],[5.82582,49.54931],[5.81858,49.5461],[5.79504,49.55029],[5.77149,49.55832],[5.76226,49.554],[5.76126,49.53952],[5.74792,49.53452],[5.73009,49.53954],[5.6987,49.53744],[5.66008,49.55039],[5.64371,49.54565],[5.6228,49.5283],[5.62589,49.51698],[5.61175,49.50102],[5.59116,49.51734],[5.55638,49.52373],[5.54257,49.5105],[5.47007,49.49196]]],terms_url:"https://openstreetmap.org/",terms_text:"© OpenStreetMap contributors, CC-BY-SA; Tiles courtesy of GEO-6",icon:"https://osmlab.github.io/editor-layer-index/sources/world/OpenStreetMap-GPS.png"},{id:"MAPNIK",name:"OpenStreetMap (Standard)",type:"tms",template:"https://{switch:a,b,c}.tile.openstreetmap.org/{zoom}/{x}/{y}.png",zoomExtent:[0,19],terms_url:"https://www.openstreetmap.org",terms_text:"© OpenStreetMap contributors, CC-BY-SA","default":true,description:"The default OpenStreetMap layer.",icon:"https://osmlab.github.io/editor-layer-index/sources/world/OpenStreetMap-GPS.png"},{id:"osm-gps",name:"OpenStreetMap GPS traces",type:"tms",template:"https://{switch:a,b,c}.gps-tile.openstreetmap.org/lines/{zoom}/{x}/{y}.png",zoomExtent:[0,20],terms_url:"https://www.openstreetmap.org/copyright",terms_text:"© OpenStreetMap contributors",terms_html:"<span style='display: inline-block; padding: 0 8px; background-color: rgba(0,0,0,0.5);'><span style='color: #eee;'>GPS Direction:</span> <span style='font-size: 15px; padding-left: 2px; font-weight: bold;'> <span style='color: #0ee;'>&larr;</span> <span style='color: #96f;'>&darr;</span> <span style='color: #6e0;'>&uarr;</span> <span style='color: #f63;'>&rarr;</span> </span></span> © <a href='https://www.openstreetmap.org/copyright'>OpenStreetMap contributors</a>.",description:"Public GPS traces uploaded to OpenStreetMap.",icon:"https://osmlab.github.io/editor-layer-index/sources/world/OpenStreetMap-GPS.png",overlay:true},{id:"osm-hu-ortho",name:"openstreetmap.hu orthophotos",type:"tms",template:"http://adam.openstreetmap.hu/mapproxy/tiles/1.0.0/openstreetmap.hu.orthophotos/mercator/{zoom}/{x}/{y}.png",zoomExtent:[0,21],polygon:[[[18.8577,47.44553],[18.86169,47.44883],[18.86491,47.44704],[18.8609,47.44373],[18.8577,47.44553]],[[18.80614,47.59304],[18.81376,47.5974],[18.82295,47.59011],[18.81533,47.58574],[18.80614,47.59304]],[[17.66691,46.92167],[17.66369,46.93033],[17.67207,46.93178],[17.67529,46.92312],[17.66691,46.92167]],[[17.6725,46.93546],[17.67529,46.92708],[17.68409,46.92845],[17.68129,46.93683],[17.6725,46.93546]],[[17.82155,46.96075],[17.82507,46.9547],[17.83347,46.95701],[17.82995,46.96304],[17.82155,46.96075]],[[18.62796,47.19818],[18.63943,47.20324],[18.64953,47.1926],[18.63806,47.18753],[18.62796,47.19818]],[[17.51223,46.8789],[17.51406,46.88166],[17.5214,46.87939],[17.51957,46.87662],[17.51223,46.8789]],[[17.67724,46.91844],[17.68718,46.92344],[17.70594,46.90603],[17.69249,46.89926],[17.68144,46.90951],[17.68275,46.90595],[17.68198,46.90582],[17.68667,46.89926],[17.67947,46.89686],[17.67405,46.90445],[17.67131,46.90398],[17.66666,46.91662],[17.67724,46.91844]],[[18.80776,47.55615],[18.81638,47.55969],[18.81351,47.56305],[18.80473,47.55949],[18.80776,47.55615]],[[18.98706,47.46989],[18.97962,47.47042],[18.98056,47.47648],[18.988,47.47595],[18.98706,47.46989]],[[18.98356,47.41149],[19.00839,47.42511],[19.01568,47.41932],[18.9907,47.40518],[18.98356,47.41149]],[[19.02652,47.87563],[19.03163,47.87613],[19.03305,47.86957],[19.02793,47.86907],[19.02652,47.87563]],[[18.00803,46.86674],[18.01095,46.86028],[18.01323,46.86064],[18.01626,46.8536],[18.01682,46.85371],[18.01852,46.84948],[18.02021,46.84631],[18.02961,46.84829],[18.02742,46.85392],[18.03388,46.85534],[18.03056,46.86395],[18.03367,46.86456],[18.03058,46.87154],[18.00803,46.86674]],[[17.99509,46.87632],[17.98585,46.87595],[17.98535,46.88397],[17.98599,46.88412],[17.98531,46.88537],[17.95829,46.87876],[17.96077,46.87351],[17.92868,46.86631],[17.92467,46.87372],[17.93136,46.87535],[17.92995,46.87822],[17.9553,46.88415],[17.9946,46.89341],[17.99786,46.88671],[17.98771,46.88443],[17.98774,46.88411],[17.99415,46.88442],[17.99509,46.87632]],[[18.86533,47.42808],[18.87291,47.42455],[18.87701,47.42871],[18.86799,47.43238],[18.86774,47.43208],[18.86517,47.43317],[18.86477,47.4327],[18.86441,47.43285],[18.86288,47.43108],[18.86328,47.43092],[18.86288,47.43046],[18.86516,47.42947],[18.86448,47.42875],[18.86553,47.42829],[18.86533,47.42808]],[[19.16232,47.59776],[19.16893,47.59033],[19.17815,47.59512],[19.17291,47.60068],[19.16232,47.59776]],[[18.13162,47.02619],[18.14103,47.02111],[18.13923,47.01957],[18.15704,47.01044],[18.16271,47.00242],[18.16463,46.99571],[18.16639,46.9959],[18.16702,46.99363],[18.17101,46.99454],[18.1722,46.99571],[18.16977,47.00416],[18.17656,47.00709],[18.1761,47.00771],[18.17639,47.00781],[18.17057,47.01414],[18.1748,47.01815],[18.17782,47.01428],[18.18518,47.01746],[18.17933,47.0239],[18.17589,47.02268],[18.17277,47.02434],[18.17219,47.02377],[18.17159,47.02407],[18.16938,47.0221],[18.16216,47.02596],[18.16485,47.02832],[18.16245,47.02947],[18.16323,47.03025],[18.1521,47.03554],[18.15156,47.03498],[18.1503,47.03563],[18.14513,47.03112],[18.14337,47.0322],[18.1454,47.03419],[18.14441,47.03467],[18.14522,47.03539],[18.14168,47.03697],[18.13111,47.02745],[18.13226,47.0269],[18.13162,47.02619]],[[17.79852,46.81745],[17.79178,46.81585],[17.79601,46.80664],[17.7948,46.80598],[17.79693,46.80056],[17.80109,46.79993],[17.80736,46.80225],[17.79852,46.81745]],[[17.7788,46.81461],[17.78446,46.80714],[17.79083,46.80925],[17.7853,46.81683],[17.7788,46.81461]]],terms_text:"openstreetmap.hu"},{id:"OpenTopoMap",name:"OpenTopoMap",type:"tms",template:"https://{switch:a,b,c}.tile.opentopomap.org/{zoom}/{x}/{y}.png",zoomExtent:[3,17],terms_url:"https://tile.opentopomap.org/about#verwendung",terms_text:"Kartendaten: © OpenStreetMap-Mitwirkende, SRTM | Kartendarstellung: © OpenTopoMap (CC-BY-SA)",icon:"https://osmlab.github.io/editor-layer-index/sources/world/OpenTopoMap.png"},{id:"lu.geoportail.opendata.ortho2010",name:"Ortho 2010 geoportail.lu",type:"tms",template:"https://{switch:wmts3,wmts4}.geoportail.lu/opendata/wmts/ortho_2010/GLOBAL_WEBMERCATOR_4_V3/{zoom}/{x}/{y}.jpeg",endDate:"2010-07-02T00:00:00.000Z",startDate:"2010-06-24T00:00:00.000Z",zoomExtent:[0,20],polygon:[[[5.96175,50.17631],[6.02627,50.18496],[6.03318,50.16395],[6.06069,50.15536],[6.07668,50.15913],[6.07824,50.17255],[6.10176,50.17199],[6.1225,50.16437],[6.1201,50.15594],[6.1277,50.14993],[6.11323,50.13739],[6.12369,50.13719],[6.14093,50.1305],[6.13555,50.11899],[6.13808,50.10263],[6.13108,50.09964],[6.13547,50.09119],[6.12194,50.09059],[6.12634,50.07817],[6.13186,50.07348],[6.12117,50.064],[6.11444,50.06139],[6.11563,50.05817],[6.12361,50.06323],[6.13661,50.04178],[6.13034,50.02975],[6.14821,50.02307],[6.13868,50.01572],[6.13594,50.01485],[6.13138,50.01905],[6.13024,50.01819],[6.13934,50.01116],[6.1517,50.01058],[6.14546,49.99689],[6.13966,49.9994],[6.13852,49.99829],[6.14218,49.99535],[6.15023,49.99518],[6.15625,49.98867],[6.17305,49.98589],[6.17348,49.98344],[6.17035,49.98376],[6.16549,49.97115],[6.17151,49.96298],[6.1763,49.962],[6.17995,49.95386],[6.18339,49.9548],[6.17983,49.96307],[6.18331,49.9686],[6.19277,49.97158],[6.19978,49.95352],[6.20707,49.95672],[6.21269,49.9514],[6.22502,49.95039],[6.22044,49.94369],[6.22824,49.93726],[6.22635,49.92766],[6.21913,49.92354],[6.22986,49.92125],[6.23603,49.91355],[6.23187,49.91064],[6.22769,49.91062],[6.23229,49.9072],[6.23381,49.90028],[6.24692,49.89535],[6.25781,49.88724],[6.26301,49.88101],[6.27646,49.87725],[6.28113,49.87957],[6.29166,49.87548],[6.2977,49.86673],[6.30989,49.87107],[6.31532,49.8673],[6.31465,49.86057],[6.32361,49.85188],[6.32158,49.8409],[6.32741,49.83673],[6.33656,49.83998],[6.33937,49.8507],[6.36465,49.85164],[6.4022,49.82098],[6.42643,49.81629],[6.42807,49.81186],[6.43097,49.81129],[6.44161,49.81547],[6.44344,49.81233],[6.45366,49.81275],[6.46454,49.81975],[6.47057,49.82385],[6.49681,49.81277],[6.50669,49.80993],[6.51155,49.80238],[6.51485,49.80513],[6.5196,49.81446],[6.52981,49.81048],[6.53225,49.80686],[6.53083,49.80116],[6.50622,49.78899],[6.51917,49.78344],[6.51105,49.77422],[6.52056,49.76818],[6.52052,49.76134],[6.50373,49.75086],[6.50263,49.73298],[6.50727,49.72938],[6.51809,49.7242],[6.51642,49.72129],[6.51176,49.72016],[6.50479,49.725],[6.49891,49.72639],[6.49558,49.72443],[6.50712,49.71655],[6.50788,49.71215],[6.5046,49.71227],[6.42714,49.66237],[6.4399,49.66025],[6.44251,49.65591],[6.42178,49.61809],[6.39898,49.60094],[6.37941,49.59526],[6.37551,49.58809],[6.38443,49.5801],[6.38119,49.57509],[6.36909,49.5783],[6.35791,49.57166],[6.3849,49.55817],[6.38009,49.54856],[6.35855,49.53296],[6.35932,49.52481],[6.37076,49.50545],[6.37056,49.45732],[6.3334,49.46493],[6.32189,49.47244],[6.29503,49.47928],[6.28789,49.48379],[6.27191,49.49995],[6.24133,49.50693],[6.19669,49.50331],[6.17337,49.50577],[6.16086,49.50085],[6.1671,49.49006],[6.14018,49.48525],[6.12937,49.48803],[6.12725,49.47081],[6.1014,49.46726],[6.10483,49.45076],[6.08167,49.45417],[6.07722,49.46139],[6.05917,49.46306],[6.05222,49.46028],[6.04421,49.44553],[6.02529,49.44703],[6.02154,49.45127],[6.01574,49.44885],[5.99412,49.45301],[5.97657,49.44885],[5.97773,49.45955],[5.97232,49.46087],[5.96891,49.48202],[5.9616,49.49026],[5.91578,49.49835],[5.89033,49.4948],[5.86332,49.50006],[5.84897,49.50826],[5.84828,49.51397],[5.83641,49.51817],[5.83187,49.52639],[5.84308,49.53081],[5.83562,49.54114],[5.81625,49.53325],[5.8052,49.54272],[5.85943,49.57158],[5.86866,49.587],[5.86289,49.58525],[5.8511,49.58379],[5.84712,49.58961],[5.84565,49.5981],[5.8694,49.6106],[5.88182,49.63815],[5.89998,49.63907],[5.89934,49.66239],[5.85656,49.67628],[5.85628,49.68211],[5.8757,49.71118],[5.86481,49.72331],[5.84325,49.71822],[5.82191,49.72128],[5.82489,49.73767],[5.82073,49.74878],[5.78626,49.79079],[5.76517,49.78961],[5.75094,49.79094],[5.74159,49.82126],[5.74581,49.82435],[5.7372,49.83353],[5.74053,49.84142],[5.74701,49.84048],[5.74624,49.84783],[5.75399,49.84878],[5.74066,49.85152],[5.75229,49.85922],[5.74955,49.87554],[5.77567,49.87438],[5.77505,49.88057],[5.7346,49.89341],[5.73303,49.90285],[5.75783,49.91737],[5.76039,49.93252],[5.77073,49.93711],[5.76878,49.94239],[5.7688,49.96104],[5.78672,49.96816],[5.80524,49.96677],[5.80652,49.97321],[5.83129,49.97995],[5.83462,49.98656],[5.81806,49.99936],[5.81561,50.01437],[5.84792,50.02809],[5.86189,50.04581],[5.85087,50.0563],[5.85781,50.07186],[5.881,50.08069],[5.89196,50.12041],[5.95286,50.13384],[5.96175,50.17631]]],terms_url:"https://data.public.lu/en/datasets/bd-l-ortho-webservices-wms-et-wmts",terms_text:"Administration du Cadastre et de la Topographie",icon:"https://www.geoportail.lu/static/img/lion.png"},{id:"lu.geoportail.opendata.ortho2013",name:"Ortho 2013 geoportail.lu",type:"tms",template:"https://{switch:wmts3,wmts4}.geoportail.lu/opendata/wmts/ortho_2013/GLOBAL_WEBMERCATOR_4_V3/{zoom}/{x}/{y}.jpeg",endDate:"2013-07-20T00:00:00.000Z",startDate:"2013-07-19T00:00:00.000Z",zoomExtent:[0,20],polygon:[[[5.96175,50.17631],[6.02627,50.18496],[6.03318,50.16395],[6.06069,50.15536],[6.07668,50.15913],[6.07824,50.17255],[6.10176,50.17199],[6.1225,50.16437],[6.1201,50.15594],[6.1277,50.14993],[6.11323,50.13739],[6.12369,50.13719],[6.14093,50.1305],[6.13555,50.11899],[6.13808,50.10263],[6.13108,50.09964],[6.13547,50.09119],[6.12194,50.09059],[6.12634,50.07817],[6.13186,50.07348],[6.12117,50.064],[6.11444,50.06139],[6.11563,50.05817],[6.12361,50.06323],[6.13661,50.04178],[6.13034,50.02975],[6.14821,50.02307],[6.13868,50.01572],[6.13594,50.01485],[6.13138,50.01905],[6.13024,50.01819],[6.13934,50.01116],[6.1517,50.01058],[6.14546,49.99689],[6.13966,49.9994],[6.13852,49.99829],[6.14218,49.99535],[6.15023,49.99518],[6.15625,49.98867],[6.17305,49.98589],[6.17348,49.98344],[6.17035,49.98376],[6.16549,49.97115],[6.17151,49.96298],[6.1763,49.962],[6.17995,49.95386],[6.18339,49.9548],[6.17983,49.96307],[6.18331,49.9686],[6.19277,49.97158],[6.19978,49.95352],[6.20707,49.95672],[6.21269,49.9514],[6.22502,49.95039],[6.22044,49.94369],[6.22824,49.93726],[6.22635,49.92766],[6.21913,49.92354],[6.22986,49.92125],[6.23603,49.91355],[6.23187,49.91064],[6.22769,49.91062],[6.23229,49.9072],[6.23381,49.90028],[6.24692,49.89535],[6.25781,49.88724],[6.26301,49.88101],[6.27646,49.87725],[6.28113,49.87957],[6.29166,49.87548],[6.2977,49.86673],[6.30989,49.87107],[6.31532,49.8673],[6.31465,49.86057],[6.32361,49.85188],[6.32158,49.8409],[6.32741,49.83673],[6.33656,49.83998],[6.33937,49.8507],[6.36465,49.85164],[6.4022,49.82098],[6.42643,49.81629],[6.42807,49.81186],[6.43097,49.81129],[6.44161,49.81547],[6.44344,49.81233],[6.45366,49.81275],[6.46454,49.81975],[6.47057,49.82385],[6.49681,49.81277],[6.50669,49.80993],[6.51155,49.80238],[6.51485,49.80513],[6.5196,49.81446],[6.52981,49.81048],[6.53225,49.80686],[6.53083,49.80116],[6.50622,49.78899],[6.51917,49.78344],[6.51105,49.77422],[6.52056,49.76818],[6.52052,49.76134],[6.50373,49.75086],[6.50263,49.73298],[6.50727,49.72938],[6.51809,49.7242],[6.51642,49.72129],[6.51176,49.72016],[6.50479,49.725],[6.49891,49.72639],[6.49558,49.72443],[6.50712,49.71655],[6.50788,49.71215],[6.5046,49.71227],[6.42714,49.66237],[6.4399,49.66025],[6.44251,49.65591],[6.42178,49.61809],[6.39898,49.60094],[6.37941,49.59526],[6.37551,49.58809],[6.38443,49.5801],[6.38119,49.57509],[6.36909,49.5783],[6.35791,49.57166],[6.3849,49.55817],[6.38009,49.54856],[6.35855,49.53296],[6.35932,49.52481],[6.37076,49.50545],[6.37056,49.45732],[6.3334,49.46493],[6.32189,49.47244],[6.29503,49.47928],[6.28789,49.48379],[6.27191,49.49995],[6.24133,49.50693],[6.19669,49.50331],[6.17337,49.50577],[6.16086,49.50085],[6.1671,49.49006],[6.14018,49.48525],[6.12937,49.48803],[6.12725,49.47081],[6.1014,49.46726],[6.10483,49.45076],[6.08167,49.45417],[6.07722,49.46139],[6.05917,49.46306],[6.05222,49.46028],[6.04421,49.44553],[6.02529,49.44703],[6.02154,49.45127],[6.01574,49.44885],[5.99412,49.45301],[5.97657,49.44885],[5.97773,49.45955],[5.97232,49.46087],[5.96891,49.48202],[5.9616,49.49026],[5.91578,49.49835],[5.89033,49.4948],[5.86332,49.50006],[5.84897,49.50826],[5.84828,49.51397],[5.83641,49.51817],[5.83187,49.52639],[5.84308,49.53081],[5.83562,49.54114],[5.81625,49.53325],[5.8052,49.54272],[5.85943,49.57158],[5.86866,49.587],[5.86289,49.58525],[5.8511,49.58379],[5.84712,49.58961],[5.84565,49.5981],[5.8694,49.6106],[5.88182,49.63815],[5.89998,49.63907],[5.89934,49.66239],[5.85656,49.67628],[5.85628,49.68211],[5.8757,49.71118],[5.86481,49.72331],[5.84325,49.71822],[5.82191,49.72128],[5.82489,49.73767],[5.82073,49.74878],[5.78626,49.79079],[5.76517,49.78961],[5.75094,49.79094],[5.74159,49.82126],[5.74581,49.82435],[5.7372,49.83353],[5.74053,49.84142],[5.74701,49.84048],[5.74624,49.84783],[5.75399,49.84878],[5.74066,49.85152],[5.75229,49.85922],[5.74955,49.87554],[5.77567,49.87438],[5.77505,49.88057],[5.7346,49.89341],[5.73303,49.90285],[5.75783,49.91737],[5.76039,49.93252],[5.77073,49.93711],[5.76878,49.94239],[5.7688,49.96104],[5.78672,49.96816],[5.80524,49.96677],[5.80652,49.97321],[5.83129,49.97995],[5.83462,49.98656],[5.81806,49.99936],[5.81561,50.01437],[5.84792,50.02809],[5.86189,50.04581],[5.85087,50.0563],[5.85781,50.07186],[5.881,50.08069],[5.89196,50.12041],[5.95286,50.13384],[5.96175,50.17631]]],terms_url:"https://data.public.lu/en/datasets/bd-l-ortho-webservices-wms-et-wmts",terms_text:"Administration du Cadastre et de la Topographie",icon:"https://www.geoportail.lu/static/img/lion.png"},{id:"lu.geoportail.opendata.ortho2016",name:"Ortho 2016 geoportail.lu",type:"tms",template:"https://{switch:wmts3,wmts4}.geoportail.lu/opendata/wmts/ortho_2016/GLOBAL_WEBMERCATOR_4_V3/{zoom}/{x}/{y}.jpeg",endDate:"2016-08-16T00:00:00.000Z",startDate:"2013-08-30T00:00:00.000Z",zoomExtent:[0,20],polygon:[[[5.96175,50.17631],[6.02627,50.18496],[6.03318,50.16395],[6.06069,50.15536],[6.07668,50.15913],[6.07824,50.17255],[6.10176,50.17199],[6.1225,50.16437],[6.1201,50.15594],[6.1277,50.14993],[6.11323,50.13739],[6.12369,50.13719],[6.14093,50.1305],[6.13555,50.11899],[6.13808,50.10263],[6.13108,50.09964],[6.13547,50.09119],[6.12194,50.09059],[6.12634,50.07817],[6.13186,50.07348],[6.12117,50.064],[6.11444,50.06139],[6.11563,50.05817],[6.12361,50.06323],[6.13661,50.04178],[6.13034,50.02975],[6.14821,50.02307],[6.13868,50.01572],[6.13594,50.01485],[6.13138,50.01905],[6.13024,50.01819],[6.13934,50.01116],[6.1517,50.01058],[6.14546,49.99689],[6.13966,49.9994],[6.13852,49.99829],[6.14218,49.99535],[6.15023,49.99518],[6.15625,49.98867],[6.17305,49.98589],[6.17348,49.98344],[6.17035,49.98376],[6.16549,49.97115],[6.17151,49.96298],[6.1763,49.962],[6.17995,49.95386],[6.18339,49.9548],[6.17983,49.96307],[6.18331,49.9686],[6.19277,49.97158],[6.19978,49.95352],[6.20707,49.95672],[6.21269,49.9514],[6.22502,49.95039],[6.22044,49.94369],[6.22824,49.93726],[6.22635,49.92766],[6.21913,49.92354],[6.22986,49.92125],[6.23603,49.91355],[6.23187,49.91064],[6.22769,49.91062],[6.23229,49.9072],[6.23381,49.90028],[6.24692,49.89535],[6.25781,49.88724],[6.26301,49.88101],[6.27646,49.87725],[6.28113,49.87957],[6.29166,49.87548],[6.2977,49.86673],[6.30989,49.87107],[6.31532,49.8673],[6.31465,49.86057],[6.32361,49.85188],[6.32158,49.8409],[6.32741,49.83673],[6.33656,49.83998],[6.33937,49.8507],[6.36465,49.85164],[6.4022,49.82098],[6.42643,49.81629],[6.42807,49.81186],[6.43097,49.81129],[6.44161,49.81547],[6.44344,49.81233],[6.45366,49.81275],[6.46454,49.81975],[6.47057,49.82385],[6.49681,49.81277],[6.50669,49.80993],[6.51155,49.80238],[6.51485,49.80513],[6.5196,49.81446],[6.52981,49.81048],[6.53225,49.80686],[6.53083,49.80116],[6.50622,49.78899],[6.51917,49.78344],[6.51105,49.77422],[6.52056,49.76818],[6.52052,49.76134],[6.50373,49.75086],[6.50263,49.73298],[6.50727,49.72938],[6.51809,49.7242],[6.51642,49.72129],[6.51176,49.72016],[6.50479,49.725],[6.49891,49.72639],[6.49558,49.72443],[6.50712,49.71655],[6.50788,49.71215],[6.5046,49.71227],[6.42714,49.66237],[6.4399,49.66025],[6.44251,49.65591],[6.42178,49.61809],[6.39898,49.60094],[6.37941,49.59526],[6.37551,49.58809],[6.38443,49.5801],[6.38119,49.57509],[6.36909,49.5783],[6.35791,49.57166],[6.3849,49.55817],[6.38009,49.54856],[6.35855,49.53296],[6.35932,49.52481],[6.37076,49.50545],[6.37056,49.45732],[6.3334,49.46493],[6.32189,49.47244],[6.29503,49.47928],[6.28789,49.48379],[6.27191,49.49995],[6.24133,49.50693],[6.19669,49.50331],[6.17337,49.50577],[6.16086,49.50085],[6.1671,49.49006],[6.14018,49.48525],[6.12937,49.48803],[6.12725,49.47081],[6.1014,49.46726],[6.10483,49.45076],[6.08167,49.45417],[6.07722,49.46139],[6.05917,49.46306],[6.05222,49.46028],[6.04421,49.44553],[6.02529,49.44703],[6.02154,49.45127],[6.01574,49.44885],[5.99412,49.45301],[5.97657,49.44885],[5.97773,49.45955],[5.97232,49.46087],[5.96891,49.48202],[5.9616,49.49026],[5.91578,49.49835],[5.89033,49.4948],[5.86332,49.50006],[5.84897,49.50826],[5.84828,49.51397],[5.83641,49.51817],[5.83187,49.52639],[5.84308,49.53081],[5.83562,49.54114],[5.81625,49.53325],[5.8052,49.54272],[5.85943,49.57158],[5.86866,49.587],[5.86289,49.58525],[5.8511,49.58379],[5.84712,49.58961],[5.84565,49.5981],[5.8694,49.6106],[5.88182,49.63815],[5.89998,49.63907],[5.89934,49.66239],[5.85656,49.67628],[5.85628,49.68211],[5.8757,49.71118],[5.86481,49.72331],[5.84325,49.71822],[5.82191,49.72128],[5.82489,49.73767],[5.82073,49.74878],[5.78626,49.79079],[5.76517,49.78961],[5.75094,49.79094],[5.74159,49.82126],[5.74581,49.82435],[5.7372,49.83353],[5.74053,49.84142],[5.74701,49.84048],[5.74624,49.84783],[5.75399,49.84878],[5.74066,49.85152],[5.75229,49.85922],[5.74955,49.87554],[5.77567,49.87438],[5.77505,49.88057],[5.7346,49.89341],[5.73303,49.90285],[5.75783,49.91737],[5.76039,49.93252],[5.77073,49.93711],[5.76878,49.94239],[5.7688,49.96104],[5.78672,49.96816],[5.80524,49.96677],[5.80652,49.97321],[5.83129,49.97995],[5.83462,49.98656],[5.81806,49.99936],[5.81561,50.01437],[5.84792,50.02809],[5.86189,50.04581],[5.85087,50.0563],[5.85781,50.07186],[5.881,50.08069],[5.89196,50.12041],[5.95286,50.13384],[5.96175,50.17631]]],terms_url:"https://data.public.lu/en/datasets/bd-l-ortho-webservices-wms-et-wmts",terms_text:"Administration du Cadastre et de la Topographie",icon:"https://www.geoportail.lu/static/img/lion.png"},{id:"lu.geoportail.opendata.ortho2017",name:"Ortho 2017 geoportail.lu",type:"tms",template:"https://{switch:wmts3,wmts4}.geoportail.lu/opendata/wmts/ortho_2017/GLOBAL_WEBMERCATOR_4_V3/{zoom}/{x}/{y}.jpeg",endDate:"2017-06-22T00:00:00.000Z",startDate:"2017-06-14T00:00:00.000Z",zoomExtent:[0,20],polygon:[[[5.96175,50.17631],[6.02627,50.18496],[6.03318,50.16395],[6.06069,50.15536],[6.07668,50.15913],[6.07824,50.17255],[6.10176,50.17199],[6.1225,50.16437],[6.1201,50.15594],[6.1277,50.14993],[6.11323,50.13739],[6.12369,50.13719],[6.14093,50.1305],[6.13555,50.11899],[6.13808,50.10263],[6.13108,50.09964],[6.13547,50.09119],[6.12194,50.09059],[6.12634,50.07817],[6.13186,50.07348],[6.12117,50.064],[6.11444,50.06139],[6.11563,50.05817],[6.12361,50.06323],[6.13661,50.04178],[6.13034,50.02975],[6.14821,50.02307],[6.13868,50.01572],[6.13594,50.01485],[6.13138,50.01905],[6.13024,50.01819],[6.13934,50.01116],[6.1517,50.01058],[6.14546,49.99689],[6.13966,49.9994],[6.13852,49.99829],[6.14218,49.99535],[6.15023,49.99518],[6.15625,49.98867],[6.17305,49.98589],[6.17348,49.98344],[6.17035,49.98376],[6.16549,49.97115],[6.17151,49.96298],[6.1763,49.962],[6.17995,49.95386],[6.18339,49.9548],[6.17983,49.96307],[6.18331,49.9686],[6.19277,49.97158],[6.19978,49.95352],[6.20707,49.95672],[6.21269,49.9514],[6.22502,49.95039],[6.22044,49.94369],[6.22824,49.93726],[6.22635,49.92766],[6.21913,49.92354],[6.22986,49.92125],[6.23603,49.91355],[6.23187,49.91064],[6.22769,49.91062],[6.23229,49.9072],[6.23381,49.90028],[6.24692,49.89535],[6.25781,49.88724],[6.26301,49.88101],[6.27646,49.87725],[6.28113,49.87957],[6.29166,49.87548],[6.2977,49.86673],[6.30989,49.87107],[6.31532,49.8673],[6.31465,49.86057],[6.32361,49.85188],[6.32158,49.8409],[6.32741,49.83673],[6.33656,49.83998],[6.33937,49.8507],[6.36465,49.85164],[6.4022,49.82098],[6.42643,49.81629],[6.42807,49.81186],[6.43097,49.81129],[6.44161,49.81547],[6.44344,49.81233],[6.45366,49.81275],[6.46454,49.81975],[6.47057,49.82385],[6.49681,49.81277],[6.50669,49.80993],[6.51155,49.80238],[6.51485,49.80513],[6.5196,49.81446],[6.52981,49.81048],[6.53225,49.80686],[6.53083,49.80116],[6.50622,49.78899],[6.51917,49.78344],[6.51105,49.77422],[6.52056,49.76818],[6.52052,49.76134],[6.50373,49.75086],[6.50263,49.73298],[6.50727,49.72938],[6.51809,49.7242],[6.51642,49.72129],[6.51176,49.72016],[6.50479,49.725],[6.49891,49.72639],[6.49558,49.72443],[6.50712,49.71655],[6.50788,49.71215],[6.5046,49.71227],[6.42714,49.66237],[6.4399,49.66025],[6.44251,49.65591],[6.42178,49.61809],[6.39898,49.60094],[6.37941,49.59526],[6.37551,49.58809],[6.38443,49.5801],[6.38119,49.57509],[6.36909,49.5783],[6.35791,49.57166],[6.3849,49.55817],[6.38009,49.54856],[6.35855,49.53296],[6.35932,49.52481],[6.37076,49.50545],[6.37056,49.45732],[6.3334,49.46493],[6.32189,49.47244],[6.29503,49.47928],[6.28789,49.48379],[6.27191,49.49995],[6.24133,49.50693],[6.19669,49.50331],[6.17337,49.50577],[6.16086,49.50085],[6.1671,49.49006],[6.14018,49.48525],[6.12937,49.48803],[6.12725,49.47081],[6.1014,49.46726],[6.10483,49.45076],[6.08167,49.45417],[6.07722,49.46139],[6.05917,49.46306],[6.05222,49.46028],[6.04421,49.44553],[6.02529,49.44703],[6.02154,49.45127],[6.01574,49.44885],[5.99412,49.45301],[5.97657,49.44885],[5.97773,49.45955],[5.97232,49.46087],[5.96891,49.48202],[5.9616,49.49026],[5.91578,49.49835],[5.89033,49.4948],[5.86332,49.50006],[5.84897,49.50826],[5.84828,49.51397],[5.83641,49.51817],[5.83187,49.52639],[5.84308,49.53081],[5.83562,49.54114],[5.81625,49.53325],[5.8052,49.54272],[5.85943,49.57158],[5.86866,49.587],[5.86289,49.58525],[5.8511,49.58379],[5.84712,49.58961],[5.84565,49.5981],[5.8694,49.6106],[5.88182,49.63815],[5.89998,49.63907],[5.89934,49.66239],[5.85656,49.67628],[5.85628,49.68211],[5.8757,49.71118],[5.86481,49.72331],[5.84325,49.71822],[5.82191,49.72128],[5.82489,49.73767],[5.82073,49.74878],[5.78626,49.79079],[5.76517,49.78961],[5.75094,49.79094],[5.74159,49.82126],[5.74581,49.82435],[5.7372,49.83353],[5.74053,49.84142],[5.74701,49.84048],[5.74624,49.84783],[5.75399,49.84878],[5.74066,49.85152],[5.75229,49.85922],[5.74955,49.87554],[5.77567,49.87438],[5.77505,49.88057],[5.7346,49.89341],[5.73303,49.90285],[5.75783,49.91737],[5.76039,49.93252],[5.77073,49.93711],[5.76878,49.94239],[5.7688,49.96104],[5.78672,49.96816],[5.80524,49.96677],[5.80652,49.97321],[5.83129,49.97995],[5.83462,49.98656],[5.81806,49.99936],[5.81561,50.01437],[5.84792,50.02809],[5.86189,50.04581],[5.85087,50.0563],[5.85781,50.07186],[5.881,50.08069],[5.89196,50.12041],[5.95286,50.13384],[5.96175,50.17631]]],terms_url:"https://data.public.lu/en/datasets/bd-l-ortho-webservices-wms-et-wmts",terms_text:"Administration du Cadastre et de la Topographie",icon:"https://www.geoportail.lu/static/img/lion.png"},{id:"ORTOFOTO_V1",name:"Orthophoto 1st cycle (1994-1999) - Latvia",type:"wms",template:"https://services.lgia.gov.lv/arcfree/services/Ortofoto_v1/MapServer/WmsServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[27.66415,55.75354],[27.68475,55.93319],[28.26703,56.1908],[28.23682,56.49827],[27.82757,56.94886],[27.90997,57.37037],[27.58313,57.56387],[26.93219,57.63598],[26.5202,57.58596],[26.0368,57.87192],[25.1991,58.10487],[24.31744,57.90258],[24.31744,57.19669],[23.93567,56.9788],[23.55115,56.98479],[23.23804,57.10283],[23.14465,57.37333],[22.60632,57.60215],[22.60083,57.76953],[21.66699,57.56681],[21.40057,57.29625],[21.38409,57.0177],[21.04626,56.80026],[20.99133,56.36615],[21.0545,56.0392],[21.28796,56.05608],[21.29895,56.1908],[22.11743,56.41936],[24.44379,56.24425],[24.81183,56.3996],[25.15515,56.1694],[25.58087,56.12962],[26.53668,55.66146],[26.91296,55.66766],[27.0805,55.80991],[27.66415,55.75354]]],terms_text:"Latvijas Ģeotelpiskās informācijas aģentūras brīvais WMS serviss 1994 - 1999.gada Latvijas ortofotokarte"},{id:"ORTOS_DGRF_2004_06",name:"Ortofotos DGRF 2004-2006 (WMS)",type:"wms",template:"http://mapas.dgterritorio.pt:8888/wms/produtos?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Ortos&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2006-01-01T00:00:00.000Z",startDate:"2004-01-01T00:00:00.000Z",zoomExtent:[14,19],polygon:[[[-7.31278,36.98391],[-7.44461,37.5718],[-7.1933,37.97019],[-6.97357,38.00807],[-6.90628,38.24142],[-7.06627,38.20743],[-7.27158,38.45628],[-7.20429,38.72356],[-7.0134,38.85468],[-6.91315,39.03839],[-6.97357,39.13113],[-7.17957,39.23651],[-7.28668,39.48497],[-7.44873,39.61838],[-7.34162,39.60886],[-6.99692,39.64906],[-6.81839,40.0192],[-7.01065,40.19986],[-6.85272,40.24285],[-6.76209,40.35073],[-6.77994,40.8886],[-6.88637,41.01151],[-6.79642,41.01721],[-6.63849,41.21689],[-6.4531,41.24116],[-6.29311,41.38763],[-6.15715,41.5908],[-6.31165,41.68932],[-6.51215,41.71188],[-6.49841,41.88081],[-6.56296,41.97991],[-6.80191,42.00951],[-7.20497,42.00135],[-7.22763,41.8849],[-7.36908,41.87058],[-7.72751,41.92885],[-7.92526,41.94009],[-8.07907,41.84706],[-8.1601,41.91812],[-8.01796,42.05031],[-8.19924,42.18681],[-8.39356,42.1023],[-8.66066,42.07886],[-8.88382,41.88081],[-9.17084,41.86956],[-9.04175,41.43655],[-9.01978,40.65981],[-9.15711,40.26695],[-9.81903,39.52099],[-9.74213,38.6512],[-9.12964,37.88136],[-9.27246,36.99378],[-9.09394,36.68604],[-7.80579,36.74989],[-7.31278,36.98391]]],terms_url:"http://www.dgterritorio.pt/dados_abertos/ortofotos/",terms_text:"Direcção-Geral do Território",icon:"http://www.igeo.pt/favicon.ico"},{id:"ORTOS_DGT_2014_15",name:"Ortofotos Litoral DGT 2014-2015 (WMS)",type:"wms",template:"http://ows.dgterritorio.pt/wss/service/ortos2014-2015-wms/guest?language=por&FORMAT=image/png&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Ortoimagens_2014-2015_Litoral&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2015-01-01T00:00:00.000Z",startDate:"2014-01-01T00:00:00.000Z",zoomExtent:[1,20],polygon:[[[-7.38968,37.19205],[-7.52426,37.18002],[-7.89505,36.98171],[-8.15186,37.10886],[-8.65036,37.14062],[-8.95111,37.03545],[-8.78632,37.34833],[-8.76434,37.55111],[-8.7561,38.38258],[-8.47664,38.33466],[-8.47183,38.40141],[-8.66066,38.46596],[-8.66959,38.60882],[-9.142,38.53689],[-8.81104,38.67372],[-8.79318,38.85468],[-8.95935,38.9829],[-9.18732,38.84934],[-9.2395,38.72838],[-9.37821,38.74659],[-9.38233,39.07891],[-9.29169,39.2514],[-9.31915,39.33642],[-9.17084,39.38526],[-9.06372,39.48815],[-9.02252,39.69662],[-8.78632,40.14529],[-8.86322,40.2093],[-8.72589,40.53155],[-8.64075,40.50858],[-8.62427,40.63063],[-8.53089,40.6004],[-8.535,40.71292],[-8.61466,40.89275],[-8.61878,41.10419],[-8.53089,41.16728],[-8.66959,41.21689],[-8.72315,41.41081],[-8.76984,41.65958],[-8.66547,41.73955],[-8.81104,41.72316],[-8.81104,41.85217],[-8.74649,41.9125],[-8.83576,41.93089],[-8.91815,41.84501],[-8.89343,41.70778],[-8.82065,41.50755],[-8.73139,41.16315],[-8.67508,41.069],[-8.68469,40.90729],[-8.93326,40.17573],[-8.88107,40.12219],[-9.11453,39.64694],[-9.11865,39.5623],[-9.3013,39.40543],[-9.43039,39.37571],[-9.34799,39.23864],[-9.45099,39.04799],[-9.45786,38.89317],[-9.53201,38.78835],[-9.50043,38.68551],[-9.28894,38.663],[-9.19418,38.54172],[-9.25324,38.38473],[-9.03488,38.42347],[-8.92502,38.46757],[-8.81241,38.35997],[-8.7973,38.14968],[-8.91953,37.95286],[-8.84262,37.8651],[-8.83988,37.40617],[-9.02664,37.01023],[-8.92914,36.97513],[-8.61466,37.099],[-8.15048,37.05956],[-7.8923,36.93672],[-7.48993,37.15156],[-7.39105,37.15813],[-7.38968,37.19205]]],terms_url:"http://www.dgterritorio.pt/",terms_text:"Direcção-Geral do Território",icon:"http://www.igeo.pt/favicon.ico"},{id:"OS-historic-25k-OSM_Limited",name:"OS 1:25k historic (OSM)",type:"tms",template:"https://ooc.openstreetmap.org/os1/{zoom}/{x}/{y}.jpg",zoomExtent:[6,17],polygon:[[[-6.45854,49.90441],[-6.3872,49.98411],[-6.22968,49.98962],[-6.21713,49.86801],[-6.45512,49.85918],[-6.45854,49.90441]],[[-1.44951,60.86341],[-0.71671,60.85451],[-0.73497,60.43598],[-0.69388,60.41682],[-0.72584,60.39427],[-0.73954,60.04847],[-0.92674,60.04619],[-0.93815,59.82662],[-1.45865,59.8312],[-1.44552,60.0536],[-1.46321,60.0536],[-1.46435,60.063],[-1.57165,60.06385],[-1.56936,60.179],[-1.64356,60.1807],[-1.64356,60.18922],[-1.82162,60.1895],[-1.82048,60.36155],[-1.8416,60.36973],[-1.82162,60.38328],[-1.81799,60.59343],[-1.45317,60.59343],[-1.44951,60.86341]],[[-4.90892,54.42421],[-4.2826,54.44299],[-4.25354,54.02977],[-4.87664,54.02218],[-4.90892,54.42421]],[[-5.86674,59.14446],[-5.776,59.14709],[-5.772,59.10141],[-5.86218,59.09906],[-5.86674,59.14446]],[[-1.70659,59.57036],[-1.55792,59.56935],[-1.55649,59.49657],[-1.70545,59.49758],[-1.70659,59.57036]],[[-7.68658,58.2941],[-7.53306,58.3007],[-7.52564,58.26469],[-7.67973,58.25779],[-7.68658,58.2941]],[[-4.53383,59.03599],[-4.48132,59.03716],[-4.47961,59.01866],[-4.53326,59.01807],[-4.53383,59.03599]],[[-8.67107,57.87699],[-8.46732,57.88973],[-8.44678,57.7907],[-8.65109,57.77792],[-8.67107,57.87699]],[[-5.23955,50.35306],[-5.79201,50.33849],[-5.76005,49.9317],[-4.65514,49.95815],[-4.67797,50.28601],[-4.24422,50.28017],[-4.24878,50.20425],[-3.38129,50.20425],[-3.42238,50.51882],[-3.11648,50.52463],[-3.12105,50.65796],[-2.67364,50.66195],[-2.59535,50.63943],[-2.5905,50.57284],[-2.47912,50.57335],[-2.47589,50.50667],[-2.39679,50.50564],[-2.40164,50.57233],[-1.04003,50.57182],[-1.03357,50.70593],[-0.5493,50.70388],[-0.54607,50.78866],[-0.09247,50.7856],[-0.08763,50.71819],[0.47897,50.71206],[0.48704,50.81825],[0.97615,50.80499],[0.99229,51.01263],[1.44912,51.00044],[1.47818,51.40904],[1.02296,51.42716],[1.03588,51.76409],[1.61054,51.7501],[1.64606,52.156],[1.72677,52.15402],[1.74937,52.44818],[1.78707,52.48116],[1.7591,52.52251],[1.79335,52.96027],[0.37981,52.99585],[0.38952,53.25112],[0.34786,53.25112],[0.32389,53.28219],[0.34615,53.65385],[0.12849,53.65755],[0.11658,53.66747],[0.13506,54.06557],[-0.06098,54.06591],[-0.04142,54.47094],[-0.56627,54.47718],[-0.55921,54.65651],[-1.16656,54.66235],[-1.16374,54.84261],[-1.33162,54.84391],[-1.32571,55.24708],[-1.52945,55.24871],[-1.52418,55.65401],[-1.76388,55.65401],[-1.77337,55.97191],[-2.16079,55.9683],[-2.15433,56.06214],[-2.45781,56.05853],[-2.41906,56.64172],[-2.09622,56.64172],[-2.0833,57.00213],[-1.92834,57.01268],[-1.9181,57.35909],[-1.75022,57.36257],[-1.76959,57.76086],[-3.69376,57.75742],[-3.70667,57.98064],[-3.5969,57.97721],[-3.60336,58.12073],[-3.02223,58.13096],[-3.02869,58.54108],[-2.8479,58.53097],[-2.86081,58.84305],[-2.67962,58.8415],[-2.68419,58.88517],[-2.63397,58.90522],[-2.67962,58.93351],[-2.68876,59.02292],[-2.36687,59.02292],[-2.37029,59.26529],[-2.3429,59.2822],[-2.37144,59.29969],[-2.37372,59.37071],[-2.3429,59.38582],[-2.37258,59.40035],[-2.37144,59.42591],[-3.07342,59.42301],[-3.07114,59.34336],[-3.1031,59.33114],[-3.07456,59.31367],[-3.07228,59.2326],[-3.38503,59.14842],[-3.37476,58.93528],[-3.56538,58.93233],[-3.55483,58.69759],[-5.28086,58.66677],[-5.25342,58.35141],[-5.50685,58.34379],[-5.47618,58.03236],[-5.8975,58.02124],[-5.8523,57.61718],[-6.13963,57.61372],[-6.15416,57.74232],[-6.29137,57.73801],[-6.33657,58.13988],[-6.11219,58.14669],[-6.14738,58.51063],[-6.29348,58.54162],[-6.84137,58.29773],[-7.00574,58.29293],[-7.10162,58.20644],[-7.25731,58.17931],[-7.25311,58.10049],[-7.40707,58.09056],[-7.39135,57.79114],[-7.79099,57.77332],[-7.76242,57.54442],[-7.6985,57.14532],[-7.79438,57.13045],[-7.71676,56.73686],[-7.01221,56.76544],[-6.97992,56.54539],[-7.06386,56.54539],[-7.04449,56.35626],[-6.50068,56.38129],[-6.44914,55.97936],[-6.56329,55.96915],[-6.53937,55.70301],[-6.55955,55.69073],[-6.53453,55.67617],[-6.52162,55.57044],[-5.89126,55.59234],[-5.85601,55.23207],[-5.22936,55.2516],[-5.18371,54.62541],[-3.6656,54.65184],[-3.64962,54.432],[-3.54004,54.43067],[-3.53091,54.02902],[-3.06977,54.03036],[-3.06757,53.82214],[-3.08049,53.77399],[-3.06192,53.74775],[-3.06112,53.6737],[-3.21447,53.67084],[-3.20577,53.42262],[-3.27996,53.35522],[-3.28967,53.36084],[-3.33275,53.36493],[-3.37613,53.35403],[-4.0889,53.34331],[-4.09455,53.4612],[-4.69741,53.44486],[-4.68828,53.33186],[-4.72024,53.28958],[-4.68371,53.24862],[-4.67687,53.15426],[-4.84808,53.14468],[-4.81783,52.74403],[-4.25458,52.75589],[-4.22888,52.25488],[-4.26076,52.25364],[-4.27246,52.24326],[-4.81363,52.23009],[-4.80792,52.11389],[-5.38891,52.09917],[-5.37179,51.91297],[-5.42087,51.91015],[-5.41402,51.84532],[-5.36836,51.84744],[-5.34668,51.55953],[-4.77368,51.57585],[-4.76569,51.48851],[-4.19154,51.49704],[-4.18698,51.43447],[-3.61512,51.44443],[-3.61055,51.37465],[-3.14941,51.37893],[-3.14941,51.29193],[-4.30387,51.27459],[-4.28612,51.05087],[-4.85433,51.03666],[-4.83722,50.72128],[-5.26183,50.70827],[-5.23955,50.35306]],[[-2.15027,60.17132],[-2.00302,60.16961],[-2.00131,60.0997],[-2.14855,60.10112],[-2.15027,60.17132]],[[-6.2086,59.11635],[-6.12299,59.11664],[-6.12185,59.0715],[-6.20974,59.0715],[-6.2086,59.11635]],[[-4.41596,59.0889],[-4.4212,59.07708],[-4.39719,59.07791],[-4.39134,59.08973],[-4.41596,59.0889]]]},{id:"OS-New_Popular_Edition-historic",name:"OS New Popular Edition historic",type:"tms",template:"https://ooc.openstreetmap.org/npe/{zoom}/{x}/{y}.png",zoomExtent:[6,15],polygon:[[[-3.68466,55.23744],[-3.65106,54.42892],[-3.54463,54.43072],[-3.52815,54.02593],[-3.07016,54.03137],[-3.06123,53.6717],[-3.21298,53.67048],[-3.20371,53.35568],[-4.10424,53.34297],[-4.11042,53.46005],[-4.71124,53.44799],[-4.69339,53.15171],[-4.84307,53.1476],[-4.81595,52.74378],[-4.25342,52.75541],[-4.22733,52.24378],[-4.81303,52.23117],[-4.80754,52.11452],[-5.38913,52.09892],[-5.3493,51.56085],[-4.77252,51.57622],[-4.76772,51.48652],[-4.19299,51.49806],[-4.18956,51.43518],[-3.61278,51.44502],[-3.61072,51.37307],[-3.15067,51.37864],[-3.14723,51.28984],[-4.29462,51.2718],[-4.28363,51.04744],[-4.85423,51.03406],[-4.83707,50.76556],[-5.2621,50.75427],[-5.23395,50.34984],[-5.79562,50.33319],[-5.76228,49.92913],[-4.64717,49.96094],[-4.66914,50.2753],[-4.25166,50.2832],[-4.24617,50.19361],[-3.40159,50.20679],[-3.41395,50.52041],[-3.13105,50.52391],[-3.1338,50.66078],[-2.66963,50.66252],[-2.66688,50.5719],[-1.04228,50.56929],[-1.04502,50.70429],[-0.54652,50.69994],[-0.54103,50.79031],[-0.08784,50.78424],[-0.08887,50.72211],[0.47693,50.70907],[0.48242,50.81939],[0.98024,50.8068],[0.99328,51.01333],[1.44784,51.00036],[1.47805,51.40478],[1.018,51.41634],[1.04272,51.76742],[1.6195,51.75084],[1.65246,52.15456],[1.72662,52.15245],[1.79529,52.9594],[0.60396,52.99123],[0.60327,52.97222],[0.38148,52.97883],[0.39625,53.24796],[0.31934,53.24961],[0.34269,53.65319],[0.11609,53.65726],[0.13738,54.06181],[-0.06243,54.06584],[-0.04183,54.46924],[-0.56781,54.47722],[-0.56163,54.65715],[-1.18098,54.66271],[-1.17755,54.84183],[-1.33342,54.84381],[-1.32655,55.24743],[-1.53117,55.24821],[-1.52636,55.6528],[-1.76394,55.6528],[-1.76257,55.96765],[-2.40321,55.96727],[-2.39772,55.56243],[-2.16151,55.56282],[-2.15808,55.2486],[-2.92158,55.24571],[-3.68466,55.23744]]]},{id:"OS-OpenData_Locator",name:"OS OpenData Locator",type:"tms",template:"http://tiles.itoworld.com/os_locator/{zoom}/{x}/{y}.png",zoomExtent:[0,22],polygon:[[[-0.88639,61.11666],[-9.24009,57.92465],[-6.61235,55.46835],[-6.1039,55.40191],[-5.61358,55.06607],[-5.40088,54.90562],[-5.29371,54.77201],[-5.11832,54.5911],[-4.92368,54.38599],[-4.94067,53.59884],[-5.44172,52.27725],[-6.03376,51.6012],[-7.54473,49.33762],[-2.59721,50.2588],[0.65674,50.64047],[1.32419,50.83256],[1.87586,51.19234],[2.05883,52.88863],[-1.61452,56.47933],[-1.21085,57.64972],[-1.69525,59.08903],[0.21543,60.43058],[-0.88639,61.11666]]],overlay:true},{id:"OS-OpenData_StreetView",name:"OS OpenData StreetView",type:"tms",template:"https://{switch:a,b,c}.os.openstreetmap.org/sv/{zoom}/{x}/{y}.png",zoomExtent:[1,18],polygon:[[[-5.82929,50.02297],[-5.82929,50.25482],[-5.37336,50.25482],[-5.37336,50.35306],[-5.1756,50.35306],[-5.1756,50.59254],[-4.99707,50.59254],[-4.99707,50.69356],[-4.79657,50.69356],[-4.79657,50.78221],[-4.69495,50.78221],[-4.69495,50.96074],[-4.60431,50.96074],[-4.60431,51.06921],[-4.37922,51.06921],[-4.37922,51.25218],[-3.90393,51.25218],[-3.90393,51.2917],[-3.71717,51.2917],[-3.71717,51.2453],[-3.14862,51.2453],[-3.14862,51.36207],[-3.74463,51.36207],[-3.74463,51.43404],[-3.82978,51.43404],[-3.82978,51.52982],[-4.08521,51.52982],[-4.08521,51.49393],[-4.37922,51.49393],[-4.37922,51.54272],[-5.14442,51.54272],[-5.14442,51.6296],[-5.73871,51.6296],[-5.73871,51.77404],[-5.50954,51.77404],[-5.50954,51.98026],[-5.1988,51.98026],[-5.1988,52.09734],[-4.88806,52.09734],[-4.88806,52.18316],[-4.49575,52.18316],[-4.49575,52.29257],[-4.30154,52.29257],[-4.30154,52.36853],[-4.18112,52.36853],[-4.18112,52.79337],[-4.44137,52.79337],[-4.44137,52.73696],[-4.85698,52.73696],[-4.85698,52.93173],[-4.7288,52.93173],[-4.7288,53.50386],[-4.15782,53.50386],[-4.15782,53.41135],[-3.31105,53.41135],[-3.31105,53.50386],[-3.23337,53.50386],[-3.23337,54.01592],[-3.39262,54.01592],[-3.39262,54.1981],[-3.55964,54.1981],[-3.55964,54.43373],[-3.7189,54.43373],[-3.7189,54.7219],[-4.30154,54.7219],[-4.30154,54.61407],[-5.04731,54.61407],[-5.04731,54.75329],[-5.22987,54.75329],[-5.22987,55.21908],[-5.65326,55.21908],[-5.65326,55.25009],[-5.89796,55.25009],[-5.89796,55.48225],[-6.59332,55.48225],[-6.59332,56.30134],[-7.17277,56.30134],[-7.17277,56.56018],[-6.81717,56.56018],[-6.81717,56.69917],[-6.53153,56.69917],[-6.53153,56.9067],[-6.81168,56.9067],[-6.81168,57.37166],[-6.8721,57.37166],[-6.8721,57.55189],[-7.09732,57.55189],[-7.09732,57.24111],[-7.17423,57.24111],[-7.17423,56.9067],[-7.37198,56.9067],[-7.37198,56.80759],[-7.5203,56.80759],[-7.5203,56.71425],[-7.83068,56.71425],[-7.83068,56.89946],[-7.64941,56.89946],[-7.64941,57.47396],[-7.83068,57.47396],[-7.83068,57.79156],[-7.47362,57.79156],[-7.47362,58.08606],[-7.18798,58.08606],[-7.18798,58.3672],[-6.80346,58.3672],[-6.80346,58.41558],[-6.63866,58.41558],[-6.63866,58.46733],[-6.51781,58.46733],[-6.51781,58.56256],[-6.05362,58.56256],[-6.05362,58.15688],[-6.14701,58.15688],[-6.14701,58.11059],[-6.27998,58.11059],[-6.27998,57.71227],[-6.15913,57.71227],[-6.15913,57.66676],[-5.93391,57.66676],[-5.93391,57.88925],[-5.80643,57.88925],[-5.80643,57.96218],[-5.61417,57.96218],[-5.61417,58.09112],[-5.49082,58.09112],[-5.49082,58.37333],[-5.31991,58.37333],[-5.31991,58.75015],[-3.572,58.75015],[-3.572,59.20918],[-3.19445,59.20918],[-3.19445,59.47592],[-2.24358,59.47592],[-2.24358,59.13887],[-2.4611,59.13887],[-2.4611,58.81859],[-2.74077,58.81859],[-2.74077,58.58047],[-2.91167,58.58047],[-2.91167,58.11575],[-3.48654,58.11575],[-3.48654,57.74039],[-1.71532,57.74039],[-1.71532,57.22256],[-1.97945,57.22256],[-1.97945,56.87607],[-2.1659,56.87607],[-2.1659,56.63332],[-2.36011,56.63332],[-2.36011,56.04775],[-1.97945,56.04775],[-1.97945,55.86509],[-1.4745,55.86509],[-1.4745,55.24999],[-1.3222,55.24999],[-1.3222,54.82217],[-1.055,54.82217],[-1.055,54.67466],[-0.66188,54.67466],[-0.66188,54.55275],[-0.32476,54.55275],[-0.32476,54.28652],[0.00928,54.28652],[0.00928,53.79385],[0.2082,53.79385],[0.2082,53.52177],[0.41635,53.52177],[0.41635,53.02989],[1.42734,53.02989],[1.42734,52.92021],[1.83339,52.92021],[1.83339,52.04249],[1.52355,52.04249],[1.52355,51.82613],[1.2697,51.82613],[1.2697,51.69675],[1.11665,51.69675],[1.11665,51.44035],[1.52355,51.44035],[1.52355,51.33318],[1.45076,51.33318],[1.45076,51.02076],[1.06999,51.02076],[1.06999,50.90084],[0.77881,50.90084],[0.77881,50.72984],[-0.7256,50.72984],[-0.7256,50.70384],[-1.00744,50.70384],[-1.00744,50.57363],[-2.36253,50.57363],[-2.36253,50.48464],[-2.49878,50.48464],[-2.49878,50.57363],[-3.40964,50.57363],[-3.40964,50.20578],[-3.69224,50.20578],[-3.69224,50.13477],[-5.00547,50.13477],[-5.00547,49.94745],[-5.28395,49.94745],[-5.28395,50.02297],[-5.82929,50.02297]],[[-6.45807,49.86736],[-6.45807,49.94999],[-6.39788,49.94999],[-6.39788,50.00538],[-6.17996,50.00538],[-6.17996,49.91686],[-6.25402,49.91686],[-6.25402,49.86736],[-6.45807,49.86736]],[[-5.83432,49.93216],[-5.83432,49.97546],[-5.76833,49.97546],[-5.76833,49.93216],[-5.83432,49.93216]],[[-1.94838,60.68857],[-1.94838,60.30588],[-1.75431,60.30588],[-1.75431,60.12844],[-1.57549,60.12844],[-1.57549,59.79792],[-1.0317,59.79792],[-1.0317,60.03545],[-0.66269,60.03545],[-0.66269,60.91039],[-1.10344,60.91039],[-1.10344,60.804],[-1.35063,60.804],[-1.35063,60.68857],[-1.94838,60.68857]],[[-2.20338,60.19686],[-2.20338,60.09294],[-1.9864,60.09294],[-1.9864,60.19686],[-2.20338,60.19686]],[[-1.75431,59.56983],[-1.75431,59.46394],[-1.53733,59.46394],[-1.53733,59.56983],[-1.75431,59.56983]],[[-4.5586,59.13705],[-4.5586,58.95691],[-4.2867,58.95691],[-4.2867,59.13705],[-4.5586,59.13705]],[[-6.27877,59.20257],[-6.27877,59.02278],[-5.66506,59.02278],[-5.66506,59.20257],[-6.27877,59.20257]],[[-8.71635,57.94406],[-8.71635,57.73059],[-8.35929,57.73059],[-8.35929,57.94406],[-8.71635,57.94406]],[[-7.6077,50.4021],[-7.6077,50.26887],[-7.39072,50.26887],[-7.39072,50.4021],[-7.6077,50.4021]],[[-7.73043,58.35799],[-7.73043,58.24831],[-7.51345,58.24831],[-7.51345,58.35799],[-7.73043,58.35799]]]},{id:"OS-Scottish_Popular-historic",name:"OS Scottish Popular historic",type:"tms",template:"https://ooc.openstreetmap.org/npescotland/{zoom}/{x}/{y}.jpg",zoomExtent:[6,15],polygon:[[[-6.37546,57.1045],[-6.12998,57.11183],[-6.12586,56.94143],[-6.26045,56.93892],[-6.26045,56.83765],[-6.24259,56.65806],[-6.3552,56.65655],[-6.37649,56.79029],[-7.02812,56.76396],[-6.99636,56.54246],[-7.04391,56.53937],[-7.03206,56.44201],[-6.98331,56.44353],[-6.97593,56.36063],[-6.45271,56.37964],[-6.44035,56.2013],[-6.19315,56.21199],[-6.18354,56.12483],[-6.36379,56.11641],[-6.36173,55.98258],[-6.48944,55.97912],[-6.47777,55.84134],[-6.55467,55.8371],[-6.53545,55.66049],[-6.45442,55.66087],[-6.44412,55.57285],[-6.19985,55.57266],[-5.96845,55.58857],[-5.98562,55.7686],[-5.90665,55.77169],[-5.88949,55.59284],[-5.80983,55.594],[-5.79335,55.41395],[-5.827,55.41395],[-5.80915,55.24247],[-5.61826,55.24873],[-5.62101,55.26713],[-5.46239,55.27026],[-5.48642,55.514],[-5.43836,55.51516],[-5.42943,55.42681],[-5.24129,55.43071],[-5.19464,54.80351],[-5.07105,54.80668],[-5.05221,54.62471],[-4.3223,54.65173],[-4.33123,54.7319],[-4.06786,54.73697],[-4.06786,54.76471],[-3.55699,54.77342],[-3.55837,54.83754],[-2.42098,54.84671],[-2.42647,55.25265],[-2.03097,55.25265],[-2.01449,55.56606],[-1.76455,55.56606],[-1.76455,55.9724],[-2.35026,55.96548],[-2.5796,56.06527],[-2.58234,56.37071],[-2.65032,56.36919],[-2.65581,56.50585],[-2.48965,56.50509],[-2.42785,56.55356],[-2.42373,56.73026],[-2.1628,56.73177],[-2.17104,56.99301],[-2.00075,56.99301],[-1.98479,57.3159],[-1.83476,57.31553],[-1.83441,57.36074],[-1.75167,57.36111],[-1.74893,57.63046],[-1.83613,57.63009],[-1.83544,57.70171],[-2.00436,57.70207],[-2.00367,57.71968],[-3.22281,57.71418],[-3.22629,57.76157],[-3.51331,57.77622],[-3.50914,57.71051],[-3.84766,57.70611],[-3.85182,57.76853],[-3.79925,57.76989],[-3.80474,57.88578],[-3.85556,57.88651],[-3.85937,57.97558],[-3.79513,57.97656],[-3.79483,58.03052],[-3.69733,58.03161],[-3.69458,58.06722],[-3.52391,58.07437],[-3.52978,58.16007],[-3.35774,58.16286],[-3.3483,58.28742],[-3.07638,58.29121],[-3.03004,58.43744],[-3.01768,58.65814],[-2.85837,58.66028],[-2.86524,58.7943],[-2.75812,58.79715],[-2.76636,58.87461],[-2.6208,58.88668],[-2.62766,58.97527],[-2.54114,58.97668],[-2.54217,59.0841],[-2.52363,59.08375],[-2.52913,59.1574],[-2.43849,59.15705],[-2.4378,59.246],[-2.36914,59.24705],[-2.3688,59.40748],[-2.52947,59.40748],[-2.52741,59.33436],[-2.70319,59.33576],[-2.70525,59.40608],[-3.12891,59.40433],[-3.12411,59.15951],[-3.40288,59.1574],[-3.39464,58.9689],[-3.4276,58.96961],[-3.42572,58.88526],[-3.45215,58.87071],[-3.51017,58.86911],[-3.50708,58.78826],[-3.38555,58.79004],[-3.3828,58.6999],[-3.4494,58.69847],[-3.45078,58.65385],[-3.50159,58.65421],[-3.5009,58.62705],[-3.72612,58.62383],[-3.72475,58.60595],[-4.6476,58.5895],[-4.65996,58.67171],[-5.10697,58.66135],[-5.09804,58.58091],[-5.23743,58.57769],[-5.22455,58.26305],[-5.4127,58.25818],[-5.39965,58.12245],[-5.53286,58.11991],[-5.52393,57.99494],[-5.55346,57.99422],[-5.54728,57.93995],[-5.85696,57.93157],[-5.83181,57.73361],[-5.86374,57.73224],[-5.85773,57.66096],[-6.19624,57.64975],[-6.20242,57.72353],[-6.41666,57.7162],[-6.42421,57.75945],[-6.4764,57.75725],[-6.46884,57.71326],[-6.53339,57.71216],[-6.52721,57.6391],[-6.692,57.63395],[-6.68102,57.54341],[-6.78195,57.53826],[-6.75311,57.31608],[-6.50592,57.32498],[-6.49768,57.28084],[-6.4812,57.27824],[-6.47159,57.19203],[-6.38644,57.19352],[-6.37546,57.1045]],[[-7.65043,56.77461],[-7.40667,56.79304],[-7.41972,56.88281],[-7.38676,56.90268],[-7.25836,56.91056],[-7.24806,57.07141],[-7.11485,57.077],[-7.16772,57.43466],[-7.0352,57.44094],[-7.05236,57.69026],[-6.86834,57.6976],[-6.87315,57.71631],[-6.70286,57.72217],[-6.71591,57.81117],[-6.53188,57.81958],[-6.53875,57.88133],[-6.22015,57.89265],[-6.24143,58.09935],[-6.12676,58.10152],[-6.17758,58.53105],[-6.46734,58.52029],[-6.4591,58.45102],[-6.63145,58.44455],[-6.6239,58.39169],[-6.79212,58.38485],[-6.78869,58.34956],[-6.90885,58.34415],[-6.89718,58.25503],[-7.20136,58.24166],[-7.14094,57.83201],[-7.37509,57.82104],[-7.36822,57.69503],[-7.6573,57.68292],[-7.67652,57.80715],[-7.79257,57.80202],[-7.77327,57.67734],[-7.70756,57.68024],[-7.69376,57.59088],[-7.75947,57.58797],[-7.74587,57.49965],[-7.51241,57.5085],[-7.47911,57.29468],[-7.52855,57.2932],[-7.51276,57.05871],[-7.61163,57.05386],[-7.59859,56.87493],[-7.66725,56.87268],[-7.65043,56.77461]],[[-1.46238,59.82831],[-1.21519,59.83107],[-1.21519,59.96194],[-1.10533,59.96056],[-1.0986,60.09498],[-0.97632,60.09346],[-0.96352,60.3476],[-0.74028,60.34484],[-0.7147,60.84722],[-1.08215,60.85901],[-1.08455,60.76944],[-1.21296,60.77011],[-1.21579,60.68079],[-1.23364,60.68113],[-1.23467,60.5909],[-1.27132,60.59191],[-1.27338,60.64581],[-1.45466,60.64648],[-1.45397,60.59224],[-1.6373,60.59292],[-1.63954,60.3507],[-1.73172,60.35095],[-1.73172,60.18067],[-1.64177,60.17931],[-1.64177,60.1448],[-1.46393,60.14344],[-1.46238,59.82831]],[[-6.21496,56.97437],[-6.22525,57.06445],[-6.29117,57.06184],[-6.29237,57.08062],[-6.62162,57.06943],[-6.61338,57.00629],[-6.46163,57.01302],[-6.4582,56.96776],[-6.21496,56.97437]],[[-2.12774,60.10855],[-2.12803,60.16207],[-2.00203,60.16224],[-2.00174,60.10872],[-2.12774,60.10855]],[[-6.68977,56.95804],[-6.69228,56.9759],[-6.65984,56.97726],[-6.65733,56.9594],[-6.68977,56.95804]],[[-7.66365,58.25846],[-7.66844,58.28502],[-7.54896,58.29098],[-7.54417,58.26442],[-7.66365,58.25846]],[[-8.65104,57.78885],[-8.66674,57.875],[-8.48272,57.88449],[-8.46702,57.79836],[-8.65104,57.78885]]]},{id:"OSIP_1ft",name:"OSIP 1ft Imagery Most Current Available",type:"wms",template:"https://geo1.oit.ohio.gov/arcgis/services/OSIP/osip_best_avail_1ft/ImageServer/WMSServer?FORMAT=image/jpeg&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",endDate:"2014-01-01T00:00:00.000Z",startDate:"2011-01-01T00:00:00.000Z",zoomExtent:[8,19],polygon:[[[-83.1356,41.75081],[-83.08101,41.7511],[-83.0796,41.62936],[-82.95011,41.54404],[-82.89032,41.54404],[-82.89032,41.69462],[-82.8494,41.7463],[-82.76758,41.73925],[-82.75184,41.63584],[-82.64799,41.62408],[-82.68575,41.50634],[-82.49063,41.40492],[-82.0217,41.53462],[-81.72901,41.52048],[-81.39541,41.7369],[-81.10587,41.84484],[-80.50161,41.99939],[-80.51105,40.62127],[-80.6275,40.59021],[-80.58344,40.49933],[-80.58973,40.2812],[-80.85095,39.625],[-81.19399,39.37974],[-81.38912,39.31159],[-81.45521,39.38704],[-81.515,39.35054],[-81.54333,39.26288],[-81.72586,39.19461],[-81.73216,38.9258],[-81.9021,38.85477],[-81.95875,38.89397],[-81.9084,38.93315],[-82.02799,38.99922],[-82.11611,38.92336],[-82.12555,38.8278],[-82.19794,38.78856],[-82.16647,38.72475],[-82.16017,38.58712],[-82.26718,38.57236],[-82.29865,38.43198],[-82.57875,38.39745],[-82.73925,38.53545],[-82.8494,38.56006],[-82.91235,38.73212],[-83.00676,38.71002],[-83.14524,38.59942],[-83.30575,38.58466],[-83.39387,38.64368],[-83.46625,38.64614],[-83.54178,38.69283],[-83.65193,38.61172],[-83.74635,38.63385],[-83.9635,38.76403],[-84.08624,38.75421],[-84.22157,38.7812],[-84.34117,38.99922],[-84.49223,39.07255],[-84.64015,39.05545],[-84.74086,39.11164],[-84.84471,39.08477],[-84.82898,41.70637],[-83.44737,41.76038],[-83.13438,41.64959],[-83.1356,41.75081]]],terms_url:"https://ogrip.oit.ohio.gov/ProjectsInitiatives/StatewideImagery.aspx",terms_text:"Ohio Statewide Imagery Program",description:"Most recent available 1-foot orthoimagery from the Ohio Statewide Imagery Program."},{id:"OSIP_6in",name:"OSIP 6in Imagery Most Current Available",type:"wms",template:"https://geo1.oit.ohio.gov/arcgis/services/OSIP/OSIP_6in_best_avail/ImageServer/WMSServer?FORMAT=image/jpeg&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",endDate:"2018-01-01T00:00:00.000Z",startDate:"2010-01-01T00:00:00.000Z",zoomExtent:[8,19],polygon:[[[-83.1356,41.75081],[-83.08101,41.7511],[-83.0796,41.62936],[-82.95011,41.54404],[-82.89032,41.54404],[-82.89032,41.69462],[-82.8494,41.7463],[-82.76758,41.73925],[-82.75184,41.63584],[-82.64799,41.62408],[-82.68575,41.50634],[-82.49063,41.40492],[-82.0217,41.53462],[-81.72901,41.52048],[-81.39541,41.7369],[-81.10587,41.84484],[-80.50161,41.99939],[-80.51105,40.62127],[-80.6275,40.59021],[-80.58344,40.49933],[-80.58973,40.2812],[-80.85095,39.625],[-81.19399,39.37974],[-81.38912,39.31159],[-81.45521,39.38704],[-81.515,39.35054],[-81.54333,39.26288],[-81.72586,39.19461],[-81.73216,38.9258],[-81.9021,38.85477],[-81.95875,38.89397],[-81.9084,38.93315],[-82.02799,38.99922],[-82.11611,38.92336],[-82.12555,38.8278],[-82.19794,38.78856],[-82.16647,38.72475],[-82.16017,38.58712],[-82.26718,38.57236],[-82.29865,38.43198],[-82.57875,38.39745],[-82.73925,38.53545],[-82.8494,38.56006],[-82.91235,38.73212],[-83.00676,38.71002],[-83.14524,38.59942],[-83.30575,38.58466],[-83.39387,38.64368],[-83.46625,38.64614],[-83.54178,38.69283],[-83.65193,38.61172],[-83.74635,38.63385],[-83.9635,38.76403],[-84.08624,38.75421],[-84.22157,38.7812],[-84.34117,38.99922],[-84.49223,39.07255],[-84.64015,39.05545],[-84.74086,39.11164],[-84.84471,39.08477],[-84.82898,41.70637],[-83.44737,41.76038],[-83.13438,41.64959],[-83.1356,41.75081]]],terms_url:"https://ogrip.oit.ohio.gov/ProjectsInitiatives/StatewideImagery.aspx",terms_text:"Ohio Statewide Imagery Program",description:"Most recent available 6-inch orthoimagery from the Ohio Statewide Imagery Program."},{id:"osm-hr-knin-2007",name:"osm-hr: Knin-2007 Aerial imagery",type:"tms",template:"https://tms.osm-hr.org/knin-2007/{zoom}/{x}/{-y}.png",endDate:"2007-01-01T00:00:00.000Z",startDate:"2007-01-01T00:00:00.000Z",zoomExtent:[0,19],polygon:[[[16.21712,44.08054],[16.22916,44.08041],[16.22938,44.06055],[16.2303,44.05757],[16.23715,44.04213],[16.23715,44.03615],[16.23041,44.03599],[16.22494,44.03627],[16.2243,44.03599],[16.22404,44.03504],[16.21608,44.02178],[16.21286,44.01661],[16.20391,44.01672],[16.19269,44.02601],[16.18003,44.03662],[16.18011,44.03772],[16.21129,44.06685],[16.21712,44.08054]]]},{id:"osmie_barony",name:"OSMIE Baronies",type:"tms",template:"https://tile.openstreetmap.ie/barony/{zoom}/{x}/{y}.png",zoomExtent:[7,20],polygon:[[[-6.32987,52.38838],[-6.16508,52.58073],[-5.9893,52.9811],[-6.05796,53.31713],[-5.9838,53.50704],[-6.24473,53.86326],[-6.35459,53.91182],[-6.31614,53.98133],[-6.13487,53.97002],[-5.61851,54.23574],[-5.3878,54.44708],[-5.53886,54.67641],[-6.07444,55.21277],[-6.21452,55.33168],[-6.78306,55.17828],[-6.9506,55.25505],[-7.17582,55.35355],[-7.22526,55.45024],[-7.50816,55.28791],[-7.63999,55.28009],[-8.02451,55.2206],[-8.25797,55.27853],[-8.28269,55.172],[-8.58482,55.01168],[-8.38432,54.86021],[-8.69743,54.78901],[-8.85124,54.67641],[-8.46946,54.57942],[-8.17008,54.62397],[-8.33763,54.4854],[-8.68644,54.36556],[-8.62876,54.27625],[-9.04075,54.3051],[-9.13688,54.23614],[-9.2852,54.33834],[-9.90043,54.32233],[-10.15037,54.2245],[-10.27397,53.94578],[-9.98832,53.85678],[-10.3289,53.60982],[-10.22727,53.39418],[-9.78233,53.21857],[-8.96934,53.26952],[-9.04624,53.1762],[-9.2852,53.15644],[-9.40879,52.99433],[-9.57084,52.75562],[-9.97321,52.54316],[-9.70405,52.57071],[-9.69444,52.4855],[-9.97733,52.41854],[-9.87296,52.33387],[-9.92378,52.2381],[-10.06523,52.34478],[-10.15586,52.30113],[-10.65849,52.07212],[-9.90318,52.12274],[-10.45799,51.88772],[-10.39344,51.82411],[-10.56098,51.76635],[-10.32478,51.79014],[-10.25749,51.70937],[-9.80705,51.81816],[-10.28289,51.57045],[-9.89631,51.60032],[-9.51454,51.70256],[-9.83177,51.55082],[-9.83039,51.43368],[-9.43351,51.50468],[-9.53788,51.41741],[-8.63151,51.59179],[-7.70316,51.95209],[-7.46421,52.12105],[-6.33537,52.17667],[-6.32987,52.38838]],[[-9.89082,53.14368],[-9.51042,53.03605],[-9.45274,53.08557],[-9.82902,53.18279],[-9.89082,53.14368]]],icon:"https://www.townlands.ie/static/logo_small.png"},{id:"osmie_cps",name:"OSMIE Civil Parishes",type:"tms",template:"https://tile.openstreetmap.ie/civilparish/{zoom}/{x}/{y}.png",zoomExtent:[7,20],polygon:[[[-6.32987,52.38838],[-6.16508,52.58073],[-5.9893,52.9811],[-6.05796,53.31713],[-5.9838,53.50704],[-6.24473,53.86326],[-6.35459,53.91182],[-6.31614,53.98133],[-6.13487,53.97002],[-5.61851,54.23574],[-5.3878,54.44708],[-5.53886,54.67641],[-6.07444,55.21277],[-6.21452,55.33168],[-6.78306,55.17828],[-6.9506,55.25505],[-7.17582,55.35355],[-7.22526,55.45024],[-7.50816,55.28791],[-7.63999,55.28009],[-8.02451,55.2206],[-8.25797,55.27853],[-8.28269,55.172],[-8.58482,55.01168],[-8.38432,54.86021],[-8.69743,54.78901],[-8.85124,54.67641],[-8.46946,54.57942],[-8.17008,54.62397],[-8.33763,54.4854],[-8.68644,54.36556],[-8.62876,54.27625],[-9.04075,54.3051],[-9.13688,54.23614],[-9.2852,54.33834],[-9.90043,54.32233],[-10.15037,54.2245],[-10.27397,53.94578],[-9.98832,53.85678],[-10.3289,53.60982],[-10.22727,53.39418],[-9.78233,53.21857],[-8.96934,53.26952],[-9.04624,53.1762],[-9.2852,53.15644],[-9.40879,52.99433],[-9.57084,52.75562],[-9.97321,52.54316],[-9.70405,52.57071],[-9.69444,52.4855],[-9.97733,52.41854],[-9.87296,52.33387],[-9.92378,52.2381],[-10.06523,52.34478],[-10.15586,52.30113],[-10.65849,52.07212],[-9.90318,52.12274],[-10.45799,51.88772],[-10.39344,51.82411],[-10.56098,51.76635],[-10.32478,51.79014],[-10.25749,51.70937],[-9.80705,51.81816],[-10.28289,51.57045],[-9.89631,51.60032],[-9.51454,51.70256],[-9.83177,51.55082],[-9.83039,51.43368],[-9.43351,51.50468],[-9.53788,51.41741],[-8.63151,51.59179],[-7.70316,51.95209],[-7.46421,52.12105],[-6.33537,52.17667],[-6.32987,52.38838]],[[-9.89082,53.14368],[-9.51042,53.03605],[-9.45274,53.08557],[-9.82902,53.18279],[-9.89082,53.14368]]],icon:"https://www.townlands.ie/static/logo_small.png"},{id:"osmie_dail_ea",name:"OSMIE Dail Election Areas",type:"tms",template:"https://tile.openstreetmap.ie/dail_ea/{zoom}/{x}/{y}.png",zoomExtent:[7,20],polygon:[[[-6.32987,52.38838],[-6.16508,52.58073],[-5.9893,52.9811],[-6.05796,53.31713],[-5.9838,53.50704],[-6.24473,53.86326],[-6.35459,53.91182],[-6.31614,53.98133],[-6.13487,53.97002],[-5.61851,54.23574],[-5.3878,54.44708],[-5.53886,54.67641],[-6.07444,55.21277],[-6.21452,55.33168],[-6.78306,55.17828],[-6.9506,55.25505],[-7.17582,55.35355],[-7.22526,55.45024],[-7.50816,55.28791],[-7.63999,55.28009],[-8.02451,55.2206],[-8.25797,55.27853],[-8.28269,55.172],[-8.58482,55.01168],[-8.38432,54.86021],[-8.69743,54.78901],[-8.85124,54.67641],[-8.46946,54.57942],[-8.17008,54.62397],[-8.33763,54.4854],[-8.68644,54.36556],[-8.62876,54.27625],[-9.04075,54.3051],[-9.13688,54.23614],[-9.2852,54.33834],[-9.90043,54.32233],[-10.15037,54.2245],[-10.27397,53.94578],[-9.98832,53.85678],[-10.3289,53.60982],[-10.22727,53.39418],[-9.78233,53.21857],[-8.96934,53.26952],[-9.04624,53.1762],[-9.2852,53.15644],[-9.40879,52.99433],[-9.57084,52.75562],[-9.97321,52.54316],[-9.70405,52.57071],[-9.69444,52.4855],[-9.97733,52.41854],[-9.87296,52.33387],[-9.92378,52.2381],[-10.06523,52.34478],[-10.15586,52.30113],[-10.65849,52.07212],[-9.90318,52.12274],[-10.45799,51.88772],[-10.39344,51.82411],[-10.56098,51.76635],[-10.32478,51.79014],[-10.25749,51.70937],[-9.80705,51.81816],[-10.28289,51.57045],[-9.89631,51.60032],[-9.51454,51.70256],[-9.83177,51.55082],[-9.83039,51.43368],[-9.43351,51.50468],[-9.53788,51.41741],[-8.63151,51.59179],[-7.70316,51.95209],[-7.46421,52.12105],[-6.33537,52.17667],[-6.32987,52.38838]],[[-9.89082,53.14368],[-9.51042,53.03605],[-9.45274,53.08557],[-9.82902,53.18279],[-9.89082,53.14368]]],icon:"https://www.townlands.ie/static/logo_small.png"},{id:"osmie_eds",name:"OSMIE EDs",type:"tms",template:"https://tile.openstreetmap.ie/ed/{zoom}/{x}/{y}.png",zoomExtent:[7,20],polygon:[[[-6.32987,52.38838],[-6.16508,52.58073],[-5.9893,52.9811],[-6.05796,53.31713],[-5.9838,53.50704],[-6.24473,53.86326],[-6.35459,53.91182],[-6.31614,53.98133],[-6.13487,53.97002],[-5.61851,54.23574],[-5.3878,54.44708],[-5.53886,54.67641],[-6.07444,55.21277],[-6.21452,55.33168],[-6.78306,55.17828],[-6.9506,55.25505],[-7.17582,55.35355],[-7.22526,55.45024],[-7.50816,55.28791],[-7.63999,55.28009],[-8.02451,55.2206],[-8.25797,55.27853],[-8.28269,55.172],[-8.58482,55.01168],[-8.38432,54.86021],[-8.69743,54.78901],[-8.85124,54.67641],[-8.46946,54.57942],[-8.17008,54.62397],[-8.33763,54.4854],[-8.68644,54.36556],[-8.62876,54.27625],[-9.04075,54.3051],[-9.13688,54.23614],[-9.2852,54.33834],[-9.90043,54.32233],[-10.15037,54.2245],[-10.27397,53.94578],[-9.98832,53.85678],[-10.3289,53.60982],[-10.22727,53.39418],[-9.78233,53.21857],[-8.96934,53.26952],[-9.04624,53.1762],[-9.2852,53.15644],[-9.40879,52.99433],[-9.57084,52.75562],[-9.97321,52.54316],[-9.70405,52.57071],[-9.69444,52.4855],[-9.97733,52.41854],[-9.87296,52.33387],[-9.92378,52.2381],[-10.06523,52.34478],[-10.15586,52.30113],[-10.65849,52.07212],[-9.90318,52.12274],[-10.45799,51.88772],[-10.39344,51.82411],[-10.56098,51.76635],[-10.32478,51.79014],[-10.25749,51.70937],[-9.80705,51.81816],[-10.28289,51.57045],[-9.89631,51.60032],[-9.51454,51.70256],[-9.83177,51.55082],[-9.83039,51.43368],[-9.43351,51.50468],[-9.53788,51.41741],[-8.63151,51.59179],[-7.70316,51.95209],[-7.46421,52.12105],[-6.33537,52.17667],[-6.32987,52.38838]],[[-9.89082,53.14368],[-9.51042,53.03605],[-9.45274,53.08557],[-9.82902,53.18279],[-9.89082,53.14368]]],icon:"https://www.townlands.ie/static/logo_small.png"},{id:"osmie_local_ea",name:"OSMIE Local Election Areas",type:"tms",template:"https://tile.openstreetmap.ie/local_ea/{zoom}/{x}/{y}.png",zoomExtent:[7,20],polygon:[[[-6.32987,52.38838],[-6.16508,52.58073],[-5.9893,52.9811],[-6.05796,53.31713],[-5.9838,53.50704],[-6.24473,53.86326],[-6.35459,53.91182],[-6.31614,53.98133],[-6.13487,53.97002],[-5.61851,54.23574],[-5.3878,54.44708],[-5.53886,54.67641],[-6.07444,55.21277],[-6.21452,55.33168],[-6.78306,55.17828],[-6.9506,55.25505],[-7.17582,55.35355],[-7.22526,55.45024],[-7.50816,55.28791],[-7.63999,55.28009],[-8.02451,55.2206],[-8.25797,55.27853],[-8.28269,55.172],[-8.58482,55.01168],[-8.38432,54.86021],[-8.69743,54.78901],[-8.85124,54.67641],[-8.46946,54.57942],[-8.17008,54.62397],[-8.33763,54.4854],[-8.68644,54.36556],[-8.62876,54.27625],[-9.04075,54.3051],[-9.13688,54.23614],[-9.2852,54.33834],[-9.90043,54.32233],[-10.15037,54.2245],[-10.27397,53.94578],[-9.98832,53.85678],[-10.3289,53.60982],[-10.22727,53.39418],[-9.78233,53.21857],[-8.96934,53.26952],[-9.04624,53.1762],[-9.2852,53.15644],[-9.40879,52.99433],[-9.57084,52.75562],[-9.97321,52.54316],[-9.70405,52.57071],[-9.69444,52.4855],[-9.97733,52.41854],[-9.87296,52.33387],[-9.92378,52.2381],[-10.06523,52.34478],[-10.15586,52.30113],[-10.65849,52.07212],[-9.90318,52.12274],[-10.45799,51.88772],[-10.39344,51.82411],[-10.56098,51.76635],[-10.32478,51.79014],[-10.25749,51.70937],[-9.80705,51.81816],[-10.28289,51.57045],[-9.89631,51.60032],[-9.51454,51.70256],[-9.83177,51.55082],[-9.83039,51.43368],[-9.43351,51.50468],[-9.53788,51.41741],[-8.63151,51.59179],[-7.70316,51.95209],[-7.46421,52.12105],[-6.33537,52.17667],[-6.32987,52.38838]],[[-9.89082,53.14368],[-9.51042,53.03605],[-9.45274,53.08557],[-9.82902,53.18279],[-9.89082,53.14368]]],icon:"https://www.townlands.ie/static/logo_small.png"},{id:"osmie_tie_not_counties",name:"OSMIE T.ie Land not in Counties",type:"tms",template:"https://www.townlands.ie/tiles/not_counties/{zoom}/{x}/{y}.png",zoomExtent:[2,19],polygon:[[[-6.32987,52.38838],[-6.16508,52.58073],[-5.9893,52.9811],[-6.05796,53.31713],[-5.9838,53.50704],[-6.24473,53.86326],[-6.35459,53.91182],[-6.31614,53.98133],[-6.13487,53.97002],[-5.61851,54.23574],[-5.3878,54.44708],[-5.53886,54.67641],[-6.07444,55.21277],[-6.21452,55.33168],[-6.78306,55.17828],[-6.9506,55.25505],[-7.17582,55.35355],[-7.22526,55.45024],[-7.50816,55.28791],[-7.63999,55.28009],[-8.02451,55.2206],[-8.25797,55.27853],[-8.28269,55.172],[-8.58482,55.01168],[-8.38432,54.86021],[-8.69743,54.78901],[-8.85124,54.67641],[-8.46946,54.57942],[-8.17008,54.62397],[-8.33763,54.4854],[-8.68644,54.36556],[-8.62876,54.27625],[-9.04075,54.3051],[-9.13688,54.23614],[-9.2852,54.33834],[-9.90043,54.32233],[-10.15037,54.2245],[-10.27397,53.94578],[-9.98832,53.85678],[-10.3289,53.60982],[-10.22727,53.39418],[-9.78233,53.21857],[-8.96934,53.26952],[-9.04624,53.1762],[-9.2852,53.15644],[-9.40879,52.99433],[-9.57084,52.75562],[-9.97321,52.54316],[-9.70405,52.57071],[-9.69444,52.4855],[-9.97733,52.41854],[-9.87296,52.33387],[-9.92378,52.2381],[-10.06523,52.34478],[-10.15586,52.30113],[-10.65849,52.07212],[-9.90318,52.12274],[-10.45799,51.88772],[-10.39344,51.82411],[-10.56098,51.76635],[-10.32478,51.79014],[-10.25749,51.70937],[-9.80705,51.81816],[-10.28289,51.57045],[-9.89631,51.60032],[-9.51454,51.70256],[-9.83177,51.55082],[-9.83039,51.43368],[-9.43351,51.50468],[-9.53788,51.41741],[-8.63151,51.59179],[-7.70316,51.95209],[-7.46421,52.12105],[-6.33537,52.17667],[-6.32987,52.38838]],[[-9.89082,53.14368],[-9.51042,53.03605],[-9.45274,53.08557],[-9.82902,53.18279],[-9.89082,53.14368]]],icon:"https://www.townlands.ie/static/logo_small.png"},{id:"osmie_tds",name:"OSMIE Townlands",type:"tms",template:"https://tile.openstreetmap.ie/townland/{zoom}/{x}/{y}.png",zoomExtent:[7,20],polygon:[[[-6.32987,52.38838],[-6.16508,52.58073],[-5.9893,52.9811],[-6.05796,53.31713],[-5.9838,53.50704],[-6.24473,53.86326],[-6.35459,53.91182],[-6.31614,53.98133],[-6.13487,53.97002],[-5.61851,54.23574],[-5.3878,54.44708],[-5.53886,54.67641],[-6.07444,55.21277],[-6.21452,55.33168],[-6.78306,55.17828],[-6.9506,55.25505],[-7.17582,55.35355],[-7.22526,55.45024],[-7.50816,55.28791],[-7.63999,55.28009],[-8.02451,55.2206],[-8.25797,55.27853],[-8.28269,55.172],[-8.58482,55.01168],[-8.38432,54.86021],[-8.69743,54.78901],[-8.85124,54.67641],[-8.46946,54.57942],[-8.17008,54.62397],[-8.33763,54.4854],[-8.68644,54.36556],[-8.62876,54.27625],[-9.04075,54.3051],[-9.13688,54.23614],[-9.2852,54.33834],[-9.90043,54.32233],[-10.15037,54.2245],[-10.27397,53.94578],[-9.98832,53.85678],[-10.3289,53.60982],[-10.22727,53.39418],[-9.78233,53.21857],[-8.96934,53.26952],[-9.04624,53.1762],[-9.2852,53.15644],[-9.40879,52.99433],[-9.57084,52.75562],[-9.97321,52.54316],[-9.70405,52.57071],[-9.69444,52.4855],[-9.97733,52.41854],[-9.87296,52.33387],[-9.92378,52.2381],[-10.06523,52.34478],[-10.15586,52.30113],[-10.65849,52.07212],[-9.90318,52.12274],[-10.45799,51.88772],[-10.39344,51.82411],[-10.56098,51.76635],[-10.32478,51.79014],[-10.25749,51.70937],[-9.80705,51.81816],[-10.28289,51.57045],[-9.89631,51.60032],[-9.51454,51.70256],[-9.83177,51.55082],[-9.83039,51.43368],[-9.43351,51.50468],[-9.53788,51.41741],[-8.63151,51.59179],[-7.70316,51.95209],[-7.46421,52.12105],[-6.33537,52.17667],[-6.32987,52.38838]],[[-9.89082,53.14368],[-9.51042,53.03605],[-9.45274,53.08557],[-9.82902,53.18279],[-9.89082,53.14368]]],icon:"https://www.townlands.ie/static/logo_small.png"},{id:"al_palestina",name:"Palestina AL",type:"wms",template:"http://geoserver.dados.al.gov.br:8080/geoserver/Alagoas/ows?LAYERS=Palestina&SERVICE=WMS&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.0&SERVICE=WMS&REQUEST=GetMap&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[-37.28907,-9.71916],[-37.28904,-9.71114],[-37.28911,-9.7022],[-37.28915,-9.69175],[-37.28919,-9.68886],[-37.28927,-9.68069],[-37.28926,-9.67732],[-37.28936,-9.66999],[-37.28936,-9.66599],[-37.28931,-9.66133],[-37.28941,-9.65526],[-37.28946,-9.64556],[-37.2895,-9.63489],[-37.28954,-9.62926],[-37.2964,-9.62885],[-37.31188,-9.62897],[-37.32762,-9.62914],[-37.33181,-9.62919],[-37.34338,-9.62917],[-37.35876,-9.62923],[-37.37175,-9.6293],[-37.37839,-9.62913],[-37.38051,-9.62922],[-37.38061,-9.63143],[-37.38054,-9.63785],[-37.38043,-9.63895],[-37.38053,-9.64147],[-37.38051,-9.64876],[-37.3805,-9.6543],[-37.38043,-9.656],[-37.38024,-9.66028],[-37.38022,-9.66551],[-37.38019,-9.67054],[-37.38016,-9.67896],[-37.38013,-9.68781],[-37.38009,-9.70116],[-37.38003,-9.71053],[-37.3801,-9.71743],[-37.38005,-9.71959],[-37.37932,-9.71954],[-37.37392,-9.71956],[-37.36582,-9.71945],[-37.35849,-9.71946],[-37.35334,-9.71938],[-37.34414,-9.71937],[-37.33423,-9.71923],[-37.32933,-9.71927],[-37.3218,-9.71924],[-37.31983,-9.71927],[-37.31094,-9.7192],[-37.29589,-9.71921],[-37.28907,-9.71916]]],terms_url:"http://www.seplag.al.gov.br",terms_text:"Secretaria de Estado do Planejamento, Gestão e Patrimônio"},{id:"palmeira_dos_indios",name:"Palmeira dos Indios AL",type:"wms",template:"http://geoserver.dados.al.gov.br:8080/geoserver/Alagoas/ows?LAYERS=Palmeira%20dos%20Indios&SERVICE=WMS&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.0&SERVICE=WMS&REQUEST=GetMap&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[-36.58664,-9.46124],[-36.58665,-9.45851],[-36.58619,-9.41968],[-36.58604,-9.41452],[-36.58596,-9.40593],[-36.58585,-9.39509],[-36.58579,-9.39163],[-36.58565,-9.38983],[-36.58549,-9.38249],[-36.58529,-9.37965],[-36.58511,-9.37744],[-36.58503,-9.37059],[-36.5889,-9.37058],[-36.59064,-9.37065],[-36.59389,-9.3706],[-36.60037,-9.37073],[-36.61046,-9.37049],[-36.62288,-9.37021],[-36.63377,-9.37002],[-36.63835,-9.36986],[-36.64743,-9.36997],[-36.65141,-9.36994],[-36.65534,-9.36972],[-36.65647,-9.36974],[-36.66111,-9.37024],[-36.66276,-9.37026],[-36.66704,-9.36973],[-36.67052,-9.36966],[-36.67325,-9.36966],[-36.67602,-9.36987],[-36.67593,-9.3726],[-36.67597,-9.37679],[-36.67639,-9.38138],[-36.67654,-9.38464],[-36.67663,-9.39265],[-36.67675,-9.39829],[-36.67689,-9.40875],[-36.67707,-9.41887],[-36.67717,-9.43179],[-36.67724,-9.43395],[-36.67718,-9.43753],[-36.67728,-9.44311],[-36.6773,-9.44933],[-36.67741,-9.45528],[-36.6774,-9.45938],[-36.67735,-9.46017],[-36.67568,-9.46021],[-36.66625,-9.4603],[-36.66224,-9.4603],[-36.65736,-9.46042],[-36.6504,-9.46047],[-36.63543,-9.46065],[-36.61979,-9.46083],[-36.61433,-9.46083],[-36.61029,-9.46097],[-36.60647,-9.46097],[-36.60186,-9.46099],[-36.59426,-9.46112],[-36.58664,-9.46124]]],terms_url:"http://www.seplag.al.gov.br",terms_text:"Secretaria de Estado do Planejamento, Gestão e Patrimônio"},{id:"Pangasinan_Bulacan_HiRes",name:"Pangasinán/Bulacan (Philippines HiRes)",type:"tms",template:"https://gravitystorm.dev.openstreetmap.org/imagery/philippines/{zoom}/{x}/{y}.png",zoomExtent:[12,19],polygon:[[[120.33659,15.98577],[120.44599,15.984],[120.44613,15.97446],[120.47646,15.97459],[120.59425,15.94683],[120.59806,16.09079],[120.59654,16.198],[120.36854,16.21853],[120.34758,16.04231],[120.33659,15.98577]],[[120.8268,15.3658],[121.2684,15.2602],[121.2699,14.7025],[120.695,14.8423],[120.8268,15.3658]]]},{id:"pao_de_acucar",name:"Pão de Açucar AL",type:"wms",template:"http://geoserver.dados.al.gov.br:8080/geoserver/Alagoas/ows?LAYERS=Pao%20de%20Acucar&SERVICE=WMS&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.0&SERVICE=WMS&REQUEST=GetMap&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[-37.39003,-9.78589],[-37.39019,-9.7762],[-37.38993,-9.76575],[-37.38991,-9.75256],[-37.39015,-9.74102],[-37.39003,-9.73201],[-37.39012,-9.72254],[-37.39015,-9.71289],[-37.39019,-9.70341],[-37.3902,-9.69548],[-37.40377,-9.6955],[-37.41728,-9.6956],[-37.43224,-9.69569],[-37.44319,-9.69573],[-37.44723,-9.69582],[-37.45682,-9.69585],[-37.47062,-9.69591],[-37.47373,-9.69591],[-37.47586,-9.69604],[-37.48128,-9.69605],[-37.48131,-9.6989],[-37.48122,-9.70087],[-37.48121,-9.70239],[-37.48135,-9.70545],[-37.48138,-9.71046],[-37.48134,-9.71617],[-37.4812,-9.71875],[-37.48125,-9.72035],[-37.48136,-9.72134],[-37.48134,-9.7241],[-37.4813,-9.72506],[-37.48103,-9.72732],[-37.48102,-9.73088],[-37.48127,-9.73462],[-37.48131,-9.73638],[-37.48131,-9.73893],[-37.48131,-9.74388],[-37.4813,-9.74989],[-37.48122,-9.75315],[-37.48102,-9.75855],[-37.48084,-9.7642],[-37.48085,-9.76526],[-37.48094,-9.76675],[-37.48093,-9.76881],[-37.48084,-9.7721],[-37.48087,-9.77486],[-37.48076,-9.77993],[-37.48081,-9.7863],[-37.46382,-9.78623],[-37.45353,-9.7862],[-37.43979,-9.78611],[-37.42998,-9.78607],[-37.4208,-9.786],[-37.40853,-9.78596],[-37.39545,-9.78593],[-37.39003,-9.78589]]],terms_url:"http://www.seplag.al.gov.br",terms_text:"Secretaria de Estado do Planejamento, Gestão e Patrimônio"},{id:"PCN-Italy-2006",name:"PCN 2006 - Italy",type:"wms",template:"http://wms.pcn.minambiente.it/ogc?map=/ms_ogc/WMS_v1.3/raster/ortofoto_colore_06.map&FORMAT=image/png&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&Layers=OI.ORTOIMMAGINI.2006.33,OI.ORTOIMMAGINI.2006.32&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2006-01-01T00:00:00.000Z",startDate:"2006-01-01T00:00:00.000Z",polygon:[[[7.54795,43.73118],[8.10697,43.86701],[8.73593,44.38944],[10.18338,43.85116],[9.55016,43.13605],[10.27725,42.27515],[11.69748,42.08118],[12.90059,40.84897],[14.97466,40.20869],[16.04773,38.8953],[13.1086,38.74113],[11.77717,37.93605],[14.40624,36.74299],[15.13467,36.59364],[15.42867,37.027],[15.21993,37.43376],[15.4836,37.92936],[16.01644,37.8036],[17.21669,38.87425],[17.21669,39.40468],[16.55477,39.78775],[17.05464,40.45144],[18.32906,39.70539],[18.68773,40.0587],[18.04964,40.67064],[16.00545,41.52122],[16.38448,41.85964],[15.51837,42.1537],[14.57997,42.2461],[13.56099,43.65128],[12.57889,44.0867],[12.28795,44.62204],[12.56398,44.97092],[12.34151,45.17458],[12.41696,45.40557],[13.09252,45.62826],[13.69549,45.70806],[13.78445,45.5825],[13.9191,45.6322],[13.8235,45.7176],[13.59784,45.8072],[13.64307,45.98326],[13.52963,45.96588],[13.47474,46.00546],[13.66472,46.17392],[13.47587,46.22725],[13.42218,46.20758],[13.37671,46.29668],[13.59777,46.44137],[13.68684,46.43881],[13.7148,46.5222],[12.9151,46.60953],[12.38708,46.71529],[12.27591,46.88651],[12.17486,46.90895],[12.11675,47.01241],[12.21781,47.03996],[12.19254,47.09331],[11.74789,46.98484],[11.33355,46.99862],[11.10618,46.92966],[11.00764,46.76896],[10.72974,46.78972],[10.75753,46.82258],[10.66405,46.87614],[10.47197,46.85698],[10.38659,46.67847],[10.49375,46.62049],[10.46136,46.53164],[10.25309,46.57432],[10.23674,46.63484],[10.10307,46.61003],[10.03715,46.44479],[10.165,46.41051],[10.10506,46.3372],[10.17862,46.25626],[10.07055,46.21668],[9.95249,46.38045],[9.73086,46.35071],[9.71273,46.29266],[9.57015,46.2958],[9.46117,46.37481],[9.45936,46.50873],[9.40487,46.46621],[9.36128,46.5081],[9.28136,46.49685],[9.24503,46.23616],[8.95601,45.96503],[9.09065,45.89906],[9.0298,45.82127],[8.90992,45.8333],[8.9408,45.86682],[8.88904,45.95465],[8.78551,45.99063],[8.85617,46.0748],[8.62242,46.12112],[8.45032,46.26869],[8.42464,46.46367],[8.08814,46.26692],[8.15493,46.1834],[8.11383,46.11577],[8.02906,46.10331],[7.98881,45.99867],[7.9049,45.99945],[7.85949,45.91485],[7.56343,45.97421],[7.10685,45.85653],[7.04151,45.92435],[6.95315,45.85163],[6.80785,45.83265],[6.80785,45.71864],[6.98948,45.63869],[7.00037,45.509],[7.18019,45.40071],[7.10572,45.32924],[7.13115,45.25386],[6.85144,45.13226],[6.7697,45.16044],[6.62803,45.11175],[6.66981,45.02324],[6.74791,45.01939],[6.75518,44.89915],[7.02217,44.82519],[7.07484,44.68073],[6.95133,44.66264],[6.85507,44.53072],[6.94504,44.43112],[6.88784,44.42043],[6.89171,44.36637],[7.00764,44.23736],[7.36364,44.11882],[7.68694,44.17487],[7.72508,44.07578],[7.49355,43.86551],[7.54795,43.73118]],[[8.17134,39.14848],[8.62453,38.75119],[9.09831,39.03764],[9.03102,39.13144],[9.26585,39.18575],[9.64076,39.0227],[9.89894,40.67991],[9.50068,41.39257],[8.30317,40.91071],[8.41304,41.16139],[8.21254,41.13864],[8.07521,40.59862],[8.36154,40.35],[8.27914,39.98585],[8.38283,39.6536],[8.17134,39.14848]],[[12.51489,35.53423],[12.64054,35.5306],[12.63861,35.48641],[12.51296,35.49005],[12.51489,35.53423]],[[11.91218,36.85688],[12.08179,36.85523],[12.07958,36.70974],[11.90998,36.71139],[11.91218,36.85688]],[[12.84019,35.88131],[12.89186,35.88145],[12.89198,35.85003],[12.84031,35.84989],[12.84019,35.88131]]]},{id:"PCN-Lazio_Umbria-2008",name:"PCN 2008 - IT Lazio+Umbria",type:"wms",template:"http://wms.pcn.minambiente.it/ogc?map=/ms_ogc/WMS_v1.3/raster/ortofoto_colore_08.map&FORMAT=image/png&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&Layers=OI.ORTOIMMAGINI.2008.33&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2008-01-01T00:00:00.000Z",startDate:"2008-01-01T00:00:00.000Z",polygon:[[[12.33149,41.64637],[12.41178,41.64791],[12.41499,41.54635],[12.49574,41.54789],[12.4985,41.49619],[12.57948,41.49843],[12.58062,41.42932],[12.60632,41.4288],[12.60746,41.39663],[12.8293,41.39818],[12.83159,41.34688],[12.9128,41.34843],[12.9151,41.29726],[12.99585,41.2983],[12.99791,41.19636],[13.1679,41.19808],[13.16721,41.24692],[13.41337,41.24829],[13.4152,41.19705],[13.8341,41.19808],[13.83341,41.2476],[13.91737,41.24847],[13.91668,41.39749],[14.0011,41.39784],[13.99996,41.49774],[14.08415,41.49826],[14.08346,41.65014],[14.00087,41.6498],[13.99973,41.75051],[13.83433,41.74965],[13.83364,41.80047],[13.75151,41.79978],[13.7499,41.84987],[13.41841,41.8497],[13.41681,41.95027],[13.33445,41.94959],[13.3333,42.00041],[13.25141,41.99973],[13.25003,42.05051],[13.08509,42.04966],[13.08394,42.097],[13.33399,42.09819],[13.33376,42.1472],[13.41772,42.14822],[13.41635,42.25052],[13.33399,42.24984],[13.33353,42.30094],[13.25141,42.29992],[13.25003,42.54699],[13.41795,42.54817],[13.41589,42.75065],[13.33468,42.74947],[13.33307,42.90056],[13.16836,42.89938],[13.16721,42.95079],[12.96419,42.95012],[12.96258,43.0003],[12.91877,42.9998],[12.91601,43.25078],[12.83526,43.24994],[12.83228,43.50107],[12.66321,43.4994],[12.66482,43.45112],[12.58567,43.44996],[12.58246,43.5508],[12.50171,43.5498],[12.49987,43.65131],[12.16242,43.64915],[12.16494,43.60132],[12.07891,43.5995],[12.0819,43.45196],[11.99541,43.44913],[11.99862,43.34661],[12.07891,43.34795],[12.08075,43.30189],[11.9961,43.29955],[11.99862,43.20214],[11.91237,43.19929],[11.91466,43.15212],[11.83207,43.14944],[11.8323,43.09653],[11.91099,43.09837],[11.91466,42.90191],[11.82909,42.89922],[11.83139,42.85231],[11.74582,42.84945],[11.74811,42.65236],[11.6731,42.64966],[11.67493,42.6105],[11.49485,42.59936],[11.49852,42.49593],[11.57812,42.49796],[11.58156,42.45244],[11.41226,42.44872],[11.41524,42.34656],[11.49599,42.34792],[11.49921,42.29636],[11.57835,42.29822],[11.58225,42.24628],[11.66185,42.24832],[11.66621,42.09649],[11.74536,42.09819],[11.74903,41.99666],[11.91443,41.99922],[11.91535,41.98626],[11.99403,41.98745],[11.99862,41.89685],[12.07868,41.89907],[12.08144,41.84594],[12.16311,41.84799],[12.16563,41.6964],[12.3292,41.69863],[12.33149,41.64637]]]},{id:"PCN-Italy-2012",name:"PCN 2012 - Italy",type:"wms",template:"http://wms.pcn.minambiente.it/ogc?map=/ms_ogc/WMS_v1.3/raster/ortofoto_colore_12.map&FORMAT=image/png&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=OI.ORTOIMMAGINI.2012&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",endDate:"2012-01-01T00:00:00.000Z",startDate:"2012-01-01T00:00:00.000Z",polygon:[[[7.54795,43.73118],[8.10697,43.86701],[8.73593,44.38944],[10.18338,43.85116],[9.55016,43.13605],[10.27725,42.27515],[11.69748,42.08118],[12.90059,40.84897],[14.97466,40.20869],[16.04773,38.8953],[13.1086,38.74113],[11.77717,37.93605],[14.40624,36.74299],[15.13467,36.59364],[15.42867,37.027],[15.21993,37.43376],[15.4836,37.92936],[16.01644,37.8036],[17.21669,38.87425],[17.21669,39.40468],[16.55477,39.78775],[17.05464,40.45144],[18.32906,39.70539],[18.68773,40.0587],[18.04964,40.67064],[16.00545,41.52122],[16.38448,41.85964],[15.51837,42.1537],[14.57997,42.2461],[13.56099,43.65128],[12.57889,44.0867],[12.28795,44.62204],[12.56398,44.97092],[12.34151,45.17458],[12.41696,45.40557],[13.09252,45.62826],[13.69549,45.70806],[13.78445,45.5825],[13.9191,45.6322],[13.8235,45.7176],[13.59784,45.8072],[13.64307,45.98326],[13.52963,45.96588],[13.47474,46.00546],[13.66472,46.17392],[13.47587,46.22725],[13.42218,46.20758],[13.37671,46.29668],[13.59777,46.44137],[13.68684,46.43881],[13.7148,46.5222],[12.9151,46.60953],[12.38708,46.71529],[12.27591,46.88651],[12.17486,46.90895],[12.11675,47.01241],[12.21781,47.03996],[12.19254,47.09331],[11.74789,46.98484],[11.33355,46.99862],[11.10618,46.92966],[11.00764,46.76896],[10.72974,46.78972],[10.75753,46.82258],[10.66405,46.87614],[10.47197,46.85698],[10.38659,46.67847],[10.49375,46.62049],[10.46136,46.53164],[10.25309,46.57432],[10.23674,46.63484],[10.10307,46.61003],[10.03715,46.44479],[10.165,46.41051],[10.10506,46.3372],[10.17862,46.25626],[10.07055,46.21668],[9.95249,46.38045],[9.73086,46.35071],[9.71273,46.29266],[9.57015,46.2958],[9.46117,46.37481],[9.45936,46.50873],[9.40487,46.46621],[9.36128,46.5081],[9.28136,46.49685],[9.24503,46.23616],[8.95601,45.96503],[9.09065,45.89906],[9.0298,45.82127],[8.90992,45.8333],[8.9408,45.86682],[8.88904,45.95465],[8.78551,45.99063],[8.85617,46.0748],[8.62242,46.12112],[8.45032,46.26869],[8.42464,46.46367],[8.08814,46.26692],[8.15493,46.1834],[8.11383,46.11577],[8.02906,46.10331],[7.98881,45.99867],[7.9049,45.99945],[7.85949,45.91485],[7.56343,45.97421],[7.10685,45.85653],[7.04151,45.92435],[6.95315,45.85163],[6.80785,45.83265],[6.80785,45.71864],[6.98948,45.63869],[7.00037,45.509],[7.18019,45.40071],[7.10572,45.32924],[7.13115,45.25386],[6.85144,45.13226],[6.7697,45.16044],[6.62803,45.11175],[6.66981,45.02324],[6.74791,45.01939],[6.75518,44.89915],[7.02217,44.82519],[7.07484,44.68073],[6.95133,44.66264],[6.85507,44.53072],[6.94504,44.43112],[6.88784,44.42043],[6.89171,44.36637],[7.00764,44.23736],[7.36364,44.11882],[7.68694,44.17487],[7.72508,44.07578],[7.49355,43.86551],[7.54795,43.73118]],[[8.17134,39.14848],[8.62453,38.75119],[9.09831,39.03764],[9.03102,39.13144],[9.26585,39.18575],[9.64076,39.0227],[9.89894,40.67991],[9.50068,41.39257],[8.30317,40.91071],[8.41304,41.16139],[8.21254,41.13864],[8.07521,40.59862],[8.36154,40.35],[8.27914,39.98585],[8.38283,39.6536],[8.17134,39.14848]],[[12.51489,35.53423],[12.64054,35.5306],[12.63861,35.48641],[12.51296,35.49005],[12.51489,35.53423]],[[11.91218,36.85688],[12.08179,36.85523],[12.07958,36.70974],[11.90998,36.71139],[11.91218,36.85688]],[[12.84019,35.88131],[12.89186,35.88145],[12.89198,35.85003],[12.84031,35.84989],[12.84019,35.88131]]]},{id:"Actueel_ortho25_WMS",name:"PDOK aerial imagery Beeldmateriaal.nl 25cm latest",type:"tms",template:"https://geodata.nationaalgeoregister.nl/luchtfoto/rgb/wmts?FORMAT=image/jpeg&SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=Actueel_ortho25&STYLE=&FORMAT=image/jpeg&tileMatrixSet=OGC:1.0:GoogleMapsCompatible&tileMatrix={zoom}&tileRow={y}&tileCol={x}",zoomExtent:[0,19],polygon:[[[3.14377,51.35984],[3.1575,51.24113],[3.33878,51.11544],[3.91281,51.05851],[4.65714,51.28067],[4.89334,51.26348],[5.17899,51.12579],[5.38498,51.13096],[5.54428,51.05678],[5.42069,50.85956],[5.46738,50.70326],[5.65689,50.61926],[6.14853,50.62143],[6.30234,50.85782],[6.29959,50.95438],[6.26389,51.01835],[6.37238,51.09259],[6.40122,51.20114],[6.37375,51.25102],[6.44516,51.31587],[6.42044,51.5496],[6.34354,51.67922],[6.79672,51.76429],[7.04666,51.91024],[7.07138,52.04559],[7.27188,52.17041],[7.30759,52.38551],[7.20596,52.53195],[7.28287,52.61458],[7.29935,52.77853],[7.44217,52.97827],[7.43393,53.28314],[7.04392,53.55159],[6.78299,53.63635],[6.23917,53.54016],[5.6871,53.51241],[5.17349,53.43885],[4.81644,53.23384],[4.65164,53.06583],[4.54178,52.48598],[4.32205,52.19568],[4.08104,52.01369],[4.02199,52.01623],[3.93684,51.96379],[3.95195,51.88079],[3.84483,51.84942],[3.62373,51.70752],[3.65532,51.66069],[3.63335,51.62746],[3.54683,51.62234],[3.39577,51.56091],[3.38203,51.51735],[3.49876,51.43267],[3.32985,51.38556],[3.14377,51.35984]]],terms_url:"https://www.nationaalgeoregister.nl/geonetwork/srv/dut/catalog.search#/search?facet.q=license%2FCC-BY&isChild=%27false%27&resultType=details&any_OR_title_OR_keyword=luchtfoto&fast=index&_content_type=json&from=1&to=20&sortBy=relevance",terms_text:"Kadaster / Beeldmateriaal.nl, CC BY 4.0",best:true,description:"Nationwide data set 25cm resolution color aerial imagery of the most recent year.",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/nl/PDOK-Luchtfoto-Beeldmateriaal-25cm-latest.png"},{id:"al_piranhas",name:"Piranhas AL",type:"wms",template:"http://geoserver.dados.al.gov.br:8080/geoserver/Alagoas/ows?LAYERS=Piranhas&SERVICE=WMS&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.0&SERVICE=WMS&REQUEST=GetMap&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[-37.71918,-9.65236],[-37.71918,-9.63874],[-37.71914,-9.6321],[-37.71924,-9.62114],[-37.71929,-9.61023],[-37.71934,-9.59988],[-37.7194,-9.58891],[-37.71945,-9.57802],[-37.71944,-9.57173],[-37.71952,-9.56684],[-37.71956,-9.56225],[-37.71998,-9.56218],[-37.72258,-9.56195],[-37.72818,-9.56203],[-37.73254,-9.562],[-37.74107,-9.56206],[-37.74845,-9.56202],[-37.75926,-9.56216],[-37.76972,-9.56227],[-37.78036,-9.56244],[-37.78537,-9.56236],[-37.78907,-9.56233],[-37.79562,-9.56245],[-37.79771,-9.56237],[-37.81006,-9.56243],[-37.81061,-9.56241],[-37.81053,-9.56531],[-37.81049,-9.57629],[-37.81046,-9.58742],[-37.81038,-9.59757],[-37.81031,-9.61798],[-37.81018,-9.65197],[-37.81018,-9.6523],[-37.81024,-9.65259],[-37.80664,-9.65245],[-37.80206,-9.65253],[-37.79597,-9.65237],[-37.79179,-9.65252],[-37.78815,-9.65246],[-37.78723,-9.65242],[-37.78035,-9.65241],[-37.77865,-9.65223],[-37.77625,-9.6523],[-37.77475,-9.65219],[-37.77234,-9.65223],[-37.7696,-9.65245],[-37.76623,-9.65251],[-37.76345,-9.65246],[-37.7604,-9.6525],[-37.75102,-9.65237],[-37.75012,-9.65249],[-37.74155,-9.65248],[-37.7403,-9.65239],[-37.73785,-9.65246],[-37.73443,-9.65238],[-37.73106,-9.65243],[-37.72651,-9.65237],[-37.72195,-9.65225],[-37.71992,-9.65228],[-37.71918,-9.65236]]],terms_url:"http://www.seplag.al.gov.br",terms_text:"Secretaria de Estado do Planejamento, Gestão e Patrimônio"},{id:"PNOA-Spain-TMS",name:"PNOA Spain",type:"tms",template:"https://www.ign.es/wmts/pnoa-ma?request=GetTile&service=WMTS&VERSION=1.0.0&Layer=OI.OrthoimageCoverage&Style=default&Format=image/png&TileMatrixSet=GoogleMapsCompatible&TileMatrix={zoom}&TileRow={y}&TileCol={x}",zoomExtent:[0,20],polygon:[[[-17.88463,28.44606],[-17.89395,28.52255],[-18.02125,28.74819],[-18.02241,28.80384],[-17.9424,28.87261],[-17.89118,28.87371],[-17.89033,28.85151],[-17.76759,28.85378],[-17.76698,28.83122],[-17.74127,28.832],[-17.73949,28.76422],[-17.71398,28.76497],[-17.71293,28.73037],[-17.75744,28.69318],[-17.75708,28.67413],[-17.74579,28.67435],[-17.74573,28.61656],[-17.75197,28.58337],[-17.76225,28.5592],[-17.78331,28.54167],[-17.78316,28.49366],[-17.80861,28.4925],[-17.80601,28.4469],[-17.88463,28.44606]],[[-18.1661,27.78516],[-18.16349,27.69492],[-18.08898,27.69634],[-18.08734,27.67387],[-18.03641,27.67537],[-18.03501,27.63026],[-17.959,27.6324],[-17.86033,27.7926],[-17.86303,27.83688],[-17.8884,27.83649],[-17.88913,27.85905],[-17.99065,27.85675],[-18.03868,27.76558],[-18.11464,27.76379],[-18.11546,27.78636],[-18.1661,27.78516]],[[-17.36038,28.06398],[-17.36297,28.17572],[-17.33756,28.17637],[-17.33846,28.2213],[-17.18579,28.22388],[-17.08208,28.13518],[-17.08084,28.068],[-17.13154,28.06681],[-17.15633,28.02146],[-17.23211,28.02037],[-17.23199,27.99804],[-17.25768,27.99784],[-17.25785,28.01997],[-17.30867,28.01923],[-17.36038,28.06398]],[[-16.92782,28.32758],[-16.92866,28.37219],[-16.87767,28.37293],[-16.87807,28.39542],[-16.52143,28.42261],[-16.44571,28.49113],[-16.44625,28.53597],[-16.42059,28.53627],[-16.42092,28.55884],[-16.34433,28.55976],[-16.3446,28.58221],[-16.19125,28.58372],[-16.19162,28.60684],[-16.12793,28.60782],[-16.1278,28.59218],[-16.09951,28.5925],[-16.09934,28.51638],[-16.16481,28.51612],[-16.16475,28.49386],[-16.23858,28.44847],[-16.26535,28.44761],[-16.26586,28.403],[-16.31675,28.40176],[-16.31631,28.38019],[-16.34208,28.37951],[-16.34083,28.2893],[-16.41584,28.19761],[-16.4151,28.13113],[-16.51533,28.01648],[-16.61684,28.01532],[-16.61681,27.99305],[-16.71842,27.99192],[-16.7191,28.03714],[-16.7447,28.03679],[-16.74534,28.08181],[-16.7707,28.08161],[-16.8224,28.1259],[-16.82317,28.17087],[-16.8487,28.17075],[-16.85028,28.26079],[-16.87565,28.26055],[-16.87608,28.28322],[-16.90151,28.28277],[-16.90239,28.32793],[-16.92782,28.32758]],[[-15.85374,27.90089],[-15.8542,27.99018],[-15.82895,27.99066],[-15.82911,28.03558],[-15.7783,28.03632],[-15.75328,28.08143],[-15.72788,28.08157],[-15.72826,28.17186],[-15.49897,28.1728],[-15.49874,28.15041],[-15.44978,28.15075],[-15.45016,28.19614],[-15.39728,28.19614],[-15.39644,28.03836],[-15.37103,28.03802],[-15.37065,28.01532],[-15.34578,28.01532],[-15.34548,27.92544],[-15.3708,27.92524],[-15.37057,27.83521],[-15.39598,27.83474],[-15.421,27.78797],[-15.47181,27.78939],[-15.47188,27.76665],[-15.52277,27.76678],[-15.54771,27.72161],[-15.62361,27.72134],[-15.62415,27.74199],[-15.70075,27.74335],[-15.80167,27.81105],[-15.85374,27.90089]],[[-14.52156,28.04678],[-14.52244,28.11841],[-14.41575,28.11561],[-14.21688,28.22788],[-14.21537,28.33903],[-14.16417,28.45283],[-14.11151,28.4748],[-14.03358,28.72267],[-13.95652,28.74494],[-13.95617,28.76659],[-13.82902,28.76643],[-13.82896,28.78798],[-13.80007,28.78793],[-13.8013,28.71899],[-13.82757,28.71935],[-13.82786,28.6518],[-13.80258,28.6519],[-13.80339,28.53842],[-13.82885,28.53847],[-13.83151,28.39702],[-13.91582,28.22414],[-13.98564,28.22357],[-14.03696,28.17958],[-14.13871,28.17999],[-14.13866,28.15791],[-14.21537,28.15781],[-14.21472,28.11189],[-14.29132,28.04524],[-14.33197,28.03687],[-14.44578,28.04698],[-14.44666,28.0658],[-14.49628,28.06826],[-14.49593,28.04585],[-14.52156,28.04678]],[[-13.80066,28.84566],[-13.80093,28.82311],[-13.77569,28.82305],[-13.69729,28.88982],[-13.69729,28.91277],[-13.60725,28.9118],[-13.43886,29.00024],[-13.43746,29.13513],[-13.4117,29.13499],[-13.41056,29.22298],[-13.45928,29.25559],[-13.45974,29.2942],[-13.50913,29.29456],[-13.51006,29.31635],[-13.56354,29.31729],[-13.56406,29.27138],[-13.53892,29.2712],[-13.53897,29.25004],[-13.56613,29.25013],[-13.5666,29.203],[-13.51565,29.20223],[-13.51565,29.18206],[-13.5398,29.18278],[-13.54089,29.13753],[-13.65782,29.13685],[-13.71322,29.09351],[-13.76634,29.09345],[-13.85025,29.01659],[-13.85182,28.98343],[-13.85244,28.91486],[-13.90131,28.89245],[-13.9024,28.84698],[-13.80066,28.84566]],[[1.64799,38.99907],[1.73217,38.99936],[1.73147,39.04417],[1.64895,39.04319],[1.64816,39.12764],[1.39486,39.12657],[1.39544,39.08642],[1.22811,39.08526],[1.22911,39.0029],[1.14487,39.0018],[1.14528,38.832],[1.31136,38.83316],[1.31219,38.79065],[1.39469,38.79162],[1.39519,38.75296],[1.31128,38.75193],[1.31259,38.62388],[1.6489,38.62511],[1.64807,38.71115],[1.58456,38.71012],[1.58116,38.70054],[1.54915,38.70028],[1.51972,38.70921],[1.50355,38.72532],[1.48133,38.91551],[1.55189,38.92544],[1.56673,38.95666],[1.64874,38.95833],[1.64799,38.99907]],[[2.54507,39.41667],[2.43933,39.41611],[2.43871,39.48469],[2.43902,39.49934],[2.31223,39.49934],[2.31192,39.54179],[2.22907,39.541],[2.22835,39.62606],[2.34601,39.62709],[2.92704,39.96016],[3.14566,39.96005],[3.14608,40.00198],[3.23139,40.00198],[3.23129,39.83292],[3.14823,39.83316],[3.14844,39.79357],[3.48148,39.79318],[3.48035,39.5959],[3.31506,39.47846],[3.31462,39.37855],[3.08302,39.24994],[2.97986,39.25015],[2.97904,39.3335],[2.72874,39.33342],[2.72885,39.45814],[2.64569,39.45774],[2.64538,39.49966],[2.54528,39.49942],[2.54507,39.41667]],[[3.81204,40.04344],[3.72908,40.0438],[3.72862,39.95842],[3.81266,39.9576],[3.81228,39.91644],[3.9609,39.91598],[4.19381,39.79131],[4.31503,39.79058],[4.31599,39.83293],[4.39874,39.83204],[4.39737,39.91858],[4.3158,39.91933],[4.31619,40.0434],[4.2319,40.04436],[4.23248,40.08478],[4.14915,40.08611],[4.14906,40.12552],[4.0628,40.12722],[4.06242,40.08499],[3.81287,40.08529],[3.81204,40.04344]],[[-8.89106,41.82289],[-9.1092,42.57511],[-9.03655,42.73066],[-9.08834,42.72696],[-9.14661,42.77503],[-9.21855,42.90163],[-9.2761,42.86051],[-9.30991,42.93113],[-9.27898,42.9822],[-9.30991,43.06004],[-9.25236,43.10417],[-9.2315,43.17032],[-9.14733,43.21018],[-9.06748,43.19916],[-9.03367,43.24267],[-8.99842,43.24477],[-8.99986,43.29558],[-8.93727,43.30553],[-8.92936,43.32699],[-8.8639,43.32908],[-8.87613,43.37407],[-8.82217,43.37354],[-8.78548,43.31914],[-8.70635,43.305],[-8.60996,43.3296],[-8.55097,43.32332],[-8.52435,43.3364],[-8.52507,43.36465],[-8.45745,43.39184],[-8.36105,43.41118],[-8.36033,43.46342],[-8.33444,43.57974],[-8.27761,43.57088],[-8.06467,43.72392],[-7.99921,43.7234],[-7.9172,43.78264],[-7.85605,43.79146],[-7.83591,43.73743],[-7.66284,43.80982],[-7.31889,43.67827],[-7.19975,43.58308],[-6.24882,43.6075],[-6.12293,43.57901],[-5.85204,43.6799],[-5.60363,43.57087],[-5.28553,43.56191],[-5.17875,43.49916],[-4.90899,43.48367],[-4.61562,43.4192],[-4.18399,43.42492],[-3.80295,43.51954],[-3.74,43.48693],[-3.56128,43.54236],[-3.1083,43.38163],[-2.93857,43.46246],[-2.74524,43.47551],[-2.30462,43.31706],[-1.9854,43.3563],[-1.85528,43.39725],[-1.7698,43.39644],[-1.77005,43.37605],[-1.71005,43.37569],[-1.71135,43.33125],[-1.72259,43.31318],[-1.68904,43.31291],[-1.68811,43.33413],[-1.64467,43.33372],[-1.64498,43.31332],[-1.60299,43.31295],[-1.60344,43.29266],[-1.56359,43.29212],[-1.56305,43.31338],[-1.47799,43.31284],[-1.36677,43.27614],[-1.35688,43.23815],[-1.37037,43.1713],[-1.44231,43.08336],[-1.41983,43.06036],[-1.37307,43.05117],[-1.36407,43.11159],[-1.30203,43.13522],[-1.23549,43.13325],[-1.27955,43.07744],[-1.19232,43.06496],[-1.00619,43.00778],[-0.94234,42.9749],[-0.7562,42.98213],[-0.71484,42.96108],[-0.69685,42.90314],[-0.55118,42.82207],[-0.50442,42.84845],[-0.42889,42.82009],[-0.31648,42.86558],[-0.14563,42.81086],[-0.03143,42.71249],[0.18618,42.7541],[0.30218,42.71777],[0.36422,42.74287],[0.44875,42.71447],[0.62769,42.7224],[0.64118,42.85767],[0.71492,42.88272],[0.9676,42.81811],[1.10878,42.79898],[1.17532,42.73429],[1.36326,42.74155],[1.41137,42.70939],[1.48061,42.71034],[1.4813,42.50107],[1.64436,42.50203],[1.64328,42.54245],[1.73041,42.54342],[1.73164,42.50118],[2.06386,42.50164],[2.06456,42.45902],[2.39693,42.45994],[2.39768,42.41784],[2.48048,42.41797],[2.48098,42.37594],[2.64479,42.37626],[2.64448,42.45924],[2.81133,42.45961],[2.81126,42.50104],[3.06388,42.50085],[3.06388,42.45915],[3.23078,42.45934],[3.23049,42.37644],[3.31415,42.37604],[3.31412,42.33399],[3.39785,42.33404],[3.39739,42.29009],[3.31389,42.29084],[3.31397,42.20702],[3.14759,42.2073],[3.14759,42.12606],[3.23055,42.126],[3.24668,41.95294],[3.19452,41.85589],[3.06054,41.76474],[2.78358,41.63718],[2.26293,41.42716],[2.16492,41.29893],[1.86008,41.22322],[1.3763,41.11627],[1.17937,41.04646],[1.08585,41.04849],[0.75854,40.81956],[0.9114,40.73376],[0.87813,40.67514],[0.66502,40.53587],[0.55801,40.55022],[0.43392,40.37576],[0.26756,40.19192],[0.16415,40.06472],[0.07513,40.01447],[0.01039,39.89522],[-0.09392,39.81169],[-0.18474,39.63117],[-0.29085,39.50363],[-0.28636,39.33343],[-0.18564,39.17746],[-0.21352,39.15585],[-0.11101,38.97222],[0.00949,38.88268],[0.12189,38.87218],[0.23429,38.79864],[0.25587,38.72642],[0.09581,38.61338],[-0.0022,38.60706],[-0.05705,38.52691],[-0.27197,38.47624],[-0.37987,38.39312],[-0.38347,38.33813],[-0.45091,38.33108],[-0.50487,38.28309],[-0.48238,38.19481],[-0.42933,38.16583],[-0.45451,38.14886],[-0.584,38.17219],[-0.61367,38.11986],[-0.63705,37.96122],[-0.68111,37.94562],[-0.73237,37.88107],[-0.72158,37.78306],[-0.68831,37.734],[-0.66415,37.62315],[-0.71939,37.58784],[-0.91963,37.53758],[-1.11071,37.51641],[-1.33832,37.52867],[-1.44089,37.39037],[-1.6767,37.27652],[-1.85408,36.91229],[-2.06835,36.69291],[-2.21588,36.66192],[-2.37219,36.78018],[-2.68129,36.65911],[-2.92015,36.66756],[-3.09402,36.71263],[-3.46108,36.65488],[-3.72804,36.69291],[-4.37435,36.66333],[-4.65712,36.44042],[-4.9188,36.45313],[-5.16995,36.35135],[-5.28411,36.19702],[-5.26809,36.12418],[-5.35248,36.12247],[-5.35161,36.04014],[-5.43658,36.03889],[-5.43532,36.00344],[-5.68886,36.00365],[-5.68996,36.04053],[-5.85506,36.03856],[-5.85668,36.12421],[-5.93848,36.12215],[-5.94003,36.16556],[-5.99834,36.1645],[-6.03573,36.1781],[-6.07752,36.22241],[-6.15061,36.28646],[-6.23154,36.37701],[-6.33585,36.53106],[-6.32146,36.58163],[-6.40419,36.6235],[-6.47433,36.74897],[-6.41588,36.79939],[-6.49052,36.91738],[-6.62989,37.0194],[-6.87448,37.10838],[-7.04264,37.18507],[-7.26474,37.18435],[-7.37535,37.15354],[-7.40832,37.16822],[-7.42029,37.21183],[-7.42492,37.23505],[-7.43805,37.2452],[-7.44597,37.33261],[-7.4481,37.39094],[-7.46963,37.40758],[-7.4647,37.45305],[-7.50197,37.51641],[-7.51916,37.52292],[-7.52196,37.57237],[-7.45013,37.66958],[-7.4249,37.75992],[-7.31666,37.83997],[-7.26833,37.98895],[-7.15368,38.01552],[-7.11771,38.05536],[-7.0143,38.02438],[-6.99632,38.10756],[-6.96147,38.20125],[-7.08062,38.15708],[-7.34027,38.44024],[-7.26383,38.73807],[-7.04352,38.87297],[-7.06151,38.90796],[-6.96934,39.01983],[-7.00081,39.08879],[-7.15368,39.09577],[-7.15255,39.16029],[-7.24472,39.19689],[-7.25596,39.28133],[-7.33689,39.35351],[-7.3279,39.45599],[-7.51449,39.58865],[-7.55271,39.67954],[-7.05027,39.67522],[-6.99519,39.81954],[-6.92213,39.87909],[-6.88616,40.02299],[-7.04128,40.13479],[-7.01767,40.26615],[-6.8086,40.34501],[-6.86818,40.44516],[-6.85356,40.60664],[-6.83783,40.87576],[-6.9536,41.03704],[-6.80186,41.03959],[-6.76814,41.13871],[-6.64112,41.26556],[-6.56244,41.26303],[-6.21737,41.5791],[-6.31628,41.64465],[-6.51523,41.64129],[-6.58717,41.68832],[-6.54783,41.85597],[-6.62988,41.91121],[-7.13345,41.94048],[-7.16829,41.87188],[-7.42569,41.78477],[-7.95398,41.84593],[-8.13045,41.78058],[-8.25185,41.90786],[-8.12933,42.03488],[-8.24848,42.1008],[-8.36762,42.05575],[-8.60704,42.03405],[-8.89106,41.82289]]],terms_text:"PNOA",best:true},{id:"poco_das_trincheiras",name:"Poço das Trincheiras AL",type:"wms",template:"http://geoserver.dados.al.gov.br:8080/geoserver/Alagoas/ows?LAYERS=Poco%20das%20Trincheiras&SERVICE=WMS&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.0&SERVICE=WMS&REQUEST=GetMap&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[-37.23942,-9.35157],[-37.23947,-9.34387],[-37.23942,-9.33792],[-37.23954,-9.33022],[-37.23973,-9.32791],[-37.23974,-9.3228],[-37.23964,-9.32085],[-37.23971,-9.31864],[-37.2398,-9.31706],[-37.23982,-9.31561],[-37.24053,-9.30933],[-37.24051,-9.30004],[-37.24008,-9.29687],[-37.23998,-9.29546],[-37.23992,-9.29319],[-37.23989,-9.28978],[-37.23995,-9.28818],[-37.24008,-9.28641],[-37.24036,-9.28212],[-37.24038,-9.27897],[-37.24051,-9.27557],[-37.24004,-9.26979],[-37.24018,-9.26721],[-37.24018,-9.26612],[-37.23995,-9.26455],[-37.23983,-9.26151],[-37.24333,-9.26136],[-37.24936,-9.26146],[-37.26445,-9.26161],[-37.28016,-9.26172],[-37.28294,-9.26171],[-37.29581,-9.26178],[-37.30685,-9.26178],[-37.31419,-9.26189],[-37.32437,-9.26192],[-37.33078,-9.26175],[-37.33057,-9.27275],[-37.33048,-9.28007],[-37.33054,-9.28117],[-37.33069,-9.28427],[-37.3307,-9.28535],[-37.33064,-9.28617],[-37.33071,-9.28717],[-37.33064,-9.28769],[-37.33062,-9.29027],[-37.33043,-9.29308],[-37.33038,-9.29655],[-37.33034,-9.30591],[-37.3304,-9.31203],[-37.33038,-9.32194],[-37.33041,-9.3342],[-37.33035,-9.34185],[-37.3303,-9.34783],[-37.33035,-9.35202],[-37.31509,-9.35194],[-37.30011,-9.3519],[-37.29531,-9.35183],[-37.28899,-9.35171],[-37.28497,-9.35182],[-37.27851,-9.35173],[-37.27431,-9.35181],[-37.27115,-9.3517],[-37.26351,-9.35168],[-37.26046,-9.35164],[-37.25402,-9.35177],[-37.24705,-9.35163],[-37.23942,-9.35157]]],terms_url:"http://www.seplag.al.gov.br",terms_text:"Secretaria de Estado do Planejamento, Gestão e Patrimônio"},{id:"e-mapa.net-buildings",name:"polska.e-mapa.net: Buildings",type:"wms",template:"http://integracja02.gugik.gov.pl/cgi-bin/KrajowaIntegracjaEwidencjiGruntow?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=budynki&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[0,19],polygon:[[[15.9751,54.37092],[16.31116,54.55618],[17.13919,54.78457],[18.34485,54.90227],[19.66137,54.47372],[20.28152,54.42135],[21.46639,54.34064],[22.77599,54.37698],[22.8626,54.42336],[23.29567,54.26786],[23.53472,54.09553],[23.52086,53.97752],[23.71834,53.46296],[23.92968,53.18567],[23.92968,52.68873],[23.7322,52.60675],[23.5659,52.58781],[23.20905,52.33026],[23.19519,52.23701],[23.50354,52.18606],[23.69062,52.00301],[23.59708,51.7399],[23.66291,51.38886],[23.9366,50.98278],[24.16873,50.86048],[24.01975,50.80358],[24.10983,50.66105],[24.05786,50.41884],[23.61787,50.30834],[22.68244,49.51635],[22.73788,49.20949],[22.90417,49.07804],[22.8626,48.99401],[22.60969,49.03718],[22.07615,49.20044],[21.84749,49.37219],[21.37631,49.44883],[21.10262,49.37219],[20.91207,49.3022],[20.6453,49.39023],[20.18451,49.33156],[20.11869,49.20044],[19.942,49.13021],[19.76531,49.21176],[19.74798,49.39925],[19.60247,49.41503],[19.50893,49.58154],[19.42925,49.59052],[19.23177,49.41503],[18.99618,49.38798],[18.93382,49.4916],[18.83681,49.49386],[18.80216,49.66234],[18.6428,49.70941],[18.52154,49.89947],[18.08154,50.01092],[17.88753,49.98865],[17.73855,50.06877],[17.6069,50.17096],[17.74548,50.21532],[17.71084,50.3017],[17.41635,50.26407],[16.94864,50.44533],[16.89321,50.40339],[17.00061,50.31055],[17.01793,50.22419],[16.81352,50.18649],[16.64029,50.09767],[16.43242,50.28621],[16.19683,50.42767],[16.42203,50.58852],[16.33888,50.66324],[16.22802,50.63688],[16.05479,50.61271],[15.57322,50.76415],[15.26834,50.89764],[15.24409,50.9806],[15.02929,51.0133],[15.00157,50.85829],[14.81102,50.87359],[14.95653,51.07212],[15.01889,51.29146],[14.93921,51.46015],[14.72094,51.55718],[14.75212,51.62606],[14.59968,51.84276],[14.70362,52.07334],[14.55811,52.24974],[14.51654,52.42544],[14.60315,52.58781],[14.11465,52.82083],[14.15276,52.9734],[14.35024,53.07342],[14.42299,53.26656],[14.1978,53.87348],[14.22205,53.99585],[15.9751,54.37092]]],terms_url:"https://polska.e-mapa.net/",terms_text:"polska.e-mapa.net - Geoportal otwartych danych przestrzennych",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/pl/polskae-mapanetBuildings.png"},{id:"debicki-buildings",name:"Powiat dębicki: Buildings",type:"wms",template:"https://debica.geoportal2.pl/map/wms/wms.php?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=budynki,adresy,EBU,EBT,S&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",zoomExtent:[0,19],polygon:[[[21.53768,50.01085],[21.51944,50.05423],[21.58099,50.1233],[21.48804,50.18059],[21.13725,50.14835],[21.13939,50.12721],[21.18058,50.12101],[21.14315,50.05965],[21.15356,49.92854],[21.27892,49.92554],[21.22448,49.8861],[21.22362,49.84258],[21.35177,49.8349],[21.36368,49.86838],[21.41585,49.82003],[21.47943,49.8398],[21.52679,49.88911],[21.47689,50.00135],[21.53768,50.01085]]],terms_text:"Powiat dębicki",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/pl/PowiatrzeszowskiBuildings.png"},{id:"lancucki-buildings",name:"Powiat łańcucki: Buildings",type:"wms",template:"https://lancut.geoportal2.pl/map/wms/wms.php?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=EBT,budynki,adresy&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",zoomExtent:[0,19],polygon:[[[22.17224,50.10121],[22.12574,50.1079],[22.0823,50.17206],[22.13591,50.1867],[22.173,50.18117],[22.18418,50.22914],[22.235,50.24718],[22.3856,50.16031],[22.40346,50.13331],[22.45275,50.12745],[22.45275,50.10676],[22.41768,50.08997],[22.38364,50.08915],[22.38542,50.05393],[22.35315,50.05067],[22.3562,50.00627],[22.31478,49.99451],[22.32139,49.94614],[22.29979,49.92455],[22.24161,49.92847],[22.20901,49.93728],[22.22382,49.96085],[22.16683,50.00412],[22.1387,50.00251],[22.12015,50.04626],[22.17224,50.10121]]],terms_text:"Powiat łańcucki",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/pl/PowiatrzeszowskiBuildings.png"},{id:"lubaczowski-buildings",name:"Powiat lubaczowski: Buildings",type:"wms",template:"https://lubaczow.geoportal2.pl/map/wms/wms.php?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=S,EBT,adresy,budynki_ewid&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",zoomExtent:[0,19],polygon:[[[23.29224,50.09693],[23.55763,50.25704],[23.51394,50.26643],[23.522,50.29892],[23.40991,50.3083],[23.44482,50.35653],[23.38072,50.3699],[23.38829,50.4058],[23.35821,50.41105],[23.2527,50.36601],[23.19379,50.40529],[23.01962,50.2928],[22.84161,50.30574],[22.83572,50.27037],[22.82426,50.26923],[22.79651,50.20933],[22.86603,50.18949],[22.87414,50.13786],[22.93233,50.1678],[22.88954,50.11501],[22.95351,50.07178],[23.05556,50.04967],[22.99884,49.99028],[23.14951,49.97563],[23.29224,50.09693]]],terms_text:"Powiat lubaczowski",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/pl/PowiatrzeszowskiBuildings.png"},{id:"poznanski-buildings",name:"Powiat poznański: Buildings",type:"wms",template:"http://wms.podgik.poznan.pl/cgi-bin/poznan?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=budynki&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",polygon:[[[16.9585,52.46312],[17.03946,52.33605],[16.84291,52.36501],[16.78596,52.46566],[16.70022,52.53819],[16.6415,52.5288],[16.44898,52.36793],[16.47775,52.2696],[16.5659,52.26813],[16.58375,52.17007],[17.08099,52.14981],[17.37124,52.34522],[17.39853,52.44037],[17.35338,52.53949],[17.13689,52.57783],[17.13126,52.6419],[17.01608,52.68366],[16.9158,52.65079],[16.85814,52.58191],[16.7367,52.57459],[16.70022,52.53824],[16.78598,52.46567],[16.9585,52.46312]]],terms_text:"PODGIK Poznań",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/pl/PowiatpoznaskiOrthophotomap(aerialimage).png"},{id:"sropczyce-buildings",name:"Powiat ropczycko-sędziszowski: Buildings",type:"wms",template:"https://spropczyce.geoportal2.pl/map/wms/wms.php?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=budynki&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",zoomExtent:[0,19],polygon:[[[21.60041,50.21025],[21.74199,50.16538],[21.792,50.17829],[21.81459,50.15264],[21.78741,50.10859],[21.82597,50.09149],[21.82552,50.02925],[21.78666,49.97585],[21.70632,49.96022],[21.683,49.92431],[21.60062,49.91793],[21.54249,49.8862],[21.5188,49.89119],[21.45315,49.99268],[21.50364,50.0198],[21.49298,50.07161],[21.55535,50.11909],[21.50429,50.16559],[21.59816,50.17866],[21.60041,50.21025]]],terms_text:"Powiat ropczycko-sędziszowski",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/pl/PowiatrzeszowskiBuildings.png"},{id:"rzeszowski-buildings",name:"Powiat rzeszowski: Buildings",type:"wms",template:"https://powiatrzeszowski.geoportal2.pl/map/wms/wms.php?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=budynki,EBT,EBU&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",zoomExtent:[0,19],polygon:[[[22.18219,50.17339],[22.09834,50.17176],[22.18016,50.09784],[22.13779,50.00695],[22.09444,50.00841],[22.02839,50.06668],[21.9354,50.06636],[21.98164,49.94977],[22.05278,50.0097],[22.1771,50.00555],[22.23319,49.96829],[22.31144,49.87008],[22.34961,49.72826],[21.99951,49.82808],[21.84961,49.95739],[21.7495,49.96981],[21.78503,50.14212],[21.93307,50.24748],[22.08291,50.26471],[21.98553,50.31545],[22.0901,50.37369],[22.19821,50.35265],[22.2536,50.2647],[22.18219,50.17339]]],terms_text:"Powiat rzeszowski",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/pl/PowiatrzeszowskiBuildings.png"},{id:"rzeszowski-aerial",name:"Powiat rzeszowski: Orthophotomap (aerial image)",type:"wms",template:"https://powiatrzeszowski.geoportal2.pl/map/wms/wms.php?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=ortofotomapa&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",zoomExtent:[0,19],polygon:[[[22.18219,50.17339],[22.09834,50.17176],[22.18016,50.09784],[22.13779,50.00695],[22.09444,50.00841],[22.02839,50.06668],[21.9354,50.06636],[21.98164,49.94977],[22.05278,50.0097],[22.1771,50.00555],[22.23319,49.96829],[22.31144,49.87008],[22.34961,49.72826],[21.99951,49.82808],[21.84961,49.95739],[21.7495,49.96981],[21.78503,50.14212],[21.93307,50.24748],[22.08291,50.26471],[21.98553,50.31545],[22.0901,50.37369],[22.19821,50.35265],[22.2536,50.2647],[22.18219,50.17339]]],terms_text:"Powiat rzeszowski",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/pl/PowiatrzeszowskiBuildings.png"},{id:"stalowowolski-buildings",name:"Powiat stalowowolski: Buildings",type:"wms",template:"https://stalowawola.geoportal2.pl/map/wms/wms.php?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=EBT,adresy,budynki,centroidy&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",zoomExtent:[0,19],polygon:[[[22.017,50.35811],[22.09292,50.44916],[22.06785,50.51434],[22.09722,50.54302],[22.16347,50.52686],[22.23795,50.5503],[22.26768,50.60465],[22.22757,50.6653],[22.16235,50.66969],[22.20843,50.75403],[22.16239,50.80039],[22.0546,50.82234],[21.94394,50.77639],[21.86228,50.80439],[21.83413,50.75035],[21.87465,50.70066],[21.84046,50.65749],[21.97582,50.53164],[21.84797,50.47196],[21.88045,50.3913],[22.017,50.35811]]],terms_text:"Powiat stalowowolski",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/pl/PowiatrzeszowskiBuildings.png"},{id:"poznan-buildings",name:"Poznań: Buildings",type:"wms",template:"http://wms2.geopoz.poznan.pl:8080/geoserver/sip/wms?SERVICE=WMS&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=budynki_ewidencyjne_sql&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2018-01-01T00:00:00.000Z",startDate:"2018-01-01T00:00:00.000Z",zoomExtent:[0,23],polygon:[[[16.72794,52.48838],[16.86925,52.48982],[16.86879,52.50779],[16.93948,52.50845],[16.93926,52.51743],[16.98639,52.51784],[16.98784,52.45494],[17.03491,52.45534],[17.0353,52.43736],[17.08235,52.43774],[17.0831,52.4018],[17.0596,52.40161],[17.06129,52.32075],[17.01438,52.32035],[17.01518,52.28441],[16.96829,52.28401],[16.96787,52.30198],[16.89752,52.30134],[16.89662,52.33728],[16.80273,52.33638],[16.80176,52.37232],[16.77828,52.3721],[16.77603,52.45294],[16.72897,52.45244],[16.72794,52.48838]]],terms_text:"Zarząd Geodezji i Katastru Miejskiego GEOPOZ"},{id:"poznan-ortofotomapa2014",name:"Poznań: Orthophotomap 2014 (aerial image)",type:"wms",template:"http://wms1.geopoz.poznan.pl:6080/arcgis/services/sip/ortofotomapa_2014/MapServer/WmsServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=ortofotomapa_2014_image&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2014-01-01T00:00:00.000Z",startDate:"2014-01-01T00:00:00.000Z",zoomExtent:[0,23],polygon:[[[16.72794,52.48838],[16.86925,52.48982],[16.86879,52.50779],[16.93948,52.50845],[16.93926,52.51743],[16.98639,52.51784],[16.98784,52.45494],[17.03491,52.45534],[17.0353,52.43736],[17.08235,52.43774],[17.0831,52.4018],[17.0596,52.40161],[17.06129,52.32075],[17.01438,52.32035],[17.01518,52.28441],[16.96829,52.28401],[16.96787,52.30198],[16.89752,52.30134],[16.89662,52.33728],[16.80273,52.33638],[16.80176,52.37232],[16.77828,52.3721],[16.77603,52.45294],[16.72897,52.45244],[16.72794,52.48838]]],terms_text:"Zarząd Geodezji i Katastru Miejskiego GEOPOZ"},{id:"poznan-ortofotomapa2016",name:"Poznań: Orthophotomap 2016 (aerial image)",type:"wms",template:"http://wms1.geopoz.poznan.pl:6080/arcgis/services/sip/ortofotomapy/MapServer/WmsServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=ortofotomapa_2016_image&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2016-01-01T00:00:00.000Z",startDate:"2016-01-01T00:00:00.000Z",zoomExtent:[0,23],polygon:[[[16.72794,52.48838],[16.86925,52.48982],[16.86879,52.50779],[16.93948,52.50845],[16.93926,52.51743],[16.98639,52.51784],[16.98784,52.45494],[17.03491,52.45534],[17.0353,52.43736],[17.08235,52.43774],[17.0831,52.4018],[17.0596,52.40161],[17.06129,52.32075],[17.01438,52.32035],[17.01518,52.28441],[16.96829,52.28401],[16.96787,52.30198],[16.89752,52.30134],[16.89662,52.33728],[16.80273,52.33638],[16.80176,52.37232],[16.77828,52.3721],[16.77603,52.45294],[16.72897,52.45244],[16.72794,52.48838]]],terms_text:"Zarząd Geodezji i Katastru Miejskiego GEOPOZ"},{id:"PrahaIPRlatestorthophoto",name:"Praha IPR latest orthophoto",type:"wms",template:"http://giswa1.mag.mepnet.cz/arcgis/services/MAP/letecke_snimky_posledni_snimkovani_cache/MapServer/WmsServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",zoomExtent:[1,20],polygon:[[[14.81232,49.93089],[14.18755,49.87687],[14.12025,50.19882],[14.74502,50.25247],[14.81232,49.93089]]]},{id:"PrahaIPRlow-vegetationorthophoto",name:"Praha IPR low-vegetation orthophoto",type:"wms",template:"http://giswa1.mag.mepnet.cz/arcgis/services/MAP/mimovegetacni_snimkovani_cache/MapServer/WmsServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",zoomExtent:[1,20],polygon:[[[14.30454,49.99538],[14.31604,49.94205],[14.35,49.94508],[14.35384,49.92726],[14.42385,49.93352],[14.42009,49.95097],[14.48865,49.95709],[14.48479,49.97501],[14.55386,49.98117],[14.55012,49.99852],[14.58455,50.00159],[14.5883,49.98424],[14.69168,49.99346],[14.67634,50.06453],[14.71279,50.06777],[14.70115,50.12158],[14.6647,50.11834],[14.661,50.13543],[14.62755,50.13246],[14.61965,50.16895],[14.58543,50.16591],[14.58163,50.18344],[14.40776,50.168],[14.41156,50.15045],[14.37765,50.14744],[14.3738,50.16524],[14.33893,50.16214],[14.34278,50.14434],[14.27368,50.1382],[14.27749,50.12058],[14.2088,50.11447],[14.21289,50.09557],[14.24656,50.09857],[14.25417,50.06336],[14.21987,50.0603],[14.2237,50.04259],[14.258,50.04565],[14.26953,49.99226],[14.30454,49.99538]]]},{id:"przemysl-buildings",name:"Przemyśl: Buildings",type:"wms",template:"http://przemysl.geoportal2.pl/map/wms/wms.php?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=adresy,budynki&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",zoomExtent:[0,19],polygon:[[[22.72268,49.76885],[22.73002,49.76787],[22.73097,49.77612],[22.72027,49.77662],[22.71787,49.78062],[22.73104,49.78553],[22.7244,49.79043],[22.73458,49.80441],[22.73167,49.81429],[22.7261,49.8165],[22.72762,49.82124],[22.74395,49.8187],[22.75952,49.80939],[22.79042,49.81462],[22.81169,49.80571],[22.79738,49.80146],[22.80384,49.79247],[22.83118,49.79664],[22.85752,49.78561],[22.84549,49.76746],[22.82485,49.77105],[22.82004,49.75674],[22.77358,49.74439],[22.73838,49.75895],[22.72205,49.74644],[22.71065,49.76288],[22.72268,49.76885]]],terms_text:"Miasto Przemyśl",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/pl/PowiatrzeszowskiBuildings.png"},{id:"przemysl-aerial",name:"Przemyśl: Ortophotomap (aerial image)",type:"wms",template:"http://przemysl.geoportal2.pl/map/wms/wms.php?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=ortofotomapa&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",zoomExtent:[0,23],polygon:[[[22.72268,49.76885],[22.73002,49.76787],[22.73097,49.77612],[22.72027,49.77662],[22.71787,49.78062],[22.73104,49.78553],[22.7244,49.79043],[22.73458,49.80441],[22.73167,49.81429],[22.7261,49.8165],[22.72762,49.82124],[22.74395,49.8187],[22.75952,49.80939],[22.79042,49.81462],[22.81169,49.80571],[22.79738,49.80146],[22.80384,49.79247],[22.83118,49.79664],[22.85752,49.78561],[22.84549,49.76746],[22.82485,49.77105],[22.82004,49.75674],[22.77358,49.74439],[22.73838,49.75895],[22.72205,49.74644],[22.71065,49.76288],[22.72268,49.76885]]],terms_text:"Miasto Przemyśl",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/pl/PowiatrzeszowskiBuildings.png"},{id:"RABA-KGZ-3000",name:"RABA-KGZ: Slovenia built-up areas",type:"tms",template:"https://wms.openstreetmap.de/tms/RABA3000/{zoom}/{x}/{y}.png",zoomExtent:[8,19],polygon:[[[15.17101,45.41273],[15.06731,45.4781],[14.98353,45.48726],[14.93027,45.51869],[14.91295,45.46869],[14.81398,45.45019],[14.77755,45.49724],[14.71885,45.52386],[14.68383,45.51924],[14.68367,45.57107],[14.58902,45.61966],[14.59477,45.65727],[14.51653,45.5974],[14.49636,45.52968],[14.32388,45.46048],[14.28251,45.47949],[14.26083,45.47352],[14.2367,45.49569],[14.21022,45.45962],[14.1328,45.46542],[14.06694,45.47615],[14.01187,45.50769],[13.98752,45.49945],[14.00668,45.4739],[13.99154,45.44854],[13.91789,45.44329],[13.88867,45.416],[13.81063,45.42531],[13.7856,45.45577],[13.67553,45.43241],[13.38,45.5666],[13.63822,45.64153],[13.72158,45.60472],[13.83759,45.59226],[13.89962,45.63295],[13.82754,45.67917],[13.82429,45.70266],[13.78961,45.73525],[13.66355,45.79008],[13.62279,45.78613],[13.58835,45.80154],[13.56531,45.85522],[13.62633,45.93894],[13.62975,45.97662],[13.59233,45.97929],[13.57124,45.9591],[13.52998,45.95627],[13.46729,46.00147],[13.49765,46.03741],[13.4896,46.06574],[13.58839,46.11268],[13.63712,46.14524],[13.65358,46.17505],[13.57147,46.17434],[13.54859,46.19982],[13.48189,46.21479],[13.42003,46.19662],[13.40026,46.21037],[13.40304,46.23284],[13.36653,46.30266],[13.43369,46.33243],[13.43247,46.36779],[13.56263,46.40895],[13.59357,46.44846],[13.68393,46.44947],[13.71321,46.53296],[13.79725,46.5164],[13.91305,46.53108],[14.00849,46.49169],[14.09406,46.49538],[14.12664,46.4852],[14.16569,46.44341],[14.28242,46.45347],[14.3259,46.44111],[14.43178,46.4568],[14.45113,46.43239],[14.52618,46.43623],[14.56677,46.38549],[14.58993,46.44479],[14.65658,46.45447],[14.71191,46.50954],[14.80818,46.51778],[14.81442,46.55093],[14.86094,46.61239],[14.9102,46.61569],[14.95398,46.64257],[14.98376,46.61868],[15.02973,46.65796],[15.10645,46.66965],[15.23727,46.64973],[15.41364,46.66553],[15.46237,46.64732],[15.47411,46.6226],[15.53427,46.64346],[15.53636,46.6761],[15.59201,46.69952],[15.62405,46.69039],[15.65624,46.71643],[15.767,46.70899],[15.83801,46.73237],[15.91476,46.71958],[16.02919,46.67033],[16.02955,46.68778],[15.99495,46.71178],[15.97505,46.74967],[15.98671,46.84189],[16.0553,46.85049],[16.11022,46.87912],[16.15425,46.86525],[16.23302,46.88667],[16.29431,46.8824],[16.34649,46.85476],[16.36058,46.8278],[16.34711,46.79707],[16.32245,46.79068],[16.33977,46.7799],[16.33186,46.75896],[16.38893,46.70785],[16.4383,46.69655],[16.42822,46.65301],[16.40159,46.6439],[16.51477,46.57299],[16.54136,46.53627],[16.5416,46.50887],[16.611,46.48393],[16.61889,46.46203],[16.52219,46.45842],[16.47451,46.50108],[16.36776,46.53371],[16.2582,46.489],[16.28533,46.42441],[16.3168,46.40141],[16.30574,46.36921],[16.18689,46.36804],[16.14548,46.39515],[16.06959,46.38154],[16.08614,46.34087],[16.04058,46.32708],[16.01819,46.29964],[15.80777,46.25091],[15.79649,46.21296],[15.77128,46.19937],[15.67996,46.21707],[15.65737,46.20838],[15.65639,46.18456],[15.62037,46.16163],[15.61899,46.11595],[15.63483,46.09529],[15.71869,46.06873],[15.74241,46.04578],[15.71612,45.99489],[15.71645,45.9178],[15.69237,45.90013],[15.69375,45.87111],[15.71776,45.8416],[15.6441,45.81058],[15.57467,45.83999],[15.52333,45.81155],[15.49115,45.82041],[15.47514,45.78666],[15.40343,45.78216],[15.28683,45.73391],[15.27435,45.72408],[15.29763,45.70782],[15.36329,45.72191],[15.41517,45.65443],[15.39705,45.62929],[15.31501,45.62356],[15.31503,45.60696],[15.29266,45.60163],[15.30852,45.58653],[15.31145,45.5423],[15.39496,45.48325],[15.34824,45.44665],[15.27515,45.45599],[15.22848,45.41683],[15.17101,45.41273]]],terms_url:"https://wiki.openstreetmap.org/wiki/Slovenia_Landcover_Import_-_RABA-KGZ",terms_text:"Copyright ©2019 Ministrstvo za kmetijstvo, gozdarstvo in prehrano (mkgp.gov.si). Some rights reserved.",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/si/RABA-KGZSloveniafarmlanduse.png"},{id:"RABA-KGZ",name:"RABA-KGZ: Slovenia farmland use",type:"tms",template:"https://wms.openstreetmap.de/tms/RABA/{zoom}/{x}/{y}.png",zoomExtent:[8,19],polygon:[[[15.17101,45.41273],[15.06731,45.4781],[14.98353,45.48726],[14.93027,45.51869],[14.91295,45.46869],[14.81398,45.45019],[14.77755,45.49724],[14.71885,45.52386],[14.68383,45.51924],[14.68367,45.57107],[14.58902,45.61966],[14.59477,45.65727],[14.51653,45.5974],[14.49636,45.52968],[14.32388,45.46048],[14.28251,45.47949],[14.26083,45.47352],[14.2367,45.49569],[14.21022,45.45962],[14.1328,45.46542],[14.06694,45.47615],[14.01187,45.50769],[13.98752,45.49945],[14.00668,45.4739],[13.99154,45.44854],[13.91789,45.44329],[13.88867,45.416],[13.81063,45.42531],[13.7856,45.45577],[13.67553,45.43241],[13.38,45.5666],[13.63822,45.64153],[13.72158,45.60472],[13.83759,45.59226],[13.89962,45.63295],[13.82754,45.67917],[13.82429,45.70266],[13.78961,45.73525],[13.66355,45.79008],[13.62279,45.78613],[13.58835,45.80154],[13.56531,45.85522],[13.62633,45.93894],[13.62975,45.97662],[13.59233,45.97929],[13.57124,45.9591],[13.52998,45.95627],[13.46729,46.00147],[13.49765,46.03741],[13.4896,46.06574],[13.58839,46.11268],[13.63712,46.14524],[13.65358,46.17505],[13.57147,46.17434],[13.54859,46.19982],[13.48189,46.21479],[13.42003,46.19662],[13.40026,46.21037],[13.40304,46.23284],[13.36653,46.30266],[13.43369,46.33243],[13.43247,46.36779],[13.56263,46.40895],[13.59357,46.44846],[13.68393,46.44947],[13.71321,46.53296],[13.79725,46.5164],[13.91305,46.53108],[14.00849,46.49169],[14.09406,46.49538],[14.12664,46.4852],[14.16569,46.44341],[14.28242,46.45347],[14.3259,46.44111],[14.43178,46.4568],[14.45113,46.43239],[14.52618,46.43623],[14.56677,46.38549],[14.58993,46.44479],[14.65658,46.45447],[14.71191,46.50954],[14.80818,46.51778],[14.81442,46.55093],[14.86094,46.61239],[14.9102,46.61569],[14.95398,46.64257],[14.98376,46.61868],[15.02973,46.65796],[15.10645,46.66965],[15.23727,46.64973],[15.41364,46.66553],[15.46237,46.64732],[15.47411,46.6226],[15.53427,46.64346],[15.53636,46.6761],[15.59201,46.69952],[15.62405,46.69039],[15.65624,46.71643],[15.767,46.70899],[15.83801,46.73237],[15.91476,46.71958],[16.02919,46.67033],[16.02955,46.68778],[15.99495,46.71178],[15.97505,46.74967],[15.98671,46.84189],[16.0553,46.85049],[16.11022,46.87912],[16.15425,46.86525],[16.23302,46.88667],[16.29431,46.8824],[16.34649,46.85476],[16.36058,46.8278],[16.34711,46.79707],[16.32245,46.79068],[16.33977,46.7799],[16.33186,46.75896],[16.38893,46.70785],[16.4383,46.69655],[16.42822,46.65301],[16.40159,46.6439],[16.51477,46.57299],[16.54136,46.53627],[16.5416,46.50887],[16.611,46.48393],[16.61889,46.46203],[16.52219,46.45842],[16.47451,46.50108],[16.36776,46.53371],[16.2582,46.489],[16.28533,46.42441],[16.3168,46.40141],[16.30574,46.36921],[16.18689,46.36804],[16.14548,46.39515],[16.06959,46.38154],[16.08614,46.34087],[16.04058,46.32708],[16.01819,46.29964],[15.80777,46.25091],[15.79649,46.21296],[15.77128,46.19937],[15.67996,46.21707],[15.65737,46.20838],[15.65639,46.18456],[15.62037,46.16163],[15.61899,46.11595],[15.63483,46.09529],[15.71869,46.06873],[15.74241,46.04578],[15.71612,45.99489],[15.71645,45.9178],[15.69237,45.90013],[15.69375,45.87111],[15.71776,45.8416],[15.6441,45.81058],[15.57467,45.83999],[15.52333,45.81155],[15.49115,45.82041],[15.47514,45.78666],[15.40343,45.78216],[15.28683,45.73391],[15.27435,45.72408],[15.29763,45.70782],[15.36329,45.72191],[15.41517,45.65443],[15.39705,45.62929],[15.31501,45.62356],[15.31503,45.60696],[15.29266,45.60163],[15.30852,45.58653],[15.31145,45.5423],[15.39496,45.48325],[15.34824,45.44665],[15.27515,45.45599],[15.22848,45.41683],[15.17101,45.41273]]],terms_url:"https://wiki.openstreetmap.org/wiki/Slovenia_Landcover_Import_-_RABA-KGZ",terms_text:"Copyright ©2019 Ministrstvo za kmetijstvo, gozdarstvo in prehrano (mkgp.gov.si). Some rights reserved.",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/si/RABA-KGZSloveniafarmlanduse.png"},{id:"riksantikvaren-kulturminner",name:"Riksantikvaren Heritage Sites overlay",type:"wms",template:"https://kart.ra.no/arcgis/services/Distribusjon/Kulturminner/MapServer/WmsServer?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=3,6&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[13,22],polygon:[[[-10.95725,71.60964],[-6.16765,71.62095],[-6.13756,70.30991],[-10.92717,70.29784],[-10.95725,71.60964]],[[16.81947,74.9482],[21.25771,74.94213],[21.23712,73.8918],[16.79889,73.89828],[16.81947,74.9482]],[[4.04288,79.93593],[20.65421,81.54417],[36.6503,80.40108],[26.76265,75.8129],[13.88667,75.79135],[4.04288,79.93593]],[[31.90425,70.43681],[28.47652,71.32896],[23.6865,71.25143],[16.80906,70.07308],[11.16207,67.52539],[9.97554,64.81158],[4.21871,62.145],[4.37254,59.1872],[6.17431,57.8915],[7.93212,57.73936],[10.77758,58.86491],[11.7224,58.76251],[12.72216,60.11415],[13.05175,61.34935],[12.52439,63.61699],[14.23826,63.98561],[15.11717,65.90166],[18.69871,68.37491],[20.06101,68.26126],[21.00584,68.78415],[25.24656,68.3506],[26.93845,69.8472],[28.76219,69.61121],[28.5864,68.8556],[31.06931,69.51915],[31.90425,70.43681]]],terms_url:"https://www.riksantikvaren.no/Veiledning/Data-og-tjenester/Karttjenester",terms_text:"© Riksantikvaren",description:"Archeological and architectural monuments/sites and cultural environments protected by law (''enkeltminner'') from the Norwegian Directorate for Cultural Heritage",icon:"https://www.riksantikvaren.no/extension/riksantikvaren/design/internetsite/images/logo_na.png",overlay:true},{id:"rio2013",name:"Rio Mosaic 2013",type:"wms",template:"http://geo.rio.rj.gov.br/ArcGIS/services/Imagens/Mosaico_2013/MapServer/WMSServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=1&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2013-01-01T00:00:00.000Z",startDate:"2013-01-01T00:00:00.000Z",polygon:[[[-43.17709,-22.96971],[-43.14586,-22.96959],[-43.14605,-22.92719],[-43.15625,-22.92731],[-43.15647,-22.87557],[-43.17739,-22.87494],[-43.17742,-22.88553],[-43.19804,-22.88571],[-43.19804,-22.85429],[-43.21875,-22.85444],[-43.21901,-22.83365],[-43.22937,-22.83365],[-43.22934,-22.82371],[-43.19869,-22.82353],[-43.19856,-22.83413],[-43.18826,-22.83398],[-43.18804,-22.84448],[-43.16667,-22.84442],[-43.16683,-22.83404],[-43.15638,-22.83407],[-43.15654,-22.81336],[-43.10436,-22.81306],[-43.10446,-22.80288],[-43.09387,-22.80276],[-43.0941,-22.73998],[-43.13599,-22.73992],[-43.13569,-22.75067],[-43.12573,-22.75055],[-43.12556,-22.77118],[-43.14595,-22.77109],[-43.14612,-22.76055],[-43.17771,-22.76088],[-43.17758,-22.77115],[-43.18807,-22.7713],[-43.18807,-22.78166],[-43.25067,-22.78163],[-43.25057,-22.79198],[-43.28054,-22.79282],[-43.30343,-22.79312],[-43.33353,-22.79297],[-43.33347,-22.80258],[-43.38574,-22.8024],[-43.38542,-22.81255],[-43.41691,-22.81285],[-43.41675,-22.82341],[-43.42717,-22.82335],[-43.4274,-22.83374],[-43.45844,-22.83362],[-43.45864,-22.81276],[-43.48984,-22.813],[-43.48994,-22.7965],[-43.50208,-22.79746],[-43.51543,-22.79737],[-43.52078,-22.79591],[-43.54169,-22.79603],[-43.54179,-22.80234],[-43.54653,-22.80246],[-43.54666,-22.81189],[-43.55251,-22.81279],[-43.56991,-22.81294],[-43.56998,-22.8197],[-43.57361,-22.82326],[-43.58348,-22.82329],[-43.58352,-22.83347],[-43.59391,-22.83374],[-43.59394,-22.85468],[-43.66099,-22.85459],[-43.66099,-22.85983],[-43.70852,-22.86019],[-43.70836,-22.86503],[-43.72206,-22.86488],[-43.72213,-22.86847],[-43.75015,-22.86859],[-43.75009,-22.8753],[-43.76038,-22.87527],[-43.75992,-22.8785],[-43.75976,-22.88457],[-43.76132,-22.88586],[-43.78129,-22.8858],[-43.78126,-22.89591],[-43.80213,-22.89621],[-43.80135,-22.91137],[-43.80119,-22.92758],[-43.79213,-22.92776],[-43.7922,-22.93822],[-43.78191,-22.93799],[-43.78184,-22.94869],[-43.75067,-22.94845],[-43.7506,-22.95909],[-43.72986,-22.95886],[-43.72966,-22.97984],[-43.70904,-22.97966],[-43.70891,-22.99033],[-43.69846,-22.99006],[-43.69836,-23.00065],[-43.66735,-23.00044],[-43.66726,-23.01117],[-43.63125,-23.00937],[-43.63131,-23.02079],[-43.63586,-23.02091],[-43.63602,-23.03164],[-43.67771,-23.03164],[-43.67765,-23.04233],[-43.67086,-23.0423],[-43.67109,-23.0631],[-43.64599,-23.06304],[-43.64605,-23.05276],[-43.60475,-23.05255],[-43.60452,-23.06307],[-43.58381,-23.06289],[-43.58368,-23.08404],[-43.54186,-23.08383],[-43.54195,-23.06319],[-43.52147,-23.06301],[-43.5213,-23.07352],[-43.50043,-23.07337],[-43.50043,-23.04218],[-43.45877,-23.04221],[-43.4587,-23.03194],[-43.43782,-23.03182],[-43.43776,-23.02154],[-43.3235,-23.02121],[-43.3233,-23.04212],[-43.31291,-23.04195],[-43.31275,-23.05267],[-43.30239,-23.05258],[-43.30236,-23.04227],[-43.29194,-23.04215],[-43.29197,-23.03194],[-43.27109,-23.03182],[-43.27119,-23.01093],[-43.26061,-23.01087],[-43.26067,-23.00059],[-43.25057,-23.00047],[-43.25054,-23.01126],[-43.23989,-23.01102],[-43.23986,-23.00062],[-43.21908,-23.0005],[-43.21904,-22.99021],[-43.20901,-22.99009],[-43.20862,-23.08389],[-43.18768,-23.08377],[-43.18761,-23.07334],[-43.13582,-23.07337],[-43.13589,-23.05249],[-43.17732,-23.05255],[-43.17709,-22.96971]]],terms_url:"https://pgeo3.rio.rj.gov.br/arcgis/rest/services/Imagens/Mosaico_2013_UTM/MapServer",terms_text:"Instituto Pereira Passos - Prefeitura da Cidade do Rio de Janeiro."},{id:"rio2015",name:"Rio Mosaic 2015",type:"wms",template:"https://pgeo3.rio.rj.gov.br/arcgis/services/Imagens/Mosaico_2015_UTM/MapServer/WmsServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2015-01-01T00:00:00.000Z",startDate:"2015-01-01T00:00:00.000Z",zoomExtent:[0,13],polygon:[[[-42.30363,-22.43698],[-44.10842,-22.06579],[-44.5313,-23.7863],[-42.70469,-24.16178],[-42.30363,-22.43698]]],terms_url:"https://pgeo3.rio.rj.gov.br/arcgis/rest/services/Imagens/Mosaico_2015_UTM/MapServer",terms_text:"Instituto Pereira Passos - Prefeitura da Cidade do Rio de Janeiro."},{id:"route500",name:"Route 500",type:"tms",template:"https://{switch:a,b,c}.tile.openstreetmap.fr/route500/{zoom}/{x}/{y}.png",zoomExtent:[12,20],polygon:[[[-2.7,43.9],[-6.3,48.98],[-2.25,50.09],[1.31,50.88],[2.35816,51.32937],[2.5488,51.09759],[2.57048,51.07409],[2.58741,51.01763],[2.59845,51.0051],[2.61558,50.99749],[2.63986,50.95766],[2.64225,50.94578],[2.62452,50.9256],[2.61962,50.91067],[2.62396,50.86071],[2.62781,50.85054],[2.63786,50.83696],[2.6511,50.82906],[2.73267,50.81738],[2.79995,50.73795],[2.81655,50.73092],[2.85265,50.73335],[2.89072,50.7162],[2.90492,50.71536],[2.9161,50.72418],[2.93508,50.75592],[3.00718,50.78377],[3.08218,50.78749],[3.09244,50.79092],[3.11412,50.80566],[3.14877,50.80195],[3.2154,50.73111],[3.22149,50.7267],[3.27051,50.70375],[3.27545,50.67757],[3.26576,50.6604],[3.26588,50.64054],[3.28922,50.60028],[3.29219,50.55037],[3.3056,50.53267],[3.37551,50.50839],[3.3898,50.50884],[3.4748,50.54445],[3.52173,50.53459],[3.53266,50.51873],[3.54779,50.51012],[3.61523,50.50558],[3.67378,50.45642],[3.68415,50.35277],[3.6901,50.34044],[3.70258,50.33482],[3.71576,50.33854],[3.74935,50.36279],[3.84109,50.36558],[3.90189,50.3436],[3.91317,50.34291],[4.02672,50.36904],[4.13761,50.29984],[4.14388,50.29727],[4.21444,50.28167],[4.22904,50.26664],[4.23078,50.25233],[4.17084,50.18579],[4.16601,50.16888],[4.1764,50.1547],[4.21195,50.13602],[4.24074,50.07102],[4.23193,50.05551],[4.18164,50.03436],[4.17177,50.02537],[4.16976,50.01217],[4.1765,50.00065],[4.20633,49.97546],[4.22164,49.97089],[4.30877,49.98145],[4.44542,49.9523],[4.45469,49.95251],[4.6581,50.00609],[4.66936,50.01392],[4.67293,50.02716],[4.66924,50.06972],[4.69517,50.10472],[4.83123,50.17941],[4.8815,50.16436],[4.90479,50.14451],[4.90426,50.12639],[4.88076,50.0815],[4.86277,50.0745],[4.85104,50.06216],[4.84331,50.03884],[4.84331,50.03883],[4.8433,50.03881],[4.82678,49.989],[4.82662,49.97692],[4.83343,49.96696],[4.89654,49.91753],[4.89755,49.89424],[4.87913,49.86942],[4.87625,49.85111],[4.88924,49.81266],[4.89769,49.80204],[4.91098,49.79926],[4.99534,49.81116],[5.01867,49.79272],[5.02686,49.78886],[5.09944,49.77323],[5.13458,49.73462],[5.1412,49.72984],[5.18761,49.70906],[5.19602,49.70732],[5.28157,49.70836],[5.33363,49.67308],[5.344,49.65049],[5.3544,49.64041],[5.43141,49.60791],[5.48205,49.52815],[5.49294,49.51979],[5.50666,49.52042],[5.55401,49.54025],[5.59311,49.53424],[5.6076,49.53761],[5.641,49.56095],[5.70676,49.55267],[5.71578,49.55361],[5.77526,49.57414],[5.8399,49.55321],[5.86126,49.52038],[5.876,49.5114],[5.97516,49.50129],[5.99801,49.47317],[6.01627,49.46597],[6.08635,49.47562],[6.09319,49.47787],[6.17397,49.52187],[6.24643,49.52511],[6.334,49.48235],[6.34423,49.48037],[6.43515,49.487],[6.5451,49.44384],[6.60639,49.37868],[6.60497,49.33739],[6.61627,49.31869],[6.67013,49.29269],[6.72996,49.22917],[6.74328,49.19086],[6.76026,49.17752],[6.80904,49.17284],[6.82473,49.17826],[6.83093,49.19366],[6.82982,49.21802],[6.85119,49.23136],[6.88453,49.2239],[6.89322,49.22389],[6.93753,49.23369],[7.04055,49.19794],[7.0463,49.17503],[7.05478,49.16313],[7.06908,49.16018],[7.10494,49.16634],[7.14315,49.14159],[7.1535,49.13839],[7.28683,49.13488],[7.29893,49.13856],[7.36095,49.18259],[7.45012,49.19517],[7.50113,49.17672],[7.54379,49.10572],[7.5579,49.09626],[7.6296,49.08527],[7.64722,49.06722],[7.6612,49.06119],[7.75401,49.05963],[7.76073,49.06067],[7.80291,49.07489],[7.85525,49.05329],[7.8673,49.05227],[7.93826,49.06832],[8.08069,49.00688],[8.2225,48.98787],[8.23704,48.97683],[8.23589,48.95817],[8.20888,48.94863],[8.20089,48.94339],[8.15824,48.89753],[8.10087,48.7993],[7.99071,48.74478],[7.98534,48.7409],[7.90422,48.65865],[7.85605,48.63606],[7.8484,48.62977],[7.81842,48.58883],[7.81456,48.57704],[7.81449,48.50968],[7.78547,48.48337],[7.78055,48.47652],[7.74506,48.39484],[7.74357,48.38427],[7.75159,48.32322],[7.71085,48.29841],[7.70241,48.28803],[7.67661,48.21555],[7.59605,48.11698],[7.59165,48.10648],[7.58522,48.04694],[7.59127,48.03035],[7.62437,47.99865],[7.63205,47.97081],[7.57554,47.87436],[7.5728,47.86435],[7.57267,47.83631],[7.54581,47.78793],[7.54418,47.77232],[7.55758,47.72899],[7.53526,47.6989],[7.53136,47.68564],[7.537,47.67302],[7.60016,47.60822],[7.58967,47.56755],[7.55424,47.55128],[7.54511,47.54283],[7.51256,47.48439],[7.38747,47.42111],[7.32653,47.4273],[7.24435,47.40939],[7.16708,47.4335],[7.15212,47.47612],[7.14279,47.48707],[7.12853,47.48893],[7.0801,47.47718],[7.03557,47.48695],[7.02102,47.48458],[7.01205,47.47287],[7.003,47.44095],[6.9551,47.40808],[6.94716,47.39698],[6.94818,47.38337],[6.95769,47.37359],[6.97126,47.37218],[7.018,47.38386],[7.05623,47.37035],[7.07007,47.35005],[7.05958,47.32257],[6.97424,47.27856],[6.96347,47.26233],[6.96134,47.23479],[6.89443,47.19393],[6.88913,47.18922],[6.85545,47.14636],[6.76907,47.10751],[6.76011,47.09953],[6.72561,47.0418],[6.62355,46.9811],[6.4812,46.9445],[6.46892,46.93522],[6.46686,46.91997],[6.47548,46.88771],[6.4535,46.8239],[6.45644,46.80534],[6.46722,46.79104],[6.46098,46.76887],[6.15817,46.59343],[6.14872,46.58069],[6.15152,46.56508],[6.16549,46.54399],[6.15811,46.52456],[6.10174,46.46979],[6.09572,46.45418],[6.09704,46.43317],[6.10829,46.41643],[6.16622,46.38839],[6.17817,46.36922],[6.13748,46.31297],[6.13371,46.30227],[6.13038,46.23737],[6.1103,46.22344],[6.08865,46.23081],[6.07717,46.23123],[6.01857,46.21601],[6.00681,46.20752],[6.00388,46.19332],[6.00787,46.16977],[6.01783,46.15564],[6.03509,46.15456],[6.05564,46.16288],[6.12468,46.15415],[6.13778,46.15702],[6.24026,46.22094],[6.24906,46.23299],[6.24707,46.24777],[6.21148,46.31057],[6.21219,46.32485],[6.23946,46.36705],[6.31648,46.41557],[6.41083,46.42495],[6.41748,46.42682],[6.50498,46.46871],[6.63047,46.47435],[6.74665,46.45695],[6.82244,46.42925],[6.81832,46.38181],[6.80484,46.36179],[6.80189,46.34639],[6.81095,46.33359],[6.86491,46.30038],[6.87504,46.28007],[6.86092,46.2439],[6.82698,46.21188],[6.82075,46.19862],[6.81863,46.16592],[6.82259,46.15261],[6.83427,46.14509],[6.90382,46.12971],[6.90491,46.09595],[6.90932,46.08406],[6.92001,46.07721],[6.94898,46.0699],[7.01556,46.00883],[7.05191,45.93066],[7.04533,45.92217],[7.04497,45.92064],[7.04394,45.92036],[6.99582,45.85822],[6.94097,45.83551],[6.84376,45.82387],[6.83102,45.81711],[6.82614,45.80353],[6.82787,45.73217],[6.83174,45.72082],[6.8414,45.71373],[6.90729,45.69124],[6.92419,45.66935],[6.94247,45.66172],[6.97131,45.66528],[7.00597,45.64945],[7.01151,45.63652],[6.9978,45.60877],[6.99643,45.59465],[7.0158,45.52354],[7.02774,45.5102],[7.1072,45.47877],[7.1228,45.44924],[7.13304,45.44001],[7.1856,45.41894],[7.19515,45.40409],[7.17075,45.35069],[7.14232,45.32298],[7.13649,45.30576],[7.14458,45.25048],[7.08417,45.20279],[6.99279,45.19823],[6.98106,45.19368],[6.90009,45.12689],[6.85843,45.11699],[6.78283,45.14228],[6.77056,45.14242],[6.67751,45.11356],[6.6653,45.10289],[6.66501,45.08667],[6.68237,45.04558],[6.69602,45.03395],[6.75744,45.01884],[6.78375,44.9146],[6.7942,44.90161],[6.86698,44.86519],[6.8798,44.86346],[6.93633,44.87461],[7.01795,44.84402],[7.03453,44.82282],[7.03711,44.75009],[7.0496,44.73226],[7.07224,44.72311],[7.08651,44.6968],[7.08666,44.68085],[7.07671,44.67134],[6.99007,44.67203],[6.97413,44.66431],[6.97056,44.64696],[6.97819,44.61784],[6.94659,44.57124],[6.88235,44.53479],[6.87233,44.5195],[6.87892,44.50245],[6.95894,44.43129],[6.95872,44.42908],[6.92167,44.41436],[6.91223,44.40659],[6.90907,44.39477],[6.90972,44.38195],[6.91637,44.36804],[6.99909,44.29414],[7.01181,44.256],[7.01983,44.24558],[7.03259,44.2424],[7.07312,44.2461],[7.1651,44.22112],[7.24533,44.18544],[7.26053,44.16682],[7.27537,44.15947],[7.33878,44.1574],[7.36278,44.13834],[7.37776,44.13416],[7.56283,44.15792],[7.5642,44.15836],[7.56478,44.15817],[7.60548,44.1634],[7.6162,44.16827],[7.63989,44.18928],[7.68608,44.1861],[7.69422,44.17795],[7.68937,44.13869],[7.69445,44.12276],[7.72786,44.08615],[7.72403,44.05704],[7.68603,44.02371],[7.68077,44.0164],[7.66016,43.9672],[7.59624,43.94466],[7.58419,43.93287],[7.56858,43.89159],[7.5271,43.87434],[7.51649,43.86397],[7.51594,43.84915],[7.53622,43.79234],[9.8,43.1],[9.63227,41.43244],[9.36968,41.35052],[9.27311,41.29196],[8.94186,41.27688],[5.8,41.64],[3.17358,42.41768],[3.16081,42.42757],[3.0944,42.41457],[3.03402,42.45331],[3.02214,42.45645],[2.87822,42.4487],[2.87019,42.44653],[2.78424,42.40256],[2.7413,42.41128],[2.72928,42.40998],[2.69331,42.39417],[2.68378,42.3854],[2.68162,42.37263],[2.68585,42.34679],[2.66719,42.33008],[2.58106,42.34418],[2.56777,42.34173],[2.5338,42.32197],[2.47795,42.32986],[2.41933,42.37658],[2.41222,42.38021],[2.26719,42.42055],[2.25973,42.42117],[2.20694,42.41558],[2.20653,42.41526],[2.20526,42.41541],[2.16028,42.41065],[2.14881,42.40545],[2.09393,42.35474],[2.00861,42.33818],[1.965,42.36473],[1.93076,42.42442],[1.92089,42.43302],[1.88467,42.44761],[1.88459,42.44762],[1.88444,42.4477],[1.82774,42.47056],[1.72567,42.48452],[1.71561,42.50125],[1.7272,42.56103],[1.72479,42.57499],[1.71011,42.59992],[1.69377,42.60975],[1.60283,42.61382],[1.56069,42.6392],[1.54636,42.64166],[1.50444,42.6331],[1.4921,42.62502],[1.47238,42.59703],[1.43792,42.59264],[1.41936,42.60643],[1.38032,42.67415],[1.37335,42.68127],[1.33313,42.70563],[1.32364,42.7085],[1.23221,42.71248],[1.16554,42.69928],[1.08546,42.76635],[1.07564,42.77079],[0.95937,42.78852],[0.95073,42.78794],[0.92265,42.7797],[0.84606,42.8157],[0.71511,42.8464],[0.70017,42.84402],[0.69117,42.83186],[0.67409,42.76479],[0.67474,42.75286],[0.69192,42.70684],[0.669,42.67901],[0.43024,42.67863],[0.3715,42.70308],[0.35954,42.70415],[0.34912,42.69817],[0.32567,42.67274],[0.29571,42.66388],[0.24594,42.70175],[0.23972,42.70494],[0.18967,42.72039],[0.17919,42.72075],[-0.01993,42.67389],[-0.06726,42.6848],[-0.16949,42.77157],[-0.29987,42.82697],[-0.31683,42.82635],[-0.39208,42.78766],[-0.44354,42.78453],[-0.48842,42.80255],[-0.50868,42.79935],[-0.54499,42.76906],[-0.56721,42.76937],[-0.67446,42.86392],[-0.68094,42.86775],[-0.73372,42.88666],[-0.7476,42.93879],[-0.75711,42.95107],[-0.77253,42.95284],[-0.82114,42.93865],[-0.94508,42.94192],[-1.02313,42.98206],[-1.10852,43.00409],[-1.1156,43.00461],[-1.14775,43.00124],[-1.15845,43.01452],[-1.16736,43.02083],[-1.21622,43.0381],[-1.22612,43.03898],[-1.26236,43.03303],[-1.30643,43.05531],[-1.31992,43.05696],[-1.33135,43.0496],[-1.3542,43.0197],[-1.43868,43.03371],[-1.4775,43.06889],[-1.48311,43.08561],[-1.47641,43.10248],[-1.43479,43.13087],[-1.42732,43.1404],[-1.39411,43.22935],[-1.39531,43.24596],[-1.40868,43.25591],[-1.52629,43.28099],[-1.54626,43.2737],[-1.57149,43.2412],[-1.61053,43.24223],[-1.65,43.29323],[-1.66953,43.30065],[-1.73359,43.28856],[-1.75606,43.31966],[-1.76297,43.32565],[-1.79156,43.34067],[-1.80099,43.37017],[-1.78509,43.39037],[-1.7835,43.39686],[-2.7,43.9]]],terms_url:"https://wiki.openstreetmap.org/wiki/FR:Servers/tile.openstreetmap.fr#Route500.E2.84.A2.C2.A9.C2.AE",terms_text:"Tiles © cquest@Openstreetmap France, data © IGN, LO/OL",description:"Routes du réseau classé (autoroutes, nationales, départementales)",overlay:true},{id:"Ruda_Slaska-aerial_image",name:"Ruda Śląska: Orthophotomap (aerial image)",type:"wms",template:"https://rudaslaska.geoportal2.pl/map/wmsorto/wms.php?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=ortofotomapa&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",zoomExtent:[0,23],polygon:[[[18.84294,50.32508],[18.84008,50.33091],[18.85132,50.33437],[18.86262,50.3305],[18.88693,50.333],[18.89493,50.3319],[18.90045,50.32562],[18.89713,50.31146],[18.89312,50.31149],[18.89114,50.30778],[18.8972,50.2999],[18.89073,50.29586],[18.90211,50.29204],[18.90706,50.28637],[18.90853,50.27823],[18.93583,50.27379],[18.94106,50.25859],[18.93848,50.25317],[18.95086,50.24267],[18.96531,50.24084],[18.94611,50.22907],[18.89932,50.22516],[18.90251,50.21749],[18.89075,50.21557],[18.89292,50.20913],[18.86474,50.20512],[18.85673,50.22078],[18.85258,50.22331],[18.84619,50.21761],[18.83341,50.21715],[18.83533,50.22307],[18.83051,50.23099],[18.82411,50.23055],[18.81641,50.23709],[18.81619,50.24125],[18.80635,50.24596],[18.80344,50.24293],[18.78831,50.24456],[18.79552,50.2768],[18.81681,50.27732],[18.81919,50.28794],[18.83893,50.29795],[18.83849,50.3004],[18.82699,50.30342],[18.82691,50.32073],[18.83007,50.32371],[18.84294,50.32508]]],terms_text:"Urząd Miasta Ruda Śląska"},{id:"Rzeszow-buildings",name:"Rzeszów: Buildings",type:"wms",template:"http://wms.erzeszow.pl/?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=komunikacja,budynki,adresy&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",zoomExtent:[0,19],polygon:[[[22.09538,50.08157],[22.0947,50.05584],[22.08892,50.05589],[22.08874,50.03671],[22.09505,50.03682],[22.09435,49.98723],[22.0609,49.98754],[22.0605,49.96525],[22.04757,49.96509],[22.04724,49.95792],[22.03139,49.95845],[22.0312,49.9574],[22.0014,49.95833],[22.00019,49.9375],[22.0014,49.93746],[22.00029,49.92047],[21.96799,49.92088],[21.969,49.93683],[21.95393,49.93706],[21.95441,49.94373],[21.94192,49.94378],[21.94253,49.96646],[21.93676,49.9665],[21.93776,49.97828],[21.92898,49.97858],[21.92951,49.98858],[21.91606,49.9888],[21.9165,50.01192],[21.90572,50.01195],[21.90653,50.04136],[21.87425,50.04183],[21.87546,50.06072],[21.90465,50.06083],[21.90672,50.0835],[22.09538,50.08157]]],terms_text:"Urząd Miasta Rzeszowa"},{id:"Rzeszow-aerial_image",name:"Rzeszów: Orthophotomap (aerial image)",type:"wms",template:"http://wms.erzeszow.pl/?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=rastry&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",zoomExtent:[0,23],polygon:[[[22.09538,50.08157],[22.0947,50.05584],[22.08892,50.05589],[22.08874,50.03671],[22.09505,50.03682],[22.09435,49.98723],[22.0609,49.98754],[22.0605,49.96525],[22.04757,49.96509],[22.04724,49.95792],[22.03139,49.95845],[22.0312,49.9574],[22.0014,49.95833],[22.00019,49.9375],[22.0014,49.93746],[22.00029,49.92047],[21.96799,49.92088],[21.969,49.93683],[21.95393,49.93706],[21.95441,49.94373],[21.94192,49.94378],[21.94253,49.96646],[21.93676,49.9665],[21.93776,49.97828],[21.92898,49.97858],[21.92951,49.98858],[21.91606,49.9888],[21.9165,50.01192],[21.90572,50.01195],[21.90653,50.04136],[21.87425,50.04183],[21.87546,50.06072],[21.90465,50.06083],[21.90672,50.0835],[22.09538,50.08157]]],terms_text:"Urząd Miasta Rzeszowa"},{id:"SanJuanMetroAreaUSACEOrthophotos",name:"San Juan Metro Area: 2013 USACE Orthophotos",type:"tms",template:"http://imagery-pr-usace-2013.s3-website-us-east-1.amazonaws.com/tiles/{zoom}/{x}/{y}.jpg",endDate:"2013-03-15T00:00:00.000Z",startDate:"2013-03-13T00:00:00.000Z",zoomExtent:[0,20],polygon:[[[-66.15007,18.35002],[-66.03337,18.35002],[-66.03328,18.45634],[-66.05464,18.45636],[-66.05463,18.46542],[-66.08303,18.46544],[-66.08302,18.47451],[-66.13034,18.47455],[-66.13034,18.4796],[-66.13983,18.47961],[-66.13984,18.46557],[-66.14995,18.46558],[-66.15007,18.35002]]]},{id:"santana_do_ipanema",name:"Santana do Ipanema AL",type:"wms",template:"http://geoserver.dados.al.gov.br:8080/geoserver/Alagoas/ows?LAYERS=Santana%20do%20Ipanema&SERVICE=WMS&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.0&SERVICE=WMS&REQUEST=GetMap&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[-37.20224,-9.41356],[-37.20188,-9.37768],[-37.20208,-9.37455],[-37.20192,-9.36733],[-37.20169,-9.36045],[-37.20172,-9.35501],[-37.20195,-9.35101],[-37.20191,-9.34773],[-37.20175,-9.33835],[-37.2017,-9.33505],[-37.20171,-9.33301],[-37.20142,-9.32833],[-37.20121,-9.32469],[-37.20117,-9.32351],[-37.21425,-9.32346],[-37.21537,-9.3234],[-37.22078,-9.32328],[-37.23727,-9.32313],[-37.25181,-9.32293],[-37.2656,-9.32276],[-37.2803,-9.32259],[-37.29191,-9.32245],[-37.29205,-9.33522],[-37.29304,-9.4122],[-37.28357,-9.41235],[-37.27789,-9.4125],[-37.2716,-9.41249],[-37.26506,-9.41262],[-37.26165,-9.41274],[-37.25499,-9.41276],[-37.24991,-9.41296],[-37.24616,-9.41297],[-37.24108,-9.41303],[-37.23461,-9.41321],[-37.2284,-9.41325],[-37.22165,-9.41335],[-37.21686,-9.41346],[-37.21292,-9.41343],[-37.20224,-9.41356]]],terms_url:"http://www.seplag.al.gov.br",terms_text:"Secretaria de Estado do Planejamento, Gestão e Patrimônio"},{id:"Sao_miguel_dos_campos",name:"São Miguel dos Campos AL",type:"wms",template:"http://geoserver.dados.al.gov.br:8080/geoserver/Alagoas/ows?LAYERS=Sao_miguel_dos_campos&SERVICE=WMS&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.0&SERVICE=WMS&REQUEST=GetMap&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[-36.1415,-9.83171],[-36.05047,-9.83246],[-36.04959,-9.74246],[-36.14059,-9.74166],[-36.1415,-9.83171]]],terms_url:"http://www.seplag.al.gov.br",terms_text:"Secretaria de Estado do Planejamento, Gestão e Patrimônio"},{id:"GEOSN-DOP-2005",name:"Saxony historical aerial imagery 2005",type:"wms",template:"https://geodienste.sachsen.de/wms_geosn_dop-2005/guest?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=dop_2005&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2005-01-01T00:00:00.000Z",startDate:"2005-01-01T00:00:00.000Z",polygon:[[[13.86571,50.71509],[13.86683,50.73012],[13.90116,50.73012],[13.90184,50.74446],[13.91043,50.74446],[13.91043,50.77378],[13.95266,50.77486],[13.95197,50.78897],[13.99969,50.78941],[13.999,50.79831],[14.16715,50.79762],[14.1747,50.8462],[14.32851,50.84534],[14.33503,50.87643],[14.41674,50.876],[14.41674,50.95025],[14.33263,50.95133],[14.3364,50.99802],[14.58188,50.99608],[14.57742,50.94895],[14.54068,50.95003],[14.54446,50.89831],[14.60557,50.89116],[14.60454,50.83439],[14.6605,50.83352],[14.65673,50.79578],[14.83422,50.79469],[14.84727,50.89138],[14.9204,50.88943],[14.9331,50.99478],[14.99902,50.99673],[15.00142,51.09709],[15.04159,51.09709],[15.04228,51.35317],[14.99696,51.35317],[15.00314,51.49959],[14.91593,51.50301],[14.91662,51.55043],[14.74908,51.55129],[14.75114,51.60121],[14.41056,51.59993],[14.41125,51.55129],[14.07891,51.54915],[14.07479,51.49831],[13.99446,51.50002],[13.99446,51.39817],[13.53921,51.39989],[13.53852,51.42516],[13.50041,51.42505],[13.50179,51.44945],[13.41596,51.45094],[13.41699,51.50013],[13.3315,51.50055],[13.33047,51.44966],[13.24945,51.44987],[13.25116,51.60036],[13.16773,51.60057],[13.16739,51.65023],[13.08328,51.65066],[13.08362,51.69941],[12.66202,51.70027],[12.66065,51.64832],[12.4162,51.65045],[12.41345,51.60057],[12.16146,51.60015],[12.16146,51.50109],[12.07631,51.50023],[12.07974,51.39625],[12.16008,51.39753],[12.16214,51.34995],[12.07906,51.35253],[12.07906,51.24562],[12.16214,51.24691],[12.16352,51.0958],[12.24317,51.09709],[12.2454,51.04813],[12.49688,51.04883],[12.49894,50.89966],[12.33346,50.89923],[12.32797,50.84984],[12.20712,50.8494],[12.20506,50.69829],[12.24694,50.69744],[12.24694,50.65023],[11.91529,50.64849],[11.91598,50.59839],[11.83221,50.59817],[11.83255,50.39922],[11.91495,50.39922],[11.91461,50.34886],[11.99486,50.34659],[11.99838,50.29897],[12.16506,50.29912],[12.16549,50.24904],[12.23673,50.24871],[12.24823,50.24212],[12.24772,50.14904],[12.33149,50.14893],[12.33852,50.19335],[12.33286,50.23927],[12.3538,50.23619],[12.35998,50.24926],[12.41457,50.24948],[12.41594,50.29906],[12.49851,50.29874],[12.49834,50.34948],[12.58142,50.34915],[12.58125,50.39896],[12.69489,50.39962],[12.70622,50.39426],[12.71257,50.39875],[13.0813,50.39907],[13.0813,50.4992],[13.24816,50.49898],[13.24884,50.54809],[13.33124,50.54918],[13.33056,50.59911],[13.50908,50.59759],[13.50462,50.62656],[13.5393,50.62635],[13.53827,50.65481],[13.54633,50.65547],[13.54599,50.66983],[13.5544,50.67027],[13.55457,50.68908],[13.54736,50.68887],[13.54582,50.69969],[13.63886,50.69947],[13.63955,50.71425],[13.86571,50.71509]]],terms_url:"https://geoportal.sachsen.de/cps/metadaten_portal.html?id=3f38c3f3-03db-4a2a-b6da-2704b9a1d5f0",terms_text:"Staatsbetrieb Geobasisinformation und Vermessung Sachsen",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/de/SaxonyWebAtlasSN.png"},{id:"GEOSN-DOP-2012_2014",name:"Saxony historical aerial imagery 2012-2014",type:"wms",template:"https://geodienste.sachsen.de/wms_geosn_dop_2012_2014/guest?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=dop_2012_2014_rgb&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2012-01-01T00:00:00.000Z",startDate:"2012-01-01T00:00:00.000Z",polygon:[[[13.86571,50.71509],[13.86683,50.73012],[13.90116,50.73012],[13.90184,50.74446],[13.91043,50.74446],[13.91043,50.77378],[13.95266,50.77486],[13.95197,50.78897],[13.99969,50.78941],[13.999,50.79831],[14.16715,50.79762],[14.1747,50.8462],[14.32851,50.84534],[14.33503,50.87643],[14.41674,50.876],[14.41674,50.95025],[14.33263,50.95133],[14.3364,50.99802],[14.58188,50.99608],[14.57742,50.94895],[14.54068,50.95003],[14.54446,50.89831],[14.60557,50.89116],[14.60454,50.83439],[14.6605,50.83352],[14.65673,50.79578],[14.83422,50.79469],[14.84727,50.89138],[14.9204,50.88943],[14.9331,50.99478],[14.99902,50.99673],[15.00142,51.09709],[15.04159,51.09709],[15.04228,51.35317],[14.99696,51.35317],[15.00314,51.49959],[14.91593,51.50301],[14.91662,51.55043],[14.74908,51.55129],[14.75114,51.60121],[14.41056,51.59993],[14.41125,51.55129],[14.07891,51.54915],[14.07479,51.49831],[13.99446,51.50002],[13.99446,51.39817],[13.53921,51.39989],[13.53852,51.42516],[13.50041,51.42505],[13.50179,51.44945],[13.41596,51.45094],[13.41699,51.50013],[13.3315,51.50055],[13.33047,51.44966],[13.24945,51.44987],[13.25116,51.60036],[13.16773,51.60057],[13.16739,51.65023],[13.08328,51.65066],[13.08362,51.69941],[12.66202,51.70027],[12.66065,51.64832],[12.4162,51.65045],[12.41345,51.60057],[12.16146,51.60015],[12.16146,51.50109],[12.07631,51.50023],[12.07974,51.39625],[12.16008,51.39753],[12.16214,51.34995],[12.07906,51.35253],[12.07906,51.24562],[12.16214,51.24691],[12.16352,51.0958],[12.24317,51.09709],[12.2454,51.04813],[12.49688,51.04883],[12.49894,50.89966],[12.33346,50.89923],[12.32797,50.84984],[12.20712,50.8494],[12.20506,50.69829],[12.24694,50.69744],[12.24694,50.65023],[11.91529,50.64849],[11.91598,50.59839],[11.83221,50.59817],[11.83255,50.39922],[11.91495,50.39922],[11.91461,50.34886],[11.99486,50.34659],[11.99838,50.29897],[12.16506,50.29912],[12.16549,50.24904],[12.23673,50.24871],[12.24823,50.24212],[12.24772,50.14904],[12.33149,50.14893],[12.33852,50.19335],[12.33286,50.23927],[12.3538,50.23619],[12.35998,50.24926],[12.41457,50.24948],[12.41594,50.29906],[12.49851,50.29874],[12.49834,50.34948],[12.58142,50.34915],[12.58125,50.39896],[12.69489,50.39962],[12.70622,50.39426],[12.71257,50.39875],[13.0813,50.39907],[13.0813,50.4992],[13.24816,50.49898],[13.24884,50.54809],[13.33124,50.54918],[13.33056,50.59911],[13.50908,50.59759],[13.50462,50.62656],[13.5393,50.62635],[13.53827,50.65481],[13.54633,50.65547],[13.54599,50.66983],[13.5544,50.67027],[13.55457,50.68908],[13.54736,50.68887],[13.54582,50.69969],[13.63886,50.69947],[13.63955,50.71425],[13.86571,50.71509]]],terms_url:"https://geoportal.sachsen.de/cps/metadaten_portal.html?id=8c276e3c-88af-462f-8128-6900bc7dd4f8",terms_text:"Staatsbetrieb Geobasisinformation und Vermessung Sachsen",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/de/SaxonyWebAtlasSN.png"},{id:"GEOSN-DOP-RGB",name:"Saxony latest aerial imagery",type:"wms",template:"https://geodienste.sachsen.de/wms_geosn_dop-rgb/guest?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=sn_dop_020&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[13.54901,50.69792],[13.84251,50.71126],[13.93239,50.74504],[14.04614,50.79389],[14.25257,50.85953],[14.40002,50.88966],[14.42671,50.9357],[14.35649,50.97197],[14.32559,50.99319],[14.27504,50.99054],[14.31577,51.04266],[14.41547,51.01263],[14.51939,51.0038],[14.5882,50.9817],[14.54467,50.91977],[14.57977,50.90649],[14.64718,50.92243],[14.64437,50.90915],[14.60505,50.85687],[14.7202,50.81785],[14.81008,50.81341],[14.85642,50.89055],[14.91259,50.94721],[14.99685,51.08679],[15.05303,51.24793],[15.05583,51.29274],[14.99264,51.34452],[14.98843,51.398],[14.97719,51.45754],[14.90979,51.49603],[14.73986,51.5371],[14.73986,51.59122],[14.70054,51.60605],[14.67948,51.5982],[14.68369,51.57813],[14.67386,51.55806],[14.61769,51.55718],[14.58399,51.59035],[14.51939,51.56941],[14.43513,51.5598],[14.327,51.52574],[14.13461,51.55544],[14.0672,51.49952],[14.02788,51.47854],[14.04333,51.45229],[13.99558,51.39274],[13.95767,51.40588],[13.88886,51.38836],[13.72455,51.37434],[13.55463,51.39274],[13.40437,51.45929],[13.35241,51.43916],[13.3159,51.44354],[13.28641,51.41815],[13.22602,51.40063],[13.21339,51.46104],[13.219,51.52661],[13.17406,51.5982],[13.00274,51.67751],[12.90584,51.65312],[12.90303,51.66619],[12.85388,51.69318],[12.76401,51.65922],[12.68817,51.67054],[12.64324,51.62959],[12.57723,51.63046],[12.42557,51.61041],[12.23037,51.57028],[12.17701,51.53011],[12.13909,51.46017],[12.16718,51.41727],[12.1742,51.33487],[12.13207,51.3182],[12.18684,51.21364],[12.15875,51.18812],[12.22054,51.09296],[12.49017,51.05414],[12.52106,50.99319],[12.60532,50.97286],[12.62639,50.91889],[12.50281,50.91092],[12.23739,50.81874],[12.21352,50.72993],[12.28654,50.665],[12.21773,50.6463],[12.13347,50.6276],[12.05343,50.56342],[12.01972,50.64719],[11.85963,50.54825],[11.87649,50.50808],[11.92704,50.5054],[11.93687,50.48664],[11.87087,50.44194],[11.93406,50.39989],[11.96917,50.33987],[12.12083,50.29773],[12.17279,50.3067],[12.18543,50.26094],[12.21212,50.25375],[12.25705,50.21603],[12.28233,50.15668],[12.35535,50.15848],[12.35535,50.22142],[12.41433,50.28158],[12.51123,50.34705],[12.53791,50.38735],[12.67835,50.40257],[12.71205,50.38646],[12.7289,50.39631],[12.75699,50.42584],[12.78648,50.43389],[12.81737,50.41779],[12.84686,50.43657],[12.94797,50.38735],[13.00976,50.41421],[13.04627,50.44999],[13.0561,50.48753],[13.21479,50.49289],[13.27517,50.56609],[13.34118,50.56877],[13.39173,50.61334],[13.47739,50.58571],[13.54761,50.63473],[13.56867,50.67212],[13.54901,50.69792]]],terms_url:"https://geoportal.sachsen.de/cps/metadaten_portal.html?id=cd01c334-7e32-482f-bd43-af286707178a",terms_text:"Staatsbetrieb Geobasisinformation und Vermessung Sachsen",best:true,icon:"https://osmlab.github.io/editor-layer-index/sources/europe/de/SaxonyWebAtlasSN.png"},{id:"GEOSN-DOP-CIR",name:"Saxony latest aerial imagery infrared",type:"wms",template:"https://geodienste.sachsen.de/wms_geosn_dop-cir/guest?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=sn_dop_020_cir&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[13.54901,50.69792],[13.84251,50.71126],[13.93239,50.74504],[14.04614,50.79389],[14.25257,50.85953],[14.40002,50.88966],[14.42671,50.9357],[14.35649,50.97197],[14.32559,50.99319],[14.27504,50.99054],[14.31577,51.04266],[14.41547,51.01263],[14.51939,51.0038],[14.5882,50.9817],[14.54467,50.91977],[14.57977,50.90649],[14.64718,50.92243],[14.64437,50.90915],[14.60505,50.85687],[14.7202,50.81785],[14.81008,50.81341],[14.85642,50.89055],[14.91259,50.94721],[14.99685,51.08679],[15.05303,51.24793],[15.05583,51.29274],[14.99264,51.34452],[14.98843,51.398],[14.97719,51.45754],[14.90979,51.49603],[14.73986,51.5371],[14.73986,51.59122],[14.70054,51.60605],[14.67948,51.5982],[14.68369,51.57813],[14.67386,51.55806],[14.61769,51.55718],[14.58399,51.59035],[14.51939,51.56941],[14.43513,51.5598],[14.327,51.52574],[14.13461,51.55544],[14.0672,51.49952],[14.02788,51.47854],[14.04333,51.45229],[13.99558,51.39274],[13.95767,51.40588],[13.88886,51.38836],[13.72455,51.37434],[13.55463,51.39274],[13.40437,51.45929],[13.35241,51.43916],[13.3159,51.44354],[13.28641,51.41815],[13.22602,51.40063],[13.21339,51.46104],[13.219,51.52661],[13.17406,51.5982],[13.00274,51.67751],[12.90584,51.65312],[12.90303,51.66619],[12.85388,51.69318],[12.76401,51.65922],[12.68817,51.67054],[12.64324,51.62959],[12.57723,51.63046],[12.42557,51.61041],[12.23037,51.57028],[12.17701,51.53011],[12.13909,51.46017],[12.16718,51.41727],[12.1742,51.33487],[12.13207,51.3182],[12.18684,51.21364],[12.15875,51.18812],[12.22054,51.09296],[12.49017,51.05414],[12.52106,50.99319],[12.60532,50.97286],[12.62639,50.91889],[12.50281,50.91092],[12.23739,50.81874],[12.21352,50.72993],[12.28654,50.665],[12.21773,50.6463],[12.13347,50.6276],[12.05343,50.56342],[12.01972,50.64719],[11.85963,50.54825],[11.87649,50.50808],[11.92704,50.5054],[11.93687,50.48664],[11.87087,50.44194],[11.93406,50.39989],[11.96917,50.33987],[12.12083,50.29773],[12.17279,50.3067],[12.18543,50.26094],[12.21212,50.25375],[12.25705,50.21603],[12.28233,50.15668],[12.35535,50.15848],[12.35535,50.22142],[12.41433,50.28158],[12.51123,50.34705],[12.53791,50.38735],[12.67835,50.40257],[12.71205,50.38646],[12.7289,50.39631],[12.75699,50.42584],[12.78648,50.43389],[12.81737,50.41779],[12.84686,50.43657],[12.94797,50.38735],[13.00976,50.41421],[13.04627,50.44999],[13.0561,50.48753],[13.21479,50.49289],[13.27517,50.56609],[13.34118,50.56877],[13.39173,50.61334],[13.47739,50.58571],[13.54761,50.63473],[13.56867,50.67212],[13.54901,50.69792]]],terms_url:"https://geoportal.sachsen.de/cps/metadaten_portal.html?id=ba87bbed-4cb5-4539-a9f5-f863de752f52",terms_text:"Staatsbetrieb Geobasisinformation und Vermessung Sachsen",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/de/SaxonyWebAtlasSN.png"},{id:"GEOSN-DTK",name:"Saxony topographic map",type:"wms",template:"https://geodienste.sachsen.de/wms_geosn_dtk-pg-color/guest?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=sn_dtk_pg_color&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[13.54901,50.69792],[13.84251,50.71126],[13.93239,50.74504],[14.04614,50.79389],[14.25257,50.85953],[14.40002,50.88966],[14.42671,50.9357],[14.35649,50.97197],[14.32559,50.99319],[14.27504,50.99054],[14.31577,51.04266],[14.41547,51.01263],[14.51939,51.0038],[14.5882,50.9817],[14.54467,50.91977],[14.57977,50.90649],[14.64718,50.92243],[14.64437,50.90915],[14.60505,50.85687],[14.7202,50.81785],[14.81008,50.81341],[14.85642,50.89055],[14.91259,50.94721],[14.99685,51.08679],[15.05303,51.24793],[15.05583,51.29274],[14.99264,51.34452],[14.98843,51.398],[14.97719,51.45754],[14.90979,51.49603],[14.73986,51.5371],[14.73986,51.59122],[14.70054,51.60605],[14.67948,51.5982],[14.68369,51.57813],[14.67386,51.55806],[14.61769,51.55718],[14.58399,51.59035],[14.51939,51.56941],[14.43513,51.5598],[14.327,51.52574],[14.13461,51.55544],[14.0672,51.49952],[14.02788,51.47854],[14.04333,51.45229],[13.99558,51.39274],[13.95767,51.40588],[13.88886,51.38836],[13.72455,51.37434],[13.55463,51.39274],[13.40437,51.45929],[13.35241,51.43916],[13.3159,51.44354],[13.28641,51.41815],[13.22602,51.40063],[13.21339,51.46104],[13.219,51.52661],[13.17406,51.5982],[13.00274,51.67751],[12.90584,51.65312],[12.90303,51.66619],[12.85388,51.69318],[12.76401,51.65922],[12.68817,51.67054],[12.64324,51.62959],[12.57723,51.63046],[12.42557,51.61041],[12.23037,51.57028],[12.17701,51.53011],[12.13909,51.46017],[12.16718,51.41727],[12.1742,51.33487],[12.13207,51.3182],[12.18684,51.21364],[12.15875,51.18812],[12.22054,51.09296],[12.49017,51.05414],[12.52106,50.99319],[12.60532,50.97286],[12.62639,50.91889],[12.50281,50.91092],[12.23739,50.81874],[12.21352,50.72993],[12.28654,50.665],[12.21773,50.6463],[12.13347,50.6276],[12.05343,50.56342],[12.01972,50.64719],[11.85963,50.54825],[11.87649,50.50808],[11.92704,50.5054],[11.93687,50.48664],[11.87087,50.44194],[11.93406,50.39989],[11.96917,50.33987],[12.12083,50.29773],[12.17279,50.3067],[12.18543,50.26094],[12.21212,50.25375],[12.25705,50.21603],[12.28233,50.15668],[12.35535,50.15848],[12.35535,50.22142],[12.41433,50.28158],[12.51123,50.34705],[12.53791,50.38735],[12.67835,50.40257],[12.71205,50.38646],[12.7289,50.39631],[12.75699,50.42584],[12.78648,50.43389],[12.81737,50.41779],[12.84686,50.43657],[12.94797,50.38735],[13.00976,50.41421],[13.04627,50.44999],[13.0561,50.48753],[13.21479,50.49289],[13.27517,50.56609],[13.34118,50.56877],[13.39173,50.61334],[13.47739,50.58571],[13.54761,50.63473],[13.56867,50.67212],[13.54901,50.69792]]],terms_url:"https://geoportal.sachsen.de/cps/metadaten_portal.html?id=d6d24c6d-94ea-447d-8a0c-40afdedeb5c6",terms_text:"Staatsbetrieb Geobasisinformation und Vermessung Sachsen",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/de/SaxonyWebAtlasSN.png"},{id:"GEOSN-WebAtlas",name:"Saxony WebAtlasSN",type:"wms",template:"https://geodienste.sachsen.de/wms_geosn_webatlas-sn/guest?FORMAT=image/png&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Vegetation,Siedlung,Gewaesser,Verkehr,Administrative_Einheiten,Beschriftung&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[13.54901,50.69792],[13.84251,50.71126],[13.93239,50.74504],[14.04614,50.79389],[14.25257,50.85953],[14.40002,50.88966],[14.42671,50.9357],[14.35649,50.97197],[14.32559,50.99319],[14.27504,50.99054],[14.31577,51.04266],[14.41547,51.01263],[14.51939,51.0038],[14.5882,50.9817],[14.54467,50.91977],[14.57977,50.90649],[14.64718,50.92243],[14.64437,50.90915],[14.60505,50.85687],[14.7202,50.81785],[14.81008,50.81341],[14.85642,50.89055],[14.91259,50.94721],[14.99685,51.08679],[15.05303,51.24793],[15.05583,51.29274],[14.99264,51.34452],[14.98843,51.398],[14.97719,51.45754],[14.90979,51.49603],[14.73986,51.5371],[14.73986,51.59122],[14.70054,51.60605],[14.67948,51.5982],[14.68369,51.57813],[14.67386,51.55806],[14.61769,51.55718],[14.58399,51.59035],[14.51939,51.56941],[14.43513,51.5598],[14.327,51.52574],[14.13461,51.55544],[14.0672,51.49952],[14.02788,51.47854],[14.04333,51.45229],[13.99558,51.39274],[13.95767,51.40588],[13.88886,51.38836],[13.72455,51.37434],[13.55463,51.39274],[13.40437,51.45929],[13.35241,51.43916],[13.3159,51.44354],[13.28641,51.41815],[13.22602,51.40063],[13.21339,51.46104],[13.219,51.52661],[13.17406,51.5982],[13.00274,51.67751],[12.90584,51.65312],[12.90303,51.66619],[12.85388,51.69318],[12.76401,51.65922],[12.68817,51.67054],[12.64324,51.62959],[12.57723,51.63046],[12.42557,51.61041],[12.23037,51.57028],[12.17701,51.53011],[12.13909,51.46017],[12.16718,51.41727],[12.1742,51.33487],[12.13207,51.3182],[12.18684,51.21364],[12.15875,51.18812],[12.22054,51.09296],[12.49017,51.05414],[12.52106,50.99319],[12.60532,50.97286],[12.62639,50.91889],[12.50281,50.91092],[12.23739,50.81874],[12.21352,50.72993],[12.28654,50.665],[12.21773,50.6463],[12.13347,50.6276],[12.05343,50.56342],[12.01972,50.64719],[11.85963,50.54825],[11.87649,50.50808],[11.92704,50.5054],[11.93687,50.48664],[11.87087,50.44194],[11.93406,50.39989],[11.96917,50.33987],[12.12083,50.29773],[12.17279,50.3067],[12.18543,50.26094],[12.21212,50.25375],[12.25705,50.21603],[12.28233,50.15668],[12.35535,50.15848],[12.35535,50.22142],[12.41433,50.28158],[12.51123,50.34705],[12.53791,50.38735],[12.67835,50.40257],[12.71205,50.38646],[12.7289,50.39631],[12.75699,50.42584],[12.78648,50.43389],[12.81737,50.41779],[12.84686,50.43657],[12.94797,50.38735],[13.00976,50.41421],[13.04627,50.44999],[13.0561,50.48753],[13.21479,50.49289],[13.27517,50.56609],[13.34118,50.56877],[13.39173,50.61334],[13.47739,50.58571],[13.54761,50.63473],[13.56867,50.67212],[13.54901,50.69792]]],terms_url:"https://geoportal.sachsen.de/cps/metadaten_portal.html?id=475a9197-620f-4dcb-b8aa-7f71b626443f",terms_text:"Staatsbetrieb Geobasisinformation und Vermessung Sachsen",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/de/SaxonyWebAtlasSN.png"},{id:"Geodatastyrelsen_Denmark",name:"SDFE aerial imagery",type:"tms",template:"https://osmtools.septima.dk/mapproxy/tiles/1.0.0/kortforsyningen_ortoforaar/EPSG3857/{zoom}/{x}/{y}.jpeg",zoomExtent:[0,21],polygon:[[[8.37439,54.95517],[8.36838,55.40421],[8.2104,55.40398],[8.20873,55.49373],[8.05027,55.49247],[8.01851,56.75014],[8.18192,56.75099],[8.17633,57.02089],[8.34133,57.02199],[8.33925,57.11196],[8.50544,57.11232],[8.50339,57.20205],[9.33163,57.20276],[9.33191,57.29248],[9.49789,57.29196],[9.49886,57.38206],[9.66497,57.38116],[9.66873,57.56056],[9.8352,57.55963],[9.83749,57.64933],[10.17257,57.64628],[10.17542,57.73678],[10.51183,57.73303],[10.51521,57.82289],[10.68349,57.82077],[10.67516,57.6412],[10.5077,57.64331],[10.504,57.55351],[10.67104,57.55141],[10.65078,57.10245],[10.48577,57.10451],[10.47862,56.92491],[10.3144,56.92676],[10.31123,56.83693],[10.47503,56.83509],[10.4649,56.56567],[10.95242,56.55898],[10.94792,56.46922],[11.10993,56.46647],[11.10526,56.37683],[10.94299,56.37953],[10.93412,56.19948],[10.77197,56.20202],[10.76948,56.11201],[10.60797,56.11503],[10.44667,56.11672],[10.28659,56.11868],[10.28315,56.02819],[10.44393,56.02704],[10.44177,55.75792],[10.4335,55.66935],[10.74381,55.66469],[10.74381,55.57123],[10.8969,55.57123],[10.90518,55.39539],[11.06137,55.38128],[11.0593,55.11241],[11.04586,55.03186],[11.20308,55.02475],[11.20308,55.11714],[11.0593,55.11241],[11.06137,55.38128],[11.07896,55.57123],[10.8969,55.57123],[10.92587,55.66702],[10.74381,55.66469],[10.75623,55.75792],[10.44177,55.75792],[10.44393,56.02704],[10.44667,56.11672],[10.60797,56.11503],[10.60521,56.02475],[10.92587,56.02012],[10.91971,55.93094],[11.08028,55.92792],[11.08581,56.01783],[11.7265,56.00506],[11.732,56.09521],[12.05403,56.08713],[12.06085,56.17626],[12.70235,56.15944],[12.66111,55.71143],[12.97923,55.7014],[12.96129,55.52173],[12.32687,55.54121],[12.32061,55.45137],[12.47782,55.44707],[12.47024,55.35705],[12.62697,55.35238],[12.62009,55.26326],[12.46273,55.26722],[12.45529,55.17782],[12.2987,55.18223],[12.28973,55.09236],[12.60486,55.08329],[12.5872,54.90363],[12.27666,54.9119],[12.26102,54.73316],[12.10707,54.73782],[12.08586,54.46817],[11.7795,54.47536],[11.78374,54.56548],[11.16585,54.57822],[11.17064,54.66865],[10.86172,54.6734],[10.86512,54.76347],[10.77136,54.76439],[10.77073,54.73728],[10.75514,54.73758],[10.7544,54.71957],[10.73891,54.71976],[10.73844,54.71085],[10.70745,54.7113],[10.70411,54.67567],[10.5511,54.67817],[10.55472,54.76702],[10.2424,54.77059],[10.24598,54.86047],[10.09023,54.86221],[10.08737,54.77239],[9.15558,54.77696],[9.15628,54.86754],[8.5322,54.86638],[8.53143,54.95516],[8.37439,54.95517]],[[11.45777,56.81955],[11.78492,56.81274],[11.77167,56.63328],[11.44596,56.64011],[11.45777,56.81955]],[[11.32747,57.3613],[11.31618,57.1818],[11.15087,57.18473],[11.14566,57.09496],[10.81577,57.10017],[10.82906,57.36953],[11.32747,57.3613]],[[11.58433,56.27779],[11.57829,56.18804],[11.73923,56.18458],[11.74564,56.27432],[11.58433,56.27779]],[[14.68259,55.36394],[14.83952,55.35652],[14.82638,55.26713],[15.13934,55.25174],[15.1532,55.34108],[15.30992,55.33306],[15.29572,55.24374],[15.13934,55.25174],[15.12556,55.16238],[15.28158,55.15442],[15.25356,54.97576],[14.63175,55.00625],[14.68259,55.36394]]],terms_url:"https://download.kortforsyningen.dk/content/vilkaar-og-betingelser",terms_text:"Geodatastyrelsen og Danske Kommuner",best:true,icon:"https://osmlab.github.io/editor-layer-index/sources/europe/dk/SDFESkrmkort.png"},{id:"Geodatastyrelsen_Cadastral_Parcels_INSPIRE_View",name:"SDFE Cadastral Parcels INSPIRE View",type:"wms",template:"https://kortforsyningen.kms.dk/cp_inspire?login=OpenStreetMapDK2015&password=Gall4Peters&FORMAT=image/png&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&Layers=CP.CadastralParcel&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[0,20],polygon:[[[8.37439,54.95517],[8.36838,55.40421],[8.2104,55.40398],[8.20873,55.49373],[8.05027,55.49247],[8.01851,56.75014],[8.18192,56.75099],[8.17633,57.02089],[8.34133,57.02199],[8.33925,57.11196],[8.50544,57.11232],[8.50339,57.20205],[9.33163,57.20276],[9.33191,57.29248],[9.49789,57.29196],[9.49886,57.38206],[9.66497,57.38116],[9.66873,57.56056],[9.8352,57.55963],[9.83749,57.64933],[10.17257,57.64628],[10.17542,57.73678],[10.51183,57.73303],[10.51521,57.82289],[10.68349,57.82077],[10.67516,57.6412],[10.5077,57.64331],[10.504,57.55351],[10.67104,57.55141],[10.65078,57.10245],[10.48577,57.10451],[10.47862,56.92491],[10.3144,56.92676],[10.31123,56.83693],[10.47503,56.83509],[10.4649,56.56567],[10.95242,56.55898],[10.94792,56.46922],[11.10993,56.46647],[11.10526,56.37683],[10.94299,56.37953],[10.93412,56.19948],[10.77197,56.20202],[10.76948,56.11201],[10.60797,56.11503],[10.44667,56.11672],[10.28659,56.11868],[10.28315,56.02819],[10.44393,56.02704],[10.44177,55.75792],[10.4335,55.66935],[10.74381,55.66469],[10.74381,55.57123],[10.8969,55.57123],[10.90518,55.39539],[11.06137,55.38128],[11.0593,55.11241],[11.04586,55.03186],[11.20308,55.02475],[11.20308,55.11714],[11.0593,55.11241],[11.06137,55.38128],[11.07896,55.57123],[10.8969,55.57123],[10.92587,55.66702],[10.74381,55.66469],[10.75623,55.75792],[10.44177,55.75792],[10.44393,56.02704],[10.44667,56.11672],[10.60797,56.11503],[10.60521,56.02475],[10.92587,56.02012],[10.91971,55.93094],[11.08028,55.92792],[11.08581,56.01783],[11.7265,56.00506],[11.732,56.09521],[12.05403,56.08713],[12.06085,56.17626],[12.70235,56.15944],[12.66111,55.71143],[12.97923,55.7014],[12.96129,55.52173],[12.32687,55.54121],[12.32061,55.45137],[12.47782,55.44707],[12.47024,55.35705],[12.62697,55.35238],[12.62009,55.26326],[12.46273,55.26722],[12.45529,55.17782],[12.2987,55.18223],[12.28973,55.09236],[12.60486,55.08329],[12.5872,54.90363],[12.27666,54.9119],[12.26102,54.73316],[12.10707,54.73782],[12.08586,54.46817],[11.7795,54.47536],[11.78374,54.56548],[11.16585,54.57822],[11.17064,54.66865],[10.86172,54.6734],[10.86512,54.76347],[10.77136,54.76439],[10.77073,54.73728],[10.75514,54.73758],[10.7544,54.71957],[10.73891,54.71976],[10.73844,54.71085],[10.70745,54.7113],[10.70411,54.67567],[10.5511,54.67817],[10.55472,54.76702],[10.2424,54.77059],[10.24598,54.86047],[10.09023,54.86221],[10.08737,54.77239],[9.15558,54.77696],[9.15628,54.86754],[8.5322,54.86638],[8.53143,54.95516],[8.37439,54.95517]],[[11.45777,56.81955],[11.78492,56.81274],[11.77167,56.63328],[11.44596,56.64011],[11.45777,56.81955]],[[11.32747,57.3613],[11.31618,57.1818],[11.15087,57.18473],[11.14566,57.09496],[10.81577,57.10017],[10.82906,57.36953],[11.32747,57.3613]],[[11.58433,56.27779],[11.57829,56.18804],[11.73923,56.18458],[11.74564,56.27432],[11.58433,56.27779]],[[14.68259,55.36394],[14.83952,55.35652],[14.82638,55.26713],[15.13934,55.25174],[15.1532,55.34108],[15.30992,55.33306],[15.29572,55.24374],[15.13934,55.25174],[15.12556,55.16238],[15.28158,55.15442],[15.25356,54.97576],[14.63175,55.00625],[14.68259,55.36394]]],terms_text:"Geodatastyrelsen og Danske Kommuner",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/dk/SDFESkrmkort.png"},{id:"Geodatastyrelsen_DTK_Kort25",name:"SDFE DTK Kort25",type:"wms",template:"https://kortforsyningen.kms.dk/topo25?FORMAT=image/png&VERSION=1.1.1&login=OpenStreetMapDK2015&password=Gall4Peters&SERVICE=WMS&REQUEST=GetMap&Layers=topo25_klassisk&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[0,19],polygon:[[[8.37439,54.95517],[8.36838,55.40421],[8.2104,55.40398],[8.20873,55.49373],[8.05027,55.49247],[8.01851,56.75014],[8.18192,56.75099],[8.17633,57.02089],[8.34133,57.02199],[8.33925,57.11196],[8.50544,57.11232],[8.50339,57.20205],[9.33163,57.20276],[9.33191,57.29248],[9.49789,57.29196],[9.49886,57.38206],[9.66497,57.38116],[9.66873,57.56056],[9.8352,57.55963],[9.83749,57.64933],[10.17257,57.64628],[10.17542,57.73678],[10.51183,57.73303],[10.51521,57.82289],[10.68349,57.82077],[10.67516,57.6412],[10.5077,57.64331],[10.504,57.55351],[10.67104,57.55141],[10.65078,57.10245],[10.48577,57.10451],[10.47862,56.92491],[10.3144,56.92676],[10.31123,56.83693],[10.47503,56.83509],[10.4649,56.56567],[10.95242,56.55898],[10.94792,56.46922],[11.10993,56.46647],[11.10526,56.37683],[10.94299,56.37953],[10.93412,56.19948],[10.77197,56.20202],[10.76948,56.11201],[10.60797,56.11503],[10.44667,56.11672],[10.28659,56.11868],[10.28315,56.02819],[10.44393,56.02704],[10.44177,55.75792],[10.4335,55.66935],[10.74381,55.66469],[10.74381,55.57123],[10.8969,55.57123],[10.90518,55.39539],[11.06137,55.38128],[11.0593,55.11241],[11.04586,55.03186],[11.20308,55.02475],[11.20308,55.11714],[11.0593,55.11241],[11.06137,55.38128],[11.07896,55.57123],[10.8969,55.57123],[10.92587,55.66702],[10.74381,55.66469],[10.75623,55.75792],[10.44177,55.75792],[10.44393,56.02704],[10.44667,56.11672],[10.60797,56.11503],[10.60521,56.02475],[10.92587,56.02012],[10.91971,55.93094],[11.08028,55.92792],[11.08581,56.01783],[11.7265,56.00506],[11.732,56.09521],[12.05403,56.08713],[12.06085,56.17626],[12.70235,56.15944],[12.66111,55.71143],[12.97923,55.7014],[12.96129,55.52173],[12.32687,55.54121],[12.32061,55.45137],[12.47782,55.44707],[12.47024,55.35705],[12.62697,55.35238],[12.62009,55.26326],[12.46273,55.26722],[12.45529,55.17782],[12.2987,55.18223],[12.28973,55.09236],[12.60486,55.08329],[12.5872,54.90363],[12.27666,54.9119],[12.26102,54.73316],[12.10707,54.73782],[12.08586,54.46817],[11.7795,54.47536],[11.78374,54.56548],[11.16585,54.57822],[11.17064,54.66865],[10.86172,54.6734],[10.86512,54.76347],[10.77136,54.76439],[10.77073,54.73728],[10.75514,54.73758],[10.7544,54.71957],[10.73891,54.71976],[10.73844,54.71085],[10.70745,54.7113],[10.70411,54.67567],[10.5511,54.67817],[10.55472,54.76702],[10.2424,54.77059],[10.24598,54.86047],[10.09023,54.86221],[10.08737,54.77239],[9.15558,54.77696],[9.15628,54.86754],[8.5322,54.86638],[8.53143,54.95516],[8.37439,54.95517]],[[11.45777,56.81955],[11.78492,56.81274],[11.77167,56.63328],[11.44596,56.64011],[11.45777,56.81955]],[[11.32747,57.3613],[11.31618,57.1818],[11.15087,57.18473],[11.14566,57.09496],[10.81577,57.10017],[10.82906,57.36953],[11.32747,57.3613]],[[11.58433,56.27779],[11.57829,56.18804],[11.73923,56.18458],[11.74564,56.27432],[11.58433,56.27779]],[[14.68259,55.36394],[14.83952,55.35652],[14.82638,55.26713],[15.13934,55.25174],[15.1532,55.34108],[15.30992,55.33306],[15.29572,55.24374],[15.13934,55.25174],[15.12556,55.16238],[15.28158,55.15442],[15.25356,54.97576],[14.63175,55.00625],[14.68259,55.36394]]],terms_text:"Geodatastyrelsen og Danske Kommuner",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/dk/SDFESkrmkort.png"},{id:"Geodatastyrelsen_Skaermkort",name:"SDFE Skærmkort",type:"wms",template:"https://kortforsyningen.kms.dk/topo_skaermkort?FORMAT=image/png&VERSION=1.1.1&login=OpenStreetMapDK2015&password=Gall4Peters&SERVICE=WMS&REQUEST=GetMap&Layers=dtk_skaermkort&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[0,19],polygon:[[[8.37439,54.95517],[8.36838,55.40421],[8.2104,55.40398],[8.20873,55.49373],[8.05027,55.49247],[8.01851,56.75014],[8.18192,56.75099],[8.17633,57.02089],[8.34133,57.02199],[8.33925,57.11196],[8.50544,57.11232],[8.50339,57.20205],[9.33163,57.20276],[9.33191,57.29248],[9.49789,57.29196],[9.49886,57.38206],[9.66497,57.38116],[9.66873,57.56056],[9.8352,57.55963],[9.83749,57.64933],[10.17257,57.64628],[10.17542,57.73678],[10.51183,57.73303],[10.51521,57.82289],[10.68349,57.82077],[10.67516,57.6412],[10.5077,57.64331],[10.504,57.55351],[10.67104,57.55141],[10.65078,57.10245],[10.48577,57.10451],[10.47862,56.92491],[10.3144,56.92676],[10.31123,56.83693],[10.47503,56.83509],[10.4649,56.56567],[10.95242,56.55898],[10.94792,56.46922],[11.10993,56.46647],[11.10526,56.37683],[10.94299,56.37953],[10.93412,56.19948],[10.77197,56.20202],[10.76948,56.11201],[10.60797,56.11503],[10.44667,56.11672],[10.28659,56.11868],[10.28315,56.02819],[10.44393,56.02704],[10.44177,55.75792],[10.4335,55.66935],[10.74381,55.66469],[10.74381,55.57123],[10.8969,55.57123],[10.90518,55.39539],[11.06137,55.38128],[11.0593,55.11241],[11.04586,55.03186],[11.20308,55.02475],[11.20308,55.11714],[11.0593,55.11241],[11.06137,55.38128],[11.07896,55.57123],[10.8969,55.57123],[10.92587,55.66702],[10.74381,55.66469],[10.75623,55.75792],[10.44177,55.75792],[10.44393,56.02704],[10.44667,56.11672],[10.60797,56.11503],[10.60521,56.02475],[10.92587,56.02012],[10.91971,55.93094],[11.08028,55.92792],[11.08581,56.01783],[11.7265,56.00506],[11.732,56.09521],[12.05403,56.08713],[12.06085,56.17626],[12.70235,56.15944],[12.66111,55.71143],[12.97923,55.7014],[12.96129,55.52173],[12.32687,55.54121],[12.32061,55.45137],[12.47782,55.44707],[12.47024,55.35705],[12.62697,55.35238],[12.62009,55.26326],[12.46273,55.26722],[12.45529,55.17782],[12.2987,55.18223],[12.28973,55.09236],[12.60486,55.08329],[12.5872,54.90363],[12.27666,54.9119],[12.26102,54.73316],[12.10707,54.73782],[12.08586,54.46817],[11.7795,54.47536],[11.78374,54.56548],[11.16585,54.57822],[11.17064,54.66865],[10.86172,54.6734],[10.86512,54.76347],[10.77136,54.76439],[10.77073,54.73728],[10.75514,54.73758],[10.7544,54.71957],[10.73891,54.71976],[10.73844,54.71085],[10.70745,54.7113],[10.70411,54.67567],[10.5511,54.67817],[10.55472,54.76702],[10.2424,54.77059],[10.24598,54.86047],[10.09023,54.86221],[10.08737,54.77239],[9.15558,54.77696],[9.15628,54.86754],[8.5322,54.86638],[8.53143,54.95516],[8.37439,54.95517]],[[11.45777,56.81955],[11.78492,56.81274],[11.77167,56.63328],[11.44596,56.64011],[11.45777,56.81955]],[[11.32747,57.3613],[11.31618,57.1818],[11.15087,57.18473],[11.14566,57.09496],[10.81577,57.10017],[10.82906,57.36953],[11.32747,57.3613]],[[11.58433,56.27779],[11.57829,56.18804],[11.73923,56.18458],[11.74564,56.27432],[11.58433,56.27779]],[[14.68259,55.36394],[14.83952,55.35652],[14.82638,55.26713],[15.13934,55.25174],[15.1532,55.34108],[15.30992,55.33306],[15.29572,55.24374],[15.13934,55.25174],[15.12556,55.16238],[15.28158,55.15442],[15.25356,54.97576],[14.63175,55.00625],[14.68259,55.36394]]],terms_text:"Geodatastyrelsen og Danske Kommuner",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/dk/SDFESkrmkort.png"},{id:"SDFE_Overflade_Skyggekort_40cm",name:"SDFE Surface Shadow Map (40 cm)",type:"wms",template:"https://kortforsyningen.kms.dk/dhm?login=OpenStreetMapDK2015&password=Gall4Peters&FORMAT=image/png&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&Layers=dhm_overflade_skyggekort&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[0,20],polygon:[[[8.37439,54.95517],[8.36838,55.40421],[8.2104,55.40398],[8.20873,55.49373],[8.05027,55.49247],[8.01851,56.75014],[8.18192,56.75099],[8.17633,57.02089],[8.34133,57.02199],[8.33925,57.11196],[8.50544,57.11232],[8.50339,57.20205],[9.33163,57.20276],[9.33191,57.29248],[9.49789,57.29196],[9.49886,57.38206],[9.66497,57.38116],[9.66873,57.56056],[9.8352,57.55963],[9.83749,57.64933],[10.17257,57.64628],[10.17542,57.73678],[10.51183,57.73303],[10.51521,57.82289],[10.68349,57.82077],[10.67516,57.6412],[10.5077,57.64331],[10.504,57.55351],[10.67104,57.55141],[10.65078,57.10245],[10.48577,57.10451],[10.47862,56.92491],[10.3144,56.92676],[10.31123,56.83693],[10.47503,56.83509],[10.4649,56.56567],[10.95242,56.55898],[10.94792,56.46922],[11.10993,56.46647],[11.10526,56.37683],[10.94299,56.37953],[10.93412,56.19948],[10.77197,56.20202],[10.76948,56.11201],[10.60797,56.11503],[10.44667,56.11672],[10.28659,56.11868],[10.28315,56.02819],[10.44393,56.02704],[10.44177,55.75792],[10.4335,55.66935],[10.74381,55.66469],[10.74381,55.57123],[10.8969,55.57123],[10.90518,55.39539],[11.06137,55.38128],[11.0593,55.11241],[11.04586,55.03186],[11.20308,55.02475],[11.20308,55.11714],[11.0593,55.11241],[11.06137,55.38128],[11.07896,55.57123],[10.8969,55.57123],[10.92587,55.66702],[10.74381,55.66469],[10.75623,55.75792],[10.44177,55.75792],[10.44393,56.02704],[10.44667,56.11672],[10.60797,56.11503],[10.60521,56.02475],[10.92587,56.02012],[10.91971,55.93094],[11.08028,55.92792],[11.08581,56.01783],[11.7265,56.00506],[11.732,56.09521],[12.05403,56.08713],[12.06085,56.17626],[12.70235,56.15944],[12.66111,55.71143],[12.97923,55.7014],[12.96129,55.52173],[12.32687,55.54121],[12.32061,55.45137],[12.47782,55.44707],[12.47024,55.35705],[12.62697,55.35238],[12.62009,55.26326],[12.46273,55.26722],[12.45529,55.17782],[12.2987,55.18223],[12.28973,55.09236],[12.60486,55.08329],[12.5872,54.90363],[12.27666,54.9119],[12.26102,54.73316],[12.10707,54.73782],[12.08586,54.46817],[11.7795,54.47536],[11.78374,54.56548],[11.16585,54.57822],[11.17064,54.66865],[10.86172,54.6734],[10.86512,54.76347],[10.77136,54.76439],[10.77073,54.73728],[10.75514,54.73758],[10.7544,54.71957],[10.73891,54.71976],[10.73844,54.71085],[10.70745,54.7113],[10.70411,54.67567],[10.5511,54.67817],[10.55472,54.76702],[10.2424,54.77059],[10.24598,54.86047],[10.09023,54.86221],[10.08737,54.77239],[9.15558,54.77696],[9.15628,54.86754],[8.5322,54.86638],[8.53143,54.95516],[8.37439,54.95517]],[[11.45777,56.81955],[11.78492,56.81274],[11.77167,56.63328],[11.44596,56.64011],[11.45777,56.81955]],[[11.32747,57.3613],[11.31618,57.1818],[11.15087,57.18473],[11.14566,57.09496],[10.81577,57.10017],[10.82906,57.36953],[11.32747,57.3613]],[[11.58433,56.27779],[11.57829,56.18804],[11.73923,56.18458],[11.74564,56.27432],[11.58433,56.27779]],[[14.68259,55.36394],[14.83952,55.35652],[14.82638,55.26713],[15.13934,55.25174],[15.1532,55.34108],[15.30992,55.33306],[15.29572,55.24374],[15.13934,55.25174],[15.12556,55.16238],[15.28158,55.15442],[15.25356,54.97576],[14.63175,55.00625],[14.68259,55.36394]]],terms_text:"Geodatastyrelsen og Danske Kommuner",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/dk/SDFESkrmkort.png"},{id:"SDFE_Terraen_Skyggekort_40cm",name:"SDFE Terrain Shadow Map (40 cm)",type:"wms",template:"https://kortforsyningen.kms.dk/dhm?login=OpenStreetMapDK2015&password=Gall4Peters&FORMAT=image/png&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&Layers=dhm_terraen_skyggekort&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[0,20],polygon:[[[8.37439,54.95517],[8.36838,55.40421],[8.2104,55.40398],[8.20873,55.49373],[8.05027,55.49247],[8.01851,56.75014],[8.18192,56.75099],[8.17633,57.02089],[8.34133,57.02199],[8.33925,57.11196],[8.50544,57.11232],[8.50339,57.20205],[9.33163,57.20276],[9.33191,57.29248],[9.49789,57.29196],[9.49886,57.38206],[9.66497,57.38116],[9.66873,57.56056],[9.8352,57.55963],[9.83749,57.64933],[10.17257,57.64628],[10.17542,57.73678],[10.51183,57.73303],[10.51521,57.82289],[10.68349,57.82077],[10.67516,57.6412],[10.5077,57.64331],[10.504,57.55351],[10.67104,57.55141],[10.65078,57.10245],[10.48577,57.10451],[10.47862,56.92491],[10.3144,56.92676],[10.31123,56.83693],[10.47503,56.83509],[10.4649,56.56567],[10.95242,56.55898],[10.94792,56.46922],[11.10993,56.46647],[11.10526,56.37683],[10.94299,56.37953],[10.93412,56.19948],[10.77197,56.20202],[10.76948,56.11201],[10.60797,56.11503],[10.44667,56.11672],[10.28659,56.11868],[10.28315,56.02819],[10.44393,56.02704],[10.44177,55.75792],[10.4335,55.66935],[10.74381,55.66469],[10.74381,55.57123],[10.8969,55.57123],[10.90518,55.39539],[11.06137,55.38128],[11.0593,55.11241],[11.04586,55.03186],[11.20308,55.02475],[11.20308,55.11714],[11.0593,55.11241],[11.06137,55.38128],[11.07896,55.57123],[10.8969,55.57123],[10.92587,55.66702],[10.74381,55.66469],[10.75623,55.75792],[10.44177,55.75792],[10.44393,56.02704],[10.44667,56.11672],[10.60797,56.11503],[10.60521,56.02475],[10.92587,56.02012],[10.91971,55.93094],[11.08028,55.92792],[11.08581,56.01783],[11.7265,56.00506],[11.732,56.09521],[12.05403,56.08713],[12.06085,56.17626],[12.70235,56.15944],[12.66111,55.71143],[12.97923,55.7014],[12.96129,55.52173],[12.32687,55.54121],[12.32061,55.45137],[12.47782,55.44707],[12.47024,55.35705],[12.62697,55.35238],[12.62009,55.26326],[12.46273,55.26722],[12.45529,55.17782],[12.2987,55.18223],[12.28973,55.09236],[12.60486,55.08329],[12.5872,54.90363],[12.27666,54.9119],[12.26102,54.73316],[12.10707,54.73782],[12.08586,54.46817],[11.7795,54.47536],[11.78374,54.56548],[11.16585,54.57822],[11.17064,54.66865],[10.86172,54.6734],[10.86512,54.76347],[10.77136,54.76439],[10.77073,54.73728],[10.75514,54.73758],[10.7544,54.71957],[10.73891,54.71976],[10.73844,54.71085],[10.70745,54.7113],[10.70411,54.67567],[10.5511,54.67817],[10.55472,54.76702],[10.2424,54.77059],[10.24598,54.86047],[10.09023,54.86221],[10.08737,54.77239],[9.15558,54.77696],[9.15628,54.86754],[8.5322,54.86638],[8.53143,54.95516],[8.37439,54.95517]],[[11.45777,56.81955],[11.78492,56.81274],[11.77167,56.63328],[11.44596,56.64011],[11.45777,56.81955]],[[11.32747,57.3613],[11.31618,57.1818],[11.15087,57.18473],[11.14566,57.09496],[10.81577,57.10017],[10.82906,57.36953],[11.32747,57.3613]],[[11.58433,56.27779],[11.57829,56.18804],[11.73923,56.18458],[11.74564,56.27432],[11.58433,56.27779]],[[14.68259,55.36394],[14.83952,55.35652],[14.82638,55.26713],[15.13934,55.25174],[15.1532,55.34108],[15.30992,55.33306],[15.29572,55.24374],[15.13934,55.25174],[15.12556,55.16238],[15.28158,55.15442],[15.25356,54.97576],[14.63175,55.00625],[14.68259,55.36394]]],terms_text:"Geodatastyrelsen og Danske Kommuner",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/dk/SDFESkrmkort.png"},{id:"Sicily-ATA2007",name:"Sicily - Italy",type:"wms",template:"http://map.sitr.regione.sicilia.it/ArcGIS/services/WGS84_F33/Ortofoto_ATA20072008_f33/MapServer/WMSServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&Layers=0&STYLES=default&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[15.71165,38.25894],[15.23718,38.81938],[14.27124,38.55246],[13.15063,38.75408],[11.96411,37.97451],[12.52441,37.54022],[11.87897,36.79609],[12.49695,35.47409],[12.68921,35.46962],[14.57336,36.66401],[15.29709,36.62875],[15.39854,37.42171],[15.71165,38.25894]]]},{id:"Siemianowice_Slaskie-buildings",name:"Siemianowice Śląskie: Buildings",type:"wms",template:"https://siemianowice.geoportal2.pl/map/wms/wms.php?FORMAT=image/png&transparent=true&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=budynki,drogi,adresy,ulice&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",zoomExtent:[0,19],polygon:[[[19.03103,50.33933],[19.0316,50.35413],[19.0656,50.35373],[19.06529,50.34219],[19.06118,50.33749],[19.06069,50.31967],[19.05603,50.31975],[19.05562,50.30155],[19.06432,50.3015],[19.06366,50.27175],[19.04379,50.27179],[19.04375,50.27478],[19.0213,50.27505],[19.02156,50.28398],[19.01027,50.28856],[18.98791,50.28871],[18.98822,50.3022],[18.98143,50.30226],[18.98213,50.33977],[19.03103,50.33933]]],terms_text:"Urząd Miasta Siemianowice Śląskie"},{id:"Siemianowice_Slaskie-aerial_image",name:"Siemianowice Śląskie: Orthophotomap (aerial image)",type:"wms",template:"https://siemianowice.geoportal2.pl/map/wms/wms.php?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=ortofotomapa&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",zoomExtent:[0,23],polygon:[[[19.03103,50.33933],[19.0316,50.35413],[19.0656,50.35373],[19.06529,50.34219],[19.06118,50.33749],[19.06069,50.31967],[19.05603,50.31975],[19.05562,50.30155],[19.06432,50.3015],[19.06366,50.27175],[19.04379,50.27179],[19.04375,50.27478],[19.0213,50.27505],[19.02156,50.28398],[19.01027,50.28856],[18.98791,50.28871],[18.98822,50.3022],[18.98143,50.30226],[18.98213,50.33977],[19.03103,50.33933]]],terms_text:"Urząd Miasta Siemianowice Śląskie"},{id:"sc2012",name:"SIG Santa Catarina OrtoRGB 2012",type:"wms",template:"http://sigsc.sc.gov.br/sigserver/SIGSC/wms?SERVICE=WMS&FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=OrtoRGB-Landsat-2012&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2012-01-01T00:00:00.000Z",startDate:"2012-01-01T00:00:00.000Z",polygon:[[[-48.62488,-26.91624],[-48.62416,-26.83409],[-48.56163,-26.83412],[-48.56165,-26.74919],[-48.62675,-26.74918],[-48.62715,-26.73276],[-48.64126,-26.733],[-48.64174,-26.70912],[-48.62414,-26.70913],[-48.62418,-26.50079],[-48.57099,-26.50077],[-48.57155,-26.47415],[-48.55418,-26.47381],[-48.5545,-26.45736],[-48.56155,-26.45747],[-48.56161,-26.41746],[-48.4991,-26.41747],[-48.49909,-26.25081],[-48.43664,-26.25079],[-48.43661,-26.20752],[-48.4601,-26.20751],[-48.46195,-26.1242],[-48.56161,-26.12419],[-48.56163,-25.95753],[-48.62411,-25.95753],[-48.62411,-25.94507],[-48.68838,-25.94607],[-48.6884,-25.95752],[-49.25089,-25.95752],[-49.2509,-25.9992],[-49.31339,-25.9992],[-49.31338,-26.0825],[-49.37591,-26.0825],[-49.37591,-26.12419],[-49.50093,-26.12418],[-49.50092,-26.16586],[-49.68661,-26.16585],[-49.68661,-26.12417],[-49.74907,-26.08246],[-49.74908,-26.04084],[-49.8116,-26.04085],[-49.81159,-25.99918],[-49.93657,-25.99915],[-49.93661,-25.98244],[-50.00091,-25.98288],[-50.00094,-25.99915],[-50.31338,-25.99916],[-50.31342,-26.04083],[-50.37411,-26.04084],[-50.3741,-25.9992],[-50.49914,-25.99918],[-50.49911,-25.98414],[-50.62593,-25.98452],[-50.62595,-26.04084],[-50.6884,-26.04161],[-50.68845,-26.12416],[-50.75094,-26.12414],[-50.75095,-26.20752],[-51.12595,-26.20747],[-51.12595,-26.24913],[-51.18848,-26.24918],[-51.31344,-26.33245],[-51.31347,-26.62414],[-51.4366,-26.62415],[-51.43659,-26.56476],[-51.62409,-26.5641],[-51.62411,-26.5408],[-51.99907,-26.5408],[-52.06158,-26.49911],[-52.06158,-26.45747],[-52.12408,-26.45749],[-52.12406,-26.41579],[-52.37407,-26.4158],[-52.37409,-26.39133],[-52.56156,-26.3894],[-52.56158,-26.37415],[-52.62408,-26.37417],[-52.62409,-26.33247],[-53.12408,-26.33247],[-53.1241,-26.31707],[-53.1618,-26.3165],[-53.16136,-26.29082],[-53.18656,-26.29083],[-53.24907,-26.24911],[-53.24906,-26.23919],[-53.31159,-26.23824],[-53.3741,-26.22882],[-53.43845,-26.22777],[-53.43843,-26.24914],[-53.5616,-26.24916],[-53.56159,-26.23983],[-53.65501,-26.23814],[-53.65623,-26.29263],[-53.67011,-26.31684],[-53.68846,-26.33242],[-53.70322,-26.3741],[-53.70929,-26.38449],[-53.7098,-26.39568],[-53.70619,-26.40722],[-53.70721,-26.45927],[-53.71438,-26.46168],[-53.71476,-26.48118],[-53.73047,-26.49913],[-53.73146,-26.54081],[-53.75096,-26.5408],[-53.75095,-26.62417],[-53.7602,-26.62414],[-53.76125,-26.6675],[-53.75098,-26.66751],[-53.75096,-26.74298],[-53.72737,-26.7434],[-53.72133,-26.74905],[-53.72141,-26.75093],[-53.74571,-26.75943],[-53.74612,-26.77704],[-53.71948,-26.77755],[-53.72084,-26.83416],[-53.70047,-26.83414],[-53.70277,-26.93108],[-53.71168,-26.93091],[-53.71224,-26.95557],[-53.751,-26.95479],[-53.75092,-26.99915],[-53.76467,-26.99915],[-53.8037,-27.03751],[-53.80454,-27.07258],[-53.80809,-27.07249],[-53.80862,-27.09613],[-53.8269,-27.09577],[-53.82762,-27.12414],[-53.84644,-27.12413],[-53.84765,-27.17014],[-53.83506,-27.18932],[-53.83536,-27.20054],[-53.68847,-27.20284],[-53.68849,-27.22789],[-53.43654,-27.23246],[-53.43655,-27.16751],[-53.37598,-27.16751],[-53.37601,-27.23352],[-53.24905,-27.23564],[-53.24905,-27.20922],[-53.06344,-27.20918],[-53.06345,-27.2334],[-52.81348,-27.23685],[-52.81346,-27.27653],[-52.75096,-27.27732],[-52.75096,-27.29249],[-52.4385,-27.29252],[-52.43848,-27.32689],[-52.37603,-27.32753],[-52.37599,-27.3342],[-52.25098,-27.33418],[-52.25099,-27.34669],[-52.18655,-27.34728],[-52.18657,-27.33419],[-52.12598,-27.3342],[-52.12599,-27.36413],[-52.02979,-27.36489],[-52.03036,-27.42442],[-51.97534,-27.42479],[-51.97603,-27.50088],[-51.93845,-27.50085],[-51.93845,-27.54252],[-51.68846,-27.54247],[-51.68847,-27.55742],[-51.59903,-27.5579],[-51.59923,-27.59481],[-51.56351,-27.59498],[-51.56348,-27.62586],[-51.50088,-27.62586],[-51.50095,-27.66754],[-51.43937,-27.6675],[-51.43954,-27.70932],[-51.37597,-27.7095],[-51.37601,-27.75089],[-51.31349,-27.7509],[-51.31346,-27.79253],[-51.18847,-27.79251],[-51.18848,-27.87586],[-51.12598,-27.87586],[-51.12597,-27.91752],[-51.06348,-27.9175],[-51.06347,-27.95919],[-51.00095,-28.00086],[-50.9385,-28.00086],[-50.93849,-28.16755],[-50.81346,-28.16752],[-50.81345,-28.29253],[-50.75096,-28.29251],[-50.68845,-28.33418],[-50.68849,-28.41754],[-50.626,-28.41752],[-50.56352,-28.44094],[-50.43848,-28.44051],[-50.43847,-28.45917],[-50.37597,-28.45921],[-50.37598,-28.47554],[-50.18844,-28.47454],[-50.18849,-28.51143],[-50.12398,-28.51104],[-50.12402,-28.50086],[-49.87597,-28.50085],[-49.87601,-28.5142],[-49.81347,-28.51369],[-49.81347,-28.58255],[-49.83003,-28.58251],[-49.82951,-28.62597],[-49.8759,-28.66572],[-50.001,-28.74915],[-50.001,-29.04083],[-50.03319,-29.04081],[-50.03219,-29.14711],[-50.12602,-29.14774],[-50.12598,-29.16579],[-50.13613,-29.16581],[-50.1885,-29.19623],[-50.1885,-29.31905],[-50.1422,-29.31873],[-50.14208,-29.33422],[-50.126,-29.33418],[-50.12599,-29.36238],[-49.99906,-29.36153],[-49.99904,-29.24031],[-49.93848,-29.23986],[-49.93851,-29.25087],[-49.87601,-29.25087],[-49.876,-29.30098],[-49.82262,-29.30052],[-49.82227,-29.33419],[-49.81347,-29.33422],[-49.81354,-29.3411],[-49.68654,-29.33991],[-49.68651,-29.29255],[-49.62399,-29.29252],[-49.62398,-29.25085],[-49.56149,-29.25083],[-49.56145,-29.16749],[-49.49901,-29.16746],[-49.49902,-29.08419],[-49.4365,-29.08418],[-49.43651,-29.04251],[-49.37405,-29.04248],[-49.37402,-28.9592],[-49.31153,-28.95917],[-49.31152,-28.91749],[-49.24898,-28.9175],[-49.24897,-28.87582],[-49.18655,-28.87585],[-49.18653,-28.83414],[-49.12402,-28.83418],[-49.12401,-28.7925],[-49.06149,-28.79247],[-49.06146,-28.75084],[-48.99903,-28.75085],[-48.99903,-28.70919],[-48.93658,-28.70918],[-48.93658,-28.66752],[-48.87405,-28.66751],[-48.87404,-28.62585],[-48.74912,-28.62585],[-48.74912,-28.54254],[-48.68656,-28.54253],[-48.68658,-28.33417],[-48.62408,-28.33416],[-48.62406,-28.08418],[-48.5616,-28.08418],[-48.56159,-27.95919],[-48.49905,-27.95916],[-48.49904,-27.91581],[-48.56157,-27.9158],[-48.5616,-27.87584],[-48.49902,-27.87586],[-48.49902,-27.83422],[-48.43657,-27.83418],[-48.43661,-27.62583],[-48.37406,-27.62585],[-48.37405,-27.50086],[-48.31157,-27.50086],[-48.31153,-27.24913],[-48.43657,-27.24913],[-48.43654,-27.20916],[-48.37402,-27.2092],[-48.37405,-27.1658],[-48.43656,-27.1658],[-48.43656,-27.12415],[-48.49906,-27.12413],[-48.49907,-27.08667],[-48.50022,-27.08666],[-48.50031,-27.08247],[-48.5616,-27.08248],[-48.56159,-27.04252],[-48.49906,-27.04252],[-48.49906,-26.99913],[-48.56156,-26.99913],[-48.56157,-26.91579],[-48.62488,-26.91624]]],terms_url:"http://sigsc.sds.sc.gov.br/download/termo_sigsc.pdf",terms_text:"Sistema de Informações Geográficas - Governo de Santa Catarina"},{id:"SIGIP-2012",name:"SIGIP - Orthophoto 2012",type:"tms",template:"http://osmdata.asitvd.ch/tiles/sigip2012/{zoom}/{x}/{y}.png",endDate:"2012-01-01T00:00:00.000Z",startDate:"2012-01-01T00:00:00.000Z",zoomExtent:[14,20],polygon:[[[6.71057,46.54396],[6.72968,46.54408],[6.72995,46.52605],[6.71085,46.52596],[6.71113,46.50796],[6.6922,46.50788],[6.6923,46.49883],[6.63531,46.49847],[6.63488,46.52547],[6.65381,46.52558],[6.65361,46.54358],[6.69163,46.54384],[6.69155,46.55284],[6.71047,46.55293],[6.71057,46.54396]]],terms_url:"https://www.sigip.ch/",terms_text:"SIGIP"},{id:"Slovakia-Historic-Maps",name:"Slovakia Historic Maps",type:"tms",template:"http://tms.freemap.sk/historicke/{zoom}/{x}/{y}.png",zoomExtent:[0,12],polygon:[[[16.81969,47.49272],[16.81969,49.50303],[22.83883,49.50303],[22.83883,47.49272],[16.81969,47.49272]]],icon:"https://raw.githubusercontent.com/FreemapSlovakia/freemap-v3-react/master/src/images/freemap-logo-small.png"},{id:"skoterleder",name:"Snowmobile map Sweden",type:"tms",template:"https://tiles.skoterleder.org/tiles/{zoom}/{x}/{y}.png",zoomExtent:[5,14],polygon:[[[12.80182,55.19612],[14.22729,55.27286],[18.44604,56.69244],[19.74242,57.98481],[20.0061,59.5371],[19.08394,60.19308],[20.49499,63.2497],[23.87328,65.21069],[30.14647,65.19226],[30.19042,67.62596],[29.43236,69.62651],[27.93822,70.14037],[20.73119,69.2756],[18.08349,68.5644],[16.50145,67.88382],[14.43602,66.14275],[11.82128,63.30775],[12.20031,60.31063],[10.62377,58.5482],[12.64251,56.03062],[12.80182,55.19612]]],terms_url:"https://skoterleder.org/",terms_text:"© Skoterleder.org",description:"Snowmobile trails",icon:"https://upload.wikimedia.org/wikipedia/commons/thumb/8/8f/Sweden_road_sign_D9.svg/200px-Sweden_road_sign_D9.svg.png"},{id:"Soskut_Pusztazamor_Tarnok_Diosd_orto_2017",name:"Sóskút, Pusztazámor, Tárnok, Diósd ortophoto 2017",type:"tms",template:"http://adam.openstreetmap.hu/mapproxy/tiles/1.0.0/Soskut-Tarnok-Pusztazamor-Diosd/mercator/{zoom}/{x}/{y}.png",endDate:"2017-03-01T00:00:00.000Z",startDate:"2017-03-01T00:00:00.000Z",zoomExtent:[11,20],polygon:[[[18.79273,47.37079],[18.79194,47.37048],[18.79139,47.37063],[18.79011,47.37176],[18.78916,47.37345],[18.78722,47.37566],[18.78603,47.37765],[18.78498,47.37905],[18.7837,47.38032],[18.78267,47.38195],[18.7814,47.38368],[18.77934,47.38713],[18.77666,47.3894],[18.76472,47.3967],[18.7617,47.39966],[18.75631,47.40328],[18.75837,47.40653],[18.7588,47.40776],[18.762,47.41217],[18.76304,47.41315],[18.76593,47.41471],[18.77041,47.41766],[18.77247,47.41809],[18.77248,47.4203],[18.8086,47.44041],[18.81742,47.43539],[18.82092,47.43572],[18.82804,47.43755],[18.83021,47.43526],[18.83585,47.43754],[18.84049,47.43346],[18.84765,47.43572],[18.851,47.43281],[18.869,47.43961],[18.87361,47.43597],[18.87499,47.43342],[18.87386,47.43248],[18.87604,47.42797],[18.8605,47.423],[18.86621,47.41798],[18.87243,47.41086],[18.8663,47.40773],[18.86964,47.40471],[18.86777,47.40207],[18.86509,47.40052],[18.87081,47.39838],[18.86772,47.39699],[18.86992,47.39655],[18.87649,47.39478],[18.87749,47.39495],[18.87867,47.39462],[18.88358,47.38996],[18.88291,47.38967],[18.88539,47.3853],[18.87748,47.38339],[18.88181,47.37605],[18.87914,47.37393],[18.88638,47.36923],[18.88206,47.36773],[18.87973,47.36641],[18.8747,47.36252],[18.87282,47.36137],[18.87028,47.36063],[18.86688,47.35853],[18.86234,47.35637],[18.85567,47.35199],[18.84874,47.34728],[18.83192,47.33841],[18.82497,47.34258],[18.8162,47.34925],[18.81079,47.35357],[18.80823,47.356],[18.80645,47.35854],[18.80708,47.35902],[18.80635,47.36021],[18.80465,47.36175],[18.80381,47.36335],[18.80055,47.36545],[18.79988,47.36617],[18.79416,47.36975],[18.79273,47.37079]],[[18.91871,47.40938],[18.91826,47.40998],[18.92067,47.41156],[18.9251,47.41372],[18.93473,47.41917],[18.94063,47.42241],[18.94982,47.41938],[18.95155,47.4175],[18.9569,47.41923],[18.9577,47.41878],[18.95755,47.41435],[18.96211,47.40507],[18.96266,47.40118],[18.96316,47.39903],[18.95446,47.39673],[18.95276,47.39526],[18.95202,47.39362],[18.95119,47.39356],[18.94692,47.39799],[18.94411,47.39845],[18.94161,47.39869],[18.93735,47.39633],[18.93617,47.39683],[18.93122,47.4],[18.9312,47.40023],[18.92924,47.40205],[18.92561,47.40605],[18.92466,47.40635],[18.92293,47.40926],[18.91871,47.40938]]],terms_url:"http://fototerkep.hu",terms_text:"Fototerkep.hu",best:true,description:"5 cm resolution bald image of 4 settlement"},{id:"South_Africa-CD_NGI-Aerial",name:"South Africa CD:NGI Aerial",type:"tms",template:"http://{switch:a,b,c}.aerial.openstreetmap.org.za/ngi-aerial/{zoom}/{x}/{y}.jpg",zoomExtent:[1,22],polygon:[[[17.83968,-32.79834],[17.88935,-32.69728],[18.00364,-32.69822],[18.09917,-32.74853],[18.28987,-32.55266],[18.29302,-32.04871],[18.10545,-31.6455],[17.85293,-31.3444],[17.548,-30.90217],[17.40445,-30.63747],[17.24937,-30.39917],[16.9937,-29.65436],[16.7988,-29.19437],[16.54941,-28.84159],[16.44987,-28.69188],[16.4491,-28.55158],[16.60026,-28.48257],[16.75141,-28.4487],[16.74622,-28.2459],[16.88551,-28.04729],[16.99295,-28.0244],[17.05297,-28.02571],[17.10076,-28.03388],[17.20115,-28.09305],[17.20263,-28.23284],[17.24746,-28.23382],[17.2508,-28.19889],[17.35119,-28.19759],[17.35156,-28.24427],[17.40158,-28.24524],[17.41491,-28.34898],[17.40083,-28.548],[17.4527,-28.54897],[17.45121,-28.64951],[17.49836,-28.68721],[17.60282,-28.683],[17.64997,-28.69679],[17.65259,-28.73815],[17.80139,-28.73815],[17.99943,-28.75606],[18.00027,-28.79562],[18.15745,-28.87181],[18.50638,-28.87181],[18.61536,-28.82959],[18.90875,-28.82775],[19.1047,-28.94885],[19.19691,-28.93785],[19.24301,-28.85162],[19.23149,-28.80296],[19.25873,-28.70099],[19.44315,-28.69732],[19.55003,-28.49583],[19.69673,-28.49399],[19.69882,-28.44794],[19.85076,-28.44333],[19.84971,-28.40278],[19.99536,-28.39909],[19.98937,-24.74979],[20.29167,-24.91923],[20.47246,-25.15017],[20.65324,-25.45294],[20.73326,-25.6802],[20.8281,-25.89635],[20.84292,-26.21585],[20.65028,-26.48409],[20.65324,-26.82049],[21.08891,-26.84693],[21.67277,-26.839],[21.7765,-26.66963],[21.97211,-26.64314],[22.28034,-26.32747],[22.57078,-26.1334],[22.77528,-25.67752],[23.00052,-25.27619],[23.46583,-25.27351],[23.88372,-25.59737],[24.2364,-25.6134],[24.60391,-25.78966],[25.1107,-25.73894],[25.50784,-25.68554],[25.64418,-25.48238],[25.84193,-24.78054],[25.84664,-24.75385],[26.39285,-24.63329],[26.47391,-24.56533],[26.509,-24.48424],[26.58619,-24.40758],[26.73006,-24.30145],[26.85674,-24.24995],[26.85744,-24.10269],[26.92155,-23.8991],[26.93183,-23.84619],[26.97148,-23.69943],[27.00061,-23.63676],[27.0578,-23.60526],[27.13605,-23.52034],[27.33396,-23.39738],[27.51441,-23.35939],[27.59581,-23.20855],[27.80986,-23.0995],[27.88285,-23.06205],[27.93829,-22.94965],[28.04076,-22.82551],[28.20568,-22.65529],[28.33972,-22.56394],[28.49061,-22.5607],[28.61088,-22.54002],[28.82818,-22.45502],[28.92853,-22.42323],[28.95941,-22.30901],[29.01626,-22.20834],[29.23241,-22.16935],[29.35312,-22.18429],[29.6549,-22.11864],[29.77771,-22.1362],[29.9293,-22.18494],[30.11668,-22.28303],[30.25634,-22.29148],[30.30336,-22.33952],[30.50618,-22.30576],[30.83743,-22.28498],[31.00586,-22.30771],[31.18342,-22.32329],[31.29306,-22.36746],[31.56806,-23.19034],[31.55683,-23.44308],[31.69311,-23.61752],[31.71197,-23.74114],[31.77747,-23.88006],[31.88863,-23.94811],[31.91444,-24.17467],[31.99483,-24.30409],[32.01667,-24.4406],[32.00773,-24.65366],[32.01964,-24.91407],[32.03552,-25.08498],[32.01964,-25.38214],[31.99285,-25.44938],[31.99979,-25.51657],[32.00575,-25.6079],[32.00575,-25.66248],[31.93627,-25.84037],[31.98094,-25.95465],[31.86878,-26.00373],[31.41621,-25.72777],[31.32291,-25.74386],[31.25046,-25.82965],[31.1393,-25.91627],[31.11647,-25.99124],[30.96561,-26.26658],[30.89217,-26.32797],[30.85346,-26.40356],[30.82269,-26.44888],[30.80226,-26.52407],[30.80384,-26.80821],[30.90209,-26.78075],[30.91003,-26.84895],[30.98249,-26.90826],[30.97653,-27.00292],[31.00344,-27.04416],[31.15433,-27.19804],[31.50156,-27.31112],[31.97002,-27.31112],[31.97002,-27.12047],[31.97697,-27.05066],[32.00025,-26.79839],[32.10698,-26.79846],[32.31145,-26.84795],[32.89999,-26.85161],[32.88609,-26.9817],[32.70943,-27.47854],[32.62407,-27.77751],[32.5814,-28.07479],[32.53872,-28.2288],[32.42756,-28.50216],[32.36404,-28.59457],[32.07026,-28.84698],[31.98788,-28.90695],[31.77648,-28.96949],[31.46385,-29.28593],[31.35963,-29.38543],[31.16808,-29.63074],[31.06486,-29.78935],[31.05345,-29.84705],[31.06699,-29.86403],[31.04555,-29.9502],[30.95186,-30.00339],[30.86518,-30.10241],[30.72447,-30.3925],[30.35563,-30.93089],[30.09724,-31.24583],[29.86731,-31.43043],[29.74094,-31.50147],[29.48131,-31.69787],[28.89432,-32.28989],[28.54971,-32.58946],[28.14365,-32.83207],[28.07487,-32.94169],[27.84509,-33.08287],[27.3758,-33.38607],[26.88054,-33.6459],[26.59169,-33.74808],[26.45273,-33.79358],[26.20675,-33.75489],[26.00779,-33.7224],[25.80555,-33.75243],[25.75111,-33.80065],[25.65291,-33.85436],[25.65291,-33.94698],[25.71958,-34.00401],[25.72028,-34.05112],[25.55089,-34.06315],[25.35046,-34.05026],[25.28106,-34.00203],[25.04763,-33.99946],[24.95472,-34.00436],[24.94966,-34.10104],[24.87704,-34.15065],[24.87629,-34.20053],[24.85326,-34.21896],[24.76453,-34.20179],[24.50014,-34.20033],[24.34867,-34.11638],[24.19888,-34.1019],[23.99634,-34.05144],[23.80175,-34.05243],[23.74936,-34.01119],[23.49735,-34.00901],[23.41552,-34.04346],[23.41543,-34.11404],[22.90009,-34.0993],[22.84124,-34.05479],[22.64703,-34.05026],[22.64598,-34.00728],[22.57002,-34.00641],[22.50505,-34.06459],[22.252,-34.06459],[22.22213,-34.10147],[22.16212,-34.1057],[22.17124,-34.15218],[22.15769,-34.21809],[22.00156,-34.21722],[21.9497,-34.322],[21.86115,-34.40071],[21.56147,-34.40201],[21.5468,-34.36612],[21.50174,-34.36699],[21.5007,-34.40201],[21.41949,-34.44652],[21.19787,-34.44782],[21.09882,-34.39913],[21.00337,-34.37539],[20.89319,-34.39971],[20.89766,-34.4854],[20.74468,-34.48281],[20.5042,-34.48626],[20.25272,-34.70148],[20.08035,-34.83619],[19.99233,-34.83791],[19.89907,-34.82758],[19.89383,-34.7936],[19.5973,-34.79618],[19.39297,-34.64202],[19.28771,-34.64048],[19.28614,-34.59866],[19.34744,-34.52445],[19.32853,-34.45344],[19.098,-34.44998],[19.07256,-34.38024],[19.00235,-34.35256],[18.95206,-34.39494],[18.7975,-34.39364],[18.79842,-34.10164],[18.50175,-34.10153],[18.49995,-34.36169],[18.44773,-34.362],[18.44799,-34.35227],[18.39744,-34.3514],[18.39717,-34.3023],[18.35657,-34.30056],[18.34793,-34.20204],[18.29721,-34.19503],[18.29511,-33.99371],[18.33745,-33.99141],[18.34766,-33.84924],[18.34793,-33.78155],[18.41247,-33.74488],[18.36155,-33.65016],[18.2992,-33.58559],[18.21668,-33.44887],[18.13899,-33.39741],[17.94735,-33.16026],[17.88552,-33.05757],[17.84859,-32.96685],[17.83968,-32.85073],[17.83968,-32.79834]]],best:true},{id:"South-Tyrol-Orthofoto2011",name:"South Tyrol Orthofoto 2011",type:"tms",template:"https://geoservices.buergernetz.bz.it/geoserver/gwc/service/wmts/?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=P_BZ_OF_2011_EPSG3857&STYLE=default&TILEMATRIXSET=GoogleMapsCompatible&TILEMATRIX=GoogleMapsCompatible%3A{zoom}&TILEROW={y}&TILECOL={x}&FORMAT=image%2Fjpeg",endDate:"2011-01-01T00:00:00.000Z",startDate:"2011-01-01T00:00:00.000Z",zoomExtent:[0,18],polygon:[[[10.38615,46.68821],[10.39201,46.69016],[10.40215,46.70624],[10.41274,46.70821],[10.41622,46.71479],[10.4168,46.71847],[10.39934,46.73435],[10.43464,46.75356],[10.44107,46.75413],[10.44011,46.77149],[10.42123,46.78861],[10.42845,46.79755],[10.43851,46.79869],[10.44925,46.80462],[10.45602,46.81635],[10.45438,46.82221],[10.4583,46.82478],[10.45513,46.83059],[10.45906,46.83548],[10.46483,46.83624],[10.46229,46.8413],[10.46987,46.84933],[10.46819,46.8553],[10.47838,46.86013],[10.48372,46.85543],[10.49628,46.85305],[10.49931,46.84857],[10.52124,46.84653],[10.5527,46.8511],[10.55795,46.84695],[10.55264,46.8408],[10.55536,46.84087],[10.58883,46.85125],[10.59502,46.85829],[10.60936,46.8597],[10.62441,46.86558],[10.64858,46.86655],[10.66787,46.87651],[10.67297,46.87138],[10.69112,46.86861],[10.69786,46.86339],[10.69508,46.85308],[10.70594,46.84786],[10.71763,46.84795],[10.72333,46.83892],[10.75621,46.83383],[10.76481,46.82409],[10.76387,46.81971],[10.75239,46.81387],[10.74506,46.80223],[10.7276,46.79709],[10.73122,46.78925],[10.75722,46.78624],[10.77744,46.79149],[10.78678,46.79735],[10.81439,46.77662],[10.82479,46.77472],[10.83129,46.78138],[10.84112,46.78282],[10.85354,46.77506],[10.86845,46.77313],[10.86993,46.7669],[10.88294,46.76393],[10.88962,46.76529],[10.8951,46.77092],[10.90527,46.76911],[10.92299,46.7764],[10.92821,46.77408],[10.94388,46.77648],[10.97522,46.77361],[10.97932,46.77014],[10.99475,46.76804],[11.01397,46.77317],[11.02328,46.76715],[11.0346,46.79428],[11.04234,46.801],[11.03792,46.80562],[11.05633,46.80928],[11.07279,46.82092],[11.08171,46.82252],[11.0762,46.83384],[11.06887,46.83793],[11.07303,46.84345],[11.06988,46.85348],[11.08742,46.87927],[11.09961,46.88922],[11.09538,46.89178],[11.09795,46.89844],[11.0946,46.91247],[11.10792,46.91706],[11.10804,46.92632],[11.11418,46.93234],[11.13851,46.92865],[11.16322,46.94091],[11.16642,46.94479],[11.16114,46.94979],[11.1637,46.96677],[11.17598,46.96367],[11.18658,46.97062],[11.19527,46.97152],[11.20418,46.96877],[11.20688,46.96403],[11.22047,46.97025],[11.24139,46.9708],[11.24865,46.97517],[11.25582,46.97535],[11.26272,46.98169],[11.27662,46.98168],[11.28762,46.98699],[11.30709,46.98525],[11.3205,46.99345],[11.33765,46.98606],[11.34516,46.99169],[11.35932,46.99154],[11.37697,46.98025],[11.38324,46.97168],[11.40465,46.96609],[11.43929,46.97601],[11.45134,46.99294],[11.46803,46.99582],[11.46859,47.003],[11.47831,47.01201],[11.50238,47.01073],[11.50313,47.00808],[11.51366,47.00595],[11.51679,47.00091],[11.53381,46.99233],[11.53846,46.98519],[11.55297,46.99149],[11.57663,46.99657],[11.58,47.00277],[11.58879,47.00641],[11.59901,47.00657],[11.60944,47.01207],[11.62697,47.01437],[11.63629,47.00383],[11.66542,46.99304],[11.6885,46.99658],[11.71226,46.99416],[11.72897,46.97322],[11.74698,46.97013],[11.76411,46.97412],[11.78106,46.99342],[11.81526,46.991],[11.83564,46.99417],[11.84396,47.0025],[11.85192,47.0014],[11.86722,47.01252],[11.87393,47.01136],[11.8794,47.01714],[11.89137,47.01728],[11.91627,47.03422],[11.9329,47.03864],[11.94688,47.03464],[11.95457,47.04374],[11.96773,47.04158],[11.97912,47.0511],[11.98587,47.04815],[11.99534,47.05064],[12.02037,47.04821],[12.02968,47.05127],[12.03353,47.0583],[12.04276,47.06228],[12.07543,47.0605],[12.08035,47.06951],[12.09308,47.07791],[12.10329,47.07931],[12.11867,47.07445],[12.13561,47.08171],[12.15125,47.08049],[12.15997,47.08267],[12.18589,47.09322],[12.2278,47.08302],[12.24228,47.06892],[12.23786,47.0644],[12.21821,47.05795],[12.2182,47.04483],[12.20552,47.02595],[12.18048,47.02414],[12.16423,47.01782],[12.14786,47.02357],[12.12723,47.01218],[12.12285,47.00662],[12.1322,46.99339],[12.12974,46.98593],[12.13977,46.982],[12.13808,46.96514],[12.13328,46.96292],[12.13882,46.95764],[12.15927,46.95133],[12.1702,46.93758],[12.15414,46.91654],[12.14675,46.91413],[12.16205,46.908],[12.16959,46.91121],[12.19154,46.90682],[12.20106,46.8965],[12.2022,46.88806],[12.21663,46.87517],[12.22147,46.88084],[12.23125,46.88146],[12.2345,46.88919],[12.24162,46.89192],[12.27486,46.88512],[12.27979,46.87921],[12.27736,46.87319],[12.29326,46.86566],[12.2912,46.85704],[12.29733,46.84455],[12.30833,46.84137],[12.30726,46.83271],[12.285,46.81503],[12.29383,46.8027],[12.28905,46.79948],[12.28889,46.79427],[12.28232,46.79153],[12.28539,46.7839],[12.30943,46.78603],[12.35837,46.77583],[12.37036,46.74163],[12.38475,46.71745],[12.40283,46.70811],[12.41103,46.70701],[12.41522,46.70163],[12.42862,46.6997],[12.42943,46.69567],[12.44268,46.68979],[12.47501,46.68756],[12.4795,46.67969],[12.43473,46.66714],[12.40648,46.64167],[12.38115,46.64183],[12.37944,46.63733],[12.3915,46.62765],[12.38577,46.62154],[12.35939,46.61829],[12.34465,46.62376],[12.34034,46.63022],[12.33578,46.62732],[12.3172,46.62876],[12.31785,46.62355],[12.30802,46.61811],[12.28413,46.61623],[12.26982,46.62003],[12.25931,46.62809],[12.24502,46.62326],[12.24198,46.61586],[12.21241,46.60918],[12.20444,46.59836],[12.19228,46.59321],[12.19261,46.62059],[12.1818,46.6192],[12.17117,46.63275],[12.16062,46.63574],[12.1511,46.63215],[12.1436,46.6327],[12.13739,46.64122],[12.12342,46.64475],[12.10949,46.65204],[12.10609,46.65783],[12.09345,46.66123],[12.08826,46.66638],[12.07985,46.66686],[12.07038,46.67386],[12.07173,46.66064],[12.06686,46.65364],[12.07479,46.64329],[12.06837,46.63997],[12.06495,46.62121],[12.05448,46.61778],[12.05318,46.60989],[12.04613,46.60716],[12.05043,46.60016],[12.04763,46.58357],[12.03665,46.57668],[12.0266,46.55871],[12.02189,46.55791],[11.99941,46.53208],[11.99411,46.53345],[11.98704,46.54417],[11.96633,46.54363],[11.95094,46.53869],[11.94719,46.52879],[11.94147,46.52689],[11.93294,46.52631],[11.9121,46.532],[11.8904,46.52175],[11.85192,46.51682],[11.82849,46.50783],[11.82334,46.51315],[11.82391,46.52141],[11.81086,46.53146],[11.79385,46.52023],[11.79189,46.51322],[11.76157,46.50503],[11.74317,46.50391],[11.73202,46.50877],[11.71935,46.50916],[11.71524,46.51245],[11.69889,46.50218],[11.6672,46.49647],[11.64515,46.49743],[11.63849,46.50051],[11.63495,46.49486],[11.64297,46.49346],[11.65174,46.48271],[11.64536,46.47189],[11.64179,46.47439],[11.62679,46.4708],[11.62987,46.46377],[11.61882,46.44325],[11.62143,46.42539],[11.60161,46.39731],[11.60307,46.38924],[11.5932,46.38265],[11.56489,46.38018],[11.55878,46.35076],[11.55249,46.34418],[11.54423,46.34483],[11.53837,46.35015],[11.52445,46.35502],[11.47969,46.36277],[11.48052,46.3551],[11.46322,46.34922],[11.45556,46.33396],[11.42105,46.32441],[11.40517,46.32387],[11.39865,46.31426],[11.39994,46.30709],[11.39569,46.3083],[11.38188,46.30052],[11.36088,46.29906],[11.36078,46.29682],[11.38256,46.29177],[11.3871,46.28143],[11.39609,46.27423],[11.39862,46.264],[11.38756,46.26029],[11.37347,46.2629],[11.36836,46.26135],[11.35783,46.26481],[11.35495,46.27564],[11.33912,46.28306],[11.33379,46.29049],[11.33471,46.2962],[11.3129,46.28256],[11.31737,46.27303],[11.30645,46.25786],[11.29124,46.2604],[11.24743,46.22933],[11.20622,46.2187],[11.18267,46.22496],[11.17077,46.23806],[11.17994,46.24434],[11.18351,46.25269],[11.18935,46.25354],[11.19448,46.2461],[11.20029,46.25566],[11.16604,46.26129],[11.14885,46.27904],[11.13725,46.28336],[11.14293,46.28934],[11.15847,46.29059],[11.16439,46.2986],[11.1761,46.30346],[11.1847,46.32104],[11.18894,46.32151],[11.18696,46.32673],[11.1942,46.33016],[11.20204,46.34212],[11.19001,46.35984],[11.19263,46.36578],[11.20393,46.36765],[11.19792,46.37232],[11.21275,46.39804],[11.21345,46.40675],[11.20565,46.4166],[11.21026,46.4206],[11.20347,46.42682],[11.21416,46.43556],[11.21634,46.44255],[11.20903,46.45293],[11.21419,46.45807],[11.21736,46.45731],[11.21886,46.46199],[11.21626,46.47277],[11.20939,46.481],[11.20876,46.49346],[11.19608,46.50241],[11.1924,46.501],[11.18686,46.50734],[11.18002,46.49823],[11.17014,46.49635],[11.16095,46.4878],[11.12934,46.48058],[11.1103,46.49643],[11.10449,46.4948],[11.08812,46.50128],[11.08173,46.53021],[11.05915,46.51508],[11.03795,46.51357],[11.05006,46.50784],[11.05773,46.49235],[11.06278,46.4894],[11.06894,46.46619],[11.07625,46.45487],[11.0778,46.44569],[11.07301,46.44042],[11.05394,46.44849],[11.0414,46.44569],[11.02817,46.46116],[11.00952,46.46917],[11.00462,46.47607],[10.98695,46.48289],[10.96543,46.48103],[10.95791,46.46983],[10.93819,46.46578],[10.9325,46.45831],[10.93332,46.4528],[10.91305,46.44284],[10.89161,46.44366],[10.88324,46.44995],[10.88093,46.44579],[10.87162,46.4438],[10.86174,46.43509],[10.85113,46.43817],[10.80034,46.44185],[10.78906,46.45164],[10.77835,46.47112],[10.76934,46.47609],[10.76463,46.4848],[10.75906,46.48547],[10.74422,46.48333],[10.71753,46.46022],[10.69667,46.4573],[10.68293,46.44846],[10.66821,46.45122],[10.63303,46.44309],[10.61439,46.45098],[10.60128,46.46139],[10.59995,46.46766],[10.57672,46.47237],[10.55875,46.48187],[10.54986,46.49123],[10.53685,46.49062],[10.52657,46.49425],[10.49366,46.49719],[10.48141,46.49337],[10.45714,46.5096],[10.45124,46.53083],[10.45814,46.54215],[10.47056,46.54377],[10.46954,46.54856],[10.47617,46.55749],[10.47321,46.56701],[10.48305,46.5777],[10.48575,46.58921],[10.48221,46.59199],[10.48576,46.59805],[10.48291,46.60512],[10.49055,46.61394],[10.44632,46.63989],[10.40935,46.63389],[10.40011,46.63648],[10.39873,46.6455],[10.38946,46.65862],[10.39057,46.67089],[10.3803,46.68399],[10.38615,46.68821]]],terms_url:"https://geoservices.buergernetz.bz.it/geokatalog",terms_text:"© Autonomen Provinz Bozen/Provincia Autonoma di Bolzano CC-BY 3.0"},{id:"South-Tyrol-Orthofoto2011-20cm",name:"South Tyrol Orthofoto 2011 (highres)",type:"wms",template:"https://geoservices.buergernetz.bz.it/geoserver/ows?SERVICE=WMS&FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=P_BZ_OF_2011_EPSG3857,P_BZ_OF_2011_20cm_EPSG3857&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2011-01-01T00:00:00.000Z",startDate:"2011-01-01T00:00:00.000Z",polygon:[[[10.38615,46.68821],[10.39201,46.69016],[10.40215,46.70624],[10.41274,46.70821],[10.41622,46.71479],[10.4168,46.71847],[10.39934,46.73435],[10.43464,46.75356],[10.44107,46.75413],[10.44011,46.77149],[10.42123,46.78861],[10.42845,46.79755],[10.43851,46.79869],[10.44925,46.80462],[10.45602,46.81635],[10.45438,46.82221],[10.4583,46.82478],[10.45513,46.83059],[10.45906,46.83548],[10.46483,46.83624],[10.46229,46.8413],[10.46987,46.84933],[10.46819,46.8553],[10.47838,46.86013],[10.48372,46.85543],[10.49628,46.85305],[10.49931,46.84857],[10.52124,46.84653],[10.5527,46.8511],[10.55795,46.84695],[10.55264,46.8408],[10.55536,46.84087],[10.58883,46.85125],[10.59502,46.85829],[10.60936,46.8597],[10.62441,46.86558],[10.64858,46.86655],[10.66787,46.87651],[10.67297,46.87138],[10.69112,46.86861],[10.69786,46.86339],[10.69508,46.85308],[10.70594,46.84786],[10.71763,46.84795],[10.72333,46.83892],[10.75621,46.83383],[10.76481,46.82409],[10.76387,46.81971],[10.75239,46.81387],[10.74506,46.80223],[10.7276,46.79709],[10.73122,46.78925],[10.75722,46.78624],[10.77744,46.79149],[10.78678,46.79735],[10.81439,46.77662],[10.82479,46.77472],[10.83129,46.78138],[10.84112,46.78282],[10.85354,46.77506],[10.86845,46.77313],[10.86993,46.7669],[10.88294,46.76393],[10.88962,46.76529],[10.8951,46.77092],[10.90527,46.76911],[10.92299,46.7764],[10.92821,46.77408],[10.94388,46.77648],[10.97522,46.77361],[10.97932,46.77014],[10.99475,46.76804],[11.01397,46.77317],[11.02328,46.76715],[11.0346,46.79428],[11.04234,46.801],[11.03792,46.80562],[11.05633,46.80928],[11.07279,46.82092],[11.08171,46.82252],[11.0762,46.83384],[11.06887,46.83793],[11.07303,46.84345],[11.06988,46.85348],[11.08742,46.87927],[11.09961,46.88922],[11.09538,46.89178],[11.09795,46.89844],[11.0946,46.91247],[11.10792,46.91706],[11.10804,46.92632],[11.11418,46.93234],[11.13851,46.92865],[11.16322,46.94091],[11.16642,46.94479],[11.16114,46.94979],[11.1637,46.96677],[11.17598,46.96367],[11.18658,46.97062],[11.19527,46.97152],[11.20418,46.96877],[11.20688,46.96403],[11.22047,46.97025],[11.24139,46.9708],[11.24865,46.97517],[11.25582,46.97535],[11.26272,46.98169],[11.27662,46.98168],[11.28762,46.98699],[11.30709,46.98525],[11.3205,46.99345],[11.33765,46.98606],[11.34516,46.99169],[11.35932,46.99154],[11.37697,46.98025],[11.38324,46.97168],[11.40465,46.96609],[11.43929,46.97601],[11.45134,46.99294],[11.46803,46.99582],[11.46859,47.003],[11.47831,47.01201],[11.50238,47.01073],[11.50313,47.00808],[11.51366,47.00595],[11.51679,47.00091],[11.53381,46.99233],[11.53846,46.98519],[11.55297,46.99149],[11.57663,46.99657],[11.58,47.00277],[11.58879,47.00641],[11.59901,47.00657],[11.60944,47.01207],[11.62697,47.01437],[11.63629,47.00383],[11.66542,46.99304],[11.6885,46.99658],[11.71226,46.99416],[11.72897,46.97322],[11.74698,46.97013],[11.76411,46.97412],[11.78106,46.99342],[11.81526,46.991],[11.83564,46.99417],[11.84396,47.0025],[11.85192,47.0014],[11.86722,47.01252],[11.87393,47.01136],[11.8794,47.01714],[11.89137,47.01728],[11.91627,47.03422],[11.9329,47.03864],[11.94688,47.03464],[11.95457,47.04374],[11.96773,47.04158],[11.97912,47.0511],[11.98587,47.04815],[11.99534,47.05064],[12.02037,47.04821],[12.02968,47.05127],[12.03353,47.0583],[12.04276,47.06228],[12.07543,47.0605],[12.08035,47.06951],[12.09308,47.07791],[12.10329,47.07931],[12.11867,47.07445],[12.13561,47.08171],[12.15125,47.08049],[12.15997,47.08267],[12.18589,47.09322],[12.2278,47.08302],[12.24228,47.06892],[12.23786,47.0644],[12.21821,47.05795],[12.2182,47.04483],[12.20552,47.02595],[12.18048,47.02414],[12.16423,47.01782],[12.14786,47.02357],[12.12723,47.01218],[12.12285,47.00662],[12.1322,46.99339],[12.12974,46.98593],[12.13977,46.982],[12.13808,46.96514],[12.13328,46.96292],[12.13882,46.95764],[12.15927,46.95133],[12.1702,46.93758],[12.15414,46.91654],[12.14675,46.91413],[12.16205,46.908],[12.16959,46.91121],[12.19154,46.90682],[12.20106,46.8965],[12.2022,46.88806],[12.21663,46.87517],[12.22147,46.88084],[12.23125,46.88146],[12.2345,46.88919],[12.24162,46.89192],[12.27486,46.88512],[12.27979,46.87921],[12.27736,46.87319],[12.29326,46.86566],[12.2912,46.85704],[12.29733,46.84455],[12.30833,46.84137],[12.30726,46.83271],[12.285,46.81503],[12.29383,46.8027],[12.28905,46.79948],[12.28889,46.79427],[12.28232,46.79153],[12.28539,46.7839],[12.30943,46.78603],[12.35837,46.77583],[12.37036,46.74163],[12.38475,46.71745],[12.40283,46.70811],[12.41103,46.70701],[12.41522,46.70163],[12.42862,46.6997],[12.42943,46.69567],[12.44268,46.68979],[12.47501,46.68756],[12.4795,46.67969],[12.43473,46.66714],[12.40648,46.64167],[12.38115,46.64183],[12.37944,46.63733],[12.3915,46.62765],[12.38577,46.62154],[12.35939,46.61829],[12.34465,46.62376],[12.34034,46.63022],[12.33578,46.62732],[12.3172,46.62876],[12.31785,46.62355],[12.30802,46.61811],[12.28413,46.61623],[12.26982,46.62003],[12.25931,46.62809],[12.24502,46.62326],[12.24198,46.61586],[12.21241,46.60918],[12.20444,46.59836],[12.19228,46.59321],[12.19261,46.62059],[12.1818,46.6192],[12.17117,46.63275],[12.16062,46.63574],[12.1511,46.63215],[12.1436,46.6327],[12.13739,46.64122],[12.12342,46.64475],[12.10949,46.65204],[12.10609,46.65783],[12.09345,46.66123],[12.08826,46.66638],[12.07985,46.66686],[12.07038,46.67386],[12.07173,46.66064],[12.06686,46.65364],[12.07479,46.64329],[12.06837,46.63997],[12.06495,46.62121],[12.05448,46.61778],[12.05318,46.60989],[12.04613,46.60716],[12.05043,46.60016],[12.04763,46.58357],[12.03665,46.57668],[12.0266,46.55871],[12.02189,46.55791],[11.99941,46.53208],[11.99411,46.53345],[11.98704,46.54417],[11.96633,46.54363],[11.95094,46.53869],[11.94719,46.52879],[11.94147,46.52689],[11.93294,46.52631],[11.9121,46.532],[11.8904,46.52175],[11.85192,46.51682],[11.82849,46.50783],[11.82334,46.51315],[11.82391,46.52141],[11.81086,46.53146],[11.79385,46.52023],[11.79189,46.51322],[11.76157,46.50503],[11.74317,46.50391],[11.73202,46.50877],[11.71935,46.50916],[11.71524,46.51245],[11.69889,46.50218],[11.6672,46.49647],[11.64515,46.49743],[11.63849,46.50051],[11.63495,46.49486],[11.64297,46.49346],[11.65174,46.48271],[11.64536,46.47189],[11.64179,46.47439],[11.62679,46.4708],[11.62987,46.46377],[11.61882,46.44325],[11.62143,46.42539],[11.60161,46.39731],[11.60307,46.38924],[11.5932,46.38265],[11.56489,46.38018],[11.55878,46.35076],[11.55249,46.34418],[11.54423,46.34483],[11.53837,46.35015],[11.52445,46.35502],[11.47969,46.36277],[11.48052,46.3551],[11.46322,46.34922],[11.45556,46.33396],[11.42105,46.32441],[11.40517,46.32387],[11.39865,46.31426],[11.39994,46.30709],[11.39569,46.3083],[11.38188,46.30052],[11.36088,46.29906],[11.36078,46.29682],[11.38256,46.29177],[11.3871,46.28143],[11.39609,46.27423],[11.39862,46.264],[11.38756,46.26029],[11.37347,46.2629],[11.36836,46.26135],[11.35783,46.26481],[11.35495,46.27564],[11.33912,46.28306],[11.33379,46.29049],[11.33471,46.2962],[11.3129,46.28256],[11.31737,46.27303],[11.30645,46.25786],[11.29124,46.2604],[11.24743,46.22933],[11.20622,46.2187],[11.18267,46.22496],[11.17077,46.23806],[11.17994,46.24434],[11.18351,46.25269],[11.18935,46.25354],[11.19448,46.2461],[11.20029,46.25566],[11.16604,46.26129],[11.14885,46.27904],[11.13725,46.28336],[11.14293,46.28934],[11.15847,46.29059],[11.16439,46.2986],[11.1761,46.30346],[11.1847,46.32104],[11.18894,46.32151],[11.18696,46.32673],[11.1942,46.33016],[11.20204,46.34212],[11.19001,46.35984],[11.19263,46.36578],[11.20393,46.36765],[11.19792,46.37232],[11.21275,46.39804],[11.21345,46.40675],[11.20565,46.4166],[11.21026,46.4206],[11.20347,46.42682],[11.21416,46.43556],[11.21634,46.44255],[11.20903,46.45293],[11.21419,46.45807],[11.21736,46.45731],[11.21886,46.46199],[11.21626,46.47277],[11.20939,46.481],[11.20876,46.49346],[11.19608,46.50241],[11.1924,46.501],[11.18686,46.50734],[11.18002,46.49823],[11.17014,46.49635],[11.16095,46.4878],[11.12934,46.48058],[11.1103,46.49643],[11.10449,46.4948],[11.08812,46.50128],[11.08173,46.53021],[11.05915,46.51508],[11.03795,46.51357],[11.05006,46.50784],[11.05773,46.49235],[11.06278,46.4894],[11.06894,46.46619],[11.07625,46.45487],[11.0778,46.44569],[11.07301,46.44042],[11.05394,46.44849],[11.0414,46.44569],[11.02817,46.46116],[11.00952,46.46917],[11.00462,46.47607],[10.98695,46.48289],[10.96543,46.48103],[10.95791,46.46983],[10.93819,46.46578],[10.9325,46.45831],[10.93332,46.4528],[10.91305,46.44284],[10.89161,46.44366],[10.88324,46.44995],[10.88093,46.44579],[10.87162,46.4438],[10.86174,46.43509],[10.85113,46.43817],[10.80034,46.44185],[10.78906,46.45164],[10.77835,46.47112],[10.76934,46.47609],[10.76463,46.4848],[10.75906,46.48547],[10.74422,46.48333],[10.71753,46.46022],[10.69667,46.4573],[10.68293,46.44846],[10.66821,46.45122],[10.63303,46.44309],[10.61439,46.45098],[10.60128,46.46139],[10.59995,46.46766],[10.57672,46.47237],[10.55875,46.48187],[10.54986,46.49123],[10.53685,46.49062],[10.52657,46.49425],[10.49366,46.49719],[10.48141,46.49337],[10.45714,46.5096],[10.45124,46.53083],[10.45814,46.54215],[10.47056,46.54377],[10.46954,46.54856],[10.47617,46.55749],[10.47321,46.56701],[10.48305,46.5777],[10.48575,46.58921],[10.48221,46.59199],[10.48576,46.59805],[10.48291,46.60512],[10.49055,46.61394],[10.44632,46.63989],[10.40935,46.63389],[10.40011,46.63648],[10.39873,46.6455],[10.38946,46.65862],[10.39057,46.67089],[10.3803,46.68399],[10.38615,46.68821]]],terms_url:"https://geoservices.buergernetz.bz.it/geokatalog",terms_text:"© Autonomen Provinz Bozen/Provincia Autonoma di Bolzano CC-BY 3.0",description:"Orthophoto of South Tyrol from 2011 with up to 20cm resolution (larger valleys)"},{id:"South-Tyrol-Orthofoto2014",name:"South Tyrol Orthofoto 2014",type:"tms",template:"https://geoservices.buergernetz.bz.it/geoserver/gwc/service/wmts/?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=P_BZ_OF_2014_EPSG3857&STYLE=default&TILEMATRIXSET=GoogleMapsCompatible&TILEMATRIX=GoogleMapsCompatible%3A{zoom}&TILEROW={y}&TILECOL={x}&FORMAT=image%2Fjpeg",endDate:"2014-01-01T00:00:00.000Z",startDate:"2014-01-01T00:00:00.000Z",zoomExtent:[0,18],polygon:[[[11.71495,46.51227],[11.69889,46.50218],[11.6672,46.49647],[11.64515,46.49743],[11.63849,46.50051],[11.63495,46.49486],[11.64297,46.49346],[11.65174,46.48271],[11.64536,46.47189],[11.64179,46.47439],[11.62679,46.4708],[11.62987,46.46377],[11.61882,46.44325],[11.61936,46.43957],[11.62508,46.43957],[11.62508,46.44797],[11.63349,46.44587],[11.63769,46.45846],[11.64399,46.45846],[11.6608,46.44587],[11.66711,46.44587],[11.66711,46.47525],[11.69442,46.47735],[11.69652,46.48575],[11.70913,46.49624],[11.70913,46.50254],[11.71333,46.50254],[11.71495,46.51227]],[[11.61435,46.41535],[11.60161,46.39731],[11.60307,46.38924],[11.5932,46.38265],[11.56489,46.38018],[11.55878,46.35076],[11.55249,46.34418],[11.54423,46.34483],[11.53837,46.35015],[11.52445,46.35502],[11.47969,46.36277],[11.48052,46.3551],[11.46322,46.34922],[11.45556,46.33396],[11.42105,46.32441],[11.40517,46.32387],[11.39865,46.31426],[11.39994,46.30709],[11.39569,46.3083],[11.38188,46.30052],[11.36088,46.29906],[11.36078,46.29682],[11.38256,46.29177],[11.3871,46.28143],[11.39609,46.27423],[11.39862,46.264],[11.38756,46.26029],[11.37347,46.2629],[11.36836,46.26135],[11.35783,46.26481],[11.35495,46.27564],[11.33912,46.28306],[11.33379,46.29049],[11.33471,46.2962],[11.3129,46.28256],[11.31737,46.27303],[11.30645,46.25786],[11.29124,46.2604],[11.24743,46.22933],[11.20622,46.2187],[11.18267,46.22496],[11.17077,46.23806],[11.17994,46.24434],[11.18351,46.25269],[11.18935,46.25354],[11.19448,46.2461],[11.20029,46.25566],[11.16604,46.26129],[11.14885,46.27904],[11.13725,46.28336],[11.14293,46.28934],[11.15847,46.29059],[11.16439,46.2986],[11.1761,46.30346],[11.1847,46.32104],[11.18894,46.32151],[11.18696,46.32673],[11.1942,46.33016],[11.20204,46.34212],[11.19001,46.35984],[11.19263,46.36578],[11.20393,46.36765],[11.19792,46.37232],[11.21275,46.39804],[11.21345,46.40675],[11.20644,46.4156],[11.20485,46.3997],[11.17754,46.3997],[11.17543,46.3871],[11.16703,46.38081],[11.16703,46.36821],[11.16283,46.36821],[11.16283,46.29895],[11.12501,46.29895],[11.12291,46.25488],[11.13131,46.25278],[11.12711,46.24858],[11.16283,46.24858],[11.16283,46.215],[11.24898,46.2129],[11.25108,46.2234],[11.2889,46.2234],[11.2889,46.24019],[11.3015,46.25278],[11.30991,46.25278],[11.31201,46.24858],[11.33722,46.25068],[11.34143,46.26747],[11.34563,46.26747],[11.34773,46.25698],[11.35613,46.24858],[11.41707,46.25278],[11.41917,46.32414],[11.49271,46.32204],[11.48851,46.33044],[11.49901,46.32834],[11.50111,46.34723],[11.52423,46.34723],[11.53894,46.34513],[11.53894,46.32834],[11.55995,46.32414],[11.58306,46.34932],[11.58306,46.37241],[11.60407,46.37241],[11.60617,46.38291],[11.61458,46.38291],[11.62508,46.3934],[11.62508,46.41229],[11.61435,46.41535]],[[11.20663,46.41745],[11.21026,46.4206],[11.20347,46.42682],[11.21416,46.43556],[11.21634,46.44255],[11.20903,46.45293],[11.21419,46.45807],[11.21736,46.45731],[11.21886,46.46199],[11.21626,46.47277],[11.20939,46.481],[11.20876,46.49346],[11.19608,46.50241],[11.1924,46.501],[11.18686,46.50734],[11.18002,46.49823],[11.17014,46.49635],[11.16095,46.4878],[11.12934,46.48058],[11.1103,46.49643],[11.10449,46.4948],[11.08812,46.50128],[11.08173,46.53021],[11.05915,46.51508],[11.03795,46.51357],[11.05006,46.50784],[11.05773,46.49235],[11.06278,46.4894],[11.06894,46.46619],[11.07625,46.45487],[11.0778,46.44569],[11.07301,46.44042],[11.05394,46.44849],[11.0414,46.44569],[11.02817,46.46116],[11.00952,46.46917],[11.00462,46.47607],[10.98695,46.48289],[10.96543,46.48103],[10.96285,46.47718],[10.96952,46.45217],[10.98423,46.45217],[10.98843,46.44587],[10.99894,46.44587],[11.01154,46.42068],[11.04096,46.42068],[11.08088,46.43537],[11.08298,46.47525],[11.15232,46.47525],[11.18804,46.48365],[11.19014,46.47525],[11.20695,46.47315],[11.20485,46.44587],[11.19855,46.44167],[11.19435,46.42698],[11.19014,46.42698],[11.19014,46.42068],[11.20695,46.42068],[11.20663,46.41745]],[[10.47433,46.55501],[10.47617,46.55749],[10.47321,46.56701],[10.48305,46.5777],[10.48575,46.58921],[10.48221,46.59199],[10.48576,46.59805],[10.48291,46.60512],[10.49055,46.61394],[10.46952,46.62628],[10.47785,46.61797],[10.47785,46.59069],[10.47365,46.59069],[10.47155,46.5676],[10.46314,46.55501],[10.47433,46.55501]],[[10.46925,46.62643],[10.44632,46.63989],[10.40935,46.63389],[10.40011,46.63648],[10.39873,46.6455],[10.38946,46.65862],[10.39057,46.67089],[10.3803,46.68399],[10.38615,46.68821],[10.39201,46.69016],[10.40215,46.70624],[10.41274,46.70821],[10.41622,46.71479],[10.4168,46.71847],[10.39934,46.73435],[10.43464,46.75356],[10.44107,46.75413],[10.44011,46.77149],[10.42123,46.78861],[10.42845,46.79755],[10.43626,46.79843],[10.43373,46.81106],[10.42532,46.80686],[10.42532,46.79847],[10.42112,46.79847],[10.41692,46.78587],[10.41692,46.75229],[10.3938,46.7376],[10.3896,46.72081],[10.3854,46.72081],[10.3791,46.69353],[10.3791,46.66834],[10.3833,46.66414],[10.3812,46.64735],[10.3896,46.64525],[10.3938,46.63056],[10.42532,46.62846],[10.44843,46.63476],[10.46925,46.62643]]],terms_url:"https://geoservices.buergernetz.bz.it/geokatalog/",terms_text:"© Autonomen Provinz Bozen/Provincia Autonoma di Bolzano CC-BY 3.0"},{id:"South-Tyrol-Orthofoto-2014-2015",name:"South Tyrol Orthofoto 2014/2015",type:"tms",template:"https://geoservices.buergernetz.bz.it/geoserver/gwc/service/wmts/?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=P_BZ_OF_2014_2015_EPSG3857&STYLE=default&TILEMATRIXSET=GoogleMapsCompatible&TILEMATRIX=GoogleMapsCompatible%3A{zoom}&TILEROW={y}&TILECOL={x}&FORMAT=image%2Fjpeg",endDate:"2015-11-01T00:00:00.000Z",startDate:"2014-07-01T00:00:00.000Z",zoomExtent:[0,18],polygon:[[[10.38615,46.68821],[10.39201,46.69016],[10.40215,46.70624],[10.41274,46.70821],[10.41622,46.71479],[10.4168,46.71847],[10.39934,46.73435],[10.43464,46.75356],[10.44107,46.75413],[10.44011,46.77149],[10.42123,46.78861],[10.42845,46.79755],[10.43851,46.79869],[10.44925,46.80462],[10.45602,46.81635],[10.45438,46.82221],[10.4583,46.82478],[10.45513,46.83059],[10.45906,46.83548],[10.46483,46.83624],[10.46229,46.8413],[10.46987,46.84933],[10.46819,46.8553],[10.47838,46.86013],[10.48372,46.85543],[10.49628,46.85305],[10.49931,46.84857],[10.52124,46.84653],[10.5527,46.8511],[10.55795,46.84695],[10.55264,46.8408],[10.55536,46.84087],[10.58883,46.85125],[10.59502,46.85829],[10.60936,46.8597],[10.62441,46.86558],[10.64858,46.86655],[10.66787,46.87651],[10.67297,46.87138],[10.69112,46.86861],[10.69786,46.86339],[10.69508,46.85308],[10.70594,46.84786],[10.71763,46.84795],[10.72333,46.83892],[10.75621,46.83383],[10.76481,46.82409],[10.76387,46.81971],[10.75239,46.81387],[10.74506,46.80223],[10.7276,46.79709],[10.73122,46.78925],[10.75722,46.78624],[10.77744,46.79149],[10.78678,46.79735],[10.81439,46.77662],[10.82479,46.77472],[10.83129,46.78138],[10.84112,46.78282],[10.85354,46.77506],[10.86845,46.77313],[10.86993,46.7669],[10.88294,46.76393],[10.88962,46.76529],[10.8951,46.77092],[10.90527,46.76911],[10.92299,46.7764],[10.92821,46.77408],[10.94388,46.77648],[10.97522,46.77361],[10.97932,46.77014],[10.99475,46.76804],[11.01397,46.77317],[11.02328,46.76715],[11.0346,46.79428],[11.04234,46.801],[11.03792,46.80562],[11.05633,46.80928],[11.07279,46.82092],[11.08171,46.82252],[11.0762,46.83384],[11.06887,46.83793],[11.07303,46.84345],[11.06988,46.85348],[11.08742,46.87927],[11.09961,46.88922],[11.09538,46.89178],[11.09795,46.89844],[11.0946,46.91247],[11.10792,46.91706],[11.10804,46.92632],[11.11418,46.93234],[11.13851,46.92865],[11.16322,46.94091],[11.16642,46.94479],[11.16114,46.94979],[11.1637,46.96677],[11.17598,46.96367],[11.18658,46.97062],[11.19527,46.97152],[11.20418,46.96877],[11.20688,46.96403],[11.22047,46.97025],[11.24139,46.9708],[11.24865,46.97517],[11.25582,46.97535],[11.26272,46.98169],[11.27662,46.98168],[11.28762,46.98699],[11.30709,46.98525],[11.3205,46.99345],[11.33765,46.98606],[11.34516,46.99169],[11.35932,46.99154],[11.37697,46.98025],[11.38324,46.97168],[11.40465,46.96609],[11.43929,46.97601],[11.45134,46.99294],[11.46803,46.99582],[11.46859,47.003],[11.47831,47.01201],[11.50238,47.01073],[11.50313,47.00808],[11.51366,47.00595],[11.51679,47.00091],[11.53381,46.99233],[11.53846,46.98519],[11.55297,46.99149],[11.57663,46.99657],[11.58,47.00277],[11.58879,47.00641],[11.59901,47.00657],[11.60944,47.01207],[11.62697,47.01437],[11.63629,47.00383],[11.66542,46.99304],[11.6885,46.99658],[11.71226,46.99416],[11.72897,46.97322],[11.74698,46.97013],[11.76411,46.97412],[11.78106,46.99342],[11.81526,46.991],[11.83564,46.99417],[11.84396,47.0025],[11.85192,47.0014],[11.86722,47.01252],[11.87393,47.01136],[11.8794,47.01714],[11.89137,47.01728],[11.91627,47.03422],[11.9329,47.03864],[11.94688,47.03464],[11.95457,47.04374],[11.96773,47.04158],[11.97912,47.0511],[11.98587,47.04815],[11.99534,47.05064],[12.02037,47.04821],[12.02968,47.05127],[12.03353,47.0583],[12.04276,47.06228],[12.07543,47.0605],[12.08035,47.06951],[12.09308,47.07791],[12.10329,47.07931],[12.11867,47.07445],[12.13561,47.08171],[12.15125,47.08049],[12.15997,47.08267],[12.18589,47.09322],[12.2278,47.08302],[12.24228,47.06892],[12.23786,47.0644],[12.21821,47.05795],[12.2182,47.04483],[12.20552,47.02595],[12.18048,47.02414],[12.16423,47.01782],[12.14786,47.02357],[12.12723,47.01218],[12.12285,47.00662],[12.1322,46.99339],[12.12974,46.98593],[12.13977,46.982],[12.13808,46.96514],[12.13328,46.96292],[12.13882,46.95764],[12.15927,46.95133],[12.1702,46.93758],[12.15414,46.91654],[12.14675,46.91413],[12.16205,46.908],[12.16959,46.91121],[12.19154,46.90682],[12.20106,46.8965],[12.2022,46.88806],[12.21663,46.87517],[12.22147,46.88084],[12.23125,46.88146],[12.2345,46.88919],[12.24162,46.89192],[12.27486,46.88512],[12.27979,46.87921],[12.27736,46.87319],[12.29326,46.86566],[12.2912,46.85704],[12.29733,46.84455],[12.30833,46.84137],[12.30726,46.83271],[12.285,46.81503],[12.29383,46.8027],[12.28905,46.79948],[12.28889,46.79427],[12.28232,46.79153],[12.28539,46.7839],[12.30943,46.78603],[12.35837,46.77583],[12.37036,46.74163],[12.38475,46.71745],[12.40283,46.70811],[12.41103,46.70701],[12.41522,46.70163],[12.42862,46.6997],[12.42943,46.69567],[12.44268,46.68979],[12.47501,46.68756],[12.4795,46.67969],[12.43473,46.66714],[12.40648,46.64167],[12.38115,46.64183],[12.37944,46.63733],[12.3915,46.62765],[12.38577,46.62154],[12.35939,46.61829],[12.34465,46.62376],[12.34034,46.63022],[12.33578,46.62732],[12.3172,46.62876],[12.31785,46.62355],[12.30802,46.61811],[12.28413,46.61623],[12.26982,46.62003],[12.25931,46.62809],[12.24502,46.62326],[12.24198,46.61586],[12.21241,46.60918],[12.20444,46.59836],[12.19228,46.59321],[12.19261,46.62059],[12.1818,46.6192],[12.17117,46.63275],[12.16062,46.63574],[12.1511,46.63215],[12.1436,46.6327],[12.13739,46.64122],[12.12342,46.64475],[12.10949,46.65204],[12.10609,46.65783],[12.09345,46.66123],[12.08826,46.66638],[12.07985,46.66686],[12.07038,46.67386],[12.07173,46.66064],[12.06686,46.65364],[12.07479,46.64329],[12.06837,46.63997],[12.06495,46.62121],[12.05448,46.61778],[12.05318,46.60989],[12.04613,46.60716],[12.05043,46.60016],[12.04763,46.58357],[12.03665,46.57668],[12.0266,46.55871],[12.02189,46.55791],[11.99941,46.53208],[11.99411,46.53345],[11.98704,46.54417],[11.96633,46.54363],[11.95094,46.53869],[11.94719,46.52879],[11.94147,46.52689],[11.93294,46.52631],[11.9121,46.532],[11.8904,46.52175],[11.85192,46.51682],[11.82849,46.50783],[11.82334,46.51315],[11.82391,46.52141],[11.81086,46.53146],[11.79385,46.52023],[11.79189,46.51322],[11.76157,46.50503],[11.74317,46.50391],[11.73202,46.50877],[11.71935,46.50916],[11.71524,46.51245],[11.69889,46.50218],[11.6672,46.49647],[11.64515,46.49743],[11.63849,46.50051],[11.63495,46.49486],[11.64297,46.49346],[11.65174,46.48271],[11.64536,46.47189],[11.64179,46.47439],[11.62679,46.4708],[11.62987,46.46377],[11.61882,46.44325],[11.62143,46.42539],[11.60161,46.39731],[11.60307,46.38924],[11.5932,46.38265],[11.56489,46.38018],[11.55878,46.35076],[11.55249,46.34418],[11.54423,46.34483],[11.53837,46.35015],[11.52445,46.35502],[11.47969,46.36277],[11.48052,46.3551],[11.46322,46.34922],[11.45556,46.33396],[11.42105,46.32441],[11.40517,46.32387],[11.39865,46.31426],[11.39994,46.30709],[11.39569,46.3083],[11.38188,46.30052],[11.36088,46.29906],[11.36078,46.29682],[11.38256,46.29177],[11.3871,46.28143],[11.39609,46.27423],[11.39862,46.264],[11.38756,46.26029],[11.37347,46.2629],[11.36836,46.26135],[11.35783,46.26481],[11.35495,46.27564],[11.33912,46.28306],[11.33379,46.29049],[11.33471,46.2962],[11.3129,46.28256],[11.31737,46.27303],[11.30645,46.25786],[11.29124,46.2604],[11.24743,46.22933],[11.20622,46.2187],[11.18267,46.22496],[11.17077,46.23806],[11.17994,46.24434],[11.18351,46.25269],[11.18935,46.25354],[11.19448,46.2461],[11.20029,46.25566],[11.16604,46.26129],[11.14885,46.27904],[11.13725,46.28336],[11.14293,46.28934],[11.15847,46.29059],[11.16439,46.2986],[11.1761,46.30346],[11.1847,46.32104],[11.18894,46.32151],[11.18696,46.32673],[11.1942,46.33016],[11.20204,46.34212],[11.19001,46.35984],[11.19263,46.36578],[11.20393,46.36765],[11.19792,46.37232],[11.21275,46.39804],[11.21345,46.40675],[11.20565,46.4166],[11.21026,46.4206],[11.20347,46.42682],[11.21416,46.43556],[11.21634,46.44255],[11.20903,46.45293],[11.21419,46.45807],[11.21736,46.45731],[11.21886,46.46199],[11.21626,46.47277],[11.20939,46.481],[11.20876,46.49346],[11.19608,46.50241],[11.1924,46.501],[11.18686,46.50734],[11.18002,46.49823],[11.17014,46.49635],[11.16095,46.4878],[11.12934,46.48058],[11.1103,46.49643],[11.10449,46.4948],[11.08812,46.50128],[11.08173,46.53021],[11.05915,46.51508],[11.03795,46.51357],[11.05006,46.50784],[11.05773,46.49235],[11.06278,46.4894],[11.06894,46.46619],[11.07625,46.45487],[11.0778,46.44569],[11.07301,46.44042],[11.05394,46.44849],[11.0414,46.44569],[11.02817,46.46116],[11.00952,46.46917],[11.00462,46.47607],[10.98695,46.48289],[10.96543,46.48103],[10.95791,46.46983],[10.93819,46.46578],[10.9325,46.45831],[10.93332,46.4528],[10.91305,46.44284],[10.89161,46.44366],[10.88324,46.44995],[10.88093,46.44579],[10.87162,46.4438],[10.86174,46.43509],[10.85113,46.43817],[10.80034,46.44185],[10.78906,46.45164],[10.77835,46.47112],[10.76934,46.47609],[10.76463,46.4848],[10.75906,46.48547],[10.74422,46.48333],[10.71753,46.46022],[10.69667,46.4573],[10.68293,46.44846],[10.66821,46.45122],[10.63303,46.44309],[10.61439,46.45098],[10.60128,46.46139],[10.59995,46.46766],[10.57672,46.47237],[10.55875,46.48187],[10.54986,46.49123],[10.53685,46.49062],[10.52657,46.49425],[10.49366,46.49719],[10.48141,46.49337],[10.45714,46.5096],[10.45124,46.53083],[10.45814,46.54215],[10.47056,46.54377],[10.46954,46.54856],[10.47617,46.55749],[10.47321,46.56701],[10.48305,46.5777],[10.48575,46.58921],[10.48221,46.59199],[10.48576,46.59805],[10.48291,46.60512],[10.49055,46.61394],[10.44632,46.63989],[10.40935,46.63389],[10.40011,46.63648],[10.39873,46.6455],[10.38946,46.65862],[10.39057,46.67089],[10.3803,46.68399],[10.38615,46.68821]]],terms_url:"https://geoservices.buergernetz.bz.it/geokatalog",terms_text:"© Autonomen Provinz Bozen/Provincia Autonoma di Bolzano CC-BY 4.0",best:true},{id:"South-Tyrol-Topomap",name:"South Tyrol Topomap",type:"tms",template:"https://geoservices.buergernetz.bz.it/geoserver/gwc/service/wmts/?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=P_BZ_BASEMAP_TOPO&STYLE=default&TILEMATRIXSET=GoogleMapsCompatible&TILEMATRIX=GoogleMapsCompatible%3A{zoom}&TILEROW={y}&TILECOL={x}&FORMAT=image%2Fjpeg",zoomExtent:[0,20],polygon:[[[10.38615,46.68821],[10.39201,46.69016],[10.40215,46.70624],[10.41274,46.70821],[10.41622,46.71479],[10.4168,46.71847],[10.39934,46.73435],[10.43464,46.75356],[10.44107,46.75413],[10.44011,46.77149],[10.42123,46.78861],[10.42845,46.79755],[10.43851,46.79869],[10.44925,46.80462],[10.45602,46.81635],[10.45438,46.82221],[10.4583,46.82478],[10.45513,46.83059],[10.45906,46.83548],[10.46483,46.83624],[10.46229,46.8413],[10.46987,46.84933],[10.46819,46.8553],[10.47838,46.86013],[10.48372,46.85543],[10.49628,46.85305],[10.49931,46.84857],[10.52124,46.84653],[10.5527,46.8511],[10.55795,46.84695],[10.55264,46.8408],[10.55536,46.84087],[10.58883,46.85125],[10.59502,46.85829],[10.60936,46.8597],[10.62441,46.86558],[10.64858,46.86655],[10.66787,46.87651],[10.67297,46.87138],[10.69112,46.86861],[10.69786,46.86339],[10.69508,46.85308],[10.70594,46.84786],[10.71763,46.84795],[10.72333,46.83892],[10.75621,46.83383],[10.76481,46.82409],[10.76387,46.81971],[10.75239,46.81387],[10.74506,46.80223],[10.7276,46.79709],[10.73122,46.78925],[10.75722,46.78624],[10.77744,46.79149],[10.78678,46.79735],[10.81439,46.77662],[10.82479,46.77472],[10.83129,46.78138],[10.84112,46.78282],[10.85354,46.77506],[10.86845,46.77313],[10.86993,46.7669],[10.88294,46.76393],[10.88962,46.76529],[10.8951,46.77092],[10.90527,46.76911],[10.92299,46.7764],[10.92821,46.77408],[10.94388,46.77648],[10.97522,46.77361],[10.97932,46.77014],[10.99475,46.76804],[11.01397,46.77317],[11.02328,46.76715],[11.0346,46.79428],[11.04234,46.801],[11.03792,46.80562],[11.05633,46.80928],[11.07279,46.82092],[11.08171,46.82252],[11.0762,46.83384],[11.06887,46.83793],[11.07303,46.84345],[11.06988,46.85348],[11.08742,46.87927],[11.09961,46.88922],[11.09538,46.89178],[11.09795,46.89844],[11.0946,46.91247],[11.10792,46.91706],[11.10804,46.92632],[11.11418,46.93234],[11.13851,46.92865],[11.16322,46.94091],[11.16642,46.94479],[11.16114,46.94979],[11.1637,46.96677],[11.17598,46.96367],[11.18658,46.97062],[11.19527,46.97152],[11.20418,46.96877],[11.20688,46.96403],[11.22047,46.97025],[11.24139,46.9708],[11.24865,46.97517],[11.25582,46.97535],[11.26272,46.98169],[11.27662,46.98168],[11.28762,46.98699],[11.30709,46.98525],[11.3205,46.99345],[11.33765,46.98606],[11.34516,46.99169],[11.35932,46.99154],[11.37697,46.98025],[11.38324,46.97168],[11.40465,46.96609],[11.43929,46.97601],[11.45134,46.99294],[11.46803,46.99582],[11.46859,47.003],[11.47831,47.01201],[11.50238,47.01073],[11.50313,47.00808],[11.51366,47.00595],[11.51679,47.00091],[11.53381,46.99233],[11.53846,46.98519],[11.55297,46.99149],[11.57663,46.99657],[11.58,47.00277],[11.58879,47.00641],[11.59901,47.00657],[11.60944,47.01207],[11.62697,47.01437],[11.63629,47.00383],[11.66542,46.99304],[11.6885,46.99658],[11.71226,46.99416],[11.72897,46.97322],[11.74698,46.97013],[11.76411,46.97412],[11.78106,46.99342],[11.81526,46.991],[11.83564,46.99417],[11.84396,47.0025],[11.85192,47.0014],[11.86722,47.01252],[11.87393,47.01136],[11.8794,47.01714],[11.89137,47.01728],[11.91627,47.03422],[11.9329,47.03864],[11.94688,47.03464],[11.95457,47.04374],[11.96773,47.04158],[11.97912,47.0511],[11.98587,47.04815],[11.99534,47.05064],[12.02037,47.04821],[12.02968,47.05127],[12.03353,47.0583],[12.04276,47.06228],[12.07543,47.0605],[12.08035,47.06951],[12.09308,47.07791],[12.10329,47.07931],[12.11867,47.07445],[12.13561,47.08171],[12.15125,47.08049],[12.15997,47.08267],[12.18589,47.09322],[12.2278,47.08302],[12.24228,47.06892],[12.23786,47.0644],[12.21821,47.05795],[12.2182,47.04483],[12.20552,47.02595],[12.18048,47.02414],[12.16423,47.01782],[12.14786,47.02357],[12.12723,47.01218],[12.12285,47.00662],[12.1322,46.99339],[12.12974,46.98593],[12.13977,46.982],[12.13808,46.96514],[12.13328,46.96292],[12.13882,46.95764],[12.15927,46.95133],[12.1702,46.93758],[12.15414,46.91654],[12.14675,46.91413],[12.16205,46.908],[12.16959,46.91121],[12.19154,46.90682],[12.20106,46.8965],[12.2022,46.88806],[12.21663,46.87517],[12.22147,46.88084],[12.23125,46.88146],[12.2345,46.88919],[12.24162,46.89192],[12.27486,46.88512],[12.27979,46.87921],[12.27736,46.87319],[12.29326,46.86566],[12.2912,46.85704],[12.29733,46.84455],[12.30833,46.84137],[12.30726,46.83271],[12.285,46.81503],[12.29383,46.8027],[12.28905,46.79948],[12.28889,46.79427],[12.28232,46.79153],[12.28539,46.7839],[12.30943,46.78603],[12.35837,46.77583],[12.37036,46.74163],[12.38475,46.71745],[12.40283,46.70811],[12.41103,46.70701],[12.41522,46.70163],[12.42862,46.6997],[12.42943,46.69567],[12.44268,46.68979],[12.47501,46.68756],[12.4795,46.67969],[12.43473,46.66714],[12.40648,46.64167],[12.38115,46.64183],[12.37944,46.63733],[12.3915,46.62765],[12.38577,46.62154],[12.35939,46.61829],[12.34465,46.62376],[12.34034,46.63022],[12.33578,46.62732],[12.3172,46.62876],[12.31785,46.62355],[12.30802,46.61811],[12.28413,46.61623],[12.26982,46.62003],[12.25931,46.62809],[12.24502,46.62326],[12.24198,46.61586],[12.21241,46.60918],[12.20444,46.59836],[12.19228,46.59321],[12.19261,46.62059],[12.1818,46.6192],[12.17117,46.63275],[12.16062,46.63574],[12.1511,46.63215],[12.1436,46.6327],[12.13739,46.64122],[12.12342,46.64475],[12.10949,46.65204],[12.10609,46.65783],[12.09345,46.66123],[12.08826,46.66638],[12.07985,46.66686],[12.07038,46.67386],[12.07173,46.66064],[12.06686,46.65364],[12.07479,46.64329],[12.06837,46.63997],[12.06495,46.62121],[12.05448,46.61778],[12.05318,46.60989],[12.04613,46.60716],[12.05043,46.60016],[12.04763,46.58357],[12.03665,46.57668],[12.0266,46.55871],[12.02189,46.55791],[11.99941,46.53208],[11.99411,46.53345],[11.98704,46.54417],[11.96633,46.54363],[11.95094,46.53869],[11.94719,46.52879],[11.94147,46.52689],[11.93294,46.52631],[11.9121,46.532],[11.8904,46.52175],[11.85192,46.51682],[11.82849,46.50783],[11.82334,46.51315],[11.82391,46.52141],[11.81086,46.53146],[11.79385,46.52023],[11.79189,46.51322],[11.76157,46.50503],[11.74317,46.50391],[11.73202,46.50877],[11.71935,46.50916],[11.71524,46.51245],[11.69889,46.50218],[11.6672,46.49647],[11.64515,46.49743],[11.63849,46.50051],[11.63495,46.49486],[11.64297,46.49346],[11.65174,46.48271],[11.64536,46.47189],[11.64179,46.47439],[11.62679,46.4708],[11.62987,46.46377],[11.61882,46.44325],[11.62143,46.42539],[11.60161,46.39731],[11.60307,46.38924],[11.5932,46.38265],[11.56489,46.38018],[11.55878,46.35076],[11.55249,46.34418],[11.54423,46.34483],[11.53837,46.35015],[11.52445,46.35502],[11.47969,46.36277],[11.48052,46.3551],[11.46322,46.34922],[11.45556,46.33396],[11.42105,46.32441],[11.40517,46.32387],[11.39865,46.31426],[11.39994,46.30709],[11.39569,46.3083],[11.38188,46.30052],[11.36088,46.29906],[11.36078,46.29682],[11.38256,46.29177],[11.3871,46.28143],[11.39609,46.27423],[11.39862,46.264],[11.38756,46.26029],[11.37347,46.2629],[11.36836,46.26135],[11.35783,46.26481],[11.35495,46.27564],[11.33912,46.28306],[11.33379,46.29049],[11.33471,46.2962],[11.3129,46.28256],[11.31737,46.27303],[11.30645,46.25786],[11.29124,46.2604],[11.24743,46.22933],[11.20622,46.2187],[11.18267,46.22496],[11.17077,46.23806],[11.17994,46.24434],[11.18351,46.25269],[11.18935,46.25354],[11.19448,46.2461],[11.20029,46.25566],[11.16604,46.26129],[11.14885,46.27904],[11.13725,46.28336],[11.14293,46.28934],[11.15847,46.29059],[11.16439,46.2986],[11.1761,46.30346],[11.1847,46.32104],[11.18894,46.32151],[11.18696,46.32673],[11.1942,46.33016],[11.20204,46.34212],[11.19001,46.35984],[11.19263,46.36578],[11.20393,46.36765],[11.19792,46.37232],[11.21275,46.39804],[11.21345,46.40675],[11.20565,46.4166],[11.21026,46.4206],[11.20347,46.42682],[11.21416,46.43556],[11.21634,46.44255],[11.20903,46.45293],[11.21419,46.45807],[11.21736,46.45731],[11.21886,46.46199],[11.21626,46.47277],[11.20939,46.481],[11.20876,46.49346],[11.19608,46.50241],[11.1924,46.501],[11.18686,46.50734],[11.18002,46.49823],[11.17014,46.49635],[11.16095,46.4878],[11.12934,46.48058],[11.1103,46.49643],[11.10449,46.4948],[11.08812,46.50128],[11.08173,46.53021],[11.05915,46.51508],[11.03795,46.51357],[11.05006,46.50784],[11.05773,46.49235],[11.06278,46.4894],[11.06894,46.46619],[11.07625,46.45487],[11.0778,46.44569],[11.07301,46.44042],[11.05394,46.44849],[11.0414,46.44569],[11.02817,46.46116],[11.00952,46.46917],[11.00462,46.47607],[10.98695,46.48289],[10.96543,46.48103],[10.95791,46.46983],[10.93819,46.46578],[10.9325,46.45831],[10.93332,46.4528],[10.91305,46.44284],[10.89161,46.44366],[10.88324,46.44995],[10.88093,46.44579],[10.87162,46.4438],[10.86174,46.43509],[10.85113,46.43817],[10.80034,46.44185],[10.78906,46.45164],[10.77835,46.47112],[10.76934,46.47609],[10.76463,46.4848],[10.75906,46.48547],[10.74422,46.48333],[10.71753,46.46022],[10.69667,46.4573],[10.68293,46.44846],[10.66821,46.45122],[10.63303,46.44309],[10.61439,46.45098],[10.60128,46.46139],[10.59995,46.46766],[10.57672,46.47237],[10.55875,46.48187],[10.54986,46.49123],[10.53685,46.49062],[10.52657,46.49425],[10.49366,46.49719],[10.48141,46.49337],[10.45714,46.5096],[10.45124,46.53083],[10.45814,46.54215],[10.47056,46.54377],[10.46954,46.54856],[10.47617,46.55749],[10.47321,46.56701],[10.48305,46.5777],[10.48575,46.58921],[10.48221,46.59199],[10.48576,46.59805],[10.48291,46.60512],[10.49055,46.61394],[10.44632,46.63989],[10.40935,46.63389],[10.40011,46.63648],[10.39873,46.6455],[10.38946,46.65862],[10.39057,46.67089],[10.3803,46.68399],[10.38615,46.68821]]],terms_url:"https://geoservices.buergernetz.bz.it/geokatalog",terms_text:"© Autonomen Provinz Bozen/Provincia Autonoma di Bolzano",description:"Topographical basemap of South Tyrol"},{id:"SPW2009",name:"SPW(allonie) 2009-2010 aerial imagery",type:"wms",template:"https://geoservices.wallonie.be/arcgis/services/IMAGERIE/ORTHO_2009_2010/MapServer/WMSServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2010-01-01T00:00:00.000Z",startDate:"2009-01-01T00:00:00.000Z",polygon:[[[5.78257,49.87573],[5.73919,49.83362],[5.75516,49.79146],[5.78839,49.79665],[5.91064,49.66249],[5.84857,49.59723],[5.87102,49.57599],[5.81857,49.54638],[5.66079,49.55362],[5.61108,49.50603],[5.55603,49.52928],[5.47051,49.49737],[5.45708,49.56703],[5.37522,49.62333],[5.31486,49.61137],[5.33243,49.65263],[5.26851,49.69657],[5.16628,49.69303],[4.99753,49.80006],[4.85164,49.79345],[4.84754,49.86806],[4.89013,49.90893],[4.79117,49.958],[4.87762,50.15374],[4.82418,50.16932],[4.70207,50.09556],[4.69441,49.99625],[4.44551,49.93722],[4.30589,49.96829],[4.19746,49.9546],[4.1352,50.01508],[4.22825,50.07842],[4.19682,50.13519],[4.12714,50.1355],[4.2052,50.27347],[4.16262,50.28896],[4.13538,50.25784],[4.02795,50.3584],[3.88574,50.32701],[3.84578,50.35323],[3.74546,50.35005],[3.70994,50.30316],[3.65756,50.37076],[3.65552,50.4617],[3.60586,50.49632],[3.4993,50.48921],[3.51992,50.52362],[3.47439,50.53368],[3.37698,50.49109],[3.28634,50.52793],[3.26104,50.70131],[3.20602,50.71139],[3.17839,50.75609],[3.30562,50.75466],[3.36077,50.70962],[3.45439,50.77072],[3.64047,50.72242],[3.67752,50.77062],[3.75857,50.78045],[3.77568,50.74789],[3.8798,50.75146],[3.9097,50.69245],[4.05868,50.69439],[4.14853,50.72834],[4.2467,50.6894],[4.46355,50.75511],[4.52399,50.72724],[4.59727,50.76359],[4.63445,50.74272],[4.64309,50.79755],[4.76014,50.80544],[4.92545,50.74275],[5.00339,50.76594],[5.07039,50.70649],[5.16508,50.6957],[5.16984,50.72257],[5.30912,50.71802],[5.35029,50.74629],[5.47863,50.72352],[5.68786,50.81193],[5.68225,50.75651],[5.7707,50.75132],[5.81963,50.71396],[5.88333,50.70992],[5.89217,50.75518],[5.96561,50.76107],[6.04045,50.74546],[6.03959,50.71833],[6.11066,50.72299],[6.18169,50.62383],[6.26953,50.62519],[6.17812,50.54153],[6.22658,50.49432],[6.35036,50.48854],[6.34298,50.38033],[6.40542,50.32331],[6.30647,50.32019],[6.27889,50.26734],[6.17377,50.23165],[6.19232,50.18203],[6.147,50.17775],[6.13779,50.12985],[6.10245,50.17055],[5.96368,50.17263],[5.96133,50.13136],[5.89532,50.11216],[5.81968,50.01329],[5.83578,49.97892],[5.77502,49.9608],[5.73577,49.89684],[5.78257,49.87573]],[[2.99943,50.81035],[2.93719,50.79361],[2.96,50.7735],[2.92247,50.75729],[2.84203,50.75153],[2.86315,50.70826],[2.91065,50.69409],[2.94001,50.74543],[3.02932,50.77896],[2.99943,50.81035]]],icon:"https://osmlab.github.io/editor-layer-index/sources/europe/be/SPW(allonie)2009-2010aerialimagery.png"},{id:"SPW2012",name:"SPW(allonie) 2012-2013 aerial imagery",type:"wms",template:"https://geoservices.wallonie.be/arcgis/services/IMAGERIE/ORTHO_2012_2013/MapServer/WMSServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2013-01-01T00:00:00.000Z",startDate:"2012-01-01T00:00:00.000Z",polygon:[[[5.78257,49.87573],[5.73919,49.83362],[5.75516,49.79146],[5.78839,49.79665],[5.91064,49.66249],[5.84857,49.59723],[5.87102,49.57599],[5.81857,49.54638],[5.66079,49.55362],[5.61108,49.50603],[5.55603,49.52928],[5.47051,49.49737],[5.45708,49.56703],[5.37522,49.62333],[5.31486,49.61137],[5.33243,49.65263],[5.26851,49.69657],[5.16628,49.69303],[4.99753,49.80006],[4.85164,49.79345],[4.84754,49.86806],[4.89013,49.90893],[4.79117,49.958],[4.87762,50.15374],[4.82418,50.16932],[4.70207,50.09556],[4.69441,49.99625],[4.44551,49.93722],[4.30589,49.96829],[4.19746,49.9546],[4.1352,50.01508],[4.22825,50.07842],[4.19682,50.13519],[4.12714,50.1355],[4.2052,50.27347],[4.16262,50.28896],[4.13538,50.25784],[4.02795,50.3584],[3.88574,50.32701],[3.84578,50.35323],[3.74546,50.35005],[3.70994,50.30316],[3.65756,50.37076],[3.65552,50.4617],[3.60586,50.49632],[3.4993,50.48921],[3.51992,50.52362],[3.47439,50.53368],[3.37698,50.49109],[3.28634,50.52793],[3.26104,50.70131],[3.20602,50.71139],[3.17839,50.75609],[3.30562,50.75466],[3.36077,50.70962],[3.45439,50.77072],[3.64047,50.72242],[3.67752,50.77062],[3.75857,50.78045],[3.77568,50.74789],[3.8798,50.75146],[3.9097,50.69245],[4.05868,50.69439],[4.14853,50.72834],[4.2467,50.6894],[4.46355,50.75511],[4.52399,50.72724],[4.59727,50.76359],[4.63445,50.74272],[4.64309,50.79755],[4.76014,50.80544],[4.92545,50.74275],[5.00339,50.76594],[5.07039,50.70649],[5.16508,50.6957],[5.16984,50.72257],[5.30912,50.71802],[5.35029,50.74629],[5.47863,50.72352],[5.68786,50.81193],[5.68225,50.75651],[5.7707,50.75132],[5.81963,50.71396],[5.88333,50.70992],[5.89217,50.75518],[5.96561,50.76107],[6.04045,50.74546],[6.03959,50.71833],[6.11066,50.72299],[6.18169,50.62383],[6.26953,50.62519],[6.17812,50.54153],[6.22658,50.49432],[6.35036,50.48854],[6.34298,50.38033],[6.40542,50.32331],[6.30647,50.32019],[6.27889,50.26734],[6.17377,50.23165],[6.19232,50.18203],[6.147,50.17775],[6.13779,50.12985],[6.10245,50.17055],[5.96368,50.17263],[5.96133,50.13136],[5.89532,50.11216],[5.81968,50.01329],[5.83578,49.97892],[5.77502,49.9608],[5.73577,49.89684],[5.78257,49.87573]],[[2.99943,50.81035],[2.93719,50.79361],[2.96,50.7735],[2.92247,50.75729],[2.84203,50.75153],[2.86315,50.70826],[2.91065,50.69409],[2.94001,50.74543],[3.02932,50.77896],[2.99943,50.81035]]],icon:"https://osmlab.github.io/editor-layer-index/sources/europe/be/SPW(allonie)2009-2010aerialimagery.png"},{id:"SPW2015",name:"SPW(allonie) 2015 aerial imagery",type:"wms",template:"https://geoservices.wallonie.be/arcgis/services/IMAGERIE/ORTHO_2015/MapServer/WmsServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2015-01-01T00:00:00.000Z",startDate:"2015-01-01T00:00:00.000Z",polygon:[[[5.78257,49.87573],[5.73919,49.83362],[5.75516,49.79146],[5.78839,49.79665],[5.91064,49.66249],[5.84857,49.59723],[5.87102,49.57599],[5.81857,49.54638],[5.66079,49.55362],[5.61108,49.50603],[5.55603,49.52928],[5.47051,49.49737],[5.45708,49.56703],[5.37522,49.62333],[5.31486,49.61137],[5.33243,49.65263],[5.26851,49.69657],[5.16628,49.69303],[4.99753,49.80006],[4.85164,49.79345],[4.84754,49.86806],[4.89013,49.90893],[4.79117,49.958],[4.87762,50.15374],[4.82418,50.16932],[4.70207,50.09556],[4.69441,49.99625],[4.44551,49.93722],[4.30589,49.96829],[4.19746,49.9546],[4.1352,50.01508],[4.22825,50.07842],[4.19682,50.13519],[4.12714,50.1355],[4.2052,50.27347],[4.16262,50.28896],[4.13538,50.25784],[4.02795,50.3584],[3.88574,50.32701],[3.84578,50.35323],[3.74546,50.35005],[3.70994,50.30316],[3.65756,50.37076],[3.65552,50.4617],[3.60586,50.49632],[3.4993,50.48921],[3.51992,50.52362],[3.47439,50.53368],[3.37698,50.49109],[3.28634,50.52793],[3.26104,50.70131],[3.20602,50.71139],[3.17839,50.75609],[3.30562,50.75466],[3.36077,50.70962],[3.45439,50.77072],[3.64047,50.72242],[3.67752,50.77062],[3.75857,50.78045],[3.77568,50.74789],[3.8798,50.75146],[3.9097,50.69245],[4.05868,50.69439],[4.14853,50.72834],[4.2467,50.6894],[4.46355,50.75511],[4.52399,50.72724],[4.59727,50.76359],[4.63445,50.74272],[4.64309,50.79755],[4.76014,50.80544],[4.92545,50.74275],[5.00339,50.76594],[5.07039,50.70649],[5.16508,50.6957],[5.16984,50.72257],[5.30912,50.71802],[5.35029,50.74629],[5.47863,50.72352],[5.68786,50.81193],[5.68225,50.75651],[5.7707,50.75132],[5.81963,50.71396],[5.88333,50.70992],[5.89217,50.75518],[5.96561,50.76107],[6.04045,50.74546],[6.03959,50.71833],[6.11066,50.72299],[6.18169,50.62383],[6.26953,50.62519],[6.17812,50.54153],[6.22658,50.49432],[6.35036,50.48854],[6.34298,50.38033],[6.40542,50.32331],[6.30647,50.32019],[6.27889,50.26734],[6.17377,50.23165],[6.19232,50.18203],[6.147,50.17775],[6.13779,50.12985],[6.10245,50.17055],[5.96368,50.17263],[5.96133,50.13136],[5.89532,50.11216],[5.81968,50.01329],[5.83578,49.97892],[5.77502,49.9608],[5.73577,49.89684],[5.78257,49.87573]],[[2.99943,50.81035],[2.93719,50.79361],[2.96,50.7735],[2.92247,50.75729],[2.84203,50.75153],[2.86315,50.70826],[2.91065,50.69409],[2.94001,50.74543],[3.02932,50.77896],[2.99943,50.81035]]],icon:"https://osmlab.github.io/editor-layer-index/sources/europe/be/SPW(allonie)2009-2010aerialimagery.png"},{id:"SPW2016",name:"SPW(allonie) 2016 aerial imagery",type:"wms",template:"https://geoservices.wallonie.be/arcgis/services/IMAGERIE/ORTHO_2016/MapServer/WmsServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2016-01-01T00:00:00.000Z",startDate:"2016-01-01T00:00:00.000Z",polygon:[[[5.78257,49.87573],[5.73919,49.83362],[5.75516,49.79146],[5.78839,49.79665],[5.91064,49.66249],[5.84857,49.59723],[5.87102,49.57599],[5.81857,49.54638],[5.66079,49.55362],[5.61108,49.50603],[5.55603,49.52928],[5.47051,49.49737],[5.45708,49.56703],[5.37522,49.62333],[5.31486,49.61137],[5.33243,49.65263],[5.26851,49.69657],[5.16628,49.69303],[4.99753,49.80006],[4.85164,49.79345],[4.84754,49.86806],[4.89013,49.90893],[4.79117,49.958],[4.87762,50.15374],[4.82418,50.16932],[4.70207,50.09556],[4.69441,49.99625],[4.44551,49.93722],[4.30589,49.96829],[4.19746,49.9546],[4.1352,50.01508],[4.22825,50.07842],[4.19682,50.13519],[4.12714,50.1355],[4.2052,50.27347],[4.16262,50.28896],[4.13538,50.25784],[4.02795,50.3584],[3.88574,50.32701],[3.84578,50.35323],[3.74546,50.35005],[3.70994,50.30316],[3.65756,50.37076],[3.65552,50.4617],[3.60586,50.49632],[3.4993,50.48921],[3.51992,50.52362],[3.47439,50.53368],[3.37698,50.49109],[3.28634,50.52793],[3.26104,50.70131],[3.20602,50.71139],[3.17839,50.75609],[3.30562,50.75466],[3.36077,50.70962],[3.45439,50.77072],[3.64047,50.72242],[3.67752,50.77062],[3.75857,50.78045],[3.77568,50.74789],[3.8798,50.75146],[3.9097,50.69245],[4.05868,50.69439],[4.14853,50.72834],[4.2467,50.6894],[4.46355,50.75511],[4.52399,50.72724],[4.59727,50.76359],[4.63445,50.74272],[4.64309,50.79755],[4.76014,50.80544],[4.92545,50.74275],[5.00339,50.76594],[5.07039,50.70649],[5.16508,50.6957],[5.16984,50.72257],[5.30912,50.71802],[5.35029,50.74629],[5.47863,50.72352],[5.68786,50.81193],[5.68225,50.75651],[5.7707,50.75132],[5.81963,50.71396],[5.88333,50.70992],[5.89217,50.75518],[5.96561,50.76107],[6.04045,50.74546],[6.03959,50.71833],[6.11066,50.72299],[6.18169,50.62383],[6.26953,50.62519],[6.17812,50.54153],[6.22658,50.49432],[6.35036,50.48854],[6.34298,50.38033],[6.40542,50.32331],[6.30647,50.32019],[6.27889,50.26734],[6.17377,50.23165],[6.19232,50.18203],[6.147,50.17775],[6.13779,50.12985],[6.10245,50.17055],[5.96368,50.17263],[5.96133,50.13136],[5.89532,50.11216],[5.81968,50.01329],[5.83578,49.97892],[5.77502,49.9608],[5.73577,49.89684],[5.78257,49.87573]],[[2.99943,50.81035],[2.93719,50.79361],[2.96,50.7735],[2.92247,50.75729],[2.84203,50.75153],[2.86315,50.70826],[2.91065,50.69409],[2.94001,50.74543],[3.02932,50.77896],[2.99943,50.81035]]],icon:"https://osmlab.github.io/editor-layer-index/sources/europe/be/SPW(allonie)2009-2010aerialimagery.png"},{id:"SPW_ORTHO_LAST",name:"SPW(allonie) most recent aerial imagery",type:"wms",template:"https://geoservices.wallonie.be/arcgis/services/IMAGERIE/ORTHO_LAST/MapServer/WmsServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[5.78257,49.87573],[5.73919,49.83362],[5.75516,49.79146],[5.78839,49.79665],[5.91064,49.66249],[5.84857,49.59723],[5.87102,49.57599],[5.81857,49.54638],[5.66079,49.55362],[5.61108,49.50603],[5.55603,49.52928],[5.47051,49.49737],[5.45708,49.56703],[5.37522,49.62333],[5.31486,49.61137],[5.33243,49.65263],[5.26851,49.69657],[5.16628,49.69303],[4.99753,49.80006],[4.85164,49.79345],[4.84754,49.86806],[4.89013,49.90893],[4.79117,49.958],[4.87762,50.15374],[4.82418,50.16932],[4.70207,50.09556],[4.69441,49.99625],[4.44551,49.93722],[4.30589,49.96829],[4.19746,49.9546],[4.1352,50.01508],[4.22825,50.07842],[4.19682,50.13519],[4.12714,50.1355],[4.2052,50.27347],[4.16262,50.28896],[4.13538,50.25784],[4.02795,50.3584],[3.88574,50.32701],[3.84578,50.35323],[3.74546,50.35005],[3.70994,50.30316],[3.65756,50.37076],[3.65552,50.4617],[3.60586,50.49632],[3.4993,50.48921],[3.51992,50.52362],[3.47439,50.53368],[3.37698,50.49109],[3.28634,50.52793],[3.26104,50.70131],[3.20602,50.71139],[3.17839,50.75609],[3.30562,50.75466],[3.36077,50.70962],[3.45439,50.77072],[3.64047,50.72242],[3.67752,50.77062],[3.75857,50.78045],[3.77568,50.74789],[3.8798,50.75146],[3.9097,50.69245],[4.05868,50.69439],[4.14853,50.72834],[4.2467,50.6894],[4.46355,50.75511],[4.52399,50.72724],[4.59727,50.76359],[4.63445,50.74272],[4.64309,50.79755],[4.76014,50.80544],[4.92545,50.74275],[5.00339,50.76594],[5.07039,50.70649],[5.16508,50.6957],[5.16984,50.72257],[5.30912,50.71802],[5.35029,50.74629],[5.47863,50.72352],[5.68786,50.81193],[5.68225,50.75651],[5.7707,50.75132],[5.81963,50.71396],[5.88333,50.70992],[5.89217,50.75518],[5.96561,50.76107],[6.04045,50.74546],[6.03959,50.71833],[6.11066,50.72299],[6.18169,50.62383],[6.26953,50.62519],[6.17812,50.54153],[6.22658,50.49432],[6.35036,50.48854],[6.34298,50.38033],[6.40542,50.32331],[6.30647,50.32019],[6.27889,50.26734],[6.17377,50.23165],[6.19232,50.18203],[6.147,50.17775],[6.13779,50.12985],[6.10245,50.17055],[5.96368,50.17263],[5.96133,50.13136],[5.89532,50.11216],[5.81968,50.01329],[5.83578,49.97892],[5.77502,49.9608],[5.73577,49.89684],[5.78257,49.87573]],[[2.99943,50.81035],[2.93719,50.79361],[2.96,50.7735],[2.92247,50.75729],[2.84203,50.75153],[2.86315,50.70826],[2.91065,50.69409],[2.94001,50.74543],[3.02932,50.77896],[2.99943,50.81035]]],best:true,icon:"https://osmlab.github.io/editor-layer-index/sources/europe/be/SPW(allonie)2009-2010aerialimagery.png"},{id:"SPW_PICC",name:"SPW(allonie) PICC numerical imagery",type:"wms",template:"https://geoservices.wallonie.be/arcgis/services/TOPOGRAPHIE/PICC_VDIFF/MapServer/WmsServer?SERVICE=WMS&VERSION=1.1.1&FORMAT=image/png8&TRANSPARENT=FALSE&REQUEST=GetMap&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}&LAYERS=0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29",projection:"EPSG:3857",polygon:[[[5.78257,49.87573],[5.73919,49.83362],[5.75516,49.79146],[5.78839,49.79665],[5.91064,49.66249],[5.84857,49.59723],[5.87102,49.57599],[5.81857,49.54638],[5.66079,49.55362],[5.61108,49.50603],[5.55603,49.52928],[5.47051,49.49737],[5.45708,49.56703],[5.37522,49.62333],[5.31486,49.61137],[5.33243,49.65263],[5.26851,49.69657],[5.16628,49.69303],[4.99753,49.80006],[4.85164,49.79345],[4.84754,49.86806],[4.89013,49.90893],[4.79117,49.958],[4.87762,50.15374],[4.82418,50.16932],[4.70207,50.09556],[4.69441,49.99625],[4.44551,49.93722],[4.30589,49.96829],[4.19746,49.9546],[4.1352,50.01508],[4.22825,50.07842],[4.19682,50.13519],[4.12714,50.1355],[4.2052,50.27347],[4.16262,50.28896],[4.13538,50.25784],[4.02795,50.3584],[3.88574,50.32701],[3.84578,50.35323],[3.74546,50.35005],[3.70994,50.30316],[3.65756,50.37076],[3.65552,50.4617],[3.60586,50.49632],[3.4993,50.48921],[3.51992,50.52362],[3.47439,50.53368],[3.37698,50.49109],[3.28634,50.52793],[3.26104,50.70131],[3.20602,50.71139],[3.17839,50.75609],[3.30562,50.75466],[3.36077,50.70962],[3.45439,50.77072],[3.64047,50.72242],[3.67752,50.77062],[3.75857,50.78045],[3.77568,50.74789],[3.8798,50.75146],[3.9097,50.69245],[4.05868,50.69439],[4.14853,50.72834],[4.2467,50.6894],[4.46355,50.75511],[4.52399,50.72724],[4.59727,50.76359],[4.63445,50.74272],[4.64309,50.79755],[4.76014,50.80544],[4.92545,50.74275],[5.00339,50.76594],[5.07039,50.70649],[5.16508,50.6957],[5.16984,50.72257],[5.30912,50.71802],[5.35029,50.74629],[5.47863,50.72352],[5.68786,50.81193],[5.68225,50.75651],[5.7707,50.75132],[5.81963,50.71396],[5.88333,50.70992],[5.89217,50.75518],[5.96561,50.76107],[6.04045,50.74546],[6.03959,50.71833],[6.11066,50.72299],[6.18169,50.62383],[6.26953,50.62519],[6.17812,50.54153],[6.22658,50.49432],[6.35036,50.48854],[6.34298,50.38033],[6.40542,50.32331],[6.30647,50.32019],[6.27889,50.26734],[6.17377,50.23165],[6.19232,50.18203],[6.147,50.17775],[6.13779,50.12985],[6.10245,50.17055],[5.96368,50.17263],[5.96133,50.13136],[5.89532,50.11216],[5.81968,50.01329],[5.83578,49.97892],[5.77502,49.9608],[5.73577,49.89684],[5.78257,49.87573]],[[2.99943,50.81035],[2.93719,50.79361],[2.96,50.7735],[2.92247,50.75729],[2.84203,50.75153],[2.86315,50.70826],[2.91065,50.69409],[2.94001,50.74543],[3.02932,50.77896],[2.99943,50.81035]]],icon:"https://osmlab.github.io/editor-layer-index/sources/europe/be/SPW(allonie)2009-2010aerialimagery.png"},{id:"SPWrelief2014",name:"SPW(allonie) shaded relief",type:"wms",template:"https://geoservices.wallonie.be/arcgis/services/RELIEF/WALLONIE_MNT_2013_2014_HILLSHADE/MapServer/WMSServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2014-01-01T00:00:00.000Z",startDate:"2013-01-01T00:00:00.000Z",polygon:[[[5.78257,49.87573],[5.73919,49.83362],[5.75516,49.79146],[5.78839,49.79665],[5.91064,49.66249],[5.84857,49.59723],[5.87102,49.57599],[5.81857,49.54638],[5.66079,49.55362],[5.61108,49.50603],[5.55603,49.52928],[5.47051,49.49737],[5.45708,49.56703],[5.37522,49.62333],[5.31486,49.61137],[5.33243,49.65263],[5.26851,49.69657],[5.16628,49.69303],[4.99753,49.80006],[4.85164,49.79345],[4.84754,49.86806],[4.89013,49.90893],[4.79117,49.958],[4.87762,50.15374],[4.82418,50.16932],[4.70207,50.09556],[4.69441,49.99625],[4.44551,49.93722],[4.30589,49.96829],[4.19746,49.9546],[4.1352,50.01508],[4.22825,50.07842],[4.19682,50.13519],[4.12714,50.1355],[4.2052,50.27347],[4.16262,50.28896],[4.13538,50.25784],[4.02795,50.3584],[3.88574,50.32701],[3.84578,50.35323],[3.74546,50.35005],[3.70994,50.30316],[3.65756,50.37076],[3.65552,50.4617],[3.60586,50.49632],[3.4993,50.48921],[3.51992,50.52362],[3.47439,50.53368],[3.37698,50.49109],[3.28634,50.52793],[3.26104,50.70131],[3.20602,50.71139],[3.17839,50.75609],[3.30562,50.75466],[3.36077,50.70962],[3.45439,50.77072],[3.64047,50.72242],[3.67752,50.77062],[3.75857,50.78045],[3.77568,50.74789],[3.8798,50.75146],[3.9097,50.69245],[4.05868,50.69439],[4.14853,50.72834],[4.2467,50.6894],[4.46355,50.75511],[4.52399,50.72724],[4.59727,50.76359],[4.63445,50.74272],[4.64309,50.79755],[4.76014,50.80544],[4.92545,50.74275],[5.00339,50.76594],[5.07039,50.70649],[5.16508,50.6957],[5.16984,50.72257],[5.30912,50.71802],[5.35029,50.74629],[5.47863,50.72352],[5.68786,50.81193],[5.68225,50.75651],[5.7707,50.75132],[5.81963,50.71396],[5.88333,50.70992],[5.89217,50.75518],[5.96561,50.76107],[6.04045,50.74546],[6.03959,50.71833],[6.11066,50.72299],[6.18169,50.62383],[6.26953,50.62519],[6.17812,50.54153],[6.22658,50.49432],[6.35036,50.48854],[6.34298,50.38033],[6.40542,50.32331],[6.30647,50.32019],[6.27889,50.26734],[6.17377,50.23165],[6.19232,50.18203],[6.147,50.17775],[6.13779,50.12985],[6.10245,50.17055],[5.96368,50.17263],[5.96133,50.13136],[5.89532,50.11216],[5.81968,50.01329],[5.83578,49.97892],[5.77502,49.9608],[5.73577,49.89684],[5.78257,49.87573]],[[2.99943,50.81035],[2.93719,50.79361],[2.96,50.7735],[2.92247,50.75729],[2.84203,50.75153],[2.86315,50.70826],[2.91065,50.69409],[2.94001,50.74543],[3.02932,50.77896],[2.99943,50.81035]]],icon:"https://osmlab.github.io/editor-layer-index/sources/europe/be/SPW(allonie)2009-2010aerialimagery.png"},{id:"ssb-sentrum",name:"SSB City Centres overlay",type:"wms",template:"https://ogc.ssb.no/wms.ashx?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=layer_193&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[0,22],polygon:[[[31.90425,70.43681],[28.47652,71.32896],[23.6865,71.25143],[16.80906,70.07308],[11.16207,67.52539],[9.97554,64.81158],[4.21871,62.145],[4.37254,59.1872],[6.17431,57.8915],[7.93212,57.73936],[10.77758,58.86491],[11.7224,58.76251],[12.72216,60.11415],[13.05175,61.34935],[12.52439,63.61699],[14.23826,63.98561],[15.11717,65.90166],[18.69871,68.37491],[20.06101,68.26126],[21.00584,68.78415],[25.24656,68.3506],[26.93845,69.8472],[28.76219,69.61121],[28.5864,68.8556],[31.06931,69.51915],[31.90425,70.43681]]],terms_url:"https://www.ssb.no/arealsentrum/",terms_text:"© SSB",description:"Downtown areas with significant commercial and service activities.",icon:"http://www.fosterhjemsforening.no/wp-content/uploads/2015/06/SSB_logo1.png",overlay:true},{id:"ssb-tettsteder",name:"SSB Urban Areas overlay",type:"wms",template:"https://ogc.ssb.no/wms.ashx?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=layer_198&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[0,22],polygon:[[[31.90425,70.43681],[28.47652,71.32896],[23.6865,71.25143],[16.80906,70.07308],[11.16207,67.52539],[9.97554,64.81158],[4.21871,62.145],[4.37254,59.1872],[6.17431,57.8915],[7.93212,57.73936],[10.77758,58.86491],[11.7224,58.76251],[12.72216,60.11415],[13.05175,61.34935],[12.52439,63.61699],[14.23826,63.98561],[15.11717,65.90166],[18.69871,68.37491],[20.06101,68.26126],[21.00584,68.78415],[25.24656,68.3506],[26.93845,69.8472],[28.76219,69.61121],[28.5864,68.8556],[31.06931,69.51915],[31.90425,70.43681]]],terms_url:"https://www.ssb.no/beftett",terms_text:"© SSB",description:"Human settlements of at least 200 people with less than 200 meters between households",icon:"http://www.fosterhjemsforening.no/wp-content/uploads/2015/06/SSB_logo1.png",overlay:true},{id:"Bern-bern2016-tms",name:"Stadt Bern 10cm (2016)",type:"tms",template:"https://mapproxy.osm.ch/tiles/bern2016/EPSG900913/{zoom}/{x}/{y}.png?origin=nw",endDate:"2016-01-01T00:00:00.000Z",startDate:"2016-01-01T00:00:00.000Z",zoomExtent:[8,21],polygon:[[[7.29431,46.92376],[7.29827,46.92747],[7.30616,46.93095],[7.30433,46.93623],[7.30686,46.94037],[7.32464,46.94328],[7.32845,46.94641],[7.34141,46.94608],[7.34385,46.94737],[7.34346,46.94879],[7.35136,46.94855],[7.35056,46.95021],[7.35309,46.95193],[7.3582,46.95118],[7.3685,46.95662],[7.37151,46.96073],[7.37503,46.95983],[7.37851,46.96147],[7.38062,46.96547],[7.38321,46.9663],[7.3938,46.96693],[7.40005,46.96918],[7.40829,46.96869],[7.42817,46.9738],[7.43271,46.97269],[7.43536,46.96843],[7.43785,46.96843],[7.44125,46.97679],[7.44569,46.97479],[7.44838,46.97564],[7.4477,46.97901],[7.44405,46.97807],[7.44127,46.97982],[7.45067,46.99015],[7.45221,46.98968],[7.45465,46.97782],[7.46804,46.97583],[7.47079,46.97],[7.47019,46.96741],[7.47816,46.97118],[7.48452,46.97016],[7.48613,46.9679],[7.48579,46.96468],[7.47847,46.9629],[7.48029,46.96068],[7.47893,46.95878],[7.47978,46.9566],[7.47701,46.95446],[7.48405,46.94999],[7.48339,46.9452],[7.49556,46.93962],[7.49351,46.93766],[7.4908,46.93876],[7.4895,46.93687],[7.47667,46.93695],[7.47811,46.93625],[7.4747,46.93392],[7.47535,46.93299],[7.4691,46.92924],[7.47077,46.9255],[7.45857,46.93484],[7.44764,46.93043],[7.43542,46.93497],[7.4338,46.93312],[7.43764,46.93074],[7.41469,46.93682],[7.41384,46.93157],[7.40708,46.93038],[7.40806,46.92563],[7.40213,46.9242],[7.40148,46.92119],[7.38757,46.93045],[7.38231,46.92728],[7.38002,46.92989],[7.38087,46.93241],[7.37487,46.93143],[7.37489,46.93271],[7.36807,46.93239],[7.36831,46.93043],[7.36041,46.92859],[7.36056,46.9272],[7.33878,46.92454],[7.33937,46.91967],[7.32746,46.91903],[7.32692,46.9236],[7.32437,46.92519],[7.30823,46.92229],[7.29431,46.92376]]],terms_text:"Orthophoto 2016, Vermessungsamt Stadt Bern",best:true,description:"This imagery is provided via a proxy operated by https://sosm.ch/"},{id:"Bern-2012",name:"Stadt Bern 10cm/25cm (2012)",type:"tms",template:"https://mapproxy.osm.ch/tiles/bern2012/EPSG900913/{zoom}/{x}/{y}.png?origin=nw",endDate:"2012-01-01T00:00:00.000Z",startDate:"2012-01-01T00:00:00.000Z",zoomExtent:[14,19],polygon:[[[7.3807,47.00952],[7.38073,47.02301],[7.43853,47.02303],[7.43865,47.01408],[7.45174,47.014],[7.45172,47.00503],[7.54111,47.005],[7.54111,46.99873],[7.54378,46.99871],[7.54375,46.98696],[7.55682,46.987],[7.55685,46.96003],[7.51744,46.96001],[7.51744,46.95108],[7.53051,46.95106],[7.53051,46.92407],[7.51741,46.92405],[7.51738,46.91505],[7.53042,46.91507],[7.53048,46.9061],[7.54358,46.90602],[7.54358,46.87905],[7.55659,46.87903],[7.55662,46.8611],[7.54349,46.86104],[7.5434,46.85212],[7.49095,46.85212],[7.49107,46.87907],[7.47794,46.87909],[7.47797,46.89707],[7.45168,46.89713],[7.45171,46.88808],[7.43855,46.88814],[7.43858,46.87015],[7.41233,46.87015],[7.41236,46.87907],[7.39917,46.87911],[7.3992,46.86108],[7.38613,46.86114],[7.3861,46.85218],[7.373,46.85216],[7.37303,46.86112],[7.34677,46.8611],[7.3468,46.88808],[7.25488,46.88796],[7.25485,46.90596],[7.24172,46.90592],[7.24169,46.91497],[7.22856,46.91493],[7.22833,46.96887],[7.24146,46.96891],[7.24149,46.98688],[7.26769,46.98694],[7.26777,46.99593],[7.28078,46.99595],[7.2809,47.0094],[7.3807,47.00952]]],terms_text:"Orthophoto 2012, Vermessungsamt Stadt Bern",description:"This imagery is provided via a proxy operated by https://sosm.ch/"},{id:"Uster-2008",name:"Stadt Uster Orthophoto 2008 10cm",type:"tms",template:"https://mapproxy.osm.ch/tiles/uster/EPSG900913/{zoom}/{x}/{y}.png?origin=nw",endDate:"2008-01-01T00:00:00.000Z",startDate:"2008-01-01T00:00:00.000Z",zoomExtent:[0,21],polygon:[[[8.68,47.32],[8.74,47.32],[8.74,47.365],[8.68,47.365],[8.68,47.32]]],terms_text:"Stadt Uster Vermessung Orthophoto 2008",description:"This imagery is provided via a proxy operated by https://sosm.ch/"},{id:"Zuerich-zh_luftbild2011-tms",name:"Stadt Zürich Luftbild 2011",type:"tms",template:"https://mapproxy.osm.ch/tiles/zh_luftbild2011/EPSG900913/{zoom}/{x}/{y}.png?origin=nw",endDate:"2011-01-01T00:00:00.000Z",startDate:"2011-01-01T00:00:00.000Z",zoomExtent:[0,21],polygon:[[[8.44624,47.44143],[8.63178,47.43968],[8.62895,47.31377],[8.44381,47.31555],[8.44624,47.44143]]],terms_text:"Stadt Zürich Luftbild 2011",description:"This imagery is provided via a proxy operated by https://sosm.ch/"},{id:"Zuerich-city_map",name:"Stadtplan Zürich",type:"tms",template:"https://mapproxy.osm.ch/tiles/zh_stadtplan/EPSG900913/{zoom}/{x}/{y}.png?origin=nw",zoomExtent:[0,21],polygon:[[[8.56681,47.34713],[8.56665,47.34706],[8.56563,47.34684],[8.56575,47.34666],[8.56509,47.34645],[8.54207,47.33502],[8.54073,47.33376],[8.5403,47.33396],[8.54019,47.33372],[8.54042,47.33358],[8.5388,47.33208],[8.53642,47.33076],[8.53622,47.33018],[8.53345,47.32992],[8.5318,47.3295],[8.53145,47.32846],[8.53102,47.32789],[8.52974,47.32777],[8.52969,47.32687],[8.52899,47.32698],[8.52813,47.32685],[8.52802,47.32635],[8.52755,47.32639],[8.52762,47.32616],[8.52579,47.32619],[8.52563,47.32575],[8.52426,47.32608],[8.5242,47.32486],[8.52372,47.32416],[8.52304,47.32433],[8.52193,47.32436],[8.52194,47.32394],[8.51932,47.32401],[8.51868,47.32386],[8.51768,47.3232],[8.51642,47.32308],[8.5156,47.32315],[8.51472,47.32272],[8.51295,47.3229],[8.51162,47.32222],[8.50957,47.32202],[8.5095,47.32165],[8.50788,47.32203],[8.50735,47.32173],[8.50529,47.32144],[8.50476,47.32121],[8.5043,47.32074],[8.50317,47.32022],[8.50241,47.32053],[8.50227,47.32082],[8.50152,47.32129],[8.50102,47.32198],[8.50095,47.32259],[8.5006,47.32278],[8.50078,47.3237],[8.50066,47.32451],[8.50098,47.32595],[8.5015,47.3265],[8.50159,47.32732],[8.50188,47.32765],[8.50132,47.32883],[8.5014,47.32903],[8.50069,47.32979],[8.50087,47.33053],[8.50063,47.3311],[8.50112,47.33183],[8.50075,47.33202],[8.50078,47.33224],[8.50106,47.3326],[8.50191,47.33303],[8.5022,47.33364],[8.50177,47.33412],[8.50152,47.33504],[8.50199,47.33666],[8.50161,47.33728],[8.49877,47.33968],[8.49808,47.34169],[8.49702,47.34247],[8.49709,47.34326],[8.49798,47.34365],[8.4981,47.34387],[8.49817,47.34453],[8.49773,47.34521],[8.49636,47.34648],[8.4951,47.34691],[8.49467,47.3476],[8.49285,47.34828],[8.49206,47.3495],[8.49145,47.34964],[8.49128,47.34983],[8.49089,47.35067],[8.49,47.35056],[8.48813,47.352],[8.48691,47.35203],[8.4868,47.3522],[8.48728,47.35311],[8.4871,47.3534],[8.48501,47.35469],[8.48463,47.35536],[8.48463,47.3567],[8.48426,47.35737],[8.48321,47.35814],[8.48272,47.35907],[8.48205,47.35954],[8.47879,47.36078],[8.47698,47.36029],[8.47365,47.36081],[8.47275,47.36079],[8.47169,47.36132],[8.47053,47.36166],[8.46951,47.36438],[8.4664,47.36574],[8.46583,47.3661],[8.46545,47.36664],[8.46485,47.36681],[8.46427,47.36728],[8.46418,47.36838],[8.4649,47.36897],[8.46482,47.36911],[8.46938,47.37136],[8.47042,47.3726],[8.47022,47.37395],[8.46868,47.37382],[8.46761,47.37357],[8.46544,47.37444],[8.46288,47.37603],[8.45995,47.3775],[8.45638,47.37801],[8.45116,47.37817],[8.45047,47.37836],[8.44847,47.37967],[8.44801,47.38025],[8.45174,47.38062],[8.45371,47.38027],[8.45614,47.38072],[8.45669,47.38094],[8.45673,47.38244],[8.45745,47.38222],[8.45843,47.38231],[8.45841,47.38263],[8.45745,47.38325],[8.45767,47.3834],[8.45756,47.38371],[8.45807,47.38388],[8.46004,47.38594],[8.46088,47.38704],[8.46121,47.38795],[8.46104,47.38803],[8.46381,47.39053],[8.46518,47.39132],[8.46556,47.39113],[8.46618,47.39113],[8.46727,47.39065],[8.46697,47.39131],[8.46739,47.3929],[8.4671,47.39334],[8.46607,47.39378],[8.4651,47.39453],[8.46484,47.39481],[8.46488,47.39508],[8.46535,47.39492],[8.46854,47.39461],[8.47018,47.39401],[8.47066,47.39439],[8.47191,47.39388],[8.47208,47.39408],[8.47152,47.3943],[8.47151,47.3949],[8.4721,47.39517],[8.47301,47.39506],[8.47349,47.396],[8.46516,47.39829],[8.46568,47.39922],[8.46759,47.39873],[8.46806,47.39957],[8.46615,47.40006],[8.4677,47.403],[8.4699,47.40298],[8.47551,47.40381],[8.47815,47.40387],[8.47819,47.40508],[8.47738,47.40517],[8.47705,47.40619],[8.47729,47.40914],[8.47703,47.40935],[8.47543,47.40971],[8.47583,47.41077],[8.47605,47.41072],[8.47628,47.41102],[8.47665,47.41097],[8.47725,47.41194],[8.47488,47.41241],[8.47394,47.41222],[8.47303,47.41146],[8.47268,47.41058],[8.47101,47.41094],[8.47113,47.41137],[8.47085,47.41167],[8.47044,47.41159],[8.47031,47.41253],[8.46876,47.41225],[8.46801,47.41334],[8.46863,47.41363],[8.46857,47.41408],[8.46955,47.41484],[8.47007,47.41557],[8.46913,47.41649],[8.46913,47.41693],[8.46962,47.41752],[8.47158,47.41763],[8.4772,47.41974],[8.47688,47.42016],[8.47783,47.42212],[8.47895,47.42172],[8.47937,47.42113],[8.47972,47.42141],[8.48131,47.42134],[8.48171,47.423],[8.48294,47.42266],[8.48292,47.42222],[8.48609,47.42155],[8.48658,47.42164],[8.48683,47.42186],[8.48796,47.42201],[8.48851,47.42271],[8.49019,47.42234],[8.491,47.4239],[8.49006,47.42435],[8.49007,47.42532],[8.49027,47.42536],[8.49017,47.42578],[8.48552,47.42712],[8.48481,47.42784],[8.48466,47.42873],[8.48437,47.42896],[8.48445,47.42979],[8.48579,47.43103],[8.49562,47.43281],[8.50027,47.43442],[8.50207,47.43467],[8.50364,47.43402],[8.50997,47.43213],[8.51155,47.43116],[8.51274,47.43085],[8.516,47.43174],[8.51628,47.43175],[8.51681,47.43133],[8.51872,47.4319],[8.51979,47.43167],[8.52463,47.43126],[8.52549,47.43316],[8.5303,47.43207],[8.53063,47.43266],[8.533,47.43228],[8.53374,47.43251],[8.53467,47.432],[8.53521,47.43188],[8.53606,47.43187],[8.5374,47.4314],[8.53964,47.43126],[8.5401,47.4311],[8.54033,47.43186],[8.54363,47.43143],[8.54284,47.43289],[8.54311,47.43288],[8.54451,47.4325],[8.54459,47.43262],[8.54607,47.43207],[8.54858,47.43142],[8.55009,47.43128],[8.55098,47.43102],[8.55199,47.43104],[8.55535,47.43066],[8.5561,47.42803],[8.55684,47.42624],[8.55783,47.42554],[8.55697,47.4249],[8.55736,47.42472],[8.5569,47.42424],[8.55723,47.4241],[8.55419,47.4208],[8.56082,47.41817],[8.56129,47.41829],[8.56235,47.41632],[8.56282,47.41643],[8.56323,47.41565],[8.56622,47.41632],[8.56692,47.41629],[8.56735,47.41649],[8.5678,47.41684],[8.56875,47.41855],[8.56903,47.41871],[8.5696,47.41868],[8.56944,47.41926],[8.57223,47.41893],[8.57367,47.42004],[8.57378,47.4178],[8.57342,47.41711],[8.57386,47.41438],[8.57384,47.41324],[8.57331,47.41257],[8.5726,47.41207],[8.573,47.41144],[8.58806,47.40797],[8.58894,47.40756],[8.59312,47.40704],[8.59728,47.40631],[8.59722,47.406],[8.59608,47.40612],[8.59378,47.40222],[8.59622,47.40154],[8.5948,47.39918],[8.59725,47.39851],[8.59644,47.39715],[8.59637,47.39663],[8.59623,47.39646],[8.59453,47.39712],[8.59392,47.39647],[8.59335,47.39614],[8.59208,47.39691],[8.59172,47.39681],[8.59148,47.397],[8.58828,47.3958],[8.58905,47.39501],[8.58995,47.39478],[8.58818,47.39351],[8.58752,47.39321],[8.58747,47.39297],[8.58619,47.3928],[8.58442,47.39195],[8.58369,47.39008],[8.58305,47.38905],[8.58316,47.38831],[8.58437,47.38834],[8.58432,47.38894],[8.58492,47.39011],[8.58528,47.3904],[8.58696,47.39017],[8.5869,47.38977],[8.58765,47.38905],[8.58698,47.38793],[8.59181,47.38638],[8.59307,47.38565],[8.59299,47.38523],[8.59354,47.38522],[8.59274,47.38417],[8.59082,47.38476],[8.59013,47.38381],[8.58966,47.384],[8.58956,47.38373],[8.59217,47.38311],[8.59151,47.38244],[8.59384,47.38081],[8.59407,47.38061],[8.59406,47.38029],[8.59556,47.3796],[8.59574,47.37927],[8.59721,47.37849],[8.59674,47.37782],[8.59702,47.37716],[8.5976,47.37661],[8.59705,47.37589],[8.59778,47.37557],[8.59828,47.3751],[8.59855,47.37473],[8.59813,47.37447],[8.6002,47.37331],[8.60053,47.3734],[8.60096,47.37312],[8.60194,47.37198],[8.60192,47.37171],[8.60324,47.37131],[8.60607,47.36871],[8.60745,47.36816],[8.60812,47.36761],[8.61067,47.3673],[8.612,47.36684],[8.61308,47.36776],[8.61344,47.36779],[8.61366,47.36802],[8.61549,47.3677],[8.61645,47.36841],[8.61665,47.36828],[8.61764,47.36681],[8.61709,47.36626],[8.61682,47.36535],[8.61565,47.36466],[8.61495,47.36458],[8.61557,47.36342],[8.61566,47.36273],[8.61482,47.36263],[8.6147,47.36151],[8.61929,47.36121],[8.61996,47.36104],[8.62174,47.36007],[8.62257,47.35983],[8.62187,47.35946],[8.62133,47.35746],[8.62351,47.35592],[8.62352,47.35561],[8.62544,47.35466],[8.62416,47.35397],[8.62245,47.35364],[8.62209,47.35334],[8.61989,47.35367],[8.61976,47.35385],[8.61844,47.35382],[8.61839,47.35425],[8.61708,47.35414],[8.61569,47.35442],[8.6152,47.3541],[8.61386,47.35402],[8.61255,47.35437],[8.61156,47.35394],[8.61107,47.35352],[8.61042,47.35337],[8.60946,47.35352],[8.60776,47.35333],[8.60607,47.35363],[8.60506,47.35359],[8.6038,47.353],[8.60305,47.35219],[8.6032,47.35207],[8.60294,47.35175],[8.603,47.35076],[8.60262,47.35073],[8.6016,47.35073],[8.60104,47.35105],[8.60026,47.35112],[8.5996,47.35145],[8.59859,47.35145],[8.59824,47.35165],[8.59689,47.3514],[8.59666,47.35161],[8.59596,47.35169],[8.59564,47.3519],[8.59494,47.35161],[8.59454,47.35175],[8.5939,47.35161],[8.5935,47.35211],[8.59229,47.3523],[8.59189,47.35278],[8.59118,47.35321],[8.59047,47.35271],[8.59014,47.35286],[8.58846,47.35289],[8.58797,47.35307],[8.58748,47.35267],[8.5863,47.35288],[8.58591,47.35231],[8.5853,47.35201],[8.58462,47.35141],[8.58417,47.35129],[8.58438,47.35116],[8.58398,47.35085],[8.58348,47.35104],[8.58335,47.35087],[8.58221,47.35101],[8.58246,47.35062],[8.57851,47.34873],[8.57827,47.34888],[8.57786,47.34865],[8.57686,47.34878],[8.57688,47.34859],[8.57625,47.34839],[8.57308,47.34751],[8.573,47.34765],[8.57214,47.34744],[8.57163,47.34728],[8.5717,47.34712],[8.57029,47.34672],[8.56968,47.3476],[8.56741,47.34674],[8.56681,47.34713]]],terms_text:"Stadt Zürich Open Government Data",description:"This imagery is provided via a proxy operated by https://sosm.ch/"},{id:"stamen-terrain-background",name:"Stamen Terrain",type:"tms",template:"https://stamen-tiles-{switch:a,b,c,d}.a.ssl.fastly.net/terrain-background/{zoom}/{x}/{y}.jpg",zoomExtent:[4,18],terms_url:"http://maps.stamen.com/#terrain",terms_text:"Map tiles by Stamen Design, under CC BY 3.0. Data by OpenStreetMap, under ODbL",icon:"https://stamen.com/wp-content/uploads/2016/07/stamen_compass_rose_small-01.png"},{id:"stockholm-orto",name:"Stockholm Orthophoto",type:"wms",template:"https://openmap.stockholm.se/bios/wms/app/baggis/web/WMS_STHLM_ORTOFOTO_2016?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=p_1002630&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[5,21],polygon:[[[17.8755,59.2625],[17.94411,59.27307],[18.09551,59.22603],[18.19582,59.22786],[18.20297,59.24886],[18.12538,59.30779],[18.1786,59.32566],[18.09876,59.3721],[18.04264,59.37816],[18.00796,59.34334],[17.93655,59.37641],[17.97483,59.40246],[17.90882,59.4417],[17.8854,59.43792],[17.88918,59.41382],[17.84077,59.38568],[17.81708,59.40054],[17.77725,59.39984],[17.75622,59.3916],[17.79899,59.36204],[17.94993,59.31121],[17.85622,59.28412],[17.8755,59.2625]]],terms_url:"http://dataportalen.stockholm.se/dataportalen/",terms_text:"© Stockholm municipality, CC0",best:true,description:"Orthophotos from the municipality of Stockholm 2016, CC0 license",icon:"https://upload.wikimedia.org/wikipedia/commons/thumb/4/4d/Stockholm_vapen_bra.svg/196px-Stockholm_vapen_bra.svg.png"},{id:"Surrey-Air_Survey",name:"Surrey Air Survey",type:"tms",template:"https://{switch:a,b,c}.surrey.aerial.openstreetmap.org.uk/layer/gb_surrey_aerial/{zoom}/{x}/{y}.png",endDate:"2009-01-01T00:00:00.000Z",startDate:"2007-01-01T00:00:00.000Z",zoomExtent:[8,21],polygon:[[[-0.75248,51.08219],[-0.75952,51.08563],[-0.80143,51.14579],[-0.83989,51.14407],[-0.83577,51.18024],[-0.85295,51.20113],[-0.85227,51.20962],[-0.84952,51.2179],[-0.82669,51.24037],[-0.8121,51.24692],[-0.77365,51.24596],[-0.75442,51.23811],[-0.75408,51.23392],[-0.74464,51.23338],[-0.74307,51.28472],[-0.7515,51.30695],[-0.76644,51.3121],[-0.78206,51.32702],[-0.78154,51.33881],[-0.73743,51.37205],[-0.71923,51.37697],[-0.67958,51.3848],[-0.68078,51.39015],[-0.65314,51.39176],[-0.63014,51.39058],[-0.62911,51.39701],[-0.62344,51.39776],[-0.61314,51.42956],[-0.60025,51.44591],[-0.58671,51.44454],[-0.57624,51.4532],[-0.56268,51.45235],[-0.54774,51.447],[-0.53727,51.44486],[-0.5371,51.45267],[-0.54396,51.45459],[-0.54053,51.46989],[-0.53092,51.47609],[-0.50912,51.47448],[-0.5086,51.46957],[-0.49006,51.46828],[-0.45264,51.46069],[-0.44869,51.44293],[-0.44148,51.44186],[-0.44183,51.43694],[-0.41127,51.43801],[-0.40149,51.42795],[-0.38071,51.42624],[-0.38054,51.41617],[-0.34913,51.41382],[-0.3275,51.40375],[-0.30398,51.39904],[-0.30192,51.37547],[-0.30948,51.36969],[-0.31119,51.35297],[-0.29557,51.35415],[-0.29231,51.36733],[-0.2851,51.36808],[-0.27875,51.37719],[-0.26553,51.38372],[-0.24115,51.3848],[-0.21231,51.36283],[-0.21077,51.34986],[-0.19086,51.35029],[-0.15429,51.33388],[-0.14966,51.30577],[-0.10743,51.29665],[-0.08872,51.30996],[-0.08786,51.32208],[-0.0652,51.32154],[-0.06417,51.32648],[-0.05198,51.32637],[-0.05284,51.33463],[-0.03308,51.34309],[0.00192,51.33763],[0.01188,51.3282],[0.01393,51.29944],[0.02029,51.29944],[0.02406,51.30727],[0.03316,51.30867],[0.04552,51.30545],[0.05239,51.28774],[0.06166,51.25778],[0.06406,51.24155],[0.04621,51.21263],[0.04071,51.21091],[0.04483,51.19898],[0.04947,51.19973],[0.05582,51.19446],[0.06114,51.17907],[0.06234,51.15421],[0.05771,51.14171],[0.02046,51.13654],[-0.0446,51.13364],[-0.1567,51.13525],[-0.15721,51.129],[-0.22879,51.11834],[-0.24733,51.11834],[-0.25008,51.12114],[-0.29935,51.1137],[-0.32218,51.11198],[-0.32235,51.10584],[-0.3596,51.10196],[-0.35891,51.11133],[-0.38638,51.11176],[-0.3869,51.10625],[-0.4281,51.09472],[-0.48568,51.09516],[-0.48713,51.08723],[-0.52974,51.08654],[-0.53023,51.07899],[-0.61046,51.07655],[-0.60997,51.08067],[-0.6578,51.07922],[-0.65828,51.07434],[-0.68365,51.07075],[-0.6998,51.07083],[-0.72966,51.07449],[-0.75248,51.08219]]]},{id:"Swietochlowice-2008",name:"Świętochłowice: Orthophotomap 2008 (aerial image)",type:"wms",template:"https://swietochlowice.geoportal2.pl/map/wms/wms.php?SERVICE=WMS&REQUEST=GetMap&VERSION=1.1.1&LAYERS=ortofotomapa2008&STYLES=&FORMAT=image/jpeg&BBOX={bbox}&WIDTH={width}&HEIGHT={height}&SRS={proj}",projection:"EPSG:4326",endDate:"2008-01-01T00:00:00.000Z",startDate:"2008-01-01T00:00:00.000Z",zoomExtent:[0,23],polygon:[[[18.92818,50.32151],[18.93028,50.31766],[18.93402,50.31392],[18.93193,50.31119],[18.92556,50.30575],[18.92429,50.30354],[18.92964,50.30206],[18.93083,50.3004],[18.9283,50.2961],[18.93573,50.29356],[18.93885,50.28965],[18.9371,50.28727],[18.93966,50.28206],[18.93402,50.27553],[18.92953,50.27543],[18.93037,50.27338],[18.93413,50.27104],[18.93239,50.26883],[18.92716,50.26926],[18.90447,50.27371],[18.89758,50.27612],[18.89569,50.28028],[18.89783,50.28566],[18.89712,50.2878],[18.88292,50.29258],[18.88031,50.29473],[18.88311,50.29894],[18.88819,50.30164],[18.88326,50.30717],[18.88444,50.31183],[18.89149,50.31809],[18.89306,50.32558],[18.89568,50.32704],[18.92818,50.32151]]],terms_text:"Urząd Miasta Świętochłowice"},{id:"Swietochlowice-2009",name:"Świętochłowice: Orthophotomap 2009 (aerial image)",type:"wms",template:"https://swietochlowice.geoportal2.pl/map/wms/wms.php?SERVICE=WMS&REQUEST=GetMap&VERSION=1.1.1&LAYERS=ortofotomapa2009&STYLES=&FORMAT=image/jpeg&BBOX={bbox}&WIDTH={width}&HEIGHT={height}&SRS={proj}",projection:"EPSG:4326",endDate:"2009-01-01T00:00:00.000Z",startDate:"2009-01-01T00:00:00.000Z",zoomExtent:[0,23],polygon:[[[18.92818,50.32151],[18.93028,50.31766],[18.93402,50.31392],[18.93193,50.31119],[18.92556,50.30575],[18.92429,50.30354],[18.92964,50.30206],[18.93083,50.3004],[18.9283,50.2961],[18.93573,50.29356],[18.93885,50.28965],[18.9371,50.28727],[18.93966,50.28206],[18.93402,50.27553],[18.92953,50.27543],[18.93037,50.27338],[18.93413,50.27104],[18.93239,50.26883],[18.92716,50.26926],[18.90447,50.27371],[18.89758,50.27612],[18.89569,50.28028],[18.89783,50.28566],[18.89712,50.2878],[18.88292,50.29258],[18.88031,50.29473],[18.88311,50.29894],[18.88819,50.30164],[18.88326,50.30717],[18.88444,50.31183],[18.89149,50.31809],[18.89306,50.32558],[18.89568,50.32704],[18.92818,50.32151]]],terms_text:"Urząd Miasta Świętochłowice"},{id:"Swietochlowice-2012",name:"Świętochłowice: Orthophotomap 2012 (aerial image)",type:"wms",template:"https://swietochlowice.geoportal2.pl/map/wms/wms.php?SERVICE=WMS&REQUEST=GetMap&VERSION=1.1.1&LAYERS=ortofotomapa2012&STYLES=&FORMAT=image/jpeg&BBOX={bbox}&WIDTH={width}&HEIGHT={height}&SRS={proj}",projection:"EPSG:4326",endDate:"2012-01-01T00:00:00.000Z",startDate:"2012-01-01T00:00:00.000Z",zoomExtent:[0,23],polygon:[[[18.92818,50.32151],[18.93028,50.31766],[18.93402,50.31392],[18.93193,50.31119],[18.92556,50.30575],[18.92429,50.30354],[18.92964,50.30206],[18.93083,50.3004],[18.9283,50.2961],[18.93573,50.29356],[18.93885,50.28965],[18.9371,50.28727],[18.93966,50.28206],[18.93402,50.27553],[18.92953,50.27543],[18.93037,50.27338],[18.93413,50.27104],[18.93239,50.26883],[18.92716,50.26926],[18.90447,50.27371],[18.89758,50.27612],[18.89569,50.28028],[18.89783,50.28566],[18.89712,50.2878],[18.88292,50.29258],[18.88031,50.29473],[18.88311,50.29894],[18.88819,50.30164],[18.88326,50.30717],[18.88444,50.31183],[18.89149,50.31809],[18.89306,50.32558],[18.89568,50.32704],[18.92818,50.32151]]],terms_text:"Urząd Miasta Świętochłowice"},{id:"Szeged_2011",name:"Szeged orthophoto 2011",type:"tms",template:"http://e.tile.openstreetmap.hu/szeged-2011-10cm/{zoom}/{x}/{y}.png",endDate:"2011-01-01T00:00:00.000Z",startDate:"2011-01-01T00:00:00.000Z",zoomExtent:[10,22],polygon:[[[20.14599,46.22811],[20.13323,46.22904],[20.12584,46.22987],[20.12233,46.23099],[20.12085,46.23175],[20.11897,46.23351],[20.11312,46.24136],[20.11203,46.2433],[20.11157,46.245],[20.11119,46.24709],[20.11129,46.24877],[20.11159,46.25097],[20.11222,46.2528],[20.11299,46.25427],[20.11354,46.25535],[20.11477,46.2568],[20.13523,46.27685],[20.13664,46.27751],[20.13789,46.27803],[20.13939,46.27835],[20.14088,46.27846],[20.16115,46.27816],[20.16211,46.27816],[20.16359,46.2777],[20.16618,46.27615],[20.16878,46.27386],[20.16961,46.27144],[20.16959,46.27045],[20.17009,46.27044],[20.17399,46.26433],[20.17662,46.25829],[20.1948,46.25492],[20.18587,46.24481],[20.18466,46.24531],[20.17804,46.23831],[20.17818,46.23771],[20.17953,46.2371],[20.17257,46.23002],[20.16983,46.23504],[20.16877,46.23629],[20.16703,46.23785],[20.16594,46.23873],[20.16544,46.239],[20.16548,46.239],[20.16352,46.24014],[20.16021,46.2412],[20.15927,46.24153],[20.15927,46.24158],[20.15835,46.24185],[20.15495,46.24229],[20.15108,46.23515],[20.14938,46.23246],[20.14599,46.22811]]],terms_url:"http://www.geo.u-szeged.hu",terms_text:"SZTE TFGT - University of Szeged",best:true,description:"Inner part of Szeged"},{id:"TW_NLSC_WMS_EMAP6",name:"Taiwan e-Map Open Data",type:"tms",template:"https://wmts.nlsc.gov.tw/wmts/EMAP6_OPENDATA/default/GoogleMapsCompatible/{zoom}/{y}/{x}",zoomExtent:[0,15],polygon:[[[121.2237,25.76997],[122.2251,26.60305],[122.9312,22.57058],[120.6771,20.72799],[118.2509,23.26265],[118.3036,23.30751],[118.1978,24.34453],[118.1036,24.36172],[118.2283,24.49486],[118.4416,24.55302],[118.6024,24.46068],[120.0474,25.38843],[119.8935,25.78169],[119.787,26.2048],[120.4578,26.53253],[121.2237,25.76997]]],terms_url:"https://maps.nlsc.gov.tw/",terms_text:"© National Land Surveying and Mapping Center, Taiwan OGDL 1.0",icon:"https://osmlab.github.io/editor-layer-index/sources/asia/tw/Taiwane-MapOpenData.png"},{id:"TW_NLSC_WMS_LANDSECT",name:"Taiwan Land-Section Data",type:"wms",template:"https://wms.nlsc.gov.tw/wms?VERSION=1.1.1&FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=LANDSECT&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[121.2237,25.76997],[122.2251,26.60305],[122.9312,22.57058],[120.6771,20.72799],[118.2509,23.26265],[118.3036,23.30751],[118.1978,24.34453],[118.1036,24.36172],[118.2283,24.49486],[118.4416,24.55302],[118.6024,24.46068],[120.0474,25.38843],[119.8935,25.78169],[119.787,26.2048],[120.4578,26.53253],[121.2237,25.76997]]],terms_url:"https://maps.nlsc.gov.tw/",terms_text:"© National Land Surveying and Mapping Center, Taiwan OGDL 1.0",icon:"https://osmlab.github.io/editor-layer-index/sources/asia/tw/Taiwane-MapOpenData.png"},{id:"TW_NLSC_WMS_Village",name:"Taiwan Village Boundaries",type:"wms",template:"https://wms.nlsc.gov.tw/wms?VERSION=1.1.1&FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Village&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[121.2237,25.76997],[122.2251,26.60305],[122.9312,22.57058],[120.6771,20.72799],[118.2509,23.26265],[118.3036,23.30751],[118.1978,24.34453],[118.1036,24.36172],[118.2283,24.49486],[118.4416,24.55302],[118.6024,24.46068],[120.0474,25.38843],[119.8935,25.78169],[119.787,26.2048],[120.4578,26.53253],[121.2237,25.76997]]],terms_url:"https://maps.nlsc.gov.tw/",terms_text:"© National Land Surveying and Mapping Center, Taiwan OGDL 1.0",icon:"https://osmlab.github.io/editor-layer-index/sources/asia/tw/Taiwane-MapOpenData.png"},{id:"TEClines",name:"TEC bus lines",type:"wms",template:"https://geodata.tec-wl.be/arcgis/services/Lignes/MapServer/WMSServer?FORMAT=image/png&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[5.40236,49.50688],[5.81984,49.54253],[6.1714,49.62089],[5.85829,49.68846],[5.7704,49.85343],[5.894,50.11832],[6.15492,50.13593],[6.39662,50.36775],[6.28126,50.46576],[6.11372,50.7933],[5.72646,50.77941],[5.70998,50.85229],[5.61385,50.80024],[5.46278,50.79677],[5.21284,50.70119],[4.94917,50.80371],[4.75966,50.80718],[4.72121,50.88869],[4.60585,50.77941],[4.48775,50.85749],[4.36964,50.85056],[4.15266,50.72728],[3.59236,50.76725],[3.29848,50.76377],[3.04579,50.80024],[2.86177,50.72728],[2.89748,50.68553],[3.0815,50.76725],[3.19685,50.68031],[3.28749,50.52691],[3.67201,50.47625],[3.68574,50.31692],[3.99062,50.27305],[4.14992,50.17465],[4.24055,50.08661],[4.15266,49.99842],[4.18562,49.96486],[4.55366,49.94542],[4.69923,50.03372],[4.81184,50.0919],[4.84206,50.01607],[4.86677,49.90475],[4.85854,49.80382],[5.08925,49.7648],[5.34743,49.60843],[5.40236,49.50688]]],icon:"https://osmlab.github.io/editor-layer-index/sources/europe/be/TECbusstops.png",overlay:true},{id:"TECstops",name:"TEC bus stops",type:"wms",template:"https://geodata.tec-wl.be/arcgis/services/Poteaux/MapServer/WMSServer?FORMAT=image/png&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[5.40236,49.50688],[5.81984,49.54253],[6.1714,49.62089],[5.85829,49.68846],[5.7704,49.85343],[5.894,50.11832],[6.15492,50.13593],[6.39662,50.36775],[6.28126,50.46576],[6.11372,50.7933],[5.72646,50.77941],[5.70998,50.85229],[5.61385,50.80024],[5.46278,50.79677],[5.21284,50.70119],[4.94917,50.80371],[4.75966,50.80718],[4.72121,50.88869],[4.60585,50.77941],[4.48775,50.85749],[4.36964,50.85056],[4.15266,50.72728],[3.59236,50.76725],[3.29848,50.76377],[3.04579,50.80024],[2.86177,50.72728],[2.89748,50.68553],[3.0815,50.76725],[3.19685,50.68031],[3.28749,50.52691],[3.67201,50.47625],[3.68574,50.31692],[3.99062,50.27305],[4.14992,50.17465],[4.24055,50.08661],[4.15266,49.99842],[4.18562,49.96486],[4.55366,49.94542],[4.69923,50.03372],[4.81184,50.0919],[4.84206,50.01607],[4.86677,49.90475],[4.85854,49.80382],[5.08925,49.7648],[5.34743,49.60843],[5.40236,49.50688]]],icon:"https://osmlab.github.io/editor-layer-index/sources/europe/be/TECbusstops.png",overlay:true},{id:"teotonio_vilela",name:"Teotonio Vilela AL",type:"wms",template:"http://geoserver.dados.al.gov.br:8080/geoserver/Alagoas/ows?LAYERS=Teotonio%20Vilela&SERVICE=WMS&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.0&SERVICE=WMS&REQUEST=GetMap&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[-36.31164,-9.95468],[-36.31158,-9.94382],[-36.31145,-9.93197],[-36.31127,-9.92436],[-36.31123,-9.91848],[-36.31119,-9.91637],[-36.31141,-9.91324],[-36.3111,-9.90922],[-36.31108,-9.90318],[-36.31099,-9.89379],[-36.31089,-9.8842],[-36.31078,-9.87412],[-36.31068,-9.86457],[-36.3318,-9.86432],[-36.34001,-9.86437],[-36.3478,-9.86425],[-36.35917,-9.8642],[-36.37047,-9.86404],[-36.38448,-9.86386],[-36.40164,-9.86364],[-36.40221,-9.9225],[-36.40249,-9.93177],[-36.40259,-9.94183],[-36.40248,-9.94804],[-36.40266,-9.9537],[-36.3855,-9.95384],[-36.38283,-9.95392],[-36.37096,-9.95399],[-36.36232,-9.95423],[-36.34747,-9.95422],[-36.33287,-9.95446],[-36.3291,-9.95456],[-36.32089,-9.95459],[-36.31164,-9.95468]]],terms_url:"http://www.seplag.al.gov.br",terms_text:"Secretaria de Estado do Planejamento, Gestão e Patrimônio"},{id:"tnris.org",name:"Texas Orthophoto",type:"tms",template:"https://txgi.tnris.org/login/path/ecology-fiona-poem-romeo/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=texas&STYLE=&FORMAT=image/png&tileMatrixSet=0to20&tileMatrix=0to20:{zoom}&tileRow={y}&tileCol={x}",startDate:"2012-01-01T00:00:00.000Z",zoomExtent:[0,20],polygon:[[[-99.99854,34.56018],[-95.55655,33.99257],[-93.89679,33.61039],[-93.98468,32.04103],[-93.41614,31.02505],[-93.74531,29.57268],[-96.50492,28.23159],[-97.36942,26.95467],[-97.04867,25.8053],[-99.07342,26.32559],[-100.76599,29.02532],[-102.33154,29.84339],[-103.13355,28.88112],[-104.28879,29.28831],[-104.72698,29.94816],[-104.72697,30.23535],[-106.5345,31.78457],[-106.75767,31.78457],[-106.75766,32.04386],[-106.61848,32.04385],[-103.11949,32.04376],[-103.09544,36.50046],[-103.05798,36.54269],[-100.00042,36.54222],[-99.99854,34.56018]]],terms_url:"https://tnris.org/maps-and-data/online-mapping-services",terms_text:"Texas Natural Resources Information System"},{id:"US-TIGER-Roads-2017",name:"TIGER Roads 2017",type:"tms",template:"https://{switch:a,b,c,d}.tiles.mapbox.com/styles/v1/openstreetmapus/cj8dftc3q1ecn2tnx9qhwyj0c/tiles/256/{zoom}/{x}/{y}?access_token=pk.eyJ1Ijoib3BlbnN0cmVldG1hcHVzIiwiYSI6ImNpcnF4Ym43dDBoOXZmYW04bWhlNWdrY2EifQ.4SFexuTUuKkZeerO3dgtmw",endDate:"2017-01-01T00:00:00.000Z",startDate:"2017-01-01T00:00:00.000Z",zoomExtent:[0,22],polygon:[[[-124.76179,48.41301],[-124.60595,45.90245],[-124.99343,40.05576],[-122.53697,36.85661],[-119.97759,33.00641],[-117.67593,32.46302],[-114.86123,32.47999],[-111.00893,31.33601],[-108.19927,31.326],[-108.18711,31.77551],[-106.53072,31.78209],[-106.48421,31.74645],[-106.42932,31.75206],[-106.28689,31.56133],[-106.20525,31.4467],[-105.02053,30.5361],[-104.58819,29.69979],[-103.25189,28.89087],[-102.71736,29.39206],[-102.1514,29.74757],[-101.25529,29.48105],[-100.00624,28.00822],[-99.23511,26.4476],[-98.01091,25.9928],[-97.43502,25.8266],[-96.95553,25.98216],[-96.80617,27.79782],[-95.55633,28.58761],[-93.74053,29.47421],[-90.90285,28.85645],[-88.01567,28.99443],[-88.01625,30.00389],[-86.02775,30.00475],[-84.01879,28.99618],[-81.9972,25.98268],[-81.99666,25.01349],[-84.01656,25.01258],[-84.01601,24.00527],[-80.02,24.0071],[-79.89011,26.85507],[-80.02453,32.01613],[-75.41474,35.05319],[-74.02112,39.57279],[-72.00202,40.99125],[-69.87974,40.99205],[-69.84893,43.26199],[-66.94528,44.71049],[-67.75966,47.099],[-69.25051,47.51223],[-70.46149,46.21766],[-71.41227,45.25488],[-72.02225,45.00598],[-75.07988,44.98029],[-76.90231,43.80246],[-78.76239,43.62496],[-79.15798,43.44626],[-79.00601,42.80053],[-82.66248,41.68895],[-82.17616,43.58854],[-83.2814,46.13885],[-87.50645,48.01427],[-88.34922,48.29633],[-89.43531,47.98378],[-93.99811,49.00671],[-95.11054,49.412],[-96.01312,49.00605],[-123.32289,49.00429],[-123.22752,48.18499],[-124.76179,48.41301]],[[-160.57876,22.50629],[-160.57822,21.49846],[-158.74706,21.24398],[-157.50832,20.9958],[-155.99619,18.77902],[-154.62178,18.7587],[-154.68902,19.88057],[-156.29276,21.22259],[-157.50474,21.9985],[-159.00937,22.50702],[-160.57876,22.50629]],[[-167.1572,68.722],[-164.8554,67.0255],[-168.0022,66.0018],[-169.0087,66.0015],[-169.0075,64.9988],[-172.5143,63.8767],[-173.8197,59.7401],[-178.0001,52.2446],[-177.9993,51.2554],[-171.4689,51.8215],[-162.4025,53.9567],[-159.0076,55.0025],[-158.0191,55.0028],[-151.9963,55.9992],[-151.5003,57.9988],[-151.5013,58.992],[-138.516,58.9953],[-138.515,57.9986],[-133.9948,54.0032],[-130.0044,54.0043],[-130.0071,57.0001],[-131.9759,56.9995],[-135.123,59.7566],[-138.0072,59.9918],[-139.1716,60.4127],[-140.9874,61.0119],[-140.9684,69.9535],[-156.1769,71.5633],[-160.4136,70.7398],[-163.0218,69.9707],[-164.9717,68.9947],[-167.1572,68.722]],[[-68.2,17.8],[-64.32,17.38],[-64.64,18.36],[-65.33,18.57],[-67.9,18.67],[-68.2,17.8]],[[146.2,15.4],[145.7,15.6],[144.2,13.2],[144.8,12.9],[146.2,15.4]],[[179.99,52.2],[172,53.5],[172,52.5],[179.99,51],[179.99,52.2]]],description:"Yellow = Public domain map data from the US Census. Red = Data not found in OpenStreetMap",icon:"https://osmlab.github.io/editor-layer-index/sources/north-america/us/TIGER2017RoadsOverlay.png",overlay:true},{id:"US-TIGER-Roads-2018",name:"TIGER Roads 2018",type:"tms",template:"https://{switch:a,b,c,d}.tiles.mapbox.com/styles/v1/openstreetmapus/cjo1wbulo3ub82ro1c9onlzmh/tiles/256/{zoom}/{x}/{y}?access_token=pk.eyJ1Ijoib3BlbnN0cmVldG1hcHVzIiwiYSI6ImNpcnF4Ym43dDBoOXZmYW04bWhlNWdrY2EifQ.4SFexuTUuKkZeerO3dgtmw",endDate:"2018-01-01T00:00:00.000Z",startDate:"2018-01-01T00:00:00.000Z",zoomExtent:[0,22],polygon:[[[-124.76179,48.41301],[-124.60595,45.90245],[-124.99343,40.05576],[-122.53697,36.85661],[-119.97759,33.00641],[-117.67593,32.46302],[-114.86123,32.47999],[-111.00893,31.33601],[-108.19927,31.326],[-108.18711,31.77551],[-106.53072,31.78209],[-106.48421,31.74645],[-106.42932,31.75206],[-106.28689,31.56133],[-106.20525,31.4467],[-105.02053,30.5361],[-104.58819,29.69979],[-103.25189,28.89087],[-102.71736,29.39206],[-102.1514,29.74757],[-101.25529,29.48105],[-100.00624,28.00822],[-99.23511,26.4476],[-98.01091,25.9928],[-97.43502,25.8266],[-96.95553,25.98216],[-96.80617,27.79782],[-95.55633,28.58761],[-93.74053,29.47421],[-90.90285,28.85645],[-88.01567,28.99443],[-88.01625,30.00389],[-86.02775,30.00475],[-84.01879,28.99618],[-81.9972,25.98268],[-81.99666,25.01349],[-84.01656,25.01258],[-84.01601,24.00527],[-80.02,24.0071],[-79.89011,26.85507],[-80.02453,32.01613],[-75.41474,35.05319],[-74.02112,39.57279],[-72.00202,40.99125],[-69.87974,40.99205],[-69.84893,43.26199],[-66.94528,44.71049],[-67.75966,47.099],[-69.25051,47.51223],[-70.46149,46.21766],[-71.41227,45.25488],[-72.02225,45.00598],[-75.07988,44.98029],[-76.90231,43.80246],[-78.76239,43.62496],[-79.15798,43.44626],[-79.00601,42.80053],[-82.66248,41.68895],[-82.17616,43.58854],[-83.2814,46.13885],[-87.50645,48.01427],[-88.34922,48.29633],[-89.43531,47.98378],[-93.99811,49.00671],[-95.11054,49.412],[-96.01312,49.00605],[-123.32289,49.00429],[-123.22752,48.18499],[-124.76179,48.41301]],[[-160.57876,22.50629],[-160.57822,21.49846],[-158.74706,21.24398],[-157.50832,20.9958],[-155.99619,18.77902],[-154.62178,18.7587],[-154.68902,19.88057],[-156.29276,21.22259],[-157.50474,21.9985],[-159.00937,22.50702],[-160.57876,22.50629]],[[-167.1572,68.722],[-164.8554,67.0255],[-168.0022,66.0018],[-169.0087,66.0015],[-169.0075,64.9988],[-172.5143,63.8767],[-173.8197,59.7401],[-178.0001,52.2446],[-177.9993,51.2554],[-171.4689,51.8215],[-162.4025,53.9567],[-159.0076,55.0025],[-158.0191,55.0028],[-151.9963,55.9992],[-151.5003,57.9988],[-151.5013,58.992],[-138.516,58.9953],[-138.515,57.9986],[-133.9948,54.0032],[-130.0044,54.0043],[-130.0071,57.0001],[-131.9759,56.9995],[-135.123,59.7566],[-138.0072,59.9918],[-139.1716,60.4127],[-140.9874,61.0119],[-140.9684,69.9535],[-156.1769,71.5633],[-160.4136,70.7398],[-163.0218,69.9707],[-164.9717,68.9947],[-167.1572,68.722]],[[-68.2,17.8],[-64.32,17.38],[-64.64,18.36],[-65.33,18.57],[-67.9,18.67],[-68.2,17.8]],[[146.2,15.4],[145.7,15.6],[144.2,13.2],[144.8,12.9],[146.2,15.4]],[[179.99,52.2],[172,53.5],[172,52.5],[179.99,51],[179.99,52.2]]],description:"Yellow = Public domain map data from the US Census. Red = Data not found in OpenStreetMap",icon:"https://osmlab.github.io/editor-layer-index/sources/north-america/us/TIGER2017RoadsOverlay.png",overlay:true},{id:"tirol.gv.at-contourlines",name:"Tiris: contour lines",type:"wms",template:"https://gis.tirol.gv.at/arcgis/services/Service_Public/terrain/MapServer/WmsServer?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Hoehenschichtlinien_20m&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[15,22],polygon:[[[10.43998,47.59768],[10.47886,47.59925],[10.50277,47.58656],[10.4838,47.55979],[10.51312,47.5435],[10.57177,47.54582],[10.57004,47.56212],[10.60109,47.58074],[10.63904,47.5691],[10.70804,47.57027],[10.71149,47.54932],[10.76841,47.55048],[10.78566,47.52603],[10.89605,47.55048],[10.93572,47.5237],[10.934,47.50506],[10.89088,47.49573],[10.95125,47.49107],[10.9547,47.46776],[11.003,47.43276],[10.99092,47.40825],[11.10304,47.40475],[11.11511,47.41993],[11.20998,47.4456],[11.26863,47.44093],[11.26691,47.41059],[11.29451,47.4421],[11.33073,47.46076],[11.38248,47.45843],[11.3704,47.47592],[11.4394,47.53069],[11.467,47.51787],[11.57394,47.5237],[11.57567,47.55863],[11.59809,47.59121],[11.63431,47.60633],[11.66881,47.5947],[11.793,47.60284],[11.83958,47.59238],[11.84993,47.61098],[12.00689,47.63656],[12.03622,47.62494],[12.07761,47.62726],[12.10866,47.61912],[12.19491,47.62261],[12.15351,47.68768],[12.15868,47.7167],[12.18111,47.71206],[12.21906,47.72482],[12.24148,47.75382],[12.27253,47.7515],[12.2846,47.73178],[12.26563,47.69581],[12.33635,47.7109],[12.37602,47.69581],[12.44329,47.70277],[12.45364,47.69232],[12.45364,47.6749],[12.51057,47.63191],[12.53126,47.64586],[12.58991,47.63424],[12.57956,47.61098],[12.66581,47.5947],[12.67961,47.57492],[12.64511,47.55048],[12.66753,47.53185],[12.68478,47.50389],[12.71238,47.48175],[12.66753,47.45609],[12.64166,47.45959],[12.65028,47.44326],[12.62096,47.40709],[12.57439,47.38607],[12.55024,47.39658],[12.49159,47.37205],[12.50884,47.35102],[12.48814,47.32063],[12.43467,47.32297],[12.41397,47.30426],[12.36395,47.30894],[12.3122,47.32764],[12.2708,47.29841],[12.17766,47.29373],[12.14833,47.28437],[12.11729,47.29958],[12.09831,47.27501],[12.12591,47.25042],[12.09659,47.19771],[12.11039,47.14846],[12.14143,47.10974],[12.13799,47.08977],[12.15006,47.07568],[12.00517,47.04395],[11.92065,47.02985],[11.83095,46.99103],[11.78783,46.98633],[11.77403,46.9675],[11.73091,46.96514],[11.70676,46.98986],[11.64294,46.99456],[11.61189,47.00515],[11.53254,46.97809],[11.49287,47.00868],[11.44457,46.9675],[11.4049,46.96161],[11.34453,46.98633],[11.20309,46.9569],[11.17549,46.96161],[11.17721,46.94395],[11.14616,46.92275],[11.12546,46.92275],[11.10822,46.90389],[11.11511,46.88857],[11.08234,46.85319],[11.09614,46.8237],[11.05129,46.80245],[11.02369,46.76229],[10.91848,46.77056],[10.88398,46.75756],[10.84085,46.77292],[10.82361,46.76938],[10.79083,46.78946],[10.75633,46.77883],[10.72529,46.79064],[10.74771,46.82724],[10.69424,46.84494],[10.67354,46.86971],[10.60799,46.85319],[10.55452,46.82724],[10.52002,46.83904],[10.46827,46.83668],[10.45103,46.8815],[10.47517,46.93217],[10.41308,46.95572],[10.3941,46.98868],[10.3665,46.98044],[10.33891,46.94748],[10.32856,46.91803],[10.29751,46.91332],[10.25956,46.9251],[10.23886,46.86263],[10.16642,46.83904],[10.13537,46.8473],[10.13192,46.87207],[10.10604,46.88621],[10.09224,46.92746],[10.12502,46.95219],[10.14572,47.00044],[10.11294,47.02514],[10.15262,47.04983],[10.13019,47.06276],[10.13364,47.09095],[10.15952,47.12617],[10.20091,47.1426],[10.19229,47.20005],[10.20954,47.21294],[10.18711,47.23989],[10.20091,47.25628],[10.16814,47.2633],[10.16814,47.28086],[10.20264,47.29139],[10.24404,47.28905],[10.33373,47.32063],[10.38893,47.39074],[10.4148,47.39424],[10.4562,47.43626],[10.44758,47.48175],[10.41998,47.50506],[10.4424,47.55514],[10.41308,47.57143],[10.43998,47.59768]],[[12.4019,47.16019],[12.35705,47.13908],[12.35015,47.11208],[12.31048,47.10739],[12.25528,47.07215],[12.21388,47.05923],[12.20008,47.02632],[12.14488,47.03102],[12.11556,47.0075],[12.13626,46.95926],[12.16731,46.9357],[12.14316,46.91096],[12.18973,46.90036],[12.21733,46.86617],[12.25528,46.88386],[12.27425,46.88268],[12.2984,46.83432],[12.27598,46.82016],[12.27943,46.77765],[12.35015,46.77174],[12.3812,46.715],[12.44329,46.68425],[12.51402,46.67004],[12.56576,46.64873],[12.62958,46.65347],[12.70203,46.65347],[12.70375,46.69844],[12.72963,46.70081],[12.72273,46.73747],[12.80207,46.74929],[12.85382,46.74456],[12.90384,46.77174],[12.92799,46.75992],[12.95732,46.77647],[12.97974,46.79772],[12.89522,46.83314],[12.89522,46.84848],[12.8452,46.86381],[12.84692,46.91568],[12.7969,46.93099],[12.78828,46.94748],[12.7486,46.96867],[12.73653,46.99691],[12.78138,47.0416],[12.7624,47.051],[12.7141,47.04513],[12.71065,47.07803],[12.62268,47.12617],[12.56921,47.14142],[12.55196,47.13321],[12.52609,47.15433],[12.48297,47.16488],[12.46054,47.14846],[12.43467,47.15785],[12.41915,47.14377],[12.4019,47.16019]]],terms_url:"https://tiris.tirol.gv.at",terms_text:"tiris.tirol.gv.at",icon:"https://static.tirol.gv.at/plainhtml/v1/tirollogo.gif",overlay:true},{id:"tirol.gv.at-DGM",name:"Tiris: DGM (Terrain model)",type:"wms",template:"https://gis.tirol.gv.at/arcgis/services/Service_Public/terrain/MapServer/WmsServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Image_Schummerung_Gelaendemodell&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[10.43998,47.59768],[10.47886,47.59925],[10.50277,47.58656],[10.4838,47.55979],[10.51312,47.5435],[10.57177,47.54582],[10.57004,47.56212],[10.60109,47.58074],[10.63904,47.5691],[10.70804,47.57027],[10.71149,47.54932],[10.76841,47.55048],[10.78566,47.52603],[10.89605,47.55048],[10.93572,47.5237],[10.934,47.50506],[10.89088,47.49573],[10.95125,47.49107],[10.9547,47.46776],[11.003,47.43276],[10.99092,47.40825],[11.10304,47.40475],[11.11511,47.41993],[11.20998,47.4456],[11.26863,47.44093],[11.26691,47.41059],[11.29451,47.4421],[11.33073,47.46076],[11.38248,47.45843],[11.3704,47.47592],[11.4394,47.53069],[11.467,47.51787],[11.57394,47.5237],[11.57567,47.55863],[11.59809,47.59121],[11.63431,47.60633],[11.66881,47.5947],[11.793,47.60284],[11.83958,47.59238],[11.84993,47.61098],[12.00689,47.63656],[12.03622,47.62494],[12.07761,47.62726],[12.10866,47.61912],[12.19491,47.62261],[12.15351,47.68768],[12.15868,47.7167],[12.18111,47.71206],[12.21906,47.72482],[12.24148,47.75382],[12.27253,47.7515],[12.2846,47.73178],[12.26563,47.69581],[12.33635,47.7109],[12.37602,47.69581],[12.44329,47.70277],[12.45364,47.69232],[12.45364,47.6749],[12.51057,47.63191],[12.53126,47.64586],[12.58991,47.63424],[12.57956,47.61098],[12.66581,47.5947],[12.67961,47.57492],[12.64511,47.55048],[12.66753,47.53185],[12.68478,47.50389],[12.71238,47.48175],[12.66753,47.45609],[12.64166,47.45959],[12.65028,47.44326],[12.62096,47.40709],[12.57439,47.38607],[12.55024,47.39658],[12.49159,47.37205],[12.50884,47.35102],[12.48814,47.32063],[12.43467,47.32297],[12.41397,47.30426],[12.36395,47.30894],[12.3122,47.32764],[12.2708,47.29841],[12.17766,47.29373],[12.14833,47.28437],[12.11729,47.29958],[12.09831,47.27501],[12.12591,47.25042],[12.09659,47.19771],[12.11039,47.14846],[12.14143,47.10974],[12.13799,47.08977],[12.15006,47.07568],[12.00517,47.04395],[11.92065,47.02985],[11.83095,46.99103],[11.78783,46.98633],[11.77403,46.9675],[11.73091,46.96514],[11.70676,46.98986],[11.64294,46.99456],[11.61189,47.00515],[11.53254,46.97809],[11.49287,47.00868],[11.44457,46.9675],[11.4049,46.96161],[11.34453,46.98633],[11.20309,46.9569],[11.17549,46.96161],[11.17721,46.94395],[11.14616,46.92275],[11.12546,46.92275],[11.10822,46.90389],[11.11511,46.88857],[11.08234,46.85319],[11.09614,46.8237],[11.05129,46.80245],[11.02369,46.76229],[10.91848,46.77056],[10.88398,46.75756],[10.84085,46.77292],[10.82361,46.76938],[10.79083,46.78946],[10.75633,46.77883],[10.72529,46.79064],[10.74771,46.82724],[10.69424,46.84494],[10.67354,46.86971],[10.60799,46.85319],[10.55452,46.82724],[10.52002,46.83904],[10.46827,46.83668],[10.45103,46.8815],[10.47517,46.93217],[10.41308,46.95572],[10.3941,46.98868],[10.3665,46.98044],[10.33891,46.94748],[10.32856,46.91803],[10.29751,46.91332],[10.25956,46.9251],[10.23886,46.86263],[10.16642,46.83904],[10.13537,46.8473],[10.13192,46.87207],[10.10604,46.88621],[10.09224,46.92746],[10.12502,46.95219],[10.14572,47.00044],[10.11294,47.02514],[10.15262,47.04983],[10.13019,47.06276],[10.13364,47.09095],[10.15952,47.12617],[10.20091,47.1426],[10.19229,47.20005],[10.20954,47.21294],[10.18711,47.23989],[10.20091,47.25628],[10.16814,47.2633],[10.16814,47.28086],[10.20264,47.29139],[10.24404,47.28905],[10.33373,47.32063],[10.38893,47.39074],[10.4148,47.39424],[10.4562,47.43626],[10.44758,47.48175],[10.41998,47.50506],[10.4424,47.55514],[10.41308,47.57143],[10.43998,47.59768]],[[12.4019,47.16019],[12.35705,47.13908],[12.35015,47.11208],[12.31048,47.10739],[12.25528,47.07215],[12.21388,47.05923],[12.20008,47.02632],[12.14488,47.03102],[12.11556,47.0075],[12.13626,46.95926],[12.16731,46.9357],[12.14316,46.91096],[12.18973,46.90036],[12.21733,46.86617],[12.25528,46.88386],[12.27425,46.88268],[12.2984,46.83432],[12.27598,46.82016],[12.27943,46.77765],[12.35015,46.77174],[12.3812,46.715],[12.44329,46.68425],[12.51402,46.67004],[12.56576,46.64873],[12.62958,46.65347],[12.70203,46.65347],[12.70375,46.69844],[12.72963,46.70081],[12.72273,46.73747],[12.80207,46.74929],[12.85382,46.74456],[12.90384,46.77174],[12.92799,46.75992],[12.95732,46.77647],[12.97974,46.79772],[12.89522,46.83314],[12.89522,46.84848],[12.8452,46.86381],[12.84692,46.91568],[12.7969,46.93099],[12.78828,46.94748],[12.7486,46.96867],[12.73653,46.99691],[12.78138,47.0416],[12.7624,47.051],[12.7141,47.04513],[12.71065,47.07803],[12.62268,47.12617],[12.56921,47.14142],[12.55196,47.13321],[12.52609,47.15433],[12.48297,47.16488],[12.46054,47.14846],[12.43467,47.15785],[12.41915,47.14377],[12.4019,47.16019]]],terms_url:"https://tiris.tirol.gv.at",terms_text:"tiris.tirol.gv.at",icon:"https://static.tirol.gv.at/plainhtml/v1/tirollogo.gif"},{id:"tirol.gv.at-DOM",name:"Tiris: DOM (Surface model)",type:"wms",template:"https://gis.tirol.gv.at/arcgis/services/Service_Public/terrain/MapServer/WmsServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Image_Schummerung_Oberflaechenmodell&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[10.43998,47.59768],[10.47886,47.59925],[10.50277,47.58656],[10.4838,47.55979],[10.51312,47.5435],[10.57177,47.54582],[10.57004,47.56212],[10.60109,47.58074],[10.63904,47.5691],[10.70804,47.57027],[10.71149,47.54932],[10.76841,47.55048],[10.78566,47.52603],[10.89605,47.55048],[10.93572,47.5237],[10.934,47.50506],[10.89088,47.49573],[10.95125,47.49107],[10.9547,47.46776],[11.003,47.43276],[10.99092,47.40825],[11.10304,47.40475],[11.11511,47.41993],[11.20998,47.4456],[11.26863,47.44093],[11.26691,47.41059],[11.29451,47.4421],[11.33073,47.46076],[11.38248,47.45843],[11.3704,47.47592],[11.4394,47.53069],[11.467,47.51787],[11.57394,47.5237],[11.57567,47.55863],[11.59809,47.59121],[11.63431,47.60633],[11.66881,47.5947],[11.793,47.60284],[11.83958,47.59238],[11.84993,47.61098],[12.00689,47.63656],[12.03622,47.62494],[12.07761,47.62726],[12.10866,47.61912],[12.19491,47.62261],[12.15351,47.68768],[12.15868,47.7167],[12.18111,47.71206],[12.21906,47.72482],[12.24148,47.75382],[12.27253,47.7515],[12.2846,47.73178],[12.26563,47.69581],[12.33635,47.7109],[12.37602,47.69581],[12.44329,47.70277],[12.45364,47.69232],[12.45364,47.6749],[12.51057,47.63191],[12.53126,47.64586],[12.58991,47.63424],[12.57956,47.61098],[12.66581,47.5947],[12.67961,47.57492],[12.64511,47.55048],[12.66753,47.53185],[12.68478,47.50389],[12.71238,47.48175],[12.66753,47.45609],[12.64166,47.45959],[12.65028,47.44326],[12.62096,47.40709],[12.57439,47.38607],[12.55024,47.39658],[12.49159,47.37205],[12.50884,47.35102],[12.48814,47.32063],[12.43467,47.32297],[12.41397,47.30426],[12.36395,47.30894],[12.3122,47.32764],[12.2708,47.29841],[12.17766,47.29373],[12.14833,47.28437],[12.11729,47.29958],[12.09831,47.27501],[12.12591,47.25042],[12.09659,47.19771],[12.11039,47.14846],[12.14143,47.10974],[12.13799,47.08977],[12.15006,47.07568],[12.00517,47.04395],[11.92065,47.02985],[11.83095,46.99103],[11.78783,46.98633],[11.77403,46.9675],[11.73091,46.96514],[11.70676,46.98986],[11.64294,46.99456],[11.61189,47.00515],[11.53254,46.97809],[11.49287,47.00868],[11.44457,46.9675],[11.4049,46.96161],[11.34453,46.98633],[11.20309,46.9569],[11.17549,46.96161],[11.17721,46.94395],[11.14616,46.92275],[11.12546,46.92275],[11.10822,46.90389],[11.11511,46.88857],[11.08234,46.85319],[11.09614,46.8237],[11.05129,46.80245],[11.02369,46.76229],[10.91848,46.77056],[10.88398,46.75756],[10.84085,46.77292],[10.82361,46.76938],[10.79083,46.78946],[10.75633,46.77883],[10.72529,46.79064],[10.74771,46.82724],[10.69424,46.84494],[10.67354,46.86971],[10.60799,46.85319],[10.55452,46.82724],[10.52002,46.83904],[10.46827,46.83668],[10.45103,46.8815],[10.47517,46.93217],[10.41308,46.95572],[10.3941,46.98868],[10.3665,46.98044],[10.33891,46.94748],[10.32856,46.91803],[10.29751,46.91332],[10.25956,46.9251],[10.23886,46.86263],[10.16642,46.83904],[10.13537,46.8473],[10.13192,46.87207],[10.10604,46.88621],[10.09224,46.92746],[10.12502,46.95219],[10.14572,47.00044],[10.11294,47.02514],[10.15262,47.04983],[10.13019,47.06276],[10.13364,47.09095],[10.15952,47.12617],[10.20091,47.1426],[10.19229,47.20005],[10.20954,47.21294],[10.18711,47.23989],[10.20091,47.25628],[10.16814,47.2633],[10.16814,47.28086],[10.20264,47.29139],[10.24404,47.28905],[10.33373,47.32063],[10.38893,47.39074],[10.4148,47.39424],[10.4562,47.43626],[10.44758,47.48175],[10.41998,47.50506],[10.4424,47.55514],[10.41308,47.57143],[10.43998,47.59768]],[[12.4019,47.16019],[12.35705,47.13908],[12.35015,47.11208],[12.31048,47.10739],[12.25528,47.07215],[12.21388,47.05923],[12.20008,47.02632],[12.14488,47.03102],[12.11556,47.0075],[12.13626,46.95926],[12.16731,46.9357],[12.14316,46.91096],[12.18973,46.90036],[12.21733,46.86617],[12.25528,46.88386],[12.27425,46.88268],[12.2984,46.83432],[12.27598,46.82016],[12.27943,46.77765],[12.35015,46.77174],[12.3812,46.715],[12.44329,46.68425],[12.51402,46.67004],[12.56576,46.64873],[12.62958,46.65347],[12.70203,46.65347],[12.70375,46.69844],[12.72963,46.70081],[12.72273,46.73747],[12.80207,46.74929],[12.85382,46.74456],[12.90384,46.77174],[12.92799,46.75992],[12.95732,46.77647],[12.97974,46.79772],[12.89522,46.83314],[12.89522,46.84848],[12.8452,46.86381],[12.84692,46.91568],[12.7969,46.93099],[12.78828,46.94748],[12.7486,46.96867],[12.73653,46.99691],[12.78138,47.0416],[12.7624,47.051],[12.7141,47.04513],[12.71065,47.07803],[12.62268,47.12617],[12.56921,47.14142],[12.55196,47.13321],[12.52609,47.15433],[12.48297,47.16488],[12.46054,47.14846],[12.43467,47.15785],[12.41915,47.14377],[12.4019,47.16019]]],terms_url:"https://tiris.tirol.gv.at",terms_text:"tiris.tirol.gv.at",icon:"https://static.tirol.gv.at/plainhtml/v1/tirollogo.gif"},{id:"tirol.gv.at-orthofoto",name:"Tiris: orthophoto",type:"wms",template:"https://gis.tirol.gv.at/arcgis/services/Service_Public/orthofoto/MapServer/WmsServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Image_Aktuell_RGB&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[10.43998,47.59768],[10.47886,47.59925],[10.50277,47.58656],[10.4838,47.55979],[10.51312,47.5435],[10.57177,47.54582],[10.57004,47.56212],[10.60109,47.58074],[10.63904,47.5691],[10.70804,47.57027],[10.71149,47.54932],[10.76841,47.55048],[10.78566,47.52603],[10.89605,47.55048],[10.93572,47.5237],[10.934,47.50506],[10.89088,47.49573],[10.95125,47.49107],[10.9547,47.46776],[11.003,47.43276],[10.99092,47.40825],[11.10304,47.40475],[11.11511,47.41993],[11.20998,47.4456],[11.26863,47.44093],[11.26691,47.41059],[11.29451,47.4421],[11.33073,47.46076],[11.38248,47.45843],[11.3704,47.47592],[11.4394,47.53069],[11.467,47.51787],[11.57394,47.5237],[11.57567,47.55863],[11.59809,47.59121],[11.63431,47.60633],[11.66881,47.5947],[11.793,47.60284],[11.83958,47.59238],[11.84993,47.61098],[12.00689,47.63656],[12.03622,47.62494],[12.07761,47.62726],[12.10866,47.61912],[12.19491,47.62261],[12.15351,47.68768],[12.15868,47.7167],[12.18111,47.71206],[12.21906,47.72482],[12.24148,47.75382],[12.27253,47.7515],[12.2846,47.73178],[12.26563,47.69581],[12.33635,47.7109],[12.37602,47.69581],[12.44329,47.70277],[12.45364,47.69232],[12.45364,47.6749],[12.51057,47.63191],[12.53126,47.64586],[12.58991,47.63424],[12.57956,47.61098],[12.66581,47.5947],[12.67961,47.57492],[12.64511,47.55048],[12.66753,47.53185],[12.68478,47.50389],[12.71238,47.48175],[12.66753,47.45609],[12.64166,47.45959],[12.65028,47.44326],[12.62096,47.40709],[12.57439,47.38607],[12.55024,47.39658],[12.49159,47.37205],[12.50884,47.35102],[12.48814,47.32063],[12.43467,47.32297],[12.41397,47.30426],[12.36395,47.30894],[12.3122,47.32764],[12.2708,47.29841],[12.17766,47.29373],[12.14833,47.28437],[12.11729,47.29958],[12.09831,47.27501],[12.12591,47.25042],[12.09659,47.19771],[12.11039,47.14846],[12.14143,47.10974],[12.13799,47.08977],[12.15006,47.07568],[12.00517,47.04395],[11.92065,47.02985],[11.83095,46.99103],[11.78783,46.98633],[11.77403,46.9675],[11.73091,46.96514],[11.70676,46.98986],[11.64294,46.99456],[11.61189,47.00515],[11.53254,46.97809],[11.49287,47.00868],[11.44457,46.9675],[11.4049,46.96161],[11.34453,46.98633],[11.20309,46.9569],[11.17549,46.96161],[11.17721,46.94395],[11.14616,46.92275],[11.12546,46.92275],[11.10822,46.90389],[11.11511,46.88857],[11.08234,46.85319],[11.09614,46.8237],[11.05129,46.80245],[11.02369,46.76229],[10.91848,46.77056],[10.88398,46.75756],[10.84085,46.77292],[10.82361,46.76938],[10.79083,46.78946],[10.75633,46.77883],[10.72529,46.79064],[10.74771,46.82724],[10.69424,46.84494],[10.67354,46.86971],[10.60799,46.85319],[10.55452,46.82724],[10.52002,46.83904],[10.46827,46.83668],[10.45103,46.8815],[10.47517,46.93217],[10.41308,46.95572],[10.3941,46.98868],[10.3665,46.98044],[10.33891,46.94748],[10.32856,46.91803],[10.29751,46.91332],[10.25956,46.9251],[10.23886,46.86263],[10.16642,46.83904],[10.13537,46.8473],[10.13192,46.87207],[10.10604,46.88621],[10.09224,46.92746],[10.12502,46.95219],[10.14572,47.00044],[10.11294,47.02514],[10.15262,47.04983],[10.13019,47.06276],[10.13364,47.09095],[10.15952,47.12617],[10.20091,47.1426],[10.19229,47.20005],[10.20954,47.21294],[10.18711,47.23989],[10.20091,47.25628],[10.16814,47.2633],[10.16814,47.28086],[10.20264,47.29139],[10.24404,47.28905],[10.33373,47.32063],[10.38893,47.39074],[10.4148,47.39424],[10.4562,47.43626],[10.44758,47.48175],[10.41998,47.50506],[10.4424,47.55514],[10.41308,47.57143],[10.43998,47.59768]],[[12.4019,47.16019],[12.35705,47.13908],[12.35015,47.11208],[12.31048,47.10739],[12.25528,47.07215],[12.21388,47.05923],[12.20008,47.02632],[12.14488,47.03102],[12.11556,47.0075],[12.13626,46.95926],[12.16731,46.9357],[12.14316,46.91096],[12.18973,46.90036],[12.21733,46.86617],[12.25528,46.88386],[12.27425,46.88268],[12.2984,46.83432],[12.27598,46.82016],[12.27943,46.77765],[12.35015,46.77174],[12.3812,46.715],[12.44329,46.68425],[12.51402,46.67004],[12.56576,46.64873],[12.62958,46.65347],[12.70203,46.65347],[12.70375,46.69844],[12.72963,46.70081],[12.72273,46.73747],[12.80207,46.74929],[12.85382,46.74456],[12.90384,46.77174],[12.92799,46.75992],[12.95732,46.77647],[12.97974,46.79772],[12.89522,46.83314],[12.89522,46.84848],[12.8452,46.86381],[12.84692,46.91568],[12.7969,46.93099],[12.78828,46.94748],[12.7486,46.96867],[12.73653,46.99691],[12.78138,47.0416],[12.7624,47.051],[12.7141,47.04513],[12.71065,47.07803],[12.62268,47.12617],[12.56921,47.14142],[12.55196,47.13321],[12.52609,47.15433],[12.48297,47.16488],[12.46054,47.14846],[12.43467,47.15785],[12.41915,47.14377],[12.4019,47.16019]]],terms_url:"https://tiris.tirol.gv.at",terms_text:"tiris.tirol.gv.at",icon:"https://static.tirol.gv.at/plainhtml/v1/tirollogo.gif"},{id:"tirol.gv.at-orthofoto-cir",name:"Tiris: orthophoto infrared",type:"wms",template:"https://gis.tirol.gv.at/arcgis/services/Service_Public/orthofoto/MapServer/WmsServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Image_Aktuell_CIR&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[10.43998,47.59768],[10.47886,47.59925],[10.50277,47.58656],[10.4838,47.55979],[10.51312,47.5435],[10.57177,47.54582],[10.57004,47.56212],[10.60109,47.58074],[10.63904,47.5691],[10.70804,47.57027],[10.71149,47.54932],[10.76841,47.55048],[10.78566,47.52603],[10.89605,47.55048],[10.93572,47.5237],[10.934,47.50506],[10.89088,47.49573],[10.95125,47.49107],[10.9547,47.46776],[11.003,47.43276],[10.99092,47.40825],[11.10304,47.40475],[11.11511,47.41993],[11.20998,47.4456],[11.26863,47.44093],[11.26691,47.41059],[11.29451,47.4421],[11.33073,47.46076],[11.38248,47.45843],[11.3704,47.47592],[11.4394,47.53069],[11.467,47.51787],[11.57394,47.5237],[11.57567,47.55863],[11.59809,47.59121],[11.63431,47.60633],[11.66881,47.5947],[11.793,47.60284],[11.83958,47.59238],[11.84993,47.61098],[12.00689,47.63656],[12.03622,47.62494],[12.07761,47.62726],[12.10866,47.61912],[12.19491,47.62261],[12.15351,47.68768],[12.15868,47.7167],[12.18111,47.71206],[12.21906,47.72482],[12.24148,47.75382],[12.27253,47.7515],[12.2846,47.73178],[12.26563,47.69581],[12.33635,47.7109],[12.37602,47.69581],[12.44329,47.70277],[12.45364,47.69232],[12.45364,47.6749],[12.51057,47.63191],[12.53126,47.64586],[12.58991,47.63424],[12.57956,47.61098],[12.66581,47.5947],[12.67961,47.57492],[12.64511,47.55048],[12.66753,47.53185],[12.68478,47.50389],[12.71238,47.48175],[12.66753,47.45609],[12.64166,47.45959],[12.65028,47.44326],[12.62096,47.40709],[12.57439,47.38607],[12.55024,47.39658],[12.49159,47.37205],[12.50884,47.35102],[12.48814,47.32063],[12.43467,47.32297],[12.41397,47.30426],[12.36395,47.30894],[12.3122,47.32764],[12.2708,47.29841],[12.17766,47.29373],[12.14833,47.28437],[12.11729,47.29958],[12.09831,47.27501],[12.12591,47.25042],[12.09659,47.19771],[12.11039,47.14846],[12.14143,47.10974],[12.13799,47.08977],[12.15006,47.07568],[12.00517,47.04395],[11.92065,47.02985],[11.83095,46.99103],[11.78783,46.98633],[11.77403,46.9675],[11.73091,46.96514],[11.70676,46.98986],[11.64294,46.99456],[11.61189,47.00515],[11.53254,46.97809],[11.49287,47.00868],[11.44457,46.9675],[11.4049,46.96161],[11.34453,46.98633],[11.20309,46.9569],[11.17549,46.96161],[11.17721,46.94395],[11.14616,46.92275],[11.12546,46.92275],[11.10822,46.90389],[11.11511,46.88857],[11.08234,46.85319],[11.09614,46.8237],[11.05129,46.80245],[11.02369,46.76229],[10.91848,46.77056],[10.88398,46.75756],[10.84085,46.77292],[10.82361,46.76938],[10.79083,46.78946],[10.75633,46.77883],[10.72529,46.79064],[10.74771,46.82724],[10.69424,46.84494],[10.67354,46.86971],[10.60799,46.85319],[10.55452,46.82724],[10.52002,46.83904],[10.46827,46.83668],[10.45103,46.8815],[10.47517,46.93217],[10.41308,46.95572],[10.3941,46.98868],[10.3665,46.98044],[10.33891,46.94748],[10.32856,46.91803],[10.29751,46.91332],[10.25956,46.9251],[10.23886,46.86263],[10.16642,46.83904],[10.13537,46.8473],[10.13192,46.87207],[10.10604,46.88621],[10.09224,46.92746],[10.12502,46.95219],[10.14572,47.00044],[10.11294,47.02514],[10.15262,47.04983],[10.13019,47.06276],[10.13364,47.09095],[10.15952,47.12617],[10.20091,47.1426],[10.19229,47.20005],[10.20954,47.21294],[10.18711,47.23989],[10.20091,47.25628],[10.16814,47.2633],[10.16814,47.28086],[10.20264,47.29139],[10.24404,47.28905],[10.33373,47.32063],[10.38893,47.39074],[10.4148,47.39424],[10.4562,47.43626],[10.44758,47.48175],[10.41998,47.50506],[10.4424,47.55514],[10.41308,47.57143],[10.43998,47.59768]],[[12.4019,47.16019],[12.35705,47.13908],[12.35015,47.11208],[12.31048,47.10739],[12.25528,47.07215],[12.21388,47.05923],[12.20008,47.02632],[12.14488,47.03102],[12.11556,47.0075],[12.13626,46.95926],[12.16731,46.9357],[12.14316,46.91096],[12.18973,46.90036],[12.21733,46.86617],[12.25528,46.88386],[12.27425,46.88268],[12.2984,46.83432],[12.27598,46.82016],[12.27943,46.77765],[12.35015,46.77174],[12.3812,46.715],[12.44329,46.68425],[12.51402,46.67004],[12.56576,46.64873],[12.62958,46.65347],[12.70203,46.65347],[12.70375,46.69844],[12.72963,46.70081],[12.72273,46.73747],[12.80207,46.74929],[12.85382,46.74456],[12.90384,46.77174],[12.92799,46.75992],[12.95732,46.77647],[12.97974,46.79772],[12.89522,46.83314],[12.89522,46.84848],[12.8452,46.86381],[12.84692,46.91568],[12.7969,46.93099],[12.78828,46.94748],[12.7486,46.96867],[12.73653,46.99691],[12.78138,47.0416],[12.7624,47.051],[12.7141,47.04513],[12.71065,47.07803],[12.62268,47.12617],[12.56921,47.14142],[12.55196,47.13321],[12.52609,47.15433],[12.48297,47.16488],[12.46054,47.14846],[12.43467,47.15785],[12.41915,47.14377],[12.4019,47.16019]]],terms_url:"https://tiris.tirol.gv.at",terms_text:"tiris.tirol.gv.at",icon:"https://static.tirol.gv.at/plainhtml/v1/tirollogo.gif"},{id:"lu.geoportail.opendata.topo",name:"Topographical Map geoportail.lu",type:"tms",template:"https://{switch:wmts3,wmts4}.geoportail.lu/opendata/wmts/topo/GLOBAL_WEBMERCATOR_4_V3/{zoom}/{x}/{y}.png",endDate:"2010-07-20T00:00:00.000Z",startDate:"2013-07-19T00:00:00.000Z",zoomExtent:[0,20],polygon:[[[5.96175,50.17631],[6.02627,50.18496],[6.03318,50.16395],[6.06069,50.15536],[6.07668,50.15913],[6.07824,50.17255],[6.10176,50.17199],[6.1225,50.16437],[6.1201,50.15594],[6.1277,50.14993],[6.11323,50.13739],[6.12369,50.13719],[6.14093,50.1305],[6.13555,50.11899],[6.13808,50.10263],[6.13108,50.09964],[6.13547,50.09119],[6.12194,50.09059],[6.12634,50.07817],[6.13186,50.07348],[6.12117,50.064],[6.11444,50.06139],[6.11563,50.05817],[6.12361,50.06323],[6.13661,50.04178],[6.13034,50.02975],[6.14821,50.02307],[6.13868,50.01572],[6.13594,50.01485],[6.13138,50.01905],[6.13024,50.01819],[6.13934,50.01116],[6.1517,50.01058],[6.14546,49.99689],[6.13966,49.9994],[6.13852,49.99829],[6.14218,49.99535],[6.15023,49.99518],[6.15625,49.98867],[6.17305,49.98589],[6.17348,49.98344],[6.17035,49.98376],[6.16549,49.97115],[6.17151,49.96298],[6.1763,49.962],[6.17995,49.95386],[6.18339,49.9548],[6.17983,49.96307],[6.18331,49.9686],[6.19277,49.97158],[6.19978,49.95352],[6.20707,49.95672],[6.21269,49.9514],[6.22502,49.95039],[6.22044,49.94369],[6.22824,49.93726],[6.22635,49.92766],[6.21913,49.92354],[6.22986,49.92125],[6.23603,49.91355],[6.23187,49.91064],[6.22769,49.91062],[6.23229,49.9072],[6.23381,49.90028],[6.24692,49.89535],[6.25781,49.88724],[6.26301,49.88101],[6.27646,49.87725],[6.28113,49.87957],[6.29166,49.87548],[6.2977,49.86673],[6.30989,49.87107],[6.31532,49.8673],[6.31465,49.86057],[6.32361,49.85188],[6.32158,49.8409],[6.32741,49.83673],[6.33656,49.83998],[6.33937,49.8507],[6.36465,49.85164],[6.4022,49.82098],[6.42643,49.81629],[6.42807,49.81186],[6.43097,49.81129],[6.44161,49.81547],[6.44344,49.81233],[6.45366,49.81275],[6.46454,49.81975],[6.47057,49.82385],[6.49681,49.81277],[6.50669,49.80993],[6.51155,49.80238],[6.51485,49.80513],[6.5196,49.81446],[6.52981,49.81048],[6.53225,49.80686],[6.53083,49.80116],[6.50622,49.78899],[6.51917,49.78344],[6.51105,49.77422],[6.52056,49.76818],[6.52052,49.76134],[6.50373,49.75086],[6.50263,49.73298],[6.50727,49.72938],[6.51809,49.7242],[6.51642,49.72129],[6.51176,49.72016],[6.50479,49.725],[6.49891,49.72639],[6.49558,49.72443],[6.50712,49.71655],[6.50788,49.71215],[6.5046,49.71227],[6.42714,49.66237],[6.4399,49.66025],[6.44251,49.65591],[6.42178,49.61809],[6.39898,49.60094],[6.37941,49.59526],[6.37551,49.58809],[6.38443,49.5801],[6.38119,49.57509],[6.36909,49.5783],[6.35791,49.57166],[6.3849,49.55817],[6.38009,49.54856],[6.35855,49.53296],[6.35932,49.52481],[6.37076,49.50545],[6.37056,49.45732],[6.3334,49.46493],[6.32189,49.47244],[6.29503,49.47928],[6.28789,49.48379],[6.27191,49.49995],[6.24133,49.50693],[6.19669,49.50331],[6.17337,49.50577],[6.16086,49.50085],[6.1671,49.49006],[6.14018,49.48525],[6.12937,49.48803],[6.12725,49.47081],[6.1014,49.46726],[6.10483,49.45076],[6.08167,49.45417],[6.07722,49.46139],[6.05917,49.46306],[6.05222,49.46028],[6.04421,49.44553],[6.02529,49.44703],[6.02154,49.45127],[6.01574,49.44885],[5.99412,49.45301],[5.97657,49.44885],[5.97773,49.45955],[5.97232,49.46087],[5.96891,49.48202],[5.9616,49.49026],[5.91578,49.49835],[5.89033,49.4948],[5.86332,49.50006],[5.84897,49.50826],[5.84828,49.51397],[5.83641,49.51817],[5.83187,49.52639],[5.84308,49.53081],[5.83562,49.54114],[5.81625,49.53325],[5.8052,49.54272],[5.85943,49.57158],[5.86866,49.587],[5.86289,49.58525],[5.8511,49.58379],[5.84712,49.58961],[5.84565,49.5981],[5.8694,49.6106],[5.88182,49.63815],[5.89998,49.63907],[5.89934,49.66239],[5.85656,49.67628],[5.85628,49.68211],[5.8757,49.71118],[5.86481,49.72331],[5.84325,49.71822],[5.82191,49.72128],[5.82489,49.73767],[5.82073,49.74878],[5.78626,49.79079],[5.76517,49.78961],[5.75094,49.79094],[5.74159,49.82126],[5.74581,49.82435],[5.7372,49.83353],[5.74053,49.84142],[5.74701,49.84048],[5.74624,49.84783],[5.75399,49.84878],[5.74066,49.85152],[5.75229,49.85922],[5.74955,49.87554],[5.77567,49.87438],[5.77505,49.88057],[5.7346,49.89341],[5.73303,49.90285],[5.75783,49.91737],[5.76039,49.93252],[5.77073,49.93711],[5.76878,49.94239],[5.7688,49.96104],[5.78672,49.96816],[5.80524,49.96677],[5.80652,49.97321],[5.83129,49.97995],[5.83462,49.98656],[5.81806,49.99936],[5.81561,50.01437],[5.84792,50.02809],[5.86189,50.04581],[5.85087,50.0563],[5.85781,50.07186],[5.881,50.08069],[5.89196,50.12041],[5.95286,50.13384],[5.96175,50.17631]]],terms_url:"https://data.public.lu/en/datasets/cartes-topographiques-services-wms-et-wmts",terms_text:"Administration du Cadastre et de la Topographie",icon:"https://www.geoportail.lu/static/img/lion.png"},{id:"Torokbalint-orthophoto-2013",name:"Törökbálint orthophoto 2013",type:"wms",template:"https://terkep.torokbalint.hu/mapproxy/service?FORMAT=image/png&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=ORTO_2013_5CM_2013SZEPT_TAKARASSAL_512_512&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}&TRANSPARENT=true",projection:"EPSG:3857",endDate:"2013-09-01T00:00:00.000Z",startDate:"2013-09-01T00:00:00.000Z",polygon:[[[18.91731,47.40854],[18.91691,47.40849],[18.91606,47.40885],[18.91565,47.40905],[18.91458,47.40938],[18.91385,47.4097],[18.91376,47.40976],[18.91314,47.41038],[18.9122,47.41098],[18.91041,47.41175],[18.90932,47.41258],[18.90841,47.41317],[18.90676,47.41443],[18.90481,47.41568],[18.90362,47.41597],[18.90317,47.41616],[18.90062,47.41742],[18.90042,47.41755],[18.89968,47.41797],[18.89888,47.41818],[18.89814,47.41835],[18.89752,47.41855],[18.89666,47.41901],[18.8958,47.41954],[18.89421,47.4205],[18.89055,47.42209],[18.88743,47.42332],[18.88554,47.42424],[18.88436,47.42476],[18.88189,47.42553],[18.88085,47.42598],[18.8801,47.42629],[18.87956,47.42649],[18.87741,47.42738],[18.87602,47.42789],[18.87508,47.42836],[18.87281,47.42934],[18.87164,47.42968],[18.8714,47.43001],[18.87259,47.4323],[18.87273,47.43278],[18.87274,47.43324],[18.87244,47.43482],[18.87206,47.43526],[18.86891,47.43712],[18.86561,47.4375],[18.86466,47.43774],[18.86404,47.43809],[18.86378,47.43791],[18.8634,47.43784],[18.863,47.43798],[18.85195,47.44715],[18.85217,47.44847],[18.8593,47.45387],[18.85839,47.45512],[18.85777,47.45568],[18.85718,47.456],[18.8572,47.45636],[18.86015,47.45839],[18.86194,47.4595],[18.86099,47.46071],[18.85979,47.46201],[18.85929,47.46236],[18.85859,47.46272],[18.85713,47.46333],[18.85634,47.4636],[18.85628,47.46403],[18.85719,47.46528],[18.85663,47.46551],[18.85653,47.4658],[18.85693,47.46656],[18.85836,47.46953],[18.85826,47.4698],[18.85827,47.46991],[18.85838,47.47019],[18.85844,47.47027],[18.85852,47.47033],[18.85862,47.47036],[18.85873,47.47038],[18.8589,47.47036],[18.86146,47.46973],[18.86277,47.46929],[18.86617,47.46785],[18.86794,47.46656],[18.86997,47.46524],[18.8708,47.46457],[18.87268,47.46333],[18.87536,47.46113],[18.87687,47.45927],[18.88943,47.45987],[18.89024,47.45988],[18.90371,47.45534],[18.90427,47.4552],[18.90493,47.45506],[18.90542,47.4551],[18.90567,47.45505],[18.90629,47.45477],[18.90648,47.45453],[18.9066,47.45447],[18.90678,47.45439],[18.90811,47.45399],[18.90837,47.45395],[18.9089,47.45384],[18.90954,47.4537],[18.91326,47.45317],[18.91353,47.4532],[18.91372,47.45317],[18.91386,47.45307],[18.91431,47.45294],[18.91598,47.453],[18.91807,47.45317],[18.91846,47.453],[18.91903,47.45161],[18.92173,47.4508],[18.92246,47.45069],[18.92418,47.45025],[18.92756,47.44989],[18.92972,47.44951],[18.93221,47.44922],[18.93347,47.44932],[18.93921,47.44935],[18.94229,47.44903],[18.94549,47.4489],[18.94826,47.4487],[18.95003,47.44824],[18.9547,47.44722],[18.95749,47.44692],[18.95802,47.44715],[18.95844,47.44708],[18.95877,47.44666],[18.96145,47.4393],[18.96368,47.4358],[18.96598,47.43288],[18.96899,47.4297],[18.9701,47.42704],[18.97009,47.42679],[18.96695,47.4246],[18.95735,47.41842],[18.95676,47.4184],[18.95606,47.41813],[18.95385,47.41739],[18.95144,47.41665],[18.95131,47.41664],[18.9327,47.41703],[18.93257,47.41696],[18.93201,47.41674],[18.93149,47.4164],[18.93114,47.41612],[18.92123,47.41091],[18.91957,47.40987],[18.91927,47.40961],[18.91731,47.40854]]],terms_url:"http://www.torokbalint.hu",terms_text:"Törökbálint",description:"5 cm resolution bald image"},{id:"Torokbalint-orthophoto-2015",name:"Törökbálint orthophoto 2015",type:"wms",template:"https://terkep.torokbalint.hu/mapproxy/service?FORMAT=image/png&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=TBORTO_2015_20160218&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}&TRANSPARENT=true",projection:"EPSG:3857",endDate:"2015-01-01T00:00:00.000Z",startDate:"2015-01-01T00:00:00.000Z",polygon:[[[18.91731,47.40854],[18.91691,47.40849],[18.91606,47.40885],[18.91565,47.40905],[18.91458,47.40938],[18.91385,47.4097],[18.91376,47.40976],[18.91314,47.41038],[18.9122,47.41098],[18.91041,47.41175],[18.90932,47.41258],[18.90841,47.41317],[18.90676,47.41443],[18.90481,47.41568],[18.90362,47.41597],[18.90317,47.41616],[18.90062,47.41742],[18.90042,47.41755],[18.89968,47.41797],[18.89888,47.41818],[18.89814,47.41835],[18.89752,47.41855],[18.89666,47.41901],[18.8958,47.41954],[18.89421,47.4205],[18.89055,47.42209],[18.88743,47.42332],[18.88554,47.42424],[18.88436,47.42476],[18.88189,47.42553],[18.88085,47.42598],[18.8801,47.42629],[18.87956,47.42649],[18.87741,47.42738],[18.87602,47.42789],[18.87508,47.42836],[18.87281,47.42934],[18.87164,47.42968],[18.8714,47.43001],[18.87259,47.4323],[18.87273,47.43278],[18.87274,47.43324],[18.87244,47.43482],[18.87206,47.43526],[18.86891,47.43712],[18.86561,47.4375],[18.86466,47.43774],[18.86404,47.43809],[18.86378,47.43791],[18.8634,47.43784],[18.863,47.43798],[18.85195,47.44715],[18.85217,47.44847],[18.8593,47.45387],[18.85839,47.45512],[18.85777,47.45568],[18.85718,47.456],[18.8572,47.45636],[18.86015,47.45839],[18.86194,47.4595],[18.86099,47.46071],[18.85979,47.46201],[18.85929,47.46236],[18.85859,47.46272],[18.85713,47.46333],[18.85634,47.4636],[18.85628,47.46403],[18.85719,47.46528],[18.85663,47.46551],[18.85653,47.4658],[18.85693,47.46656],[18.85836,47.46953],[18.85826,47.4698],[18.85827,47.46991],[18.85838,47.47019],[18.85844,47.47027],[18.85852,47.47033],[18.85862,47.47036],[18.85873,47.47038],[18.8589,47.47036],[18.86146,47.46973],[18.86277,47.46929],[18.86617,47.46785],[18.86794,47.46656],[18.86997,47.46524],[18.8708,47.46457],[18.87268,47.46333],[18.87536,47.46113],[18.87687,47.45927],[18.88943,47.45987],[18.89024,47.45988],[18.90371,47.45534],[18.90427,47.4552],[18.90493,47.45506],[18.90542,47.4551],[18.90567,47.45505],[18.90629,47.45477],[18.90648,47.45453],[18.9066,47.45447],[18.90678,47.45439],[18.90811,47.45399],[18.90837,47.45395],[18.9089,47.45384],[18.90954,47.4537],[18.91326,47.45317],[18.91353,47.4532],[18.91372,47.45317],[18.91386,47.45307],[18.91431,47.45294],[18.91598,47.453],[18.91807,47.45317],[18.91846,47.453],[18.91903,47.45161],[18.92173,47.4508],[18.92246,47.45069],[18.92418,47.45025],[18.92756,47.44989],[18.92972,47.44951],[18.93221,47.44922],[18.93347,47.44932],[18.93921,47.44935],[18.94229,47.44903],[18.94549,47.4489],[18.94826,47.4487],[18.95003,47.44824],[18.9547,47.44722],[18.95749,47.44692],[18.95802,47.44715],[18.95844,47.44708],[18.95877,47.44666],[18.96145,47.4393],[18.96368,47.4358],[18.96598,47.43288],[18.96899,47.4297],[18.9701,47.42704],[18.97009,47.42679],[18.96695,47.4246],[18.95735,47.41842],[18.95676,47.4184],[18.95606,47.41813],[18.95385,47.41739],[18.95144,47.41665],[18.95131,47.41664],[18.9327,47.41703],[18.93257,47.41696],[18.93201,47.41674],[18.93149,47.4164],[18.93114,47.41612],[18.92123,47.41091],[18.91957,47.40987],[18.91927,47.40961],[18.91731,47.40854]]],terms_url:"http://www.torokbalint.hu/",terms_text:"Törökbálint",best:true,description:"5 cm resolution bald image"},{id:"Toulouse-Orthophotoplan-2007",name:"Toulouse - Orthophotoplan 2007",type:"wms",template:"https://wms.plan.toulouse.fr/geocache/wms?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=ortho2007&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2007-01-01T00:00:00.000Z",startDate:"2007-01-01T00:00:00.000Z",zoomExtent:[0,22],polygon:[[[1.192,43.63288],[1.20154,43.63297],[1.20111,43.65549],[1.2228,43.6557],[1.22262,43.66534],[1.22753,43.66538],[1.22754,43.66564],[1.23376,43.66569],[1.23376,43.66502],[1.23512,43.66503],[1.23509,43.66707],[1.24436,43.66716],[1.24416,43.67439],[1.2494,43.67443],[1.2494,43.67466],[1.25557,43.67472],[1.25557,43.67445],[1.25695,43.67447],[1.25688,43.67853],[1.28749,43.67883],[1.28708,43.70132],[1.30882,43.70146],[1.30865,43.71277],[1.33033,43.71295],[1.33002,43.73052],[1.33671,43.73058],[1.33673,43.73122],[1.37343,43.73105],[1.37358,43.72458],[1.46045,43.72529],[1.46078,43.7028],[1.48249,43.70295],[1.48298,43.66921],[1.50468,43.66936],[1.50484,43.65812],[1.52655,43.65827],[1.52669,43.64703],[1.54837,43.64716],[1.54854,43.63594],[1.57022,43.63608],[1.57051,43.61358],[1.54882,43.61343],[1.5491,43.59095],[1.57077,43.59107],[1.57094,43.57983],[1.57937,43.57989],[1.57948,43.57377],[1.58091,43.57378],[1.58109,43.55738],[1.57123,43.55731],[1.57165,43.52355],[1.39848,43.52226],[1.39865,43.51101],[1.3121,43.51025],[1.3119,43.52152],[1.29026,43.52131],[1.28986,43.54382],[1.31152,43.54401],[1.31133,43.55526],[1.30369,43.55519],[1.30361,43.55951],[1.29554,43.55943],[1.29554,43.55955],[1.28956,43.55945],[1.28929,43.57754],[1.26757,43.57736],[1.2674,43.58861],[1.25355,43.5885],[1.25338,43.59563],[1.2518,43.59563],[1.2518,43.59494],[1.23504,43.59478],[1.23504,43.5946],[1.22396,43.5946],[1.22394,43.59947],[1.21397,43.5993],[1.21388,43.60464],[1.20206,43.60448],[1.20195,43.61048],[1.19243,43.61037],[1.192,43.63288]]],terms_url:"https://wiki.openstreetmap.org/wiki/Toulouse/ToulouseMetropoleData",terms_text:"ToulouseMetropole"},{id:"Toulouse-Orthophotoplan-2011",name:"Toulouse - Orthophotoplan 2011",type:"wms",template:"https://wms.plan.toulouse.fr/geocache/wms?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=ortho2011&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2011-01-01T00:00:00.000Z",startDate:"2011-01-01T00:00:00.000Z",zoomExtent:[0,22],polygon:[[[1.11351,43.68676],[1.13518,43.68708],[1.13489,43.69835],[1.17829,43.69903],[1.17799,43.71028],[1.19966,43.71061],[1.19934,43.72187],[1.24274,43.72253],[1.24243,43.73375],[1.26415,43.73409],[1.26383,43.74536],[1.28553,43.74565],[1.28525,43.75693],[1.30692,43.75723],[1.30664,43.76848],[1.32834,43.76879],[1.32808,43.78003],[1.43673,43.78158],[1.43731,43.7591],[1.45901,43.75937],[1.45933,43.74815],[1.48103,43.7484],[1.48133,43.73718],[1.50303,43.73741],[1.50359,43.71497],[1.52531,43.71518],[1.52561,43.70401],[1.54727,43.70426],[1.54757,43.69304],[1.5692,43.69329],[1.56957,43.68203],[1.5912,43.68227],[1.59174,43.6598],[1.61342,43.66003],[1.61372,43.64883],[1.63538,43.64908],[1.63841,43.51407],[1.29216,43.50947],[1.29186,43.5207],[1.27021,43.5204],[1.26988,43.53164],[1.24823,43.53133],[1.2476,43.55378],[1.22596,43.55349],[1.22568,43.56472],[1.20398,43.56442],[1.20331,43.5869],[1.18162,43.58656],[1.18102,43.60904],[1.15928,43.60869],[1.15896,43.61995],[1.13726,43.61962],[1.13659,43.64209],[1.11491,43.64176],[1.11351,43.68676]]],terms_url:"https://wiki.openstreetmap.org/wiki/Toulouse/ToulouseMetropoleData",terms_text:"ToulouseMetropole"},{id:"Toulouse-Orthophotoplan-2013",name:"Toulouse - Orthophotoplan 2013",type:"wms",template:"https://wms.plan.toulouse.fr/geocache/wms?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=ortho2013&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2013-01-01T00:00:00.000Z",startDate:"2013-01-01T00:00:00.000Z",zoomExtent:[0,22],polygon:[[[1.11351,43.68676],[1.13518,43.68708],[1.13489,43.69835],[1.17829,43.69903],[1.17799,43.71028],[1.19966,43.71061],[1.19934,43.72187],[1.24274,43.72253],[1.24243,43.73375],[1.26415,43.73409],[1.26383,43.74536],[1.28553,43.74565],[1.28525,43.75693],[1.30692,43.75723],[1.30664,43.76848],[1.32834,43.76879],[1.32808,43.78003],[1.43673,43.78158],[1.43731,43.7591],[1.45901,43.75937],[1.45933,43.74815],[1.48103,43.7484],[1.48133,43.73718],[1.50303,43.73741],[1.50359,43.71497],[1.52531,43.71518],[1.52561,43.70401],[1.54727,43.70426],[1.54757,43.69304],[1.5692,43.69329],[1.56957,43.68203],[1.5912,43.68227],[1.59174,43.6598],[1.61342,43.66003],[1.61372,43.64883],[1.63538,43.64908],[1.63841,43.51407],[1.29216,43.50947],[1.29186,43.5207],[1.27021,43.5204],[1.26988,43.53164],[1.24823,43.53133],[1.2476,43.55378],[1.22596,43.55349],[1.22568,43.56472],[1.20398,43.56442],[1.20331,43.5869],[1.18162,43.58656],[1.18102,43.60904],[1.15928,43.60869],[1.15896,43.61995],[1.13726,43.61962],[1.13659,43.64209],[1.11491,43.64176],[1.11351,43.68676]]],terms_url:"https://wiki.openstreetmap.org/wiki/Toulouse/ToulouseMetropoleData",terms_text:"ToulouseMetropole"},{id:"Toulouse-Orthophotoplan-2015",name:"Toulouse - Orthophotoplan 2015",type:"wms",template:"https://wms.plan.toulouse.fr/geocache/wms?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=ortho2015&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2015-01-01T00:00:00.000Z",startDate:"2015-01-01T00:00:00.000Z",zoomExtent:[0,22],polygon:[[[1.11351,43.68676],[1.13518,43.68708],[1.13489,43.69835],[1.17829,43.69903],[1.17799,43.71028],[1.19966,43.71061],[1.19934,43.72187],[1.24274,43.72253],[1.24243,43.73375],[1.26415,43.73409],[1.26383,43.74536],[1.28553,43.74565],[1.28525,43.75693],[1.30692,43.75723],[1.30664,43.76848],[1.32834,43.76879],[1.32808,43.78003],[1.43673,43.78158],[1.43731,43.7591],[1.45901,43.75937],[1.45933,43.74815],[1.48103,43.7484],[1.48133,43.73718],[1.50303,43.73741],[1.50359,43.71497],[1.52531,43.71518],[1.52561,43.70401],[1.54727,43.70426],[1.54757,43.69304],[1.5692,43.69329],[1.56957,43.68203],[1.5912,43.68227],[1.59174,43.6598],[1.61342,43.66003],[1.61372,43.64883],[1.63538,43.64908],[1.63841,43.51407],[1.29216,43.50947],[1.29186,43.5207],[1.27021,43.5204],[1.26988,43.53164],[1.24823,43.53133],[1.2476,43.55378],[1.22596,43.55349],[1.22568,43.56472],[1.20398,43.56442],[1.20331,43.5869],[1.18162,43.58656],[1.18102,43.60904],[1.15928,43.60869],[1.15896,43.61995],[1.13726,43.61962],[1.13659,43.64209],[1.11491,43.64176],[1.11351,43.68676]]],terms_url:"https://wiki.openstreetmap.org/wiki/Toulouse/ToulouseMetropoleData",terms_text:"ToulouseMetropole"},{id:"Toulouse-Orthophotoplan-2017",name:"Toulouse - Orthophotoplan 2017",type:"wms",template:"https://wms.plan.toulouse.fr/geocache/wms?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=ortho2017&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2017-01-01T00:00:00.000Z",startDate:"2017-01-01T00:00:00.000Z",zoomExtent:[0,22],polygon:[[[1.11351,43.68676],[1.13518,43.68708],[1.13489,43.69835],[1.17829,43.69903],[1.17799,43.71028],[1.19966,43.71061],[1.19934,43.72187],[1.24274,43.72253],[1.24243,43.73375],[1.26415,43.73409],[1.26383,43.74536],[1.28553,43.74565],[1.28525,43.75693],[1.30692,43.75723],[1.30664,43.76848],[1.32834,43.76879],[1.32808,43.78003],[1.43673,43.78158],[1.43731,43.7591],[1.45901,43.75937],[1.45933,43.74815],[1.48103,43.7484],[1.48133,43.73718],[1.50303,43.73741],[1.50359,43.71497],[1.52531,43.71518],[1.52561,43.70401],[1.54727,43.70426],[1.54757,43.69304],[1.5692,43.69329],[1.56957,43.68203],[1.5912,43.68227],[1.59174,43.6598],[1.61342,43.66003],[1.61372,43.64883],[1.63538,43.64908],[1.63841,43.51407],[1.29216,43.50947],[1.29186,43.5207],[1.27021,43.5204],[1.26988,43.53164],[1.24823,43.53133],[1.2476,43.55378],[1.22596,43.55349],[1.22568,43.56472],[1.20398,43.56442],[1.20331,43.5869],[1.18162,43.58656],[1.18102,43.60904],[1.15928,43.60869],[1.15896,43.61995],[1.13726,43.61962],[1.13659,43.64209],[1.11491,43.64176],[1.11351,43.68676]]],terms_url:"https://wiki.openstreetmap.org/wiki/Toulouse/ToulouseMetropoleData",terms_text:"ToulouseMetropole",best:true},{id:"Tours-Orthophoto-2008_2010",name:"Tours - Orthophotos 2008-2010",type:"tms",template:"http://wms.openstreetmap.fr/tms/1.0.0/tours/{zoom}/{x}/{y}",endDate:"2011-01-01T00:00:00.000Z",startDate:"2008-01-01T00:00:00.000Z",zoomExtent:[0,20],polygon:[[[0.54575,47.46526],[0.54585,47.46082],[0.53922,47.4607],[0.53935,47.45624],[0.5328,47.4561],[0.5329,47.45157],[0.52619,47.4514],[0.52659,47.44249],[0.50009,47.44207],[0.50024,47.43758],[0.4936,47.43743],[0.4937,47.43293],[0.46061,47.43246],[0.46072,47.42798],[0.4541,47.42781],[0.45493,47.40539],[0.46154,47.40545],[0.46191,47.39649],[0.46843,47.3966],[0.46913,47.37864],[0.47571,47.37876],[0.47621,47.3652],[0.48283,47.36535],[0.48296,47.36083],[0.47635,47.36074],[0.47665,47.35173],[0.47005,47.35162],[0.4702,47.34713],[0.46375,47.34701],[0.45714,47.34241],[0.45729,47.33791],[0.45067,47.33781],[0.45084,47.33331],[0.44422,47.3332],[0.44438,47.32871],[0.43114,47.3285],[0.43163,47.315],[0.43824,47.31511],[0.43838,47.31062],[0.47145,47.31114],[0.47131,47.31566],[0.47789,47.31575],[0.47807,47.31128],[0.48468,47.31136],[0.48486,47.30687],[0.49144,47.30698],[0.49174,47.29797],[0.48516,47.29787],[0.48543,47.28887],[0.47885,47.28877],[0.47916,47.27978],[0.48578,47.2799],[0.48591,47.27539],[0.49254,47.2755],[0.49267,47.27101],[0.4993,47.27111],[0.49943,47.26661],[0.51927,47.26692],[0.51942,47.26242],[0.52602,47.26252],[0.52587,47.26702],[0.5457,47.26734],[0.54555,47.27183],[0.55877,47.27204],[0.55863,47.27652],[0.56523,47.27663],[0.56508,47.28112],[0.57168,47.28123],[0.57152,47.28572],[0.57814,47.28583],[0.57799,47.29033],[0.5846,47.29043],[0.58431,47.29942],[0.5975,47.29961],[0.59766,47.29514],[0.65716,47.296],[0.6573,47.29151],[0.6705,47.29172],[0.67035,47.29621],[0.68362,47.29637],[0.68343,47.30089],[0.69006,47.30096],[0.68992,47.30547],[0.7362,47.30612],[0.73608,47.31061],[0.7559,47.31089],[0.75577,47.31539],[0.76238,47.31547],[0.76223,47.31999],[0.77549,47.32015],[0.77497,47.33882],[0.77458,47.35163],[0.76804,47.35159],[0.76759,47.36053],[0.77424,47.36062],[0.77335,47.39213],[0.76674,47.39202],[0.76644,47.40108],[0.77306,47.40111],[0.77289,47.41013],[0.76618,47.41002],[0.76603,47.4145],[0.75276,47.4143],[0.75298,47.40981],[0.74624,47.4097],[0.74594,47.42322],[0.73923,47.42315],[0.73887,47.43661],[0.73233,47.43652],[0.73219,47.44106],[0.7255,47.44098],[0.72542,47.44535],[0.73188,47.44548],[0.73185,47.45011],[0.73845,47.45023],[0.73831,47.45463],[0.74494,47.45474],[0.74432,47.4772],[0.73107,47.47697],[0.7309,47.48154],[0.71762,47.48126],[0.71779,47.47684],[0.69777,47.4765],[0.69805,47.47198],[0.69145,47.47189],[0.69173,47.46302],[0.6851,47.46293],[0.68494,47.46735],[0.67826,47.46733],[0.67798,47.47622],[0.67141,47.47616],[0.67104,47.4882],[0.65773,47.48797],[0.65782,47.48504],[0.65119,47.48483],[0.65147,47.47586],[0.64482,47.47572],[0.64493,47.47126],[0.6118,47.47075],[0.61188,47.46631],[0.60528,47.46612],[0.60542,47.46166],[0.59888,47.46155],[0.59902,47.45709],[0.57249,47.45669],[0.57218,47.46565],[0.54575,47.46526]]],terms_url:"https://wiki.openstreetmap.org/wiki/Tours/Orthophoto",terms_text:"Orthophoto Tour(s) Plus 2008"},{id:"Tours-Orthophoto-2013",name:"Tours - Orthophotos 2013",type:"tms",template:"http://wms.openstreetmap.fr/tms/1.0.0/tours_2013/{zoom}/{x}/{y}",endDate:"2013-01-01T00:00:00.000Z",startDate:"2013-01-01T00:00:00.000Z",zoomExtent:[0,22],polygon:[[[0.77512,47.32983],[0.77427,47.35617],[0.77053,47.35611],[0.77024,47.36512],[0.77398,47.36517],[0.7728,47.40148],[0.7904,47.40147],[0.78988,47.4103],[0.79117,47.41047],[0.79108,47.41942],[0.79392,47.41942],[0.79319,47.43733],[0.79834,47.43742],[0.79808,47.45544],[0.80044,47.45541],[0.80138,47.46426],[0.80074,47.46899],[0.79396,47.47331],[0.78405,47.47323],[0.78387,47.47871],[0.77606,47.47859],[0.77585,47.48204],[0.77066,47.48219],[0.77044,47.4859],[0.76096,47.49092],[0.75718,47.49092],[0.73753,47.50336],[0.7259,47.50588],[0.71113,47.50576],[0.70418,47.50408],[0.69109,47.50038],[0.69045,47.49718],[0.67757,47.49683],[0.67757,47.49353],[0.66427,47.49301],[0.6635,47.48953],[0.65088,47.48958],[0.65133,47.48032],[0.64734,47.4803],[0.64747,47.47852],[0.64474,47.47846],[0.64479,47.47575],[0.64238,47.47578],[0.64225,47.47302],[0.63835,47.47294],[0.63792,47.47131],[0.60513,47.47079],[0.60513,47.46632],[0.59852,47.46603],[0.59878,47.46156],[0.592,47.46156],[0.59226,47.45976],[0.58084,47.45971],[0.58007,47.46145],[0.57234,47.46139],[0.57222,47.46512],[0.55874,47.46489],[0.5466,47.46052],[0.53269,47.45355],[0.52677,47.45315],[0.52677,47.45152],[0.52231,47.45123],[0.52256,47.44804],[0.51977,47.44776],[0.52007,47.44247],[0.4975,47.4416],[0.49716,47.44049],[0.49355,47.44015],[0.49355,47.43573],[0.47943,47.43575],[0.46171,47.42819],[0.45643,47.42088],[0.45489,47.41229],[0.45506,47.40218],[0.46149,47.40193],[0.46167,47.39641],[0.46879,47.39602],[0.47016,47.35173],[0.45677,47.3515],[0.45729,47.34254],[0.43085,47.34196],[0.43196,47.30602],[0.47154,47.3067],[0.47257,47.28004],[0.48527,47.28004],[0.48578,47.27084],[0.49935,47.27107],[0.49917,47.26245],[0.55273,47.26304],[0.55222,47.27201],[0.56561,47.27224],[0.56526,47.28156],[0.59118,47.28156],[0.59067,47.29099],[0.66912,47.29169],[0.6832,47.29564],[0.6832,47.30077],[0.69658,47.30123],[0.69641,47.3024],[0.71006,47.30245],[0.72293,47.30589],[0.72285,47.31043],[0.74165,47.31084],[0.75426,47.31392],[0.7625,47.31815],[0.76207,47.32013],[0.76619,47.32009],[0.76956,47.32207],[0.77233,47.32508],[0.77336,47.3267],[0.77512,47.32983]]],terms_url:"https://wiki.openstreetmap.org/wiki/Tours/Orthophoto",terms_text:"Orthophoto Tour(s)plus 2013"},{id:"trafikverket-baninfo",name:"Trafikverket Railway Network",type:"wms",template:"https://geo-baninfo.trafikverket.se/mapservice/wms.axd/BanInfo?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Spar_Huvud_och_sidospar&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[7,20],polygon:[[[12.80182,55.19612],[14.22729,55.27286],[18.44604,56.69244],[19.74242,57.98481],[20.0061,59.5371],[19.08394,60.19308],[20.49499,63.2497],[24.25231,65.57437],[23.81835,67.92514],[23.23607,68.34655],[20.43456,69.17038],[18.08349,68.5644],[16.50145,67.88382],[14.43602,66.14275],[11.82128,63.30775],[12.20031,60.31063],[10.62377,58.5482],[12.64251,56.03062],[12.80182,55.19612]]],terms_url:"https://www.trafikverket.se",terms_text:"© Trafikverket, CC0",description:"Swedish railway network, including sidings",icon:"https://api.trafikinfo.trafikverket.se/img/apple-touch-icon-144-precomposed.png",overlay:true},{id:"trafikverket-vagnat",name:"Trafikverket Road Network",type:"wms",template:"https://geo-netinfo.trafikverket.se/mapservice/wms.axd/NetInfo?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Vagtrafiknat,Funkvagklass,Farjeled&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[13,20],polygon:[[[12.80182,55.19612],[14.22729,55.27286],[18.44604,56.69244],[19.74242,57.98481],[20.0061,59.5371],[19.08394,60.19308],[20.49499,63.2497],[24.25231,65.57437],[23.81835,67.92514],[23.23607,68.34655],[20.43456,69.17038],[18.08349,68.5644],[16.50145,67.88382],[14.43602,66.14275],[11.82128,63.30775],[12.20031,60.31063],[10.62377,58.5482],[12.64251,56.03062],[12.80182,55.19612]]],terms_url:"https://www.trafikverket.se",terms_text:"© Trafikverket, CC0",description:"Swedish NVDB road network",icon:"https://api.trafikinfo.trafikverket.se/img/apple-touch-icon-144-precomposed.png",overlay:true},{id:"trafikverket-vagnat-extra",name:"Trafikverket Road Network extra",type:"wms",template:"https://geo-netinfo.trafikverket.se/mapservice/wms.axd/NetInfo?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Vagnummer,Vaghinder,Rastplats,Rastficka,Hallplats,Farthinder,BroTunnel,ATK_Matplats&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[3,20],polygon:[[[12.80182,55.19612],[14.22729,55.27286],[18.44604,56.69244],[19.74242,57.98481],[20.0061,59.5371],[19.08394,60.19308],[20.49499,63.2497],[24.25231,65.57437],[23.81835,67.92514],[23.23607,68.34655],[20.43456,69.17038],[18.08349,68.5644],[16.50145,67.88382],[14.43602,66.14275],[11.82128,63.30775],[12.20031,60.31063],[10.62377,58.5482],[12.64251,56.03062],[12.80182,55.19612]]],terms_url:"https://www.trafikverket.se",terms_text:"© Trafikverket, CC0",description:"Swedish NVDB extra details: Highway reference, traffic calming, rest area, bus stop, bridge, tunnel, speed camera",icon:"https://api.trafikinfo.trafikverket.se/img/apple-touch-icon-144-precomposed.png",overlay:true},{id:"trafikverket-vagnat-navn",name:"Trafikverket Street Names",type:"tms",template:"https://mapproxy.openstreetmap.se/tiles/1.0.0/nvdb_names/EPSG3857/{zoom}/{x}/{y}.png",zoomExtent:[15,19],polygon:[[[12.80182,55.19612],[14.22729,55.27286],[18.44604,56.69244],[19.74242,57.98481],[20.0061,59.5371],[19.08394,60.19308],[20.49499,63.2497],[24.25231,65.57437],[23.81835,67.92514],[23.23607,68.34655],[20.43456,69.17038],[18.08349,68.5644],[16.50145,67.88382],[14.43602,66.14275],[11.82128,63.30775],[12.20031,60.31063],[10.62377,58.5482],[12.64251,56.03062],[12.80182,55.19612]]],terms_url:"https://www.trafikverket.se",terms_text:"© Trafikverket, CC0",description:"Swedish NVDB street names",icon:"https://api.trafikinfo.trafikverket.se/img/apple-touch-icon-144-precomposed.png",overlay:true},{id:"US_Forest_Service_roads_overlay",name:"U.S. Forest Roads Overlay",type:"tms",template:"https://{switch:a,b,c,d}.tiles.mapbox.com/styles/v1/glassman/cjf4qjmps0tgv2qpahj977mvz/tiles/256/{zoom}/{x}/{y}?access_token=pk.eyJ1IjoiZ2xhc3NtYW4iLCJhIjoiRjk3dWdwYyJ9.Tg_fMJWxygeKBgVTrZHmGA",zoomExtent:[0,20],polygon:[[[-124.76179,48.41301],[-124.60595,45.90245],[-124.99343,40.05576],[-122.53697,36.85661],[-119.97759,33.00641],[-117.67593,32.46302],[-114.86123,32.47999],[-111.00893,31.33601],[-108.19927,31.326],[-108.18711,31.77551],[-106.53072,31.78209],[-106.48421,31.74645],[-106.42932,31.75206],[-106.28689,31.56133],[-106.20525,31.4467],[-105.02053,30.5361],[-104.58819,29.69979],[-103.25189,28.89087],[-102.71736,29.39206],[-102.1514,29.74757],[-101.25529,29.48105],[-100.00624,28.00822],[-99.23511,26.4476],[-98.01091,25.9928],[-97.43502,25.8266],[-96.95553,25.98216],[-96.80617,27.79782],[-95.55633,28.58761],[-93.74053,29.47421],[-90.90285,28.85645],[-88.01567,28.99443],[-88.01625,30.00389],[-86.02775,30.00475],[-84.01879,28.99618],[-81.9972,25.98268],[-81.99666,25.01349],[-84.01656,25.01258],[-84.01601,24.00527],[-80.02,24.0071],[-79.89011,26.85507],[-80.02453,32.01613],[-75.41474,35.05319],[-74.02112,39.57279],[-72.00202,40.99125],[-69.87974,40.99205],[-69.84893,43.26199],[-66.94528,44.71049],[-67.75966,47.099],[-69.25051,47.51223],[-70.46149,46.21766],[-71.41227,45.25488],[-72.02225,45.00598],[-75.07988,44.98029],[-76.90231,43.80246],[-78.76239,43.62496],[-79.15798,43.44626],[-79.00601,42.80053],[-82.66248,41.68895],[-82.17616,43.58854],[-83.2814,46.13885],[-87.50645,48.01427],[-88.34922,48.29633],[-89.43531,47.98378],[-93.99811,49.00671],[-95.11054,49.412],[-96.01312,49.00605],[-123.32289,49.00429],[-123.22752,48.18499],[-124.76179,48.41301]],[[-160.57876,22.50629],[-160.57822,21.49846],[-158.74706,21.24398],[-157.50832,20.9958],[-155.99619,18.77902],[-154.62178,18.7587],[-154.68902,19.88057],[-156.29276,21.22259],[-157.50474,21.9985],[-159.00937,22.50702],[-160.57876,22.50629]],[[-167.15715,68.72197],[-164.8554,67.02551],[-168.0022,66.00175],[-169.00874,66.00155],[-169.00754,64.99877],[-172.51433,63.87673],[-173.8197,59.74014],[-162.50181,58.00058],[-160.0159,58.00124],[-160.01497,57.00003],[-160.50548,56.9999],[-165.80926,54.82485],[-178.0001,52.24465],[-177.9993,51.25543],[-171.46891,51.82153],[-162.40251,53.95666],[-159.00757,55.0025],[-158.01907,55.00278],[-151.99632,55.99919],[-151.50034,57.99879],[-151.50129,58.99198],[-138.516,58.99532],[-138.51505,57.99864],[-133.99482,54.00317],[-130.00444,54.00434],[-130.00708,57.00005],[-131.97588,56.99952],[-135.12299,59.7566],[-138.00718,59.9918],[-139.17159,60.41272],[-140.9874,61.01186],[-140.9684,69.95351],[-156.17689,71.56333],[-160.41363,70.73977],[-163.02183,69.97074],[-164.9717,68.99469],[-167.15715,68.72197]]],description:"Highway: Green casing = unclassified. Brown casing = track. Surface: gravel = light brown fill, Asphalt = black, paved = gray, ground =white, concrete = blue, grass = green. Seasonal = white bars",icon:"https://osmlab.github.io/editor-layer-index/sources/north-america/us/USForestService-overlay.png",overlay:true},{id:"US_Forest_Service_roads",name:"U.S. Forest Service roads",type:"tms",template:"https://osm.cycle.travel/forest/{zoom}/{x}/{y}.png",zoomExtent:[0,19],polygon:[[[-124.76179,48.41301],[-124.60595,45.90245],[-124.99343,40.05576],[-122.53697,36.85661],[-119.97759,33.00641],[-117.67593,32.46302],[-114.86123,32.47999],[-111.00893,31.33601],[-108.19927,31.326],[-108.18711,31.77551],[-106.53072,31.78209],[-106.48421,31.74645],[-106.42932,31.75206],[-106.28689,31.56133],[-106.20525,31.4467],[-105.02053,30.5361],[-104.58819,29.69979],[-103.25189,28.89087],[-102.71736,29.39206],[-102.1514,29.74757],[-101.25529,29.48105],[-100.00624,28.00822],[-99.23511,26.4476],[-98.01091,25.9928],[-97.43502,25.8266],[-96.95553,25.98216],[-96.80617,27.79782],[-95.55633,28.58761],[-93.74053,29.47421],[-90.90285,28.85645],[-88.01567,28.99443],[-88.01625,30.00389],[-86.02775,30.00475],[-84.01879,28.99618],[-81.9972,25.98268],[-81.99666,25.01349],[-84.01656,25.01258],[-84.01601,24.00527],[-80.02,24.0071],[-79.89011,26.85507],[-80.02453,32.01613],[-75.41474,35.05319],[-74.02112,39.57279],[-72.00202,40.99125],[-69.87974,40.99205],[-69.84893,43.26199],[-66.94528,44.71049],[-67.75966,47.099],[-69.25051,47.51223],[-70.46149,46.21766],[-71.41227,45.25488],[-72.02225,45.00598],[-75.07988,44.98029],[-76.90231,43.80246],[-78.76239,43.62496],[-79.15798,43.44626],[-79.00601,42.80053],[-82.66248,41.68895],[-82.17616,43.58854],[-83.2814,46.13885],[-87.50645,48.01427],[-88.34922,48.29633],[-89.43531,47.98378],[-93.99811,49.00671],[-95.11054,49.412],[-96.01312,49.00605],[-123.32289,49.00429],[-123.22752,48.18499],[-124.76179,48.41301]],[[-160.57876,22.50629],[-160.57822,21.49846],[-158.74706,21.24398],[-157.50832,20.9958],[-155.99619,18.77902],[-154.62178,18.7587],[-154.68902,19.88057],[-156.29276,21.22259],[-157.50474,21.9985],[-159.00937,22.50702],[-160.57876,22.50629]],[[-167.15715,68.72197],[-164.8554,67.02551],[-168.0022,66.00175],[-169.00874,66.00155],[-169.00754,64.99877],[-172.51433,63.87673],[-173.8197,59.74014],[-162.50181,58.00058],[-160.0159,58.00124],[-160.01497,57.00003],[-160.50548,56.9999],[-165.80926,54.82485],[-178.0001,52.24465],[-177.9993,51.25543],[-171.46891,51.82153],[-162.40251,53.95666],[-159.00757,55.0025],[-158.01907,55.00278],[-151.99632,55.99919],[-151.50034,57.99879],[-151.50129,58.99198],[-138.516,58.99532],[-138.51505,57.99864],[-133.99482,54.00317],[-130.00444,54.00434],[-130.00708,57.00005],[-131.97588,56.99952],[-135.12299,59.7566],[-138.00718,59.9918],[-139.17159,60.41272],[-140.9874,61.01186],[-140.9684,69.95351],[-156.17689,71.56333],[-160.41363,70.73977],[-163.02183,69.97074],[-164.9717,68.99469],[-167.15715,68.72197]]]},{id:"Zuerich-zh_uebersichtsplan-tms",name:"Übersichtsplan Zürich",type:"tms",template:"https://mapproxy.osm.ch/tiles/zh_uebersichtsplan/EPSG900913/{zoom}/{x}/{y}.png?origin=nw",zoomExtent:[0,21],polygon:[[[8.45788,47.44582],[8.57392,47.44477],[8.57362,47.43124],[8.60266,47.43096],[8.60231,47.41746],[8.6318,47.41716],[8.6295,47.33628],[8.57162,47.33679],[8.57152,47.32292],[8.54236,47.3236],[8.54212,47.31013],[8.48418,47.31062],[8.48478,47.33762],[8.45582,47.33787],[8.45609,47.35135],[8.42713,47.35161],[8.42864,47.43259],[8.45745,47.43231],[8.45788,47.44582]]],terms_text:"Stadt Zürich Open Government Data",description:"This imagery is provided via a proxy operated by https://sosm.ch/"},{id:"UkraineKyiv2014DZK",name:"Ukraine - Kyiv 2014 (DZK)",type:"tms",template:"http://map.land.gov.ua/map/ortho_kiev/{zoom}/{x}/{-y}.jpg",endDate:"2014-01-01T00:00:00.000Z",startDate:"2014-01-01T00:00:00.000Z",zoomExtent:[0,16],polygon:[[[30.30752,50.57184],[30.33155,50.57402],[30.37687,50.57925],[30.42288,50.58143],[30.4318,50.58579],[30.44416,50.58797],[30.45515,50.58754],[30.46545,50.58449],[30.46819,50.57751],[30.49085,50.57489],[30.51351,50.57489],[30.52519,50.57402],[30.55608,50.55221],[30.58424,50.53869],[30.5966,50.53781],[30.60896,50.5365],[30.64329,50.5352],[30.65496,50.53563],[30.65496,50.54305],[30.66045,50.54916],[30.66801,50.55439],[30.67762,50.55876],[30.68792,50.56137],[30.70783,50.55614],[30.71127,50.56356],[30.71127,50.57838],[30.72157,50.58231],[30.71882,50.58972],[30.72981,50.59103],[30.74011,50.58841],[30.76208,50.58536],[30.77306,50.58274],[30.78336,50.57795],[30.80259,50.57141],[30.81014,50.56617],[30.82182,50.55439],[30.82525,50.53956],[30.81701,50.53432],[30.79504,50.52909],[30.78474,50.52559],[30.76276,50.51992],[30.76208,50.5125],[30.75315,50.50769],[30.74354,50.50376],[30.73805,50.49721],[30.74629,50.49197],[30.75521,50.48847],[30.74835,50.48236],[30.75178,50.47537],[30.75315,50.46794],[30.74835,50.46138],[30.75178,50.45439],[30.78886,50.43646],[30.7971,50.43165],[30.80328,50.41765],[30.8225,50.40846],[30.82044,50.40102],[30.82319,50.39358],[30.81289,50.39095],[30.80122,50.39139],[30.78954,50.39314],[30.77787,50.3927],[30.77856,50.3857],[30.77169,50.38001],[30.76208,50.37519],[30.75109,50.37256],[30.73873,50.37256],[30.72775,50.37475],[30.71813,50.37957],[30.71539,50.36512],[30.71127,50.35855],[30.70577,50.35241],[30.69753,50.34716],[30.68586,50.34453],[30.65084,50.34058],[30.63848,50.34014],[30.62681,50.33795],[30.62887,50.3305],[30.64947,50.29279],[30.66663,50.28314],[30.67144,50.27656],[30.6632,50.27085],[30.65153,50.26997],[30.64535,50.27612],[30.63368,50.27787],[30.62132,50.27656],[30.61857,50.2691],[30.62956,50.25637],[30.6378,50.25154],[30.64535,50.23792],[30.64398,50.2309],[30.63917,50.22387],[30.62956,50.21992],[30.6069,50.2164],[30.59591,50.2186],[30.59042,50.23353],[30.5863,50.241],[30.57531,50.25505],[30.56501,50.25944],[30.5657,50.2669],[30.56432,50.29718],[30.56638,50.30463],[30.5657,50.31209],[30.55677,50.31691],[30.54441,50.31735],[30.52587,50.32699],[30.51489,50.3305],[30.50253,50.33182],[30.48055,50.33664],[30.47163,50.34146],[30.46957,50.34935],[30.47025,50.35679],[30.46201,50.36205],[30.4524,50.35679],[30.44004,50.35548],[30.43661,50.36512],[30.43111,50.37212],[30.43661,50.37826],[30.43455,50.3857],[30.40914,50.39883],[30.39678,50.40014],[30.3906,50.40671],[30.37069,50.41546],[30.36314,50.42159],[30.3597,50.42902],[30.3597,50.43646],[30.35696,50.44389],[30.3446,50.44477],[30.32056,50.44258],[30.29585,50.44477],[30.28349,50.44477],[30.27799,50.43864],[30.27525,50.43165],[30.26563,50.42771],[30.25396,50.42902],[30.24572,50.42377],[30.23542,50.42771],[30.2416,50.43427],[30.2416,50.44214],[30.23679,50.4487],[30.23885,50.45613],[30.24297,50.46313],[30.24915,50.46968],[30.25671,50.47493],[30.26083,50.48192],[30.26563,50.48847],[30.26907,50.49983],[30.26151,50.50595],[30.26357,50.51381],[30.26975,50.51992],[30.28898,50.52821],[30.29722,50.53345],[30.30271,50.54],[30.30203,50.54741],[30.30477,50.55483],[30.32743,50.55221],[30.33086,50.55919],[30.32262,50.56486],[30.31233,50.56835],[30.30752,50.57184]]],description:"Works only from within Ukraine or with an Ukrainian proxy server."},{id:"Ukraine-orto10000-2012",name:"Ukraine - Orthophotomaps 2012",type:"tms",template:"http://212.26.144.110/tile2/orto_10000/{zoom}/{x}/{-y}.jpg",endDate:"2012-01-01T00:00:00.000Z",startDate:"2012-01-01T00:00:00.000Z",zoomExtent:[0,16],polygon:[[[23.6193,51.65491],[24.09803,51.64047],[24.39723,51.89353],[25.19178,51.95913],[26.12263,51.92224],[26.49829,51.80933],[27.09005,51.77026],[27.62861,51.62603],[28.02422,51.59093],[28.28021,51.68172],[28.37662,51.5806],[28.82542,51.5682],[29.19111,51.64253],[29.41718,51.4399],[29.67316,51.51238],[29.82276,51.47512],[30.21837,51.50824],[30.54417,51.30709],[30.63726,51.38599],[30.51425,51.63634],[30.983,52.09005],[31.2822,52.07984],[31.48832,52.13497],[32.11,52.05531],[32.31279,52.11864],[32.43912,52.32434],[32.93114,52.28368],[33.29683,52.39337],[33.75561,52.35277],[34.35734,51.78055],[34.14457,51.76409],[34.05813,51.67965],[34.22103,51.47098],[34.25095,51.30085],[34.7197,51.19056],[35.11199,51.21139],[35.1818,51.08626],[35.38792,51.03402],[35.40787,50.62878],[35.62063,50.38563],[36.06944,50.4513],[36.21571,50.41106],[36.31212,50.28802],[36.4717,50.32624],[36.59138,50.2519],[37.46571,50.45977],[37.735,50.11353],[38.05747,49.9384],[38.19377,49.95765],[38.19045,50.07514],[38.35002,50.08154],[38.41651,49.98972],[38.73899,49.97476],[39.00827,49.83344],[39.14457,49.89987],[39.27755,49.78195],[39.54018,49.74544],[39.79949,49.58406],[40.18845,49.6013],[40.0588,49.50424],[40.20508,49.24666],[39.93247,49.06185],[39.71638,49.01608],[40.08872,48.85448],[39.79617,48.78443],[39.69311,48.65283],[39.86266,48.5693],[39.99231,48.31348],[39.83274,47.92287],[39.74297,47.83144],[39.57675,47.81135],[38.86532,47.85153],[38.77555,47.68618],[38.38327,47.60106],[38.30348,47.52704],[38.30016,47.23891],[38.13393,47.05577],[37.5455,47.05124],[37.31279,46.87654],[37.20973,46.92651],[36.96039,46.83107],[36.7443,46.61685],[36.72436,46.7719],[36.4451,46.72407],[36.10601,46.4728],[36.20574,46.66022],[35.92316,46.64424],[35.43114,46.39948],[35.10202,45.97138],[35.0455,45.75145],[35.47436,45.33],[35.86,45.53297],[35.9963,45.43274],[36.11598,45.51899],[36.66452,45.4514],[36.65454,45.34168],[36.50494,45.31363],[36.47502,45.24111],[36.48832,45.04884],[35.81013,44.98539],[35.5076,45.11222],[35.42782,44.93364],[35.12196,44.76394],[34.67649,44.75686],[33.985,44.37078],[33.68912,44.38504],[33.38327,44.50608],[33.35002,44.589],[33.55282,44.93128],[33.42981,45.1263],[33.19377,45.14271],[32.83141,45.33935],[32.60534,45.30896],[32.44577,45.3557],[32.50893,45.47005],[32.87795,45.68181],[33.57941,45.90665],[33.58938,46.02681],[33.25694,46.07065],[33.02422,45.97138],[31.61133,46.19506],[31.27555,46.61457],[30.87662,46.56887],[30.43446,45.98756],[29.69643,45.55159],[29.79284,45.46306],[29.73965,45.15913],[29.47369,45.41407],[29.18114,45.38373],[28.74896,45.22004],[28.56611,45.23409],[28.29018,45.33],[28.23367,45.49103],[28.31678,45.56789],[28.483,45.54228],[28.47303,45.73753],[28.95175,46.03143],[29.02489,46.18125],[28.9318,46.49569],[29.18779,46.57116],[29.59337,46.45448],[29.81944,46.46593],[29.95574,46.68759],[29.8959,46.8197],[29.56013,46.96963],[29.54683,47.29982],[29.14789,47.50234],[29.23101,47.77562],[29.17117,47.934],[28.86864,47.99411],[28.63593,48.16513],[28.44311,48.06525],[28.36332,48.17178],[28.25694,48.15404],[27.735,48.43494],[27.55547,48.45258],[26.92383,48.34884],[26.36532,48.17178],[26.1193,47.97408],[25.3846,47.91618],[24.91585,47.70408],[24.52024,47.94291],[24.18446,47.90058],[23.58274,48.00523],[23.43646,47.96963],[23.15388,48.10522],[23.07077,47.98743],[22.858,47.9585],[22.76824,48.09856],[22.58539,48.103],[22.51558,48.2161],[22.11332,48.4217],[22.49896,49.06621],[22.58872,49.11193],[22.87795,49.04006],[22.7217,49.18151],[22.71837,49.64652],[23.24364,50.105],[24.04484,50.49785],[24.05813,50.68779],[23.9451,50.81399],[24.10135,50.85388],[23.62928,51.29462],[23.6193,51.65491]]],description:"Works only from within Ukraine or with an Ukrainian proxy server."},{id:"uniao_dos_palmares",name:"União dos Palmares AL",type:"wms",template:"http://geoserver.dados.al.gov.br:8080/geoserver/Alagoas/ows?LAYERS=Uniao%20dos%20Palmares&SERVICE=WMS&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.0&SERVICE=WMS&REQUEST=GetMap&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[-35.97725,-9.20752],[-35.9772,-9.19398],[-35.97694,-9.19053],[-35.97678,-9.18607],[-35.97702,-9.18208],[-35.97704,-9.17968],[-35.97682,-9.17734],[-35.97664,-9.17517],[-35.97701,-9.17518],[-35.97696,-9.1707],[-35.97674,-9.17066],[-35.97661,-9.16645],[-35.97618,-9.16222],[-35.9761,-9.16026],[-35.97661,-9.16026],[-35.97672,-9.14608],[-35.97654,-9.14122],[-35.97666,-9.1332],[-35.97653,-9.12184],[-35.97648,-9.11748],[-35.98618,-9.11755],[-35.98947,-9.11733],[-36.00561,-9.11733],[-36.01859,-9.11736],[-36.04601,-9.11722],[-36.06734,-9.11698],[-36.06756,-9.16134],[-36.06771,-9.16405],[-36.06745,-9.16408],[-36.06756,-9.16657],[-36.06777,-9.16654],[-36.06798,-9.20701],[-36.0498,-9.20711],[-36.04671,-9.20698],[-36.02941,-9.20709],[-36.01355,-9.20718],[-35.99318,-9.20733],[-35.97725,-9.20752]]],terms_url:"http://www.seplag.al.gov.br",terms_text:"Secretaria de Estado do Planejamento, Gestão e Patrimônio"},{id:"URBIS2009",name:"URBIS 2009 aerial imagery",type:"wms",template:"https://geoservices-urbis.irisnet.be/geoserver/ows?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&FORMAT=image/png&TRANSPARENT=true&LAYERS=Urbis:Ortho2009&WIDTH={width}&HEIGHT={height}&CRS={proj}&STYLES=&BBOX={bbox}",projection:"EPSG:3857",endDate:"2009-01-01T00:00:00.000Z",startDate:"2009-01-01T00:00:00.000Z",polygon:[[[4.37973,50.76382],[4.38917,50.76377],[4.43028,50.77517],[4.435,50.775],[4.46427,50.78645],[4.4817,50.79134],[4.48238,50.79617],[4.45921,50.80626],[4.45947,50.81661],[4.47972,50.82036],[4.46959,50.83537],[4.46899,50.84573],[4.46238,50.85396],[4.44968,50.85591],[4.44599,50.85992],[4.4253,50.86615],[4.43183,50.87628],[4.44007,50.87845],[4.43106,50.89014],[4.43595,50.89502],[4.4296,50.90103],[4.41655,50.90757],[4.41543,50.91342],[4.39578,50.91407],[4.38462,50.91093],[4.38119,50.90319],[4.3726,50.90032],[4.36213,50.9033],[4.34857,50.90341],[4.34025,50.90411],[4.32892,50.90249],[4.31647,50.89605],[4.30634,50.89274],[4.29004,50.88982],[4.29149,50.88495],[4.29553,50.88262],[4.29561,50.88094],[4.28274,50.87227],[4.27699,50.86713],[4.27802,50.85911],[4.28042,50.85721],[4.28094,50.84215],[4.27193,50.84036],[4.25467,50.83695],[4.25107,50.83288],[4.25227,50.82697],[4.24343,50.82182],[4.24403,50.81548],[4.25519,50.8151],[4.25802,50.80935],[4.27218,50.81011],[4.27579,50.80696],[4.2854,50.80506],[4.28901,50.80691],[4.29802,50.80593],[4.30282,50.79709],[4.31458,50.79454],[4.31621,50.78624],[4.32952,50.77381],[4.34205,50.77164],[4.34522,50.77337],[4.37853,50.76811],[4.37973,50.76382]]],terms_text:"Realized by means of Brussels UrbIS®© - Distribution & Copyright CIRB",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/be/URBIS2015aerialimagery.png"},{id:"URBIS2012",name:"URBIS 2012 aerial imagery",type:"wms",template:"https://geoservices-urbis.irisnet.be/geoserver/ows?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&FORMAT=image/png&TRANSPARENT=true&LAYERS=Urbis:Ortho2012&WIDTH={width}&HEIGHT={height}&CRS={proj}&STYLES=&BBOX={bbox}",projection:"EPSG:3857",endDate:"2012-01-01T00:00:00.000Z",startDate:"2012-01-01T00:00:00.000Z",polygon:[[[4.37973,50.76382],[4.38917,50.76377],[4.43028,50.77517],[4.435,50.775],[4.46427,50.78645],[4.4817,50.79134],[4.48238,50.79617],[4.45921,50.80626],[4.45947,50.81661],[4.47972,50.82036],[4.46959,50.83537],[4.46899,50.84573],[4.46238,50.85396],[4.44968,50.85591],[4.44599,50.85992],[4.4253,50.86615],[4.43183,50.87628],[4.44007,50.87845],[4.43106,50.89014],[4.43595,50.89502],[4.4296,50.90103],[4.41655,50.90757],[4.41543,50.91342],[4.39578,50.91407],[4.38462,50.91093],[4.38119,50.90319],[4.3726,50.90032],[4.36213,50.9033],[4.34857,50.90341],[4.34025,50.90411],[4.32892,50.90249],[4.31647,50.89605],[4.30634,50.89274],[4.29004,50.88982],[4.29149,50.88495],[4.29553,50.88262],[4.29561,50.88094],[4.28274,50.87227],[4.27699,50.86713],[4.27802,50.85911],[4.28042,50.85721],[4.28094,50.84215],[4.27193,50.84036],[4.25467,50.83695],[4.25107,50.83288],[4.25227,50.82697],[4.24343,50.82182],[4.24403,50.81548],[4.25519,50.8151],[4.25802,50.80935],[4.27218,50.81011],[4.27579,50.80696],[4.2854,50.80506],[4.28901,50.80691],[4.29802,50.80593],[4.30282,50.79709],[4.31458,50.79454],[4.31621,50.78624],[4.32952,50.77381],[4.34205,50.77164],[4.34522,50.77337],[4.37853,50.76811],[4.37973,50.76382]]],terms_text:"Realized by means of Brussels UrbIS®© - Distribution & Copyright CIRB",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/be/URBIS2015aerialimagery.png"},{id:"URBIS2014",name:"URBIS 2014 aerial imagery",type:"wms",template:"https://geoservices-urbis.irisnet.be/geoserver/ows?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&FORMAT=image/png&TRANSPARENT=true&LAYERS=Urbis:Ortho2014&WIDTH={width}&HEIGHT={height}&CRS={proj}&STYLES=&BBOX={bbox}",projection:"EPSG:3857",endDate:"2014-01-01T00:00:00.000Z",startDate:"2014-01-01T00:00:00.000Z",polygon:[[[4.4001,50.76373],[4.43093,50.77254],[4.43586,50.77237],[4.46549,50.78373],[4.48189,50.78835],[4.48269,50.79849],[4.46363,50.80686],[4.46407,50.81546],[4.48204,50.81699],[4.48103,50.82343],[4.47465,50.83505],[4.47403,50.84587],[4.46712,50.85447],[4.45257,50.85797],[4.45017,50.86151],[4.42968,50.86764],[4.43423,50.87384],[4.44147,50.87513],[4.44381,50.88004],[4.43534,50.88977],[4.43968,50.89475],[4.43287,50.90363],[4.42096,50.90917],[4.42023,50.91387],[4.38315,50.91381],[4.37879,50.90637],[4.37334,50.90289],[4.36241,50.906],[4.34824,50.90611],[4.33955,50.90685],[4.32771,50.90515],[4.31471,50.89842],[4.30413,50.89498],[4.2871,50.89192],[4.28725,50.88532],[4.29293,50.88265],[4.27948,50.8736],[4.27347,50.86822],[4.27364,50.85871],[4.27688,50.85575],[4.27644,50.84376],[4.26664,50.8405],[4.25488,50.83992],[4.24755,50.83453],[4.24799,50.82866],[4.24357,50.82599],[4.24376,50.81356],[4.25233,50.81268],[4.25649,50.80711],[4.27025,50.8073],[4.27222,50.80537],[4.28414,50.80241],[4.28885,50.80434],[4.29544,50.8043],[4.30046,50.79506],[4.31076,50.79299],[4.31444,50.78372],[4.32628,50.77221],[4.34194,50.76891],[4.34474,50.77029],[4.37535,50.76577],[4.3755,50.76381],[4.4001,50.76373]]],terms_text:"Realized by means of Brussels UrbIS®© - Distribution & Copyright CIRB",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/be/URBIS2015aerialimagery.png"},{id:"URBIS2015",name:"URBIS 2015 aerial imagery",type:"wms",template:"https://geoservices-urbis.irisnet.be/geoserver/ows?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&FORMAT=image/png&TRANSPARENT=true&LAYERS=Urbis:Ortho2015&WIDTH={width}&HEIGHT={height}&CRS={proj}&STYLES=&BBOX={bbox}",projection:"EPSG:3857",endDate:"2015-01-01T00:00:00.000Z",startDate:"2015-01-01T00:00:00.000Z",polygon:[[[4.37973,50.76382],[4.38917,50.76377],[4.43028,50.77517],[4.435,50.775],[4.46427,50.78645],[4.4817,50.79134],[4.48238,50.79617],[4.45921,50.80626],[4.45947,50.81661],[4.47972,50.82036],[4.46959,50.83537],[4.46899,50.84573],[4.46238,50.85396],[4.44968,50.85591],[4.44599,50.85992],[4.4253,50.86615],[4.43183,50.87628],[4.44007,50.87845],[4.43106,50.89014],[4.43595,50.89502],[4.4296,50.90103],[4.41655,50.90757],[4.41543,50.91342],[4.39578,50.91407],[4.38462,50.91093],[4.38119,50.90319],[4.3726,50.90032],[4.36213,50.9033],[4.34857,50.90341],[4.34025,50.90411],[4.32892,50.90249],[4.31647,50.89605],[4.30634,50.89274],[4.29004,50.88982],[4.29149,50.88495],[4.29553,50.88262],[4.29561,50.88094],[4.28274,50.87227],[4.27699,50.86713],[4.27802,50.85911],[4.28042,50.85721],[4.28094,50.84215],[4.27193,50.84036],[4.25467,50.83695],[4.25107,50.83288],[4.25227,50.82697],[4.24343,50.82182],[4.24403,50.81548],[4.25519,50.8151],[4.25802,50.80935],[4.27218,50.81011],[4.27579,50.80696],[4.2854,50.80506],[4.28901,50.80691],[4.29802,50.80593],[4.30282,50.79709],[4.31458,50.79454],[4.31621,50.78624],[4.32952,50.77381],[4.34205,50.77164],[4.34522,50.77337],[4.37853,50.76811],[4.37973,50.76382]]],terms_text:"Realized by means of Brussels UrbIS®© - Distribution & Copyright CIRB",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/be/URBIS2015aerialimagery.png"},{id:"UrbISOrtho2016",name:"UrbIS-Ortho 2016",type:"wms",template:"https://geoservices-urbis.irisnet.be/geoserver/ows?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&FORMAT=image/png&TRANSPARENT=true&LAYERS=Urbis:Ortho2016&WIDTH={width}&HEIGHT={height}&CRS={proj}&STYLES=&BBOX={bbox}",projection:"EPSG:3857",endDate:"2016-01-01T00:00:00.000Z",startDate:"2016-01-01T00:00:00.000Z",polygon:[[[4.37973,50.76382],[4.38917,50.76377],[4.43028,50.77517],[4.435,50.775],[4.46427,50.78645],[4.4817,50.79134],[4.48238,50.79617],[4.45921,50.80626],[4.45947,50.81661],[4.47972,50.82036],[4.46959,50.83537],[4.46899,50.84573],[4.46238,50.85396],[4.44968,50.85591],[4.44599,50.85992],[4.4253,50.86615],[4.43183,50.87628],[4.44007,50.87845],[4.43106,50.89014],[4.43595,50.89502],[4.4296,50.90103],[4.41655,50.90757],[4.41543,50.91342],[4.39578,50.91407],[4.38462,50.91093],[4.38119,50.90319],[4.3726,50.90032],[4.36213,50.9033],[4.34857,50.90341],[4.34025,50.90411],[4.32892,50.90249],[4.31647,50.89605],[4.30634,50.89274],[4.29004,50.88982],[4.29149,50.88495],[4.29553,50.88262],[4.29561,50.88094],[4.28274,50.87227],[4.27699,50.86713],[4.27802,50.85911],[4.28042,50.85721],[4.28094,50.84215],[4.27193,50.84036],[4.25467,50.83695],[4.25107,50.83288],[4.25227,50.82697],[4.24343,50.82182],[4.24403,50.81548],[4.25519,50.8151],[4.25802,50.80935],[4.27218,50.81011],[4.27579,50.80696],[4.2854,50.80506],[4.28901,50.80691],[4.29802,50.80593],[4.30282,50.79709],[4.31458,50.79454],[4.31621,50.78624],[4.32952,50.77381],[4.34205,50.77164],[4.34522,50.77337],[4.37853,50.76811],[4.37973,50.76382]]],terms_text:"Realized by means of Brussels UrbIS®© - Distribution & Copyright CIRB",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/be/URBIS2015aerialimagery.png"},{id:"UrbISOrtho2017",name:"UrbIS-Ortho 2017",type:"wms",template:"https://geoservices-urbis.irisnet.be/geoserver/ows?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&FORMAT=image/png&TRANSPARENT=true&LAYERS=Urbis:Ortho2017&WIDTH={width}&HEIGHT={height}&CRS={proj}&STYLES=&BBOX={bbox}",projection:"EPSG:3857",endDate:"2017-01-01T00:00:00.000Z",startDate:"2017-01-01T00:00:00.000Z",polygon:[[[4.37973,50.76382],[4.38917,50.76377],[4.43028,50.77517],[4.435,50.775],[4.46427,50.78645],[4.4817,50.79134],[4.48238,50.79617],[4.45921,50.80626],[4.45947,50.81661],[4.47972,50.82036],[4.46959,50.83537],[4.46899,50.84573],[4.46238,50.85396],[4.44968,50.85591],[4.44599,50.85992],[4.4253,50.86615],[4.43183,50.87628],[4.44007,50.87845],[4.43106,50.89014],[4.43595,50.89502],[4.4296,50.90103],[4.41655,50.90757],[4.41543,50.91342],[4.39578,50.91407],[4.38462,50.91093],[4.38119,50.90319],[4.3726,50.90032],[4.36213,50.9033],[4.34857,50.90341],[4.34025,50.90411],[4.32892,50.90249],[4.31647,50.89605],[4.30634,50.89274],[4.29004,50.88982],[4.29149,50.88495],[4.29553,50.88262],[4.29561,50.88094],[4.28274,50.87227],[4.27699,50.86713],[4.27802,50.85911],[4.28042,50.85721],[4.28094,50.84215],[4.27193,50.84036],[4.25467,50.83695],[4.25107,50.83288],[4.25227,50.82697],[4.24343,50.82182],[4.24403,50.81548],[4.25519,50.8151],[4.25802,50.80935],[4.27218,50.81011],[4.27579,50.80696],[4.2854,50.80506],[4.28901,50.80691],[4.29802,50.80593],[4.30282,50.79709],[4.31458,50.79454],[4.31621,50.78624],[4.32952,50.77381],[4.34205,50.77164],[4.34522,50.77337],[4.37853,50.76811],[4.37973,50.76382]]],terms_text:"Realized by means of Brussels UrbIS®© - Distribution & Copyright CIRB",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/be/URBIS2015aerialimagery.png"},{id:"UrbISOrtho2018",name:"UrbIS-Ortho 2018",type:"wms",template:"https://geoservices-urbis.irisnet.be/geoserver/ows?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&FORMAT=image/png&TRANSPARENT=true&LAYERS=Urbis:Ortho2018&WIDTH={width}&HEIGHT={height}&CRS={proj}&STYLES=&BBOX={bbox}",projection:"EPSG:3857",endDate:"2018-01-01T00:00:00.000Z",startDate:"2018-01-01T00:00:00.000Z",polygon:[[[4.37973,50.76382],[4.38917,50.76377],[4.43028,50.77517],[4.435,50.775],[4.46427,50.78645],[4.4817,50.79134],[4.48238,50.79617],[4.45921,50.80626],[4.45947,50.81661],[4.47972,50.82036],[4.46959,50.83537],[4.46899,50.84573],[4.46238,50.85396],[4.44968,50.85591],[4.44599,50.85992],[4.4253,50.86615],[4.43183,50.87628],[4.44007,50.87845],[4.43106,50.89014],[4.43595,50.89502],[4.4296,50.90103],[4.41655,50.90757],[4.41543,50.91342],[4.39578,50.91407],[4.38462,50.91093],[4.38119,50.90319],[4.3726,50.90032],[4.36213,50.9033],[4.34857,50.90341],[4.34025,50.90411],[4.32892,50.90249],[4.31647,50.89605],[4.30634,50.89274],[4.29004,50.88982],[4.29149,50.88495],[4.29553,50.88262],[4.29561,50.88094],[4.28274,50.87227],[4.27699,50.86713],[4.27802,50.85911],[4.28042,50.85721],[4.28094,50.84215],[4.27193,50.84036],[4.25467,50.83695],[4.25107,50.83288],[4.25227,50.82697],[4.24343,50.82182],[4.24403,50.81548],[4.25519,50.8151],[4.25802,50.80935],[4.27218,50.81011],[4.27579,50.80696],[4.2854,50.80506],[4.28901,50.80691],[4.29802,50.80593],[4.30282,50.79709],[4.31458,50.79454],[4.31621,50.78624],[4.32952,50.77381],[4.34205,50.77164],[4.34522,50.77337],[4.37853,50.76811],[4.37973,50.76382]]],terms_text:"Realized by means of Brussels UrbIS®© - Distribution & Copyright CIRB",best:true,icon:"https://osmlab.github.io/editor-layer-index/sources/europe/be/URBIS2015aerialimagery.png"},{id:"UrbisAdmFR",name:"UrbisAdm FR",type:"wms",template:"https://geoservices-urbis.irisnet.be/geoserver/ows?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&FORMAT=image/png&TRANSPARENT=true&LAYERS=urbisFR&WIDTH={width}&HEIGHT={height}&CRS={proj}&STYLES=&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[4.4347,50.77647],[4.45427,50.78367],[4.4635,50.78798],[4.48273,50.79313],[4.44715,50.80821],[4.44831,50.81147],[4.45788,50.81646],[4.45466,50.81838],[4.4768,50.82036],[4.46552,50.83549],[4.46835,50.83744],[4.46037,50.85218],[4.44578,50.85522],[4.44466,50.85809],[4.43891,50.86042],[4.43719,50.85868],[4.42612,50.86296],[4.42037,50.86789],[4.42973,50.87764],[4.43736,50.87867],[4.42681,50.89026],[4.43307,50.89464],[4.42277,50.90298],[4.41187,50.90753],[4.41376,50.91159],[4.4032,50.91381],[4.38758,50.9098],[4.37771,50.89713],[4.36303,50.90119],[4.34183,50.9026],[4.33093,50.90119],[4.31651,50.89389],[4.3057,50.8908],[4.29334,50.88847],[4.29428,50.88658],[4.29737,50.8849],[4.29918,50.87975],[4.28587,50.87201],[4.27858,50.86556],[4.28064,50.85944],[4.28999,50.85625],[4.28304,50.85354],[4.28793,50.84833],[4.28291,50.8479],[4.28158,50.83785],[4.27399,50.8392],[4.27184,50.8363],[4.25793,50.83571],[4.2545,50.83289],[4.25523,50.82839],[4.2509,50.82419],[4.24382,50.81928],[4.2566,50.81743],[4.25995,50.81106],[4.27274,50.81212],[4.2757,50.81087],[4.27708,50.80835],[4.28454,50.80732],[4.29274,50.80911],[4.2951,50.80881],[4.30162,50.81299],[4.3066,50.81239],[4.30205,50.80445],[4.30501,50.7987],[4.31527,50.79661],[4.31845,50.79403],[4.3193,50.78722],[4.32201,50.7832],[4.33089,50.7758],[4.3408,50.77354],[4.34677,50.77574],[4.3551,50.77354],[4.36527,50.77284],[4.38243,50.76917],[4.38303,50.76375],[4.43312,50.77802],[4.4347,50.77647]]],terms_text:"Realized by means of Brussels UrbIS®© - Distribution & Copyright CIRB",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/be/URBIS2015aerialimagery.png"},{id:"UrbisAdmNL",name:"UrbisAdm NL",type:"wms",template:"https://geoservices-urbis.irisnet.be/geoserver/ows?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&FORMAT=image/png&TRANSPARENT=true&LAYERS=urbisNL&WIDTH={width}&HEIGHT={height}&CRS={proj}&STYLES=&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[4.4347,50.77647],[4.45427,50.78367],[4.4635,50.78798],[4.48273,50.79313],[4.44715,50.80821],[4.44831,50.81147],[4.45788,50.81646],[4.45466,50.81838],[4.4768,50.82036],[4.46552,50.83549],[4.46835,50.83744],[4.46037,50.85218],[4.44578,50.85522],[4.44466,50.85809],[4.43891,50.86042],[4.43719,50.85868],[4.42612,50.86296],[4.42037,50.86789],[4.42973,50.87764],[4.43736,50.87867],[4.42681,50.89026],[4.43307,50.89464],[4.42277,50.90298],[4.41187,50.90753],[4.41376,50.91159],[4.4032,50.91381],[4.38758,50.9098],[4.37771,50.89713],[4.36303,50.90119],[4.34183,50.9026],[4.33093,50.90119],[4.31651,50.89389],[4.3057,50.8908],[4.29334,50.88847],[4.29428,50.88658],[4.29737,50.8849],[4.29918,50.87975],[4.28587,50.87201],[4.27858,50.86556],[4.28064,50.85944],[4.28999,50.85625],[4.28304,50.85354],[4.28793,50.84833],[4.28291,50.8479],[4.28158,50.83785],[4.27399,50.8392],[4.27184,50.8363],[4.25793,50.83571],[4.2545,50.83289],[4.25523,50.82839],[4.2509,50.82419],[4.24382,50.81928],[4.2566,50.81743],[4.25995,50.81106],[4.27274,50.81212],[4.2757,50.81087],[4.27708,50.80835],[4.28454,50.80732],[4.29274,50.80911],[4.2951,50.80881],[4.30162,50.81299],[4.3066,50.81239],[4.30205,50.80445],[4.30501,50.7987],[4.31527,50.79661],[4.31845,50.79403],[4.3193,50.78722],[4.32201,50.7832],[4.33089,50.7758],[4.3408,50.77354],[4.34677,50.77574],[4.3551,50.77354],[4.36527,50.77284],[4.38243,50.76917],[4.38303,50.76375],[4.43312,50.77802],[4.4347,50.77647]]],terms_text:"Realized by means of Brussels UrbIS®© - Distribution & Copyright CIRB",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/be/URBIS2015aerialimagery.png"},{id:"URBISfr2013",name:"URBISfr numerical imagery (2013)",type:"wms",template:"https://gis.irisnet.be/arcgis/rest/services/basemap/urbisFR/MapServer/export?f=image&format=png8&transparent=False&SRS={proj}&bboxSR=3857&imageSR=3857&bbox={bbox}&size={width},{height}",projection:"EPSG:3857",endDate:"2013-01-01T00:00:00.000Z",startDate:"2013-01-01T00:00:00.000Z",polygon:[[[4.4347,50.77647],[4.45427,50.78367],[4.4635,50.78798],[4.48273,50.79313],[4.44715,50.80821],[4.44831,50.81147],[4.45788,50.81646],[4.45466,50.81838],[4.4768,50.82036],[4.46552,50.83549],[4.46835,50.83744],[4.46037,50.85218],[4.44578,50.85522],[4.44466,50.85809],[4.43891,50.86042],[4.43719,50.85868],[4.42612,50.86296],[4.42037,50.86789],[4.42973,50.87764],[4.43736,50.87867],[4.42681,50.89026],[4.43307,50.89464],[4.42277,50.90298],[4.41187,50.90753],[4.41376,50.91159],[4.4032,50.91381],[4.38758,50.9098],[4.37771,50.89713],[4.36303,50.90119],[4.34183,50.9026],[4.33093,50.90119],[4.31651,50.89389],[4.3057,50.8908],[4.29334,50.88847],[4.29428,50.88658],[4.29737,50.8849],[4.29918,50.87975],[4.28587,50.87201],[4.27858,50.86556],[4.28064,50.85944],[4.28999,50.85625],[4.28304,50.85354],[4.28793,50.84833],[4.28291,50.8479],[4.28158,50.83785],[4.27399,50.8392],[4.27184,50.8363],[4.25793,50.83571],[4.2545,50.83289],[4.25523,50.82839],[4.2509,50.82419],[4.24382,50.81928],[4.2566,50.81743],[4.25995,50.81106],[4.27274,50.81212],[4.2757,50.81087],[4.27708,50.80835],[4.28454,50.80732],[4.29274,50.80911],[4.2951,50.80881],[4.30162,50.81299],[4.3066,50.81239],[4.30205,50.80445],[4.30501,50.7987],[4.31527,50.79661],[4.31845,50.79403],[4.3193,50.78722],[4.32201,50.7832],[4.33089,50.7758],[4.3408,50.77354],[4.34677,50.77574],[4.3551,50.77354],[4.36527,50.77284],[4.38243,50.76917],[4.38303,50.76375],[4.43312,50.77802],[4.4347,50.77647]]],terms_text:"Realized by means of Brussels UrbIS®© - Distribution & Copyright CIRB",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/be/URBIS2015aerialimagery.png"},{id:"URBISnl2013",name:"URBISnl numerical imagery (2013)",type:"wms",template:"https://gis.irisnet.be/arcgis/rest/services/basemap/urbisNL/MapServer/export?f=image&format=png8&transparent=False&SRS={proj}&bboxSR=3857&imageSR=3857&bbox={bbox}&size={width},{height}",projection:"EPSG:3857",endDate:"2013-01-01T00:00:00.000Z",startDate:"2013-01-01T00:00:00.000Z",polygon:[[[4.4347,50.77647],[4.45427,50.78367],[4.4635,50.78798],[4.48273,50.79313],[4.44715,50.80821],[4.44831,50.81147],[4.45788,50.81646],[4.45466,50.81838],[4.4768,50.82036],[4.46552,50.83549],[4.46835,50.83744],[4.46037,50.85218],[4.44578,50.85522],[4.44466,50.85809],[4.43891,50.86042],[4.43719,50.85868],[4.42612,50.86296],[4.42037,50.86789],[4.42973,50.87764],[4.43736,50.87867],[4.42681,50.89026],[4.43307,50.89464],[4.42277,50.90298],[4.41187,50.90753],[4.41376,50.91159],[4.4032,50.91381],[4.38758,50.9098],[4.37771,50.89713],[4.36303,50.90119],[4.34183,50.9026],[4.33093,50.90119],[4.31651,50.89389],[4.3057,50.8908],[4.29334,50.88847],[4.29428,50.88658],[4.29737,50.8849],[4.29918,50.87975],[4.28587,50.87201],[4.27858,50.86556],[4.28064,50.85944],[4.28999,50.85625],[4.28304,50.85354],[4.28793,50.84833],[4.28291,50.8479],[4.28158,50.83785],[4.27399,50.8392],[4.27184,50.8363],[4.25793,50.83571],[4.2545,50.83289],[4.25523,50.82839],[4.2509,50.82419],[4.24382,50.81928],[4.2566,50.81743],[4.25995,50.81106],[4.27274,50.81212],[4.2757,50.81087],[4.27708,50.80835],[4.28454,50.80732],[4.29274,50.80911],[4.2951,50.80881],[4.30162,50.81299],[4.3066,50.81239],[4.30205,50.80445],[4.30501,50.7987],[4.31527,50.79661],[4.31845,50.79403],[4.3193,50.78722],[4.32201,50.7832],[4.33089,50.7758],[4.3408,50.77354],[4.34677,50.77574],[4.3551,50.77354],[4.36527,50.77284],[4.38243,50.76917],[4.38303,50.76375],[4.43312,50.77802],[4.4347,50.77647]]],terms_text:"Realized by means of Brussels UrbIS®© - Distribution & Copyright CIRB",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/be/URBIS2015aerialimagery.png"},{id:"USGS-Imagery",name:"USGS Imagery",type:"tms",template:"https://ags-proxy.openstreetmap.us/tiles/{zoom}/{x}/{y}?url=https%3A%2F%2Fbasemap.nationalmap.gov%2Farcgis%2Frest%2Fservices%2FUSGSImageryOnly%2FMapServer",zoomExtent:[12,20],polygon:[[[-123.25493,48.7529],[-123.25493,48.55923],[-123.19222,48.55923],[-123.19222,48.43484],[-122.94196,48.43484],[-122.94196,48.37208],[-122.88062,48.37208],[-122.88062,48.30948],[-122.81676,48.30948],[-122.81676,48.19046],[-123.00411,48.19046],[-123.00411,48.12759],[-123.05842,48.12759],[-123.05842,48.19051],[-123.25411,48.19051],[-123.25411,48.1275],[-123.37066,48.1275],[-123.37066,48.19084],[-124.05826,48.19084],[-124.05826,48.25344],[-124.18152,48.25344],[-124.18152,48.31647],[-124.43191,48.31647],[-124.43191,48.37826],[-124.55646,48.37826],[-124.55646,48.44083],[-124.75551,48.44083],[-124.75551,48.1915],[-124.81853,48.1915],[-124.81853,48.12284],[-124.7553,48.12284],[-124.7553,47.55353],[-124.38121,47.55353],[-124.38121,47.12187],[-124.19289,47.12187],[-124.19289,43.75694],[-124.44434,43.75694],[-124.44434,43.14256],[-124.63989,43.14256],[-124.63989,42.61945],[-124.44385,42.61945],[-124.44385,39.80807],[-123.88157,39.80807],[-123.88157,39.11028],[-123.75805,39.11028],[-123.75805,38.49688],[-123.27028,38.49688],[-123.27028,37.93319],[-122.81481,37.93319],[-122.81481,37.80196],[-122.56643,37.80196],[-122.56643,36.93196],[-121.8784,36.93196],[-121.8784,36.68976],[-122.00347,36.68976],[-122.00347,36.43411],[-121.94142,36.43411],[-121.94142,35.92976],[-121.5041,35.92976],[-121.5041,35.81003],[-121.37903,35.81003],[-121.37903,35.42392],[-120.94265,35.42392],[-120.94265,35.18497],[-120.8172,35.18497],[-120.8172,35.12199],[-120.69184,35.12199],[-120.69184,34.49668],[-120.50459,34.49668],[-120.50459,34.43397],[-120.00788,34.43397],[-120.00788,34.36826],[-119.52835,34.36826],[-119.52835,34.05764],[-119.0061,34.05764],[-119.0061,33.99753],[-118.50463,33.99753],[-118.50463,33.86946],[-118.44132,33.86946],[-118.44132,33.68653],[-118.06691,33.68653],[-118.06691,33.30638],[-117.503,33.30638],[-117.503,33.05003],[-117.31882,33.05003],[-117.31882,32.62059],[-117.1917,32.62059],[-117.1917,32.49746],[-116.7465,32.49746],[-116.7465,32.56092],[-115.99701,32.56092],[-115.99701,32.62649],[-114.88081,32.62649],[-114.88081,32.43408],[-114.62945,32.43408],[-114.62945,32.37316],[-114.44474,32.37316],[-114.44474,32.30754],[-114.25576,32.30754],[-114.25576,32.24446],[-114.06803,32.24446],[-114.06803,32.18291],[-113.81665,32.18291],[-113.81665,32.12076],[-113.63074,32.12076],[-113.63074,32.05651],[-113.44175,32.05651],[-113.44175,31.99844],[-113.2546,31.99844],[-113.2546,31.93254],[-113.06807,31.93254],[-113.06807,31.87181],[-112.81611,31.87181],[-112.81611,31.81042],[-112.63088,31.81042],[-112.63088,31.74647],[-112.44189,31.74647],[-112.44189,31.6856],[-112.25719,31.6856],[-112.25719,31.62104],[-112.00338,31.62104],[-112.00338,31.55958],[-111.81562,31.55958],[-111.81562,31.49702],[-111.62786,31.49702],[-111.62786,31.43399],[-111.4419,31.43399],[-111.4419,31.37339],[-111.25597,31.37339],[-111.25597,31.31132],[-108.18458,31.31132],[-108.18458,31.74595],[-106.50651,31.74595],[-106.50651,31.68423],[-106.37973,31.68423],[-106.37973,31.62175],[-106.31743,31.62175],[-106.31743,31.49682],[-106.25518,31.49682],[-106.25518,31.43449],[-106.19247,31.43449],[-106.19247,31.37213],[-106.00392,31.37213],[-106.00392,31.30933],[-105.94166,31.30933],[-105.94166,31.24575],[-105.87982,31.24575],[-105.87982,31.18362],[-105.81623,31.18362],[-105.81623,31.12072],[-105.69212,31.12072],[-105.69212,31.05848],[-105.63029,31.05848],[-105.63029,30.93283],[-105.50444,30.93283],[-105.50444,30.87159],[-105.4413,30.87159],[-105.4413,30.80846],[-105.37815,30.80846],[-105.37815,30.74718],[-105.19047,30.74718],[-105.19047,30.68432],[-105.12862,30.68432],[-105.12862,30.61997],[-105.00365,30.61997],[-105.00365,30.55891],[-104.9418,30.55891],[-104.9418,30.49632],[-104.8782,30.49632],[-104.8782,30.30983],[-104.81553,30.30983],[-104.81553,30.24783],[-104.75361,30.24783],[-104.75361,29.93539],[-104.69095,29.93539],[-104.69095,29.80902],[-104.62913,29.80902],[-104.62913,29.68436],[-104.56599,29.68436],[-104.56599,29.62235],[-104.50372,29.62235],[-104.50372,29.55954],[-104.44101,29.55954],[-104.44101,29.49748],[-104.25376,29.49748],[-104.25376,29.37167],[-104.1292,29.37167],[-104.1292,29.30916],[-104.06887,29.30916],[-104.06887,29.24673],[-103.81873,29.24673],[-103.81873,29.18431],[-103.75574,29.18431],[-103.75574,29.12232],[-103.56675,29.12232],[-103.56675,29.05981],[-103.50498,29.05981],[-103.50498,28.99675],[-103.31658,28.99675],[-103.31658,28.93469],[-103.05976,28.93469],[-103.05976,29.0593],[-102.99797,29.0593],[-102.99797,29.12129],[-102.93314,29.12129],[-102.93314,29.18486],[-102.8096,29.18486],[-102.8096,29.25262],[-102.87013,29.25262],[-102.87013,29.3081],[-102.80967,29.3081],[-102.80967,29.37155],[-102.74757,29.37155],[-102.74757,29.55819],[-102.68455,29.55819],[-102.68455,29.68477],[-102.49678,29.68477],[-102.49678,29.74577],[-102.30866,29.74577],[-102.30866,29.80866],[-102.19093,29.80866],[-102.19093,29.74601],[-101.50499,29.74601],[-101.50499,29.68468],[-101.38058,29.68468],[-101.38058,29.55945],[-101.31751,29.55945],[-101.31751,29.49589],[-101.19101,29.49589],[-101.19101,29.43261],[-101.0675,29.43261],[-101.0675,29.30881],[-100.94189,29.30881],[-100.94189,29.24562],[-100.81673,29.24562],[-100.81673,29.11904],[-100.75227,29.11904],[-100.75227,29.05782],[-100.69254,29.05782],[-100.69254,28.87204],[-100.62902,28.87204],[-100.62902,28.80954],[-100.56799,28.80954],[-100.56799,28.62255],[-100.50404,28.62255],[-100.50404,28.55838],[-100.44218,28.55838],[-100.44218,28.49683],[-100.37943,28.49683],[-100.37943,28.30929],[-100.31719,28.30929],[-100.31719,28.18357],[-100.25448,28.18357],[-100.25448,28.12139],[-100.12823,28.12139],[-100.12823,28.05921],[-100.06595,28.05921],[-100.06595,27.99661],[-100.00239,27.99661],[-100.00239,27.93322],[-99.94265,27.93322],[-99.94265,27.74547],[-99.81685,27.74547],[-99.81685,27.68343],[-99.75413,27.68343],[-99.75413,27.62215],[-99.62916,27.62215],[-99.62916,27.5589],[-99.56728,27.5589],[-99.56728,27.43538],[-99.50418,27.43538],[-99.50418,27.3774],[-99.56718,27.3774],[-99.56718,27.24637],[-99.50498,27.24637],[-99.50498,26.99656],[-99.44274,26.99656],[-99.44274,26.8728],[-99.38006,26.8728],[-99.38006,26.80682],[-99.31907,26.80682],[-99.31907,26.74736],[-99.25375,26.74736],[-99.25375,26.62101],[-99.19106,26.62101],[-99.19106,26.49567],[-99.13006,26.49567],[-99.13006,26.37138],[-99.00295,26.37138],[-99.00295,26.30938],[-98.81657,26.30938],[-98.81657,26.24578],[-98.69201,26.24578],[-98.69201,26.18371],[-98.44409,26.18371],[-98.44409,26.12172],[-98.38232,26.12172],[-98.38232,26.05965],[-98.25327,26.05965],[-98.25327,25.99869],[-98.01091,25.99869],[-98.01091,25.99323],[-97.69323,25.99323],[-97.69323,25.93341],[-97.63139,25.93341],[-97.63139,25.86959],[-97.50468,25.86959],[-97.50468,25.80735],[-97.30834,25.80735],[-97.30834,25.87312],[-97.24563,25.87312],[-97.24563,25.93537],[-97.11389,25.93537],[-97.11389,27.68092],[-97.0571,27.68092],[-97.0571,27.81082],[-95.58108,27.81082],[-95.58108,28.74688],[-94.27104,28.74688],[-94.27104,29.55941],[-92.50299,29.55941],[-92.50299,29.49748],[-91.87762,29.49748],[-91.87762,29.3727],[-91.37842,29.3727],[-91.37842,29.24683],[-91.3154,29.24683],[-91.3154,29.18443],[-91.12947,29.18443],[-91.12947,29.12326],[-91.00526,29.12326],[-91.00526,28.99684],[-89.45002,28.99684],[-89.45002,28.86774],[-88.81043,28.86774],[-88.81043,30.18419],[-85.87915,30.18419],[-85.87915,29.5455],[-84.83681,29.5455],[-84.83681,29.62252],[-84.74828,29.62252],[-84.74828,29.68362],[-84.68589,29.68362],[-84.68589,29.74684],[-83.6297,29.74684],[-83.6297,29.43244],[-83.31749,29.43244],[-83.31749,29.05794],[-82.87966,29.05794],[-82.87966,27.74535],[-82.81828,27.74535],[-82.81828,26.92909],[-82.37968,26.92909],[-82.37968,26.36942],[-81.87771,26.36942],[-81.87771,25.80597],[-81.50369,25.80597],[-81.50369,25.74748],[-81.44055,25.74748],[-81.44055,25.68515],[-81.31559,25.68515],[-81.31559,25.5601],[-81.25385,25.5601],[-81.25385,25.43424],[-81.1902,25.43424],[-81.1902,25.12343],[-81.12881,25.12343],[-81.12881,25.06194],[-81.06492,25.06194],[-81.06492,24.81578],[-81.62895,24.81578],[-81.62895,24.75384],[-81.69072,24.75384],[-81.69072,24.68994],[-81.81732,24.68994],[-81.81732,24.62792],[-82.191,24.62792],[-82.191,24.49629],[-81.62166,24.49629],[-81.62166,24.55948],[-81.37201,24.55948],[-81.37201,24.62207],[-81.05933,24.62207],[-81.05933,24.68483],[-80.93471,24.68483],[-80.93471,24.74748],[-80.74711,24.74748],[-80.74711,24.81006],[-80.36299,24.81006],[-80.36299,25.11759],[-80.12234,25.11759],[-80.12234,25.74724],[-80.05885,25.74724],[-80.05885,26.37083],[-79.99584,26.37083],[-79.99584,26.9398],[-80.05873,26.9398],[-80.05873,27.12775],[-80.12263,27.12775],[-80.12263,27.25343],[-80.1847,27.25343],[-80.1847,27.37812],[-80.24617,27.37812],[-80.24617,27.56587],[-80.30948,27.56587],[-80.30948,27.75303],[-80.37215,27.75303],[-80.37215,27.87745],[-80.43515,27.87745],[-80.43515,28.00334],[-80.49661,28.00334],[-80.49661,28.12773],[-80.55872,28.12773],[-80.55872,28.37235],[-80.49663,28.37235],[-80.49663,29.51603],[-81.12136,29.51603],[-81.12136,31.6847],[-80.60187,31.6847],[-80.60187,32.24753],[-79.4921,32.24753],[-79.4921,32.99703],[-79.11165,32.99703],[-79.11165,33.37295],[-78.61536,33.37295],[-78.61536,33.80976],[-77.9317,33.80976],[-77.9317,33.87182],[-77.86923,33.87182],[-77.86923,34.05525],[-77.68264,34.05525],[-77.68264,34.29746],[-77.24535,34.29746],[-77.24535,34.55986],[-76.49733,34.55986],[-76.49733,34.6228],[-76.43376,34.6228],[-76.43376,34.68493],[-76.37321,34.68493],[-76.37321,34.74677],[-76.30594,34.74677],[-76.30594,34.80855],[-76.2468,34.80855],[-76.2468,34.87284],[-76.18259,34.87284],[-76.18259,34.93353],[-76.12081,34.93353],[-76.12081,34.99524],[-75.9979,34.99524],[-75.9979,35.05782],[-75.87034,35.05782],[-75.87034,35.12191],[-75.74622,35.12191],[-75.74622,35.18189],[-75.49297,35.18189],[-75.49297,35.3083],[-75.43257,35.3083],[-75.43257,35.75425],[-75.49699,35.75425],[-75.49699,37.81056],[-75.3083,37.81056],[-75.3083,37.87201],[-75.2456,37.87201],[-75.2456,37.99548],[-75.18288,37.99548],[-75.18288,38.05851],[-75.11848,38.05851],[-75.11848,38.24691],[-75.05921,38.24691],[-75.05921,38.37043],[-74.99481,38.37043],[-74.99481,38.87184],[-74.48783,38.87184],[-74.48783,39.30894],[-74.17663,39.30894],[-74.17663,39.62247],[-74.0567,39.62247],[-74.0567,39.93318],[-73.9959,39.93318],[-73.9959,40.18549],[-73.93416,40.18549],[-73.93416,40.49595],[-73.8723,40.49595],[-73.8723,40.55271],[-71.80745,40.55271],[-71.80745,41.3088],[-70.88251,41.3088],[-70.88251,41.18498],[-70.74619,41.18498],[-70.74619,41.30919],[-70.43376,41.30919],[-70.43376,41.49639],[-69.93343,41.49639],[-69.93343,41.62308],[-69.86986,41.62308],[-69.86986,41.87769],[-69.93579,41.87769],[-69.93579,42.00323],[-69.99758,42.00323],[-69.99758,42.06502],[-70.06061,42.06502],[-70.06061,42.12943],[-70.55729,42.12943],[-70.55729,43.24871],[-70.49741,43.24871],[-70.49741,43.30922],[-70.37042,43.30922],[-70.37042,43.37196],[-70.30857,43.37196],[-70.30857,43.49699],[-70.18392,43.49699],[-70.18392,43.62235],[-70.05758,43.62235],[-70.05758,43.68502],[-69.74552,43.68502],[-69.74552,43.74766],[-69.24728,43.74766],[-69.24728,43.8107],[-69.05607,43.8107],[-69.05607,43.87172],[-68.99505,43.87172],[-68.99505,43.9982],[-68.49637,43.9982],[-68.49637,44.05974],[-68.3081,44.05974],[-68.3081,44.12214],[-68.18518,44.12214],[-68.18518,44.30814],[-67.9956,44.30814],[-67.9956,44.37275],[-67.8103,44.37275],[-67.8103,44.43518],[-67.49653,44.43518],[-67.49653,44.49688],[-67.37102,44.49688],[-67.37102,44.56006],[-67.18488,44.56006],[-67.18488,44.62133],[-67.12212,44.62133],[-67.12212,44.68679],[-67.05936,44.68679],[-67.05936,44.74737],[-66.93111,44.74737],[-66.93111,44.94066],[-66.99468,44.94066],[-66.99468,45.00245],[-67.05958,45.00245],[-67.05958,45.12734],[-67.1202,45.12734],[-67.1202,45.19101],[-67.24698,45.19101],[-67.24698,45.25344],[-67.31775,45.25344],[-67.31775,45.18984],[-67.37075,45.18984],[-67.37075,45.2534],[-67.43269,45.2534],[-67.43269,45.30834],[-67.37086,45.30834],[-67.37086,45.4397],[-67.43056,45.4397],[-67.43056,45.49501],[-67.37099,45.49501],[-67.37099,45.62645],[-67.6215,45.62645],[-67.6215,45.68961],[-67.68383,45.68961],[-67.68383,45.75326],[-67.74621,45.75326],[-67.74621,47.12682],[-67.87001,47.12682],[-67.87001,47.19003],[-67.93238,47.19003],[-67.93238,47.25397],[-67.99594,47.25397],[-67.99594,47.31497],[-68.12067,47.31497],[-68.12067,47.37808],[-68.44232,47.37808],[-68.44232,47.31661],[-68.63143,47.31661],[-68.63143,47.25447],[-68.9978,47.25447],[-68.9978,47.43989],[-69.06072,47.43989],[-69.06072,47.50476],[-69.25381,47.50476],[-69.25381,47.43981],[-69.31793,47.43981],[-69.31793,47.3786],[-69.44385,47.3786],[-69.44385,47.31563],[-69.50382,47.31563],[-69.50382,47.25258],[-69.56678,47.25258],[-69.56678,47.19109],[-69.63035,47.19109],[-69.63035,47.1287],[-69.69331,47.1287],[-69.69331,47.06543],[-69.75571,47.06543],[-69.75571,47.00428],[-69.81804,47.00428],[-69.81804,46.94153],[-69.8804,46.94153],[-69.8804,46.87925],[-69.94217,46.87925],[-69.94217,46.81774],[-70.00631,46.81774],[-70.00631,46.69203],[-70.07043,46.69203],[-70.07043,46.44259],[-70.19459,46.44259],[-70.19459,46.37859],[-70.2562,46.37859],[-70.2562,46.31526],[-70.32037,46.31526],[-70.32037,46.06512],[-70.3815,46.06512],[-70.3815,45.93552],[-70.32016,45.93552],[-70.32016,45.87948],[-70.44931,45.87948],[-70.44931,45.75387],[-70.507,45.75387],[-70.507,45.69169],[-70.63166,45.69169],[-70.63166,45.62916],[-70.75755,45.62916],[-70.75755,45.44147],[-70.88099,45.44147],[-70.88099,45.37806],[-71.13328,45.37806],[-71.13328,45.31515],[-71.38303,45.31515],[-71.38303,45.25342],[-71.50764,45.25342],[-71.50764,45.06557],[-73.94189,45.06557],[-73.94189,45.00312],[-74.74697,45.00312],[-74.74697,45.0649],[-74.8801,45.0649],[-74.8801,45.0029],[-75.06625,45.0029],[-75.06625,44.94152],[-75.25394,44.94152],[-75.25394,44.8776],[-75.37896,44.8776],[-75.37896,44.81535],[-75.44313,44.81535],[-75.44313,44.75361],[-75.56666,44.75361],[-75.56666,44.69099],[-75.62902,44.69099],[-75.62902,44.6285],[-75.75405,44.6285],[-75.75405,44.56638],[-75.81731,44.56638],[-75.81731,44.50289],[-75.87995,44.50289],[-75.87995,44.37849],[-76.13003,44.37849],[-76.13003,44.31592],[-76.1927,44.31592],[-76.1927,44.25344],[-76.31826,44.25344],[-76.31826,44.19167],[-76.3793,44.19167],[-76.3793,44.06537],[-76.44276,44.06537],[-76.44276,43.99638],[-76.31703,43.99638],[-76.31703,43.94146],[-76.50766,43.94146],[-76.50766,43.87233],[-76.383,43.87233],[-76.383,43.80919],[-76.25341,43.80919],[-76.25341,43.56652],[-76.50648,43.56652],[-76.50648,43.50339],[-76.63312,43.50339],[-76.63312,43.44323],[-76.69511,43.44323],[-76.69511,43.37869],[-76.81778,43.37869],[-76.81778,43.31807],[-77.682,43.31807],[-77.682,43.37894],[-78.05659,43.37894],[-78.05659,43.43969],[-78.43897,43.43969],[-78.43897,43.37944],[-78.88034,43.37944],[-78.88034,43.31497],[-79.12989,43.31497],[-79.12989,43.24293],[-79.06696,43.24293],[-79.06696,43.12999],[-79.12989,43.12999],[-79.12989,43.05773],[-79.07126,43.05773],[-79.07126,42.92949],[-78.94326,42.92949],[-78.94326,42.75422],[-79.06944,42.75422],[-79.06944,42.69416],[-79.13344,42.69416],[-79.13344,42.6297],[-79.19475,42.6297],[-79.19475,42.56635],[-79.37868,42.56635],[-79.37868,42.50334],[-79.4443,42.50334],[-79.4443,42.44106],[-79.56799,42.44106],[-79.56799,42.37753],[-79.69062,42.37753],[-79.69062,42.31711],[-79.81646,42.31711],[-79.81646,42.25345],[-80.00524,42.25345],[-80.00524,42.19092],[-80.19168,42.19092],[-80.19168,42.12726],[-80.3168,42.12726],[-80.3168,42.06699],[-80.50632,42.06699],[-80.50632,42.00343],[-80.69305,42.00343],[-80.69305,41.94151],[-80.94404,41.94151],[-80.94404,41.87812],[-81.19427,41.87812],[-81.19427,41.81665],[-81.31901,41.81665],[-81.31901,41.75455],[-81.44184,41.75455],[-81.44184,41.69096],[-81.50535,41.69096],[-81.50535,41.63016],[-82.74701,41.63016],[-82.74701,41.75369],[-82.88391,41.75369],[-82.88391,41.56561],[-82.99572,41.56561],[-82.99572,41.62704],[-83.12578,41.62704],[-83.12578,41.68784],[-83.24747,41.68784],[-83.24747,41.75369],[-83.37373,41.75369],[-83.37373,41.80928],[-83.3106,41.80928],[-83.3106,41.87161],[-83.24747,41.87161],[-83.24747,41.93614],[-83.18434,41.93614],[-83.18434,41.99609],[-83.12077,41.99609],[-83.12077,42.24648],[-83.05892,42.24648],[-83.05892,42.30896],[-82.86853,42.30896],[-82.86853,42.37177],[-82.80722,42.37177],[-82.80722,42.55855],[-82.75537,42.55855],[-82.75537,42.49549],[-82.5599,42.49549],[-82.5599,42.55855],[-82.49678,42.55855],[-82.49678,42.68336],[-82.43289,42.68336],[-82.43289,42.93422],[-82.37006,42.93422],[-82.37006,43.06481],[-82.43289,43.06481],[-82.43289,43.19176],[-82.49475,43.19176],[-82.49475,43.50346],[-82.55713,43.50346],[-82.55713,43.81609],[-82.61979,43.81609],[-82.61979,43.94221],[-82.68395,43.94221],[-82.68395,44.00226],[-82.74653,44.00226],[-82.74653,44.06705],[-82.87087,44.06705],[-82.87087,44.12919],[-83.00852,44.12919],[-83.00852,44.06648],[-83.13361,44.06648],[-83.13361,44.00539],[-83.24145,44.00539],[-83.24145,44.9962],[-83.18061,44.9962],[-83.18061,45.0673],[-83.24552,45.0673],[-83.24552,45.12874],[-83.30659,45.12874],[-83.30659,45.25515],[-83.37061,45.25515],[-83.37061,45.31659],[-83.43256,45.31659],[-83.43256,45.37921],[-83.61784,45.37921],[-83.61784,45.44197],[-83.80843,45.44197],[-83.80843,45.50362],[-84.05507,45.50362],[-84.05507,45.56479],[-84.12352,45.56479],[-84.12352,45.62878],[-84.18075,45.62878],[-84.18075,45.69147],[-84.31116,45.69147],[-84.31116,45.93371],[-83.821,45.93371],[-83.821,45.87251],[-83.49681,45.87251],[-83.49681,45.93371],[-83.43381,45.93371],[-83.43381,46.00169],[-83.49627,46.00169],[-83.49627,46.06682],[-83.56,46.06682],[-83.56,46.12616],[-83.99546,46.12616],[-83.99546,46.19317],[-84.05918,46.19317],[-84.05918,46.3815],[-84.11526,46.3815],[-84.11526,46.49536],[-84.05918,46.49536],[-84.05918,46.56827],[-84.25795,46.56827],[-84.25795,46.50512],[-84.30719,46.50512],[-84.30719,46.56827],[-84.44154,46.56827],[-84.44154,46.50453],[-84.99657,46.50453],[-84.99657,46.68429],[-84.92982,46.68429],[-84.92982,46.81808],[-85.31659,46.81808],[-85.31659,46.75358],[-87.55626,46.75358],[-87.55626,47.44074],[-87.68254,47.44074],[-87.68254,47.50356],[-88.25607,47.50356],[-88.25607,47.44337],[-88.44174,47.44337],[-88.44174,47.37899],[-88.50683,47.37899],[-88.50683,47.31539],[-88.63128,47.31539],[-88.63128,47.25398],[-88.75696,47.25398],[-88.75696,47.19347],[-88.88383,47.19347],[-88.88383,47.12847],[-88.94342,47.12847],[-88.94342,47.06621],[-89.07087,47.06621],[-89.07087,47.00268],[-89.25656,47.00268],[-89.25656,46.94108],[-90.36777,46.94108],[-90.36777,47.68448],[-90.307,47.68448],[-90.307,47.74602],[-89.99486,47.74602],[-89.99486,47.80827],[-89.80486,47.80827],[-89.80486,47.87006],[-89.67977,47.87006],[-89.67977,47.93396],[-89.49338,47.93396],[-89.49338,47.9958],[-89.42847,47.9958],[-89.42847,48.06564],[-89.99327,48.06564],[-89.99327,48.1283],[-90.74559,48.1283],[-90.74559,48.18931],[-90.80873,48.18931],[-90.80873,48.25221],[-91.06776,48.25221],[-91.06776,48.19167],[-91.19462,48.19167],[-91.19462,48.1279],[-91.68142,48.1279],[-91.68142,48.2526],[-91.93219,48.2526],[-91.93219,48.31425],[-91.99297,48.31425],[-91.99297,48.37808],[-92.31894,48.37808],[-92.31894,48.25291],[-92.37322,48.25291],[-92.37322,48.31534],[-92.43223,48.31534],[-92.43223,48.44114],[-92.49772,48.44114],[-92.49772,48.50178],[-92.56794,48.50178],[-92.56794,48.43958],[-92.62105,48.43958],[-92.62105,48.56508],[-92.80868,48.56508],[-92.80868,48.62869],[-92.80868,48.62674],[-92.93318,48.62674],[-92.93318,48.69221],[-93.00517,48.69221],[-93.00517,48.6283],[-93.12259,48.6283],[-93.12259,48.69221],[-93.31908,48.69221],[-93.31908,48.62674],[-93.50495,48.62674],[-93.50495,48.56352],[-93.74746,48.56352],[-93.74746,48.62674],[-93.81355,48.62674],[-93.81355,48.68988],[-94.24531,48.68988],[-94.24531,48.75543],[-94.61832,48.75543],[-94.61832,48.94104],[-94.6809,48.94104],[-94.6809,49.00297],[-94.74415,49.00297],[-94.74415,49.25361],[-94.80841,49.25361],[-94.80841,49.37841],[-95.11924,49.37841],[-95.11924,49.44253],[-95.19343,49.44253],[-95.19343,49.00353],[-96.87069,49.00353],[-96.87069,49.06561],[-99.00493,49.06561],[-99.00493,49.00507],[-109.36993,49.00507],[-109.36993,49.06682],[-109.50587,49.06682],[-109.50587,49.00507],[-114.183,49.00507],[-114.183,49.06873],[-114.75787,49.06873],[-114.75787,49.00507],[-115.43373,49.00507],[-115.43373,49.06714],[-116.50627,49.06714],[-116.50627,49.00507],[-117.30895,49.00507],[-117.30895,49.06598],[-119.88295,49.06598],[-119.88295,49.00507],[-120.12086,49.00507],[-120.12086,49.06784],[-121.44516,49.06784],[-121.44516,49.00507],[-121.93118,49.00507],[-121.93118,49.06561],[-122.81748,49.06561],[-122.81748,49.00291],[-122.87952,49.00291],[-122.87952,48.9347],[-122.81746,48.9347],[-122.81746,48.8102],[-122.75389,48.8102],[-122.75389,48.75338],[-122.87129,48.75338],[-122.87129,48.81539],[-123.00554,48.81539],[-123.00554,48.75295],[-123.12969,48.75295],[-123.12969,48.69022],[-123.18382,48.69022],[-123.18382,48.7529],[-123.25493,48.7529]],[[-122.93417,37.75215],[-122.93475,37.6842],[-123.0679,37.6849],[-123.06737,37.74753],[-123.12926,37.74785],[-123.12869,37.81569],[-123.05907,37.81532],[-123.05959,37.75281],[-122.93417,37.75215]],[[-71.62995,41.25409],[-71.49665,41.25414],[-71.49656,41.12297],[-71.62986,41.12291],[-71.62995,41.25409]],[[-70.31843,41.37752],[-70.31834,41.24482],[-70.19066,41.24487],[-70.19062,41.1886],[-69.9336,41.1887],[-69.93373,41.37919],[-69.99507,41.37917],[-69.99511,41.44316],[-70.07078,41.44313],[-70.0707,41.31449],[-70.24617,41.31443],[-70.24621,41.37755],[-70.31843,41.37752]],[[-68.94034,43.94041],[-68.68569,43.9405],[-68.68565,43.87218],[-68.74654,43.87216],[-68.7465,43.81025],[-68.80908,43.81023],[-68.80903,43.74673],[-68.87731,43.7467],[-68.87735,43.81178],[-68.94025,43.81176],[-68.94034,43.94041]],[[-123.12915,49.06451],[-122.99542,49.06451],[-122.99542,48.93432],[-123.12915,48.93432],[-123.12915,49.06451]],[[-82.94071,24.75359],[-82.87194,24.75359],[-82.87194,24.69057],[-82.74462,24.69057],[-82.74462,24.62146],[-82.8088,24.62146],[-82.8088,24.55949],[-82.94071,24.55949],[-82.94071,24.75359]]],description:"Public domain aerial imagery, mostly NAIP",icon:"https://osmlab.github.io/editor-layer-index/sources/north-america/us/USGSTopographicMaps.png"},{id:"USGS-Scanned_Topographic",name:"USGS Topographic Maps",type:"tms",template:"https://caltopo.s3.amazonaws.com/topo/{zoom}/{x}/{y}.png",zoomExtent:[0,16],polygon:[[[-55.99594,52.00107],[-112.02896,52.00107],[-112.03995,56.01308],[-120.00494,56.00592],[-120.01712,60.01202],[-132.00197,60.00239],[-132.01208,63.00193],[-133.96883,63.0005],[-133.9724,63.99225],[-141.04429,63.98726],[-141.06879,69.92046],[-156.24893,71.51583],[-160.44571,70.83527],[-167.08145,68.42906],[-164.08218,67.03914],[-169.01504,65.68269],[-166.57608,64.50778],[-161.82999,64.05006],[-165.08194,63.2603],[-168.02628,59.78623],[-162.53311,59.73089],[-162.35733,58.55905],[-157.83096,58.31753],[-158.00674,57.52404],[-168.22403,53.51022],[-166.55411,53.14277],[-158.77579,54.88541],[-158.6824,55.74964],[-156.55106,56.00848],[-156.15555,56.77466],[-154.70535,56.14337],[-152.07413,57.37035],[-151.62918,58.22653],[-152.00821,58.98056],[-145.9877,60.24741],[-140.38467,59.48634],[-136.53946,57.8061],[-133.79288,54.83483],[-133.33145,53.14277],[-131.46378,51.69838],[-128.52493,51.74602],[-129.79385,50.90159],[-124.56436,47.49786],[-124.03702,45.48627],[-124.6962,42.90428],[-124.49844,40.34146],[-122.80655,37.53929],[-119.99405,33.37085],[-117.24747,32.5412],[-111.13907,31.1977],[-106.70059,31.23529],[-103.20694,28.64618],[-101.84463,29.8158],[-99.20792,26.28744],[-96.79092,25.75432],[-96.92276,27.96911],[-93.47305,29.68226],[-88.94669,28.87732],[-88.6171,30.17736],[-86.2001,30.36713],[-84.96963,29.43379],[-84.09073,30.06333],[-82.97012,28.95426],[-82.97012,27.26824],[-81.25626,25.07956],[-82.09122,24.56105],[-80.06973,24.76073],[-79.85001,27.11188],[-81.27823,30.70777],[-78.99307,33.20554],[-75.03799,35.5983],[-75.85098,37.24252],[-73.74161,40.4586],[-69.89639,41.60224],[-70.68741,43.17629],[-66.93008,44.69516],[-66.53458,43.08007],[-64.20547,43.35229],[-59.50333,45.73221],[-59.51431,46.24762],[-60.0032,46.25901],[-59.99222,47.24506],[-59.00894,47.2376],[-58.99796,47.50267],[-56.51504,47.50267],[-56.52603,46.7477],[-53.99918,46.7477],[-53.9772,46.48358],[-52.49405,46.46354],[-52.50504,48.75361],[-52.99667,48.75451],[-53.01315,49.99551],[-55.00168,50.0061],[-55.03738,53.74721],[-56.00418,53.73421],[-55.99594,52.00107]],[[-59.50127,43.74954],[-60.5024,43.74954],[-60.5024,44],[-59.9984,44],[-59.9984,44.2494],[-59.50127,44.2494],[-59.50127,43.74954]],[[-155.95024,20.49523],[-157.32675,20.49153],[-157.32903,21.23181],[-155.95251,21.23549],[-155.95024,20.49523]],[[-157.64488,21.24845],[-158.28534,21.24674],[-158.2869,21.74996],[-157.64643,21.75167],[-157.64488,21.24845]],[[-156.12602,20.3247],[-154.74617,20.32841],[-154.74174,18.87578],[-156.1216,18.87203],[-156.12602,20.3247]],[[-159.29077,22.24504],[-159.2893,21.76857],[-160.28917,21.76591],[-160.29064,22.24239],[-159.29077,22.24504]]],terms_url:"https://caltopo.com",terms_text:"© Caltopo",icon:"https://osmlab.github.io/editor-layer-index/sources/north-america/us/USGSTopographicMaps.png"},{id:"USSR-Latvia",name:"USSR - Latvia",type:"wms",template:"http://www.gisnet.lv/cgi-bin/topo?FORMAT=image/jpeg&VERSION=1.1.1&service=WMS&REQUEST=GetMap&LAYERS=DTO,DTC,DIVDPTC,PD,VS,DS,PS,M&SRS={proj}&WIDTH={width}&height={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[26.63086,57.56889],[25.16968,58.04882],[22.54395,57.76866],[21.54419,57.53352],[21.01685,56.81892],[21.01685,56.03523],[22.03857,56.38958],[24.71924,56.33481],[26.75171,55.66519],[28.19092,56.13943],[27.78442,57.40946],[26.63086,57.56889]]]},{id:"sjcgis.org-General_Basemap_WM",name:"Vector Streetmap for San Juan County WA",type:"tms",template:"https://sjcgis.org/arcgis/rest/services/Basemaps/General_Basemap_WM/MapServer/tile/{zoom}/{y}/{x}",zoomExtent:[0,19],polygon:[[[-123.27402,48.69297],[-123.00773,48.76726],[-123.00762,48.83158],[-122.7835,48.75842],[-122.6934,48.65852],[-122.76745,48.60361],[-122.74484,48.38708],[-123.24822,48.28353],[-123.11452,48.42261],[-123.21904,48.54857],[-123.27402,48.69297]]],best:true,description:"Public domain street and address data from the San Juan County, WA. Updated at least quarterly."},{id:"vicosa_al",name:"Viçosa AL",type:"wms",template:"http://geoserver.dados.al.gov.br:8080/geoserver/Alagoas/ows?LAYERS=Vicosa&SERVICE=WMS&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.0&SERVICE=WMS&REQUEST=GetMap&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[-36.198,-9.42067],[-36.19777,-9.41789],[-36.1978,-9.41528],[-36.19801,-9.41074],[-36.19789,-9.40857],[-36.19793,-9.40637],[-36.19797,-9.40561],[-36.19793,-9.40405],[-36.19799,-9.40312],[-36.19827,-9.40028],[-36.19829,-9.39496],[-36.19789,-9.39169],[-36.19844,-9.38932],[-36.19837,-9.3862],[-36.19794,-9.38167],[-36.19801,-9.37972],[-36.19834,-9.37867],[-36.19832,-9.37698],[-36.19817,-9.37586],[-36.19852,-9.37139],[-36.19822,-9.36239],[-36.19862,-9.35319],[-36.19849,-9.35097],[-36.19857,-9.34852],[-36.1988,-9.34668],[-36.1986,-9.34349],[-36.19877,-9.34084],[-36.19895,-9.33301],[-36.19877,-9.33039],[-36.28958,-9.33114],[-36.28938,-9.33319],[-36.2895,-9.33538],[-36.28925,-9.34124],[-36.28945,-9.34291],[-36.28928,-9.34521],[-36.28897,-9.37311],[-36.28915,-9.37481],[-36.28892,-9.37708],[-36.2889,-9.38541],[-36.28872,-9.38633],[-36.28872,-9.39343],[-36.28887,-9.39558],[-36.28877,-9.40129],[-36.28862,-9.40652],[-36.28872,-9.40715],[-36.28877,-9.42133],[-36.198,-9.42067]]],terms_url:"http://www.seplag.al.gov.br",terms_text:"Secretaria de Estado do Planejamento, Gestão e Patrimônio"},{id:"wien.gv.at-labels",name:"Vienna: Beschriftungen (annotations)",type:"tms",template:"https://maps.wien.gv.at/wmts/beschriftung/normal/google3857/{zoom}/{y}/{x}.png",zoomExtent:[12,19],polygon:[[[16.54475,48.17286],[16.54103,48.17657],[16.54978,48.17675],[16.54665,48.17162],[16.55629,48.16171],[16.55567,48.16446],[16.56161,48.16037],[16.57306,48.16319],[16.57603,48.13522],[16.54301,48.14333],[16.51377,48.15893],[16.4777,48.15744],[16.45536,48.13951],[16.43313,48.13788],[16.43701,48.11994],[16.42291,48.12306],[16.4083,48.11791],[16.40511,48.12198],[16.3246,48.13779],[16.31181,48.11945],[16.29806,48.12896],[16.2711,48.13385],[16.23607,48.13001],[16.2189,48.12377],[16.2181,48.12807],[16.23861,48.13205],[16.23843,48.13716],[16.22081,48.13555],[16.20986,48.14762],[16.22321,48.15318],[16.19798,48.15454],[16.19619,48.16396],[16.18183,48.17112],[16.19981,48.18616],[16.20739,48.20235],[16.20194,48.20479],[16.20962,48.20963],[16.1976,48.21479],[16.19778,48.22288],[16.18517,48.2232],[16.19911,48.22858],[16.19251,48.23671],[16.20677,48.26483],[16.24105,48.24837],[16.24154,48.23832],[16.25662,48.23988],[16.27043,48.25193],[16.26406,48.25492],[16.28556,48.25832],[16.29412,48.26395],[16.28617,48.2667],[16.28901,48.27051],[16.32741,48.27721],[16.34813,48.29048],[16.35351,48.28369],[16.3706,48.2817],[16.36714,48.28685],[16.37787,48.28832],[16.37557,48.29592],[16.37982,48.30201],[16.38536,48.30146],[16.38043,48.31507],[16.39518,48.32257],[16.39412,48.31926],[16.40287,48.31676],[16.41682,48.32253],[16.43803,48.31628],[16.44041,48.29192],[16.47547,48.27501],[16.48123,48.27343],[16.4835,48.27971],[16.48132,48.29351],[16.49645,48.29249],[16.51491,48.28554],[16.5067,48.2736],[16.51285,48.26784],[16.53263,48.2621],[16.54697,48.263],[16.53941,48.24284],[16.55274,48.239],[16.53627,48.20044],[16.54184,48.18206],[16.53631,48.17755],[16.54475,48.17286]]],terms_url:"https://data.wien.gv.at",terms_text:"Stadt Wien",icon:"https://www.wien.gv.at/layout-a/logo/wappen-klein.gif",overlay:true},{id:"wien.gv.at-gp",name:"Vienna: Mehrzweckkarte (general purpose)",type:"tms",template:"https://maps.wien.gv.at/wmts/fmzk/pastell/google3857/{zoom}/{y}/{x}.jpeg",zoomExtent:[10,19],polygon:[[[16.54475,48.17286],[16.54103,48.17657],[16.54978,48.17675],[16.54665,48.17162],[16.55629,48.16171],[16.55567,48.16446],[16.56161,48.16037],[16.57306,48.16319],[16.57603,48.13522],[16.54301,48.14333],[16.51377,48.15893],[16.4777,48.15744],[16.45536,48.13951],[16.43313,48.13788],[16.43701,48.11994],[16.42291,48.12306],[16.4083,48.11791],[16.40511,48.12198],[16.3246,48.13779],[16.31181,48.11945],[16.29806,48.12896],[16.2711,48.13385],[16.23607,48.13001],[16.2189,48.12377],[16.2181,48.12807],[16.23861,48.13205],[16.23843,48.13716],[16.22081,48.13555],[16.20986,48.14762],[16.22321,48.15318],[16.19798,48.15454],[16.19619,48.16396],[16.18183,48.17112],[16.19981,48.18616],[16.20739,48.20235],[16.20194,48.20479],[16.20962,48.20963],[16.1976,48.21479],[16.19778,48.22288],[16.18517,48.2232],[16.19911,48.22858],[16.19251,48.23671],[16.20677,48.26483],[16.24105,48.24837],[16.24154,48.23832],[16.25662,48.23988],[16.27043,48.25193],[16.26406,48.25492],[16.28556,48.25832],[16.29412,48.26395],[16.28617,48.2667],[16.28901,48.27051],[16.32741,48.27721],[16.34813,48.29048],[16.35351,48.28369],[16.3706,48.2817],[16.36714,48.28685],[16.37787,48.28832],[16.37557,48.29592],[16.37982,48.30201],[16.38536,48.30146],[16.38043,48.31507],[16.39518,48.32257],[16.39412,48.31926],[16.40287,48.31676],[16.41682,48.32253],[16.43803,48.31628],[16.44041,48.29192],[16.47547,48.27501],[16.48123,48.27343],[16.4835,48.27971],[16.48132,48.29351],[16.49645,48.29249],[16.51491,48.28554],[16.5067,48.2736],[16.51285,48.26784],[16.53263,48.2621],[16.54697,48.263],[16.53941,48.24284],[16.55274,48.239],[16.53627,48.20044],[16.54184,48.18206],[16.53631,48.17755],[16.54475,48.17286]]],terms_url:"https://data.wien.gv.at",terms_text:"Stadt Wien",icon:"https://www.wien.gv.at/layout-a/logo/wappen-klein.gif"},{id:"wien.gv.at-aerial_image",name:"Vienna: Orthofoto (aerial image)",type:"tms",template:"https://maps.wien.gv.at/wmts/lb/farbe/google3857/{zoom}/{y}/{x}.jpeg",zoomExtent:[10,19],polygon:[[[16.14995,48.10832],[16.14989,48.33315],[16.61873,48.33296],[16.61749,48.10813],[16.46644,48.10819],[16.46644,48.10744],[16.18104,48.10756],[16.18104,48.10831],[16.14995,48.10832]]],terms_url:"https://data.wien.gv.at",terms_text:"Stadt Wien",icon:"https://www.wien.gv.at/layout-a/logo/wappen-klein.gif"},{id:"Ville_de_Nyon-HD-2010",name:"Ville de Nyon - Orthophoto 2010 HD 5cm/pi",type:"tms",template:"http://osmdata.asitvd.ch/tiles/nyon2010/{zoom}/{x}/{y}.png",endDate:"2010-01-01T00:00:00.000Z",startDate:"2010-01-01T00:00:00.000Z",zoomExtent:[14,20],polygon:[[[6.24859,46.38252],[6.24848,46.38715],[6.24378,46.38944],[6.24182,46.39109],[6.2414,46.39159],[6.23919,46.39222],[6.23973,46.39373],[6.2379,46.3946],[6.23713,46.39698],[6.23071,46.40107],[6.22789,46.39903],[6.22326,46.40219],[6.22066,46.40189],[6.21582,46.40462],[6.21393,46.40698],[6.20989,46.40563],[6.20928,46.40528],[6.20985,46.40434],[6.20501,46.40332],[6.20527,46.40104],[6.20906,46.40131],[6.20951,46.4013],[6.2149,46.4008],[6.21154,46.39808],[6.21057,46.3968],[6.20954,46.39449],[6.21229,46.39243],[6.21374,46.39168],[6.21639,46.39079],[6.21296,46.38736],[6.21532,46.38514],[6.21403,46.38424],[6.2126,46.38232],[6.21211,46.38102],[6.21212,46.37992],[6.21231,46.37901],[6.21318,46.37697],[6.21454,46.37494],[6.21359,46.37463],[6.21365,46.37276],[6.22133,46.3699],[6.22752,46.36555],[6.22752,46.36541],[6.23738,46.37356],[6.24404,46.37842],[6.24859,46.38252]]],terms_url:"http://www.nyon.ch/fr/officiel/services-offices/informatique-et-population-776-3911",terms_text:"Ville de Nyon"},{id:"VGIN-BuildingFootprints_WM",name:"Virginia Building Footprints",type:"tms",template:"http://tileify-ags.herokuapp.com/tiles/{zoom}/{x}/{y}?url=https%3A%2F%2Fgismaps.vita.virginia.gov%2Farcgis%2Frest%2Fservices%2FVA_Base_layers%2FVA_Building_Footprints%2FMapServer&transparent=true&layers=show%3A20",endDate:"2018-06-01T00:00:00.000Z",startDate:"2015-05-01T00:00:00.000Z",zoomExtent:[0,20],polygon:[[[-83.64853,36.6023],[-79.9118,36.55819],[-75.90179,36.56701],[-75.8606,36.985],[-75.19867,38.0178],[-76.15448,37.99183],[-76.25336,37.92253],[-76.62689,38.1648],[-76.90704,38.22524],[-77.05536,38.42132],[-77.19818,38.37396],[-77.28333,38.3675],[-77.31628,38.45789],[-77.25586,38.58253],[-77.15698,38.61043],[-77.11853,38.68337],[-77.0636,38.69409],[-77.05811,38.82259],[-77.07458,38.88462],[-77.20367,38.99357],[-77.3822,39.07038],[-77.47833,39.09809],[-77.53876,39.16627],[-77.4646,39.23651],[-77.59918,39.30455],[-77.74475,39.33005],[-77.84637,39.14284],[-78.36273,39.45528],[-78.3847,39.36616],[-78.36548,39.32792],[-78.4671,39.19182],[-78.60168,39.03199],[-78.69232,38.94659],[-78.89282,38.76479],[-78.99719,38.8504],[-79.13727,38.68551],[-79.31854,38.42993],[-79.5108,38.46004],[-79.56299,38.54817],[-79.65637,38.58253],[-79.71954,38.50519],[-79.70856,38.44068],[-79.94476,38.16911],[-80.00519,38.0243],[-80.21942,37.83148],[-80.32379,37.67513],[-80.22766,37.62511],[-80.36224,37.56417],[-80.32928,37.52498],[-80.49408,37.42907],[-80.53253,37.48794],[-80.78522,37.37889],[-80.86487,37.43561],[-80.9198,37.39635],[-80.88135,37.36143],[-81.02692,37.28935],[-81.26038,37.25219],[-81.37024,37.34396],[-81.47736,37.26312],[-81.55426,37.22595],[-81.71906,37.20189],[-81.98273,37.42689],[-81.96899,37.55329],[-82.40845,37.26531],[-82.74078,37.13186],[-82.73529,37.05299],[-82.90283,36.985],[-82.87811,36.90818],[-83.02643,36.85765],[-83.07587,36.85765],[-83.16101,36.74989],[-83.44666,36.69265],[-83.61145,36.64418],[-83.63892,36.63592],[-83.69385,36.61222],[-83.70003,36.6023],[-83.64853,36.6023]]],terms_url:"https://vgin.maps.arcgis.com/home/item.html?id=bcd049dfcdc342a7a08ec81644eeb339",terms_text:"Virginia Geographic Information Network (VGIN)",description:"Virginia Building Footprint Map Service",overlay:true},{id:"VGIN-Imagery_WM",name:"Virginia Imagery Service - Most Recent",type:"tms",template:"http://tileify-ags.herokuapp.com/tiles/{zoom}/{x}/{y}?url=https%3A%2F%2Fgismaps.vita.virginia.gov%2Farcgis%2Frest%2Fservices%2FMostRecentImagery%2FMostRecentImagery_WGS%2FMapServer&transparent=true&layers=show%3A0",endDate:"2018-08-01T00:00:00.000Z",startDate:"2013-04-01T00:00:00.000Z",zoomExtent:[0,20],polygon:[[[-83.64853,36.6023],[-79.9118,36.55819],[-75.90179,36.56701],[-75.8606,36.985],[-75.19867,38.0178],[-76.15448,37.99183],[-76.25336,37.92253],[-76.62689,38.1648],[-76.90704,38.22524],[-77.05536,38.42132],[-77.19818,38.37396],[-77.28333,38.3675],[-77.31628,38.45789],[-77.25586,38.58253],[-77.15698,38.61043],[-77.11853,38.68337],[-77.0636,38.69409],[-77.05811,38.82259],[-77.07458,38.88462],[-77.20367,38.99357],[-77.3822,39.07038],[-77.47833,39.09809],[-77.53876,39.16627],[-77.4646,39.23651],[-77.59918,39.30455],[-77.74475,39.33005],[-77.84637,39.14284],[-78.36273,39.45528],[-78.3847,39.36616],[-78.36548,39.32792],[-78.4671,39.19182],[-78.60168,39.03199],[-78.69232,38.94659],[-78.89282,38.76479],[-78.99719,38.8504],[-79.13727,38.68551],[-79.31854,38.42993],[-79.5108,38.46004],[-79.56299,38.54817],[-79.65637,38.58253],[-79.71954,38.50519],[-79.70856,38.44068],[-79.94476,38.16911],[-80.00519,38.0243],[-80.21942,37.83148],[-80.32379,37.67513],[-80.22766,37.62511],[-80.36224,37.56417],[-80.32928,37.52498],[-80.49408,37.42907],[-80.53253,37.48794],[-80.78522,37.37889],[-80.86487,37.43561],[-80.9198,37.39635],[-80.88135,37.36143],[-81.02692,37.28935],[-81.26038,37.25219],[-81.37024,37.34396],[-81.47736,37.26312],[-81.55426,37.22595],[-81.71906,37.20189],[-81.98273,37.42689],[-81.96899,37.55329],[-82.40845,37.26531],[-82.74078,37.13186],[-82.73529,37.05299],[-82.90283,36.985],[-82.87811,36.90818],[-83.02643,36.85765],[-83.07587,36.85765],[-83.16101,36.74989],[-83.44666,36.69265],[-83.61145,36.64418],[-83.63892,36.63592],[-83.69385,36.61222],[-83.70003,36.6023],[-83.64853,36.6023]]],terms_url:"https://vgin.maps.arcgis.com/home/item.html?id=36386a7e7dae4032a33cb0b83a1711f1",terms_text:"Virginia Geographic Information Network (VGIN)",description:"The most recently available VBMP orthoimagery for all of Virginia."},{id:"VGIN-PropertyLines_WM",name:"Virginia Property Lines",type:"tms",template:"http://tileify-ags.herokuapp.com/tiles/{zoom}/{x}/{y}?url=http%3A%2F%2Fgismaps.vita.virginia.gov%2Farcgis%2Frest%2Fservices%2FVA_Base_layers%2FVA_Parcels%2FMapServer&transparent=true",endDate:"2018-06-01T00:00:00.000Z",startDate:"2015-05-01T00:00:00.000Z",zoomExtent:[0,20],polygon:[[[-83.64853,36.6023],[-79.9118,36.55819],[-75.90179,36.56701],[-75.8606,36.985],[-75.19867,38.0178],[-76.15448,37.99183],[-76.25336,37.92253],[-76.62689,38.1648],[-76.90704,38.22524],[-77.05536,38.42132],[-77.19818,38.37396],[-77.28333,38.3675],[-77.31628,38.45789],[-77.25586,38.58253],[-77.15698,38.61043],[-77.11853,38.68337],[-77.0636,38.69409],[-77.05811,38.82259],[-77.07458,38.88462],[-77.20367,38.99357],[-77.3822,39.07038],[-77.47833,39.09809],[-77.53876,39.16627],[-77.4646,39.23651],[-77.59918,39.30455],[-77.74475,39.33005],[-77.84637,39.14284],[-78.36273,39.45528],[-78.3847,39.36616],[-78.36548,39.32792],[-78.4671,39.19182],[-78.60168,39.03199],[-78.69232,38.94659],[-78.89282,38.76479],[-78.99719,38.8504],[-79.13727,38.68551],[-79.31854,38.42993],[-79.5108,38.46004],[-79.56299,38.54817],[-79.65637,38.58253],[-79.71954,38.50519],[-79.70856,38.44068],[-79.94476,38.16911],[-80.00519,38.0243],[-80.21942,37.83148],[-80.32379,37.67513],[-80.22766,37.62511],[-80.36224,37.56417],[-80.32928,37.52498],[-80.49408,37.42907],[-80.53253,37.48794],[-80.78522,37.37889],[-80.86487,37.43561],[-80.9198,37.39635],[-80.88135,37.36143],[-81.02692,37.28935],[-81.26038,37.25219],[-81.37024,37.34396],[-81.47736,37.26312],[-81.55426,37.22595],[-81.71906,37.20189],[-81.98273,37.42689],[-81.96899,37.55329],[-82.40845,37.26531],[-82.74078,37.13186],[-82.73529,37.05299],[-82.90283,36.985],[-82.87811,36.90818],[-83.02643,36.85765],[-83.07587,36.85765],[-83.16101,36.74989],[-83.44666,36.69265],[-83.61145,36.64418],[-83.63892,36.63592],[-83.69385,36.61222],[-83.70003,36.6023],[-83.64853,36.6023]]],terms_url:"https://vgin.maps.arcgis.com/home/item.html?id=f1dccaf1f42e40cbba791feae2e23690",terms_text:"Virginia Geographic Information Network (VGIN)",description:"A statewide Parcel service showing property ownership outlines where available",overlay:true},{id:"vogis.cnv.at-DGM",name:"VoGIS: DGM (Terrain model)",type:"wms",template:"http://vogis.cnv.at/mapserver/mapserv?map=i_hoehen_und_gelaende_r_wms.map&FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=schummerung_50cm_terrain&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[9.96805,47.54631],[9.96809,47.54627],[9.97125,47.54425],[9.96484,47.53803],[9.9684,47.52802],[9.96526,47.52089],[9.99569,47.50278],[9.98736,47.49847],[10.00076,47.48211],[10.02301,47.48411],[10.03743,47.48918],[10.04477,47.48762],[10.05413,47.47589],[10.05347,47.46686],[10.06468,47.46364],[10.06999,47.45595],[10.08057,47.45536],[10.08857,47.46029],[10.09164,47.45893],[10.09385,47.44046],[10.10559,47.42872],[10.09374,47.41688],[10.07418,47.41472],[10.06914,47.41018],[10.08624,47.39952],[10.08284,47.39381],[10.09984,47.35476],[10.11934,47.37561],[10.14169,47.36718],[10.16587,47.36887],[10.16958,47.3713],[10.1694,47.38583],[10.1813,47.38725],[10.18185,47.39243],[10.19508,47.38935],[10.19988,47.38334],[10.21259,47.38039],[10.22705,47.38889],[10.23619,47.38192],[10.23168,47.37897],[10.23716,47.37357],[10.21699,47.35436],[10.2171,47.34988],[10.20424,47.33675],[10.20742,47.33232],[10.19951,47.32646],[10.21113,47.31898],[10.21597,47.31106],[10.21236,47.31122],[10.19913,47.29754],[10.18964,47.29394],[10.17961,47.29603],[10.17208,47.27908],[10.17404,47.27025],[10.17834,47.27011],[10.17449,47.2637],[10.21884,47.25533],[10.22343,47.24983],[10.21087,47.2478],[10.19776,47.23666],[10.20791,47.2328],[10.21428,47.21684],[10.21269,47.20432],[10.19963,47.19539],[10.19951,47.18525],[10.21151,47.17124],[10.2092,47.16537],[10.20851,47.15948],[10.21321,47.1577],[10.2222,47.15323],[10.22166,47.14925],[10.21481,47.14352],[10.20333,47.14215],[10.20887,47.13164],[10.18629,47.12886],[10.18652,47.11946],[10.17288,47.12033],[10.16299,47.11361],[10.15766,47.11426],[10.15442,47.10578],[10.13243,47.08122],[10.13459,47.06392],[10.15085,47.06184],[10.15693,47.04883],[10.14418,47.03355],[10.12326,47.02209],[10.13284,47.01204],[10.15447,47.00545],[10.15961,46.99882],[10.15442,46.99299],[10.16001,46.984],[10.14463,46.98301],[10.13492,46.96584],[10.13501,46.95483],[10.12684,46.9435],[10.09772,46.92676],[10.09954,46.91712],[10.10921,46.90834],[10.10908,46.89431],[10.12497,46.88014],[10.14147,46.87468],[10.13967,46.86217],[10.14506,46.8511],[10.13941,46.84738],[10.12309,46.84848],[10.11912,46.84417],[10.10518,46.8409],[10.09195,46.85143],[10.09265,46.85818],[10.08712,46.86128],[10.05488,46.8617],[10.0509,46.86442],[10.05192,46.87405],[10.03891,46.88611],[10.03221,46.88802],[10.01782,46.90161],[10.00494,46.89889],[9.98243,46.9062],[9.97793,46.91603],[9.96657,46.91222],[9.95907,46.91602],[9.94612,46.91235],[9.93758,46.91324],[9.92153,46.91882],[9.91231,46.92606],[9.90632,46.9253],[9.89449,46.93164],[9.87613,46.93463],[9.88071,46.94011],[9.87657,46.94071],[9.87488,46.95039],[9.87872,46.95707],[9.87073,46.96321],[9.88482,46.98546],[9.8923,46.99036],[9.88878,47.00072],[9.8707,47.00965],[9.87115,47.01306],[9.88035,47.01722],[9.87779,47.02055],[9.85974,47.02321],[9.85273,47.01641],[9.83612,47.01253],[9.82353,47.01986],[9.80756,47.02356],[9.78491,47.03849],[9.74808,47.03692],[9.74185,47.04268],[9.71821,47.04337],[9.70701,47.04805],[9.7076,47.05381],[9.69756,47.05239],[9.68392,47.05765],[9.68184,47.0621],[9.67743,47.06141],[9.65821,47.05818],[9.64506,47.05978],[9.64158,47.05598],[9.63654,47.0517],[9.62633,47.05133],[9.60705,47.06077],[9.6134,47.0695],[9.61153,47.0794],[9.61869,47.07817],[9.62339,47.08258],[9.63346,47.08344],[9.63564,47.09553],[9.62858,47.10756],[9.62083,47.11032],[9.63503,47.12813],[9.62467,47.13265],[9.62258,47.14135],[9.62587,47.1459],[9.62059,47.15164],[9.6089,47.14775],[9.59679,47.16294],[9.57946,47.17116],[9.56456,47.17029],[9.57302,47.1756],[9.57259,47.19079],[9.58032,47.19578],[9.58477,47.20532],[9.5687,47.21968],[9.55851,47.22416],[9.55176,47.22377],[9.56679,47.24288],[9.53073,47.27058],[9.54619,47.28005],[9.55634,47.29829],[9.58805,47.3173],[9.59966,47.3455],[9.61073,47.35571],[9.62446,47.36615],[9.65876,47.36946],[9.67255,47.38021],[9.67311,47.39194],[9.65162,47.40463],[9.64551,47.4312],[9.64512,47.4378],[9.65799,47.44779],[9.65898,47.4522],[9.62234,47.45747],[9.60904,47.47054],[9.60292,47.46198],[9.59514,47.46331],[9.58217,47.48276],[9.5622,47.49592],[9.55057,47.53718],[9.5827,47.53592],[9.60465,47.52952],[9.73478,47.53396],[9.73517,47.54661],[9.74164,47.55499],[9.7471,47.55569],[9.74337,47.55867],[9.75207,47.56747],[9.74806,47.57052],[9.75632,47.57262],[9.75633,47.57963],[9.76197,47.58096],[9.76553,47.58912],[9.76933,47.58739],[9.77697,47.59544],[9.79151,47.59352],[9.79999,47.59611],[9.81414,47.58807],[9.82381,47.5871],[9.82728,47.57997],[9.82079,47.57076],[9.82562,47.55922],[9.8171,47.55333],[9.81579,47.54767],[9.85023,47.54164],[9.85839,47.53388],[9.87451,47.52854],[9.87804,47.53876],[9.87515,47.54343],[9.88125,47.54814],[9.8891,47.54399],[9.89935,47.54475],[9.90666,47.54217],[9.91358,47.53255],[9.92189,47.52964],[9.93352,47.53265],[9.94108,47.53822],[9.9637,47.53472],[9.95883,47.54313],[9.96318,47.54229],[9.96805,47.54631]]],terms_url:"https://www.vorarlberg.at/vorarlberg/bauen_wohnen/bauen/vermessung_geoinformation/weitereinformationen/services/wmsdienste.htm",terms_text:"Datenquelle: Land Vorarlberg – data.vorarlberg.gv.at",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/at/VoGISFlchenwidmungsplan.png"},{id:"vogis.cnv.at-DOM",name:"VoGIS: DOM (Surface model)",type:"wms",template:"http://vogis.cnv.at/mapserver/mapserv?map=i_hoehen_und_gelaende_r_wms.map&FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=schummerung_50cm_surface&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[9.96805,47.54631],[9.96809,47.54627],[9.97125,47.54425],[9.96484,47.53803],[9.9684,47.52802],[9.96526,47.52089],[9.99569,47.50278],[9.98736,47.49847],[10.00076,47.48211],[10.02301,47.48411],[10.03743,47.48918],[10.04477,47.48762],[10.05413,47.47589],[10.05347,47.46686],[10.06468,47.46364],[10.06999,47.45595],[10.08057,47.45536],[10.08857,47.46029],[10.09164,47.45893],[10.09385,47.44046],[10.10559,47.42872],[10.09374,47.41688],[10.07418,47.41472],[10.06914,47.41018],[10.08624,47.39952],[10.08284,47.39381],[10.09984,47.35476],[10.11934,47.37561],[10.14169,47.36718],[10.16587,47.36887],[10.16958,47.3713],[10.1694,47.38583],[10.1813,47.38725],[10.18185,47.39243],[10.19508,47.38935],[10.19988,47.38334],[10.21259,47.38039],[10.22705,47.38889],[10.23619,47.38192],[10.23168,47.37897],[10.23716,47.37357],[10.21699,47.35436],[10.2171,47.34988],[10.20424,47.33675],[10.20742,47.33232],[10.19951,47.32646],[10.21113,47.31898],[10.21597,47.31106],[10.21236,47.31122],[10.19913,47.29754],[10.18964,47.29394],[10.17961,47.29603],[10.17208,47.27908],[10.17404,47.27025],[10.17834,47.27011],[10.17449,47.2637],[10.21884,47.25533],[10.22343,47.24983],[10.21087,47.2478],[10.19776,47.23666],[10.20791,47.2328],[10.21428,47.21684],[10.21269,47.20432],[10.19963,47.19539],[10.19951,47.18525],[10.21151,47.17124],[10.2092,47.16537],[10.20851,47.15948],[10.21321,47.1577],[10.2222,47.15323],[10.22166,47.14925],[10.21481,47.14352],[10.20333,47.14215],[10.20887,47.13164],[10.18629,47.12886],[10.18652,47.11946],[10.17288,47.12033],[10.16299,47.11361],[10.15766,47.11426],[10.15442,47.10578],[10.13243,47.08122],[10.13459,47.06392],[10.15085,47.06184],[10.15693,47.04883],[10.14418,47.03355],[10.12326,47.02209],[10.13284,47.01204],[10.15447,47.00545],[10.15961,46.99882],[10.15442,46.99299],[10.16001,46.984],[10.14463,46.98301],[10.13492,46.96584],[10.13501,46.95483],[10.12684,46.9435],[10.09772,46.92676],[10.09954,46.91712],[10.10921,46.90834],[10.10908,46.89431],[10.12497,46.88014],[10.14147,46.87468],[10.13967,46.86217],[10.14506,46.8511],[10.13941,46.84738],[10.12309,46.84848],[10.11912,46.84417],[10.10518,46.8409],[10.09195,46.85143],[10.09265,46.85818],[10.08712,46.86128],[10.05488,46.8617],[10.0509,46.86442],[10.05192,46.87405],[10.03891,46.88611],[10.03221,46.88802],[10.01782,46.90161],[10.00494,46.89889],[9.98243,46.9062],[9.97793,46.91603],[9.96657,46.91222],[9.95907,46.91602],[9.94612,46.91235],[9.93758,46.91324],[9.92153,46.91882],[9.91231,46.92606],[9.90632,46.9253],[9.89449,46.93164],[9.87613,46.93463],[9.88071,46.94011],[9.87657,46.94071],[9.87488,46.95039],[9.87872,46.95707],[9.87073,46.96321],[9.88482,46.98546],[9.8923,46.99036],[9.88878,47.00072],[9.8707,47.00965],[9.87115,47.01306],[9.88035,47.01722],[9.87779,47.02055],[9.85974,47.02321],[9.85273,47.01641],[9.83612,47.01253],[9.82353,47.01986],[9.80756,47.02356],[9.78491,47.03849],[9.74808,47.03692],[9.74185,47.04268],[9.71821,47.04337],[9.70701,47.04805],[9.7076,47.05381],[9.69756,47.05239],[9.68392,47.05765],[9.68184,47.0621],[9.67743,47.06141],[9.65821,47.05818],[9.64506,47.05978],[9.64158,47.05598],[9.63654,47.0517],[9.62633,47.05133],[9.60705,47.06077],[9.6134,47.0695],[9.61153,47.0794],[9.61869,47.07817],[9.62339,47.08258],[9.63346,47.08344],[9.63564,47.09553],[9.62858,47.10756],[9.62083,47.11032],[9.63503,47.12813],[9.62467,47.13265],[9.62258,47.14135],[9.62587,47.1459],[9.62059,47.15164],[9.6089,47.14775],[9.59679,47.16294],[9.57946,47.17116],[9.56456,47.17029],[9.57302,47.1756],[9.57259,47.19079],[9.58032,47.19578],[9.58477,47.20532],[9.5687,47.21968],[9.55851,47.22416],[9.55176,47.22377],[9.56679,47.24288],[9.53073,47.27058],[9.54619,47.28005],[9.55634,47.29829],[9.58805,47.3173],[9.59966,47.3455],[9.61073,47.35571],[9.62446,47.36615],[9.65876,47.36946],[9.67255,47.38021],[9.67311,47.39194],[9.65162,47.40463],[9.64551,47.4312],[9.64512,47.4378],[9.65799,47.44779],[9.65898,47.4522],[9.62234,47.45747],[9.60904,47.47054],[9.60292,47.46198],[9.59514,47.46331],[9.58217,47.48276],[9.5622,47.49592],[9.55057,47.53718],[9.5827,47.53592],[9.60465,47.52952],[9.73478,47.53396],[9.73517,47.54661],[9.74164,47.55499],[9.7471,47.55569],[9.74337,47.55867],[9.75207,47.56747],[9.74806,47.57052],[9.75632,47.57262],[9.75633,47.57963],[9.76197,47.58096],[9.76553,47.58912],[9.76933,47.58739],[9.77697,47.59544],[9.79151,47.59352],[9.79999,47.59611],[9.81414,47.58807],[9.82381,47.5871],[9.82728,47.57997],[9.82079,47.57076],[9.82562,47.55922],[9.8171,47.55333],[9.81579,47.54767],[9.85023,47.54164],[9.85839,47.53388],[9.87451,47.52854],[9.87804,47.53876],[9.87515,47.54343],[9.88125,47.54814],[9.8891,47.54399],[9.89935,47.54475],[9.90666,47.54217],[9.91358,47.53255],[9.92189,47.52964],[9.93352,47.53265],[9.94108,47.53822],[9.9637,47.53472],[9.95883,47.54313],[9.96318,47.54229],[9.96805,47.54631]]],terms_url:"https://www.vorarlberg.at/vorarlberg/bauen_wohnen/bauen/vermessung_geoinformation/weitereinformationen/services/wmsdienste.htm",terms_text:"Datenquelle: Land Vorarlberg – data.vorarlberg.gv.at",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/at/VoGISFlchenwidmungsplan.png"},{id:"vogis.cnv.at-ef2012_12cm",name:"VoGIS: Echtfarbenbild 2012 (12cm)",type:"wms",template:"http://vogis.cnv.at/mapserver/mapserv?map=i_luftbilder_r_wms.map&FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=ef2012_12cm&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2012-01-01T00:00:00.000Z",startDate:"2012-01-01T00:00:00.000Z",polygon:[[[9.54367,47.48479],[9.61451,47.45058],[9.61359,47.38272],[9.44246,47.24798],[9.44614,47.096],[9.42866,47.08911],[9.42498,47.01513],[9.85281,47.00196],[9.85741,46.89896],[9.9669,46.88952],[10.04511,46.8499],[10.15828,46.83353],[10.1592,46.89204],[10.14718,46.89248],[10.15115,46.94331],[10.16317,46.94287],[10.1647,46.96238],[10.17852,46.96681],[10.17576,47.10351],[10.22912,47.10226],[10.22084,47.24361],[10.26133,47.41261],[10.12423,47.40576],[10.09387,47.47795],[10.00462,47.50717],[9.98622,47.56121],[9.84361,47.56245],[9.84085,47.60714],[9.53999,47.60652],[9.54367,47.48479]]],terms_url:"https://www.vorarlberg.at/vorarlberg/bauen_wohnen/bauen/vermessung_geoinformation/weitereinformationen/services/wmsdienste.htm",terms_text:"Datenquelle: Land Vorarlberg – data.vorarlberg.gv.at",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/at/VoGISFlchenwidmungsplan.png"},{id:"vogis.cnv.at-ef2015_10cm",name:"VoGIS: Echtfarbenbild 2015 (10cm)",type:"wms",template:"http://vogis.cnv.at/mapserver/mapserv?map=i_luftbilder_r_wms.map&FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=ef2015_10cm&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2015-01-01T00:00:00.000Z",startDate:"2015-01-01T00:00:00.000Z",polygon:[[[9.54367,47.48479],[9.61451,47.45058],[9.61359,47.38272],[9.44246,47.24798],[9.44614,47.096],[9.42866,47.08911],[9.42498,47.01513],[9.85281,47.00196],[9.85741,46.89896],[9.9669,46.88952],[10.04511,46.8499],[10.15828,46.83353],[10.1592,46.89204],[10.14718,46.89248],[10.15115,46.94331],[10.16317,46.94287],[10.1647,46.96238],[10.17852,46.96681],[10.17576,47.10351],[10.22912,47.10226],[10.22084,47.24361],[10.26133,47.41261],[10.12423,47.40576],[10.09387,47.47795],[10.00462,47.50717],[9.98622,47.56121],[9.84361,47.56245],[9.84085,47.60714],[9.53999,47.60652],[9.54367,47.48479]]],terms_url:"https://www.vorarlberg.at/vorarlberg/bauen_wohnen/bauen/vermessung_geoinformation/weitereinformationen/services/wmsdienste.htm",terms_text:"Datenquelle: Land Vorarlberg – data.vorarlberg.gv.at",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/at/VoGISFlchenwidmungsplan.png"},{id:"vogis.cnv.at-wi2015_20cm",name:"VoGIS: Echtfarbenbild Winter 2015 (20cm)",type:"wms",template:"http://vogis.cnv.at/mapserver/mapserv?map=i_luftbilder_r_wms.map&FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=wi2015_20cm&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2015-01-01T00:00:00.000Z",startDate:"2015-01-01T00:00:00.000Z",polygon:[[[10.17039,46.82979],[10.17108,46.93644],[10.18413,46.94113],[10.1855,47.10157],[10.23906,47.10437],[10.24283,47.15611],[10.25691,47.18704],[10.24558,47.27597],[10.25313,47.32347],[10.26893,47.32626],[10.26446,47.41102],[10.13194,47.4087],[10.13434,47.46107],[10.11752,47.46153],[10.11889,47.47337],[10.08731,47.47429],[10.08491,47.50724],[10.06843,47.507],[10.0674,47.5215],[10.02345,47.52428],[10.00079,47.57943],[9.84904,47.57757],[9.85042,47.61462],[9.72751,47.61277],[9.7203,47.59089],[9.70347,47.58915],[9.70313,47.54491],[9.68219,47.54491],[9.68047,47.55348],[9.56391,47.54931],[9.56202,47.53958],[9.55172,47.53958],[9.55172,47.53402],[9.52168,47.53471],[9.52701,47.30497],[9.50503,47.30264],[9.50091,47.23368],[9.52357,47.23228],[9.52426,47.16557],[9.54486,47.16405],[9.54383,47.15448],[9.57232,47.15401],[9.57026,47.12809],[9.59018,47.12867],[9.59189,47.10029],[9.57232,47.10017],[9.57713,47.02861],[9.72407,47.03048],[9.72304,47.01749],[9.77454,47.01562],[9.77626,47.00555],[9.79274,47.00391],[9.7948,46.99127],[9.83874,46.99314],[9.84012,46.90349],[9.89024,46.90725],[9.88543,46.88707],[9.95925,46.89141],[9.962,46.87675],[10.0001,46.87862],[9.99667,46.85715],[10.01864,46.85656],[10.02345,46.83073],[10.17039,46.82979]]],terms_url:"https://www.vorarlberg.at/vorarlberg/bauen_wohnen/bauen/vermessung_geoinformation/weitereinformationen/services/wmsdienste.htm",terms_text:"Datenquelle: Land Vorarlberg – data.vorarlberg.gv.at",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/at/VoGISFlchenwidmungsplan.png"},{id:"wroclaw-orto2015",name:"Wrocław: Orthophotomap 2015 (aerial image)",type:"wms",template:"http://gis1.um.wroc.pl/arcgis/services/ogc/OGC_ortofoto_2015/MapServer/WmsServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2015-01-01T00:00:00.000Z",startDate:"2015-01-01T00:00:00.000Z",zoomExtent:[0,23],polygon:[[[17.14217,51.12846],[17.15659,51.1499],[17.15933,51.16056],[17.15899,51.17886],[17.14371,51.18155],[17.13024,51.18128],[17.12466,51.17396],[17.11436,51.17746],[17.0778,51.17746],[17.07642,51.1766],[17.07548,51.16825],[17.06698,51.16745],[17.04698,51.17493],[17.03376,51.17729],[17.02741,51.17729],[17.02733,51.18246],[17.02252,51.18816],[17.01299,51.18816],[17.0093,51.18499],[17.00312,51.18504],[17.00261,51.20016],[16.99162,51.20559],[16.97008,51.20763],[16.96424,51.20989],[16.95394,51.20968],[16.94656,51.20586],[16.9233,51.2001],[16.90811,51.21043],[16.89927,51.21027],[16.89292,51.2071],[16.88322,51.2071],[16.88073,51.20489],[16.88047,51.19666],[16.88322,51.19048],[16.87403,51.18719],[16.87026,51.18203],[16.85455,51.18031],[16.8421,51.18488],[16.82434,51.18467],[16.82056,51.17875],[16.82099,51.16373],[16.82502,51.15647],[16.80915,51.15194],[16.80657,51.14613],[16.80648,51.1366],[16.80769,51.13595],[16.81687,51.13601],[16.8161,51.13337],[16.81636,51.12459],[16.82932,51.12329],[16.83266,51.11834],[16.82923,51.11386],[16.82923,51.10993],[16.83215,51.10869],[16.84949,51.10826],[16.85661,51.09899],[16.87901,51.09252],[16.88862,51.09258],[16.89197,51.09667],[16.92107,51.09662],[16.9209,51.09263],[16.91661,51.0812],[16.91686,51.07942],[16.93514,51.07948],[16.93849,51.0736],[16.95248,51.06686],[16.95068,51.05806],[16.95454,51.05369],[16.96188,51.0473],[16.96879,51.04568],[16.98072,51.04584],[16.98424,51.05197],[16.99969,51.04668],[17.00776,51.04422],[17.01973,51.04169],[17.03286,51.0419],[17.03415,51.04673],[17.04509,51.04339],[17.06363,51.04339],[17.07037,51.05286],[17.08363,51.04428],[17.095,51.04368],[17.10633,51.04376],[17.10835,51.04684],[17.10822,51.05377],[17.10226,51.05868],[17.11136,51.0716],[17.12341,51.07179],[17.12299,51.07856],[17.15088,51.07861],[17.17277,51.09344],[17.17277,51.09956],[17.17697,51.10303],[17.17676,51.1092],[17.16363,51.1203],[17.14217,51.12846]]],terms_text:"Urząd Miasta Wrocław",icon:"https://i.imgur.com/PRqROXB.png"},{id:"Zabrze-2011",name:"Zabrze: Orthophotomap 2011 (aerial image)",type:"wms",template:"http://siot.um.zabrze.pl/arcgis/services/UMZ_Ortofoto_2011/MapServer/WMSServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",endDate:"2011-01-01T00:00:00.000Z",startDate:"2011-01-01T00:00:00.000Z",zoomExtent:[0,23],polygon:[[[18.74396,50.2753],[18.75586,50.27523],[18.75578,50.27633],[18.74516,50.28105],[18.74609,50.28886],[18.75084,50.28948],[18.74832,50.2957],[18.73379,50.29618],[18.73208,50.31571],[18.73613,50.31646],[18.73882,50.32763],[18.73725,50.33016],[18.73121,50.33169],[18.73054,50.3344],[18.73422,50.3371],[18.73428,50.34097],[18.73866,50.34308],[18.75419,50.34182],[18.75982,50.34624],[18.75438,50.34744],[18.75119,50.34979],[18.74603,50.36876],[18.75705,50.3692],[18.7639,50.36754],[18.77263,50.37628],[18.78436,50.37077],[18.78713,50.37295],[18.79821,50.37048],[18.80466,50.37561],[18.80165,50.37718],[18.80164,50.38222],[18.80509,50.38317],[18.81527,50.38167],[18.81446,50.37515],[18.82183,50.36883],[18.81737,50.36802],[18.82104,50.35843],[18.8159,50.35336],[18.81687,50.35076],[18.82294,50.35156],[18.83281,50.34962],[18.83474,50.3443],[18.84615,50.34448],[18.86293,50.32852],[18.8607,50.32776],[18.85088,50.33191],[18.84578,50.32923],[18.84891,50.32352],[18.83179,50.32028],[18.83192,50.30483],[18.84451,50.30286],[18.84429,50.29627],[18.82282,50.28615],[18.82845,50.28482],[18.82745,50.27972],[18.82322,50.27994],[18.8214,50.27414],[18.81392,50.27309],[18.79981,50.27351],[18.7987,50.2613],[18.7923,50.24641],[18.78261,50.24583],[18.76416,50.25145],[18.75396,50.25669],[18.75004,50.26402],[18.73991,50.26738],[18.73421,50.27084],[18.74396,50.2753]]],terms_text:"Urząd Miasta Zabrza"}];
24697
24698         var presets = {aerialway:{fields:["aerialway"],geometry:["point","vertex","line"],tags:{aerialway:"*"},searchable:false,name:"Aerialway"},aeroway:{icon:"maki-airport",fields:["aeroway"],geometry:["point","vertex","line","area"],tags:{aeroway:"*"},searchable:false,name:"Aeroway"},amenity:{fields:["amenity"],geometry:["point","vertex","line","area"],tags:{amenity:"*"},searchable:false,name:"Amenity"},attraction:{icon:"maki-star",fields:["name","attraction","operator","opening_hours"],moreFields:["opening_hours","fee","payment_multi","address","website","phone","email","fax"],geometry:["point","vertex","line","area"],tags:{attraction:"*"},searchable:false,name:"Attraction"},boundary:{fields:["boundary"],geometry:["line"],tags:{boundary:"*"},searchable:false,name:"Boundary"},building_point:{icon:"maki-home",fields:["{building}"],moreFields:["{building}"],geometry:["point"],tags:{building:"*"},matchScore:0.6,searchable:false,terms:[],name:"Building"},embankment:{geometry:["line"],tags:{embankment:"yes"},name:"Embankment",matchScore:0.2,searchable:false},emergency:{fields:["emergency_combo"],geometry:["point","vertex","area"],tags:{emergency:"*"},searchable:false,name:"Emergency Feature"},highway:{fields:["name","highway"],geometry:["point","vertex","line","area"],tags:{highway:"*"},searchable:false,name:"Highway"},indoor:{fields:["level","indoor_type"],geometry:["point","vertex","line","area"],tags:{indoor:"*"},matchScore:0.8,searchable:false,name:"Indoor Feature"},landuse:{fields:["name","landuse"],geometry:["area"],tags:{landuse:"*"},matchScore:0.9,searchable:false,name:"Land Use"},leisure:{icon:"maki-pitch",fields:["name","leisure"],geometry:["point","vertex","line","area"],tags:{leisure:"*"},searchable:false,name:"Leisure"},man_made:{icon:"temaki-storage_tank",fields:["name","man_made"],moreFields:["material"],geometry:["point","vertex","line","area"],tags:{man_made:"*"},matchScore:0.95,searchable:false,name:"Man Made"},natural:{icon:"maki-natural",fields:["name","natural"],geometry:["point","vertex","line","area"],tags:{natural:"*"},searchable:false,name:"Natural"},place:{fields:["name","place"],geometry:["point","vertex","area"],tags:{place:"*"},searchable:false,name:"Place"},playground:{icon:"maki-playground",fields:["playground"],geometry:["point","vertex","line","area"],tags:{playground:"*"},searchable:false,name:"Playground Equipment"},power:{geometry:["point","vertex","line","area"],tags:{power:"*"},fields:["power"],moreFields:["material"],searchable:false,name:"Power"},railway:{fields:["railway"],geometry:["point","vertex","line","area"],tags:{railway:"*"},searchable:false,name:"Railway"},seamark:{icon:"maki-harbor",fields:["seamark/type"],geometry:["point","vertex","line","area"],tags:{"seamark:type":"*"},searchable:false,name:"Seamark"},tourism:{icon:"maki-attraction",fields:["name","tourism"],geometry:["point","vertex","line","area"],tags:{tourism:"*"},searchable:false,name:"Tourism"},waterway:{fields:["name","waterway"],geometry:["point","vertex","line","area"],tags:{waterway:"*"},searchable:false,name:"Waterway"},address:{fields:["address"],geometry:["point","vertex","area"],tags:{"addr:*":"*"},addTags:{},removeTags:{},reference:{key:"addr"},name:"Address",matchScore:0.15},"advertising/billboard":{fields:["direction","lit"],geometry:["point","vertex","line"],tags:{advertising:"billboard"},name:"Billboard"},"advertising/column":{icon:"temaki-storage_tank",fields:["lit"],geometry:["point","area"],tags:{advertising:"column"},name:"Advertising Column"},"aerialway/station":{icon:"maki-aerialway",geometry:["point","vertex","area"],fields:["aerialway/access","aerialway/summer/access","elevation","building_area"],tags:{aerialway:"station"},matchScore:0.95,name:"Aerialway Station",searchable:false,replacement:"public_transport/station_aerialway"},"aerialway/cable_car":{icon:"fas-tram",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":{icon:"temaki-chairlift",geometry:["line"],fields:["name","oneway_yes","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":{icon:"maki-aerialway",geometry:["line"],fields:["name","oneway","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/j-bar":{geometry:["line"],fields:["name","aerialway/capacity","aerialway/duration"],terms:["jbar"],tags:{aerialway:"j-bar"},name:"J-bar Lift"},"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","oneway_yes","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","oneway_yes","aerialway/capacity","aerialway/duration"],tags:{aerialway:"rope_tow"},name:"Rope Tow Lift"},"aerialway/t-bar":{geometry:["line"],fields:["name","aerialway/capacity","aerialway/duration"],terms:["tbar"],tags:{aerialway:"t-bar"},name:"T-bar Lift"},"aerialway/zip_line":{geometry:["line"],fields:["name","oneway_yes","aerialway/duration","maxweight","access_simple"],terms:["aerial runway","canopy","flying fox","foefie slide","gravity propelled aerial ropeslide","Tyrolean traverse","zip wire","zip-line","zipline","zipwire"],tags:{aerialway:"zip_line"},name:"Zip Line"},"aeroway/aerodrome":{icon:"maki-airport",geometry:["point","area"],fields:["name","iata","icao","operator","internet_access","internet_access/fee","internet_access/ssid"],terms:["aerodrome","aeroway","airplane","airport","jet","plane"],tags:{aeroway:"aerodrome"},matchScore:0.9,name:"Airport"},"aeroway/apron":{icon:"maki-airport",geometry:["area"],terms:["ramp"],fields:["ref","surface"],tags:{aeroway:"apron"},name:"Apron"},"aeroway/gate":{icon:"maki-airport",geometry:["point"],fields:["ref_aeroway_gate"],tags:{aeroway:"gate"},name:"Airport Gate"},"aeroway/hangar":{geometry:["area"],fields:["name","building_area"],tags:{aeroway:"hangar"},addTags:{building:"hangar",aeroway:"hangar"},name:"Hangar"},"aeroway/helipad":{icon:"maki-heliport",geometry:["point","area"],fields:["ref"],terms:["helicopter","helipad","heliport"],tags:{aeroway:"helipad"},name:"Helipad"},"aeroway/jet_bridge":{icon:"temaki-pedestrian",geometry:["line"],fields:["ref_aeroway_gate","width","access_simple","wheelchair"],moreFields:["manufacturer"],terms:["aerobridge","air jetty","airbridge","finger","gangway","jet way","jetway","passenger boarding bridge","PBB","portal","skybridge","terminal gate connector"],tags:{aeroway:"jet_bridge"},addTags:{aeroway:"jet_bridge",highway:"corridor"},matchScore:1.05,name:"Jet Bridge"},"aeroway/runway":{icon:"fas-plane-departure",geometry:["line","area"],terms:["landing strip"],fields:["ref_runway","surface","length","width"],tags:{aeroway:"runway"},name:"Runway"},"aeroway/taxiway":{geometry:["line"],fields:["ref_taxiway","surface"],tags:{aeroway:"taxiway"},name:"Taxiway"},"aeroway/terminal":{icon:"maki-airport",geometry:["point","area"],terms:["airport","aerodrome"],fields:["name","operator","building_area"],moreFields:["wheelchair","smoking"],tags:{aeroway:"terminal"},name:"Airport Terminal"},"aeroway/windsock":{icon:"fas-wind",geometry:["point","vertex"],fields:["ref","lit","height"],moreFields:["manufacturer"],tags:{aeroway:"windsock"},name:"Windsock"},"allotments/plot":{geometry:["area"],fields:["name","ref"],tags:{allotments:"plot"},reference:{key:"allotments",value:"plot"},name:"Community Garden Plot"},"amenity/bus_station":{icon:"maki-bus",fields:["name","building_area","operator","internet_access","internet_access/fee","internet_access/ssid"],geometry:["point","area"],tags:{amenity:"bus_station"},name:"Bus Station / Terminal",searchable:false,replacement:"public_transport/station_bus"},"amenity/coworking_space":{icon:"maki-commercial",fields:["name","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid"],geometry:["point","area"],tags:{amenity:"coworking_space"},name:"Coworking Space",searchable:false},"amenity/embassy":{icon:"maki-embassy",fields:["name","country","address","building_area"],moreFields:["website","phone","email","fax","wheelchair"],geometry:["point","area"],tags:{amenity:"embassy"},searchable:false,name:"Embassy"},"amenity/ferry_terminal":{icon:"maki-ferry",fields:["name","network","operator","address","building_area"],geometry:["point","vertex","area"],terms:[],tags:{amenity:"ferry_terminal"},matchScore:0.95,name:"Ferry Station / Terminal",searchable:false,replacement:"public_transport/station_ferry"},"amenity/nursing_home":{icon:"maki-wheelchair",fields:["name","operator","address","building_area","social_facility","social_facility_for","opening_hours","wheelchair"],geometry:["point","area"],tags:{amenity:"nursing_home"},reference:{key:"social_facility",value:"nursing_home"},name:"Nursing Home",searchable:false},"amenity/recycling":{icon:"maki-recycling",fields:["recycling_type","recycling_accepts","collection_times"],geometry:["point","area"],terms:["bin","can","bottle","glass","garbage","rubbish","scrap","trash"],tags:{amenity:"recycling"},name:"Recycling",searchable:false},"amenity/register_office":{icon:"maki-town-hall",fields:["name","address","building_area","opening_hours","operator"],geometry:["point","area"],tags:{amenity:"register_office"},reference:{key:"government",value:"register_office"},name:"Register Office",searchable:false},"amenity/scrapyard":{icon:"maki-car",fields:["name","operator","address","opening_hours"],geometry:["point","area"],tags:{amenity:"scrapyard"},reference:{key:"industrial",value:"scrap_yard"},name:"Scrap Yard",searchable:false},"amenity/swimming_pool":{icon:"fas-swimmer",geometry:["point","vertex","area"],tags:{amenity:"swimming_pool"},reference:{key:"leisure",value:"swimming_pool"},name:"Swimming Pool",searchable:false},"amenity/animal_boarding":{icon:"maki-veterinary",fields:["name","operator","address","building_area","opening_hours","animal_boarding"],moreFields:["payment_multi","website","phone","email","fax","wheelchair"],geometry:["point","area"],terms:["boarding","cat","cattery","dog","horse","kennel","kitten","pet","pet boarding","pet care","pet hotel","puppy","reptile"],tags:{amenity:"animal_boarding"},name:"Animal Boarding Facility"},"amenity/animal_breeding":{icon:"maki-veterinary",fields:["name","operator","address","building_area","opening_hours","animal_breeding"],moreFields:["website","phone","email","fax","wheelchair"],geometry:["point","area"],terms:["breeding","bull","cat","cow","dog","horse","husbandry","kitten","livestock","pet breeding","puppy","reptile"],tags:{amenity:"animal_breeding"},name:"Animal Breeding Facility"},"amenity/animal_shelter":{icon:"maki-veterinary",fields:["name","operator","address","building_area","opening_hours","animal_shelter"],moreFields:["website","phone","email","fax","wheelchair"],geometry:["point","area"],terms:["adoption","aspca","cat","dog","horse","kitten","pet care","pet rescue","puppy","raptor","reptile","rescue","spca"],tags:{amenity:"animal_shelter"},name:"Animal Shelter"},"amenity/arts_centre":{icon:"maki-theatre",fields:["name","address","building_area","opening_hours","website"],moreFields:["email","fax","fee","internet_access","internet_access/fee","internet_access/ssid","payment_multi","phone","website","wheelchair"],geometry:["point","area"],terms:[],tags:{amenity:"arts_centre"},name:"Arts Center"},"amenity/atm":{icon:"maki-bank",fields:["operator","network","cash_in","currency_multi","drive_through"],moreFields:["name","brand","lit","opening_hours","wheelchair","covered"],geometry:["point","vertex"],terms:["money","cash","machine"],tags:{amenity:"atm"},name:"ATM"},"amenity/bank":{icon:"maki-bank",fields:["name","operator","address","building_area","atm","drive_through"],moreFields:["air_conditioning","currency_multi","email","fax","internet_access","internet_access/fee","internet_access/ssid","opening_hours","phone","website","wheelchair"],geometry:["point","area"],terms:["credit union","check","deposit","fund","investment","repository","reserve","safe","savings","stock","treasury","trust","vault"],tags:{amenity:"bank"},name:"Bank"},"amenity/bar":{icon:"maki-bar",fields:["name","address","building_area","outdoor_seating","brewery"],moreFields:["air_conditioning","email","fax","internet_access","internet_access/fee","internet_access/ssid","microbrewery","opening_hours","payment_multi","phone","smoking","website","wheelchair"],geometry:["point","area"],terms:["dive","beer","bier","booze"],tags:{amenity:"bar"},name:"Bar"},"amenity/bar/lgbtq":{icon:"maki-bar",geometry:["point","area"],terms:["gay bar","lesbian bar","lgbtq bar","lgbt bar","lgb bar"],tags:{amenity:"bar",lgbtq:"primary"},name:"LGBTQ+ Bar"},"amenity/bbq":{icon:"maki-bbq",fields:["covered","fuel","access_simple"],moreFields:["lit"],geometry:["point"],terms:["bbq","grill"],tags:{amenity:"bbq"},name:"Barbecue/Grill"},"amenity/bench":{icon:"temaki-bench",fields:["backrest","material","seats","colour"],moreFields:["access_simple","inscription","lit"],geometry:["point","vertex","line"],terms:["seat"],tags:{amenity:"bench"},name:"Bench"},"amenity/bicycle_parking":{icon:"maki-bicycle",fields:["bicycle_parking","capacity","operator","covered","access_simple","fee","payment_multi_fee"],moreFields:["lit"],geometry:["point","vertex","area"],terms:["bike"],tags:{amenity:"bicycle_parking"},name:"Bicycle Parking"},"amenity/bicycle_parking/building":{icon:"maki-bicycle",fields:["{amenity/bicycle_parking}","opening_hours","building_area"],geometry:["point","vertex","area"],tags:{amenity:"bicycle_parking",bicycle_parking:"building"},reference:{key:"bicycle_parking"},terms:["Multi-Storey Bicycle Park","Multi-Storey Bike Park","Bike Parking Station"],name:"Bicycle Parking Garage"},"amenity/bicycle_parking/lockers":{icon:"maki-bicycle",geometry:["point","vertex","area"],tags:{amenity:"bicycle_parking",bicycle_parking:"lockers"},reference:{key:"bicycle_parking"},terms:["Bike Lockers"],name:"Bicycle Lockers"},"amenity/bicycle_parking/shed":{icon:"maki-bicycle",fields:["{amenity/bicycle_parking}","building_area"],geometry:["point","vertex","area"],tags:{amenity:"bicycle_parking",bicycle_parking:"shed"},reference:{key:"bicycle_parking"},terms:["Bike Shed"],name:"Bicycle Shed"},"amenity/bicycle_rental":{icon:"maki-bicycle",fields:["capacity","network","operator","fee","payment_multi_fee"],moreFields:["opening_hours","address","website","phone","email","fax","wheelchair","covered"],geometry:["point","vertex","area"],terms:["bike"],tags:{amenity:"bicycle_rental"},name:"Bicycle Rental"},"amenity/bicycle_repair_station":{icon:"maki-bicycle",fields:["operator","brand","opening_hours","fee","service/bicycle"],moreFields:["payment_multi_fee","covered"],geometry:["point","vertex"],terms:["bike","repair","chain","pump"],tags:{amenity:"bicycle_repair_station"},name:"Bicycle Repair Tool Stand"},"amenity/biergarten":{icon:"fas-beer",fields:["name","address","building","outdoor_seating","brewery"],moreFields:["{amenity/bar}"],geometry:["point","area"],tags:{amenity:"biergarten"},terms:["beer","bier","booze"],name:"Biergarten"},"amenity/boat_rental":{icon:"temaki-boating",fields:["name","operator","fee","payment_multi_fee"],moreFields:["address","website","phone","email","fax","wheelchair"],geometry:["point","area"],tags:{amenity:"boat_rental"},name:"Boat Rental"},"amenity/bureau_de_change":{icon:"maki-bank",fields:["name","operator","payment_multi","currency_multi","address","building_area"],moreFields:["opening_hours","website","phone","email","fax","wheelchair"],geometry:["point","area"],terms:["bureau de change","money changer"],tags:{amenity:"bureau_de_change"},name:"Currency Exchange"},"amenity/cafe":{icon:"maki-cafe",fields:["name","cuisine","address","building_area","outdoor_seating","internet_access","internet_access/fee"],moreFields:["air_conditioning","bar","capacity","delivery","diet_multi","email","fax","internet_access/ssid","opening_hours","payment_multi","phone","reservation","smoking","takeaway","website","wheelchair"],geometry:["point","area"],terms:["bistro","coffee","tea"],tags:{amenity:"cafe"},name:"Cafe"},"amenity/car_pooling":{icon:"maki-car",fields:["name","operator","capacity","address","opening_hours","lit"],moreFields:["website","phone","email","fax","wheelchair"],geometry:["point","area"],tags:{amenity:"car_pooling"},name:"Car Pooling"},"amenity/car_rental":{icon:"maki-car-rental",fields:["name","operator","address","opening_hours","payment_multi"],moreFields:["brand","website","phone","email","fax","wheelchair"],geometry:["point","area"],tags:{amenity:"car_rental"},name:"Car Rental"},"amenity/car_sharing":{icon:"maki-car",fields:["name","operator","capacity","address","payment_multi","supervised"],moreFields:["lit","website","phone","email","fax","wheelchair"],geometry:["point","area"],tags:{amenity:"car_sharing"},name:"Car Sharing"},"amenity/car_wash":{icon:"temaki-car_wash",fields:["name","operator","address","building_area","opening_hours","payment_multi","self_service"],moreFields:["website","phone","email","fax","wheelchair"],geometry:["point","area"],tags:{amenity:"car_wash"},name:"Car Wash"},"amenity/casino":{icon:"maki-casino",fields:["name","operator","address","building_area","opening_hours","smoking"],moreFields:["air_conditioning","email","fax","internet_access","internet_access/fee","internet_access/ssid","payment_multi","phone","website","wheelchair"],geometry:["point","area"],terms:["gambling","roulette","craps","poker","blackjack"],tags:{amenity:"casino"},name:"Casino"},"amenity/charging_station":{icon:"fas-charging-station",fields:["name","operator","capacity","fee","payment_multi_fee"],geometry:["point"],tags:{amenity:"charging_station"},terms:["EV","Electric Vehicle","Supercharger"],name:"Charging Station"},"amenity/childcare":{icon:"fas-child",fields:["name","operator","address","building_area","opening_hours"],moreFields:["payment_multi","website","phone","email","fax","wheelchair"],geometry:["point","area"],terms:["daycare","orphanage","playgroup"],tags:{amenity:"childcare"},name:"Nursery/Childcare"},"amenity/cinema":{icon:"maki-cinema",fields:["name","address","screen","building_area","opening_hours","payment_multi"],moreFields:["air_conditioning","email","fax","phone","website","wheelchair"],geometry:["point","area"],terms:["drive-in","film","flick","movie","theater","picture","show","screen"],tags:{amenity:"cinema"},name:"Cinema"},"amenity/clinic":{icon:"maki-doctor",fields:["name","operator","healthcare/speciality","address","building_area","opening_hours"],moreFields:["air_conditioning","payment_multi","website","phone","email","fax","wheelchair"],geometry:["point","area"],terms:["medical","urgentcare"],tags:{amenity:"clinic"},addTags:{amenity:"clinic",healthcare:"clinic"},reference:{key:"amenity",value:"clinic"},name:"Clinic"},"amenity/clinic/abortion":{icon:"maki-hospital",fields:["name","operator","healthcare/speciality","address","building_area","opening_hours"],geometry:["point","area"],terms:[],tags:{amenity:"clinic",healthcare:"clinic","healthcare:speciality":"abortion"},reference:{key:"amenity",value:"clinic"},name:"Abortion Clinic"},"amenity/clinic/fertility":{icon:"maki-hospital",fields:["name","operator","healthcare/speciality","address","building_area","opening_hours"],geometry:["point","area"],terms:["egg","fertility","reproductive","sperm","ovulation"],tags:{amenity:"clinic",healthcare:"clinic","healthcare:speciality":"fertility"},reference:{key:"amenity",value:"clinic"},name:"Fertility Clinic"},"amenity/clock":{icon:"temaki-clock",fields:["name","support","display","visibility","date","faces"],moreFields:["lit"],geometry:["point","vertex"],tags:{amenity:"clock"},name:"Clock"},"amenity/clock/sundial":{icon:"temaki-clock",fields:["name","support","visibility","inscription"],moreFields:[],geometry:["point","vertex"],terms:["gnomon","shadow"],tags:{amenity:"clock",display:"sundial"},reference:{key:"display",value:"sundial"},name:"Sundial"},"amenity/college":{icon:"maki-college",fields:["name","operator","address","website","internet_access","internet_access/fee"],moreFields:["religion","denomination","internet_access/ssid","phone","email","fax","wheelchair"],geometry:["point","area"],terms:["university","undergraduate school"],tags:{amenity:"college"},name:"College Grounds"},"amenity/community_centre":{icon:"maki-town-hall",fields:["name","operator","address","building_area"],moreFields:["air_conditioning","website","phone","email","fax","wheelchair"],geometry:["point","area"],terms:["event","hall"],tags:{amenity:"community_centre"},name:"Community Center"},"amenity/community_centre/lgbtq":{icon:"maki-town-hall",geometry:["point","area"],terms:["lgbtq event","lgbtq hall","lgbt event","lgbt hall","lgb event","lgb hall"],tags:{amenity:"community_centre",lgbtq:"primary"},name:"LGBTQ+ Community Center"},"amenity/compressed_air":{icon:"maki-car",fields:["operator","fee","payment_multi_fee","lit"],geometry:["point","area"],tags:{amenity:"compressed_air"},name:"Compressed Air"},"amenity/conference_centre":{icon:"fas-user-tie",fields:["name","operator","building_area","address","website","internet_access"],moreFields:["air_conditioning","email","fax","internet_access/fee","internet_access/ssid","phone","smoking","wheelchair"],geometry:["point","area"],tags:{amenity:"conference_centre"},terms:["auditorium","conference","exhibition","exposition","lecture"],name:"Convention Center"},"amenity/courthouse":{icon:"fas-gavel",fields:["name","operator","address","building_area"],moreFields:["website","phone","email","fax","wheelchair"],geometry:["point","area"],tags:{amenity:"courthouse"},name:"Courthouse"},"amenity/crematorium":{icon:"maki-cemetery",fields:["name","website","phone","opening_hours","wheelchair"],moreFields:["address","website","phone","email","fax","wheelchair"],geometry:["area","point"],tags:{amenity:"crematorium"},terms:["cemetery","funeral"],name:"Crematorium"},"amenity/dentist":{icon:"maki-dentist",fields:["name","operator","healthcare/speciality","address","building_area","opening_hours"],moreFields:["payment_multi","website","phone","email","fax","wheelchair"],geometry:["point","area"],terms:["tooth","teeth"],tags:{amenity:"dentist"},addTags:{amenity:"dentist",healthcare:"dentist"},reference:{key:"amenity",value:"dentist"},name:"Dentist"},"amenity/dive_centre":{icon:"fas-swimmer",fields:["name","operator","address","building_area","opening_hours","scuba_diving"],moreFields:["payment_multi","website","phone","email","fax","wheelchair"],geometry:["point","area"],terms:["diving","scuba"],tags:{amenity:"dive_centre"},name:"Dive Center"},"amenity/doctors":{icon:"maki-doctor",fields:["name","operator","healthcare/speciality","address","building_area","opening_hours"],moreFields:["payment_multi","website","phone","email","fax","wheelchair"],geometry:["point","area"],terms:["medic*","physician"],tags:{amenity:"doctors"},addTags:{amenity:"doctors",healthcare:"doctor"},reference:{key:"amenity",value:"doctors"},name:"Doctor"},"amenity/dojo":{icon:"maki-pitch",fields:["name","sport","address","building_area","opening_hours"],moreFields:["payment_multi","website","phone","email","fax","wheelchair"],geometry:["point","area"],terms:["martial arts","dojang"],tags:{amenity:"dojo"},name:"Dojo / Martial Arts Academy"},"amenity/drinking_water":{icon:"maki-drinking-water",fields:["operator","access_simple","fee","payment_multi_fee","wheelchair"],moreFields:["lit","covered"],geometry:["point"],tags:{amenity:"drinking_water"},terms:["potable water source","water fountain","drinking fountain","bubbler","water tap"],name:"Drinking Water"},"amenity/driving_school":{icon:"maki-car",fields:["name","operator","address","building_area","opening_hours"],moreFields:["payment_multi","website","phone","email","fax","wheelchair"],geometry:["point","area"],tags:{amenity:"driving_school"},name:"Driving School"},"amenity/events_venue":{icon:"fas-users",fields:["name","operator","building_area","address","website","internet_access"],moreFields:["air_conditioning","email","fax","internet_access/fee","internet_access/ssid","phone","smoking","wheelchair"],geometry:["point","area"],tags:{amenity:"events_venue"},terms:["banquet hall","baptism","Bar Mitzvah","Bat Mitzvah","birthdays","celebrations","conferences","confirmation","meetings","parties","party","quinceañera","reunions","weddings"],name:"Events Venue"},"amenity/fast_food":{icon:"maki-fast-food",fields:["name","cuisine","operator","address","building_area","drive_through"],moreFields:["air_conditioning","opening_hours","diet_multi","takeaway","delivery","smoking","capacity","outdoor_seating","internet_access","internet_access/fee","internet_access/ssid","payment_multi","website","phone","email","fax","wheelchair"],geometry:["point","area"],tags:{amenity:"fast_food"},terms:["restaurant","takeaway"],name:"Fast Food"},"amenity/fast_food/ice_cream":{icon:"fas-ice-cream",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"ice_cream"},reference:{key:"cuisine",value:"ice_cream"},name:"Ice Cream Fast Food",searchable:false},"amenity/fast_food/burger":{icon:"maki-fast-food",geometry:["point","area"],terms:["breakfast","dine","dining","dinner","drive-in","eat","grill","lunch","table"],tags:{amenity:"fast_food",cuisine:"burger"},reference:{key:"cuisine",value:"burger"},name:"Burger Fast Food"},"amenity/fast_food/chicken":{icon:"fas-drumstick-bite",geometry:["point","area"],terms:["breakfast","canteen","dine","dining","dinner","drive-in","eat","grill","lunch","table"],tags:{amenity:"fast_food",cuisine:"chicken"},reference:{key:"cuisine",value:"chicken"},name:"Chicken Fast Food"},"amenity/fast_food/donut":{icon:"temaki-donut",geometry:["point","area"],terms:["breakfast","brunch","cafe","canteen","coffee","dine","diner","donut","doughnut","dining","eat","lunch","table"],tags:{amenity:"fast_food",cuisine:"donut"},reference:{key:"cuisine",value:"donut"},name:"Donut Fast Food"},"amenity/fast_food/fish_and_chips":{icon:"fas-fish",geometry:["point","area"],terms:["breakfast","cafe","café","dine","dining","dinner","drive-in","eat","grill","lunch","table","french fries"],tags:{amenity:"fast_food",cuisine:"fish_and_chips"},reference:{key:"cuisine",value:"fish_and_chips"},name:"Fish & Chips Fast Food"},"amenity/fast_food/kebab":{icon:"maki-restaurant",geometry:["point","area"],terms:["bar","breakfast","cafe","café","canteen","dine","dining","dinner","drive-in","eat","grill","lunch","table"],tags:{amenity:"fast_food",cuisine:"kebab"},reference:{key:"cuisine",value:"kebab"},name:"Kebab Fast Food"},"amenity/fast_food/mexican":{icon:"fas-pepper-hot",geometry:["point","area"],terms:["breakfast","dine","dining","dinner","drive-in","eat","grill","lunch","table","tacos","burritos","enchiladas","fajitas","nachos","tortillas","salsa","tamales","quesadillas"],tags:{amenity:"fast_food",cuisine:"mexican"},reference:{key:"cuisine",value:"mexican"},name:"Mexican Fast Food"},"amenity/fast_food/pizza":{icon:"maki-restaurant-pizza",geometry:["point","area"],terms:["dine","dining","dinner","drive-in","eat","lunch","table","deep dish","thin crust","slice"],tags:{amenity:"fast_food",cuisine:"pizza"},reference:{key:"cuisine",value:"pizza"},name:"Pizza Fast Food"},"amenity/fast_food/sandwich":{icon:"maki-restaurant",geometry:["point","area"],terms:["breakfast","cafe","café","dine","dining","dinner","drive-in","eat","grill","lunch","table"],tags:{amenity:"fast_food",cuisine:"sandwich"},reference:{key:"cuisine",value:"sandwich"},name:"Sandwich Fast Food"},"amenity/fire_station":{icon:"maki-fire-station",fields:["name","operator","address","building_area"],moreFields:["website","phone","email","fax","wheelchair"],geometry:["point","area"],terms:[],tags:{amenity:"fire_station"},name:"Fire Station"},"amenity/food_court":{icon:"maki-restaurant",fields:["name","operator","address","building_area","opening_hours"],moreFields:["smoking","outdoor_seating","capacity","internet_access","internet_access/fee","internet_access/ssid","diet_multi","website","phone","email","fax","wheelchair"],geometry:["point","area"],terms:["fast food","restaurant","food"],tags:{amenity:"food_court"},name:"Food Court"},"amenity/fountain":{icon:"temaki-fountain",fields:["name","operator","lit"],geometry:["point","area"],tags:{amenity:"fountain"},name:"Fountain"},"amenity/fuel":{icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","self_service"],moreFields:["opening_hours","payment_multi","building","website","phone","email","fax","wheelchair"],geometry:["point","area"],terms:["petrol","fuel","gasoline","propane","diesel","lng","cng","biodiesel"],tags:{amenity:"fuel"},name:"Gas Station"},"amenity/grave_yard":{icon:"maki-cemetery",fields:["religion","address"],moreFields:["website","phone","email","fax"],geometry:["point","area"],tags:{amenity:"grave_yard"},name:"Graveyard"},"amenity/grit_bin":{icon:"fas-box",fields:["access_simple"],geometry:["point","vertex"],tags:{amenity:"grit_bin"},terms:["salt","sand"],name:"Grit Bin"},"amenity/hospital":{icon:"maki-hospital",fields:["name","operator","healthcare/speciality","address","emergency"],moreFields:["internet_access","internet_access/fee","internet_access/ssid","website","phone","email","fax","wheelchair"],geometry:["point","area"],terms:["clinic","doctor","emergency room","health","infirmary","institution","sanatorium","sanitarium","sick","surgery","ward"],tags:{amenity:"hospital"},addTags:{amenity:"hospital",healthcare:"hospital"},reference:{key:"amenity",value:"hospital"},name:"Hospital Grounds"},"amenity/hunting_stand":{icon:"temaki-binoculars",fields:["access_simple"],geometry:["point","vertex","area"],terms:["game","gun","lookout","rifle","shoot*","wild","watch"],tags:{amenity:"hunting_stand"},name:"Hunting Stand"},"amenity/ice_cream":{icon:"fas-ice-cream",fields:["name","address","building_area","opening_hours","outdoor_seating"],moreFields:["takeaway","delivery","drive_through","internet_access","internet_access/fee","internet_access/ssid","diet_multi","payment_multi","website","phone","email","fax","wheelchair"],geometry:["point","area"],terms:["gelato","sorbet","sherbet","frozen","yogurt"],tags:{amenity:"ice_cream"},name:"Ice Cream Shop"},"amenity/internet_cafe":{icon:"temaki-antenna",fields:["name","operator","address","building_area","internet_access","internet_access/fee","internet_access/ssid"],moreFields:["air_conditioning","opening_hours","smoking","outdoor_seating","payment_multi","website","phone","email","fax","wheelchair"],geometry:["point","area"],terms:["cybercafe","taxiphone","teleboutique","coffee","cafe","net","lanhouse"],tags:{amenity:"internet_cafe"},name:"Internet Cafe"},"amenity/kindergarten":{icon:"maki-school",fields:["name","operator","address"],moreFields:["opening_hours","payment_multi","website","phone","email","fax","wheelchair"],geometry:["point","area"],terms:["kindergarden","pre-school"],tags:{amenity:"kindergarten"},name:"Preschool/Kindergarten Grounds"},"amenity/language_school":{icon:"maki-school",fields:["name","operator","address","building_area","opening_hours","language_multi"],moreFields:["email","fax","internet_access","internet_access/fee","internet_access/ssid","payment_multi","phone","website","wheelchair"],geometry:["point","area"],terms:["esl"],tags:{amenity:"language_school"},name:"Language School"},"amenity/library":{icon:"maki-library",fields:["name","operator","building_area","address","ref/isil","internet_access","internet_access/fee"],moreFields:["access_simple","air_conditioning","opening_hours","internet_access/ssid","website","phone","email","fax","wheelchair","payment_multi"],geometry:["point","area"],terms:["book"],tags:{amenity:"library"},name:"Library"},"amenity/love_hotel":{icon:"maki-heart",fields:["name","operator","address","building_area","rooms","internet_access","internet_access/fee"],moreFields:["smoking","payment_multi","internet_access/ssid","website","phone","email","fax","wheelchair"],geometry:["point","area"],tags:{amenity:"love_hotel"},name:"Love Hotel"},"amenity/marketplace":{icon:"maki-shop",fields:["name","operator","address","building","opening_hours"],moreFields:["website","phone","email","fax","wheelchair"],geometry:["point","area"],tags:{amenity:"marketplace"},name:"Marketplace"},"amenity/monastery":{icon:"maki-place-of-worship",fields:["name","religion","denomination","address","building_area"],moreFields:["website","phone","email","fax","wheelchair"],geometry:["point","area"],terms:["abbey","basilica","bethel","cathedral","chancel","chantry","chapel","church","fold","house of God","house of prayer","house of worship","minster","mission","monastery","mosque","oratory","parish","sacellum","sanctuary","shrine","synagogue","tabernacle","temple"],tags:{amenity:"monastery"},name:"Monastery Grounds"},"amenity/money_transfer":{icon:"maki-bank",fields:["name","brand","address","building_area","payment_multi","currency_multi"],moreFields:["opening_hours","website","phone","email","fax","wheelchair"],geometry:["point","area"],terms:["money order","check","bill","currency","finance","wire transfer","cable","person to person","cash to cash","exchange"],tags:{amenity:"money_transfer"},name:"Money Transfer Station"},"amenity/motorcycle_parking":{icon:"fas-motorcycle",fields:["capacity","operator","covered","access_simple"],geometry:["point","vertex","area"],tags:{amenity:"motorcycle_parking"},name:"Motorcycle Parking"},"amenity/music_school":{icon:"maki-school",fields:["name","operator","address","building_area","opening_hours"],moreFields:["payment_multi","website","phone","email","fax","wheelchair"],geometry:["point","area"],terms:["school of music"],tags:{amenity:"music_school"},name:"Music School"},"amenity/nightclub":{icon:"maki-bar",fields:["name","operator","address","building_area","opening_hours","smoking"],moreFields:["air_conditioning","payment_multi","website","phone","email","fax","wheelchair"],geometry:["point","area"],tags:{amenity:"nightclub"},terms:["disco*","night club","dancing","dance club"],name:"Nightclub"},"amenity/nightclub/lgbtq":{icon:"maki-bar",geometry:["point","area"],tags:{amenity:"nightclub",lgbtq:"primary"},terms:["gay nightclub","lesbian nightclub","lgbtq nightclub","lgbt nightclub","lgb nightclub"],name:"LGBTQ+ Nightclub"},"amenity/parking_entrance":{icon:"maki-entrance-alt1",fields:["access_simple","ref"],geometry:["vertex"],tags:{amenity:"parking_entrance"},name:"Parking Garage Entrance/Exit"},"amenity/parking_space":{fields:["capacity"],geometry:["point","vertex","area"],terms:[],tags:{amenity:"parking_space"},matchScore:0.95,name:"Parking Space"},"amenity/parking":{icon:"maki-car",fields:["operator","parking","capacity","access_simple","fee","payment_multi_fee","surface"],moreFields:["address","covered","email","fax","maxstay","name","opening_hours","park_ride","phone","ref","supervised","website","wheelchair"],geometry:["point","vertex","area"],tags:{amenity:"parking"},terms:["automobile parking","car lot","car parking","rv parking","truck parking","vehicle parking"],name:"Parking Lot"},"amenity/parking/multi-storey":{icon:"maki-car",fields:["name","{amenity/parking}","building"],moreFields:["{amenity/parking}","levels","height"],geometry:["area"],tags:{amenity:"parking",parking:"multi-storey"},addTags:{building:"parking",amenity:"parking",parking:"multi-storey"},reference:{key:"parking",value:"multi-storey"},terms:["car","indoor parking","multistorey car park","parkade","parking building","parking deck","parking garage","parking ramp","parking structure"],name:"Multilevel Parking Garage"},"amenity/parking/underground":{icon:"maki-car",fields:["{amenity/parking}","layer"],geometry:["point","vertex","area"],tags:{amenity:"parking",parking:"underground"},addTags:{amenity:"parking",parking:"underground",layer:"-1"},reference:{key:"parking",value:"underground"},terms:["automobile parking","car lot","car parking","rv parking","subsurface parking","truck parking","vehicle parking"],name:"Underground Parking"},"amenity/payment_centre":{icon:"maki-bank",fields:["name","brand","address","building_area","opening_hours","payment_multi"],moreFields:["currency_multi","website","phone","email","fax","wheelchair"],geometry:["point","area"],terms:["check","tax pay","bill pay","currency","finance","cash","money"],tags:{amenity:"payment_centre"},name:"Payment Center"},"amenity/payment_terminal":{icon:"far-credit-card",fields:["name","brand","address","opening_hours","payment_multi"],moreFields:["currency_multi","wheelchair"],geometry:["point"],terms:["interactive kiosk","ekiosk","atm","bill pay","tax pay","phone pay","finance","cash","money transfer","card"],tags:{amenity:"payment_terminal"},name:"Payment Terminal"},"amenity/pharmacy":{icon:"maki-pharmacy",fields:["name","operator","address","building_area","drive_through","dispensing"],moreFields:["opening_hours","payment_multi","website","phone","email","fax","wheelchair"],geometry:["point","area"],tags:{amenity:"pharmacy"},addTags:{amenity:"pharmacy",healthcare:"pharmacy"},reference:{key:"amenity",value:"pharmacy"},terms:["apothecary","drug store","drugstore","med*","prescription"],name:"Pharmacy Counter"},"amenity/photo_booth":{icon:"fas-person-booth",fields:["name","operator","payment_multi","wheelchair"],geometry:["point","area"],terms:["photobooth","photo","booth","kiosk","camera"],tags:{amenity:"photo_booth"},name:"Photo Booth"},"amenity/place_of_worship":{icon:"maki-place-of-worship",fields:["name","religion","denomination","address","building_area","service_times"],moreFields:["air_conditioning","opening_hours","internet_access","internet_access/ssid","website","phone","email","fax","wheelchair"],geometry:["point","area"],terms:["abbey","basilica","bethel","cathedral","chancel","chantry","chapel","church","fold","house of God","house of prayer","house of worship","minster","mission","mosque","oratory","parish","sacellum","sanctuary","shrine","synagogue","tabernacle","temple"],tags:{amenity:"place_of_worship"},name:"Place of Worship"},"amenity/place_of_worship/buddhist":{icon:"maki-religious-buddhist",fields:["name","religion","denomination","building_area","address","service_times"],geometry:["point","area"],terms:["stupa","vihara","monastery","temple","pagoda","zendo","dojo"],tags:{amenity:"place_of_worship",religion:"buddhist"},reference:{key:"amenity",value:"place_of_worship"},name:"Buddhist Temple"},"amenity/place_of_worship/christian":{icon:"maki-religious-christian",fields:["name","religion","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:"Christian Church"},"amenity/place_of_worship/hindu":{icon:"temaki-hinduism",fields:["name","religion","denomination","building_area","address","service_times"],geometry:["point","area"],terms:["kovil","devasthana","mandir","kshetram","alayam","shrine","temple"],tags:{amenity:"place_of_worship",religion:"hindu"},reference:{key:"amenity",value:"place_of_worship"},name:"Hindu Temple"},"amenity/place_of_worship/jewish":{icon:"maki-religious-jewish",fields:["name","religion","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:"Jewish Synagogue"},"amenity/place_of_worship/muslim":{icon:"maki-religious-muslim",fields:["name","religion","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:"Muslim Mosque"},"amenity/place_of_worship/shinto":{icon:"temaki-shinto",fields:["name","religion","denomination","building_area","address","service_times"],geometry:["point","area"],terms:["kami","torii"],tags:{amenity:"place_of_worship",religion:"shinto"},reference:{key:"amenity",value:"place_of_worship"},name:"Shinto Shrine"},"amenity/place_of_worship/sikh":{icon:"temaki-sikhism",fields:["name","religion","denomination","building_area","address","service_times"],geometry:["point","area"],terms:["gurudwara","temple"],tags:{amenity:"place_of_worship",religion:"sikh"},reference:{key:"amenity",value:"place_of_worship"},name:"Sikh Temple"},"amenity/place_of_worship/taoist":{icon:"temaki-taoism",fields:["name","religion","denomination","building_area","address","service_times"],geometry:["point","area"],terms:["daoist","monastery","temple"],tags:{amenity:"place_of_worship",religion:"taoist"},reference:{key:"amenity",value:"place_of_worship"},name:"Taoist Temple"},"amenity/planetarium":{icon:"maki-globe",fields:["name","operator","address","building_area","opening_hours"],moreFields:["air_conditioning","fee","payment_multi_fee","website","phone","email","fax","wheelchair"],geometry:["point","area"],terms:["museum","astronomy","observatory"],tags:{amenity:"planetarium"},name:"Planetarium"},"amenity/police":{icon:"maki-police",fields:["name","operator","address","building_area","opening_hours"],moreFields:["website","phone","email","fax","wheelchair"],geometry:["point","area"],terms:["badge","constable","constabulary","cop","detective","fed","law","enforcement","officer","patrol"],tags:{amenity:"police"},name:"Police"},"amenity/post_box":{icon:"temaki-post_box",fields:["operator","collection_times","drive_through","ref"],moreFields:["wheelchair"],geometry:["point","vertex"],tags:{amenity:"post_box"},terms:["letter","post"],name:"Mailbox"},"amenity/post_office":{icon:"maki-post",fields:["name","operator","address","building_area","opening_hours"],moreFields:["email","fax","internet_access","internet_access/fee","internet_access/ssid","payment_multi","phone","website","wheelchair"],geometry:["point","area"],terms:["letter","mail"],tags:{amenity:"post_office"},name:"Post Office"},"amenity/prep_school":{icon:"temaki-school",fields:["name","operator","address","building_area","opening_hours"],moreFields:["payment_multi","website","phone","email","fax","wheelchair"],geometry:["point","area"],terms:["academic","ACT","SAT","homework","math","reading","test prep","tutoring","writing"],tags:{amenity:"prep_school"},name:"Test Prep / Tutoring School"},"amenity/prison":{icon:"maki-prison",fields:["name","operator","address"],moreFields:["website","phone","email","fax","wheelchair"],geometry:["point","area"],terms:["cell","jail"],tags:{amenity:"prison"},name:"Prison Grounds"},"amenity/pub":{icon:"maki-beer",fields:["name","address","building_area","opening_hours","smoking","brewery"],moreFields:["air_conditioning","diet_multi","email","fax","internet_access","internet_access/fee","internet_access/ssid","microbrewery","outdoor_seating","payment_multi","phone","website","wheelchair"],geometry:["point","area"],tags:{amenity:"pub"},terms:["alcohol","drink","dive","beer","bier","booze"],name:"Pub"},"amenity/pub/lgbtq":{icon:"maki-beer",geometry:["point","area"],tags:{amenity:"pub",lgbtq:"primary"},terms:["gay pub","lesbian pub","lgbtq pub","lgbt pub","lgb pub"],name:"LGBTQ+ Pub"},"amenity/pub/microbrewery":{icon:"maki-beer",geometry:["point","area"],tags:{amenity:"pub",microbrewery:"yes"},reference:{key:"microbrewery"},terms:["alcohol","drink","dive","beer","bier","booze","craft brewery","microbrewery","small batch brewery"],name:"Brewpub"},"amenity/public_bath":{icon:"maki-water",fields:["name","bath/type","bath/open_air","bath/sand_bath","address","building_area","fee"],moreFields:["email","fax","internet_access","internet_access/fee","internet_access/ssid","opening_hours","payment_multi_fee","phone","website","wheelchair"],geometry:["point","area"],tags:{amenity:"public_bath"},terms:["onsen","foot bath","hot springs"],name:"Public Bath"},"amenity/public_bookcase":{icon:"maki-library",fields:["name","operator","capacity","website","lit"],moreFields:["wheelchair"],geometry:["point","area"],terms:["library","bookcrossing"],tags:{amenity:"public_bookcase"},name:"Public Bookcase"},"amenity/ranger_station":{icon:"maki-ranger-station",fields:["name","operator","address","building_area","opening_hours"],moreFields:["email","fax","internet_access","internet_access/fee","internet_access/ssid","phone","website","wheelchair"],geometry:["point","area"],terms:["visitor center","visitor centre","permit center","permit centre","backcountry office","warden office","warden center"],tags:{amenity:"ranger_station"},name:"Ranger Station"},"amenity/recycling_centre":{icon:"maki-recycling",fields:["name","operator","address","building","opening_hours","recycling_accepts"],moreFields:["fee","payment_multi_fee","website","phone","email","fax","wheelchair"],geometry:["point","area"],terms:["bottle","can","dump","glass","garbage","rubbish","scrap","trash"],tags:{amenity:"recycling",recycling_type:"centre"},reference:{key:"recycling_type",value:"*"},name:"Recycling Center"},"amenity/recycling_container":{icon:"maki-recycling",fields:["recycling_accepts","collection_times"],geometry:["point","area"],terms:["bin","can","bottle","glass","garbage","rubbish","scrap","trash"],tags:{amenity:"recycling",recycling_type:"container"},reference:{key:"amenity",value:"recycling"},name:"Recycling Container"},"amenity/restaurant":{icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","phone"],moreFields:["air_conditioning","bar","brewery","capacity","delivery","diet_multi","email","fax","internet_access","internet_access/fee","internet_access/ssid","microbrewery","outdoor_seating","reservation","smoking","stars","takeaway","website","wheelchair"],geometry:["point","area"],terms:["bar","breakfast","cafe","café","canteen","coffee","dine","dining","dinner","drive-in","eat","grill","lunch","table"],tags:{amenity:"restaurant"},name:"Restaurant"},"amenity/restaurant/american":{icon:"maki-restaurant",geometry:["point","area"],terms:["bar","breakfast","cafe","café","canteen","coffee","dine","dining","dinner","drive-in","eat","grill","lunch","table"],tags:{amenity:"restaurant",cuisine:"american"},reference:{key:"cuisine",value:"american"},name:"American Restaurant"},"amenity/restaurant/asian":{icon:"maki-restaurant-noodle",geometry:["point","area"],terms:["bar","breakfast","cafe","café","canteen","dine","dining","dinner","drive-in","eat","grill","lunch","table"],tags:{amenity:"restaurant",cuisine:"asian"},reference:{key:"cuisine",value:"asian"},name:"Asian Restaurant"},"amenity/restaurant/chinese":{icon:"maki-restaurant-noodle",geometry:["point","area"],terms:["bar","breakfast","cafe","café","canteen","dine","dining","dinner","drive-in","eat","grill","lunch","table"],tags:{amenity:"restaurant",cuisine:"chinese"},reference:{key:"cuisine",value:"chinese"},name:"Chinese Restaurant"},"amenity/restaurant/french":{icon:"maki-restaurant",geometry:["point","area"],terms:["bar","breakfast","cafe","café","canteen","dine","dining","dinner","drive-in","eat","grill","lunch","table"],tags:{amenity:"restaurant",cuisine:"french"},reference:{key:"cuisine",value:"french"},name:"French Restaurant"},"amenity/restaurant/german":{icon:"maki-restaurant",geometry:["point","area"],terms:["bar","breakfast","cafe","café","canteen","dine","dining","dinner","drive-in","eat","grill","lunch","table"],tags:{amenity:"restaurant",cuisine:"german"},reference:{key:"cuisine",value:"german"},name:"German Restaurant"},"amenity/restaurant/greek":{icon:"maki-restaurant",geometry:["point","area"],terms:["bar","breakfast","cafe","café","canteen","dine","dining","dinner","drive-in","eat","grill","lunch","table","gyros","pitas","olives"],tags:{amenity:"restaurant",cuisine:"greek"},reference:{key:"cuisine",value:"greek"},name:"Greek Restaurant"},"amenity/restaurant/indian":{icon:"maki-restaurant",geometry:["point","area"],terms:["bar","breakfast","dine","dining","dinner","drive-in","eat","grill","lunch","table","curry"],tags:{amenity:"restaurant",cuisine:"indian"},reference:{key:"cuisine",value:"indian"},name:"Indian Restaurant"},"amenity/restaurant/italian":{icon:"maki-restaurant",geometry:["point","area"],terms:["bar","breakfast","cafe","café","canteen","dine","dining","dinner","drive-in","eat","grill","lunch","table","pasta","pizza"],tags:{amenity:"restaurant",cuisine:"italian"},reference:{key:"cuisine",value:"italian"},name:"Italian Restaurant"},"amenity/restaurant/japanese":{icon:"maki-restaurant-noodle",geometry:["point","area"],terms:["bar","breakfast","cafe","café","canteen","dine","dining","dinner","drive-in","eat","grill","lunch","table"],tags:{amenity:"restaurant",cuisine:"japanese"},reference:{key:"cuisine",value:"japanese"},name:"Japanese Restaurant"},"amenity/restaurant/mexican":{icon:"fas-pepper-hot",geometry:["point","area"],terms:["bar","breakfast","dine","dining","dinner","drive-in","eat","grill","lunch","table","tacos","burritos","enchiladas","fajitas","nachos","tortillas","salsa","tamales","quesadillas"],tags:{amenity:"restaurant",cuisine:"mexican"},reference:{key:"cuisine",value:"mexican"},name:"Mexican Restaurant"},"amenity/restaurant/noodle":{icon:"maki-restaurant-noodle",geometry:["point","area"],terms:["bar","breakfast","cafe","café","canteen","dine","dining","dinner","drive-in","eat","grill","lunch","table","ramen noodles","soup","soba noodles","cellophane noodles","rice noodles"],tags:{amenity:"restaurant",cuisine:"noodle"},reference:{key:"cuisine",value:"noodle"},name:"Noodle Restaurant"},"amenity/restaurant/pizza":{icon:"maki-restaurant-pizza",geometry:["point","area"],terms:["bar","dine","dining","dinner","drive-in","eat","lunch","table","deep dish","thin crust","slice"],tags:{amenity:"restaurant",cuisine:"pizza"},reference:{key:"cuisine",value:"pizza"},name:"Pizza Restaurant"},"amenity/restaurant/seafood":{icon:"maki-restaurant-seafood",geometry:["point","area"],terms:["bar","breakfast","cafe","café","dine","dining","dinner","drive-in","eat","grill","lunch","table","fish","shellfish","molluscs","crustaceans","clams","oysters","lobsters","crab","shrimp","squid","octopus"],tags:{amenity:"restaurant",cuisine:"seafood"},reference:{key:"cuisine",value:"seafood"},name:"Seafood Restaurant"},"amenity/restaurant/steakhouse":{icon:"maki-slaughterhouse",geometry:["point","area"],terms:["bar","breakfast","cafe","café","canteen","dine","dining","dinner","drive-in","eat","grill","lunch","table","steak house","chop house","beef"],tags:{amenity:"restaurant",cuisine:"steak_house"},reference:{key:"cuisine",value:"steak_house"},name:"Steakhouse"},"amenity/restaurant/sushi":{icon:"fas-fish",geometry:["point","area"],terms:["bar","breakfast","cafe","café","canteen","dine","dining","dinner","drive-in","eat","grill","lunch","table"],tags:{amenity:"restaurant",cuisine:"sushi"},reference:{key:"cuisine",value:"sushi"},name:"Sushi Restaurant"},"amenity/restaurant/thai":{icon:"maki-restaurant-noodle",geometry:["point","area"],terms:["bar","breakfast","cafe","café","canteen","dine","dining","dinner","drive-in","eat","grill","lunch","table"],tags:{amenity:"restaurant",cuisine:"thai"},reference:{key:"cuisine",value:"thai"},name:"Thai Restaurant"},"amenity/restaurant/turkish":{icon:"maki-restaurant",geometry:["point","area"],terms:["bar","breakfast","cafe","café","canteen","dine","dining","dinner","drive-in","eat","grill","lunch","table"],tags:{amenity:"restaurant",cuisine:"turkish"},reference:{key:"cuisine",value:"turkish"},name:"Turkish Restaurant"},"amenity/restaurant/vietnamese":{icon:"maki-restaurant-noodle",geometry:["point","area"],terms:["bar","breakfast","cafe","café","canteen","dine","dining","dinner","drive-in","eat","grill","lunch","table"],tags:{amenity:"restaurant",cuisine:"vietnamese"},reference:{key:"cuisine",value:"vietnamese"},name:"Vietnamese Restaurant"},"amenity/sanitary_dump_station":{icon:"temaki-storage_tank",fields:["operator","access_simple","fee","payment_multi_fee","water_point"],geometry:["point","vertex","area"],terms:["Motor Home","Camper","Sanitary","Dump Station","Elsan","CDP","CTDP","Chemical Toilet"],tags:{amenity:"sanitary_dump_station"},name:"RV Toilet Disposal"},"amenity/school":{icon:"maki-school",fields:["name","operator","address","religion","denomination","website"],moreFields:["internet_access","internet_access/ssid","phone","email","fax","wheelchair"],geometry:["point","area"],terms:["academy","elementary school","middle school","high school"],tags:{amenity:"school"},name:"School Grounds"},"amenity/shelter":{icon:"maki-shelter",fields:["name","shelter_type","building_area","bench","bin"],moreFields:["lit","wheelchair"],geometry:["point","vertex","area"],terms:["lean-to","gazebo","picnic"],tags:{amenity:"shelter"},name:"Shelter"},"amenity/shelter/gazebo":{icon:"maki-shelter",fields:["name","building_area","bench","lit"],geometry:["point","area"],tags:{amenity:"shelter",shelter_type:"gazebo"},name:"Gazebo"},"amenity/shelter/lean_to":{icon:"maki-shelter",fields:["name","operator","building_area"],geometry:["point","area"],tags:{amenity:"shelter",shelter_type:"lean_to"},name:"Lean-To"},"amenity/shelter/picnic_shelter":{icon:"maki-shelter",fields:["name","shelter_type","building_area","lit","bin"],geometry:["point","area"],tags:{amenity:"shelter",shelter_type:"picnic_shelter"},reference:{key:"shelter_type",value:"picnic_shelter"},terms:["pavilion"],name:"Picnic Shelter"},"amenity/shelter/public_transport":{icon:"maki-shelter",fields:["name","shelter_type","building_area","bench","lit"],geometry:["point","area"],terms:["bus stop","metro stop","public transit shelter","public transport shelter","tram stop shelter","waiting"],tags:{amenity:"shelter",shelter_type:"public_transport"},reference:{key:"shelter_type",value:"public_transport"},name:"Transit Shelter"},"amenity/shower":{icon:"fas-shower",fields:["opening_hours","access_simple","fee","payment_multi_fee","supervised","building_area","wheelchair"],moreFields:["address","operator","gender"],geometry:["point","vertex","area"],terms:["rain closet"],tags:{amenity:"shower"},name:"Shower"},"amenity/smoking_area":{icon:"fas-smoking",fields:["name","shelter","bin","bench","opening_hours"],moreFields:["lit","wheelchair","covered"],geometry:["point","vertex","area"],terms:[],tags:{amenity:"smoking_area"},name:"Smoking Area"},"amenity/social_centre":{icon:"fas-handshake",fields:["name","brand","operator","address","building_area"],moreFields:["air_conditioning","email","fax","internet_access","internet_access/fee","internet_access/ssid","phone","website","wheelchair"],geometry:["point","area"],terms:["event","fraternal","fraternity","hall","organization","professional","society","sorority","union","vetern"],tags:{amenity:"social_centre"},name:"Social Center"},"amenity/social_facility":{icon:"temaki-social_facility",fields:["name","operator","address","building_area","social_facility","social_facility_for"],moreFields:["email","fax","internet_access","internet_access/fee","internet_access/ssid","opening_hours","phone","website","wheelchair"],geometry:["point","area"],terms:[],tags:{amenity:"social_facility"},name:"Social Facility"},"amenity/social_facility/ambulatory_care":{icon:"maki-wheelchair",geometry:["point","area"],tags:{amenity:"social_facility",social_facility:"ambulatory_care"},reference:{key:"social_facility",value:"ambulatory_care"},name:"Ambulatory Care"},"amenity/social_facility/food_bank":{icon:"temaki-social_facility",geometry:["point","area"],terms:[],tags:{amenity:"social_facility",social_facility:"food_bank"},reference:{key:"social_facility",value:"food_bank"},name:"Food Bank"},"amenity/social_facility/group_home":{icon:"maki-wheelchair",fields:["{amenity/social_facility}","wheelchair"],geometry:["point","area"],terms:["old","senior","living","care home","assisted living"],tags:{amenity:"social_facility",social_facility:"group_home","social_facility:for":"senior"},reference:{key:"social_facility",value:"group_home"},name:"Elderly Group Home"},"amenity/social_facility/homeless_shelter":{icon:"temaki-social_facility",geometry:["point","area"],terms:["houseless","unhoused","displaced"],tags:{amenity:"social_facility",social_facility:"shelter","social_facility:for":"homeless"},reference:{key:"social_facility",value:"shelter"},name:"Homeless Shelter"},"amenity/social_facility/nursing_home":{icon:"maki-wheelchair",fields:["{amenity/social_facility}","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:"fas-microphone",fields:["name","studio","address","building_area"],moreFields:["internet_access","internet_access/fee","internet_access/ssid","website","phone","email","fax","wheelchair"],geometry:["point","area"],terms:["recording","radio","television"],tags:{amenity:"studio"},name:"Studio"},"amenity/taxi":{icon:"fas-taxi",fields:["name","operator","capacity"],moreFields:["address","opening_hours","wheelchair"],geometry:["point","vertex","area"],terms:["cab"],tags:{amenity:"taxi"},name:"Taxi Stand"},"amenity/telephone":{icon:"maki-telephone",fields:["operator","phone","fee","payment_multi_fee","booth"],moreFields:["covered","indoor","lit","wheelchair"],geometry:["point","vertex"],tags:{amenity:"telephone"},terms:["phone"],name:"Telephone"},"amenity/theatre":{icon:"maki-theatre",fields:["name","operator","address","building_area"],moreFields:["air_conditioning","internet_access","internet_access/fee","internet_access/ssid","payment_multi","website","phone","email","fax","wheelchair"],geometry:["point","area"],terms:["theatre","performance","play","musical"],tags:{amenity:"theatre"},name:"Theater"},"amenity/theatre/type/amphi":{icon:"maki-theatre",fields:["name","operator","address","lit"],geometry:["point","area"],terms:["open air","outdoor","greek","ampi"],tags:{amenity:"theatre","theatre:type":"amphi"},name:"Amphitheatre"},"amenity/toilets":{icon:"maki-toilet",fields:["toilets/disposal","access_simple","gender","diaper","wheelchair","building_area"],moreFields:["fee","opening_hours","operator","payment_multi_fee","toilets/handwashing","toilets/position"],geometry:["point","vertex","area"],terms:["bathroom","restroom","outhouse","privy","head","lavatory","latrine","water closet","WC","W.C."],tags:{amenity:"toilets"},name:"Toilets"},"amenity/toilets/disposal/flush":{icon:"fas-toilet",fields:["toilets/disposal","{amenity/toilets}"],moreFields:["{amenity/toilets}"],geometry:["point","vertex","area"],terms:["bathroom","head","lavatory","privy","restroom","water closet","WC","W.C."],tags:{amenity:"toilets","toilets:disposal":"flush"},reference:{key:"toilets:disposal",value:"flush"},name:"Flush Toilets"},"amenity/toilets/disposal/pitlatrine":{icon:"tnp-2009541",fields:["toilets/disposal","{amenity/toilets}","toilets/handwashing"],moreFields:["{amenity/toilets}"],geometry:["point","vertex","area"],terms:["head","lavatory","long drop","outhouse","pit toilet","privy"],tags:{amenity:"toilets","toilets:disposal":"pitlatrine"},reference:{key:"toilets:disposal",value:"pitlatrine"},name:"Pit Latrine"},"amenity/townhall":{icon:"maki-town-hall",fields:["name","operator","address","building_area"],moreFields:["website","phone","email","fax","wheelchair"],geometry:["point","area"],terms:["village","city","government","courthouse","municipal"],tags:{amenity:"townhall"},name:"Town Hall"},"amenity/toy_library":{icon:"fas-chess-knight",fields:["operator","address","building_area","opening_hours"],moreFields:["website","wheelchair"],geometry:["point","area"],terms:["game","toy"],tags:{amenity:"toy_library"},name:"Toy Library"},"amenity/university":{icon:"maki-college",fields:["{amenity/college}"],moreFields:["{amenity/college}"],geometry:["point","area"],terms:["college","graduate school","PhD program","master's degree program"],tags:{amenity:"university"},name:"University Grounds"},"amenity/vehicle_inspection":{icon:"maki-car",fields:["name","operator","address","building_area","opening_hours"],moreFields:["payment_multi","website","phone","email","fax","wheelchair"],geometry:["point","area"],terms:["car inspection"],tags:{amenity:"vehicle_inspection"},name:"Vehicle Inspection"},"amenity/vending_machine":{icon:"temaki-vending_machine",fields:["vending","operator","payment_multi","currency_multi"],geometry:["point"],terms:[],tags:{amenity:"vending_machine"},matchScore:0.9,name:"Vending Machine"},"amenity/vending_machine/cigarettes":{icon:"temaki-vending_machine",geometry:["point"],terms:["cigarette"],tags:{amenity:"vending_machine",vending:"cigarettes"},reference:{key:"vending",value:"cigarettes"},name:"Cigarette Vending Machine"},"amenity/vending_machine/coffee":{icon:"temaki-vending_machine",geometry:["point"],terms:["coffee"],tags:{amenity:"vending_machine",vending:"coffee"},reference:{key:"vending",value:"coffee"},name:"Coffee Vending Machine"},"amenity/vending_machine/condoms":{icon:"temaki-vending_machine",geometry:["point"],terms:["condom"],tags:{amenity:"vending_machine",vending:"condoms"},reference:{key:"vending",value:"condoms"},name:"Condom Vending Machine"},"amenity/vending_machine/drinks":{icon:"temaki-vending_machine",geometry:["point"],terms:["drink","soda","beverage","juice","pop"],tags:{amenity:"vending_machine",vending:"drinks"},reference:{key:"vending",value:"drinks"},name:"Drink Vending Machine"},"amenity/vending_machine/electronics":{icon:"temaki-vending_machine",geometry:["point"],terms:["cable","charger","earbud","headphone","phone","tablet"],tags:{amenity:"vending_machine",vending:"electronics"},reference:{key:"vending",value:"electronics"},name:"Electronics Vending Machine"},"amenity/vending_machine/elongated_coin":{icon:"temaki-vending_machine",geometry:["point"],terms:["coin","crush","elongated","flatten","penny","souvenir"],tags:{amenity:"vending_machine",vending:"elongated_coin"},reference:{key:"vending",value:"elongated_coin"},name:"Flat Coin Vending Machine"},"amenity/vending_machine/excrement_bags":{icon:"temaki-vending_machine",fields:["{amenity/vending_machine}"],geometry:["point"],terms:["excrement bags","poop","waste","dog","animal"],tags:{amenity:"vending_machine",vending:"excrement_bags"},reference:{key:"vending",value:"excrement_bags"},name:"Excrement Bag Dispenser"},"amenity/vending_machine/feminine_hygiene":{icon:"temaki-vending_machine",geometry:["point"],terms:["condom","tampon","pad","woman","women","menstrual hygiene products","personal care"],tags:{amenity:"vending_machine",vending:"feminine_hygiene"},reference:{key:"vending",value:"feminine_hygiene"},name:"Feminine Hygiene Vending Machine"},"amenity/vending_machine/food":{icon:"temaki-vending_machine",geometry:["point"],terms:["food"],tags:{amenity:"vending_machine",vending:"food"},reference:{key:"vending",value:"food"},name:"Food Vending Machine"},"amenity/vending_machine/fuel":{icon:"maki-fuel",geometry:["point"],terms:["petrol","fuel","gasoline","propane","diesel","lng","cng","biodiesel"],tags:{amenity:"vending_machine",vending:"fuel"},reference:{key:"vending",value:"fuel"},name:"Gas Pump",matchScore:0.5},"amenity/vending_machine/ice_cream":{icon:"temaki-vending_machine",geometry:["point"],terms:["chocolate","ice cream","frozen","popsicle","vanilla"],tags:{amenity:"vending_machine",vending:"ice_cream"},reference:{key:"vending",value:"ice_cream"},name:"Ice Cream Vending Machine"},"amenity/vending_machine/newspapers":{icon:"far-newspaper",fields:["vending","operator","fee","payment_multi_fee","currency_multi"],geometry:["point"],terms:["newspaper"],tags:{amenity:"vending_machine",vending:"newspapers"},reference:{key:"vending",value:"newspapers"},name:"Newspaper Vending Machine"},"amenity/vending_machine/parcel_pickup_dropoff":{icon:"temaki-vending_machine",fields:["vending","operator","payment_multi","currency_multi"],geometry:["point"],terms:["mail","parcel","pickup"],tags:{amenity:"vending_machine",vending:"parcel_pickup;parcel_mail_in"},reference:{key:"vending",value:"parcel_pickup;parcel_mail_in"},name:"Parcel Pickup/Dropoff Locker"},"amenity/vending_machine/parcel_pickup":{icon:"temaki-vending_machine",fields:["vending","operator"],geometry:["point"],terms:["amazon","locker","mail","parcel","pickup"],tags:{amenity:"vending_machine",vending:"parcel_pickup"},reference:{key:"vending",value:"parcel_pickup"},name:"Parcel Pickup Locker"},"amenity/vending_machine/parking_tickets":{icon:"temaki-vending_machine",geometry:["point"],terms:["parking","ticket"],tags:{amenity:"vending_machine",vending:"parking_tickets"},reference:{key:"vending",value:"parking_tickets"},matchScore:0.94,name:"Parking Ticket Vending Machine"},"amenity/vending_machine/public_transport_tickets":{icon:"temaki-vending_machine",geometry:["point"],terms:["bus","train","ferry","rail","ticket","transportation"],tags:{amenity:"vending_machine",vending:"public_transport_tickets"},reference:{key:"vending",value:"public_transport_tickets"},name:"Transit Ticket Vending Machine"},"amenity/vending_machine/stamps":{icon:"temaki-vending_machine",geometry:["point"],terms:["mail","postage","stamp"],tags:{amenity:"vending_machine",vending:"stamps"},reference:{key:"vending",value:"stamps"},name:"Postage Vending Machine"},"amenity/vending_machine/sweets":{icon:"temaki-vending_machine",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:"temaki-veterinary_care",fields:["name","operator","address","building_area","opening_hours"],moreFields:["fee","payment_multi_fee","website","phone","email","fax","wheelchair"],geometry:["point","area"],terms:["pet clinic","veterinarian","animal hospital","pet doctor"],tags:{amenity:"veterinary"},name:"Veterinary"},"amenity/waste_basket":{icon:"maki-waste-basket",fields:["collection_times"],geometry:["point","vertex"],tags:{amenity:"waste_basket"},terms:["bin","garbage","rubbish","litter","trash"],name:"Waste Basket"},"amenity/waste_disposal":{icon:"fas-dumpster",fields:["operator","collection_times"],geometry:["point","vertex","area"],tags:{amenity:"waste_disposal"},terms:["garbage","rubbish","litter","trash"],name:"Garbage Dumpster"},"amenity/waste_transfer_station":{icon:"maki-waste-basket",fields:["name","operator","address","opening_hours","fee","payment_multi_fee"],moreFields:["website","phone","email","fax","wheelchair"],geometry:["point","area"],terms:["dump","garbage","recycling","rubbish","scrap","trash"],tags:{amenity:"waste_transfer_station"},name:"Waste Transfer Station"},"amenity/waste/dog_excrement":{icon:"maki-waste-basket",fields:["collection_times"],geometry:["point","vertex","area"],tags:{amenity:"waste_basket",waste:"dog_excrement"},reference:{key:"waste",value:"dog_excrement"},terms:["bin","garbage","rubbish","litter","trash","poo","dog"],name:"Dog Excrement Bin"},"amenity/water_point":{icon:"maki-drinking-water",fields:["operator","fee","payment_multi_fee"],geometry:["area","vertex","point"],tags:{amenity:"water_point"},name:"RV Drinking Water"},"amenity/watering_place":{icon:"maki-drinking-water",fields:["operator","fee","payment_multi_fee"],geometry:["area","vertex","point"],tags:{amenity:"watering_place"},name:"Animal Watering Place"},area:{fields:["name"],geometry:["area"],tags:{area:"yes"},terms:["polygon"],name:"Area",matchScore:0.1},"area/highway":{fields:["name","area/highway","surface"],geometry:["area"],terms:["area:highway","edge of pavement","highway area","highway shape","pavement","road shape","street area"],tags:{"area:highway":"*"},name:"Road Surface"},"attraction/amusement_ride":{icon:"maki-amusement-park",geometry:["point","area"],terms:["theme park","carnival ride"],tags:{attraction:"amusement_ride"},name:"Amusement Ride"},"attraction/animal":{icon:"maki-zoo",fields:["name","operator"],geometry:["point","area"],terms:["amphibian","animal park","aquarium","bear","bird","fish","insect","lion","mammal","monkey","penguin","reptile","safari","theme park","tiger","zoo"],tags:{attraction:"animal"},name:"Animal Enclosure"},"attraction/big_wheel":{icon:"maki-amusement-park",fields:["{attraction}","height"],geometry:["point"],terms:["ferris wheel","theme park","amusement ride"],tags:{attraction:"big_wheel"},name:"Big Wheel"},"attraction/bumper_car":{icon:"maki-car",geometry:["point","area"],terms:["theme park","dodgem cars","autoscooter"],tags:{attraction:"bumper_car"},name:"Bumper Car"},"attraction/bungee_jumping":{icon:"maki-pitch",fields:["{attraction}","height"],geometry:["point","area"],terms:["theme park","bungy jumping","jumping platform"],tags:{attraction:"bungee_jumping"},name:"Bungee Jumping"},"attraction/carousel":{icon:"temaki-amusement_park",fields:["{attraction}","building_area"],geometry:["point","area"],terms:["theme park","roundabout","merry-go-round","galloper","jumper","horseabout","flying horses"],tags:{attraction:"carousel"},name:"Carousel"},"attraction/dark_ride":{icon:"maki-rail-metro",fields:["{attraction}","building_area"],geometry:["point","line","area"],terms:["theme park","ghost train"],tags:{attraction:"dark_ride"},name:"Dark Ride"},"attraction/drop_tower":{icon:"temaki-tower",fields:["{attraction}","height"],geometry:["point","area"],terms:["theme park","amusement ride","gondola","tower","big drop"],tags:{attraction:"drop_tower"},name:"Drop Tower"},"attraction/maze":{icon:"maki-amusement-park",geometry:["point","area"],terms:["theme park","amusement ride","labyrinth"],tags:{attraction:"maze"},name:"Maze"},"attraction/pirate_ship":{icon:"maki-danger",geometry:["point"],terms:["theme park","carnival ride","amusement ride"],tags:{attraction:"pirate_ship"},name:"Pirate Ship"},"attraction/river_rafting":{icon:"maki-ferry",geometry:["point","line"],terms:["theme park","aquatic park","water park","rafting simulator","river rafting ride","river rapids ride"],tags:{attraction:"river_rafting"},name:"River Rafting"},"attraction/roller_coaster":{icon:"maki-amusement-park",geometry:["point","area"],terms:["theme park","amusement ride"],tags:{attraction:"roller_coaster"},name:"Roller Coaster"},"attraction/summer_toboggan":{geometry:["line"],terms:["alpine slide","mountain coaster"],tags:{attraction:"summer_toboggan"},name:"Summer Toboggan"},"attraction/train":{icon:"maki-rail",fields:["{attraction}","fee"],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:"fas-swimmer",fields:["{attraction}","height"],geometry:["line","area"],terms:["theme park","aquatic park","water park","flumes","water chutes","hydroslides"],tags:{attraction:"water_slide"},name:"Water Slide"},barrier:{icon:"maki-roadblock",geometry:["point","vertex","line","area"],tags:{barrier:"*"},fields:["barrier"],name:"Barrier",matchScore:0.4},"barrier/entrance":{icon:"maki-entrance-alt1",geometry:["vertex"],tags:{barrier:"entrance"},name:"Entrance",searchable:false},"barrier/block":{icon:"maki-roadblock",fields:["access","material"],geometry:["point","vertex"],tags:{barrier:"block"},name:"Block"},"barrier/bollard":{icon:"maki-roadblock",fields:["access","material"],geometry:["point","vertex","line"],tags:{barrier:"bollard"},name:"Bollard"},"barrier/border_control":{icon:"maki-roadblock",fields:["access","building_area"],moreFields:["address","website","phone","email","fax"],geometry:["vertex","area"],tags:{barrier:"border_control"},name:"Border Control"},"barrier/cattle_grid":{icon:"maki-barrier",geometry:["vertex"],tags:{barrier:"cattle_grid"},name:"Cattle Grid"},"barrier/chain":{icon:"maki-barrier",fields:["access"],geometry:["vertex","line"],tags:{barrier:"chain"},name:"Chain"},"barrier/city_wall":{icon:"temaki-wall",fields:["height","material"],geometry:["line","area"],tags:{barrier:"city_wall"},name:"City Wall"},"barrier/cycle_barrier":{icon:"maki-roadblock",fields:["access"],geometry:["vertex"],tags:{barrier:"cycle_barrier"},name:"Cycle Barrier"},"barrier/ditch":{icon:"maki-roadblock",geometry:["line","area"],tags:{barrier:"ditch"},name:"Trench",matchScore:0.25},"barrier/fence":{icon:"maki-fence",fields:["fence_type","height","material"],geometry:["line"],tags:{barrier:"fence"},name:"Fence",matchScore:0.25},"barrier/fence/railing":{icon:"temaki-railing",geometry:["line"],tags:{barrier:"fence",fence_type:"railing"},terms:["railing","handrail","guard rail"],name:"Railing",matchScore:0.5},"barrier/gate":{icon:"maki-barrier",fields:["access","opening_hours"],geometry:["vertex","line"],tags:{barrier:"gate"},name:"Gate"},"barrier/guard_rail":{icon:"temaki-guard_rail",fields:["material"],geometry:["line"],tags:{barrier:"guard_rail"},name:"Guard Rail",terms:["guardrail","traffic barrier","crash barrier","median barrier","roadside barrier","Armco barrier"],matchScore:0.75},"barrier/hedge":{fields:["height"],geometry:["line","area"],tags:{barrier:"hedge"},name:"Hedge",matchScore:0.25},"barrier/height_restrictor":{icon:"temaki-car_wash",fields:["maxheight"],geometry:["vertex"],tags:{barrier:"height_restrictor"},name:"Height Restrictor"},"barrier/kerb":{icon:"temaki-kerb-raised",fields:["kerb","tactile_paving","wheelchair"],moreFields:["material"],geometry:["vertex","line"],tags:{barrier:"kerb"},matchScore:0.95,name:"Curb"},"barrier/kerb/flush":{icon:"temaki-kerb-flush",fields:["kerb","{barrier/kerb}"],geometry:["vertex","line"],tags:{kerb:"flush"},addTags:{barrier:"kerb",kerb:"flush"},reference:{key:"kerb",value:"flush"},terms:["even curb","level curb","tactile curb"],name:"Flush Curb"},"barrier/kerb/lowered":{icon:"temaki-kerb-lowered",fields:["kerb","{barrier/kerb}","kerb/height"],geometry:["vertex","line"],tags:{kerb:"lowered"},addTags:{barrier:"kerb",kerb:"lowered"},reference:{key:"kerb",value:"lowered"},terms:["curb cut","curb ramp","kerb ramp","dropped kerb","pram ramp"],name:"Lowered Curb"},"barrier/kerb/raised":{icon:"temaki-kerb-raised",fields:["kerb","{barrier/kerb}","kerb/height"],geometry:["vertex","line"],tags:{kerb:"raised"},addTags:{barrier:"kerb",kerb:"raised"},reference:{key:"kerb",value:"raised"},terms:[],name:"Raised Curb"},"barrier/kerb/rolled":{icon:"temaki-kerb-rolled",fields:["kerb","{barrier/kerb}","kerb/height"],geometry:["vertex","line"],tags:{kerb:"rolled"},addTags:{barrier:"kerb",kerb:"rolled"},reference:{key:"kerb",value:"rolled"},terms:["gutter"],name:"Rolled Curb"},"barrier/kissing_gate":{icon:"maki-barrier",fields:["access"],geometry:["vertex"],tags:{barrier:"kissing_gate"},name:"Kissing Gate"},"barrier/lift_gate":{icon:"maki-roadblock",fields:["access"],geometry:["vertex","line"],tags:{barrier:"lift_gate"},name:"Lift Gate"},"barrier/retaining_wall":{icon:"temaki-wall",fields:["height","material"],geometry:["line","area"],tags:{barrier:"retaining_wall"},name:"Retaining Wall"},"barrier/sally_port":{icon:"fas-dungeon",geometry:["vertex"],tags:{barrier:"sally_port"},terms:["Postern","castle side gate"],name:"Sally Port"},"barrier/stile":{icon:"maki-roadblock",fields:["access"],geometry:["vertex"],tags:{barrier:"stile"},name:"Stile"},"barrier/toll_booth":{icon:"maki-roadblock",fields:["access","building_area","payment_multi","currency_multi"],moreFields:["address","email","fax","opening_hours","phone","website"],geometry:["vertex","area"],tags:{barrier:"toll_booth"},name:"Toll Booth"},"barrier/turnstile":{icon:"maki-roadblock",fields:["access"],geometry:["vertex"],terms:["baffle gate","turnstyle"],tags:{barrier:"turnstile"},name:"Turnstile"},"barrier/wall":{icon:"temaki-wall",fields:["wall","height","material"],geometry:["line","area"],tags:{barrier:"wall"},name:"Wall",matchScore:0.25},"boundary/administrative":{fields:["name","admin_level"],geometry:["line"],tags:{boundary:"administrative"},name:"Administrative Boundary",matchScore:0.5},"bridge/support":{icon:"fas-archway",fields:["bridge/support"],moreFields:["material","seamark/type"],geometry:["point","vertex","area"],tags:{"bridge:support":"*"},name:"Bridge Support"},"bridge/support/pier":{icon:"fas-archway",fields:["bridge/support"],moreFields:["material","seamark/type"],geometry:["point","vertex","area"],tags:{"bridge:support":"pier"},name:"Bridge Pier"},building_part:{icon:"maki-building",fields:["levels","height","building/material","roof/colour"],moreFields:["layer"],geometry:["area"],tags:{"building:part":"*"},matchScore:0.5,terms:["roof","simple 3D buildings"],name:"Building Part"},building:{icon:"maki-home",fields:["name","building","levels","height","address"],moreFields:["architect","building/material","layer","roof/colour","smoking","wheelchair"],geometry:["area"],tags:{building:"*"},matchScore:0.6,terms:[],name:"Building"},"building/bunker":{geometry:["area"],tags:{building:"bunker"},matchScore:0.5,name:"Bunker",searchable:false},"building/entrance":{icon:"maki-entrance-alt1",fields:[],moreFields:[],geometry:["vertex"],tags:{building:"entrance"},name:"Entrance/Exit",searchable:false},"building/train_station":{icon:"maki-building",geometry:["point","vertex","area"],tags:{building:"train_station"},matchScore:0.5,name:"Train Station Building",searchable:false},"building/apartments":{icon:"maki-building",geometry:["area"],tags:{building:"apartments"},matchScore:0.5,name:"Apartment Building"},"building/barn":{icon:"maki-farm",geometry:["area"],tags:{building:"barn"},matchScore:0.5,name:"Barn"},"building/boathouse":{icon:"maki-harbor",geometry:["area"],tags:{building:"boathouse"},matchScore:0.5,terms:[],name:"Boathouse"},"building/bungalow":{icon:"maki-home",geometry:["area"],tags:{building:"bungalow"},terms:["home","detached"],matchScore:0.5,name:"Bungalow"},"building/cabin":{icon:"maki-home",geometry:["area"],tags:{building:"cabin"},matchScore:0.5,name:"Cabin"},"building/carport":{icon:"fas-warehouse",fields:["{building}","capacity"],geometry:["area"],tags:{building:"carport"},matchScore:0.5,terms:["covered parking space","garage","car","porch"],name:"Carport"},"building/cathedral":{icon:"maki-place-of-worship",geometry:["area"],tags:{building:"cathedral"},matchScore:0.5,name:"Cathedral Building"},"building/chapel":{icon:"maki-place-of-worship",geometry:["area"],tags:{building:"chapel"},matchScore:0.5,name:"Chapel Building"},"building/church":{icon:"maki-place-of-worship",geometry:["area"],tags:{building:"church"},matchScore:0.5,name:"Church Building"},"building/civic":{icon:"maki-building",fields:["{building}","smoking"],geometry:["area"],tags:{building:"civic"},matchScore:0.5,name:"Civic Building"},"building/college":{icon:"maki-building",geometry:["area"],terms:["university"],tags:{building:"college"},matchScore:0.5,name:"College Building"},"building/commercial":{icon:"maki-suitcase",fields:["{building}","smoking"],geometry:["area"],tags:{building:"commercial"},matchScore:0.5,name:"Commercial Building"},"building/construction":{icon:"maki-building",geometry:["area"],tags:{building:"construction"},matchScore:0.5,name:"Building Under Construction"},"building/detached":{icon:"maki-home",geometry:["area"],tags:{building:"detached"},terms:["home","single","family","residence","dwelling"],matchScore:0.5,name:"Detached House"},"building/dormitory":{icon:"maki-building",fields:["{building}","smoking"],geometry:["area"],tags:{building:"dormitory"},matchScore:0.5,name:"Dormitory"},"building/farm_auxiliary":{icon:"maki-farm",geometry:["area"],tags:{building:"farm_auxiliary"},matchScore:0.5,name:"Farm Building"},"building/farm":{icon:"maki-farm",geometry:["area"],tags:{building:"farm"},matchScore:0.5,name:"Farm House"},"building/garage":{icon:"fas-warehouse",fields:["{building}","capacity"],geometry:["area"],tags:{building:"garage"},matchScore:0.5,name:"Garage"},"building/garages":{icon:"fas-warehouse",fields:["{building}","capacity"],geometry:["area"],tags:{building:"garages"},matchScore:0.5,name:"Garages"},"building/grandstand":{icon:"maki-building",geometry:["area"],tags:{building:"grandstand"},terms:["tribune","stand","stands","bleachers"],matchScore:0.5,name:"Grandstand"},"building/greenhouse":{icon:"maki-garden-centre",geometry:["area"],tags:{building:"greenhouse"},matchScore:0.5,name:"Greenhouse"},"building/hangar":{fields:["name"],geometry:["area"],tags:{building:"hangar"},matchScore:0.5,name:"Hangar Building"},"building/hospital":{icon:"maki-building",geometry:["area"],tags:{building:"hospital"},matchScore:0.5,name:"Hospital Building"},"building/hotel":{icon:"maki-building",fields:["{building}","smoking"],geometry:["area"],tags:{building:"hotel"},matchScore:0.5,name:"Hotel Building"},"building/house":{icon:"maki-home",geometry:["area"],tags:{building:"house"},terms:["home","family","residence","dwelling"],matchScore:0.5,name:"House"},"building/houseboat":{icon:"maki-home",geometry:["area"],tags:{building:"houseboat"},terms:["home","family","residence","dwelling"],matchScore:0.5,name:"Houseboat"},"building/hut":{icon:"maki-home",geometry:["area"],tags:{building:"hut"},matchScore:0.5,name:"Hut"},"building/industrial":{icon:"maki-industry",geometry:["area"],tags:{building:"industrial"},matchScore:0.5,name:"Industrial Building"},"building/kindergarten":{icon:"maki-building",geometry:["area"],terms:["kindergarden","pre-school"],tags:{building:"kindergarten"},matchScore:0.5,name:"Preschool/Kindergarten Building"},"building/mosque":{icon:"maki-place-of-worship",geometry:["area"],tags:{building:"mosque"},matchScore:0.5,name:"Mosque Building"},"building/pavilion":{icon:"maki-building",fields:["{building}","smoking"],geometry:["area"],terms:["sports"],tags:{building:"pavilion"},matchScore:0.5,name:"Pavilion Building"},"building/public":{icon:"maki-building",fields:["{building}","smoking"],geometry:["area"],tags:{building:"public"},matchScore:0.5,name:"Public Building"},"building/residential":{icon:"maki-residential-community",geometry:["area"],tags:{building:"residential"},matchScore:0.5,name:"Residential Building"},"building/retail":{icon:"maki-commercial",fields:["{building}","smoking"],geometry:["area"],tags:{building:"retail"},matchScore:0.5,name:"Retail Building"},"building/roof":{icon:"maki-shelter",fields:["{building}","layer"],geometry:["area"],tags:{building:"roof"},matchScore:0.5,name:"Roof"},"building/ruins":{icon:"temaki-ruins",geometry:["area"],tags:{building:"ruins"},matchScore:0.5,name:"Building Ruins"},"building/school":{icon:"maki-building",geometry:["area"],terms:["academy","elementary school","middle school","high school"],tags:{building:"school"},matchScore:0.5,name:"School Building"},"building/semidetached_house":{icon:"maki-home",geometry:["area"],tags:{building:"semidetached_house"},terms:["home","double","duplex","twin","family","residence","dwelling"],matchScore:0.5,name:"Semi-Detached House"},"building/service":{icon:"maki-home",geometry:["area"],tags:{building:"service"},matchScore:0.5,name:"Service Building"},"building/shed":{icon:"maki-home",geometry:["area"],tags:{building:"shed"},matchScore:0.5,name:"Shed"},"building/stable":{icon:"maki-horse-riding",geometry:["area"],tags:{building:"stable"},matchScore:0.5,name:"Stable"},"building/stadium":{icon:"maki-stadium",fields:["{building}","smoking"],geometry:["area"],tags:{building:"stadium"},matchScore:0.5,name:"Stadium Building"},"building/static_caravan":{icon:"maki-home",geometry:["area"],tags:{building:"static_caravan"},matchScore:0.5,name:"Static Mobile Home"},"building/temple":{icon:"maki-place-of-worship",geometry:["area"],tags:{building:"temple"},matchScore:0.5,name:"Temple Building"},"building/terrace":{icon:"maki-building",geometry:["area"],tags:{building:"terrace"},terms:["home","terrace","brownstone","family","residence","dwelling"],matchScore:0.5,name:"Row Houses"},"building/transportation":{icon:"maki-building",fields:["{building}","smoking"],geometry:["area"],tags:{building:"transportation"},matchScore:0.5,name:"Transportation Building"},"building/university":{icon:"maki-building",geometry:["area"],terms:["college"],tags:{building:"university"},matchScore:0.5,name:"University Building"},"building/warehouse":{icon:"maki-warehouse",geometry:["area"],tags:{building:"warehouse"},matchScore:0.5,name:"Warehouse"},"camp_site/camp_pitch":{icon:"maki-campsite",fields:["name","ref"],geometry:["point","area"],terms:["tent","rv"],tags:{camp_site:"camp_pitch"},name:"Camp Pitch"},club:{icon:"fas-handshake",fields:["name","club","operator","address","building_area","opening_hours"],moreFields:["access_simple","building/levels_building","height_building","email","fax","internet_access","internet_access/fee","internet_access/ssid","phone","website","wheelchair"],geometry:["point","area"],tags:{club:"*"},terms:["social"],name:"Club"},"club/sport":{icon:"maki-pitch",fields:["name","sport","{club}"],geometry:["point","area"],tags:{club:"sport"},terms:["athletics club","sporting club","sports association","sports society"],name:"Sports Club"},craft:{icon:"temaki-tools",fields:["name","craft","operator","address","building_area","opening_hours"],moreFields:["air_conditioning","building/levels_building","height_building","email","fax","internet_access","internet_access/fee","internet_access/ssid","phone","product","website","wheelchair"],geometry:["point","area"],tags:{craft:"*"},terms:[],name:"Craft"},"craft/jeweler":{icon:"maki-marker-stroked",geometry:["point","area"],tags:{craft:"jeweler"},reference:{key:"shop",value:"jewelry"},name:"Jeweler",searchable:false,replacement:"shop/jewelry"},"craft/locksmith":{icon:"maki-marker-stroked",geometry:["point","area"],tags:{craft:"locksmith"},reference:{key:"shop",value:"locksmith"},name:"Locksmith",searchable:false},"craft/optician":{icon:"maki-marker-stroked",geometry:["point","area"],tags:{craft:"optician"},reference:{key:"shop",value:"optician"},name:"Optician",searchable:false,replacement:"shop/optician"},"craft/tailor":{icon:"maki-clothing-store",geometry:["point","area"],terms:["clothes","suit"],tags:{craft:"tailor"},reference:{key:"shop",value:"tailor"},name:"Tailor",searchable:false},"craft/agricultural_engines":{icon:"temaki-tools",geometry:["point","area"],tags:{craft:"agricultural_engines"},name:"Argricultural Engines Mechanic"},"craft/basket_maker":{icon:"maki-art-gallery",geometry:["point","area"],tags:{craft:"basket_maker"},name:"Basket Maker"},"craft/beekeeper":{icon:"maki-farm",geometry:["point","area"],tags:{craft:"beekeeper"},name:"Beekeeper"},"craft/blacksmith":{icon:"temaki-tools",geometry:["point","area"],tags:{craft:"blacksmith"},name:"Blacksmith"},"craft/boatbuilder":{icon:"temaki-tools",geometry:["point","area"],tags:{craft:"boatbuilder"},matchScore:0.4,name:"Boat Builder"},"craft/bookbinder":{icon:"maki-library",geometry:["point","area"],terms:["book repair"],tags:{craft:"bookbinder"},name:"Bookbinder"},"craft/brewery":{icon:"temaki-storage_tank",fields:["{craft}","product"],geometry:["point","area"],terms:["alcohol","beer","beverage","bier","booze","cider"],tags:{craft:"brewery"},name:"Brewery"},"craft/carpenter":{icon:"temaki-tools",geometry:["point","area"],terms:["woodworker"],tags:{craft:"carpenter"},name:"Carpenter"},"craft/carpet_layer":{icon:"temaki-tools",geometry:["point","area"],tags:{craft:"carpet_layer"},name:"Carpet Layer"},"craft/caterer":{icon:"maki-restaurant",fields:["name","cuisine","{craft}"],geometry:["point","area"],tags:{craft:"caterer"},name:"Caterer"},"craft/chimney_sweeper":{icon:"temaki-chimney",geometry:["point","area"],tags:{craft:"chimney_sweeper"},name:"Chimney Sweeper"},"craft/clockmaker":{icon:"temaki-clock",geometry:["point","area"],tags:{craft:"clockmaker"},name:"Clockmaker"},"craft/confectionery":{icon:"maki-confectionery",geometry:["point","area"],terms:["sweet","candy"],tags:{craft:"confectionery"},name:"Candy Maker"},"craft/distillery":{icon:"temaki-storage_tank",fields:["{craft}","product"],geometry:["point","area"],terms:["alcohol","beverage","bourbon","booze","brandy","gin","hooch","liquor","mezcal","moonshine","rum","scotch","spirits","still","tequila","vodka","whiskey","whisky"],tags:{craft:"distillery"},name:"Distillery"},"craft/dressmaker":{icon:"maki-clothing-store",geometry:["point","area"],terms:["seamstress"],tags:{craft:"dressmaker"},name:"Dressmaker"},"craft/electrician":{icon:"temaki-power",geometry:["point","area"],terms:["power","wire"],tags:{craft:"electrician"},name:"Electrician"},"craft/electronics_repair":{icon:"temaki-tools",geometry:["point","area"],tags:{craft:"electronics_repair"},name:"Electronics Repair Shop"},"craft/floorer":{icon:"temaki-tools",geometry:["point","area"],tags:{craft:"floorer"},name:"Floorer"},"craft/gardener":{icon:"maki-garden-centre",geometry:["point","area"],terms:["landscaper","grounds keeper"],tags:{craft:"gardener"},name:"Gardener"},"craft/glaziery":{icon:"temaki-window",geometry:["point","area"],terms:["glass","stained-glass","window"],tags:{craft:"glaziery"},name:"Glaziery"},"craft/handicraft":{icon:"maki-art-gallery",geometry:["point","area"],tags:{craft:"handicraft"},name:"Handicraft"},"craft/hvac":{icon:"temaki-tools",geometry:["point","area"],terms:["heat*","vent*","air conditioning"],tags:{craft:"hvac"},name:"HVAC"},"craft/insulator":{icon:"temaki-tools",geometry:["point","area"],tags:{craft:"insulation"},name:"Insulator"},"craft/joiner":{icon:"temaki-tools",geometry:["point","area"],tags:{craft:"joiner"},terms:["furniture"],name:"Joiner"},"craft/key_cutter":{icon:"fas-key",geometry:["point","area"],tags:{craft:"key_cutter"},name:"Key Cutter"},"craft/metal_construction":{icon:"temaki-tools",geometry:["point","area"],tags:{craft:"metal_construction"},name:"Metal Construction"},"craft/painter":{icon:"fas-paint-roller",geometry:["point","area"],tags:{craft:"painter"},name:"Painter"},"craft/parquet_layer":{icon:"temaki-tools",geometry:["point","area"],tags:{craft:"parquet_layer"},name:"Parquet Layer"},"craft/photographer":{icon:"maki-attraction",geometry:["point","area"],tags:{craft:"photographer"},name:"Photographer"},"craft/photographic_laboratory":{icon:"fas-film",geometry:["point","area"],terms:["film"],tags:{craft:"photographic_laboratory"},name:"Photographic Laboratory"},"craft/plasterer":{icon:"temaki-tools",geometry:["point","area"],tags:{craft:"plasterer"},name:"Plasterer"},"craft/plumber":{icon:"temaki-plumber",geometry:["point","area"],terms:["pipe"],tags:{craft:"plumber"},name:"Plumber"},"craft/pottery":{icon:"maki-art-gallery",geometry:["point","area"],terms:["ceramic"],tags:{craft:"pottery"},name:"Pottery"},"craft/rigger":{icon:"temaki-tools",geometry:["point","area"],tags:{craft:"rigger"},name:"Rigger"},"craft/roofer":{icon:"temaki-tools",geometry:["point","area"],tags:{craft:"roofer"},name:"Roofer"},"craft/saddler":{icon:"temaki-tools",geometry:["point","area"],tags:{craft:"saddler"},name:"Saddler"},"craft/sailmaker":{icon:"temaki-tools",geometry:["point","area"],tags:{craft:"sailmaker"},name:"Sailmaker"},"craft/sawmill":{icon:"maki-logging",geometry:["point","area"],terms:["lumber"],tags:{craft:"sawmill"},name:"Sawmill"},"craft/scaffolder":{icon:"temaki-tools",geometry:["point","area"],tags:{craft:"scaffolder"},name:"Scaffolder"},"craft/sculptor":{icon:"maki-art-gallery",geometry:["point","area"],tags:{craft:"sculptor"},name:"Sculptor"},"craft/shoemaker":{icon:"maki-shoe",geometry:["point","area"],terms:["cobbler"],tags:{craft:"shoemaker"},name:"Shoemaker"},"craft/stonemason":{icon:"temaki-tools",geometry:["point","area"],terms:["masonry"],tags:{craft:"stonemason"},name:"Stonemason"},"craft/tiler":{icon:"temaki-tools",geometry:["point","area"],tags:{craft:"tiler"},name:"Tiler"},"craft/tinsmith":{icon:"temaki-tools",geometry:["point","area"],tags:{craft:"tinsmith"},name:"Tinsmith"},"craft/upholsterer":{icon:"temaki-tools",geometry:["point","area"],tags:{craft:"upholsterer"},name:"Upholsterer"},"craft/watchmaker":{icon:"maki-watch",geometry:["point","area"],tags:{craft:"watchmaker"},name:"Watchmaker"},"craft/window_construction":{icon:"temaki-window",geometry:["point","area"],terms:["glass"],tags:{craft:"window_construction"},name:"Window Construction"},"craft/winery":{icon:"maki-alcohol-shop",geometry:["point","area"],tags:{craft:"winery"},name:"Winery"},"emergency/designated":{fields:["emergency_combo"],geometry:["line"],tags:{emergency:"designated"},terms:[],name:"Emergency Access Designated",searchable:false,matchScore:0.01},"emergency/destination":{fields:["emergency_combo"],geometry:["line"],tags:{emergency:"destination"},terms:[],name:"Emergency Access Destination",searchable:false,matchScore:0.01},"emergency/no":{fields:["emergency_combo"],geometry:["line"],tags:{emergency:"no"},terms:[],name:"Emergency Access No",searchable:false,matchScore:0.01},"emergency/official":{fields:["emergency_combo"],geometry:["line"],tags:{emergency:"official"},terms:[],name:"Emergency Access Official",searchable:false,matchScore:0.01},"emergency/private":{fields:["emergency_combo"],geometry:["line"],tags:{emergency:"private"},terms:[],name:"Emergency Access Private",searchable:false,matchScore:0.01},"emergency/yes":{fields:["emergency_combo"],geometry:["line"],tags:{emergency:"yes"},terms:[],name:"Emergency Access Yes",searchable:false,matchScore:0.01},"emergency/ambulance_station":{icon:"fas-ambulance",fields:["name","operator","building_area","address"],moreFields:["website","phone","email","fax","wheelchair"],geometry:["point","area"],terms:["EMS","EMT","rescue"],tags:{emergency:"ambulance_station"},name:"Ambulance Station"},"emergency/defibrillator":{icon:"maki-defibrillator",fields:["indoor","ref","operator"],geometry:["point","vertex"],terms:["AED"],tags:{emergency:"defibrillator"},name:"Defibrillator"},"emergency/fire_alarm":{icon:"fas-bell",fields:["indoor","ref","operator"],geometry:["point","vertex"],tags:{emergency:"fire_alarm_box"},name:"Fire Alarm Call Box"},"emergency/fire_extinguisher":{icon:"fas-fire-extinguisher",fields:["indoor","ref","operator"],geometry:["point","vertex"],tags:{emergency:"fire_extinguisher"},name:"Fire Extinguisher"},"emergency/fire_hose":{icon:"fas-fire-extinguisher",fields:["indoor","ref","operator"],geometry:["point","vertex"],tags:{emergency:"fire_hose"},name:"Fire Hose"},"emergency/fire_hydrant":{icon:"temaki-fire_hydrant",fields:["ref","fire_hydrant/type","colour","water_source","couplings"],moreFields:["fire_hydrant/pressure","fire_hydrant/diameter","water_volume","survey/date"],geometry:["point","vertex"],terms:["fire plug","fire water well","hydrant"],tags:{emergency:"fire_hydrant"},name:"Fire Hydrant"},"emergency/first_aid_kit":{icon:"fas-medkit",fields:["indoor","ref","operator"],geometry:["point","vertex"],terms:["bandage","first aid","med","med kit","medic*","medkit"],tags:{emergency:"first_aid_kit"},name:"First Aid Kit"},"emergency/life_ring":{icon:"fas-life-ring",fields:["ref","operator"],geometry:["point","vertex"],terms:["life buoy","kisby ring","kisbie ring","perry buoy"],tags:{emergency:"life_ring"},name:"Life Ring"},"emergency/lifeguard":{icon:"fas-life-ring",fields:["ref","operator","building_area","opening_hours"],geometry:["point","area"],terms:["CPR","rescue"],tags:{emergency:"lifeguard"},name:"Lifeguard"},"emergency/phone":{icon:"maki-emergency-phone",fields:["ref","operator","covered","indoor","booth"],geometry:["point","vertex"],tags:{emergency:"phone"},name:"Emergency Phone"},"emergency/siren":{icon:"fas-volume-up",fields:["siren/purpose","siren/type","ref","operator"],geometry:["point","vertex"],terms:["air raid","loud","noise","storm","tornado","warning"],tags:{emergency:"siren"},name:"Siren"},"emergency/water_tank":{icon:"maki-water",fields:["name","ref","operator"],geometry:["point","vertex"],terms:["water tank","cistern","reservoir"],tags:{emergency:"water_tank"},name:"Emergency Water Tank"},entrance:{icon:"maki-entrance-alt1",geometry:["vertex"],terms:["entrance","exit","door"],tags:{entrance:"*"},fields:["entrance","door","access_simple","address"],matchScore:0.8,name:"Entrance/Exit"},ford:{geometry:["vertex"],tags:{ford:"yes"},name:"Ford"},"golf/bunker":{icon:"maki-golf",fields:["name"],geometry:["area"],tags:{golf:"bunker",natural:"sand"},terms:["hazard","bunker"],reference:{key:"golf",value:"bunker"},name:"Sand Trap"},"golf/cartpath":{icon:"temaki-golf_cart",fields:["{golf/path}","maxspeed"],geometry:["line"],tags:{golf:"cartpath"},addTags:{golf:"cartpath",golf_cart:"designated",highway:"service"},reference:{key:"golf",value:"cartpath"},name:"Golf Cartpath"},"golf/driving_range":{icon:"maki-golf",fields:["name","capacity"],geometry:["area"],tags:{golf:"driving_range",landuse:"grass"},reference:{key:"golf",value:"driving_range"},name:"Driving Range"},"golf/fairway":{icon:"maki-golf",fields:["name"],geometry:["area"],tags:{golf:"fairway",landuse:"grass"},reference:{key:"golf",value:"fairway"},name:"Fairway"},"golf/green":{icon:"maki-golf",fields:["name"],geometry:["area"],tags:{golf:"green",landuse:"grass",leisure:"pitch",sport:"golf"},reference:{key:"golf",value:"green"},name:"Putting Green"},"golf/hole":{icon:"maki-golf",fields:["name","ref_golf_hole","par","handicap"],geometry:["line"],tags:{golf:"hole"},name:"Golf Hole"},"golf/lateral_water_hazard":{icon:"maki-golf",fields:["name"],geometry:["area"],tags:{golf:"lateral_water_hazard",natural:"water"},reference:{key:"golf",value:"lateral_water_hazard"},name:"Lateral Water Hazard"},"golf/path":{icon:"maki-golf",fields:["name","surface","width","structure","incline"],geometry:["line"],tags:{golf:"path"},addTags:{golf:"path",highway:"path",foot:"designated"},reference:{key:"golf",value:"path"},name:"Golf Walking Path"},"golf/rough":{icon:"maki-golf",fields:["name"],geometry:["area"],tags:{golf:"rough",landuse:"grass"},reference:{key:"golf",value:"rough"},name:"Rough"},"golf/tee":{icon:"maki-golf",fields:["name"],geometry:["area"],tags:{golf:"tee",landuse:"grass"},terms:["teeing ground"],reference:{key:"golf",value:"tee"},name:"Tee Box"},"golf/water_hazard":{icon:"maki-golf",fields:["name"],geometry:["area"],tags:{golf:"water_hazard",natural:"water"},reference:{key:"golf",value:"water_hazard"},name:"Water Hazard"},healthcare:{icon:"maki-hospital",fields:["name","healthcare","operator","healthcare/speciality","address","building_area"],moreFields:["building/levels_building","height_building","opening_hours","payment_multi","brand","website","phone","email","fax","wheelchair"],geometry:["point","area"],tags:{healthcare:"*"},terms:["clinic","doctor","disease","health","institution","sick","surgery","wellness"],name:"Healthcare Facility"},"healthcare/alternative":{icon:"maki-hospital",geometry:["point","area"],terms:["acupuncture","anthroposophical","applied kinesiology","aromatherapy","ayurveda","herbalism","homeopathy","hydrotherapy","hypnosis","naturopathy","osteopathy","reflexology","reiki","shiatsu","traditional","tuina","unani"],tags:{healthcare:"alternative"},name:"Alternative Medicine"},"healthcare/alternative/chiropractic":{icon:"maki-hospital",geometry:["point","area"],terms:["back","pain","spine"],tags:{healthcare:"alternative","healthcare:speciality":"chiropractic"},name:"Chiropractor"},"healthcare/audiologist":{icon:"maki-hospital",geometry:["point","area"],terms:["ear","hearing","sound"],tags:{healthcare:"audiologist"},name:"Audiologist"},"healthcare/birthing_center":{icon:"fas-baby",geometry:["point","area"],terms:["baby","childbirth","delivery","labour","labor","pregnancy"],tags:{healthcare:"birthing_center"},name:"Birthing Center"},"healthcare/blood_donation":{icon:"maki-blood-bank",fields:["{healthcare}","blood_components"],geometry:["point","area"],terms:["blood bank","blood donation","blood transfusion","apheresis","plasmapheresis","plateletpheresis","stem cell donation"],tags:{healthcare:"blood_donation"},name:"Blood Donor Center"},"healthcare/hospice":{icon:"maki-hospital",geometry:["point","area"],terms:["terminal","illness"],tags:{healthcare:"hospice"},name:"Hospice"},"healthcare/laboratory":{icon:"fas-vial",fields:["name","operator","website","ref","address","opening_hours"],geometry:["point","area"],terms:["medical_laboratory","medical_lab","blood_check"],tags:{healthcare:"laboratory"},name:"Medical Laboratory"},"healthcare/midwife":{icon:"maki-hospital",geometry:["point","area"],terms:["baby","childbirth","delivery","labour","labor","pregnancy"],tags:{healthcare:"midwife"},name:"Midwife"},"healthcare/occupational_therapist":{icon:"maki-hospital",geometry:["point","area"],terms:["therapist","therapy"],tags:{healthcare:"occupational_therapist"},name:"Occupational Therapist"},"healthcare/optometrist":{icon:"fas-eye",geometry:["point","area"],terms:["eye","glasses","lasik","lenses","vision"],tags:{healthcare:"optometrist"},name:"Optometrist"},"healthcare/physiotherapist":{icon:"temaki-physiotherapist",geometry:["point","area"],terms:["physical","therapist","therapy"],tags:{healthcare:"physiotherapist"},name:"Physiotherapist"},"healthcare/podiatrist":{icon:"maki-hospital",geometry:["point","area"],terms:["foot","feet","nails"],tags:{healthcare:"podiatrist"},name:"Podiatrist"},"healthcare/psychotherapist":{icon:"maki-hospital",geometry:["point","area"],terms:["anxiety","counselor","depression","mental health","mind","suicide","therapist","therapy"],tags:{healthcare:"psychotherapist"},name:"Psychotherapist"},"healthcare/rehabilitation":{icon:"maki-hospital",geometry:["point","area"],terms:["rehab","therapist","therapy"],tags:{healthcare:"rehabilitation"},name:"Rehabilitation Facility"},"healthcare/speech_therapist":{icon:"fas-comment",geometry:["point","area"],terms:["speech","therapist","therapy","voice"],tags:{healthcare:"speech_therapist"},name:"Speech Therapist"},"highway/bus_stop":{icon:"maki-bus",fields:["name","network","operator","bench","shelter"],geometry:["point","vertex"],tags:{highway:"bus_stop"},matchScore:0.95,name:"Bus Stop",searchable:false,replacement:"public_transport/platform/bus_point"},"highway/crossing":{fields:["crossing"],geometry:["vertex"],tags:{highway:"crossing"},searchable:false,matchScore:0.95,name:"Crossing"},"highway/bridleway":{fields:["name","surface","width","structure","access","incline","horse_scale"],moreFields:["covered","dog","lit","maxweight_bridge","smoothness","wheelchair"],icon:"maki-horse-riding",geometry:["line"],tags:{highway:"bridleway"},terms:["bridleway","equestrian","horse","trail"],name:"Bridle Path"},"highway/bus_guideway":{icon:"maki-bus",fields:["name","operator","oneway","structure","covered"],moreFields:["trolley_wire"],geometry:["line"],tags:{highway:"bus_guideway"},addTags:{highway:"bus_guideway",access:"no",bus:"designated"},terms:[],name:"Bus Guideway"},"highway/construction":{icon:"maki-barrier",fields:["name","opening_date","check_date","note","oneway","structure","access"],geometry:["line"],tags:{highway:"construction",access:"no"},terms:["closed","closure","construction"],name:"Road Closed"},"highway/corridor":{icon:"temaki-pedestrian",fields:["name","width","level","access_simple","wheelchair"],moreFields:["maxheight"],geometry:["line"],tags:{highway:"corridor"},terms:["gallery","hall","hallway","indoor","passage","passageway"],name:"Indoor Corridor"},"highway/crossing/zebra-raised":{icon:"temaki-pedestrian",fields:["crossing","tactile_paving"],geometry:["vertex"],tags:{highway:"crossing",crossing:"zebra",traffic_calming:"table"},reference:{key:"traffic_calming",value:"table"},terms:["zebra crossing","marked crossing","crosswalk","flat top","hump","speed","slow"],name:"Marked Crosswalk (Raised)",searchable:false},"highway/crossing/zebra":{icon:"temaki-pedestrian",fields:["crossing","tactile_paving"],geometry:["vertex"],tags:{highway:"crossing",crossing:"zebra"},reference:{key:"highway",value:"crossing"},terms:["zebra crossing","marked crossing","crosswalk"],name:"Marked Crosswalk",searchable:false},"highway/crossing/marked-raised":{icon:"temaki-pedestrian",fields:["crossing","tactile_paving"],geometry:["vertex"],tags:{crossing:"marked",traffic_calming:"table"},addTags:{highway:"crossing",crossing:"marked",traffic_calming:"table"},reference:{key:"traffic_calming",value:"table"},terms:["zebra crossing","marked crossing","crosswalk","flat top","hump","speed","slow"],name:"Marked Crosswalk (Raised)"},"highway/crossing/marked":{icon:"temaki-pedestrian",fields:["crossing","tactile_paving"],geometry:["vertex"],tags:{crossing:"marked"},addTags:{highway:"crossing",crossing:"marked"},reference:{key:"highway",value:"crossing"},terms:["zebra crossing","marked crossing","crosswalk"],name:"Marked Crosswalk"},"highway/crossing/unmarked-raised":{icon:"temaki-pedestrian",fields:["crossing","tactile_paving"],geometry:["vertex"],tags:{highway:"crossing",crossing:"unmarked",traffic_calming:"table"},reference:{key:"traffic_calming",value:"table"},terms:["flat top","hump","speed","slow"],name:"Unmarked Crossing (Raised)"},"highway/crossing/unmarked":{icon:"temaki-pedestrian",fields:["crossing","tactile_paving"],geometry:["vertex"],tags:{crossing:"unmarked"},addTags:{highway:"crossing",crossing:"unmarked"},reference:{key:"crossing",value:"unmarked"},terms:[],name:"Unmarked Crossing"},"highway/cycleway":{icon:"maki-bicycle",fields:["name","oneway","surface","width","structure","access","incline"],moreFields:["covered","dog","lit","maxspeed","maxweight_bridge","smoothness","wheelchair"],geometry:["line"],tags:{highway:"cycleway"},terms:["bike path","bicyle path"],matchScore:0.9,name:"Cycle Path"},"highway/cycleway/crossing":{icon:"maki-bicycle",fields:["crossing","access","surface","tactile_paving"],geometry:["line"],tags:{cycleway:"crossing"},addTags:{highway:"cycleway",cycleway:"crossing"},reference:{key:"cycleway",value:"crossing"},searchable:false,matchScore:0.95,name:"Cycle Crossing"},"highway/cycleway/bicycle_foot":{icon:"maki-bicycle",geometry:["line"],tags:{highway:"cycleway",foot:"designated"},addTags:{highway:"cycleway",foot:"designated",bicycle:"designated"},terms:["bicycle and foot path","mixed-use trail","multi-use trail","segregated trail"],matchScore:0.95,name:"Cycle & Foot Path"},"highway/cycleway/crossing/marked":{icon:"maki-bicycle",fields:["crossing","access","surface","tactile_paving"],geometry:["line"],tags:{cycleway:"crossing",crossing:"marked"},addTags:{highway:"cycleway",cycleway:"crossing",crossing:"marked"},reference:{key:"cycleway",value:"crossing"},terms:["cycle crosswalk","cycle path crossing","cycleway crossing","bicycle crossing","bike crossing"],name:"Marked Cycle Crossing"},"highway/cycleway/crossing/unmarked":{icon:"maki-bicycle",fields:["crossing","access","surface","tactile_paving"],geometry:["line"],tags:{cycleway:"crossing",crossing:"unmarked"},addTags:{highway:"cycleway",cycleway:"crossing",crossing:"unmarked"},reference:{key:"cycleway",value:"crossing"},terms:["cycle path crossing","cycleway crossing","bicycle crossing","bike crossing"],name:"Unmarked Cycle Crossing"},"highway/elevator":{icon:"temaki-elevator",fields:["access_simple","opening_hours","maxweight","ref","wheelchair"],moreFields:["maxheight"],geometry:["vertex"],tags:{highway:"elevator"},terms:["lift"],name:"Elevator"},"highway/emergency_bay":{icon:"maki-car",geometry:["vertex"],tags:{highway:"emergency_bay"},terms:["Highway Emergency Bay"],name:"Emergency Stopping Place"},"highway/footway":{icon:"temaki-pedestrian",fields:["name","surface","width","structure","access","incline"],moreFields:["covered","dog","lit","maxweight_bridge","smoothness","wheelchair"],geometry:["line"],terms:["hike","hiking","promenade","trackway","trail","walk"],tags:{highway:"footway"},matchScore:0.9,name:"Foot Path"},"highway/footway/crossing":{fields:["crossing","access","surface","tactile_paving"],geometry:["line"],tags:{footway:"crossing"},addTags:{highway:"footway",footway:"crossing"},reference:{key:"footway",value:"crossing"},matchScore:0.95,searchable:false,name:"Pedestrian Crossing"},"highway/footway/zebra-raised":{icon:"temaki-pedestrian",fields:["crossing","access","surface","tactile_paving"],geometry:["line"],tags:{highway:"footway",footway:"crossing",crossing:"zebra",traffic_calming:"table"},reference:{key:"traffic_calming",value:"table"},terms:["zebra crossing","marked crossing","crosswalk","flat top","hump","speed","slow"],name:"Marked Crosswalk (Raised)",searchable:false},"highway/footway/zebra":{icon:"temaki-pedestrian",fields:["crossing","access","surface","tactile_paving"],geometry:["line"],tags:{highway:"footway",footway:"crossing",crossing:"zebra"},reference:{key:"footway",value:"crossing"},terms:["zebra crossing","marked crossing","crosswalk"],name:"Marked Crosswalk",searchable:false},"highway/footway/conveying":{icon:"temaki-pedestrian",fields:["name","conveying","access_simple","lit","width","wheelchair"],geometry:["line"],terms:["moving sidewalk","autwalk","skywalk","travolator","travelator","travellator","conveyor"],tags:{highway:"footway",conveying:"*"},name:"Moving Walkway"},"highway/footway/marked-raised":{icon:"temaki-pedestrian",fields:["crossing","access","surface","tactile_paving"],geometry:["line"],tags:{footway:"crossing",crossing:"marked",traffic_calming:"table"},addTags:{highway:"footway",footway:"crossing",crossing:"marked",traffic_calming:"table"},reference:{key:"traffic_calming",value:"table"},terms:["zebra crossing","marked crossing","crosswalk","flat top","hump","speed","slow"],name:"Marked Crosswalk (Raised)"},"highway/footway/marked":{icon:"temaki-pedestrian",fields:["crossing","access","surface","tactile_paving"],geometry:["line"],tags:{footway:"crossing",crossing:"marked"},addTags:{highway:"footway",footway:"crossing",crossing:"marked"},reference:{key:"footway",value:"crossing"},terms:["marked foot path crossing","marked crossing","marked pedestrian crosswalk","zebra crossing"],name:"Marked Crosswalk"},"highway/footway/sidewalk":{icon:"temaki-pedestrian",geometry:["line"],tags:{footway:"sidewalk"},addTags:{highway:"footway",footway:"sidewalk"},reference:{key:"footway",value:"sidewalk"},terms:["pavement","sidepath"],name:"Sidewalk"},"highway/footway/unmarked-raised":{icon:"temaki-pedestrian",fields:["crossing","access","surface","tactile_paving"],geometry:["line"],tags:{footway:"crossing",crossing:"unmarked",traffic_calming:"table"},addTags:{highway:"footway",footway:"crossing",crossing:"unmarked",traffic_calming:"table"},reference:{key:"traffic_calming",value:"table"},terms:["flat top","hump","speed","slow"],name:"Unmarked Crossing (Raised)"},"highway/footway/unmarked":{icon:"temaki-pedestrian",fields:["crossing","access","surface","tactile_paving"],geometry:["line"],tags:{footway:"crossing",crossing:"unmarked"},addTags:{highway:"footway",footway:"crossing",crossing:"unmarked"},reference:{key:"footway",value:"crossing"},terms:["unmarked foot path crossing","unmarked crosswalk","unmarked pedestrian crossing"],name:"Unmarked Crossing"},"highway/give_way":{icon:"temaki-yield",fields:["direction_vertex"],geometry:["vertex"],tags:{highway:"give_way"},terms:["give way","yield","sign"],name:"Yield Sign"},"highway/living_street":{icon:"iD-highway-living-street",fields:["name","oneway","maxspeed","lanes","surface","structure","access"],moreFields:["covered","cycleway","flood_prone","junction_line","lit","maxheight","maxweight_bridge","oneway/bicycle","smoothness","trolley_wire"],geometry:["line"],tags:{highway:"living_street"},name:"Living Street"},"highway/milestone":{icon:"temaki-milestone",geometry:["point","vertex"],fields:["distance","direction_vertex"],tags:{highway:"milestone"},terms:["mile marker","mile post","mile stone","mileage marker","milemarker","milepost"],name:"Highway Milestone"},"highway/mini_roundabout":{icon:"maki-circle-stroked",geometry:["vertex"],terms:["traffic circle"],tags:{highway:"mini_roundabout"},fields:["direction_clock"],name:"Mini-Roundabout"},"highway/motorway_junction":{icon:"temaki-junction",fields:["ref_highway_junction","name"],geometry:["vertex"],tags:{highway:"motorway_junction"},terms:["exit"],name:"Motorway Junction / Exit"},"highway/motorway_link":{icon:"iD-highway-motorway-link",fields:["destination_oneway","destination/ref_oneway","junction/ref_oneway","oneway","maxspeed","lanes","surface","structure","access"],moreFields:["covered","destination/symbol_oneway","incline","junction_line","lit","maxheight","maxspeed/advisory","maxweight_bridge","name","ref_road_number","smoothness","toll"],geometry:["line"],tags:{highway:"motorway_link"},addTags:{highway:"motorway_link",oneway:"yes"},terms:["exit","ramp","road","street","on ramp","off ramp"],name:"Motorway Link"},"highway/motorway":{icon:"iD-highway-motorway",fields:["name","ref_road_number","oneway_yes","maxspeed","lanes","surface","structure","access"],moreFields:["covered","incline","junction_line","lit","maxheight","maxweight_bridge","minspeed","smoothness","toll"],geometry:["line"],tags:{highway:"motorway"},terms:["autobahn","expressway","freeway","highway","interstate","parkway","road","street","thruway","turnpike"],name:"Motorway"},"highway/passing_place":{icon:"maki-circle-stroked",geometry:["vertex"],tags:{highway:"passing_place"},terms:["turnout, pullout"],name:"Passing Place"},"highway/path":{icon:"iD-other-line",fields:["name","surface","width","structure","access","incline"],moreFields:["wheelchair","lit","smoothness","trail_visibility","sac_scale","maxweight_bridge","mtb/scale","mtb/scale/uphill","mtb/scale/imba","horse_scale","covered","ref","dog"],geometry:["line"],terms:["hike","hiking","trackway","trail","walk"],tags:{highway:"path"},name:"Path"},"highway/pedestrian_area":{icon:"temaki-pedestrian",fields:["name","surface","lit","width","structure","access"],geometry:["area"],tags:{highway:"pedestrian",area:"yes"},terms:["center","centre","plaza","quad","square","walkway"],name:"Pedestrian Area"},"highway/pedestrian_line":{icon:"temaki-pedestrian",fields:["name","surface","lit","width","oneway","structure","access"],moreFields:["covered","incline","maxweight_bridge","smoothness"],geometry:["line"],tags:{highway:"pedestrian"},terms:["center","centre","plaza","quad","square","walkway"],name:"Pedestrian Street"},"highway/primary_link":{icon:"iD-highway-primary-link",fields:["destination_oneway","destination/ref_oneway","oneway","maxspeed","lanes","surface","structure","access"],moreFields:["covered","cycleway","destination/symbol_oneway","flood_prone","incline","junction/ref_oneway","junction_line","lit","maxheight","maxspeed/advisory","maxweight_bridge","name","oneway/bicycle","ref_road_number","smoothness","toll","trolley_wire"],geometry:["line"],tags:{highway:"primary_link"},terms:["on ramp","off ramp","ramp","road","street"],name:"Primary Link"},"highway/primary":{icon:"iD-highway-primary",fields:["name","oneway","maxspeed","lanes","surface","structure","ref_road_number","access"],moreFields:["covered","cycleway","flood_prone","incline","junction_line","lit","maxheight","maxspeed/advisory","maxweight_bridge","oneway/bicycle","smoothness","toll","trolley_wire"],geometry:["line"],tags:{highway:"primary"},terms:["road","street"],name:"Primary Road"},"highway/raceway":{icon:"fas-flag-checkered",fields:["name","oneway","surface","sport_racing_motor","lit","width","lanes","structure"],geometry:["point","line","area"],tags:{highway:"raceway"},addTags:{highway:"raceway",sport:"motor"},terms:["auto*","formula one","kart","motocross","nascar","race*","track"],name:"Racetrack (Motorsport)"},"highway/residential":{icon:"iD-highway-residential",fields:["name","oneway","maxspeed","lanes","surface","structure","access"],moreFields:["covered","cycleway","flood_prone","incline","junction_line","lit","oneway/bicycle","maxheight","maxspeed/advisory","maxweight_bridge","smoothness","trolley_wire"],geometry:["line"],tags:{highway:"residential"},terms:["road","street"],name:"Residential Road"},"highway/rest_area":{icon:"maki-car",fields:["name","operator","opening_hours"],moreFields:["address","website","phone","email","fax","wheelchair"],geometry:["point","vertex","area"],tags:{highway:"rest_area"},terms:["rest stop"],name:"Rest Area"},"highway/road":{icon:"iD-other-line",fields:["highway","{highway/residential}"],moreFields:["{highway/residential}"],geometry:["line"],tags:{highway:"road"},terms:["road","street"],name:"Unknown Road"},"highway/secondary_link":{icon:"iD-highway-secondary-link",fields:["{highway/primary_link}"],moreFields:["{highway/primary_link}"],geometry:["line"],tags:{highway:"secondary_link"},terms:["on ramp","off ramp","ramp","road","street"],name:"Secondary Link"},"highway/secondary":{icon:"iD-highway-secondary",fields:["{highway/primary}"],moreFields:["{highway/primary}"],geometry:["line"],tags:{highway:"secondary"},terms:["road","street"],name:"Secondary Road"},"highway/service":{icon:"iD-highway-service",fields:["name","service","oneway","maxspeed","surface","covered","structure","access"],moreFields:["flood_prone","incline","lanes","lit","maxheight","maxspeed/advisory","maxweight_bridge","oneway/bicycle","trolley_wire"],geometry:["line"],tags:{highway:"service"},terms:["road","street"],matchScore:0.9,name:"Service Road"},"highway/service/alley":{icon:"iD-highway-service",geometry:["line"],tags:{service:"alley"},addTags:{highway:"service",service:"alley"},reference:{key:"service",value:"alley"},name:"Alley"},"highway/service/drive-through":{icon:"iD-highway-service",geometry:["line"],tags:{service:"drive-through"},addTags:{highway:"service",service:"drive-through"},reference:{key:"service",value:"drive-through"},name:"Drive-Through"},"highway/service/driveway":{icon:"iD-highway-service",geometry:["line"],tags:{service:"driveway"},addTags:{highway:"service",service:"driveway"},reference:{key:"service",value:"driveway"},name:"Driveway"},"highway/service/emergency_access":{icon:"iD-highway-service",geometry:["line"],tags:{service:"emergency_access"},addTags:{highway:"service",service:"emergency_access"},reference:{key:"service",value:"emergency_access"},name:"Emergency Access"},"highway/service/parking_aisle":{icon:"iD-highway-service",geometry:["line"],tags:{service:"parking_aisle"},addTags:{highway:"service",service:"parking_aisle"},reference:{key:"service",value:"parking_aisle"},name:"Parking Aisle"},"highway/services":{icon:"maki-car",fields:["{highway/rest_area}"],moreFields:["{highway/rest_area}"],geometry:["point","vertex","area"],tags:{highway:"services"},terms:["services","travel plaza","service station"],name:"Service Area"},"highway/speed_camera":{icon:"maki-attraction",geometry:["point","vertex"],fields:["direction","ref","maxspeed"],tags:{highway:"speed_camera"},terms:[],name:"Speed Camera"},"highway/steps":{icon:"iD-highway-steps",fields:["incline_steps","handrail","step_count","surface","lit","width"],moreFields:["covered","dog"],geometry:["line"],tags:{highway:"steps"},terms:["stairs","staircase","stairway"],name:"Steps"},"highway/steps/conveying":{icon:"maki-entrance",fields:["name","incline_steps","conveying","access_simple","lit","width","handrail","step_count"],geometry:["line"],terms:["moving staircase","moving stairway","people mover"],tags:{highway:"steps",conveying:"*"},name:"Escalator"},"highway/stop":{icon:"temaki-stop",fields:["stop","direction_vertex"],geometry:["vertex"],tags:{highway:"stop"},terms:["stop","halt","sign"],name:"Stop Sign"},"highway/street_lamp":{icon:"temaki-bulb",geometry:["point","vertex"],tags:{highway:"street_lamp"},fields:["lamp_type","direction","ref"],terms:["streetlight","street light","lamp","light","gaslight"],name:"Street Lamp"},"highway/tertiary_link":{icon:"iD-highway-tertiary-link",fields:["{highway/primary_link}"],moreFields:["{highway/primary_link}"],geometry:["line"],tags:{highway:"tertiary_link"},terms:["on ramp","off ramp","ramp","road","street"],name:"Tertiary Link"},"highway/tertiary":{icon:"iD-highway-tertiary",fields:["{highway/primary}"],moreFields:["{highway/primary}"],geometry:["line"],tags:{highway:"tertiary"},terms:["road","street"],name:"Tertiary Road"},"highway/track":{icon:"fas-truck-monster",fields:["name","tracktype","surface","width","structure","access","incline","smoothness"],moreFields:["covered","flood_prone","horse_scale","maxweight_bridge","mtb/scale","mtb/scale/uphill","mtb/scale/imba"],geometry:["line"],tags:{highway:"track"},terms:["woods road","forest road","logging road","fire road","farm road","agricultural road","ranch road","carriage road","primitive","unmaintained","rut","offroad","4wd","4x4","four wheel drive","atv","quad","jeep","double track","two track"],name:"Unmaintained Track Road"},"highway/traffic_mirror":{geometry:["point","vertex"],fields:["direction"],tags:{highway:"traffic_mirror"},terms:["blind spot","convex","corner","curved","roadside","round","safety","sphere","visibility"],name:"Traffic Mirror"},"highway/traffic_signals":{icon:"temaki-traffic_signals",geometry:["vertex"],tags:{highway:"traffic_signals"},fields:["traffic_signals","traffic_signals/direction"],terms:["light","stoplight","traffic light"],name:"Traffic Signals"},"highway/trailhead":{icon:"fas-hiking",fields:["name","operator","elevation","address","access_simple","fee","payment_multi_fee"],moreFields:["opening_hours"],geometry:["vertex"],tags:{highway:"trailhead"},terms:["hiking","mile zero","mountain biking","mountaineering","trail endpoint","trail start","staging area","trekking"],name:"Trailhead"},"highway/trunk_link":{icon:"iD-highway-trunk-link",fields:["{highway/motorway_link}"],moreFields:["{highway/motorway_link}"],geometry:["line"],tags:{highway:"trunk_link"},terms:["on ramp","off ramp","ramp","road","street"],name:"Trunk Link"},"highway/trunk":{icon:"iD-highway-trunk",fields:["name","ref_road_number","oneway","maxspeed","lanes","surface","structure","access"],moreFields:["covered","incline","junction_line","lit","maxheight","minspeed","maxweight_bridge","smoothness","toll"],geometry:["line"],tags:{highway:"trunk"},terms:["road","street"],name:"Trunk Road"},"highway/turning_circle":{icon:"maki-circle-stroked",geometry:["vertex"],tags:{highway:"turning_circle"},terms:["cul-de-sac"],name:"Turning Circle"},"highway/turning_loop":{icon:"maki-circle",geometry:["vertex"],tags:{highway:"turning_loop"},terms:["cul-de-sac"],name:"Turning Loop (Island)"},"highway/unclassified":{icon:"iD-highway-unclassified",fields:["{highway/residential}"],moreFields:["{highway/residential}"],geometry:["line"],tags:{highway:"unclassified"},terms:["road","street"],name:"Minor/Unclassified Road"},historic:{icon:"temaki-ruins",fields:["historic","inscription"],geometry:["point","vertex","line","area"],tags:{historic:"*"},name:"Historic Site"},"historic/archaeological_site":{icon:"temaki-ruins",fields:["name","site_type","historic/civilization","inscription","access_simple"],geometry:["point","vertex","area"],tags:{historic:"archaeological_site"},name:"Archaeological Site"},"historic/boundary_stone":{icon:"temaki-milestone",fields:["name","inscription"],moreFields:["material"],geometry:["point","vertex"],tags:{historic:"boundary_stone"},name:"Boundary Stone"},"historic/castle":{icon:"maki-castle",fields:["name","castle_type","building_area","historic/civilization","access_simple","start_date"],geometry:["point","area"],tags:{historic:"castle"},name:"Castle"},"historic/castle/fortress":{icon:"maki-castle",fields:["name","building_area","access_simple","start_date"],geometry:["point","area"],reference:{key:"castle_type",value:"fortress"},tags:{historic:"castle",castle_type:"fortress"},terms:["citadel","military"],name:"Historic Fortress"},"historic/castle/palace":{icon:"fas-crown",fields:["name","building_area","access_simple","start_date"],geometry:["point","area"],reference:{key:"castle_type",value:"palace"},tags:{historic:"castle",castle_type:"palace"},terms:["Royal Residence","royal","king","queen"],name:"Palace"},"historic/castle/stately":{icon:"fas-crown",fields:["name","building_area","access_simple","start_date"],geometry:["point","area"],reference:{key:"castle_type",value:"stately"},tags:{historic:"castle",castle_type:"stately"},terms:["Historic Country House","Stately Home","nobility","gentry","representative"],name:"Château"},"historic/city_gate":{icon:"maki-castle",fields:["name","building_area","historic/civilization","start_date"],geometry:["point","area"],tags:{historic:"city_gate"},terms:["Town Gate"],name:"City Gate"},"historic/fort":{icon:"maki-castle",fields:["name","building_area","access_simple","start_date"],geometry:["point","area"],tags:{historic:"fort"},terms:["military"],name:"Historic Fort"},"historic/manor":{icon:"maki-castle",fields:["name","building_area","access_simple","start_date"],geometry:["point","area"],tags:{historic:"manor"},terms:["Mansion","gentry","nobility","estate"],name:"Manor House"},"historic/memorial":{icon:"maki-monument",fields:["name","memorial","inscription","material"],moreFields:["website"],geometry:["point","vertex","area"],terms:["dedicatory","epitaph","remember","remembrance","memory","monument","stolperstein"],tags:{historic:"memorial"},name:"Memorial"},"historic/memorial/plaque":{icon:"maki-monument",fields:["{historic/memorial}","direction"],geometry:["point","vertex"],terms:["dedicatory","epitaph","historical marker","remember","remembrance","memory"],tags:{historic:"memorial",memorial:"plaque"},reference:{key:"memorial",value:"plaque"},name:"Commemorative Plaque"},"historic/monument":{icon:"maki-monument",fields:["name","inscription","access_simple"],moreFields:["material"],geometry:["point","vertex","area"],tags:{historic:"monument"},name:"Monument"},"historic/ruins":{icon:"temaki-ruins",fields:["name","historic/civilization","inscription","access_simple"],geometry:["point","vertex","area"],tags:{historic:"ruins"},name:"Ruins"},"historic/tomb":{icon:"maki-cemetery",fields:["name","tomb","building_area","inscription","access_simple"],geometry:["point","area"],tags:{historic:"tomb"},name:"Tomb"},"historic/wayside_cross":{icon:"maki-religious-christian",fields:["name","inscription"],moreFields:["material"],geometry:["point","vertex","area"],tags:{historic:"wayside_cross"},name:"Wayside Cross"},"historic/wayside_shrine":{icon:"maki-landmark",fields:["name","religion","denomination","inscription","access_simple"],geometry:["point","vertex","area"],tags:{historic:"wayside_shrine"},name:"Wayside Shrine"},"historic/wreck":{icon:"temaki-ruins",fields:["name","access_simple","seamark/wreck/category","historic/wreck/date_sunk","historic/wreck/visible_at_low_tide","historic/wreck/visible_at_high_tide"],moreFields:["seamark/type"],geometry:["point","area"],tags:{historic:"wreck"},addTags:{historic:"wreck","seamark:type":"wreck"},terms:["hull","mast","maritime","remains","ship","boat"],name:"Shipwreck"},"indoor/corridor_line":{fields:["level","name"],geometry:["line"],tags:{indoor:"corridor"},searchable:false,matchScore:1.1,name:"Indoor Corridor",replacement:"highway/corridor"},"indoor/area":{fields:["level","name","ref_room_number","height"],geometry:["area"],tags:{indoor:"area"},terms:["indoor space"],matchScore:0.8,name:"Indoor Area"},"indoor/corridor":{icon:"temaki-pedestrian",fields:["level","name","ref","height"],geometry:["area"],tags:{indoor:"corridor"},terms:["concourse","foyer","hallway","passageway"],matchScore:0.8,name:"Indoor Corridor"},"indoor/door":{icon:"maki-entrance-alt1",fields:["level","ref","door_type","access_simple","width","height"],moreFields:["wheelchair"],geometry:["vertex"],tags:{indoor:"door"},addTags:{indoor:"door",door:"yes"},removeTags:{indoor:"door",door:"*"},terms:["doorframe","doorway","portal","room access","threshold"],name:"Indoor Door"},"indoor/room":{fields:["level","name","ref_room_number","room","height"],geometry:["area"],tags:{indoor:"room"},terms:["antechamber","anteroom","atrium","cell","chamber","concourse","foyer","indoor room","lobby","vestibule"],matchScore:0.8,name:"Room"},"indoor/wall":{icon:"temaki-wall",fields:["level","height"],geometry:["line"],tags:{indoor:"wall"},terms:["indoor barrier","room divider","room partition"],name:"Indoor Wall"},"internet_access/wlan":{icon:"fas-wifi",geometry:["point","area"],fields:["internet_access/fee","internet_access/ssid"],terms:["wi-fi","wifi","hotspot"],tags:{internet_access:"wlan"},matchScore:0.25,name:"Wi-Fi Hotspot"},junction:{icon:"temaki-junction",fields:["name"],geometry:["vertex","area"],tags:{junction:"yes"},name:"Junction"},"junction/circular":{geometry:["vertex","line"],fields:["name"],tags:{junction:"circular"},name:"Traffic Circle",searchable:false},"junction/jughandle":{geometry:["line"],fields:["name"],tags:{junction:"jughandle"},name:"Jughandle",searchable:false},"junction/roundabout":{geometry:["vertex","line"],fields:["name"],tags:{junction:"roundabout"},name:"Roundabout",searchable:false},"landuse/basin":{icon:"maki-water",fields:["name","basin","intermittent_yes"],geometry:["area"],tags:{landuse:"basin"},name:"Basin",searchable:false},"landuse/farm":{icon:"maki-farm",fields:["name","operator","crop"],geometry:["point","area"],tags:{landuse:"farm"},name:"Farmland",searchable:false},"landuse/pond":{icon:"maki-water",fields:["name","intermittent"],geometry:["area"],tags:{landuse:"pond"},name:"Pond",searchable:false},"landuse/reservoir":{icon:"maki-water",fields:["name","intermittent"],geometry:["area"],tags:{landuse:"reservoir"},name:"Reservoir",searchable:false},"landuse/allotments":{icon:"maki-garden-centre",geometry:["area"],fields:["name"],moreFields:["address","website","phone","email","fax"],tags:{landuse:"allotments"},terms:["allotment","garden"],name:"Community Garden"},"landuse/aquaculture":{icon:"maki-aquarium",fields:["name","operator","produce"],moreFields:["address","website","phone","email","fax"],geometry:["area"],tags:{landuse:"aquaculture"},terms:["fish farm","crustacean","algae","aquafarming","shrimp farm","oyster farm","mariculture","algaculture"],name:"Aquaculture"},"landuse/brownfield":{geometry:["area"],fields:["name"],tags:{landuse:"brownfield"},terms:[],matchScore:0.9,name:"Brownfield"},"landuse/cemetery":{icon:"maki-cemetery",fields:["name","religion","denomination"],moreFields:["address","website","phone","email","fax"],geometry:["area"],tags:{landuse:"cemetery"},terms:[],name:"Cemetery"},"landuse/churchyard":{icon:"maki-religious-christian",fields:["name","religion","denomination"],moreFields:["address","website","phone","email","fax"],geometry:["area"],tags:{landuse:"churchyard"},terms:[],name:"Churchyard"},"landuse/commercial":{icon:"maki-suitcase",fields:["name"],moreFields:["address","website","phone","email","fax"],geometry:["area"],tags:{landuse:"commercial"},terms:[],matchScore:0.9,name:"Commercial Area"},"landuse/construction":{icon:"temaki-tools",fields:["name","construction","operator","opening_date","check_date","note"],moreFields:["address","website","phone","email","fax"],geometry:["area"],tags:{landuse:"construction"},terms:[],name:"Construction"},"landuse/farmland":{icon:"fas-tractor",fields:["name","operator","crop","produce"],moreFields:["address","website","phone","email","fax"],geometry:["area"],tags:{landuse:"farmland"},terms:["crop","grow","plant"],name:"Farmland"},"landuse/farmyard":{icon:"maki-farm",fields:["name","operator","crop"],moreFields:["address","website","phone","email","fax"],geometry:["area"],tags:{landuse:"farmyard"},terms:["crop","grow","plant"],name:"Farmyard"},"landuse/forest":{icon:"maki-park-alt1",fields:["name","leaf_type","leaf_cycle","produce"],moreFields:["address","website","phone","email","fax"],geometry:["area"],tags:{landuse:"forest"},terms:["cut","forest","forestry","lumber","silviculture","tree"],name:"Managed Forest"},"landuse/garages":{icon:"fas-warehouse",geometry:["area"],fields:["name"],moreFields:["address","website","phone","email","fax"],tags:{landuse:"garages"},terms:[],name:"Garage Landuse"},"landuse/grass":{geometry:["area"],tags:{landuse:"grass"},terms:[],name:"Grass"},"landuse/greenfield":{geometry:["area"],fields:["name"],tags:{landuse:"greenfield"},terms:[],matchScore:0.9,name:"Greenfield"},"landuse/greenhouse_horticulture":{icon:"maki-garden",fields:["name","operator"],moreFields:["address","website","phone","email","fax"],geometry:["area"],terms:["flower","greenhouse","horticulture","grow","vivero"],tags:{landuse:"greenhouse_horticulture"},matchScore:0.9,name:"Greenhouse Horticulture"},"landuse/harbour":{icon:"maki-harbor",fields:["name","operator"],moreFields:["address","website","phone","email","fax"],geometry:["area"],terms:["boat"],tags:{landuse:"harbour"},name:"Harbor"},"landuse/industrial":{icon:"maki-industry",fields:["name","industrial"],moreFields:["address","website","phone","email","fax"],geometry:["area"],tags:{landuse:"industrial"},terms:[],matchScore:0.9,name:"Industrial Area"},"landuse/industrial/scrap_yard":{icon:"maki-car",fields:["name","operator","address","opening_hours"],geometry:["point","area"],tags:{industrial:"scrap_yard"},addTags:{landuse:"industrial",industrial:"scrap_yard"},reference:{key:"industrial",value:"scrap_yard"},terms:["car","junk","metal","salvage","scrap","u-pull-it","vehicle","wreck","yard"],name:"Scrap Yard"},"landuse/industrial/slaughterhouse":{icon:"maki-slaughterhouse",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{industrial:"slaughterhouse"},addTags:{landuse:"industrial",industrial:"slaughterhouse"},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"],moreFields:["address","website","phone","email","fax"],tags:{landuse:"landfill"},terms:["dump"],name:"Landfill"},"landuse/meadow":{icon:"maki-garden",geometry:["area"],fields:["name"],tags:{landuse:"meadow"},terms:["grazing","hay field","pasture"],name:"Meadow"},"landuse/military":{icon:"temaki-military",fields:["name"],moreFields:["address","website","phone","email","fax"],geometry:["area"],tags:{landuse:"military"},terms:[],matchScore:0.9,name:"Military Area"},"landuse/military/airfield":{icon:"tnp-2009265",fields:["name","iata","icao"],geometry:["point","area"],tags:{military:"airfield"},addTags:{aeroway:"aerodrome",landuse:"military",military:"airfield"},reference:{key:"military",value:"airfield"},terms:["aerodrome","aeroway","air force","airplane","airport","army","base","bomb","fight","force","guard","heli*","jet","marine","navy","plane","troop","war"],name:"Military Airfield"},"landuse/military/barracks":{icon:"temaki-military",fields:["name","building_area"],geometry:["point","area"],tags:{military:"barracks"},addTags:{landuse:"military",military:"barracks"},terms:["air force","army","base","fight","force","guard","marine","navy","troop","war"],name:"Barracks"},"landuse/military/bunker":{icon:"temaki-military",fields:["name","bunker_type","building_area"],geometry:["point","area"],tags:{military:"bunker"},addTags:{building:"bunker",landuse:"military",military:"bunker"},terms:["air force","army","base","fight","force","guard","marine","navy","troop","war"],name:"Military Bunker"},"landuse/military/checkpoint":{icon:"maki-barrier",fields:["name"],geometry:["point","vertex","area"],tags:{military:"checkpoint"},addTags:{landuse:"military",military:"checkpoint"},terms:["air force","army","base","force","guard","marine","navy","troop","war"],name:"Checkpoint"},"landuse/military/danger_area":{icon:"maki-danger",fields:["name"],geometry:["point","vertex","area"],tags:{military:"danger_area"},addTags:{landuse:"military",military:"danger_area"},terms:["air force","army","base","blast","bomb","explo*","force","guard","mine","marine","navy","troop","war"],name:"Danger Area"},"landuse/military/naval_base":{icon:"temaki-military",fields:["name"],geometry:["point","area"],tags:{military:"naval_base"},addTags:{landuse:"military",military:"naval_base"},terms:["base","fight","force","guard","marine","navy","ship","sub","troop","war"],name:"Naval Base"},"landuse/military/nuclear_explosion_site":{icon:"maki-danger",fields:["name"],geometry:["point","vertex","area"],tags:{military:"nuclear_explosion_site"},addTags:{landuse:"military",military:"nuclear_explosion_site"},terms:["atom","blast","bomb","detonat*","nuke","site","test"],name:"Nuclear Explosion Site"},"landuse/military/obstacle_course":{icon:"temaki-military",geometry:["point","area"],tags:{military:"obstacle_course"},addTags:{landuse:"military",military:"obstacle_course"},terms:["army","base","force","guard","marine","navy","troop","war"],name:"Obstacle Course"},"landuse/military/office":{icon:"temaki-military",fields:["name","building_area"],geometry:["point","area"],tags:{military:"office"},addTags:{landuse:"military",military:"office"},terms:["air force","army","base","enlist","fight","force","guard","marine","navy","recruit","troop","war"],name:"Military Office"},"landuse/military/range":{icon:"temaki-military",fields:["name"],geometry:["point","area"],tags:{military:"range"},addTags:{landuse:"military",military:"range"},terms:["air force","army","base","fight","fire","force","guard","gun","marine","navy","rifle","shoot*","snip*","train","troop","war"],name:"Military Range"},"landuse/military/training_area":{icon:"temaki-military",fields:["name"],geometry:["point","area"],tags:{military:"training_area"},addTags:{landuse:"military",military:"training_area"},terms:["air force","army","base","fight","fire","force","guard","gun","marine","navy","rifle","shoot*","snip*","train","troop","war"],name:"Training Area"},"landuse/orchard":{fields:["name","operator","trees"],moreFields:["address","website","phone","email","fax"],geometry:["area"],tags:{landuse:"orchard"},terms:["fruit"],name:"Orchard"},"landuse/plant_nursery":{icon:"maki-garden",fields:["name","operator","plant"],moreFields:["address","website","phone","email","fax"],geometry:["area"],tags:{landuse:"plant_nursery"},terms:["flower","garden","grow","vivero"],name:"Plant Nursery"},"landuse/quarry":{geometry:["area"],fields:["name","operator","resource"],moreFields:["address","website","phone","email","fax"],tags:{landuse:"quarry"},terms:[],name:"Quarry"},"landuse/railway":{icon:"maki-rail",fields:["operator"],geometry:["area"],tags:{landuse:"railway"},terms:["rail","train","track"],name:"Railway Corridor"},"landuse/recreation_ground":{icon:"maki-pitch",geometry:["area"],fields:["name"],moreFields:["address","website","phone","email","fax"],tags:{landuse:"recreation_ground"},terms:["playing fields"],name:"Recreation Ground"},"landuse/religious":{icon:"maki-place-of-worship",geometry:["area"],fields:["name","religion","denomination"],moreFields:["address","website","phone","email","fax"],tags:{landuse:"religious"},terms:[],name:"Religious Area"},"landuse/residential":{icon:"maki-building",geometry:["area"],tags:{landuse:"residential"},terms:[],matchScore:0.9,name:"Residential Area"},"landuse/residential/apartments":{icon:"maki-building",fields:["name","operator","address"],geometry:["point","area"],tags:{residential:"apartments"},addTags:{landuse:"residential",residential:"apartments"},reference:{key:"residential",value:"apartments"},terms:["flat","residence","tenement"],name:"Apartment Complex"},"landuse/retail":{icon:"maki-commercial",geometry:["area"],fields:["name"],moreFields:["address","website","phone","email","fax"],tags:{landuse:"retail"},matchScore:0.9,name:"Retail Area"},"landuse/vineyard":{fields:["name","operator","grape_variety"],moreFields:["address","website","phone","email","fax"],geometry:["area"],tags:{landuse:"vineyard"},addTags:{landuse:"vineyard",crop:"grape"},removeTags:{landuse:"vineyard",crop:"grape",grape_variety:"*"},terms:["grape","wine"],name:"Vineyard"},"leisure/adult_gaming_centre":{icon:"temaki-casino",fields:["{amenity/casino}"],moreFields:["{amenity/casino}"],geometry:["point","area"],terms:["gambling","slot machine"],tags:{leisure:"adult_gaming_centre"},name:"Adult Gaming Center"},"leisure/amusement_arcade":{icon:"maki-gaming",fields:["name","operator","address","building_area"],moreFields:["air_conditioning","opening_hours","payment_multi","smoking","website","phone","email","fax"],geometry:["point","area"],terms:["pay-to-play games","video games","driving simulators","pinball machines"],tags:{leisure:"amusement_arcade"},name:"Amusement Arcade"},"leisure/bandstand":{icon:"maki-music",fields:["name","building_area","operator"],moreFields:["website"],geometry:["point","area"],tags:{leisure:"bandstand"},name:"Bandstand"},"leisure/beach_resort":{icon:"maki-beach",fields:["name","address","opening_hours","fee","payment_multi_fee"],moreFields:["smoking","website","phone","email","fax"],geometry:["point","area"],tags:{leisure:"beach_resort"},name:"Beach Resort"},"leisure/bird_hide":{icon:"temaki-binoculars",fields:["name","building_area","address","opening_hours"],moreFields:["website"],geometry:["point","area"],tags:{leisure:"bird_hide"},terms:["machan","ornithology"],name:"Bird Hide"},"leisure/bleachers":{geometry:["point","area"],tags:{leisure:"bleachers"},terms:["crowd","bench","sports","stand","stands","seat","seating"],name:"Bleachers"},"leisure/bowling_alley":{icon:"temaki-bowling",fields:["name","operator","address","building_area"],moreFields:["air_conditioning","opening_hours","payment_multi","smoking","website","phone","email","fax"],geometry:["point","area"],terms:["bowling center"],tags:{leisure:"bowling_alley"},name:"Bowling Alley"},"leisure/common":{icon:"temaki-pedestrian",fields:["name"],moreFields:["website"],geometry:["point","area"],terms:["open space"],tags:{leisure:"common"},name:"Common"},"leisure/dance":{icon:"maki-music",fields:["name","operator","address","building_area","dance/style"],moreFields:["opening_hours","payment_multi","website","phone","email","fax"],geometry:["point","area"],terms:["ballroom","jive","swing","tango","waltz"],tags:{leisure:"dance"},name:"Dance Hall"},"leisure/dancing_school":{icon:"maki-music",fields:["name","operator","address","building_area","dance/style"],moreFields:["opening_hours","payment_multi","website","phone","email","fax"],geometry:["point","area"],terms:["jive","swing","tango","waltz","dance teaching"],tags:{leisure:"dance","dance:teaching":"yes"},reference:{key:"leisure",value:"dance"},name:"Dance School"},"leisure/dog_park":{icon:"maki-dog-park",fields:["name"],moreFields:["website","phone","email","fax"],geometry:["point","area"],terms:[],tags:{leisure:"dog_park"},name:"Dog Park"},"leisure/firepit":{icon:"maki-fire-station",fields:["access_simple"],geometry:["point","area"],tags:{leisure:"firepit"},terms:["fireplace","campfire"],name:"Firepit"},"leisure/fishing":{icon:"fas-fish",fields:["name","access_simple","fishing"],geometry:["vertex","point","area"],tags:{leisure:"fishing"},terms:["angler"],name:"Fishing Spot"},"leisure/fitness_centre":{icon:"fas-dumbbell",fields:["name","sport","address","building_area"],moreFields:["opening_hours","fee","payment_multi","website","phone","email","fax"],geometry:["point","area"],tags:{leisure:"fitness_centre"},terms:["health","gym","leisure","studio"],name:"Gym / Fitness Center"},"leisure/fitness_centre/yoga":{icon:"maki-pitch",geometry:["point","area"],terms:["studio","asanas","modern yoga","meditation"],tags:{leisure:"fitness_centre",sport:"yoga"},reference:{key:"sport",value:"yoga"},name:"Yoga Studio"},"leisure/fitness_station":{icon:"maki-pitch",fields:["fitness_station","ref"],moreFields:["opening_hours"],geometry:["point","area"],tags:{leisure:"fitness_station"},addTags:{leisure:"fitness_station",sport:"fitness"},reference:{key:"leisure",value:"fitness_station"},terms:["exercise","fitness","gym","trim trail"],name:"Outdoor Fitness Station"},"leisure/fitness_station/balance_beam":{icon:"maki-pitch",geometry:["point","area"],tags:{leisure:"fitness_station",fitness_station:"balance_beam"},addTags:{leisure:"fitness_station",fitness_station:"balance_beam",sport:"fitness"},reference:{key:"leisure",value:"fitness_station"},terms:["balance","exercise","fitness","gym","trim trail"],name:"Exercise Balance Beam"},"leisure/fitness_station/box":{icon:"maki-pitch",geometry:["point","area"],tags:{leisure:"fitness_station",fitness_station:"box"},addTags:{leisure:"fitness_station",fitness_station:"box",sport:"fitness"},reference:{key:"leisure",value:"fitness_station"},terms:["box","exercise","fitness","gym","jump","trim trail"],name:"Exercise Box"},"leisure/fitness_station/horizontal_bar":{icon:"maki-pitch",geometry:["point","area"],tags:{leisure:"fitness_station",fitness_station:"horizontal_bar"},addTags:{leisure:"fitness_station",fitness_station:"horizontal_bar",sport:"fitness"},reference:{key:"leisure",value:"fitness_station"},terms:["bar","chinup","chin up","exercise","fitness","gym","pullup","pull up","trim trail"],name:"Exercise Horizontal Bar"},"leisure/fitness_station/horizontal_ladder":{icon:"maki-pitch",geometry:["point","area"],tags:{leisure:"fitness_station",fitness_station:"horizontal_ladder"},addTags:{leisure:"fitness_station",fitness_station:"horizontal_ladder",sport:"fitness"},reference:{key:"leisure",value:"fitness_station"},terms:["bar","chinup","chin up","exercise","fitness","gym","ladder","monkey bars","pullup","pull up","trim trail"],name:"Exercise Monkey Bars"},"leisure/fitness_station/hyperextension":{icon:"maki-pitch",geometry:["point","area"],tags:{leisure:"fitness_station",fitness_station:"hyperextension"},addTags:{leisure:"fitness_station",fitness_station:"hyperextension",sport:"fitness"},reference:{key:"leisure",value:"fitness_station"},terms:["back","exercise","extension","fitness","gym","roman chair","trim trail"],name:"Hyperextension Station"},"leisure/fitness_station/parallel_bars":{icon:"maki-pitch",geometry:["point","area"],tags:{leisure:"fitness_station",fitness_station:"parallel_bars"},addTags:{leisure:"fitness_station",fitness_station:"parallel_bars",sport:"fitness"},reference:{key:"leisure",value:"fitness_station"},terms:["bar","dip","exercise","fitness","gym","trim trail"],name:"Parallel Bars"},"leisure/fitness_station/push-up":{icon:"maki-pitch",geometry:["point","area"],tags:{leisure:"fitness_station",fitness_station:"push-up"},addTags:{leisure:"fitness_station",fitness_station:"push-up",sport:"fitness"},reference:{key:"leisure",value:"fitness_station"},terms:["bar","exercise","fitness","gym","pushup","push up","trim trail"],name:"Push-Up Station"},"leisure/fitness_station/rings":{icon:"maki-pitch",geometry:["point","area"],tags:{leisure:"fitness_station",fitness_station:"rings"},addTags:{leisure:"fitness_station",fitness_station:"rings",sport:"fitness"},reference:{key:"leisure",value:"fitness_station"},terms:["exercise","fitness","gym","muscle up","pullup","pull up","trim trail"],name:"Exercise Rings"},"leisure/fitness_station/sign":{icon:"maki-pitch",geometry:["point","area"],tags:{leisure:"fitness_station",fitness_station:"sign"},addTags:{leisure:"fitness_station",fitness_station:"sign",sport:"fitness"},reference:{key:"leisure",value:"fitness_station"},terms:["exercise","fitness","gym","trim trail"],name:"Exercise Instruction Sign"},"leisure/fitness_station/sit-up":{icon:"maki-pitch",geometry:["point","area"],tags:{leisure:"fitness_station",fitness_station:"sit-up"},addTags:{leisure:"fitness_station",fitness_station:"sit-up",sport:"fitness"},reference:{key:"leisure",value:"fitness_station"},terms:["crunch","exercise","fitness","gym","situp","sit up","trim trail"],name:"Sit-Up Station"},"leisure/fitness_station/stairs":{icon:"maki-pitch",geometry:["point","area"],tags:{leisure:"fitness_station",fitness_station:"stairs"},addTags:{leisure:"fitness_station",fitness_station:"stairs",sport:"fitness"},reference:{key:"leisure",value:"fitness_station"},terms:["exercise","fitness","gym","steps","trim trail"],name:"Exercise Stairs"},"leisure/garden":{icon:"maki-garden",fields:["name","operator","access_simple","fee","payment_multi_fee"],moreFields:["website","phone","email","fax"],geometry:["point","vertex","area"],tags:{leisure:"garden"},name:"Garden"},"leisure/golf_course":{icon:"maki-golf",fields:["name","operator","address","opening_hours"],moreFields:["payment_multi","website","phone","email","fax"],geometry:["point","area"],terms:["links"],tags:{leisure:"golf_course"},name:"Golf Course"},"leisure/hackerspace":{icon:"fas-code",fields:["name","address","building_area","opening_hours","website","internet_access"],moreFields:["payment_multi","internet_access/fee","internet_access/ssid","smoking","phone","email","fax"],geometry:["point","area"],terms:["makerspace","hackspace","hacklab"],tags:{leisure:"hackerspace"},name:"Hackerspace"},"leisure/horse_riding":{icon:"maki-horse-riding",fields:["name","access_simple","operator","address","building"],moreFields:["opening_hours","payment_multi","website","phone","email","fax"],geometry:["point","area"],terms:["equestrian","stable"],tags:{leisure:"horse_riding"},name:"Horseback Riding Facility"},"leisure/ice_rink":{icon:"fas-skating",fields:["name","seasonal","sport_ice","operator","address","building"],moreFields:["opening_hours","payment_multi","website","phone","email","fax"],geometry:["point","area"],terms:["hockey","skating","curling"],tags:{leisure:"ice_rink"},name:"Ice Rink"},"leisure/marina":{icon:"tnp-2009223",fields:["name","operator","capacity","fee","payment_multi_fee","sanitary_dump_station","power_supply"],moreFields:["address","internet_access","internet_access/fee","internet_access/ssid","seamark/type","website","phone","email","fax"],geometry:["point","vertex","area"],terms:["boat"],tags:{leisure:"marina"},name:"Marina"},"leisure/miniature_golf":{icon:"maki-golf",fields:["name","operator","address","opening_hours","fee","payment_multi_fee"],moreFields:["website","phone","email","fax"],geometry:["point","area"],terms:["crazy golf","mini golf","putt-putt"],tags:{leisure:"miniature_golf"},name:"Miniature Golf"},"leisure/nature_reserve":{icon:"maki-park",geometry:["point","area"],fields:["name","operator","address","opening_hours"],moreFields:["dog","website","phone","email","fax"],tags:{leisure:"nature_reserve"},terms:["protected","wildlife"],name:"Nature Reserve"},"leisure/outdoor_seating":{icon:"maki-picnic-site",geometry:["point","area"],fields:["name","operator"],terms:["al fresco","beer garden","dining","cafe","restaurant","pub","bar","patio"],tags:{leisure:"outdoor_seating"},name:"Outdoor Seating Area"},"leisure/park":{icon:"maki-park",fields:["name","operator","address","opening_hours"],moreFields:["dog","smoking","website","phone","email","fax"],geometry:["point","area"],terms:["esplanade","estate","forest","garden","grass","green","grounds","lawn","lot","meadow","parkland","place","playground","plaza","pleasure garden","recreation area","square","tract","village green","woodland"],tags:{leisure:"park"},name:"Park"},"leisure/picnic_table":{icon:"maki-picnic-site",fields:["material","lit","bench"],geometry:["point"],tags:{leisure:"picnic_table"},terms:["bench"],name:"Picnic Table"},"leisure/picnic_table/chess":{icon:"fas-chess-pawn",geometry:["point"],tags:{leisure:"picnic_table",sport:"chess"},reference:{key:"sport",value:"chess"},terms:["bench","chess board","checkerboard","checkers","chequerboard","game table"],name:"Chess Table"},"leisure/pitch":{icon:"maki-pitch",fields:["name","sport","access_simple","surface","lit"],moreFields:["fee","payment_multi_fee"],geometry:["point","area"],tags:{leisure:"pitch"},terms:["field"],name:"Sport Pitch"},"leisure/pitch/american_football":{icon:"maki-american-football",geometry:["point","area"],tags:{leisure:"pitch",sport:"american_football"},reference:{key:"sport",value:"american_football"},terms:["football","gridiron"],name:"American Football Field"},"leisure/pitch/australian_football":{icon:"maki-american-football",geometry:["point","area"],tags:{leisure:"pitch",sport:"australian_football"},reference:{key:"sport",value:"australian_football"},terms:["Aussie","AFL","football"],name:"Australian Football Field"},"leisure/pitch/badminton":{icon:"maki-tennis",fields:["{leisure/pitch}","access_simple"],geometry:["point","area"],tags:{leisure:"pitch",sport:"badminton"},reference:{key:"sport",value:"badminton"},terms:[],name:"Badminton Court"},"leisure/pitch/baseball":{icon:"maki-baseball",geometry:["point","area"],tags:{leisure:"pitch",sport:"baseball"},reference:{key:"sport",value:"baseball"},terms:[],name:"Baseball Field"},"leisure/pitch/basketball":{icon:"maki-basketball",fields:["name","surface","hoops","lit","access_simple"],geometry:["point","area"],tags:{leisure:"pitch",sport:"basketball"},reference:{key:"sport",value:"basketball"},terms:[],name:"Basketball Court"},"leisure/pitch/beachvolleyball":{icon:"maki-volleyball",geometry:["point","area"],tags:{leisure:"pitch",sport:"beachvolleyball"},addTags:{leisure:"pitch",sport:"beachvolleyball",surface:"sand"},reference:{key:"sport",value:"beachvolleyball"},terms:["volleyball"],name:"Beach Volleyball Court"},"leisure/pitch/boules":{icon:"maki-pitch",fields:["name","boules","{leisure/pitch}"],geometry:["point","area"],tags:{leisure:"pitch",sport:"boules"},reference:{key:"sport",value:"boules"},terms:["bocce","lyonnaise","pétanque"],name:"Boules/Bocce Court"},"leisure/pitch/bowls":{icon:"maki-pitch",geometry:["point","area"],tags:{leisure:"pitch",sport:"bowls"},reference:{key:"sport",value:"bowls"},terms:[],name:"Bowling Green"},"leisure/pitch/cricket":{icon:"maki-cricket",geometry:["point","area"],tags:{leisure:"pitch",sport:"cricket"},reference:{key:"sport",value:"cricket"},terms:[],name:"Cricket Field"},"leisure/pitch/equestrian":{icon:"maki-horse-riding",fields:["{leisure/pitch}","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/horseshoes":{icon:"maki-pitch",geometry:["point","area"],tags:{leisure:"pitch",sport:"horseshoes"},reference:{key:"sport",value:"horseshoes"},terms:["horse shoes"],name:"Horseshoes Pit"},"leisure/pitch/netball":{icon:"maki-volleyball",geometry:["point","area"],tags:{leisure:"pitch",sport:"netball"},reference:{key:"sport",value:"netball"},terms:[],name:"Netball Court"},"leisure/pitch/rugby_league":{icon:"maki-american-football",geometry:["point","area"],tags:{leisure:"pitch",sport:"rugby_league"},reference:{key:"sport",value:"rugby_league"},terms:[],name:"Rugby League Field"},"leisure/pitch/rugby_union":{icon:"maki-american-football",geometry:["point","area"],tags:{leisure:"pitch",sport:"rugby_union"},reference:{key:"sport",value:"rugby_union"},terms:[],name:"Rugby Union Field"},"leisure/pitch/shuffleboard":{icon:"maki-pitch",geometry:["point","area"],tags:{leisure:"pitch",sport:"shuffleboard"},reference:{key:"sport",value:"shuffleboard"},terms:["deck shuffleboard","floor shuffleboard"],name:"Shuffleboard Court"},"leisure/pitch/skateboard":{icon:"maki-skateboard",geometry:["point","area"],tags:{leisure:"pitch",sport:"skateboard"},reference:{key:"sport",value:"skateboard"},terms:[],name:"Skate Park"},"leisure/pitch/soccer":{icon:"maki-soccer",geometry:["point","area"],tags:{leisure:"pitch",sport:"soccer"},reference:{key:"sport",value:"soccer"},terms:["football"],name:"Soccer Field"},"leisure/pitch/softball":{icon:"maki-baseball",geometry:["point","area"],tags:{leisure:"pitch",sport:"softball"},reference:{key:"sport",value:"softball"},terms:["softball","diamond"],name:"Softball Field"},"leisure/pitch/table_tennis":{icon:"maki-tennis",fields:["name","lit","access_simple"],geometry:["point","area"],tags:{leisure:"pitch",sport:"table_tennis"},reference:{key:"sport",value:"table_tennis"},terms:["table tennis","ping pong"],name:"Ping Pong Table"},"leisure/pitch/tennis":{icon:"maki-tennis",fields:["{leisure/pitch}","access_simple"],geometry:["point","area"],tags:{leisure:"pitch",sport:"tennis"},reference:{key:"sport",value:"tennis"},terms:[],name:"Tennis Court"},"leisure/pitch/volleyball":{icon:"maki-volleyball",geometry:["point","area"],tags:{leisure:"pitch",sport:"volleyball"},reference:{key:"sport",value:"volleyball"},terms:[],name:"Volleyball Court"},"leisure/playground":{icon:"maki-playground",fields:["name","operator","surface","playground/max_age","playground/min_age","access_simple"],geometry:["point","area"],terms:["jungle gym","play area"],tags:{leisure:"playground"},name:"Playground"},"leisure/resort":{icon:"maki-lodging",fields:["name","operator","address","opening_hours"],moreFields:["payment_multi","website","phone","email","fax"],geometry:["point","area"],tags:{leisure:"resort"},name:"Resort"},"leisure/sauna":{icon:"fas-thermometer-three-quarters",fields:["name","operator","address","opening_hours","access_simple","fee","payment_multi_fee"],moreFields:["website","phone","email","fax"],geometry:["point","area"],tags:{leisure:"sauna"},name:"Sauna"},"leisure/slipway_point":{icon:"maki-slipway",fields:["{leisure/slipway}"],moreFields:["{leisure/slipway}"],geometry:["point","vertex"],terms:["boat launch","boat ramp","boat landing"],tags:{leisure:"slipway"},name:"Slipway"},"leisure/slipway":{icon:"maki-slipway",fields:["name","surface","access_simple","fee","payment_multi_fee","lanes"],moreFields:["lit","opening_hours","seamark/type","width"],geometry:["line"],terms:["boat launch","boat ramp","boat landing"],tags:{leisure:"slipway"},addTags:{leisure:"slipway",highway:"service",service:"slipway"},matchScore:1.1,name:"Slipway"},"leisure/sports_centre":{icon:"maki-pitch",fields:["name","sport","building","address","fee","payment_multi_fee"],moreFields:["opening_hours","website","phone","email","fax"],geometry:["point","area"],tags:{leisure:"sports_centre"},terms:[],name:"Sports Center / Complex"},"leisure/sports_centre/climbing":{icon:"temaki-abseiling",geometry:["point","area"],terms:["abseiling","artificial climbing wall","belaying","bouldering","rock climbing facility","indoor rock wall","rappeling","rock gym","ropes"],tags:{leisure:"sports_centre",sport:"climbing"},reference:{key:"sport",value:"climbing"},name:"Climbing Gym"},"leisure/sports_centre/swimming":{icon:"fas-swimmer",geometry:["point","area"],terms:["dive","water"],tags:{leisure:"sports_centre",sport:"swimming"},reference:{key:"sport",value:"swimming"},name:"Swimming Pool Facility"},"leisure/stadium":{icon:"maki-pitch",fields:["name","sport","address"],moreFields:["website","phone","email","fax"],geometry:["point","area"],tags:{leisure:"stadium"},name:"Stadium"},"leisure/swimming_area":{icon:"fas-swimmer",fields:["name","access_simple","supervised","fee","payment_multi_fee","lit"],moreFields:["opening_hours","operator"],geometry:["area"],terms:["dive","water","aquatics"],tags:{leisure:"swimming_area"},name:"Natural Swimming Area"},"leisure/swimming_pool":{icon:"fas-swimming-pool",fields:["name","access_simple","lit","location_pool","length","swimming_pool"],moreFields:["address","opening_hours","operator"],geometry:["point","area"],terms:["dive","water","aquatics"],tags:{leisure:"swimming_pool"},name:"Swimming Pool"},"leisure/track":{icon:"iD-other-line",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/track/cycling_point":{icon:"maki-bicycle",fields:["{leisure/track/cycling}"],geometry:["point"],tags:{leisure:"track",sport:"cycling"},terms:["bicycle track","bicycling track","cycle racetrack","velodrome"],name:"Cycling Track"},"leisure/track/cycling":{icon:"maki-bicycle",fields:["name","surface","sport_racing_nonmotor","lit","width","lanes"],geometry:["line","area"],tags:{leisure:"track",sport:"cycling"},addTags:{leisure:"track",sport:"cycling",highway:"cycleway"},terms:["bicycle track","bicycling track","cycle racetrack","velodrome"],name:"Cycling Track"},"leisure/track/horse_racing_point":{icon:"maki-horse-riding",fields:["{leisure/track/horse_racing}"],geometry:["point"],tags:{leisure:"track",sport:"horse_racing"},terms:["equestrian race track","horse race betting","horseracing","horsetrack","horse racetrack"],name:"Horse Racing Track"},"leisure/track/horse_racing":{icon:"maki-horse-riding",fields:["name","surface","sport_racing_nonmotor","lit","width","lanes"],geometry:["line","area"],tags:{leisure:"track",sport:"horse_racing"},addTags:{leisure:"track",sport:"horse_racing",highway:"bridleway"},terms:["equestrian race track","horse race betting","horseracing","horsetrack","horse racetrack"],name:"Horse Racing Track"},"leisure/track/running_point":{icon:"maki-pitch",fields:["{leisure/track/running}"],geometry:["point"],tags:{leisure:"track",sport:"running"},terms:["athletics track","decathlon","foot race","long distance running","marathon","middle distance running","racetrack","running","sprint","track","walking"],name:"Running Track"},"leisure/track/running":{icon:"maki-pitch",fields:["name","surface","sport_racing_nonmotor","lit","width","lanes"],geometry:["line","area"],tags:{leisure:"track",sport:"running"},addTags:{leisure:"track",sport:"running",highway:"footway"},terms:["athletics track","decathlon","foot race","long distance running","marathon","middle distance running","racetrack","running","sprint","track","walking"],name:"Running Track"},"leisure/water_park":{icon:"fas-swimmer",fields:["name","operator","address"],moreFields:["payment_multi","brand","website","phone","email","fax"],geometry:["point","area"],terms:["swim","pool","dive"],tags:{leisure:"water_park"},name:"Water Park"},line:{fields:["name"],geometry:["line"],tags:{},terms:["polyline"],name:"Line",matchScore:0.1},"man_made/adit":{icon:"maki-triangle",geometry:["point","area"],fields:["name","operator","resource","direction"],terms:["cave","horizontal mine entrance","tunnel","underground"],tags:{man_made:"adit"},name:"Adit"},"man_made/antenna":{icon:"temaki-antenna",fields:["communication_multi","operator","manufacturer","height"],geometry:["point"],terms:["broadcast","cell phone","cell","communication","mobile phone","radio","television","transmission","tv"],tags:{man_made:"antenna"},name:"Antenna"},"man_made/beacon":{fields:["name","height"],moreFields:["seamark/type"],geometry:["point","area"],tags:{man_made:"beacon"},name:"Beacon",matchScore:0.5},"man_made/beehive":{icon:"fas-archive",geometry:["point","area"],fields:["ref","operator","seasonal","height","colour"],moreFields:["manufacturer"],terms:["apiary","beekeeper","farm","honey","pollination"],tags:{man_made:"beehive"},name:"Beehive"},"man_made/breakwater":{fields:["material","seamark/type"],geometry:["line","area"],tags:{man_made:"breakwater"},name:"Breakwater"},"man_made/bridge":{icon:"maki-bridge",fields:["name","bridge","layer","maxweight"],moreFields:["manufacturer","material","seamark/type"],geometry:["area"],tags:{man_made:"bridge"},addTags:{man_made:"bridge",layer:"1"},removeTags:{man_made:"bridge",layer:"*"},reference:{key:"man_made",value:"bridge"},name:"Bridge"},"man_made/bunker_silo":{icon:"temaki-silo",fields:["content"],geometry:["point","area"],terms:["Silage","Storage"],tags:{man_made:"bunker_silo"},name:"Bunker Silo"},"man_made/chimney":{icon:"temaki-chimney",fields:["operator","material","height"],geometry:["point","area"],tags:{man_made:"chimney"},name:"Chimney"},"man_made/clearcut":{icon:"maki-logging",geometry:["area"],tags:{man_made:"clearcut"},terms:["cut","forest","lumber","tree","wood"],name:"Clearcut Forest"},"man_made/crane":{icon:"temaki-crane",fields:["operator","manufacturer","height","crane/type"],geometry:["point","line","vertex","area"],tags:{man_made:"crane"},name:"Crane"},"man_made/cross":{icon:"maki-religious-christian",fields:["name","material","height","elevation","inscription","direction"],geometry:["point","vertex"],tags:{man_made:"cross"},name:"Summit Cross"},"man_made/cutline":{icon:"maki-logging",geometry:["line"],tags:{man_made:"cutline"},name:"Cut line"},"man_made/dyke":{geometry:["line"],tags:{man_made:"dyke"},terms:["Dike","Dyke","Floodbank","Stopbank"],name:"Levee"},"man_made/embankment":{geometry:["line"],tags:{man_made:"embankment"},name:"Embankment"},"man_made/flagpole":{icon:"maki-embassy",fields:["operator","flag/type","country","lit","height"],moreFields:["manufacturer","material"],geometry:["point","vertex"],tags:{man_made:"flagpole"},name:"Flagpole"},"man_made/gasometer":{icon:"temaki-storage_tank",fields:["content","building_area"],geometry:["point","area"],terms:["gas holder"],tags:{man_made:"gasometer"},name:"Gasometer"},"man_made/groyne":{fields:["material","seamark/type"],geometry:["line","area"],tags:{man_made:"groyne"},name:"Groyne"},"man_made/lighthouse":{icon:"maki-lighthouse",fields:["name","operator","building_area","height"],moreFields:["address","email","fax","phone","seamark/type","website"],geometry:["point","area"],tags:{man_made:"lighthouse"},addTags:{man_made:"lighthouse","seamark:type":"light_major"},removeTags:{man_made:"lighthouse","seamark:type":"*"},name:"Lighthouse"},"man_made/mast":{icon:"maki-communications-tower",fields:["tower/type","tower/construction","height"],moreFields:["manufacturer","material","communication_multi"],geometry:["point"],terms:["antenna","broadcast tower","cell phone tower","cell tower","communication mast","communication tower","guyed tower","mobile phone tower","radio mast","radio tower","television tower","transmission mast","transmission tower","tv tower"],tags:{man_made:"mast"},name:"Mast"},"man_made/mast/communication":{icon:"maki-communications-tower",fields:["{man_made/mast}","communication_multi"],geometry:["point"],terms:["antenna","broadcast tower","cell phone tower","cell tower","communication mast","communication tower","guyed tower","mobile phone tower","radio mast","radio tower","television tower","transmission mast","transmission tower","tv tower"],tags:{man_made:"mast","tower:type":"communication"},reference:{key:"tower:type",value:"communication"},name:"Communication Mast"},"man_made/mast/communication/mobile_phone":{icon:"maki-communications-tower",geometry:["point"],terms:["antenna","cell mast","cell phone mast","cell phone tower","cell tower","communication mast","communication tower","guyed tower","mobile phone tower","transmission mast","transmission tower"],tags:{man_made:"mast","tower:type":"communication","communication:mobile_phone":"yes"},reference:{key:"communication:mobile_phone",value:"yes"},name:"Mobile Phone Mast"},"man_made/mast/communication/radio":{icon:"maki-communications-tower",geometry:["point"],terms:["antenna","broadcast tower","communication mast","communication tower","guyed tower","radio mast","radio tower","transmission mast","transmission tower"],tags:{man_made:"mast","tower:type":"communication","communication:radio":"yes"},reference:{key:"communication:radio",value:"yes"},name:"Radio Broadcast Mast"},"man_made/mast/communication/television":{icon:"maki-communications-tower",geometry:["point"],terms:["antenna","broadcast tower","communication mast","communication tower","guyed tower","television mast","television tower","transmission mast","transmission tower","tv mast","tv tower"],tags:{man_made:"mast","tower:type":"communication","communication:television":"yes"},reference:{key:"communication:television",value:"yes"},name:"Television Broadcast Mast"},"man_made/mineshaft":{icon:"maki-triangle",geometry:["point","area"],fields:["name","operator","resource"],terms:["cave","mine shaft","tunnel","underground","vertical mine entrance"],tags:{man_made:"mineshaft"},name:"Mineshaft"},"man_made/monitoring_station":{icon:"temaki-antenna",geometry:["point","vertex","area"],fields:["monitoring_multi","operator","manufacturer"],terms:["weather","earthquake","seismology","air","gps"],tags:{man_made:"monitoring_station"},name:"Monitoring Station"},"man_made/observatory":{fields:["name","operator","address","access_simple","building_area"],moreFields:["website","phone","email","fax"],geometry:["point","area"],terms:["astronomical","meteorological"],tags:{man_made:"observatory"},name:"Observatory"},"man_made/petroleum_well":{icon:"temaki-storage_tank",geometry:["point"],terms:["drilling rig","oil derrick","oil drill","oil horse","oil rig","oil pump","petroleum well","pumpjack"],tags:{man_made:"petroleum_well"},name:"Oil Well"},"man_made/pier":{icon:"temaki-pedestrian",fields:["name","surface","floating","width","access","lit"],moreFields:["fishing","incline","{highway/footway}"],geometry:["line","area"],terms:["berth","dock","jetty","landing","promenade","wharf"],tags:{man_made:"pier"},addTags:{highway:"footway",man_made:"pier"},name:"Pier"},"man_made/pier/floating":{icon:"temaki-pedestrian",geometry:["line","area"],terms:["berth","dock","jetty","landing","promenade","wharf"],tags:{man_made:"pier",floating:"yes"},addTags:{highway:"footway",man_made:"pier",floating:"yes"},name:"Floating Pier"},"man_made/pipeline":{icon:"iD-pipeline-line",fields:["location","operator","substance","layer"],geometry:["line"],terms:["oil","natural gas","water","sewer","sewage"],tags:{man_made:"pipeline"},name:"Pipeline"},"man_made/pipeline/underground":{icon:"iD-pipeline-line",geometry:["line"],terms:["oil","natural gas","water","sewer","sewage"],tags:{man_made:"pipeline",location:"underground"},addTags:{man_made:"pipeline",location:"underground",layer:"-1"},name:"Underground Pipeline"},"man_made/pumping_station":{icon:"maki-water",geometry:["point","area"],tags:{man_made:"pumping_station"},name:"Pumping Station"},"man_made/silo":{icon:"temaki-silo",fields:["crop","building_area"],geometry:["point","area"],terms:["grain","corn","wheat"],tags:{man_made:"silo"},name:"Silo"},"man_made/storage_tank":{icon:"temaki-storage_tank",fields:["content","operator","manufacturer","building_area","height"],geometry:["point","area"],terms:["water","oil","gas","petrol"],tags:{man_made:"storage_tank"},name:"Storage Tank"},"man_made/street_cabinet":{icon:"fas-door-closed",geometry:["point","area"],fields:["ref","operator","street_cabinet","height","colour"],terms:["cable tv","monitoring box","technical box","telecommunications","traffic signal controls"],tags:{man_made:"street_cabinet"},name:"Street Cabinet"},"man_made/surveillance":{icon:"maki-attraction",geometry:["point","vertex"],fields:["surveillance","surveillance/type","surveillance/zone","direction"],terms:["anpr","alpr","camera","car plate recognition","cctv","guard","license plate recognition","monitoring","number plate recognition","security","video","webcam"],tags:{man_made:"surveillance"},name:"Surveillance"},"man_made/surveillance/camera":{icon:"maki-attraction",geometry:["point","vertex"],fields:["surveillance","surveillance/type","camera/type","camera/mount","camera/direction","surveillance/zone","contact/webcam"],moreFields:["manufacturer"],terms:["anpr","alpr","camera","car plate recognition","cctv","guard","license plate recognition","monitoring","number plate recognition","security","video","webcam"],tags:{man_made:"surveillance","surveillance:type":"camera"},name:"Surveillance Camera"},"man_made/survey_point":{icon:"maki-monument",fields:["ref"],geometry:["point","vertex"],terms:["trig point","triangulation pillar","trigonometrical station"],tags:{man_made:"survey_point"},name:"Survey Point"},"man_made/tower":{icon:"temaki-tower",fields:["tower/type","tower/construction","height","building_area"],moreFields:["architect"],geometry:["point","area"],tags:{man_made:"tower"},name:"Tower"},"man_made/tower/bell_tower":{icon:"fas-bell",moreFields:["{man_made/tower}","opening_hours"],geometry:["point","area"],terms:["belfry","bell gable","campanile","church tower","klockstapel"],tags:{man_made:"tower","tower:type":"bell_tower"},reference:{key:"tower:type",value:"bell_tower"},name:"Bell Tower"},"man_made/tower/communication":{icon:"temaki-tower",fields:["{man_made/tower}","communication_multi"],geometry:["point","area"],terms:["antenna","broadcast tower","cell phone tower","cell tower","communication mast","communication tower","guyed tower","mobile phone tower","radio mast","radio tower","television tower","transmission mast","transmission tower","tv tower"],tags:{man_made:"tower","tower:type":"communication"},reference:{key:"tower:type",value:"communication"},name:"Communication Tower"},"man_made/tower/defensive":{icon:"maki-castle",geometry:["point","area"],tags:{man_made:"tower","tower:type":"defensive"},reference:{key:"tower:type",value:"defensive"},terms:["Defensive Tower","Castle Tower"],name:"Fortified Tower"},"man_made/tower/minaret":{icon:"temaki-tower",geometry:["point","area"],terms:["Islam","mosque","Muezzin","Muslim"],tags:{man_made:"tower","tower:type":"minaret"},reference:{key:"tower:type",value:"minaret"},name:"Minaret"},"man_made/tower/observation":{icon:"temaki-tower",moreFields:["{man_made/tower}","opening_hours"],geometry:["point","area"],terms:["lookout tower","fire tower"],tags:{man_made:"tower","tower:type":"observation"},reference:{key:"tower:type",value:"observation"},name:"Observation Tower"},"man_made/tunnel":{icon:"tnp-2009642",fields:["name","tunnel","layer","width","length","height"],geometry:["area"],tags:{man_made:"tunnel"},addTags:{man_made:"tunnel",layer:"-1"},removeTags:{man_made:"tunnel",layer:"*"},reference:{key:"man_made",value:"tunnel"},terms:["bore","dig","shaft","underground passage","underpass"],name:"Tunnel"},"man_made/wastewater_plant":{icon:"maki-water",fields:["name","operator","address"],moreFields:["website","phone","email","fax"],geometry:["point","area"],terms:["sewage*","water treatment plant","reclamation plant"],tags:{man_made:"wastewater_plant"},name:"Wastewater Plant"},"man_made/water_tower":{icon:"maki-water",fields:["operator","height"],geometry:["point","area"],tags:{man_made:"water_tower"},name:"Water Tower"},"man_made/water_well":{icon:"maki-water",fields:["operator"],geometry:["point","area"],tags:{man_made:"water_well"},name:"Water Well"},"man_made/water_works":{icon:"maki-water",fields:["name","operator","address"],geometry:["point","area"],tags:{man_made:"water_works"},name:"Water Works"},"man_made/watermill":{icon:"maki-watermill",fields:["building_area"],geometry:["point","area"],terms:["water","wheel","mill"],tags:{man_made:"watermill"},name:"Watermill"},"man_made/windmill":{icon:"maki-windmill",fields:["building_area"],geometry:["point","area"],terms:["wind","wheel","mill"],tags:{man_made:"windmill"},name:"Windmill"},"man_made/works":{icon:"maki-industry",fields:["name","operator","address","building_area","product"],moreFields:["website","phone","email","fax"],geometry:["point","area"],terms:["assembly","build","brewery","car","plant","plastic","processing","manufacture","refinery"],tags:{man_made:"works"},name:"Factory"},manhole:{icon:"maki-circle-stroked",fields:["manhole","operator","label","ref"],geometry:["point","vertex"],tags:{manhole:"*"},addTags:{man_made:"manhole",manhole:"*"},terms:["cover","hole","sewer","sewage","telecom"],name:"Manhole"},"manhole/drain":{icon:"maki-water",fields:["operator","ref"],geometry:["point","vertex"],tags:{manhole:"drain"},addTags:{man_made:"manhole",manhole:"drain"},terms:["cover","drain","hole","rain","sewer","sewage","storm"],name:"Storm Drain"},"manhole/telecom":{icon:"maki-circle-stroked",fields:["operator","ref"],geometry:["point","vertex"],tags:{manhole:"telecom"},addTags:{man_made:"manhole",manhole:"telecom"},terms:["cover","phone","hole","telecom","telephone","bt"],name:"Telecom Manhole"},"natural/bare_rock":{geometry:["area"],tags:{natural:"bare_rock"},terms:["rock"],name:"Bare Rock"},"natural/bay":{icon:"temaki-beach",geometry:["point","line","area"],fields:["name"],tags:{natural:"bay"},terms:[],name:"Bay"},"natural/beach":{icon:"temaki-beach",fields:["surface"],geometry:["point","area"],tags:{natural:"beach"},terms:["shore"],name:"Beach"},"natural/cape":{icon:"temaki-beach",fields:["name","elevation","description"],geometry:["point"],tags:{natural:"cape"},terms:["bay","coastline","erosion","headland","promontory"],name:"Cape"},"natural/cave_entrance":{icon:"maki-triangle",geometry:["point","area"],fields:["name","elevation","access_simple","direction","fee","payment_multi_fee"],tags:{natural:"cave_entrance"},terms:["cavern","hollow","grotto","shelter","cavity"],name:"Cave Entrance"},"natural/cliff":{icon:"maki-triangle",fields:["name","height"],geometry:["point","vertex","line","area"],tags:{natural:"cliff"},terms:["crag","escarpment","rock face","scarp"],name:"Cliff"},"natural/coastline":{geometry:["line"],tags:{natural:"coastline"},terms:["shore"],name:"Coastline"},"natural/fell":{geometry:["area"],tags:{natural:"fell"},terms:[],name:"Fell"},"natural/glacier":{icon:"temaki-snow",geometry:["area"],tags:{natural:"glacier"},terms:["ice","snow"],name:"Glacier"},"natural/grassland":{geometry:["area"],tags:{natural:"grassland"},terms:["prairie","savanna"],name:"Grassland"},"natural/heath":{geometry:["area"],tags:{natural:"heath"},terms:[],name:"Heath"},"natural/mud":{geometry:["area"],tags:{natural:"mud"},terms:["wetland"],name:"Mud"},"natural/peak":{icon:"maki-mountain",fields:["name","elevation"],geometry:["point","vertex"],tags:{natural:"peak"},terms:["acme","aiguille","alp","climax","crest","crown","hill","mount","mountain","pinnacle","summit","tip","top"],name:"Peak"},"natural/reef":{icon:"temaki-beach",geometry:["point","area"],tags:{natural:"reef"},terms:["barrier","coral","ocean","sand","shoal"],name:"Reef"},"natural/ridge":{geometry:["line"],tags:{natural:"ridge"},terms:["crest"],name:"Ridge"},"natural/rock":{icon:"temaki-boulder2",fields:["name"],geometry:["point","area"],tags:{natural:"rock"},terms:["boulder","stone","rock"],name:"Attached Rock / Boulder"},"natural/saddle":{icon:"maki-triangle-stroked",fields:["elevation"],geometry:["point","vertex"],tags:{natural:"saddle"},terms:["pass","mountain pass","top"],name:"Saddle"},"natural/sand":{geometry:["area"],tags:{natural:"sand"},terms:["desert"],name:"Sand"},"natural/scree":{geometry:["area"],tags:{natural:"scree"},terms:["loose rocks"],name:"Scree"},"natural/scrub":{geometry:["area"],tags:{natural:"scrub"},terms:["bush","shrubs"],name:"Scrub"},"natural/shingle":{geometry:["area"],tags:{natural:"shingle"},terms:["beach","gravel","pebbles","riverbed","rounded rock fragments"],name:"Shingle"},"natural/spring":{icon:"maki-water",fields:["name","intermittent"],geometry:["point","vertex"],tags:{natural:"spring"},terms:[],name:"Spring"},"natural/stone":{icon:"temaki-boulder1",fields:["name"],geometry:["point","area"],tags:{natural:"stone"},terms:["boulder","stone","rock"],name:"Unattached Stone / Boulder"},"natural/tree_row":{icon:"maki-park",fields:["leaf_type","leaf_cycle","denotation"],geometry:["line"],tags:{natural:"tree_row"},terms:[],name:"Tree Row"},"natural/tree":{icon:"maki-park",fields:["leaf_type_singular","leaf_cycle_singular","denotation"],geometry:["point","vertex"],tags:{natural:"tree"},terms:[],name:"Tree"},"natural/valley":{icon:"maki-triangle-stroked",fields:["name","elevation","description"],geometry:["vertex","point","line"],tags:{natural:"valley"},terms:["canyon","dale","dell","dene","depression","glen","gorge","gully","gulley","gultch","hollow","ravine","rift","vale"],name:"Valley"},"natural/volcano":{icon:"maki-volcano",fields:["name","elevation","volcano/status","volcano/type"],geometry:["point","vertex"],tags:{natural:"volcano"},terms:["mountain","crater"],name:"Volcano"},"natural/water":{icon:"maki-water",fields:["name","water","intermittent"],moreFields:["fishing","salt","tidal"],geometry:["area"],tags:{natural:"water"},name:"Water"},"natural/water/basin":{icon:"maki-water",fields:["name","basin","intermittent_yes"],geometry:["area"],tags:{natural:"water",water:"basin"},reference:{key:"water",value:"basin"},terms:["detention","drain","overflow","rain","retention"],name:"Basin"},"natural/water/canal":{icon:"iD-waterway-canal",fields:["{natural/water}","salt"],geometry:["area"],tags:{natural:"water",water:"canal"},reference:{key:"water",value:"canal"},name:"Canal"},"natural/water/lake":{icon:"maki-water",fields:["{natural/water}","salt","tidal"],geometry:["area"],tags:{natural:"water",water:"lake"},reference:{key:"water",value:"lake"},terms:["lakelet","loch","mere"],name:"Lake"},"natural/water/moat":{icon:"maki-water",fields:["{natural/water}","salt"],geometry:["area"],tags:{natural:"water",water:"moat"},name:"Moat"},"natural/water/pond":{icon:"maki-water",fields:["{natural/water}","salt"],geometry:["area"],tags:{natural:"water",water:"pond"},reference:{key:"water",value:"pond"},terms:["lakelet","millpond","tarn","pool","mere"],name:"Pond"},"natural/water/reservoir":{icon:"maki-water",geometry:["area"],tags:{natural:"water",water:"reservoir"},reference:{key:"water",value:"reservoir"},name:"Reservoir"},"natural/water/river":{icon:"iD-waterway-river",fields:["{natural/water}","tidal"],geometry:["area"],tags:{natural:"water",water:"river"},reference:{key:"water",value:"river"},terms:["beck","branch","brook","course","creek","estuary","rill","riverbank","rivulet","run","runnel","stream","tributary","watercourse"],name:"River"},"natural/water/stream":{icon:"iD-waterway-stream",fields:["{natural/water}"],geometry:["area"],tags:{natural:"water",water:"stream"},reference:{key:"water",value:"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"],name:"Stream"},"natural/water/wastewater":{icon:"maki-water",geometry:["area"],tags:{natural:"water",water:"wastewater"},reference:{key:"water",value:"wastewater"},terms:["excrement","shit","sewage","wastewater","Settling Basin","Clarifier Basin"],name:"Wastewater Basin"},"natural/wetland":{icon:"maki-wetland",fields:["wetland","salt","tidal"],geometry:["point","area"],tags:{natural:"wetland"},terms:["bog","fen","marsh","mire","moor","muskeg","peatland","quagmire","reedbed","saltmarsh","swamp","tidalflat","wet meadow"],name:"Wetland"},"natural/wood":{icon:"maki-park-alt1",fields:["name","leaf_type","leaf_cycle"],geometry:["point","area"],tags:{natural:"wood"},terms:["tree"],name:"Wood"},"noexit/yes":{icon:"maki-barrier",geometry:["vertex"],terms:["no exit","road end","dead end"],tags:{noexit:"yes"},reference:{key:"noexit",value:"*"},name:"No Exit"},office:{icon:"maki-suitcase",fields:["name","office","address","building_area","opening_hours"],moreFields:["air_conditioning","building/levels_building","height_building","email","fax","internet_access","internet_access/fee","internet_access/ssid","operator","phone","smoking","website","wheelchair"],geometry:["point","vertex","area"],tags:{office:"*"},terms:[],name:"Office"},"office/administrative":{icon:"maki-suitcase",geometry:["point","area"],tags:{office:"administrative"},terms:[],searchable:false,name:"Administrative Office",replacement:"office/government"},"office/physician":{icon:"maki-suitcase",geometry:["point","area"],tags:{office:"physician"},searchable:false,name:"Physician"},"office/travel_agent":{icon:"maki-suitcase",geometry:["point","area"],tags:{office:"travel_agent"},reference:{key:"shop",value:"travel_agency"},terms:[],name:"Travel Agency",searchable:false},"office/accountant":{icon:"temaki-accounting",geometry:["point","area"],tags:{office:"accountant"},terms:[],name:"Accountant Office"},"office/adoption_agency":{icon:"maki-suitcase",geometry:["point","area"],tags:{office:"adoption_agency"},terms:[],name:"Adoption Agency"},"office/advertising_agency":{icon:"maki-suitcase",geometry:["point","area"],tags:{office:"advertising_agency"},terms:["ad","ad agency","advert agency","advertising","marketing"],name:"Advertising Agency"},"office/architect":{icon:"fas-drafting-compass",geometry:["point","area"],tags:{office:"architect"},terms:[],name:"Architect Office"},"office/association":{icon:"maki-suitcase",geometry:["point","area"],tags:{office:"association"},terms:["association","non-profit","nonprofit","organization","society"],name:"Nonprofit Organization Office"},"office/charity":{icon:"maki-suitcase",geometry:["point","area"],tags:{office:"charity"},terms:["charitable organization"],name:"Charity Office"},"office/company":{icon:"maki-suitcase",geometry:["point","area"],tags:{office:"company"},terms:[],name:"Corporate Office"},"office/coworking":{icon:"maki-suitcase",fields:["{office}","internet_access"],moreFields:["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/diplomatic":{icon:"maki-embassy",fields:["name","diplomatic","country","target","diplomatic/services","{office}"],geometry:["point","area"],tags:{office:"diplomatic"},terms:[],name:"Diplomatic Office"},"office/diplomatic/consulate":{icon:"maki-embassy",fields:["name","consulate","{office/diplomatic}"],geometry:["point","area"],tags:{office:"diplomatic",diplomatic:"consulate"},reference:{key:"diplomatic",value:"consulate"},terms:[],name:"Consulate"},"office/diplomatic/embassy":{icon:"maki-embassy",fields:["name","embassy","{office/diplomatic}"],geometry:["point","area"],tags:{office:"diplomatic",diplomatic:"embassy"},reference:{key:"diplomatic",value:"embassy"},terms:[],name:"Embassy"},"office/diplomatic/liaison":{icon:"maki-embassy",fields:["name","liaison","{office/diplomatic}"],geometry:["point","area"],tags:{office:"diplomatic",diplomatic:"liaison"},reference:{key:"diplomatic",value:"liaison"},terms:[],name:"Liaison Office"},"office/educational_institution":{icon:"maki-school",geometry:["point","area"],tags:{office:"educational_institution"},terms:[],name:"Educational Institution"},"office/employment_agency":{icon:"maki-suitcase",geometry:["point","area"],tags:{office:"employment_agency"},terms:["job"],name:"Employment Agency"},"office/energy_supplier":{icon:"maki-suitcase",geometry:["point","area"],tags:{office:"energy_supplier"},terms:["electricity","energy company","energy utility","gas utility"],name:"Energy Supplier Office"},"office/estate_agent":{icon:"temaki-real_estate_agency",geometry:["point","area"],tags:{office:"estate_agent"},terms:["real estate"],name:"Real Estate Office"},"office/financial_advisor":{icon:"maki-suitcase",geometry:["point","area"],tags:{office:"financial_advisor"},terms:["401k","inheritance","savings","stocks","retirement","wealth management"],name:"Financial Advisor"},"office/financial":{icon:"maki-suitcase",geometry:["point","area"],tags:{office:"financial"},terms:[],name:"Financial Office"},"office/forestry":{icon:"maki-suitcase",geometry:["point","area"],tags:{office:"forestry"},terms:["forest","ranger"],name:"Forestry Office"},"office/foundation":{icon:"maki-suitcase",geometry:["point","area"],tags:{office:"foundation"},terms:[],name:"Foundation Office"},"office/government":{icon:"maki-town-hall",fields:["name","government","{office}"],geometry:["point","area"],tags:{office:"government"},terms:[],name:"Government Office"},"office/government/register_office":{icon:"maki-town-hall",fields:["{office}","operator"],geometry:["point","area"],terms:["clerk","marriage","death","birth","certificate"],tags:{office:"government",government:"register_office"},reference:{key:"government",value:"register_office"},name:"Register Office"},"office/government/tax":{icon:"maki-town-hall",fields:["{office}","operator"],geometry:["point","area"],terms:["fiscal authorities","revenue office","tax office"],tags:{office:"government",government:"tax"},reference:{key:"government",value:"tax"},name:"Tax and Revenue Office"},"office/guide":{icon:"maki-suitcase",geometry:["point","area"],tags:{office:"guide"},terms:["dive guide","mountain guide","tour guide"],name:"Tour Guide Office"},"office/insurance":{icon:"maki-suitcase",geometry:["point","area"],tags:{office:"insurance"},terms:[],name:"Insurance Office"},"office/it":{icon:"maki-suitcase",geometry:["point","area"],tags:{office:"it"},terms:["computer","information","software","technology"],name:"Information Technology Office"},"office/lawyer":{icon:"fas-balance-scale",geometry:["point","area"],tags:{office:"lawyer"},terms:[],name:"Law Office"},"office/lawyer/notary":{icon:"maki-suitcase",geometry:["point","area"],tags:{office:"lawyer",lawyer:"notary"},reference:{key:"office",value:"notary"},searchable:false,name:"Notary Office"},"office/moving_company":{icon:"fas-people-carry",geometry:["point","area"],tags:{office:"moving_company"},terms:["relocation"],name:"Moving Company Office"},"office/newspaper":{icon:"fas-newspaper",geometry:["point","area"],tags:{office:"newspaper"},terms:[],name:"Newspaper Office"},"office/ngo":{icon:"maki-suitcase",geometry:["point","area"],tags:{office:"ngo"},terms:["ngo","non government","non-government","organization","organisation"],name:"NGO Office"},"office/notary":{icon:"fas-stamp",geometry:["point","area"],tags:{office:"notary"},terms:["clerk","deeds","estate","signature","wills"],name:"Notary Office"},"office/political_party":{icon:"maki-town-hall",geometry:["point","area"],tags:{office:"political_party"},terms:[],name:"Political Party"},"office/private_investigator":{icon:"fas-user-secret",geometry:["point","area"],tags:{office:"private_investigator"},terms:["PI","private eye","private detective"],name:"Private Investigator Office"},"office/quango":{icon:"maki-suitcase",geometry:["point","area"],tags:{office:"quango"},terms:["ngo","non government","non-government","organization","organisation","quasi autonomous","quasi-autonomous"],name:"Quasi-NGO Office"},"office/religion":{icon:"maki-suitcase",fields:["{office}","religion","denomination"],geometry:["point","area"],tags:{office:"religion"},terms:[],name:"Religious Office"},"office/research":{icon:"maki-suitcase",geometry:["point","area"],tags:{office:"research"},terms:[],name:"Research Office"},"office/surveyor":{icon:"maki-suitcase",geometry:["point","area"],tags:{office:"surveyor"},terms:[],name:"Surveyor Office"},"office/tax_advisor":{icon:"maki-suitcase",geometry:["point","area"],tags:{office:"tax_advisor"},terms:["tax","tax consultant"],name:"Tax Advisor Office"},"office/telecommunication":{icon:"maki-telephone",geometry:["point","area"],tags:{office:"telecommunication"},terms:["communication","internet","phone","voice"],name:"Telecom Office"},"office/therapist":{icon:"maki-suitcase",geometry:["point","area"],tags:{office:"therapist"},terms:["therapy"],name:"Therapist Office"},"office/water_utility":{icon:"maki-suitcase",fields:["{office}","operator"],geometry:["point","area"],tags:{office:"water_utility"},terms:["water board","utility"],name:"Water Utility Office"},"piste/downhill":{icon:"fas-skiing",fields:["name","piste/type","piste/difficulty_downhill","piste/grooming_downhill","oneway","lit"],geometry:["line","area"],terms:["ski","alpine","snowboard","downhill","piste"],tags:{"piste:type":"downhill"},name:"Downhill Piste/Ski Run"},"piste/downhill/halfpipe":{icon:"fas-snowboarding",fields:["name","piste/type","piste/difficulty_downhill","piste/grooming_downhill","oneway","lit"],geometry:["line","area"],terms:["ski","alpine","halfpipe","half pipe","snowboard","downhill","piste"],tags:{"piste:type":"downhill",man_made:"piste:halfpipe"},name:"Halfpipe"},"piste/hike":{icon:"temaki-snow_shoeing",fields:["name","piste/type","piste/difficulty","piste/grooming_hike","oneway","lit"],geometry:["line","area"],terms:["hike","winter hiking","snowshoe","snowshoeing","piste","ski"],tags:{"piste:type":"hike"},name:"Snowshoeing or Winter Hiking Trail"},"piste/ice_skate":{icon:"fas-skating",fields:["name","piste/type","sport_ice","oneway","lit"],geometry:["line","area"],terms:["ice","skating","ski","piste"],tags:{"piste:type":"ice_skate"},name:"Ice Skating Piste"},"piste/nordic":{icon:"fas-skiing-nordic",fields:["name","piste/type","piste/difficulty_nordic","piste/grooming_nordic","oneway","lit"],geometry:["line","area"],terms:["ski","nordic","crosscountry","skating","piste"],tags:{"piste:type":"nordic"},name:"Nordic or Crosscountry Piste/Ski Trail"},"piste/piste":{icon:"fas-skiing",fields:["name","piste/type","piste/difficulty","piste/grooming","oneway","lit"],geometry:["line","area"],terms:["ski","nordic","crosscountry","downhill","alpine","snowboard","skitour","ski touring","sled","luge","sleigh","sledge","ski-joring","husky","horse","winter hiking","snowshoe","snowshoeing","ice","skating"],tags:{"piste:type":"*"},name:"Winter Sport Trails"},"piste/skitour":{icon:"fas-skiing-nordic",fields:["name","piste/type","piste/difficulty_skitour","piste/grooming","oneway","lit"],geometry:["line","area"],terms:["ski","skitour","crosscountry","ski touring","piste"],tags:{"piste:type":"skitour"},name:"Ski Touring Trail"},"piste/sled":{icon:"temaki-sledding",fields:["name","piste/type","piste/difficulty","piste/grooming","oneway","lit"],geometry:["line","area"],terms:["ski","sled","luge","sleigh","sledge","piste"],tags:{"piste:type":"sled"},name:"Sled Piste"},"piste/sleigh":{icon:"fas-sleigh",fields:["name","piste/type","piste/difficulty","piste/grooming","oneway","lit"],geometry:["line","area"],terms:["ski","piste","sled","luge","sleigh","sledge","ski-joring","husky","horse"],tags:{"piste:type":"sleigh"},name:"Sleigh Piste"},"place/farm":{icon:"maki-farm",geometry:["point","area"],fields:["name"],tags:{place:"farm"},name:"Farm",searchable:false},"place/city_block":{icon:"maki-triangle-stroked",fields:["name"],moreFields:["website"],geometry:["point","area"],tags:{place:"city_block"},name:"City Block"},"place/city":{icon:"maki-city",fields:["name","population"],moreFields:["website"],geometry:["point","area"],tags:{place:"city"},name:"City"},"place/hamlet":{icon:"maki-triangle-stroked",fields:["name","population"],moreFields:["website"],geometry:["point","area"],tags:{place:"hamlet"},name:"Hamlet"},"place/island":{icon:"maki-mountain",geometry:["point","area"],fields:["name"],terms:["archipelago","atoll","bar","cay","isle","islet","key","reef"],tags:{place:"island"},name:"Island"},"place/islet":{icon:"maki-mountain",geometry:["point","area"],fields:["name"],terms:["archipelago","atoll","bar","cay","isle","islet","key","reef"],tags:{place:"islet"},name:"Islet"},"place/isolated_dwelling":{icon:"maki-home",geometry:["point","area"],fields:["name"],tags:{place:"isolated_dwelling"},name:"Isolated Dwelling"},"place/locality":{icon:"maki-triangle-stroked",geometry:["point","area"],moreFields:["website"],fields:["name"],tags:{place:"locality"},name:"Locality"},"place/neighbourhood":{icon:"maki-triangle-stroked",fields:["name","population"],moreFields:["website"],geometry:["point","area"],tags:{place:"neighbourhood"},terms:["neighbourhood"],name:"Neighborhood"},"place/plot":{icon:"maki-triangle-stroked",fields:["name"],geometry:["point","area"],tags:{place:"plot"},terms:["tract","land","lot","parcel"],name:"Plot"},"place/quarter":{icon:"maki-triangle-stroked",fields:["name","population"],moreFields:["website"],geometry:["point","area"],tags:{place:"quarter"},terms:["boro","borough","quarter"],name:"Sub-Borough / Quarter"},"place/square":{geometry:["point","area"],fields:["name"],moreFields:["website"],tags:{place:"square"},name:"Square"},"place/suburb":{icon:"maki-triangle-stroked",fields:["name","population"],moreFields:["website"],geometry:["point","area"],tags:{place:"suburb"},terms:["boro","borough","quarter"],name:"Borough / Suburb"},"place/town":{icon:"maki-town",fields:["name","population"],moreFields:["website"],geometry:["point","area"],tags:{place:"town"},name:"Town"},"place/village":{icon:"maki-village",fields:["name","population"],moreFields:["website"],geometry:["point","area"],tags:{place:"village"},name:"Village"},"playground/balance_beam":{icon:"maki-playground",geometry:["point","line"],tags:{playground:"balancebeam"},name:"Play Balance Beam"},"playground/basket_spinner":{icon:"maki-playground",geometry:["point"],terms:["basket rotator"],tags:{playground:"basketrotator"},name:"Basket Spinner"},"playground/basket_swing":{icon:"maki-playground",geometry:["point"],tags:{playground:"basketswing"},name:"Basket Swing"},"playground/climbing_frame":{icon:"maki-playground",geometry:["point","area"],tags:{playground:"climbingframe"},name:"Climbing Frame"},"playground/cushion":{icon:"maki-playground",geometry:["point","area"],tags:{playground:"cushion"},name:"Bouncy Cushion"},"playground/horizontal_bar":{icon:"maki-pitch",fields:["height"],geometry:["point"],terms:["high bar"],tags:{playground:"horizontal_bar"},name:"Play Horizontal Bar"},"playground/rocker":{icon:"maki-playground",geometry:["point"],tags:{playground:"springy"},name:"Spring Rider",terms:["spring rocker","springy rocker"]},"playground/roundabout":{icon:"maki-stadium",fields:["bench"],geometry:["point","area"],tags:{playground:"roundabout"},name:"Play Roundabout",terms:["merry-go-round"]},"playground/sandpit":{icon:"maki-playground",geometry:["point","area"],tags:{playground:"sandpit"},name:"Sandpit"},"playground/seesaw":{icon:"maki-playground",geometry:["point"],tags:{playground:"seesaw"},name:"Seesaw"},"playground/slide":{icon:"maki-playground",geometry:["point","line"],tags:{playground:"slide"},name:"Slide"},"playground/structure":{icon:"maki-pitch",geometry:["point","area"],tags:{playground:"structure"},name:"Play Structure"},"playground/swing":{icon:"maki-playground",fields:["capacity","playground/baby","wheelchair"],geometry:["point"],tags:{playground:"swing"},name:"Swing"},"playground/zipwire":{icon:"maki-playground",geometry:["point","line"],tags:{playground:"zipwire"},name:"Zip Wire"},point:{fields:["name"],geometry:["vertex","point"],tags:{},terms:["node","other","vertex","vertices"],name:"Point",matchScore:0.1},"power/sub_station":{icon:"temaki-power",fields:["substation","operator","building","ref"],geometry:["point","area"],tags:{power:"sub_station"},reference:{key:"power",value:"substation"},name:"Substation",searchable:false},"power/cable/underground":{fields:["name","operator","voltage","ref","layer"],geometry:["line"],tags:{power:"cable",location:"underground"},addTags:{power:"cable",location:"underground",layer:"-1"},name:"Underground Power Cable"},"power/generator":{icon:"temaki-power",fields:["operator","generator/source","generator/method","generator/type","generator/output/electricity","ref"],moreFields:["manufacturer"],geometry:["point","vertex","area"],terms:["hydro","solar","turbine","wind"],tags:{power:"generator"},name:"Power Generator"},"power/generator/method/photovoltaic":{icon:"fas-solar-panel",fields:["operator","generator/output/electricity","ref"],moreFields:["manufacturer"],geometry:["point","vertex","area"],terms:["photovoltaic module","PV module","sunlight"],tags:{power:"generator","generator:method":"photovoltaic"},addTags:{power:"generator","generator:source":"solar","generator:method":"photovoltaic","generator:type":"solar_photovoltaic_panel","generator:output:electricity":"yes"},reference:{key:"generator:method",value:"photovoltaic"},name:"Solar Panel"},"power/generator/source/hydro":{icon:"temaki-power",fields:["operator","generator/method","generator/type","generator/output/electricity","ref"],moreFields:["height","manufacturer"],geometry:["point","vertex","area"],terms:["dam","generator","francis turbine","hydroelectricity","kaplan turbine","pelton turbine"],tags:{power:"generator","generator:source":"hydro"},addTags:{power:"generator","generator:source":"hydro","generator:output:electricity":"yes"},reference:{key:"generator:source",value:"hydro"},name:"Water Turbine"},"power/generator/source/nuclear":{icon:"temaki-radiation",fields:["operator","generator/source","generator/method","generator/type","generator/output/electricity","ref"],moreFields:["manufacturer"],geometry:["point","vertex","area"],terms:["fission","generator","nuclear","nuke","reactor"],tags:{power:"generator","generator:source":"nuclear","generator:method":"fission"},reference:{key:"generator:source",value:"nuclear"},name:"Nuclear Reactor"},"power/generator/source/wind":{icon:"temaki-wind_turbine",fields:["operator","generator/type","generator/output/electricity","height","ref"],moreFields:["manufacturer"],geometry:["point","vertex","area"],terms:["generator","turbine","windmill","wind"],tags:{power:"generator","generator:source":"wind","generator:method":"wind_turbine"},reference:{key:"generator:source",value:"wind"},name:"Wind Turbine"},"power/line":{icon:"iD-power-line",fields:["name","operator","voltage","ref","layer"],geometry:["line"],tags:{power:"line"},name:"Power Line"},"power/minor_line":{icon:"iD-power-line",fields:["name","operator","voltage","ref","layer"],geometry:["line"],tags:{power:"minor_line"},name:"Minor Power Line"},"power/plant":{icon:"maki-industry",fields:["name","operator","address","plant/output/electricity","start_date"],geometry:["area"],tags:{power:"plant"},addTags:{power:"plant",landuse:"industrial"},terms:["coal","gas","generat*","hydro","nuclear","power","station"],name:"Power Station Grounds"},"power/pole":{fields:["ref","material","operator","manufacturer"],geometry:["point","vertex"],tags:{power:"pole"},name:"Power Pole"},"power/substation":{icon:"temaki-power",fields:["substation","operator","building","ref"],geometry:["point","area"],tags:{power:"substation"},name:"Substation"},"power/switch":{icon:"temaki-power",fields:["switch","operator","location","cables","voltage","ref"],geometry:["point","vertex"],tags:{power:"switch"},name:"Power Switch"},"power/tower":{fields:["design","ref","material","operator","manufacturer"],geometry:["point","vertex"],terms:["power"],tags:{power:"tower"},name:"High-Voltage Tower"},"power/transformer":{icon:"temaki-power",fields:["ref","operator","transformer","location","rating","devices","phases"],moreFields:["frequency","manufacturer","voltage/primary","voltage/secondary","voltage/tertiary","windings","windings/configuration"],geometry:["point","vertex","area"],tags:{power:"transformer"},name:"Transformer"},"public_transport/platform_point":{icon:"maki-rail",fields:["name","network","operator","departures_board","shelter"],moreFields:["bench","bin","lit","wheelchair"],geometry:["point"],tags:{public_transport:"platform"},terms:["platform","public transit","public transportation","transit","transportation"],name:"Transit Stop / Platform",matchScore:0.2},"public_transport/platform":{icon:"temaki-pedestrian",fields:["ref_platform","network","operator","departures_board","surface"],moreFields:["lit","wheelchair"],geometry:["line","area"],tags:{public_transport:"platform"},addTags:{public_transport:"platform",highway:"footway"},terms:["platform","public transit","public transportation","transit","transportation"],name:"Transit Platform",matchScore:0.2},"public_transport/platform/aerialway_point":{icon:"maki-aerialway",fields:["{public_transport/platform_point}"],moreFields:["{public_transport/platform_point}"],geometry:["point"],tags:{public_transport:"platform",aerialway:"yes"},reference:{key:"public_transport",value:"platform"},terms:["aerialway","cable car","platform","public transit","public transportation","transit","transportation"],searchable:false,name:"Aerialway Stop / Platform"},"public_transport/platform/ferry_point":{icon:"maki-ferry",fields:["{public_transport/platform_point}"],moreFields:["{public_transport/platform_point}"],geometry:["point"],tags:{public_transport:"platform",ferry:"yes"},reference:{key:"public_transport",value:"platform"},terms:["boat","dock","ferry","pier","platform","public transit","public transportation","transit","transportation"],searchable:false,name:"Ferry Stop / Platform"},"public_transport/platform/light_rail_point":{icon:"temaki-light_rail",fields:["{public_transport/platform_point}"],moreFields:["{public_transport/platform_point}"],geometry:["point"],tags:{public_transport:"platform",light_rail:"yes"},reference:{key:"railway",value:"platform"},terms:["electric","light rail","platform","public transit","public transportation","rail","track","tram","trolley","transit","transportation"],searchable:false,name:"Light Rail Stop / Platform"},"public_transport/platform/monorail_point":{icon:"temaki-monorail",fields:["{public_transport/platform_point}"],moreFields:["{public_transport/platform_point}"],geometry:["point"],tags:{public_transport:"platform",monorail:"yes"},reference:{key:"railway",value:"platform"},terms:["monorail","platform","public transit","public transportation","rail","transit","transportation"],searchable:false,name:"Monorail Stop / Platform"},"public_transport/platform/subway_point":{icon:"temaki-subway",fields:["{public_transport/platform_point}"],moreFields:["{public_transport/platform_point}"],geometry:["point"],tags:{public_transport:"platform",subway:"yes"},reference:{key:"railway",value:"platform"},terms:["metro","platform","public transit","public transportation","rail","subway","track","transit","transportation","underground"],searchable:false,name:"Subway Stop / Platform"},"public_transport/platform/train_point":{icon:"maki-rail",fields:["{public_transport/platform_point}"],moreFields:["{public_transport/platform_point}"],geometry:["point"],tags:{public_transport:"platform",train:"yes"},reference:{key:"railway",value:"platform"},terms:["platform","public transit","public transportation","rail","track","train","transit","transportation"],searchable:false,name:"Train Stop / Platform"},"public_transport/platform/tram_point":{icon:"temaki-tram",fields:["{public_transport/platform_point}"],moreFields:["{public_transport/platform_point}"],geometry:["point"],tags:{public_transport:"platform",tram:"yes"},reference:{key:"public_transport",value:"platform"},terms:["electric","light rail","platform","public transit","public transportation","rail","streetcar","track","tram","trolley","transit","transportation"],searchable:false,name:"Tram Stop / Platform"},"public_transport/platform/aerialway":{icon:"temaki-pedestrian",fields:["{public_transport/platform}"],moreFields:["{public_transport/platform}"],geometry:["line","area"],tags:{public_transport:"platform",aerialway:"yes"},addTags:{public_transport:"platform",aerialway:"yes",highway:"footway"},reference:{key:"public_transport",value:"platform"},terms:["aerialway","cable car","platform","public transit","public transportation","transit","transportation"],name:"Aerialway Platform"},"public_transport/platform/bus_point":{icon:"maki-bus",fields:["{public_transport/platform_point}"],moreFields:["{public_transport/platform_point}"],geometry:["point","vertex"],tags:{public_transport:"platform",bus:"yes"},addTags:{public_transport:"platform",bus:"yes",highway:"bus_stop"},reference:{key:"public_transport",value:"platform"},terms:["bus","platform","public transit","public transportation","transit","transportation"],name:"Bus Stop"},"public_transport/platform/bus":{icon:"temaki-pedestrian",fields:["{public_transport/platform}"],moreFields:["{public_transport/platform}"],geometry:["line","area"],tags:{public_transport:"platform",bus:"yes"},addTags:{public_transport:"platform",bus:"yes",highway:"footway"},reference:{key:"public_transport",value:"platform"},terms:["bus","platform","public transit","public transportation","transit","transportation"],name:"Bus Platform"},"public_transport/platform/ferry":{icon:"temaki-pedestrian",fields:["{public_transport/platform}"],moreFields:["{public_transport/platform}"],geometry:["line","area"],tags:{public_transport:"platform",ferry:"yes"},addTags:{public_transport:"platform",ferry:"yes",highway:"footway"},reference:{key:"public_transport",value:"platform"},terms:["boat","dock","ferry","pier","platform","public transit","public transportation","transit","transportation"],name:"Ferry Platform"},"public_transport/platform/light_rail":{icon:"temaki-pedestrian",fields:["{public_transport/platform}"],moreFields:["{public_transport/platform}"],geometry:["line","area"],tags:{public_transport:"platform",light_rail:"yes"},addTags:{public_transport:"platform",light_rail:"yes",railway:"platform",highway:"footway"},reference:{key:"railway",value:"platform"},terms:["electric","light rail","platform","public transit","public transportation","rail","track","tram","trolley","transit","transportation"],name:"Light Rail Platform"},"public_transport/platform/monorail":{icon:"temaki-pedestrian",fields:["{public_transport/platform}"],moreFields:["{public_transport/platform}"],geometry:["line","area"],tags:{public_transport:"platform",monorail:"yes"},addTags:{public_transport:"platform",monorail:"yes",railway:"platform",highway:"footway"},reference:{key:"railway",value:"platform"},terms:["monorail","platform","public transit","public transportation","rail","transit","transportation"],name:"Monorail Platform"},"public_transport/platform/subway":{icon:"temaki-pedestrian",fields:["{public_transport/platform}"],moreFields:["{public_transport/platform}"],geometry:["line","area"],tags:{public_transport:"platform",subway:"yes"},addTags:{public_transport:"platform",subway:"yes",railway:"platform",highway:"footway"},reference:{key:"railway",value:"platform"},terms:["metro","platform","public transit","public transportation","rail","subway","track","transit","transportation","underground"],name:"Subway Platform"},"public_transport/platform/train":{icon:"temaki-pedestrian",fields:["{public_transport/platform}"],moreFields:["{public_transport/platform}"],geometry:["line","area"],tags:{public_transport:"platform",train:"yes"},addTags:{public_transport:"platform",train:"yes",railway:"platform",highway:"footway"},reference:{key:"railway",value:"platform"},terms:["platform","public transit","public transportation","rail","track","train","transit","transportation"],name:"Train Platform"},"public_transport/platform/tram":{icon:"temaki-pedestrian",fields:["{public_transport/platform}"],moreFields:["{public_transport/platform}"],geometry:["line","area"],tags:{public_transport:"platform",tram:"yes"},addTags:{public_transport:"platform",tram:"yes",railway:"platform",highway:"footway"},reference:{key:"public_transport",value:"platform"},terms:["electric","light rail","platform","public transit","public transportation","rail","streetcar","track","tram","trolley","transit","transportation"],name:"Tram Platform"},"public_transport/platform/trolleybus_point":{icon:"temaki-trolleybus",fields:["{public_transport/platform_point}"],moreFields:["{public_transport/platform_point}"],geometry:["point","vertex"],tags:{public_transport:"platform",trolleybus:"yes"},addTags:{public_transport:"platform",trolleybus:"yes",highway:"bus_stop"},reference:{key:"public_transport",value:"platform"},terms:["bus","electric","platform","public transit","public transportation","streetcar","trackless","tram","trolley","transit","transportation"],name:"Trolleybus Stop"},"public_transport/platform/trolleybus":{icon:"temaki-pedestrian",fields:["{public_transport/platform}"],moreFields:["{public_transport/platform}"],geometry:["line","area"],tags:{public_transport:"platform",trolleybus:"yes"},addTags:{public_transport:"platform",trolleybus:"yes",highway:"footway"},reference:{key:"public_transport",value:"platform"},terms:["bus","electric","platform","public transit","public transportation","streetcar","trackless","tram","trolley","transit","transportation"],name:"Trolleybus Platform"},"public_transport/station_aerialway":{icon:"maki-aerialway",fields:["{public_transport/station}","aerialway/access","aerialway/summer/access"],moreFields:["{public_transport/station}"],geometry:["point","vertex","area"],tags:{public_transport:"station",aerialway:"yes"},reference:{key:"aerialway",value:"station"},terms:["aerialway","cable car","public transit","public transportation","station","terminal","transit","transportation"],name:"Aerialway Station"},"public_transport/station_bus":{icon:"maki-bus",fields:["{public_transport/station}"],moreFields:["{public_transport/station}"],geometry:["point","area"],tags:{public_transport:"station",bus:"yes"},addTags:{public_transport:"station",bus:"yes",amenity:"bus_station"},reference:{key:"amenity",value:"bus_station"},terms:["bus","public transit","public transportation","station","terminal","transit","transportation"],name:"Bus Station / Terminal"},"public_transport/station_ferry":{icon:"maki-ferry",fields:["{public_transport/station}"],moreFields:["{public_transport/station}"],geometry:["vertex","point","area"],tags:{public_transport:"station",ferry:"yes"},addTags:{public_transport:"station",ferry:"yes",amenity:"ferry_terminal"},reference:{key:"amenity",value:"ferry_terminal"},terms:["boat","dock","ferry","pier","public transit","public transportation","station","terminal","transit","transportation"],name:"Ferry Station / Terminal"},"public_transport/station_light_rail":{icon:"temaki-light_rail",fields:["{public_transport/station}"],moreFields:["{public_transport/station}"],geometry:["point","area"],tags:{public_transport:"station",light_rail:"yes"},addTags:{public_transport:"station",light_rail:"yes",railway:"station",station:"light_rail"},reference:{key:"station",value:"light_rail"},terms:["electric","light rail","public transit","public transportation","rail","station","terminal","track","tram","trolley","transit","transportation"],name:"Light Rail Station"},"public_transport/station_monorail":{icon:"temaki-monorail",fields:["{public_transport/station}"],moreFields:["{public_transport/station}"],geometry:["point","area"],tags:{public_transport:"station",monorail:"yes"},addTags:{public_transport:"station",monorail:"yes",railway:"station"},reference:{key:"railway",value:"station"},terms:["monorail","public transit","public transportation","rail","station","terminal","transit","transportation"],name:"Monorail Station"},"public_transport/station_subway":{icon:"temaki-subway",fields:["{public_transport/station}"],moreFields:["{public_transport/station}"],geometry:["point","area"],tags:{public_transport:"station",subway:"yes"},addTags:{public_transport:"station",subway:"yes",railway:"station",station:"subway"},reference:{key:"station",value:"subway"},terms:["metro","public transit","public transportation","rail","station","subway","terminal","track","transit","transportation","underground"],name:"Subway Station"},"public_transport/station_train_halt":{icon:"maki-rail",fields:["{public_transport/station}"],moreFields:["{public_transport/station}"],geometry:["point","area"],tags:{public_transport:"station",train:"yes",railway:"halt"},reference:{key:"railway",value:"halt"},terms:["halt","public transit","public transportation","rail","station","track","train","transit","transportation","whistle stop"],name:"Train Station (Halt / Request)"},"public_transport/station_train":{icon:"maki-rail",fields:["{public_transport/station}"],moreFields:["{public_transport/station}"],geometry:["vertex","point","area"],tags:{public_transport:"station",train:"yes"},addTags:{public_transport:"station",train:"yes",railway:"station"},reference:{key:"railway",value:"station"},terms:["public transit","public transportation","rail","station","terminal","track","train","transit","transportation"],name:"Train Station"},"public_transport/station_tram":{icon:"temaki-tram",fields:["{public_transport/station}"],moreFields:["{public_transport/station}"],geometry:["point","area"],tags:{public_transport:"station",tram:"yes"},reference:{key:"public_transport",value:"station"},terms:["electric","light rail","public transit","public transportation","rail","station","streetcar","terminal","track","tram","trolley","transit","transportation"],name:"Tram Station"},"public_transport/station_trolleybus":{icon:"temaki-trolleybus",fields:["{public_transport/station}"],moreFields:["{public_transport/station}"],geometry:["point","area"],tags:{public_transport:"station",trolleybus:"yes"},addTags:{public_transport:"station",trolleybus:"yes",amenity:"bus_station"},reference:{key:"amenity",value:"bus_station"},terms:["bus","electric","public transit","public transportation","station","streetcar","terminal","trackless","tram","trolley","transit","transportation"],name:"Trolleybus Station / Terminal"},"public_transport/station":{icon:"maki-rail",fields:["name","network","operator","address","building_area","internet_access"],moreFields:["air_conditioning","internet_access/fee","internet_access/ssid","website","phone","email","fax","wheelchair"],geometry:["point","area"],tags:{public_transport:"station"},terms:["public transit","public transportation","station","terminal","transit","transportation"],name:"Transit Station",matchScore:0.2},"public_transport/stop_area":{icon:"iD-relation",fields:["name","ref","network","operator"],geometry:["relation"],tags:{type:"public_transport",public_transport:"stop_area"},reference:{key:"public_transport",value:"stop_area"},name:"Transit Stop Area"},"public_transport/stop_position_aerialway":{icon:"maki-aerialway",fields:["{public_transport/stop_position}"],moreFields:["{public_transport/stop_position}"],geometry:["vertex"],tags:{public_transport:"stop_position",aerialway:"yes"},reference:{key:"public_transport",value:"stop_position"},terms:["aerialway","cable car","public transit","public transportation","transit","transportation"],name:"Aerialway Stopping Location"},"public_transport/stop_position_bus":{icon:"maki-bus",fields:["{public_transport/stop_position}"],moreFields:["{public_transport/stop_position}"],geometry:["vertex"],tags:{public_transport:"stop_position",bus:"yes"},reference:{key:"public_transport",value:"stop_position"},terms:["bus","public transit","public transportation","transit","transportation"],name:"Bus Stopping Location"},"public_transport/stop_position_ferry":{icon:"maki-ferry",fields:["{public_transport/stop_position}"],moreFields:["{public_transport/stop_position}"],geometry:["vertex"],tags:{public_transport:"stop_position",ferry:"yes"},reference:{key:"public_transport",value:"stop_position"},terms:["boat","dock","ferry","pier","public transit","public transportation","transit","transportation"],name:"Ferry Stopping Location"},"public_transport/stop_position_light_rail":{icon:"temaki-light_rail",fields:["{public_transport/stop_position}"],moreFields:["{public_transport/stop_position}"],geometry:["vertex"],tags:{public_transport:"stop_position",light_rail:"yes"},addTags:{public_transport:"stop_position",light_rail:"yes",railway:"stop"},reference:{key:"railway",value:"stop"},terms:["electric","light rail","public transit","public transportation","rail","track","tram","trolley","transit","transportation"],name:"Light Rail Stopping Location"},"public_transport/stop_position_monorail":{icon:"temaki-monorail",fields:["{public_transport/stop_position}"],moreFields:["{public_transport/stop_position}"],geometry:["vertex"],tags:{public_transport:"stop_position",monorail:"yes"},addTags:{public_transport:"stop_position",monorail:"yes",railway:"stop"},reference:{key:"railway",value:"stop"},terms:["monorail","public transit","public transportation","rail","transit","transportation"],name:"Monorail Stopping Location"},"public_transport/stop_position_subway":{icon:"temaki-subway",fields:["{public_transport/stop_position}"],moreFields:["{public_transport/stop_position}"],geometry:["vertex"],tags:{public_transport:"stop_position",subway:"yes"},addTags:{public_transport:"stop_position",subway:"yes",railway:"stop"},reference:{key:"railway",value:"stop"},terms:["metro","public transit","public transportation","rail","subway","track","transit","transportation","underground"],name:"Subway Stopping Location"},"public_transport/stop_position_train":{icon:"maki-rail",fields:["{public_transport/stop_position}"],moreFields:["{public_transport/stop_position}"],geometry:["vertex"],tags:{public_transport:"stop_position",train:"yes"},addTags:{public_transport:"stop_position",train:"yes",railway:"stop"},reference:{key:"railway",value:"stop"},terms:["public transit","public transportation","rail","track","train","transit","transportation"],name:"Train Stopping Location"},"public_transport/stop_position_tram":{icon:"temaki-tram",fields:["{public_transport/stop_position}"],moreFields:["{public_transport/stop_position}"],geometry:["vertex"],tags:{public_transport:"stop_position",tram:"yes"},addTags:{public_transport:"stop_position",tram:"yes",railway:"tram_stop"},reference:{key:"public_transport",value:"stop_position"},terms:["electric","light rail","public transit","public transportation","rail","streetcar","track","tram","trolley","transit","transportation"],name:"Tram Stopping Location"},"public_transport/stop_position_trolleybus":{icon:"temaki-trolleybus",fields:["{public_transport/stop_position}"],moreFields:["{public_transport/stop_position}"],geometry:["vertex"],tags:{public_transport:"stop_position",trolleybus:"yes"},reference:{key:"public_transport",value:"stop_position"},terms:["bus","electric","public transit","public transportation","streetcar","trackless","tram","trolley","transit","transportation"],name:"Trolleybus Stopping Location"},"public_transport/stop_position":{icon:"maki-bus",fields:["name","ref_stop_position","network","operator"],geometry:["vertex"],tags:{public_transport:"stop_position"},terms:["public transit","public transportation","transit","transportation"],name:"Transit Stopping Location",matchScore:0.2},"railway/halt":{icon:"maki-rail",geometry:["point","vertex"],tags:{railway:"halt"},terms:["break","interrupt","rest","wait","interruption"],name:"Train Station (Halt / Request)",searchable:false},"railway/platform":{icon:"temaki-pedestrian",fields:["name","ref_platform","surface","lit","shelter"],geometry:["line","area"],tags:{railway:"platform"},name:"Train Platform",searchable:false,replacement:"public_transport/platform/train"},"railway/station":{icon:"maki-rail",fields:["name","network","operator","address","building_area","internet_access","internet_access/fee","internet_access/ssid"],geometry:["point","vertex","area"],tags:{railway:"station"},terms:["train station","station"],matchScore:0.95,name:"Train Station",searchable:false,replacement:"public_transport/station_train"},"railway/tram_stop":{icon:"temaki-tram",fields:["name","network","operator"],geometry:["vertex"],tags:{railway:"tram_stop"},terms:["light rail","streetcar","tram","trolley"],name:"Tram Stopping Position",searchable:false},"railway/abandoned":{icon:"iD-railway-abandoned",fields:["name","structure","service_rail","usage_rail"],moreFields:["covered"],geometry:["line"],tags:{railway:"abandoned"},terms:[],matchScore:0.85,name:"Abandoned Railway"},"railway/buffer_stop":{icon:"temaki-buffer_stop",geometry:["vertex"],tags:{railway:"buffer_stop"},terms:["stop","halt","buffer"],name:"Buffer Stop"},"railway/construction":{icon:"iD-railway-rail",fields:["name","opening_date","check_date","note","structure","gauge","electrified"],moreFields:["covered","frequency_electrified","highspeed","maxspeed","service_rail","usage_rail","voltage_electrified"],geometry:["line"],tags:{railway:"construction"},name:"Railway Under Construction"},"railway/crossing":{icon:"temaki-pedestrian",geometry:["vertex"],tags:{railway:"crossing"},terms:["crossing","pedestrian crossing","railroad crossing","level crossing","grade crossing","path through railroad","train crossing"],name:"Railway Crossing (Path)"},"railway/derail":{icon:"maki-roadblock",geometry:["vertex"],tags:{railway:"derail"},terms:["derailer"],name:"Railway Derailer"},"railway/disused":{icon:"iD-railway-disused",fields:["operator","structure","service_rail","usage_rail"],moreFields:["covered"],geometry:["line"],tags:{railway:"disused"},terms:[],name:"Disused Railway"},"railway/funicular":{icon:"iD-railway-rail",fields:["name","operator","structure","gauge","service_rail"],moreFields:["covered"],geometry:["line"],terms:["venicular","cliff railway","cable car","cable railway","funicular railway"],tags:{railway:"funicular"},name:"Funicular"},"railway/level_crossing":{icon:"maki-cross",geometry:["vertex"],tags:{railway:"level_crossing"},terms:["crossing","railroad crossing","level crossing","grade crossing","road through railroad","train crossing"],name:"Railway Crossing (Road)"},"railway/light_rail":{icon:"temaki-light_rail",fields:["{railway/rail}"],moreFields:["covered","frequency_electrified","maxspeed","voltage_electrified"],geometry:["line"],tags:{railway:"light_rail"},terms:["light rail","streetcar","trolley"],name:"Light Rail"},"railway/milestone":{icon:"temaki-milestone",geometry:["point","vertex"],fields:["railway/position","direction_vertex"],tags:{railway:"milestone"},terms:["milestone","marker"],name:"Railway Milestone"},"railway/miniature":{icon:"iD-railway-rail",fields:["name","structure","gauge","electrified","service_rail"],moreFields:["covered","frequency_electrified","maxspeed","voltage_electrified"],geometry:["line"],tags:{railway:"miniature"},terms:["rideable miniature railway","narrow gauge railway","minimum gauge railway"],name:"Miniature Railway"},"railway/monorail":{icon:"temaki-monorail",fields:["name","operator","structure","electrified","service_rail","usage_rail"],moreFields:["covered","frequency_electrified","maxspeed","voltage_electrified"],geometry:["line"],tags:{railway:"monorail"},terms:[],name:"Monorail"},"railway/narrow_gauge":{icon:"iD-railway-rail",fields:["{railway/rail}"],moreFields:["covered","frequency_electrified","maxspeed","voltage_electrified"],geometry:["line"],tags:{railway:"narrow_gauge"},terms:["narrow gauge railway","narrow gauge railroad"],name:"Narrow Gauge Rail"},"railway/rail":{icon:"iD-railway-rail",fields:["name","operator","structure","gauge","electrified","service_rail","usage_rail"],moreFields:["covered","frequency_electrified","highspeed","maxspeed","voltage_electrified"],geometry:["line"],tags:{railway:"rail"},terms:["rail line","railroad track","train track"],name:"Rail"},"railway/rail/highspeed":{icon:"iD-railway-rail",geometry:["line"],tags:{railway:"rail",highspeed:"yes"},reference:{key:"highspeed"},terms:["bullet train","fast rail","high speed rail","highspeed rail","HSR"],name:"High-Speed Rail"},"railway/signal":{icon:"temaki-railway_signals",geometry:["point","vertex"],fields:["railway/position","railway/signal/direction","ref"],tags:{railway:"signal"},terms:["signal","lights"],name:"Railway Signal"},"railway/subway_entrance":{icon:"maki-entrance",geometry:["point","vertex"],fields:["name"],tags:{railway:"subway_entrance"},terms:["metro","transit"],name:"Subway Entrance"},"railway/subway":{icon:"temaki-subway",fields:["{railway/rail}"],moreFields:["frequency_electrified","maxspeed","voltage_electrified"],geometry:["line"],tags:{railway:"subway"},terms:["metro","transit"],name:"Subway"},"railway/switch":{icon:"temaki-junction",geometry:["vertex"],tags:{railway:"switch"},terms:["switch","points"],name:"Railway Switch"},"railway/train_wash":{icon:"maki-rail",geometry:["point","vertex","area"],fields:["operator","building_area"],tags:{railway:"wash"},terms:["wash","clean"],name:"Train Wash"},"railway/tram":{icon:"temaki-tram",fields:["{railway/rail}"],moreFields:["covered","frequency_electrified","maxspeed","voltage_electrified"],geometry:["line"],tags:{railway:"tram"},terms:["light rail","streetcar","tram","trolley"],name:"Tram"},relation:{icon:"iD-relation",fields:["name","relation"],geometry:["relation"],tags:{},name:"Relation"},"route/ferry":{icon:"maki-ferry",geometry:["line"],fields:["name","operator","duration","access","to","from"],moreFields:["maxheight","maxweight","opening_hours","wheelchair"],tags:{route:"ferry"},name:"Ferry Route"},"seamark/beacon_isolated_danger":{fields:["ref","operator","seamark/beacon_isolated_danger/shape","seamark/type"],geometry:["point","vertex"],terms:["beacon isolated danger","isolated danger beacon","iala"],tags:{"seamark:type":"beacon_isolated_danger"},name:"Danger Beacon"},"seamark/beacon_lateral":{fields:["ref","operator","seamark/beacon_lateral/colour","seamark/beacon_lateral/category","seamark/beacon_lateral/shape","seamark/beacon_lateral/system","seamark/type"],geometry:["point","vertex"],terms:["lateral beacon","beacon lateral","cevni","channel marker","iala","lateral mark"],tags:{"seamark:type":"beacon_lateral"},name:"Channel Beacon"},"seamark/buoy_lateral":{fields:["ref","operator","seamark/buoy_lateral/colour","seamark/buoy_lateral/category","seamark/buoy_lateral/shape","seamark/buoy_lateral/system","seamark/type"],geometry:["point","vertex"],terms:["lateral buoy","buoy lateral","cevni","channel marker","iala","lateral mark"],tags:{"seamark:type":"buoy_lateral"},name:"Channel Buoy"},"seamark/buoy_lateral/green":{geometry:["point","vertex"],terms:["lateral buoy","buoy lateral","cevni","channel marker","iala","lateral mark"],tags:{"seamark:type":"buoy_lateral","seamark:buoy_lateral:colour":"green"},name:"Green Buoy"},"seamark/buoy_lateral/red":{geometry:["point","vertex"],terms:["lateral buoy","buoy lateral","cevni","channel marker","iala","lateral mark"],tags:{"seamark:type":"buoy_lateral","seamark:buoy_lateral:colour":"red"},name:"Red Buoy"},"seamark/mooring":{fields:["ref","operator","seamark/mooring/category","seamark/type"],geometry:["point"],terms:["dolphin","pile","bollard","buoy","post"],tags:{"seamark:type":"mooring"},name:"Mooring"},shop:{icon:"maki-shop",fields:["name","shop","operator","address","building_area","opening_hours","payment_multi"],moreFields:["air_conditioning","brand","building/levels_building","height_building","currency_multi","email","fax","internet_access","internet_access/fee","internet_access/ssid","phone","second_hand","website","wheelchair"],geometry:["point","area"],tags:{shop:"*"},terms:[],name:"Shop"},"shop/boutique":{icon:"maki-shop",fields:["name","clothes","{shop}"],geometry:["point","area"],tags:{shop:"boutique"},searchable:false,name:"Boutique"},"shop/fashion":{icon:"maki-shop",fields:["name","clothes","{shop}"],geometry:["point","area"],tags:{shop:"fashion"},searchable:false,name:"Fashion Store"},"shop/fishmonger":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"fishmonger"},reference:{key:"shop",value:"seafood"},name:"Fishmonger",searchable:false},"shop/furnace":{icon:"maki-shop",geometry:["point","area"],terms:["oven","stove"],tags:{shop:"furnace"},name:"Furnace Store",searchable:false},"shop/vacant":{icon:"maki-shop",fields:["name","address","building_area"],geometry:["point","area"],tags:{shop:"vacant"},name:"Vacant Shop",searchable:false},"shop/agrarian":{icon:"fas-tractor",fields:["{shop}","agrarian"],geometry:["point","area"],terms:["agricultural inputs","agricultural machines","seeds","pesticides","fertilizer","agricultural tools"],tags:{shop:"agrarian"},name:"Farm Supply Shop"},"shop/alcohol":{icon:"fas-wine-bottle",fields:["{shop}","drive_through"],geometry:["point","area"],terms:["alcohol","beer","booze","wine"],tags:{shop:"alcohol"},name:"Liquor Store"},"shop/anime":{icon:"fas-dragon",geometry:["point","area"],tags:{shop:"anime"},terms:["manga","japan","cosplay","figurine","dakimakura"],name:"Anime Shop"},"shop/antiques":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"antiques"},name:"Antiques Shop"},"shop/appliance":{icon:"maki-shop",geometry:["point","area"],terms:["air conditioner","appliance","dishwasher","dryer","freezer","fridge","grill","kitchen","oven","refrigerator","stove","washer","washing machine"],tags:{shop:"appliance"},name:"Appliance Store"},"shop/art":{icon:"maki-shop",geometry:["point","area"],terms:["art*","exhibit*","gallery"],tags:{shop:"art"},name:"Art Store"},"shop/baby_goods":{icon:"fas-baby-carriage",geometry:["point","area"],tags:{shop:"baby_goods"},name:"Baby Goods Store"},"shop/bag":{icon:"fas-suitcase-rolling",geometry:["point","area"],terms:["handbag","purse"],tags:{shop:"bag"},name:"Bag/Luggage Store"},"shop/bakery":{icon:"maki-bakery",geometry:["point","area"],tags:{shop:"bakery"},terms:["bread","cakes","rolls"],name:"Bakery"},"shop/bathroom_furnishing":{icon:"fas-bath",geometry:["point","area"],tags:{shop:"bathroom_furnishing"},name:"Bathroom Furnishing Store"},"shop/beauty":{icon:"maki-shop",fields:["{shop}","beauty"],geometry:["point","area"],terms:["spa","salon","tanning"],tags:{shop:"beauty"},name:"Beauty Shop"},"shop/beauty/nails":{icon:"maki-shop",geometry:["point","area"],terms:["manicure","pedicure"],tags:{shop:"beauty",beauty:"nails"},reference:{key:"shop",value:"beauty"},name:"Nail Salon"},"shop/beauty/tanning":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"beauty",beauty:"tanning"},reference:{key:"leisure",value:"tanning_salon"},name:"Tanning Salon"},"shop/bed":{icon:"maki-lodging",geometry:["point","area"],tags:{shop:"bed"},name:"Bedding/Mattress Store"},"shop/beverages":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"beverages"},terms:["drinks"],name:"Beverage Store"},"shop/bicycle":{icon:"maki-bicycle",fields:["{shop}","service/bicycle"],geometry:["point","area"],terms:["bike","repair","tricycle","unicycle"],tags:{shop:"bicycle"},name:"Bicycle Shop"},"shop/boat":{icon:"temaki-boating",geometry:["point","area"],terms:["fishing boat","jetski","motorboat","rowboat","sailboat","vessel","watercraft"],tags:{shop:"boat"},name:"Boat Store"},"shop/bookmaker":{icon:"maki-shop",geometry:["point","area"],terms:["betting","bookie"],tags:{shop:"bookmaker"},name:"Bookmaker"},"shop/books":{icon:"fas-book",fields:["{shop}","internet_access"],moreFields:["{shop}","internet_access/fee","internet_access/ssid"],geometry:["point","area"],tags:{shop:"books"},name:"Book Store"},"shop/butcher":{icon:"fas-bacon",geometry:["point","area"],terms:["chicken","beef","lamb","meat","pork"],tags:{shop:"butcher"},name:"Butcher"},"shop/candles":{icon:"fas-burn",geometry:["point","area"],tags:{shop:"candles"},terms:["wax"],name:"Candle Shop"},"shop/cannabis":{icon:"fas-cannabis",geometry:["point","area"],terms:["420","marijuana","pot","reefer","weed"],tags:{shop:"cannabis"},name:"Cannabis Shop"},"shop/car_parts":{icon:"fas-car-battery",geometry:["point","area"],terms:["automobile","automotive"],tags:{shop:"car_parts"},name:"Car Parts Store"},"shop/car_repair":{icon:"maki-car-repair",fields:["{shop}","service/vehicle"],geometry:["point","area"],terms:["automobile","automotive","garage","service"],tags:{shop:"car_repair"},name:"Car Repair Shop"},"shop/car":{icon:"maki-car",fields:["name","brand","{shop}","second_hand","service/vehicle"],geometry:["point","area"],terms:["automobile","automotive"],tags:{shop:"car"},name:"Car Dealership"},"shop/caravan":{icon:"temaki-rv_park",fields:["name","brand","{shop}","second_hand","service/vehicle"],geometry:["point","area"],tags:{shop:"caravan"},terms:["auto","camper","recreational vehicle"],name:"RV Dealership"},"shop/carpet":{icon:"maki-shop",geometry:["point","area"],terms:["rug"],tags:{shop:"carpet"},name:"Carpet Store"},"shop/catalogue":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"catalogue"},name:"Catalog Shop"},"shop/charity":{icon:"maki-shop",fields:["{shop}","second_hand"],geometry:["point","area"],terms:["thrift","op shop","nonprofit"],tags:{shop:"charity"},name:"Charity Store"},"shop/cheese":{icon:"fas-cheese",geometry:["point","area"],tags:{shop:"cheese"},name:"Cheese Store"},"shop/chemist":{icon:"fas-shopping-basket",geometry:["point","area"],tags:{shop:"chemist"},terms:["apothecary","beauty","drug store","drugstore","gift","hair","med*","pharmacy","prescription","tooth"],name:"Drugstore"},"shop/chocolate":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"chocolate"},terms:["cocoa"],name:"Chocolate Store"},"shop/clothes":{icon:"maki-clothing-store",fields:["name","clothes","{shop}"],geometry:["point","area"],tags:{shop:"clothes"},terms:["blouses","boutique","bras","clothes","dresses","fashion","pants","shirts","shorts","skirts","slacks","socks","suits","underwear"],name:"Clothing Store"},"shop/clothes/underwear":{icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes",clothes:"underwear"},reference:{key:"clothes",value:"underwear"},terms:["boutique","bras","brassieres","briefs","boxers","fashion","lingerie","panties","slips","socks","stockings","underclothes","undergarments","underpants","undies"],name:"Underwear Store"},"shop/coffee":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"coffee"},name:"Coffee Store"},"shop/computer":{icon:"fas-laptop",geometry:["point","area"],tags:{shop:"computer"},terms:["desktop","laptop","hardware","operating system","software"],name:"Computer Store"},"shop/confectionery":{icon:"maki-confectionery",geometry:["point","area"],terms:["sweet"],tags:{shop:"confectionery"},name:"Candy Store"},"shop/convenience":{icon:"fas-shopping-basket",geometry:["point","area"],tags:{shop:"convenience"},name:"Convenience Store"},"shop/copyshop":{icon:"fas-print",geometry:["point","area"],tags:{shop:"copyshop"},terms:["print","scan"],name:"Copy Store"},"shop/cosmetics":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"cosmetics"},terms:["make-up","makeup"],name:"Cosmetics Store"},"shop/country_store":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"country_store"},name:"Country Store"},"shop/craft":{icon:"fas-palette",geometry:["point","area"],tags:{shop:"craft"},terms:["art*","paint*","frame"],name:"Arts and Crafts Store"},"shop/curtain":{icon:"maki-shop",geometry:["point","area"],terms:["drape*","window"],tags:{shop:"curtain"},name:"Curtain Store"},"shop/dairy":{icon:"fas-cheese",geometry:["point","area"],terms:["milk","egg","cheese"],tags:{shop:"dairy"},name:"Dairy Store"},"shop/deli":{icon:"maki-restaurant",geometry:["point","area"],terms:["lunch","meat","sandwich"],tags:{shop:"deli"},name:"Deli"},"shop/department_store":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"department_store"},name:"Department Store"},"shop/doityourself":{icon:"temaki-tools",geometry:["point","area"],tags:{shop:"doityourself"},name:"DIY Store"},"shop/dry_cleaning":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"dry_cleaning"},name:"Dry Cleaner"},"shop/e-cigarette":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"e-cigarette"},terms:["electronic","vape","vaping","vapor"],name:"E-Cigarette Shop"},"shop/electronics":{icon:"fas-plug",geometry:["point","area"],terms:["appliance","audio","blueray","camera","computer","dvd","home theater","radio","speaker","tv","video"],tags:{shop:"electronics"},name:"Electronics Store"},"shop/erotic":{icon:"maki-shop",geometry:["point","area"],terms:["sex","porn"],tags:{shop:"erotic"},name:"Erotic Store"},"shop/erotic/lgbtq":{icon:"maki-shop",geometry:["point","area"],terms:["sex","porn"],tags:{shop:"erotic",lgbtq:"primary"},name:"LGBTQ+ Erotic Store"},"shop/fabric":{icon:"fas-tape",geometry:["point","area"],terms:["sew"],tags:{shop:"fabric"},name:"Fabric Store"},"shop/farm":{icon:"maki-shop",geometry:["point","area"],terms:["farm shop","farm stand"],tags:{shop:"farm"},name:"Produce Stand"},"shop/fireplace":{icon:"maki-shop",geometry:["point","area"],terms:["fireplace","stove","masonry heater"],tags:{shop:"fireplace"},name:"Fireplace Store"},"shop/fishing":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"fishing"},terms:["bait","fishing line","flies","fly","lure","reel","rod","tackle"],name:"Fishing Shop"},"shop/florist":{icon:"maki-florist",geometry:["point","area"],terms:["flower"],tags:{shop:"florist"},name:"Florist"},"shop/frame":{icon:"fas-vector-square",geometry:["point","area"],tags:{shop:"frame"},terms:["art*","paint*","photo*","frame"],name:"Framing Shop"},"shop/frozen_food":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"frozen_food"},name:"Frozen Food"},"shop/fuel":{icon:"maki-shop",fields:["{shop}","fuel_multi"],geometry:["point","area"],tags:{shop:"fuel"},name:"Fuel Shop",matchScore:0.5},"shop/funeral_directors":{icon:"maki-cemetery",fields:["{shop}","religion","denomination"],geometry:["point","area"],terms:["undertaker","memorial home"],tags:{shop:"funeral_directors"},name:"Funeral Home"},"shop/furniture":{icon:"fas-couch",geometry:["point","area"],terms:["chair","sofa","table"],tags:{shop:"furniture"},name:"Furniture Store"},"shop/games":{icon:"fas-dice",geometry:["point","area"],tags:{shop:"games"},terms:["board game","card game","dice game","game shop","live action role-playing game","miniatures wargame","strategy game"],name:"Tabletop Game Store"},"shop/garden_centre":{icon:"maki-garden-centre",geometry:["point","area"],terms:["landscape","mulch","shrub","tree"],tags:{shop:"garden_centre"},name:"Garden Center"},"shop/gas":{icon:"maki-shop",geometry:["point","area"],terms:["cng","lpg","natural gas","propane","refill","tank"],tags:{shop:"gas"},name:"Bottled Gas Shop"},"shop/general":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"general"},terms:["Village Shop"],name:"General Store"},"shop/gift":{icon:"maki-gift",geometry:["point","area"],terms:["souvenir"],tags:{shop:"gift"},name:"Gift Shop"},"shop/greengrocer":{icon:"fas-carrot",geometry:["point","area"],terms:["fruit","produce","vegetable"],tags:{shop:"greengrocer"},name:"Greengrocer"},"shop/hairdresser_supply":{icon:"maki-shop",geometry:["point","area"],terms:["barber","shampoo","conditioner"],tags:{shop:"hairdresser_supply"},name:"Hairdresser Supply Store"},"shop/hairdresser":{icon:"temaki-beauty_salon",geometry:["point","area"],terms:["barber"],tags:{shop:"hairdresser"},name:"Hairdresser"},"shop/hardware":{icon:"temaki-tools",geometry:["point","area"],tags:{shop:"hardware"},name:"Hardware Store"},"shop/health_food":{icon:"maki-shop",geometry:["point","area"],terms:["wholefood","vitamins","vegetarian","vegan"],tags:{shop:"health_food"},name:"Health Food Shop"},"shop/hearing_aids":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"hearing_aids"},name:"Hearing Aids Store"},"shop/herbalist":{icon:"fas-leaf",geometry:["point","area"],tags:{shop:"herbalist"},name:"Herbalist"},"shop/hifi":{icon:"maki-shop",geometry:["point","area"],terms:["audio","hi-fi","high fidelity","stereo","video"],tags:{shop:"hifi"},name:"Hifi Store"},"shop/houseware":{icon:"fas-blender",geometry:["point","area"],terms:["home","household","kitchenware"],tags:{shop:"houseware"},name:"Houseware Store"},"shop/hunting":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"hunting"},terms:["arrows","bows","bullets","crossbows","rifles","traps"],name:"Hunting Shop"},"shop/interior_decoration":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"interior_decoration"},name:"Interior Decoration Store"},"shop/jewelry":{icon:"maki-jewelry-store",geometry:["point","area"],terms:["bracelet","diamond","earrings","gem","gold","jeweler","jewellery","jeweller","necklace","pins","ring","silver"],tags:{shop:"jewelry"},name:"Jewelry Store"},"shop/kiosk":{icon:"maki-shop",fields:["{shop}","levels"],geometry:["point","area"],tags:{shop:"kiosk"},name:"Kiosk"},"shop/kitchen":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"kitchen"},terms:["cabinets","countertops","sinks"],name:"Kitchen Design Store"},"shop/laundry":{icon:"maki-laundry",fields:["{shop}","self_service"],geometry:["point","area"],tags:{shop:"laundry"},name:"Laundry"},"shop/laundry/self_service":{icon:"maki-laundry",geometry:["point","area"],tags:{shop:"laundry",self_service:"yes"},terms:["Coin Laundry","Laundromat","Coin Wash","Launderette","Washateria"],name:"Self-Service Laundry"},"shop/leather":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"leather"},name:"Leather Store"},"shop/lighting":{icon:"far-lightbulb",geometry:["point","area"],terms:["fluorescent lighting","lamps","LEDs","light fixtures","lightbulbs"],tags:{shop:"lighting"},name:"Lighting Store"},"shop/locksmith":{icon:"fas-key",geometry:["point","area"],terms:["key","lockpick"],tags:{shop:"locksmith"},name:"Locksmith"},"shop/lottery":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"lottery"},name:"Lottery Shop"},"shop/mall":{icon:"maki-shop",geometry:["point","area"],terms:["shopping"],tags:{shop:"mall"},name:"Mall"},"shop/massage":{icon:"temaki-spa",geometry:["point","area"],tags:{shop:"massage"},name:"Massage Shop"},"shop/medical_supply":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"medical_supply"},name:"Medical Supply Store"},"shop/mobile_phone":{icon:"fas-mobile-alt",geometry:["point","area"],tags:{shop:"mobile_phone"},name:"Mobile Phone Store"},"shop/money_lender":{icon:"maki-bank",fields:["{shop}","currency_multi"],geometry:["point","area"],tags:{shop:"money_lender"},name:"Money Lender"},"shop/motorcycle_repair":{icon:"fas-motorcycle",fields:["{shop}","service/vehicle"],geometry:["point","area"],terms:["auto","bike","garage","motorcycle","repair","service"],tags:{shop:"motorcycle_repair"},name:"Motorcycle Repair Shop"},"shop/motorcycle":{icon:"fas-motorcycle",fields:["name","brand","{shop}"],geometry:["point","area"],terms:["bike"],tags:{shop:"motorcycle"},name:"Motorcycle Dealership"},"shop/music":{icon:"fas-compact-disc",geometry:["point","area"],terms:["tape casettes","CDs","compact discs","vinyl records"],tags:{shop:"music"},name:"Music Store"},"shop/musical_instrument":{icon:"fas-guitar",geometry:["point","area"],terms:["guitar"],tags:{shop:"musical_instrument"},name:"Musical Instrument Store"},"shop/newsagent":{icon:"fas-newspaper",geometry:["point","area"],tags:{shop:"newsagent"},name:"Newspaper/Magazine Shop"},"shop/nutrition_supplements":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"nutrition_supplements"},name:"Nutrition Supplements Store"},"shop/optician":{icon:"maki-optician",geometry:["point","area"],terms:["eye","glasses"],tags:{shop:"optician"},name:"Optician"},"shop/organic":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"supermarket",organic:"only"},name:"Organic Goods Store"},"shop/outdoor":{icon:"temaki-compass",fields:["{shop}","clothes"],geometry:["point","area"],terms:["camping","climbing","hiking","outfitter","outdoor equipment","outdoor supplies"],tags:{shop:"outdoor"},name:"Outdoors Store"},"shop/outpost":{icon:"maki-shop",geometry:["point","area"],terms:["online","pick up","pickup"],tags:{shop:"outpost"},name:"Online Retailer Outpost"},"shop/paint":{icon:"fas-paint-roller",geometry:["point","area"],tags:{shop:"paint"},name:"Paint Store"},"shop/party":{icon:"fas-mask",geometry:["point","area"],terms:["balloons","costumes","decorations","invitations"],tags:{shop:"party"},name:"Party Supply Store"},"shop/pastry":{icon:"maki-bakery",geometry:["point","area"],tags:{shop:"pastry"},terms:["patisserie","cake shop","cakery"],name:"Pastry Shop"},"shop/pawnbroker":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"pawnbroker"},name:"Pawn Shop"},"shop/perfumery":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"perfumery"},name:"Perfume Store"},"shop/pet_grooming":{icon:"maki-dog-park",geometry:["point","area"],terms:["cat","dog"],tags:{shop:"pet_grooming"},name:"Pet Grooming Store"},"shop/pet":{icon:"maki-dog-park",geometry:["point","area"],terms:["animal","cat","dog","fish","kitten","puppy","reptile"],tags:{shop:"pet"},name:"Pet Store"},"shop/photo":{icon:"fas-camera-retro",geometry:["point","area"],terms:["camera","film"],tags:{shop:"photo"},name:"Photography Store"},"shop/pyrotechnics":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"pyrotechnics"},name:"Fireworks Store"},"shop/radiotechnics":{icon:"fas-microchip",geometry:["point","area"],tags:{shop:"radiotechnics"},terms:["antenna","transistor"],name:"Radio/Electronic Component Store"},"shop/religion":{icon:"maki-shop",fields:["{shop}","religion","denomination"],geometry:["point","area"],tags:{shop:"religion"},name:"Religious Store"},"shop/scuba_diving":{icon:"fas-swimmer",fields:["{shop}","scuba_diving"],geometry:["point","area"],terms:["diving","scuba"],tags:{shop:"scuba_diving"},name:"Scuba Diving Shop"},"shop/seafood":{icon:"maki-shop",geometry:["point","area"],terms:["fishmonger"],tags:{shop:"seafood"},name:"Seafood Shop"},"shop/second_hand":{icon:"maki-shop",fields:["{shop}","second_hand"],geometry:["point","area"],terms:["secondhand","second hand","resale","thrift","used"],tags:{shop:"second_hand"},name:"Consignment/Thrift Store"},"shop/sewing":{icon:"maki-shop",geometry:["point","area"],terms:["haberdashery"],tags:{shop:"sewing"},name:"Sewing Supply Shop"},"shop/shoes":{icon:"maki-shoe",geometry:["point","area"],tags:{shop:"shoes"},terms:["boots","cleats","clogs","heels","loafers","oxfords","sneakers"],name:"Shoe Store"},"shop/sports":{icon:"fas-futbol",fields:["name","operator","sport","{shop}"],geometry:["point","area"],tags:{shop:"sports"},terms:["athletics"],name:"Sporting Goods Store"},"shop/stationery":{icon:"fas-paperclip",geometry:["point","area"],terms:["card","paper"],tags:{shop:"stationery"},name:"Stationery Store"},"shop/storage_rental":{icon:"fas-warehouse",geometry:["point","area"],tags:{shop:"storage_rental"},terms:["garages"],name:"Storage Rental"},"shop/supermarket":{icon:"maki-grocery",moreFields:["diet_multi","{shop}"],geometry:["point","area"],terms:["grocery","store","shop"],tags:{shop:"supermarket"},name:"Supermarket"},"shop/tailor":{icon:"maki-clothing-store",geometry:["point","area"],terms:["clothes","suit"],tags:{shop:"tailor"},name:"Tailor"},"shop/tattoo":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"tattoo"},terms:["ink"],name:"Tattoo Parlor"},"shop/tea":{icon:"maki-teahouse",geometry:["point","area"],tags:{shop:"tea"},name:"Tea Store"},"shop/ticket":{icon:"fas-ticket-alt",geometry:["point","area"],tags:{shop:"ticket"},terms:["box office"],name:"Ticket Seller"},"shop/tiles":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"tiles"},name:"Tile Shop"},"shop/tobacco":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"tobacco"},terms:["cigarettes","cigars"],name:"Tobacco Shop"},"shop/toys":{icon:"fas-space-shuttle",geometry:["point","area"],tags:{shop:"toys"},terms:["games"],name:"Toy Store"},"shop/trade":{icon:"maki-shop",fields:["name","trade","{shop}"],geometry:["point","area"],tags:{shop:"trade"},name:"Trade Shop"},"shop/travel_agency":{icon:"fas-suitcase",geometry:["point","area"],tags:{shop:"travel_agency"},name:"Travel Agency"},"shop/tyres":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"tyres"},name:"Tire Store"},"shop/vacuum_cleaner":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"vacuum_cleaner"},name:"Vacuum Cleaner Store"},"shop/variety_store":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"variety_store"},name:"Variety Store"},"shop/video_games":{icon:"maki-gaming",geometry:["point","area"],tags:{shop:"video_games"},name:"Video Game Store"},"shop/video":{icon:"temaki-movie_rental",geometry:["point","area"],terms:["DVD","VHS","video casette"],tags:{shop:"video"},name:"Video Store"},"shop/watches":{icon:"maki-watch",geometry:["point","area"],tags:{shop:"watches"},name:"Watches Shop"},"shop/water_sports":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"water_sports"},name:"Watersport/Swim Shop"},"shop/water":{icon:"tnp-2009234",geometry:["point","area"],tags:{shop:"water"},name:"Drinking Water Shop"},"shop/weapons":{icon:"maki-shop",geometry:["point","area"],terms:["ammo","gun","knife","knives"],tags:{shop:"weapons"},name:"Weapon Shop"},"shop/wholesale":{icon:"maki-warehouse",fields:["{shop}","wholesale"],geometry:["point","area"],terms:["warehouse club","cash and carry"],tags:{shop:"wholesale"},name:"Wholesale Store"},"shop/window_blind":{icon:"temaki-window",geometry:["point","area"],tags:{shop:"window_blind"},name:"Window Blind Store"},"shop/wine":{icon:"maki-alcohol-shop",geometry:["point","area"],tags:{shop:"wine"},name:"Wine Shop"},tactile_paving:{icon:"temaki-blind",fields:["colour","description"],geometry:["vertex","point","line","area"],tags:{tactile_paving:"*"},matchScore:0.25,terms:["blind path","detectable warning surfaces","tactile ground surface indicators","tactile walking surface indicators","truncated domes","visually impaired path"],name:"Tactile Paving"},"telecom/data_center":{icon:"fas-server",fields:["name","ref","operator","building_area"],moreFields:["address","phone","website"],geometry:["point","area"],tags:{telecom:"data_center"},terms:["computer systems storage","information technology","server farm","the cloud","telecommunications"],name:"Data Center"},"tourism/alpine_hut":{icon:"maki-lodging",fields:["name","operator","address","building_area","internet_access","internet_access/fee","fee","payment_multi_fee"],moreFields:["email","fax","internet_access/ssid","phone","reservation","website","wheelchair"],geometry:["point","area"],terms:["climbing hut"],tags:{tourism:"alpine_hut"},name:"Alpine Hut"},"tourism/apartment":{icon:"maki-lodging",fields:["name","operator","address","building_area","rooms","internet_access","internet_access/fee"],moreFields:["building/levels_building","height_building","email","fax","internet_access/ssid","payment_multi","phone","reservation","smoking","website","wheelchair"],geometry:["point","area"],tags:{tourism:"apartment"},name:"Guest Apartment / Condo"},"tourism/aquarium":{icon:"maki-aquarium",fields:["name","operator","address","building_area","opening_hours"],moreFields:["fee","internet_access","internet_access/fee","internet_access/ssid","payment_multi_fee","smoking","website","phone","email","fax","wheelchair"],geometry:["point","area"],terms:["fish","sea","water"],tags:{tourism:"aquarium"},name:"Aquarium"},"tourism/artwork":{icon:"maki-art-gallery",fields:["name","artwork_type","artist"],moreFields:["material","website"],geometry:["point","vertex","line","area"],tags:{tourism:"artwork"},terms:["mural","sculpture","statue"],name:"Artwork"},"tourism/artwork/bust":{icon:"fas-user-alt",fields:["name","artist","material"],geometry:["point","vertex"],tags:{tourism:"artwork",artwork_type:"bust"},reference:{key:"artwork_type"},terms:["figure"],name:"Bust"},"tourism/artwork/graffiti":{icon:"maki-art-gallery",fields:["name","artist"],geometry:["point","vertex","line","area"],tags:{tourism:"artwork",artwork_type:"graffiti"},reference:{key:"artwork_type"},terms:["Street Artwork","Guerilla Artwork","Graffiti Artwork"],name:"Graffiti"},"tourism/artwork/installation":{icon:"maki-art-gallery",fields:["name","artist"],geometry:["point","vertex","line","area"],tags:{tourism:"artwork",artwork_type:"installation"},reference:{key:"artwork_type"},terms:["interactive art","intervention art","modern art"],name:"Art Installation"},"tourism/artwork/mural":{icon:"maki-art-gallery",fields:["name","artist"],geometry:["point","vertex","line","area"],tags:{tourism:"artwork",artwork_type:"mural"},reference:{key:"artwork_type",value:"mural"},terms:["fresco","wall painting"],name:"Mural"},"tourism/artwork/sculpture":{icon:"maki-art-gallery",fields:["name","artist","material"],geometry:["point","vertex","line","area"],tags:{tourism:"artwork",artwork_type:"sculpture"},reference:{key:"artwork_type",value:"sculpture"},terms:["statue","figure","carving"],name:"Sculpture"},"tourism/artwork/statue":{icon:"fas-female",fields:["name","artist","material"],geometry:["point","vertex","line","area"],tags:{tourism:"artwork",artwork_type:"statue"},reference:{key:"artwork_type",value:"statue"},terms:["sculpture","figure","carving"],name:"Statue"},"tourism/attraction":{icon:"maki-star",fields:["name","operator","address"],geometry:["point","vertex","line","area"],tags:{tourism:"attraction"},matchScore:0.75,name:"Tourist Attraction"},"tourism/camp_site":{icon:"maki-campsite",fields:["name","operator","address","access_simple","capacity","fee","payment_multi_fee","internet_access","internet_access/fee"],moreFields:["email","fax","internet_access/ssid","phone","power_supply","reservation","sanitary_dump_station","website","wheelchair"],geometry:["point","vertex","area"],terms:["tent","rv"],tags:{tourism:"camp_site"},name:"Campground"},"tourism/caravan_site":{icon:"temaki-rv_park",fields:["name","address","capacity","sanitary_dump_station","power_supply","internet_access","internet_access/fee"],moreFields:["operator","fee","payment_multi_fee","internet_access/ssid","smoking","website","phone","email","fax","wheelchair","reservation"],geometry:["point","vertex","area"],terms:["Motor Home","Camper"],tags:{tourism:"caravan_site"},name:"RV Park"},"tourism/chalet":{icon:"maki-lodging",fields:["name","operator","address","building_area","internet_access","internet_access/fee"],moreFields:["air_conditioning","building/levels_building","height_building","smoking","payment_multi","internet_access/ssid","website","phone","email","fax","wheelchair","reservation"],geometry:["point","area"],terms:["holiday","holiday cottage","holiday home","vacation","vacation home"],tags:{tourism:"chalet"},name:"Holiday Cottage"},"tourism/gallery":{icon:"maki-art-gallery",fields:["name","operator","address","building_area","opening_hours"],moreFields:["internet_access","internet_access/fee","internet_access/ssid","payment_multi","website","phone","email","fax","wheelchair"],geometry:["point","area"],terms:["art*","exhibit*","paint*","photo*","sculpt*"],tags:{tourism:"gallery"},name:"Art Gallery"},"tourism/guest_house":{icon:"maki-lodging",fields:["name","operator","guest_house","address","building_area","rooms","internet_access","internet_access/fee"],moreFields:["air_conditioning","building/levels_building","height_building","smoking","payment_multi","internet_access/ssid","website","phone","email","fax","wheelchair","reservation"],geometry:["point","area"],tags:{tourism:"guest_house"},terms:["B&B","Bed and Breakfast"],name:"Guest House"},"tourism/hostel":{icon:"maki-lodging",fields:["{tourism/guest_house}"],moreFields:["{tourism/guest_house}"],geometry:["point","area"],tags:{tourism:"hostel"},name:"Hostel"},"tourism/hotel":{icon:"fas-concierge-bell",fields:["{tourism/motel}"],moreFields:["{tourism/motel}","stars","bar"],geometry:["point","area"],tags:{tourism:"hotel"},name:"Hotel"},"tourism/information":{icon:"maki-information",fields:["information","operator","address","building_area"],geometry:["point","vertex","area"],tags:{tourism:"information"},name:"Information"},"tourism/information/board":{icon:"maki-information",fields:["name","operator","board_type","direction"],geometry:["point","vertex"],tags:{tourism:"information",information:"board"},reference:{key:"information",value:"board"},name:"Information Board"},"tourism/information/guidepost":{icon:"fas-map-signs",fields:["name","elevation","operator","ref"],moreFields:["material"],geometry:["point","vertex"],terms:["signpost"],tags:{tourism:"information",information:"guidepost"},reference:{key:"information",value:"guidepost"},name:"Guidepost"},"tourism/information/map":{icon:"fas-map",fields:["operator","map_type","map_size","direction"],geometry:["point","vertex"],tags:{tourism:"information",information:"map"},reference:{key:"information",value:"map"},name:"Map"},"tourism/information/office":{icon:"maki-information",fields:["name","operator","address","building_area","internet_access","internet_access/fee"],moreFields:["building/levels_building","height_building","email","fax","internet_access/ssid","phone","website","wheelchair"],geometry:["point","vertex","area"],tags:{tourism:"information",information:"office"},reference:{key:"information",value:"office"},name:"Tourist Information Office"},"tourism/information/route_marker":{icon:"maki-information",fields:["ref","operator","colour","material","elevation"],geometry:["point","vertex"],terms:["cairn","painted blaze","route flag","route marker","stone pile","trail blaze","trail post","way marker"],tags:{tourism:"information",information:"route_marker"},reference:{key:"information",value:"route_marker"},name:"Trail Marker"},"tourism/information/terminal":{icon:"maki-information",fields:["operator"],geometry:["point","vertex"],tags:{tourism:"information",information:"terminal"},reference:{key:"information",value:"terminal"},name:"Information Terminal"},"tourism/motel":{icon:"maki-lodging",fields:["name","brand","address","building_area","rooms","internet_access","internet_access/fee"],moreFields:["air_conditioning","building/levels_building","height_building","email","fax","internet_access/ssid","operator","payment_multi","phone","reservation","smoking","website","wheelchair"],geometry:["point","area"],tags:{tourism:"motel"},name:"Motel"},"tourism/museum":{icon:"temaki-museum",fields:["name","operator","address","building_area","opening_hours"],moreFields:["air_conditioning","building/levels_building","height_building","fee","internet_access","internet_access/fee","internet_access/ssid","payment_multi","website","phone","email","fax","wheelchair"],geometry:["point","area"],terms:["art*","exhibit*","gallery","foundation","hall","institution","paint*","photo*","sculpt*"],tags:{tourism:"museum"},name:"Museum"},"tourism/picnic_site":{icon:"maki-picnic-site",fields:["name","operator","address","access_simple","capacity"],moreFields:["internet_access","internet_access/fee","internet_access/ssid","smoking","fee","payment_multi_fee","phone","reservation","website","wheelchair"],geometry:["point","vertex","area"],terms:["camp"],tags:{tourism:"picnic_site"},name:"Picnic Site"},"tourism/theme_park":{icon:"maki-amusement-park",fields:["name","operator","address","opening_hours"],moreFields:["internet_access","internet_access/fee","internet_access/ssid","payment_multi","website","phone","email","fax","wheelchair"],geometry:["point","area"],tags:{tourism:"theme_park"},name:"Theme Park"},"tourism/trail_riding_station":{icon:"maki-horse-riding",fields:["name","horse_stables","horse_riding","horse_dressage"],moreFields:["internet_access","internet_access/fee","internet_access/ssid","address","opening_hours","website","phone","email","fax"],geometry:["point","area"],tags:{tourism:"trail_riding_station"},name:"Trail Riding Station",matchScore:2},"tourism/viewpoint":{icon:"temaki-binoculars",geometry:["point","vertex"],fields:["direction"],tags:{tourism:"viewpoint"},name:"Viewpoint"},"tourism/wilderness_hut":{icon:"maki-lodging",fields:["name","operator","address","building_area","fee","payment_multi_fee","fireplace"],moreFields:["internet_access","internet_access/fee","internet_access/ssid","reservation","wheelchair"],geometry:["point","area"],terms:["wilderness hut","backcountry hut","bothy"],tags:{tourism:"wilderness_hut"},name:"Wilderness Hut"},"tourism/zoo":{icon:"temaki-zoo",fields:["name","operator","address","opening_hours","fee"],moreFields:["internet_access","internet_access/fee","internet_access/ssid","payment_multi","website","phone","email","fax","wheelchair"],geometry:["point","area"],terms:["animal"],tags:{tourism:"zoo"},name:"Zoo"},"tourism/zoo/petting":{icon:"fas-horse",geometry:["point","area"],tags:{tourism:"zoo",zoo:"petting_zoo"},reference:{key:"zoo",value:"petting_zoo"},terms:["Children's Zoo","Children's Farm","Petting Farm","farm animals"],name:"Petting Zoo"},"tourism/zoo/safari":{icon:"temaki-zoo",geometry:["point","area"],tags:{tourism:"zoo",zoo:"safari_park"},reference:{key:"zoo",value:"safari_park"},terms:["Drive-Through Zoo","Drive-In Zoo"],name:"Safari Park"},"tourism/zoo/wildlife":{icon:"fas-frog",geometry:["point","area"],tags:{tourism:"zoo",zoo:"wildlife_park"},reference:{key:"zoo",value:"wildlife_park"},terms:["indigenous animals"],name:"Wildlife Park"},traffic_calming:{icon:"temaki-diamond",fields:["traffic_calming","surface","direction_vertex"],geometry:["vertex","line","area"],tags:{traffic_calming:"*"},terms:["bump","hump","slow","speed"],name:"Traffic Calming"},"traffic_calming/bump":{icon:"temaki-diamond",fields:["surface","direction_vertex"],geometry:["vertex","line"],terms:["hump","speed","slow"],tags:{traffic_calming:"bump"},name:"Speed Bump"},"traffic_calming/chicane":{icon:"temaki-diamond",fields:["surface","direction_vertex"],geometry:["vertex","line","area"],terms:["driveway link","speed","slow"],tags:{traffic_calming:"chicane"},name:"Traffic Chicane"},"traffic_calming/choker":{icon:"temaki-diamond",fields:["surface","direction_vertex"],geometry:["vertex","line","area"],terms:["speed","slow"],tags:{traffic_calming:"choker"},name:"Traffic Choker"},"traffic_calming/cushion":{icon:"temaki-diamond",fields:["surface","direction_vertex"],geometry:["vertex","line"],terms:["bump","hump","speed","slow"],tags:{traffic_calming:"cushion"},name:"Speed Cushion"},"traffic_calming/dip":{icon:"temaki-diamond",fields:["surface","direction_vertex"],geometry:["vertex","line"],terms:["speed","slow"],tags:{traffic_calming:"dip"},name:"Dip"},"traffic_calming/hump":{icon:"temaki-diamond",fields:["surface","direction_vertex"],geometry:["vertex","line"],terms:["bump","speed","slow"],tags:{traffic_calming:"hump"},name:"Speed Hump"},"traffic_calming/island":{icon:"temaki-diamond",fields:["surface"],geometry:["vertex","line","area"],terms:["circle","roundabout","slow"],tags:{traffic_calming:"island"},name:"Traffic Island"},"traffic_calming/rumble_strip":{icon:"temaki-diamond",fields:["direction_vertex"],geometry:["vertex","line"],terms:["audible lines","sleeper lines","growlers"],tags:{traffic_calming:"rumble_strip"},name:"Rumble Strip"},"traffic_calming/table":{icon:"temaki-diamond",fields:["surface","direction_vertex"],geometry:["vertex"],tags:{traffic_calming:"table"},terms:["flat top","hump","speed","slow"],name:"Speed Table"},traffic_sign_vertex:{icon:"maki-square-stroked",fields:["traffic_sign","traffic_sign/direction"],geometry:["vertex"],tags:{traffic_sign:"*"},terms:["road","highway"],name:"Traffic Sign"},traffic_sign:{icon:"fas-directions",fields:["traffic_sign","direction"],geometry:["point"],tags:{traffic_sign:"*"},terms:["road","highway"],name:"Traffic Sign"},"traffic_sign/city_limit_vertex":{icon:"maki-square-stroked",fields:["traffic_sign","traffic_sign/direction","name"],geometry:["vertex"],tags:{traffic_sign:"city_limit"},terms:["town","village","hamlet","boundary","edge","border","road","highway"],name:"City Limit Sign"},"traffic_sign/city_limit":{icon:"maki-square-stroked",fields:["traffic_sign","direction","name"],geometry:["point"],tags:{traffic_sign:"city_limit"},terms:["town","village","hamlet","boundary","edge","border","road","highway"],name:"City Limit Sign"},"traffic_sign/maxspeed_vertex":{icon:"maki-square-stroked",fields:["traffic_sign","traffic_sign/direction","maxspeed"],geometry:["vertex"],tags:{traffic_sign:"maxspeed"},terms:["max speed","maximum speed","road","highway"],name:"Speed Limit Sign"},"traffic_sign/maxspeed":{icon:"maki-square-stroked",fields:["traffic_sign","direction","maxspeed"],geometry:["point"],tags:{traffic_sign:"maxspeed"},terms:["max speed","maximum speed","road","highway"],name:"Speed Limit Sign"},"type/multipolygon":{icon:"iD-multipolygon",geometry:["area","relation"],tags:{type:"multipolygon"},removeTags:{},name:"Multipolygon",searchable:false,matchScore:0.1},"type/boundary":{icon:"iD-boundary",fields:["name","boundary"],geometry:["relation"],tags:{type:"boundary"},name:"Boundary"},"type/boundary/administrative":{icon:"iD-boundary",fields:["name","admin_level"],geometry:["relation"],tags:{type:"boundary",boundary:"administrative"},reference:{key:"boundary",value:"administrative"},name:"Administrative Boundary"},"type/enforcement":{icon:"iD-relation",fields:["name","enforcement"],geometry:["relation"],tags:{type:"enforcement"},name:"Enforcement"},"type/public_transport/stop_area_group":{icon:"iD-relation",fields:["name","ref","network","operator"],geometry:["relation"],tags:{type:"public_transport",public_transport:"stop_area_group"},reference:{key:"public_transport",value:"stop_area_group"},name:"Transit Stop Area Group"},"type/restriction":{icon:"iD-restriction",fields:["restriction","except"],geometry:["relation"],tags:{type:"restriction"},name:"Restriction"},"type/restriction/no_left_turn":{icon:"iD-restriction-no-left-turn",geometry:["relation"],tags:{type:"restriction",restriction:"no_left_turn"},name:"No Left Turn"},"type/restriction/no_right_turn":{icon:"iD-restriction-no-right-turn",geometry:["relation"],tags:{type:"restriction",restriction:"no_right_turn"},name:"No Right Turn"},"type/restriction/no_straight_on":{icon:"iD-restriction-no-straight-on",geometry:["relation"],tags:{type:"restriction",restriction:"no_straight_on"},name:"No Straight On"},"type/restriction/no_u_turn":{icon:"iD-restriction-no-u-turn",geometry:["relation"],tags:{type:"restriction",restriction:"no_u_turn"},name:"No U-turn"},"type/restriction/only_left_turn":{icon:"iD-restriction-only-left-turn",geometry:["relation"],tags:{type:"restriction",restriction:"only_left_turn"},name:"Only Left Turn"},"type/restriction/only_right_turn":{icon:"iD-restriction-only-right-turn",geometry:["relation"],tags:{type:"restriction",restriction:"only_right_turn"},name:"Only Right Turn"},"type/restriction/only_straight_on":{icon:"iD-restriction-only-straight-on",geometry:["relation"],tags:{type:"restriction",restriction:"only_straight_on"},name:"Only Straight On"},"type/restriction/only_u_turn":{icon:"iD-restriction-only-u-turn",geometry:["relation"],tags:{type:"restriction",restriction:"only_u_turn"},name:"Only U-turn"},"type/route_master":{icon:"iD-route-master",fields:["name","route_master","ref","operator","network"],moreFields:["colour","interval","opening_hours","wheelchair"],geometry:["relation"],tags:{type:"route_master"},name:"Route Master"},"type/route":{icon:"iD-route",fields:["name","route","ref_route","operator","network"],geometry:["relation"],tags:{type:"route"},name:"Route"},"type/route/bicycle":{icon:"maki-bicycle",fields:["name","ref_route","network_bicycle","cycle_network","to","from"],geometry:["relation"],tags:{type:"route",route:"bicycle"},name:"Cycle Route"},"type/route/bus":{icon:"maki-bus",fields:["{type/route/train}"],moreFields:["{type/route/train}"],geometry:["relation"],tags:{type:"route",route:"bus"},name:"Bus Route"},"type/route/detour":{icon:"iD-route-detour",fields:["name","ref_route","to","from"],geometry:["relation"],tags:{type:"route",route:"detour"},name:"Detour Route"},"type/route/ferry":{icon:"maki-ferry",fields:["name","ref_route","operator","network","to","from"],moreFields:["interval","maxheight","maxweight","opening_hours","duration","wheelchair"],geometry:["relation"],tags:{type:"route",route:"ferry"},name:"Ferry Route"},"type/route/foot":{icon:"temaki-pedestrian",fields:["name","ref_route","operator","network_foot","to","from"],geometry:["relation"],tags:{type:"route",route:"foot"},name:"Foot Route"},"type/route/hiking":{icon:"fas-hiking",fields:["name","ref_route","operator","network_foot","description","distance","to","from"],geometry:["relation"],tags:{type:"route",route:"hiking"},name:"Hiking Route"},"type/route/horse":{icon:"maki-horse-riding",fields:["name","ref_route","operator","network_horse","description","distance","to","from"],geometry:["relation"],tags:{type:"route",route:"horse"},name:"Riding Route"},"type/route/light_rail":{icon:"temaki-light_rail",fields:["{type/route/train}"],moreFields:["{type/route/train}"],geometry:["relation"],tags:{type:"route",route:"light_rail"},name:"Light Rail Route"},"type/route/monorail":{icon:"temaki-monorail",fields:["{type/route/train}"],moreFields:["{type/route/train}"],geometry:["relation"],tags:{type:"route",route:"monorail"},name:"Monorail Route"},"type/route/pipeline":{icon:"iD-pipeline-line",fields:["name","ref_route","operator","to","from"],geometry:["relation"],tags:{type:"route",route:"pipeline"},name:"Pipeline Route"},"type/route/piste":{icon:"fas-skiing",fields:["name","piste/type","colour","ref_route","operator","to","from"],geometry:["relation"],tags:{type:"route",route:"piste"},name:"Piste/Ski Route"},"type/route/power":{icon:"iD-power-line",fields:["name","ref_route","operator","to","from"],geometry:["relation"],tags:{type:"route",route:"power"},name:"Power Route"},"type/route/road":{icon:"iD-highway-unclassified",fields:["name","ref_route","network_road","to","from"],geometry:["relation"],tags:{type:"route",route:"road"},name:"Road Route"},"type/route/subway":{icon:"temaki-subway",fields:["{type/route/train}"],moreFields:["{type/route/train}"],geometry:["relation"],tags:{type:"route",route:"subway"},name:"Subway Route"},"type/route/train":{icon:"iD-railway-rail",fields:["name","ref_route","operator","network","to","from"],moreFields:["colour","interval","opening_hours","duration","wheelchair"],geometry:["relation"],tags:{type:"route",route:"train"},name:"Train Route"},"type/route/tram":{icon:"temaki-tram",fields:["{type/route/train}"],moreFields:["{type/route/train}"],geometry:["relation"],tags:{type:"route",route:"tram"},name:"Tram Route"},"type/site":{icon:"iD-relation",fields:["name","site"],geometry:["relation"],tags:{type:"site"},name:"Site"},"type/waterway":{icon:"iD-waterway-stream",fields:["name","waterway","ref"],geometry:["relation"],tags:{type:"waterway"},name:"Waterway"},"waterway/riverbank":{icon:"maki-water",geometry:["area"],tags:{waterway:"riverbank"},name:"Riverbank",searchable:false},"waterway/boatyard":{icon:"maki-harbor",fields:["name","operator"],moreFields:["address","website","phone","email","fax","wheelchair"],geometry:["area","vertex","point"],tags:{waterway:"boatyard"},name:"Boatyard"},"waterway/canal":{icon:"iD-waterway-canal",fields:["name","width","intermittent","lock"],moreFields:["fishing","salt","tidal"],geometry:["line"],tags:{waterway:"canal"},name:"Canal"},"waterway/canal/lock":{icon:"iD-waterway-canal",fields:["name","width","lock"],moreFields:["intermittent","salt","tidal"],geometry:["line"],tags:{waterway:"canal",lock:"yes"},name:"Canal Lock"},"waterway/dam":{icon:"maki-dam",geometry:["point","vertex","line","area"],fields:["name"],moreFields:["website"],tags:{waterway:"dam"},name:"Dam"},"waterway/ditch":{icon:"iD-waterway-ditch",fields:["{waterway/drain}"],moreFields:["{waterway/drain}"],geometry:["line"],tags:{waterway:"ditch"},name:"Ditch"},"waterway/dock":{icon:"maki-harbor",fields:["name","dock","operator"],geometry:["area","vertex","point"],terms:["boat","ship","vessel","marine"],tags:{waterway:"dock"},name:"Wet Dock / Dry Dock"},"waterway/drain":{icon:"iD-waterway-ditch",fields:["structure_waterway","intermittent"],moreFields:["covered"],geometry:["line"],tags:{waterway:"drain"},name:"Drain"},"waterway/fuel":{icon:"maki-fuel",fields:["name","operator","address","opening_hours","fuel_multi"],moreFields:["payment_multi","brand","seamark/type","building","website","phone","email","fax","wheelchair"],geometry:["point","area"],terms:["petrol","gas","diesel","boat"],tags:{waterway:"fuel"},name:"Marine Fuel Station"},"waterway/lock_gate":{icon:"maki-dam",geometry:["vertex","line"],fields:["name","ref","height","material"],tags:{waterway:"lock_gate"},addTags:{waterway:"lock_gate","seamark:type":"gate"},terms:["canal"],name:"Lock Gate"},"waterway/milestone":{icon:"temaki-milestone",fields:["distance","direction_vertex"],moreFields:["seamark/type"],geometry:["point","vertex"],tags:{waterway:"milestone"},terms:["milestone","marker"],name:"Waterway Milestone"},"waterway/river":{icon:"iD-waterway-river",fields:["name","structure_waterway","width","intermittent","tidal"],moreFields:["covered","fishing","salt"],geometry:["line"],terms:["beck","branch","brook","course","creek","estuary","rill","rivulet","run","runnel","stream","tributary","watercourse"],tags:{waterway:"river"},name:"River"},"waterway/sanitary_dump_station":{icon:"temaki-storage_tank",fields:["name","operator","access_simple","fee","payment_multi_fee","water_point"],moreFields:["opening_hours","seamark/type"],geometry:["point","vertex","area"],terms:["Boat","Watercraft","Sanitary","Dump Station","Pumpout","Pump out","Elsan","CDP","CTDP","Chemical Toilet"],tags:{waterway:"sanitary_dump_station"},name:"Marine Toilet Disposal"},"waterway/stream_intermittent":{icon:"iD-waterway-stream",fields:["{waterway/stream}"],moreFields:["{waterway/stream}"],geometry:["line"],terms:["arroyo","beck","branch","brook","burn","course","creek","drift","flood","flow","gully","run","runnel","rush","spate","spritz","tributary","wadi","wash","watercourse"],tags:{waterway:"stream",intermittent:"yes"},reference:{key:"waterway",value:"stream"},name:"Intermittent Stream"},"waterway/stream":{icon:"iD-waterway-stream",fields:["name","structure_waterway","width","intermittent"],moreFields:["covered","fishing","salt","tidal"],geometry:["line"],terms:["beck","branch","brook","burn","course","creek","current","drift","flood","flow","freshet","race","rill","rindle","rivulet","run","runnel","rush","spate","spritz","surge","tide","torrent","tributary","watercourse"],tags:{waterway:"stream"},name:"Stream"},"waterway/water_point":{icon:"maki-drinking-water",geometry:["area","vertex","point"],tags:{waterway:"water_point"},name:"Marine Drinking Water"},"waterway/waterfall":{icon:"maki-waterfall",fields:["name","height","width","intermittent"],geometry:["vertex"],terms:["fall"],tags:{waterway:"waterfall"},name:"Waterfall"},"waterway/weir":{icon:"maki-dam",geometry:["vertex","line"],tags:{waterway:"weir"},name:"Weir"},"amenity/bank/ABANCA":{name:"ABANCA",icon:"maki-bank",imageURL:"https://graph.facebook.com/SomosAbanca/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q9598744",amenity:"bank"},addTags:{amenity:"bank",brand:"ABANCA","brand:wikidata":"Q9598744","brand:wikipedia":"es:Abanca",name:"ABANCA",official_name:"ABANCA Corporación Bancaria"},countryCodes:["es"],terms:[],matchScore:2,suggestion:true},"amenity/bank/ABN AMRO":{name:"ABN AMRO",icon:"maki-bank",imageURL:"https://graph.facebook.com/abnamro/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q287471",amenity:"bank"},addTags:{amenity:"bank",brand:"ABN AMRO","brand:wikidata":"Q287471","brand:wikipedia":"en:ABN AMRO",name:"ABN AMRO",official_name:"ABN AMRO Bank N.V.",operator:"ABN AMRO Group","operator:wikidata":"Q17061287","operator:wikipedia":"en:ABN AMRO Group"},countryCodes:["nl"],terms:[],matchScore:2,suggestion:true},"amenity/bank/ABSA":{name:"ABSA",icon:"maki-bank",imageURL:"https://graph.facebook.com/AbsaSouthAfrica/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q331688",amenity:"bank"},addTags:{amenity:"bank",brand:"ABSA","brand:wikidata":"Q331688","brand:wikipedia":"en:ABSA Group Limited",name:"ABSA"},countryCodes:["za"],terms:[],matchScore:2,suggestion:true},"amenity/bank/AIB":{name:"AIB",icon:"maki-bank",imageURL:"https://graph.facebook.com/aib/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1642179",amenity:"bank"},addTags:{amenity:"bank",brand:"AIB","brand:wikidata":"Q1642179","brand:wikipedia":"en:Allied Irish Banks",name:"AIB",official_name:"Allied Irish Banks"},countryCodes:["gb","ie"],terms:[],matchScore:2,suggestion:true},"amenity/bank/ANZ":{name:"ANZ",icon:"maki-bank",imageURL:"https://graph.facebook.com/ANZAustralia/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q714641",amenity:"bank"},addTags:{amenity:"bank",brand:"ANZ","brand:wikidata":"Q714641","brand:wikipedia":"en:Australia and New Zealand Banking Group",name:"ANZ",official_name:"Australia and New Zealand Banking Group Limited"},countryCodes:["au","nz"],terms:["anz bank"],matchScore:2,suggestion:true},"amenity/bank/ASB Bank":{name:"ASB Bank",icon:"maki-bank",imageURL:"https://graph.facebook.com/ASBBank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q297214",amenity:"bank"},addTags:{amenity:"bank",brand:"ASB Bank","brand:wikidata":"Q297214","brand:wikipedia":"en:ASB Bank",name:"ASB Bank",operator:"Commonwealth Bank of Australia","operator:wikidata":"Q285328","operator:wikipedia":"en:Commonwealth Bank"},countryCodes:["nz"],terms:[],matchScore:2,suggestion:true},"amenity/bank/ATB Financial":{name:"ATB Financial",icon:"maki-bank",imageURL:"https://graph.facebook.com/ATBFinancial/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q298762",amenity:"bank"},addTags:{amenity:"bank",brand:"ATB Financial","brand:wikidata":"Q298762","brand:wikipedia":"en:ATB Financial",name:"ATB Financial",official_name:"Alberta Treasury Branches"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"amenity/bank/AXA":{name:"AXA",icon:"maki-bank",imageURL:"https://graph.facebook.com/axainsurance/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q160054",amenity:"bank"},addTags:{amenity:"bank",brand:"AXA","brand:wikidata":"Q160054","brand:wikipedia":"en:AXA",name:"AXA"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Access Bank":{name:"Access Bank",icon:"maki-bank",imageURL:"https://graph.facebook.com/AccessBankPlc/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4672418",amenity:"bank"},addTags:{amenity:"bank",brand:"Access Bank","brand:wikidata":"Q4672418","brand:wikipedia":"en:Access Bank plc",name:"Access Bank",operator:"Access Bank Group","operator:wikidata":"Q4672420","operator:wikipedia":"en:Access Bank Group"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Addiko Bank":{name:"Addiko Bank",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FAddiko%20Bank%20Logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q27926559",amenity:"bank"},addTags:{amenity:"bank",brand:"Addiko Bank","brand:wikidata":"Q27926559","brand:wikipedia":"en:Addiko Bank",name:"Addiko Bank"},countryCodes:["ba","hr","me","rs","si"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Agrani Bank Limited অগ্রণী ব্যাংক লিমিটেড":{name:"Agrani Bank Limited অগ্রণী ব্যাংক লিমিটেড",icon:"maki-bank",imageURL:"https://graph.facebook.com/AgraniBankLimited/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q517050",amenity:"bank"},addTags:{amenity:"bank",brand:"Agrani Bank Limited অগ্রণী ব্যাংক লিমিটেড","brand:wikidata":"Q517050","brand:wikipedia":"en:Agrani Bank",name:"Agrani Bank Limited অগ্রণী ব্যাংক লিমিটেড","name:en":"Agrani Bank Limited"},countryCodes:["bd"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Agribank (USA)":{name:"Agribank (USA)",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/580476082798923776/6wuC8WL4_bigger.png",geometry:["point","area"],tags:{"brand:wikidata":"Q4693829",amenity:"bank"},addTags:{amenity:"bank",brand:"Agribank","brand:wikidata":"Q4693829","brand:wikipedia":"en:AgriBank",name:"Agribank"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Agribank (Vietnam)":{name:"Agribank (Vietnam)",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q1924723",amenity:"bank"},addTags:{amenity:"bank",brand:"Agribank","brand:wikidata":"Q1924723","brand:wikipedia":"vn:Ngân hàng Nông nghiệp và Phát triển Nông thôn Việt Nam",name:"Agribank",official_name:"Ngân hàng Nông nghiệp và Phát triển Nông thôn Việt Nam","official_name:en":"Vietnam Bank for Agriculture and Rural Development"},countryCodes:["vn"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Agribank (Zimbabwe)":{name:"Agribank (Zimbabwe)",icon:"maki-bank",imageURL:"https://graph.facebook.com/agribankzim/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4693887",amenity:"bank"},addTags:{amenity:"bank",brand:"Agribank","brand:wikidata":"Q4693887","brand:wikipedia":"en:Agricultural Development Bank of Zimbabwe",name:"Agribank"},countryCodes:["zw"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Akbank":{name:"Akbank",icon:"maki-bank",imageURL:"https://graph.facebook.com/Akbank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q416624",amenity:"bank"},addTags:{amenity:"bank",brand:"Akbank","brand:wikidata":"Q416624","brand:wikipedia":"en:Akbank",name:"Akbank"},countryCodes:["tr"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Alior Bank":{name:"Alior Bank",icon:"maki-bank",imageURL:"https://graph.facebook.com/AliorBankSA/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q9148395",amenity:"bank"},addTags:{amenity:"bank",brand:"Alior Bank","brand:wikidata":"Q9148395","brand:wikipedia":"pl:Alior Bank",name:"Alior Bank"},countryCodes:["pl"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Allahabad Bank":{name:"Allahabad Bank",icon:"maki-bank",imageURL:"https://graph.facebook.com/AllahabadBank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2018840",amenity:"bank"},addTags:{amenity:"bank",brand:"Allahabad Bank","brand:wikidata":"Q2018840","brand:wikipedia":"en:Allahabad Bank",name:"Allahabad Bank"},countryCodes:["in"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Allied Bank":{name:"Allied Bank",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q4732555",amenity:"bank"},addTags:{amenity:"bank",brand:"Allied Bank","brand:wikidata":"Q4732555","brand:wikipedia":"en:Allied Banking Corporation",name:"Allied Bank"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Alpha Bank":{name:"Alpha Bank",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/441617450262491136/GDkx0IIP_bigger.png",geometry:["point","area"],tags:{"brand:wikidata":"Q747394",amenity:"bank"},addTags:{amenity:"bank",brand:"Alpha Bank","brand:wikidata":"Q747394","brand:wikipedia":"en:Alpha Bank",name:"Alpha Bank",operator:"Hellenic Financial Stability Fund","operator:wikidata":"Q19903317","operator:wikipedia":"en:Hellenic Financial Stability Fund"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Andhra Bank":{name:"Andhra Bank",icon:"maki-bank",imageURL:"https://graph.facebook.com/official.andhrabank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2003476",amenity:"bank"},addTags:{amenity:"bank",brand:"Andhra Bank","brand:wikidata":"Q2003476","brand:wikipedia":"en:Andhra Bank",name:"Andhra Bank"},countryCodes:["in"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Antonveneta":{name:"Antonveneta",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q3633689",amenity:"bank"},addTags:{amenity:"bank",brand:"Antonveneta","brand:wikidata":"Q3633689","brand:wikipedia":"en:Banca Antonveneta",name:"Antonveneta"},countryCodes:["it"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Apple Bank":{name:"Apple Bank",icon:"maki-bank",imageURL:"https://graph.facebook.com/AppleBankfan/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4781125",amenity:"bank"},addTags:{amenity:"bank",brand:"Apple Bank","brand:wikidata":"Q4781125","brand:wikipedia":"en:Apple Bank for Savings",name:"Apple Bank"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Argenta":{name:"Argenta",icon:"maki-bank",imageURL:"https://graph.facebook.com/argenta/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q932856",amenity:"bank"},addTags:{amenity:"bank",brand:"Argenta","brand:wikidata":"Q932856","brand:wikipedia":"en:Argenta (bank)",name:"Argenta",operator:"Argenta Group","operator:wikidata":"Q19604341"},countryCodes:["be","lu","nl"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Arvest Bank":{name:"Arvest Bank",icon:"maki-bank",imageURL:"https://graph.facebook.com/ArvestBank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4802393",amenity:"bank"},addTags:{amenity:"bank",brand:"Arvest Bank","brand:wikidata":"Q4802393","brand:wikipedia":"en:Arvest Bank",name:"Arvest Bank"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Asia United Bank":{name:"Asia United Bank",icon:"maki-bank",imageURL:"https://graph.facebook.com/AUB.Official/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4806482",amenity:"bank"},addTags:{amenity:"bank",brand:"Asia United Bank","brand:wikidata":"Q4806482","brand:wikipedia":"en:Asia United Bank",name:"Asia United Bank"},countryCodes:["ph"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Askari Bank":{name:"Askari Bank",icon:"maki-bank",imageURL:"https://graph.facebook.com/askaribankpakistan/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4807137",amenity:"bank"},addTags:{amenity:"bank",brand:"Askari Bank","brand:wikidata":"Q4807137","brand:wikipedia":"en:Askari Bank",name:"Askari Bank"},countryCodes:["pk"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Associated Bank":{name:"Associated Bank",icon:"maki-bank",imageURL:"https://graph.facebook.com/associatedbank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4809155",amenity:"bank"},addTags:{amenity:"bank",brand:"Associated Bank","brand:wikidata":"Q4809155","brand:wikipedia":"en:Associated Banc-Corp",name:"Associated Bank",operator:"Associated Banc-Corp"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Attijariwafa Bank":{name:"Attijariwafa Bank",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/689449211050393601/0_NfM1Dp_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q758052",amenity:"bank"},addTags:{amenity:"bank",brand:"Attijariwafa Bank","brand:wikidata":"Q758052","brand:wikipedia":"en:Attijariwafa Bank",name:"Attijariwafa Bank",operator:"Société Nationale d'Investissement","operator:en":"National Investment Company","operator:wikidata":"Q3488506","operator:wikipedia":"en:Société Nationale d'Investissement"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Axis Bank":{name:"Axis Bank",icon:"maki-bank",imageURL:"https://graph.facebook.com/axisbank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2003549",amenity:"bank"},addTags:{amenity:"bank",brand:"Axis Bank","brand:wikidata":"Q2003549","brand:wikipedia":"en:Axis Bank",name:"Axis Bank"},countryCodes:["in"],terms:[],matchScore:2,suggestion:true},"amenity/bank/BAC":{name:"BAC",icon:"maki-bank",imageURL:"https://graph.facebook.com/BACCredomaticSV/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5715556",amenity:"bank"},addTags:{amenity:"bank",brand:"BAC","brand:wikidata":"Q5715556","brand:wikipedia":"en:Banco de América Central",name:"BAC",official_name:"Banco de America Central",operator:"Grupo Aval","operator:en":"Aval Group","operator:wikidata":"Q2053387","operator:wikipedia":"en:Grupo Aval"},terms:[],matchScore:2,suggestion:true},"amenity/bank/BAWAG PSK":{name:"BAWAG PSK",icon:"maki-bank",imageURL:"https://graph.facebook.com/bawag.psk/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q379938",amenity:"bank"},addTags:{amenity:"bank",brand:"BAWAG PSK","brand:wikidata":"Q379938","brand:wikipedia":"en:BAWAG P.S.K.",name:"BAWAG PSK"},countryCodes:["at"],terms:[],matchScore:2,suggestion:true},"amenity/bank/BB&T":{name:"BB&T",icon:"maki-bank",imageURL:"https://graph.facebook.com/BBTBank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q795486",amenity:"bank"},addTags:{amenity:"bank",brand:"BB&T","brand:wikidata":"Q795486","brand:wikipedia":"en:BB&T",name:"BB&T",official_name:"Branch Banking and Trust Company"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/bank/BBBank":{name:"BBBank",icon:"maki-bank",imageURL:"https://graph.facebook.com/BBBank.de/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q795504",amenity:"bank"},addTags:{amenity:"bank",brand:"BBBank","brand:wikidata":"Q795504","brand:wikipedia":"en:BBBank",name:"BBBank",operator:"Baden-Württembergischer Genossenschaftsverband","operator:en":"Baden-Württemberg Cooperative Association","operator:wikidata":"Q798896","operator:wikipedia":"de:Baden-Württembergischer Genossenschaftsverband"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"amenity/bank/BBVA":{name:"BBVA",icon:"maki-bank",imageURL:"https://graph.facebook.com/GrupoBBVA/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q806189",amenity:"bank"},addTags:{amenity:"bank",brand:"BBVA","brand:wikidata":"Q806189","brand:wikipedia":"en:Banco Bilbao Vizcaya Argentaria",name:"BBVA",official_name:"Banco Bilbao Vizcaya Argentaria"},terms:[],matchScore:2,suggestion:true},"amenity/bank/BBVA Bancomer":{name:"BBVA Bancomer",icon:"maki-bank",imageURL:"https://graph.facebook.com/BBVABancomer/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2876794",amenity:"bank"},addTags:{amenity:"bank",brand:"BBVA Bancomer","brand:wikidata":"Q2876794","brand:wikipedia":"en:BBVA Bancomer",name:"BBVA Bancomer",operator:"BBVA","operator:wikidata":"Q806189","operator:wikipedia":"de:Banco Bilbao Vizcaya Argentaria"},countryCodes:["mx"],terms:[],matchScore:2,suggestion:true},"amenity/bank/BBVA Compass":{name:"BBVA Compass",icon:"maki-bank",imageURL:"https://graph.facebook.com/bbvacompass/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4835088",amenity:"bank"},addTags:{amenity:"bank",brand:"BBVA Compass","brand:wikidata":"Q4835088","brand:wikipedia":"en:BBVA Compass",name:"BBVA Compass",official_name:"BBVA Compass Bancshares",operator:"BBVA","operator:wikidata":"Q806189","operator:wikipedia":"de:Banco Bilbao Vizcaya Argentaria"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/bank/BBVA Continental":{name:"BBVA Continental",icon:"maki-bank",imageURL:"https://graph.facebook.com/BBVAContinental/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4835089",amenity:"bank"},addTags:{amenity:"bank",brand:"BBVA Continental","brand:wikidata":"Q4835089","brand:wikipedia":"en:BBVA Continental",name:"BBVA Continental",operator:"BBVA","operator:wikidata":"Q806189","operator:wikipedia":"de:Banco Bilbao Vizcaya Argentaria"},countryCodes:["pe"],terms:[],matchScore:2,suggestion:true},"amenity/bank/BBVA Francés":{name:"BBVA Francés",icon:"maki-bank",imageURL:"https://graph.facebook.com/BBVAFrancesArg/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2876788",amenity:"bank"},addTags:{amenity:"bank",brand:"BBVA Francés","brand:en":"BBVA France","brand:fr":"BBVA France","brand:wikidata":"Q2876788","brand:wikipedia":"en:BBVA Francés",name:"BBVA Francés","name:en":"BBVA France","name:fr":"BBVA Francés",operator:"BBVA","operator:wikidata":"Q806189","operator:wikipedia":"de:Banco Bilbao Vizcaya Argentaria"},countryCodes:["ar"],terms:[],matchScore:2,suggestion:true},"amenity/bank/BCA":{name:"BCA",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/608231074435440640/GlPmkzgL_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q806626",amenity:"bank"},addTags:{amenity:"bank",brand:"BCA","brand:wikidata":"Q806626","brand:wikipedia":"id:Bank Central Asia",name:"BCA",official_name:"Bank Central Asia"},terms:["bank bca"],matchScore:2,suggestion:true},"amenity/bank/BCI":{name:"BCI",icon:"maki-bank",imageURL:"https://graph.facebook.com/BancoBci/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2882083",amenity:"bank"},addTags:{amenity:"bank",brand:"BCI","brand:wikidata":"Q2882083","brand:wikipedia":"es:Banco de Crédito e Inversiones",name:"BCI",official_name:"Banco de Crédito e Inversiones","official_name:en":"Bank of Credit and Investments","official_name:es":"Banco de Crédito e Inversiones"},terms:["banco bci"],matchScore:2,suggestion:true},"amenity/bank/BCP (Bolivia)":{name:"BCP (Bolivia)",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FLogobcp.png&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q16826675",amenity:"bank"},addTags:{amenity:"bank",brand:"BCP","brand:wikidata":"Q16826675","brand:wikipedia":"es:Banco de Crédito de Bolivia",name:"BCP",official_name:"Banco de Crédito de Bolivia","official_name:en":"Credit Bank of Bolivia","official_name:es":"Banco de Crédito de Bolivia",operator:"Banco de Crédito del Perú","operator:en":"Credit Bank of Peru","operator:es":"Banco de Crédito del Perú","operator:wikidata":"Q4854124","operator:wikipedia":"es:Banco de Crédito del Perú"},countryCodes:["bo"],terms:[],matchScore:2,suggestion:true},"amenity/bank/BCP (France)":{name:"BCP (France)",icon:"maki-bank",imageURL:"https://graph.facebook.com/MaisMillennium/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q118581",amenity:"bank"},addTags:{amenity:"bank",brand:"BCP","brand:wikidata":"Q118581","brand:wikipedia":"pt:Banco Comercial Português",name:"BCP"},countryCodes:["fr"],terms:["banque bcp","bcp"],matchScore:2,suggestion:true},"amenity/bank/BCP (Luxembourg)":{name:"BCP (Luxembourg)",icon:"maki-bank",imageURL:"https://graph.facebook.com/MaisMillennium/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q118581",amenity:"bank"},addTags:{amenity:"bank",brand:"BCP","brand:wikidata":"Q118581","brand:wikipedia":"pt:Banco Comercial Português",name:"BCP"},countryCodes:["lu"],terms:["banque bcp","bcp"],matchScore:2,suggestion:true},"amenity/bank/BCP (Peru)":{name:"BCP (Peru)",icon:"maki-bank",imageURL:"https://graph.facebook.com/bancodecreditobcp/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4854124",amenity:"bank"},addTags:{amenity:"bank",brand:"BCP","brand:wikidata":"Q4854124","brand:wikipedia":"es:Banco de Crédito del Perú",name:"BCP"},countryCodes:["pe"],terms:["banco de crédito del perú"],matchScore:2,suggestion:true},"amenity/bank/BCR (Banca Comercială Română)":{name:"BCR (Banca Comercială Română)",icon:"maki-bank",imageURL:"https://graph.facebook.com/BCRRomania/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q806149",amenity:"bank"},addTags:{amenity:"bank",brand:"BCR","brand:wikidata":"Q806149","brand:wikipedia":"en:Banca Comercială Română",name:"BCR",official_name:"Banca Comercială Română","official_name:en":"Romanian Commercial Bank","official_name:ro":"Banca Comercială Română"},countryCodes:["ro"],terms:["banca comercială română"],matchScore:2,suggestion:true},"amenity/bank/BCR (Costa Rica)":{name:"BCR (Costa Rica)",icon:"maki-bank",imageURL:"https://graph.facebook.com/BancoBCR/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6951632",amenity:"bank"},addTags:{amenity:"bank",brand:"BCR","brand:wikidata":"Q6951632","brand:wikipedia":"es:Banco de Costa Rica",name:"BCR",official_name:"Banco de Costa Rica","official_name:en":"Bank of Costa Rica","official_name:es":"Banco de Costa Rica"},countryCodes:["cr"],terms:["banco de costa rica"],matchScore:2,suggestion:true},"amenity/bank/BDO":{name:"BDO",icon:"maki-bank",imageURL:"https://graph.facebook.com/BancoBCR/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4854129",amenity:"bank"},addTags:{amenity:"bank",brand:"BDO","brand:wikidata":"Q4854129","brand:wikipedia":"en:Banco de Oro",name:"BDO",official_name:"Banco de Oro","official_name:en":"Gold Bank","official_name:es":"Banco de Oro"},countryCodes:["ph"],terms:[],matchScore:2,suggestion:true},"amenity/bank/BGŻ BNP Paribas":{name:"BGŻ BNP Paribas",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q20744004",amenity:"bank"},addTags:{amenity:"bank",brand:"BGŻ BNP Paribas","brand:wikidata":"Q20744004","brand:wikipedia":"pl:BNP Paribas Bank Polska",name:"BGŻ BNP Paribas",operator:"BNP Paribas","operator:wikidata":"Q499707","operator:wikipedia":"pl:BNP Paribas"},countryCodes:["pl"],terms:[],matchScore:2,suggestion:true},"amenity/bank/BIAT":{name:"BIAT",icon:"maki-bank",imageURL:"https://graph.facebook.com/BanqueInternationaleArabedeTunisie/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q690739",amenity:"bank"},addTags:{amenity:"bank",brand:"BIAT","brand:wikidata":"Q690739","brand:wikipedia":"en:Banque Internationale Arabe de Tunisie",name:"BIAT"},terms:[],matchScore:2,suggestion:true},"amenity/bank/BMCE Bank":{name:"BMCE Bank",icon:"maki-bank",imageURL:"https://graph.facebook.com/bmcebank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2300433",amenity:"bank"},addTags:{amenity:"bank",brand:"BMCE Bank","brand:wikidata":"Q2300433","brand:wikipedia":"ar:البنك المغربي للتجارة الخارجية",name:"BMCE Bank"},terms:["bmce"],matchScore:2,suggestion:true},"amenity/bank/BMCI":{name:"BMCI",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q2883409",amenity:"bank"},addTags:{amenity:"bank",brand:"BMCI","brand:wikidata":"Q2883409","brand:wikipedia":"ar:البنك المغربي للتجارة والصناعة",name:"BMCI",operator:"BNP Paribas","operator:wikidata":"Q499707","operator:wikipedia":"pl:BNP Paribas"},countryCodes:["ma"],terms:["bmci bank"],matchScore:2,suggestion:true},"amenity/bank/BMN":{name:"BMN",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FBMN%20nuevo%20logo.jpg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q3754900",amenity:"bank"},addTags:{amenity:"bank",brand:"BMN","brand:wikidata":"Q3754900","brand:wikipedia":"es:Banco Mare Nostrum",name:"BMN",official_name:"Banco Mare Nostrum"},countryCodes:["es"],terms:[],matchScore:2,suggestion:true},"amenity/bank/BMO":{name:"BMO",icon:"maki-bank",imageURL:"https://graph.facebook.com/BMOcommunity/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q806693",amenity:"bank"},addTags:{amenity:"bank",brand:"BMO","brand:wikidata":"Q806693","brand:wikipedia":"en:Bank of Montreal",name:"BMO",official_name:"Bank of Montreal"},terms:["bmo bank of montreal"],matchScore:2,suggestion:true},"amenity/bank/BMO Harris Bank":{name:"BMO Harris Bank",icon:"maki-bank",imageURL:"https://graph.facebook.com/bmoharrisbank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4835981",amenity:"bank"},addTags:{amenity:"bank",brand:"BMO Harris Bank","brand:wikidata":"Q4835981","brand:wikipedia":"en:BMO Harris Bank",name:"BMO Harris Bank",operator:"Bank of Montreal","operator:wikidata":"Q806693","operator:wikipedia":"en:Bank of Montreal"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/bank/BNA (Algeria)":{name:"BNA (Algeria)",icon:"maki-bank",imageURL:"https://graph.facebook.com/bnalgerie/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2883410",amenity:"bank"},addTags:{amenity:"bank",brand:"BNA","brand:wikidata":"Q2883410","brand:wikipedia":"fr:Banque nationale d'Algérie",name:"BNA",official_name:"Banque nationale d'Algérie","official_name:en":"National Bank of Algeria","official_name:fr":"Banque nationale d'Algérie"},countryCodes:["dz"],terms:[],matchScore:2,suggestion:true},"amenity/bank/BNA (Tunisia)":{name:"BNA (Tunisia)",icon:"maki-bank",imageURL:"https://graph.facebook.com/BanqueNationaleAgricole/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2883413",amenity:"bank"},addTags:{amenity:"bank",brand:"BNA","brand:wikidata":"Q2883413","brand:wikipedia":"fr:Banque nationale agricole",name:"BNA"},countryCodes:["tn"],terms:[],matchScore:2,suggestion:true},"amenity/bank/BNI":{name:"BNI",icon:"maki-bank",imageURL:"https://graph.facebook.com/BNI/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2882611",amenity:"bank"},addTags:{amenity:"bank",brand:"BNI","brand:wikidata":"Q2882611","brand:wikipedia":"id:Bank Negara Indonesia",name:"BNI",official_name:"Bank Negara Indonesia","official_name:en":"State Bank of Indonesia","official_name:id":"Bank Negara Indonesia"},terms:["bank bni"],matchScore:2,suggestion:true},"amenity/bank/BNL":{name:"BNL",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q2201225",amenity:"bank"},addTags:{amenity:"bank",brand:"BNL","brand:wikidata":"Q2201225","brand:wikipedia":"en:Banca Nazionale del Lavoro",name:"BNL",official_name:"Banca Nazionale del Lavoro","official_name:en":"National Labor Bank","official_name:it":"Banca Nazionale del Lavoro",operator:"BNP Paribas","operator:wikidata":"Q499707","operator:wikipedia":"en:BNP Paribas"},countryCodes:["it"],terms:[],matchScore:2,suggestion:true},"amenity/bank/BNP Paribas":{name:"BNP Paribas",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/1129679122182082561/dBPwAfEP_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q499707",amenity:"bank"},addTags:{amenity:"bank",brand:"BNP Paribas","brand:wikidata":"Q499707","brand:wikipedia":"en:BNP Paribas",name:"BNP Paribas"},terms:[],matchScore:2,suggestion:true},"amenity/bank/BNP Paribas Fortis":{name:"BNP Paribas Fortis",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q796827",amenity:"bank"},addTags:{amenity:"bank",brand:"BNP Paribas Fortis","brand:wikidata":"Q796827","brand:wikipedia":"en:BNP Paribas Fortis",name:"BNP Paribas Fortis"},terms:[],matchScore:2,suggestion:true},"amenity/bank/BOC":{name:"BOC",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FChinese%20Bank%20of%20China.jpg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q790068",amenity:"bank"},addTags:{amenity:"bank",brand:"BOC","brand:wikidata":"Q790068","brand:wikipedia":"en:Bank of China",name:"BOC",official_name:"Bank of China"},terms:[],matchScore:2,suggestion:true},"amenity/bank/BPI":{name:"BPI",icon:"maki-bank",imageURL:"https://graph.facebook.com/bpi/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2501256",amenity:"bank"},addTags:{amenity:"bank",brand:"BPI","brand:wikidata":"Q2501256","brand:wikipedia":"en:Bank of the Philippine Islands",name:"BPI",official_name:"Bank of the Philippine Islands"},terms:["bank of the philippine islands","bpi family savings bank"],matchScore:2,suggestion:true},"amenity/bank/BRD":{name:"BRD",icon:"maki-bank",imageURL:"https://graph.facebook.com/BRDGroupeSocieteGenerale/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q796927",amenity:"bank"},addTags:{amenity:"bank",brand:"BRD","brand:wikidata":"Q796927","brand:wikipedia":"ro:BRD - Groupe Société Générale",name:"BRD"},countryCodes:["ro"],terms:[],matchScore:2,suggestion:true},"amenity/bank/BRED":{name:"BRED",icon:"maki-bank",imageURL:"https://graph.facebook.com/BRED.Banque.Populaire/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2877455",amenity:"bank"},addTags:{amenity:"bank",brand:"BRED","brand:wikidata":"Q2877455","brand:wikipedia":"fr:BRED Banque populaire",name:"BRED",official_name:"Banque régionale d'escompte et de dépôts","official_name:en":"Regional Discount and Deposit Bank","official_name:fr":"Banque régionale d'escompte et de dépôts",operator:"Groupe BPCE","operator:en":"BPCE Group","operator:fr":"Groupe BPCE","operator:wikidata":"Q806941","operator:wikipedia":"en:Groupe BPCE"},terms:[],matchScore:2,suggestion:true},"amenity/bank/BRI":{name:"BRI",icon:"maki-bank",imageURL:"https://graph.facebook.com/BRIofficialpage/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q623042",amenity:"bank"},addTags:{amenity:"bank",brand:"BRI","brand:wikidata":"Q623042","brand:wikipedia":"id:Bank Rakyat Indonesia",name:"BRI",official_name:"Bank Rakyat Indonesia","official_name:en":"People's Bank of Indonesia","official_name:id":"Bank Rakyat Indonesia"},countryCodes:["id"],terms:["bank bri"],matchScore:2,suggestion:true},"amenity/bank/BTN":{name:"BTN",icon:"maki-bank",imageURL:"https://graph.facebook.com/www.btn.co.id/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q12474534",amenity:"bank"},addTags:{amenity:"bank",brand:"BTN","brand:en":"BTN","brand:id":"BTN","brand:wikidata":"Q12474534","brand:wikipedia":"id:Bank Tabungan Negara",name:"BTN","name:en":"BTN","name:id":"BTN",official_name:"Bank Tabungan Negara","official_name:en":"State Savings Bank","official_name:id":"Bank Tabungan Negara"},countryCodes:["id"],terms:[],matchScore:2,suggestion:true},"amenity/bank/BW-Bank":{name:"BW-Bank",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FBaden-W%C3%BCrttembergische%20Bank%20text%20logo%20black.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q798891",amenity:"bank"},addTags:{amenity:"bank",brand:"BW-Bank","brand:ed":"BW-Bank","brand:en":"BW-Bank","brand:wikidata":"Q798891","brand:wikipedia":"de:Baden-Württembergische Bank",name:"BW-Bank","name:de":"BW-Bank","name:en":"BW-Bank",operator:"Landesbank Baden-Württemberg","operator:de":"Landesbank Baden-Württemberg","operator:en":"Baden-Württemberg Regional Bank","operator:wikidata":"Q451814","operator:wikipedia":"en:Landesbank Baden-Württemberg"},countryCodes:["de"],terms:["baden-württembergische bank"],matchScore:2,suggestion:true},"amenity/bank/Banamex":{name:"Banamex",icon:"maki-bank",imageURL:"https://graph.facebook.com/Citibanamex/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q749474",amenity:"bank"},addTags:{amenity:"bank",brand:"Banamex","brand:wikidata":"Q749474","brand:wikipedia":"en:Grupo Financiero Banamex",name:"Banamex",official_name:"Grupo Financiero Banamex","official_name:en":"Banamex Financial Group","official_name:es":"Grupo Financiero Banamex",operator:"Citigroup","operator:wikidata":"Q219508","operator:wikipedia":"en:Citigroup"},countryCodes:["mx"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Banca Intesa":{name:"Banca Intesa",icon:"maki-bank",imageURL:"https://graph.facebook.com/bancaintesa.rs/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q647092",amenity:"bank"},addTags:{amenity:"bank",brand:"Banca Intesa","brand:wikidata":"Q647092","brand:wikipedia":"en:Banca Intesa",name:"Banca Intesa","name:en":"Intesa Bank","name:it":"Banca Intesa",operator:"Intesa Sanpaolo","operator:en":"Intesa St. Paul","operator:it":"Intesa Sanpaolo","operator:wikidata":"Q1343118","operator:wikipedia":"en:Intesa Sanpaolo"},countryCodes:["it","rs"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Banca March":{name:"Banca March",icon:"maki-bank",imageURL:"https://graph.facebook.com/bancamarch/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q578252",amenity:"bank"},addTags:{amenity:"bank",brand:"Banca March","brand:wikidata":"Q578252","brand:wikipedia":"en:Banca March",name:"Banca March"},countryCodes:["es"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Banca Popolare di Milano":{name:"Banca Popolare di Milano",icon:"maki-bank",imageURL:"https://graph.facebook.com/BancoBPM/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q806154",amenity:"bank"},addTags:{amenity:"bank",brand:"Banca Popolare di Milano","brand:en":"Popular Bank of Milan","brand:it":"Banca Popolare di Milano","brand:wikidata":"Q806154","brand:wikipedia":"en:Banca Popolare di Milano",name:"Banca Popolare di Milano","name:en":"Popular Bank of Milan","name:it":"Banca Popolare di Milano",operator:"Banco BPM","operator:en":"BPM Bank","operator:it":"Banco BPM","operator:wikidata":"Q27331643","operator:wikipedia":"en:Banco BPM"},countryCodes:["it"],terms:["bpm"],matchScore:2,suggestion:true},"amenity/bank/Banca Popolare di Novara":{name:"Banca Popolare di Novara",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q3633742",amenity:"bank"},addTags:{amenity:"bank",brand:"Banca Popolare di Novara","brand:en":"Popular Bank of Novara","brand:it":"Banca Popolare di Novara","brand:wikidata":"Q3633742","brand:wikipedia":"en:Banca Popolare di Novara",name:"Banca Popolare di Novara","name:en":"Popular Bank of Novara","name:it":"Banca Popolare di Novara",operator:"Banco BPM","operator:en":"BPM Bank","operator:it":"Banco BPM","operator:wikidata":"Q27331643","operator:wikipedia":"en:Banco BPM"},countryCodes:["it"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Banca Popolare di Sondrio":{name:"Banca Popolare di Sondrio",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q686176",amenity:"bank"},addTags:{amenity:"bank",brand:"Banca Popolare di Sondrio","brand:en":"Popular Bank of Sandrio","brand:it":"Banca Popolare di Sondrio","brand:wikidata":"Q686176","brand:wikipedia":"en:Banca Popolare di Sondrio",name:"Banca Popolare di Sondrio","name:en":"Popular Bank of Sandrio","name:it":"Banca Popolare di Sondrio"},countryCodes:["it"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Banca Popolare di Verona":{name:"Banca Popolare di Verona",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q3167468",amenity:"bank"},addTags:{amenity:"bank",brand:"Banca Popolare di Verona","brand:en":"Popular Bank of Verona","brand:it":"Banca Popolare di Verona","brand:wikidata":"Q3167468","brand:wikipedia":"en:Banca Popolare di Verona",name:"Banca Popolare di Verona","name:en":"Popular Bank of Verona","name:it":"Banca Popolare di Verona",operator:"Banco Popolare","operator:en":"Popular Bank","operator:it":"Banco Popolare","operator:wikidata":"Q806194","operator:wikipedia":"en:Banco Popolare"},countryCodes:["it"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Banca Popolare di Vicenza":{name:"Banca Popolare di Vicenza",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q3127200",amenity:"bank"},addTags:{amenity:"bank",brand:"Banca Popolare di Vicenza","brand:en":"Popular Bank of Vicenza","brand:it":"Banca Popolare di Vicenza","brand:wikidata":"Q3127200","brand:wikipedia":"en:Banca Popolare di Vicenza",name:"Banca Popolare di Vicenza","name:en":"Popular Bank of Vicena","name:it":"Banca Popolare di Vicenza",operator:"Atlante","operator:en":"Atlas","operator:it":"Atlante","operator:wikidata":"Q25206459","operator:wikipedia":"en:Atlante (private equity fund)"},countryCodes:["it"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Banca Românească":{name:"Banca Românească",icon:"maki-bank",imageURL:"https://graph.facebook.com/BancaRomaneascaOficial/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4854052",amenity:"bank"},addTags:{amenity:"bank",brand:"Banca Românească","brand:en":"Romanian Bank","brand:ro":"Banca Românească","brand:wikidata":"Q4854052","brand:wikipedia":"ro:Banca Românească",name:"Banca Românească","name:en":"Popular Bank of Vicena","name:ro":"Banca Românească",operator:"National Bank of Greece","operator:wikidata":"Q1816028","operator:wikipedia":"en:National Bank of Greece"},countryCodes:["ro"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Banca Sella":{name:"Banca Sella",icon:"maki-bank",imageURL:"https://graph.facebook.com/bancasella/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3633749",amenity:"bank"},addTags:{amenity:"bank",brand:"Banca Sella","brand:en":"Sella Bank","brand:it":"Banca Sella","brand:wikidata":"Q3633749","brand:wikipedia":"en:Banca Sella Group",name:"Banca Sella","name:en":"Sella Bank","name:it":"Banca Sella"},countryCodes:["it"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Banca Transilvania":{name:"Banca Transilvania",icon:"maki-bank",imageURL:"https://graph.facebook.com/BancaTransilvania/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q806161",amenity:"bank"},addTags:{amenity:"bank",brand:"Banca Transilvania","brand:en":"Transilvania Bank","brand:ro":"Banca Transilvania","brand:wikidata":"Q806161","brand:wikipedia":"en:Banca Transilvania",name:"Banca Transilvania","name:en":"Transilvania Bank","name:ro":"Banca Transilvania"},countryCodes:["ro"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Bancaribe":{name:"Bancaribe",icon:"maki-bank",imageURL:"https://graph.facebook.com/Bancaribe/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5717827",amenity:"bank"},addTags:{amenity:"bank",brand:"Bancaribe","brand:wikidata":"Q5717827","brand:wikipedia":"en:Bancaribe",name:"Bancaribe"},countryCodes:["ve"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Banco AV Villas":{name:"Banco AV Villas",icon:"maki-bank",imageURL:"https://graph.facebook.com/AVVillas/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4854068",amenity:"bank"},addTags:{amenity:"bank",brand:"Banco AV Villas","brand:en":"Bank of Villas","brand:es":"Banco AV Villas","brand:wikidata":"Q4854068","brand:wikipedia":"en:Banco AV Villas",name:"Banco AV Villas","name:en":"Bank of Villas","name:es":"Banco AV Villas",operator:"Grupo Aval","operator:en":"Aval Group","operator:pt":"Grupo Aval","operator:wikidata":"Q2053387","operator:wikipedia":"en:Grupo Aval"},countryCodes:["co"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Banco Agrario":{name:"Banco Agrario",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FBanco%20Agrario%20de%20Colombia%20logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q20013358",amenity:"bank"},addTags:{amenity:"bank",brand:"Banco Agrario","brand:en":"Agrarian Bank","brand:wikidata":"Q20013358","brand:wikipedia":"es:Banco Agrario de Colombia",name:"Banco Agrario","name:en":"Agrarian Bank","name:es":"Banco Agrario",official_name:"Banco Agrario de Colombia","official_name:en":"Agrarian Bank of Colombia","official_name:es":"Banco Agrario de Colombia"},countryCodes:["co"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Banco Agrario de Colombia":{name:"Banco Agrario de Colombia",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FBanco%20Agrario%20de%20Colombia%20logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q20013358",amenity:"bank"},addTags:{amenity:"bank",brand:"Banco Agrario de Colombia","brand:wikidata":"Q20013358","brand:wikipedia":"en:Banco Agrario de Colombia",name:"Banco Agrario de Colombia"},countryCodes:["co"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Banco Azteca":{name:"Banco Azteca",icon:"maki-bank",imageURL:"https://graph.facebook.com/BancoAzteca/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4854076",amenity:"bank"},addTags:{amenity:"bank",brand:"Banco Azteca","brand:en":"Aztec Bank","brand:es":"Banco Azteca","brand:wikidata":"Q4854076","brand:wikipedia":"en:Banco Azteca",name:"Banco Azteca","name:en":"Aztec Bank","name:es":"Banco Azteca",operator:"Grupo Elektra","operator:en":"Elektra Group","operator:es":"Grupo Elektra","operator:wikidata":"Q1142753","operator:wikipedia":"en:Grupo Elektra"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Banco BPM":{name:"Banco BPM",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q27331643",amenity:"bank"},addTags:{amenity:"bank",brand:"Banco BPM","brand:wikidata":"Q27331643","brand:wikipedia":"en:Banco BPM",name:"Banco BPM"},countryCodes:["it"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Banco Caja Social":{name:"Banco Caja Social",icon:"maki-bank",imageURL:"https://graph.facebook.com/BancoCajaSocial/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5717869",amenity:"bank"},addTags:{amenity:"bank",brand:"Banco Caja Social","brand:en":"Social Housing Bank","brand:es":"Banco Caja Social","brand:wikidata":"Q5717869","brand:wikipedia":"es:Banco Caja Social",name:"Banco Caja Social","name:en":"Social Housing Bank","name:es":"Banco Caja Social"},countryCodes:["co"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Banco Ciudad":{name:"Banco Ciudad",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q4856204",amenity:"bank"},addTags:{amenity:"bank",brand:"Banco Ciudad","brand:en":"City Bank","brand:es":"Banco Ciudad","brand:wikidata":"Q4856204","brand:wikipedia":"en:Bank of the City of Buenos Aires",name:"Banco Ciudad","name:en":"City Bank","name:es":"Banco Ciudad",official_name:"Banco Ciudad de Buenos Aires","official_name:en":"Bank of the City of Buenos Aires","official_name:es":"Banco Ciudad de Buenos Aires"},countryCodes:["ar"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Banco Continental (Paraguay)":{name:"Banco Continental (Paraguay)",icon:"maki-bank",imageURL:"https://graph.facebook.com/bcontinentalpy/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62054564",amenity:"bank"},addTags:{amenity:"bank",brand:"Banco Continental","brand:wikidata":"Q62054564",name:"Banco Continental"},countryCodes:["py"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Banco Continental (Peru)":{name:"Banco Continental (Peru)",icon:"maki-bank",imageURL:"https://graph.facebook.com/BBVAContinental/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4835089",amenity:"bank"},addTags:{amenity:"bank",brand:"Banco Continental","brand:en":"Continental Bank","brand:es":"Banco Continental","brand:wikidata":"Q4835089","brand:wikipedia":"en:BBVA Continental",name:"Banco Continental","name:en":"Continental Bank","name:es":"Banco Continental"},countryCodes:["pe"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Banco Estado":{name:"Banco Estado",icon:"maki-bank",imageURL:"https://graph.facebook.com/BancoEstado/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5718188",amenity:"bank"},addTags:{amenity:"bank",brand:"Banco Estado","brand:en":"State Bank","brand:es":"Banco Estado","brand:wikidata":"Q5718188","brand:wikipedia":"es:Banco del Estado de Chile",name:"Banco Estado","name:en":"State Bank","name:es":"Banco Estado",official_name:"Banco del Estado de Chile","official_name:en":"Bank of the State of Chile","official_name:es":"Banco del Estado de Chile"},countryCodes:["cl"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Banco Falabella":{name:"Banco Falabella",icon:"maki-bank",imageURL:"https://graph.facebook.com/bancofalabella/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4854088",amenity:"bank"},addTags:{amenity:"bank",brand:"Banco Falabella","brand:en":"Falabella Bank","brand:es":"Banco Falabella","brand:wikidata":"Q4854088","brand:wikipedia":"en:Banco Falabella",name:"Banco Falabella","name:en":"Falabella Bank","name:es":"Banco Falabella",operator:"Falabella","operator:es":"Falabella","operator:wikidata":"Q1374824","operator:wikipedia":"en:S.A.C.I. Falabella"},countryCodes:["cl","co","pe"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Banco Fassil":{name:"Banco Fassil",icon:"maki-bank",imageURL:"https://graph.facebook.com/bancofassil/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62118592",amenity:"bank"},addTags:{amenity:"bank",brand:"Banco Fassil","brand:en":"Fassil Bank","brand:es":"Banco Fassil","brand:wikidata":"Q62118592",name:"Banco Fassil","name:en":"Fassil Bank","name:es":"Banco Fassil"},countryCodes:["bo"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Banco G&T Continental":{name:"Banco G&T Continental",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/1086265271898202112/jhjR8vK2_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q5717949",amenity:"bank"},addTags:{amenity:"bank",brand:"Banco G&T Continental","brand:en":"G&T Continental Bank","brand:es":"Banco G&T Continental","brand:wikidata":"Q5717949","brand:wikipedia":"es:Banco GYT Continental, S.A.",name:"Banco G&T Continental","name:en":"G&T Continental Bank"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Banco General":{name:"Banco General",icon:"maki-bank",imageURL:"https://graph.facebook.com/bancogeneral/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q27618271",amenity:"bank"},addTags:{amenity:"bank",brand:"BW-Bank","brand:en":"BW-Bank","brand:es":"BW-Bank","brand:wikidata":"Q27618271","brand:wikipedia":"es:Banco General (Panamá)",name:"Banco General","name:en":"General Bank","name:es":"Banco General"},countryCodes:["cr","pa"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Banco Industrial":{name:"Banco Industrial",icon:"maki-bank",imageURL:"https://graph.facebook.com/bindARG/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q16489444",amenity:"bank"},addTags:{amenity:"bank",brand:"Banco Industrial","brand:en":"Industrial Bank","brand:es":"Banco Industrial","brand:wikidata":"Q16489444","brand:wikipedia":"es:Banco Industrial",name:"Banco Industrial","name:en":"Industrial Bank","name:es":"Banco Industrial",operator:"BIND Group"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Banco Internacional (Chile)":{name:"Banco Internacional (Chile)",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/438324350148571136/fCNvpo-F_bigger.png",geometry:["point","area"],tags:{"brand:wikidata":"Q56605586",amenity:"bank"},addTags:{amenity:"bank",brand:"Banco Internacional","brand:en":"International Bank","brand:es":"Banco Internacional","brand:wikidata":"Q56605586","brand:wikipedia":"es:Banco Internacional (Chile)",name:"Banco Internacional","name:en":"International Bank","name:es":"Banco Internacional"},countryCodes:["cl"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Banco Internacional (Ecuador)":{name:"Banco Internacional (Ecuador)",icon:"maki-bank",imageURL:"https://graph.facebook.com/BancoInternacionalEcuador/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q806187",amenity:"bank"},addTags:{amenity:"bank",brand:"Banco Internacional","brand:en":"International Bank","brand:es":"Banco Internacional","brand:wikidata":"Q806187","brand:wikipedia":"es:Banco Internacional",name:"Banco Internacional","name:en":"International Bank","name:es":"Banco Internacional"},countryCodes:["ec"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Banco Metropolitano":{name:"Banco Metropolitano",icon:"maki-bank",imageURL:"https://graph.facebook.com/BanmetCuba/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62118612",amenity:"bank"},addTags:{amenity:"bank",brand:"Banco Metropolitano","brand:en":"Metroplitan Bank","brand:es":"Banco Metropolitano","brand:wikidata":"Q62118612",name:"Banco Metropolitano","name:en":"Metropolitan Bank","name:es":"Banco Metropolitano"},countryCodes:["cu"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Banco Nacional":{name:"Banco Nacional",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q4854104",amenity:"bank"},addTags:{amenity:"bank",brand:"Banco Nacional","brand:en":"National Bank","brand:es":"Banco Nacional","brand:wikidata":"Q4854104","brand:wikipedia":"en:Banco Nacional",name:"Banco Nacional","name:en":"National Bank","name:es":"Banco Nacional"},countryCodes:["br"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Banco Nación":{name:"Banco Nación",icon:"maki-bank",imageURL:"https://graph.facebook.com/banconacion/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2883376",amenity:"bank"},addTags:{amenity:"bank",brand:"Banco Nación","brand:en":"Nation Bank","brand:es":"Nation Bank","brand:wikidata":"Q2883376","brand:wikipedia":"en:Banco de la Nación Argentina",name:"Banco Nación","name:en":"Nation Bank","name:es":"Banco Nación",official_name:"Banco de la Nación Argentina","official_name:en":"Bank of the Argentine Nation","official_name:es":"Banco de la Nación Argentina"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Banco Pastor":{name:"Banco Pastor",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FLogo%20pastor168x78.gif%3Bpv91c0cc0e0080a771.gif&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q806193",amenity:"bank"},addTags:{amenity:"bank",brand:"Banco Pastor","brand:en":"Shepherd Bank","brand:es":"Banco Pastor","brand:wikidata":"Q806193","brand:wikipedia":"en:Banco Pastor",name:"Banco Pastor","name:en":"Shepherd Bank","name:es":"Banco Pastor",official_name:"Banco Popular Pastor","official_name:en":"Popular Shepherd Bank","official_name:es":"Banco Popular Pastor",operator:"Popular, Inc.","operator:wikidata":"Q7229656","operator:wikipedia":"en:Popular, Inc."},countryCodes:["es"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Banco Pichincha":{name:"Banco Pichincha",icon:"maki-bank",imageURL:"https://graph.facebook.com/BancoPichinchaEcuador/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4854135",amenity:"bank"},addTags:{amenity:"bank",brand:"Banco Pichincha","brand:en":"Pichincha Bank","brand:es":"Banco Pichincha","brand:wikidata":"Q4854135","brand:wikipedia":"en:Banco Pichincha",name:"Banco Pichincha","name:en":"Pichincha Bank","name:es":"Banco Pichincha",operator:"Grupo Pichincha","operator:wikidata":"Q6440687","operator:wikipedia":"es:Grupo Pichincha"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Banco Popular":{name:"Banco Popular",icon:"maki-bank",imageURL:"https://graph.facebook.com/grupobancopopular/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q537259",amenity:"bank"},addTags:{amenity:"bank",brand:"Banco Popular","brand:en":"Popular Bank","brand:es":"Banco Popular","brand:wikidata":"Q537259","brand:wikipedia":"es:Banco Popular Español",name:"Banco Popular","name:en":"Popular Bank","name:es":"Banco Popular",official_name:"Banco Popular Español","official_name:en":"Spanish Popular Bank","official_name:es":"Banco Popular Español",operator:"Banco Santander","operator:wikidata":"Q806215","operator:wikipedia":"en:Banco Santander"},countryCodes:["pr","us","vi"],terms:["popular"],matchScore:2,suggestion:true},"amenity/bank/Banco Popular de Ahorro":{name:"Banco Popular de Ahorro",icon:"maki-bank",imageURL:"https://graph.facebook.com/bpa.cu/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62118626",amenity:"bank"},addTags:{amenity:"bank",brand:"Banco Popular de Ahorro","brand:en":"Popular Saving Bank","brand:es":"Banco Popular de Ahorro","brand:wikidata":"Q62118626",name:"Banco Popular de Ahorro","name:en":"Popular Saving Bank","name:es":"Banco Popular de Ahorro"},countryCodes:["cu"],terms:["bpa"],matchScore:2,suggestion:true},"amenity/bank/Banco Provincia":{name:"Banco Provincia",icon:"maki-bank",imageURL:"https://graph.facebook.com/bancoprovincia/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4856209",amenity:"bank"},addTags:{amenity:"bank",brand:"Banco Provincia","brand:en":"Province Bank","brand:es":"Banco Provincia","brand:wikidata":"Q4856209","brand:wikipedia":"es:Banco de la Provincia de Buenos Aires",name:"Banco Provincia","name:en":"Province Bank","name:es":"Banco Provincia",official_name:"Banco de la Provincia de Buenos Aires","official_name:en":"Bank of the Province of Buenos Aires","official_name:es":"Banco de la Provincia de Buenos Aires"},countryCodes:["ar"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Banco Sabadell":{name:"Banco Sabadell",icon:"maki-bank",imageURL:"https://graph.facebook.com/bancosabadell/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q762330",amenity:"bank"},addTags:{amenity:"bank",brand:"Banco Sabadell","brand:en":"Sabadell Bank","brand:es":"Banco Sabadell","brand:wikidata":"Q762330","brand:wikipedia":"es:Banco Sabadell",name:"Banco Sabadell","name:en":"Sabadell Bank","name:es":"Banco Sabadell"},countryCodes:["es"],terms:["banc sabadell","sabadell"],matchScore:2,suggestion:true},"amenity/bank/Banco Santa Fe":{name:"Banco Santa Fe",icon:"maki-bank",imageURL:"https://graph.facebook.com/BancoSantaFe/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6046871",amenity:"bank"},addTags:{amenity:"bank",brand:"Banco Santa Fe","brand:en":"Santa Fe Bank","brand:es":"Banco Santa Fe","brand:wikidata":"Q6046871","brand:wikipedia":"es:Nuevo Banco de Santa Fe",name:"Banco Santa Fe","name:en":"Santa Fe Bank","name:es":"Banco Santa Fe",official_name:"Nuevo Banco de Santa Fe","official_name:en":"New Bank of Santa Fe","official_name:es":"Nuevo Banco de Santa Fe"},countryCodes:["ar"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Banco Santander":{name:"Banco Santander",icon:"maki-bank",imageURL:"https://graph.facebook.com/bancosantander/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6496310",amenity:"bank"},addTags:{amenity:"bank",brand:"Banco Santander","brand:en":"Santander Bank","brand:es":"Banco Santander","brand:wikidata":"Q6496310","brand:wikipedia":"es:Banco Santander",name:"Banco Santander","name:en":"Santander Bank","name:es":"Banco Santander"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Banco Sol (Angola)":{name:"Banco Sol (Angola)",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q62118744",amenity:"bank"},addTags:{amenity:"bank",brand:"Banco Sol","brand:pt":"Banco Sol","brand:wikidata":"Q62118744",name:"Banco Sol","name:pt":"Banco Sol"},countryCodes:["ao"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Banco Sol (Bolivia)":{name:"Banco Sol (Bolivia)",icon:"maki-bank",imageURL:"https://graph.facebook.com/BancoSolidarioBolivia/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62118746",amenity:"bank"},addTags:{amenity:"bank",brand:"Banco Sol","brand:pt":"Banco Sol","brand:wikidata":"Q62118746",name:"Banco Sol","name:pt":"Banco Sol"},countryCodes:["bo"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Banco de Bogotá":{name:"Banco de Bogotá",icon:"maki-bank",imageURL:"https://graph.facebook.com/BancodeBogota/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4854122",amenity:"bank"},addTags:{amenity:"bank",brand:"Banco de Bogotá","brand:wikidata":"Q4854122","brand:wikipedia":"es:Banco de Bogotá",name:"Banco de Bogotá"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Banco de Chile":{name:"Banco de Chile",icon:"maki-bank",imageURL:"https://graph.facebook.com/bancochile.cl/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2882085",amenity:"bank"},addTags:{amenity:"bank",brand:"Banco de Chile","brand:wikidata":"Q2882085","brand:wikipedia":"es:Banco de Chile",name:"Banco de Chile"},countryCodes:["cl"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Banco de Desarrollo Banrural":{name:"Banco de Desarrollo Banrural",icon:"maki-bank",imageURL:"https://graph.facebook.com/grupofinancierobanrural/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5719130",amenity:"bank"},addTags:{amenity:"bank",brand:"Banco de Desarrollo Banrural","brand:wikidata":"Q5719130","brand:wikipedia":"es:Banrural",name:"Banco de Desarrollo Banrural"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Banco de Fomento Angola (BFA)":{name:"Banco de Fomento Angola (BFA)",icon:"maki-bank",imageURL:"https://graph.facebook.com/Banco.BFA/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q806197",amenity:"bank"},addTags:{amenity:"bank",brand:"Banco de Fomento Angola (BFA)","brand:wikidata":"Q806197","brand:wikipedia":"de:Banco de Fomento Angola",name:"Banco de Fomento Angola (BFA)"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Banco de Occidente":{name:"Banco de Occidente",icon:"maki-bank",imageURL:"https://graph.facebook.com/BcoOccidente/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4854127",amenity:"bank"},addTags:{amenity:"bank",brand:"Banco de Occidente","brand:wikidata":"Q4854127","brand:wikipedia":"es:Banco de Occidente (Colombia)",name:"Banco de Occidente"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Banco de Venezuela":{name:"Banco de Venezuela",icon:"maki-bank",imageURL:"https://graph.facebook.com/BancodeVenezuelaOficial/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q517093",amenity:"bank"},addTags:{amenity:"bank",brand:"Banco de Venezuela","brand:wikidata":"Q517093","brand:wikipedia":"es:Banco de Venezuela",name:"Banco de Venezuela"},terms:["de venezuela"],matchScore:2,suggestion:true},"amenity/bank/Banco de la Nación (Argentina)":{name:"Banco de la Nación (Argentina)",icon:"maki-bank",imageURL:"https://graph.facebook.com/banconacion/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2883376",amenity:"bank"},addTags:{amenity:"bank",brand:"Banco de la Nación","brand:wikidata":"Q2883376","brand:wikipedia":"en:Banco de la Nación Argentina",name:"Banco de la Nación"},countryCodes:["ar"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Banco de la Nación (Peru)":{name:"Banco de la Nación (Peru)",icon:"maki-bank",imageURL:"https://graph.facebook.com/BancodelaNacion/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4856206",amenity:"bank"},addTags:{amenity:"bank",brand:"Banco de la Nación","brand:wikidata":"Q4856206","brand:wikipedia":"en:Bank of the Nation (Peru)",name:"Banco de la Nación"},countryCodes:["pe"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Banco del Austro":{name:"Banco del Austro",icon:"maki-bank",imageURL:"https://graph.facebook.com/bancodelaustro/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62122344",amenity:"bank"},addTags:{amenity:"bank",brand:"Banco del Austro","brand:wikidata":"Q62122344",name:"Banco del Austro"},countryCodes:["ec"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Banco di Napoli":{name:"Banco di Napoli",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q3633835",amenity:"bank"},addTags:{amenity:"bank",brand:"Banco di Napoli","brand:wikidata":"Q3633835","brand:wikipedia":"en:Banco di Napoli",name:"Banco di Napoli"},countryCodes:["it"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Banco di Sardegna":{name:"Banco di Sardegna",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q806205",amenity:"bank"},addTags:{amenity:"bank",brand:"Banco di Sardegna","brand:wikidata":"Q806205","brand:wikipedia":"en:Banco di Sardegna",name:"Banco di Sardegna"},countryCodes:["it"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Banco do Brasil":{name:"Banco do Brasil",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FBanco%20do%20Brasil%20logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q610817",amenity:"bank"},addTags:{amenity:"bank",brand:"Banco do Brasil","brand:wikidata":"Q610817","brand:wikipedia":"en:Banco do Brasil",name:"Banco do Brasil"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Banco do Nordeste":{name:"Banco do Nordeste",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FLogo%20BNB%20(1).svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q4854137",amenity:"bank"},addTags:{amenity:"bank",brand:"Banco do Nordeste","brand:wikidata":"Q4854137","brand:wikipedia":"en:Banco do Nordeste",name:"Banco do Nordeste"},countryCodes:["br"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Bancolombia":{name:"Bancolombia",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FBancolombia%20logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q806206",amenity:"bank"},addTags:{amenity:"bank",brand:"Bancolombia","brand:wikidata":"Q806206","brand:wikipedia":"en:Bancolombia",name:"Bancolombia"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Bancomer":{name:"Bancomer",icon:"maki-bank",imageURL:"https://graph.facebook.com/BBVABancomer/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2876794",amenity:"bank"},addTags:{amenity:"bank",brand:"Bancomer","brand:wikidata":"Q2876794","brand:wikipedia":"en:BBVA Bancomer",name:"Bancomer"},countryCodes:["mx"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Bancpost":{name:"Bancpost",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q4854143",amenity:"bank"},addTags:{amenity:"bank",brand:"Bancpost","brand:wikidata":"Q4854143","brand:wikipedia":"ro:Bancpost",name:"Bancpost"},countryCodes:["ro"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Banesco":{name:"Banesco",icon:"maki-bank",imageURL:"https://graph.facebook.com/BanescoBancoUniversal/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4854841",amenity:"bank"},addTags:{amenity:"bank",brand:"Banesco","brand:wikidata":"Q4854841","brand:wikipedia":"en:Banesco",name:"Banesco"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Bangkok Bank":{name:"Bangkok Bank",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FLogo%20Bangkok%20Bank%20Public%20Company%20Limited.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q806483",amenity:"bank"},addTags:{amenity:"bank",brand:"Bangkok Bank","brand:wikidata":"Q806483","brand:wikipedia":"en:Bangkok Bank",name:"Bangkok Bank"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Bank Al Habib":{name:"Bank Al Habib",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FBankalhabiblogo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q4034833",amenity:"bank"},addTags:{amenity:"bank",brand:"Bank Al Habib","brand:wikidata":"Q4034833","brand:wikipedia":"ur:بينک الحبيب لمیٹڈ",name:"Bank Al Habib"},countryCodes:["pk"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Bank Alfalah":{name:"Bank Alfalah",icon:"maki-bank",imageURL:"https://graph.facebook.com/BankAlfalahOfficial/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4855895",amenity:"bank"},addTags:{amenity:"bank",brand:"Bank Alfalah","brand:wikidata":"Q4855895","brand:wikipedia":"en:Bank Alfalah",name:"Bank Alfalah"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Bank Austria":{name:"Bank Austria",icon:"maki-bank",imageURL:"https://graph.facebook.com/BankAustria/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q697619",amenity:"bank"},addTags:{amenity:"bank",brand:"Bank Austria","brand:wikidata":"Q697619","brand:wikipedia":"en:Bank Austria",name:"Bank Austria"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Bank Danamon":{name:"Bank Danamon",icon:"maki-bank",imageURL:"https://graph.facebook.com/DanamonIndonesia/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4855913",amenity:"bank"},addTags:{amenity:"bank",brand:"Bank Danamon","brand:wikidata":"Q4855913","brand:wikipedia":"en:Bank Danamon",name:"Bank Danamon"},countryCodes:["id"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Bank Mandiri":{name:"Bank Mandiri",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FBank%20Mandiri%20(1998-2008).svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q806639",amenity:"bank"},addTags:{amenity:"bank",brand:"Bank Mandiri","brand:wikidata":"Q806639","brand:wikipedia":"en:Bank Mandiri",name:"Bank Mandiri"},countryCodes:["id"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Bank Mandiri Syariah":{name:"Bank Mandiri Syariah",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q12474533",amenity:"bank"},addTags:{amenity:"bank",brand:"Bank Mandiri Syariah","brand:wikidata":"Q12474533","brand:wikipedia":"id:Bank Syariah Mandiri",name:"Bank Mandiri Syariah"},countryCodes:["id"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Bank Mega":{name:"Bank Mega",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q12474504",amenity:"bank"},addTags:{amenity:"bank",brand:"Bank Mega","brand:wikidata":"Q12474504","brand:wikipedia":"id:Bank Mega",name:"Bank Mega"},countryCodes:["id"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Bank Muamalat":{name:"Bank Muamalat",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q4855949",amenity:"bank"},addTags:{amenity:"bank",brand:"Bank Muamalat","brand:wikidata":"Q4855949","brand:wikipedia":"en:Bank Muamalat",name:"Bank Muamalat"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Bank Pekao":{name:"Bank Pekao",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FBank%20Pekao%20SA%20Logo%20(2017).svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q806642",amenity:"bank"},addTags:{amenity:"bank",brand:"Bank Pekao","brand:wikidata":"Q806642","brand:wikipedia":"pl:Bank Polska Kasa Opieki",name:"Bank Pekao"},countryCodes:["pl"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Bank Rakyat":{name:"Bank Rakyat",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q4855964",amenity:"bank"},addTags:{amenity:"bank",brand:"Bank Rakyat","brand:wikidata":"Q4855964","brand:wikipedia":"ms:Bank Rakyat",name:"Bank Rakyat"},countryCodes:["my"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Bank of Africa":{name:"Bank of Africa",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q2882627",amenity:"bank"},addTags:{amenity:"bank",brand:"Bank of Africa","brand:wikidata":"Q2882627","brand:wikipedia":"en:Bank of Africa Group",name:"Bank of Africa",short_name:"BOA"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Bank of America":{name:"Bank of America",icon:"maki-bank",imageURL:"https://graph.facebook.com/BankofAmerica/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q487907",amenity:"bank"},addTags:{amenity:"bank",brand:"Bank of America","brand:wikidata":"Q487907","brand:wikipedia":"en:Bank of America",name:"Bank of America"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Bank of Baroda":{name:"Bank of Baroda",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q2003797",amenity:"bank"},addTags:{amenity:"bank",brand:"Bank of Baroda","brand:wikidata":"Q2003797","brand:wikipedia":"en:Bank of Baroda",name:"Bank of Baroda"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Bank of Ceylon":{name:"Bank of Ceylon",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q2882652",amenity:"bank"},addTags:{amenity:"bank",brand:"Bank of Ceylon","brand:wikidata":"Q2882652","brand:wikipedia":"en:Bank of Ceylon",name:"Bank of Ceylon"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Bank of China":{name:"Bank of China",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FChinese%20Bank%20of%20China.jpg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q790068",amenity:"bank"},addTags:{amenity:"bank",brand:"Bank of China","brand:wikidata":"Q790068","brand:wikipedia":"en:Bank of China",name:"Bank of China"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Bank of Commerce":{name:"Bank of Commerce",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q4856092",amenity:"bank"},addTags:{amenity:"bank",brand:"Bank of Commerce","brand:wikidata":"Q4856092","brand:wikipedia":"en:Bank of Commerce",name:"Bank of Commerce"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Bank of Cyprus":{name:"Bank of Cyprus",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q806678",amenity:"bank"},addTags:{amenity:"bank",brand:"Bank of Cyprus","brand:wikidata":"Q806678","brand:wikipedia":"en:Bank of Cyprus",name:"Bank of Cyprus"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Bank of India":{name:"Bank of India",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q2004439",amenity:"bank"},addTags:{amenity:"bank",brand:"Bank of India","brand:wikidata":"Q2004439","brand:wikipedia":"en:Bank of India",name:"Bank of India"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Bank of Ireland":{name:"Bank of Ireland",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FBank-of-Ireland-Logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q806689",amenity:"bank"},addTags:{amenity:"bank",brand:"Bank of Ireland","brand:wikidata":"Q806689","brand:wikipedia":"en:Bank of Ireland",name:"Bank of Ireland"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Bank of Maharashtra":{name:"Bank of Maharashtra",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q2004304",amenity:"bank"},addTags:{amenity:"bank",brand:"Bank of Maharashtra","brand:wikidata":"Q2004304","brand:wikipedia":"en:Bank of Maharashtra",name:"Bank of Maharashtra"},countryCodes:["in"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Bank of Montreal":{name:"Bank of Montreal",icon:"maki-bank",imageURL:"https://graph.facebook.com/BMOcommunity/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q806693",amenity:"bank"},addTags:{amenity:"bank",brand:"Bank of Montreal","brand:wikidata":"Q806693","brand:wikipedia":"en:Bank of Montreal",name:"Bank of Montreal"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Bank of New Zealand":{name:"Bank of New Zealand",icon:"maki-bank",imageURL:"https://graph.facebook.com/BNZBank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q806687",amenity:"bank"},addTags:{amenity:"bank",brand:"Bank of New Zealand","brand:wikidata":"Q806687","brand:wikipedia":"en:Bank of New Zealand",name:"Bank of New Zealand"},countryCodes:["nz"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Bank of Scotland":{name:"Bank of Scotland",icon:"maki-bank",imageURL:"https://graph.facebook.com/bankofscotland/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q627381",amenity:"bank"},addTags:{amenity:"bank",brand:"Bank of Scotland","brand:wikidata":"Q627381","brand:wikipedia":"en:Bank of Scotland",name:"Bank of Scotland"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Bank of the West":{name:"Bank of the West",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/1103424843482058752/wb7kFeSw_bigger.png",geometry:["point","area"],tags:{"brand:wikidata":"Q2881919",amenity:"bank"},addTags:{amenity:"bank",brand:"Bank of the West","brand:wikidata":"Q2881919","brand:wikipedia":"en:Bank of the West",name:"Bank of the West"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Bankia":{name:"Bankia",icon:"maki-bank",imageURL:"https://graph.facebook.com/bankia.es/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q806807",amenity:"bank"},addTags:{amenity:"bank",brand:"Bankia","brand:wikidata":"Q806807","brand:wikipedia":"en:Bankia",name:"Bankia"},countryCodes:["es"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Bankinter":{name:"Bankinter",icon:"maki-bank",imageURL:"https://graph.facebook.com/bankinter/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q806808",amenity:"bank"},addTags:{amenity:"bank",brand:"Bankinter","brand:wikidata":"Q806808","brand:wikipedia":"es:Bankinter",name:"Bankinter"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Banner Bank":{name:"Banner Bank",icon:"maki-bank",imageURL:"https://graph.facebook.com/bannerbank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4856910",amenity:"bank"},addTags:{amenity:"bank",brand:"Banner Bank","brand:wikidata":"Q4856910","brand:wikipedia":"en:Banner Bank",name:"Banner Bank"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Banorte":{name:"Banorte",icon:"maki-bank",imageURL:"https://graph.facebook.com/banorte/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q806914",amenity:"bank"},addTags:{amenity:"bank",brand:"Banorte","brand:wikidata":"Q806914","brand:wikipedia":"en:Banorte",name:"Banorte"},countryCodes:["mx"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Banque Atlantique":{name:"Banque Atlantique",icon:"maki-bank",imageURL:"https://graph.facebook.com/BqAtlantiqueOfficiel/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2882890",amenity:"bank"},addTags:{amenity:"bank",brand:"Banque Atlantique","brand:wikidata":"Q2882890","brand:wikipedia":"en:Atlantic Bank Group",name:"Banque Atlantique"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Banque Laurentienne":{name:"Banque Laurentienne",icon:"maki-bank",imageURL:"https://graph.facebook.com/BLaurentienne/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1360087",amenity:"bank"},addTags:{amenity:"bank",brand:"Banque Laurentienne","brand:wikidata":"Q1360087","brand:wikipedia":"en:Laurentian Bank of Canada",name:"Banque Laurentienne"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Banque Nationale (Canada)":{name:"Banque Nationale (Canada)",icon:"maki-bank",imageURL:"https://graph.facebook.com/banquenationale/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q634298",amenity:"bank"},addTags:{amenity:"bank",brand:"Banque Nationale","brand:wikidata":"Q634298","brand:wikipedia":"en:National Bank of Canada",name:"Banque Nationale"},countryCodes:["ca"],terms:["banque nationale du canada","national bank of canada"],matchScore:2,suggestion:true},"amenity/bank/Banque Populaire":{name:"Banque Populaire",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FLogo-BP-VF%2BS.jpg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q2883441",amenity:"bank"},addTags:{amenity:"bank",brand:"Banque Populaire","brand:wikidata":"Q2883441","brand:wikipedia":"en:Banque Populaire du Maroc",name:"Banque Populaire"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Banrisul":{name:"Banrisul",icon:"maki-bank",imageURL:"https://graph.facebook.com/banrisul/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4857098",amenity:"bank"},addTags:{amenity:"bank",brand:"Banrisul","brand:wikidata":"Q4857098","brand:wikipedia":"en:Banrisul",name:"Banrisul"},countryCodes:["br"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Banrural":{name:"Banrural",icon:"maki-bank",imageURL:"https://graph.facebook.com/grupofinancierobanrural/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5719130",amenity:"bank"},addTags:{amenity:"bank",brand:"Banrural","brand:wikidata":"Q5719130","brand:wikipedia":"es:Banrural",name:"Banrural"},countryCodes:["gt","hn"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Barclays":{name:"Barclays",icon:"maki-bank",imageURL:"https://graph.facebook.com/BarclaysUK/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q245343",amenity:"bank"},addTags:{amenity:"bank",brand:"Barclays","brand:wikidata":"Q245343","brand:wikipedia":"en:Barclays",name:"Barclays"},terms:["barclays bank"],matchScore:2,suggestion:true},"amenity/bank/Belfius":{name:"Belfius",icon:"maki-bank",imageURL:"https://graph.facebook.com/belfius/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1956014",amenity:"bank"},addTags:{amenity:"bank",brand:"Belfius","brand:wikidata":"Q1956014","brand:wikipedia":"en:Belfius",name:"Belfius"},countryCodes:["be"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Bendigo Bank":{name:"Bendigo Bank",icon:"maki-bank",imageURL:"https://graph.facebook.com/BendigoBank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4887077",amenity:"bank"},addTags:{amenity:"bank",brand:"Bendigo Bank","brand:wikidata":"Q4887077","brand:wikipedia":"en:Bendigo and Adelaide Bank",name:"Bendigo Bank"},countryCodes:["au"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Berliner Volksbank":{name:"Berliner Volksbank",icon:"maki-bank",imageURL:"https://graph.facebook.com/BerlinerVolksbank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q821855",amenity:"bank"},addTags:{amenity:"bank",brand:"Berliner Volksbank","brand:wikidata":"Q821855","brand:wikipedia":"de:Berliner Volksbank",name:"Berliner Volksbank"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Bicentenario":{name:"Bicentenario",icon:"maki-bank",imageURL:"https://graph.facebook.com/BicentenarioBU/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5728123",amenity:"bank"},addTags:{amenity:"bank",brand:"Bicentenario","brand:wikidata":"Q5728123","brand:wikipedia":"es:Bicentenario Banco Universal",name:"Bicentenario"},countryCodes:["ve"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Bicici":{name:"Bicici",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q1667302",amenity:"bank"},addTags:{amenity:"bank",brand:"Bicici","brand:wikidata":"Q1667302","brand:wikipedia":"fr:Banque internationale pour le commerce et l'industrie de la Côte d'Ivoire",name:"Bicici"},countryCodes:["ci"],terms:["agence bicici"],matchScore:2,suggestion:true},"amenity/bank/Bradesco":{name:"Bradesco",icon:"maki-bank",imageURL:"https://graph.facebook.com/bradesco/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q806181",amenity:"bank"},addTags:{amenity:"bank",brand:"Bradesco","brand:wikidata":"Q806181","brand:wikipedia":"en:Banco Bradesco",name:"Bradesco"},countryCodes:["br"],terms:["banco bradesco"],matchScore:2,suggestion:true},"amenity/bank/Budapest Bank":{name:"Budapest Bank",icon:"maki-bank",imageURL:"https://graph.facebook.com/budapestbank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q27493463",amenity:"bank"},addTags:{amenity:"bank",brand:"Budapest Bank","brand:wikidata":"Q27493463","brand:wikipedia":"en:Budapest Bank",name:"Budapest Bank"},countryCodes:["hu"],terms:[],matchScore:2,suggestion:true},"amenity/bank/CBAO":{name:"CBAO",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q532104",amenity:"bank"},addTags:{amenity:"bank",brand:"CBAO","brand:wikidata":"Q532104","brand:wikipedia":"fr:CBAO Groupe Attijariwafa bank",name:"CBAO"},terms:[],matchScore:2,suggestion:true},"amenity/bank/CEC Bank":{name:"CEC Bank",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q1023306",amenity:"bank"},addTags:{amenity:"bank",brand:"CEC Bank","brand:wikidata":"Q1023306","brand:wikipedia":"en:CEC Bank",name:"CEC Bank"},countryCodes:["ro"],terms:[],matchScore:2,suggestion:true},"amenity/bank/CIB Bank":{name:"CIB Bank",icon:"maki-bank",imageURL:"https://graph.facebook.com/with.cib.hu/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q839566",amenity:"bank"},addTags:{amenity:"bank",brand:"CIB Bank","brand:wikidata":"Q839566","brand:wikipedia":"en:CIB Bank",name:"CIB Bank"},terms:[],matchScore:2,suggestion:true},"amenity/bank/CIBC":{name:"CIBC",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q666694",amenity:"bank"},addTags:{amenity:"bank",brand:"CIBC","brand:wikidata":"Q666694","brand:wikipedia":"en:Canadian Imperial Bank of Commerce",name:"CIBC"},countryCodes:["ca"],terms:["cibc banking centre"],matchScore:2,suggestion:true},"amenity/bank/CIC":{name:"CIC",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FCICBanqueLogo.jpg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q746525",amenity:"bank"},addTags:{amenity:"bank",brand:"CIC","brand:wikidata":"Q746525","brand:wikipedia":"en:Crédit Industriel et Commercial",name:"CIC"},terms:[],matchScore:2,suggestion:true},"amenity/bank/CIH Bank":{name:"CIH Bank",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q3006220",amenity:"bank"},addTags:{amenity:"bank",brand:"CIH Bank","brand:wikidata":"Q3006220","brand:wikipedia":"en:CIH Bank",name:"CIH Bank"},countryCodes:["ma"],terms:[],matchScore:2,suggestion:true},"amenity/bank/CIMB Bank":{name:"CIMB Bank",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FCIMB%20Group%20Logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q3045976",amenity:"bank"},addTags:{amenity:"bank",brand:"CIMB Bank","brand:wikidata":"Q3045976","brand:wikipedia":"en:CIMB",name:"CIMB Bank"},terms:[],matchScore:2,suggestion:true},"amenity/bank/CIMB Niaga":{name:"CIMB Niaga",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FCIMB%20Niaga%20logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q5011747",amenity:"bank"},addTags:{amenity:"bank",brand:"CIMB Niaga","brand:wikidata":"Q5011747","brand:wikipedia":"en:CIMB Niaga",name:"CIMB Niaga"},countryCodes:["id"],terms:[],matchScore:2,suggestion:true},"amenity/bank/CNEP":{name:"CNEP",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q2931752",amenity:"bank"},addTags:{amenity:"bank",brand:"CNEP","brand:wikidata":"Q2931752","brand:wikipedia":"fr:CNEP-Banque",name:"CNEP"},countryCodes:["dz"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Caisse Desjardins":{name:"Caisse Desjardins",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FDesjardins%20Group%20logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q2933350",amenity:"bank"},addTags:{amenity:"bank",brand:"Caisse Desjardins","brand:wikidata":"Q2933350","brand:wikipedia":"en:Desjardins Group",name:"Caisse Desjardins"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Caisse d'Épargne":{name:"Caisse d'Épargne",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/963786966771863554/TO9mBEU1_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q1547738",amenity:"bank"},addTags:{amenity:"bank",brand:"Caisse d'Épargne","brand:wikidata":"Q1547738","brand:wikipedia":"en:Groupe Caisse d'Épargne",name:"Caisse d'Épargne"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Caixa Econômica Federal (Brazil)":{name:"Caixa Econômica Federal (Brazil)",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FCaixa%20Econ%C3%B4mica%20Federal.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q835283",amenity:"bank"},addTags:{amenity:"bank",brand:"Caixa Econômica Federal","brand:wikidata":"Q835283","brand:wikipedia":"pt:Caixa Econômica Federal",name:"Caixa Econômica Federal"},countryCodes:["br"],terms:["caixa","caixabank"],matchScore:2,suggestion:true},"amenity/bank/Caixa Geral de Depósitos":{name:"Caixa Geral de Depósitos",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FCaixa%20Geral%20de%20Dep%C3%B3sitos%20logo.jpg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q1026044",amenity:"bank"},addTags:{amenity:"bank",brand:"Caixa Geral de Depósitos","brand:wikidata":"Q1026044","brand:wikipedia":"pt:Caixa Geral de Depósitos",name:"Caixa Geral de Depósitos"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Caixabank (Spain)":{name:"Caixabank (Spain)",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FLogo%20CaixaBank.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q847225",amenity:"bank"},addTags:{amenity:"bank",brand:"Caixabank","brand:wikidata":"Q847225","brand:wikipedia":"en:CaixaBank",name:"Caixabank"},countryCodes:["es"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Caja Duero":{name:"Caja Duero",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q3821055",amenity:"bank"},addTags:{amenity:"bank",brand:"Caja Duero","brand:wikidata":"Q3821055","brand:wikipedia":"es:Caja Duero",name:"Caja Duero"},countryCodes:["es"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Caja España":{name:"Caja España",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q966985",amenity:"bank"},addTags:{amenity:"bank",brand:"Caja España","brand:wikidata":"Q966985","brand:wikipedia":"es:Caja España",name:"Caja España"},countryCodes:["es"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Caja Rural":{name:"Caja Rural",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q3649971",amenity:"bank"},addTags:{amenity:"bank",brand:"Caja Rural","brand:wikidata":"Q3649971","brand:wikipedia":"es:Caja Rural",name:"Caja Rural"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Caja Rural de Jaén":{name:"Caja Rural de Jaén",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q18720350",amenity:"bank"},addTags:{amenity:"bank",brand:"Caja Rural de Jaén","brand:wikidata":"Q18720350","brand:wikipedia":"es:Caja Rural de Jaén",name:"Caja Rural de Jaén"},countryCodes:["es"],terms:[],matchScore:2,suggestion:true},"amenity/bank/CajaSur":{name:"CajaSur",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q3751637",amenity:"bank"},addTags:{amenity:"bank",brand:"CajaSur","brand:wikidata":"Q3751637","brand:wikipedia":"en:CajaSur",name:"CajaSur"},countryCodes:["es"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Cajamar":{name:"Cajamar",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q8254971",amenity:"bank"},addTags:{amenity:"bank",brand:"Cajamar","brand:wikidata":"Q8254971","brand:wikipedia":"es:Cajamar",name:"Cajamar"},countryCodes:["es"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Canara Bank":{name:"Canara Bank",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FCanara%20Bank%20Logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q2003777",amenity:"bank"},addTags:{amenity:"bank",brand:"Canara Bank","brand:wikidata":"Q2003777","brand:wikipedia":"en:Canara Bank",name:"Canara Bank"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Capital Bank":{name:"Capital Bank",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q5035481",amenity:"bank"},addTags:{amenity:"bank",brand:"Capital Bank","brand:wikidata":"Q5035481","brand:wikipedia":"en:Capital Bank Financial",name:"Capital Bank"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Capital One":{name:"Capital One",icon:"maki-bank",imageURL:"https://graph.facebook.com/capitalone/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1034654",amenity:"bank"},addTags:{amenity:"bank",brand:"Capital One","brand:wikidata":"Q1034654","brand:wikipedia":"en:Capital One",name:"Capital One"},countryCodes:["us"],terms:["capital one bank"],matchScore:2,suggestion:true},"amenity/bank/Carige":{name:"Carige",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q3633695",amenity:"bank"},addTags:{amenity:"bank",brand:"Carige","brand:wikidata":"Q3633695","brand:wikipedia":"en:Banca Carige",name:"Carige"},countryCodes:["it"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Cariparma":{name:"Cariparma",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q2938832",amenity:"bank"},addTags:{amenity:"bank",brand:"Cariparma","brand:wikidata":"Q2938832","brand:wikipedia":"en:Crédit Agricole Italia",name:"Cariparma"},countryCodes:["it"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Carisbo":{name:"Carisbo",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q3661937",amenity:"bank"},addTags:{amenity:"bank",brand:"Carisbo","brand:wikidata":"Q3661937","brand:wikipedia":"en:Cassa di Risparmio in Bologna",name:"Carisbo"},countryCodes:["it"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Cassa di Risparmio del Veneto":{name:"Cassa di Risparmio del Veneto",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q3661909",amenity:"bank"},addTags:{amenity:"bank",brand:"Cassa di Risparmio del Veneto","brand:wikidata":"Q3661909","brand:wikipedia":"en:Cassa di Risparmio del Veneto",name:"Cassa di Risparmio del Veneto"},countryCodes:["it"],terms:[],matchScore:2,suggestion:true},"amenity/bank/CatalunyaCaixa":{name:"CatalunyaCaixa",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FLogo%20cx%20original.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q3750952",amenity:"bank"},addTags:{amenity:"bank",brand:"CatalunyaCaixa","brand:wikidata":"Q3750952","brand:wikipedia":"en:CatalunyaCaixa",name:"CatalunyaCaixa"},countryCodes:["es"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Cathay Bank":{name:"Cathay Bank",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q4189507",amenity:"bank"},addTags:{amenity:"bank",brand:"Cathay Bank","brand:wikidata":"Q4189507","brand:wikipedia":"en:Cathay Bank",name:"Cathay Bank"},countryCodes:["cn","tw","us"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Central Bank of India":{name:"Central Bank of India",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q2007090",amenity:"bank"},addTags:{amenity:"bank",brand:"Central Bank of India","brand:wikidata":"Q2007090","brand:wikipedia":"en:Central Bank of India",name:"Central Bank of India"},countryCodes:["in"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Chase":{name:"Chase",icon:"maki-bank",imageURL:"https://graph.facebook.com/chase/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q524629",amenity:"bank"},addTags:{amenity:"bank",brand:"Chase","brand:wikidata":"Q524629","brand:wikipedia":"en:Chase Bank",name:"Chase"},terms:["chase bank"],matchScore:2,suggestion:true},"amenity/bank/China Bank":{name:"China Bank",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FChina%20Bank%20logo%20wiki.jpg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q5100080",amenity:"bank"},addTags:{amenity:"bank",brand:"China Bank","brand:wikidata":"Q5100080","brand:wikipedia":"en:Chinabank",name:"China Bank"},terms:[],matchScore:2,suggestion:true},"amenity/bank/China Bank Savings":{name:"China Bank Savings",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q18387359",amenity:"bank"},addTags:{amenity:"bank",brand:"China Bank Savings","brand:wikidata":"Q18387359","brand:wikipedia":"en:China Bank Savings",name:"China Bank Savings"},countryCodes:["ph"],terms:[],matchScore:2,suggestion:true},"amenity/bank/China Construction Bank":{name:"China Construction Bank",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FChina%20Construction%20Bank%20logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q26299",amenity:"bank"},addTags:{amenity:"bank",brand:"China Construction Bank","brand:wikidata":"Q26299","brand:wikipedia":"en:China Construction Bank",name:"China Construction Bank"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Citibank":{name:"Citibank",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/926109116233166848/xR88n-q7_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q857063",amenity:"bank"},addTags:{amenity:"bank",brand:"Citibank","brand:wikidata":"Q857063","brand:wikipedia":"en:Citibank",name:"Citibank"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Citizens Bank":{name:"Citizens Bank",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q25209674",amenity:"bank"},addTags:{amenity:"bank",brand:"Citizens Bank","brand:wikidata":"Q25209674","brand:wikipedia":"en:Citizens Bank (South Bend, Indiana)",name:"Citizens Bank"},terms:[],matchScore:2,suggestion:true},"amenity/bank/City National Bank (California)":{name:"City National Bank (California)",icon:"maki-bank",imageURL:"https://graph.facebook.com/CityNationalBank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5123314",amenity:"bank"},addTags:{amenity:"bank",brand:"City National Bank","brand:wikidata":"Q5123314","brand:wikipedia":"en:City National Bank (California)",name:"City National Bank"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/bank/City National Bank (Florida)":{name:"City National Bank (Florida)",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q16958644",amenity:"bank"},addTags:{amenity:"bank",brand:"City National Bank","brand:wikidata":"Q16958644","brand:wikipedia":"en:City National Bank (Florida)",name:"City National Bank",official_name:"City National Bank of Florida"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Clydesdale Bank":{name:"Clydesdale Bank",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/875682015106007042/Ogpdl-Lh_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q971680",amenity:"bank"},addTags:{amenity:"bank",brand:"Clydesdale Bank","brand:wikidata":"Q971680","brand:wikipedia":"en:Clydesdale Bank",name:"Clydesdale Bank"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Columbia Bank (New Jersey)":{name:"Columbia Bank (New Jersey)",icon:"maki-bank",imageURL:"https://graph.facebook.com/columbiabank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62084096",amenity:"bank"},addTags:{amenity:"bank",brand:"Columbia Bank","brand:wikidata":"Q62084096",name:"Columbia Bank"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Columbia Bank (Washington)":{name:"Columbia Bank (Washington)",icon:"maki-bank",imageURL:"https://graph.facebook.com/columbiastatebank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62084089",amenity:"bank"},addTags:{amenity:"bank",brand:"Columbia Bank","brand:wikidata":"Q62084089",name:"Columbia Bank"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Comerica Bank":{name:"Comerica Bank",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FComerica%20Inc.%20logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q1114148",amenity:"bank"},addTags:{amenity:"bank",brand:"Comerica Bank","brand:wikidata":"Q1114148","brand:wikipedia":"en:Comerica",name:"Comerica Bank"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Commercial Bank of Ceylon PLC":{name:"Commercial Bank of Ceylon PLC",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q5152468",amenity:"bank"},addTags:{amenity:"bank",brand:"Commercial Bank of Ceylon PLC","brand:wikidata":"Q5152468","brand:wikipedia":"en:Commercial Bank of Ceylon",name:"Commercial Bank of Ceylon PLC"},countryCodes:["lk"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Commerzbank":{name:"Commerzbank",icon:"maki-bank",imageURL:"https://graph.facebook.com/commerzbank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q157617",amenity:"bank"},addTags:{amenity:"bank",brand:"Commerzbank","brand:wikidata":"Q157617","brand:wikipedia":"en:Commerzbank",name:"Commerzbank"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Commonwealth Bank":{name:"Commonwealth Bank",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/706619944633389058/8ohO3e8b_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q285328",amenity:"bank"},addTags:{amenity:"bank",brand:"Commonwealth Bank","brand:wikidata":"Q285328","brand:wikipedia":"en:Commonwealth Bank",name:"Commonwealth Bank"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Community Bank":{name:"Community Bank",icon:"maki-bank",imageURL:"https://graph.facebook.com/communitybankna/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5154635",amenity:"bank"},addTags:{amenity:"bank",brand:"Community Bank","brand:wikidata":"Q5154635","brand:wikipedia":"en:Community Bank, N.A.",name:"Community Bank"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Corporation Bank":{name:"Corporation Bank",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q2003387",amenity:"bank"},addTags:{amenity:"bank",brand:"Corporation Bank","brand:wikidata":"Q2003387","brand:wikipedia":"en:Corporation Bank",name:"Corporation Bank"},countryCodes:["in"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Credem":{name:"Credem",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q3696881",amenity:"bank"},addTags:{amenity:"bank",brand:"Credem","brand:wikidata":"Q3696881","brand:wikipedia":"en:Credito Emiliano",name:"Credem"},countryCodes:["it"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Credicoop":{name:"Credicoop",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FLogo-banco-Credicoop.jpg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q4854086",amenity:"bank"},addTags:{amenity:"bank",brand:"Credicoop","brand:wikidata":"Q4854086","brand:wikipedia":"en:Banco Credicoop",name:"Credicoop"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Credit Suisse":{name:"Credit Suisse",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FCredit%20Suisse%20Logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q372657",amenity:"bank"},addTags:{amenity:"bank",brand:"Credit Suisse","brand:wikidata":"Q372657","brand:wikipedia":"en:Credit Suisse",name:"Credit Suisse"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Credito Valtellinese":{name:"Credito Valtellinese",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q3696888",amenity:"bank"},addTags:{amenity:"bank",brand:"Credito Valtellinese","brand:wikidata":"Q3696888","brand:wikipedia":"en:Credito Valtellinese",name:"Credito Valtellinese"},countryCodes:["it"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Crelan":{name:"Crelan",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q389872",amenity:"bank"},addTags:{amenity:"bank",brand:"Crelan","brand:wikidata":"Q389872","brand:wikipedia":"en:Crelan",name:"Crelan"},countryCodes:["be"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Crédit Agricole":{name:"Crédit Agricole",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/1059770497590878208/qL4i_SGK_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q590952",amenity:"bank"},addTags:{amenity:"bank",brand:"Crédit Agricole","brand:wikidata":"Q590952","brand:wikipedia":"fr:Crédit agricole",name:"Crédit Agricole"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Crédit Maritime":{name:"Crédit Maritime",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q17176866",amenity:"bank"},addTags:{amenity:"bank",brand:"Crédit Maritime","brand:wikidata":"Q17176866","brand:wikipedia":"fr:Crédit maritime",name:"Crédit Maritime"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Crédit Mutuel":{name:"Crédit Mutuel",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FLogo%20Cr%C3%A9dit%20Mutuel.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q642627",amenity:"bank"},addTags:{amenity:"bank",brand:"Crédit Mutuel","brand:wikidata":"Q642627","brand:wikipedia":"en:Crédit Mutuel",name:"Crédit Mutuel"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Crédit Mutuel de Bretagne":{name:"Crédit Mutuel de Bretagne",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/668742184938643456/ZHoL5MoD_bigger.png",geometry:["point","area"],tags:{"brand:wikidata":"Q3006236",amenity:"bank"},addTags:{amenity:"bank",brand:"Crédit Mutuel de Bretagne","brand:wikidata":"Q3006236","brand:wikipedia":"fr:Crédit mutuel Arkéa",name:"Crédit Mutuel de Bretagne"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Crédit du Nord":{name:"Crédit du Nord",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q3006209",amenity:"bank"},addTags:{amenity:"bank",brand:"Crédit du Nord","brand:wikidata":"Q3006209","brand:wikipedia":"en:Crédit du Nord",name:"Crédit du Nord"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Crédito Agrícola":{name:"Crédito Agrícola",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q10262017",amenity:"bank"},addTags:{amenity:"bank",brand:"Crédito Agrícola","brand:wikidata":"Q10262017","brand:wikipedia":"pt:Crédito Agrícola",name:"Crédito Agrícola"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Cбербанк":{name:"Cбербанк",icon:"maki-bank",imageURL:"https://graph.facebook.com/sberbank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q205012",amenity:"bank"},addTags:{amenity:"bank",brand:"Cбербанк","brand:wikidata":"Q205012","brand:wikipedia":"en:Sberbank of Russia",name:"Cбербанк"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Danske Bank":{name:"Danske Bank",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FDanske%20Bank%20logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q1636974",amenity:"bank"},addTags:{amenity:"bank",brand:"Danske Bank","brand:wikidata":"Q1636974","brand:wikipedia":"en:Danske Bank",name:"Danske Bank"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Davivienda":{name:"Davivienda",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q5242054",amenity:"bank"},addTags:{amenity:"bank",brand:"Davivienda","brand:wikidata":"Q5242054","brand:wikipedia":"en:Davivienda",name:"Davivienda"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Denizbank":{name:"Denizbank",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/794192531588321280/OybdjoEC_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q1115064",amenity:"bank"},addTags:{amenity:"bank",brand:"Denizbank","brand:wikidata":"Q1115064","brand:wikipedia":"en:DenizBank",name:"Denizbank"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Desjardins":{name:"Desjardins",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FDesjardins%20Group%20logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q2933350",amenity:"bank"},addTags:{amenity:"bank",brand:"Desjardins","brand:wikidata":"Q2933350","brand:wikipedia":"en:Desjardins Group",name:"Desjardins"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Deutsche Bank":{name:"Deutsche Bank",icon:"maki-bank",imageURL:"https://graph.facebook.com/DeutscheBank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q66048",amenity:"bank"},addTags:{amenity:"bank",brand:"Deutsche Bank","brand:wikidata":"Q66048","brand:wikipedia":"en:Deutsche Bank",name:"Deutsche Bank"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Dubai Islamic Bank":{name:"Dubai Islamic Bank",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q5310570",amenity:"bank"},addTags:{amenity:"bank",brand:"Dubai Islamic Bank","brand:wikidata":"Q5310570","brand:wikipedia":"en:Dubai Islamic Bank",name:"Dubai Islamic Bank"},terms:[],matchScore:2,suggestion:true},"amenity/bank/EastWest Bank":{name:"EastWest Bank",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q5327595",amenity:"bank"},addTags:{amenity:"bank",brand:"EastWest Bank","brand:wikidata":"Q5327595","brand:wikipedia":"en:EastWest Bank",name:"EastWest Bank"},terms:[],matchScore:2,suggestion:true},"amenity/bank/EastWest Unibank":{name:"EastWest Unibank",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q5327595",amenity:"bank"},addTags:{amenity:"bank",brand:"EastWest Unibank","brand:wikidata":"Q5327595","brand:wikipedia":"en:EastWest Bank",name:"EastWest Unibank"},countryCodes:["ph"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Ecobank":{name:"Ecobank",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FEcobank%20Logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q930225",amenity:"bank"},addTags:{amenity:"bank",brand:"Ecobank","brand:wikidata":"Q930225","brand:wikipedia":"en:Ecobank",name:"Ecobank"},terms:["agence ecobank"],matchScore:2,suggestion:true},"amenity/bank/Emigrant Savings Bank":{name:"Emigrant Savings Bank",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q5371104",amenity:"bank"},addTags:{amenity:"bank",brand:"Emigrant Savings Bank","brand:wikidata":"Q5371104","brand:wikipedia":"en:Emigrant Savings Bank",name:"Emigrant Savings Bank"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Emirates NBD":{name:"Emirates NBD",icon:"maki-bank",imageURL:"https://graph.facebook.com/EmiratesNBD/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5372575",amenity:"bank"},addTags:{amenity:"bank",brand:"Emirates NBD","brand:wikidata":"Q5372575","brand:wikipedia":"en:Emirates NBD",name:"Emirates NBD"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Equity Bank (Congo)":{name:"Equity Bank (Congo)",icon:"maki-bank",imageURL:"https://graph.facebook.com/www.equitybank.cd/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q21178738",amenity:"bank"},addTags:{amenity:"bank",brand:"Equity Bank","brand:wikidata":"Q21178738","brand:wikipedia":"en:Equity Bank Congo",name:"Equity Bank"},countryCodes:["cd"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Equity Bank (Kenya)":{name:"Equity Bank (Kenya)",icon:"maki-bank",imageURL:"https://graph.facebook.com/KeEquityBank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5384664",amenity:"bank"},addTags:{amenity:"bank",brand:"Equity Bank","brand:wikidata":"Q5384664","brand:wikipedia":"en:Equity Bank Kenya Limited",name:"Equity Bank"},countryCodes:["ke"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Equity Bank (Rwanda)":{name:"Equity Bank (Rwanda)",icon:"maki-bank",imageURL:"https://graph.facebook.com/RwEquityBank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5384665",amenity:"bank"},addTags:{amenity:"bank",brand:"Equity Bank","brand:wikidata":"Q5384665","brand:wikipedia":"en:Equity Bank Rwanda Limited",name:"Equity Bank"},countryCodes:["rw"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Equity Bank (South Sudan)":{name:"Equity Bank (South Sudan)",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q5384666",amenity:"bank"},addTags:{amenity:"bank",brand:"Equity Bank","brand:wikidata":"Q5384666","brand:wikipedia":"en:Equity Bank South Sudan Limited",name:"Equity Bank"},countryCodes:["ss"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Equity Bank (Tanzania)":{name:"Equity Bank (Tanzania)",icon:"maki-bank",imageURL:"https://graph.facebook.com/TzEquityBank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5384667",amenity:"bank"},addTags:{amenity:"bank",brand:"Equity Bank","brand:wikidata":"Q5384667","brand:wikipedia":"en:Equity Bank Tanzania Limited",name:"Equity Bank"},countryCodes:["tz"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Equity Bank (USA)":{name:"Equity Bank (USA)",icon:"maki-bank",imageURL:"https://graph.facebook.com/equitybankusa/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62260414",amenity:"bank"},addTags:{amenity:"bank",brand:"Equity Bank","brand:wikidata":"Q62260414",name:"Equity Bank"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Equity Bank (Uganda)":{name:"Equity Bank (Uganda)",icon:"maki-bank",imageURL:"https://graph.facebook.com/UgEquityBank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5384668",amenity:"bank"},addTags:{amenity:"bank",brand:"Equity Bank","brand:wikidata":"Q5384668","brand:wikipedia":"en:Equity Bank Uganda Limited",name:"Equity Bank"},countryCodes:["ug"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Erste Bank":{name:"Erste Bank",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FErste%20Bank%20Logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q696867",amenity:"bank"},addTags:{amenity:"bank",brand:"Erste Bank","brand:wikidata":"Q696867","brand:wikipedia":"de:Erste Bank",name:"Erste Bank"},countryCodes:["at","hr","hu"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Eurobank (Greece)":{name:"Eurobank (Greece)",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/928963286518910976/KZD7wKh9_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q951850",amenity:"bank"},addTags:{amenity:"bank",brand:"Eurobank","brand:wikidata":"Q951850","brand:wikipedia":"el:Eurobank",name:"Eurobank"},countryCodes:["gr"],terms:["eurobank ergasias"],matchScore:2,suggestion:true},"amenity/bank/Eurobank (Poland)":{name:"Eurobank (Poland)",icon:"maki-bank",imageURL:"https://graph.facebook.com/eurobanksa/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q9256201",amenity:"bank"},addTags:{amenity:"bank",brand:"Eurobank","brand:wikidata":"Q9256201","brand:wikipedia":"pl:Euro Bank",name:"Eurobank"},countryCodes:["pl"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Eurobank (Serbia)":{name:"Eurobank (Serbia)",icon:"maki-bank",imageURL:"https://graph.facebook.com/EurobankSrbija/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5411684",amenity:"bank"},addTags:{amenity:"bank",brand:"Eurobank","brand:wikidata":"Q5411684","brand:wikipedia":"sr:Eurobanka",name:"Eurobank"},countryCodes:["rs"],terms:[],matchScore:2,suggestion:true},"amenity/bank/FNB":{name:"FNB",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q3072956",amenity:"bank"},addTags:{amenity:"bank",brand:"FNB","brand:wikidata":"Q3072956","brand:wikipedia":"en:First National Bank (South Africa)",name:"FNB",official_name:"First National Bank"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Faysal Bank":{name:"Faysal Bank",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q5439099",amenity:"bank"},addTags:{amenity:"bank",brand:"Faysal Bank","brand:wikidata":"Q5439099","brand:wikipedia":"en:Faysal Bank",name:"Faysal Bank"},countryCodes:["pk"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Federal Bank":{name:"Federal Bank",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FFederal%20Bank.jpg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q2044983",amenity:"bank"},addTags:{amenity:"bank",brand:"Federal Bank","brand:wikidata":"Q2044983","brand:wikipedia":"en:Federal Bank",name:"Federal Bank"},countryCodes:["in"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Fidelity Bank (Ghana)":{name:"Fidelity Bank (Ghana)",icon:"maki-bank",imageURL:"https://graph.facebook.com/fidelitybankgh/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5446778",amenity:"bank"},addTags:{amenity:"bank",brand:"Fidelity Bank","brand:wikidata":"Q5446778","brand:wikipedia":"en:Fidelity Bank Ghana",name:"Fidelity Bank"},countryCodes:["gh"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Fidelity Bank (Nigeria)":{name:"Fidelity Bank (Nigeria)",icon:"maki-bank",imageURL:"https://graph.facebook.com/FidelityBankplc/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5446777",amenity:"bank"},addTags:{amenity:"bank",brand:"Fidelity Bank","brand:wikidata":"Q5446777","brand:wikipedia":"en:Fidelity Bank Nigeria",name:"Fidelity Bank"},countryCodes:["ng"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Fidelity Bank (USA)":{name:"Fidelity Bank (USA)",icon:"maki-bank",imageURL:"https://graph.facebook.com/fidelityinvestments/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1411292",amenity:"bank"},addTags:{amenity:"bank",brand:"Fidelity Bank","brand:wikidata":"Q1411292","brand:wikipedia":"en:Fidelity Investments",name:"Fidelity Bank"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Fifth Third Bank":{name:"Fifth Third Bank",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/1013779792141914120/FJ0U_8zw_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q1411810",amenity:"bank"},addTags:{amenity:"bank",brand:"Fifth Third Bank","brand:wikidata":"Q1411810","brand:wikipedia":"en:Fifth Third Bank",name:"Fifth Third Bank",short_name:"5/3 Bank"},countryCodes:["us"],terms:["5/3","5/3 bank"],matchScore:2,suggestion:true},"amenity/bank/Finansbank":{name:"Finansbank",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q1416237",amenity:"bank"},addTags:{amenity:"bank",brand:"Finansbank","brand:wikidata":"Q1416237","brand:wikipedia":"en:Finansbank",name:"Finansbank"},terms:[],matchScore:2,suggestion:true},"amenity/bank/First Bank (Western USA)":{name:"First Bank (Western USA)",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q5452217",amenity:"bank"},addTags:{amenity:"bank",brand:"First Bank","brand:wikidata":"Q5452217","brand:wikipedia":"en:FirstBank Holding Co",name:"First Bank",short_name:"1STBank"},countryCodes:["us"],terms:["1stbank"],matchScore:2,suggestion:true},"amenity/bank/First Citizens Bank":{name:"First Citizens Bank",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q5452734",amenity:"bank"},addTags:{amenity:"bank",brand:"First Citizens Bank","brand:wikidata":"Q5452734","brand:wikipedia":"en:First Citizens Bank (Trinidad and Tobago)",name:"First Citizens Bank"},terms:[],matchScore:2,suggestion:true},"amenity/bank/First Financial Bank":{name:"First Financial Bank",icon:"maki-bank",imageURL:"https://graph.facebook.com/FirstFinancialBank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5453009",amenity:"bank"},addTags:{amenity:"bank",brand:"First Financial Bank","brand:wikidata":"Q5453009","brand:wikipedia":"en:First Financial Bank (Ohio)",name:"First Financial Bank"},countryCodes:["us"],terms:["1st financial bank"],matchScore:2,suggestion:true},"amenity/bank/First Midwest Bank":{name:"First Midwest Bank",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q5453331",amenity:"bank"},addTags:{amenity:"bank",brand:"First Midwest Bank","brand:wikidata":"Q5453331","brand:wikipedia":"en:First Midwest Bank",name:"First Midwest Bank"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/bank/First National Bank":{name:"First National Bank",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q5426765",amenity:"bank"},addTags:{amenity:"bank",brand:"First National Bank","brand:wikidata":"Q5426765","brand:wikipedia":"en:F.N.B. Corporation",name:"First National Bank"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Frost Bank":{name:"Frost Bank",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q5506152",amenity:"bank"},addTags:{amenity:"bank",brand:"Frost Bank","brand:wikidata":"Q5506152","brand:wikipedia":"en:Frost Bank",name:"Frost Bank"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/bank/GCB Bank":{name:"GCB Bank",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q1521346",amenity:"bank"},addTags:{amenity:"bank",brand:"GCB Bank","brand:wikidata":"Q1521346","brand:wikipedia":"en:GCB Bank",name:"GCB Bank"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Galicia":{name:"Galicia",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FBanco%20galicia%20logo.png&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q5717952",amenity:"bank"},addTags:{amenity:"bank",brand:"Galicia","brand:wikidata":"Q5717952","brand:wikipedia":"es:Banco Galicia",name:"Galicia"},countryCodes:["ar"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Garanti":{name:"Garanti",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q322962",amenity:"bank"},addTags:{amenity:"bank",brand:"Garanti","brand:wikidata":"Q322962","brand:wikipedia":"en:Garanti Bank",name:"Garanti"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Garanti Bankası":{name:"Garanti Bankası",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q322962",amenity:"bank"},addTags:{amenity:"bank",brand:"Garanti Bankası","brand:wikidata":"Q322962","brand:wikipedia":"en:Garanti Bank",name:"Garanti Bankası"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Getin Bank":{name:"Getin Bank",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FGetin%20Bank%20Logo.png&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q9267646",amenity:"bank"},addTags:{amenity:"bank",brand:"Getin Bank","brand:wikidata":"Q9267646","brand:wikipedia":"pl:Getin Bank",name:"Getin Bank"},countryCodes:["pl"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Great Western Bank":{name:"Great Western Bank",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q5600185",amenity:"bank"},addTags:{amenity:"bank",brand:"Great Western Bank","brand:wikidata":"Q5600185","brand:wikipedia":"en:Great Western Bank (1907–present)",name:"Great Western Bank"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Groupama":{name:"Groupama",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q3083531",amenity:"bank"},addTags:{amenity:"bank",brand:"Groupama","brand:wikidata":"Q3083531","brand:wikipedia":"en:Groupama",name:"Groupama"},terms:[],matchScore:2,suggestion:true},"amenity/bank/HBL Bank":{name:"HBL Bank",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q1566843",amenity:"bank"},addTags:{amenity:"bank",brand:"HBL Bank","brand:wikidata":"Q1566843","brand:wikipedia":"ur:ایچ بی ایل پاکستان",name:"HBL Bank"},terms:["hbl"],matchScore:2,suggestion:true},"amenity/bank/HDFC Bank":{name:"HDFC Bank",icon:"maki-bank",imageURL:"https://graph.facebook.com/HDFC.bank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q631047",amenity:"bank"},addTags:{amenity:"bank",brand:"HDFC Bank","brand:wikidata":"Q631047","brand:wikipedia":"en:HDFC Bank",name:"HDFC Bank"},terms:[],matchScore:2,suggestion:true},"amenity/bank/HNB":{name:"HNB",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q3532080",amenity:"bank"},addTags:{amenity:"bank",brand:"HNB","brand:wikidata":"Q3532080","brand:wikipedia":"en:Hatton National Bank",name:"HNB"},terms:[],matchScore:2,suggestion:true},"amenity/bank/HSBC":{name:"HSBC",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/1029690966758895616/3T9gt_mL_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q190464",amenity:"bank"},addTags:{amenity:"bank",brand:"HSBC","brand:wikidata":"Q190464","brand:wikipedia":"en:HSBC",name:"HSBC"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Halifax":{name:"Halifax",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q3310164",amenity:"bank"},addTags:{amenity:"bank",brand:"Halifax","brand:wikidata":"Q3310164","brand:wikipedia":"en:Halifax (bank)",name:"Halifax"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Halkbank":{name:"Halkbank",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q3593818",amenity:"bank"},addTags:{amenity:"bank",brand:"Halkbank","brand:wikidata":"Q3593818","brand:wikipedia":"en:Halkbank a.d.",name:"Halkbank"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Handelsbanken":{name:"Handelsbanken",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FHandelsbanken.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q1421630",amenity:"bank"},addTags:{amenity:"bank",brand:"Handelsbanken","brand:wikidata":"Q1421630","brand:wikipedia":"en:Handelsbanken",name:"Handelsbanken"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Heritage Bank":{name:"Heritage Bank",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q5738690",amenity:"bank"},addTags:{amenity:"bank",brand:"Heritage Bank","brand:wikidata":"Q5738690","brand:wikipedia":"en:Heritage Bank",name:"Heritage Bank"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Hong Leong Bank":{name:"Hong Leong Bank",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FHong%20Leong%20Bank.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q4383943",amenity:"bank"},addTags:{amenity:"bank",brand:"Hong Leong Bank","brand:wikidata":"Q4383943","brand:wikipedia":"en:Hong Leong Bank",name:"Hong Leong Bank"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Hrvatska poštanska banka":{name:"Hrvatska poštanska banka",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q5923981",amenity:"bank"},addTags:{amenity:"bank",brand:"Hrvatska poštanska banka","brand:wikidata":"Q5923981","brand:wikipedia":"en:Hrvatska poštanska banka",name:"Hrvatska poštanska banka"},countryCodes:["hr"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Huntington Bank":{name:"Huntington Bank",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q798819",amenity:"bank"},addTags:{amenity:"bank",brand:"Huntington Bank","brand:wikidata":"Q798819","brand:wikipedia":"en:Huntington Bancshares",name:"Huntington Bank"},terms:[],matchScore:2,suggestion:true},"amenity/bank/HypoVereinsbank":{name:"HypoVereinsbank",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/950681154906095618/sFON4jIk_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q220189",amenity:"bank"},addTags:{amenity:"bank",brand:"HypoVereinsbank","brand:wikidata":"Q220189","brand:wikipedia":"en:HypoVereinsbank",name:"HypoVereinsbank"},terms:[],matchScore:2,suggestion:true},"amenity/bank/ICBC":{name:"ICBC",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FICBC%20logo.png&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q26463",amenity:"bank"},addTags:{amenity:"bank",brand:"ICBC","brand:wikidata":"Q26463","brand:wikipedia":"en:Industrial and Commercial Bank of China",name:"ICBC"},terms:[],matchScore:2,suggestion:true},"amenity/bank/ICICI Bank":{name:"ICICI Bank",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FICICI%20Bank%20Logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q1653258",amenity:"bank"},addTags:{amenity:"bank",brand:"ICICI Bank","brand:wikidata":"Q1653258","brand:wikipedia":"en:ICICI Bank",name:"ICICI Bank"},terms:[],matchScore:2,suggestion:true},"amenity/bank/IDBI Bank":{name:"IDBI Bank",icon:"maki-bank",imageURL:"https://graph.facebook.com/IDBIBank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3633485",amenity:"bank"},addTags:{amenity:"bank",brand:"IDBI Bank","brand:wikidata":"Q3633485","brand:wikipedia":"en:IDBI Bank",name:"IDBI Bank"},countryCodes:["in"],terms:[],matchScore:2,suggestion:true},"amenity/bank/ING":{name:"ING",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FING%20Group%20N.V.%20Logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q645708",amenity:"bank"},addTags:{amenity:"bank",brand:"ING","brand:wikidata":"Q645708","brand:wikipedia":"en:ING Group",name:"ING"},terms:["ing bank"],matchScore:2,suggestion:true},"amenity/bank/ING Bank Śląski":{name:"ING Bank Śląski",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FING%20logo.png&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q1410383",amenity:"bank"},addTags:{amenity:"bank",brand:"ING Bank Śląski","brand:wikidata":"Q1410383","brand:wikipedia":"pl:ING Bank Śląski",name:"ING Bank Śląski"},countryCodes:["pl"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Ibercaja":{name:"Ibercaja",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q5907815",amenity:"bank"},addTags:{amenity:"bank",brand:"Ibercaja","brand:wikidata":"Q5907815","brand:wikipedia":"es:Ibercaja",name:"Ibercaja"},countryCodes:["es"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Indian Bank":{name:"Indian Bank",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q2003789",amenity:"bank"},addTags:{amenity:"bank",brand:"Indian Bank","brand:wikidata":"Q2003789","brand:wikipedia":"en:Indian Bank",name:"Indian Bank"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Indian Overseas Bank":{name:"Indian Overseas Bank",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FIndian%20Overseas%20Bank%20Logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q2003611",amenity:"bank"},addTags:{amenity:"bank",brand:"Indian Overseas Bank","brand:wikidata":"Q2003611","brand:wikipedia":"en:Indian Overseas Bank",name:"Indian Overseas Bank"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Interbank":{name:"Interbank",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FInterbank%20Logo.jpg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q2835558",amenity:"bank"},addTags:{amenity:"bank",brand:"Interbank","brand:wikidata":"Q2835558","brand:wikipedia":"es:Banco Interbank",name:"Interbank"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Intesa Sanpaolo":{name:"Intesa Sanpaolo",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FLogo%20Sanpaolo.gif&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q1343118",amenity:"bank"},addTags:{amenity:"bank",brand:"Intesa Sanpaolo","brand:wikidata":"Q1343118","brand:wikipedia":"it:Intesa Sanpaolo",name:"Intesa Sanpaolo"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Itaú":{name:"Itaú",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FItau.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q2423252",amenity:"bank"},addTags:{amenity:"bank",brand:"Itaú","brand:wikidata":"Q2423252","brand:wikipedia":"en:Itaú Corpbanca",name:"Itaú"},terms:["banco itaú"],matchScore:2,suggestion:true},"amenity/bank/JS Bank":{name:"JS Bank",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FJS%20Bank%20-%20New%20logo%202011%20-%20Copy.png&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q6108986",amenity:"bank"},addTags:{amenity:"bank",brand:"JS Bank","brand:wikidata":"Q6108986","brand:wikipedia":"en:JS Bank",name:"JS Bank"},countryCodes:["pk"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Janata Bank Limited জনতা ব্যাংক লিমিটেড":{name:"Janata Bank Limited জনতা ব্যাংক লিমিটেড",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q3347028",amenity:"bank"},addTags:{amenity:"bank",brand:"Janata Bank Limited জনতা ব্যাংক লিমিটেড","brand:wikidata":"Q3347028","brand:wikipedia":"en:Janata Bank",name:"Janata Bank Limited জনতা ব্যাংক লিমিটেড"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Jyske Bank":{name:"Jyske Bank",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/1062308131567517702/0I4wgGmc_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q136672",amenity:"bank"},addTags:{amenity:"bank",brand:"Jyske Bank","brand:wikidata":"Q136672","brand:wikipedia":"en:Jyske Bank",name:"Jyske Bank"},countryCodes:["dk"],terms:[],matchScore:2,suggestion:true},"amenity/bank/K&H Bank":{name:"K&H Bank",icon:"maki-bank",imageURL:"https://graph.facebook.com/dontsokosan/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6393834",amenity:"bank"},addTags:{amenity:"bank",brand:"K&H Bank","brand:wikidata":"Q6393834","brand:wikipedia":"en:K&H Bank",name:"K&H Bank"},countryCodes:["hu"],terms:[],matchScore:2,suggestion:true},"amenity/bank/KBC":{name:"KBC",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q941020",amenity:"bank"},addTags:{amenity:"bank",brand:"KBC","brand:wikidata":"Q941020","brand:wikipedia":"en:KBC Bank",name:"KBC"},terms:[],matchScore:2,suggestion:true},"amenity/bank/KBZ Bank":{name:"KBZ Bank",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q6360949",amenity:"bank"},addTags:{amenity:"bank",brand:"KBZ Bank","brand:wikidata":"Q6360949","brand:wikipedia":"en:Kanbawza Bank",name:"KBZ Bank"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Karnataka Bank":{name:"Karnataka Bank",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q2042632",amenity:"bank"},addTags:{amenity:"bank",brand:"Karnataka Bank","brand:wikidata":"Q2042632","brand:wikipedia":"en:Karnataka Bank",name:"Karnataka Bank"},countryCodes:["in"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Kasa Stefczyka":{name:"Kasa Stefczyka",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q57624461",amenity:"bank"},addTags:{amenity:"bank",brand:"Kasa Stefczyka","brand:wikidata":"Q57624461",name:"Kasa Stefczyka"},countryCodes:["pl"],terms:[],matchScore:2,suggestion:true},"amenity/bank/KeyBank":{name:"KeyBank",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FKeyBank.png&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q1740314",amenity:"bank"},addTags:{amenity:"bank",brand:"KeyBank","brand:wikidata":"Q1740314","brand:wikipedia":"en:KeyBank",name:"KeyBank"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Komerční banka":{name:"Komerční banka",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FKomer%C4%8Dn%C3%AD%20banka%20logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q1541079",amenity:"bank"},addTags:{amenity:"bank",brand:"Komerční banka","brand:wikidata":"Q1541079","brand:wikipedia":"en:Komerční banka",name:"Komerční banka"},countryCodes:["cz"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Kotak Mahindra Bank":{name:"Kotak Mahindra Bank",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q2040404",amenity:"bank"},addTags:{amenity:"bank",brand:"Kotak Mahindra Bank","brand:wikidata":"Q2040404","brand:wikipedia":"en:Kotak Mahindra Bank",name:"Kotak Mahindra Bank"},countryCodes:["in"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Kutxabank":{name:"Kutxabank",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FKutxabank.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q5139377",amenity:"bank"},addTags:{amenity:"bank",brand:"Kutxabank","brand:wikidata":"Q5139377","brand:wikipedia":"en:Kutxabank",name:"Kutxabank"},countryCodes:["es"],terms:[],matchScore:2,suggestion:true},"amenity/bank/LCL":{name:"LCL",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/899663758662017024/JLvGAjAM_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q779722",amenity:"bank"},addTags:{amenity:"bank",brand:"LCL","brand:wikidata":"Q779722","brand:wikipedia":"en:Crédit Lyonnais",name:"LCL"},terms:[],matchScore:2,suggestion:true},"amenity/bank/La Banque Postale":{name:"La Banque Postale",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/877443340551282689/fZlNq46c_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q3206431",amenity:"bank"},addTags:{amenity:"bank",brand:"La Banque Postale","brand:wikidata":"Q3206431","brand:wikipedia":"en:La Banque postale",name:"La Banque Postale"},terms:[],matchScore:2,suggestion:true},"amenity/bank/La Caixa":{name:"La Caixa",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FFundaci%C3%B3n%20bancaria%20la%20caixa.jpg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q287753",amenity:"bank"},addTags:{amenity:"bank",brand:"La Caixa","brand:wikidata":"Q287753","brand:wikipedia":"en:La Caixa",name:"La Caixa"},countryCodes:["es"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Laboral Kutxa":{name:"Laboral Kutxa",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FLogo%20Laboral%20Kutxa.JPG&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q12052386",amenity:"bank"},addTags:{amenity:"bank",brand:"Laboral Kutxa","brand:wikidata":"Q12052386","brand:wikipedia":"en:Laboral Kutxa",name:"Laboral Kutxa"},countryCodes:["es"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Landbank":{name:"Landbank",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q6483872",amenity:"bank"},addTags:{amenity:"bank",brand:"Landbank","brand:wikidata":"Q6483872","brand:wikipedia":"en:Land Bank of the Philippines",name:"Landbank"},countryCodes:["ph"],terms:["bangko sa lupa ng pilipinas","land bank of the philippines","lbp"],matchScore:2,suggestion:true},"amenity/bank/Leeds Building Society":{name:"Leeds Building Society",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/882560751629742082/qQgEeneD_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q6515848",amenity:"bank"},addTags:{amenity:"bank",brand:"Leeds Building Society","brand:wikidata":"Q6515848","brand:wikipedia":"en:Leeds Building Society",name:"Leeds Building Society"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Liberbank":{name:"Liberbank",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FLogo%20Liberbank.png&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q2891018",amenity:"bank"},addTags:{amenity:"bank",brand:"Liberbank","brand:wikidata":"Q2891018","brand:wikipedia":"en:Liberbank",name:"Liberbank"},countryCodes:["es"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Lloyds Bank":{name:"Lloyds Bank",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q1152847",amenity:"bank"},addTags:{amenity:"bank",brand:"Lloyds Bank","brand:wikidata":"Q1152847","brand:wikipedia":"en:Lloyds Bank",name:"Lloyds Bank"},terms:["lloyds","lloyds tsb"],matchScore:2,suggestion:true},"amenity/bank/M&T Bank":{name:"M&T Bank",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/1096422949081341953/zTOinsUb_bigger.png",geometry:["point","area"],tags:{"brand:wikidata":"Q3272257",amenity:"bank"},addTags:{amenity:"bank",brand:"M&T Bank","brand:wikidata":"Q3272257","brand:wikipedia":"en:M&T Bank",name:"M&T Bank"},terms:[],matchScore:2,suggestion:true},"amenity/bank/MCB":{name:"MCB",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q15982510",amenity:"bank"},addTags:{amenity:"bank",brand:"MCB","brand:wikidata":"Q15982510","brand:wikipedia":"ur:ایم سی بی بینک لمیٹڈ",name:"MCB"},terms:["mcb bank"],matchScore:2,suggestion:true},"amenity/bank/MONETA Money Bank":{name:"MONETA Money Bank",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FLogo%20Moneta%20Money%20Bank.png&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q24282966",amenity:"bank"},addTags:{amenity:"bank",brand:"MONETA Money Bank","brand:wikidata":"Q24282966","brand:wikipedia":"cs:Moneta Money Bank",name:"MONETA Money Bank"},countryCodes:["cz"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Macro":{name:"Macro",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FLogo%20Banco%20Macro.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q2335199",amenity:"bank"},addTags:{amenity:"bank",brand:"Macro","brand:wikidata":"Q2335199","brand:wikipedia":"en:Banco Macro",name:"Macro"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Maybank":{name:"Maybank",icon:"maki-bank",imageURL:"https://graph.facebook.com/Maybank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1364018",amenity:"bank"},addTags:{amenity:"bank",brand:"Maybank","brand:wikidata":"Q1364018","brand:wikipedia":"en:Maybank",name:"Maybank"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Meezan Bank":{name:"Meezan Bank",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q6807934",amenity:"bank"},addTags:{amenity:"bank",brand:"Meezan Bank","brand:wikidata":"Q6807934","brand:wikipedia":"en:Meezan Bank",name:"Meezan Bank"},countryCodes:["pk"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Mercantil":{name:"Mercantil",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q6818004",amenity:"bank"},addTags:{amenity:"bank",brand:"Mercantil","brand:wikidata":"Q6818004","brand:wikipedia":"en:Mercantil Servicios Financieros",name:"Mercantil"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Mibanco":{name:"Mibanco",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q5558589",amenity:"bank"},addTags:{amenity:"bank",brand:"Mibanco","brand:wikidata":"Q5558589","brand:wikipedia":"es:MiBanco",name:"Mibanco"},countryCodes:["pe"],terms:[],matchScore:2,suggestion:true},"amenity/bank/MidFirst Bank":{name:"MidFirst Bank",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q17081131",amenity:"bank"},addTags:{amenity:"bank",brand:"MidFirst Bank","brand:wikidata":"Q17081131","brand:wikipedia":"en:MidFirst Bank",name:"MidFirst Bank"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Millennium Bank":{name:"Millennium Bank",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/684026097688817664/fg1i7QVc_bigger.png",geometry:["point","area"],tags:{"brand:wikidata":"Q4855947",amenity:"bank"},addTags:{amenity:"bank",brand:"Millennium Bank","brand:wikidata":"Q4855947","brand:wikipedia":"pl:Bank Millennium",name:"Millennium Bank"},countryCodes:["pl"],terms:["bank millennium"],matchScore:2,suggestion:true},"amenity/bank/Millennium bcp":{name:"Millennium bcp",icon:"maki-bank",imageURL:"https://graph.facebook.com/MaisMillennium/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q118581",amenity:"bank"},addTags:{amenity:"bank",brand:"Millennium bcp","brand:wikidata":"Q118581","brand:wikipedia":"pt:Banco Comercial Português",name:"Millennium bcp",official_name:"Banco Comercial Português","official_name:en":"Portuguese Commercial Bank","official_name:es":"Banco Comercial Português"},countryCodes:["pt"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Monte dei Paschi di Siena":{name:"Monte dei Paschi di Siena",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q46730",amenity:"bank"},addTags:{amenity:"bank",brand:"Monte dei Paschi di Siena","brand:wikidata":"Q46730","brand:wikipedia":"en:Banca Monte dei Paschi di Siena",name:"Monte dei Paschi di Siena"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Montepio":{name:"Montepio",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q1946091",amenity:"bank"},addTags:{amenity:"bank",brand:"Montepio","brand:wikidata":"Q1946091","brand:wikipedia":"en:Montepio (bank)",name:"Montepio"},terms:[],matchScore:2,suggestion:true},"amenity/bank/NAB":{name:"NAB",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q1430985",amenity:"bank"},addTags:{amenity:"bank",brand:"NAB","brand:wikidata":"Q1430985","brand:wikipedia":"en:National Australia Bank",name:"NAB"},terms:[],matchScore:2,suggestion:true},"amenity/bank/NSB":{name:"NSB",icon:"maki-bank",imageURL:"https://graph.facebook.com/NSBSLOfficial/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q12500189",amenity:"bank"},addTags:{amenity:"bank",brand:"NSB","brand:wikidata":"Q12500189","brand:wikipedia":"en:National Savings Bank (Sri Lanka)",name:"NSB"},countryCodes:["lk"],terms:["national savings bank"],matchScore:2,suggestion:true},"amenity/bank/NatWest":{name:"NatWest",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/1130392887198453761/-d8gnvTW_bigger.png",geometry:["point","area"],tags:{"brand:wikidata":"Q2740021",amenity:"bank"},addTags:{amenity:"bank",brand:"NatWest","brand:wikidata":"Q2740021","brand:wikipedia":"en:NatWest",name:"NatWest"},terms:[],matchScore:2,suggestion:true},"amenity/bank/National Bank":{name:"National Bank",icon:"maki-bank",imageURL:"https://graph.facebook.com/banquenationale/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q634298",amenity:"bank"},addTags:{amenity:"bank",brand:"National Bank","brand:wikidata":"Q634298","brand:wikipedia":"en:National Bank of Canada",name:"National Bank",official_name:"National Bank of Canada"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Nationwide":{name:"Nationwide",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/770597713893285888/ItnmL0YM_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q846735",amenity:"bank"},addTags:{amenity:"bank",brand:"Nationwide","brand:wikidata":"Q846735","brand:wikipedia":"en:Nationwide Building Society",name:"Nationwide"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Navy Federal Credit Union":{name:"Navy Federal Credit Union",icon:"maki-bank",imageURL:"https://graph.facebook.com/NavyFederal/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6982632",amenity:"bank"},addTags:{amenity:"bank",brand:"Navy Federal Credit Union","brand:wikidata":"Q6982632","brand:wikipedia":"en:Navy Federal Credit Union",name:"Navy Federal Credit Union"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Nedbank":{name:"Nedbank",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q2751701",amenity:"bank"},addTags:{amenity:"bank",brand:"Nedbank","brand:wikidata":"Q2751701","brand:wikipedia":"en:Nedbank",name:"Nedbank"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Nordea":{name:"Nordea",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FNordea%20logo16.png&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q1123823",amenity:"bank"},addTags:{amenity:"bank",brand:"Nordea","brand:wikidata":"Q1123823","brand:wikipedia":"en:Nordea",name:"Nordea"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Novo Banco":{name:"Novo Banco",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FLogotipo%20Novo%20Banco.png&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q17488861",amenity:"bank"},addTags:{amenity:"bank",brand:"Novo Banco","brand:wikidata":"Q17488861","brand:wikipedia":"en:Novo Banco",name:"Novo Banco"},terms:[],matchScore:2,suggestion:true},"amenity/bank/OLB":{name:"OLB",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FOldenburgische%20landesbank%20logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q879591",amenity:"bank"},addTags:{amenity:"bank",brand:"OLB","brand:wikidata":"Q879591","brand:wikipedia":"en:Oldenburgische Landesbank",name:"OLB"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"amenity/bank/OTP":{name:"OTP",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FOtp%20bank%20Logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q912778",amenity:"bank"},addTags:{amenity:"bank",brand:"OTP","brand:wikidata":"Q912778","brand:wikipedia":"en:OTP Bank",name:"OTP"},terms:["otp bank"],matchScore:2,suggestion:true},"amenity/bank/Oberbank":{name:"Oberbank",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FOberbank%20Logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q2009139",amenity:"bank"},addTags:{amenity:"bank",brand:"Oberbank","brand:wikidata":"Q2009139","brand:wikipedia":"de:Oberbank",name:"Oberbank"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Occidental de Descuento":{name:"Occidental de Descuento",icon:"maki-bank",imageURL:"https://graph.facebook.com/BODOficial/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4854108",amenity:"bank"},addTags:{amenity:"bank",brand:"Occidental de Descuento","brand:wikidata":"Q4854108","brand:wikipedia":"en:Banco Occidental de Descuento",name:"Occidental de Descuento"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Oldenburgische Landesbank":{name:"Oldenburgische Landesbank",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FOldenburgische%20landesbank%20logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q879591",amenity:"bank"},addTags:{amenity:"bank",brand:"Oldenburgische Landesbank","brand:wikidata":"Q879591","brand:wikipedia":"en:Oldenburgische Landesbank",name:"Oldenburgische Landesbank"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"amenity/bank/One Network Bank":{name:"One Network Bank",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q7093019",amenity:"bank"},addTags:{amenity:"bank",brand:"One Network Bank","brand:wikidata":"Q7093019","brand:wikipedia":"en:One Network Bank",name:"One Network Bank",operator:"Banco de Oro","operator:wikidata":"Q4854129","operator:wikipedia":"en:Banco de Oro"},countryCodes:["ph"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Oriental Bank of Commerce":{name:"Oriental Bank of Commerce",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q367008",amenity:"bank"},addTags:{amenity:"bank",brand:"Oriental Bank of Commerce","brand:wikidata":"Q367008","brand:wikipedia":"en:Oriental Bank of Commerce",name:"Oriental Bank of Commerce"},countryCodes:["in"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Osuuspankki":{name:"Osuuspankki",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FOP%20Financial%20Group.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q4045597",amenity:"bank"},addTags:{amenity:"bank",brand:"Osuuspankki","brand:wikidata":"Q4045597","brand:wikipedia":"fi:OP (finanssiryhmä)",name:"Osuuspankki"},countryCodes:["fi"],terms:[],matchScore:2,suggestion:true},"amenity/bank/PBZ":{name:"PBZ",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q7246343",amenity:"bank"},addTags:{amenity:"bank",brand:"PBZ","brand:wikidata":"Q7246343","brand:wikipedia":"en:Privredna banka Zagreb",name:"PBZ"},terms:[],matchScore:2,suggestion:true},"amenity/bank/PKO BP":{name:"PKO BP",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FLogotyp%20PKO%20BP.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q578832",amenity:"bank"},addTags:{amenity:"bank",brand:"PKO BP","brand:wikidata":"Q578832","brand:wikipedia":"pl:Powszechna Kasa Oszczędności Bank Polski",name:"PKO BP"},countryCodes:["pl"],terms:["pko bank polski"],matchScore:2,suggestion:true},"amenity/bank/PNB":{name:"PNB",icon:"maki-bank",imageURL:"https://graph.facebook.com/PNBph/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1657971",amenity:"bank"},addTags:{amenity:"bank",brand:"PNB","brand:wikidata":"Q1657971","brand:wikipedia":"en:Philippine National Bank",name:"PNB",official_name:"Philippine National Bank"},countryCodes:["ph"],terms:["philippine national bank"],matchScore:2,suggestion:true},"amenity/bank/PNC Bank":{name:"PNC Bank",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q38928",amenity:"bank"},addTags:{amenity:"bank",brand:"PNC Bank","brand:wikidata":"Q38928","brand:wikipedia":"en:PNC Financial Services",name:"PNC Bank"},terms:["pnc"],matchScore:2,suggestion:true},"amenity/bank/PSBank":{name:"PSBank",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q7185203",amenity:"bank"},addTags:{amenity:"bank",brand:"PSBank","brand:wikidata":"Q7185203","brand:wikipedia":"en:Philippine Savings Bank",name:"PSBank"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Panin Bank":{name:"Panin Bank",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q12502751",amenity:"bank"},addTags:{amenity:"bank",brand:"Panin Bank","brand:wikidata":"Q12502751","brand:wikipedia":"id:Panin Bank",name:"Panin Bank"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Patagonia":{name:"Patagonia",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FLogo%20Banco%20Patagonia.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q2882078",amenity:"bank"},addTags:{amenity:"bank",brand:"Patagonia","brand:wikidata":"Q2882078","brand:wikipedia":"en:Banco Patagonia",name:"Patagonia"},countryCodes:["ar"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Pekao SA":{name:"Pekao SA",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FBank%20Pekao%20SA%20Logo%20(2017).svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q806642",amenity:"bank"},addTags:{amenity:"bank",brand:"Pekao SA","brand:wikidata":"Q806642","brand:wikipedia":"pl:Bank Polska Kasa Opieki",name:"Pekao SA"},countryCodes:["pl"],terms:[],matchScore:2,suggestion:true},"amenity/bank/People's United Bank":{name:"People's United Bank",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q7165802",amenity:"bank"},addTags:{amenity:"bank",brand:"People's United Bank","brand:wikidata":"Q7165802","brand:wikipedia":"en:People's United Financial",name:"People's United Bank"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Peoples Bank":{name:"Peoples Bank",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q7166050",amenity:"bank"},addTags:{amenity:"bank",brand:"Peoples Bank","brand:wikidata":"Q7166050","brand:wikipedia":"en:Peoples Bank",name:"Peoples Bank"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Piraeus Bank":{name:"Piraeus Bank",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q3312",amenity:"bank"},addTags:{amenity:"bank",brand:"Piraeus Bank","brand:wikidata":"Q3312","brand:wikipedia":"en:Piraeus Bank",name:"Piraeus Bank"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Postbank (Bulgaria)":{name:"Postbank (Bulgaria)",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q7234083",amenity:"bank"},addTags:{amenity:"bank",brand:"Postbank","brand:wikidata":"Q7234083","brand:wikipedia":"en:Bulgarian Postbank",name:"Postbank"},countryCodes:["bg"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Postbank (Germany)":{name:"Postbank (Germany)",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FPostbank-Logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q708835",amenity:"bank"},addTags:{amenity:"bank",brand:"Postbank","brand:wikidata":"Q708835","brand:wikipedia":"en:Deutsche Postbank",name:"Postbank"},countryCodes:["de"],terms:["postbank finanzcenter"],matchScore:2,suggestion:true},"amenity/bank/Prima banka":{name:"Prima banka",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q13538661",amenity:"bank"},addTags:{amenity:"bank",brand:"Prima banka","brand:wikidata":"Q13538661","brand:wikipedia":"sk:Prima banka Slovensko",name:"Prima banka"},countryCodes:["sk"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Provincial":{name:"Provincial",icon:"maki-bank",imageURL:"https://graph.facebook.com/bbvaprovincial/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4835087",amenity:"bank"},addTags:{amenity:"bank",brand:"Provincial","brand:wikidata":"Q4835087","brand:wikipedia":"es:BBVA Provincial",name:"Provincial"},countryCodes:["ve"],terms:["bbva provincial"],matchScore:2,suggestion:true},"amenity/bank/Public Bank (Malaysia)":{name:"Public Bank (Malaysia)",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q3046561",amenity:"bank"},addTags:{amenity:"bank",brand:"Public Bank","brand:wikidata":"Q3046561","brand:wikipedia":"en:Public Bank Berhad",name:"Public Bank"},terms:["public bank berhad"],matchScore:2,suggestion:true},"amenity/bank/Punjab National Bank":{name:"Punjab National Bank",icon:"maki-bank",imageURL:"https://graph.facebook.com/pnbindia/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2743499",amenity:"bank"},addTags:{amenity:"bank",brand:"Punjab National Bank","brand:wikidata":"Q2743499","brand:wikipedia":"en:Punjab National Bank",name:"Punjab National Bank"},countryCodes:["in"],terms:[],matchScore:2,suggestion:true},"amenity/bank/RBC":{name:"RBC",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q735261",amenity:"bank"},addTags:{amenity:"bank",brand:"RBC","brand:wikidata":"Q735261","brand:wikipedia":"en:Royal Bank of Canada",name:"RBC",official_name:"Royal Bank of Canada"},terms:["rbc financial group","rbc royal bank","royal bank","royal bank of canada"],matchScore:2,suggestion:true},"amenity/bank/RBS":{name:"RBS",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/1130393457191727105/wuHZFFaL_bigger.png",geometry:["point","area"],tags:{"brand:wikidata":"Q160126",amenity:"bank"},addTags:{amenity:"bank",brand:"RBS","brand:wikidata":"Q160126","brand:wikipedia":"en:Royal Bank of Scotland",name:"RBS",official_name:"Royal Bank of Scotland"},terms:["royal bank of scotland"],matchScore:2,suggestion:true},"amenity/bank/RCBC":{name:"RCBC",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q7339070",amenity:"bank"},addTags:{amenity:"bank",brand:"RCBC","brand:wikidata":"Q7339070","brand:wikipedia":"en:Rizal Commercial Banking Corporation",name:"RCBC",official_name:"Rizal Commercial Banking Corporation"},countryCodes:["ph"],terms:["rcbc savings bank"],matchScore:2,suggestion:true},"amenity/bank/Rabobank":{name:"Rabobank",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q252004",amenity:"bank"},addTags:{amenity:"bank",brand:"Rabobank","brand:wikidata":"Q252004","brand:wikipedia":"en:Rabobank",name:"Rabobank"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Raiffeisen Polbank":{name:"Raiffeisen Polbank",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q9303218",amenity:"bank"},addTags:{amenity:"bank",brand:"Raiffeisen Polbank","brand:wikidata":"Q9303218","brand:wikipedia":"pl:Raiffeisen Bank Polska",name:"Raiffeisen Polbank"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Regions Bank":{name:"Regions Bank",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FRegions-Financial-Logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q917131",amenity:"bank"},addTags:{amenity:"bank",brand:"Regions Bank","brand:wikidata":"Q917131","brand:wikipedia":"en:Regions Financial Corporation",name:"Regions Bank"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Republic Bank":{name:"Republic Bank",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FLogo%20of%20Republic%20Bank%20of%20Trinidad%20and%20Tobago.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q7314386",amenity:"bank"},addTags:{amenity:"bank",brand:"Republic Bank","brand:wikidata":"Q7314386","brand:wikipedia":"en:Republic Bank",name:"Republic Bank"},terms:[],matchScore:2,suggestion:true},"amenity/bank/SEB":{name:"SEB",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FSEB%20logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q975655",amenity:"bank"},addTags:{amenity:"bank",brand:"SEB","brand:wikidata":"Q975655","brand:wikipedia":"en:SEB Group",name:"SEB"},terms:[],matchScore:2,suggestion:true},"amenity/bank/SGBCI":{name:"SGBCI",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q3488360",amenity:"bank"},addTags:{amenity:"bank",brand:"SGBCI","brand:wikidata":"Q3488360","brand:wikipedia":"fr:Société générale de banques en Côte d'Ivoire",name:"SGBCI"},countryCodes:["ci"],terms:["agence sgbci"],matchScore:2,suggestion:true},"amenity/bank/SNS Bank":{name:"SNS Bank",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q1857899",amenity:"bank"},addTags:{amenity:"bank",brand:"SNS Bank","brand:wikidata":"Q1857899","brand:wikipedia":"en:De Volksbank",name:"SNS Bank"},countryCodes:["nl"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Sampath Bank":{name:"Sampath Bank",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q7410095",amenity:"bank"},addTags:{amenity:"bank",brand:"Sampath Bank","brand:wikidata":"Q7410095","brand:wikipedia":"en:Sampath Bank",name:"Sampath Bank"},countryCodes:["lk"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Santander":{name:"Santander",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/977265312969232384/7W4a261r_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q5835668",amenity:"bank"},addTags:{amenity:"bank",brand:"Santander","brand:wikidata":"Q5835668","brand:wikipedia":"en:Santander Bank",name:"Santander"},terms:["santander consumer bank"],matchScore:2,suggestion:true},"amenity/bank/Santander Río":{name:"Santander Río",icon:"maki-bank",imageURL:"https://graph.facebook.com/SantanderRio/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3385268",amenity:"bank"},addTags:{amenity:"bank",brand:"Santander Río","brand:wikidata":"Q3385268","brand:wikipedia":"es:Banco Santander Río",name:"Santander Río"},countryCodes:["ar"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Santander Totta":{name:"Santander Totta",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FBanco%20Santander%20Logotipo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q4854116",amenity:"bank"},addTags:{amenity:"bank",brand:"Santander Totta","brand:wikidata":"Q4854116","brand:wikipedia":"pt:Banco Santander Portugal",name:"Santander Totta"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Sberbank":{name:"Sberbank",icon:"maki-bank",imageURL:"https://graph.facebook.com/sberbank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q205012",amenity:"bank"},addTags:{amenity:"bank",brand:"Sberbank","brand:wikidata":"Q205012","brand:wikipedia":"en:Sberbank of Russia",name:"Sberbank"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Scotiabank":{name:"Scotiabank",icon:"maki-bank",imageURL:"https://graph.facebook.com/scotiabank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q451476",amenity:"bank"},addTags:{amenity:"bank",brand:"Scotiabank","brand:wikidata":"Q451476","brand:wikipedia":"en:Scotiabank",name:"Scotiabank"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Security Bank":{name:"Security Bank",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FThe%20Security%20Bank%20Logo%201.jpg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q7444945",amenity:"bank"},addTags:{amenity:"bank",brand:"Security Bank","brand:wikidata":"Q7444945","brand:wikipedia":"en:Security Bank",name:"Security Bank"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Seylan Bank":{name:"Seylan Bank",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q3532083",amenity:"bank"},addTags:{amenity:"bank",brand:"Seylan Bank","brand:wikidata":"Q3532083","brand:wikipedia":"en:Seylan Bank",name:"Seylan Bank"},countryCodes:["lk"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Siam Commercial Bank":{name:"Siam Commercial Bank",icon:"maki-bank",imageURL:"https://graph.facebook.com/scb.thailand/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2038986",amenity:"bank"},addTags:{amenity:"bank",brand:"Siam Commercial Bank","brand:wikidata":"Q2038986","brand:wikipedia":"en:Siam Commercial Bank",name:"Siam Commercial Bank"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Sicoob":{name:"Sicoob",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q28679754",amenity:"bank"},addTags:{amenity:"bank",brand:"Sicoob","brand:wikidata":"Q28679754","brand:wikipedia":"pt:Sistema de Cooperativas de Crédito do Brasil",name:"Sicoob"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Sicredi":{name:"Sicredi",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q3483060",amenity:"bank"},addTags:{amenity:"bank",brand:"Sicredi","brand:wikidata":"Q3483060","brand:wikipedia":"pt:Sistema de Crédito Cooperativo",name:"Sicredi"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Simmons Bank":{name:"Simmons Bank",icon:"maki-bank",imageURL:"https://graph.facebook.com/simmonsbank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q28402389",amenity:"bank"},addTags:{amenity:"bank",brand:"Simmons Bank","brand:wikidata":"Q28402389","brand:wikipedia":"en:Simmons Bank",name:"Simmons Bank"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Slovenská sporiteľňa":{name:"Slovenská sporiteľňa",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q7541907",amenity:"bank"},addTags:{amenity:"bank",brand:"Slovenská sporiteľňa","brand:wikidata":"Q7541907","brand:wikipedia":"en:Slovenská sporiteľňa",name:"Slovenská sporiteľňa"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Société Générale":{name:"Société Générale",icon:"maki-bank",imageURL:"https://graph.facebook.com/societegenerale/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q270363",amenity:"bank"},addTags:{amenity:"bank",brand:"Société Générale","brand:wikidata":"Q270363","brand:wikipedia":"en:Société Générale",name:"Société Générale"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Sonali Bank":{name:"Sonali Bank",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FSonali%20Bank%20logo.JPG&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q3350382",amenity:"bank"},addTags:{amenity:"bank",brand:"Sonali Bank","brand:wikidata":"Q3350382","brand:wikipedia":"en:Sonali Bank",name:"Sonali Bank"},terms:["sonali bank limited","sonali bank limited সোনালী ব্যাংক লিমিটেড"],matchScore:2,suggestion:true},"amenity/bank/South Indian Bank":{name:"South Indian Bank",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q2044973",amenity:"bank"},addTags:{amenity:"bank",brand:"South Indian Bank","brand:wikidata":"Q2044973","brand:wikipedia":"en:South Indian Bank",name:"South Indian Bank"},countryCodes:["in"],terms:[],matchScore:2,suggestion:true},"amenity/bank/South State Bank":{name:"South State Bank",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q55633597",amenity:"bank"},addTags:{amenity:"bank",brand:"South State Bank","brand:wikidata":"Q55633597","brand:wikipedia":"en:South State Bank",name:"South State Bank"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Sparda-Bank":{name:"Sparda-Bank",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FSparda%20Bank%202003%20logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q2307136",amenity:"bank"},addTags:{amenity:"bank",brand:"Sparda-Bank","brand:wikidata":"Q2307136","brand:wikipedia":"en:Sparda-Bank",name:"Sparda-Bank"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Stanbic Bank":{name:"Stanbic Bank",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q7597999",amenity:"bank"},addTags:{amenity:"bank",brand:"Stanbic Bank","brand:wikidata":"Q7597999","brand:wikipedia":"en:Stanbic Bank",name:"Stanbic Bank"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Standard Bank":{name:"Standard Bank",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q1576610",amenity:"bank"},addTags:{amenity:"bank",brand:"Standard Bank","brand:wikidata":"Q1576610","brand:wikipedia":"en:Standard Bank",name:"Standard Bank"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Standard Chartered":{name:"Standard Chartered",icon:"maki-bank",imageURL:"https://graph.facebook.com/StandardChartered/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q548278",amenity:"bank"},addTags:{amenity:"bank",brand:"Standard Chartered","brand:wikidata":"Q548278","brand:wikipedia":"en:Standard Chartered",name:"Standard Chartered"},terms:["standard chartered bank"],matchScore:2,suggestion:true},"amenity/bank/State Bank of India":{name:"State Bank of India",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FState-Bank-of-India-Logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q1340361",amenity:"bank"},addTags:{amenity:"bank",brand:"State Bank of India","brand:wikidata":"Q1340361","brand:wikipedia":"en:State Bank of India",name:"State Bank of India"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Summit Bank":{name:"Summit Bank",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q7637775",amenity:"bank"},addTags:{amenity:"bank",brand:"Summit Bank","brand:wikidata":"Q7637775","brand:wikipedia":"en:Summit Bank",name:"Summit Bank"},terms:[],matchScore:2,suggestion:true},"amenity/bank/SunTrust":{name:"SunTrust",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FSunTrust%20Banks%20logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q181507",amenity:"bank"},addTags:{amenity:"bank",brand:"SunTrust","brand:wikidata":"Q181507","brand:wikipedia":"en:SunTrust Banks",name:"SunTrust"},countryCodes:["us"],terms:["suntrust bank"],matchScore:2,suggestion:true},"amenity/bank/Supervielle":{name:"Supervielle",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FSupervielle%20logo14.png&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q5718035",amenity:"bank"},addTags:{amenity:"bank",brand:"Supervielle","brand:wikidata":"Q5718035","brand:wikipedia":"es:Banco Supervielle",name:"Supervielle"},countryCodes:["ar"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Swedbank":{name:"Swedbank",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FSwedbank%20skylt.JPG&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q1145493",amenity:"bank"},addTags:{amenity:"bank",brand:"Swedbank","brand:wikidata":"Q1145493","brand:wikipedia":"en:Swedbank",name:"Swedbank"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Syndicate Bank":{name:"Syndicate Bank",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q2004088",amenity:"bank"},addTags:{amenity:"bank",brand:"Syndicate Bank","brand:wikidata":"Q2004088","brand:wikipedia":"en:Syndicate Bank",name:"Syndicate Bank"},terms:[],matchScore:2,suggestion:true},"amenity/bank/TCF Bank":{name:"TCF Bank",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q7669687",amenity:"bank"},addTags:{amenity:"bank",brand:"TCF Bank","brand:wikidata":"Q7669687","brand:wikipedia":"en:TCF Bank",name:"TCF Bank"},terms:[],matchScore:2,suggestion:true},"amenity/bank/TD Bank":{name:"TD Bank",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q7669891",amenity:"bank"},addTags:{amenity:"bank",brand:"TD Bank","brand:wikidata":"Q7669891","brand:wikipedia":"en:TD Bank, N.A.",name:"TD Bank"},terms:[],matchScore:2,suggestion:true},"amenity/bank/TD Canada Trust":{name:"TD Canada Trust",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FToronto-Dominion%20Bank%20logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q1080670",amenity:"bank"},addTags:{amenity:"bank",brand:"TD Canada Trust","brand:wikidata":"Q1080670","brand:wikipedia":"en:TD Canada Trust",name:"TD Canada Trust"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"amenity/bank/TEB":{name:"TEB",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q7862447",amenity:"bank"},addTags:{amenity:"bank",brand:"TEB","brand:wikidata":"Q7862447","brand:wikipedia":"en:Türk Ekonomi Bankası",name:"TEB"},terms:[],matchScore:2,suggestion:true},"amenity/bank/TSB":{name:"TSB",icon:"maki-bank",imageURL:"https://graph.facebook.com/TSBbankUK/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7671560",amenity:"bank"},addTags:{amenity:"bank",brand:"TSB","brand:wikidata":"Q7671560","brand:wikipedia":"en:TSB Bank (United Kingdom)",name:"TSB"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Takarékszövetkezet":{name:"Takarékszövetkezet",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q30324674",amenity:"bank"},addTags:{amenity:"bank",brand:"Takarékszövetkezet","brand:wikidata":"Q30324674","brand:wikipedia":"en:TakarékBank",name:"Takarékszövetkezet"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Targobank":{name:"Targobank",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FTargobank%20logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q1455437",amenity:"bank"},addTags:{amenity:"bank",brand:"Targobank","brand:wikidata":"Q1455437","brand:wikipedia":"en:Targobank",name:"Targobank"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Tatra banka":{name:"Tatra banka",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FTatra%20banka%20logo.jpg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q1718069",amenity:"bank"},addTags:{amenity:"bank",brand:"Tatra banka","brand:wikidata":"Q1718069","brand:wikipedia":"en:Tatra banka",name:"Tatra banka"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Türkiye İş Bankası":{name:"Türkiye İş Bankası",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FT%C3%BCrkiye%20%C4%B0%C5%9F%20Bankas%C4%B1%20logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q909613",amenity:"bank"},addTags:{amenity:"bank",brand:"Türkiye İş Bankası","brand:wikidata":"Q909613","brand:wikipedia":"en:Türkiye İş Bankası",name:"Türkiye İş Bankası"},terms:[],matchScore:2,suggestion:true},"amenity/bank/UBA":{name:"UBA",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q513457",amenity:"bank"},addTags:{amenity:"bank",brand:"UBA","brand:wikidata":"Q513457","brand:wikipedia":"en:United Bank for Africa",name:"UBA"},terms:[],matchScore:2,suggestion:true},"amenity/bank/UBI Banca":{name:"UBI Banca",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q1476162",amenity:"bank"},addTags:{amenity:"bank",brand:"UBI Banca","brand:wikidata":"Q1476162","brand:wikipedia":"en:UBI Banca",name:"UBI Banca"},terms:[],matchScore:2,suggestion:true},"amenity/bank/UBL":{name:"UBL",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q7887504",amenity:"bank"},addTags:{amenity:"bank",brand:"UBL","brand:en":"United Bank Limited Pakistan","brand:wikidata":"Q7887504","brand:wikipedia":"ur:یونائیٹڈ بینک (پاکستان)",name:"UBL","name:en":"United Bank Limited Pakistan"},countryCodes:["pk"],terms:["ubl bank"],matchScore:2,suggestion:true},"amenity/bank/UBS":{name:"UBS",icon:"maki-bank",imageURL:"https://graph.facebook.com/UBSglobal/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q193199",amenity:"bank"},addTags:{amenity:"bank",brand:"UBS","brand:wikidata":"Q193199","brand:wikipedia":"en:UBS",name:"UBS"},terms:[],matchScore:2,suggestion:true},"amenity/bank/UCO Bank":{name:"UCO Bank",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q2005310",amenity:"bank"},addTags:{amenity:"bank",brand:"UCO Bank","brand:wikidata":"Q2005310","brand:wikipedia":"en:UCO Bank",name:"UCO Bank"},terms:[],matchScore:2,suggestion:true},"amenity/bank/UCPB":{name:"UCPB",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FUCPB%20logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q7887615",amenity:"bank"},addTags:{amenity:"bank",brand:"UCPB","brand:wikidata":"Q7887615","brand:wikipedia":"en:United Coconut Planters Bank",name:"UCPB"},countryCodes:["ph"],terms:[],matchScore:2,suggestion:true},"amenity/bank/UOB":{name:"UOB",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FUOB%20Logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q2064074",amenity:"bank"},addTags:{amenity:"bank",brand:"UOB","brand:wikidata":"Q2064074","brand:wikipedia":"en:United Overseas Bank",name:"UOB"},terms:[],matchScore:2,suggestion:true},"amenity/bank/US Bank":{name:"US Bank",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FU.S.%20Bancorp%20logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q739084",amenity:"bank"},addTags:{amenity:"bank",brand:"US Bank","brand:wikidata":"Q739084","brand:wikipedia":"en:U.S. Bancorp",name:"US Bank"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Ulster Bank":{name:"Ulster Bank",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q2613366",amenity:"bank"},addTags:{amenity:"bank",brand:"Ulster Bank","brand:wikidata":"Q2613366","brand:wikipedia":"en:Ulster Bank",name:"Ulster Bank"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Umpqua Bank":{name:"Umpqua Bank",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q7881772",amenity:"bank"},addTags:{amenity:"bank",brand:"Umpqua Bank","brand:wikidata":"Q7881772","brand:wikipedia":"en:Umpqua Holdings Corporation",name:"Umpqua Bank"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/bank/UniCredit Bank":{name:"UniCredit Bank",icon:"maki-bank",imageURL:"https://graph.facebook.com/UniCreditItalia/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q45568",amenity:"bank"},addTags:{amenity:"bank",brand:"UniCredit Bank","brand:wikidata":"Q45568","brand:wikipedia":"en:UniCredit",name:"UniCredit Bank"},terms:["unicredit","unicredit banca"],matchScore:2,suggestion:true},"amenity/bank/Unicaja Banco":{name:"Unicaja Banco",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q2543704",amenity:"bank"},addTags:{amenity:"bank",brand:"Unicaja Banco","brand:wikidata":"Q2543704","brand:wikipedia":"en:Unicaja",name:"Unicaja Banco"},countryCodes:["es"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Union Bank of India":{name:"Union Bank of India",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FUnion%20Bank%20of%20India%20Logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q2004078",amenity:"bank"},addTags:{amenity:"bank",brand:"Union Bank of India","brand:wikidata":"Q2004078","brand:wikipedia":"en:Union Bank of India",name:"Union Bank of India"},countryCodes:["in"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Union Bank (USA)":{name:"Union Bank (USA)",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q1442804",amenity:"bank"},addTags:{alt_name:"UnionBank",amenity:"bank",brand:"Union Bank","brand:wikidata":"Q1442804","brand:wikipedia":"en:MUFG Union Bank",name:"Union Bank"},countryCodes:["us"],terms:["mufg union bank","union bank of california"],matchScore:2,suggestion:true},"amenity/bank/UnionBank (Philippines)":{name:"UnionBank (Philippines)",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FUnionBankPH.png&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q7885403",amenity:"bank"},addTags:{amenity:"bank",brand:"UnionBank","brand:wikidata":"Q7885403","brand:wikipedia":"en:Union Bank of the Philippines",name:"UnionBank"},countryCodes:["ph"],terms:["union bank of the philippines"],matchScore:2,suggestion:true},"amenity/bank/Vakıfbank":{name:"Vakıfbank",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/1116607604568940545/27IKknhk_bigger.png",geometry:["point","area"],tags:{"brand:wikidata":"Q1148521",amenity:"bank"},addTags:{amenity:"bank",brand:"Vakıfbank","brand:wikidata":"Q1148521","brand:wikipedia":"en:VakıfBank",name:"Vakıfbank"},countryCodes:["tr"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Veneto Banca":{name:"Veneto Banca",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q3127221",amenity:"bank"},addTags:{amenity:"bank",brand:"Veneto Banca","brand:wikidata":"Q3127221","brand:wikipedia":"en:Veneto Banca",name:"Veneto Banca"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Vijaya Bank":{name:"Vijaya Bank",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q2003171",amenity:"bank"},addTags:{amenity:"bank",brand:"Vijaya Bank","brand:wikidata":"Q2003171","brand:wikipedia":"en:Vijaya Bank",name:"Vijaya Bank"},countryCodes:["in"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Volksbank":{name:"Volksbank",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FLogo%20of%20German%20Volksbanken%20Raiffeisenbanken.png&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q695110",amenity:"bank"},addTags:{amenity:"bank",brand:"Volksbank","brand:wikidata":"Q695110","brand:wikipedia":"en:Volksbank",name:"Volksbank"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Volksbank Köln Bonn eG":{name:"Volksbank Köln Bonn eG",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q41680844",amenity:"bank"},addTags:{amenity:"bank",brand:"Volksbank Köln Bonn eG","brand:wikidata":"Q41680844","brand:wikipedia":"de:Volksbank Köln Bonn",name:"Volksbank",official_name:"Volksbank Köln Bonn eG"},terms:[],matchScore:2,suggestion:true},"amenity/bank/VÚB":{name:"VÚB",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FVUB.png&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q12778981",amenity:"bank"},addTags:{amenity:"bank",brand:"VÚB","brand:wikidata":"Q12778981","brand:wikipedia":"en:Všeobecná úverová banka",name:"VÚB"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Washington Federal":{name:"Washington Federal",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FWashington%20Federal%20Logo.png&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q7971859",amenity:"bank"},addTags:{amenity:"bank",brand:"Washington Federal","brand:wikidata":"Q7971859","brand:wikipedia":"en:Washington Federal",name:"Washington Federal"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Wells Fargo":{name:"Wells Fargo",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/1088877344624758784/OH8VFkEY_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q744149",amenity:"bank"},addTags:{amenity:"bank",brand:"Wells Fargo","brand:wikidata":"Q744149","brand:wikipedia":"en:Wells Fargo",name:"Wells Fargo"},terms:["wells fargo bank"],matchScore:2,suggestion:true},"amenity/bank/Western Union":{name:"Western Union",icon:"maki-bank",imageURL:"https://graph.facebook.com/WesternUnion/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q861042",amenity:"bank"},addTags:{amenity:"bank",brand:"Western Union","brand:wikidata":"Q861042","brand:wikipedia":"en:Western Union",name:"Western Union"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Westpac":{name:"Westpac",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FWestpac%20logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q2031726",amenity:"bank"},addTags:{amenity:"bank",brand:"Westpac","brand:wikidata":"Q2031726","brand:wikipedia":"en:Westpac",name:"Westpac"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Yapı Kredi":{name:"Yapı Kredi",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q8049138",amenity:"bank"},addTags:{amenity:"bank",brand:"Yapı Kredi","brand:wikidata":"Q8049138","brand:wikipedia":"en:Yapı ve Kredi Bankası",name:"Yapı Kredi"},countryCodes:["tr"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Yorkshire Bank":{name:"Yorkshire Bank",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/875682560315097088/YOR4LIIO_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q8055678",amenity:"bank"},addTags:{amenity:"bank",brand:"Yorkshire Bank","brand:wikidata":"Q8055678","brand:wikipedia":"en:Yorkshire Bank",name:"Yorkshire Bank"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Yorkshire Building Society":{name:"Yorkshire Building Society",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q12073381",amenity:"bank"},addTags:{amenity:"bank",brand:"Yorkshire Building Society","brand:wikidata":"Q12073381","brand:wikipedia":"en:Yorkshire Building Society",name:"Yorkshire Building Society"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Zagrebačka banka":{name:"Zagrebačka banka",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FZagreba%C4%8Dka-banka-Logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q140381",amenity:"bank"},addTags:{amenity:"bank",brand:"Zagrebačka banka","brand:wikidata":"Q140381","brand:wikipedia":"en:Zagrebačka banka",name:"Zagrebačka banka"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Zenith Bank":{name:"Zenith Bank",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/880350862647980032/mvRee-i3_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q5978240",amenity:"bank"},addTags:{amenity:"bank",brand:"Zenith Bank","brand:wikidata":"Q5978240","brand:wikipedia":"en:Zenith Bank",name:"Zenith Bank"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Ziraat Bankası":{name:"Ziraat Bankası",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FZiraat%20Bankas%C4%B1%20logo.png&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q696003",amenity:"bank"},addTags:{amenity:"bank",brand:"Ziraat Bankası","brand:wikidata":"Q696003","brand:wikipedia":"en:Ziraat Bankası",name:"Ziraat Bankası"},terms:[],matchScore:2,suggestion:true},"amenity/bank/mBank":{name:"mBank",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FMbank-logo.jpg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q1160928",amenity:"bank"},addTags:{amenity:"bank",brand:"mBank","brand:wikidata":"Q1160928","brand:wikipedia":"en:MBank",name:"mBank"},terms:[],matchScore:2,suggestion:true},"amenity/bank/ČSOB":{name:"ČSOB",icon:"maki-bank",imageURL:"https://graph.facebook.com/csob/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q340135",amenity:"bank"},addTags:{amenity:"bank",brand:"ČSOB","brand:wikidata":"Q340135","brand:wikipedia":"en:Československá obchodní banka",name:"ČSOB"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Česká spořitelna":{name:"Česká spořitelna",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FCeska%20Sporitelna.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q341100",amenity:"bank"},addTags:{amenity:"bank",brand:"Česká spořitelna","brand:wikidata":"Q341100","brand:wikipedia":"en:Česká spořitelna",name:"Česká spořitelna"},countryCodes:["cz"],terms:[],matchScore:2,suggestion:true},"amenity/bank/İş Bankası":{name:"İş Bankası",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FT%C3%BCrkiye%20%C4%B0%C5%9F%20Bankas%C4%B1%20logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q909613",amenity:"bank"},addTags:{amenity:"bank",brand:"İş Bankası","brand:wikidata":"Q909613","brand:wikipedia":"en:Türkiye İş Bankası",name:"İş Bankası"},countryCodes:["tr"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Εθνική Τράπεζα":{name:"Εθνική Τράπεζα",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q1816028",amenity:"bank"},addTags:{amenity:"bank",brand:"Εθνική Τράπεζα","brand:el":"Εθνική Τράπεζα","brand:en":"National Bank of Greece","brand:wikidata":"Q1816028","brand:wikipedia":"en:National Bank of Greece",name:"Εθνική Τράπεζα","name:el":"Εθνική Τράπεζα","name:en":"National Bank of Greece"},countryCodes:["gr"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Τράπεζα Πειραιώς":{name:"Τράπεζα Πειραιώς",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q3312",amenity:"bank"},addTags:{amenity:"bank",brand:"Τράπεζα Πειραιώς","brand:el":"Τράπεζα Πειραιώς","brand:en":"Piraeus Bank","brand:wikidata":"Q3312","brand:wikipedia":"en:Piraeus Bank",name:"Τράπεζα Πειραιώς","name:el":"Τράπεζα Πειραιώς","name:en":"Piraeus Bank"},countryCodes:["gr"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Авангард":{name:"Авангард",icon:"maki-bank",imageURL:"https://graph.facebook.com/bankavangard/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62122617",amenity:"bank"},addTags:{amenity:"bank",brand:"Авангард","brand:wikidata":"Q62122617",name:"Авангард"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Альфа-Банк":{name:"Альфа-Банк",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/1126053531507621888/L60raYv6_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q1377835",amenity:"bank"},addTags:{amenity:"bank",brand:"Альфа-Банк","brand:en":"Alfa-Bank","brand:ru":"Альфа-Банк","brand:wikidata":"Q1377835","brand:wikipedia":"ru:Альфа-банк",name:"Альфа-Банк","name:en":"Alfa-Bank","name:ru":"Альфа-Банк"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Банка ДСК":{name:"Банка ДСК",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q5206146",amenity:"bank"},addTags:{amenity:"bank",brand:"Банка ДСК","brand:bg":"Банка ДСК","brand:en":"DSK Bank","brand:wikidata":"Q5206146","brand:wikipedia":"en:DSK Bank",name:"Банка ДСК","name:bg":"Банка ДСК","name:en":"DSK Bank"},countryCodes:["bg"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Белагропромбанк":{name:"Белагропромбанк",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q1991373",amenity:"bank"},addTags:{amenity:"bank",brand:"Белагропромбанк","brand:en":"Belagroprom Bank","brand:wikidata":"Q1991373","brand:wikipedia":"be:Белаграпрамбанк",name:"Белагропромбанк","name:en":"Belagroprom Bank"},countryCodes:["by"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Беларусбанк":{name:"Беларусбанк",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q1997334",amenity:"bank"},addTags:{amenity:"bank",brand:"Беларусбанк","brand:en":"Belarusbank","brand:wikidata":"Q1997334","brand:wikipedia":"en:Belarusbank",name:"Беларусбанк","name:en":"Belarusbank"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Белинвестбанк":{name:"Белинвестбанк",icon:"maki-bank",imageURL:"https://graph.facebook.com/belinvestbank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4081940",amenity:"bank"},addTags:{amenity:"bank",brand:"Белинвестбанк","brand:wikidata":"Q4081940","brand:wikipedia":"ru:Белинвестбанк",name:"Белинвестбанк"},countryCodes:["by"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Бинбанк":{name:"Бинбанк",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q4086829",amenity:"bank"},addTags:{amenity:"bank",brand:"Бинбанк","brand:en":"B&N Bank","brand:wikidata":"Q4086829","brand:wikipedia":"en:B&N Bank",name:"Бинбанк","name:en":"B&N Bank"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"amenity/bank/ВТБ":{name:"ВТБ",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/1054295031916453888/lvi_M_Cc_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q1549389",amenity:"bank"},addTags:{amenity:"bank",brand:"ВТБ","brand:en":"VTB Bank","brand:wikidata":"Q1549389","brand:wikipedia":"en:VTB Bank",name:"ВТБ","name:en":"VTB Bank"},terms:["втб банк москвы"],matchScore:2,suggestion:true},"amenity/bank/Возрождение":{name:"Возрождение",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q4114952",amenity:"bank"},addTags:{amenity:"bank",brand:"Возрождение","brand:wikidata":"Q4114952","brand:wikipedia":"ru:Возрождение (банк)",name:"Возрождение"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Газпромбанк":{name:"Газпромбанк",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FGazprombank.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q1924338",amenity:"bank"},addTags:{amenity:"bank",brand:"Газпромбанк","brand:en":"Gazprombank","brand:wikidata":"Q1924338","brand:wikipedia":"en:Gazprombank",name:"Газпромбанк","name:en":"Gazprombank"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Генбанк":{name:"Генбанк",icon:"maki-bank",imageURL:"https://graph.facebook.com/GENBANK.Crimea/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62122630",amenity:"bank"},addTags:{amenity:"bank",brand:"Генбанк","brand:wikidata":"Q62122630",name:"Генбанк"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Казкоммерцбанк":{name:"Казкоммерцбанк",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FQazkom%20Logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q1168179",amenity:"bank"},addTags:{amenity:"bank",brand:"Казкоммерцбанк","brand:en":"Kazkommertsbank","brand:wikidata":"Q1168179","brand:wikipedia":"en:Kazkommertsbank",name:"Казкоммерцбанк","name:en":"Kazkommertsbank"},countryCodes:["kz"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Московский индустриальный банк":{name:"Московский индустриальный банк",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q4304145",amenity:"bank"},addTags:{amenity:"bank",brand:"Московский индустриальный банк","brand:en":"Moscow Industrial Bank","brand:wikidata":"Q4304145","brand:wikipedia":"ru:Московский индустриальный банк",name:"Московский индустриальный банк","name:en":"Moscow Industrial Bank"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Мособлбанк":{name:"Мособлбанк",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q4304446",amenity:"bank"},addTags:{amenity:"bank",brand:"Мособлбанк","brand:en":"Mosobl Bank","brand:wikidata":"Q4304446","brand:wikipedia":"ru:Мособлбанк",name:"Мособлбанк","name:en":"Mosobl Bank"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Народный банк":{name:"Народный банк",icon:"maki-bank",imageURL:"https://graph.facebook.com/halykbank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1046186",amenity:"bank"},addTags:{amenity:"bank",brand:"Народный банк","brand:wikidata":"Q1046186","brand:wikipedia":"kk:Қазақстан Халық банкі",name:"Народный банк"},countryCodes:["kg","kz","uz"],terms:[],matchScore:2,suggestion:true},"amenity/bank/ОТП Банк":{name:"ОТП Банк",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FOtp%20bank%20Logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q912778",amenity:"bank"},addTags:{amenity:"bank",brand:"ОТП Банк","brand:en":"OTP Bank","brand:wikidata":"Q912778","brand:wikipedia":"en:OTP Bank",name:"ОТП Банк","name:en":"OTP Bank"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Обединена Българска Банка":{name:"Обединена Българска Банка",icon:"maki-bank",imageURL:"https://graph.facebook.com/UnitedBulgarianBank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7887555",amenity:"bank"},addTags:{amenity:"bank",brand:"Обединена Българска Банка","brand:en":"United Bulgarian Bank","brand:wikidata":"Q7887555","brand:wikipedia":"en:United Bulgarian Bank",name:"Обединена Българска Банка","name:en":"United Bulgarian Bank"},countryCodes:["bg"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Открытие":{name:"Открытие",icon:"maki-bank",imageURL:"https://graph.facebook.com/otkritie/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4327204",amenity:"bank"},addTags:{amenity:"bank",brand:"Открытие","brand:wikidata":"Q4327204","brand:wikipedia":"ru:Банк «Финансовая корпорация Открытие»",name:"Открытие"},countryCodes:["ru"],terms:["банк открытие"],matchScore:2,suggestion:true},"amenity/bank/Ощадбанк":{name:"Ощадбанк",icon:"maki-bank",imageURL:"https://graph.facebook.com/oschadbank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4340839",amenity:"bank"},addTags:{amenity:"bank",brand:"Ощадбанк","brand:en":"State Savings Bank of Ukraine","brand:wikidata":"Q4340839","brand:wikipedia":"uk:Ощадбанк",name:"Ощадбанк","name:en":"State Savings Bank of Ukraine"},countryCodes:["ua"],terms:[],matchScore:2,suggestion:true},"amenity/bank/ПУМБ":{name:"ПУМБ",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FFUIB%20eng%20300.jpg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q4341156",amenity:"bank"},addTags:{amenity:"bank",brand:"ПУМБ","brand:en":"First Ukrainian International Bank","brand:wikidata":"Q4341156","brand:wikipedia":"en:First Ukrainian International Bank",name:"ПУМБ","name:en":"First Ukrainian International Bank"},countryCodes:["ua"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Почта Банк":{name:"Почта Банк",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q24930461",amenity:"bank"},addTags:{amenity:"bank",brand:"Почта Банк","brand:en":"Post Bank","brand:wikidata":"Q24930461","brand:wikipedia":"en:Post Bank (Russia)",name:"Почта Банк","name:en":"Post Bank"},terms:[],matchScore:2,suggestion:true},"amenity/bank/ПриватБанк":{name:"ПриватБанк",icon:"maki-bank",imageURL:"https://graph.facebook.com/privatbank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1515015",amenity:"bank"},addTags:{amenity:"bank",brand:"ПриватБанк","brand:en":"PrivatBank","brand:wikidata":"Q1515015","brand:wikipedia":"uk:ПриватБанк",name:"ПриватБанк","name:en":"PrivatBank"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Приорбанк":{name:"Приорбанк",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q3919658",amenity:"bank"},addTags:{amenity:"bank",brand:"Приорбанк","brand:en":"PriorBank","brand:wikidata":"Q3919658","brand:wikipedia":"be:Пріорбанк",name:"Приорбанк","name:en":"PriorBank"},countryCodes:["by"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Промсвязьбанк":{name:"Промсвязьбанк",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2F%D0%9F%D1%80%D0%BE%D0%BC%D1%81%D0%B2%D1%8F%D0%B7%D1%8C%D0%B1%D0%B0%D0%BD%D0%BA%20logo%20NEW%202008.jpg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q649100",amenity:"bank"},addTags:{amenity:"bank",brand:"Промсвязьбанк","brand:en":"Promsvyazbank","brand:wikidata":"Q649100","brand:wikipedia":"en:Promsvyazbank",name:"Промсвязьбанк","name:en":"Promsvyazbank"},terms:[],matchScore:2,suggestion:true},"amenity/bank/РНКБ":{name:"РНКБ",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q16912944",amenity:"bank"},addTags:{amenity:"bank",brand:"РНКБ","brand:wikidata":"Q16912944","brand:wikipedia":"en:Russian National Commercial Bank",name:"РНКБ"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Райффайзен":{name:"Райффайзен",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q4389244",amenity:"bank"},addTags:{amenity:"bank",brand:"Райффайзен","brand:en":"Raiffeisenbank","brand:wikidata":"Q4389244","brand:wikipedia":"en:Raiffeisenbank (Russia)",name:"Райффайзен","name:en":"Raiffeisenbank"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Райффайзен Банк Аваль":{name:"Райффайзен Банк Аваль",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2F%D0%A0%D0%B0%D0%B9%D1%84%D1%84%D0%B0%D0%B9%D0%B7%D0%B5%D0%BD%20%D0%B1%D0%B0%D0%BD%D0%BA%20%D0%90%D0%B2%D0%B0%D0%BB%D1%8C%20(%D0%BB%D0%BE%D0%B3%D0%BE%D1%82%D0%B8%D0%BF).gif&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q4389243",amenity:"bank"},addTags:{amenity:"bank",brand:"Райффайзен Банк Аваль","brand:en":"Raiffeisen Bank Aval","brand:wikidata":"Q4389243","brand:wikipedia":"en:Raiffeisen Bank Aval",name:"Райффайзен Банк Аваль","name:en":"Raiffeisen Bank Aval"},countryCodes:["ua"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Росбанк":{name:"Росбанк",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FRosbank%20logo%20en.jpg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q1119857",amenity:"bank"},addTags:{amenity:"bank",brand:"Росбанк","brand:en":"Rosbank","brand:wikidata":"Q1119857","brand:wikipedia":"en:Rosbank",name:"Росбанк","name:en":"Rosbank"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Россельхозбанк":{name:"Россельхозбанк",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q3920226",amenity:"bank"},addTags:{amenity:"bank",brand:"Россельхозбанк","brand:en":"Rosselkhozbank","brand:wikidata":"Q3920226","brand:wikipedia":"en:Russian Agricultural Bank",name:"Россельхозбанк","name:en":"Rosselkhozbank"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Русский Стандарт":{name:"Русский Стандарт",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q4400854",amenity:"bank"},addTags:{amenity:"bank",brand:"Русский Стандарт","brand:en":"Russian Standard Bank","brand:wikidata":"Q4400854","brand:wikipedia":"en:Russian Standard Bank",name:"Русский Стандарт","name:en":"Russian Standard Bank"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Сбербанк":{name:"Сбербанк",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q4378147",amenity:"bank"},addTags:{amenity:"bank",brand:"Сбербанк","brand:en":"Prisbank","brand:wikidata":"Q4378147","brand:wikipedia":"ru:Приднестровский Сбербанк",name:"Сбербанк","name:en":"Prisbank"},terms:["приднестровский сбербанк","сбербанк россии"],matchScore:2,suggestion:true},"amenity/bank/Совкомбанк":{name:"Совкомбанк",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q4426566",amenity:"bank"},addTags:{amenity:"bank",brand:"Совкомбанк","brand:en":"Sovcom Bank","brand:wikidata":"Q4426566","brand:wikipedia":"ru:Совкомбанк",name:"Совкомбанк","name:en":"Sovcom Bank"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"amenity/bank/УкрСиббанк":{name:"УкрСиббанк",icon:"maki-bank",imageURL:"https://graph.facebook.com/UKRSIBBANK/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1976290",amenity:"bank"},addTags:{amenity:"bank",brand:"УкрСиббанк","brand:en":"UkrSibbank","brand:wikidata":"Q1976290","brand:wikipedia":"en:UkrSibbank",name:"УкрСиббанк","name:en":"UkrSibbank"},countryCodes:["ua"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Укргазбанк":{name:"Укргазбанк",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FUkrgasbank%20logo.png&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q4470692",amenity:"bank"},addTags:{amenity:"bank",brand:"Укргазбанк","brand:en":"Ukrgasbank","brand:wikidata":"Q4470692","brand:wikipedia":"ru:Укргазбанк",name:"Укргазбанк","name:en":"Ukrgasbank"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Укрсоцбанк":{name:"Укрсоцбанк",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q3547885",amenity:"bank"},addTags:{amenity:"bank",brand:"Укрсоцбанк","brand:en":"Ukrsotsbank","brand:wikidata":"Q3547885","brand:wikipedia":"en:Ukrsotsbank",name:"Укрсоцбанк","name:en":"Ukrsotsbank"},countryCodes:["ua"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Уралсиб":{name:"Уралсиб",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q4476693",amenity:"bank"},addTags:{amenity:"bank",brand:"Уралсиб","brand:en":"Uralsib bank","brand:wikidata":"Q4476693","brand:wikipedia":"ru:Уралсиб (банк)",name:"Уралсиб","name:en":"Uralsib bank"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Хаан банк":{name:"Хаан банк",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q25632240",amenity:"bank"},addTags:{amenity:"bank",brand:"Хаан банк","brand:wikidata":"Q25632240","brand:wikipedia":"mn:ХААН банк",name:"Хаан банк"},countryCodes:["mn"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Хоум Кредит":{name:"Хоум Кредит",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q4500466",amenity:"bank"},addTags:{amenity:"bank",brand:"Хоум Кредит","brand:en":"Home Credit & Finance Bank","brand:wikidata":"Q4500466","brand:wikipedia":"en:Home Credit & Finance Bank",name:"Хоум Кредит","name:en":"Home Credit & Finance Bank"},terms:[],matchScore:2,suggestion:true},"amenity/bank/בנק הפועלים":{name:"בנק הפועלים",icon:"maki-bank",imageURL:"https://graph.facebook.com/BankHapoalimSocial/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2666775",amenity:"bank"},addTags:{amenity:"bank",brand:"בנק הפועלים","brand:en":"Bank Hapoalim","brand:he":"בנק הפועלים","brand:wikidata":"Q2666775","brand:wikipedia":"en:Bank Hapoalim",name:"בנק הפועלים","name:en":"Bank Hapoalim","name:he":"בנק הפועלים"},countryCodes:["il"],terms:[],matchScore:2,suggestion:true},"amenity/bank/בנק לאומי":{name:"בנק לאומי",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q806641",amenity:"bank"},addTags:{amenity:"bank",brand:"בנק לאומי","brand:en":"Bank Leumi","brand:he":"בנק לאומי","brand:wikidata":"Q806641","brand:wikipedia":"en:Bank Leumi",name:"בנק לאומי","name:en":"Bank Leumi","name:he":"בנק לאומי"},countryCodes:["il"],terms:[],matchScore:2,suggestion:true},"amenity/bank/بانک آینده":{name:"بانک آینده",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q5938144",amenity:"bank"},addTags:{amenity:"bank",brand:"بانک آینده","brand:en":"Ayandeh Bank","brand:wikidata":"Q5938144","brand:wikipedia":"en:Ayandeh Bank",name:"بانک آینده","name:en":"Ayandeh Bank"},countryCodes:["ir"],terms:[],matchScore:2,suggestion:true},"amenity/bank/بانک اقتصاد نوین":{name:"بانک اقتصاد نوین",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q5323768",amenity:"bank"},addTags:{amenity:"bank",brand:"بانک اقتصاد نوین","brand:en":"EN Bank","brand:wikidata":"Q5323768","brand:wikipedia":"en:EN Bank",name:"بانک اقتصاد نوین","name:en":"EN Bank"},countryCodes:["ir"],terms:[],matchScore:2,suggestion:true},"amenity/bank/بانک انصار":{name:"بانک انصار",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q5862675",amenity:"bank"},addTags:{amenity:"bank",brand:"بانک انصار","brand:wikidata":"Q5862675","brand:wikipedia":"fa:بانک انصار",name:"بانک انصار"},countryCodes:["ir"],terms:[],matchScore:2,suggestion:true},"amenity/bank/بانک ایران زمین":{name:"بانک ایران زمین",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q5934423",amenity:"bank"},addTags:{amenity:"bank",brand:"بانک ایران زمین","brand:wikidata":"Q5934423","brand:wikipedia":"en:Iran Zamin Bank",name:"بانک ایران زمین"},countryCodes:["ir"],terms:[],matchScore:2,suggestion:true},"amenity/bank/بانک تجارت":{name:"بانک تجارت",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q7695198",amenity:"bank"},addTags:{amenity:"bank",brand:"بانک تجارت","brand:wikidata":"Q7695198","brand:wikipedia":"en:Tejarat Bank",name:"بانک تجارت"},countryCodes:["ir"],terms:[],matchScore:2,suggestion:true},"amenity/bank/بانک توسعه تعاون":{name:"بانک توسعه تعاون",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q5684450",amenity:"bank"},addTags:{amenity:"bank",brand:"بانک توسعه تعاون","brand:wikidata":"Q5684450","brand:wikipedia":"fa:بانک توسعه تعاون",name:"بانک توسعه تعاون"},countryCodes:["ir"],terms:[],matchScore:2,suggestion:true},"amenity/bank/بانک رفاه":{name:"بانک رفاه",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FRefah-Bank-Logo.png&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q7307083",amenity:"bank"},addTags:{amenity:"bank",brand:"بانک رفاه","brand:en":"Refah Bank","brand:wikidata":"Q7307083","brand:wikipedia":"en:Refah Bank",name:"بانک رفاه","name:en":"Refah Bank"},countryCodes:["ir"],terms:["بانک رفاه کارگران"],matchScore:2,suggestion:true},"amenity/bank/بانک سامان":{name:"بانک سامان",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q4117676",amenity:"bank"},addTags:{amenity:"bank",brand:"بانک سامان","brand:en":"Saman Bank","brand:wikidata":"Q4117676","brand:wikipedia":"en:Saman Bank",name:"بانک سامان","name:en":"Saman Bank"},countryCodes:["ir"],terms:[],matchScore:2,suggestion:true},"amenity/bank/بانک سرمایه":{name:"بانک سرمایه",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q7424291",amenity:"bank"},addTags:{amenity:"bank",brand:"بانک سرمایه","brand:en":"Sarmayeh Bank","brand:wikidata":"Q7424291","brand:wikipedia":"en:Sarmayeh Bank",name:"بانک سرمایه","name:en":"Sarmayeh Bank"},countryCodes:["ir"],terms:[],matchScore:2,suggestion:true},"amenity/bank/بانک سپه":{name:"بانک سپه",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q2882624",amenity:"bank"},addTags:{amenity:"bank",brand:"بانک سپه","brand:en":"Bank Sepah","brand:wikidata":"Q2882624","brand:wikipedia":"en:Bank Sepah",name:"بانک سپه","name:en":"Bank Sepah"},countryCodes:["ir"],terms:[],matchScore:2,suggestion:true},"amenity/bank/بانک سینا":{name:"بانک سینا",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q10860246",amenity:"bank"},addTags:{amenity:"bank",brand:"بانک سینا","brand:en":"Sina Bank","brand:wikidata":"Q10860246","brand:wikipedia":"en:Sina Bank",name:"بانک سینا","name:en":"Sina Bank"},countryCodes:["ir"],terms:[],matchScore:2,suggestion:true},"amenity/bank/بانک شهر":{name:"بانک شهر",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q5941033",amenity:"bank"},addTags:{amenity:"bank",brand:"بانک شهر","brand:en":"Shahr Bank","brand:wikidata":"Q5941033","brand:wikipedia":"fa:بانک شهر",name:"بانک شهر","name:en":"Shahr Bank"},countryCodes:["ir"],terms:[],matchScore:2,suggestion:true},"amenity/bank/بانک صادرات":{name:"بانک صادرات",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FBank%20Saderat%20Iran%20logo.png&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q2882608",amenity:"bank"},addTags:{amenity:"bank",brand:"بانک صادرات","brand:en":"Bank Saderat Iran","brand:wikidata":"Q2882608","brand:wikipedia":"en:Bank Saderat Iran",name:"بانک صادرات","name:en":"Bank Saderat Iran"},terms:["بانک صادرات ایران","صادرات"],matchScore:2,suggestion:true},"amenity/bank/بانک قوامین":{name:"بانک قوامین",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q10860253",amenity:"bank"},addTags:{amenity:"bank",brand:"بانک قوامین","brand:en":"Ghavamin Bank","brand:wikidata":"Q10860253","brand:wikipedia":"en:Ghavamin Bank",name:"بانک قوامین","name:en":"Ghavamin Bank"},countryCodes:["ir"],terms:[],matchScore:2,suggestion:true},"amenity/bank/بانک مسکن":{name:"بانک مسکن",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FBank%20maskan.jpg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q4855942",amenity:"bank"},addTags:{amenity:"bank",brand:"بانک مسکن","brand:en":"Bank Maskan","brand:wikidata":"Q4855942","brand:wikipedia":"en:Bank Maskan",name:"بانک مسکن","name:en":"Bank Maskan"},countryCodes:["ir"],terms:[],matchScore:2,suggestion:true},"amenity/bank/بانک ملت":{name:"بانک ملت",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q4855944",amenity:"bank"},addTags:{amenity:"bank",brand:"بانک ملت","brand:en":"Bank Mellat","brand:wikidata":"Q4855944","brand:wikipedia":"en:Bank Mellat",name:"بانک ملت","name:en":"Bank Mellat"},terms:[],matchScore:2,suggestion:true},"amenity/bank/بانک ملی":{name:"بانک ملی",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q806640",amenity:"bank"},addTags:{amenity:"bank",brand:"بانک ملی","brand:en":"Bank Melli Iran","brand:wikidata":"Q806640","brand:wikipedia":"en:Bank Melli Iran",name:"بانک ملی","name:en":"Bank Melli Iran"},countryCodes:["ir"],terms:["بانک ملی ایران","ملی"],matchScore:2,suggestion:true},"amenity/bank/بانک مهر اقتصاد":{name:"بانک مهر اقتصاد",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q5942921",amenity:"bank"},addTags:{amenity:"bank",brand:"بانک مهر اقتصاد","brand:wikidata":"Q5942921","brand:wikipedia":"fa:بانک مهر اقتصاد",name:"بانک مهر اقتصاد","name:en":"Mehr Eqtesad Bank"},countryCodes:["ir"],terms:[],matchScore:2,suggestion:true},"amenity/bank/بانک پارسیان":{name:"بانک پارسیان",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q2410404",amenity:"bank"},addTags:{amenity:"bank",brand:"بانک پارسیان","brand:en":"Parsian Bank","brand:wikidata":"Q2410404","brand:wikipedia":"en:Parsian Bank",name:"بانک پارسیان","name:en":"Parsian Bank"},countryCodes:["ir"],terms:[],matchScore:2,suggestion:true},"amenity/bank/بانک پاسارگاد":{name:"بانک پاسارگاد",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q4855962",amenity:"bank"},addTags:{amenity:"bank",brand:"بانک پاسارگاد","brand:en":"Bank Pasargad","brand:wikidata":"Q4855962","brand:wikipedia":"en:Bank Pasargad",name:"بانک پاسارگاد","name:en":"Bank Pasargad"},countryCodes:["ir"],terms:[],matchScore:2,suggestion:true},"amenity/bank/بانک کشاورزی":{name:"بانک کشاورزی",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q6395007",amenity:"bank"},addTags:{amenity:"bank",brand:"بانک کشاورزی","brand:en":"Bank Keshavarzi Iran","brand:wikidata":"Q6395007","brand:wikipedia":"en:Bank Keshavarzi Iran",name:"بانک کشاورزی","name:en":"Bank Keshavarzi Iran"},terms:[],matchScore:2,suggestion:true},"amenity/bank/پست بانک":{name:"پست بانک",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q7233625",amenity:"bank"},addTags:{amenity:"bank",brand:"پست بانک","brand:en":"Post Bank of Iran","brand:wikidata":"Q7233625","brand:wikipedia":"en:Post Bank of Iran",name:"پست بانک","name:en":"Post Bank of Iran"},countryCodes:["ir"],terms:[],matchScore:2,suggestion:true},"amenity/bank/ธนาคารกรุงเทพ":{name:"ธนาคารกรุงเทพ",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FLogo%20Bangkok%20Bank%20Public%20Company%20Limited.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q806483",amenity:"bank"},addTags:{amenity:"bank",brand:"ธนาคารกรุงเทพ","brand:en":"Bangkok Bank","brand:th":"ธนาคารกรุงเทพ","brand:wikidata":"Q806483","brand:wikipedia":"en:Bangkok Bank",name:"ธนาคารกรุงเทพ","name:en":"Bangkok Bank","name:th":"ธนาคารกรุงเทพ"},countryCodes:["th"],terms:[],matchScore:2,suggestion:true},"amenity/bank/ธนาคารกรุงไทย":{name:"ธนาคารกรุงไทย",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q962865",amenity:"bank"},addTags:{amenity:"bank",brand:"ธนาคารกรุงไทย","brand:en":"Krung Thai Bank","brand:th":"ธนาคารกรุงไทย","brand:wikidata":"Q962865","brand:wikipedia":"en:Krung Thai Bank",name:"ธนาคารกรุงไทย","name:en":"Krung Thai Bank","name:th":"ธนาคารกรุงไทย"},countryCodes:["th"],terms:[],matchScore:2,suggestion:true},"amenity/bank/ธนาคารกสิกรไทย":{name:"ธนาคารกสิกรไทย",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q276557",amenity:"bank"},addTags:{amenity:"bank",brand:"ธนาคารกสิกรไทย","brand:en":"en:Kasikornbank","brand:th":"ธนาคารกสิกรไทย","brand:wikidata":"Q276557","brand:wikipedia":"en:Kasikornbank",name:"ธนาคารกสิกรไทย","name:en":"en:Kasikornbank","name:th":"ธนาคารกสิกรไทย"},countryCodes:["th"],terms:[],matchScore:2,suggestion:true},"amenity/bank/ธนาคารออมสิน":{name:"ธนาคารออมสิน",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q6579041",amenity:"bank"},addTags:{amenity:"bank",brand:"ธนาคารออมสิน","brand:en":"Government Savings Bank","brand:th":"ธนาคารออมสิน","brand:wikidata":"Q6579041","brand:wikipedia":"en:Government Savings Bank (Thailand)",name:"ธนาคารออมสิน","name:en":"Government Savings Bank","name:th":"ธนาคารออมสิน"},countryCodes:["th"],terms:[],matchScore:2,suggestion:true},"amenity/bank/ธนาคารไทยพาณิชย์":{name:"ธนาคารไทยพาณิชย์",icon:"maki-bank",imageURL:"https://graph.facebook.com/scb.thailand/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2038986",amenity:"bank"},addTags:{amenity:"bank",brand:"ธนาคารไทยพาณิชย์","brand:en":"Siam Commercial Bank","brand:th":"ธนาคารไทยพาณิชย์","brand:wikidata":"Q2038986","brand:wikipedia":"en:Siam Commercial Bank",name:"ธนาคารไทยพาณิชย์","name:en":"Siam Commercial Bank","name:th":"ธนาคารไทยพาณิชย์"},countryCodes:["th"],terms:[],matchScore:2,suggestion:true},"amenity/bank/みずほ銀行":{name:"みずほ銀行",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/902036508672106496/L8rp7WY6_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q2882956",amenity:"bank"},addTags:{amenity:"bank",brand:"みずほ銀行","brand:en":"Mizuho Bank","brand:ja":"みずほ銀行","brand:wikidata":"Q2882956","brand:wikipedia":"en:Mizuho Bank",name:"みずほ銀行","name:en":"Mizuho Bank","name:ja":"みずほ銀行"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/bank/ゆうちょ銀行":{name:"ゆうちょ銀行",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FJapan%20Post%20Bank%20Logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q907103",amenity:"bank"},addTags:{amenity:"bank",brand:"ゆうちょ銀行","brand:en":"Japan Post Bank","brand:ja":"ゆうちょ銀行","brand:wikidata":"Q907103","brand:wikipedia":"ja:ゆうちょ銀行",name:"ゆうちょ銀行","name:en":"Japan Post Bank","name:ja":"ゆうちょ銀行"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/bank/りそな銀行":{name:"りそな銀行",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FResona%20Bank%20logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q11281447",amenity:"bank"},addTags:{amenity:"bank",brand:"りそな銀行","brand:en":"Resona Bank","brand:ja":"りそな銀行","brand:wikidata":"Q11281447","brand:wikipedia":"ja:りそな銀行",name:"りそな銀行","name:en":"Resona Bank","name:ja":"りそな銀行"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/bank/三井住友銀行":{name:"三井住友銀行",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FSumitomo%20Mitsui%20Banking%20Logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q2660418",amenity:"bank"},addTags:{amenity:"bank",brand:"三井住友銀行","brand:en":"Sumitomo Mitsui Banking Corporation","brand:wikidata":"Q2660418","brand:wikipedia":"en:Sumitomo Mitsui Banking Corporation",name:"三井住友銀行","name:en":"Sumitomo Mitsui Banking Corporation"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/bank/三菱東京UFJ銀行":{name:"三菱東京UFJ銀行",icon:"maki-bank",imageURL:"https://graph.facebook.com/bk.mufg.jp/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q988284",amenity:"bank"},addTags:{amenity:"bank",brand:"三菱東京UFJ銀行","brand:en":"MUFG Bank","brand:wikidata":"Q988284","brand:wikipedia":"en:MUFG Bank",name:"三菱東京UFJ銀行","name:en":"MUFG Bank"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/bank/上海商業儲蓄銀行":{name:"上海商業儲蓄銀行",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q4207208",amenity:"bank"},addTags:{amenity:"bank",brand:"上海商業儲蓄銀行","brand:en":"Shanghai Commercial and Savings Bank","brand:wikidata":"Q4207208","brand:wikipedia":"en:Shanghai Commercial and Savings Bank",name:"上海商業儲蓄銀行","name:en":"Shanghai Commercial and Savings Bank"},countryCodes:["tw"],terms:[],matchScore:2,suggestion:true},"amenity/bank/中信银行":{name:"中信银行",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q38960",amenity:"bank"},addTags:{amenity:"bank",brand:"中信银行","brand:en":"China CITIC Bank","brand:wikidata":"Q38960","brand:wikipedia":"en:China CITIC Bank",name:"中信银行"},countryCodes:["cn"],terms:[],matchScore:2,suggestion:true},"amenity/bank/中国农业银行":{name:"中国农业银行",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FAgricultural%20Bank%20of%20China%20logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q26298",amenity:"bank"},addTags:{amenity:"bank",brand:"中国农业银行","brand:en":"Agricultural Bank of China","brand:wikidata":"Q26298","brand:wikipedia":"en:Agricultural Bank of China",name:"中国农业银行","name:en":"Agricultural Bank of China"},terms:[],matchScore:2,suggestion:true},"amenity/bank/中国工商银行":{name:"中国工商银行",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FICBC%20logo.png&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q26463",amenity:"bank"},addTags:{amenity:"bank",brand:"中国工商银行","brand:en":"Industrial and Commercial Bank of China","brand:wikidata":"Q26463","brand:wikipedia":"en:Industrial and Commercial Bank of China",name:"中国工商银行","name:en":"Industrial and Commercial Bank of China"},terms:[],matchScore:2,suggestion:true},"amenity/bank/中国建设银行":{name:"中国建设银行",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FChina%20Construction%20Bank%20logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q26299",amenity:"bank"},addTags:{amenity:"bank",brand:"中国建设银行","brand:en":"China Construction Bank","brand:wikidata":"Q26299","brand:wikipedia":"en:China Construction Bank",name:"中国建设银行","name:en":"China Construction Bank"},countryCodes:["cn"],terms:[],matchScore:2,suggestion:true},"amenity/bank/中国邮政储蓄银行":{name:"中国邮政储蓄银行",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FPostal%20Savings%20Bank%20of%20China%20Logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q986744",amenity:"bank"},addTags:{amenity:"bank",brand:"中国邮政储蓄银行","brand:en":"Postal Savings Bank of China","brand:wikidata":"Q986744","brand:wikipedia":"en:Postal Savings Bank of China",name:"中国邮政储蓄银行","name:en":"Postal Savings Bank of China"},terms:[],matchScore:2,suggestion:true},"amenity/bank/中国银行":{name:"中国银行",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FChinese%20Bank%20of%20China.jpg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q790068",amenity:"bank"},addTags:{amenity:"bank",brand:"中国银行","brand:en":"Bank of China","brand:wikidata":"Q790068","brand:wikipedia":"en:Bank of China",name:"中国银行","name:en":"Bank of China"},terms:[],matchScore:2,suggestion:true},"amenity/bank/中國信託商業銀行":{name:"中國信託商業銀行",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q5100191",amenity:"bank"},addTags:{amenity:"bank",brand:"中國信託商業銀行","brand:en":"CTBC Bank","brand:wikidata":"Q5100191","brand:wikipedia":"en:CTBC Bank",name:"中國信託商業銀行","name:en":"CTBC Bank"},countryCodes:["tw"],terms:[],matchScore:2,suggestion:true},"amenity/bank/交通银行":{name:"交通银行",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FBank%20of%20Communications%20Logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q806680",amenity:"bank"},addTags:{amenity:"bank",brand:"交通银行","brand:en":"Bank of Communications","brand:wikidata":"Q806680","brand:wikipedia":"en:Bank of Communications",name:"交通银行","name:en":"Bank of Communications"},countryCodes:["cn"],terms:[],matchScore:2,suggestion:true},"amenity/bank/京城商業銀行":{name:"京城商業銀行",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q10883132",amenity:"bank"},addTags:{amenity:"bank",brand:"京城商業銀行","brand:wikidata":"Q10883132","brand:wikipedia":"zh:京城商業銀行",name:"京城商業銀行"},countryCodes:["tw"],terms:[],matchScore:2,suggestion:true},"amenity/bank/京都中央信用金庫":{name:"京都中央信用金庫",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q11374844",amenity:"bank"},addTags:{amenity:"bank",brand:"京都中央信用金庫","brand:en":"Kyoto Chuo Shinkin Bank","brand:wikidata":"Q11374844","brand:wikipedia":"jp:京都中央信用金庫",name:"京都中央信用金庫","name:en":"Kyoto Chuo Shinkin Bank"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/bank/京都銀行":{name:"京都銀行",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q11375713",amenity:"bank"},addTags:{amenity:"bank",brand:"京都銀行","brand:en":"Bank of Kyoto","brand:wikidata":"Q11375713","brand:wikipedia":"en:Bank of Kyoto",name:"京都銀行","name:en":"Bank of Kyoto"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/bank/元大商業銀行":{name:"元大商業銀行",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q10889602",amenity:"bank"},addTags:{amenity:"bank",brand:"元大商業銀行","brand:en":"Yuanta Commercial Bank","brand:wikidata":"Q10889602","brand:wikipedia":"zh:元大商業銀行",name:"元大商業銀行","name:en":"Yuanta Commercial Bank"},countryCodes:["tw"],terms:[],matchScore:2,suggestion:true},"amenity/bank/兆豐國際商業銀行":{name:"兆豐國際商業銀行",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q709757",amenity:"bank"},addTags:{amenity:"bank",brand:"兆豐國際商業銀行","brand:en":"Mega International Commercial Bank","brand:wikidata":"Q709757","brand:wikipedia":"en:Mega International Commercial Bank",name:"兆豐國際商業銀行","name:en":"Mega International Commercial Bank"},countryCodes:["tw"],terms:[],matchScore:2,suggestion:true},"amenity/bank/农业银行":{name:"农业银行",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FAgricultural%20Bank%20of%20China%20logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q26298",amenity:"bank"},addTags:{amenity:"bank",brand:"农业银行","brand:wikidata":"Q26298","brand:wikipedia":"zh:中国农业银行",name:"农业银行"},terms:[],matchScore:2,suggestion:true},"amenity/bank/北洋銀行":{name:"北洋銀行",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q11402354",amenity:"bank"},addTags:{amenity:"bank",brand:"北洋銀行","brand:en":"North Pacific Bank","brand:wikidata":"Q11402354","brand:wikipedia":"ja:北洋銀行",name:"北洋銀行","name:en":"North Pacific Bank"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/bank/北海道銀行":{name:"北海道銀行",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q5878076",amenity:"bank"},addTags:{amenity:"bank",brand:"北海道銀行","brand:en":"Hokkaido Bank","brand:wikidata":"Q5878076","brand:wikipedia":"en:Hokkaido Bank",name:"北海道銀行","name:en":"Hokkaido Bank"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/bank/台中商業銀行":{name:"台中商業銀行",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FTcbbank%20headoffice.JPG&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q6136958",amenity:"bank"},addTags:{amenity:"bank",brand:"台中商業銀行","brand:en":"Taichung Bank","brand:wikidata":"Q6136958","brand:wikipedia":"en:Taichung Bank",name:"台中商業銀行","name:en":"Taichung Bank"},countryCodes:["tw"],terms:[],matchScore:2,suggestion:true},"amenity/bank/台北富邦商業銀行":{name:"台北富邦商業銀行",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q697293",amenity:"bank"},addTags:{amenity:"bank",brand:"台北富邦商業銀行","brand:en":"Taipei Fubon Bank","brand:wikidata":"Q697293","brand:wikipedia":"en:Taipei Fubon Bank",name:"台北富邦商業銀行","name:en":"Taipei Fubon Bank"},countryCodes:["tw"],terms:[],matchScore:2,suggestion:true},"amenity/bank/台新國際商業銀行":{name:"台新國際商業銀行",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q7676420",amenity:"bank"},addTags:{amenity:"bank",brand:"台新國際商業銀行","brand:en":"Taishin International Bank","brand:wikidata":"Q7676420","brand:wikipedia":"en:Taishin International Bank",name:"台新國際商業銀行","name:en":"Taishin International Bank"},countryCodes:["tw"],terms:[],matchScore:2,suggestion:true},"amenity/bank/合作金庫商業銀行":{name:"合作金庫商業銀行",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FDepartment%20of%20Business%2C%20Taiwan%20Cooperative%20Bank%2020171216.jpg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q701540",amenity:"bank"},addTags:{amenity:"bank",brand:"合作金庫商業銀行","brand:en":"Taiwan Cooperative Bank","brand:wikidata":"Q701540","brand:wikipedia":"en:Taiwan Cooperative Bank",name:"合作金庫商業銀行","name:en":"Taiwan Cooperative Bank"},countryCodes:["tw"],terms:[],matchScore:2,suggestion:true},"amenity/bank/國泰世華商業銀行":{name:"國泰世華商業銀行",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q702656",amenity:"bank"},addTags:{amenity:"bank",brand:"國泰世華商業銀行","brand:en":"Cathay United Bank","brand:wikidata":"Q702656","brand:wikipedia":"en:Cathay United Bank",name:"國泰世華商業銀行","name:en":"Cathay United Bank"},countryCodes:["tw"],terms:[],matchScore:2,suggestion:true},"amenity/bank/大眾商業銀行":{name:"大眾商業銀行",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q10937047",amenity:"bank"},addTags:{amenity:"bank",brand:"大眾商業銀行","brand:en":"Ta Chong Commercial Bank","brand:wikidata":"Q10937047","brand:wikipedia":"zh:大眾商業銀行",name:"大眾商業銀行","name:en":"Ta Chong Commercial Bank"},countryCodes:["tw"],terms:[],matchScore:2,suggestion:true},"amenity/bank/安泰商業銀行":{name:"安泰商業銀行",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q10946952",amenity:"bank"},addTags:{amenity:"bank",brand:"安泰商業銀行","brand:en":"Entie Commercial Bank","brand:wikidata":"Q10946952","brand:wikipedia":"zh:安泰商業銀行",name:"安泰商業銀行","name:en":"Entie Commercial Bank"},countryCodes:["tw"],terms:[],matchScore:2,suggestion:true},"amenity/bank/工商银行":{name:"工商银行",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FICBC%20logo.png&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q26463",amenity:"bank"},addTags:{amenity:"bank",brand:"工商银行","brand:en":"Industrial and Commercial Bank of China","brand:wikidata":"Q26463","brand:wikipedia":"en:Industrial and Commercial Bank of China",name:"工商银行","name:en":"Industrial and Commercial Bank of China"},countryCodes:["cn"],terms:[],matchScore:2,suggestion:true},"amenity/bank/建设银行":{name:"建设银行",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FChina%20Construction%20Bank%20logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q26299",amenity:"bank"},addTags:{amenity:"bank",brand:"建设银行","brand:wikidata":"Q26299","brand:wikipedia":"zh:中国建设银行",name:"建设银行"},countryCodes:["cn"],terms:[],matchScore:2,suggestion:true},"amenity/bank/彰化商業銀行":{name:"彰化商業銀行",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FCentral%20Branch%2C%20Chang%20Hwa%20Bank%2020101213.jpg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q5071627",amenity:"bank"},addTags:{amenity:"bank",brand:"彰化商業銀行","brand:en":"Chang Hwa Bank","brand:wikidata":"Q5071627","brand:wikipedia":"en:Chang Hwa Bank",name:"彰化商業銀行","name:en":"Chang Hwa Bank"},countryCodes:["tw"],terms:[],matchScore:2,suggestion:true},"amenity/bank/招商银行":{name:"招商银行",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q1073327",amenity:"bank"},addTags:{amenity:"bank",brand:"招商银行","brand:en":"China Merchants Bank","brand:wikidata":"Q1073327","brand:wikipedia":"en:China Merchants Bank",name:"招商银行","name:en":"China Merchants Bank"},countryCodes:["cn"],terms:[],matchScore:2,suggestion:true},"amenity/bank/日本銀行":{name:"日本銀行",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/1695643374/medama_moji_en_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q333101",amenity:"bank"},addTags:{amenity:"bank",brand:"日本銀行","brand:en":"Bank of Japan","brand:wikidata":"Q333101","brand:wikipedia":"ja:日本銀行",name:"日本銀行","name:en":"Bank of Japan"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/bank/板信商業銀行":{name:"板信商業銀行",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q11104946",amenity:"bank"},addTags:{amenity:"bank",brand:"板信商業銀行","brand:en":"Bank of Panshin","brand:wikidata":"Q11104946","brand:wikipedia":"zh:板信商業銀行",name:"板信商業銀行","name:en":"Bank of Panshin"},countryCodes:["tw"],terms:[],matchScore:2,suggestion:true},"amenity/bank/横浜銀行":{name:"横浜銀行",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q2744340",amenity:"bank"},addTags:{amenity:"bank",brand:"横浜銀行","brand:en":"Bank of Yokohama","brand:wikidata":"Q2744340","brand:wikipedia":"en:Bank of Yokohama",name:"横浜銀行","name:en":"Bank of Yokohama"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/bank/永豐商業銀行":{name:"永豐商業銀行",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FBank%20SinoPac%20logo%2020121103.gif&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q4855976",amenity:"bank"},addTags:{amenity:"bank",brand:"永豐商業銀行","brand:en":"Bank SinoPac","brand:wikidata":"Q4855976","brand:wikipedia":"en:Bank SinoPac",name:"永豐商業銀行","name:en":"Bank SinoPac"},countryCodes:["tw"],terms:[],matchScore:2,suggestion:true},"amenity/bank/渣打國際商業銀行":{name:"渣打國際商業銀行",icon:"maki-bank",imageURL:"https://graph.facebook.com/StandardCharteredTW/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62267023",amenity:"bank"},addTags:{amenity:"bank",brand:"渣打國際商業銀行","brand:wikidata":"Q62267023",name:"渣打國際商業銀行"},countryCodes:["tw"],terms:[],matchScore:2,suggestion:true},"amenity/bank/玉山商業銀行":{name:"玉山商業銀行",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FE.SUN%20Bank.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q5321663",amenity:"bank"},addTags:{amenity:"bank",brand:"玉山商業銀行","brand:en":"E.SUN Commercial Bank","brand:wikidata":"Q5321663","brand:wikipedia":"en:E.SUN Commercial Bank",name:"玉山商業銀行","name:en":"E.SUN Commercial Bank"},countryCodes:["tw"],terms:[],matchScore:2,suggestion:true},"amenity/bank/第一商業銀行":{name:"第一商業銀行",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q11602128",amenity:"bank"},addTags:{amenity:"bank",brand:"第一商業銀行","brand:en":"First Commercial Bank","brand:wikidata":"Q11602128","brand:wikipedia":"zh:第一商業銀行",name:"第一商業銀行","name:en":"First Commercial Bank"},countryCodes:["tw"],terms:[],matchScore:2,suggestion:true},"amenity/bank/聯邦商業銀行":{name:"聯邦商業銀行",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q15927195",amenity:"bank"},addTags:{amenity:"bank",brand:"聯邦商業銀行","brand:en":"Union Bank of Taiwan","brand:wikidata":"Q15927195","brand:wikipedia":"zh:聯邦商業銀行",name:"聯邦商業銀行","name:en":"Union Bank of Taiwan"},countryCodes:["tw"],terms:[],matchScore:2,suggestion:true},"amenity/bank/臺灣中小企業銀行":{name:"臺灣中小企業銀行",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q15913812",amenity:"bank"},addTags:{amenity:"bank",brand:"臺灣中小企業銀行","brand:en":"Taiwan Business Bank","brand:wikidata":"Q15913812","brand:wikipedia":"zh:臺灣中小企業銀行",name:"臺灣中小企業銀行","name:en":"Taiwan Business Bank"},countryCodes:["tw"],terms:[],matchScore:2,suggestion:true},"amenity/bank/臺灣土地銀行":{name:"臺灣土地銀行",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q717592",amenity:"bank"},addTags:{amenity:"bank",brand:"臺灣土地銀行","brand:en":"Land Bank of Taiwan","brand:wikidata":"Q717592","brand:wikipedia":"en:Land Bank of Taiwan",name:"臺灣土地銀行","name:en":"Land Bank of Taiwan"},countryCodes:["tw"],terms:[],matchScore:2,suggestion:true},"amenity/bank/臺灣新光商業銀行":{name:"臺灣新光商業銀行",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q15909616",amenity:"bank"},addTags:{amenity:"bank",brand:"臺灣新光商業銀行","brand:en":"Shin Kong Commercial Bank","brand:wikidata":"Q15909616","brand:wikipedia":"zh:臺灣新光商業銀行",name:"臺灣新光商業銀行","name:en":"Shin Kong Commercial Bank"},countryCodes:["tw"],terms:[],matchScore:2,suggestion:true},"amenity/bank/臺灣銀行":{name:"臺灣銀行",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q706533",amenity:"bank"},addTags:{amenity:"bank",brand:"臺灣銀行","brand:en":"Bank of Taiwan","brand:wikidata":"Q706533","brand:wikipedia":"en:Bank of Taiwan",name:"臺灣銀行","name:en":"Bank of Taiwan"},countryCodes:["tw"],terms:[],matchScore:2,suggestion:true},"amenity/bank/華南商業銀行":{name:"華南商業銀行",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q11620043",amenity:"bank"},addTags:{amenity:"bank",brand:"華南商業銀行","brand:en":"Hua Nan Commercial Bank","brand:wikidata":"Q11620043","brand:wikipedia":"zh:華南銀行",name:"華南商業銀行","name:en":"Hua Nan Commercial Bank"},countryCodes:["tw"],terms:[],matchScore:2,suggestion:true},"amenity/bank/遠東國際商業銀行":{name:"遠東國際商業銀行",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q15911143",amenity:"bank"},addTags:{amenity:"bank",brand:"遠東國際商業銀行","brand:en":"Far Eastern International Bank","brand:wikidata":"Q15911143","brand:wikipedia":"zh:遠東國際商業銀行",name:"遠東國際商業銀行","name:en":"Far Eastern International Bank"},countryCodes:["tw"],terms:[],matchScore:2,suggestion:true},"amenity/bank/陽信商業銀行":{name:"陽信商業銀行",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q11658759",amenity:"bank"},addTags:{amenity:"bank",brand:"陽信商業銀行","brand:en":"Sunny Commercial Bank","brand:wikidata":"Q11658759","brand:wikipedia":"zh:陽信商業銀行",name:"陽信商業銀行","name:en":"Sunny Commercial Bank"},countryCodes:["tw"],terms:[],matchScore:2,suggestion:true},"amenity/bank/静岡銀行":{name:"静岡銀行",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q7499501",amenity:"bank"},addTags:{amenity:"bank",brand:"静岡銀行","brand:en":"Shizuoka Bank","brand:wikidata":"Q7499501","brand:wikipedia":"en:Shizuoka Bank",name:"静岡銀行","name:en":"Shizuoka Bank"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/bank/국민은행":{name:"국민은행",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FKB%20logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q496606",amenity:"bank"},addTags:{amenity:"bank",brand:"국민은행","brand:en":"KB Kookmin Bank","brand:ko":"국민은행","brand:wikidata":"Q496606","brand:wikipedia":"en:KB Financial Group Inc",name:"국민은행","name:en":"KB Kookmin Bank","name:ko":"국민은행"},countryCodes:["kr"],terms:["국민은행 (gungmin bank)"],matchScore:2,suggestion:true},"amenity/bank/기업은행":{name:"기업은행",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q483855",amenity:"bank"},addTags:{amenity:"bank",brand:"기업은행","brand:en":"Industrial Bank of Korea","brand:ko":"기업은행","brand:wikidata":"Q483855","brand:wikipedia":"en:Industrial Bank of Korea",name:"기업은행","name:en":"Industrial Bank of Korea","name:ko":"기업은행"},countryCodes:["kr"],terms:[],matchScore:2,suggestion:true},"amenity/bank/농협":{name:"농협",icon:"maki-bank",imageURL:"https://graph.facebook.com/nhnonghyupbank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q15283673",amenity:"bank"},addTags:{amenity:"bank",brand:"농협","brand:en":"NH","brand:ko":"농협","brand:wikidata":"Q15283673","brand:wikipedia":"ko:NH농협은행",name:"농협","name:en":"NH","name:ko":"농협"},countryCodes:["kr"],terms:["nh농협은행"],matchScore:2,suggestion:true},"amenity/bank/새마을금고":{name:"새마을금고",icon:"maki-bank",imageURL:"https://graph.facebook.com/kfcc.kr/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q12600614",amenity:"bank"},addTags:{amenity:"bank",brand:"새마을금고","brand:ko":"새마을금고","brand:wikidata":"Q12600614","brand:wikipedia":"ko:새마을금고",name:"새마을금고","name:ko":"새마을금고"},countryCodes:["kr"],terms:[],matchScore:2,suggestion:true},"amenity/bank/신한은행":{name:"신한은행",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q487230",amenity:"bank"},addTags:{amenity:"bank",brand:"신한은행","brand:en":"Sinhan Bank","brand:ko":"신한은행","brand:wikidata":"Q487230","brand:wikipedia":"en:Shinhan Bank",name:"신한은행","name:en":"Sinhan Bank","name:ko":"신한은행"},countryCodes:["kr"],terms:["신한은행 (sinhan bank)"],matchScore:2,suggestion:true},"amenity/bank/우리은행":{name:"우리은행",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q494369",amenity:"bank"},addTags:{amenity:"bank",brand:"우리은행","brand:en":"Woori Bank","brand:ko":"우리은행","brand:wikidata":"Q494369","brand:wikipedia":"en:Woori Bank",name:"우리은행","name:en":"Woori Bank","name:ko":"우리은행"},countryCodes:["kr"],terms:["우리은행 (uri bank)"],matchScore:2,suggestion:true},"amenity/bank/하나은행":{name:"하나은행",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q484047",amenity:"bank"},addTags:{amenity:"bank",brand:"하나은행","brand:en":"Korea Exchange Bank","brand:ko":"하나은행","brand:wikidata":"Q484047","brand:wikipedia":"en:Korea Exchange Bank",name:"하나은행","name:en":"Korea Exchange Bank","name:ko":"하나은행"},countryCodes:["kr"],terms:[],matchScore:2,suggestion:true},"amenity/bicycle_rental/Call a Bike":{name:"Call a Bike",icon:"maki-bicycle",imageURL:"https://graph.facebook.com/callabikesharing/picture?type=large",geometry:["point","vertex","area"],tags:{"brand:wikidata":"Q1060525",amenity:"bicycle_rental"},addTags:{amenity:"bicycle_rental",brand:"Call a Bike","brand:wikidata":"Q1060525","brand:wikipedia":"en:Call a Bike",name:"Call a Bike"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"amenity/bicycle_rental/Grid":{name:"Grid",icon:"maki-bicycle",imageURL:"https://graph.facebook.com/Gridbikes/picture?type=large",geometry:["point","vertex","area"],tags:{"brand:wikidata":"Q62104168",amenity:"bicycle_rental"},addTags:{amenity:"bicycle_rental",brand:"Grid","brand:wikidata":"Q62104168",name:"Grid"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/bicycle_rental/MiBici":{name:"MiBici",icon:"maki-bicycle",imageURL:"https://graph.facebook.com/MiBiciPublica/picture?type=large",geometry:["point","vertex","area"],tags:{"brand:wikidata":"Q60966987",amenity:"bicycle_rental"},addTags:{amenity:"bicycle_rental",brand:"MiBici","brand:wikidata":"Q60966987","brand:wikipedia":"es:MiBici",name:"MiBici"},countryCodes:["mx"],terms:[],matchScore:2,suggestion:true},"amenity/bicycle_rental/Swapfiets":{name:"Swapfiets",icon:"maki-bicycle",imageURL:"https://graph.facebook.com/Swapfiets/picture?type=large",geometry:["point","vertex","area"],tags:{"brand:wikidata":"Q62104374",amenity:"bicycle_rental"},addTags:{amenity:"bicycle_rental",brand:"Swapfiets","brand:wikidata":"Q62104374",name:"Swapfiets"},countryCodes:["be","de","dk","nl"],terms:[],matchScore:2,suggestion:true},"amenity/bicycle_rental/metropolradruhr":{name:"metropolradruhr",icon:"maki-bicycle",imageURL:"https://graph.facebook.com/nextbike/picture?type=large",geometry:["point","vertex","area"],tags:{"brand:wikidata":"Q62104274",amenity:"bicycle_rental"},addTags:{amenity:"bicycle_rental",brand:"metropolradruhr","brand:wikidata":"Q62104274",name:"metropolradruhr",operator:"nextbike","operator:wikidata":"Q2351279","operator:wikipedia":"en:Nextbike"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"amenity/bureau_de_change/Abitab":{name:"Abitab",icon:"maki-bank",imageURL:"https://graph.facebook.com/Abitaboficial/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q16488129",amenity:"bureau_de_change"},addTags:{amenity:"bureau_de_change",brand:"Abitab","brand:wikidata":"Q16488129","brand:wikipedia":"es:Abitab",name:"Abitab"},countryCodes:["uy"],terms:[],matchScore:2,suggestion:true},"amenity/bureau_de_change/CADECA":{name:"CADECA",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q62122716",amenity:"bureau_de_change"},addTags:{amenity:"bureau_de_change",brand:"CADECA","brand:wikidata":"Q62122716",name:"CADECA"},countryCodes:["cu"],terms:[],matchScore:2,suggestion:true},"amenity/bureau_de_change/Travelex":{name:"Travelex",icon:"maki-bank",imageURL:"https://graph.facebook.com/TravelexUK/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2337964",amenity:"bureau_de_change"},addTags:{amenity:"bureau_de_change",brand:"Travelex","brand:wikidata":"Q2337964","brand:wikipedia":"en:Travelex",name:"Travelex"},terms:[],matchScore:2,suggestion:true},"amenity/cafe/85度C":{name:"85度C",icon:"maki-cafe",imageURL:"https://graph.facebook.com/85CBakeryCafe/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4644852",amenity:"cafe"},addTags:{amenity:"cafe",brand:"85度C","brand:en":"85C Bakery Cafe","brand:wikidata":"Q4644852","brand:wikipedia":"en:85C Bakery Cafe",cuisine:"coffee_shop",name:"85度C","name:en":"85C Bakery Cafe",takeaway:"yes"},terms:[],matchScore:2,suggestion:true},"amenity/cafe/Barista":{name:"Barista",icon:"maki-cafe",imageURL:"https://graph.facebook.com/BaristaCoffeeCompany/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q644735",amenity:"cafe"},addTags:{amenity:"cafe",brand:"Barista","brand:wikidata":"Q644735","brand:wikipedia":"en:Barista (company)",cuisine:"coffee_shop",name:"Barista",takeaway:"yes"},countryCodes:["in","lk","mv","np"],terms:[],matchScore:2,suggestion:true},"amenity/cafe/Bonafide":{name:"Bonafide",icon:"maki-cafe",imageURL:"https://graph.facebook.com/BonafideArgentina/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62122746",amenity:"cafe"},addTags:{amenity:"cafe",brand:"Bonafide","brand:wikidata":"Q62122746",cuisine:"coffee_shop",name:"Bonafide",takeaway:"yes"},countryCodes:["ar","cl"],terms:[],matchScore:2,suggestion:true},"amenity/cafe/Cafe Coffee Day":{name:"Cafe Coffee Day",icon:"maki-cafe",imageURL:"https://graph.facebook.com/cafecoffeeday/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5017235",amenity:"cafe"},addTags:{amenity:"cafe",brand:"Cafe Coffee Day","brand:wikidata":"Q5017235","brand:wikipedia":"en:Café Coffee Day",cuisine:"coffee_shop",name:"Cafe Coffee Day",takeaway:"yes"},terms:[],matchScore:2,suggestion:true},"amenity/cafe/Caffè Nero":{name:"Caffè Nero",icon:"maki-cafe",imageURL:"https://graph.facebook.com/caffenerous/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q675808",amenity:"cafe"},addTags:{amenity:"cafe",brand:"Caffè Nero","brand:wikidata":"Q675808","brand:wikipedia":"en:Caffè Nero",cuisine:"coffee_shop",name:"Caffè Nero",takeaway:"yes"},terms:["cafe nero"],matchScore:2,suggestion:true},"amenity/cafe/Café Amazon":{name:"Café Amazon",icon:"maki-cafe",imageURL:"https://graph.facebook.com/cafeamazonofficial/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q43247503",amenity:"cafe"},addTags:{amenity:"cafe",brand:"Café Amazon","brand:wikidata":"Q43247503","brand:wikipedia":"en:Café Amazon",cuisine:"coffee_shop",name:"Café Amazon",takeaway:"yes"},terms:[],matchScore:2,suggestion:true},"amenity/cafe/Café Martínez":{name:"Café Martínez",icon:"maki-cafe",imageURL:"https://graph.facebook.com/CafeMartinezSitioOficial/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q16540032",amenity:"cafe"},addTags:{amenity:"cafe",brand:"Café Martínez","brand:wikidata":"Q16540032","brand:wikipedia":"es:Café Martínez",cuisine:"coffee_shop",name:"Café Martínez",takeaway:"yes"},countryCodes:["ar"],terms:[],matchScore:2,suggestion:true},"amenity/cafe/Caribou Coffee":{name:"Caribou Coffee",icon:"maki-cafe",imageURL:"https://graph.facebook.com/cariboucoffee/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5039494",amenity:"cafe"},addTags:{amenity:"cafe",brand:"Caribou Coffee","brand:wikidata":"Q5039494","brand:wikipedia":"en:Caribou Coffee",cuisine:"coffee_shop",name:"Caribou Coffee",takeaway:"yes"},terms:[],matchScore:2,suggestion:true},"amenity/cafe/Chatime":{name:"Chatime",icon:"maki-cafe",imageURL:"https://graph.facebook.com/ChatimeCanada/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q16829306",amenity:"cafe"},addTags:{amenity:"cafe",brand:"Chatime","brand:wikidata":"Q16829306","brand:wikipedia":"en:Chatime",cuisine:"coffee_shop",name:"Chatime",takeaway:"yes"},terms:[],matchScore:2,suggestion:true},"amenity/cafe/Coffee Fellows":{name:"Coffee Fellows",icon:"maki-cafe",imageURL:"https://graph.facebook.com/CoffeeFellowsDeutschland/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q23461429",amenity:"cafe"},addTags:{amenity:"cafe",brand:"Coffee Fellows","brand:wikidata":"Q23461429","brand:wikipedia":"en:Coffee Fellows",cuisine:"coffee_shop",name:"Coffee Fellows",takeaway:"yes"},terms:[],matchScore:2,suggestion:true},"amenity/cafe/Coffee House (Finland)":{name:"Coffee House (Finland)",icon:"maki-cafe",imageURL:"https://graph.facebook.com/raflaamo/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11855430",amenity:"cafe"},addTags:{amenity:"cafe",brand:"Coffee House","brand:wikidata":"Q11855430","brand:wikipedia":"fi:Coffee House",cuisine:"coffee_shop",name:"Coffee House",takeaway:"yes"},countryCodes:["fi"],terms:[],matchScore:2,suggestion:true},"amenity/cafe/Coffee Island":{name:"Coffee Island",icon:"maki-cafe",imageURL:"https://graph.facebook.com/CoffeeIslandUK/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q60867333",amenity:"cafe"},addTags:{amenity:"cafe",brand:"Coffee Island","brand:wikidata":"Q60867333","brand:wikipedia":"en:Coffee Island",cuisine:"coffee_shop",name:"Coffee Island",takeaway:"yes"},terms:[],matchScore:2,suggestion:true},"amenity/cafe/Coffee Time":{name:"Coffee Time",icon:"maki-cafe",imageURL:"https://graph.facebook.com/CoffeeTimeCanada/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5140932",amenity:"cafe"},addTags:{amenity:"cafe",brand:"Coffee Time","brand:wikidata":"Q5140932","brand:wikipedia":"en:Coffee Time",cuisine:"coffee_shop",name:"Coffee Time",takeaway:"yes"},terms:[],matchScore:2,suggestion:true},"amenity/cafe/Costa":{name:"Costa",icon:"maki-cafe",imageURL:"https://graph.facebook.com/costacoffee/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q608845",amenity:"cafe"},addTags:{amenity:"cafe",brand:"Costa","brand:wikidata":"Q608845","brand:wikipedia":"en:Costa Coffee",cuisine:"coffee_shop",name:"Costa",takeaway:"yes"},terms:["costa coffee"],matchScore:2,suggestion:true},"amenity/cafe/Country Style":{name:"Country Style",icon:"maki-cafe",imageURL:"https://graph.facebook.com/CountryStyleCDN/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5177435",amenity:"cafe"},addTags:{amenity:"cafe",brand:"Country Style","brand:wikidata":"Q5177435","brand:wikipedia":"en:Country Style",cuisine:"coffee_shop",name:"Country Style",takeaway:"yes"},terms:[],matchScore:2,suggestion:true},"amenity/cafe/Cộng Cà Phê":{name:"Cộng Cà Phê",icon:"maki-cafe",imageURL:"https://graph.facebook.com/congcaphe/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q63864181",amenity:"cafe"},addTags:{amenity:"cafe",brand:"Cộng Cà Phê","brand:wikidata":"Q63864181",cuisine:"coffee_shop;vietnamese",name:"Cộng Cà Phê","name:vi":"Cộng Cà Phê",takeaway:"yes"},countryCodes:["kr","vn"],terms:["cong"],matchScore:2,suggestion:true},"amenity/cafe/Dutch Bros. Coffee":{name:"Dutch Bros. Coffee",icon:"maki-cafe",imageURL:"https://graph.facebook.com/dutchbros/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5317253",amenity:"cafe"},addTags:{amenity:"cafe",brand:"Dutch Bros. Coffee","brand:wikidata":"Q5317253","brand:wikipedia":"en:Dutch Bros. Coffee",cuisine:"coffee_shop",name:"Dutch Bros. Coffee",takeaway:"only"},countryCodes:["us"],terms:["dutch bros","dutch brothers"],matchScore:2,suggestion:true},"amenity/cafe/Espresso House":{name:"Espresso House",icon:"maki-cafe",imageURL:"https://graph.facebook.com/EspressoHouse/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q10489162",amenity:"cafe"},addTags:{amenity:"cafe",brand:"Espresso House","brand:wikidata":"Q10489162","brand:wikipedia":"en:Espresso House",cuisine:"coffee_shop",name:"Espresso House",takeaway:"yes"},countryCodes:["dk","fi","no","se"],terms:[],matchScore:2,suggestion:true},"amenity/cafe/Fran's Café":{name:"Fran's Café",icon:"maki-cafe",imageURL:"https://graph.facebook.com/franscafeoficial/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62075645",amenity:"cafe"},addTags:{amenity:"cafe",brand:"Fran's Café","brand:website":"http://www.franscafe.com.br","brand:wikidata":"Q62075645",cuisine:"coffee_shop",name:"Fran's Café",takeaway:"yes"},countryCodes:["br"],terms:[],matchScore:2,suggestion:true},"amenity/cafe/Havanna":{name:"Havanna",icon:"maki-cafe",imageURL:"https://graph.facebook.com/HavannaUSA/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2900869",amenity:"cafe"},addTags:{amenity:"cafe",brand:"Havanna","brand:wikidata":"Q2900869","brand:wikipedia":"es:Havanna",cuisine:"coffee_shop",name:"Havanna",takeaway:"yes"},terms:[],matchScore:2,suggestion:true},"amenity/cafe/Highlands Coffee":{name:"Highlands Coffee",icon:"maki-cafe",imageURL:"https://graph.facebook.com/highlandscoffeevietnam/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5759361",amenity:"cafe"},addTags:{amenity:"cafe",brand:"Highlands Coffee","brand:wikidata":"Q5759361","brand:wikipedia":"vi:Highlands Coffee",cuisine:"coffee_shop;vietnamese",name:"Highlands Coffee","name:en":"Highlands Coffee",takeaway:"yes"},countryCodes:["vn"],terms:["highlands"],matchScore:2,suggestion:true},"amenity/cafe/Insomnia":{name:"Insomnia",icon:"maki-cafe",imageURL:"https://graph.facebook.com/InsomniaCoffeeCo/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6038271",amenity:"cafe"},addTags:{amenity:"cafe",brand:"Insomnia","brand:wikidata":"Q6038271","brand:wikipedia":"en:Insomnia Coffee Company",cuisine:"coffee_shop",name:"Insomnia",takeaway:"yes"},terms:[],matchScore:2,suggestion:true},"amenity/cafe/Joe & The Juice":{name:"Joe & The Juice",icon:"maki-cafe",imageURL:"https://graph.facebook.com/joeandthejuice/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q26221514",amenity:"cafe"},addTags:{amenity:"cafe",brand:"Joe & The Juice","brand:wikidata":"Q26221514","brand:wikipedia":"en:Joe & The Juice",cuisine:"coffee_shop",name:"Joe & The Juice",takeaway:"yes"},terms:[],matchScore:2,suggestion:true},"amenity/cafe/Le Pain Quotidien":{name:"Le Pain Quotidien",icon:"maki-cafe",imageURL:"https://graph.facebook.com/lepainquotidienusa/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2046903",amenity:"cafe"},addTags:{amenity:"cafe",brand:"Le Pain Quotidien","brand:wikidata":"Q2046903","brand:wikipedia":"en:Le Pain Quotidien",cuisine:"coffee_shop",name:"Le Pain Quotidien",takeaway:"yes"},terms:[],matchScore:2,suggestion:true},"amenity/cafe/Mado":{name:"Mado",icon:"maki-cafe",imageURL:"https://graph.facebook.com/MADOglobal/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q17116336",amenity:"cafe"},addTags:{amenity:"cafe",brand:"Mado","brand:wikidata":"Q17116336","brand:wikipedia":"en:Mado (food company)",cuisine:"coffee_shop",name:"Mado",takeaway:"yes"},terms:[],matchScore:2,suggestion:true},"amenity/cafe/McCafé":{name:"McCafé",icon:"maki-cafe",imageURL:"https://graph.facebook.com/276517512552782/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3114287",amenity:"cafe"},addTags:{amenity:"cafe",brand:"McCafé","brand:wikidata":"Q3114287","brand:wikipedia":"en:McCafé",cuisine:"coffee_shop",name:"McCafé","operator:wikidata":"Q38076","operator:wikipedia":"en:McDonald's",takeaway:"yes"},terms:[],matchScore:2,suggestion:true},"amenity/cafe/Patisserie Valerie":{name:"Patisserie Valerie",icon:"maki-cafe",imageURL:"https://graph.facebook.com/ValerieCafe/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q22101966",amenity:"cafe"},addTags:{amenity:"cafe",brand:"Patisserie Valerie","brand:wikidata":"Q22101966","brand:wikipedia":"en:Patisserie Valerie",cuisine:"coffee_shop",name:"Patisserie Valerie",takeaway:"yes"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"amenity/cafe/Peet's Coffee":{name:"Peet's Coffee",icon:"maki-cafe",imageURL:"https://graph.facebook.com/peets/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1094101",amenity:"cafe"},addTags:{amenity:"cafe",brand:"Peet's Coffee","brand:wikidata":"Q1094101","brand:wikipedia":"en:Peet's Coffee",cuisine:"coffee_shop",name:"Peet's Coffee",takeaway:"yes"},countryCodes:["us"],terms:["peets","peets coffee & tea","peets coffee and tea"],matchScore:2,suggestion:true},"amenity/cafe/Prime":{name:"Prime",icon:"maki-cafe",imageURL:"https://graph.facebook.com/PRIMENATURALFOOD/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62122839",amenity:"cafe"},addTags:{amenity:"cafe",brand:"Prime","brand:wikidata":"Q62122839",cuisine:"coffee_shop",name:"Prime",takeaway:"yes"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"amenity/cafe/Pronto":{name:"Pronto",icon:"maki-cafe",imageURL:"https://graph.facebook.com/pronto.jp/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11336224",amenity:"cafe"},addTags:{amenity:"cafe",brand:"Pronto","brand:wikidata":"Q11336224","brand:wikipedia":"ja:プロントコーポレーション",cuisine:"coffee_shop",name:"Pronto","name:ja":"プロント",takeaway:"yes"},countryCodes:["jp"],terms:["プロント"],matchScore:2,suggestion:true},"amenity/cafe/Pumpkin":{name:"Pumpkin",icon:"maki-cafe",geometry:["point","area"],tags:{"brand:wikidata":"Q27825961",amenity:"cafe"},addTags:{amenity:"cafe",brand:"Pumpkin","brand:wikidata":"Q27825961","brand:wikipedia":"en:Pumpkin Café Shop",cuisine:"coffee_shop",name:"Pumpkin",takeaway:"yes"},countryCodes:["gb"],terms:["pumpkin cafe","pumpkin cafe shop"],matchScore:2,suggestion:true},"amenity/cafe/Second Cup":{name:"Second Cup",icon:"maki-cafe",imageURL:"https://graph.facebook.com/SecondCup/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q862180",amenity:"cafe"},addTags:{amenity:"cafe",brand:"Second Cup","brand:wikidata":"Q862180","brand:wikipedia":"en:Second Cup",cuisine:"coffee_shop",name:"Second Cup",takeaway:"yes"},terms:[],matchScore:2,suggestion:true},"amenity/cafe/Segafredo":{name:"Segafredo",icon:"maki-cafe",imageURL:"https://graph.facebook.com/SegafredoZanettiItalia/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q21282762",amenity:"cafe"},addTags:{amenity:"cafe",brand:"Segafredo","brand:wikidata":"Q21282762","brand:wikipedia":"it:Segafredo Zanetti",cuisine:"coffee_shop",name:"Segafredo",takeaway:"yes"},terms:[],matchScore:2,suggestion:true},"amenity/cafe/Starbucks":{name:"Starbucks",icon:"maki-cafe",imageURL:"https://graph.facebook.com/Starbucks/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q37158",amenity:"cafe"},addTags:{amenity:"cafe",brand:"Starbucks","brand:wikidata":"Q37158","brand:wikipedia":"en:Starbucks",cuisine:"coffee_shop",name:"Starbucks",takeaway:"yes"},terms:["starbucks coffee"],matchScore:2,suggestion:true},"amenity/cafe/The Coffee Bean & Tea Leaf":{name:"The Coffee Bean & Tea Leaf",icon:"maki-cafe",imageURL:"https://graph.facebook.com/thecoffeebean/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1141384",amenity:"cafe"},addTags:{amenity:"cafe",brand:"The Coffee Bean & Tea Leaf","brand:wikidata":"Q1141384","brand:wikipedia":"en:The Coffee Bean & Tea Leaf",cuisine:"coffee_shop",name:"The Coffee Bean & Tea Leaf",takeaway:"yes"},terms:[],matchScore:2,suggestion:true},"amenity/cafe/The Coffee Club":{name:"The Coffee Club",icon:"maki-cafe",imageURL:"https://graph.facebook.com/tccau/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7726599",amenity:"cafe"},addTags:{amenity:"cafe",brand:"The Coffee Club","brand:wikidata":"Q7726599","brand:wikipedia":"en:The Coffee Club",cuisine:"coffee_shop",name:"The Coffee Club",takeaway:"yes"},terms:[],matchScore:2,suggestion:true},"amenity/cafe/The Coffee House (Vietnam)":{name:"The Coffee House (Vietnam)",icon:"maki-cafe",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FThe%20Coffee%20House%20logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q60775742",amenity:"cafe"},addTags:{amenity:"cafe",brand:"The Coffee House","brand:wikidata":"Q60775742","brand:wikipedia":"en:The Coffee House (coffeehouse chain)",cuisine:"coffee_shop;vietnamese",name:"The Coffee House","name:en":"The Coffee House",takeaway:"yes"},countryCodes:["vn"],terms:["coffee house"],matchScore:2,suggestion:true},"amenity/cafe/Tim Hortons":{name:"Tim Hortons",icon:"maki-cafe",imageURL:"https://graph.facebook.com/TimHortonsUS/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q175106",amenity:"cafe"},addTags:{amenity:"cafe",brand:"Tim Hortons","brand:wikidata":"Q175106","brand:wikipedia":"en:Tim Hortons",cuisine:"coffee_shop",name:"Tim Hortons",takeaway:"yes"},terms:[],matchScore:2,suggestion:true},"amenity/cafe/Traveler's Coffee":{name:"Traveler's Coffee",icon:"maki-cafe",geometry:["point","area"],tags:{"brand:wikidata":"Q4051716",amenity:"cafe"},addTags:{amenity:"cafe",brand:"Traveler's Coffee","brand:wikidata":"Q4051716","brand:wikipedia":"ru:Traveler’s Coffee",cuisine:"coffee_shop",name:"Traveler's Coffee",takeaway:"yes"},terms:[],matchScore:2,suggestion:true},"amenity/cafe/Trung Nguyên Coffee":{name:"Trung Nguyên Coffee",icon:"maki-cafe",imageURL:"https://graph.facebook.com/trungnguyenlegend/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3541154",amenity:"cafe"},addTags:{amenity:"cafe",brand:"Trung Nguyên","brand:wikidata":"Q3541154","brand:wikipedia":"vi:Trung Nguyên (công ty)",cuisine:"coffee_shop;vietnamese",name:"Trung Nguyên Coffee","name:en":"Trung Nguyen Coffee","name:vi":"Cà phê Trung Nguyên",takeaway:"yes"},countryCodes:["vn"],terms:["trung nguyen"],matchScore:2,suggestion:true},"amenity/cafe/Wayne's Coffee":{name:"Wayne's Coffee",icon:"maki-cafe",imageURL:"https://graph.facebook.com/WaynesCoffeeInternational/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2637272",amenity:"cafe"},addTags:{amenity:"cafe",brand:"Wayne's Coffee","brand:wikidata":"Q2637272","brand:wikipedia":"en:Wayne's Coffee",cuisine:"coffee_shop",name:"Wayne's Coffee",takeaway:"yes"},terms:[],matchScore:2,suggestion:true},"amenity/cafe/Wild Bean Cafe":{name:"Wild Bean Cafe",icon:"maki-cafe",geometry:["point","area"],tags:{"brand:wikidata":"Q61804826",amenity:"cafe"},addTags:{amenity:"cafe",brand:"Wild Bean Cafe","brand:wikidata":"Q61804826",cuisine:"coffee_shop",name:"Wild Bean Cafe",takeaway:"yes"},terms:[],matchScore:2,suggestion:true},"amenity/cafe/Даблби":{name:"Даблби",icon:"maki-cafe",imageURL:"https://graph.facebook.com/DoubleBCoffeeTea/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62501686",amenity:"cafe"},addTags:{amenity:"cafe",brand:"Даблби","brand:en":"Double B","brand:wikidata":"Q62501686",cuisine:"coffee_shop",name:"Даблби","name:en":"Double B",takeaway:"yes"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"amenity/cafe/Старбакс":{name:"Старбакс",icon:"maki-cafe",imageURL:"https://graph.facebook.com/Starbucks/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q37158",amenity:"cafe"},addTags:{amenity:"cafe",brand:"Старбакс","brand:en":"Starbucks","brand:wikidata":"Q37158","brand:wikipedia":"en:Starbucks",cuisine:"coffee_shop",name:"Старбакс","name:en":"Starbucks",takeaway:"yes"},terms:[],matchScore:2,suggestion:true},"amenity/cafe/Шоколадница":{name:"Шоколадница",icon:"maki-cafe",imageURL:"https://graph.facebook.com/shoko.ru/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q30891188",amenity:"cafe"},addTags:{amenity:"cafe",brand:"Шоколадница","brand:en":"Chocolate","brand:wikidata":"Q30891188","brand:wikipedia":"ru:Шоколадница (сеть кофеен)",cuisine:"coffee_shop",name:"Шоколадница","name:en":"Chocolate",takeaway:"yes"},countryCodes:["ru"],terms:["шоколад"],matchScore:2,suggestion:true},"amenity/cafe/Штолле":{name:"Штолле",icon:"maki-cafe",imageURL:"https://graph.facebook.com/stollerussia/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62502236",amenity:"cafe"},addTags:{amenity:"cafe",brand:"Штолле","brand:en":"Stolle","brand:wikidata":"Q62502236",cuisine:"coffee_shop",name:"Штолле","name:en":"Stolle",takeaway:"yes"},countryCodes:["by","ru","ua"],terms:[],matchScore:2,suggestion:true},"amenity/cafe/ארומה":{name:"ארומה",icon:"maki-cafe",imageURL:"https://graph.facebook.com/Israel.Aroma/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2909872",amenity:"cafe"},addTags:{amenity:"cafe",brand:"ארומה","brand:en":"Aroma Espresso Bar","brand:he":"ארומה","brand:wikidata":"Q2909872","brand:wikipedia":"en:Aroma Espresso Bar",cuisine:"coffee_shop",name:"ארומה","name:en":"Aroma Espresso Bar","name:he":"ארומה",takeaway:"yes"},countryCodes:["il"],terms:[],matchScore:2,suggestion:true},"amenity/cafe/คาเฟ่ อเมซอน":{name:"คาเฟ่ อเมซอน",icon:"maki-cafe",imageURL:"https://graph.facebook.com/cafeamazonofficial/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q43247503",amenity:"cafe"},addTags:{amenity:"cafe",brand:"คาเฟ่ อเมซอน","brand:en":"Café Amazon","brand:th":"คาเฟ่ อเมซอน","brand:wikidata":"Q43247503","brand:wikipedia":"en:Café Amazon",cuisine:"coffee_shop",name:"คาเฟ่ อเมซอน","name:en":"Café Amazon","name:th":"คาเฟ่ อเมซอน",takeaway:"yes"},countryCodes:["th"],terms:[],matchScore:2,suggestion:true},"amenity/cafe/エクセルシオール カフェ":{name:"エクセルシオール カフェ",icon:"maki-cafe",geometry:["point","area"],tags:{"brand:wikidata":"Q11289828",amenity:"cafe"},addTags:{amenity:"cafe",brand:"エクセルシオール カフェ","brand:en":"EXCELSIOR CAFFÉ","brand:ja":"エクセルシオール カフェ","brand:wikidata":"Q11289828","brand:wikipedia":"ja:エクセルシオール カフェ",cuisine:"coffee_shop",name:"エクセルシオール カフェ","name:ja":"エクセルシオール カフェ",takeaway:"yes"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/cafe/カフェ・ド・クリエ":{name:"カフェ・ド・クリエ",icon:"maki-cafe",imageURL:"https://graph.facebook.com/pokkacreate/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q17219077",amenity:"cafe"},addTags:{amenity:"cafe",brand:"カフェ・ド・クリエ","brand:en":"Cafe de CRIE","brand:ja":"カフェ・ド・クリエ","brand:wikidata":"Q17219077","brand:wikipedia":"ja:ポッカクリエイト",cuisine:"coffee_shop",name:"カフェ・ド・クリエ","name:en":"Cafe de CRIE","name:ja":"カフェ・ド・クリエ",takeaway:"yes"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/cafe/カフェ・ベローチェ":{name:"カフェ・ベローチェ",icon:"maki-cafe",geometry:["point","area"],tags:{"brand:wikidata":"Q11294597",amenity:"cafe"},addTags:{amenity:"cafe",brand:"カフェ・ベローチェ","brand:en":"CAFFÈ VELOCE","brand:ja":"カフェ・ベローチェ","brand:wikidata":"Q11294597","brand:wikipedia":"ja:カフェ・ベローチェ",cuisine:"coffee_shop",name:"カフェ・ベローチェ","name:en":"CAFFÈ VELOCE","name:ja":"カフェ・ベローチェ",takeaway:"yes"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/cafe/コメダ珈琲店":{name:"コメダ珈琲店",icon:"maki-cafe",imageURL:"https://graph.facebook.com/komeda.coffee/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11302679",amenity:"cafe"},addTags:{amenity:"cafe",brand:"コメダ珈琲店","brand:en":"Komeda Coffee Shop","brand:ja":"コメダ珈琲店","brand:wikidata":"Q11302679","brand:wikipedia":"ja:コメダ",cuisine:"coffee_shop",name:"コメダ珈琲店","name:en":"Komeda Coffee Shop","name:ja":"コメダ珈琲店",takeaway:"yes"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/cafe/サンマルクカフェ":{name:"サンマルクカフェ",icon:"maki-cafe",geometry:["point","area"],tags:{"brand:wikidata":"Q11305989",amenity:"cafe"},addTags:{amenity:"cafe",brand:"サンマルクカフェ","brand:en":"ST.MARC CAFÉ","brand:ja":"サンマルクカフェ","brand:wikidata":"Q11305989","brand:wikipedia":"ja:サンマルクホールディングス",cuisine:"coffee_shop",name:"サンマルクカフェ","name:en":"ST.MARC CAFÉ","name:ja":"サンマルクカフェ",takeaway:"yes"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/cafe/スターバックス":{name:"スターバックス",icon:"maki-cafe",imageURL:"https://graph.facebook.com/Starbucks/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q37158",amenity:"cafe"},addTags:{amenity:"cafe",brand:"スターバックス","brand:en":"Starbucks","brand:ja":"スターバックス","brand:wikidata":"Q37158","brand:wikipedia":"ja:スターバックス",cuisine:"coffee_shop",name:"スターバックス","name:en":"Starbucks","name:ja":"スターバックス",takeaway:"yes"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/cafe/タリーズコーヒー":{name:"タリーズコーヒー",icon:"maki-cafe",imageURL:"https://graph.facebook.com/TullysCoffeeShops/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3541983",amenity:"cafe"},addTags:{amenity:"cafe",brand:"タリーズコーヒー","brand:en":"Tully's Coffee","brand:ja":"タリーズコーヒー","brand:wikidata":"Q3541983","brand:wikipedia":"en:Tully's Coffee",cuisine:"coffee_shop",name:"タリーズコーヒー","name:en":"Tully's Coffee","name:ja":"タリーズコーヒー",takeaway:"yes"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/cafe/ドトールコーヒーショップ":{name:"ドトールコーヒーショップ",icon:"maki-cafe",geometry:["point","area"],tags:{"brand:wikidata":"Q11322732",amenity:"cafe"},addTags:{amenity:"cafe",brand:"ドトールコーヒーショップ","brand:en":"Doutor","brand:ja":"ドトールコーヒーショップ","brand:wikidata":"Q11322732","brand:wikipedia":"ja:ドトールコーヒーショップ",cuisine:"coffee_shop",name:"ドトールコーヒーショップ","name:en":"Doutor Coffee Shop","name:ja":"ドトールコーヒーショップ",takeaway:"yes"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/cafe/星巴克":{name:"星巴克",icon:"maki-cafe",imageURL:"https://graph.facebook.com/Starbucks/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q37158",amenity:"cafe"},addTags:{amenity:"cafe",brand:"星巴克","brand:en":"Starbucks","brand:wikidata":"Q37158","brand:wikipedia":"zh:星巴克","brand:zh":"星巴克",cuisine:"coffee_shop",name:"星巴克","name:en":"Starbucks","name:zh":"星巴克",takeaway:"yes"},countryCodes:["cn","tw"],terms:[],matchScore:2,suggestion:true},"amenity/cafe/珈琲館":{name:"珈琲館",icon:"maki-cafe",imageURL:"https://graph.facebook.com/kohikancorporation/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11573290",amenity:"cafe"},addTags:{amenity:"cafe",brand:"珈琲館","brand:en":"Kohikan","brand:ja":"珈琲館","brand:wikidata":"Q11573290","brand:wikipedia":"ja:珈琲館",cuisine:"coffee_shop",name:"珈琲館","name:en":"Kohikan","name:ja":"珈琲館",takeaway:"yes"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/cafe/스타벅스":{name:"스타벅스",icon:"maki-cafe",imageURL:"https://graph.facebook.com/Starbucks/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q37158",amenity:"cafe"},addTags:{amenity:"cafe",brand:"스타벅스","brand:en":"Starbucks","brand:ko":"스타벅스","brand:wikidata":"Q37158","brand:wikipedia":"ko:스타벅스",cuisine:"coffee_shop",name:"스타벅스","name:en":"Starbucks","name:ko":"스타벅스",takeaway:"yes"},countryCodes:["kr"],terms:[],matchScore:2,suggestion:true},"amenity/car_rental/Alamo":{name:"Alamo",icon:"maki-car-rental",imageURL:"https://graph.facebook.com/AlamoRentACar/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1429287",amenity:"car_rental"},addTags:{amenity:"car_rental",brand:"Alamo","brand:wikidata":"Q1429287","brand:wikipedia":"en:Alamo Rent a Car",name:"Alamo"},terms:[],matchScore:2,suggestion:true},"amenity/car_rental/Avis":{name:"Avis",icon:"maki-car-rental",imageURL:"https://graph.facebook.com/avis/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q791136",amenity:"car_rental"},addTags:{amenity:"car_rental",brand:"Avis","brand:wikidata":"Q791136","brand:wikipedia":"en:Avis Car Rental",name:"Avis"},terms:[],matchScore:2,suggestion:true},"amenity/car_rental/Budget":{name:"Budget",icon:"maki-car-rental",imageURL:"https://graph.facebook.com/Budget/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1001437",amenity:"car_rental"},addTags:{amenity:"car_rental",brand:"Budget","brand:wikidata":"Q1001437","brand:wikipedia":"en:Budget Rent a Car",name:"Budget"},terms:[],matchScore:2,suggestion:true},"amenity/car_rental/Dollar":{name:"Dollar",icon:"maki-car-rental",imageURL:"https://graph.facebook.com/DollarCarRental/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1235661",amenity:"car_rental"},addTags:{amenity:"car_rental",brand:"Dollar","brand:wikidata":"Q1235661","brand:wikipedia":"en:Dollar Rent A Car",name:"Dollar"},terms:[],matchScore:2,suggestion:true},"amenity/car_rental/Enterprise":{name:"Enterprise",icon:"maki-car-rental",imageURL:"https://graph.facebook.com/Enterprise/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q17085454",amenity:"car_rental"},addTags:{amenity:"car_rental",brand:"Enterprise","brand:wikidata":"Q17085454","brand:wikipedia":"en:Enterprise Rent-A-Car",name:"Enterprise"},terms:["enterprise rent-a-car"],matchScore:2,suggestion:true},"amenity/car_rental/Europcar":{name:"Europcar",icon:"maki-car-rental",imageURL:"https://graph.facebook.com/europcar/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1376256",amenity:"car_rental"},addTags:{amenity:"car_rental",brand:"Europcar","brand:wikidata":"Q1376256","brand:wikipedia":"en:Europcar",name:"Europcar"},terms:[],matchScore:2,suggestion:true},"amenity/car_rental/Hertz":{name:"Hertz",icon:"maki-car-rental",imageURL:"https://graph.facebook.com/hertz/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1543874",amenity:"car_rental"},addTags:{amenity:"car_rental",brand:"Hertz","brand:wikidata":"Q1543874","brand:wikipedia":"en:The Hertz Corporation",name:"Hertz"},terms:[],matchScore:2,suggestion:true},"amenity/car_rental/Localiza":{name:"Localiza",icon:"maki-car-rental",imageURL:"https://graph.facebook.com/localizahertz/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q10319490",amenity:"car_rental"},addTags:{amenity:"car_rental",brand:"Localiza","brand:wikidata":"Q10319490","brand:wikipedia":"en:Localiza",name:"Localiza"},terms:[],matchScore:2,suggestion:true},"amenity/car_rental/Sixt":{name:"Sixt",icon:"maki-car-rental",imageURL:"https://graph.facebook.com/sixt.rentacar.usa/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q705664",amenity:"car_rental"},addTags:{amenity:"car_rental",brand:"Sixt","brand:wikidata":"Q705664","brand:wikipedia":"en:Sixt",name:"Sixt"},terms:[],matchScore:2,suggestion:true},"amenity/car_rental/Thrifty":{name:"Thrifty",icon:"maki-car-rental",imageURL:"https://graph.facebook.com/ThriftyCarRental/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2429546",amenity:"car_rental"},addTags:{amenity:"car_rental",brand:"Thrifty","brand:wikidata":"Q2429546","brand:wikipedia":"en:Thrifty Car Rental",name:"Thrifty"},terms:[],matchScore:2,suggestion:true},"amenity/car_rental/U-Haul":{name:"U-Haul",icon:"maki-car-rental",imageURL:"https://graph.facebook.com/uhaul/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7862902",amenity:"car_rental"},addTags:{amenity:"car_rental",brand:"U-Haul","brand:wikidata":"Q7862902","brand:wikipedia":"en:U-Haul",name:"U-Haul"},terms:[],matchScore:2,suggestion:true},"amenity/car_rental/オリックスレンタカー":{name:"オリックスレンタカー",icon:"maki-car-rental",geometry:["point","area"],tags:{"brand:wikidata":"Q11123021",amenity:"car_rental"},addTags:{amenity:"car_rental",brand:"オリックスレンタカー","brand:en":"ORIX Car Rental","brand:ja":"オリックスレンタカー","brand:wikidata":"Q11123021","brand:wikipedia":"ja:オリックスレンタカー",name:"オリックスレンタカー","name:en":"ORIX Car Rental","name:ja":"オリックスレンタカー"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/car_rental/トヨタレンタカー":{name:"トヨタレンタカー",icon:"maki-car-rental",geometry:["point","area"],tags:{"brand:wikidata":"Q11321580",amenity:"car_rental"},addTags:{amenity:"car_rental",brand:"トヨタレンタカー","brand:en":"Toyota Rental Car","brand:ja":"トヨタレンタカー","brand:wikidata":"Q11321580","brand:wikipedia":"ja:トヨタレンタリース",name:"トヨタレンタカー","name:en":"Toyota Rental Car","name:ja":"トヨタレンタカー"},countryCodes:["jp"],terms:["トヨタレンタリース"],matchScore:2,suggestion:true},"amenity/car_rental/ニッポンレンタカー":{name:"ニッポンレンタカー",icon:"maki-car-rental",geometry:["point","area"],tags:{"brand:wikidata":"Q11086533",amenity:"car_rental"},addTags:{amenity:"car_rental",brand:"ニッポンレンタカー","brand:en":"Nippon Car Rental","brand:ja":"ニッポンレンタカー","brand:wikidata":"Q11086533","brand:wikipedia":"ja:ニッポンレンタカー",name:"ニッポンレンタカー","name:en":"Nippon Car Rental","name:ja":"ニッポンレンタカー"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/car_rental/日産レンタカー":{name:"日産レンタカー",icon:"maki-car-rental",geometry:["point","area"],tags:{"brand:wikidata":"Q11086838",amenity:"car_rental"},addTags:{amenity:"car_rental",brand:"日産レンタカー","brand:en":"Nissan Car Rental","brand:ja":"日産レンタカー","brand:wikidata":"Q11086838","brand:wikipedia":"ja:日産レンタカー",name:"日産レンタカー","name:en":"Nissan Car Rental","name:ja":"日産レンタカー"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/car_sharing/Bluely":{name:"Bluely",icon:"maki-car",imageURL:"https://graph.facebook.com/bluely.eu/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q16039715",amenity:"car_sharing"},addTags:{amenity:"car_sharing",brand:"Bluely","brand:wikidata":"Q16039715","brand:wikipedia":"fr:Bluely",name:"Bluely"},countryCodes:["fr"],terms:["station bluely"],matchScore:2,suggestion:true},"amenity/car_sharing/Enterprise Car Club":{name:"Enterprise Car Club",icon:"maki-car",imageURL:"https://graph.facebook.com/EnterpriseCarClub/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5123055",amenity:"car_sharing"},addTags:{amenity:"car_sharing",brand:"Enterprise Car Club","brand:wikidata":"Q5123055","brand:wikipedia":"en:Enterprise Car Club",name:"Enterprise Car Club"},countryCodes:["gb"],terms:["city car club"],matchScore:2,suggestion:true},"amenity/car_sharing/Zipcar":{name:"Zipcar",icon:"maki-car",imageURL:"https://graph.facebook.com/zipcar/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1069924",amenity:"car_sharing"},addTags:{amenity:"car_sharing",brand:"Zipcar","brand:wikidata":"Q1069924","brand:wikipedia":"en:Zipcar",name:"Zipcar"},terms:[],matchScore:2,suggestion:true},"amenity/car_sharing/stadtmobil":{name:"stadtmobil",icon:"maki-car",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FStadtmobil%20logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q2327629",amenity:"car_sharing"},addTags:{amenity:"car_sharing",brand:"stadtmobil","brand:wikidata":"Q2327629","brand:wikipedia":"en:Stadtmobil",name:"stadtmobil"},countryCodes:["de"],terms:["stadtmobil carsharing-station"],matchScore:2,suggestion:true},"amenity/charging_station/Blink":{name:"Blink",icon:"fas-charging-station",imageURL:"https://graph.facebook.com/blinknetwork/picture?type=large",geometry:["point"],tags:{"brand:wikidata":"Q62065645",amenity:"charging_station"},addTags:{amenity:"charging_station",brand:"Blink","brand:wikidata":"Q62065645",name:"Blink"},terms:[],matchScore:2,suggestion:true},"amenity/charging_station/ChargePoint":{name:"ChargePoint",icon:"fas-charging-station",imageURL:"https://graph.facebook.com/ChargePoint/picture?type=large",geometry:["point"],tags:{"brand:wikidata":"Q5176149",amenity:"charging_station"},addTags:{amenity:"charging_station",brand:"ChargePoint","brand:wikidata":"Q5176149","brand:wikipedia":"en:ChargePoint",name:"ChargePoint"},terms:[],matchScore:2,suggestion:true},"amenity/charging_station/E-WALD":{name:"E-WALD",icon:"fas-charging-station",imageURL:"https://graph.facebook.com/E.WALD.emobility/picture?type=large",geometry:["point"],tags:{"brand:wikidata":"Q61804335",amenity:"charging_station"},addTags:{amenity:"charging_station",brand:"E-WALD","brand:wikidata":"Q61804335",name:"E-WALD"},terms:["e-wald ladestation"],matchScore:2,suggestion:true},"amenity/charging_station/Enel":{name:"Enel",icon:"fas-charging-station",imageURL:"https://graph.facebook.com/enelsharing/picture?type=large",geometry:["point"],tags:{"brand:wikidata":"Q651222",amenity:"charging_station"},addTags:{amenity:"charging_station",brand:"Enel","brand:wikidata":"Q651222","brand:wikipedia":"en:Enel",name:"Enel"},countryCodes:["it"],terms:["enel - stazione di ricarica"],matchScore:2,suggestion:true},"amenity/charging_station/Tesla Supercharger":{name:"Tesla Supercharger",icon:"fas-charging-station",imageURL:"https://pbs.twimg.com/profile_images/489192650474414080/4RxZxsud_bigger.png",geometry:["point"],tags:{"brand:wikidata":"Q17089620",amenity:"charging_station"},addTags:{amenity:"charging_station",brand:"Tesla Supercharger","brand:wikidata":"Q17089620","brand:wikipedia":"en:Tesla Supercharger",name:"Tesla Supercharger"},terms:[],matchScore:2,suggestion:true},"amenity/charging_station/eVgo":{name:"eVgo",icon:"fas-charging-station",imageURL:"https://graph.facebook.com/160983117271970/picture?type=large",geometry:["point"],tags:{"brand:wikidata":"Q61803820",amenity:"charging_station"},addTags:{amenity:"charging_station",brand:"eVgo","brand:wikidata":"Q61803820",name:"eVgo","operator:wikidata":"Q6955139","operator:wikipedia":"en:NRG Energy"},terms:[],matchScore:2,suggestion:true},"amenity/cinema/109シネマズ":{name:"109シネマズ",icon:"maki-cinema",geometry:["point","area"],tags:{"brand:wikidata":"Q10854269",amenity:"cinema"},addTags:{amenity:"cinema",brand:"109シネマズ","brand:en":"109 Cinemas","brand:ja":"109シネマズ","brand:wikidata":"Q10854269","brand:wikipedia":"ja:109シネマズ",name:"109シネマズ","name:en":"109 Cinemas","name:ja":"109シネマズ",operator:"株式会社 東急レクリエーション","operator:en":"Tokyu Recreation Co., Ltd.","operator:wikidata":"Q11527011","operator:wikipedia":"ja:東急レクリエーション"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/cinema/AMC":{name:"AMC",icon:"maki-cinema",imageURL:"https://graph.facebook.com/amctheatres/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q294721",amenity:"cinema"},addTags:{amenity:"cinema",brand:"AMC","brand:wikidata":"Q294721","brand:wikipedia":"en:AMC Theatres",name:"AMC"},terms:[],matchScore:2,suggestion:true},"amenity/cinema/CineStar":{name:"CineStar",icon:"maki-cinema",imageURL:"https://graph.facebook.com/CineStarDE/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q321889",amenity:"cinema"},addTags:{amenity:"cinema",brand:"CineStar","brand:wikidata":"Q321889","brand:wikipedia":"de:Cinestar",name:"CineStar"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"amenity/cinema/Cinema City":{name:"Cinema City",icon:"maki-cinema",imageURL:"https://graph.facebook.com/CinemaCityPoland/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q543651",amenity:"cinema"},addTags:{amenity:"cinema",brand:"Cinema City","brand:wikidata":"Q543651","brand:wikipedia":"en:Cinema City International",name:"Cinema City"},terms:[],matchScore:2,suggestion:true},"amenity/cinema/Cinemark":{name:"Cinemark",icon:"maki-cinema",imageURL:"https://graph.facebook.com/cinemarkoficial/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q707530",amenity:"cinema"},addTags:{amenity:"cinema",brand:"Cinemark","brand:wikidata":"Q707530","brand:wikipedia":"en:Cinemark Theatres",name:"Cinemark"},terms:[],matchScore:2,suggestion:true},"amenity/cinema/Cinemex":{name:"Cinemex",icon:"maki-cinema",imageURL:"https://graph.facebook.com/Cinemex/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3333072",amenity:"cinema"},addTags:{amenity:"cinema",brand:"Cinemex","brand:wikidata":"Q3333072","brand:wikipedia":"en:Cinemex",name:"Cinemex"},terms:[],matchScore:2,suggestion:true},"amenity/cinema/Cineplanet":{name:"Cineplanet",icon:"maki-cinema",imageURL:"https://graph.facebook.com/cineplanet/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5769680",amenity:"cinema"},addTags:{amenity:"cinema",brand:"Cineplanet","brand:wikidata":"Q5769680","brand:wikipedia":"es:Cineplanet",name:"Cineplanet",operator:"Grupo Intercorp","operator:wikidata":"Q23008916","operator:wikipedia":"es:Intercorp"},terms:[],matchScore:2,suggestion:true},"amenity/cinema/Cineplexx":{name:"Cineplexx",icon:"maki-cinema",imageURL:"https://pbs.twimg.com/profile_images/1125406971023306754/aVpG7gAl_bigger.png",geometry:["point","area"],tags:{"brand:wikidata":"Q873340",amenity:"cinema"},addTags:{amenity:"cinema",brand:"Cineplexx","brand:wikidata":"Q873340","brand:wikipedia":"en:Cineplexx Cinemas",name:"Cineplexx"},terms:[],matchScore:2,suggestion:true},"amenity/cinema/Cinepolis":{name:"Cinepolis",icon:"maki-cinema",imageURL:"https://graph.facebook.com/cinepolisbrasil/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5686673",amenity:"cinema"},addTags:{amenity:"cinema",brand:"Cinepolis","brand:wikidata":"Q5686673","brand:wikipedia":"en:Cinépolis",name:"Cinepolis"},terms:[],matchScore:2,suggestion:true},"amenity/cinema/Cineworld":{name:"Cineworld",icon:"maki-cinema",imageURL:"https://graph.facebook.com/cineworld/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5120901",amenity:"cinema"},addTags:{amenity:"cinema",brand:"Cineworld","brand:wikidata":"Q5120901","brand:wikipedia":"en:Cineworld",name:"Cineworld"},terms:[],matchScore:2,suggestion:true},"amenity/cinema/MOVIX":{name:"MOVIX",icon:"maki-cinema",geometry:["point","area"],tags:{"brand:wikidata":"Q11532184",amenity:"cinema"},addTags:{amenity:"cinema",brand:"MOVIX","brand:wikidata":"Q11532184","brand:wikipedia":"ja:松竹マルチプレックスシアターズ",name:"MOVIX",official_name:"松竹マルチプレックスシアターズ","official_name:en":"Shochiku Multiplex Theatres",operator:"株式会社松竹マルチプレックスシアターズ","operator:en":"Shochiku Multiplex Theatres, Ltd."},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/cinema/Multikino":{name:"Multikino",icon:"maki-cinema",imageURL:"https://graph.facebook.com/MultikinoPolska/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1144802",amenity:"cinema"},addTags:{amenity:"cinema",brand:"Multikino","brand:wikidata":"Q1144802","brand:wikipedia":"pl:Multikino",name:"Multikino"},countryCodes:["pl"],terms:[],matchScore:2,suggestion:true},"amenity/cinema/Odeon":{name:"Odeon",icon:"maki-cinema",imageURL:"https://graph.facebook.com/ODEON/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6127470",amenity:"cinema"},addTags:{amenity:"cinema",brand:"Odeon","brand:wikidata":"Q6127470","brand:wikipedia":"en:Odeon Cinemas",name:"Odeon"},terms:[],matchScore:2,suggestion:true},"amenity/cinema/TOHOシネマズ":{name:"TOHOシネマズ",icon:"maki-cinema",geometry:["point","area"],tags:{"brand:wikidata":"Q11235261",amenity:"cinema"},addTags:{amenity:"cinema",brand:"TOHOシネマズ","brand:en":"TOHO CINEMAS","brand:ja":"TOHOシネマズ","brand:wikidata":"Q11235261","brand:wikipedia":"ja:TOHOシネマズ",name:"TOHOシネマズ","name:en":"Toho Cinemas","name:ja":"TOHOシネマズ",operator:"TOHOシネマズ株式会社","operator:en":"TOHO CINEMAS LTD."},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/cinema/Vue":{name:"Vue",icon:"maki-cinema",imageURL:"https://pbs.twimg.com/profile_images/669120346264616960/4dy8ZO9Z_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q2535134",amenity:"cinema"},addTags:{amenity:"cinema",brand:"Vue International","brand:wikidata":"Q2535134","brand:wikipedia":"en:Vue Cinemas",name:"Vue"},countryCodes:["de","dk","gb","ie","it","lt","lv","nl","tw"],terms:["vue cinema"],matchScore:2,suggestion:true},"amenity/cinema/イオンシネマ":{name:"イオンシネマ",icon:"maki-cinema",geometry:["point","area"],tags:{"brand:wikidata":"Q17192792",amenity:"cinema"},addTags:{amenity:"cinema",brand:"イオンシネマ","brand:en":"AEON Cinema","brand:ja":"イオンシネマ","brand:wikidata":"Q17192792","brand:wikipedia":"ja:イオンエンターテイメント",name:"イオンシネマ","name:en":"AEON Cinema","name:ja":"イオンシネマ",operator:"イオンエンターテイメント株式会社","operator:en":"Aeon Entertainment Co., Ltd."},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/cinema/ユナイテッド・シネマ":{name:"ユナイテッド・シネマ",icon:"maki-cinema",imageURL:"https://graph.facebook.com/unitedcinemasgroup/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11345629",amenity:"cinema"},addTags:{amenity:"cinema",brand:"ユナイテッド・シネマ","brand:en":"United Cinemas","brand:ja":"ユナイテッド・シネマ","brand:wikidata":"Q11345629","brand:wikipedia":"ja:ユナイテッド・シネマ",name:"ユナイテッド・シネマ","name:en":"United Cinemas","name:ja":"ユナイテッド・シネマ",operator:"ユナイテッド・シネマ株式会社","operator:en":"UNITED CINEMAS CO., LTD."},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/clinic/DaVita Dialysis":{name:"DaVita Dialysis",icon:"maki-doctor",imageURL:"https://graph.facebook.com/davitakidneycare/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5207184",amenity:"clinic"},addTags:{amenity:"clinic",brand:"DaVita Dialysis","brand:wikidata":"Q5207184",healthcare:"dialysis","healthcare:speciality":"dialysis",name:"DaVita Dialysis"},reference:{key:"amenity",value:"clinic"},countryCodes:["us"],terms:["davita","davita kidney care"],matchScore:2,suggestion:true},"amenity/clinic/Dialysis Clinic":{name:"Dialysis Clinic",icon:"maki-doctor",imageURL:"https://graph.facebook.com/davitakidneycare/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5207184",amenity:"clinic"},addTags:{amenity:"clinic",brand:"Dialysis Clinic","brand:wikidata":"Q5207184","brand:wikipedia":"en:Dialysis Clinic, Inc.",healthcare:"dialysis","healthcare:speciality":"dialysis",name:"Dialysis Clinic",short_name:"DCI"},reference:{key:"amenity",value:"clinic"},countryCodes:["us"],terms:["dci","dialysis clinic inc"],matchScore:2,suggestion:true},"amenity/clinic/Fresenius Kidney Care":{name:"Fresenius Kidney Care",icon:"maki-doctor",imageURL:"https://graph.facebook.com/freseniuskidneycare/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q650259",amenity:"clinic"},addTags:{amenity:"clinic",brand:"Fresenius Kidney Care","brand:wikidata":"Q650259","brand:wikipedia":"en:Fresenius Medical Care",healthcare:"dialysis","healthcare:speciality":"dialysis",name:"Fresenius Kidney Care"},reference:{key:"amenity",value:"clinic"},terms:[],matchScore:2,suggestion:true},"amenity/clinic/Fresenius Medical Care":{name:"Fresenius Medical Care",icon:"maki-doctor",imageURL:"https://graph.facebook.com/freseniuskidneycare/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q650259",amenity:"clinic"},addTags:{amenity:"clinic",brand:"Fresenius Medical Care","brand:wikidata":"Q650259","brand:wikipedia":"en:Fresenius Medical Care",healthcare:"dialysis","healthcare:speciality":"dialysis",name:"Fresenius Medical Care"},reference:{key:"amenity",value:"clinic"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/clinic/Satellite Healthcare":{name:"Satellite Healthcare",icon:"maki-doctor",imageURL:"https://graph.facebook.com/satellitehealthcare/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q50039787",amenity:"clinic"},addTags:{amenity:"clinic",brand:"Satellite Healthcare","brand:wikidata":"Q50039787",healthcare:"dialysis","healthcare:speciality":"dialysis",name:"Satellite Healthcare"},reference:{key:"amenity",value:"clinic"},countryCodes:["us"],terms:["satellite","satellite dialysis"],matchScore:2,suggestion:true},"amenity/dentist/Aspen Dental":{name:"Aspen Dental",icon:"maki-dentist",imageURL:"https://graph.facebook.com/AspenDental/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4807808",amenity:"dentist"},addTags:{amenity:"dentist",brand:"Aspen Dental","brand:wikidata":"Q4807808","brand:wikipedia":"en:Aspen Dental",healthcare:"dentist",name:"Aspen Dental"},reference:{key:"amenity",value:"dentist"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/burger/A&W (Canada)":{name:"A&W (Canada)",icon:"maki-fast-food",imageURL:"https://pbs.twimg.com/profile_images/434046919812214784/sTmhuLO-_bigger.png",geometry:["point","area"],tags:{"brand:wikidata":"Q2818848",amenity:"fast_food",cuisine:"burger"},addTags:{amenity:"fast_food",brand:"A&W","brand:wikidata":"Q2818848","brand:wikipedia":"en:A&W (Canada)",cuisine:"burger",name:"A&W",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/burger/A&W (USA)":{name:"A&W (USA)",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/awrestaurants/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q277641",amenity:"fast_food",cuisine:"burger"},addTags:{amenity:"fast_food",brand:"A&W","brand:wikidata":"Q277641","brand:wikipedia":"en:A&W Restaurants",cuisine:"burger",name:"A&W",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/chicken/Andok's":{name:"Andok's",icon:"fas-drumstick-bite",imageURL:"https://graph.facebook.com/andokslitsonmanok/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62267166",amenity:"fast_food",cuisine:"chicken"},addTags:{amenity:"fast_food",brand:"Andok's","brand:wikidata":"Q62267166",cuisine:"chicken",name:"Andok's",takeaway:"yes"},reference:{key:"cuisine",value:"chicken"},countryCodes:["ph"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/burger/Angel's Burger":{name:"Angel's Burger",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/angelsburgerofficial/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62267228",amenity:"fast_food",cuisine:"burger"},addTags:{amenity:"fast_food",brand:"Angel's Burger","brand:wikidata":"Q62267228",cuisine:"burger",name:"Angel's Burger",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},countryCodes:["ph"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/sandwich/Arby's":{name:"Arby's",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/arbys/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q630866",amenity:"fast_food",cuisine:"sandwich"},addTags:{amenity:"fast_food",brand:"Arby's","brand:wikidata":"Q630866","brand:wikipedia":"en:Arby's",cuisine:"sandwich",name:"Arby's",takeaway:"yes"},reference:{key:"cuisine",value:"sandwich"},terms:[],matchScore:2,suggestion:true},"amenity/fast_food/sandwich/Au Bon Pain":{name:"Au Bon Pain",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/aubonpain/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4818942",amenity:"fast_food",cuisine:"sandwich"},addTags:{amenity:"fast_food",brand:"Au Bon Pain","brand:wikidata":"Q4818942","brand:wikipedia":"en:Au Bon Pain",cuisine:"sandwich",name:"Au Bon Pain",takeaway:"yes"},reference:{key:"cuisine",value:"sandwich"},countryCodes:["in","th","us"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/Auntie Anne's":{name:"Auntie Anne's",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/auntieannespretzels/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4822010",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"Auntie Anne's","brand:wikidata":"Q4822010","brand:wikipedia":"en:Auntie Anne's",cuisine:"pretzel",name:"Auntie Anne's",takeaway:"yes"},terms:[],matchScore:2,suggestion:true},"amenity/fast_food/mexican/Baja Fresh":{name:"Baja Fresh",icon:"fas-pepper-hot",imageURL:"https://graph.facebook.com/bajafresh/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2880019",amenity:"fast_food",cuisine:"mexican"},addTags:{amenity:"fast_food",brand:"Baja Fresh","brand:wikidata":"Q2880019","brand:wikipedia":"en:Baja Fresh",cuisine:"mexican",name:"Baja Fresh",takeaway:"yes"},reference:{key:"cuisine",value:"mexican"},terms:[],matchScore:2,suggestion:true},"amenity/fast_food/burger/Bembos":{name:"Bembos",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/bembos/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q466971",amenity:"fast_food",cuisine:"burger"},addTags:{amenity:"fast_food",brand:"Bembos","brand:wikidata":"Q466971","brand:wikipedia":"en:Bembos",cuisine:"burger",name:"Bembos",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},countryCodes:["pe"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/burger/Bob's":{name:"Bob's",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/bobsbrasil/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1392113",amenity:"fast_food",cuisine:"burger"},addTags:{amenity:"fast_food",brand:"Bob's","brand:wikidata":"Q1392113","brand:wikipedia":"en:Bob's",cuisine:"burger",name:"Bob's",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},countryCodes:["ao","br","cl","pt"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/chicken/Bojangles'":{name:"Bojangles'",icon:"fas-drumstick-bite",imageURL:"https://graph.facebook.com/Bojangles1977/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q891163",amenity:"fast_food",cuisine:"chicken"},addTags:{amenity:"fast_food",brand:"Bojangles'","brand:wikidata":"Q891163","brand:wikipedia":"en:Bojangles' Famous Chicken 'n Biscuits",cuisine:"chicken",name:"Bojangles'",official_name:"Bojangles' Famous Chicken 'n Biscuits",takeaway:"yes"},reference:{key:"cuisine",value:"chicken"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/Booster Juice":{name:"Booster Juice",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/boosterjuice/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4943796",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"Booster Juice","brand:wikidata":"Q4943796","brand:wikipedia":"en:Booster Juice",cuisine:"juice",name:"Booster Juice",takeaway:"yes"},terms:[],matchScore:2,suggestion:true},"amenity/fast_food/Boston Market":{name:"Boston Market",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/BostonMarket/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q603617",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"Boston Market","brand:wikidata":"Q603617","brand:wikipedia":"en:Boston Market",cuisine:"american",name:"Boston Market",takeaway:"yes"},terms:[],matchScore:2,suggestion:true},"amenity/fast_food/ice_cream/Braum's":{name:"Braum's",icon:"fas-ice-cream",imageURL:"https://graph.facebook.com/BraumsIceCreamandDairyStores/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4958263",amenity:"fast_food",cuisine:"ice_cream"},addTags:{amenity:"fast_food",brand:"Braum's","brand:wikidata":"Q4958263","brand:wikipedia":"en:Braum's",cuisine:"ice_cream",name:"Braum's",shop:"dairy",takeaway:"yes"},reference:{key:"cuisine",value:"ice_cream"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/Bruegger's Bagels":{name:"Bruegger's Bagels",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/Brueggers/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4978656",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"Bruegger's Bagels","brand:wikidata":"Q4978656","brand:wikipedia":"en:Bruegger's",cuisine:"bagel",name:"Bruegger's Bagels",takeaway:"yes"},countryCodes:["us"],terms:["breuger's","breugger's","bruegger's","bruger's","brugger's"],matchScore:2,suggestion:true},"amenity/fast_food/burger/Burger King":{name:"Burger King",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/burgerking/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q177054",amenity:"fast_food",cuisine:"burger"},addTags:{amenity:"fast_food",brand:"Burger King","brand:wikidata":"Q177054","brand:wikipedia":"en:Burger King",cuisine:"burger",name:"Burger King",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},terms:["burguer king"],matchScore:2,suggestion:true},"amenity/fast_food/burger/Burger Machine":{name:"Burger Machine",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/burgermachineofficial/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4998549",amenity:"fast_food",cuisine:"burger"},addTags:{amenity:"fast_food",brand:"Burger Machine","brand:wikidata":"Q4998549","brand:wikipedia":"en:Burger Machine",cuisine:"burger",name:"Burger Machine",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},countryCodes:["ph"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/burger/BurgerFi":{name:"BurgerFi",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/BurgerFi/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q39045496",amenity:"fast_food",cuisine:"burger"},addTags:{amenity:"fast_food",brand:"BurgerFi","brand:wikidata":"Q39045496","brand:wikipedia":"en:BurgerFi",cuisine:"burger",name:"BurgerFi",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/Captain D's":{name:"Captain D's",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/CaptainDs/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5036616",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"Captain D's","brand:wikidata":"Q5036616","brand:wikipedia":"en:Captain D's",cuisine:"seafood",name:"Captain D's",takeaway:"yes"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/burger/Carl's Jr.":{name:"Carl's Jr.",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/carlsjr/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1043486",amenity:"fast_food",cuisine:"burger"},addTags:{amenity:"fast_food",brand:"Carl's Jr.","brand:wikidata":"Q1043486","brand:wikipedia":"en:Carl's Jr.",cuisine:"burger",name:"Carl's Jr.",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},terms:[],matchScore:2,suggestion:true},"amenity/fast_food/sandwich/Charleys Philly Steaks":{name:"Charleys Philly Steaks",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/CharleysPhillySteaks/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1066777",amenity:"fast_food",cuisine:"sandwich"},addTags:{amenity:"fast_food",brand:"Charleys Philly Steaks","brand:wikidata":"Q1066777","brand:wikipedia":"en:Charleys Philly Steaks",cuisine:"sandwich",name:"Charleys Philly Steaks",takeaway:"yes"},reference:{key:"cuisine",value:"sandwich"},countryCodes:["us"],terms:["charleys"],matchScore:2,suggestion:true},"amenity/fast_food/burger/Checkers":{name:"Checkers",icon:"maki-fast-food",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FCheckers%20logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q63919315",amenity:"fast_food",cuisine:"burger"},addTags:{amenity:"fast_food",brand:"Checkers","brand:wikidata":"Q63919315",cuisine:"burger",name:"Checkers",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},terms:[],matchScore:2,suggestion:true},"amenity/fast_food/chicken/Chick-fil-A":{name:"Chick-fil-A",icon:"fas-drumstick-bite",imageURL:"https://graph.facebook.com/ChickfilA/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q491516",amenity:"fast_food",cuisine:"chicken"},addTags:{amenity:"fast_food",brand:"Chick-fil-A","brand:wikidata":"Q491516","brand:wikipedia":"en:Chick-fil-A",cuisine:"chicken",name:"Chick-fil-A",takeaway:"yes"},reference:{key:"cuisine",value:"chicken"},terms:[],matchScore:2,suggestion:true},"amenity/fast_food/chicken/Chicken Express":{name:"Chicken Express",icon:"fas-drumstick-bite",imageURL:"https://graph.facebook.com/chickenexpress/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5096235",amenity:"fast_food",cuisine:"chicken"},addTags:{amenity:"fast_food",brand:"Chicken Express","brand:wikidata":"Q5096235","brand:wikipedia":"en:Chicken Express",cuisine:"chicken",name:"Chicken Express",takeaway:"yes"},reference:{key:"cuisine",value:"chicken"},terms:[],matchScore:2,suggestion:true},"amenity/fast_food/China Wok":{name:"China Wok",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/ChinaWokPeru/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5766542",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"China Wok","brand:wikidata":"Q5766542","brand:wikipedia":"es:China Wok",cuisine:"chinese",name:"China Wok",takeaway:"yes"},terms:[],matchScore:2,suggestion:true},"amenity/fast_food/mexican/Chipotle":{name:"Chipotle",icon:"fas-pepper-hot",imageURL:"https://graph.facebook.com/chipotle/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q465751",amenity:"fast_food",cuisine:"mexican"},addTags:{amenity:"fast_food",brand:"Chipotle","brand:wikidata":"Q465751","brand:wikipedia":"en:Chipotle Mexican Grill",cuisine:"mexican",name:"Chipotle",official_name:"Chipotle Mexican Grill",takeaway:"yes"},reference:{key:"cuisine",value:"mexican"},terms:["chipotle mexican grill"],matchScore:2,suggestion:true},"amenity/fast_food/Chopt":{name:"Chopt",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/choptsalad/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q17509305",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"Chopt","brand:wikidata":"Q17509305","brand:wikipedia":"en:Chopt",cuisine:"salad",name:"Chopt",takeaway:"yes"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/Chowking":{name:"Chowking",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/chowkingph/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1076816",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"Chowking","brand:wikidata":"Q1076816","brand:wikipedia":"en:Chowking",cuisine:"asian",name:"Chowking",takeaway:"yes"},terms:[],matchScore:2,suggestion:true},"amenity/fast_food/chicken/Church's Chicken":{name:"Church's Chicken",icon:"fas-drumstick-bite",imageURL:"https://graph.facebook.com/churchschicken/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1089932",amenity:"fast_food",cuisine:"chicken"},addTags:{amenity:"fast_food",brand:"Church's Chicken","brand:wikidata":"Q1089932","brand:wikipedia":"en:Church's Chicken",cuisine:"chicken",name:"Church's Chicken",takeaway:"yes"},reference:{key:"cuisine",value:"chicken"},terms:[],matchScore:2,suggestion:true},"amenity/fast_food/Cinnabon":{name:"Cinnabon",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/Cinnabon/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1092539",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"Cinnabon","brand:website":"https://www.cinnabon.com/","brand:wikidata":"Q1092539","brand:wikipedia":"en:Cinnabon",cuisine:"dessert",name:"Cinnabon",takeaway:"yes"},terms:[],matchScore:2,suggestion:true},"amenity/fast_food/CoCo壱番屋":{name:"CoCo壱番屋",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/cocoichicurry/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5986105",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"CoCo壱番屋","brand:en":"Ichibanya","brand:wikidata":"Q5986105","brand:wikipedia":"en:Ichibanya",cuisine:"japanese",name:"CoCo壱番屋","name:en":"Ichibanya",takeaway:"yes"},countryCodes:["cn","jp"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/Cook Out":{name:"Cook Out",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/CookOut/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5166992",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"Cook Out","brand:wikidata":"Q5166992","brand:wikipedia":"en:Cook Out (restaurant)",cuisine:"american",name:"Cook Out",takeaway:"yes"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/burger/Culver's":{name:"Culver's",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/culvers/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1143589",amenity:"fast_food",cuisine:"burger"},addTags:{amenity:"fast_food",brand:"Culver's","brand:wikidata":"Q1143589","brand:wikipedia":"en:Culver's",cuisine:"burger",name:"Culver's",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},terms:[],matchScore:2,suggestion:true},"amenity/fast_food/ice_cream/DQ Grill & Chill":{name:"DQ Grill & Chill",icon:"fas-ice-cream",imageURL:"https://graph.facebook.com/dairyqueen/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1141226",amenity:"fast_food",cuisine:"ice_cream;burger"},addTags:{amenity:"fast_food",brand:"DQ Grill & Chill","brand:wikidata":"Q1141226","brand:wikipedia":"en:Dairy Queen",cuisine:"ice_cream;burger",name:"DQ Grill & Chill",takeaway:"yes"},reference:{key:"cuisine",value:"ice_cream"},terms:[],matchScore:2,suggestion:true},"amenity/fast_food/ice_cream/Dairy Queen":{name:"Dairy Queen",icon:"fas-ice-cream",imageURL:"https://graph.facebook.com/dairyqueen/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1141226",amenity:"fast_food",cuisine:"ice_cream;burger"},addTags:{amenity:"fast_food",brand:"Dairy Queen","brand:wikidata":"Q1141226","brand:wikipedia":"en:Dairy Queen",cuisine:"ice_cream;burger",name:"Dairy Queen",takeaway:"yes"},reference:{key:"cuisine",value:"ice_cream"},terms:["dq"],matchScore:2,suggestion:true},"amenity/fast_food/donut/Daylight Donuts":{name:"Daylight Donuts",icon:"temaki-donut",imageURL:"https://graph.facebook.com/DaylightDonutFlourCo/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q48970508",amenity:"fast_food",cuisine:"donut"},addTags:{amenity:"fast_food",brand:"Daylight Donuts","brand:wikidata":"Q48970508","brand:wikipedia":"en:Daylight Donuts",cuisine:"donut",name:"Daylight Donuts",takeaway:"yes"},reference:{key:"cuisine",value:"donut"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/mexican/Del Taco":{name:"Del Taco",icon:"fas-pepper-hot",imageURL:"https://graph.facebook.com/deltaco/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1183818",amenity:"fast_food",cuisine:"mexican"},addTags:{amenity:"fast_food",brand:"Del Taco","brand:wikidata":"Q1183818","brand:wikipedia":"en:Del Taco",cuisine:"mexican",name:"Del Taco",takeaway:"yes"},reference:{key:"cuisine",value:"mexican"},terms:[],matchScore:2,suggestion:true},"amenity/fast_food/Dig Inn":{name:"Dig Inn",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/diginnmarket/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q28226241",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"Dig Inn","brand:wikidata":"Q28226241","brand:wikipedia":"en:Dig Inn",cuisine:"regional",name:"Dig Inn",takeaway:"yes"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/pizza/Domino's Pizza":{name:"Domino's Pizza",icon:"maki-restaurant-pizza",imageURL:"https://graph.facebook.com/Dominos/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q839466",amenity:"fast_food",cuisine:"pizza"},addTags:{amenity:"fast_food",brand:"Domino's Pizza","brand:wikidata":"Q839466","brand:wikipedia":"en:Domino's Pizza",cuisine:"pizza",name:"Domino's Pizza",takeaway:"yes"},reference:{key:"cuisine",value:"pizza"},terms:["dominos"],matchScore:2,suggestion:true},"amenity/fast_food/donut/Dunkin' Donuts":{name:"Dunkin' Donuts",icon:"temaki-donut",imageURL:"https://graph.facebook.com/DunkinUS/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q847743",amenity:"fast_food",cuisine:"donut;coffee"},addTags:{amenity:"fast_food",brand:"Dunkin' Donuts","brand:wikidata":"Q847743","brand:wikipedia":"en:Dunkin' Donuts",cuisine:"donut;coffee",name:"Dunkin' Donuts",takeaway:"yes"},reference:{key:"cuisine",value:"donut"},terms:["dunkin doughnuts"],matchScore:2,suggestion:true},"amenity/fast_food/Einstein Bros. Bagels":{name:"Einstein Bros. Bagels",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/einsteinbros/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5349788",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"Einstein Bros. Bagels","brand:wikidata":"Q5349788","brand:wikipedia":"en:Einstein Bros. Bagels",cuisine:"bagel",name:"Einstein Bros. Bagels",takeaway:"yes"},countryCodes:["us"],terms:["einstein bros","einstein brothers","einstein brothers bagels"],matchScore:2,suggestion:true},"amenity/fast_food/mexican/El Pollo Loco":{name:"El Pollo Loco",icon:"fas-pepper-hot",imageURL:"https://graph.facebook.com/ElPolloLoco/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2353849",amenity:"fast_food",cuisine:"mexican"},addTags:{amenity:"fast_food",brand:"El Pollo Loco","brand:wikidata":"Q2353849","brand:wikipedia":"en:El Pollo Loco",cuisine:"mexican",name:"El Pollo Loco",takeaway:"yes"},reference:{key:"cuisine",value:"mexican"},terms:[],matchScore:2,suggestion:true},"amenity/fast_food/burger/Everest":{name:"Everest",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/everest.gr/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62273299",amenity:"fast_food",cuisine:"burger"},addTags:{amenity:"fast_food",brand:"Everest","brand:wikidata":"Q62273299",cuisine:"burger",name:"Everest",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},countryCodes:["gr"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/Extreme Pita":{name:"Extreme Pita",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/TheExtremePita/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5422367",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"Extreme Pita","brand:wikidata":"Q5422367","brand:wikipedia":"en:Extreme Pita",cuisine:"pita",name:"Extreme Pita",takeaway:"yes"},terms:[],matchScore:2,suggestion:true},"amenity/fast_food/Fazoli's":{name:"Fazoli's",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/Fazolis/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1399195",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"Fazoli's","brand:wikidata":"Q1399195","brand:wikipedia":"en:Fazoli's",cuisine:"italian",name:"Fazoli's",takeaway:"yes"},terms:[],matchScore:2,suggestion:true},"amenity/fast_food/sandwich/Firehouse Subs":{name:"Firehouse Subs",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/firehousesubs/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5451873",amenity:"fast_food",cuisine:"sandwich"},addTags:{amenity:"fast_food",brand:"Firehouse Subs","brand:wikidata":"Q5451873","brand:wikipedia":"en:Firehouse Subs",cuisine:"sandwich",name:"Firehouse Subs",takeaway:"yes"},reference:{key:"cuisine",value:"sandwich"},terms:[],matchScore:2,suggestion:true},"amenity/fast_food/burger/Five Guys":{name:"Five Guys",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/fiveguys/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1131810",amenity:"fast_food",cuisine:"burger"},addTags:{amenity:"fast_food",brand:"Five Guys","brand:wikidata":"Q1131810","brand:wikipedia":"en:Five Guys",cuisine:"burger",name:"Five Guys",official_name:"Five Guys Burgers and Fries",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},terms:["five guys burgers and fries"],matchScore:2,suggestion:true},"amenity/fast_food/ice_cream/Freddy's":{name:"Freddy's",icon:"fas-ice-cream",imageURL:"https://graph.facebook.com/FreddysUSA/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5496837",amenity:"fast_food",cuisine:"ice_cream;burger"},addTags:{amenity:"fast_food",brand:"Freddy's","brand:wikidata":"Q5496837","brand:wikipedia":"en:Freddy's Frozen Custard & Steakburgers",cuisine:"ice_cream;burger",name:"Freddy's",takeaway:"yes"},reference:{key:"cuisine",value:"ice_cream"},terms:["freddy's frozen custard & steakburgers"],matchScore:2,suggestion:true},"amenity/fast_food/mexican/Freebirds":{name:"Freebirds",icon:"fas-pepper-hot",imageURL:"https://graph.facebook.com/freebirdsworldburrito/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5500367",amenity:"fast_food",cuisine:"mexican"},addTags:{amenity:"fast_food",brand:"Freebirds","brand:wikidata":"Q5500367","brand:wikipedia":"en:Freebirds World Burrito",cuisine:"mexican",name:"Freebirds",takeaway:"yes"},reference:{key:"cuisine",value:"mexican"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/pizza/Gabriel Pizza":{name:"Gabriel Pizza",icon:"maki-restaurant-pizza",imageURL:"https://graph.facebook.com/gabrielpizza/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5515791",amenity:"fast_food",cuisine:"pizza"},addTags:{amenity:"fast_food",brand:"Gabriel Pizza","brand:wikidata":"Q5515791","brand:wikipedia":"en:Gabriel Pizza",cuisine:"pizza",name:"Gabriel Pizza",takeaway:"yes"},reference:{key:"cuisine",value:"pizza"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/Gold Star Chili":{name:"Gold Star Chili",icon:"maki-fast-food",imageURL:"https://pbs.twimg.com/profile_images/850405811494895617/FZSowiLf_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q16994254",amenity:"fast_food"},addTags:{alt_name:"Gold Star",amenity:"fast_food",brand:"Gold Star Chili","brand:wikidata":"Q16994254","brand:wikipedia":"en:Gold Star Chili",cuisine:"chili",name:"Gold Star Chili",takeaway:"yes"},countryCodes:["us"],terms:["gold star"],matchScore:2,suggestion:true},"amenity/fast_food/Golden Krust Caribbean Bakery & Grill":{name:"Golden Krust Caribbean Bakery & Grill",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/GoldenKrust/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5579615",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"Golden Krust Caribbean Bakery & Grill","brand:wikidata":"Q5579615","brand:wikipedia":"en:Golden Krust Caribbean Bakery & Grill",cuisine:"caribbean",name:"Golden Krust",takeaway:"yes"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/pizza/Greenwich":{name:"Greenwich",icon:"maki-restaurant-pizza",imageURL:"https://graph.facebook.com/GreenwichPizza/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2691308",amenity:"fast_food",cuisine:"pizza"},addTags:{amenity:"fast_food",brand:"Greenwich","brand:wikidata":"Q2691308","brand:wikipedia":"en:Greenwich Pizza",cuisine:"pizza",name:"Greenwich",takeaway:"yes"},reference:{key:"cuisine",value:"pizza"},terms:[],matchScore:2,suggestion:true},"amenity/fast_food/Habib's":{name:"Habib's",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/habibsoficial/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2504930",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"Habib's","brand:wikidata":"Q2504930","brand:wikipedia":"en:Habib's",cuisine:"middle_eastern",name:"Habib's",takeaway:"yes"},countryCodes:["br","mx"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/pizza/Hallo Pizza":{name:"Hallo Pizza",icon:"maki-restaurant-pizza",imageURL:"https://graph.facebook.com/Hallo.Pizza.Deutschland/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1571798",amenity:"fast_food",cuisine:"pizza"},addTags:{amenity:"fast_food",brand:"Hallo Pizza","brand:wikidata":"Q1571798","brand:wikipedia":"de:Hallo Pizza",cuisine:"pizza",name:"Hallo Pizza",takeaway:"yes"},reference:{key:"cuisine",value:"pizza"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/burger/Hardee's":{name:"Hardee's",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/hardees/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1585088",amenity:"fast_food",cuisine:"burger"},addTags:{amenity:"fast_food",brand:"Hardee's","brand:wikidata":"Q1585088","brand:wikipedia":"en:Hardee's",cuisine:"burger",name:"Hardee's",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},terms:[],matchScore:2,suggestion:true},"amenity/fast_food/burger/Harvey's":{name:"Harvey's",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/HarveysCanada/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1466184",amenity:"fast_food",cuisine:"burger"},addTags:{amenity:"fast_food",brand:"Harvey's","brand:wikidata":"Q1466184","brand:wikipedia":"en:Harvey's",cuisine:"burger",name:"Harvey's",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/burger/Hesburger":{name:"Hesburger",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/hesburger/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1276832",amenity:"fast_food",cuisine:"burger"},addTags:{amenity:"fast_food",brand:"Hesburger","brand:wikidata":"Q1276832","brand:wikipedia":"en:Hesburger",cuisine:"burger",name:"Hesburger",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},terms:[],matchScore:2,suggestion:true},"amenity/fast_food/Hot Dog on a Stick":{name:"Hot Dog on a Stick",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/HotDogonaStick/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5909922",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"Hot Dog on a Stick","brand:wikidata":"Q5909922","brand:wikipedia":"en:Hot Dog on a Stick",cuisine:"hot_dog",name:"Hot Dog on a Stick",takeaway:"yes"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/mexican/Hot Head Burritos":{name:"Hot Head Burritos",icon:"fas-pepper-hot",imageURL:"https://graph.facebook.com/HotHeadBurritos/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5910008",amenity:"fast_food",cuisine:"mexican"},addTags:{amenity:"fast_food",brand:"Hot Head Burritos","brand:wikidata":"Q5910008","brand:wikipedia":"en:Hot Head Burritos",cuisine:"mexican",name:"Hot Head Burritos",takeaway:"yes"},reference:{key:"cuisine",value:"mexican"},countryCodes:["us"],terms:["hot head"],matchScore:2,suggestion:true},"amenity/fast_food/pizza/Hungry Howie's":{name:"Hungry Howie's",icon:"maki-restaurant-pizza",imageURL:"https://graph.facebook.com/hungryhowies/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q16985303",amenity:"fast_food",cuisine:"pizza"},addTags:{amenity:"fast_food",brand:"Hungry Howie's","brand:wikidata":"Q16985303","brand:wikipedia":"en:Hungry Howie's Pizza",cuisine:"pizza",name:"Hungry Howie's",takeaway:"yes"},reference:{key:"cuisine",value:"pizza"},countryCodes:["us"],terms:["hungry howies pizza"],matchScore:2,suggestion:true},"amenity/fast_food/burger/Hungry Jacks":{name:"Hungry Jacks",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/HungryJacks/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3036373",amenity:"fast_food",cuisine:"burger"},addTags:{amenity:"fast_food",brand:"Hungry Jacks","brand:wikidata":"Q3036373","brand:wikipedia":"en:Hungry Jack's",cuisine:"burger",name:"Hungry Jacks",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},countryCodes:["au"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/burger/In-N-Out Burger":{name:"In-N-Out Burger",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/innout/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1205312",amenity:"fast_food",cuisine:"burger"},addTags:{amenity:"fast_food",brand:"In-N-Out Burger","brand:wikidata":"Q1205312","brand:wikipedia":"en:In-N-Out Burger",cuisine:"burger",name:"In-N-Out Burger",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},terms:[],matchScore:2,suggestion:true},"amenity/fast_food/burger/Jack in the Box":{name:"Jack in the Box",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/jackinthebox/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1538507",amenity:"fast_food",cuisine:"burger"},addTags:{amenity:"fast_food",brand:"Jack in the Box","brand:wikidata":"Q1538507","brand:wikipedia":"en:Jack in the Box",cuisine:"burger",name:"Jack in the Box",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},terms:[],matchScore:2,suggestion:true},"amenity/fast_food/Jamba Juice":{name:"Jamba Juice",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/jambajuice/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3088784",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"Jamba Juice","brand:wikidata":"Q3088784","brand:wikipedia":"en:Jamba Juice",cuisine:"juice",name:"Jamba Juice",takeaway:"yes"},terms:[],matchScore:2,suggestion:true},"amenity/fast_food/sandwich/Jersey Mike's Subs":{name:"Jersey Mike's Subs",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/jerseymikes/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6184897",amenity:"fast_food",cuisine:"sandwich"},addTags:{amenity:"fast_food",brand:"Jersey Mike's Subs","brand:wikidata":"Q6184897","brand:wikipedia":"en:Jersey Mike's Subs",cuisine:"sandwich",name:"Jersey Mike's Subs",takeaway:"yes"},reference:{key:"cuisine",value:"sandwich"},terms:["jersey mikes"],matchScore:2,suggestion:true},"amenity/fast_food/sandwich/Jimmy John's":{name:"Jimmy John's",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/jimmyjohns/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1689380",amenity:"fast_food",cuisine:"sandwich"},addTags:{amenity:"fast_food",brand:"Jimmy John's","brand:wikidata":"Q1689380","brand:wikipedia":"en:Jimmy John's",cuisine:"sandwich",name:"Jimmy John's",takeaway:"yes"},reference:{key:"cuisine",value:"sandwich"},terms:[],matchScore:2,suggestion:true},"amenity/fast_food/burger/Jollibee":{name:"Jollibee",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/JollibeePhilippines/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q37614",amenity:"fast_food",cuisine:"burger"},addTags:{amenity:"fast_food",brand:"Jollibee","brand:wikidata":"Q37614","brand:wikipedia":"en:Jollibee",cuisine:"burger",name:"Jollibee",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},terms:[],matchScore:2,suggestion:true},"amenity/fast_food/Just Salad":{name:"Just Salad",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/justsalad/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q23091823",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"Just Salad","brand:wikidata":"Q23091823","brand:wikipedia":"en:Just Salad",cuisine:"salad",name:"Just Salad",takeaway:"yes"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/chicken/KFC":{name:"KFC",icon:"fas-drumstick-bite",imageURL:"https://graph.facebook.com/KFC/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q524757",amenity:"fast_food",cuisine:"chicken"},addTags:{amenity:"fast_food",brand:"KFC","brand:wikidata":"Q524757","brand:wikipedia":"en:KFC",cuisine:"chicken",name:"KFC",takeaway:"yes"},reference:{key:"cuisine",value:"chicken"},terms:["kentucky fried chicken"],matchScore:2,suggestion:true},"amenity/fast_food/burger/Kochlöffel":{name:"Kochlöffel",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/Kochloeffel.Deutschland/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q315539",amenity:"fast_food",cuisine:"burger"},addTags:{amenity:"fast_food",brand:"Kochlöffel","brand:wikidata":"Q315539","brand:wikipedia":"en:Kochlöffel",cuisine:"burger",name:"Kochlöffel",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},countryCodes:["de","pl","tr"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/pizza/Kotipizza":{name:"Kotipizza",icon:"maki-restaurant-pizza",imageURL:"https://graph.facebook.com/kotipizza/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1628625",amenity:"fast_food",cuisine:"pizza"},addTags:{amenity:"fast_food",brand:"Kotipizza","brand:wikidata":"Q1628625","brand:wikipedia":"en:Kotipizza",cuisine:"pizza",name:"Kotipizza",takeaway:"yes"},reference:{key:"cuisine",value:"pizza"},terms:[],matchScore:2,suggestion:true},"amenity/fast_food/donut/Krispy Kreme":{name:"Krispy Kreme",icon:"temaki-donut",imageURL:"https://graph.facebook.com/KrispyKreme/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1192805",amenity:"fast_food",cuisine:"donut"},addTags:{amenity:"fast_food",brand:"Krispy Kreme","brand:wikidata":"Q1192805","brand:wikipedia":"en:Krispy Kreme",cuisine:"donut",name:"Krispy Kreme",takeaway:"yes"},reference:{key:"cuisine",value:"donut"},terms:[],matchScore:2,suggestion:true},"amenity/fast_food/burger/Krystal":{name:"Krystal",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/Krystal/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q472195",amenity:"fast_food",cuisine:"burger"},addTags:{amenity:"fast_food",brand:"Krystal","brand:wikidata":"Q472195","brand:wikipedia":"en:Krystal (restaurant)",cuisine:"burger",name:"Krystal",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/L&L Drive-Inn (Hawaii)":{name:"L&L Drive-Inn (Hawaii)",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/hawaiianbarbecue/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6455441",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"L&L Drive-Inn","brand:wikidata":"Q6455441","brand:wikipedia":"en:L&L Hawaiian Barbecue",cuisine:"hawaiian",name:"L&L Drive-Inn",takeaway:"yes"},countryCodes:["us"],terms:["l&l","l&l drive-in"],matchScore:2,suggestion:true},"amenity/fast_food/L&L Hawaiian Barbecue":{name:"L&L Hawaiian Barbecue",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/hawaiianbarbecue/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6455441",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"L&L Hawaiian Barbecue","brand:wikidata":"Q6455441","brand:wikipedia":"en:L&L Hawaiian Barbecue",cuisine:"hawaiian",name:"L&L Hawaiian Barbecue",takeaway:"yes"},terms:["l&l","l&l hawaiian bbq"],matchScore:2,suggestion:true},"amenity/fast_food/sandwich/Lee's Sandwiches":{name:"Lee's Sandwiches",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/LeesSandwiches/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6512823",amenity:"fast_food",cuisine:"vietnamese;sandwich"},addTags:{amenity:"fast_food",brand:"Lee's Sandwiches","brand:wikidata":"Q6512823","brand:wikipedia":"en:Lee's Sandwiches",cuisine:"vietnamese;sandwich",name:"Lee's Sandwiches",takeaway:"yes"},reference:{key:"cuisine",value:"sandwich"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/pizza/Little Caesars":{name:"Little Caesars",icon:"maki-restaurant-pizza",imageURL:"https://graph.facebook.com/LittleCaesars/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1393809",amenity:"fast_food",cuisine:"pizza"},addTags:{amenity:"fast_food",brand:"Little Caesars","brand:wikidata":"Q1393809","brand:wikipedia":"en:Little Caesars",cuisine:"pizza",name:"Little Caesars",takeaway:"yes"},reference:{key:"cuisine",value:"pizza"},terms:["little caesars pizza"],matchScore:2,suggestion:true},"amenity/fast_food/Long John Silver's":{name:"Long John Silver's",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/LongJohnSilvers/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1535221",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"Long John Silver's","brand:wikidata":"Q1535221","brand:wikipedia":"en:Long John Silver's",cuisine:"seafood",name:"Long John Silver's",takeaway:"yes"},terms:[],matchScore:2,suggestion:true},"amenity/fast_food/burger/Lotteria":{name:"Lotteria",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/ilovelotteria/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q249525",amenity:"fast_food",cuisine:"burger"},addTags:{amenity:"fast_food",brand:"Lotteria","brand:wikidata":"Q249525","brand:wikipedia":"en:Lotteria",cuisine:"burger",name:"Lotteria",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},terms:[],matchScore:2,suggestion:true},"amenity/fast_food/Manchu Wok":{name:"Manchu Wok",icon:"maki-fast-food",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FManchu%20Wok%20logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q6747622",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"Manchu Wok","brand:wikidata":"Q6747622","brand:wikipedia":"en:Manchu Wok",cuisine:"chinese",name:"Manchu Wok",takeaway:"yes"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/Mang Inasal":{name:"Mang Inasal",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/MangInasalPhilippines/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6748573",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"Mang Inasal","brand:wikidata":"Q6748573","brand:wikipedia":"en:Mang Inasal",cuisine:"barbecue",name:"Mang Inasal",takeaway:"yes"},countryCodes:["ph"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/burger/Max":{name:"Max",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/maxburgers/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1912172",amenity:"fast_food",cuisine:"burger"},addTags:{amenity:"fast_food",brand:"Max","brand:wikidata":"Q1912172","brand:wikipedia":"en:Max Hamburgers",cuisine:"burger",name:"Max",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},terms:[],matchScore:2,suggestion:true},"amenity/fast_food/burger/McDonald's":{name:"McDonald's",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/mcdonalds/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q38076",amenity:"fast_food",cuisine:"burger"},addTags:{amenity:"fast_food",brand:"McDonald's","brand:wikidata":"Q38076","brand:wikipedia":"en:McDonald's",cuisine:"burger",name:"McDonald's",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},terms:[],matchScore:2,suggestion:true},"amenity/fast_food/mexican/Mighty Taco":{name:"Mighty Taco",icon:"fas-pepper-hot",imageURL:"https://graph.facebook.com/MyMightyTaco/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6844210",amenity:"fast_food",cuisine:"mexican"},addTags:{amenity:"fast_food",brand:"Mighty Taco","brand:wikidata":"Q6844210","brand:wikipedia":"en:Mighty Taco",cuisine:"mexican",name:"Mighty Taco",takeaway:"yes"},reference:{key:"cuisine",value:"mexican"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/burger/Minute Burger":{name:"Minute Burger",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/MinuteBurger/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62273503",amenity:"fast_food",cuisine:"burger"},addTags:{amenity:"fast_food",brand:"Minute Burger","brand:wikidata":"Q62273503",cuisine:"burger",name:"Minute Burger",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},countryCodes:["ph"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/mexican/Moe's Southwest Grill":{name:"Moe's Southwest Grill",icon:"fas-pepper-hot",imageURL:"https://graph.facebook.com/MoesSouthwestGrill/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6889938",amenity:"fast_food",cuisine:"mexican"},addTags:{amenity:"fast_food",brand:"Moe's Southwest Grill","brand:wikidata":"Q6889938","brand:wikipedia":"en:Moe's Southwest Grill",cuisine:"mexican",name:"Moe's Southwest Grill",takeaway:"yes"},reference:{key:"cuisine",value:"mexican"},terms:[],matchScore:2,suggestion:true},"amenity/fast_food/sandwich/Mr. Sub":{name:"Mr. Sub",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/mrsub/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6929225",amenity:"fast_food",cuisine:"sandwich"},addTags:{amenity:"fast_food",brand:"Mr. Sub","brand:wikidata":"Q6929225","brand:wikipedia":"en:Mr. Sub",cuisine:"sandwich",name:"Mr. Sub",takeaway:"yes"},reference:{key:"cuisine",value:"sandwich"},terms:[],matchScore:2,suggestion:true},"amenity/fast_food/pizza/New York Pizza":{name:"New York Pizza",icon:"maki-restaurant-pizza",imageURL:"https://graph.facebook.com/newyorkpizza.nl/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2639128",amenity:"fast_food",cuisine:"pizza"},addTags:{amenity:"fast_food",brand:"New York Pizza","brand:wikidata":"Q2639128","brand:wikipedia":"nl:New York Pizza",cuisine:"pizza",name:"New York Pizza",takeaway:"yes"},reference:{key:"cuisine",value:"pizza"},countryCodes:["nl"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/Nordsee":{name:"Nordsee",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/NORDSEEDeutschland/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q74866",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"Nordsee","brand:wikidata":"Q74866","brand:wikipedia":"en:Nordsee",cuisine:"seafood",name:"Nordsee",takeaway:"yes"},terms:[],matchScore:2,suggestion:true},"amenity/fast_food/Num Pang":{name:"Num Pang",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/NumPangKitchen/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62079702",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"Num Pang","brand:wikidata":"Q62079702","brand:wikipedia":"en:Num Pang",cuisine:"cambodian, sandwich",name:"Num Pang",takeaway:"yes"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/mexican/O'Tacos":{name:"O'Tacos",icon:"fas-pepper-hot",imageURL:"https://graph.facebook.com/Otacos.France/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q28494040",amenity:"fast_food",cuisine:"mexican"},addTags:{amenity:"fast_food",brand:"O'Tacos","brand:wikidata":"Q28494040","brand:wikipedia":"en:O'Tacos",cuisine:"mexican",name:"O'Tacos",takeaway:"yes"},reference:{key:"cuisine",value:"mexican"},terms:[],matchScore:2,suggestion:true},"amenity/fast_food/Oporto":{name:"Oporto",icon:"maki-fast-food",geometry:["point","area"],tags:{"brand:wikidata":"Q4412342",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"Oporto","brand:wikidata":"Q4412342","brand:wikipedia":"en:Oporto (restaurant)",name:"Oporto",takeaway:"yes"},terms:[],matchScore:2,suggestion:true},"amenity/fast_food/burger/Pal's":{name:"Pal's",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/Palsweb/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7126094",amenity:"fast_food",cuisine:"burger"},addTags:{amenity:"fast_food",brand:"Pal's","brand:wikidata":"Q7126094","brand:wikipedia":"en:Pal's",cuisine:"burger",name:"Pal's",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},countryCodes:["us"],terms:["pals sudden service"],matchScore:2,suggestion:true},"amenity/fast_food/pizza/Panago":{name:"Panago",icon:"maki-restaurant-pizza",imageURL:"https://graph.facebook.com/panago/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q17111672",amenity:"fast_food",cuisine:"pizza"},addTags:{amenity:"fast_food",brand:"Panago","brand:wikidata":"Q17111672","brand:wikipedia":"en:Panago",cuisine:"pizza",name:"Panago",takeaway:"yes"},reference:{key:"cuisine",value:"pizza"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/Panda Express":{name:"Panda Express",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/PandaExpress/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1358690",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"Panda Express","brand:wikidata":"Q1358690","brand:wikipedia":"en:Panda Express",cuisine:"chinese",name:"Panda Express",takeaway:"yes"},terms:["panda"],matchScore:2,suggestion:true},"amenity/fast_food/sandwich/Panera Bread":{name:"Panera Bread",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/panerabread/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7130852",amenity:"fast_food",cuisine:"sandwich"},addTags:{amenity:"fast_food",brand:"Panera Bread","brand:wikidata":"Q7130852","brand:wikipedia":"en:Panera Bread",cuisine:"sandwich",name:"Panera Bread",takeaway:"yes"},reference:{key:"cuisine",value:"sandwich"},terms:[],matchScore:2,suggestion:true},"amenity/fast_food/pizza/Papa John's":{name:"Papa John's",icon:"maki-restaurant-pizza",imageURL:"https://graph.facebook.com/papajohns/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2759586",amenity:"fast_food",cuisine:"pizza"},addTags:{amenity:"fast_food",brand:"Papa John's","brand:wikidata":"Q2759586","brand:wikipedia":"en:Papa John's Pizza",cuisine:"pizza",name:"Papa John's",takeaway:"yes"},reference:{key:"cuisine",value:"pizza"},terms:["papa john","papa john pizza","papa johns pizza"],matchScore:2,suggestion:true},"amenity/fast_food/pizza/Papa Murphy's":{name:"Papa Murphy's",icon:"maki-restaurant-pizza",imageURL:"https://graph.facebook.com/papamurphyspizza/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7132349",amenity:"fast_food",cuisine:"pizza"},addTags:{amenity:"fast_food",brand:"Papa Murphy's","brand:wikidata":"Q7132349","brand:wikipedia":"en:Papa Murphy's",cuisine:"pizza",name:"Papa Murphy's",official_name:"Papa Murphy's Take 'N' Bake Pizza",takeaway:"only"},reference:{key:"cuisine",value:"pizza"},terms:["papa murphy","papa murphy pizza","papa murphys pizza"],matchScore:2,suggestion:true},"amenity/fast_food/sandwich/Penn Station":{name:"Penn Station",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/pennstation/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7163311",amenity:"fast_food",cuisine:"sandwich"},addTags:{amenity:"fast_food",brand:"Penn Station","brand:wikidata":"Q7163311","brand:wikipedia":"en:Penn Station (restaurant)",cuisine:"sandwich",name:"Penn Station",takeaway:"yes"},reference:{key:"cuisine",value:"sandwich"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/Philly Pretzel Factory":{name:"Philly Pretzel Factory",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/PhillyPretzel/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q60097339",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"Philly Pretzel Factory","brand:wikidata":"Q60097339",cuisine:"pretzel",name:"Philly Pretzel Factory",takeaway:"yes"},countryCodes:["us"],terms:["philadelphia pretzel factory","philadelphia soft pretzel factory","philly soft pretzel factory"],matchScore:2,suggestion:true},"amenity/fast_food/chicken/Pinulito":{name:"Pinulito",icon:"fas-drumstick-bite",imageURL:"https://graph.facebook.com/elsabordenuestragente/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62273613",amenity:"fast_food",cuisine:"chicken"},addTags:{amenity:"fast_food",brand:"Pinulito","brand:wikidata":"Q62273613",cuisine:"chicken",name:"Pinulito",takeaway:"yes"},reference:{key:"cuisine",value:"chicken"},countryCodes:["gt"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/Pita Pit":{name:"Pita Pit",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/pitapitusa/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7757289",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"Pita Pit","brand:wikidata":"Q7757289","brand:wikipedia":"en:Pita Pit",cuisine:"pita",name:"Pita Pit",takeaway:"yes"},terms:[],matchScore:2,suggestion:true},"amenity/fast_food/pizza/Pizza Hut Delivery":{name:"Pizza Hut Delivery",icon:"maki-restaurant-pizza",imageURL:"https://graph.facebook.com/pizzahutus/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q191615",amenity:"fast_food",cuisine:"pizza"},addTags:{amenity:"fast_food",brand:"Pizza Hut","brand:wikidata":"Q191615","brand:wikipedia":"en:Pizza Hut",cuisine:"pizza",name:"Pizza Hut Delivery",takeaway:"yes"},reference:{key:"cuisine",value:"pizza"},terms:[],matchScore:2,suggestion:true},"amenity/fast_food/pizza/Pizza Hut Express":{name:"Pizza Hut Express",icon:"maki-restaurant-pizza",imageURL:"https://graph.facebook.com/pizzahutus/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q191615",amenity:"fast_food",cuisine:"pizza"},addTags:{amenity:"fast_food",brand:"Pizza Hut","brand:wikidata":"Q191615","brand:wikipedia":"en:Pizza Hut",cuisine:"pizza",name:"Pizza Hut Express",takeaway:"yes"},reference:{key:"cuisine",value:"pizza"},terms:[],matchScore:2,suggestion:true},"amenity/fast_food/pizza/Pizza Nova":{name:"Pizza Nova",icon:"maki-restaurant-pizza",imageURL:"https://graph.facebook.com/PizzaNova/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7199971",amenity:"fast_food",cuisine:"pizza"},addTags:{amenity:"fast_food",brand:"Pizza Nova","brand:wikidata":"Q7199971","brand:wikipedia":"en:Pizza Nova",cuisine:"pizza",name:"Pizza Nova",takeaway:"yes"},reference:{key:"cuisine",value:"pizza"},terms:[],matchScore:2,suggestion:true},"amenity/fast_food/pizza/Pizza Pizza":{name:"Pizza Pizza",icon:"maki-restaurant-pizza",imageURL:"https://graph.facebook.com/PizzaPizzaCanada/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1194143",amenity:"fast_food",cuisine:"pizza"},addTags:{amenity:"fast_food",brand:"Pizza Pizza","brand:wikidata":"Q1194143","brand:wikipedia":"en:Pizza Pizza",cuisine:"pizza",name:"Pizza Pizza",takeaway:"yes"},reference:{key:"cuisine",value:"pizza"},terms:[],matchScore:2,suggestion:true},"amenity/fast_food/chicken/Pollo Campero":{name:"Pollo Campero",icon:"fas-drumstick-bite",imageURL:"https://graph.facebook.com/CamperoUSA/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q942741",amenity:"fast_food",cuisine:"chicken"},addTags:{amenity:"fast_food",brand:"Pollo Campero","brand:wikidata":"Q942741","brand:wikipedia":"en:Pollo Campero",cuisine:"chicken",name:"Pollo Campero",takeaway:"yes"},reference:{key:"cuisine",value:"chicken"},terms:[],matchScore:2,suggestion:true},"amenity/fast_food/chicken/Pollo Granjero (Costa Rica)":{name:"Pollo Granjero (Costa Rica)",icon:"fas-drumstick-bite",imageURL:"https://graph.facebook.com/PolloGranjeroCostaRica/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62273665",amenity:"fast_food",cuisine:"chicken"},addTags:{amenity:"fast_food",brand:"Pollo Granjero","brand:wikidata":"Q62273665",cuisine:"chicken",name:"Pollo Granjero",takeaway:"yes"},reference:{key:"cuisine",value:"chicken"},countryCodes:["cr"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/chicken/Pollo Granjero (Guatemala)":{name:"Pollo Granjero (Guatemala)",icon:"fas-drumstick-bite",imageURL:"https://graph.facebook.com/PolloGranjeroGuatemala/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62273652",amenity:"fast_food",cuisine:"chicken"},addTags:{amenity:"fast_food",brand:"Pollo Granjero","brand:wikidata":"Q62273652",cuisine:"chicken",name:"Pollo Granjero",takeaway:"yes"},reference:{key:"cuisine",value:"chicken"},countryCodes:["gt"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/chicken/Pollo Tropical":{name:"Pollo Tropical",icon:"fas-drumstick-bite",imageURL:"https://graph.facebook.com/PolloTropical/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3395356",amenity:"fast_food",cuisine:"chicken"},addTags:{amenity:"fast_food",brand:"Pollo Tropical","brand:wikidata":"Q3395356","brand:wikipedia":"en:Pollo Tropical",cuisine:"chicken",name:"Pollo Tropical",takeaway:"yes"},reference:{key:"cuisine",value:"chicken"},terms:[],matchScore:2,suggestion:true},"amenity/fast_food/chicken/Popeyes":{name:"Popeyes",icon:"fas-drumstick-bite",imageURL:"https://graph.facebook.com/PopeyesLouisianaKitchen/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1330910",amenity:"fast_food",cuisine:"chicken"},addTags:{amenity:"fast_food",brand:"Popeyes","brand:wikidata":"Q1330910","brand:wikipedia":"en:Popeyes",cuisine:"chicken",name:"Popeyes",official_name:"Popeyes Louisiana Kitchen",takeaway:"yes"},reference:{key:"cuisine",value:"chicken"},terms:["popeyes louisiana kitchen"],matchScore:2,suggestion:true},"amenity/fast_food/sandwich/Potbelly":{name:"Potbelly",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/potbellysandwichshop/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7234777",amenity:"fast_food",cuisine:"sandwich"},addTags:{amenity:"fast_food",brand:"Potbelly","brand:wikidata":"Q7234777","brand:wikipedia":"en:Potbelly Sandwich Shop",cuisine:"sandwich",name:"Potbelly",takeaway:"yes"},reference:{key:"cuisine",value:"sandwich"},terms:[],matchScore:2,suggestion:true},"amenity/fast_food/sandwich/Pret A Manger":{name:"Pret A Manger",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/pretamangerusa/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2109109",amenity:"fast_food",cuisine:"sandwich"},addTags:{amenity:"fast_food",brand:"Pret A Manger","brand:wikidata":"Q2109109","brand:wikipedia":"en:Pret a Manger",cuisine:"sandwich",name:"Pret A Manger",takeaway:"yes"},reference:{key:"cuisine",value:"sandwich"},terms:[],matchScore:2,suggestion:true},"amenity/fast_food/mexican/Qdoba":{name:"Qdoba",icon:"fas-pepper-hot",imageURL:"https://graph.facebook.com/qdoba/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1363885",amenity:"fast_food",cuisine:"mexican"},addTags:{amenity:"fast_food",brand:"Qdoba","brand:wikidata":"Q1363885","brand:wikipedia":"en:Qdoba",cuisine:"mexican",name:"Qdoba",official_name:"Qdoba Mexican Grill",takeaway:"yes"},reference:{key:"cuisine",value:"mexican"},terms:["qdoba mexican grill"],matchScore:2,suggestion:true},"amenity/fast_food/burger/Quick":{name:"Quick",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/QuickBelgium/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q286494",amenity:"fast_food",cuisine:"burger"},addTags:{amenity:"fast_food",brand:"Quick","brand:wikidata":"Q286494","brand:wikipedia":"en:Quick (restaurant)",cuisine:"burger",name:"Quick",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},terms:[],matchScore:2,suggestion:true},"amenity/fast_food/sandwich/Quiznos":{name:"Quiznos",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/Quiznos/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1936229",amenity:"fast_food",cuisine:"sandwich"},addTags:{amenity:"fast_food",brand:"Quiznos","brand:wikidata":"Q1936229","brand:wikipedia":"en:Quiznos",cuisine:"sandwich",name:"Quiznos",takeaway:"yes"},reference:{key:"cuisine",value:"sandwich"},terms:["quiznos sub","quiznos subs"],matchScore:2,suggestion:true},"amenity/fast_food/chicken/Raising Cane's":{name:"Raising Cane's",icon:"fas-drumstick-bite",imageURL:"https://graph.facebook.com/RaisingCanesChickenFingers/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7285144",amenity:"fast_food",cuisine:"chicken"},addTags:{amenity:"fast_food",brand:"Raising Cane's","brand:wikidata":"Q7285144","brand:wikipedia":"en:Raising Cane's Chicken Fingers",cuisine:"chicken",name:"Raising Cane's",official_name:"Raising Cane's Chicken Fingers",takeaway:"yes"},reference:{key:"cuisine",value:"chicken"},countryCodes:["us"],terms:["raising canes chicken fingers"],matchScore:2,suggestion:true},"amenity/fast_food/burger/Rally's":{name:"Rally's",icon:"maki-fast-food",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FRally's%20logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q63919323",amenity:"fast_food",cuisine:"burger"},addTags:{amenity:"fast_food",brand:"Rally's","brand:wikidata":"Q63919323",cuisine:"burger",name:"Rally's",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},terms:[],matchScore:2,suggestion:true},"amenity/fast_food/chicken/Red Rooster":{name:"Red Rooster",icon:"fas-drumstick-bite",imageURL:"https://graph.facebook.com/RedRoosterAU/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q376466",amenity:"fast_food",cuisine:"chicken"},addTags:{amenity:"fast_food",brand:"Red Rooster","brand:wikidata":"Q376466","brand:wikipedia":"en:Red Rooster",cuisine:"chicken",name:"Red Rooster",takeaway:"yes"},reference:{key:"cuisine",value:"chicken"},countryCodes:["au"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/burger/Roy Rogers":{name:"Roy Rogers",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/RoyRogersRestaurants/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7373311",amenity:"fast_food",cuisine:"burger;sandwich;chicken"},addTags:{amenity:"fast_food",brand:"Roy Rogers","brand:wikidata":"Q7373311","brand:wikipedia":"en:Roy Rogers Restaurants",cuisine:"burger;sandwich;chicken",name:"Roy Rogers",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/pizza/Sbarro":{name:"Sbarro",icon:"maki-restaurant-pizza",imageURL:"https://graph.facebook.com/Sbarro/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2589409",amenity:"fast_food",cuisine:"pizza"},addTags:{amenity:"fast_food",brand:"Sbarro","brand:wikidata":"Q2589409","brand:wikipedia":"en:Sbarro",cuisine:"pizza",name:"Sbarro",takeaway:"yes"},reference:{key:"cuisine",value:"pizza"},terms:[],matchScore:2,suggestion:true},"amenity/fast_food/sandwich/Schlotzsky's":{name:"Schlotzsky's",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/Schlotzskys/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2244796",amenity:"fast_food",cuisine:"sandwich"},addTags:{amenity:"fast_food",brand:"Schlotzsky's","brand:wikidata":"Q2244796","brand:wikipedia":"en:Schlotzsky's",cuisine:"sandwich",name:"Schlotzsky's",takeaway:"yes"},reference:{key:"cuisine",value:"sandwich"},countryCodes:["us"],terms:["schlotzskys deli"],matchScore:2,suggestion:true},"amenity/fast_food/burger/Shake Shack":{name:"Shake Shack",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/shakeshack/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1058722",amenity:"fast_food",cuisine:"burger"},addTags:{amenity:"fast_food",brand:"Shake Shack","brand:wikidata":"Q1058722","brand:wikipedia":"en:Shake Shack",cuisine:"burger",name:"Shake Shack",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},terms:[],matchScore:2,suggestion:true},"amenity/fast_food/burger/Sibylla":{name:"Sibylla",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/sibyllasverige/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q488643",amenity:"fast_food",cuisine:"burger"},addTags:{amenity:"fast_food",brand:"Sibylla","brand:wikidata":"Q488643","brand:wikipedia":"en:Sibylla (fast food)",cuisine:"burger",name:"Sibylla",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},countryCodes:["fi","se"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/burger/Smashburger":{name:"Smashburger",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/smashburger/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q17061332",amenity:"fast_food",cuisine:"burger"},addTags:{amenity:"fast_food",brand:"Smashburger","brand:wikidata":"Q17061332","brand:wikipedia":"en:Smashburger",cuisine:"burger",name:"Smashburger",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},terms:[],matchScore:2,suggestion:true},"amenity/fast_food/Smoothie King":{name:"Smoothie King",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/SmoothieKing/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5491421",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"Smoothie King","brand:wikidata":"Q5491421","brand:wikipedia":"en:Smoothie King",cuisine:"juice",name:"Smoothie King",takeaway:"yes"},terms:[],matchScore:2,suggestion:true},"amenity/fast_food/burger/Sonic":{name:"Sonic",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/sonicdrivein/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7561808",amenity:"fast_food",cuisine:"burger"},addTags:{amenity:"fast_food",brand:"Sonic","brand:wikidata":"Q7561808","brand:wikipedia":"en:Sonic Drive-In",cuisine:"burger",name:"Sonic",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},terms:["sonic drive in"],matchScore:2,suggestion:true},"amenity/fast_food/sandwich/Steak Escape":{name:"Steak Escape",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/steakescape/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7605235",amenity:"fast_food",cuisine:"sandwich"},addTags:{amenity:"fast_food",brand:"Steak Escape","brand:wikidata":"Q7605235","brand:wikipedia":"en:Steak Escape",cuisine:"sandwich",name:"Steak Escape",takeaway:"yes"},reference:{key:"cuisine",value:"sandwich"},terms:[],matchScore:2,suggestion:true},"amenity/fast_food/burger/Steers":{name:"Steers",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/OfficialSteers/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q56599145",amenity:"fast_food",cuisine:"burger"},addTags:{amenity:"fast_food",brand:"Steers","brand:wikidata":"Q56599145","brand:wikipedia":"en:Steers",cuisine:"burger",name:"Steers",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},terms:[],matchScore:2,suggestion:true},"amenity/fast_food/sandwich/Subway":{name:"Subway",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/subway/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q244457",amenity:"fast_food",cuisine:"sandwich"},addTags:{amenity:"fast_food",brand:"Subway","brand:wikidata":"Q244457","brand:wikipedia":"en:Subway (restaurant)",cuisine:"sandwich",name:"Subway",takeaway:"yes"},reference:{key:"cuisine",value:"sandwich"},terms:["subway sandwiches"],matchScore:2,suggestion:true},"amenity/fast_food/burger/Supermac's":{name:"Supermac's",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/supermacsofficial/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7643750",amenity:"fast_food",cuisine:"burger"},addTags:{amenity:"fast_food",brand:"Supermac's","brand:wikidata":"Q7643750","brand:wikipedia":"en:Supermac's",cuisine:"burger",name:"Supermac's",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},countryCodes:["gb","ie"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/TCBY":{name:"TCBY",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/tcby/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7669631",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"TCBY","brand:wikidata":"Q7669631","brand:wikipedia":"en:TCBY",cuisine:"frozen_yogurt",name:"TCBY",takeaway:"yes"},terms:[],matchScore:2,suggestion:true},"amenity/fast_food/Taco Bell":{name:"Taco Bell",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/tacobell/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q752941",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"Taco Bell","brand:wikidata":"Q752941","brand:wikipedia":"en:Taco Bell",cuisine:"tex-mex",name:"Taco Bell",takeaway:"yes"},terms:[],matchScore:2,suggestion:true},"amenity/fast_food/mexican/Taco Bueno":{name:"Taco Bueno",icon:"fas-pepper-hot",imageURL:"https://graph.facebook.com/buenoheadquarters/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7673958",amenity:"fast_food",cuisine:"mexican"},addTags:{amenity:"fast_food",brand:"Taco Bueno","brand:wikidata":"Q7673958","brand:wikipedia":"en:Taco Bueno",cuisine:"mexican",name:"Taco Bueno",takeaway:"yes"},reference:{key:"cuisine",value:"mexican"},terms:[],matchScore:2,suggestion:true},"amenity/fast_food/mexican/Taco Cabana":{name:"Taco Cabana",icon:"fas-pepper-hot",imageURL:"https://graph.facebook.com/TacoCabana/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q12070488",amenity:"fast_food",cuisine:"mexican"},addTags:{amenity:"fast_food",brand:"Taco Cabana","brand:wikidata":"Q12070488","brand:wikipedia":"en:Taco Cabana",cuisine:"mexican",name:"Taco Cabana",takeaway:"yes"},reference:{key:"cuisine",value:"mexican"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/mexican/Taco Del Mar":{name:"Taco Del Mar",icon:"fas-pepper-hot",imageURL:"https://graph.facebook.com/tacodelmarcorp/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7673972",amenity:"fast_food",cuisine:"mexican"},addTags:{amenity:"fast_food",brand:"Taco Del Mar","brand:wikidata":"Q7673972","brand:wikipedia":"en:Taco del Mar",cuisine:"mexican",name:"Taco Del Mar",takeaway:"yes"},reference:{key:"cuisine",value:"mexican"},terms:[],matchScore:2,suggestion:true},"amenity/fast_food/mexican/Taco John's":{name:"Taco John's",icon:"fas-pepper-hot",imageURL:"https://graph.facebook.com/tacojohns/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7673962",amenity:"fast_food",cuisine:"mexican"},addTags:{amenity:"fast_food",brand:"Taco John's","brand:wikidata":"Q7673962","brand:wikipedia":"en:Taco John's",cuisine:"mexican",name:"Taco John's",takeaway:"yes"},reference:{key:"cuisine",value:"mexican"},terms:[],matchScore:2,suggestion:true},"amenity/fast_food/mexican/Taco Time":{name:"Taco Time",icon:"fas-pepper-hot",imageURL:"https://graph.facebook.com/tacotime/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7673969",amenity:"fast_food",cuisine:"mexican"},addTags:{amenity:"fast_food",brand:"Taco Time","brand:wikidata":"Q7673969","brand:wikipedia":"en:Taco Time",cuisine:"mexican",name:"Taco Time",takeaway:"yes"},reference:{key:"cuisine",value:"mexican"},terms:[],matchScore:2,suggestion:true},"amenity/fast_food/Ted’s Hot Dogs":{name:"Ted’s Hot Dogs",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/TedsHotDogs/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7692930",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"Ted’s Hot Dogs","brand:wikidata":"Q7692930","brand:wikipedia":"en:Ted's Hot Dogs",cuisine:"sausage",name:"Ted’s Hot Dogs",takeaway:"yes"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/pizza/Telepizza":{name:"Telepizza",icon:"maki-restaurant-pizza",imageURL:"https://graph.facebook.com/telepizza/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2699863",amenity:"fast_food",cuisine:"pizza"},addTags:{amenity:"fast_food",brand:"Telepizza","brand:wikidata":"Q2699863","brand:wikipedia":"en:Telepizza",cuisine:"pizza",name:"Telepizza",takeaway:"yes"},reference:{key:"cuisine",value:"pizza"},terms:[],matchScore:2,suggestion:true},"amenity/fast_food/Thai Express (Singapore)":{name:"Thai Express (Singapore)",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/ThaiExpressSG/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7709119",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"Thai Express","brand:wikidata":"Q7709119","brand:wikipedia":"en:Thai Express",cuisine:"thai",name:"Thai Express",takeaway:"yes"},countryCodes:["sg"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/Thaï Express (North America)":{name:"Thaï Express (North America)",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/EatThaiExpress/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7711610",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"Thaï Express","brand:wikidata":"Q7711610","brand:wikipedia":"en:Thaï Express",cuisine:"thai",name:"Thaï Express",takeaway:"yes"},countryCodes:["ca","us"],terms:["thai express"],matchScore:2,suggestion:true},"amenity/fast_food/burger/The Habit Burger Grill":{name:"The Habit Burger Grill",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/habitburger/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q18158741",amenity:"fast_food",cuisine:"burger"},addTags:{amenity:"fast_food",brand:"The Habit Burger Grill","brand:wikidata":"Q18158741","brand:wikipedia":"en:The Habit Burger Grill",cuisine:"burger",name:"The Habit Burger Grill",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},countryCodes:["us"],terms:["habit burger","the habit burger"],matchScore:2,suggestion:true},"amenity/fast_food/pizza/The Pizza Company":{name:"The Pizza Company",icon:"maki-restaurant-pizza",imageURL:"https://graph.facebook.com/thepizzacompany/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2413520",amenity:"fast_food",cuisine:"pizza"},addTags:{amenity:"fast_food",brand:"The Pizza Company","brand:wikidata":"Q2413520","brand:wikipedia":"en:The Pizza Company",cuisine:"pizza",name:"The Pizza Company",takeaway:"yes"},reference:{key:"cuisine",value:"pizza"},terms:[],matchScore:2,suggestion:true},"amenity/fast_food/sandwich/Togo's":{name:"Togo's",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/togossandwiches/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3530375",amenity:"fast_food",cuisine:"sandwich"},addTags:{amenity:"fast_food",brand:"Togo's","brand:wikidata":"Q3530375","brand:wikipedia":"en:Togo's",cuisine:"sandwich",name:"Togo's",takeaway:"yes"},reference:{key:"cuisine",value:"sandwich"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/Veggie Grill":{name:"Veggie Grill",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/veggiegrill/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q18636427",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"Veggie Grill","brand:wikidata":"Q18636427","brand:wikipedia":"en:Veggie Grill",cuisine:"american","diet:vegan":"only",name:"Veggie Grill",takeaway:"yes"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/Wahoo's Fish Taco":{name:"Wahoo's Fish Taco",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/WahoosFishTaco/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7959827",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"Wahoo's Fish Taco","brand:wikidata":"Q7959827","brand:wikipedia":"en:Wahoo's Fish Taco",cuisine:"seafood",name:"Wahoo's Fish Taco",takeaway:"yes"},countryCodes:["us"],terms:["wahoo's"],matchScore:2,suggestion:true},"amenity/fast_food/burger/Wendy's":{name:"Wendy's",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/wendys/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q550258",amenity:"fast_food",cuisine:"burger"},addTags:{amenity:"fast_food",brand:"Wendy's","brand:wikidata":"Q550258","brand:wikipedia":"en:Wendy's",cuisine:"burger",name:"Wendy's",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},terms:[],matchScore:2,suggestion:true},"amenity/fast_food/burger/Whataburger":{name:"Whataburger",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/whataburger/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q376627",amenity:"fast_food",cuisine:"burger"},addTags:{amenity:"fast_food",brand:"Whataburger","brand:wikidata":"Q376627","brand:wikipedia":"en:Whataburger",cuisine:"burger",name:"Whataburger",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},terms:[],matchScore:2,suggestion:true},"amenity/fast_food/sandwich/Which Wich?":{name:"Which Wich?",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/whichwich/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7993556",amenity:"fast_food",cuisine:"sandwich"},addTags:{amenity:"fast_food",brand:"Which Wich?","brand:wikidata":"Q7993556","brand:wikipedia":"en:Which Wich?",cuisine:"sandwich",name:"Which Wich?",takeaway:"yes"},reference:{key:"cuisine",value:"sandwich"},terms:[],matchScore:2,suggestion:true},"amenity/fast_food/burger/White Castle":{name:"White Castle",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/WhiteCastle/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1244034",amenity:"fast_food",cuisine:"burger"},addTags:{amenity:"fast_food",brand:"White Castle","brand:wikidata":"Q1244034","brand:wikipedia":"en:White Castle (restaurant)",cuisine:"burger",name:"White Castle",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},terms:[],matchScore:2,suggestion:true},"amenity/fast_food/Wienerschnitzel":{name:"Wienerschnitzel",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/Wienerschnitzel/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q324679",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"Wienerschnitzel","brand:wikidata":"Q324679","brand:wikipedia":"en:Wienerschnitzel",cuisine:"hot_dog",name:"Wienerschnitzel",takeaway:"yes"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/burger/Wimpy":{name:"Wimpy",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/wimpyrestaurants/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2811992",amenity:"fast_food",cuisine:"burger"},addTags:{amenity:"fast_food",brand:"Wimpy","brand:wikidata":"Q2811992","brand:wikipedia":"en:Wimpy (restaurant)",cuisine:"burger",name:"Wimpy",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},terms:[],matchScore:2,suggestion:true},"amenity/fast_food/Xi'an Famous Foods":{name:"Xi'an Famous Foods",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/xianfoods/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q8044020",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"Xi'an Famous Foods","brand:wikidata":"Q8044020","brand:wikipedia":"en:Xi'an Famous Foods",cuisine:"chinese",name:"Xi'an Famous Foods",takeaway:"yes"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/chicken/Zaxby's":{name:"Zaxby's",icon:"fas-drumstick-bite",imageURL:"https://graph.facebook.com/Zaxbys/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q8067525",amenity:"fast_food",cuisine:"chicken"},addTags:{amenity:"fast_food",brand:"Zaxby's","brand:wikidata":"Q8067525","brand:wikipedia":"en:Zaxby's",cuisine:"chicken",name:"Zaxby's",takeaway:"yes"},reference:{key:"cuisine",value:"chicken"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/sandwich/immergrün":{name:"immergrün",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/mein.immergruen/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62589254",amenity:"fast_food",cuisine:"sandwich;salad;juice"},addTags:{amenity:"fast_food",brand:"immergrün","brand:wikidata":"Q62589254",cuisine:"sandwich;salad;juice",name:"immergün",takeaway:"yes"},reference:{key:"cuisine",value:"sandwich"},countryCodes:["de"],terms:["immergün"],matchScore:2,suggestion:true},"amenity/fast_food/sandwich/Γρηγόρης":{name:"Γρηγόρης",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/gregorys.gr/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62273834",amenity:"fast_food",cuisine:"sandwich"},addTags:{amenity:"fast_food",brand:"Γρηγόρης","brand:wikidata":"Q62273834",cuisine:"sandwich",name:"Γρηγόρης",takeaway:"yes"},reference:{key:"cuisine",value:"sandwich"},countryCodes:["gr"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/burger/Бургер Кинг":{name:"Бургер Кинг",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/burgerking/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q177054",amenity:"fast_food",cuisine:"burger"},addTags:{amenity:"fast_food",brand:"Бургер Кинг","brand:en":"Burger King","brand:wikidata":"Q177054","brand:wikipedia":"en:Burger King",cuisine:"burger",name:"Бургер Кинг","name:en":"Burger King",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},terms:[],matchScore:2,suggestion:true},"amenity/fast_food/Крошка Картошка":{name:"Крошка Картошка",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/kartoshka.moscow/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4241838",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"Крошка Картошка","brand:wikidata":"Q4241838","brand:wikipedia":"ru:Крошка Картошка",cuisine:"potato",name:"Крошка Картошка",takeaway:"yes"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/burger/Макдоналдс":{name:"Макдоналдс",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/mcdonalds/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q38076",amenity:"fast_food",cuisine:"burger"},addTags:{amenity:"fast_food",brand:"Макдоналдс","brand:en":"McDonald's","brand:wikidata":"Q38076","brand:wikipedia":"en:McDonald's",cuisine:"burger",name:"Макдоналдс","name:en":"McDonald's",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},terms:[],matchScore:2,suggestion:true},"amenity/fast_food/pizza/Папа Джонс":{name:"Папа Джонс",icon:"maki-restaurant-pizza",imageURL:"https://graph.facebook.com/papajohns/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2759586",amenity:"fast_food",cuisine:"pizza"},addTags:{amenity:"fast_food",brand:"Папа Джонс","brand:en":"Papa John's","brand:wikidata":"Q2759586","brand:wikipedia":"ru:Papa John’s",cuisine:"pizza",name:"Папа Джонс","name:en":"Papa John's",takeaway:"yes"},reference:{key:"cuisine",value:"pizza"},terms:[],matchScore:2,suggestion:true},"amenity/fast_food/burger/Робин Сдобин":{name:"Робин Сдобин",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/robinsdobin/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62273880",amenity:"fast_food",cuisine:"burger"},addTags:{amenity:"fast_food",brand:"Робин Сдобин","brand:wikidata":"Q62273880",cuisine:"burger",name:"Робин Сдобин",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/sandwich/Русский Аппетит":{name:"Русский Аппетит",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/Русский-Аппетит-1502979646622576/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62086063",amenity:"fast_food",cuisine:"sandwich;salad;regional"},addTags:{amenity:"fast_food",brand:"Русский Аппетит","brand:wikidata":"Q62086063",cuisine:"sandwich;salad;regional",name:"Русский Аппетит",takeaway:"yes"},reference:{key:"cuisine",value:"sandwich"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/Стардог!s":{name:"Стардог!s",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/StardogsOfficial/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4439856",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"Стардог!s","brand:en":"Stardog!s","brand:wikidata":"Q4439856","brand:wikipedia":"ru:Стардогс",cuisine:"sausage",name:"Стардог!s","name:en":"Stardog!s",takeaway:"yes"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/Суши Wok":{name:"Суши Wok",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/sushiwokofficial/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q25444754",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"Суши Wok","brand:en":"Sushi Wok","brand:wikidata":"Q25444754","brand:wikipedia":"uk:Суши Wok (мережа магазинів)",cuisine:"asian",name:"Суши Wok","name:en":"Sushi Wok",takeaway:"yes"},countryCodes:["ru","ua"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/Теремок":{name:"Теремок",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/teremok/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4455593",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"Теремок","brand:en":"Teremok","brand:wikidata":"Q4455593","brand:wikipedia":"ru:Теремок (сеть быстрого питания)",cuisine:"crepe;russian",name:"Теремок","name:en":"Teremok",takeaway:"yes"},terms:[],matchScore:2,suggestion:true},"amenity/fast_food/burger/מקדונלד'ס":{name:"מקדונלד'ס",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/McDonalds/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q12061542",amenity:"fast_food",cuisine:"burger"},addTags:{amenity:"fast_food",brand:"מקדונלד'ס","brand:en":"McDonald's","brand:he":"מקדונלד'ס","brand:wikidata":"Q12061542","brand:wikipedia":"en:McDonald's Israel",cuisine:"burger",name:"מקדונלד'ס","name:en":"McDonald's","name:he":"מקדונלד'ס",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},countryCodes:["il"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/chicken/دجاج كنتاكي":{name:"دجاج كنتاكي",icon:"fas-drumstick-bite",imageURL:"https://graph.facebook.com/KFC/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q524757",amenity:"fast_food",cuisine:"chicken"},addTags:{amenity:"fast_food",brand:"دجاج كنتاكي","brand:ar":"دجاج كنتاكي","brand:en":"KFC","brand:wikidata":"Q524757","brand:wikipedia":"ar:دجاج كنتاكي",cuisine:"chicken",name:"دجاج كنتاكي","name:ar":"دجاج كنتاكي","name:en":"KFC",takeaway:"yes"},reference:{key:"cuisine",value:"chicken"},terms:[],matchScore:2,suggestion:true},"amenity/fast_food/burger/ماكدونالدز":{name:"ماكدونالدز",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/mcdonalds/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q38076",amenity:"fast_food",cuisine:"burger"},addTags:{amenity:"fast_food",brand:"ماكدونالدز","brand:ar":"ماكدونالدز","brand:en":"McDonald's","brand:wikidata":"Q38076","brand:wikipedia":"ar:ماكدونالدز",cuisine:"burger",name:"ماكدونالدز","name:ar":"ماكدونالدز","name:en":"McDonald's",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},terms:[],matchScore:2,suggestion:true},"amenity/fast_food/かっぱ寿司":{name:"かっぱ寿司",icon:"maki-fast-food",imageURL:"https://abs.twimg.com/sticky/default_profile_images/default_profile_bigger.png",geometry:["point","area"],tags:{"brand:wikidata":"Q11263916",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"かっぱ寿司","brand:en":"Kappazushi","brand:ja":"かっぱ寿司","brand:wikidata":"Q11263916","brand:wikipedia":"ja:かっぱ寿司",cuisine:"sushi",name:"かっぱ寿司","name:en":"Kappazushi","name:ja":"かっぱ寿司",takeaway:"yes"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/かつや":{name:"かつや",icon:"maki-fast-food",geometry:["point","area"],tags:{"brand:wikidata":"Q2855257",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"かつや","brand:en":"Katsuya","brand:ja":"かつや","brand:wikidata":"Q2855257","brand:wikipedia":"ja:かつや",cuisine:"fried_food",name:"かつや","name:en":"Katsuya","name:ja":"かつや","name:ko":"카쯔야","name:zh":"吉豚屋",takeaway:"yes"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/くら寿司":{name:"くら寿司",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/Kurasushi/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6445491",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"くら寿司","brand:en":"Kurazushi","brand:ja":"くら寿司","brand:wikidata":"Q6445491","brand:wikipedia":"ja:くら寿司",cuisine:"sushi",name:"くら寿司","name:en":"Kurazushi","name:ja":"くら寿司",takeaway:"yes"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/すき家":{name:"すき家",icon:"maki-fast-food",imageURL:"https://pbs.twimg.com/profile_images/1074928090885672960/nTgKn0jh_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q6137375",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"すき家","brand:en":"Sukiya","brand:ja":"すき家","brand:wikidata":"Q6137375","brand:wikipedia":"ja:すき家",cuisine:"beef_bowl",name:"すき家","name:en":"Sukiya","name:ja":"すき家",takeaway:"yes"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/なか卯":{name:"なか卯",icon:"maki-fast-food",imageURL:"https://pbs.twimg.com/profile_images/999109688582008832/evpixQ34_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q11274132",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"なか卯","brand:en":"Nakau","brand:ja":"なか卯","brand:wikidata":"Q11274132","brand:wikipedia":"ja:なか卯",cuisine:"udon",name:"なか卯","name:en":"Nakau","name:ja":"なか卯",takeaway:"yes"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/はま寿司":{name:"はま寿司",icon:"maki-fast-food",geometry:["point","area"],tags:{"brand:wikidata":"Q17220385",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"はま寿司","brand:en":"Hamazushi","brand:ja":"はま寿司","brand:wikidata":"Q17220385","brand:wikipedia":"ja:はま寿司",cuisine:"sushi",name:"はま寿司","name:en":"Hamazushi","name:ja":"はま寿司",takeaway:"yes"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/ほっかほっか亭":{name:"ほっかほっか亭",icon:"maki-fast-food",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FHokka-Hokka%20Tei%20logo.gif&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q5878035",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"ほっかほっか亭","brand:en":"Hokka Hokka Tei","brand:ja":"ほっかほっか亭","brand:wikidata":"Q5878035","brand:wikipedia":"ja:ほっかほっか亭",cuisine:"japanese",name:"ほっかほっか亭","name:en":"Hokka Hokka Tei","name:ja":"ほっかほっか亭",takeaway:"yes"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/ほっともっと":{name:"ほっともっと",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/hottomotto/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q10850949",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"ほっともっと","brand:en":"Hotto Motto","brand:ja":"ほっともっと","brand:wikidata":"Q10850949","brand:wikipedia":"ja:ほっともっと",cuisine:"japanese",name:"ほっともっと","name:en":"Hotto Motto","name:ja":"ほっともっと",takeaway:"yes"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/ゆで太郎":{name:"ゆで太郎",icon:"maki-fast-food",geometry:["point","area"],tags:{"brand:wikidata":"Q11280824",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"ゆで太郎","brand:en":"Yudetaro","brand:ja":"ゆで太郎","brand:wikidata":"Q11280824","brand:wikipedia":"ja:ゆで太郎",cuisine:"noodle",name:"ゆで太郎","name:en":"Yudetaro","name:ja":"ゆで太郎",takeaway:"yes"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/オリジン弁当":{name:"オリジン弁当",icon:"maki-fast-food",geometry:["point","area"],tags:{"brand:wikidata":"Q11292632",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"オリジン弁当","brand:en":"Origin Bentō","brand:ja":"オリジン弁当","brand:wikidata":"Q11292632","brand:wikipedia":"ja:オリジン東秀",cuisine:"japanese",name:"オリジン弁当","name:en":"Origin Bentō","name:ja":"オリジン弁当",takeaway:"yes"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/chicken/ケンタッキーフライドチキン":{name:"ケンタッキーフライドチキン",icon:"fas-drumstick-bite",imageURL:"https://graph.facebook.com/KFC/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q524757",amenity:"fast_food",cuisine:"chicken"},addTags:{amenity:"fast_food",brand:"ケンタッキーフライドチキン","brand:en":"KFC","brand:ja":"ケンタッキーフライドチキン","brand:wikidata":"Q524757","brand:wikipedia":"ja:KFCコーポレーション",cuisine:"chicken",name:"ケンタッキーフライドチキン","name:en":"KFC","name:ja":"ケンタッキーフライドチキン",takeaway:"yes"},reference:{key:"cuisine",value:"chicken"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/sandwich/サブウェイ":{name:"サブウェイ",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/subway/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q244457",amenity:"fast_food",cuisine:"sandwich"},addTags:{amenity:"fast_food",brand:"サブウェイ","brand:en":"Subway","brand:ja":"サブウェイ","brand:wikidata":"Q244457","brand:wikipedia":"ja:サブウェイ",cuisine:"sandwich",name:"サブウェイ","name:en":"Subway","name:ja":"サブウェイ",takeaway:"yes"},reference:{key:"cuisine",value:"sandwich"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/スシロー":{name:"スシロー",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/akindosushiro/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11257037",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"スシロー","brand:en":"Sushiro","brand:ja":"スシロー","brand:wikidata":"Q11257037","brand:wikipedia":"ja:あきんどスシロー",cuisine:"sushi",name:"スシロー","name:en":"Sushiro","name:ja":"スシロー","name:zh":"壽司郎",takeaway:"yes"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/pizza/ドミノ・ピザ":{name:"ドミノ・ピザ",icon:"maki-restaurant-pizza",imageURL:"https://graph.facebook.com/Dominos/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q839466",amenity:"fast_food",cuisine:"pizza"},addTags:{amenity:"fast_food",brand:"ドミノ・ピザ","brand:en":"Domino's Pizza","brand:ja":"ドミノ・ピザ","brand:wikidata":"Q839466","brand:wikipedia":"ja:ドミノ・ピザ",cuisine:"pizza",name:"ドミノ・ピザ","name:en":"Domino's Pizza","name:ja":"ドミノ・ピザ",takeaway:"yes"},reference:{key:"cuisine",value:"pizza"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/pizza/ピザハット":{name:"ピザハット",icon:"maki-restaurant-pizza",imageURL:"https://graph.facebook.com/pizzahutus/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q191615",amenity:"fast_food",cuisine:"pizza"},addTags:{amenity:"fast_food",brand:"ピザハット","brand:en":"Pizza Hut","brand:ja":"ピザハット","brand:wikidata":"Q191615","brand:wikipedia":"ja:ピザハット",cuisine:"pizza",name:"ピザハット","name:en":"Pizza Hut","name:ja":"ピザハット",takeaway:"yes"},reference:{key:"cuisine",value:"pizza"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/pizza/ピザ・カリフォルニア":{name:"ピザ・カリフォルニア",icon:"maki-restaurant-pizza",geometry:["point","area"],tags:{"brand:wikidata":"Q75324",amenity:"fast_food",cuisine:"pizza"},addTags:{amenity:"fast_food",brand:"ピザ・カリフォルニア","brand:en":"Pizza California","brand:ja":"ピザ・カリフォルニア","brand:wikidata":"Q75324","brand:wikipedia":"ja:ピザ・カリフォルニア",cuisine:"pizza",name:"ピザ・カリフォルニア","name:en":"Pizza California","name:ja":"ピザ・カリフォルニア",takeaway:"yes"},reference:{key:"cuisine",value:"pizza"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/pizza/ピザーラ":{name:"ピザーラ",icon:"maki-restaurant-pizza",imageURL:"https://graph.facebook.com/pizzala.jp/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7199948",amenity:"fast_food",cuisine:"pizza"},addTags:{amenity:"fast_food",brand:"ピザーラ","brand:en":"Pizza-La","brand:ja":"ピザーラ","brand:wikidata":"Q7199948","brand:wikipedia":"ja:ピザーラ",cuisine:"pizza",name:"ピザーラ","name:en":"Pizza-La","name:ja":"ピザーラ",takeaway:"yes"},reference:{key:"cuisine",value:"pizza"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/burger/フレッシュネスバーガー":{name:"フレッシュネスバーガー",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/freshness.burger.official/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5503087",amenity:"fast_food",cuisine:"burger"},addTags:{amenity:"fast_food",brand:"フレッシュネスバーガー","brand:en":"Freshness Burger","brand:ja":"フレッシュネスバーガー","brand:wikidata":"Q5503087","brand:wikipedia":"ja:フレッシュネスバーガー",cuisine:"burger",name:"フレッシュネスバーガー","name:en":"Freshness Burger","name:ja":"フレッシュネスバーガー",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/burger/マクドナルド":{name:"マクドナルド",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/mcdonalds/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q38076",amenity:"fast_food",cuisine:"burger"},addTags:{amenity:"fast_food",brand:"マクドナルド","brand:en":"McDonald's","brand:ja":"マクドナルド","brand:wikidata":"Q38076","brand:wikipedia":"ja:マクドナルド",cuisine:"burger",name:"マクドナルド","name:en":"McDonald's","name:ja":"マクドナルド",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/donut/ミスタードーナツ":{name:"ミスタードーナツ",icon:"temaki-donut",imageURL:"https://graph.facebook.com/misdo.jp/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1065819",amenity:"fast_food",cuisine:"donut"},addTags:{amenity:"fast_food",brand:"ミスタードーナツ","brand:en":"Mister Donut","brand:ja":"ミスタードーナツ","brand:wikidata":"Q1065819","brand:wikipedia":"en:Mister Donut",cuisine:"donut",name:"ミスタードーナツ","name:en":"Mister Donut","name:ja":"ミスタードーナツ",takeaway:"yes"},reference:{key:"cuisine",value:"donut"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/burger/モスバーガー":{name:"モスバーガー",icon:"maki-fast-food",imageURL:"https://pbs.twimg.com/profile_images/712033394109124608/kVGTqBLR_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q1204169",amenity:"fast_food",cuisine:"burger"},addTags:{amenity:"fast_food",brand:"モスバーガー","brand:en":"MOS Burger","brand:ja":"モスバーガー","brand:wikidata":"Q1204169","brand:wikipedia":"ja:モスバーガー",cuisine:"burger",name:"モスバーガー","name:en":"MOS Burger","name:ja":"モスバーガー",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/ラーメン二郎":{name:"ラーメン二郎",icon:"maki-fast-food",geometry:["point","area"],tags:{"brand:wikidata":"Q11347765",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"ラーメン二郎","brand:en":"Ramen Jiro","brand:ja":"ラーメン二郎","brand:wikidata":"Q11347765","brand:wikipedia":"ja:ラーメン二郎",cuisine:"ramen",name:"ラーメン二郎","name:en":"Ramen Jiro","name:ja":"ラーメン二郎",takeaway:"yes"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/burger/ロッテリア":{name:"ロッテリア",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/ilovelotteria/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q249525",amenity:"fast_food",cuisine:"burger"},addTags:{amenity:"fast_food",brand:"ロッテリア","brand:en":"Lotteria","brand:ja":"ロッテリア","brand:wikidata":"Q249525","brand:wikipedia":"ja:ロッテリア",cuisine:"burger",name:"ロッテリア","name:en":"Lotteria","name:ja":"ロッテリア",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/吉野家":{name:"吉野家",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/tw.yoshinoya/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q776272",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"吉野家","brand:en":"Yoshinoya","brand:ja":"吉野家","brand:wikidata":"Q776272","brand:wikipedia":"ja:吉野家",cuisine:"beef_bowl",name:"吉野家","name:en":"Yoshinoya","name:ja":"吉野家",takeaway:"yes"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/富士そば":{name:"富士そば",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/fujisoba/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11414722",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"富士そば","brand:en":"Fuji Soba","brand:ja":"富士そば","brand:wikidata":"Q11414722","brand:wikipedia":"ja:名代富士そば",cuisine:"soba",name:"富士そば","name:en":"Fuji Soba","name:ja":"富士そば",takeaway:"yes"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/幸楽苑":{name:"幸楽苑",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/Kourakuen/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11484003",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"幸楽苑","brand:en":"Kourakuen","brand:ja":"幸楽苑","brand:wikidata":"Q11484003","brand:wikipedia":"ja:幸楽苑",cuisine:"ramen",name:"幸楽苑","name:en":"Kourakuen","name:ja":"幸楽苑",takeaway:"yes"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/burger/摩斯漢堡":{name:"摩斯漢堡",icon:"maki-fast-food",imageURL:"https://pbs.twimg.com/profile_images/712033394109124608/kVGTqBLR_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q1204169",amenity:"fast_food",cuisine:"burger"},addTags:{amenity:"fast_food",brand:"摩斯漢堡","brand:en":"MOS Burger","brand:wikidata":"Q1204169","brand:wikipedia":"zh:摩斯漢堡","brand:zh":"摩斯漢堡",cuisine:"burger",name:"摩斯漢堡","name:en":"MOS Burger","name:zh":"摩斯漢堡",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},countryCodes:["cn","hk","mo","sg","tw"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/日高屋":{name:"日高屋",icon:"maki-fast-food",geometry:["point","area"],tags:{"brand:wikidata":"Q11326050",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"日高屋","brand:en":"Hidakaya","brand:wikidata":"Q11326050","brand:wikipedia":"ja:ハイデイ日高",cuisine:"noodle",name:"日高屋",takeaway:"yes"},terms:[],matchScore:2,suggestion:true},"amenity/fast_food/松屋":{name:"松屋",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/matsuyafoods.matsuya/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q848773",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"松屋","brand:en":"Matsuya Foods","brand:wikidata":"Q848773","brand:wikipedia":"ja:松屋フーズ",cuisine:"japanese",name:"松屋","name:en":"Matsuya Foods",takeaway:"yes"},countryCodes:["cn","hk","jp","mo","sg","tw"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/箱根そば":{name:"箱根そば",icon:"maki-fast-food",geometry:["point","area"],tags:{"brand:wikidata":"Q11603345",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"箱根そば","brand:en":"Hakone Soba","brand:ja":"箱根そば","brand:wikidata":"Q11603345","brand:wikipedia":"ja:箱根そば",cuisine:"soba",name:"箱根そば","name:en":"Hakone Soba","name:ja":"箱根そば",takeaway:"yes"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/chicken/肯德基":{name:"肯德基",icon:"fas-drumstick-bite",imageURL:"https://graph.facebook.com/KFC/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q524757",amenity:"fast_food",cuisine:"chicken"},addTags:{amenity:"fast_food",brand:"肯德基","brand:en":"KFC","brand:wikidata":"Q524757","brand:wikipedia":"zh:肯德基",cuisine:"chicken",name:"肯德基","name:en":"KFC",takeaway:"yes"},reference:{key:"cuisine",value:"chicken"},countryCodes:["cn","hk","mo","sg","tw"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/burger/麥當勞":{name:"麥當勞",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/mcdonalds/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q38076",amenity:"fast_food",cuisine:"burger"},addTags:{amenity:"fast_food",brand:"麥當勞","brand:en":"McDonald's","brand:wikidata":"Q38076","brand:wikipedia":"zh_classical:麥當勞",cuisine:"burger",name:"麥當勞","name:en":"McDonald's",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},countryCodes:["hk","mo","tw"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/burger/麦当劳":{name:"麦当劳",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/mcdonalds/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q38076",amenity:"fast_food",cuisine:"burger"},addTags:{amenity:"fast_food",brand:"麦当劳","brand:en":"McDonald's","brand:wikidata":"Q38076","brand:wikipedia":"zh:麦当劳",cuisine:"burger",name:"麦当劳","name:en":"McDonald's",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},countryCodes:["cn","sg"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/burger/롯데리아":{name:"롯데리아",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/ilovelotteria/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q249525",amenity:"fast_food",cuisine:"burger"},addTags:{amenity:"fast_food",brand:"롯데리아","brand:en":"Lotteria","brand:ko":"롯데리아","brand:wikidata":"Q249525","brand:wikipedia":"ko:롯데리아",cuisine:"burger",name:"롯데리아","name:en":"Lotteria","name:ko":"롯데리아",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},countryCodes:["kr"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/1-2-3":{name:"1-2-3",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q4545742",amenity:"fuel"},addTags:{amenity:"fuel",brand:"1-2-3","brand:wikidata":"Q4545742","brand:wikipedia":"en:1-2-3 (fuel station)",name:"1-2-3"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/7-Eleven":{name:"7-Eleven",icon:"maki-fuel",imageURL:"https://graph.facebook.com/7ElevenMexico/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q259340",amenity:"fuel"},addTags:{amenity:"fuel",brand:"7-Eleven","brand:wikidata":"Q259340","brand:wikipedia":"en:7-Eleven",name:"7-Eleven"},terms:["7-11","seven eleven"],matchScore:2,suggestion:true},"amenity/fuel/76":{name:"76",icon:"maki-fuel",imageURL:"https://graph.facebook.com/76gas/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1658320",amenity:"fuel"},addTags:{amenity:"fuel",brand:"76","brand:wikidata":"Q1658320","brand:wikipedia":"en:76 (gas station)",name:"76"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/ABC":{name:"ABC",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q10397504",amenity:"fuel"},addTags:{amenity:"fuel",brand:"ABC","brand:wikidata":"Q10397504","brand:wikipedia":"fi:ABC-ketju",name:"ABC"},countryCodes:["fi"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/ADNOC":{name:"ADNOC",icon:"maki-fuel",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FAbu%20Dhabi%20National%20Oil%20Company%20logo.png&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q166729",amenity:"fuel"},addTags:{amenity:"fuel",brand:"ADNOC","brand:wikidata":"Q166729","brand:wikipedia":"en:Abu Dhabi National Oil Company",name:"ADNOC"},countryCodes:["ae"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Aegean":{name:"Aegean",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q28146598",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Aegean","brand:wikidata":"Q28146598","brand:wikipedia":"el:Aegean Oil",name:"Aegean"},countryCodes:["gr"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Afriquia":{name:"Afriquia",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q2829178",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Afriquia","brand:wikidata":"Q2829178","brand:wikipedia":"en:Akwa Group",name:"Afriquia"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/Agip":{name:"Agip",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q377915",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Agip","brand:wikidata":"Q377915","brand:wikipedia":"en:Agip",name:"Agip"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/Agrola":{name:"Agrola",icon:"maki-fuel",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FAgrola%20logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q397351",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Agrola","brand:wikidata":"Q397351","brand:wikipedia":"de:Agrola",name:"Agrola"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/Alon":{name:"Alon",icon:"maki-fuel",imageURL:"https://graph.facebook.com/alonbrands/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62274304",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Alon","brand:wikidata":"Q62274304",name:"Alon"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Alpet":{name:"Alpet",icon:"maki-fuel",imageURL:"https://graph.facebook.com/ALPETtr/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62131561",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Alpet","brand:wikidata":"Q62131561",name:"Alpet"},countryCodes:["al","tr"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Api":{name:"Api",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q466043",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Api","brand:wikidata":"Q466043","brand:wikipedia":"en:American Petroleum Institute",name:"Api"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/Aral":{name:"Aral",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q565734",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Aral","brand:wikidata":"Q565734","brand:wikipedia":"en:Aral AG",name:"Aral"},countryCodes:["de"],terms:["aral tankstelle"],matchScore:2,suggestion:true},"amenity/fuel/Arco":{name:"Arco",icon:"maki-fuel",imageURL:"https://graph.facebook.com/arco/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q304769",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Arco","brand:wikidata":"Q304769","brand:wikipedia":"en:ARCO",name:"Arco"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/Asda":{name:"Asda",icon:"maki-fuel",imageURL:"https://graph.facebook.com/Asda/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q297410",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Asda","brand:wikidata":"Q297410","brand:wikipedia":"en:Asda",name:"Asda"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Atem":{name:"Atem",icon:"maki-fuel",imageURL:"https://graph.facebook.com/postosatem/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62332255",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Atem","brand:wikidata":"Q62332255",name:"Atem"},countryCodes:["br"],terms:["posto atem"],matchScore:2,suggestion:true},"amenity/fuel/Auchan":{name:"Auchan",icon:"maki-fuel",imageURL:"https://pbs.twimg.com/profile_images/877095334316576768/bhQDPUWZ_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q758603",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Auchan","brand:wikidata":"Q758603","brand:wikipedia":"en:Auchan",name:"Auchan"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/Avanti":{name:"Avanti",icon:"maki-fuel",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FOmv%20logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q168238",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Avanti","brand:wikidata":"Q168238","brand:wikipedia":"en:OMV",name:"Avanti"},countryCodes:["at"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Avia":{name:"Avia",icon:"maki-fuel",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FAVIA%20International%20logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q300147",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Avia","brand:wikidata":"Q300147","brand:wikipedia":"de:Avia International",name:"Avia"},terms:["station avia"],matchScore:2,suggestion:true},"amenity/fuel/Avin":{name:"Avin",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q19903165",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Avin","brand:wikidata":"Q19903165","brand:wikipedia":"en:Avin International",name:"Avin"},countryCodes:["gr"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Axion":{name:"Axion",icon:"maki-fuel",imageURL:"https://graph.facebook.com/AXIONenergyOficial/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62131749",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Axion","brand:wikidata":"Q62131749",name:"Axion"},countryCodes:["ar","py","uy"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Aytemiz":{name:"Aytemiz",icon:"maki-fuel",imageURL:"https://graph.facebook.com/AytemizOfficial/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62274352",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Aytemiz","brand:wikidata":"Q62274352",name:"Aytemiz"},countryCodes:["tr"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/BEBECO":{name:"BEBECO",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q62274373",amenity:"fuel"},addTags:{amenity:"fuel",brand:"BEBECO","brand:wikidata":"Q62274373",name:"BEBECO"},countryCodes:["ch"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/BHPetrol":{name:"BHPetrol",icon:"maki-fuel",imageURL:"https://graph.facebook.com/BHP.Petrol/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62274381",amenity:"fuel"},addTags:{amenity:"fuel",brand:"BHPetrol","brand:wikidata":"Q62274381",name:"BHPetrol"},countryCodes:["my"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/BP":{name:"BP",icon:"maki-fuel",imageURL:"https://graph.facebook.com/bp/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q152057",amenity:"fuel"},addTags:{amenity:"fuel",brand:"BP","brand:wikidata":"Q152057","brand:wikipedia":"en:BP",name:"BP"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/BR":{name:"BR",icon:"maki-fuel",imageURL:"https://graph.facebook.com/postospetrobras/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4836468",amenity:"fuel"},addTags:{amenity:"fuel",brand:"BR","brand:wikidata":"Q4836468","brand:wikipedia":"pt:Petrobras Distribuidora",name:"BR"},countryCodes:["br"],terms:["br petrobras","petrobras","posto br"],matchScore:2,suggestion:true},"amenity/fuel/Bangchak":{name:"Bangchak",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q6579719",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Bangchak","brand:wikidata":"Q6579719","brand:wikipedia":"zh:曼差石油股份",name:"Bangchak"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/Bharat Petroleum":{name:"Bharat Petroleum",icon:"maki-fuel",imageURL:"https://graph.facebook.com/BharatPetroleumcorporation/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q854826",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Bharat Petroleum","brand:wikidata":"Q854826","brand:wikipedia":"en:Bharat Petroleum",name:"Bharat Petroleum"},countryCodes:["in"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Biomax":{name:"Biomax",icon:"maki-fuel",imageURL:"https://graph.facebook.com/BiomaxColombia/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62274413",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Biomax","brand:wikidata":"Q62274413",name:"Biomax"},countryCodes:["co"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Bliska":{name:"Bliska",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q4016378",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Bliska","brand:wikidata":"Q4016378","brand:wikipedia":"pl:Bliska",name:"Bliska"},countryCodes:["pl"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/CAMPSA":{name:"CAMPSA",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q1031623",amenity:"fuel"},addTags:{amenity:"fuel",brand:"CAMPSA","brand:wikidata":"Q1031623","brand:wikipedia":"en:Campsa",name:"CAMPSA"},countryCodes:["es"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/CEPSA":{name:"CEPSA",icon:"maki-fuel",imageURL:"https://graph.facebook.com/CEPSAespana/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q608819",amenity:"fuel"},addTags:{amenity:"fuel",brand:"CEPSA","brand:wikidata":"Q608819","brand:wikipedia":"en:Cepsa",name:"CEPSA"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/Caltex":{name:"Caltex",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q277470",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Caltex","brand:wikidata":"Q277470","brand:wikipedia":"en:Caltex",name:"Caltex"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/Canadian Tire Gas+":{name:"Canadian Tire Gas+",icon:"maki-fuel",imageURL:"https://graph.facebook.com/Canadiantire/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1032400",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Canadian Tire","brand:wikidata":"Q1032400","brand:wikipedia":"en:Canadian Tire",name:"Canadian Tire"},terms:["canadian tire","canadian tire gas bar"],matchScore:2,suggestion:true},"amenity/fuel/Carrefour Market":{name:"Carrefour Market",icon:"maki-fuel",imageURL:"https://graph.facebook.com/carrefouritalia/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q217599",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Carrefour Market","brand:wikidata":"Q217599","brand:wikipedia":"en:Carrefour",name:"Carrefour Market"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/Casey's General Store":{name:"Casey's General Store",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q2940968",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Casey's General Store","brand:wikidata":"Q2940968","brand:wikipedia":"en:Casey's General Stores",name:"Casey's General Store"},terms:["caseys"],matchScore:2,suggestion:true},"amenity/fuel/Cenex":{name:"Cenex",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q5011381",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Cenex","brand:wikidata":"Q5011381","brand:wikipedia":"en:CHS Inc.",name:"Cenex"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/Ceypetco":{name:"Ceypetco",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q5065795",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Ceypetco","brand:wikidata":"Q5065795","brand:wikipedia":"en:Ceylon Petroleum Corporation",name:"Ceypetco"},countryCodes:["lk"],terms:["lanka filling station"],matchScore:2,suggestion:true},"amenity/fuel/Chevron":{name:"Chevron",icon:"maki-fuel",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FChevron%20Logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q319642",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Chevron","brand:wikidata":"Q319642","brand:wikipedia":"en:Chevron Corporation",name:"Chevron"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/Circle K":{name:"Circle K",icon:"maki-fuel",imageURL:"https://graph.facebook.com/circlekireland/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3268010",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Circle K","brand:wikidata":"Q3268010","brand:wikipedia":"en:Circle K",name:"Circle K"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/Citgo":{name:"Citgo",icon:"maki-fuel",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FCitgo%20logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q2974437",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Citgo","brand:wikidata":"Q2974437","brand:wikipedia":"en:Citgo",name:"Citgo"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/Clark":{name:"Clark",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q5127157",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Clark","brand:wikidata":"Q5127157","brand:wikipedia":"en:Clark Brands",name:"Clark"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/Co-op (Canada)":{name:"Co-op (Canada)",icon:"maki-fuel",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FSaskatoon%20Co-op%20Logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q5440676",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Federated Co-operatives","brand:wikidata":"Q5440676","brand:wikipedia":"en:Federated Co-operatives",name:"Co-op"},countryCodes:["ca"],terms:["coop"],matchScore:2,suggestion:true},"amenity/fuel/Coles Express":{name:"Coles Express",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q5144653",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Coles Express","brand:wikidata":"Q5144653","brand:wikipedia":"en:Coles Express",name:"Coles Express"},countryCodes:["au"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Conoco":{name:"Conoco",icon:"maki-fuel",imageURL:"https://graph.facebook.com/conoco/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1126518",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Conoco","brand:wikidata":"Q1126518","brand:wikipedia":"en:Conoco",name:"Conoco"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/Copec":{name:"Copec",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q11681461",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Copec","brand:wikidata":"Q11681461","brand:wikipedia":"en:Empresas Copec",name:"Copec"},countryCodes:["cl"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Copetrol":{name:"Copetrol",icon:"maki-fuel",imageURL:"https://graph.facebook.com/Copetrol/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62274431",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Copetrol","brand:wikidata":"Q62274431",name:"Copetrol"},countryCodes:["py"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Cosmo":{name:"Cosmo",icon:"maki-fuel",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FCosmo%20Oil%20company%20logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q2498318",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Cosmo","brand:wikidata":"Q2498318","brand:wikipedia":"en:Cosmo Oil Company",name:"Cosmo"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Costco Gasoline":{name:"Costco Gasoline",icon:"maki-fuel",imageURL:"https://graph.facebook.com/Costco/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q715583",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Costco Gasoline","brand:wikidata":"Q715583","brand:wikipedia":"en:Costco",name:"Costco Gasoline"},terms:["costco","costco gas","costco wholesale"],matchScore:2,suggestion:true},"amenity/fuel/Couche-Tard":{name:"Couche-Tard",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q2836957",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Couche-Tard","brand:wikidata":"Q2836957","brand:wikipedia":"en:Alimentation Couche-Tard",name:"Couche-Tard"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Crevier":{name:"Crevier",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q61743451",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Crevier","brand:wikidata":"Q61743451",name:"Crevier"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Crodux":{name:"Crodux",icon:"maki-fuel",imageURL:"https://graph.facebook.com/croduxhr/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62274622",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Crodux","brand:wikidata":"Q62274622",name:"Crodux"},countryCodes:["hr"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Cumberland Farms":{name:"Cumberland Farms",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q1143685",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Cumberland Farms","brand:wikidata":"Q1143685","brand:wikipedia":"en:Cumberland Farms",name:"Cumberland Farms"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Delta (Panama & Costa Rica)":{name:"Delta (Panama & Costa Rica)",icon:"maki-fuel",imageURL:"https://graph.facebook.com/PetroleosDelta/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62274638",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Delta","brand:wikidata":"Q62274638",name:"Delta"},countryCodes:["cr","pr"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Delta (USA)":{name:"Delta (USA)",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q62274661",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Delta","brand:wikidata":"Q62274661",name:"Delta"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Diamond Shamrock":{name:"Diamond Shamrock",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q16973722",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Diamond Shamrock","brand:wikidata":"Q16973722","brand:wikipedia":"en:Diamond Shamrock",name:"Diamond Shamrock"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Domo":{name:"Domo",icon:"maki-fuel",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FDOMO%20Gasoline%20Logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q5291326",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Domo","brand:wikidata":"Q5291326","brand:wikipedia":"en:Domo Gasoline",name:"Domo"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/EKO (Canada)":{name:"EKO (Canada)",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q3045934",amenity:"fuel"},addTags:{amenity:"fuel",brand:"EKO","brand:wikidata":"Q3045934","brand:wikipedia":"fr:EKO",name:"EKO"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/EKO (Greece)":{name:"EKO (Greece)",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q903198",amenity:"fuel"},addTags:{amenity:"fuel",brand:"EKO","brand:wikidata":"Q903198","brand:wikipedia":"el:Ελληνικά Πετρέλαια",name:"EKO"},countryCodes:["bg","cy","gr","me","mk","rs"],terms:["εκο"],matchScore:2,suggestion:true},"amenity/fuel/ENEOS":{name:"ENEOS",icon:"maki-fuel",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FJXTG%20Nippon%20Oil%20%26%20Energy%20logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q1640290",amenity:"fuel"},addTags:{amenity:"fuel",brand:"ENEOS","brand:wikidata":"Q1640290","brand:wikipedia":"en:JXTG Nippon Oil & Energy",name:"ENEOS"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Elan":{name:"Elan",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q57980752",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Elan","brand:wikidata":"Q57980752",name:"Elan"},countryCodes:["de","fr","nl"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Engen":{name:"Engen",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q3054251",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Engen","brand:wikidata":"Q3054251","brand:wikipedia":"en:Engen Petroleum",name:"Engen"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/Eni":{name:"Eni",icon:"maki-fuel",imageURL:"https://pbs.twimg.com/profile_images/875644564459012097/fsDlSI7T_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q565594",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Eni","brand:wikidata":"Q565594","brand:wikipedia":"en:Eni",name:"Eni"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/Erg":{name:"Erg",icon:"maki-fuel",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FERG%20logo2018.jpg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q739503",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Erg","brand:wikidata":"Q739503","brand:wikipedia":"it:ERG (azienda)",name:"Erg"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/Esso":{name:"Esso",icon:"maki-fuel",imageURL:"https://pbs.twimg.com/profile_images/595503093447598080/4ooH4R98_bigger.png",geometry:["point","area"],tags:{"brand:wikidata":"Q867662",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Esso","brand:wikidata":"Q867662","brand:wikipedia":"en:Esso",name:"Esso"},terms:["station esso"],matchScore:2,suggestion:true},"amenity/fuel/Esso Express":{name:"Esso Express",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q2350336",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Esso Express","brand:wikidata":"Q2350336","brand:wikipedia":"nl:Esso Express",name:"Esso Express"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/Exxon":{name:"Exxon",icon:"maki-fuel",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FExxon%20logo%202016.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q4781944",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Exxon","brand:wikidata":"Q4781944","brand:wikipedia":"en:Exxon",name:"Exxon"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/F24":{name:"F24",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q12310853",amenity:"fuel"},addTags:{amenity:"fuel",brand:"F24","brand:wikidata":"Q12310853","brand:wikipedia":"da:F24",name:"F24"},countryCodes:["dk"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Fas Gas":{name:"Fas Gas",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q61743505",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Fas Gas","brand:wikidata":"Q61743505","brand:wikipedia":"en:Parkland Fuel",name:"Fas Gas"},terms:["fas gas plus"],matchScore:2,suggestion:true},"amenity/fuel/Firezone":{name:"Firezone",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q14628080",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Firezone","brand:wikidata":"Q14628080","brand:wikipedia":"nl:Firezone",name:"Firezone"},countryCodes:["nl"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Flying V":{name:"Flying V",icon:"maki-fuel",imageURL:"https://graph.facebook.com/OfficialFlyingV/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62275048",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Flying V","brand:wikidata":"Q62275048",name:"Flying V"},countryCodes:["ph"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Freie Tankstelle":{name:"Freie Tankstelle",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q1009104",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Freie Tankstelle","brand:wikidata":"Q1009104","brand:wikipedia":"de:Bundesverband freier Tankstellen",name:"Freie Tankstelle"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/GALP":{name:"GALP",icon:"maki-fuel",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FGalp.png&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q1492739",amenity:"fuel"},addTags:{amenity:"fuel",brand:"GALP","brand:wikidata":"Q1492739","brand:wikipedia":"en:Galp Energia",name:"GALP"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/Gazel":{name:"Gazel",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q62529885",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Gazel","brand:wikidata":"Q62529885",name:"Gazel"},countryCodes:["co","mx","pe"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Gazprom":{name:"Gazprom",icon:"maki-fuel",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FGazprom%20Avia%20Logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q102673",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Gazprom","brand:wikidata":"Q102673","brand:wikipedia":"en:Gazprom",name:"Gazprom"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/GetGo":{name:"GetGo",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q5553766",amenity:"fuel"},addTags:{amenity:"fuel",brand:"GetGo","brand:wikidata":"Q5553766","brand:wikipedia":"en:GetGo",name:"GetGo"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Glusco":{name:"Glusco",icon:"maki-fuel",imageURL:"https://graph.facebook.com/Glusco.Ukraine/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62284719",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Glusco","brand:wikidata":"Q62284719",name:"Glusco"},countryCodes:["ua"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Goil":{name:"Goil",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q5555383",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Goil","brand:wikidata":"Q5555383","brand:wikipedia":"en:Ghana Oil Company",name:"Goil"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/Gulf":{name:"Gulf",icon:"maki-fuel",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FGulf%20logo.png&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q1296860",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Gulf","brand:wikidata":"Q1296860","brand:wikipedia":"en:Gulf Oil",name:"Gulf"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/Gull":{name:"Gull",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q5617739",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Gull","brand:wikidata":"Q5617739","brand:wikipedia":"en:Gull Petroleum",name:"Gull"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/H-E-B Fuel":{name:"H-E-B Fuel",icon:"maki-fuel",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FLogo%20of%20the%20HEB%20Grocery%20Company%2C%20LP.png&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q830621",amenity:"fuel"},addTags:{amenity:"fuel",brand:"H-E-B Fuel","brand:wikidata":"Q830621","brand:wikipedia":"en:H-E-B",name:"H-E-B Fuel"},terms:["h-e-b gas"],matchScore:2,suggestion:true},"amenity/fuel/HEM":{name:"HEM",icon:"maki-fuel",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FTamoil.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q1563517",amenity:"fuel"},addTags:{amenity:"fuel",brand:"HEM","brand:wikidata":"Q1563517","brand:wikipedia":"de:Deutsche Tamoil",name:"HEM"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/HP":{name:"HP",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q1619375",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Hindustan Petroleum","brand:wikidata":"Q1619375","brand:wikipedia":"en:Hindustan Petroleum",name:"HP",official_name:"Hindustan Petroleum"},terms:["hindustan petroleum","hp petrol pump"],matchScore:2,suggestion:true},"amenity/fuel/Harnois":{name:"Harnois",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q61743558",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Harnois","brand:wikidata":"Q61743558",name:"Harnois"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Hess":{name:"Hess",icon:"maki-fuel",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FHess%20Corporation%20Logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q1615684",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Hess","brand:wikidata":"Q1615684","brand:wikipedia":"en:Hess Corporation",name:"Hess"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/Hofer":{name:"Hofer",icon:"maki-fuel",imageURL:"https://graph.facebook.com/HOFER.AT/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q15815751",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Hofer","brand:wikidata":"Q15815751","brand:wikipedia":"de:Hofer KG",name:"Hofer"},countryCodes:["at","si"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Holiday":{name:"Holiday",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q5880490",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Holiday","brand:wikidata":"Q5880490","brand:wikipedia":"en:Holiday Stationstores",name:"Holiday"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/IES":{name:"IES",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q62287387",amenity:"fuel"},addTags:{amenity:"fuel",brand:"IES","brand:wikidata":"Q62287387",name:"IES"},countryCodes:["it"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/IP":{name:"IP",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q646807",amenity:"fuel"},addTags:{amenity:"fuel",brand:"IP","brand:wikidata":"Q646807","brand:wikipedia":"en:Anonima Petroli Italiana",name:"IP"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/Indian Oil":{name:"Indian Oil",icon:"maki-fuel",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FIndian%20Oil%20Logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q1289348",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Indian Oil","brand:wikidata":"Q1289348","brand:wikipedia":"en:Indian Oil Corporation",name:"Indian Oil"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/Ingo":{name:"Ingo",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q17048617",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Ingo","brand:wikidata":"Q17048617","brand:wikipedia":"en:Ingo (brand)",name:"Ingo"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/Intermarché":{name:"Intermarché",icon:"maki-fuel",imageURL:"https://graph.facebook.com/tousuniscontrelaviechere/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3153200",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Intermarché","brand:wikidata":"Q3153200","brand:wikipedia":"fr:Intermarché",name:"Intermarché"},terms:["intermarché super"],matchScore:2,suggestion:true},"amenity/fuel/Ipiranga":{name:"Ipiranga",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q2081136",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Ipiranga","brand:wikidata":"Q2081136","brand:wikipedia":"pt:Ipiranga (empresa)",name:"Ipiranga"},countryCodes:["br"],terms:["posto ipiranga"],matchScore:2,suggestion:true},"amenity/fuel/Irving":{name:"Irving",icon:"maki-fuel",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FIrving%20Oil%20Logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q1673286",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Irving","brand:wikidata":"Q1673286","brand:wikipedia":"en:Irving Oil",name:"Irving"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/JA-SS":{name:"JA-SS",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q11225213",amenity:"fuel"},addTags:{amenity:"fuel",brand:"JA-SS","brand:wikidata":"Q11225213","brand:wikipedia":"ja:JA-SS",name:"JA-SS"},countryCodes:["jp"],terms:["ja"],matchScore:2,suggestion:true},"amenity/fuel/Jet":{name:"Jet",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q568940",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Jet","brand:wikidata":"Q568940","brand:wikipedia":"en:Jet (brand)",name:"Jet"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/Jetti":{name:"Jetti",icon:"maki-fuel",imageURL:"https://graph.facebook.com/Jetti-Petroleum-Inc-1733916930229227/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62288720",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Jetti","brand:wikidata":"Q62288720",name:"Jetti"},countryCodes:["ph"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Kobil":{name:"Kobil",icon:"maki-fuel",imageURL:"https://graph.facebook.com/kenolkobil/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q22906119",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Kobil","brand:wikidata":"Q22906119","brand:wikipedia":"en:KenolKobil",name:"Kobil"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/Kroger":{name:"Kroger",icon:"maki-fuel",imageURL:"https://graph.facebook.com/Kroger/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q153417",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Kroger","brand:wikidata":"Q153417","brand:wikipedia":"en:Kroger",name:"Kroger"},terms:["kroger fuel"],matchScore:2,suggestion:true},"amenity/fuel/Kum & Go":{name:"Kum & Go",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q6443340",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Kum & Go","brand:wikidata":"Q6443340","brand:wikipedia":"en:Kum & Go",name:"Kum & Go"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Kwik Trip":{name:"Kwik Trip",icon:"maki-fuel",imageURL:"https://graph.facebook.com/KwikTrip/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6450420",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Kwik Trip","brand:wikidata":"Q6450420","brand:wikipedia":"en:Kwik Trip",name:"Kwik Trip"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/Lotos":{name:"Lotos",icon:"maki-fuel",imageURL:"https://graph.facebook.com/GrupaLOTOS/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1256909",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Lotos","brand:wikidata":"Q1256909","brand:wikipedia":"en:Grupa Lotos",name:"Lotos"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/Lotos Optima":{name:"Lotos Optima",icon:"maki-fuel",imageURL:"https://graph.facebook.com/GrupaLOTOS/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1256909",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Lotos Optima","brand:wikidata":"Q1256909","brand:wikipedia":"en:Grupa Lotos",name:"Lotos Optima"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/Love's":{name:"Love's",icon:"maki-fuel",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FLove%E2%80%99s%20Travel%20Stops%20%26%20Country%20Stores%20Logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q1872496",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Love's","brand:wikidata":"Q1872496","brand:wikipedia":"en:Love's Travel Stops & Country Stores",name:"Love's"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Lukoil":{name:"Lukoil",icon:"maki-fuel",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FLUK%20OIL%20Logo%20kyr.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q329347",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Lukoil","brand:wikidata":"Q329347","brand:wikipedia":"en:Lukoil",name:"Lukoil"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/MEROIL":{name:"MEROIL",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q62292559",amenity:"fuel"},addTags:{amenity:"fuel",brand:"MEROIL","brand:wikidata":"Q62292559",name:"MEROIL"},countryCodes:["es"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/MOL":{name:"MOL",icon:"maki-fuel",imageURL:"https://pbs.twimg.com/profile_images/378800000474004977/cf7c3082d7151bad59c596ac0def6604_bigger.png",geometry:["point","area"],tags:{"brand:wikidata":"Q549181",amenity:"fuel"},addTags:{amenity:"fuel",brand:"MOL","brand:wikidata":"Q549181","brand:wikipedia":"en:MOL (company)",name:"MOL"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/MRS":{name:"MRS",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q56274919",amenity:"fuel"},addTags:{amenity:"fuel",brand:"MRS","brand:wikidata":"Q56274919","brand:wikipedia":"en:MRS Oil Nigeria Plc",name:"MRS"},countryCodes:["ng"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Mac's":{name:"Mac's",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q4043527",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Mac's","brand:wikidata":"Q4043527","brand:wikipedia":"en:Mac's Convenience Stores",name:"Mac's"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/MacEwen":{name:"MacEwen",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q61740335",amenity:"fuel"},addTags:{amenity:"fuel",brand:"MacEwen","brand:wikidata":"Q61740335",name:"MacEwen"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Marathon":{name:"Marathon",icon:"maki-fuel",imageURL:"https://graph.facebook.com/MarathonPetroleumCorporation/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q458363",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Marathon","brand:wikidata":"Q458363","brand:wikipedia":"en:Marathon Petroleum",name:"Marathon"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/Maverik":{name:"Maverik",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q16974822",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Maverik","brand:wikidata":"Q16974822","brand:wikipedia":"en:FJ Management",name:"Maverik"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Maxol":{name:"Maxol",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q3302837",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Maxol","brand:wikidata":"Q3302837","brand:wikipedia":"en:Maxol",name:"Maxol"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/Metano":{name:"Metano",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q62294765",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Metano","brand:wikidata":"Q62294765",name:"Metano"},countryCodes:["it"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Migrol":{name:"Migrol",icon:"maki-fuel",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FLogo%20Migrol.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q1747771",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Migrol","brand:wikidata":"Q1747771","brand:wikipedia":"de:Migrol",name:"Migrol"},countryCodes:["ch"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Mobil":{name:"Mobil",icon:"maki-fuel",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FMobil%20logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q3088656",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Mobil","brand:wikidata":"Q3088656","brand:wikipedia":"en:Mobil",name:"Mobil"},terms:["mobile"],matchScore:2,suggestion:true},"amenity/fuel/Moil":{name:"Moil",icon:"maki-fuel",imageURL:"https://graph.facebook.com/milanpetrol/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62296914",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Moil","brand:wikidata":"Q62296914",name:"Moil"},countryCodes:["tr"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Morrisons":{name:"Morrisons",icon:"maki-fuel",imageURL:"https://pbs.twimg.com/profile_images/1069883324204769280/cbPhjnwc_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q922344",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Morrisons","brand:wikidata":"Q922344","brand:wikipedia":"en:Morrisons",name:"Morrisons"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Moya":{name:"Moya",icon:"maki-fuel",imageURL:"https://graph.facebook.com/moyastacja/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62297700",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Moya","brand:wikidata":"Q62297700",name:"Moya"},countryCodes:["pl"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Murphy USA":{name:"Murphy USA",icon:"maki-fuel",imageURL:"https://graph.facebook.com/MurphyUSA/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q19604459",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Murphy USA","brand:wikidata":"Q19604459","brand:wikipedia":"en:Murphy USA",name:"Murphy USA"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/NP":{name:"NP",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q7842382",amenity:"fuel"},addTags:{amenity:"fuel",brand:"NP","brand:wikidata":"Q7842382","brand:wikipedia":"en:Trinidad & Tobago National Petroleum Marketing Company Limited",name:"NP"},countryCodes:["tt"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Neste":{name:"Neste",icon:"maki-fuel",imageURL:"https://pbs.twimg.com/profile_images/1015138866095906816/Va1aA79Z_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q616376",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Neste","brand:wikidata":"Q616376","brand:wikipedia":"en:Neste",name:"Neste"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/OIL!":{name:"OIL!",icon:"maki-fuel",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FLogo%20OIL!.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q2007561",amenity:"fuel"},addTags:{amenity:"fuel",brand:"OIL!","brand:wikidata":"Q2007561","brand:wikipedia":"de:OIL! Tankstellen",name:"OIL!"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/OK":{name:"OK",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q12329785",amenity:"fuel"},addTags:{amenity:"fuel",brand:"OK","brand:wikidata":"Q12329785","brand:wikipedia":"da:OK a.m.b.a.",name:"OK"},countryCodes:["dk"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/OKQ8":{name:"OKQ8",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q1634762",amenity:"fuel"},addTags:{amenity:"fuel",brand:"OKQ8","brand:wikidata":"Q1634762","brand:wikipedia":"en:Kuwait Petroleum Corporation",name:"OKQ8"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/OMV":{name:"OMV",icon:"maki-fuel",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FOmv%20logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q168238",amenity:"fuel"},addTags:{amenity:"fuel",brand:"OMV","brand:wikidata":"Q168238","brand:wikipedia":"en:OMV",name:"OMV"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/Oilibya":{name:"Oilibya",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q7081491",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Oilibya","brand:wikidata":"Q7081491","brand:wikipedia":"en:Oilibya",name:"Oilibya","name:ar":"أويليبيا"},terms:["oilibia","oilibiya","oillibia","oilliby","oillibya","oillybia","oilybia","olibya","olybia"],matchScore:2,suggestion:true},"amenity/fuel/Opet":{name:"Opet",icon:"maki-fuel",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FLogo%20of%20Opet.jpg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q7072824",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Opet","brand:wikidata":"Q7072824","brand:wikipedia":"en:Opet",name:"Opet"},countryCodes:["tr"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Orlen":{name:"Orlen",icon:"maki-fuel",imageURL:"https://graph.facebook.com/ORLENOfficial/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q971649",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Orlen","brand:wikidata":"Q971649","brand:wikipedia":"en:PKN Orlen",name:"Orlen"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/Oxxo":{name:"Oxxo",icon:"maki-fuel",imageURL:"https://graph.facebook.com/OXXOTiendas/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1342538",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Oxxo","brand:wikidata":"Q1342538","brand:wikipedia":"es:Oxxo",name:"Oxxo"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/PSO":{name:"PSO",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q2741455",amenity:"fuel"},addTags:{amenity:"fuel",brand:"PSO","brand:wikidata":"Q2741455","brand:wikipedia":"en:Pakistan State Oil",name:"PSO"},terms:["pso petrol pump"],matchScore:2,suggestion:true},"amenity/fuel/PT":{name:"PT",icon:"maki-fuel",imageURL:"https://graph.facebook.com/ptstation/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62298612",amenity:"fuel"},addTags:{amenity:"fuel",brand:"PT","brand:wikidata":"Q62298612",name:"PT"},countryCodes:["th"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/PTT":{name:"PTT",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q1810389",amenity:"fuel"},addTags:{amenity:"fuel",brand:"PTT","brand:wikidata":"Q1810389","brand:wikipedia":"en:PTT Public Company Limited",name:"PTT"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/PV Oil":{name:"PV Oil",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q2089536",amenity:"fuel"},addTags:{amenity:"fuel",brand:"PV Oil","brand:wikidata":"Q2089536","brand:wikipedia":"en:Petrovietnam",name:"PV Oil"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/Pacific Pride":{name:"Pacific Pride",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q7122637",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Pacific Pride","brand:wikidata":"Q7122637","brand:wikipedia":"en:Pacific Pride",name:"Pacific Pride"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Pecsa":{name:"Pecsa",icon:"maki-fuel",imageURL:"https://graph.facebook.com/PecsaPeru/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62299262",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Pecsa","brand:wikidata":"Q62299262",name:"Pecsa"},countryCodes:["pe"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Pemex":{name:"Pemex",icon:"maki-fuel",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FLogo%20Petr%C3%B3leos%20Mexicanos.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q871308",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Pemex","brand:wikidata":"Q871308","brand:wikipedia":"en:Pemex",name:"Pemex"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/Pertamina":{name:"Pertamina",icon:"maki-fuel",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FPertamina%20Logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q1641044",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Pertamina","brand:wikidata":"Q1641044","brand:wikipedia":"en:Pertamina",name:"Pertamina"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/Petro-Canada":{name:"Petro-Canada",icon:"maki-fuel",imageURL:"https://graph.facebook.com/petrocanada/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1208279",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Petro-Canada","brand:wikidata":"Q1208279","brand:wikipedia":"en:Petro-Canada",name:"Petro-Canada"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Petro-T":{name:"Petro-T",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q61743540",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Petro-T","brand:wikidata":"Q61743540",name:"Petro-T"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/PetroPerú":{name:"PetroPerú",icon:"maki-fuel",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FLogo%20Petroperu%20vertical%20negativo.jpg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q2506390",amenity:"fuel"},addTags:{amenity:"fuel",brand:"PetroPerú","brand:wikidata":"Q2506390","brand:wikipedia":"es:Petroperú",name:"PetroPerú"},countryCodes:["pe"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Petrochina":{name:"Petrochina",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q503182",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Petrochina","brand:wikidata":"Q503182","brand:wikipedia":"en:PetroChina",name:"Petrochina"},countryCodes:["cn"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Petroecuador":{name:"Petroecuador",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q1812822",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Petroecuador","brand:wikidata":"Q1812822","brand:wikipedia":"en:Petroecuador",name:"Petroecuador"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/Petrol Ofisi":{name:"Petrol Ofisi",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q1278087",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Petrol Ofisi","brand:wikidata":"Q1278087","brand:wikipedia":"en:Petrol Ofisi",name:"Petrol Ofisi"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/Petrolimex":{name:"Petrolimex",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q10831598",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Petrolimex","brand:wikidata":"Q10831598","brand:wikipedia":"en:Petrolimex",name:"Petrolimex"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/Petrolina":{name:"Petrolina",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q17013948",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Petrolina","brand:wikidata":"Q17013948","brand:wikipedia":"en:Petrolina (company)",name:"Petrolina"},countryCodes:["cy"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Petrom":{name:"Petrom",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q1755034",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Petrom","brand:wikidata":"Q1755034","brand:wikipedia":"en:Petrom",name:"Petrom"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/Petron":{name:"Petron",icon:"maki-fuel",imageURL:"https://graph.facebook.com/PetronCorporation/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7179011",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Petron","brand:wikidata":"Q7179011","brand:wikipedia":"en:Petron Corporation",name:"Petron"},countryCodes:["ph"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Petronas":{name:"Petronas",icon:"maki-fuel",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FPetronas%20Logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q221692",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Petronas","brand:wikidata":"Q221692","brand:wikipedia":"en:Petronas",name:"Petronas"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/Petronor":{name:"Petronor",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q1726547",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Petronor","brand:wikidata":"Q1726547","brand:wikipedia":"es:Petronor",name:"Petronor"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/Phillips 66":{name:"Phillips 66",icon:"maki-fuel",imageURL:"https://graph.facebook.com/Phillips66Co/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1656230",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Phillips 66","brand:wikidata":"Q1656230","brand:wikipedia":"en:Phillips 66",name:"Phillips 66"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/Phoenix":{name:"Phoenix",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q7186949",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Phoenix","brand:wikidata":"Q7186949","brand:wikipedia":"en:Phoenix Petroleum",name:"Phoenix"},countryCodes:["ph"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Pilot":{name:"Pilot",icon:"maki-fuel",imageURL:"https://graph.facebook.com/pilottravelcenters/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1434601",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Pilot","brand:wikidata":"Q1434601","brand:wikipedia":"en:Pilot Flying J",name:"Pilot"},countryCodes:["ca","us"],terms:["flying j","pilot flying j"],matchScore:2,suggestion:true},"amenity/fuel/Pioneer":{name:"Pioneer",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q7196684",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Pioneer","brand:wikidata":"Q7196684","brand:wikipedia":"en:Pioneer Energy",name:"Pioneer"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Preem":{name:"Preem",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q598835",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Preem","brand:wikidata":"Q598835","brand:wikipedia":"en:Preem",name:"Preem"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/Primax (Ecuador)":{name:"Primax (Ecuador)",icon:"maki-fuel",imageURL:"https://graph.facebook.com/PrimaxEcuador/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62332857",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Primax","brand:wikidata":"Q62332857",name:"Primax"},countryCodes:["ec"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Primax (Peru)":{name:"Primax (Peru)",icon:"maki-fuel",imageURL:"https://graph.facebook.com/PrimaxPeru/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62332638",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Primax","brand:wikidata":"Q62332638",name:"Primax"},countryCodes:["pe"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Prio":{name:"Prio",icon:"maki-fuel",imageURL:"https://graph.facebook.com/PrioEnergy/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62530421",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Prio","brand:wikidata":"Q62530421",name:"Prio"},countryCodes:["pt"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Puma":{name:"Puma",icon:"maki-fuel",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FPuma%20Energy%20Logo.jpg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q7259769",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Puma","brand:wikidata":"Q7259769","brand:wikipedia":"en:Puma Energy",name:"Puma"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/Q1":{name:"Q1",icon:"maki-fuel",imageURL:"https://graph.facebook.com/Q1EnergieAG/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62086498",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Q1","brand:wikidata":"Q62086498",name:"Q1",operator:"Q1 Energie AG","operator:wikidata":"Q2121146","operator:wikipedia":"de:Q1 Energie"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Q8":{name:"Q8",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q1634762",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Q8","brand:wikidata":"Q1634762","brand:wikipedia":"en:Kuwait Petroleum Corporation",name:"Q8"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/Q8 Easy":{name:"Q8 Easy",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q1806948",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Q8 Easy","brand:wikidata":"Q1806948","brand:wikipedia":"nl:Q8 Easy",name:"Q8 Easy"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/Qstar":{name:"Qstar",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q10647961",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Qstar","brand:wikidata":"Q10647961","brand:wikipedia":"sv:Qstar",name:"Qstar"},countryCodes:["se"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/QuikTrip":{name:"QuikTrip",icon:"maki-fuel",imageURL:"https://pbs.twimg.com/profile_images/978987077554581504/R7x8NTvv_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q7271953",amenity:"fuel"},addTags:{amenity:"fuel",brand:"QuikTrip","brand:wikidata":"Q7271953","brand:wikipedia":"en:QuikTrip",name:"QuikTrip"},terms:["qt"],matchScore:2,suggestion:true},"amenity/fuel/RaceTrac":{name:"RaceTrac",icon:"maki-fuel",imageURL:"https://graph.facebook.com/RaceTrac/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q735942",amenity:"fuel"},addTags:{amenity:"fuel",brand:"RaceTrac","brand:wikidata":"Q735942","brand:wikipedia":"en:RaceTrac",name:"RaceTrac"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/Repsol":{name:"Repsol",icon:"maki-fuel",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FLogo%20de%20Repsol.jpg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q174747",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Repsol","brand:wikidata":"Q174747","brand:wikipedia":"es:Repsol",name:"Repsol"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/Revoil":{name:"Revoil",icon:"maki-fuel",imageURL:"https://graph.facebook.com/revoil/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62530755",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Revoil","brand:wikidata":"Q62530755",name:"Revoil"},countryCodes:["gr"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Rompetrol":{name:"Rompetrol",icon:"maki-fuel",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FLogo-Rompetrol%20KMG%20colored%20approved.jpg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q1788862",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Rompetrol","brand:wikidata":"Q1788862","brand:wikipedia":"en:Rompetrol",name:"Rompetrol"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/Royal Farms":{name:"Royal Farms",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q7374169",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Royal Farms","brand:wikidata":"Q7374169","brand:wikipedia":"en:Royal Farms",name:"Royal Farms"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Rubis":{name:"Rubis",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q3446514",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Rubis","brand:wikidata":"Q3446514","brand:wikipedia":"en:Rubis (company)",name:"Rubis"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/Safeway":{name:"Safeway",icon:"maki-fuel",imageURL:"https://pbs.twimg.com/profile_images/813782141259497472/inQrmCRf_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q1508234",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Safeway","brand:wikidata":"Q1508234","brand:wikipedia":"en:Safeway Inc.",name:"Safeway"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/Sainsbury's":{name:"Sainsbury's",icon:"maki-fuel",imageURL:"https://pbs.twimg.com/profile_images/1101419025421225984/xsPc8EfW_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q152096",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Sainsbury's","brand:wikidata":"Q152096","brand:wikipedia":"en:Sainsbury's",name:"Sainsbury's"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Sam's Club":{name:"Sam's Club",icon:"maki-fuel",imageURL:"https://graph.facebook.com/samsclub/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1972120",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Sam's Club","brand:wikidata":"Q1972120","brand:wikipedia":"en:Sam's Club",name:"Sam's Club",operator:"Walmart","operator:wikidata":"Q483551","operator:wikipedia":"en:Walmart"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/Sasol":{name:"Sasol",icon:"maki-fuel",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FSasol.jpg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q905998",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Sasol","brand:wikidata":"Q905998","brand:wikipedia":"en:Sasol",name:"Sasol"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/Sea Oil":{name:"Sea Oil",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q7389549",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Sea Oil","brand:wikidata":"Q7389549","brand:wikipedia":"en:Seaoil Philippines",name:"Sea Oil"},countryCodes:["ph"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Sheetz":{name:"Sheetz",icon:"maki-fuel",imageURL:"https://graph.facebook.com/sheetz/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7492551",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Sheetz","brand:wikidata":"Q7492551","brand:wikipedia":"en:Sheetz",name:"Sheetz"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/Shell":{name:"Shell",icon:"maki-fuel",imageURL:"https://graph.facebook.com/Shell/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q154950",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Shell","brand:wikidata":"Q154950","brand:wikipedia":"en:Royal Dutch Shell",name:"Shell"},terms:["posto shell","shell gas station","shell petrol station","shell station","station shell"],matchScore:2,suggestion:true},"amenity/fuel/Shell Express":{name:"Shell Express",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q2289188",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Shell Express","brand:wikidata":"Q2289188","brand:wikipedia":"nl:Shell Express",name:"Shell Express"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/Sinclair":{name:"Sinclair",icon:"maki-fuel",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FSinclair%20gas%20station%20sign.JPG&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q1290900",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Sinclair","brand:wikidata":"Q1290900","brand:wikipedia":"en:Sinclair Oil Corporation",name:"Sinclair"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Sinopec":{name:"Sinopec",icon:"maki-fuel",imageURL:"https://graph.facebook.com/Sinopec/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q831445",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Sinopec","brand:wikidata":"Q831445","brand:wikipedia":"en:Sinopec","brand:zh":"中国石化",name:"Sinopec","name:zh":"中国石化"},countryCodes:["cn"],terms:["sinopec fuel"],matchScore:2,suggestion:true},"amenity/fuel/Slovnaft":{name:"Slovnaft",icon:"maki-fuel",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2F%D0%A1%D0%BB%D0%BE%D0%B2%D0%BD%D0%B0%D1%84%D1%82.jpg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q1587563",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Slovnaft","brand:wikidata":"Q1587563","brand:wikipedia":"en:Slovnaft",name:"Slovnaft"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/Socar":{name:"Socar",icon:"maki-fuel",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FState%20Oil%20Company%20of%20Azerbaijan%20Republic%20logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q1622293",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Socar","brand:wikidata":"Q1622293","brand:wikipedia":"en:SOCAR",name:"Socar"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/Sokimex":{name:"Sokimex",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q1149575",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Sokimex","brand:wikidata":"Q1149575","brand:wikipedia":"en:Sokimex",name:"Sokimex"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/Speedway":{name:"Speedway",icon:"maki-fuel",imageURL:"https://graph.facebook.com/SpeedwayStores/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7575683",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Speedway","brand:wikidata":"Q7575683","brand:wikipedia":"en:Speedway LLC",name:"Speedway"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/Sprint":{name:"Sprint",icon:"maki-fuel",imageURL:"https://graph.facebook.com/SprintTankstelle/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q57588452",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Sprint","brand:wikidata":"Q57588452",name:"Sprint"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/St1":{name:"St1",icon:"maki-fuel",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FSt1%20Logo.png&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q7592214",amenity:"fuel"},addTags:{amenity:"fuel",brand:"St1","brand:wikidata":"Q7592214","brand:wikipedia":"en:St1",name:"St1"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/Star":{name:"Star",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q2031095",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Star","brand:wikidata":"Q2031095","brand:wikipedia":"de:Orlen Deutschland",name:"Star"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Station Service E. Leclerc":{name:"Station Service E. Leclerc",icon:"maki-fuel",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FE.Leclerc%20logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q1273376",amenity:"fuel"},addTags:{amenity:"fuel",brand:"E.Leclerc","brand:wikidata":"Q1273376","brand:wikipedia":"fr:E.Leclerc",name:"Station Service E. Leclerc"},terms:["e. leclerc"],matchScore:2,suggestion:true},"amenity/fuel/Statoil":{name:"Statoil",icon:"maki-fuel",imageURL:"https://graph.facebook.com/Equinor/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1776022",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Statoil","brand:wikidata":"Q1776022","brand:wikipedia":"en:Equinor",name:"Statoil"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/Stewart's":{name:"Stewart's",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q7615690",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Stewart's","brand:wikidata":"Q7615690","brand:wikipedia":"en:Stewart's Shops",name:"Stewart's"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Sunoco":{name:"Sunoco",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q1423218",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Sunoco","brand:wikidata":"Q1423218","brand:wikipedia":"en:Sunoco",name:"Sunoco"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/Super U":{name:"Super U",icon:"maki-fuel",imageURL:"https://graph.facebook.com/ULesCommercants/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2529029",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Super U","brand:wikidata":"Q2529029","brand:wikipedia":"en:Système U",name:"Super U"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/TA":{name:"TA",icon:"maki-fuel",imageURL:"https://graph.facebook.com/TravelCentersOfAmerica/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7835892",amenity:"fuel"},addTags:{amenity:"fuel",brand:"TA","brand:wikidata":"Q7835892","brand:wikipedia":"en:TravelCenters of America",name:"TA"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Tamoil":{name:"Tamoil",icon:"maki-fuel",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FTamoil.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q706793",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Tamoil","brand:wikidata":"Q706793","brand:wikipedia":"en:Tamoil",name:"Tamoil"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/Tango":{name:"Tango",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q2423920",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Tango","brand:wikidata":"Q2423920","brand:wikipedia":"nl:Tango CV",name:"Tango"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/Tanka":{name:"Tanka",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q10690640",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Tanka","brand:wikidata":"Q10690640","brand:wikipedia":"sv:Tanka (bensinstationskedja)",name:"Tanka"},countryCodes:["se"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Teboil":{name:"Teboil",icon:"maki-fuel",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FTeboil%20logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q7692079",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Teboil","brand:wikidata":"Q7692079","brand:wikipedia":"en:Teboil",name:"Teboil"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/Tela":{name:"Tela",icon:"maki-fuel",imageURL:"https://graph.facebook.com/TelaCompany/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62534875",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Tela","brand:wikidata":"Q62534875",name:"Tela"},countryCodes:["kh"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Tempo":{name:"Tempo",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q62535175",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Tempo","brand:wikidata":"Q62535175",name:"Tempo"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Terpel":{name:"Terpel",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q7703003",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Terpel","brand:wikidata":"Q7703003","brand:wikipedia":"en:Terpel",name:"Terpel"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/Tesco":{name:"Tesco",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q17145596",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Tesco","brand:wikidata":"Q17145596","brand:wikipedia":"en:Tesco Corporation",name:"Tesco"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/Texaco":{name:"Texaco",icon:"maki-fuel",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FTexaco%20textlogo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q775060",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Texaco","brand:wikidata":"Q775060","brand:wikipedia":"en:Texaco",name:"Texaco"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/Tinq":{name:"Tinq",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q2132028",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Tinq","brand:wikidata":"Q2132028","brand:wikipedia":"nl:Tinq",name:"Tinq"},countryCodes:["nl"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Topaz":{name:"Topaz",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q7824764",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Topaz","brand:wikidata":"Q7824764","brand:wikipedia":"en:Topaz Energy",name:"Topaz"},countryCodes:["ie"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Total":{name:"Total",icon:"maki-fuel",imageURL:"https://pbs.twimg.com/profile_images/876776431543615489/1QCXAxs1_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q154037",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Total","brand:wikidata":"Q154037","brand:wikipedia":"fr:Total (entreprise)",name:"Total"},terms:["station total"],matchScore:2,suggestion:true},"amenity/fuel/Total Access":{name:"Total Access",icon:"maki-fuel",imageURL:"https://pbs.twimg.com/profile_images/876776431543615489/1QCXAxs1_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q154037",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Total Access","brand:wikidata":"Q154037","brand:wikipedia":"fr:Total (entreprise)",name:"Total Access"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/TotalErg":{name:"TotalErg",icon:"maki-fuel",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FTotalerg%20logo.png&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q3995933",amenity:"fuel"},addTags:{amenity:"fuel",brand:"TotalErg","brand:wikidata":"Q3995933","brand:wikipedia":"it:TotalErg",name:"TotalErg"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/Turkey Hill":{name:"Turkey Hill",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q42376970",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Turkey Hill","brand:wikidata":"Q42376970","brand:wikipedia":"en:Turkey Hill Minit Markets",name:"Turkey Hill"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Turmöl":{name:"Turmöl",icon:"maki-fuel",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FLogo%20turmoel%20hoch.png&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q1473279",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Turmöl","brand:wikidata":"Q1473279","brand:wikipedia":"de:Turmöl",name:"Turmöl"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/UDF Fuel":{name:"UDF Fuel",icon:"maki-fuel",imageURL:"https://graph.facebook.com/UnitedDairyFarmers/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7887677",amenity:"fuel"},addTags:{amenity:"fuel",brand:"United Dairy Farmers","brand:wikidata":"Q7887677","brand:wikipedia":"en:United Dairy Farmers",name:"UDF Fuel",short_name:"UDF"},countryCodes:["us"],terms:["udf","udf fuels","united dairy farmers"],matchScore:2,suggestion:true},"amenity/fuel/Ultramar":{name:"Ultramar",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q3548078",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Ultramar","brand:wikidata":"Q3548078","brand:wikipedia":"en:Ultramar",name:"Ultramar"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/United":{name:"United",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q28224393",amenity:"fuel"},addTags:{amenity:"fuel",brand:"United","brand:wikidata":"Q28224393","brand:wikipedia":"en:United Petroleum",name:"United"},terms:["united petroleum"],matchScore:2,suggestion:true},"amenity/fuel/Uno":{name:"Uno",icon:"maki-fuel",imageURL:"https://graph.facebook.com/UnoGasolineras/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62535574",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Uno","brand:wikidata":"Q62535574",name:"Uno"},countryCodes:["bz","cr","gt","hn","ni","sv"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Uno-X":{name:"Uno-X",icon:"maki-fuel",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FUno-X%20logo.png&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q3362746",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Uno-X","brand:wikidata":"Q3362746","brand:wikipedia":"en:Uno-X",name:"Uno-X"},countryCodes:["dk"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Valero":{name:"Valero",icon:"maki-fuel",imageURL:"https://graph.facebook.com/valeroenergy/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1283291",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Valero","brand:wikidata":"Q1283291","brand:wikipedia":"en:Valero Energy",name:"Valero"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/Viada":{name:"Viada",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q12663942",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Viada","brand:wikidata":"Q12663942","brand:wikipedia":"en:Lukoil Baltija",name:"Viada"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/Vito":{name:"Vito",icon:"maki-fuel",imageURL:"https://graph.facebook.com/VITOCORSICA/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62536473",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Vito","brand:wikidata":"Q62536473",name:"Vito"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/WOG":{name:"WOG",icon:"maki-fuel",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FWOG%20Logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q12072939",amenity:"fuel"},addTags:{amenity:"fuel",brand:"WOG","brand:wikidata":"Q12072939","brand:wikipedia":"en:WOG (gas stations)",name:"WOG"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/Walmart":{name:"Walmart",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q62606411",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Walmart","brand:wikidata":"Q62606411","brand:wikipedia":"en:Walmart",name:"Walmart"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/Wawa":{name:"Wawa",icon:"maki-fuel",imageURL:"https://graph.facebook.com/wawa/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5936320",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Wawa","brand:wikidata":"Q5936320","brand:wikipedia":"en:Wawa (company)",name:"Wawa"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/Westfalen":{name:"Westfalen",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q1411209",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Westfalen","brand:wikidata":"Q1411209","brand:wikipedia":"en:Westfalen AG",name:"Westfalen"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Woolworths Petrol":{name:"Woolworths Petrol",icon:"maki-fuel",imageURL:"https://graph.facebook.com/woolworths/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5023980",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Caltex","brand:wikidata":"Q5023980","brand:wikipedia":"en:Caltex Woolworths",name:"Woolworths Petrol"},countryCodes:["au"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/XTR":{name:"XTR",icon:"maki-fuel",imageURL:"https://graph.facebook.com/XTRenergy/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62537250",amenity:"fuel"},addTags:{amenity:"fuel",brand:"XTR","brand:wikidata":"Q62537250",name:"XTR"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/YPF":{name:"YPF",icon:"maki-fuel",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FYpf%20logo13.png&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q2006989",amenity:"fuel"},addTags:{amenity:"fuel",brand:"YPF","brand:wikidata":"Q2006989","brand:wikipedia":"en:YPF",name:"YPF"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/Z":{name:"Z",icon:"maki-fuel",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FZEnergylogo.png&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q8063337",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Z","brand:wikidata":"Q8063337","brand:wikipedia":"en:Z Energy",name:"Z"},countryCodes:["nz"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/bft":{name:"bft",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q1009104",amenity:"fuel"},addTags:{amenity:"fuel",brand:"bft","brand:wikidata":"Q1009104","brand:wikipedia":"de:Bundesverband freier Tankstellen",name:"bft"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/din-X":{name:"din-X",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q10472858",amenity:"fuel"},addTags:{amenity:"fuel",brand:"din-X","brand:wikidata":"Q10472858","brand:wikipedia":"sv:Din-X",name:"din-X"},countryCodes:["se"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Авіас":{name:"Авіас",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q12122687",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Авіас","brand:wikidata":"Q12122687","brand:wikipedia":"uk:Мережа АЗС Приват",name:"Авіас"},countryCodes:["ua"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/БРСМ-Нафта":{name:"БРСМ-Нафта",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q56356523",amenity:"fuel"},addTags:{amenity:"fuel",brand:"БРСМ-Нафта","brand:wikidata":"Q56356523","brand:wikipedia":"uk:БРСМ-Нафта",name:"БРСМ-Нафта"},countryCodes:["ua"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Башнефть":{name:"Башнефть",icon:"maki-fuel",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FBashneft%20logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q809985",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Башнефть","brand:en":"Bashneft","brand:wikidata":"Q809985","brand:wikipedia":"en:Bashneft",name:"Башнефть","name:en":"Bashneft"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Белоруснефть":{name:"Белоруснефть",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q4082693",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Белоруснефть","brand:wikidata":"Q4082693","brand:wikipedia":"ru:Белоруснефть",name:"Белоруснефть"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/Газпромнефть":{name:"Газпромнефть",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q1461799",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Газпромнефть","brand:wikidata":"Q1461799","brand:wikipedia":"en:Gazprom Neft",name:"Газпромнефть"},terms:["газпром"],matchScore:2,suggestion:true},"amenity/fuel/Гелиос":{name:"Гелиос",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q62286471",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Гелиос","brand:en":"Helios","brand:wikidata":"Q62286471",name:"Гелиос","name:en":"Helios"},countryCodes:["kz"],terms:["helios"],matchScore:2,suggestion:true},"amenity/fuel/ЕКА":{name:"ЕКА",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q62543029",amenity:"fuel"},addTags:{amenity:"fuel",brand:"ЕКА","brand:wikidata":"Q62543029",name:"ЕКА"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/КЛО":{name:"КЛО",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q60966526",amenity:"fuel"},addTags:{amenity:"fuel",brand:"КЛО","brand:en":"Klo","brand:wikidata":"Q60966526","brand:wikipedia":"ru:КЛО (сеть АЗС)",name:"КЛО","name:en":"Klo"},countryCodes:["ua"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/КазМунайГаз":{name:"КазМунайГаз",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q1417227",amenity:"fuel"},addTags:{amenity:"fuel",brand:"КазМунайГаз","brand:wikidata":"Q1417227","brand:wikipedia":"en:KazMunayGas",name:"КазМунайГаз"},countryCodes:["kz"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Лукойл":{name:"Лукойл",icon:"maki-fuel",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FLUK%20OIL%20Logo%20kyr.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q329347",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Лукойл","brand:wikidata":"Q329347","brand:wikipedia":"ru:Лукойл",name:"Лукойл"},terms:["лукоил"],matchScore:2,suggestion:true},"amenity/fuel/Макпетрол":{name:"Макпетрол",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q1886438",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Макпетрол","brand:wikidata":"Q1886438","brand:wikipedia":"en:Makpetrol",name:"Макпетрол"},countryCodes:["mk"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/НК Альянс":{name:"НК Альянс",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q4063700",amenity:"fuel"},addTags:{amenity:"fuel",brand:"НК Альянс","brand:wikidata":"Q4063700","brand:wikipedia":"ru:Альянс (компания)",name:"НК Альянс"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Нефтьмагистраль":{name:"Нефтьмагистраль",icon:"maki-fuel",imageURL:"https://graph.facebook.com/neftm.ru/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62544323",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Нефтьмагистраль","brand:en":"Neftmagistral","brand:wikidata":"Q62544323",name:"Нефтьмагистраль","name:en":"Neftmagistral"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/ОККО":{name:"ОККО",icon:"maki-fuel",imageURL:"https://graph.facebook.com/okkoua/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7072617",amenity:"fuel"},addTags:{amenity:"fuel",brand:"ОККО","brand:en":"OKKO","brand:wikidata":"Q7072617","brand:wikipedia":"en:OKKO",name:"ОККО","name:en":"OKKO"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/ОМВ":{name:"ОМВ",icon:"maki-fuel",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FOmv%20logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q168238",amenity:"fuel"},addTags:{amenity:"fuel",brand:"ОМВ","brand:wikidata":"Q168238","brand:wikipedia":"en:OMV",name:"ОМВ"},countryCodes:["bg","rs"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/ПТК":{name:"ПТК",icon:"maki-fuel",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2F%D0%9B%D0%BE%D0%B3%D0%BE%D1%82%D0%B8%D0%BF%20%D0%9F%D0%B5%D1%82%D0%B5%D1%80%D0%B1%D1%83%D1%80%D0%B3%D1%81%D0%BA%D0%BE%D0%B9%20%D1%82%D0%BE%D0%BF%D0%BB%D0%B8%D0%B2%D0%BD%D0%BE%D0%B9%20%D0%BA%D0%BE%D0%BC%D0%BF%D0%B0%D0%BD%D0%B8%D0%B8.jpg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q4360193",amenity:"fuel"},addTags:{amenity:"fuel",brand:"ПТК","brand:en":"The Petersburg Fuel Company","brand:wikidata":"Q4360193","brand:wikipedia":"en:Petersburg Fuel Company",name:"ПТК","name:en":"The Petersburg Fuel Company"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/Петрол":{name:"Петрол",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q24315",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Петрол","brand:en":"Petrol AD","brand:wikidata":"Q24315","brand:wikipedia":"en:Petrol AD",name:"Петрол","name:en":"Petrol AD"},countryCodes:["bg"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Роснефть":{name:"Роснефть",icon:"maki-fuel",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FRosneft%20logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q1141123",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Роснефть","brand:en":"Rosneft","brand:wikidata":"Q1141123","brand:wikipedia":"en:Rosneft",name:"Роснефть","name:en":"Rosneft"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/Сургутнефтегаз":{name:"Сургутнефтегаз",icon:"maki-fuel",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FSng2.gif&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q680776",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Сургутнефтегаз","brand:en":"Surgutneftegas","brand:wikidata":"Q680776","brand:wikipedia":"en:Surgutneftegas",name:"Сургутнефтегаз","name:en":"Surgutneftegas"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/ТНК":{name:"ТНК",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q2298901",amenity:"fuel"},addTags:{amenity:"fuel",brand:"ТНК","brand:wikidata":"Q2298901","brand:wikipedia":"en:TNK-BP",name:"ТНК"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/Татнефть":{name:"Татнефть",icon:"maki-fuel",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FTatneft%20Logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q1616858",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Татнефть","brand:en":"Tatneft","brand:wikidata":"Q1616858","brand:wikipedia":"en:Tatneft",name:"Татнефть","name:en":"Tatneft"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/Укрнафта":{name:"Укрнафта",icon:"maki-fuel",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FUkrnafta.png&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q2447961",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Укрнафта","brand:en":"Ukrnafta","brand:wikidata":"Q2447961","brand:wikipedia":"en:Ukrnafta",name:"Укрнафта","name:en":"Ukrnafta"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/דור אלון":{name:"דור אלון",icon:"maki-fuel",imageURL:"https://graph.facebook.com/dor.alon.il/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q16130352",amenity:"fuel"},addTags:{amenity:"fuel",brand:"דור אלון","brand:en":"Dor Alon","brand:he":"דור אלון","brand:wikidata":"Q16130352","brand:wikipedia":"he:דור אלון אנרגיה בישראל (1988)",name:"דור אלון","name:en":"Dor Alon","name:he":"דור אלון"},countryCodes:["il"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/סונול":{name:"סונול",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q3701622",amenity:"fuel"},addTags:{amenity:"fuel",brand:"סונול","brand:en":"Sonol","brand:he":"סונול","brand:wikidata":"Q3701622","brand:wikipedia":"en:Sonol",name:"סונול","name:en":"Sonol","name:he":"סונול"},countryCodes:["il"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/פז":{name:"פז",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q2211731",amenity:"fuel"},addTags:{amenity:"fuel",brand:"פז","brand:en":"Paz","brand:he":"פז","brand:wikidata":"Q2211731","brand:wikipedia":"en:Paz Oil Company",name:"פז","name:en":"Paz","name:he":"פז"},countryCodes:["il"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/ادنوك":{name:"ادنوك",icon:"maki-fuel",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FAbu%20Dhabi%20National%20Oil%20Company%20logo.png&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q166729",amenity:"fuel"},addTags:{amenity:"fuel",brand:"ادنوك","brand:ar":"ادنوك","brand:en":"ADNOC","brand:wikidata":"Q166729","brand:wikipedia":"en:Abu Dhabi National Oil Company",name:"ادنوك","name:ar":"ادنوك","name:en":"ADNOC"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/บางจาก":{name:"บางจาก",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q6579719",amenity:"fuel"},addTags:{amenity:"fuel",brand:"บางจาก","brand:en":"Bangchak","brand:th":"บางจาก","brand:wikidata":"Q6579719","brand:wikipedia":"th:บางจาก คอร์ปอเรชัน",name:"บางจาก","name:en":"Bangchak","name:th":"บางจาก"},countryCodes:["th"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/ป.ต.ท.":{name:"ป.ต.ท.",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q1810389",amenity:"fuel"},addTags:{amenity:"fuel",brand:"ป.ต.ท.","brand:en":"PTT","brand:th":"ป.ต.ท.","brand:wikidata":"Q1810389","brand:wikipedia":"th:ปตท.",name:"ป.ต.ท.","name:en":"PTT","name:th":"ป.ต.ท."},countryCodes:["th"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/เชลล์":{name:"เชลล์",icon:"maki-fuel",imageURL:"https://graph.facebook.com/Shell/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q154950",amenity:"fuel"},addTags:{amenity:"fuel",brand:"เชลล์","brand:en":"Shell","brand:th":"เชลล์","brand:wikidata":"Q154950","brand:wikipedia":"en:Royal Dutch Shell",name:"เชลล์","name:en":"Shell","name:th":"เชลล์"},countryCodes:["th"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/เอสโซ่":{name:"เอสโซ่",icon:"maki-fuel",imageURL:"https://pbs.twimg.com/profile_images/595503093447598080/4ooH4R98_bigger.png",geometry:["point","area"],tags:{"brand:wikidata":"Q867662",amenity:"fuel"},addTags:{amenity:"fuel",brand:"เอสโซ่","brand:en":"Esso","brand:th":"เอสโซ่","brand:wikidata":"Q867662","brand:wikipedia":"en:Esso",name:"เอสโซ่","name:en":"Esso","name:th":"เอสโซ่"},countryCodes:["th"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/エッソ":{name:"エッソ",icon:"maki-fuel",imageURL:"https://pbs.twimg.com/profile_images/595503093447598080/4ooH4R98_bigger.png",geometry:["point","area"],tags:{"brand:wikidata":"Q867662",amenity:"fuel"},addTags:{amenity:"fuel",brand:"エッソ","brand:en":"Esso","brand:ja":"エッソ","brand:wikidata":"Q867662","brand:wikipedia":"en:Esso",name:"エッソ","name:en":"Esso","name:ja":"エッソ"},countryCodes:["jp"],terms:["エッソ石油"],matchScore:2,suggestion:true},"amenity/fuel/エネオス":{name:"エネオス",icon:"maki-fuel",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FJXTG%20Nippon%20Oil%20%26%20Energy%20logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q1640290",amenity:"fuel"},addTags:{amenity:"fuel",brand:"エネオス","brand:en":"JXTG Nippon Oil & Energy","brand:ja":"エネオス","brand:wikidata":"Q1640290","brand:wikipedia":"en:JXTG Nippon Oil & Energy",name:"エネオス","name:en":"JXTG Nippon Oil & Energy","name:ja":"エネオス"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/コスモ石油":{name:"コスモ石油",icon:"maki-fuel",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FCosmo%20Oil%20company%20logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q2498318",amenity:"fuel"},addTags:{amenity:"fuel",brand:"コスモ石油","brand:en":"Cosmo Oil Company","brand:ja":"コスモ石油","brand:wikidata":"Q2498318","brand:wikipedia":"en:Cosmo Oil Company",name:"コスモ石油","name:en":"Cosmo Oil Company","name:ja":"コスモ石油"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/ゼネラル":{name:"ゼネラル",icon:"maki-fuel",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FTonenGeneral.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q11528048",amenity:"fuel"},addTags:{amenity:"fuel",brand:"ゼネラル","brand:en":"Tonen General","brand:ja":"ゼネラル","brand:wikidata":"Q11528048","brand:wikipedia":"ja:東燃ゼネラル石油",name:"ゼネラル","name:en":"Tonen General","name:ja":"ゼネラル"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/中国石化":{name:"中国石化",icon:"maki-fuel",imageURL:"https://graph.facebook.com/Sinopec/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q831445",amenity:"fuel"},addTags:{amenity:"fuel",brand:"中国石化","brand:en":"Sinopec","brand:wikidata":"Q831445","brand:wikipedia":"en:Sinopec",name:"中国石化","name:en":"Sinopec"},countryCodes:["cn"],terms:["中国石化 Sinopec"],matchScore:2,suggestion:true},"amenity/fuel/中国石油":{name:"中国石油",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q503182",amenity:"fuel"},addTags:{amenity:"fuel",brand:"中国石油","brand:en":"PetroChina","brand:wikidata":"Q503182","brand:wikipedia":"en:PetroChina",name:"中国石油","name:en":"PetroChina"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/出光":{name:"出光",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q2216770",amenity:"fuel"},addTags:{amenity:"fuel",brand:"出光","brand:en":"Idemitsu Kosan","brand:wikidata":"Q2216770","brand:wikipedia":"en:Idemitsu Kosan",name:"出光","name:en":"Idemitsu Kosan"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/台灣中油":{name:"台灣中油",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q21527177",amenity:"fuel"},addTags:{amenity:"fuel",brand:"台灣中油","brand:en":"CPC Corporation, Taiwan","brand:wikidata":"Q21527177","brand:wikipedia":"en:CPC Corporation, Taiwan",name:"台灣中油","name:en":"CPC Corporation, Taiwan"},countryCodes:["tw"],terms:["中油"],matchScore:2,suggestion:true},"amenity/fuel/昭和シェル":{name:"昭和シェル",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q277115",amenity:"fuel"},addTags:{amenity:"fuel",brand:"昭和シェル","brand:en":"Showa Shell Sekiyu","brand:ja":"昭和シェル","brand:wikidata":"Q277115","brand:wikipedia":"en:Showa Shell Sekiyu",name:"昭和シェル","name:en":"Showa Shell Sekiyu","name:ja":"昭和シェル"},countryCodes:["jp"],terms:["昭和シェル石油"],matchScore:2,suggestion:true},"amenity/ice_cream/Baskin-Robbins":{name:"Baskin-Robbins",icon:"fas-ice-cream",imageURL:"https://graph.facebook.com/baskinrobbinsUS/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q584601",amenity:"ice_cream"},addTags:{amenity:"ice_cream",brand:"Baskin-Robbins","brand:wikidata":"Q584601","brand:wikipedia":"en:Baskin-Robbins",cuisine:"ice_cream",name:"Baskin-Robbins"},terms:[],matchScore:2,suggestion:true},"amenity/ice_cream/Ben & Jerry's":{name:"Ben & Jerry's",icon:"fas-ice-cream",imageURL:"https://graph.facebook.com/BenandJerryAustralia/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q816412",amenity:"ice_cream"},addTags:{amenity:"ice_cream",brand:"Ben & Jerry's","brand:wikidata":"Q816412","brand:wikipedia":"en:Ben & Jerry's",cuisine:"ice_cream",name:"Ben & Jerry's"},terms:["ben and jerrys"],matchScore:2,suggestion:true},"amenity/ice_cream/Cold Stone Creamery":{name:"Cold Stone Creamery",icon:"fas-ice-cream",imageURL:"https://graph.facebook.com/coldstonecreamery/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1094923",amenity:"ice_cream"},addTags:{amenity:"ice_cream",brand:"Cold Stone Creamery","brand:wikidata":"Q1094923","brand:wikipedia":"en:Cold Stone Creamery",cuisine:"ice_cream",name:"Cold Stone Creamery"},terms:["cold stone"],matchScore:2,suggestion:true},"amenity/ice_cream/D'Onofrio":{name:"D'Onofrio",icon:"fas-ice-cream",imageURL:"https://graph.facebook.com/DonofrioDOficial/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5203166",amenity:"ice_cream"},addTags:{amenity:"ice_cream",brand:"D'Onofrio","brand:wikidata":"Q5203166","brand:wikipedia":"es:D'Onofrio",cuisine:"ice_cream",name:"D'Onofrio"},countryCodes:["pe"],terms:[],matchScore:2,suggestion:true},"amenity/ice_cream/Freddo":{name:"Freddo",icon:"fas-ice-cream",imageURL:"https://graph.facebook.com/FreddoUSA/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q28823999",amenity:"ice_cream"},addTags:{amenity:"ice_cream",brand:"Freddo","brand:wikidata":"Q28823999","brand:wikipedia":"es:Freddo",cuisine:"ice_cream",name:"Freddo"},terms:[],matchScore:2,suggestion:true},"amenity/ice_cream/Graeter's":{name:"Graeter's",icon:"fas-ice-cream",imageURL:"https://graph.facebook.com/Graeters/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5592430",amenity:"ice_cream"},addTags:{amenity:"ice_cream",brand:"Graeter's","brand:wikidata":"Q5592430","brand:wikipedia":"en:Graeter's",cuisine:"ice_cream",name:"Graeter's",takeaway:"yes"},countryCodes:["us"],terms:["greaters"],matchScore:2,suggestion:true},"amenity/ice_cream/Grido":{name:"Grido",icon:"fas-ice-cream",imageURL:"https://graph.facebook.com/GridoHelados/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5885724",amenity:"ice_cream"},addTags:{amenity:"ice_cream",brand:"Grido","brand:wikidata":"Q5885724","brand:wikipedia":"es:Grido Helado",cuisine:"ice_cream",name:"Grido"},countryCodes:["ar"],terms:["grido helado"],matchScore:2,suggestion:true},"amenity/ice_cream/Ralph's Italian Ices":{name:"Ralph's Italian Ices",icon:"fas-ice-cream",imageURL:"https://graph.facebook.com/RalphsFamous/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62576909",amenity:"ice_cream"},addTags:{amenity:"ice_cream",brand:"Ralph's Italian Ices","brand:wikidata":"Q62576909",cuisine:"ice_cream",name:"Ralph's Italian Ices",official_name:"Ralph's Famous Italian Ices"},countryCodes:["us"],terms:["ralphs famous italian ices","ralphs famous italian ices & ice cream","ralphs famous italian ices and ice cream","ralphs italian ice","ralphs italian ices & ice cream","ralphs italian ices and ice cream"],matchScore:2,suggestion:true},"amenity/ice_cream/Rita's Italian Ice":{name:"Rita's Italian Ice",icon:"fas-ice-cream",imageURL:"https://graph.facebook.com/RitasItalianIceCompany/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7336456",amenity:"ice_cream"},addTags:{amenity:"ice_cream",brand:"Rita's Italian Ice","brand:wikidata":"Q7336456","brand:wikipedia":"en:Rita's Italian Ice",cuisine:"ice_cream",name:"Rita's Italian Ice"},countryCodes:["us"],terms:["rita's water ice"],matchScore:2,suggestion:true},"amenity/ice_cream/sweetFrog":{name:"sweetFrog",icon:"fas-ice-cream",imageURL:"https://graph.facebook.com/sweetfrogfroyo/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q16952110",amenity:"ice_cream"},addTags:{amenity:"ice_cream",brand:"sweetFrog","brand:wikidata":"Q16952110","brand:wikipedia":"en:Sweet Frog",cuisine:"frozen_yogurt",name:"sweetFrog"},countryCodes:["us"],terms:["sweetfrog frozen yogurt","sweetfrog premium frozen yogurt"],matchScore:2,suggestion:true},"amenity/ice_cream/サーティワンアイスクリーム":{name:"サーティワンアイスクリーム",icon:"fas-ice-cream",imageURL:"https://graph.facebook.com/baskinrobbinsUS/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q584601",amenity:"ice_cream"},addTags:{amenity:"ice_cream",brand:"バスキン・ロビンス","brand:en":"Baskin-Robbins","brand:ja":"バスキン・ロビンス","brand:wikidata":"Q584601","brand:wikipedia":"ja:バスキン・ロビンス",cuisine:"ice_cream",name:"サーティワンアイスクリーム","name:en":"Baskin-Robbins","name:ja":"サーティワンアイスクリーム"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/kindergarten/KinderCare":{name:"KinderCare",icon:"maki-school",imageURL:"https://graph.facebook.com/kindercare/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6410551",amenity:"kindergarten"},addTags:{after_school:"yes",alt_name:"KinderCare Learning Center",amenity:"kindergarten",brand:"KinderCare","brand:wikidata":"Q6410551","brand:wikipedia":"en:KinderCare Learning Centers",fee:"yes","isced:level":"0",max_age:"12",min_age:"6 weeks",name:"KinderCare",nursery:"yes",preschool:"yes"},countryCodes:["us"],terms:["kindercare learning center"],matchScore:2,suggestion:true},"amenity/money_transfer/Express Union":{name:"Express Union",icon:"maki-bank",imageURL:"https://graph.facebook.com/ExpressUnionFinance/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3062276",amenity:"money_transfer"},addTags:{amenity:"money_transfer",brand:"Express Union","brand:wikidata":"Q3062276","brand:wikipedia":"fr:Express Union",name:"Express Union"},countryCodes:["td"],terms:[],matchScore:2,suggestion:true},"amenity/money_transfer/Orange Money":{name:"Orange Money",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q16668220",amenity:"money_transfer"},addTags:{amenity:"money_transfer",brand:"Orange Money","brand:wikidata":"Q16668220","brand:wikipedia":"en:Orange Money",name:"Orange Money"},terms:[],matchScore:2,suggestion:true},"amenity/money_transfer/Western Union":{name:"Western Union",icon:"maki-bank",imageURL:"https://graph.facebook.com/WesternUnion/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q861042",amenity:"money_transfer"},addTags:{amenity:"money_transfer",brand:"Western Union","brand:wikidata":"Q861042","brand:wikipedia":"en:Western Union",name:"Western Union"},terms:[],matchScore:2,suggestion:true},"amenity/payment_centre/Abitab":{name:"Abitab",icon:"maki-bank",imageURL:"https://graph.facebook.com/Abitaboficial/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q16488129",amenity:"payment_centre"},addTags:{amenity:"payment_centre",brand:"Abitab","brand:wikidata":"Q16488129","brand:wikipedia":"es:Abitab",name:"Abitab"},countryCodes:["uy"],terms:[],matchScore:2,suggestion:true},"amenity/payment_centre/Rapipago":{name:"Rapipago",icon:"maki-bank",imageURL:"https://graph.facebook.com/Rapipago/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6100413",amenity:"payment_centre"},addTags:{amenity:"payment_centre",brand:"Rapipago","brand:wikidata":"Q6100413","brand:wikipedia":"es:Rapipago",name:"Rapipago"},countryCodes:["ar"],terms:[],matchScore:2,suggestion:true},"amenity/payment_terminal/Qiwi":{name:"Qiwi",icon:"far-credit-card",imageURL:"https://graph.facebook.com/qiwirussia/picture?type=large",geometry:["point"],tags:{"brand:wikidata":"Q4047736",amenity:"payment_terminal"},addTags:{amenity:"payment_terminal",brand:"Qiwi","brand:wikidata":"Q4047736","brand:wikipedia":"en:Qiwi",name:"Qiwi"},terms:[],matchScore:2,suggestion:true},"amenity/payment_terminal/ПриватБанк":{name:"ПриватБанк",icon:"far-credit-card",imageURL:"https://graph.facebook.com/privatbank/picture?type=large",geometry:["point"],tags:{"brand:wikidata":"Q1515015",amenity:"payment_terminal"},addTags:{amenity:"payment_terminal",brand:"ПриватБанк","brand:wikidata":"Q1515015","brand:wikipedia":"en:PrivatBank",name:"ПриватБанк"},countryCodes:["ua"],terms:[],matchScore:2,suggestion:true},"amenity/payment_terminal/Элекснет":{name:"Элекснет",icon:"far-credit-card",geometry:["point"],tags:{"brand:wikidata":"Q4530795",amenity:"payment_terminal"},addTags:{amenity:"payment_terminal",brand:"Элекснет","brand:wikidata":"Q4530795","brand:wikipedia":"ru:Элекснет",name:"Элекснет"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/36,6":{name:"36,6",icon:"maki-pharmacy",geometry:["point","area"],tags:{"brand:wikidata":"Q226889",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"36,6","brand:wikidata":"Q226889","brand:wikipedia":"ru:36,6 (аптечная сеть)",healthcare:"pharmacy",name:"36,6"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["ru"],terms:["аптека 36,6"],matchScore:2,suggestion:true},"amenity/pharmacy/Amcal":{name:"Amcal",icon:"maki-pharmacy",geometry:["point","area"],tags:{"brand:wikidata":"Q63367373",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Amcal","brand:wikidata":"Q63367373",healthcare:"pharmacy",name:"Amcal"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["au"],terms:["amcal pharmacy"],matchScore:2,suggestion:true},"amenity/pharmacy/Apollo Pharmacy":{name:"Apollo Pharmacy",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/ApolloPharmacy/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62562612",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Apollo Pharmacy","brand:wikidata":"Q62562612",healthcare:"pharmacy",name:"Apollo Pharmacy",operator:"Apollo Hospitals","operator:wikidata":"Q4780321","operator:wikipedia":"en:Apollo Hospitals"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["in"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Apotek Hjärtat":{name:"Apotek Hjärtat",icon:"maki-pharmacy",geometry:["point","area"],tags:{"brand:wikidata":"Q10416114",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Apotek Hjärtat","brand:wikidata":"Q10416114","brand:wikipedia":"sv:Apotek Hjärtat",healthcare:"pharmacy",name:"Apotek Hjärtat"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["se"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Bartell Drugs":{name:"Bartell Drugs",icon:"maki-pharmacy",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FBartell%20Drugs%20(logo).gif&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q4865152",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Bartell Drugs","brand:wikidata":"Q4865152","brand:wikipedia":"en:Bartell Drugs",healthcare:"pharmacy",name:"Bartell Drugs"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Benavides":{name:"Benavides",icon:"maki-pharmacy",geometry:["point","area"],tags:{"brand:wikidata":"Q5435613",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Benavides","brand:wikidata":"Q5435613","brand:wikipedia":"en:Farmacias Benavides",healthcare:"pharmacy",name:"Benavides"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["mx"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Benu":{name:"Benu",icon:"maki-pharmacy",geometry:["point","area"],tags:{"brand:wikidata":"Q62562792",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Benu","brand:wikidata":"Q62562792",healthcare:"pharmacy",name:"Benu"},reference:{key:"amenity",value:"pharmacy"},terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Blooms The Chemist":{name:"Blooms The Chemist",icon:"maki-pharmacy",geometry:["point","area"],tags:{"brand:wikidata":"Q63367543",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Blooms The Chemist","brand:wikidata":"Q63367543",healthcare:"pharmacy",name:"Blooms The Chemist",shop:"chemist"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["au"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Boots":{name:"Boots",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/bootsuk/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6123139",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Boots","brand:wikidata":"Q6123139","brand:wikipedia":"en:Boots UK",healthcare:"pharmacy",name:"Boots"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["gb"],terms:["boots pharmacy"],matchScore:2,suggestion:true},"amenity/pharmacy/Boticas y Salud":{name:"Boticas y Salud",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/Boticas-Salud-844038768993601/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62563126",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Boticas y Salud","brand:wikidata":"Q62563126",healthcare:"pharmacy",name:"Boticas y Salud"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["pe"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Brookshire Brothers Pharmacy":{name:"Brookshire Brothers Pharmacy",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/BrookshireBros/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4975084",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Brookshire Brothers Pharmacy","brand:wikidata":"Q4975084","brand:wikipedia":"en:Brookshire Brothers",healthcare:"pharmacy",name:"Brookshire Brothers Pharmacy"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/CVS":{name:"CVS",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/CVS/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2078880",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"CVS","brand:wikidata":"Q2078880","brand:wikipedia":"en:CVS Pharmacy",healthcare:"pharmacy",name:"CVS"},reference:{key:"amenity",value:"pharmacy"},terms:["cvs pharmacy"],matchScore:2,suggestion:true},"amenity/pharmacy/Camelia":{name:"Camelia",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/camelia.vaistine/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q15867413",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Camelia","brand:wikidata":"Q15867413","brand:wikipedia":"lt:Nemuno vaistinė",healthcare:"pharmacy",name:"Camelia"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["lt"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Catena":{name:"Catena",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/FarmaciaCatena/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q24035728",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Catena","brand:wikidata":"Q24035728","brand:wikipedia":"ro:Farmacia Catena",healthcare:"pharmacy",name:"Catena"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["ro"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Chemist King Discount Pharmacy":{name:"Chemist King Discount Pharmacy",icon:"maki-pharmacy",geometry:["point","area"],tags:{"brand:wikidata":"Q63367667",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Chemist King Discount Pharmacy","brand:wikidata":"Q63367667",healthcare:"pharmacy",name:"Chemist King Discount Pharmacy"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["au"],terms:["chemist king","chemist king discount pharmacies"],matchScore:2,suggestion:true},"amenity/pharmacy/Chemist Warehouse":{name:"Chemist Warehouse",icon:"maki-pharmacy",geometry:["point","area"],tags:{"brand:wikidata":"Q48782120",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Chemist Warehouse","brand:wikidata":"Q48782120","brand:wikipedia":"en:Chemist Warehouse",healthcare:"pharmacy",name:"Chemist Warehouse"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["au","nz"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Clicks":{name:"Clicks",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/ClicksSouthAfrica/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62563622",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Clicks","brand:wikidata":"Q62563622",healthcare:"pharmacy",name:"Clicks"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["za"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Costco Pharmacy":{name:"Costco Pharmacy",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/Costco/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q715583",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Costco Pharmacy","brand:wikidata":"Q715583","brand:wikipedia":"en:Costco",healthcare:"pharmacy",name:"Costco Pharmacy"},reference:{key:"amenity",value:"pharmacy"},terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Cruz Azul":{name:"Cruz Azul",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/CruzAzul.Farmacias/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62108219",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Cruz Azul","brand:wikidata":"Q62108219",healthcare:"pharmacy",name:"Cruz Azul"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["ec"],terms:["farmacias cruz azul"],matchScore:2,suggestion:true},"amenity/pharmacy/Cruz Verde":{name:"Cruz Verde",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/FarmaciasCruzVerde1/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5856071",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Cruz Verde","brand:wikidata":"Q5856071","brand:wikipedia":"es:Farmacias Cruz Verde",healthcare:"pharmacy",name:"Cruz Verde"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["cl"],terms:["farmacias cruz verde"],matchScore:2,suggestion:true},"amenity/pharmacy/Day Lewis Pharmacy":{name:"Day Lewis Pharmacy",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/DayLewisPharmacy/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62563772",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Day Lewis Pharmacy","brand:wikidata":"Q62563772",healthcare:"pharmacy",name:"Day Lewis Pharmacy"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Dbam o Zdrowie":{name:"Dbam o Zdrowie",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/dbamozdrowie/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62563833",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Dbam o Zdrowie","brand:wikidata":"Q62563833",healthcare:"pharmacy",name:"Dbam o Zdrowie"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["pl"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Dr. Max":{name:"Dr. Max",icon:"maki-pharmacy",geometry:["point","area"],tags:{"brand:wikidata":"Q56317371",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Dr. Max","brand:wikidata":"Q56317371","brand:wikipedia":"fr:Dr.Max",healthcare:"pharmacy",name:"Dr. Max"},reference:{key:"amenity",value:"pharmacy"},terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Droga Raia":{name:"Droga Raia",icon:"maki-pharmacy",geometry:["point","area"],tags:{"brand:wikidata":"Q10357101",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Droga Raia","brand:wikidata":"Q10357101","brand:wikipedia":"pt:RaiaDrogasil",healthcare:"pharmacy",name:"Droga Raia"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["br"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Drogaria São Paulo":{name:"Drogaria São Paulo",icon:"maki-pharmacy",geometry:["point","area"],tags:{"brand:wikidata":"Q5308184",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Drogaria São Paulo","brand:wikidata":"Q5308184","brand:wikipedia":"en:Grupo DPSP",healthcare:"pharmacy",name:"Drogaria São Paulo"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["br"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Drogasil":{name:"Drogasil",icon:"maki-pharmacy",geometry:["point","area"],tags:{"brand:wikidata":"Q5308185",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Drogasil","brand:wikidata":"Q5308185","brand:wikipedia":"pt:Drogasil",healthcare:"pharmacy",name:"Drogasil",wheelchair:"yes"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["br"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Duane Reade":{name:"Duane Reade",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/duanereade/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5310380",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Duane Reade","brand:wikidata":"Q5310380","brand:wikipedia":"en:Duane Reade",healthcare:"pharmacy",name:"Duane Reade"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Eurovaistinė":{name:"Eurovaistinė",icon:"maki-pharmacy",geometry:["point","area"],tags:{"brand:wikidata":"Q267205",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Eurovaistinė","brand:wikidata":"Q267205","brand:wikipedia":"en:Euroapotheca",healthcare:"pharmacy",name:"Eurovaistinė"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["lt"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Extrafarma":{name:"Extrafarma",icon:"maki-pharmacy",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FExtrafarma%20Logo.png&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q20055480",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Extrafarma","brand:wikidata":"Q20055480","brand:wikipedia":"pt:Extrafarma",healthcare:"pharmacy",name:"Extrafarma"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["br"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Familiprix":{name:"Familiprix",icon:"maki-pharmacy",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FFamiliprix.jpg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q3064881",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Familiprix","brand:wikidata":"Q3064881","brand:wikipedia":"en:Familiprix",healthcare:"pharmacy",name:"Familiprix"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Farmacenter (Colombia)":{name:"Farmacenter (Colombia)",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/FarmacenterCo/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62563928",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Farmacenter","brand:wikidata":"Q62563928",healthcare:"pharmacy",name:"Farmacenter"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["co"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Farmacia Benavides":{name:"Farmacia Benavides",icon:"maki-pharmacy",geometry:["point","area"],tags:{"brand:wikidata":"Q5435613",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Farmacia Benavides","brand:wikidata":"Q5435613","brand:wikipedia":"en:Farmacias Benavides",healthcare:"pharmacy",name:"Farmacia Benavides"},reference:{key:"amenity",value:"pharmacy"},terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Farmacia Guadalajara":{name:"Farmacia Guadalajara",icon:"maki-pharmacy",geometry:["point","area"],tags:{"brand:wikidata":"Q5435609",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Farmacia Guadalajara","brand:wikidata":"Q5435609","brand:wikipedia":"en:Farmacias Guadalajara",healthcare:"pharmacy",name:"Farmacia Guadalajara"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["mx"],terms:["farmacias guadalajara"],matchScore:2,suggestion:true},"amenity/pharmacy/Farmacias Ahumada":{name:"Farmacias Ahumada",icon:"maki-pharmacy",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FFarmacias%20ahumada.jpg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q5856069",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Farmacias Ahumada","brand:wikidata":"Q5856069","brand:wikipedia":"es:Farmacias Ahumada",healthcare:"pharmacy",name:"Farmacias Ahumada"},reference:{key:"amenity",value:"pharmacy"},terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Farmacias Económicas (Ecuador)":{name:"Farmacias Económicas (Ecuador)",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/FarmaciasEconomicasEc/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62108380",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Farmacias Económicas","brand:wikidata":"Q62108380",healthcare:"pharmacy",name:"Farmacias Económicas"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["ec"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Farmacias Económicas (El Salvador)":{name:"Farmacias Económicas (El Salvador)",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/FarmaciasEconomicas/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62108397",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Farmacias Económicas","brand:wikidata":"Q62108397",healthcare:"pharmacy",name:"Farmacias Económicas"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["sv"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Farmacias SalcoBrand":{name:"Farmacias SalcoBrand",icon:"maki-pharmacy",geometry:["point","area"],tags:{"brand:wikidata":"Q2877054",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Farmacias SalcoBrand","brand:wikidata":"Q2877054","brand:wikipedia":"es:Farmacias Salcobrand",healthcare:"pharmacy",name:"Farmacias SalcoBrand"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["cl"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Farmacias Similares":{name:"Farmacias Similares",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/DrSimiChile/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62564610",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Farmacias Similares","brand:wikidata":"Q62564610",healthcare:"pharmacy",name:"Farmacias Similares"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["cl","gt","mx"],terms:["similares"],matchScore:2,suggestion:true},"amenity/pharmacy/Farmacias del Ahorro":{name:"Farmacias del Ahorro",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/FAhorro/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62086647",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Farmacias del Ahorro","brand:wikidata":"Q62086647",healthcare:"pharmacy",name:"Farmacias del Ahorro"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["mx"],terms:["farmacia del ahorro"],matchScore:2,suggestion:true},"amenity/pharmacy/Farmacias del Dr. Simi":{name:"Farmacias del Dr. Simi",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/DrSimiChile/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62564610",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Farmacias del Dr. Simi","brand:wikidata":"Q62564610",healthcare:"pharmacy",name:"Farmacias del Dr. Simi"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["cl","gt","mx"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Farmacity":{name:"Farmacity",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/Farmacity/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5856076",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Farmacity","brand:wikidata":"Q5856076","brand:wikipedia":"es:Farmacity",healthcare:"pharmacy",name:"Farmacity"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["ra"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Farmahorro":{name:"Farmahorro",icon:"maki-pharmacy",geometry:["point","area"],tags:{"brand:wikidata":"Q20015002",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Farmahorro","brand:wikidata":"Q20015002","brand:wikipedia":"es:Farmahorro",healthcare:"pharmacy",name:"Farmahorro"},reference:{key:"amenity",value:"pharmacy"},terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Farmatodo":{name:"Farmatodo",icon:"maki-pharmacy",geometry:["point","area"],tags:{"brand:wikidata":"Q5856092",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Farmatodo","brand:wikidata":"Q5856092","brand:wikipedia":"es:Farmatodo",healthcare:"pharmacy",name:"Farmatodo"},reference:{key:"amenity",value:"pharmacy"},terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Felicia":{name:"Felicia",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/farmaciafelicia/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62564805",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Felicia","brand:wikidata":"Q62564805",healthcare:"pharmacy",name:"Felicia"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["md"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Fybeca":{name:"Fybeca",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/fybeca/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62564822",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Fybeca","brand:wikidata":"Q62564822",healthcare:"pharmacy",name:"Fybeca"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["ec"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Generika":{name:"Generika",icon:"maki-pharmacy",geometry:["point","area"],tags:{"brand:wikidata":"Q62564876",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Generika","brand:wikidata":"Q62564876",healthcare:"pharmacy",name:"Generika"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["ph"],terms:["generika drugstore"],matchScore:2,suggestion:true},"amenity/pharmacy/Gintarinė vaistinė":{name:"Gintarinė vaistinė",icon:"maki-pharmacy",geometry:["point","area"],tags:{"brand:wikidata":"Q15857801",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Gintarinė vaistinė","brand:wikidata":"Q15857801","brand:wikipedia":"lt:Gintarinė vaistinė",healthcare:"pharmacy",name:"Gintarinė vaistinė"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["lt"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Guardian (Asia)":{name:"Guardian (Asia)",icon:"maki-pharmacy",geometry:["point","area"],tags:{"brand:wikidata":"Q63371124",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Guardian","brand:wikidata":"Q63371124",healthcare:"pharmacy",name:"Guardian"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["bn","id","kh","my","sg","vn"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Guardian (Australia)":{name:"Guardian (Australia)",icon:"maki-pharmacy",geometry:["point","area"],tags:{"brand:wikidata":"Q63367814",amenity:"pharmacy"},addTags:{brand:"Guardian","brand:wikidata":"Q63367814",healthcare:"pharmacy",name:"Guardian"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["au"],terms:["guardian pharmacies","guardian pharmacy"],matchScore:2,suggestion:true},"amenity/pharmacy/H-E-B Pharmacy":{name:"H-E-B Pharmacy",icon:"maki-pharmacy",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FLogo%20of%20the%20HEB%20Grocery%20Company%2C%20LP.png&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q830621",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"H-E-B Pharmacy","brand:wikidata":"Q830621","brand:wikipedia":"en:H-E-B",healthcare:"pharmacy",name:"H-E-B Pharmacy"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Hy-Vee Pharmacy":{name:"Hy-Vee Pharmacy",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/HyVee/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1639719",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Hy-Vee Pharmacy","brand:wikidata":"Q1639719","brand:wikipedia":"en:Hy-Vee",healthcare:"pharmacy",name:"Hy-Vee Pharmacy"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Inkafarma":{name:"Inkafarma",icon:"maki-pharmacy",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FLogo%20de%20Inkafarma.png&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q10997748",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Inkafarma","brand:wikidata":"Q10997748","brand:wikipedia":"es:Inkafarma",healthcare:"pharmacy",name:"Inkafarma"},reference:{key:"amenity",value:"pharmacy"},terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Jean Coutu":{name:"Jean Coutu",icon:"maki-pharmacy",geometry:["point","area"],tags:{"brand:wikidata":"Q3117457",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Jean Coutu","brand:wikidata":"Q3117457","brand:wikipedia":"en:Jean Coutu Group",healthcare:"pharmacy",name:"Jean Coutu"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Kimia Farma":{name:"Kimia Farma",icon:"maki-pharmacy",geometry:["point","area"],tags:{"brand:wikidata":"Q11264892",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Kimia Farma","brand:wikidata":"Q11264892","brand:wikipedia":"en:Kimia Farma",healthcare:"pharmacy",name:"Kimia Farma"},reference:{key:"amenity",value:"pharmacy"},terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Kinney Drugs":{name:"Kinney Drugs",icon:"maki-pharmacy",geometry:["point","area"],tags:{"brand:wikidata":"Q6414090",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Kinney Drugs","brand:wikidata":"Q6414090","brand:wikipedia":"en:Kinney Drugs",healthcare:"pharmacy",name:"Kinney Drugs"},reference:{key:"amenity",value:"pharmacy"},terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Lloyds Pharmacy":{name:"Lloyds Pharmacy",icon:"maki-pharmacy",imageURL:"https://pbs.twimg.com/profile_images/3785151714/bacbe389277bb2f5477016a7fde79bcd_bigger.jpeg",geometry:["point","area"],tags:{"brand:wikidata":"Q6662870",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Lloyds Pharmacy","brand:wikidata":"Q6662870","brand:wikipedia":"en:LloydsPharmacy",healthcare:"pharmacy",name:"Lloyds Pharmacy"},reference:{key:"amenity",value:"pharmacy"},terms:["lloyds"],matchScore:2,suggestion:true},"amenity/pharmacy/London Drugs":{name:"London Drugs",icon:"maki-pharmacy",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FLondon%20Drugs%20Logo%20-%20with%20border.png&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q3258955",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"London Drugs","brand:wikidata":"Q3258955","brand:wikipedia":"en:London Drugs",healthcare:"pharmacy",name:"London Drugs"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Mannings":{name:"Mannings",icon:"maki-pharmacy",geometry:["point","area"],tags:{"brand:wikidata":"Q13646560",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Mannings","brand:wikidata":"Q13646560","brand:wikipedia":"en:Mannings",healthcare:"pharmacy",name:"Mannings"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["cn","hk","mo"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Marc's Pharmacy":{name:"Marc's Pharmacy",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/MarcsStores/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q17080259",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Marc's","brand:wikidata":"Q17080259","brand:wikipedia":"en:Marc's",healthcare:"pharmacy",name:"Marc's Pharmacy"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Mercury Drug":{name:"Mercury Drug",icon:"maki-pharmacy",geometry:["point","area"],tags:{"brand:wikidata":"Q6818610",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Mercury Drug","brand:wikidata":"Q6818610","brand:wikipedia":"en:Mercury Drug",healthcare:"pharmacy",name:"Mercury Drug"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["ph"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Mifarma":{name:"Mifarma",icon:"maki-pharmacy",geometry:["point","area"],tags:{"brand:wikidata":"Q62564998",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Mifarma","brand:wikidata":"Q62564998",healthcare:"pharmacy",name:"Mifarma"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["pe"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Multipharma":{name:"Multipharma",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/Multipharma.be/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62565018",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Multipharma","brand:wikidata":"Q62565018",healthcare:"pharmacy",name:"Multipharma"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["be"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Mēness aptieka":{name:"Mēness aptieka",icon:"maki-pharmacy",imageURL:"https://pbs.twimg.com/profile_images/854306359071961089/tyVjOiXp_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q57583051",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Mēness aptieka","brand:wikidata":"Q57583051",healthcare:"pharmacy",name:"Mēness aptieka"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["lv"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Pague Menos":{name:"Pague Menos",icon:"maki-pharmacy",geometry:["point","area"],tags:{"brand:wikidata":"Q7124466",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Pague Menos","brand:wikidata":"Q7124466","brand:wikipedia":"pt:Pague Menos",healthcare:"pharmacy",name:"Pague Menos"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["br"],terms:["farmácia pague menos"],matchScore:2,suggestion:true},"amenity/pharmacy/PharmaSave (Australia)":{name:"PharmaSave (Australia)",icon:"maki-pharmacy",geometry:["point","area"],tags:{"brand:wikidata":"Q63367906",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"PharmaSave","brand:wikidata":"Q63367906",healthcare:"pharmacy",name:"PharmaSave"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["au"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Pharmacie Principale":{name:"Pharmacie Principale",icon:"maki-pharmacy",geometry:["point","area"],tags:{"brand:wikidata":"Q1547749",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Pharmacie Principale","brand:wikidata":"Q1547749","brand:wikipedia":"fr:Groupe PP Holding",healthcare:"pharmacy",name:"Pharmacie Principale"},reference:{key:"amenity",value:"pharmacy"},terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Pharmacy 4 Less":{name:"Pharmacy 4 Less",icon:"maki-pharmacy",geometry:["point","area"],tags:{"brand:wikidata":"Q63367608",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Pharmacy 4 Less","brand:wikidata":"Q63367608",healthcare:"pharmacy",name:"Pharmacy 4 Less"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["au"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Pharmaprix":{name:"Pharmaprix",icon:"maki-pharmacy",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FShoppers-Drug-Mart-Logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q1820137",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Pharmaprix","brand:wikidata":"Q1820137","brand:wikipedia":"en:Shoppers Drug Mart",healthcare:"pharmacy",name:"Pharmaprix"},reference:{key:"amenity",value:"pharmacy"},terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Pharmasave (Canada)":{name:"Pharmasave (Canada)",icon:"maki-pharmacy",geometry:["point","area"],tags:{"brand:wikidata":"Q17093822",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Pharmasave","brand:wikidata":"Q17093822","brand:wikipedia":"en:Pharmasave",healthcare:"pharmacy",name:"Pharmasave"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Priceline Pharmacy":{name:"Priceline Pharmacy",icon:"maki-pharmacy",geometry:["point","area"],tags:{"brand:wikidata":"Q7242652",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Priceline Pharmacy","brand:wikidata":"Q7242652","brand:wikipedia":"en:Priceline (Australia)",healthcare:"pharmacy",name:"Priceline Pharmacy"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["au"],terms:["priceline"],matchScore:2,suggestion:true},"amenity/pharmacy/Punto Farma (Colombia)":{name:"Punto Farma (Colombia)",icon:"maki-pharmacy",geometry:["point","area"],tags:{"brand:wikidata":"Q62595271",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Punto Farma","brand:wikidata":"Q62595271",healthcare:"pharmacy",name:"Punto Farma"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["co"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Punto Farma (Honduras)":{name:"Punto Farma (Honduras)",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/FarmaciasPuntoFarma/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62595229",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Punto Farma","brand:wikidata":"Q62595229",healthcare:"pharmacy",name:"Punto Farma"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["hn"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Punto Farma (Paraguay)":{name:"Punto Farma (Paraguay)",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/Puntofarmapy/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62595220",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Punto Farma","brand:wikidata":"Q62595220",healthcare:"pharmacy",name:"Punto Farma"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["py"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Rexall":{name:"Rexall",icon:"maki-pharmacy",geometry:["point","area"],tags:{"brand:wikidata":"Q7319360",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Rexall","brand:wikidata":"Q7319360","brand:wikipedia":"en:Rexall",healthcare:"pharmacy",name:"Rexall"},reference:{key:"amenity",value:"pharmacy"},terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Rite Aid":{name:"Rite Aid",icon:"maki-pharmacy",imageURL:"https://pbs.twimg.com/profile_images/1096082254231613441/2lYTJj1d_bigger.png",geometry:["point","area"],tags:{"brand:wikidata":"Q3433273",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Rite Aid","brand:wikidata":"Q3433273","brand:wikipedia":"en:Rite Aid",healthcare:"pharmacy",name:"Rite Aid"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["us"],terms:["rite aid pharmacy"],matchScore:2,suggestion:true},"amenity/pharmacy/Rose Pharmacy":{name:"Rose Pharmacy",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/RosePharmacyInc/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62663208",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Rose Pharmacy","brand:wikidata":"Q62663208",healthcare:"pharmacy",name:"Rose Pharmacy"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["ph"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Rowlands Pharmacy":{name:"Rowlands Pharmacy",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/RowlandsPharmacy/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62663235",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Rowlands Pharmacy","brand:wikidata":"Q62663235",healthcare:"pharmacy",name:"Rowlands Pharmacy"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/SalcoBrand":{name:"SalcoBrand",icon:"maki-pharmacy",geometry:["point","area"],tags:{"brand:wikidata":"Q2877054",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"SalcoBrand","brand:wikidata":"Q2877054","brand:wikipedia":"es:Farmacias Salcobrand",healthcare:"pharmacy",name:"SalcoBrand"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["cl"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Sana Sana":{name:"Sana Sana",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/FarmaciasSanaSanaEc/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62564499",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Sana Sana","brand:wikidata":"Q62564499",healthcare:"pharmacy",name:"Sana Sana"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["ec"],terms:["farmacias sana sana"],matchScore:2,suggestion:true},"amenity/pharmacy/Sensiblu":{name:"Sensiblu",icon:"maki-pharmacy",geometry:["point","area"],tags:{"brand:wikidata":"Q12740640",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Sensiblu","brand:wikidata":"Q12740640","brand:wikipedia":"ro:Sensiblu",healthcare:"pharmacy",name:"Sensiblu"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["ro"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Shoppers Drug Mart":{name:"Shoppers Drug Mart",icon:"maki-pharmacy",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FShoppers-Drug-Mart-Logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q1820137",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Shoppers Drug Mart","brand:wikidata":"Q1820137","brand:wikipedia":"en:Shoppers Drug Mart",healthcare:"pharmacy",name:"Shoppers Drug Mart"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/South Star Drug":{name:"South Star Drug",icon:"maki-pharmacy",geometry:["point","area"],tags:{"brand:wikidata":"Q7568544",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"South Star Drug","brand:wikidata":"Q7568544","brand:wikipedia":"en:South Star Drug",healthcare:"pharmacy",name:"South Star Drug"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["ph"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Superdrug":{name:"Superdrug",icon:"maki-pharmacy",imageURL:"https://pbs.twimg.com/profile_images/1010086590536929280/Dy5TpFig_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q7643261",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Superdrug","brand:wikidata":"Q7643261","brand:wikipedia":"en:Superdrug",healthcare:"pharmacy",name:"Superdrug"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/São João":{name:"São João",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/farmaciassaojoao/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62663306",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"São João","brand:wikidata":"Q62663306",healthcare:"pharmacy",name:"São João"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["br"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/TGP":{name:"TGP",icon:"maki-pharmacy",geometry:["point","area"],tags:{"brand:wikidata":"Q61948677",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"The Generics Pharmacy","brand:wikidata":"Q61948677",healthcare:"pharmacy",name:"TGP",official_name:"The Generics Pharmacy"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["ph"],terms:["the generics pharmacy"],matchScore:2,suggestion:true},"amenity/pharmacy/TerryWhite Chemmart":{name:"TerryWhite Chemmart",icon:"maki-pharmacy",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FTerry%20White%20Chemists.png&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q24089773",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"TerryWhite Chemmart","brand:wikidata":"Q24089773","brand:wikipedia":"en:Terry White Chemmart",healthcare:"pharmacy",name:"TerryWhite Chemmart"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["au"],terms:["terrywhite","terrywhite chemist","terrywhite chemists"],matchScore:2,suggestion:true},"amenity/pharmacy/UFS":{name:"UFS",icon:"maki-pharmacy",geometry:["point","area"],tags:{"brand:wikidata":"Q63367573",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"UFS","brand:wikidata":"Q63367573",healthcare:"pharmacy",name:"UFS"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["au"],terms:["ufs dispensaries"],matchScore:2,suggestion:true},"amenity/pharmacy/Unichem Pharmacy":{name:"Unichem Pharmacy",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/UnichemNZ/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62663379",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Unichem Pharmacy","brand:wikidata":"Q62663379",healthcare:"pharmacy",name:"Unichem Pharmacy"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["nz"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Uniprix":{name:"Uniprix",icon:"maki-pharmacy",geometry:["point","area"],tags:{"brand:wikidata":"Q683265",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Uniprix","brand:wikidata":"Q683265","brand:wikipedia":"en:Uniprix",healthcare:"pharmacy",name:"Uniprix"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Walgreens":{name:"Walgreens",icon:"maki-pharmacy",imageURL:"https://pbs.twimg.com/profile_images/875789275668918273/7l9RDOnl_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q1591889",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Walgreens","brand:wikidata":"Q1591889","brand:wikipedia":"en:Walgreens",healthcare:"pharmacy",name:"Walgreens"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["us"],terms:["walgreens pharmacy"],matchScore:2,suggestion:true},"amenity/pharmacy/Walmart Pharmacy":{name:"Walmart Pharmacy",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/walmart/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q483551",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Walmart","brand:wikidata":"Q483551","brand:wikipedia":"en:Walmart",healthcare:"pharmacy",name:"Walmart Pharmacy",operator:"Walmart","operator:wikidata":"Q483551","operator:wikipedia":"en:Walmart"},reference:{key:"amenity",value:"pharmacy"},terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Watsons":{name:"Watsons",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/WatsonsPH/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7974785",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Watsons","brand:wikidata":"Q7974785","brand:wikipedia":"en:Watsons",healthcare:"pharmacy",name:"Watsons",operator:"A.S. Watson Group","operator:wikidata":"Q4647401","operator:wikipedia":"en:A.S. Watson Group"},reference:{key:"amenity",value:"pharmacy"},terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Well Pharmacy":{name:"Well Pharmacy",icon:"maki-pharmacy",geometry:["point","area"],tags:{"brand:wikidata":"Q7726524",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Well Pharmacy","brand:wikidata":"Q7726524","brand:wikipedia":"en:Well Pharmacy",healthcare:"pharmacy",name:"Well Pharmacy"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["gb"],terms:["well"],matchScore:2,suggestion:true},"amenity/pharmacy/Ziko Apteka":{name:"Ziko Apteka",icon:"maki-pharmacy",geometry:["point","area"],tags:{"brand:wikidata":"Q63432892",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Ziko Apteka","brand:wikidata":"Q63432892",healthcare:"pharmacy",name:"Ziko Apteka",short_name:"Ziko"},reference:{key:"amenity",value:"pharmacy"},terms:["ziko"],matchScore:2,suggestion:true},"amenity/pharmacy/А5":{name:"А5",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/apteka5/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62663476",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"А5","brand:wikidata":"Q62663476",healthcare:"pharmacy",name:"А5"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Бережная аптека":{name:"Бережная аптека",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/BereznayaApteka/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62664194",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Бережная аптека","brand:wikidata":"Q62664194",healthcare:"pharmacy",name:"Бережная аптека"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Ригла":{name:"Ригла",icon:"maki-pharmacy",geometry:["point","area"],tags:{"brand:wikidata":"Q4394431",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Ригла","brand:wikidata":"Q4394431","brand:wikipedia":"ru:Ригла",healthcare:"pharmacy",name:"Ригла"},reference:{key:"amenity",value:"pharmacy"},terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/סופר-פארם":{name:"סופר-פארם",icon:"maki-pharmacy",geometry:["point","area"],tags:{"brand:wikidata":"Q13220217",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"סופר-פארם","brand:he":"סופר-פארם","brand:wikidata":"Q13220217","brand:wikipedia":"en:Super-Pharm",healthcare:"pharmacy",name:"סופר-פארם","name:he":"סופר-פארם"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["il"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/くすりの福太郎":{name:"くすりの福太郎",icon:"maki-pharmacy",geometry:["point","area"],tags:{"brand:wikidata":"Q17214460",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"くすりの福太郎","brand:en":"Kusurino FUKUTARO","brand:ja":"くすりの福太郎","brand:wikidata":"Q17214460","brand:wikipedia":"ja:くすりの福太郎",healthcare:"pharmacy",name:"くすりの福太郎","name:en":"Kusurino Fukutaro","name:ja":"くすりの福太郎"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/ウェルパーク":{name:"ウェルパーク",icon:"maki-pharmacy",geometry:["point","area"],tags:{"brand:wikidata":"Q11288610",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"ウェルパーク","brand:ja":"ウェルパーク","brand:wikidata":"Q11288610","brand:wikipedia":"ja:ウェルパーク",healthcare:"pharmacy",name:"ウェルパーク","name:en":"Welpark","name:ja":"ウェルパーク"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/ウエルシア":{name:"ウエルシア",icon:"maki-pharmacy",geometry:["point","area"],tags:{"brand:wikidata":"Q11288684",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"ウエルシア","brand:en":"Welcia","brand:ja":"ウエルシア","brand:wikidata":"Q11288684","brand:wikipedia":"ja:ウエルシアホールディングス",healthcare:"pharmacy",name:"ウエルシア","name:en":"Welcia","name:ja":"ウエルシア"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/ウエルシア薬局":{name:"ウエルシア薬局",icon:"maki-pharmacy",geometry:["point","area"],tags:{"brand:wikidata":"Q11288687",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"ウエルシア薬局","brand:en":"Welcia Yakkyoku","brand:ja":"ウエルシア薬局","brand:wikidata":"Q11288687","brand:wikipedia":"ja:ウエルシア薬局",healthcare:"pharmacy",name:"ウエルシア薬局","name:en":"Welcia Yakkyoku","name:ja":"ウエルシア薬局"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/カワチ薬品":{name:"カワチ薬品",icon:"maki-pharmacy",geometry:["point","area"],tags:{"brand:wikidata":"Q11295397",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"カワチ薬品","brand:en":"Cawachi","brand:ja":"カワチ薬品","brand:wikidata":"Q11295397","brand:wikipedia":"ja:カワチ薬品",healthcare:"pharmacy",name:"カワチ薬品","name:en":"Cawachi","name:ja":"カワチ薬品"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/キリン堂":{name:"キリン堂",icon:"maki-pharmacy",geometry:["point","area"],tags:{"brand:wikidata":"Q11297751",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"キリン堂","brand:en":"Kirindo","brand:ja":"キリン堂","brand:wikidata":"Q11297751","brand:wikipedia":"ja:キリン堂",healthcare:"pharmacy",name:"キリン堂","name:en":"Kirindo","name:ja":"キリン堂"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/クリエイト":{name:"クリエイト",icon:"maki-pharmacy",geometry:["point","area"],tags:{"brand:wikidata":"Q11299163",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"クリエイト","brand:en":"Create","brand:ja":"クリエイト","brand:wikidata":"Q11299163","brand:wikipedia":"ja:クリエイトSDホールディングス",healthcare:"pharmacy",name:"クリエイト","name:en":"Create","name:ja":"クリエイト"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/ココカラファイン":{name:"ココカラファイン",icon:"maki-pharmacy",imageURL:"https://pbs.twimg.com/profile_images/1050257672753229825/lhBcsYat_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q11301948",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"ココカラファイン","brand:ja":"ココカラファイン","brand:wikidata":"Q11301948","brand:wikipedia":"ja:ココカラファイン",healthcare:"pharmacy",name:"ココカラファイン","name:en":"Cocokara Fine","name:ja":"ココカラファイン"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/サンドラッグ":{name:"サンドラッグ",icon:"maki-pharmacy",geometry:["point","area"],tags:{"brand:wikidata":"Q11305867",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"サンドラッグ","brand:ja":"サンドラッグ","brand:wikidata":"Q11305867","brand:wikipedia":"ja:サンドラッグ",healthcare:"pharmacy",name:"サンドラッグ","name:en":"Sundrug","name:ja":"サンドラッグ"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/スギ薬局":{name:"スギ薬局",icon:"maki-pharmacy",geometry:["point","area"],tags:{"brand:wikidata":"Q11311460",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"スギ薬局","brand:en":"Sugi Pharmacy","brand:ja":"スギ薬局","brand:wikidata":"Q11311460","brand:wikipedia":"ja:スギ薬局",healthcare:"pharmacy",name:"スギ薬局","name:en":"Sugi Pharmacy","name:ja":"スギ薬局"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/セイジョー":{name:"セイジョー",icon:"maki-pharmacy",geometry:["point","area"],tags:{"brand:wikidata":"Q11314133",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"セイジョー","brand:en":"Seijo","brand:ja":"セイジョー","brand:wikidata":"Q11314133","brand:wikipedia":"ja:セイジョー",healthcare:"pharmacy",name:"セイジョー","name:en":"Seijo","name:ja":"セイジョー"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/ダイコクドラッグ":{name:"ダイコクドラッグ",icon:"maki-pharmacy",geometry:["point","area"],tags:{"brand:wikidata":"Q11316754",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"ダイコクドラッグ","brand:en":"Daikoku Drug","brand:ja":"ダイコクドラッグ","brand:wikidata":"Q11316754","brand:wikipedia":"ja:ダイコク",healthcare:"pharmacy",name:"ダイコクドラッグ","name:en":"Daikoku Drug","name:ja":"ダイコクドラッグ"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/ツルハドラッグ":{name:"ツルハドラッグ",icon:"maki-pharmacy",geometry:["point","area"],tags:{"brand:wikidata":"Q11318826",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"ツルハドラッグ","brand:en":"Tsuruha","brand:ja":"ツルハドラッグ","brand:wikidata":"Q11318826","brand:wikipedia":"ja:ツルハ",healthcare:"pharmacy",name:"ツルハドラッグ","name:en":"Tsuruha","name:ja":"ツルハドラッグ"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/トモズ":{name:"トモズ",icon:"maki-pharmacy",geometry:["point","area"],tags:{"brand:wikidata":"Q7820097",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"トモズ","brand:en":"Tomod's","brand:ja":"トモズ","brand:wikidata":"Q7820097","brand:wikipedia":"ja:トモズ",healthcare:"pharmacy",name:"トモズ","name:en":"Tomod's","name:ja":"トモズ"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["jp"],terms:["トモズエキスプレス"],matchScore:2,suggestion:true},"amenity/pharmacy/マツモトキヨシ":{name:"マツモトキヨシ",icon:"maki-pharmacy",geometry:["point","area"],tags:{"brand:wikidata":"Q8014776",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"マツモトキヨシ","brand:en":"Matsukiyo","brand:ja":"マツモトキヨシ","brand:wikidata":"Q8014776","brand:wikipedia":"ja:マツモトキヨシ",healthcare:"pharmacy",name:"マツモトキヨシ","name:en":"Matsukiyo","name:ja":"マツモトキヨシ"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/post_box/Deutsche Post":{name:"Deutsche Post",icon:"temaki-post_box",imageURL:"https://graph.facebook.com/deutschepost/picture?type=large",geometry:["point","vertex"],tags:{"brand:wikidata":"Q157645",amenity:"post_box"},addTags:{amenity:"post_box",brand:"Deutsche Post","brand:wikidata":"Q157645","brand:wikipedia":"en:Deutsche Post",name:"Deutsche Post"},countryCodes:["de"],terms:["deutsche post ag"],matchScore:2,suggestion:true},"amenity/post_box/USPS":{name:"USPS",icon:"temaki-post_box",imageURL:"https://graph.facebook.com/USPS/picture?type=large",geometry:["point","vertex"],tags:{"brand:wikidata":"Q668687",amenity:"post_box"},addTags:{amenity:"post_box",brand:"USPS","brand:wikidata":"Q668687","brand:wikipedia":"en:United States Postal Service",name:"USPS",operator:"USPS"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/post_office/Australia Post":{name:"Australia Post",icon:"maki-post",imageURL:"https://pbs.twimg.com/profile_images/1050581738009718785/uXnrUC3X_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q1142936",amenity:"post_office"},addTags:{amenity:"post_office",brand:"Australia Post","brand:wikidata":"Q1142936","brand:wikipedia":"en:Australia Post",name:"Australia Post"},countryCodes:["au"],terms:[],matchScore:2,suggestion:true},"amenity/post_office/CTT":{name:"CTT",icon:"maki-post",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FMacau%20DSC.png&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q909429",amenity:"post_office"},addTags:{amenity:"post_office",brand:"CTT","brand:wikidata":"Q909429","brand:wikipedia":"en:CTT (Macau)",name:"CTT"},countryCodes:["mo"],terms:[],matchScore:2,suggestion:true},"amenity/post_office/Canada Post":{name:"Canada Post",icon:"maki-post",imageURL:"https://graph.facebook.com/canadapost/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1032001",amenity:"post_office"},addTags:{amenity:"post_office",brand:"Canada Post","brand:wikidata":"Q1032001","brand:wikipedia":"en:Canada Post",name:"Canada Post"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"amenity/post_office/Correios":{name:"Correios",icon:"maki-post",imageURL:"https://graph.facebook.com/correiosoficial/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3375004",amenity:"post_office"},addTags:{amenity:"post_office",brand:"Correios","brand:wikidata":"Q3375004","brand:wikipedia":"en:Correios",name:"Correios"},countryCodes:["br"],terms:[],matchScore:2,suggestion:true},"amenity/post_office/Correo Argentino":{name:"Correo Argentino",icon:"maki-post",imageURL:"https://graph.facebook.com/CorreoOficialSA/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4036566",amenity:"post_office"},addTags:{amenity:"post_office",brand:"Correo Argentino","brand:wikidata":"Q4036566","brand:wikipedia":"en:Correo Argentino",name:"Correo Argentino"},countryCodes:["ar"],terms:[],matchScore:2,suggestion:true},"amenity/post_office/Correos de Chile":{name:"Correos de Chile",icon:"maki-post",imageURL:"https://graph.facebook.com/correoschile/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5172893",amenity:"post_office"},addTags:{amenity:"post_office",brand:"Correos de Chile","brand:wikidata":"Q5172893","brand:wikipedia":"en:Correos de Chile",name:"Correos de Chile"},countryCodes:["cl"],terms:[],matchScore:2,suggestion:true},"amenity/post_office/Correos de Costa Rica":{name:"Correos de Costa Rica",icon:"maki-post",imageURL:"https://graph.facebook.com/CorreosdeCostaRica/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5172894",amenity:"post_office"},addTags:{amenity:"post_office",brand:"Correos de Costa Rica","brand:wikidata":"Q5172894","brand:wikipedia":"en:Correos de Costa Rica",name:"Correos de Costa Rica"},countryCodes:["cr"],terms:[],matchScore:2,suggestion:true},"amenity/post_office/DHL":{name:"DHL",icon:"maki-post",imageURL:"https://graph.facebook.com/dhl/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q489815",amenity:"post_office"},addTags:{amenity:"post_office",brand:"DHL","brand:wikidata":"Q489815","brand:wikipedia":"en:DHL Express",name:"DHL",operator:"DHL"},terms:["dhl paketshop"],matchScore:2,suggestion:true},"amenity/post_office/DPD Paketshop":{name:"DPD Paketshop",icon:"maki-post",imageURL:"https://graph.facebook.com/350375105088695/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q541030",amenity:"post_office"},addTags:{amenity:"post_office",brand:"DPD Paketshop","brand:wikidata":"Q541030","brand:wikipedia":"en:DPDgroup",name:"DPD Paketshop"},terms:[],matchScore:2,suggestion:true},"amenity/post_office/Deutsche Post":{name:"Deutsche Post",icon:"maki-post",imageURL:"https://graph.facebook.com/deutschepost/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q157645",amenity:"post_office"},addTags:{amenity:"post_office",brand:"Deutsche Post","brand:wikidata":"Q157645","brand:wikipedia":"en:Deutsche Post",name:"Deutsche Post"},countryCodes:["de"],terms:["deutsche post ag","deutsche post filiale"],matchScore:2,suggestion:true},"amenity/post_office/Fancourier":{name:"Fancourier",icon:"maki-post",geometry:["point","area"],tags:{"brand:wikidata":"Q12727984",amenity:"post_office"},addTags:{amenity:"post_office",brand:"Fancourier","brand:wikidata":"Q12727984","brand:wikipedia":"ro:FAN Courier Express",name:"Fancourier"},countryCodes:["ro"],terms:[],matchScore:2,suggestion:true},"amenity/post_office/FedEx":{name:"FedEx",icon:"maki-post",imageURL:"https://graph.facebook.com/FedEx/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q459477",amenity:"post_office"},addTags:{amenity:"post_office",brand:"FedEx","brand:wikidata":"Q459477","brand:wikipedia":"en:FedEx",name:"FedEx"},terms:[],matchScore:2,suggestion:true},"amenity/post_office/Hermes Paketshop":{name:"Hermes Paketshop",icon:"maki-post",geometry:["point","area"],tags:{"brand:wikidata":"Q1613532",amenity:"post_office"},addTags:{amenity:"post_office",brand:"Hermes Paketshop","brand:wikidata":"Q1613532","brand:wikipedia":"en:Hermes Group",name:"Hermes Paketshop"},terms:["hermes"],matchScore:2,suggestion:true},"amenity/post_office/LBC":{name:"LBC",icon:"maki-post",imageURL:"https://graph.facebook.com/LBCexpress/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q17075584",amenity:"post_office"},addTags:{amenity:"post_office",brand:"LBC","brand:wikidata":"Q17075584","brand:wikipedia":"en:LBC Express",name:"LBC"},countryCodes:["ph"],terms:["lbc express"],matchScore:2,suggestion:true},"amenity/post_office/La Poste":{name:"La Poste",icon:"maki-post",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FLaurent%20Vincenti%20La%20Poste.JPG&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q373724",amenity:"post_office"},addTags:{amenity:"post_office",brand:"La Poste","brand:wikidata":"Q373724","brand:wikipedia":"fr:La Poste (entreprise française)",name:"La Poste"},terms:[],matchScore:2,suggestion:true},"amenity/post_office/MRW":{name:"MRW",icon:"maki-post",imageURL:"https://graph.facebook.com/mrwespana/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q23767821",amenity:"post_office"},addTags:{amenity:"post_office",brand:"MRW","brand:wikidata":"Q23767821","brand:wikipedia":"es:MRW",name:"MRW"},terms:[],matchScore:2,suggestion:true},"amenity/post_office/Oficina de Correos":{name:"Oficina de Correos",icon:"maki-post",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FCorreos%20logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q776605",amenity:"post_office"},addTags:{amenity:"post_office",brand:"Oficina de Correos","brand:wikidata":"Q776605","brand:wikipedia":"es:Correos (España)",name:"Oficina de Correos"},terms:["correos"],matchScore:2,suggestion:true},"amenity/post_office/Poczta Polska":{name:"Poczta Polska",icon:"maki-post",imageURL:"https://graph.facebook.com/pocztapolska/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q168833",amenity:"post_office"},addTags:{amenity:"post_office",brand:"Poczta Polska","brand:wikidata":"Q168833","brand:wikipedia":"pl:Poczta Polska",name:"Poczta Polska"},countryCodes:["pl"],terms:[],matchScore:2,suggestion:true},"amenity/post_office/PostalAnnex":{name:"PostalAnnex",icon:"maki-post",geometry:["point","area"],tags:{"brand:wikidata":"Q61960357",amenity:"post_office"},addTags:{amenity:"post_office",brand:"PostalAnnex","brand:wikidata":"Q61960357",name:"PostalAnnex"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/post_office/Poste Italiane":{name:"Poste Italiane",icon:"maki-post",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FPoste-Italiane-Logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q495026",amenity:"post_office"},addTags:{amenity:"post_office",brand:"Poste Italiane","brand:wikidata":"Q495026","brand:wikipedia":"en:Poste italiane",name:"Poste Italiane"},countryCodes:["it"],terms:[],matchScore:2,suggestion:true},"amenity/post_office/Serpost":{name:"Serpost",icon:"maki-post",geometry:["point","area"],tags:{"brand:wikidata":"Q19521863",amenity:"post_office"},addTags:{amenity:"post_office",brand:"Serpost","brand:wikidata":"Q19521863","brand:wikipedia":"es:Servicios Postales del Perú",name:"Serpost"},countryCodes:["pe"],terms:["servicios postales del perú"],matchScore:2,suggestion:true},"amenity/post_office/Slovenská pošta":{name:"Slovenská pošta",icon:"maki-post",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FLogoSlovakPost.gif&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q1191849",amenity:"post_office"},addTags:{amenity:"post_office",brand:"Slovenská pošta","brand:wikidata":"Q1191849","brand:wikipedia":"en:Slovenská pošta",name:"Slovenská pošta"},countryCodes:["sk"],terms:[],matchScore:2,suggestion:true},"amenity/post_office/The UPS Store":{name:"The UPS Store",icon:"maki-post",imageURL:"https://pbs.twimg.com/profile_images/1080841709934780417/MTIJnZHk_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q7771029",amenity:"post_office"},addTags:{amenity:"post_office",brand:"The UPS Store","brand:wikidata":"Q7771029","brand:wikipedia":"en:The UPS Store",name:"The UPS Store"},terms:["ups","ups store"],matchScore:2,suggestion:true},"amenity/post_office/US Post Office":{name:"US Post Office",icon:"maki-post",imageURL:"https://graph.facebook.com/USPS/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q668687",amenity:"post_office"},addTags:{amenity:"post_office",brand:"US Post Office","brand:wikidata":"Q668687","brand:wikipedia":"en:United States Postal Service",name:"US Post Office",operator:"USPS"},countryCodes:["us"],terms:["united states post office","united states postal service","usps"],matchScore:2,suggestion:true},"amenity/post_office/ΕΛΤΑ":{name:"ΕΛΤΑ",icon:"maki-post",geometry:["point","area"],tags:{"brand:wikidata":"Q1275135",amenity:"post_office"},addTags:{amenity:"post_office",brand:"ΕΛΤΑ","brand:wikidata":"Q1275135","brand:wikipedia":"el:Ελληνικά Ταχυδρομεία",name:"ΕΛΤΑ"},countryCodes:["gr"],terms:[],matchScore:2,suggestion:true},"amenity/post_office/Белпошта":{name:"Белпошта",icon:"maki-post",imageURL:"https://graph.facebook.com/belpost.by/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2662336",amenity:"post_office"},addTags:{amenity:"post_office",brand:"Белпошта","brand:be":"Белпошта","brand:en":"Belposhta","brand:ru":"Белпочта","brand:wikidata":"Q2662336","brand:wikipedia":"be:Белпошта",name:"Белпошта","name:be":"Белпошта","name:en":"Belposhta","name:ru":"Белпочта"},countryCodes:["by"],terms:["белпочта"],matchScore:2,suggestion:true},"amenity/post_office/Казпочта":{name:"Казпочта",icon:"maki-post",imageURL:"https://graph.facebook.com/Kazpost/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q746263",amenity:"post_office"},addTags:{amenity:"post_office",brand:"Казпочта","brand:wikidata":"Q746263","brand:wikipedia":"ru:Казпочта",name:"Казпочта"},countryCodes:["kz"],terms:[],matchScore:2,suggestion:true},"amenity/post_office/Нова Пошта №1":{name:"Нова Пошта №1",icon:"maki-post",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FNova%20Poshta%202014%20logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q12133863",amenity:"post_office"},addTags:{amenity:"post_office",brand:"Нова Пошта №1","brand:wikidata":"Q12133863","brand:wikipedia":"uk:Нова пошта",name:"Нова Пошта №1"},countryCodes:["ua"],terms:[],matchScore:2,suggestion:true},"amenity/post_office/Почта России":{name:"Почта России",icon:"maki-post",imageURL:"https://graph.facebook.com/ruspost/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1502763",amenity:"post_office"},addTags:{amenity:"post_office",brand:"Почта России","brand:wikidata":"Q1502763","brand:wikipedia":"ru:Почта России",name:"Почта России"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"amenity/post_office/СДЭК":{name:"СДЭК",icon:"maki-post",geometry:["point","area"],tags:{"brand:wikidata":"Q28665980",amenity:"post_office"},addTags:{amenity:"post_office",brand:"СДЭК","brand:wikidata":"Q28665980","brand:wikipedia":"ru:СДЭК",name:"СДЭК"},terms:[],matchScore:2,suggestion:true},"amenity/post_office/Укрпошта":{name:"Укрпошта",icon:"maki-post",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FUkrposhta.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q2470783",amenity:"post_office"},addTags:{amenity:"post_office",brand:"Укрпошта","brand:wikidata":"Q2470783","brand:wikipedia":"en:Ukrposhta",name:"Укрпошта"},countryCodes:["ua"],terms:[],matchScore:2,suggestion:true},"amenity/post_office/中国邮政":{name:"中国邮政",icon:"maki-post",geometry:["point","area"],tags:{"brand:wikidata":"Q1066476",amenity:"post_office"},addTags:{amenity:"post_office",brand:"中国邮政","brand:en":"China Post","brand:wikidata":"Q1066476","brand:wikipedia":"en:China Post",name:"中国邮政","name:en":"China Post"},countryCodes:["cn"],terms:[],matchScore:2,suggestion:true},"amenity/prep_school/Huntington Learning Center":{name:"Huntington Learning Center",icon:"temaki-school",imageURL:"https://graph.facebook.com/HuntingtonHelps/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5945399",amenity:"prep_school"},addTags:{amenity:"prep_school",brand:"Huntington Learning Center","brand:wikidata":"Q5945399","brand:wikipedia":"en:Huntington Learning Center",name:"Huntington Learning Center"},countryCodes:["us"],terms:["huntington"],matchScore:2,suggestion:true},"amenity/prep_school/KUMON (Japan)":{name:"KUMON (Japan)",icon:"temaki-school",imageURL:"https://graph.facebook.com/kumon/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q142054",amenity:"prep_school"},addTags:{amenity:"prep_school",brand:"KUMON","brand:wikidata":"Q142054","brand:wikipedia":"ja:日本公文教育研究会",name:"KUMON","name:ja":"公文","name:ja-Hira":"くもん","name:ja-Latn":"KUMON"},countryCodes:["jp"],terms:["くもん","公文"],matchScore:2,suggestion:true},"amenity/prep_school/Kumon (International)":{name:"Kumon (International)",icon:"temaki-school",imageURL:"https://graph.facebook.com/kumon/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q142054",amenity:"prep_school"},addTags:{amenity:"prep_school",brand:"Kumon","brand:wikidata":"Q142054","brand:wikipedia":"en:Kumon",name:"Kumon"},terms:["kumon learning center"],matchScore:2,suggestion:true},"amenity/prep_school/Russian School of Mathematics":{name:"Russian School of Mathematics",icon:"temaki-school",imageURL:"https://graph.facebook.com/RussianMath/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7382122",amenity:"prep_school"},addTags:{amenity:"prep_school",brand:"Russian School of Mathematics","brand:wikidata":"Q7382122","brand:wikipedia":"en:Russian School of Mathematics",name:"Russian School of Mathematics"},countryCodes:["us"],terms:["rsm","russian school of math"],matchScore:2,suggestion:true},"amenity/prep_school/Sylvan":{name:"Sylvan",icon:"temaki-school",imageURL:"https://graph.facebook.com/SylvanLearning/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7660663",amenity:"prep_school"},addTags:{alt_name:"Sylvan Learning Center",amenity:"prep_school",brand:"Sylvan","brand:wikidata":"Q7660663","brand:wikipedia":"en:Sylvan Learning",name:"Sylvan"},countryCodes:["us"],terms:["sylvan learning","sylvan learning center"],matchScore:2,suggestion:true},"amenity/public_bookcase/Little Free Library":{name:"Little Free Library",icon:"maki-library",imageURL:"https://graph.facebook.com/LittleFreeLibrary/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6650101",amenity:"public_bookcase"},addTags:{amenity:"public_bookcase",brand:"Little Free Library","brand:wikidata":"Q6650101","brand:wikipedia":"en:Little Free Library",name:"Little Free Library"},terms:[],matchScore:2,suggestion:true},"amenity/restaurant/100 Montaditos":{name:"100 Montaditos",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/100MontaditosSpain/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q8355805",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"100 Montaditos","brand:wikidata":"Q8355805","brand:wikipedia":"en:Cervecería 100 Montaditos",cuisine:"sandwich",name:"100 Montaditos"},terms:[],matchScore:2,suggestion:true},"amenity/restaurant/italian/ASK Italian":{name:"ASK Italian",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/ASKItalian/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4807056",amenity:"restaurant",cuisine:"italian"},addTags:{amenity:"restaurant",brand:"ASK Italian","brand:wikidata":"Q4807056","brand:wikipedia":"en:ASK Italian",cuisine:"italian",name:"ASK Italian"},reference:{key:"cuisine",value:"italian"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/american/Applebee's":{name:"Applebee's",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/Applebeesmundoe/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q621532",amenity:"restaurant",cuisine:"american"},addTags:{amenity:"restaurant",brand:"Applebee's Neighborhood Grill & Bar","brand:wikidata":"Q621532","brand:wikipedia":"en:Applebee's",cuisine:"american",name:"Applebee's",official_name:"Applebee's Neighborhood Grill & Bar"},reference:{key:"cuisine",value:"american"},terms:["applebees bar & grill","applebees bar and grill","applebees grill & bar","applebees grill and bar","applebees neighborhood bar & grill","applebees neighborhood bar and grill","applebees neighborhood grill & bar","applebees neighborhood grill and bar"],matchScore:2,suggestion:true},"amenity/restaurant/Autogrill":{name:"Autogrill",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/AutogrillOfficial/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q786790",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"Autogrill","brand:wikidata":"Q786790","brand:wikipedia":"en:Autogrill",name:"Autogrill"},terms:[],matchScore:2,suggestion:true},"amenity/restaurant/american/BJ's":{name:"BJ's",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/BJsRestaurants/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4835755",amenity:"restaurant",cuisine:"american"},addTags:{amenity:"restaurant",brand:"BJ's","brand:wikidata":"Q4835755","brand:wikipedia":"en:BJ's Restaurants",cuisine:"american",name:"BJ's",official_name:"BJ's Restaurant & Brewhouse"},reference:{key:"cuisine",value:"american"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/italian/Bella Italia":{name:"Bella Italia",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/bellaitalia.co.uk/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4883362",amenity:"restaurant",cuisine:"italian"},addTags:{amenity:"restaurant",brand:"Bella Italia","brand:wikidata":"Q4883362","brand:wikipedia":"en:Bella Italia",cuisine:"italian",name:"Bella Italia"},reference:{key:"cuisine",value:"italian"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/Big Boy":{name:"Big Boy",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/bigboyrestaurants/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4386779",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"Big Boy","brand:wikidata":"Q4386779","brand:wikipedia":"en:Big Boy Restaurants",cuisine:"burger",name:"Big Boy",official_name:"Big Boy Restaurant & Bakery"},terms:[],matchScore:2,suggestion:true},"amenity/restaurant/american/Black Bear Diner":{name:"Black Bear Diner",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/BlackBearDiner/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4920343",amenity:"restaurant",cuisine:"american"},addTags:{amenity:"restaurant",brand:"Black Bear Diner","brand:wikidata":"Q4920343","brand:wikipedia":"en:Black Bear Diner",cuisine:"american",name:"Black Bear Diner"},reference:{key:"cuisine",value:"american"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/pizza/Blaze Pizza":{name:"Blaze Pizza",icon:"maki-restaurant-pizza",imageURL:"https://graph.facebook.com/BlazePizza/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q23016666",amenity:"restaurant",cuisine:"pizza"},addTags:{amenity:"restaurant",brand:"Blaze Pizza","brand:wikidata":"Q23016666","brand:wikipedia":"en:Blaze Pizza",cuisine:"pizza",name:"Blaze Pizza"},reference:{key:"cuisine",value:"pizza"},countryCodes:["bh","ca","kw","sa","us"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/american/Bob Evans":{name:"Bob Evans",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/bobevans/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4932386",amenity:"restaurant",cuisine:"american"},addTags:{amenity:"restaurant",brand:"Bob Evans","brand:wikidata":"Q4932386","brand:wikipedia":"en:Bob Evans Restaurants",cuisine:"american",name:"Bob Evans"},reference:{key:"cuisine",value:"american"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/seafood/Bonefish Grill":{name:"Bonefish Grill",icon:"maki-restaurant-seafood",imageURL:"https://graph.facebook.com/bonefishgrill/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4941599",amenity:"restaurant",cuisine:"seafood"},addTags:{amenity:"restaurant",brand:"Bonefish Grill","brand:wikidata":"Q4941599","brand:wikipedia":"en:Bonefish Grill",cuisine:"seafood",name:"Bonefish Grill"},reference:{key:"cuisine",value:"seafood"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/pizza/Boston Pizza":{name:"Boston Pizza",icon:"maki-restaurant-pizza",imageURL:"https://graph.facebook.com/BostonPizza/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q894578",amenity:"restaurant",cuisine:"pizza"},addTags:{amenity:"restaurant",brand:"Boston Pizza","brand:wikidata":"Q894578","brand:wikipedia":"en:Boston Pizza",cuisine:"pizza",name:"Boston Pizza"},reference:{key:"cuisine",value:"pizza"},terms:[],matchScore:2,suggestion:true},"amenity/restaurant/italian/Buca di Beppo":{name:"Buca di Beppo",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/bucadibeppo/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4982340",amenity:"restaurant",cuisine:"italian"},addTags:{amenity:"restaurant",brand:"Buca di Beppo","brand:wikidata":"Q4982340","brand:wikipedia":"en:Buca di Beppo",cuisine:"italian",name:"Buca di Beppo"},reference:{key:"cuisine",value:"italian"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/Buffalo Grill":{name:"Buffalo Grill",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/buffalogrill/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q944655",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"Buffalo Grill","brand:wikidata":"Q944655","brand:wikipedia":"en:Buffalo Grill",cuisine:"steak_house",name:"Buffalo Grill"},terms:[],matchScore:2,suggestion:true},"amenity/restaurant/Buffalo Wild Wings":{name:"Buffalo Wild Wings",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/BuffaloWildWings/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q509255",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"Buffalo Wild Wings","brand:wikidata":"Q509255","brand:wikipedia":"en:Buffalo Wild Wings",cuisine:"wings",name:"Buffalo Wild Wings"},terms:[],matchScore:2,suggestion:true},"amenity/restaurant/Buffalo Wings & Rings":{name:"Buffalo Wings & Rings",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/wingsandrings/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4985900",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"Buffalo Wings & Rings","brand:wikidata":"Q4985900","brand:wikipedia":"en:Buffalo Wings & Rings",cuisine:"wings",name:"Buffalo Wings & Rings",takeaway:"yes"},countryCodes:["us"],terms:["buffalo wings and rings"],matchScore:2,suggestion:true},"amenity/restaurant/mexican/Cafe Rio":{name:"Cafe Rio",icon:"fas-pepper-hot",imageURL:"https://graph.facebook.com/CafeRio/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5017108",amenity:"restaurant",cuisine:"mexican"},addTags:{amenity:"restaurant",brand:"Cafe Rio","brand:wikidata":"Q5017108","brand:wikipedia":"en:Cafe Rio",cuisine:"mexican",name:"Cafe Rio"},reference:{key:"cuisine",value:"mexican"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/pizza/California Pizza Kitchen":{name:"California Pizza Kitchen",icon:"maki-restaurant-pizza",imageURL:"https://graph.facebook.com/californiapizzakitchen/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q15109854",amenity:"restaurant",cuisine:"pizza"},addTags:{amenity:"restaurant",brand:"California Pizza Kitchen","brand:wikidata":"Q15109854","brand:wikipedia":"en:California Pizza Kitchen",cuisine:"pizza",name:"California Pizza Kitchen"},reference:{key:"cuisine",value:"pizza"},terms:[],matchScore:2,suggestion:true},"amenity/restaurant/italian/Carluccio's":{name:"Carluccio's",icon:"maki-restaurant",imageURL:"https://pbs.twimg.com/profile_images/553567478693908481/BWWI_wgN_bigger.jpeg",geometry:["point","area"],tags:{"brand:wikidata":"Q25111797",amenity:"restaurant",cuisine:"italian"},addTags:{amenity:"restaurant",brand:"Carluccio's","brand:wikidata":"Q25111797","brand:wikipedia":"en:Carluccio's Ltd",cuisine:"italian",name:"Carluccio's"},reference:{key:"cuisine",value:"italian"},terms:[],matchScore:2,suggestion:true},"amenity/restaurant/italian/Carrabba's Italian Grill":{name:"Carrabba's Italian Grill",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/Carrabbas/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5045999",amenity:"restaurant",cuisine:"italian"},addTags:{amenity:"restaurant",brand:"Carrabba's Italian Grill","brand:wikidata":"Q5045999","brand:wikipedia":"en:Carrabba's Italian Grill",cuisine:"italian",name:"Carrabba's Italian Grill"},reference:{key:"cuisine",value:"italian"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/american/Cheddar's":{name:"Cheddar's",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/CheddarsScratchKitchen/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5089187",amenity:"restaurant",cuisine:"american"},addTags:{amenity:"restaurant",brand:"Cheddar's","brand:wikidata":"Q5089187","brand:wikipedia":"en:Cheddar's Scratch Kitchen",cuisine:"american",name:"Cheddar's",official_name:"Cheddar's Scratch Kitchen"},reference:{key:"cuisine",value:"american"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/mexican/Chevys":{name:"Chevys",icon:"fas-pepper-hot",imageURL:"https://graph.facebook.com/ChevysFreshMex/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5094466",amenity:"restaurant",cuisine:"mexican"},addTags:{amenity:"restaurant",brand:"Chevys Fresh Mex","brand:wikidata":"Q5094466","brand:wikipedia":"en:Chevys Fresh Mex",cuisine:"mexican",name:"Chevys",official_name:"Chevys Fresh Mex"},reference:{key:"cuisine",value:"mexican"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/Chili's":{name:"Chili's",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/Chilis/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1072948",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"Chili's","brand:wikidata":"Q1072948","brand:wikipedia":"en:Chili's",cuisine:"tex-mex",name:"Chili's",official_name:"Chili's Grill & Bar"},terms:["chili's grill & bar","chili's grill and bar"],matchScore:2,suggestion:true},"amenity/restaurant/Chiquito":{name:"Chiquito",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/chiquito.restaurant/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5101775",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"Chiquito","brand:wikidata":"Q5101775","brand:wikipedia":"en:Chiquito (restaurant)",cuisine:"tex-mex",name:"Chiquito"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/pizza/Chuck E. Cheese's":{name:"Chuck E. Cheese's",icon:"maki-restaurant-pizza",imageURL:"https://graph.facebook.com/OfficialChuckECheeses/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2438391",amenity:"restaurant",cuisine:"pizza"},addTags:{amenity:"restaurant",brand:"Chuck E. Cheese's","brand:wikidata":"Q2438391","brand:wikipedia":"en:Chuck E. Cheese's",cuisine:"pizza",name:"Chuck E. Cheese's"},reference:{key:"cuisine",value:"pizza"},terms:[],matchScore:2,suggestion:true},"amenity/restaurant/pizza/Cici's Pizza":{name:"Cici's Pizza",icon:"maki-restaurant-pizza",imageURL:"https://graph.facebook.com/Cicis/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2972189",amenity:"restaurant",cuisine:"pizza"},addTags:{amenity:"restaurant",brand:"Cici's Pizza","brand:wikidata":"Q2972189","brand:wikipedia":"en:Cicis",cuisine:"pizza",name:"Cici's Pizza"},reference:{key:"cuisine",value:"pizza"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/american/Claim Jumper":{name:"Claim Jumper",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/ClaimJumperRestaurants/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5125081",amenity:"restaurant",cuisine:"american"},addTags:{amenity:"restaurant",brand:"Claim Jumper","brand:wikidata":"Q5125081","brand:wikipedia":"en:Claim Jumper",cuisine:"american",name:"Claim Jumper",operator:"Landry's","operator:wikidata":"Q3217105","operator:wikipedia":"en:Landry's, Inc."},reference:{key:"cuisine",value:"american"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/Cosmo":{name:"Cosmo",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/CosmoRestaurants/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5174239",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"Cosmo","brand:wikidata":"Q5174239","brand:wikipedia":"en:Cosmo (restaurant)",name:"Cosmo"},countryCodes:["gb","ie"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/french/Courtepaille":{name:"Courtepaille",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/GrillCourtePaille/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3116688",amenity:"restaurant",cuisine:"french"},addTags:{amenity:"restaurant",brand:"Courtepaille","brand:wikidata":"Q3116688","brand:wikipedia":"fr:Grill Courtepaille",cuisine:"french",name:"Courtepaille"},reference:{key:"cuisine",value:"french"},terms:[],matchScore:2,suggestion:true},"amenity/restaurant/american/Cracker Barrel":{name:"Cracker Barrel",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/crackerbarrel/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4492609",amenity:"restaurant",cuisine:"american"},addTags:{amenity:"restaurant",brand:"Cracker Barrel","brand:wikidata":"Q4492609","brand:wikipedia":"en:Cracker Barrel",cuisine:"american",name:"Cracker Barrel",official_name:"Cracker Barrel Old Country Store",shop:"gift"},reference:{key:"cuisine",value:"american"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/american/Denny's":{name:"Denny's",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/dennys/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1189695",amenity:"restaurant",cuisine:"american"},addTags:{amenity:"restaurant",brand:"Denny's","brand:wikidata":"Q1189695","brand:wikipedia":"en:Denny's",cuisine:"american",name:"Denny's"},reference:{key:"cuisine",value:"american"},terms:[],matchScore:2,suggestion:true},"amenity/restaurant/Dickey's Barbecue Pit":{name:"Dickey's Barbecue Pit",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/dickeysbarbecuepit/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q19880747",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"Dickey's Barbecue Pit","brand:wikidata":"Q19880747","brand:wikipedia":"en:Dickey's Barbecue Pit",cuisine:"barbecue",name:"Dickey's Barbecue Pit"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/pizza/Donatos Pizza":{name:"Donatos Pizza",icon:"maki-restaurant-pizza",imageURL:"https://graph.facebook.com/DonatosPizza/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1240741",amenity:"restaurant",cuisine:"pizza"},addTags:{amenity:"restaurant",brand:"Donatos Pizza","brand:wikidata":"Q1240741","brand:wikipedia":"en:Donatos Pizza",cuisine:"pizza",name:"Donatos Pizza",takeaway:"yes"},reference:{key:"cuisine",value:"pizza"},countryCodes:["us"],terms:["donatos"],matchScore:2,suggestion:true},"amenity/restaurant/italian/East Side Mario's":{name:"East Side Mario's",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/eastsidemarios/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5329375",amenity:"restaurant",cuisine:"italian"},addTags:{amenity:"restaurant",brand:"East Side Mario's","brand:wikidata":"Q5329375","brand:wikipedia":"en:East Side Mario's",cuisine:"italian",name:"East Side Mario's"},reference:{key:"cuisine",value:"italian"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/Famous Dave's":{name:"Famous Dave's",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/famousdaves/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5433448",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"Famous Dave's","brand:wikidata":"Q5433448","brand:wikipedia":"en:Famous Dave's",cuisine:"barbecue",name:"Famous Dave's"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/american/First Watch":{name:"First Watch",icon:"maki-restaurant",geometry:["point","area"],tags:{"brand:wikidata":"Q5454064",amenity:"restaurant",cuisine:"american"},addTags:{amenity:"restaurant",brand:"First Watch","brand:wikidata":"Q5454064","brand:wikipedia":"en:First Watch (restaurant chain)",cuisine:"american",name:"First Watch"},reference:{key:"cuisine",value:"american"},terms:[],matchScore:2,suggestion:true},"amenity/restaurant/french/Flunch":{name:"Flunch",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/flunch/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q629326",amenity:"restaurant",cuisine:"french"},addTags:{amenity:"restaurant",brand:"Flunch","brand:wikidata":"Q629326","brand:wikipedia":"en:Flunch",cuisine:"french",name:"Flunch"},reference:{key:"cuisine",value:"french"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/american/Foster's Hollywood":{name:"Foster's Hollywood",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/fostershollywood/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5864366",amenity:"restaurant",cuisine:"american"},addTags:{amenity:"restaurant",brand:"Foster's Hollywood","brand:wikidata":"Q5864366","brand:wikipedia":"en:Foster's Hollywood",cuisine:"american",name:"Foster's Hollywood"},reference:{key:"cuisine",value:"american"},countryCodes:["es"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/italian/Frankie & Benny's":{name:"Frankie & Benny's",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/frankiebennys/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5490892",amenity:"restaurant",cuisine:"italian"},addTags:{amenity:"restaurant",brand:"Frankie & Benny's","brand:wikidata":"Q5490892","brand:wikipedia":"en:Frankie & Benny's",cuisine:"italian",name:"Frankie & Benny's"},reference:{key:"cuisine",value:"italian"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/Freshii":{name:"Freshii",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/freshii/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5503051",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"Freshii","brand:wikidata":"Q5503051","brand:wikipedia":"en:Freshii",cuisine:"salad",name:"Freshii"},terms:[],matchScore:2,suggestion:true},"amenity/restaurant/american/Friendly's":{name:"Friendly's",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/friendlys/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1464513",amenity:"restaurant",cuisine:"american"},addTags:{amenity:"restaurant",brand:"Friendly's","brand:wikidata":"Q1464513","brand:wikipedia":"en:Friendly's",cuisine:"american",name:"Friendly's"},reference:{key:"cuisine",value:"american"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/Frisch's Big Boy":{name:"Frisch's Big Boy",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/frischsbigboy/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5504660",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"Frisch's Big Boy","brand:wikidata":"Q5504660","brand:wikipedia":"en:Frisch's",cuisine:"burger",name:"Frisch's Big Boy",takeaway:"yes"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/Fuddruckers":{name:"Fuddruckers",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/fuddruckers/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5507056",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"Fuddruckers","brand:wikidata":"Q5507056","brand:wikipedia":"en:Fuddruckers",cuisine:"burger",name:"Fuddruckers"},terms:[],matchScore:2,suggestion:true},"amenity/restaurant/pizza/Godfather's Pizza":{name:"Godfather's Pizza",icon:"maki-restaurant-pizza",geometry:["point","area"],tags:{"brand:wikidata":"Q5576353",amenity:"restaurant",cuisine:"pizza"},addTags:{amenity:"restaurant",brand:"Godfather's Pizza","brand:wikidata":"Q5576353","brand:wikipedia":"en:Godfather's Pizza",cuisine:"pizza",name:"Godfather's Pizza"},reference:{key:"cuisine",value:"pizza"},terms:[],matchScore:2,suggestion:true},"amenity/restaurant/american/Golden Corral":{name:"Golden Corral",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/goldencorral/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4039560",amenity:"restaurant",cuisine:"american"},addTags:{amenity:"restaurant",brand:"Golden Corral","brand:wikidata":"Q4039560","brand:wikipedia":"en:Golden Corral",cuisine:"american",name:"Golden Corral"},reference:{key:"cuisine",value:"american"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/Gourmet Burger Kitchen":{name:"Gourmet Burger Kitchen",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/gourmetburgerkitchen/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5588445",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"Gourmet Burger Kitchen","brand:wikidata":"Q5588445","brand:wikipedia":"en:Gourmet Burger Kitchen",cuisine:"burger",name:"Gourmet Burger Kitchen"},terms:[],matchScore:2,suggestion:true},"amenity/restaurant/Hans im Glück":{name:"Hans im Glück",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/hansimglueck.burgergrill/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q22569868",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"Hans im Glück","brand:wikidata":"Q22569868","brand:wikipedia":"de:Hans im Glück (Restaurantkette)",cuisine:"burger",name:"Hans im Glück"},countryCodes:["at","ch","de","sg"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/american/Hard Rock Cafe":{name:"Hard Rock Cafe",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/hardrock/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q918151",amenity:"restaurant",cuisine:"american"},addTags:{amenity:"restaurant",brand:"Hard Rock Cafe","brand:wikidata":"Q918151","brand:wikipedia":"en:Hard Rock Cafe",cuisine:"american",name:"Hard Rock Cafe"},reference:{key:"cuisine",value:"american"},terms:[],matchScore:2,suggestion:true},"amenity/restaurant/american/Harvester":{name:"Harvester",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/harvesterrestaurant/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5676915",amenity:"restaurant",cuisine:"american"},addTags:{amenity:"restaurant",brand:"Harvester","brand:wikidata":"Q5676915","brand:wikipedia":"en:Harvester (restaurant)",cuisine:"american",name:"Harvester"},reference:{key:"cuisine",value:"american"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/Hippopotamus":{name:"Hippopotamus",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/Hippopotamus/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3136174",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"Hippopotamus","brand:wikidata":"Q3136174","brand:wikipedia":"fr:Hippopotamus (restaurant)",cuisine:"steak_house",name:"Hippopotamus"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/Hooters":{name:"Hooters",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/hooters/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1025921",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"Hooters","brand:wikidata":"Q1025921","brand:wikipedia":"en:Hooters",cuisine:"burger",name:"Hooters"},terms:[],matchScore:2,suggestion:true},"amenity/restaurant/american/Huddle House":{name:"Huddle House",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/HuddleHouse/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5928324",amenity:"restaurant",cuisine:"american"},addTags:{amenity:"restaurant",brand:"Huddle House","brand:wikidata":"Q5928324","brand:wikipedia":"en:Huddle House",cuisine:"american",name:"Huddle House"},reference:{key:"cuisine",value:"american"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/IHOP":{name:"IHOP",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/IHOP/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1185675",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"IHOP","brand:wikidata":"Q1185675","brand:wikipedia":"en:IHOP",cuisine:"breakfast;pancake",name:"IHOP"},terms:[],matchScore:2,suggestion:true},"amenity/restaurant/american/IL Патио":{name:"IL Патио",icon:"maki-restaurant",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FRosInter.png&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q4397763",amenity:"restaurant",cuisine:"american"},addTags:{amenity:"restaurant",brand:"IL Патио","brand:wikidata":"Q4397763","brand:wikipedia":"en:Росинтер",cuisine:"american",name:"IL Патио"},reference:{key:"cuisine",value:"american"},terms:[],matchScore:2,suggestion:true},"amenity/restaurant/Jason's Deli":{name:"Jason's Deli",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/JasonsDeli/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q16997641",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"Jason's Deli","brand:wikidata":"Q16997641","brand:wikipedia":"en:Jason's Deli",cuisine:"sandwich",name:"Jason's Deli"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/pizza/Jet's Pizza":{name:"Jet's Pizza",icon:"maki-restaurant-pizza",imageURL:"https://graph.facebook.com/JetsPizza/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q16997713",amenity:"restaurant",cuisine:"pizza"},addTags:{amenity:"restaurant",brand:"Jet's Pizza","brand:wikidata":"Q16997713","brand:wikipedia":"en:Jet's Pizza",cuisine:"pizza",name:"Jet's Pizza"},reference:{key:"cuisine",value:"pizza"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/seafood/Joe's Crab Shack":{name:"Joe's Crab Shack",icon:"maki-restaurant-seafood",imageURL:"https://graph.facebook.com/joescrabshack/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6208210",amenity:"restaurant",cuisine:"seafood"},addTags:{amenity:"restaurant",brand:"Joe's Crab Shack","brand:wikidata":"Q6208210","brand:wikipedia":"en:Joe's Crab Shack",cuisine:"seafood",name:"Joe's Crab Shack"},reference:{key:"cuisine",value:"seafood"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/italian/Johnny Carino’s":{name:"Johnny Carino’s",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/carinositalian/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5039637",amenity:"restaurant",cuisine:"italian"},addTags:{amenity:"restaurant",brand:"Johnny Carino’s","brand:wikidata":"Q5039637","brand:wikipedia":"en:Carino's Italian",cuisine:"italian",name:"Johnny Carino’s"},reference:{key:"cuisine",value:"italian"},countryCodes:["us"],terms:["carinios"],matchScore:2,suggestion:true},"amenity/restaurant/Johnny Rockets":{name:"Johnny Rockets",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/johnnyrockets/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1051593",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"Johnny Rockets","brand:wikidata":"Q1051593","brand:wikipedia":"en:Johnny Rockets",cuisine:"burger",name:"Johnny Rockets"},terms:[],matchScore:2,suggestion:true},"amenity/restaurant/american/Kelsey's":{name:"Kelsey's",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/KelseysRestaurants/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6386459",amenity:"restaurant",cuisine:"american"},addTags:{amenity:"restaurant",brand:"Kelsey's","brand:wikidata":"Q6386459","brand:wikipedia":"en:Kelseys Original Roadhouse",cuisine:"american",name:"Kelsey's"},reference:{key:"cuisine",value:"american"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/Kudu":{name:"Kudu",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/KuduRestaurants/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6441777",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"Kudu","brand:wikidata":"Q6441777","brand:wikipedia":"en:Kudu (restaurant)",cuisine:"sandwich",name:"Kudu"},countryCodes:["sa"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/La Boucherie":{name:"La Boucherie",icon:"maki-restaurant",geometry:["point","area"],tags:{"brand:wikidata":"Q21427479",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"La Boucherie","brand:wikidata":"Q21427479","brand:wikipedia":"fr:La Boucherie (restaurant)",cuisine:"steak_house",name:"La Boucherie"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/pizza/LaRosa's Pizzeria":{name:"LaRosa's Pizzeria",icon:"maki-restaurant-pizza",imageURL:"https://graph.facebook.com/LaRosasPizzeria/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6460833",amenity:"restaurant",cuisine:"pizza"},addTags:{amenity:"restaurant",brand:"LaRosa's Pizzeria","brand:wikidata":"Q6460833","brand:wikipedia":"en:LaRosa's Pizzeria",cuisine:"pizza",name:"LaRosa's Pizzeria",takeaway:"yes"},reference:{key:"cuisine",value:"pizza"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/american/Logan's Roadhouse":{name:"Logan's Roadhouse",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/Logans.Roadhouse/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6666872",amenity:"restaurant",cuisine:"american"},addTags:{amenity:"restaurant",brand:"Logan's Roadhouse","brand:wikidata":"Q6666872","brand:wikipedia":"en:Logan's Roadhouse",cuisine:"american",name:"Logan's Roadhouse"},reference:{key:"cuisine",value:"american"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/LongHorn Steakhouse":{name:"LongHorn Steakhouse",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/longhornsteakhouse/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3259007",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"LongHorn Steakhouse","brand:wikidata":"Q3259007","brand:wikipedia":"en:LongHorn Steakhouse",cuisine:"steak_house",name:"LongHorn Steakhouse"},terms:[],matchScore:2,suggestion:true},"amenity/restaurant/Loving Hut":{name:"Loving Hut",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/LovingHutUSA/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3491655",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"Loving Hut","brand:wikidata":"Q3491655","brand:wikipedia":"en:Loving Hut",cuisine:"international","diet:vegan":"only","diet:vegetarian":"only",name:"Loving Hut"},terms:[],matchScore:2,suggestion:true},"amenity/restaurant/Léon de Bruxelles":{name:"Léon de Bruxelles",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/leondebruxellesofficiel/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q21041507",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"Léon de Bruxelles","brand:wikidata":"Q21041507","brand:wikipedia":"en:Léon de Bruxelles",cuisine:"friture",name:"Léon de Bruxelles"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/thai/MK Restaurants":{name:"MK Restaurants",icon:"maki-restaurant-noodle",imageURL:"https://graph.facebook.com/mkrestaurants/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62075359",amenity:"restaurant",cuisine:"thai"},addTags:{amenity:"restaurant",brand:"MK Restaurants","brand:wikidata":"Q62075359",cuisine:"thai",name:"MK Restaurants"},reference:{key:"cuisine",value:"thai"},terms:[],matchScore:2,suggestion:true},"amenity/restaurant/pizza/MOD Pizza":{name:"MOD Pizza",icon:"maki-restaurant-pizza",imageURL:"https://graph.facebook.com/MODPizza/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q19903469",amenity:"restaurant",cuisine:"pizza"},addTags:{amenity:"restaurant",brand:"MOD Pizza","brand:wikidata":"Q19903469","brand:wikipedia":"en:MOD Pizza",cuisine:"pizza",name:"MOD Pizza"},reference:{key:"cuisine",value:"pizza"},terms:[],matchScore:2,suggestion:true},"amenity/restaurant/pizza/Marco's Pizza":{name:"Marco's Pizza",icon:"maki-restaurant-pizza",imageURL:"https://graph.facebook.com/MarcosPizza/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6757382",amenity:"restaurant",cuisine:"pizza"},addTags:{amenity:"restaurant",brand:"Marco's Pizza","brand:wikidata":"Q6757382","brand:wikipedia":"en:Marco's Pizza",cuisine:"pizza",name:"Marco's Pizza"},reference:{key:"cuisine",value:"pizza"},terms:[],matchScore:2,suggestion:true},"amenity/restaurant/asian/Max's Restaurant":{name:"Max's Restaurant",icon:"maki-restaurant-noodle",imageURL:"https://graph.facebook.com/MaxsRestaurantNA/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6794477",amenity:"restaurant",cuisine:"asian"},addTags:{amenity:"restaurant",brand:"Max's Restaurant","brand:wikidata":"Q6794477","brand:wikipedia":"en:Max's of Manila",cuisine:"asian",name:"Max's Restaurant"},reference:{key:"cuisine",value:"asian"},countryCodes:["ph"],terms:["maxs of manila"],matchScore:2,suggestion:true},"amenity/restaurant/McAlister's Deli":{name:"McAlister's Deli",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/mcalistersdeli/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q17020829",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"McAlister's Deli","brand:wikidata":"Q17020829","brand:wikipedia":"en:McAlister's Deli",cuisine:"sandwich",name:"McAlister's Deli"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/pizza/Mellow Mushroom":{name:"Mellow Mushroom",icon:"maki-restaurant-pizza",imageURL:"https://graph.facebook.com/mellowmushroom/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q17021360",amenity:"restaurant",cuisine:"pizza"},addTags:{amenity:"restaurant",brand:"Mellow Mushroom","brand:wikidata":"Q17021360","brand:wikipedia":"en:Mellow Mushroom",cuisine:"pizza",name:"Mellow Mushroom"},reference:{key:"cuisine",value:"pizza"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/french/Mimi's Cafe":{name:"Mimi's Cafe",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/mimiscafe/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q17022081",amenity:"restaurant",cuisine:"french"},addTags:{amenity:"restaurant",brand:"Mimi's Cafe","brand:wikidata":"Q17022081","brand:wikipedia":"en:Mimi's Cafe",cuisine:"french",name:"Mimi's Cafe"},reference:{key:"cuisine",value:"french"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/pizza/Mountain Mike's":{name:"Mountain Mike's",icon:"maki-restaurant-pizza",imageURL:"https://graph.facebook.com/mountainmikes/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6925120",amenity:"restaurant",cuisine:"pizza"},addTags:{alt_name:"Mountain Mike's Pizza",amenity:"restaurant",brand:"Mountain Mike's","brand:wikidata":"Q6925120","brand:wikipedia":"en:Mountain Mike's Pizza",cuisine:"pizza",name:"Mountain Mike's",takeaway:"yes"},reference:{key:"cuisine",value:"pizza"},countryCodes:["us"],terms:["mountain mike's pizza"],matchScore:2,suggestion:true},"amenity/restaurant/Nando's":{name:"Nando's",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/NandosUSA/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3472954",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"Nando's","brand:wikidata":"Q3472954","brand:wikipedia":"en:Nando's",cuisine:"chicken;portuguese",name:"Nando's"},terms:[],matchScore:2,suggestion:true},"amenity/restaurant/Noodles & Company":{name:"Noodles & Company",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/noodlesandcompany/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7049673",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"Noodles & Company","brand:wikidata":"Q7049673","brand:wikipedia":"en:Noodles & Company",cuisine:"pasta",name:"Noodles & Company"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/american/O'Charley's":{name:"O'Charley's",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/ocharleysfans/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7071703",amenity:"restaurant",cuisine:"american"},addTags:{amenity:"restaurant",brand:"O'Charley's","brand:wikidata":"Q7071703","brand:wikipedia":"en:O'Charley's",cuisine:"american",name:"O'Charley's"},reference:{key:"cuisine",value:"american"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/seafood/Ocean Basket":{name:"Ocean Basket",icon:"maki-restaurant-seafood",imageURL:"https://graph.facebook.com/daoceanbasket/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62075311",amenity:"restaurant",cuisine:"seafood"},addTags:{amenity:"restaurant",brand:"Ocean Basket","brand:wikidata":"Q62075311",cuisine:"seafood",name:"Ocean Basket"},reference:{key:"cuisine",value:"seafood"},countryCodes:["za"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/american/Old Wild West":{name:"Old Wild West",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/OWWofficial/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q25402475",amenity:"restaurant",cuisine:"american"},addTags:{amenity:"restaurant",brand:"Old Wild West","brand:wikidata":"Q25402475","brand:wikipedia":"it:Old Wild West",cuisine:"american",name:"Old Wild West"},reference:{key:"cuisine",value:"american"},countryCodes:["it"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/italian/Olive Garden":{name:"Olive Garden",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/OliveGarden/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3045312",amenity:"restaurant",cuisine:"italian"},addTags:{amenity:"restaurant",brand:"Olive Garden","brand:wikidata":"Q3045312","brand:wikipedia":"en:Olive Garden",cuisine:"italian",name:"Olive Garden"},reference:{key:"cuisine",value:"italian"},terms:[],matchScore:2,suggestion:true},"amenity/restaurant/On The Border":{name:"On The Border",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/OnTheBorderMexicanGrillandCantina/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7091305",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"On The Border","brand:wikidata":"Q7091305","brand:wikipedia":"en:On the Border Mexican Grill & Cantina",cuisine:"burger",name:"On The Border",official_name:"On The Border Mexican Grill & Cantina"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/american/Outback Steakhouse":{name:"Outback Steakhouse",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/outback/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1064893",amenity:"restaurant",cuisine:"american"},addTags:{amenity:"restaurant",brand:"Outback Steakhouse","brand:wikidata":"Q1064893","brand:wikipedia":"en:Outback Steakhouse",cuisine:"american",name:"Outback Steakhouse"},reference:{key:"cuisine",value:"american"},terms:[],matchScore:2,suggestion:true},"amenity/restaurant/asian/P.F. Chang's":{name:"P.F. Chang's",icon:"maki-restaurant-noodle",imageURL:"https://graph.facebook.com/pfchangs/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5360181",amenity:"restaurant",cuisine:"asian"},addTags:{amenity:"restaurant",brand:"P.F. Chang's","brand:wikidata":"Q5360181","brand:wikipedia":"en:P. F. Chang's China Bistro",cuisine:"asian",name:"P.F. Chang's"},reference:{key:"cuisine",value:"asian"},terms:[],matchScore:2,suggestion:true},"amenity/restaurant/Pardos Chicken":{name:"Pardos Chicken",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/pardoschicken/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q17624435",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"Pardos Chicken","brand:wikidata":"Q17624435","brand:wikipedia":"en:Pardos chicken",cuisine:"peruvian",name:"Pardos Chicken"},countryCodes:["pe"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/asian/Pei Wei":{name:"Pei Wei",icon:"maki-restaurant-noodle",imageURL:"https://graph.facebook.com/peiwei/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7160898",amenity:"restaurant",cuisine:"asian"},addTags:{amenity:"restaurant",brand:"Pei Wei","brand:wikidata":"Q7160898","brand:wikipedia":"en:Pei Wei Asian Diner",cuisine:"asian",name:"Pei Wei"},reference:{key:"cuisine",value:"asian"},terms:["pei wei asian diner"],matchScore:2,suggestion:true},"amenity/restaurant/american/Perkins":{name:"Perkins",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/eatatperkins/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7169056",amenity:"restaurant",cuisine:"american"},addTags:{amenity:"restaurant",brand:"Perkins","brand:wikidata":"Q7169056","brand:wikipedia":"en:Perkins Restaurant and Bakery",cuisine:"american",name:"Perkins",official_name:"Perkins Restaurant and Bakery"},reference:{key:"cuisine",value:"american"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/vietnamese/Phở 24":{name:"Phở 24",icon:"maki-restaurant-noodle",imageURL:"https://graph.facebook.com/pho24.24giavitinhte/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q63863118",amenity:"restaurant",cuisine:"vietnamese;noodle"},addTags:{amenity:"restaurant",brand:"Phở Hòa","brand:wikidata":"Q63863118",cuisine:"vietnamese;noodle",name:"Phở 24","name:en":"Pho 24","name:vi":"Phở 24"},reference:{key:"cuisine",value:"vietnamese"},terms:[],matchScore:2,suggestion:true},"amenity/restaurant/vietnamese/Phở Hòa":{name:"Phở Hòa",icon:"maki-restaurant-noodle",imageURL:"https://graph.facebook.com/phohoanoodlesoup/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q55629932",amenity:"restaurant",cuisine:"vietnamese;noodle"},addTags:{alt_name:"Phở Hoà","alt_name:en":"Pho Hoa","alt_name:vi":"Phở Hoà",amenity:"restaurant",brand:"Phở Hòa","brand:wikidata":"Q55629932","brand:wikipedia":"en:Phở Hòa",cuisine:"vietnamese;noodle",name:"Phở Hòa","name:vi":"Phở Hòa"},reference:{key:"cuisine",value:"vietnamese"},terms:[],matchScore:2,suggestion:true},"amenity/restaurant/pizza/Pieology Pizzeria":{name:"Pieology Pizzeria",icon:"maki-restaurant-pizza",imageURL:"https://graph.facebook.com/pieology/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q60746053",amenity:"restaurant",cuisine:"pizza"},addTags:{amenity:"restaurant",brand:"Pieology Pizzeria","brand:wikidata":"Q60746053","brand:wikipedia":"en:Pieology",cuisine:"pizza",name:"Pieology Pizzeria"},reference:{key:"cuisine",value:"pizza"},countryCodes:["us"],terms:["pieology"],matchScore:2,suggestion:true},"amenity/restaurant/pizza/Pizza Factory":{name:"Pizza Factory",icon:"maki-restaurant-pizza",imageURL:"https://graph.facebook.com/pizzafactoryinc/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q39054369",amenity:"restaurant",cuisine:"pizza"},addTags:{amenity:"restaurant",brand:"Pizza Factory","brand:wikidata":"Q39054369","brand:wikipedia":"en:Pizza Factory",cuisine:"pizza",name:"Pizza Factory"},reference:{key:"cuisine",value:"pizza"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/pizza/Pizza Hut":{name:"Pizza Hut",icon:"maki-restaurant-pizza",imageURL:"https://graph.facebook.com/pizzahutus/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q191615",amenity:"restaurant",cuisine:"pizza"},addTags:{amenity:"restaurant",brand:"Pizza Hut","brand:wikidata":"Q191615","brand:wikipedia":"en:Pizza Hut",cuisine:"pizza",name:"Pizza Hut"},reference:{key:"cuisine",value:"pizza"},terms:[],matchScore:2,suggestion:true},"amenity/restaurant/pizza/Pizza Ranch":{name:"Pizza Ranch",icon:"maki-restaurant-pizza",imageURL:"https://graph.facebook.com/PizzaRanchRestaurants/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7199978",amenity:"restaurant",cuisine:"pizza"},addTags:{amenity:"restaurant",brand:"Pizza Ranch","brand:wikidata":"Q7199978","brand:wikipedia":"en:Pizza Ranch",cuisine:"pizza",name:"Pizza Ranch"},reference:{key:"cuisine",value:"pizza"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/pizza/PizzaExpress":{name:"PizzaExpress",icon:"maki-restaurant-pizza",imageURL:"https://graph.facebook.com/pizzaexpress/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q662845",amenity:"restaurant",cuisine:"pizza"},addTags:{amenity:"restaurant",brand:"PizzaExpress","brand:wikidata":"Q662845","brand:wikipedia":"en:PizzaExpress",cuisine:"pizza",name:"PizzaExpress"},reference:{key:"cuisine",value:"pizza"},terms:[],matchScore:2,suggestion:true},"amenity/restaurant/french/Poivre Rouge":{name:"Poivre Rouge",icon:"maki-restaurant",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FLogo%20Restaumarch%C3%A9.jpg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q7316076",amenity:"restaurant",cuisine:"french"},addTags:{amenity:"restaurant",brand:"Poivre Rouge","brand:wikidata":"Q7316076","brand:wikipedia":"fr:Poivre Rouge (restauration)",cuisine:"french",name:"Poivre Rouge"},reference:{key:"cuisine",value:"french"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/italian/Prezzo":{name:"Prezzo",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/loveprezzo/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7242489",amenity:"restaurant",cuisine:"italian"},addTags:{amenity:"restaurant",brand:"Prezzo","brand:wikidata":"Q7242489","brand:wikipedia":"en:Prezzo (restaurant)",cuisine:"italian",name:"Prezzo"},reference:{key:"cuisine",value:"italian"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/seafood/Red Lobster":{name:"Red Lobster",icon:"maki-restaurant-seafood",imageURL:"https://graph.facebook.com/redlobster/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q846301",amenity:"restaurant",cuisine:"seafood"},addTags:{amenity:"restaurant",brand:"Red Lobster","brand:wikidata":"Q846301","brand:wikipedia":"en:Red Lobster",cuisine:"seafood",name:"Red Lobster"},reference:{key:"cuisine",value:"seafood"},terms:[],matchScore:2,suggestion:true},"amenity/restaurant/Red Robin":{name:"Red Robin",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/RedRobin/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7304886",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"Red Robin","brand:wikidata":"Q7304886","brand:wikipedia":"en:Red Robin",cuisine:"burger",name:"Red Robin",official_name:"Red Robin Gourmet Burgers and Brews"},terms:[],matchScore:2,suggestion:true},"amenity/restaurant/italian/Romano's Macaroni Grill":{name:"Romano's Macaroni Grill",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/RomanosMacaroniGrill/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7362714",amenity:"restaurant",cuisine:"italian"},addTags:{amenity:"restaurant",brand:"Romano's Macaroni Grill","brand:wikidata":"Q7362714","brand:wikipedia":"en:Romano's Macaroni Grill",cuisine:"italian",name:"Romano's Macaroni Grill"},reference:{key:"cuisine",value:"italian"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/pizza/Round Table Pizza":{name:"Round Table Pizza",icon:"maki-restaurant-pizza",imageURL:"https://graph.facebook.com/RoundTablePizza/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7371139",amenity:"restaurant",cuisine:"pizza"},addTags:{amenity:"restaurant",brand:"Round Table Pizza","brand:wikidata":"Q7371139","brand:wikipedia":"en:Round Table Pizza",cuisine:"pizza",name:"Round Table Pizza"},reference:{key:"cuisine",value:"pizza"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/american/Ruby Tuesday":{name:"Ruby Tuesday",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/rubytuesday/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7376400",amenity:"restaurant",cuisine:"american"},addTags:{amenity:"restaurant",brand:"Ruby Tuesday","brand:wikidata":"Q7376400","brand:wikipedia":"en:Ruby Tuesday (restaurant)",cuisine:"american",name:"Ruby Tuesday"},reference:{key:"cuisine",value:"american"},terms:[],matchScore:2,suggestion:true},"amenity/restaurant/american/Ruth's Chris Steak House":{name:"Ruth's Chris Steak House",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/RuthsChrisSteakHouseNational/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7382829",amenity:"restaurant",cuisine:"american"},addTags:{amenity:"restaurant",brand:"Ruth's Chris Steak House","brand:wikidata":"Q7382829","brand:wikipedia":"en:Ruth's Chris Steak House",cuisine:"american",name:"Ruth's Chris Steak House"},reference:{key:"cuisine",value:"american"},countryCodes:["ca","mx","us"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/pizza/Shakey's":{name:"Shakey's",icon:"maki-restaurant-pizza",imageURL:"https://graph.facebook.com/shakeyspizzaparlorusa/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6134929",amenity:"restaurant",cuisine:"pizza"},addTags:{amenity:"restaurant",brand:"Shakey's","brand:wikidata":"Q6134929","brand:wikipedia":"en:Shakey's Pizza",cuisine:"pizza",name:"Shakey's"},reference:{key:"cuisine",value:"pizza"},terms:[],matchScore:2,suggestion:true},"amenity/restaurant/american/Shari's":{name:"Shari's",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/SharisPies/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7489612",amenity:"restaurant",cuisine:"american"},addTags:{amenity:"restaurant",brand:"Shari's","brand:wikidata":"Q7489612","brand:wikipedia":"en:Shari's Cafe & Pies",cuisine:"american",name:"Shari's"},reference:{key:"cuisine",value:"american"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/american/Shoney's":{name:"Shoney's",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/shoneys/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7500392",amenity:"restaurant",cuisine:"american"},addTags:{amenity:"restaurant",brand:"Shoney's","brand:wikidata":"Q7500392","brand:wikipedia":"en:Shoney's",cuisine:"american",name:"Shoney's"},reference:{key:"cuisine",value:"american"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/Sizzler":{name:"Sizzler",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/sizzler/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1848822",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"Sizzler","brand:wikidata":"Q1848822","brand:wikipedia":"en:Sizzler",cuisine:"steak_house",name:"Sizzler"},terms:[],matchScore:2,suggestion:true},"amenity/restaurant/Skyline Chili":{name:"Skyline Chili",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/SkylineChili/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q151224",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"Skyline Chili","brand:wikidata":"Q151224","brand:wikipedia":"en:Skyline Chili",cuisine:"chili",name:"Skyline Chili",takeaway:"yes"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/Smitty's":{name:"Smitty's",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/SmittysRestaurants/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7545728",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"Smitty's","brand:wikidata":"Q7545728","brand:wikipedia":"en:Smitty's",cuisine:"pancake",name:"Smitty's"},terms:[],matchScore:2,suggestion:true},"amenity/restaurant/pizza/Snappy Tomato Pizza":{name:"Snappy Tomato Pizza",icon:"maki-restaurant-pizza",imageURL:"https://pbs.twimg.com/profile_images/849232685667168256/Wg-1LDp5_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q7547352",amenity:"restaurant",cuisine:"pizza"},addTags:{amenity:"restaurant",brand:"Snappy Tomato Pizza","brand:wikidata":"Q7547352","brand:wikipedia":"en:Snappy Tomato Pizza",cuisine:"pizza",name:"Snappy Tomato Pizza",takeaway:"yes"},reference:{key:"cuisine",value:"pizza"},countryCodes:["gb","us"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/Spur":{name:"Spur",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/SpurSteakRanches/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7581546",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"Spur","brand:wikidata":"Q7581546","brand:wikipedia":"en:Spur Steak Ranches",cuisine:"steak_house",name:"Spur"},terms:["spur steak ranches"],matchScore:2,suggestion:true},"amenity/restaurant/Steak 'n Shake":{name:"Steak 'n Shake",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/steaknshake/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7605233",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"Steak 'n Shake","brand:wikidata":"Q7605233","brand:wikipedia":"en:Steak 'n Shake",cuisine:"burger",name:"Steak 'n Shake"},terms:[],matchScore:2,suggestion:true},"amenity/restaurant/american/Sunset Grill":{name:"Sunset Grill",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/SunsetGrillBreakfast/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62112489",amenity:"restaurant",cuisine:"american"},addTags:{amenity:"restaurant",brand:"Sunset Grill","brand:wikidata":"Q62112489","brand:wikipedia":"en:Sunset Grill (Canadian restaurant chain)",cuisine:"american",name:"Sunset Grill"},reference:{key:"cuisine",value:"american"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/Swiss Chalet":{name:"Swiss Chalet",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/SwissChalet/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2372909",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"Swiss Chalet","brand:wikidata":"Q2372909","brand:wikipedia":"en:Swiss Chalet",cuisine:"chicken",name:"Swiss Chalet"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/american/TGI Friday's":{name:"TGI Friday's",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/TGIFridays/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1524184",amenity:"restaurant",cuisine:"american"},addTags:{amenity:"restaurant",brand:"TGI Friday's","brand:wikidata":"Q1524184","brand:wikipedia":"en:TGI Fridays",cuisine:"american",name:"TGI Friday's"},reference:{key:"cuisine",value:"american"},terms:[],matchScore:2,suggestion:true},"amenity/restaurant/Texas Roadhouse":{name:"Texas Roadhouse",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/texasroadhouse/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7707945",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"Texas Roadhouse","brand:wikidata":"Q7707945","brand:wikipedia":"en:Texas Roadhouse",cuisine:"steak_house",name:"Texas Roadhouse"},terms:[],matchScore:2,suggestion:true},"amenity/restaurant/american/The Cheesecake Factory":{name:"The Cheesecake Factory",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/thecheesecakefactory/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1045842",amenity:"restaurant",cuisine:"american"},addTags:{amenity:"restaurant",brand:"The Cheesecake Factory","brand:wikidata":"Q1045842","brand:wikipedia":"en:The Cheesecake Factory",cuisine:"american",name:"The Cheesecake Factory"},reference:{key:"cuisine",value:"american"},terms:["cheesecake factory"],matchScore:2,suggestion:true},"amenity/restaurant/The Keg":{name:"The Keg",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/thekegsteakhouseandbar/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7744066",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"The Keg","brand:wikidata":"Q7744066","brand:wikipedia":"en:The Keg",cuisine:"steak_house",name:"The Keg"},terms:["keg"],matchScore:2,suggestion:true},"amenity/restaurant/The Melting Pot":{name:"The Melting Pot",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/themeltingpotrestaurants/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7750948",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"The Melting Pot","brand:wikidata":"Q7750948","brand:wikipedia":"en:The Melting Pot (restaurant)",cuisine:"fondue",name:"The Melting Pot"},terms:["melting pot"],matchScore:2,suggestion:true},"amenity/restaurant/Toby Carvery":{name:"Toby Carvery",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/tobycarvery/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7811777",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"Toby Carvery","brand:wikidata":"Q7811777","brand:wikipedia":"en:Toby Carvery",cuisine:"british",name:"Toby Carvery"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/mexican/Toks":{name:"Toks",icon:"fas-pepper-hot",imageURL:"https://graph.facebook.com/ToksMx/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q48835586",amenity:"restaurant",cuisine:"mexican"},addTags:{amenity:"restaurant",brand:"Toks","brand:wikidata":"Q48835586","brand:wikipedia":"en:Toks",cuisine:"mexican",name:"Toks"},reference:{key:"cuisine",value:"mexican"},countryCodes:["mx"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/Tony Roma's":{name:"Tony Roma's",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/TonyRomas/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2213883",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"Tony Roma's","brand:wikidata":"Q2213883","brand:wikipedia":"en:Tony Roma's",cuisine:"barbecue",name:"Tony Roma's"},terms:["tony roma"],matchScore:2,suggestion:true},"amenity/restaurant/italian/Vapiano":{name:"Vapiano",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/Vapiano/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q506252",amenity:"restaurant",cuisine:"italian"},addTags:{amenity:"restaurant",brand:"Vapiano","brand:wikidata":"Q506252","brand:wikipedia":"en:Vapiano",cuisine:"italian",name:"Vapiano"},reference:{key:"cuisine",value:"italian"},terms:[],matchScore:2,suggestion:true},"amenity/restaurant/american/Village Inn":{name:"Village Inn",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/villageinnrestaurants/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7930659",amenity:"restaurant",cuisine:"american"},addTags:{amenity:"restaurant",brand:"Village Inn","brand:wikidata":"Q7930659","brand:wikipedia":"en:Village Inn",cuisine:"american",name:"Village Inn"},reference:{key:"cuisine",value:"american"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/Vips":{name:"Vips",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/VIPSMX/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q48783378",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"Vips","brand:wikidata":"Q48783378","brand:wikipedia":"es:Vips",name:"Vips"},countryCodes:["es","mx"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/american/Waffle House":{name:"Waffle House",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/WaffleHouse/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1701206",amenity:"restaurant",cuisine:"american"},addTags:{amenity:"restaurant",brand:"Waffle House","brand:wikidata":"Q1701206","brand:wikipedia":"en:Waffle House",cuisine:"american",name:"Waffle House",opening_hours:"24/7"},reference:{key:"cuisine",value:"american"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/asian/Wagamama":{name:"Wagamama",icon:"maki-restaurant-noodle",imageURL:"https://graph.facebook.com/wagamama.spain/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q503715",amenity:"restaurant",cuisine:"asian"},addTags:{amenity:"restaurant",brand:"Wagamama","brand:wikidata":"Q503715","brand:wikipedia":"en:Wagamama",cuisine:"asian",name:"Wagamama"},reference:{key:"cuisine",value:"asian"},terms:[],matchScore:2,suggestion:true},"amenity/restaurant/japanese/Wasabi":{name:"Wasabi",icon:"maki-restaurant-noodle",imageURL:"https://graph.facebook.com/WasabiUK/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q23891278",amenity:"restaurant",cuisine:"japanese"},addTags:{amenity:"restaurant",brand:"Wasabi","brand:wikidata":"Q23891278","brand:wikipedia":"en:Wasabi (restaurant)",cuisine:"japanese",name:"Wasabi"},reference:{key:"cuisine",value:"japanese"},terms:[],matchScore:2,suggestion:true},"amenity/restaurant/White Spot":{name:"White Spot",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/whitespot/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7995414",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"White Spot","brand:wikidata":"Q7995414","brand:wikipedia":"en:White Spot",cuisine:"burger",name:"White Spot"},terms:[],matchScore:2,suggestion:true},"amenity/restaurant/Wingstop":{name:"Wingstop",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/Wingstop/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q8025339",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"Wingstop","brand:wikidata":"Q8025339","brand:wikipedia":"en:Wingstop",cuisine:"wings",name:"Wingstop"},terms:[],matchScore:2,suggestion:true},"amenity/restaurant/sushi/YO! Sushi":{name:"YO! Sushi",icon:"fas-fish",imageURL:"https://graph.facebook.com/YOSushi/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3105441",amenity:"restaurant",cuisine:"sushi"},addTags:{amenity:"restaurant",brand:"YO! Sushi","brand:wikidata":"Q3105441","brand:wikipedia":"en:YO! Sushi",cuisine:"sushi",name:"YO! Sushi"},reference:{key:"cuisine",value:"sushi"},terms:[],matchScore:2,suggestion:true},"amenity/restaurant/italian/Zizzi":{name:"Zizzi",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/wearezizzi/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q8072944",amenity:"restaurant",cuisine:"italian"},addTags:{amenity:"restaurant",brand:"Zizzi","brand:wikidata":"Q8072944","brand:wikipedia":"en:Zizzi",cuisine:"italian",name:"Zizzi"},reference:{key:"cuisine",value:"italian"},terms:[],matchScore:2,suggestion:true},"amenity/restaurant/sushi/Планета Суши":{name:"Планета Суши",icon:"fas-fish",imageURL:"https://graph.facebook.com/sushiplanet.ru/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62739250",amenity:"restaurant",cuisine:"sushi"},addTags:{amenity:"restaurant",brand:"Планета Суши","brand:wikidata":"Q62739250",cuisine:"sushi",name:"Планета Суши","name:en":"Planet Sushi"},reference:{key:"cuisine",value:"sushi"},terms:[],matchScore:2,suggestion:true},"amenity/restaurant/japanese/Тануки":{name:"Тануки",icon:"maki-restaurant-noodle",imageURL:"https://graph.facebook.com/tanuki.official/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62758690",amenity:"restaurant",cuisine:"japanese"},addTags:{amenity:"restaurant",brand:"Тануки","brand:wikidata":"Q62758690",cuisine:"japanese",name:"Тануки","name:en":"Tanuki","name:ru":"Тануки"},reference:{key:"cuisine",value:"japanese"},countryCodes:["kz","ru","ua"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/いきなり!ステーキ":{name:"いきなり!ステーキ",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/ikinari.steak/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q21652405",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"いきなり!ステーキ","brand:en":"Ikinari Steak","brand:ja":"いきなり!ステーキ","brand:wikidata":"Q21652405","brand:wikipedia":"ja:いきなり!ステーキ",cuisine:"steak_house",name:"いきなり!ステーキ","name:en":"Ikinari Steak","name:ja":"いきなり!ステーキ"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/japanese/はなまるうどん":{name:"はなまるうどん",icon:"maki-restaurant-noodle",imageURL:"https://graph.facebook.com/hanamaruudon.jp/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11275674",amenity:"restaurant",cuisine:"japanese;udon"},addTags:{amenity:"restaurant",brand:"はなまるうどん","brand:en":"Hanamarūdon","brand:ja":"はなまるうどん","brand:wikidata":"Q11275674","brand:wikipedia":"ja:はなまるうどん",cuisine:"japanese;udon",name:"はなまるうどん","name:en":"Hanamarūdon","name:ja":"はなまるうどん"},reference:{key:"cuisine",value:"japanese"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/びっくりドンキー":{name:"びっくりドンキー",icon:"maki-restaurant",geometry:["point","area"],tags:{"brand:wikidata":"Q11276815",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"びっくりドンキー","brand:en":"Bikkuri Donkey","brand:ja":"びっくりドンキー","brand:wikidata":"Q11276815","brand:wikipedia":"ja:びっくりドンキー",cuisine:"burger",name:"びっくりドンキー","name:en":"Bikkuri Donkey","name:ja":"びっくりドンキー"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/japanese/やよい軒":{name:"やよい軒",icon:"maki-restaurant-noodle",imageURL:"https://graph.facebook.com/yayoiphilippines/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11280577",amenity:"restaurant",cuisine:"japanese"},addTags:{amenity:"restaurant",brand:"やよい軒","brand:en":"Yayoiken","brand:ja":"やよい軒","brand:wikidata":"Q11280577","brand:wikipedia":"ja:やよい軒",cuisine:"japanese",name:"やよい軒","name:en":"Yayoiken","name:ja":"やよい軒"},reference:{key:"cuisine",value:"japanese"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/italian/カプリチョーザ":{name:"カプリチョーザ",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/capricciosa.restaurant/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11294660",amenity:"restaurant",cuisine:"italian"},addTags:{amenity:"restaurant",brand:"カプリチョーザ","brand:en":"Capricciosa","brand:ja":"カプリチョーザ","brand:wikidata":"Q11294660","brand:wikipedia":"ja:カプリチョーザ",cuisine:"italian",name:"カプリチョーザ","name:en":"Capricciosa","name:ja":"カプリチョーザ"},reference:{key:"cuisine",value:"italian"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/japanese/ココス":{name:"ココス",icon:"maki-restaurant-noodle",imageURL:"https://pbs.twimg.com/profile_images/875584429069959169/5l38DoS7_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q11301951",amenity:"restaurant",cuisine:"western;japanese"},addTags:{amenity:"restaurant",brand:"ココス","brand:en":"Coco's","brand:ja":"ココス","brand:wikidata":"Q11301951","brand:wikipedia":"ja:ココスジャパン",cuisine:"western;japanese",name:"ココス","name:en":"Coco's","name:ja":"ココス"},reference:{key:"cuisine",value:"japanese"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/italian/サイゼリヤ":{name:"サイゼリヤ",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/Saizeriya4Fun/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q886564",amenity:"restaurant",cuisine:"italian"},addTags:{amenity:"restaurant",brand:"サイゼリヤ","brand:en":"Saizeriya","brand:ja":"サイゼリヤ","brand:wikidata":"Q886564","brand:wikipedia":"en:Saizeriya",cuisine:"italian",name:"サイゼリヤ","name:en":"Saizeriya","name:ja":"サイゼリヤ"},reference:{key:"cuisine",value:"italian"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/ジョイフル":{name:"ジョイフル",icon:"maki-restaurant",geometry:["point","area"],tags:{"brand:wikidata":"Q11310517",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"ジョイフル","brand:en":"Joyfull","brand:ja":"ジョイフル","brand:wikidata":"Q11310517","brand:wikipedia":"ja:ジョイフル",cuisine:"western",name:"ジョイフル","name:en":"Joyfull","name:ja":"ジョイフル"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/italian/ジョナサン":{name:"ジョナサン",icon:"maki-restaurant",imageURL:"https://pbs.twimg.com/profile_images/1098912743497711618/uM80VkgK_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q11310628",amenity:"restaurant",cuisine:"italian;japanese"},addTags:{amenity:"restaurant",brand:"ジョナサン","brand:en":"Jonathan's","brand:ja":"ジョナサン","brand:wikidata":"Q11310628","brand:wikipedia":"ja:ジョナサン (ファミリーレストラン)",cuisine:"italian;japanese",name:"ジョナサン","name:en":"Jonathan's","name:ja":"ジョナサン"},reference:{key:"cuisine",value:"italian"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/ジョリーパスタ":{name:"ジョリーパスタ",icon:"maki-restaurant",geometry:["point","area"],tags:{"brand:wikidata":"Q10852718",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"ジョリーパスタ","brand:en":"Jolly-Pasta","brand:ja":"ジョリーパスタ","brand:wikidata":"Q10852718","brand:wikipedia":"ja:ジョリーパスタ",cuisine:"pasta",name:"ジョリーパスタ","name:en":"Jolly-Pasta","name:ja":"ジョリーパスタ"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/ステーキガスト":{name:"ステーキガスト",icon:"maki-restaurant",geometry:["point","area"],tags:{"brand:wikidata":"Q11253593",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"ステーキガスト","brand:ja":"ステーキガスト","brand:wikidata":"Q11253593","brand:wikipedia":"ja:すかいらーく",cuisine:"steak",name:"ステーキガスト","name:ja":"ステーキガスト"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/デニーズ":{name:"デニーズ",icon:"maki-restaurant",geometry:["point","area"],tags:{"brand:wikidata":"Q11320661",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"デニーズ","brand:en":"Denny's","brand:ja":"デニーズ","brand:wikidata":"Q11320661","brand:wikipedia":"ja:デニーズ (日本)",name:"デニーズ","name:en":"Denny's","name:ja":"デニーズ"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/バーミヤン":{name:"バーミヤン",icon:"maki-restaurant",imageURL:"https://pbs.twimg.com/profile_images/1098907474789163010/uXiRaQ9S_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q11328598",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"バーミヤン","brand:en":"Bamiyan","brand:ja":"バーミヤン","brand:wikidata":"Q11328598","brand:wikipedia":"ja:バーミヤン (レストランチェーン)",name:"バーミヤン","name:en":"Bamiyan","name:ja":"バーミヤン"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/ビッグボーイ":{name:"ビッグボーイ",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/bigboyrestaurants/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4386779",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"ビッグボーイ","brand:en":"Big Boy Restaurants","brand:ja":"ビッグボーイ","brand:wikidata":"Q4386779","brand:wikipedia":"en:Big Boy Restaurants",cuisine:"burger",name:"ビッグボーイ","name:en":"Big Boy Restaurants","name:ja":"ビッグボーイ"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/japanese/リンガーハット":{name:"リンガーハット",icon:"maki-restaurant-noodle",geometry:["point","area"],tags:{"brand:wikidata":"Q7334856",amenity:"restaurant",cuisine:"japanese"},addTags:{amenity:"restaurant",brand:"リンガーハット","brand:en":"Ringer Hut","brand:ja":"リンガーハット","brand:wikidata":"Q7334856","brand:wikipedia":"en:Ringer Hut",cuisine:"japanese",name:"リンガーハット","name:en":"Ringer Hut","name:ja":"リンガーハット"},reference:{key:"cuisine",value:"japanese"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/japanese/ロイヤルホスト":{name:"ロイヤルホスト",icon:"maki-restaurant-noodle",geometry:["point","area"],tags:{"brand:wikidata":"Q11120884",amenity:"restaurant",cuisine:"japanese;italian;french"},addTags:{amenity:"restaurant",brand:"ロイヤルホスト","brand:en":"Royal Host","brand:ja":"ロイヤルホスト","brand:wikidata":"Q11120884","brand:wikipedia":"ja:ロイヤルホスト",cuisine:"japanese;italian;french",name:"ロイヤルホスト","name:en":"Royal Host","name:ja":"ロイヤルホスト"},reference:{key:"cuisine",value:"japanese"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/noodle/丸亀製麺":{name:"丸亀製麺",icon:"maki-restaurant-noodle",imageURL:"https://graph.facebook.com/marugame/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q10877253",amenity:"restaurant",cuisine:"noodle"},addTags:{amenity:"restaurant",brand:"丸亀製麺","brand:en":"Marugame Seimen","brand:ja":"丸亀製麺","brand:wikidata":"Q10877253","brand:wikipedia":"ja:丸亀製麺",cuisine:"noodle",name:"丸亀製麺","name:en":"Marugame Seimen","name:ja":"丸亀製麺"},reference:{key:"cuisine",value:"noodle"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/八方雲集":{name:"八方雲集",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/8wayTW/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q28417381",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"八方雲集","brand:en":"Eight Way","brand:wikidata":"Q28417381","brand:wikipedia":"zh:八方雲集","brand:zh":"八方雲集",name:"八方雲集","name:en":"Eight Way","name:zh":"八方雲集"},terms:[],matchScore:2,suggestion:true},"amenity/restaurant/japanese/和食さと":{name:"和食さと",icon:"maki-restaurant-noodle",imageURL:"https://graph.facebook.com/satorsgroup/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11304897",amenity:"restaurant",cuisine:"japanese"},addTags:{amenity:"restaurant",brand:"和食さと","brand:en":"Washoku Sato","brand:ja":"和食さと","brand:wikidata":"Q11304897","brand:wikipedia":"ja:SRSホールディングス",cuisine:"japanese",name:"和食さと","name:en":"Washoku Sato","name:ja":"和食さと"},reference:{key:"cuisine",value:"japanese"},countryCodes:["jp"],terms:["さと"],matchScore:2,suggestion:true},"amenity/restaurant/japanese/夢庵":{name:"夢庵",icon:"maki-restaurant-noodle",geometry:["point","area"],tags:{"brand:wikidata":"Q11253593",amenity:"restaurant",cuisine:"japanese"},addTags:{amenity:"restaurant",brand:"夢庵","brand:en":"Yumean","brand:ja":"夢庵","brand:wikidata":"Q11253593","brand:wikipedia":"ja:すかいらーく",cuisine:"japanese",name:"夢庵","name:en":"Yumean","name:ja":"夢庵"},reference:{key:"cuisine",value:"japanese"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/japanese/大戸屋":{name:"大戸屋",icon:"maki-restaurant-noodle",imageURL:"https://graph.facebook.com/ootoya/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11435522",amenity:"restaurant",cuisine:"japanese"},addTags:{amenity:"restaurant",brand:"大戸屋","brand:en":"Ootoya","brand:ja":"大戸屋","brand:wikidata":"Q11435522","brand:wikipedia":"ja:大戸屋ホールディングス",cuisine:"japanese",name:"大戸屋","name:en":"Ootoya","name:ja":"大戸屋"},reference:{key:"cuisine",value:"japanese"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/japanese/大阪王将":{name:"大阪王将",icon:"maki-restaurant-noodle",imageURL:"https://graph.facebook.com/osakaohsho/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q48743717",amenity:"restaurant",cuisine:"japanese;chinese"},addTags:{amenity:"restaurant",brand:"大阪王将","brand:en":"Osaka Ohsho","brand:ja":"大阪王将","brand:wikidata":"Q48743717","brand:wikipedia":"ja:大阪王将",cuisine:"japanese;chinese",name:"大阪王将","name:en":"Osaka Ohsho","name:ja":"大阪王将"},reference:{key:"cuisine",value:"japanese"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/天下一品":{name:"天下一品",icon:"maki-restaurant",geometry:["point","area"],tags:{"brand:wikidata":"Q11442172",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"天下一品","brand:en":"Tenkaippin","brand:wikidata":"Q11442172","brand:wikipedia":"en:Tenkaippin",cuisine:"ramen",name:"天下一品","name:en":"Tenkaippin"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/安楽亭":{name:"安楽亭",icon:"maki-restaurant",geometry:["point","area"],tags:{"brand:wikidata":"Q11450866",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"安楽亭","brand:en":"Anrakutei","brand:wikidata":"Q11450866","brand:wikipedia":"ja:安楽亭",cuisine:"barbecue",name:"安楽亭","name:en":"Anrakutei"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/japanese/木曽路":{name:"木曽路",icon:"maki-restaurant-noodle",geometry:["point","area"],tags:{"brand:wikidata":"Q11518589",amenity:"restaurant",cuisine:"japanese"},addTags:{amenity:"restaurant",brand:"木曽路","brand:wikidata":"Q11518589","brand:wikipedia":"ja:木曽路 (企業)",cuisine:"japanese",name:"木曽路"},reference:{key:"cuisine",value:"japanese"},terms:[],matchScore:2,suggestion:true},"amenity/restaurant/永和豆漿":{name:"永和豆漿",icon:"maki-restaurant",geometry:["point","area"],tags:{"brand:wikidata":"Q11131335",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"永和豆漿","brand:en":"Yonghe Soy Milk","brand:wikidata":"Q11131335","brand:wikipedia":"zh:永和豆漿",name:"永和豆漿","name:en":"Yonghe Soy Milk"},countryCodes:["tw"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/牛角":{name:"牛角",icon:"maki-restaurant",geometry:["point","area"],tags:{"brand:wikidata":"Q11349387",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"牛角","brand:en":"Gyū-Kaku","brand:wikidata":"Q11349387","brand:wikipedia":"en:Gyu-Kaku",cuisine:"barbecue",name:"牛角","name:en":"Gyū-Kaku"},terms:[],matchScore:2,suggestion:true},"amenity/restaurant/japanese/華屋与兵衛":{name:"華屋与兵衛",icon:"maki-restaurant-noodle",geometry:["point","area"],tags:{"brand:wikidata":"Q11620063",amenity:"restaurant",cuisine:"japanese"},addTags:{amenity:"restaurant",brand:"華屋与兵衛","brand:en":"Hanaya Yohei","brand:ja":"華屋与兵衛","brand:wikidata":"Q11620063","brand:wikipedia":"ja:華屋与兵衛 (レストラン)",cuisine:"japanese",name:"華屋与兵衛","name:en":"Hanaya Yohei","name:ja":"華屋与兵衛",operator:"株式会社ゼンショーホールディングス","operator:en":"Zensho Holdings Co., Ltd.","operator:ja":"株式会社ゼンショーホールディングス","operator:wikidata":"Q8069229","operator:wikipedia":"ja:ゼンショー"},reference:{key:"cuisine",value:"japanese"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/chinese/餃子の王将":{name:"餃子の王将",icon:"maki-restaurant-noodle",imageURL:"https://graph.facebook.com/ohshosaiyo/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11666805",amenity:"restaurant",cuisine:"chinese;gyoza"},addTags:{amenity:"restaurant",brand:"餃子の王将","brand:en":"Gyoza no Ohsho","brand:ja":"餃子の王将","brand:wikidata":"Q11666805","brand:wikipedia":"en:Gyoza no Ohsho",cuisine:"chinese;gyoza",name:"餃子の王将","name:en":"Gyoza no Ohsho","name:ja":"餃子の王将"},reference:{key:"cuisine",value:"chinese"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/빕스":{name:"빕스",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/ivips/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q12599540",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"빕스","brand:en":"VIPS","brand:ko":"빕스","brand:wikidata":"Q12599540","brand:wikipedia":"en:VIPS (restaurant)",name:"빕스","name:en":"VIPS","name:ko":"빕스"},countryCodes:["kr"],terms:[],matchScore:2,suggestion:true},"amenity/social_centre/American Legion Hall":{name:"American Legion Hall",icon:"fas-handshake",imageURL:"https://graph.facebook.com/americanlegionhq/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q468865",amenity:"social_centre"},addTags:{alt_name:"American Legion Hall",amenity:"social_centre",brand:"American Legion","brand:wikidata":"Q468865","brand:wikipedia":"en:American Legion",name:"American Legion Hall","social_centre:for":"veterans"},countryCodes:["us"],terms:["american legion"],matchScore:2,suggestion:true},"amenity/social_centre/Eagles Lodge":{name:"Eagles Lodge",icon:"fas-handshake",imageURL:"https://graph.facebook.com/foegrandaerie/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5493810",amenity:"social_centre"},addTags:{alt_name:"Aeries Lodge",amenity:"social_centre",brand:"Fraternal Order of Eagles","brand:wikidata":"Q5493810","brand:wikipedia":"en:Fraternal Order of Eagles",name:"Eagles Lodge",official_name:"Fraternal Order of Eagles"},countryCodes:["us"],terms:["aeries lodge","foe","fraternal order of eagles"],matchScore:2,suggestion:true},"amenity/social_centre/Elks Lodge":{name:"Elks Lodge",icon:"fas-handshake",geometry:["point","area"],tags:{"brand:wikidata":"Q2895789",amenity:"social_centre"},addTags:{amenity:"social_centre",brand:"Benevolent and Protective Order of Elks","brand:wikidata":"Q2895789","brand:wikipedia":"en:Benevolent and Protective Order of Elks",name:"Elks Lodge",official_name:"Benevolent and Protective Order of Elks"},countryCodes:["us"],terms:["benevolent and protective order of elks","bpoe","elks"],matchScore:2,suggestion:true},"amenity/social_centre/Moose Lodge":{name:"Moose Lodge",icon:"fas-handshake",imageURL:"https://graph.facebook.com/heardofmoose/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6908585",amenity:"social_centre"},addTags:{alt_name:"Moose Lodge",amenity:"social_centre",brand:"Loyal Order of Moose","brand:wikidata":"Q6908585","brand:wikipedia":"en:Loyal Order of Moose",name:"Moose Lodge",official_name:"Loyal Order of Moose"},countryCodes:["bm","ca","us"],terms:["loyal order of moose"],matchScore:2,suggestion:true},"amenity/social_centre/Odd Fellows Hall":{name:"Odd Fellows Hall",icon:"fas-handshake",imageURL:"https://graph.facebook.com/IOOFSGL/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1425508",amenity:"social_centre"},addTags:{amenity:"social_centre",brand:"Independent Order of Odd Fellows","brand:wikidata":"Q1425508","brand:wikipedia":"en:Independent Order of Odd Fellows",name:"Odd Fellows Hall",official_name:"Independent Order of Odd Fellows"},terms:["independent order of odd fellows","ioof","odd fellow","odd fellows"],matchScore:2,suggestion:true},"amenity/vending_machine/parcel_pickup/Amazon Locker":{name:"Amazon Locker",icon:"temaki-vending_machine",imageURL:"https://graph.facebook.com/amazon/picture?type=large",geometry:["point"],tags:{"brand:wikidata":"Q16974764",amenity:"vending_machine",vending:"parcel_pickup"},addTags:{amenity:"vending_machine",brand:"Amazon Locker","brand:wikidata":"Q16974764","brand:wikipedia":"en:Amazon Locker",name:"Amazon Locker",vending:"parcel_pickup"},reference:{key:"vending",value:"parcel_pickup"},terms:[],matchScore:2,suggestion:true},"amenity/vending_machine/public_transport_tickets/Automat ŚKUP":{name:"Automat ŚKUP",icon:"temaki-vending_machine",geometry:["point"],tags:{"brand:wikidata":"Q24945427",amenity:"vending_machine",vending:"public_transport_tickets"},addTags:{amenity:"vending_machine",brand:"Automat ŚKUP","brand:wikidata":"Q24945427","brand:wikipedia":"pl:Śląska Karta Usług Publicznych",name:"Automat ŚKUP",vending:"public_transport_tickets"},reference:{key:"vending",value:"public_transport_tickets"},terms:[],matchScore:2,suggestion:true},"amenity/vending_machine/parcel_pickup_dropoff/DHL Packstation":{name:"DHL Packstation",icon:"temaki-vending_machine",geometry:["point"],tags:{"brand:wikidata":"Q1766703",amenity:"vending_machine",vending:"parcel_pickup;parcel_mail_in"},addTags:{amenity:"vending_machine",brand:"Packstation","brand:wikidata":"Q1766703","brand:wikipedia":"en:Packstation",name:"DHL Packstation",operator:"DHL","operator:wikidata":"Q489815","operator:wikipedia":"en:DHL Express",vending:"parcel_pickup;parcel_mail_in"},reference:{key:"vending",value:"parcel_pickup;parcel_mail_in"},terms:[],matchScore:2,suggestion:true},"amenity/vending_machine/DHL Paketbox":{name:"DHL Paketbox",icon:"temaki-vending_machine",geometry:["point"],tags:{"brand:wikidata":"Q2046604",amenity:"vending_machine"},addTags:{amenity:"vending_machine",brand:"Paketbox","brand:wikidata":"Q2046604","brand:wikipedia":"de:Paketbox",name:"DHL Paketbox",operator:"DHL","operator:wikidata":"Q489815","operator:wikipedia":"de:DHL",vending:"parcel_mail_in"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"amenity/vending_machine/excrement_bags/Dog-Station":{name:"Dog-Station",icon:"temaki-vending_machine",geometry:["point"],tags:{"brand:wikidata":"Q63720061",amenity:"vending_machine",vending:"excrement_bags"},addTags:{amenity:"vending_machine",brand:"Dog-Station","brand:wikidata":"Q63720061",name:"Dog-Station",vending:"excrement_bags"},reference:{key:"vending",value:"excrement_bags"},terms:[],matchScore:2,suggestion:true},"amenity/vending_machine/public_transport_tickets/KKM":{name:"KKM",icon:"temaki-vending_machine",geometry:["point"],tags:{"brand:wikidata":"Q57515549",amenity:"vending_machine",vending:"public_transport_tickets"},addTags:{amenity:"vending_machine",brand:"KKM","brand:wikidata":"Q57515549",name:"KKM",vending:"public_transport_tickets"},reference:{key:"vending",value:"public_transport_tickets"},countryCodes:["pl"],terms:[],matchScore:2,suggestion:true},"amenity/vending_machine/parcel_pickup_dropoff/Paczkomat InPost":{name:"Paczkomat InPost",icon:"temaki-vending_machine",imageURL:"https://graph.facebook.com/paczkomaty/picture?type=large",geometry:["point"],tags:{"brand:wikidata":"Q3182097",amenity:"vending_machine",vending:"parcel_pickup;parcel_mail_in"},addTags:{amenity:"vending_machine",brand:"InPost","brand:wikidata":"Q3182097","brand:wikipedia":"pl:InPost",name:"Paczkomat InPost",vending:"parcel_pickup;parcel_mail_in"},reference:{key:"vending",value:"parcel_pickup;parcel_mail_in"},countryCodes:["pl"],terms:[],matchScore:2,suggestion:true},"amenity/vending_machine/parking_tickets/ParkPlus (Calgary)":{name:"ParkPlus (Calgary)",icon:"temaki-vending_machine",imageURL:"https://graph.facebook.com/CalgaryParkingAuthority/picture?type=large",geometry:["point"],tags:{"brand:wikidata":"Q63719595",amenity:"vending_machine",vending:"parking_tickets"},addTags:{amenity:"vending_machine",brand:"ParkPlus","brand:wikidata":"Q63719595",name:"ParkPlus",vending:"parking_tickets"},reference:{key:"vending",value:"parking_tickets"},terms:[],matchScore:2,suggestion:true},"amenity/vending_machine/Redbox":{name:"Redbox",icon:"temaki-vending_machine",imageURL:"https://graph.facebook.com/redbox/picture?type=large",geometry:["point"],tags:{"brand:wikidata":"Q7305489",amenity:"vending_machine"},addTags:{amenity:"vending_machine",brand:"Redbox","brand:wikidata":"Q7305489","brand:wikipedia":"en:Redbox",name:"Redbox",vending:"dvd"},terms:[],matchScore:2,suggestion:true},"amenity/vending_machine/excrement_bags/Robidog":{name:"Robidog",icon:"temaki-vending_machine",geometry:["point"],tags:{"brand:wikidata":"Q2159689",amenity:"vending_machine",vending:"excrement_bags"},addTags:{amenity:"vending_machine",brand:"Robidog","brand:wikidata":"Q2159689","brand:wikipedia":"de:Robidog",name:"Robidog",vending:"excrement_bags"},reference:{key:"vending",value:"excrement_bags"},countryCodes:["ch"],terms:[],matchScore:2,suggestion:true},"amenity/vending_machine/cigarettes/Tobaccoland":{name:"Tobaccoland",icon:"temaki-vending_machine",geometry:["point"],tags:{"brand:wikidata":"Q1439872",amenity:"vending_machine",vending:"cigarettes"},addTags:{amenity:"vending_machine",brand:"Tobaccoland","brand:wikidata":"Q1439872","brand:wikipedia":"de:Tobaccoland Automatengesellschaft",name:"Tobaccoland",vending:"cigarettes"},reference:{key:"vending",value:"cigarettes"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"amenity/vending_machine/drinks/コカ・コーラ":{name:"コカ・コーラ",icon:"temaki-vending_machine",imageURL:"https://pbs.twimg.com/profile_images/1062282596686671872/w_A7bupw_bigger.jpg",geometry:["point"],tags:{"brand:wikidata":"Q2813",amenity:"vending_machine",vending:"drinks"},addTags:{amenity:"vending_machine",brand:"コカ・コーラ","brand:en":"Coca-Cola","brand:ja":"コカ・コーラ","brand:wikidata":"Q2813","brand:wikipedia":"ja:コカ・コーラ",drink:"cola",name:"コカ・コーラ","name:en":"Coca-Cola","name:ja":"コカ・コーラ",operator:"Coca Cola Japan Co., Ltd.","operator:wikidata":"Q11506438","operator:wikipedia":"ja:日本コカ・コーラ",vending:"drinks"},reference:{key:"vending",value:"drinks"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/vending_machine/ポッカサッポロ":{name:"ポッカサッポロ",icon:"temaki-vending_machine",geometry:["point"],tags:{"brand:wikidata":"Q7208665",amenity:"vending_machine"},addTags:{amenity:"vending_machine",brand:"ポッカサッポロ","brand:en":"Pokka Sapporo","brand:ja":"ポッカサッポロ","brand:wikidata":"Q7208665","brand:wikipedia":"ja:ポッカサッポロフード&ビバレッジ",name:"ポッカサッポロ","name:en":"Pokka Sapporo","name:ja":"ポッカサッポロ",vending:"water;food"},countryCodes:["jp"],terms:["pokka sapporo"],matchScore:2,suggestion:true},"amenity/veterinary/Banfield Pet Hospital":{name:"Banfield Pet Hospital",icon:"temaki-veterinary_care",imageURL:"https://graph.facebook.com/BanfieldPetHospital/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2882416",amenity:"veterinary"},addTags:{amenity:"veterinary",brand:"Banfield Pet Hospital","brand:wikidata":"Q2882416","brand:wikipedia":"en:Banfield Pet Hospital",name:"Banfield Pet Hospital"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/veterinary/VCA Animal Hospital":{name:"VCA Animal Hospital",icon:"temaki-veterinary_care",imageURL:"https://graph.facebook.com/VCAAnimalHospitals/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7906620",amenity:"veterinary"},addTags:{amenity:"veterinary",brand:"VCA Animal Hospital","brand:wikidata":"Q7906620","brand:wikipedia":"en:VCA Animal Hospitals",name:"VCA Animal Hospital"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"leisure/fitness_centre/24 Hour Fitness":{name:"24 Hour Fitness",icon:"fas-dumbbell",imageURL:"https://graph.facebook.com/24HourFitness/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4631849",leisure:"fitness_centre"},addTags:{brand:"24 Hour Fitness","brand:wikidata":"Q4631849","brand:wikipedia":"en:24 Hour Fitness",leisure:"fitness_centre",name:"24 Hour Fitness"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"leisure/fitness_centre/Anytime Fitness":{name:"Anytime Fitness",icon:"fas-dumbbell",imageURL:"https://graph.facebook.com/anytimefitness/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4778364",leisure:"fitness_centre"},addTags:{brand:"Anytime Fitness","brand:wikidata":"Q4778364","brand:wikipedia":"en:Anytime Fitness",leisure:"fitness_centre",name:"Anytime Fitness"},terms:[],matchScore:2,suggestion:true},"leisure/fitness_centre/Basic-Fit":{name:"Basic-Fit",icon:"fas-dumbbell",imageURL:"https://graph.facebook.com/BasicFitEspana/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q40165577",leisure:"fitness_centre"},addTags:{brand:"Basic-Fit","brand:wikidata":"Q40165577","brand:wikipedia":"nl:Basic-Fit",leisure:"fitness_centre",name:"Basic-Fit"},countryCodes:["be","es","fr","lu","nl"],terms:[],matchScore:2,suggestion:true},"leisure/fitness_centre/Curves":{name:"Curves",icon:"fas-dumbbell",imageURL:"https://graph.facebook.com/Curves/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5196080",leisure:"fitness_centre"},addTags:{brand:"Curves","brand:wikidata":"Q5196080","brand:wikipedia":"en:Curves International",leisure:"fitness_centre",name:"Curves"},terms:[],matchScore:2,suggestion:true},"leisure/fitness_centre/Fitness First":{name:"Fitness First",icon:"fas-dumbbell",imageURL:"https://graph.facebook.com/FitnessFirstGER/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q127120",leisure:"fitness_centre"},addTags:{brand:"Fitness First","brand:wikidata":"Q127120","brand:wikipedia":"en:Fitness First",leisure:"fitness_centre",name:"Fitness First"},terms:[],matchScore:2,suggestion:true},"leisure/fitness_centre/Gold's Gym":{name:"Gold's Gym",icon:"fas-dumbbell",imageURL:"https://graph.facebook.com/goldsgym/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1536234",leisure:"fitness_centre"},addTags:{brand:"Gold's Gym","brand:wikidata":"Q1536234","brand:wikipedia":"en:Gold's Gym",leisure:"fitness_centre",name:"Gold's Gym"},terms:[],matchScore:2,suggestion:true},"leisure/fitness_centre/LA Fitness":{name:"LA Fitness",icon:"fas-dumbbell",imageURL:"https://graph.facebook.com/LAFitness/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6457180",leisure:"fitness_centre"},addTags:{brand:"LA Fitness","brand:wikidata":"Q6457180","brand:wikipedia":"en:LA Fitness",leisure:"fitness_centre",name:"LA Fitness"},countryCodes:["ca","gb","us"],terms:[],matchScore:2,suggestion:true},"leisure/fitness_centre/McFit":{name:"McFit",icon:"fas-dumbbell",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FLogo%20McFIT%20GmbH.jpg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q871302",leisure:"fitness_centre"},addTags:{brand:"McFit","brand:wikidata":"Q871302","brand:wikipedia":"en:McFit",leisure:"fitness_centre",name:"McFit"},countryCodes:["at","de","es","it","pl"],terms:[],matchScore:2,suggestion:true},"leisure/fitness_centre/Orangetheory Fitness":{name:"Orangetheory Fitness",icon:"fas-dumbbell",imageURL:"https://graph.facebook.com/OrangeTheoryFitness/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q25005163",leisure:"fitness_centre"},addTags:{brand:"Orangetheory Fitness","brand:wikidata":"Q25005163","brand:wikipedia":"en:Orangetheory Fitness",leisure:"fitness_centre",name:"Orangetheory Fitness"},countryCodes:["ca","es","us"],terms:["orangetheory"],matchScore:2,suggestion:true},"leisure/fitness_centre/Planet Fitness":{name:"Planet Fitness",icon:"fas-dumbbell",imageURL:"https://graph.facebook.com/planetfitness/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7201095",leisure:"fitness_centre"},addTags:{brand:"Planet Fitness","brand:wikidata":"Q7201095","brand:wikipedia":"en:Planet Fitness",leisure:"fitness_centre",name:"Planet Fitness"},countryCodes:["ae","au","ca","cl","cn","co","cr","de","do","es","gb","gt","il","jp","kw","mx","nz","pa","pe","pl","pr","sa","sg","us"],terms:[],matchScore:2,suggestion:true},"leisure/fitness_centre/PureGym":{name:"PureGym",icon:"fas-dumbbell",imageURL:"https://graph.facebook.com/puregym/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q18345898",leisure:"fitness_centre"},addTags:{brand:"PureGym","brand:wikidata":"Q18345898","brand:wikipedia":"en:PureGym",leisure:"fitness_centre",name:"PureGym"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"leisure/fitness_centre/Retro Fitness":{name:"Retro Fitness",icon:"fas-dumbbell",imageURL:"https://graph.facebook.com/RetroFitness/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q61994955",leisure:"fitness_centre"},addTags:{brand:"Retro Fitness","brand:wikidata":"Q61994955",leisure:"fitness_centre",name:"Retro Fitness"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"leisure/fitness_centre/Snap Fitness":{name:"Snap Fitness",icon:"fas-dumbbell",imageURL:"https://graph.facebook.com/SnapFitness247/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7547254",leisure:"fitness_centre"},addTags:{brand:"Snap Fitness","brand:wikidata":"Q7547254","brand:wikipedia":"en:Snap Fitness",leisure:"fitness_centre",name:"Snap Fitness"},terms:[],matchScore:2,suggestion:true},"leisure/sports_centre/YMCA":{name:"YMCA",icon:"maki-pitch",imageURL:"https://graph.facebook.com/YMCA/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q157169",leisure:"sports_centre"},addTags:{brand:"YMCA","brand:wikidata":"Q157169","brand:wikipedia":"en:YMCA",leisure:"sports_centre",name:"YMCA"},terms:[],matchScore:2,suggestion:true},"office/financial_advisor/Edward Jones":{name:"Edward Jones",icon:"maki-suitcase",imageURL:"https://graph.facebook.com/edwardjones/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5343830",office:"financial_advisor"},addTags:{alt_name:"Edward Jones Investments",brand:"Edward Jones","brand:wikidata":"Q5343830","brand:wikipedia":"en:Edward Jones Investments",name:"Edward Jones",office:"financial_advisor"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"office/insurance/Allstate":{name:"Allstate",icon:"maki-suitcase",imageURL:"https://graph.facebook.com/Allstate/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2645636",office:"insurance"},addTags:{brand:"Allstate","brand:wikidata":"Q2645636","brand:wikipedia":"en:Allstate",name:"Allstate",office:"insurance"},countryCodes:["us"],terms:["allstate insurance"],matchScore:2,suggestion:true},"office/insurance/American Family Insurance":{name:"American Family Insurance",icon:"maki-suitcase",imageURL:"https://graph.facebook.com/amfam/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4743730",office:"insurance"},addTags:{brand:"American Family Insurance","brand:wikidata":"Q4743730","brand:wikipedia":"en:American Family Insurance",name:"American Family Insurance",office:"insurance"},countryCodes:["us"],terms:["american family","amfam"],matchScore:2,suggestion:true},"office/insurance/Erie Insurance":{name:"Erie Insurance",icon:"maki-suitcase",imageURL:"https://graph.facebook.com/erieinsurance/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5388314",office:"insurance"},addTags:{brand:"Erie Insurance","brand:wikidata":"Q5388314","brand:wikipedia":"en:Erie Insurance Group",name:"Erie Insurance",office:"insurance"},countryCodes:["us"],terms:["erie"],matchScore:2,suggestion:true},"office/insurance/Farmers Insurance":{name:"Farmers Insurance",icon:"maki-suitcase",imageURL:"https://graph.facebook.com/FarmersInsurance/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1396863",office:"insurance"},addTags:{brand:"Farmers Insurance","brand:wikidata":"Q1396863","brand:wikipedia":"en:Farmers Insurance Group",name:"Farmers Insurance",office:"insurance"},countryCodes:["us"],terms:["farmers"],matchScore:2,suggestion:true},"office/insurance/GEICO":{name:"GEICO",icon:"maki-suitcase",imageURL:"https://graph.facebook.com/geico/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1498689",office:"insurance"},addTags:{brand:"GEICO","brand:wikidata":"Q1498689","brand:wikipedia":"en:GEICO",name:"GEICO",office:"insurance"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"office/insurance/Grange Insurance":{name:"Grange Insurance",icon:"maki-suitcase",imageURL:"https://graph.facebook.com/GrangeInsuranceMarketing/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q17183481",office:"insurance"},addTags:{brand:"Grange Insurance","brand:wikidata":"Q17183481","brand:wikipedia":"en:Grange Insurance",name:"Grange Insurance",office:"insurance"},countryCodes:["us"],terms:["grange"],matchScore:2,suggestion:true},"office/insurance/Nationwide":{name:"Nationwide",icon:"maki-suitcase",imageURL:"https://graph.facebook.com/nationwide/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6979886",office:"insurance"},addTags:{brand:"Nationwide","brand:wikidata":"Q6979886","brand:wikipedia":"en:Nationwide Mutual Insurance Company",name:"Nationwide",office:"insurance"},countryCodes:["us"],terms:["nationwide insurance"],matchScore:2,suggestion:true},"office/insurance/Progressive":{name:"Progressive",icon:"maki-suitcase",imageURL:"https://graph.facebook.com/progressive/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7248721",office:"insurance"},addTags:{brand:"Progressive","brand:wikidata":"Q7248721","brand:wikipedia":"en:Progressive Corporation",name:"Progressive",office:"insurance"},countryCodes:["us"],terms:["progressive insurance"],matchScore:2,suggestion:true},"office/insurance/State Farm":{name:"State Farm",icon:"maki-suitcase",imageURL:"https://graph.facebook.com/statefarm/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2007336",office:"insurance"},addTags:{brand:"State Farm","brand:wikidata":"Q2007336","brand:wikipedia":"en:State Farm",name:"State Farm",office:"insurance"},countryCodes:["us"],terms:["state farm insurance"],matchScore:2,suggestion:true},"office/tax_advisor/H&R Block":{name:"H&R Block",icon:"maki-suitcase",imageURL:"https://graph.facebook.com/hrblock/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5627799",office:"tax_advisor"},addTags:{brand:"H&R Block","brand:wikidata":"Q5627799","brand:wikipedia":"en:H&R Block",name:"H&R Block",office:"tax_advisor"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"office/tax_advisor/Jackson Hewitt":{name:"Jackson Hewitt",icon:"maki-suitcase",imageURL:"https://graph.facebook.com/jacksonhewitt/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6117132",office:"tax_advisor"},addTags:{alt_name:"Jackson Hewitt Tax Service",brand:"Jackson Hewitt","brand:wikidata":"Q6117132","brand:wikipedia":"en:Jackson Hewitt",name:"Jackson Hewitt",office:"tax_advisor"},countryCodes:["us"],terms:["jackson hewitt tax service"],matchScore:2,suggestion:true},"office/tax_advisor/Liberty Tax":{name:"Liberty Tax",icon:"maki-suitcase",imageURL:"https://graph.facebook.com/libertytax/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6541978",office:"tax_advisor"},addTags:{alt_name:"Liberty Tax Service",brand:"Liberty Tax","brand:wikidata":"Q6541978","brand:wikipedia":"en:Liberty Tax Service",name:"Liberty Tax",office:"tax_advisor"},countryCodes:["us"],terms:["liberty tax service"],matchScore:2,suggestion:true},"shop/alcohol/Alko":{name:"Alko",icon:"fas-wine-bottle",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FAlko.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q1849187",shop:"alcohol"},addTags:{brand:"Alko","brand:wikidata":"Q1849187","brand:wikipedia":"en:Alko",name:"Alko",shop:"alcohol"},countryCodes:["fi"],terms:[],matchScore:2,suggestion:true},"shop/alcohol/BC Liquor Store":{name:"BC Liquor Store",icon:"fas-wine-bottle",imageURL:"https://pbs.twimg.com/profile_images/1302250656/winesplash-icon_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q43079557",shop:"alcohol"},addTags:{brand:"BC Liquor Store","brand:wikidata":"Q43079557","brand:wikipedia":"en:BC Liquor Stores",name:"BC Liquor Store",shop:"alcohol"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"shop/alcohol/BWS":{name:"BWS",icon:"fas-wine-bottle",geometry:["point","area"],tags:{"brand:wikidata":"Q4836848",shop:"alcohol"},addTags:{brand:"BWS","brand:wikidata":"Q4836848","brand:wikipedia":"en:BWS (liquor retailer)",name:"BWS",shop:"alcohol"},countryCodes:["au"],terms:[],matchScore:2,suggestion:true},"shop/alcohol/Bargain Booze":{name:"Bargain Booze",icon:"fas-wine-bottle",imageURL:"https://pbs.twimg.com/profile_images/998956835796205568/21tNi907_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q16971315",shop:"alcohol"},addTags:{brand:"Bargain Booze","brand:wikidata":"Q16971315","brand:wikipedia":"en:Bargain Booze",name:"Bargain Booze",shop:"alcohol"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/alcohol/BevMo!":{name:"BevMo!",icon:"fas-wine-bottle",imageURL:"https://pbs.twimg.com/profile_images/1128010188038893568/TCOuuRrD_bigger.png",geometry:["point","area"],tags:{"brand:wikidata":"Q4899308",shop:"alcohol"},addTags:{brand:"BevMo!","brand:wikidata":"Q4899308","brand:wikipedia":"en:BevMo!",name:"BevMo!",shop:"alcohol"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/alcohol/Dan Murphy's":{name:"Dan Murphy's",icon:"fas-wine-bottle",imageURL:"https://pbs.twimg.com/profile_images/465419847128473601/ybOMjW8-_bigger.png",geometry:["point","area"],tags:{"brand:wikidata":"Q5214075",shop:"alcohol"},addTags:{brand:"Dan Murphy's","brand:wikidata":"Q5214075","brand:wikipedia":"en:Dan Murphy's",name:"Dan Murphy's",shop:"alcohol"},countryCodes:["au"],terms:[],matchScore:2,suggestion:true},"shop/alcohol/Gall & Gall":{name:"Gall & Gall",icon:"fas-wine-bottle",imageURL:"https://pbs.twimg.com/profile_images/652468758515068928/dzFqRsLG_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q13639185",shop:"alcohol"},addTags:{brand:"Gall & Gall","brand:wikidata":"Q13639185","brand:wikipedia":"nl:Gall & Gall",name:"Gall & Gall",shop:"alcohol"},countryCodes:["nl"],terms:[],matchScore:2,suggestion:true},"shop/alcohol/LCBO":{name:"LCBO",icon:"fas-wine-bottle",imageURL:"https://pbs.twimg.com/profile_images/481885343986102272/mGMV-t--_bigger.jpeg",geometry:["point","area"],tags:{"brand:wikidata":"Q845263",shop:"alcohol"},addTags:{brand:"LCBO","brand:wikidata":"Q845263","brand:wikipedia":"en:Liquor Control Board of Ontario",name:"LCBO",shop:"alcohol"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"shop/alcohol/Liquorland":{name:"Liquorland",icon:"fas-wine-bottle",imageURL:"https://pbs.twimg.com/profile_images/378800000468322180/92219ed513322ff2f4d6d416dc477704_bigger.jpeg",geometry:["point","area"],tags:{"brand:wikidata":"Q2283837",shop:"alcohol"},addTags:{brand:"Liquorland","brand:wikidata":"Q2283837","brand:wikipedia":"en:Liquorland",name:"Liquorland",operator:"Coles Group","operator:wikidata":"Q1339055","operator:wikipedia":"en:Coles Group",shop:"alcohol"},countryCodes:["au"],terms:[],matchScore:2,suggestion:true},"shop/alcohol/Nicolas":{name:"Nicolas",icon:"fas-wine-bottle",imageURL:"https://pbs.twimg.com/profile_images/842779196082573314/AtkEMQlh_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q3340012",shop:"alcohol"},addTags:{brand:"Nicolas","brand:wikidata":"Q3340012","brand:wikipedia":"en:Nicolas (wine retailer)",name:"Nicolas",shop:"alcohol"},countryCodes:["be","de","fr","gb","pl"],terms:[],matchScore:2,suggestion:true},"shop/alcohol/SAQ":{name:"SAQ",icon:"fas-wine-bottle",imageURL:"https://pbs.twimg.com/profile_images/1064657571133308928/zhzEYvxp_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q3488077",shop:"alcohol"},addTags:{brand:"SAQ","brand:wikidata":"Q3488077","brand:wikipedia":"en:Société des alcools du Québec",name:"SAQ",shop:"alcohol"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"shop/alcohol/Spec's":{name:"Spec's",icon:"fas-wine-bottle",imageURL:"https://pbs.twimg.com/profile_images/1130483530667044864/m1Ft0hwK_bigger.png",geometry:["point","area"],tags:{"brand:wikidata":"Q7574415",shop:"alcohol"},addTags:{brand:"Spec's","brand:wikidata":"Q7574415","brand:wikipedia":"en:Spec's Wine, Spirits & Finer Foods",name:"Spec's",shop:"alcohol"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/alcohol/Systembolaget":{name:"Systembolaget",icon:"fas-wine-bottle",imageURL:"https://pbs.twimg.com/profile_images/456046476032872449/mg3NXDpc_bigger.png",geometry:["point","area"],tags:{"brand:wikidata":"Q1476113",shop:"alcohol"},addTags:{brand:"Systembolaget","brand:wikidata":"Q1476113","brand:wikipedia":"en:Systembolaget",name:"Systembolaget",shop:"alcohol"},countryCodes:["se"],terms:[],matchScore:2,suggestion:true},"shop/alcohol/The Beer Store":{name:"The Beer Store",icon:"fas-wine-bottle",imageURL:"https://pbs.twimg.com/profile_images/1112700310441676800/Gyk3rZl6_bigger.png",geometry:["point","area"],tags:{"brand:wikidata":"Q16243674",shop:"alcohol"},addTags:{brand:"The Beer Store","brand:wikidata":"Q16243674","brand:wikipedia":"en:The Beer Store",name:"The Beer Store",shop:"alcohol"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"shop/alcohol/Total Wine":{name:"Total Wine",icon:"fas-wine-bottle",imageURL:"https://pbs.twimg.com/profile_images/3095579292/69f5115c869a3b0f73bfb7ad25ba2a37_bigger.png",geometry:["point","area"],tags:{"brand:wikidata":"Q7828084",shop:"alcohol"},addTags:{brand:"Total Wine","brand:wikidata":"Q7828084","brand:wikipedia":"en:Total Wine & More",name:"Total Wine",shop:"alcohol"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/alcohol/Virginia ABC":{name:"Virginia ABC",icon:"fas-wine-bottle",imageURL:"https://pbs.twimg.com/profile_images/981178074137055233/nSvQCkEL_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q7934236",shop:"alcohol"},addTags:{brand:"Virginia ABC","brand:wikidata":"Q7934236","brand:wikipedia":"en:Virginia Alcoholic Beverage Control Authority",name:"Virginia ABC",shop:"alcohol"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/alcohol/Бристоль":{name:"Бристоль",icon:"fas-wine-bottle",imageURL:"https://pbs.twimg.com/profile_images/1106166467274440704/iwQRyG3O_bigger.png",geometry:["point","area"],tags:{"brand:wikidata":"Q59155583",shop:"alcohol"},addTags:{brand:"Бристоль","brand:wikidata":"Q59155583","brand:wikipedia":"ru:Бристоль (сеть магазинов)",name:"Бристоль",shop:"alcohol"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"shop/alcohol/Красное & Белое":{name:"Красное & Белое",icon:"fas-wine-bottle",imageURL:"https://pbs.twimg.com/profile_images/1116601617699102720/CVI31i0C_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q24933790",shop:"alcohol"},addTags:{brand:"Красное & Белое","brand:en":"Red&White","brand:wikidata":"Q24933790","brand:wikipedia":"en:Krasnoe & Beloe",name:"Красное & Белое","name:en":"Red&White",shop:"alcohol"},countryCodes:["ru"],terms:["красное и белое"],matchScore:2,suggestion:true},"shop/baby_goods/Aubert":{name:"Aubert",icon:"fas-baby-carriage",imageURL:"https://graph.facebook.com/Aubert/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62964657",shop:"baby_goods"},addTags:{brand:"Aubert","brand:wikidata":"Q62964657",name:"Aubert",shop:"baby_goods"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"shop/baby_goods/Babies R Us":{name:"Babies R Us",icon:"fas-baby-carriage",imageURL:"https://graph.facebook.com/babiesrus/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q17232036",shop:"baby_goods"},addTags:{brand:"Babies R Us","brand:wikidata":"Q17232036",name:"Babies R Us",shop:"baby_goods"},terms:[],matchScore:2,suggestion:true},"shop/baby_goods/BabyOne":{name:"BabyOne",icon:"fas-baby-carriage",imageURL:"https://graph.facebook.com/BabyOne/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q57540408",shop:"baby_goods"},addTags:{brand:"BabyOne","brand:wikidata":"Q57540408",name:"BabyOne",shop:"baby_goods"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/baby_goods/Buy Buy Baby":{name:"Buy Buy Baby",icon:"fas-baby-carriage",imageURL:"https://graph.facebook.com/buybuyBABY/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5003352",shop:"baby_goods"},addTags:{brand:"Buy Buy Baby","brand:wikidata":"Q5003352","brand:wikipedia":"en:Buy Buy Baby",name:"Buy Buy Baby",shop:"baby_goods"},terms:[],matchScore:2,suggestion:true},"shop/baby_goods/Mothercare":{name:"Mothercare",icon:"fas-baby-carriage",imageURL:"https://graph.facebook.com/mothercareuk/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q136738",shop:"baby_goods"},addTags:{brand:"Mothercare","brand:wikidata":"Q136738","brand:wikipedia":"en:Mothercare",name:"Mothercare",shop:"baby_goods"},terms:[],matchScore:2,suggestion:true},"shop/baby_goods/西松屋":{name:"西松屋",icon:"fas-baby-carriage",geometry:["point","area"],tags:{"brand:wikidata":"Q11628761",shop:"baby_goods"},addTags:{brand:"西松屋","brand:en":"Nishimatsuya Chain","brand:ja":"西松屋","brand:wikidata":"Q11628761","brand:wikipedia":"ja:西松屋",name:"西松屋","name:en":"Nishimatsuya Chain","name:ja":"西松屋",shop:"baby_goods"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/bag/Carpisa":{name:"Carpisa",icon:"fas-suitcase-rolling",imageURL:"https://graph.facebook.com/CarpisaOfficial/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q28035409",shop:"bag"},addTags:{brand:"Carpisa","brand:wikidata":"Q28035409","brand:wikipedia":"en:Carpisa",name:"Carpisa",shop:"bag"},countryCodes:["it"],terms:[],matchScore:2,suggestion:true},"shop/bag/Coach":{name:"Coach",icon:"fas-suitcase-rolling",imageURL:"https://graph.facebook.com/coach/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q727697",shop:"bag"},addTags:{brand:"Coach","brand:wikidata":"Q727697","brand:wikipedia":"en:Coach New York",name:"Coach",shop:"bag"},countryCodes:["ca","us"],terms:["coach new york","coach ny"],matchScore:2,suggestion:true},"shop/bag/Kipling":{name:"Kipling",icon:"fas-suitcase-rolling",imageURL:"https://graph.facebook.com/KiplingU.S.A/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6414641",shop:"bag"},addTags:{brand:"Kipling","brand:wikidata":"Q6414641","brand:wikipedia":"en:Kipling (brand)",name:"Kipling",shop:"bag"},terms:[],matchScore:2,suggestion:true},"shop/bag/Samsonite":{name:"Samsonite",icon:"fas-suitcase-rolling",imageURL:"https://graph.facebook.com/Samsonite/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1203426",shop:"bag"},addTags:{brand:"Samsonite","brand:wikidata":"Q1203426","brand:wikipedia":"en:Samsonite",name:"Samsonite",shop:"bag"},terms:[],matchScore:2,suggestion:true},"shop/bag/Tumi":{name:"Tumi",icon:"fas-suitcase-rolling",imageURL:"https://graph.facebook.com/TumiTravel/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4465402",shop:"bag"},addTags:{brand:"Tumi","brand:wikidata":"Q4465402","brand:wikipedia":"en:Tumi Inc.",name:"Tumi",shop:"bag"},terms:[],matchScore:2,suggestion:true},"shop/bag/Vera Bradley":{name:"Vera Bradley",icon:"fas-suitcase-rolling",imageURL:"https://graph.facebook.com/VeraBradley/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7920749",shop:"bag"},addTags:{brand:"Vera Bradley","brand:wikidata":"Q7920749","brand:wikipedia":"en:Vera Bradley",name:"Vera Bradley",shop:"bag"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/bakery/Anker":{name:"Anker",icon:"maki-bakery",geometry:["point","area"],tags:{"brand:wikidata":"Q557116",shop:"bakery"},addTags:{brand:"Anker","brand:wikidata":"Q557116","brand:wikipedia":"de:Ankerbrot",name:"Anker",shop:"bakery"},countryCodes:["at","sk"],terms:[],matchScore:2,suggestion:true},"shop/bakery/Awiteks":{name:"Awiteks",icon:"maki-bakery",geometry:["point","area"],tags:{"brand:wikidata":"Q62054190",shop:"bakery"},addTags:{brand:"Awiteks","brand:wikidata":"Q62054190",name:"Awiteks",shop:"bakery"},countryCodes:["pl"],terms:[],matchScore:2,suggestion:true},"shop/bakery/Backwerk":{name:"Backwerk",icon:"maki-bakery",imageURL:"https://graph.facebook.com/155997891116938/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q798298",shop:"bakery"},addTags:{brand:"BackWerk","brand:wikidata":"Q798298","brand:wikipedia":"de:BackWerk",name:"Backwerk",shop:"bakery"},countryCodes:["at","ch","de","gb","nl"],terms:[],matchScore:2,suggestion:true},"shop/bakery/Bakers Delight":{name:"Bakers Delight",icon:"maki-bakery",geometry:["point","area"],tags:{"brand:wikidata":"Q4849261",shop:"bakery"},addTags:{brand:"Bakers Delight","brand:wikidata":"Q4849261","brand:wikipedia":"en:Bakers Delight",name:"Bakers Delight",shop:"bakery"},countryCodes:["au","ca","nz","us"],terms:[],matchScore:2,suggestion:true},"shop/bakery/Bakker Bart":{name:"Bakker Bart",icon:"maki-bakery",geometry:["point","area"],tags:{"brand:wikidata":"Q2177445",shop:"bakery"},addTags:{brand:"Bakker Bart","brand:wikidata":"Q2177445","brand:wikipedia":"nl:Bakker Bart",name:"Bakker Bart",shop:"bakery"},countryCodes:["be","nl"],terms:[],matchScore:2,suggestion:true},"shop/bakery/Banette":{name:"Banette",icon:"maki-bakery",geometry:["point","area"],tags:{"brand:wikidata":"Q2882405",shop:"bakery"},addTags:{brand:"Banette","brand:wikidata":"Q2882405","brand:wikipedia":"fr:Banette (entreprise)",name:"Banette",shop:"bakery"},terms:[],matchScore:2,suggestion:true},"shop/bakery/Birds":{name:"Birds",icon:"maki-bakery",imageURL:"https://pbs.twimg.com/profile_images/590867289953738753/OftDrPao_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q63001935",shop:"bakery"},addTags:{brand:"Birds","brand:wikidata":"Q63001935","brand:wikipedia":"en:Birds Bakery",name:"Birds",official_name:"Birds Bakery",shop:"bakery"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/bakery/Bäckerei Fuchs":{name:"Bäckerei Fuchs",icon:"maki-bakery",geometry:["point","area"],tags:{"brand:wikidata":"Q42825993",shop:"bakery"},addTags:{brand:"Bäckerei Fuchs","brand:wikidata":"Q42825993","brand:wikipedia":"de:Harald Fuchs Bäckerei – Konditorei",name:"Bäckerei Fuchs",shop:"bakery"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/bakery/Cadera":{name:"Cadera",icon:"maki-bakery",imageURL:"https://graph.facebook.com/Cadera1853/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62086410",shop:"bakery"},addTags:{brand:"Cadera","brand:wikidata":"Q62086410",name:"Cadera",shop:"bakery"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/bakery/Cooplands":{name:"Cooplands",icon:"maki-bakery",geometry:["point","area"],tags:{"brand:wikidata":"Q5167971",shop:"bakery"},addTags:{brand:"Cooplands","brand:wikidata":"Q5167971","brand:wikipedia":"en:Cooplands",name:"Cooplands",shop:"bakery"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/bakery/Dat Backhus":{name:"Dat Backhus",icon:"maki-bakery",imageURL:"https://graph.facebook.com/datbackhus.hamburg/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62093175",shop:"bakery"},addTags:{brand:"Dat Backhus","brand:wikidata":"Q62093175",name:"Dat Backhus",shop:"bakery"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/bakery/Der Beck":{name:"Der Beck",icon:"maki-bakery",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FDer%20Beck.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q1192443",shop:"bakery"},addTags:{brand:"Der Beck","brand:wikidata":"Q1192443","brand:wikipedia":"en:Der Beck",name:"Der Beck",shop:"bakery"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/bakery/Ditsch":{name:"Ditsch",icon:"maki-bakery",imageURL:"https://graph.facebook.com/ditsch/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q911573",shop:"bakery"},addTags:{brand:"Ditsch","brand:wikidata":"Q911573","brand:wikipedia":"en:Ditsch",name:"Ditsch",shop:"bakery"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/bakery/Fornetti":{name:"Fornetti",icon:"maki-bakery",geometry:["point","area"],tags:{"brand:wikidata":"Q1003020",shop:"bakery"},addTags:{brand:"Fornetti","brand:wikidata":"Q1003020","brand:wikipedia":"en:Fornetti",name:"Fornetti",shop:"bakery"},terms:[],matchScore:2,suggestion:true},"shop/bakery/Goldilocks":{name:"Goldilocks",icon:"maki-bakery",geometry:["point","area"],tags:{"brand:wikidata":"Q5580198",shop:"bakery"},addTags:{brand:"Goldilocks","brand:wikidata":"Q5580198","brand:wikipedia":"en:Goldilocks Bakeshop",name:"Goldilocks",shop:"bakery"},countryCodes:["ca","ph","th","us"],terms:[],matchScore:2,suggestion:true},"shop/bakery/Greggs":{name:"Greggs",icon:"maki-bakery",imageURL:"https://pbs.twimg.com/profile_images/1001837345728016385/86hcMlm8_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q3403981",shop:"bakery"},addTags:{brand:"Greggs","brand:wikidata":"Q3403981","brand:wikipedia":"en:Greggs",name:"Greggs",shop:"bakery"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/bakery/Hofpfisterei":{name:"Hofpfisterei",icon:"maki-bakery",imageURL:"https://graph.facebook.com/hofpfisterei/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1623217",shop:"bakery"},addTags:{brand:"Hofpfisterei","brand:wikidata":"Q1623217","brand:wikipedia":"en:Hofpfisterei",name:"Hofpfisterei",shop:"bakery"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/bakery/Ihle":{name:"Ihle",icon:"maki-bakery",geometry:["point","area"],tags:{"brand:wikidata":"Q1626371",shop:"bakery"},addTags:{brand:"Ihle","brand:wikidata":"Q1626371","brand:wikipedia":"de:Landbäckerei Ihle",name:"Ihle",shop:"bakery"},countryCodes:["de"],terms:["landbäckerei ihle"],matchScore:2,suggestion:true},"shop/bakery/K&U Bäckerei":{name:"K&U Bäckerei",icon:"maki-bakery",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FKuU-Logo.png&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q1719433",shop:"bakery"},addTags:{brand:"K&U Bäckerei","brand:wikidata":"Q1719433","brand:wikipedia":"de:K & U Bäckerei",name:"K&U Bäckerei",shop:"bakery"},countryCodes:["de"],terms:["k&u"],matchScore:2,suggestion:true},"shop/bakery/Kamps":{name:"Kamps",icon:"maki-bakery",imageURL:"https://graph.facebook.com/417008548362119/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1723381",shop:"bakery"},addTags:{brand:"Kamps","brand:wikidata":"Q1723381","brand:wikipedia":"de:Kamps (Unternehmen)",name:"Kamps",shop:"bakery"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/bakery/La Mie Câline":{name:"La Mie Câline",icon:"maki-bakery",geometry:["point","area"],tags:{"brand:wikidata":"Q3210704",shop:"bakery"},addTags:{brand:"La Mie Câline","brand:wikidata":"Q3210704","brand:wikipedia":"fr:La Mie câline",name:"La Mie Câline",shop:"bakery"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"shop/bakery/Le Crobag":{name:"Le Crobag",icon:"maki-bakery",geometry:["point","area"],tags:{"brand:wikidata":"Q1558025",shop:"bakery"},addTags:{brand:"Le Crobag","brand:wikidata":"Q1558025","brand:wikipedia":"de:Le Crobag",name:"Le Crobag",shop:"bakery"},countryCodes:["at","de","pl","ru"],terms:[],matchScore:2,suggestion:true},"shop/bakery/Lila Bäcker":{name:"Lila Bäcker",icon:"maki-bakery",imageURL:"https://pbs.twimg.com/profile_images/1145260042/logo_up_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q57516591",shop:"bakery"},addTags:{brand:"Lila Bäcker","brand:wikidata":"Q57516591",name:"Lila Bäcker",shop:"bakery"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/bakery/Löwenbäcker Schaper":{name:"Löwenbäcker Schaper",icon:"maki-bakery",imageURL:"https://graph.facebook.com/LoewenbaeckerSchaper/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62075965",shop:"bakery"},addTags:{brand:"Löwenbäcker Schaper","brand:wikidata":"Q62075965",name:"Löwenbäcker Schaper",shop:"bakery"},countryCodes:["de"],terms:["schaper"],matchScore:2,suggestion:true},"shop/bakery/Marie Blachère":{name:"Marie Blachère",icon:"maki-bakery",imageURL:"https://graph.facebook.com/marieblachereusa/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62082410",shop:"bakery"},addTags:{brand:"Marie Blachère","brand:wikidata":"Q62082410",name:"Marie Blachère",shop:"bakery"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"shop/bakery/Mlinar":{name:"Mlinar",icon:"maki-bakery",imageURL:"https://graph.facebook.com/MlinarHrvatska/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62082464",shop:"bakery"},addTags:{brand:"Mlinar","brand:wikidata":"Q62082464",name:"Mlinar",shop:"bakery"},countryCodes:["ba","hr","sl"],terms:[],matchScore:2,suggestion:true},"shop/bakery/Musmanni":{name:"Musmanni",icon:"maki-bakery",geometry:["point","area"],tags:{"brand:wikidata":"Q19382082",shop:"bakery"},addTags:{brand:"Musmanni","brand:wikidata":"Q19382082","brand:wikipedia":"no:Musmanni",name:"Musmanni",shop:"bakery"},countryCodes:["cr"],terms:[],matchScore:2,suggestion:true},"shop/bakery/Nothing Bundt Cakes":{name:"Nothing Bundt Cakes",icon:"maki-bakery",imageURL:"https://graph.facebook.com/nothingbundtcakes/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62082526",shop:"bakery"},addTags:{brand:"Nothing Bundt Cakes","brand:wikidata":"Q62082526",name:"Nothing Bundt Cakes",shop:"bakery"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"shop/bakery/Paul":{name:"Paul",icon:"maki-bakery",imageURL:"https://pbs.twimg.com/profile_images/1104154254699364353/69J1OrZ1_bigger.png",geometry:["point","area"],tags:{"brand:wikidata":"Q3370417",shop:"bakery"},addTags:{brand:"Paul","brand:wikidata":"Q3370417","brand:wikipedia":"en:Paul (bakery)",name:"Paul",shop:"bakery"},terms:[],matchScore:2,suggestion:true},"shop/bakery/Red Ribbon":{name:"Red Ribbon",icon:"maki-bakery",geometry:["point","area"],tags:{"brand:wikidata":"Q7304789",shop:"bakery"},addTags:{brand:"Red Ribbon","brand:wikidata":"Q7304789","brand:wikipedia":"en:Red Ribbon Bakeshop",name:"Red Ribbon",shop:"bakery"},countryCodes:["ph","us"],terms:[],matchScore:2,suggestion:true},"shop/bakery/Ronde des Pains":{name:"Ronde des Pains",icon:"maki-bakery",geometry:["point","area"],tags:{"brand:wikidata":"Q3441707",shop:"bakery"},addTags:{brand:"Ronde des Pains","brand:wikidata":"Q3441707","brand:wikipedia":"fr:Ronde des Pains",name:"Ronde des Pains",shop:"bakery"},countryCodes:["be","fr"],terms:[],matchScore:2,suggestion:true},"shop/bakery/Schäfer's":{name:"Schäfer's",icon:"maki-bakery",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FSch%C3%A4fers%20Brot%20Logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q1464562",shop:"bakery"},addTags:{brand:"Schäfer's","brand:wikidata":"Q1464562","brand:wikipedia":"de:Schäfers Brot",name:"Schäfer's",shop:"bakery"},countryCodes:["de"],terms:["schäfer"],matchScore:2,suggestion:true},"shop/bakery/Sehne":{name:"Sehne",icon:"maki-bakery",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FSehne%20Backwaren%20Logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q1314761",shop:"bakery"},addTags:{brand:"Sehne","brand:wikidata":"Q1314761","brand:wikipedia":"de:Sehne Backwaren",name:"Sehne",shop:"bakery"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/bakery/Steinecke":{name:"Steinecke",icon:"maki-bakery",imageURL:"https://graph.facebook.com/brotmeisterei.steinecke/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q57516278",shop:"bakery"},addTags:{brand:"Steinecke","brand:wikidata":"Q57516278","brand:wikipedia":"de:Meisterbäckerei Steinecke",name:"Steinecke",shop:"bakery"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/bakery/Sternenbäck":{name:"Sternenbäck",icon:"maki-bakery",imageURL:"https://graph.facebook.com/sternenbaeck/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62595021",shop:"bakery"},addTags:{brand:"Sternenbäck","brand:wikidata":"Q62595021",name:"Sternenbäck",shop:"bakery"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/bakery/Ströck":{name:"Ströck",icon:"maki-bakery",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FLogo%204C.png&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q2357607",shop:"bakery"},addTags:{brand:"Ströck","brand:wikidata":"Q2357607","brand:wikipedia":"de:Ströck-Brot",name:"Ströck",shop:"bakery"},countryCodes:["at"],terms:[],matchScore:2,suggestion:true},"shop/bakery/Wiener Feinbäcker":{name:"Wiener Feinbäcker",icon:"maki-bakery",geometry:["point","area"],tags:{"brand:wikidata":"Q15854357",shop:"bakery"},addTags:{brand:"Wiener Feinbäcker","brand:wikidata":"Q15854357","brand:wikipedia":"de:Wiener Feinbäckerei Heberer",name:"Wiener Feinbäcker",shop:"bakery"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/bakery/von Allwörden":{name:"von Allwörden",icon:"maki-bakery",imageURL:"https://graph.facebook.com/allwoerden/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q60411349",shop:"bakery"},addTags:{brand:"von Allwörden","brand:wikidata":"Q60411349","brand:wikipedia":"nds:Heinrich von Allwörden GmbH",name:"von Allwörden",shop:"bakery"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/bakery/뚜레쥬르":{name:"뚜레쥬르",icon:"maki-bakery",imageURL:"https://graph.facebook.com/TousLesJoursUSA/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3535609",shop:"bakery"},addTags:{brand:"뚜레쥬르","brand:en":"Tous Les Jours","brand:ko":"뚜레쥬르","brand:wikidata":"Q3535609","brand:wikipedia":"ko:뚜레쥬르",name:"뚜레쥬르","name:en":"Tous Les Jours","name:ko":"뚜레쥬르",shop:"bakery"},countryCodes:["kr"],terms:["뚜레주르"],matchScore:2,suggestion:true},"shop/beauty/Bath & Body Works":{name:"Bath & Body Works",icon:"maki-shop",imageURL:"https://pbs.twimg.com/profile_images/1077920705352777733/OtRwUUoo_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q810773",shop:"beauty"},addTags:{brand:"Bath & Body Works","brand:wikidata":"Q810773","brand:wikipedia":"en:Bath & Body Works",name:"Bath & Body Works",shop:"beauty"},terms:[],matchScore:2,suggestion:true},"shop/beauty/European Wax Center":{name:"European Wax Center",icon:"maki-shop",geometry:["point","area"],tags:{"brand:wikidata":"Q5413426",shop:"beauty"},addTags:{beauty:"waxing",brand:"European Wax Center","brand:wikidata":"Q5413426","brand:wikipedia":"en:European Wax Center",name:"European Wax Center",shop:"beauty"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/beauty/Indigo Sun":{name:"Indigo Sun",icon:"maki-shop",imageURL:"https://graph.facebook.com/indigosunretail/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q63436906",shop:"beauty"},addTags:{beauty:"tanning",brand:"Indigo Sun","brand:wikidata":"Q63436906",name:"Indigo Sun",shop:"beauty"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/beauty/Ulta Beauty":{name:"Ulta Beauty",icon:"maki-shop",imageURL:"https://graph.facebook.com/UltaBeauty/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7880076",shop:"beauty"},addTags:{brand:"Ulta Beauty","brand:wikidata":"Q7880076","brand:wikipedia":"en:Ulta Beauty",name:"Ulta Beauty",shop:"beauty"},countryCodes:["us"],terms:["ulta"],matchScore:2,suggestion:true},"shop/beauty/Yves Rocher":{name:"Yves Rocher",icon:"maki-shop",imageURL:"https://graph.facebook.com/YvesRocherUSA/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q28496595",shop:"beauty"},addTags:{brand:"Yves Rocher","brand:wikidata":"Q28496595","brand:wikipedia":"en:Yves Rocher (company)",name:"Yves Rocher",shop:"beauty"},terms:[],matchScore:2,suggestion:true},"shop/bed/Dreams":{name:"Dreams",icon:"maki-lodging",imageURL:"https://graph.facebook.com/dreamsbeds/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5306688",shop:"bed"},addTags:{brand:"Dreams","brand:wikidata":"Q5306688","brand:wikipedia":"en:Dreams (bed retailer)",name:"Dreams",shop:"bed"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/bed/Matratzen Concord":{name:"Matratzen Concord",icon:"maki-lodging",imageURL:"https://graph.facebook.com/MatratzenConcord/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q18629057",shop:"bed"},addTags:{brand:"Matratzen Concord","brand:wikidata":"Q18629057","brand:wikipedia":"de:Matratzen Concord",name:"Matratzen Concord",shop:"bed"},countryCodes:["at","ch","de"],terms:[],matchScore:2,suggestion:true},"shop/bed/Mattress Firm":{name:"Mattress Firm",icon:"maki-lodging",imageURL:"https://graph.facebook.com/MattressFirm/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6791878",shop:"bed"},addTags:{brand:"Mattress Firm","brand:wikidata":"Q6791878","brand:wikipedia":"en:Mattress Firm",name:"Mattress Firm",shop:"bed"},countryCodes:["us"],terms:["sleepys"],matchScore:2,suggestion:true},"shop/bed/Mattress Warehouse":{name:"Mattress Warehouse",icon:"maki-lodging",imageURL:"https://graph.facebook.com/mattresswhse/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q61995079",shop:"bed"},addTags:{brand:"Mattress Warehouse","brand:wikidata":"Q61995079",name:"Mattress Warehouse",shop:"bed"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/bed/Sleep Country":{name:"Sleep Country",icon:"maki-lodging",imageURL:"https://graph.facebook.com/SleepCountryCanada/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7539684",shop:"bed"},addTags:{brand:"Sleep Country","brand:wikidata":"Q7539684","brand:wikipedia":"en:Sleep Country Canada",name:"Sleep Country",shop:"bed"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"shop/bed/Sleep Number":{name:"Sleep Number",icon:"maki-lodging",imageURL:"https://graph.facebook.com/SleepNumber/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7447640",shop:"bed"},addTags:{brand:"Sleep Number","brand:wikidata":"Q7447640","brand:wikipedia":"en:Sleep Number",name:"Sleep Number",shop:"bed"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/beverages/Dursty":{name:"Dursty",icon:"maki-shop",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FDursty%20Logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q1267518",shop:"beverages"},addTags:{brand:"Dursty","brand:wikidata":"Q1267518","brand:wikipedia":"de:Dursty Getränkemärkte",name:"Dursty",shop:"beverages"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/beverages/Edeka Getränkemarkt":{name:"Edeka Getränkemarkt",icon:"maki-shop",geometry:["point","area"],tags:{"brand:wikidata":"Q57450576",shop:"beverages"},addTags:{brand:"Edeka Getränkemarkt","brand:wikidata":"Q57450576",name:"Edeka Getränkemarkt",shop:"beverages"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/beverages/Fristo":{name:"Fristo",icon:"maki-shop",geometry:["point","area"],tags:{"brand:wikidata":"Q1465151",shop:"beverages"},addTags:{brand:"Fristo","brand:wikidata":"Q1465151","brand:wikipedia":"de:Fristo",name:"Fristo",shop:"beverages"},countryCodes:["at","de"],terms:["fristo getränkemarkt"],matchScore:2,suggestion:true},"shop/beverages/Getränke Hoffmann":{name:"Getränke Hoffmann",icon:"maki-shop",imageURL:"https://graph.facebook.com/getraenkehoffmann/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q19284021",shop:"beverages"},addTags:{brand:"Getränke Hoffmann","brand:wikidata":"Q19284021","brand:wikipedia":"de:Getränke Hoffmann",name:"Getränke Hoffmann",shop:"beverages"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/beverages/Getränkeland":{name:"Getränkeland",icon:"maki-shop",imageURL:"https://graph.facebook.com/Getraenkeland/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62594849",shop:"beverages"},addTags:{brand:"Getränkeland","brand:wikidata":"Q62594849",name:"Getränkeland",shop:"beverages"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/beverages/Hol'ab":{name:"Hol'ab",icon:"maki-shop",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FLogo%20hol%20ab.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q57557270",shop:"beverages"},addTags:{brand:"Hol'ab","brand:wikidata":"Q57557270",name:"Hol'ab",shop:"beverages"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/beverages/Orterer Getränkemarkt":{name:"Orterer Getränkemarkt",icon:"maki-shop",geometry:["point","area"],tags:{"brand:wikidata":"Q23787118",shop:"beverages"},addTags:{brand:"Orterer Getränkemarkt","brand:wikidata":"Q23787118","brand:wikipedia":"de:Orterer Gruppe",name:"Orterer Getränkemarkt",shop:"beverages"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/beverages/Rewe Getränkemarkt":{name:"Rewe Getränkemarkt",icon:"maki-shop",geometry:["point","area"],tags:{"brand:wikidata":"Q57519344",shop:"beverages"},addTags:{brand:"Rewe Getränkemarkt","brand:wikidata":"Q57519344",name:"Rewe Getränkemarkt",shop:"beverages"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/beverages/Trinkgut":{name:"Trinkgut",icon:"maki-shop",imageURL:"https://graph.facebook.com/trinkgut/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2453627",shop:"beverages"},addTags:{brand:"Trinkgut","brand:wikidata":"Q2453627","brand:wikipedia":"de:Trinkgut",name:"Trinkgut",shop:"beverages"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/beverages/清心福全":{name:"清心福全",icon:"maki-shop",imageURL:"https://graph.facebook.com/chingshin1987/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q10391229",shop:"beverages"},addTags:{brand:"清心福全","brand:wikidata":"Q10391229","brand:wikipedia":"zh:清心福全冷飲站",name:"清心福全",shop:"beverages"},countryCodes:["tw"],terms:[],matchScore:2,suggestion:true},"shop/bicycle/Evans Cycles":{name:"Evans Cycles",icon:"maki-bicycle",imageURL:"https://graph.facebook.com/evanscycles/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5415901",shop:"bicycle"},addTags:{brand:"Evans Cycles","brand:wikidata":"Q5415901","brand:wikipedia":"en:Evans Cycles",name:"Evans Cycles",shop:"bicycle"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/bicycle/Fri BikeShop":{name:"Fri BikeShop",icon:"maki-bicycle",imageURL:"https://graph.facebook.com/Cykelbutikken/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q26721030",shop:"bicycle"},addTags:{brand:"Fri BikeShop","brand:wikidata":"Q26721030",name:"Fri BikeShop",shop:"bicycle"},countryCodes:["dk"],terms:[],matchScore:2,suggestion:true},"shop/bicycle/Giant":{name:"Giant",icon:"maki-bicycle",imageURL:"https://graph.facebook.com/giantbicycles/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q703557",shop:"bicycle"},addTags:{brand:"Giant","brand:wikidata":"Q703557","brand:wikipedia":"en:Giant Bicycles",name:"Giant",shop:"bicycle"},terms:[],matchScore:2,suggestion:true},"shop/bicycle/サイクルベースあさひ":{name:"サイクルベースあさひ",icon:"maki-bicycle",imageURL:"https://graph.facebook.com/cbasahi/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11257202",shop:"bicycle"},addTags:{brand:"サイクルベースあさひ","brand:en":"Cycle Base Asahi","brand:ja":"サイクルベースあさひ","brand:wikidata":"Q11257202","brand:wikipedia":"ja:あさひ (企業)",name:"サイクルベースあさひ","name:en":"Cycle Base Asahi","name:ja":"サイクルベースあさひ",shop:"bicycle"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/bookmaker/Betfred":{name:"Betfred",icon:"maki-shop",imageURL:"https://pbs.twimg.com/profile_images/1034363254758359041/dxetDfNN_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q4897425",shop:"bookmaker"},addTags:{brand:"Betfred","brand:wikidata":"Q4897425","brand:wikipedia":"en:Betfred",name:"Betfred",shop:"bookmaker"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/bookmaker/Coral":{name:"Coral",icon:"maki-shop",geometry:["point","area"],tags:{"brand:wikidata":"Q54621344",shop:"bookmaker"},addTags:{brand:"Coral","brand:wikidata":"Q54621344","brand:wikipedia":"en:Coral (bookmaker)",name:"Coral",shop:"bookmaker"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/bookmaker/Fortuna":{name:"Fortuna",icon:"maki-shop",geometry:["point","area"],tags:{"brand:wikidata":"Q25857973",shop:"bookmaker"},addTags:{brand:"Fortuna","brand:wikidata":"Q25857973","brand:wikipedia":"en:Fortuna Entertainment Group",name:"Fortuna",shop:"bookmaker"},countryCodes:["cz","hr","pl","ro","sk"],terms:[],matchScore:2,suggestion:true},"shop/bookmaker/Ladbrokes":{name:"Ladbrokes",icon:"maki-shop",imageURL:"https://pbs.twimg.com/profile_images/1037325155310161921/6E9Rvy3Y_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q1799875",shop:"bookmaker"},addTags:{brand:"Ladbrokes","brand:wikidata":"Q1799875","brand:wikipedia":"en:Ladbrokes Coral",name:"Ladbrokes",shop:"bookmaker"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/bookmaker/Paddy Power":{name:"Paddy Power",icon:"maki-shop",imageURL:"https://pbs.twimg.com/profile_images/964533060942299136/XCPfJNxf_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q3888718",shop:"bookmaker"},addTags:{brand:"Paddy Power","brand:wikidata":"Q3888718","brand:wikipedia":"en:Paddy Power",name:"Paddy Power",shop:"bookmaker"},countryCodes:["gb","ie"],terms:[],matchScore:2,suggestion:true},"shop/bookmaker/Tipico":{name:"Tipico",icon:"maki-shop",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FTipico%20Unternehmenslogo.jpg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q15851003",shop:"bookmaker"},addTags:{brand:"Tipico","brand:wikidata":"Q15851003","brand:wikipedia":"en:Tipico",name:"Tipico",shop:"bookmaker"},countryCodes:["at","co","de","gi","hr","mt"],terms:[],matchScore:2,suggestion:true},"shop/bookmaker/William Hill":{name:"William Hill",icon:"maki-shop",imageURL:"https://pbs.twimg.com/profile_images/797028677733253120/bW9oFXT-_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q4053147",shop:"bookmaker"},addTags:{brand:"William Hill","brand:wikidata":"Q4053147","brand:wikipedia":"en:William Hill (bookmaker)",name:"William Hill",shop:"bookmaker"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/bookmaker/ΟΠΑΠ":{name:"ΟΠΑΠ",icon:"maki-shop",geometry:["point","area"],tags:{"brand:wikidata":"Q2007823",shop:"bookmaker"},addTags:{brand:"ΟΠΑΠ","brand:el":"ΟΠΑΠ","brand:en":"OPAP","brand:wikidata":"Q2007823","brand:wikipedia":"en:OPAP",name:"ΟΠΑΠ","name:el":"ΟΠΑΠ","name:en":"OPAP",shop:"bookmaker"},countryCodes:["gr"],terms:[],matchScore:2,suggestion:true},"shop/bookmaker/Лига ставок":{name:"Лига ставок",icon:"maki-shop",geometry:["point","area"],tags:{"brand:wikidata":"Q6545804",shop:"bookmaker"},addTags:{brand:"Лига ставок","brand:en":"Liga Stavok","brand:ru":"Лига ставок","brand:wikidata":"Q6545804","brand:wikipedia":"ru:Лига Ставок",name:"Лига ставок","name:en":"Liga Stavok","name:ru":"Лига ставок",shop:"bookmaker"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"shop/bookmaker/Фонбет":{name:"Фонбет",icon:"maki-shop",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FFonbet%20logo.jpg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q49137910",shop:"bookmaker"},addTags:{brand:"Фонбет","brand:en":"Fonbet","brand:ru":"Фонбет","brand:wikidata":"Q49137910","brand:wikipedia":"ru:Фонбет",name:"Фонбет","name:en":"Fonbet","name:ru":"Фонбет",shop:"bookmaker"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"shop/books/Akademibokhandeln":{name:"Akademibokhandeln",icon:"fas-book",imageURL:"https://graph.facebook.com/Akademibokhandeln/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q10403918",shop:"books"},addTags:{brand:"Akademibokhandeln","brand:wikidata":"Q10403918","brand:wikipedia":"sv:Akademibokhandeln",name:"Akademibokhandeln",shop:"books"},countryCodes:["se"],terms:[],matchScore:2,suggestion:true},"shop/books/Barnes & Noble":{name:"Barnes & Noble",icon:"fas-book",imageURL:"https://graph.facebook.com/barnesandnoble/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q795454",shop:"books"},addTags:{brand:"Barnes & Noble","brand:wikidata":"Q795454","brand:wikipedia":"en:Barnes & Noble",name:"Barnes & Noble",shop:"books"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/books/Bruna":{name:"Bruna",icon:"fas-book",imageURL:"https://graph.facebook.com/Brunawinkels/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3317555",shop:"books"},addTags:{brand:"Bruna","brand:wikidata":"Q3317555","brand:wikipedia":"en:Bruna (company)",name:"Bruna",shop:"books"},countryCodes:["nl"],terms:[],matchScore:2,suggestion:true},"shop/books/Chapters":{name:"Chapters",icon:"fas-book",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FChapters%20Logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q5073540",shop:"books"},addTags:{brand:"Chapters","brand:wikidata":"Q5073540","brand:wikipedia":"en:Chapters (bookstore)",name:"Chapters",shop:"books"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"shop/books/Cultura":{name:"Cultura",icon:"fas-book",imageURL:"https://graph.facebook.com/culturafr/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3007154",shop:"books"},addTags:{brand:"Cultura","brand:wikidata":"Q3007154","brand:wikipedia":"fr:Cultura",name:"Cultura",shop:"books"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"shop/books/Empik":{name:"Empik",icon:"fas-book",imageURL:"https://graph.facebook.com/empikcom/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3045978",shop:"books"},addTags:{brand:"Empik","brand:wikidata":"Q3045978","brand:wikipedia":"pl:Empik",name:"Empik",shop:"books"},countryCodes:["pl"],terms:[],matchScore:2,suggestion:true},"shop/books/Fnac":{name:"Fnac",icon:"fas-book",imageURL:"https://graph.facebook.com/Fnac/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q676585",shop:"books"},addTags:{brand:"Fnac","brand:wikidata":"Q676585","brand:wikipedia":"en:Fnac",name:"Fnac",shop:"books"},countryCodes:["be","ch","es","fr","nl","pt"],terms:[],matchScore:2,suggestion:true},"shop/books/Half Price Books":{name:"Half Price Books",icon:"fas-book",imageURL:"https://graph.facebook.com/halfpricebooks/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5641744",shop:"books"},addTags:{brand:"Half Price Books","brand:wikidata":"Q5641744","brand:wikipedia":"en:Half Price Books",name:"Half Price Books",shop:"books"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/books/Hugendubel":{name:"Hugendubel",icon:"fas-book",imageURL:"https://graph.facebook.com/hugendubelbuchhandlungen/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1634142",shop:"books"},addTags:{brand:"Hugendubel","brand:wikidata":"Q1634142","brand:wikipedia":"en:Hugendubel",name:"Hugendubel",shop:"books"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/books/Mondadori":{name:"Mondadori",icon:"fas-book",imageURL:"https://graph.facebook.com/GruppoMondadori/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q85355",shop:"books"},addTags:{brand:"Mondadori","brand:wikidata":"Q85355","brand:wikipedia":"en:Arnoldo Mondadori Editore",name:"Mondadori",shop:"books"},countryCodes:["it"],terms:[],matchScore:2,suggestion:true},"shop/books/National Book Store":{name:"National Book Store",icon:"fas-book",imageURL:"https://graph.facebook.com/nbsalert/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6971094",shop:"books"},addTags:{brand:"National Book Store","brand:wikidata":"Q6971094","brand:wikipedia":"en:National Book Store",name:"National Book Store",shop:"books"},countryCodes:["ph"],terms:[],matchScore:2,suggestion:true},"shop/books/Standaard Boekhandel":{name:"Standaard Boekhandel",icon:"fas-book",imageURL:"https://graph.facebook.com/standaardboekhandel/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3496554",shop:"books"},addTags:{brand:"Standaard Boekhandel","brand:wikidata":"Q3496554","brand:wikipedia":"nl:Standaard Boekhandel",name:"Standaard Boekhandel",shop:"books"},countryCodes:["be"],terms:[],matchScore:2,suggestion:true},"shop/books/TSUTAYA":{name:"TSUTAYA",icon:"fas-book",imageURL:"https://pbs.twimg.com/profile_images/1016247734720851968/R9agm3pA_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q5193457",shop:"books"},addTags:{brand:"TSUTAYA","brand:wikidata":"Q5193457","brand:wikipedia":"ja:カルチュア・コンビニエンス・クラブ",name:"TSUTAYA",shop:"books"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/books/Thalia":{name:"Thalia",icon:"fas-book",imageURL:"https://graph.facebook.com/thalia.de/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2408854",shop:"books"},addTags:{brand:"Thalia","brand:wikidata":"Q2408854","brand:wikipedia":"de:Thalia Bücher",name:"Thalia",shop:"books"},countryCodes:["at","ch","de"],terms:[],matchScore:2,suggestion:true},"shop/books/The Works":{name:"The Works",icon:"fas-book",imageURL:"https://graph.facebook.com/TheWorksStores/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7775853",shop:"books"},addTags:{brand:"The Works","brand:wikidata":"Q7775853","brand:wikipedia":"en:The Works (retailer)",name:"The Works",shop:"books"},countryCodes:["gb","ie"],terms:[],matchScore:2,suggestion:true},"shop/books/Waterstones":{name:"Waterstones",icon:"fas-book",imageURL:"https://graph.facebook.com/waterstones/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q151779",shop:"books"},addTags:{brand:"Waterstones","brand:wikidata":"Q151779","brand:wikipedia":"en:Waterstones",name:"Waterstones",shop:"books"},countryCodes:["be","gb","ie","je","nl"],terms:[],matchScore:2,suggestion:true},"shop/books/Weltbild":{name:"Weltbild",icon:"fas-book",imageURL:"https://graph.facebook.com/weltbild/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q883522",shop:"books"},addTags:{brand:"Weltbild","brand:wikidata":"Q883522","brand:wikipedia":"en:Weltbild Publishing Group",name:"Weltbild",shop:"books"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/books/Буквоед":{name:"Буквоед",icon:"fas-book",imageURL:"https://graph.facebook.com/SuperBookvoed/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4098549",shop:"books"},addTags:{brand:"Буквоед","brand:wikidata":"Q4098549","brand:wikipedia":"ru:Буквоед",name:"Буквоед",shop:"books"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"shop/books/Дом книги":{name:"Дом книги",icon:"fas-book",imageURL:"https://graph.facebook.com/spbdk/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q48950742",shop:"books"},addTags:{brand:"Дом книги","brand:wikidata":"Q48950742","brand:wikipedia":"ru:Московский дом книги",name:"Дом книги",shop:"books"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"shop/books/Читай-город":{name:"Читай-город",icon:"fas-book",imageURL:"https://graph.facebook.com/chitaigorod/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4516645",shop:"books"},addTags:{brand:"Читай-город","brand:wikidata":"Q4516645","brand:wikipedia":"ru:Читай-город",name:"Читай-город",shop:"books"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"shop/books/あおい書店":{name:"あおい書店",icon:"fas-book",imageURL:"https://graph.facebook.com/aoi.bookstore/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11256783",shop:"books"},addTags:{brand:"あおい書店","brand:en":"AOI","brand:ja":"あおい書店","brand:wikidata":"Q11256783","brand:wikipedia":"ja:あおい書店",name:"あおい書店","name:en":"AOI","name:ja":"あおい書店",shop:"books"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/books/ブックオフ":{name:"ブックオフ",icon:"fas-book",imageURL:"https://graph.facebook.com/bookoffcorporation/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q893011",shop:"books"},addTags:{brand:"ブックオフ","brand:en":"Book Off","brand:ja":"ブックオフ","brand:wikidata":"Q893011","brand:wikipedia":"en:Book Off",name:"ブックオフ","name:en":"Book Off","name:ja":"ブックオフ",shop:"books"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/books/メロンブックス":{name:"メロンブックス",icon:"fas-book",imageURL:"https://pbs.twimg.com/profile_images/877364475304714240/Ael4G2BP_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q10851653",shop:"books"},addTags:{brand:"メロンブックス","brand:en":"Melonbooks","brand:ja":"メロンブックス","brand:wikidata":"Q10851653","brand:wikipedia":"ja:メロンブックス",name:"メロンブックス","name:en":"Melonbooks","name:ja":"メロンブックス",shop:"books"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/books/リブロ":{name:"リブロ",icon:"fas-book",imageURL:"https://pbs.twimg.com/profile_images/624022283103801344/YjAC-2vv_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q6542768",shop:"books"},addTags:{brand:"リブロ","brand:en":"LIBRO","brand:ja":"リブロ","brand:wikidata":"Q6542768","brand:wikipedia":"ja:リブロ",name:"リブロ","name:en":"Libro","name:ja":"リブロ",shop:"books"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/books/三省堂書店":{name:"三省堂書店",icon:"fas-book",imageURL:"https://graph.facebook.com/books.sanseido/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q10866539",shop:"books"},addTags:{brand:"三省堂書店","brand:en":"Books Sanseido","brand:ja":"三省堂書店","brand:wikidata":"Q10866539","brand:wikipedia":"ja:三省堂書店",name:"三省堂書店","name:en":"Books Sanseido","name:ja":"三省堂書店",shop:"books"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/books/文教堂":{name:"文教堂",icon:"fas-book",geometry:["point","area"],tags:{"brand:wikidata":"Q11499974",shop:"books"},addTags:{brand:"文教堂","brand:en":"Bunkyodo","brand:ja":"文教堂","brand:wikidata":"Q11499974","brand:wikipedia":"ja:文教堂",name:"文教堂","name:en":"Bunkyodo","name:ja":"文教堂",shop:"books"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/books/新华书店":{name:"新华书店",icon:"fas-book",geometry:["point","area"],tags:{"brand:wikidata":"Q6124193",shop:"books"},addTags:{brand:"新华书店","brand:en":"Xinhua Bookstore","brand:wikidata":"Q6124193","brand:wikipedia":"en:Xinhua Bookstore","brand:zh":"新华书店",name:"新华书店","name:en":"Xinhua Bookstore","name:zh":"新华书店",shop:"books"},countryCodes:["cn"],terms:[],matchScore:2,suggestion:true},"shop/books/未来屋書店":{name:"未来屋書店",icon:"fas-book",imageURL:"https://graph.facebook.com/miraiyashoten/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11519563",shop:"books"},addTags:{brand:"未来屋書店","brand:en":"Miraiya Shoten","brand:ja":"未来屋書店","brand:wikidata":"Q11519563","brand:wikipedia":"ja:未来屋書店",name:"未来屋書店","name:en":"Miraiya Shoten","name:ja":"未来屋書店",shop:"books"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/butcher/Coqivoire":{name:"Coqivoire",icon:"fas-bacon",geometry:["point","area"],tags:{"brand:wikidata":"Q60183284",shop:"butcher"},addTags:{brand:"Coqivoire","brand:wikidata":"Q60183284",butcher:"poultry",name:"Coqivoire",shop:"butcher"},countryCodes:["ci"],terms:[],matchScore:2,suggestion:true},"shop/butcher/Foani":{name:"Foani",icon:"fas-bacon",imageURL:"https://graph.facebook.com/foaniservices/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q60183335",shop:"butcher"},addTags:{brand:"Foani","brand:wikidata":"Q60183335",butcher:"poultry",name:"Foani",shop:"butcher"},countryCodes:["ci"],terms:[],matchScore:2,suggestion:true},"shop/butcher/Vinzenzmurr":{name:"Vinzenzmurr",icon:"fas-bacon",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FVinzenzmurr%20logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q2527361",shop:"butcher"},addTags:{brand:"Vinzenzmurr","brand:wikidata":"Q2527361","brand:wikipedia":"de:Vinzenzmurr",name:"Vinzenzmurr",shop:"butcher"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/butcher/Великолукский мясокомбинат":{name:"Великолукский мясокомбинат",icon:"fas-bacon",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2F%D0%92%D0%B5%D0%BB%D0%B8%D0%BA%D0%BE%D0%BB%D1%83%D0%BA%D1%81%D0%BA%D0%B8%D0%B9%20%D0%BC%D1%8F%D1%81%D0%BE%D0%BA%D0%BE%D0%BC%D0%B1%D0%B8%D0%BD%D0%B0%D1%82.png&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q18401767",shop:"butcher"},addTags:{brand:"Великолукский мясокомбинат","brand:wikidata":"Q18401767","brand:wikipedia":"ru:Великолукский мясокомбинат",name:"Великолукский мясокомбинат",shop:"butcher"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"shop/butcher/Родинна ковбаска":{name:"Родинна ковбаска",icon:"fas-bacon",geometry:["point","area"],tags:{"brand:wikidata":"Q30969660",shop:"butcher"},addTags:{brand:"Родинна ковбаска","brand:en":"Rodynna-kovbaska","brand:wikidata":"Q30969660","brand:wikipedia":"uk:ТзОВ «Барком»",name:"Родинна ковбаска","name:en":"Rodynna-kovbaska",shop:"butcher"},countryCodes:["ua"],terms:[],matchScore:2,suggestion:true},"shop/butcher/肉のハナマサ":{name:"肉のハナマサ",icon:"fas-bacon",geometry:["point","area"],tags:{"brand:wikidata":"Q11326564",shop:"butcher"},addTags:{brand:"ハナマサ","brand:en":"Hanamasa","brand:ja":"ハナマサ","brand:wikidata":"Q11326564","brand:wikipedia":"ja:ハナマサ",butcher:"beef",name:"肉のハナマサ","name:en":"Hanamasa Meat","name:ja":"肉のハナマサ",shop:"butcher"},countryCodes:["jp"],terms:["ハナマサ"],matchScore:2,suggestion:true},"shop/candles/Yankee Candle":{name:"Yankee Candle",icon:"fas-burn",imageURL:"https://graph.facebook.com/Yankeecandle/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q8048733",shop:"candles"},addTags:{brand:"Yankee Candle","brand:wikidata":"Q8048733","brand:wikipedia":"en:Yankee Candle",name:"Yankee Candle",shop:"candles"},terms:[],matchScore:2,suggestion:true},"shop/car_parts/Advance Auto Parts":{name:"Advance Auto Parts",icon:"fas-car-battery",imageURL:"https://graph.facebook.com/advanceautoparts/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4686051",shop:"car_parts"},addTags:{brand:"Advance Auto Parts","brand:wikidata":"Q4686051","brand:wikipedia":"en:Advance Auto Parts",name:"Advance Auto Parts",shop:"car_parts"},countryCodes:["ca","pr","us","vi"],terms:[],matchScore:2,suggestion:true},"shop/car_parts/AutoZone":{name:"AutoZone",icon:"fas-car-battery",imageURL:"https://graph.facebook.com/autozone/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4826087",shop:"car_parts"},addTags:{brand:"AutoZone","brand:wikidata":"Q4826087","brand:wikipedia":"en:AutoZone",name:"AutoZone",shop:"car_parts"},countryCodes:["br","mx","us"],terms:[],matchScore:2,suggestion:true},"shop/car_parts/Halfords":{name:"Halfords",icon:"fas-car-battery",imageURL:"https://graph.facebook.com/HalfordsUK/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3398786",shop:"car_parts"},addTags:{brand:"Halfords","brand:wikidata":"Q3398786","brand:wikipedia":"en:Halfords",name:"Halfords","service:bicycle:retail":"yes",shop:"car_parts"},countryCodes:["gb","ie"],terms:[],matchScore:2,suggestion:true},"shop/car_parts/NAPA Auto Parts":{name:"NAPA Auto Parts",icon:"fas-car-battery",imageURL:"https://graph.facebook.com/NAPAAUTOPARTS/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6970842",shop:"car_parts"},addTags:{brand:"NAPA Auto Parts","brand:wikidata":"Q6970842","brand:wikipedia":"en:National Automotive Parts Association",name:"NAPA Auto Parts",operator:"Genuine Parts Company","operator:wikidata":"Q5533818","operator:wikipedia":"en:Genuine Parts Company",shop:"car_parts"},countryCodes:["ca","mx","us"],terms:["napa"],matchScore:2,suggestion:true},"shop/car_parts/O'Reilly Auto Parts":{name:"O'Reilly Auto Parts",icon:"fas-car-battery",imageURL:"https://graph.facebook.com/oreillyautoparts/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7071951",shop:"car_parts"},addTags:{brand:"O'Reilly Auto Parts","brand:wikidata":"Q7071951","brand:wikipedia":"en:O'Reilly Auto Parts",name:"O'Reilly Auto Parts",shop:"car_parts"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/car_parts/Repco":{name:"Repco",icon:"fas-car-battery",imageURL:"https://graph.facebook.com/RepcoAusCareers/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q173425",shop:"car_parts"},addTags:{brand:"Repco","brand:wikidata":"Q173425","brand:wikipedia":"en:Repco",name:"Repco",shop:"car_parts"},countryCodes:["au","nz"],terms:[],matchScore:2,suggestion:true},"shop/car_parts/Supercheap Auto":{name:"Supercheap Auto",icon:"fas-car-battery",imageURL:"https://graph.facebook.com/scauto/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7643119",shop:"car_parts"},addTags:{brand:"Supercheap Auto","brand:wikidata":"Q7643119","brand:wikipedia":"en:Supercheap Auto",name:"Supercheap Auto",shop:"car_parts"},countryCodes:["au","nz"],terms:[],matchScore:2,suggestion:true},"shop/car_parts/Автомир":{name:"Автомир",icon:"fas-car-battery",imageURL:"https://graph.facebook.com/avtomir.cars/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4056321",shop:"car_parts"},addTags:{brand:"Автомир","brand:wikidata":"Q4056321","brand:wikipedia":"ru:Автомир (автодилер)",name:"Автомир",shop:"car_parts"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"shop/car_parts/イエローハット":{name:"イエローハット",icon:"fas-car-battery",imageURL:"https://graph.facebook.com/YellowHatUAE/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11285915",shop:"car_parts"},addTags:{brand:"イエローハット","brand:en":"Yellow Hat","brand:ja":"イエローハット","brand:wikidata":"Q11285915","brand:wikipedia":"ja:イエローハット",name:"イエローハット","name:en":"Yellow Hat","name:ja":"イエローハット",shop:"car_parts"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/car_parts/オートバックス":{name:"オートバックス",icon:"fas-car-battery",imageURL:"https://graph.facebook.com/autobacs.seven/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7886426",shop:"car_parts"},addTags:{brand:"オートバックス","brand:en":"Autobacs","brand:ja":"オートバックス","brand:wikidata":"Q7886426","brand:wikipedia":"ja:オートバックスセブン",name:"オートバックス","name:en":"Autobacs","name:ja":"オートバックス",shop:"car_parts"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/car_parts/タイヤ館":{name:"タイヤ館",icon:"fas-car-battery",imageURL:"https://pbs.twimg.com/profile_images/1069402555938037761/aK6lJYjW_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q11315808",shop:"car_parts"},addTags:{brand:"タイヤ館","brand:en":"Taiyakan","brand:ja":"タイヤ館","brand:wikidata":"Q11315808","brand:wikipedia":"ja:タイヤ館",name:"タイヤ館","name:en":"Taiyakan","name:ja":"タイヤ館",shop:"car_parts"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/car_repair/A.T.U":{name:"A.T.U",icon:"maki-car-repair",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FAuto-Teile-Unger%20Logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q784721",shop:"car_repair"},addTags:{brand:"A.T.U","brand:wikidata":"Q784721","brand:wikipedia":"de:Auto-Teile-Unger",name:"A.T.U",shop:"car_repair"},countryCodes:["at","de"],terms:["auto-teile-unger"],matchScore:2,suggestion:true},"shop/car_repair/ATS Euromaster":{name:"ATS Euromaster",icon:"maki-car-repair",imageURL:"https://pbs.twimg.com/profile_images/572348690115751936/8zWGjm2u_bigger.jpeg",geometry:["point","area"],tags:{"brand:wikidata":"Q4654920",shop:"car_repair"},addTags:{brand:"ATS Euromaster","brand:wikidata":"Q4654920","brand:wikipedia":"en:ATS Euromaster",name:"ATS Euromaster",shop:"car_repair"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/car_repair/BestDrive":{name:"BestDrive",icon:"maki-car-repair",geometry:["point","area"],tags:{"brand:wikidata":"Q63057183",shop:"car_repair"},addTags:{brand:"BestDrive","brand:wikidata":"Q63057183",name:"BestDrive",shop:"car_repair"},countryCodes:["cz","fr","sk"],terms:[],matchScore:2,suggestion:true},"shop/car_repair/Bosch Car Service":{name:"Bosch Car Service",icon:"maki-car-repair",imageURL:"https://graph.facebook.com/BoschGlobal/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q234021",shop:"car_repair"},addTags:{brand:"Bosch Car Service","brand:wikidata":"Q234021","brand:wikipedia":"en:Robert Bosch GmbH",name:"Bosch Car Service",shop:"car_repair"},terms:["bosch service"],matchScore:2,suggestion:true},"shop/car_repair/Brakes Plus":{name:"Brakes Plus",icon:"maki-car-repair",imageURL:"https://graph.facebook.com/BrakesPlus.CompleteAutoService/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62075246",shop:"car_repair"},addTags:{brand:"Brakes Plus","brand:wikidata":"Q62075246",name:"Brakes Plus",shop:"car_repair"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/car_repair/Car-X":{name:"Car-X",icon:"maki-car-repair",imageURL:"https://graph.facebook.com/CarxAuto/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q63859189",shop:"car_repair"},addTags:{brand:"Car-X","brand:wikidata":"Q63859189",name:"Car-X",shop:"car_repair"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/car_repair/Carglass":{name:"Carglass",icon:"maki-car-repair",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FCarglass-Logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q1035997",shop:"car_repair"},addTags:{brand:"Carglass","brand:wikidata":"Q1035997","brand:wikipedia":"de:Carglass",name:"Carglass",shop:"car_repair"},terms:[],matchScore:2,suggestion:true},"shop/car_repair/Citroën":{name:"Citroën",icon:"maki-car-repair",imageURL:"https://graph.facebook.com/Citroen/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6746",shop:"car_repair"},addTags:{brand:"Citroën","brand:wikidata":"Q6746","brand:wikipedia":"fr:Citroën",name:"Citroën",shop:"car_repair"},terms:[],matchScore:2,suggestion:true},"shop/car_repair/Dekra":{name:"Dekra",icon:"maki-car-repair",geometry:["point","area"],tags:{"brand:wikidata":"Q383711",shop:"car_repair"},addTags:{brand:"Dekra","brand:wikidata":"Q383711","brand:wikipedia":"en:Dekra",name:"Dekra",shop:"car_repair"},countryCodes:["de","fr"],terms:[],matchScore:2,suggestion:true},"shop/car_repair/Euromaster":{name:"Euromaster",icon:"maki-car-repair",imageURL:"https://graph.facebook.com/ATSEUROMASTER/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3060668",shop:"car_repair"},addTags:{brand:"Euromaster","brand:wikidata":"Q3060668","brand:wikipedia":"de:Euromaster",name:"Euromaster",shop:"car_repair"},terms:[],matchScore:2,suggestion:true},"shop/car_repair/Feu Vert":{name:"Feu Vert",icon:"maki-car-repair",geometry:["point","area"],tags:{"brand:wikidata":"Q3070922",shop:"car_repair"},addTags:{brand:"Feu Vert","brand:wikidata":"Q3070922","brand:wikipedia":"fr:Feu vert (entreprise)",name:"Feu Vert",shop:"car_repair"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"shop/car_repair/Firestone":{name:"Firestone",icon:"maki-car-repair",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FFirestone.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q420837",shop:"car_repair"},addTags:{brand:"Firestone","brand:wikidata":"Q420837","brand:wikipedia":"en:Firestone Tire and Rubber Company",name:"Firestone",official_name:"Firestone Complete Auto Care",shop:"car_repair"},terms:["firestone complete auto care"],matchScore:2,suggestion:true},"shop/car_repair/Ford":{name:"Ford",icon:"maki-car-repair",imageURL:"https://graph.facebook.com/ford/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q44294",shop:"car_repair"},addTags:{brand:"Ford","brand:wikidata":"Q44294","brand:wikipedia":"en:Ford Motor Company",name:"Ford",shop:"car_repair"},terms:[],matchScore:2,suggestion:true},"shop/car_repair/Goodyear":{name:"Goodyear",icon:"maki-car-repair",imageURL:"https://pbs.twimg.com/profile_images/954462463201693697/KjS76bom_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q620875",shop:"car_repair"},addTags:{brand:"Goodyear","brand:wikidata":"Q620875","brand:wikipedia":"en:Goodyear Tire and Rubber Company",name:"Goodyear",shop:"car_repair"},terms:[],matchScore:2,suggestion:true},"shop/car_repair/Grease Monkey":{name:"Grease Monkey",icon:"maki-car-repair",imageURL:"https://pbs.twimg.com/profile_images/378800000339987868/7c204edba540760550511092472c11a0_bigger.jpeg",geometry:["point","area"],tags:{"brand:wikidata":"Q5598563",shop:"car_repair"},addTags:{brand:"Grease Monkey","brand:wikidata":"Q5598563","brand:wikipedia":"en:Grease Monkey (business)",name:"Grease Monkey",shop:"car_repair"},countryCodes:["cn","us"],terms:[],matchScore:2,suggestion:true},"shop/car_repair/Halfords Autocentre":{name:"Halfords Autocentre",icon:"maki-car-repair",imageURL:"https://pbs.twimg.com/profile_images/763666491522879488/IDO6pgKh_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q5641894",shop:"car_repair"},addTags:{brand:"Halfords Auocentre","brand:wikidata":"Q5641894","brand:wikipedia":"en:Halfords Autocentre",name:"Halfords Autocentre",shop:"car_repair"},countryCodes:["gb"],terms:["halfords"],matchScore:2,suggestion:true},"shop/car_repair/Jiffy Lube":{name:"Jiffy Lube",icon:"maki-car-repair",geometry:["point","area"],tags:{"brand:wikidata":"Q6192247",shop:"car_repair"},addTags:{brand:"Jiffy Lube","brand:wikidata":"Q6192247","brand:wikipedia":"en:Jiffy Lube",name:"Jiffy Lube",shop:"car_repair"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"shop/car_repair/Kwik Fit":{name:"Kwik Fit",icon:"maki-car-repair",imageURL:"https://pbs.twimg.com/profile_images/725269358449152000/1BFagDRC_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q958053",shop:"car_repair"},addTags:{brand:"Kwik Fit","brand:wikidata":"Q958053","brand:wikipedia":"en:Kwik Fit",name:"Kwik Fit",shop:"car_repair"},countryCodes:["gb","ie"],terms:[],matchScore:2,suggestion:true},"shop/car_repair/Meineke":{name:"Meineke",icon:"maki-car-repair",imageURL:"https://pbs.twimg.com/profile_images/724988942840266755/kpMpvs5I_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q6810159",shop:"car_repair"},addTags:{brand:"Meineke","brand:wikidata":"Q6810159","brand:wikipedia":"en:Meineke Car Care Centers",name:"Meineke",shop:"car_repair"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/car_repair/Mekonomen":{name:"Mekonomen",icon:"maki-car-repair",geometry:["point","area"],tags:{"brand:wikidata":"Q10580079",shop:"car_repair"},addTags:{brand:"Mekonomen","brand:wikidata":"Q10580079","brand:wikipedia":"sv:Mekonomen",name:"Mekonomen",shop:"car_repair"},countryCodes:["dk","no","se"],terms:[],matchScore:2,suggestion:true},"shop/car_repair/Midas":{name:"Midas",icon:"maki-car-repair",imageURL:"https://graph.facebook.com/Midas/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3312613",shop:"car_repair"},addTags:{brand:"Midas","brand:wikidata":"Q3312613","brand:wikipedia":"en:Midas (automotive service)",name:"Midas",shop:"car_repair"},terms:[],matchScore:2,suggestion:true},"shop/car_repair/Monro Muffler Brake":{name:"Monro Muffler Brake",icon:"maki-car-repair",imageURL:"https://graph.facebook.com/MonroAutoServiceTire/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6902090",shop:"car_repair"},addTags:{brand:"Monro Muffler Brake","brand:wikidata":"Q6902090","brand:wikipedia":"en:Monro Muffler Brake",name:"Monro Muffler Brake",shop:"car_repair"},countryCodes:["us"],terms:["monro"],matchScore:2,suggestion:true},"shop/car_repair/Mr. Lube":{name:"Mr. Lube",icon:"maki-car-repair",imageURL:"https://pbs.twimg.com/profile_images/448587010475692032/6J-h3__O_bigger.jpeg",geometry:["point","area"],tags:{"brand:wikidata":"Q17104067",shop:"car_repair"},addTags:{brand:"Mr. Lube","brand:wikidata":"Q17104067","brand:wikipedia":"en:Mr. Lube",name:"Mr. Lube",shop:"car_repair"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"shop/car_repair/Norauto":{name:"Norauto",icon:"maki-car-repair",geometry:["point","area"],tags:{"brand:wikidata":"Q3317698",shop:"car_repair"},addTags:{brand:"Norauto","brand:wikidata":"Q3317698","brand:wikipedia":"en:Mobivia Groupe",name:"Norauto",shop:"car_repair"},countryCodes:["ar","es","fr","hu","it","pl","pt","ro"],terms:[],matchScore:2,suggestion:true},"shop/car_repair/Pep Boys":{name:"Pep Boys",icon:"maki-car-repair",imageURL:"https://graph.facebook.com/pepboysauto/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3375007",shop:"car_repair"},addTags:{brand:"Pep Boys","brand:wikidata":"Q3375007","brand:wikipedia":"en:Pep Boys",name:"Pep Boys",shop:"car_repair"},countryCodes:["pr","us"],terms:[],matchScore:2,suggestion:true},"shop/car_repair/Peugeot":{name:"Peugeot",icon:"maki-car-repair",imageURL:"https://graph.facebook.com/Peugeot/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6742",shop:"car_repair"},addTags:{brand:"Peugeot","brand:wikidata":"Q6742","brand:wikipedia":"en:Peugeot",name:"Peugeot",shop:"car_repair"},terms:[],matchScore:2,suggestion:true},"shop/car_repair/Point S":{name:"Point S",icon:"maki-car-repair",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FPointS%204c%20klein.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q3393358",shop:"car_repair"},addTags:{brand:"Point S","brand:wikidata":"Q3393358","brand:wikipedia":"fr:Point S",name:"Point S",shop:"car_repair"},terms:[],matchScore:2,suggestion:true},"shop/car_repair/Renault":{name:"Renault",icon:"maki-car-repair",imageURL:"https://graph.facebook.com/Renault/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6686",shop:"car_repair"},addTags:{brand:"Renault","brand:wikidata":"Q6686","brand:wikipedia":"en:Renault",name:"Renault",shop:"car_repair"},terms:["garage renault"],matchScore:2,suggestion:true},"shop/car_repair/Roady":{name:"Roady",icon:"maki-car-repair",geometry:["point","area"],tags:{"brand:wikidata":"Q3434112",shop:"car_repair"},addTags:{brand:"Roady","brand:wikidata":"Q3434112","brand:wikipedia":"en:Roady (Mousquetaires)",name:"Roady",shop:"car_repair"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"shop/car_repair/Safelite AutoGlass":{name:"Safelite AutoGlass",icon:"maki-car-repair",imageURL:"https://pbs.twimg.com/profile_images/941319713149333505/oSj6thH6_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q28797369",shop:"car_repair"},addTags:{brand:"Safelite AutoGlass","brand:wikidata":"Q28797369","brand:wikipedia":"en:Safelite",name:"Safelite AutoGlass",operator:"Belron","operator:wikidata":"Q785614","operator:wikipedia":"en:Belron",shop:"car_repair"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/car_repair/Speedy":{name:"Speedy",icon:"maki-car-repair",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FSpeedy%20France%20logo%20officiel.png&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q3492969",shop:"car_repair"},addTags:{brand:"Speedy","brand:wikidata":"Q3492969","brand:wikipedia":"fr:Speedy (entreprise)",name:"Speedy",shop:"car_repair"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"shop/car_repair/Speedy Auto Service":{name:"Speedy Auto Service",icon:"maki-car-repair",imageURL:"https://graph.facebook.com/SpeedyAutoServiceCanada/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q22318193",shop:"car_repair"},addTags:{brand:"Speedy Auto Service","brand:wikidata":"Q22318193",name:"Speedy Auto Service",shop:"car_repair"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"shop/car_repair/Toyota":{name:"Toyota",icon:"maki-car-repair",imageURL:"https://graph.facebook.com/toyota/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q53268",shop:"car_repair"},addTags:{brand:"Toyota","brand:wikidata":"Q53268","brand:wikipedia":"en:Toyota",name:"Toyota",shop:"car_repair"},terms:[],matchScore:2,suggestion:true},"shop/car_repair/Tuffy Tire & Auto Service":{name:"Tuffy Tire & Auto Service",icon:"maki-car-repair",imageURL:"https://graph.facebook.com/Tuffy/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q17125314",shop:"car_repair"},addTags:{brand:"Tuffy Tire & Auto Service","brand:wikidata":"Q17125314","brand:wikipedia":"en:Tuffy Auto Service Centers",name:"Tuffy Tire & Auto Service",shop:"car_repair"},countryCodes:["us"],terms:["tuffy tire and auto service"],matchScore:2,suggestion:true},"shop/car_repair/Valvoline":{name:"Valvoline",icon:"maki-car-repair",geometry:["point","area"],tags:{"brand:wikidata":"Q7912852",shop:"car_repair"},addTags:{brand:"Valvoline","brand:wikidata":"Q7912852","brand:wikipedia":"en:Valvoline Instant Oil Change",name:"Valvoline",shop:"car_repair"},countryCodes:["us"],terms:["valvoline instant oil change"],matchScore:2,suggestion:true},"shop/car_repair/ÖAMTC":{name:"ÖAMTC",icon:"maki-car-repair",geometry:["point","area"],tags:{"brand:wikidata":"Q306057",shop:"car_repair"},addTags:{brand:"ÖAMTC","brand:wikidata":"Q306057","brand:wikipedia":"de:Österreichischer Automobil-, Motorrad- und Touring Club",name:"ÖAMTC",shop:"car_repair"},countryCodes:["at"],terms:[],matchScore:2,suggestion:true},"shop/car/Audi":{name:"Audi",icon:"maki-car",imageURL:"https://graph.facebook.com/audi.jp/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q23317",shop:"car"},addTags:{brand:"Audi","brand:wikidata":"Q23317","brand:wikipedia":"en:Audi",name:"Audi",shop:"car"},terms:[],matchScore:2,suggestion:true},"shop/car/BMW":{name:"BMW",icon:"maki-car",imageURL:"https://graph.facebook.com/BMWGroup/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q26678",shop:"car"},addTags:{brand:"BMW","brand:wikidata":"Q26678","brand:wikipedia":"en:BMW",name:"BMW",shop:"car"},terms:[],matchScore:2,suggestion:true},"shop/car/Chevrolet":{name:"Chevrolet",icon:"maki-car",imageURL:"https://graph.facebook.com/chevrolet/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q29570",shop:"car"},addTags:{brand:"Chevrolet","brand:wikidata":"Q29570","brand:wikipedia":"en:Chevrolet",name:"Chevrolet",shop:"car"},terms:[],matchScore:2,suggestion:true},"shop/car/Citroën":{name:"Citroën",icon:"maki-car",imageURL:"https://graph.facebook.com/Citroen/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6746",shop:"car"},addTags:{brand:"Citroën","brand:wikidata":"Q6746","brand:wikipedia":"fr:Citroën",name:"Citroën",shop:"car"},terms:[],matchScore:2,suggestion:true},"shop/car/Dacia":{name:"Dacia",icon:"maki-car",imageURL:"https://graph.facebook.com/Dacia/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q27460",shop:"car"},addTags:{brand:"Dacia","brand:wikidata":"Q27460","brand:wikipedia":"en:Automobile Dacia",name:"Dacia",shop:"car"},terms:[],matchScore:2,suggestion:true},"shop/car/Fiat":{name:"Fiat",icon:"maki-car",imageURL:"https://graph.facebook.com/Fiat/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q27597",shop:"car"},addTags:{brand:"Fiat","brand:wikidata":"Q27597","brand:wikipedia":"en:Fiat Automobiles",name:"Fiat",shop:"car"},terms:[],matchScore:2,suggestion:true},"shop/car/Ford":{name:"Ford",icon:"maki-car",imageURL:"https://graph.facebook.com/ford/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q44294",shop:"car"},addTags:{brand:"Ford","brand:wikidata":"Q44294","brand:wikipedia":"en:Ford Motor Company",name:"Ford",shop:"car"},terms:[],matchScore:2,suggestion:true},"shop/car/Honda":{name:"Honda",icon:"maki-car",imageURL:"https://graph.facebook.com/HondaJP/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q9584",shop:"car"},addTags:{brand:"Honda","brand:wikidata":"Q9584","brand:wikipedia":"en:Honda",name:"Honda",shop:"car"},terms:["honda cars"],matchScore:2,suggestion:true},"shop/car/Hyundai":{name:"Hyundai",icon:"maki-car",imageURL:"https://graph.facebook.com/Hyundai/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q55931",shop:"car"},addTags:{brand:"Hyundai","brand:wikidata":"Q55931","brand:wikipedia":"en:Hyundai Motor Company",name:"Hyundai",shop:"car"},terms:[],matchScore:2,suggestion:true},"shop/car/Isuzu":{name:"Isuzu",icon:"maki-car",imageURL:"https://graph.facebook.com/isuzumex/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q29803",shop:"car"},addTags:{brand:"Isuzu","brand:wikidata":"Q29803","brand:wikipedia":"en:Isuzu Motors",name:"Isuzu",shop:"car"},terms:[],matchScore:2,suggestion:true},"shop/car/Kia":{name:"Kia",icon:"maki-car",imageURL:"https://graph.facebook.com/Kiamotorsworldwide/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q35349",shop:"car"},addTags:{brand:"Kia","brand:wikidata":"Q35349","brand:wikipedia":"en:Kia Motors",name:"Kia",shop:"car"},terms:["kia motors"],matchScore:2,suggestion:true},"shop/car/Land Rover":{name:"Land Rover",icon:"maki-car",imageURL:"https://graph.facebook.com/landroverusa/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q35907",shop:"car"},addTags:{brand:"Land Rover","brand:wikidata":"Q35907","brand:wikipedia":"en:Land Rover",name:"Land Rover",shop:"car"},terms:[],matchScore:2,suggestion:true},"shop/car/Lexus":{name:"Lexus",icon:"maki-car",imageURL:"https://graph.facebook.com/lexus/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q35919",shop:"car"},addTags:{brand:"Lexus","brand:wikidata":"Q35919","brand:wikipedia":"en:Lexus",name:"Lexus",shop:"car"},terms:[],matchScore:2,suggestion:true},"shop/car/Mazda":{name:"Mazda",icon:"maki-car",imageURL:"https://graph.facebook.com/Mazda.Japan/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q35996",shop:"car"},addTags:{brand:"Mazda","brand:wikidata":"Q35996","brand:wikipedia":"en:Mazda",name:"Mazda",shop:"car"},terms:[],matchScore:2,suggestion:true},"shop/car/Mercedes-Benz":{name:"Mercedes-Benz",icon:"maki-car",imageURL:"https://graph.facebook.com/MercedesBenz/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q36008",shop:"car"},addTags:{brand:"Mercedes-Benz","brand:wikidata":"Q36008","brand:wikipedia":"en:Mercedes-Benz",name:"Mercedes-Benz",shop:"car"},terms:["mercedes"],matchScore:2,suggestion:true},"shop/car/Mitsubishi":{name:"Mitsubishi",icon:"maki-car",imageURL:"https://graph.facebook.com/MitsubishiMotors.en/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q36033",shop:"car"},addTags:{brand:"Mitsubishi","brand:wikidata":"Q36033","brand:wikipedia":"en:Mitsubishi Motors",name:"Mitsubishi",shop:"car"},terms:["mitsubishi motors"],matchScore:2,suggestion:true},"shop/car/Netz":{name:"Netz",icon:"maki-car",geometry:["point","area"],tags:{"brand:wikidata":"Q11325416",shop:"car"},addTags:{brand:"Netz","brand:wikidata":"Q11325416","brand:wikipedia":"ja:ネッツ店",name:"Netz",shop:"car"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/car/Nissan":{name:"Nissan",icon:"maki-car",imageURL:"https://graph.facebook.com/NissanJP/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q20165",shop:"car"},addTags:{brand:"Nissan","brand:wikidata":"Q20165","brand:wikipedia":"ja:日産自動車",name:"Nissan",shop:"car"},terms:[],matchScore:2,suggestion:true},"shop/car/Opel":{name:"Opel",icon:"maki-car",imageURL:"https://graph.facebook.com/Opel/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q40966",shop:"car"},addTags:{brand:"Opel","brand:wikidata":"Q40966","brand:wikipedia":"en:Opel",name:"Opel",shop:"car"},terms:[],matchScore:2,suggestion:true},"shop/car/Peugeot":{name:"Peugeot",icon:"maki-car",imageURL:"https://graph.facebook.com/Peugeot/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6742",shop:"car"},addTags:{brand:"Peugeot","brand:wikidata":"Q6742","brand:wikipedia":"en:Peugeot",name:"Peugeot",shop:"car"},terms:[],matchScore:2,suggestion:true},"shop/car/Porsche":{name:"Porsche",icon:"maki-car",imageURL:"https://graph.facebook.com/porsche/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q40993",shop:"car"},addTags:{brand:"Porsche","brand:wikidata":"Q40993","brand:wikipedia":"en:Porsche",name:"Porsche",shop:"car"},terms:[],matchScore:2,suggestion:true},"shop/car/Renault":{name:"Renault",icon:"maki-car",imageURL:"https://graph.facebook.com/Renault/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6686",shop:"car"},addTags:{brand:"Renault","brand:wikidata":"Q6686","brand:wikipedia":"en:Renault",name:"Renault",shop:"car"},terms:[],matchScore:2,suggestion:true},"shop/car/Seat":{name:"Seat",icon:"maki-car",imageURL:"https://graph.facebook.com/SEAT.Official/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q188217",shop:"car"},addTags:{brand:"Seat","brand:wikidata":"Q188217","brand:wikipedia":"en:SEAT",name:"Seat",shop:"car"},terms:[],matchScore:2,suggestion:true},"shop/car/Skoda":{name:"Skoda",icon:"maki-car",imageURL:"https://graph.facebook.com/skoda/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q29637",shop:"car"},addTags:{brand:"Skoda","brand:wikidata":"Q29637","brand:wikipedia":"en:Škoda Auto",name:"Skoda",shop:"car"},terms:[],matchScore:2,suggestion:true},"shop/car/Subaru":{name:"Subaru",icon:"maki-car",imageURL:"https://graph.facebook.com/SUBARU.jp/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q172741",shop:"car"},addTags:{brand:"Subaru","brand:wikidata":"Q172741","brand:wikipedia":"en:Subaru",name:"Subaru",shop:"car"},terms:[],matchScore:2,suggestion:true},"shop/car/Suzuki":{name:"Suzuki",icon:"maki-car",imageURL:"https://graph.facebook.com/SuzukiGlobalOfficial/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q181642",shop:"car"},addTags:{brand:"Suzuki","brand:wikidata":"Q181642","brand:wikipedia":"en:Suzuki",name:"Suzuki",shop:"car"},terms:[],matchScore:2,suggestion:true},"shop/car/Tesla":{name:"Tesla",icon:"maki-car",imageURL:"https://pbs.twimg.com/profile_images/489192650474414080/4RxZxsud_bigger.png",geometry:["point","area"],tags:{"brand:wikidata":"Q478214",shop:"car"},addTags:{brand:"Tesla","brand:wikidata":"Q478214","brand:wikipedia":"en:Tesla, Inc.",name:"Tesla",shop:"car"},terms:[],matchScore:2,suggestion:true},"shop/car/Toyota":{name:"Toyota",icon:"maki-car",imageURL:"https://graph.facebook.com/toyota/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q53268",shop:"car"},addTags:{brand:"Toyota","brand:wikidata":"Q53268","brand:wikipedia":"en:Toyota",name:"Toyota",shop:"car"},terms:[],matchScore:2,suggestion:true},"shop/car/Volkswagen":{name:"Volkswagen",icon:"maki-car",imageURL:"https://graph.facebook.com/VW/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q246",shop:"car"},addTags:{brand:"Volkswagen","brand:wikidata":"Q246","brand:wikipedia":"en:Volkswagen",name:"Volkswagen",shop:"car"},terms:["vw"],matchScore:2,suggestion:true},"shop/car/Volvo":{name:"Volvo",icon:"maki-car",imageURL:"https://graph.facebook.com/volvocars/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q215293",shop:"car"},addTags:{brand:"Volvo","brand:wikidata":"Q215293","brand:wikipedia":"en:Volvo Cars",name:"Volvo",shop:"car"},terms:[],matchScore:2,suggestion:true},"shop/car/ホンダ":{name:"ホンダ",icon:"maki-car",imageURL:"https://graph.facebook.com/HondaJP/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q9584",shop:"car"},addTags:{brand:"ホンダ","brand:en":"Honda","brand:ja":"ホンダ","brand:wikidata":"Q9584","brand:wikipedia":"ja:本田技研工業",name:"ホンダ","name:en":"Honda","name:ja":"ホンダ",shop:"car"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/carpet/Carpetright":{name:"Carpetright",icon:"maki-shop",imageURL:"https://graph.facebook.com/carpetright/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5045782",shop:"carpet"},addTags:{brand:"Carpetright","brand:wikidata":"Q5045782","brand:wikipedia":"en:Carpetright",name:"Carpetright",shop:"carpet"},countryCodes:["be","gb","ie","nl"],terms:[],matchScore:2,suggestion:true},"shop/catalogue/Argos":{name:"Argos",icon:"maki-shop",imageURL:"https://graph.facebook.com/argos/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4789707",shop:"catalogue"},addTags:{brand:"Argos","brand:wikidata":"Q4789707","brand:wikipedia":"en:Argos (retailer)",name:"Argos",shop:"catalogue"},countryCodes:["gb","ie"],terms:[],matchScore:2,suggestion:true},"shop/charity/Age UK":{name:"Age UK",icon:"maki-shop",imageURL:"https://graph.facebook.com/ageuk/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4691850",shop:"charity"},addTags:{brand:"Age UK","brand:wikidata":"Q4691850","brand:wikipedia":"en:Age UK",name:"Age UK",shop:"charity"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/charity/Barnardo's":{name:"Barnardo's",icon:"maki-shop",imageURL:"https://graph.facebook.com/barnardos/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2884670",shop:"charity"},addTags:{brand:"Barnardo's","brand:wikidata":"Q2884670","brand:wikipedia":"en:Barnardo's",name:"Barnardo's",shop:"charity"},countryCodes:["gb","ie"],terms:[],matchScore:2,suggestion:true},"shop/charity/British Heart Foundation":{name:"British Heart Foundation",icon:"maki-shop",imageURL:"https://graph.facebook.com/bhf/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4970039",shop:"charity"},addTags:{brand:"British Heart Foundation","brand:wikidata":"Q4970039","brand:wikipedia":"en:British Heart Foundation",name:"British Heart Foundation",shop:"charity"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/charity/British Red Cross":{name:"British Red Cross",icon:"maki-shop",imageURL:"https://graph.facebook.com/britishredcross/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4970966",shop:"charity"},addTags:{brand:"British Red Cross","brand:wikidata":"Q4970966","brand:wikipedia":"en:British Red Cross",name:"British Red Cross",shop:"charity"},countryCodes:["gb","gg","im"],terms:[],matchScore:2,suggestion:true},"shop/charity/Cancer Research UK":{name:"Cancer Research UK",icon:"maki-shop",imageURL:"https://graph.facebook.com/cancerresearchuk/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q326079",shop:"charity"},addTags:{brand:"Cancer Research UK","brand:wikidata":"Q326079","brand:wikipedia":"en:Cancer Research UK",name:"Cancer Research UK",shop:"charity"},countryCodes:["gb","gg"],terms:[],matchScore:2,suggestion:true},"shop/charity/Goodwill":{name:"Goodwill",icon:"maki-shop",imageURL:"https://graph.facebook.com/GoodwillIntl/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5583655",shop:"charity"},addTags:{brand:"Goodwill","brand:wikidata":"Q5583655","brand:wikipedia":"en:Goodwill Industries",name:"Goodwill",shop:"charity"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"shop/charity/Mind":{name:"Mind",icon:"maki-shop",imageURL:"https://graph.facebook.com/mindforbettermentalhealth/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3314763",shop:"charity"},addTags:{brand:"Mind","brand:wikidata":"Q3314763","brand:wikipedia":"en:Mind (charity)",name:"Mind",shop:"charity"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/charity/Myrorna":{name:"Myrorna",icon:"maki-shop",imageURL:"https://graph.facebook.com/Myrorna/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q10592609",shop:"charity"},addTags:{brand:"Myrorna","brand:wikidata":"Q10592609","brand:wikipedia":"sv:Myrorna",name:"Myrorna",shop:"charity"},countryCodes:["se"],terms:[],matchScore:2,suggestion:true},"shop/charity/Oxfam":{name:"Oxfam",icon:"maki-shop",imageURL:"https://graph.facebook.com/oxfamGB/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q267941",shop:"charity"},addTags:{brand:"Oxfam","brand:wikidata":"Q267941","brand:wikipedia":"en:Oxfam",name:"Oxfam",shop:"charity"},countryCodes:["be","de","gb","ie","im"],terms:[],matchScore:2,suggestion:true},"shop/charity/RSPCA":{name:"RSPCA",icon:"maki-shop",imageURL:"https://graph.facebook.com/RSPCA/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q584819",shop:"charity"},addTags:{brand:"RSPCA","brand:wikidata":"Q584819","brand:wikipedia":"en:Royal Society for the Prevention of Cruelty to Animals",name:"RSPCA",shop:"charity"},countryCodes:["au","gb"],terms:[],matchScore:2,suggestion:true},"shop/charity/Scope":{name:"Scope",icon:"maki-shop",imageURL:"https://graph.facebook.com/Scope/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7434435",shop:"charity"},addTags:{brand:"Scope","brand:wikidata":"Q7434435","brand:wikipedia":"en:Scope (charity)",name:"Scope",shop:"charity"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/charity/Sue Ryder":{name:"Sue Ryder",icon:"maki-shop",imageURL:"https://graph.facebook.com/SueRyderNational/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7634271",shop:"charity"},addTags:{brand:"Sue Ryder","brand:wikidata":"Q7634271","brand:wikipedia":"en:Sue Ryder (charity)",name:"Sue Ryder",shop:"charity"},countryCodes:["gb","ie"],terms:[],matchScore:2,suggestion:true},"shop/charity/The Salvation Army":{name:"The Salvation Army",icon:"maki-shop",imageURL:"https://graph.facebook.com/SalvationArmyUSA/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q188307",shop:"charity"},addTags:{brand:"The Salvation Army","brand:wikidata":"Q188307","brand:wikipedia":"en:The Salvation Army",name:"The Salvation Army",shop:"charity"},countryCodes:["au","ca","gb","us"],terms:["salvation army"],matchScore:2,suggestion:true},"shop/chemist/Bipa":{name:"Bipa",icon:"fas-shopping-basket",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FBipa%20Logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q864933",shop:"chemist"},addTags:{brand:"Bipa","brand:wikidata":"Q864933","brand:wikipedia":"de:Bipa",name:"Bipa",shop:"chemist"},countryCodes:["at","hr"],terms:[],matchScore:2,suggestion:true},"shop/chemist/Budnikowsky":{name:"Budnikowsky",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/BUDNI/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1001516",shop:"chemist"},addTags:{brand:"Budnikowsky","brand:wikidata":"Q1001516","brand:wikipedia":"de:Budnikowsky",name:"Budnikowsky",shop:"chemist"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/chemist/Drogeria Natura":{name:"Drogeria Natura",icon:"fas-shopping-basket",geometry:["point","area"],tags:{"brand:wikidata":"Q9212032",shop:"chemist"},addTags:{brand:"Drogeria Natura","brand:wikidata":"Q9212032","brand:wikipedia":"pl:Drogerie Natura",name:"Drogeria Natura",shop:"chemist"},countryCodes:["pl"],terms:[],matchScore:2,suggestion:true},"shop/chemist/Etos":{name:"Etos",icon:"fas-shopping-basket",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FEtos%20logo.png&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q2609459",shop:"chemist"},addTags:{brand:"Etos","brand:wikidata":"Q2609459","brand:wikipedia":"en:Etos",name:"Etos",shop:"chemist"},terms:[],matchScore:2,suggestion:true},"shop/chemist/Kruidvat":{name:"Kruidvat",icon:"fas-shopping-basket",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FKruidvat%20logo.png&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q2226366",shop:"chemist"},addTags:{brand:"Kruidvat","brand:wikidata":"Q2226366","brand:wikipedia":"en:Kruidvat",name:"Kruidvat",shop:"chemist"},terms:[],matchScore:2,suggestion:true},"shop/chemist/Matas":{name:"Matas",icon:"fas-shopping-basket",geometry:["point","area"],tags:{"brand:wikidata":"Q6786143",shop:"chemist"},addTags:{brand:"Matas","brand:wikidata":"Q6786143","brand:wikipedia":"en:Matas (drug store)",name:"Matas",shop:"chemist"},countryCodes:["dk"],terms:[],matchScore:2,suggestion:true},"shop/chemist/Müller":{name:"Müller",icon:"fas-shopping-basket",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FLogo%20Drogerie%20Mueller.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q1958759",shop:"chemist"},addTags:{brand:"Müller","brand:wikidata":"Q1958759","brand:wikipedia":"en:Müller (German trade company)",name:"Müller",shop:"chemist"},terms:[],matchScore:2,suggestion:true},"shop/chemist/Rossmann":{name:"Rossmann",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/rossmann.gmbh/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q316004",shop:"chemist"},addTags:{brand:"Rossmann","brand:wikidata":"Q316004","brand:wikipedia":"de:Dirk Rossmann GmbH",name:"Rossmann",shop:"chemist"},terms:[],matchScore:2,suggestion:true},"shop/chemist/Teta":{name:"Teta",icon:"fas-shopping-basket",geometry:["point","area"],tags:{"brand:wikidata":"Q20860823",shop:"chemist"},addTags:{brand:"Teta","brand:wikidata":"Q20860823","brand:wikipedia":"cs:Teta drogerie",name:"Teta",shop:"chemist"},terms:[],matchScore:2,suggestion:true},"shop/chemist/Trekpleister":{name:"Trekpleister",icon:"fas-shopping-basket",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FTrekpleister%20logo.png&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q2551576",shop:"chemist"},addTags:{brand:"Trekpleister","brand:wikidata":"Q2551576","brand:wikipedia":"nl:Trekpleister (drogisterij)",name:"Trekpleister",shop:"chemist"},countryCodes:["nl"],terms:[],matchScore:2,suggestion:true},"shop/chemist/Walgreens":{name:"Walgreens",icon:"fas-shopping-basket",imageURL:"https://pbs.twimg.com/profile_images/875789275668918273/7l9RDOnl_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q1591889",shop:"chemist"},addTags:{brand:"Walgreens","brand:wikidata":"Q1591889","brand:wikipedia":"en:Walgreens",name:"Walgreens",shop:"chemist"},countryCodes:["us"],terms:["walgreens pharmacy"],matchScore:2,suggestion:true},"shop/chemist/Watsons":{name:"Watsons",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/WatsonsPH/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7974785",shop:"chemist"},addTags:{brand:"Watsons","brand:wikidata":"Q7974785","brand:wikipedia":"en:Watsons",name:"Watsons",operator:"A.S. Watson Group","operator:wikidata":"Q4647401","operator:wikipedia":"en:A.S. Watson Group",shop:"chemist"},terms:[],matchScore:2,suggestion:true},"shop/chemist/dm":{name:"dm",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/dm.Deutschland/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q266572",shop:"chemist"},addTags:{brand:"dm","brand:wikidata":"Q266572","brand:wikipedia":"en:Dm-drogerie markt",name:"dm",shop:"chemist"},countryCodes:["at","ba","bg","cz","de","hr","hu","it","mk","ro","rs","si","sk"],terms:["dm drogerie markt"],matchScore:2,suggestion:true},"shop/chemist/康是美":{name:"康是美",icon:"fas-shopping-basket",geometry:["point","area"],tags:{"brand:wikidata":"Q11063876",shop:"chemist"},addTags:{brand:"康是美","brand:wikidata":"Q11063876","brand:wikipedia":"zh:康是美藥妝店",name:"康是美",shop:"chemist"},countryCodes:["tw"],terms:[],matchScore:2,suggestion:true},"shop/chocolate/Cacau Show":{name:"Cacau Show",icon:"maki-shop",imageURL:"https://graph.facebook.com/CacauShow/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q9671713",shop:"chocolate"},addTags:{brand:"Cacau Show","brand:wikidata":"Q9671713","brand:wikipedia":"en:Cacau Show",name:"Cacau Show",shop:"chocolate"},countryCodes:["br"],terms:[],matchScore:2,suggestion:true},"shop/chocolate/Leonidas":{name:"Leonidas",icon:"maki-shop",imageURL:"https://graph.facebook.com/Leonidas.Official/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q80335",shop:"chocolate"},addTags:{brand:"Leonidas","brand:wikidata":"Q80335","brand:wikipedia":"en:Leonidas (chocolate maker)",name:"Leonidas",shop:"chocolate"},countryCodes:["be","cz","fr","gb","gr","nl"],terms:[],matchScore:2,suggestion:true},"shop/clothes/AOKI":{name:"AOKI",icon:"maki-clothing-store",geometry:["point","area"],tags:{"brand:wikidata":"Q11189480",shop:"clothes"},addTags:{brand:"AOKI","brand:wikidata":"Q11189480","brand:wikipedia":"ja:AOKIホールディングス",clothes:"men",name:"AOKI","name:ja":"アオキ",operator:"株式会社AOKIホールディングス","operator:en":"AOKI Holdings Inc.",shop:"clothes"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Abercrombie & Fitch":{name:"Abercrombie & Fitch",icon:"maki-clothing-store",imageURL:"https://pbs.twimg.com/profile_images/1090830222302298112/W60h63qk_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q319344",shop:"clothes"},addTags:{brand:"Abercrombie & Fitch","brand:wikidata":"Q319344","brand:wikipedia":"en:Abercrombie & Fitch",clothes:"men;women",name:"Abercrombie & Fitch",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Accessorize":{name:"Accessorize",icon:"maki-clothing-store",imageURL:"https://pbs.twimg.com/profile_images/1014248943121813505/qNRJq7zh_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q3069980",shop:"clothes"},addTags:{brand:"Accessorize","brand:wikidata":"Q3069980","brand:wikipedia":"en:Monsoon Accessorize",name:"Accessorize",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Ackermans":{name:"Ackermans",icon:"maki-clothing-store",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FAckermans-Logo.jpg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q4674255",shop:"clothes"},addTags:{brand:"Ackermans","brand:wikidata":"Q4674255","brand:wikipedia":"en:Ackermans",name:"Ackermans",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Aeropostale":{name:"Aeropostale",icon:"maki-clothing-store",imageURL:"https://pbs.twimg.com/profile_images/1022567836043173895/8EvkF14a_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q794565",shop:"clothes"},addTags:{brand:"Aeropostale","brand:wikidata":"Q794565","brand:wikipedia":"en:Aéropostale (clothing)",clothes:"men;women",name:"Aeropostale",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/American Eagle Outfitters":{name:"American Eagle Outfitters",icon:"maki-clothing-store",imageURL:"https://pbs.twimg.com/profile_images/926225107445366786/HNAMY-nG_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q2842931",shop:"clothes"},addTags:{brand:"American Eagle Outfitters","brand:wikidata":"Q2842931","brand:wikipedia":"en:American Eagle Outfitters",clothes:"men;women",name:"American Eagle Outfitters",shop:"clothes"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Ann Taylor":{name:"Ann Taylor",icon:"maki-clothing-store",imageURL:"https://pbs.twimg.com/profile_images/632020433571676162/jq9ErOl5_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q4766699",shop:"clothes"},addTags:{brand:"Ann Taylor","brand:wikidata":"Q4766699","brand:wikipedia":"en:Ann Inc.",clothes:"women",name:"Ann Taylor",shop:"clothes"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Anthropologie":{name:"Anthropologie",icon:"maki-clothing-store",imageURL:"https://pbs.twimg.com/profile_images/1013829328205991938/mMkaMqhL_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q4773903",shop:"clothes"},addTags:{brand:"Anthropologie","brand:wikidata":"Q4773903","brand:wikipedia":"en:Anthropologie",clothes:"women",name:"Anthropologie",shop:"clothes"},countryCodes:["ca","gb","us"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Ardene":{name:"Ardene",icon:"maki-clothing-store",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FArdene%20logo.png&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q2860764",shop:"clothes"},addTags:{brand:"Ardene","brand:wikidata":"Q2860764","brand:wikipedia":"en:Ardene",name:"Ardene",shop:"clothes"},countryCodes:["ca","sn"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Armand Thiery":{name:"Armand Thiery",icon:"maki-clothing-store",geometry:["point","area"],tags:{"brand:wikidata":"Q2861975",shop:"clothes"},addTags:{brand:"Armand Thiery","brand:wikidata":"Q2861975","brand:wikipedia":"fr:Armand Thiery",name:"Armand Thiery",shop:"clothes"},countryCodes:["be","fr"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Armani Exchange":{name:"Armani Exchange",icon:"maki-clothing-store",geometry:["point","area"],tags:{"brand:wikidata":"Q56045740",shop:"clothes"},addTags:{brand:"Armani Exchange","brand:wikidata":"Q56045740",clothes:"men;women",name:"Armani Exchange","operator:wikidata":"Q2861975","operator:wikipedia":"en:Armani",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Banana Republic":{name:"Banana Republic",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/BananaRepublic/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q806085",shop:"clothes"},addTags:{brand:"Banana Republic","brand:wikidata":"Q806085","brand:wikipedia":"en:Banana Republic",clothes:"men;women",name:"Banana Republic",shop:"clothes"},countryCodes:["ca","gb","us"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Bershka":{name:"Bershka",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/bershka/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q827258",shop:"clothes"},addTags:{brand:"Bershka","brand:wikidata":"Q827258","brand:wikipedia":"en:Bershka",name:"Bershka",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Betty Barclay":{name:"Betty Barclay",icon:"maki-clothing-store",geometry:["point","area"],tags:{"brand:wikidata":"Q850250",shop:"clothes"},addTags:{brand:"Betty Barclay","brand:wikidata":"Q850250","brand:wikipedia":"de:Betty Barclay",name:"Betty Barclay",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Big Star":{name:"Big Star",icon:"maki-clothing-store",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FBig%20Star%20logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q9171569",shop:"clothes"},addTags:{brand:"Big Star","brand:wikidata":"Q9171569","brand:wikipedia":"pl:Big Star Limited",name:"Big Star",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Bonita":{name:"Bonita",icon:"maki-clothing-store",geometry:["point","area"],tags:{"brand:wikidata":"Q945463",shop:"clothes"},addTags:{brand:"Bonita","brand:wikidata":"Q945463","brand:wikipedia":"en:Bonia (fashion)",name:"Bonita",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Bonobo":{name:"Bonobo",icon:"maki-clothing-store",geometry:["point","area"],tags:{"brand:wikidata":"Q63682093",shop:"clothes"},addTags:{brand:"Bonobo","brand:wikidata":"Q63682093",clothes:"men;women",name:"Bonobo",shop:"clothes"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Bonobos":{name:"Bonobos",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/bonobos/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4942546",shop:"clothes"},addTags:{brand:"Bonobos","brand:wikidata":"Q4942546","brand:wikipedia":"en:Bonobos (apparel)",clothes:"men",name:"Bonobos",shop:"clothes"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Brice":{name:"Brice",icon:"maki-clothing-store",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FLOGO%20BRICE%20Noir.png&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q2925067",shop:"clothes"},addTags:{brand:"Brice","brand:wikidata":"Q2925067","brand:wikipedia":"fr:Brice (enseigne)",name:"Brice",shop:"clothes"},countryCodes:["be","fr"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Brooks Brothers":{name:"Brooks Brothers",icon:"maki-clothing-store",imageURL:"https://pbs.twimg.com/profile_images/1115302398023614465/o1kNm_G5_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q929722",shop:"clothes"},addTags:{brand:"Brooks Brothers","brand:wikidata":"Q929722","brand:wikipedia":"en:Brooks Brothers",name:"Brooks Brothers",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Buffalo Exchange":{name:"Buffalo Exchange",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/buffaloexchange/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4985721",shop:"clothes"},addTags:{brand:"Buffalo Exchange","brand:wikidata":"Q4985721","brand:wikipedia":"en:Buffalo Exchange",name:"Buffalo Exchange",second_hand:"only",shop:"clothes"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Burberry":{name:"Burberry",icon:"maki-clothing-store",imageURL:"https://pbs.twimg.com/profile_images/1024961047009157121/2xSmZUHV_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q390107",shop:"clothes"},addTags:{brand:"Burberry","brand:wikidata":"Q390107","brand:wikipedia":"en:Burberry",name:"Burberry",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Burlington Coat Factory":{name:"Burlington Coat Factory",icon:"maki-clothing-store",imageURL:"https://pbs.twimg.com/profile_images/851496565118205953/l8vJaRWh_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q4999220",shop:"clothes"},addTags:{brand:"Burlington Coat Factory","brand:wikidata":"Q4999220","brand:wikipedia":"en:Burlington (department store)",name:"Burlington Coat Factory",shop:"clothes"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Burton":{name:"Burton",icon:"maki-clothing-store",imageURL:"https://pbs.twimg.com/profile_images/966321347923271680/THD9mE6x_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q5000795",shop:"clothes"},addTags:{brand:"Burton","brand:wikidata":"Q5000795","brand:wikipedia":"en:Burton (retailer)",name:"Burton",shop:"clothes"},countryCodes:["fr","gb"],terms:[],matchScore:2,suggestion:true},"shop/clothes/C&A":{name:"C&A",icon:"maki-clothing-store",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FC-und-A-Logo-2011.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q701338",shop:"clothes"},addTags:{brand:"C&A","brand:wikidata":"Q701338","brand:wikipedia":"en:C&A",name:"C&A",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/COS":{name:"COS",icon:"maki-clothing-store",geometry:["point","area"],tags:{"brand:wikidata":"Q60772401",shop:"clothes"},addTags:{brand:"COS","brand:wikidata":"Q60772401","brand:wikipedia":"en:COS (clothing)",name:"COS",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Cache Cache":{name:"Cache Cache",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/CacheCacheFrance/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q63064086",shop:"clothes"},addTags:{brand:"Cache Cache","brand:wikidata":"Q63064086",name:"Cache Cache",shop:"clothes"},countryCodes:["fr","it","lu"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Calvin Klein":{name:"Calvin Klein",icon:"maki-clothing-store",imageURL:"https://pbs.twimg.com/profile_images/889490770687905792/N8mVqffO_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q1068628",shop:"clothes"},addTags:{brand:"Calvin Klein","brand:wikidata":"Q1068628","brand:wikipedia":"en:Calvin Klein (company)",name:"Calvin Klein",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Calzedonia":{name:"Calzedonia",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/calzedonia/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1027874",shop:"clothes"},addTags:{brand:"Calzedonia","brand:wikidata":"Q1027874","brand:wikipedia":"en:Calzedonia",name:"Calzedonia",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Camaïeu":{name:"Camaïeu",icon:"maki-clothing-store",geometry:["point","area"],tags:{"brand:wikidata":"Q2934647",shop:"clothes"},addTags:{brand:"Camaïeu","brand:wikidata":"Q2934647","brand:wikipedia":"en:Camaïeu (company)",name:"Camaïeu",shop:"clothes"},countryCodes:["be","cz","fr","it","pl"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Camp David":{name:"Camp David",icon:"maki-clothing-store",geometry:["point","area"],tags:{"brand:wikidata":"Q50540636",shop:"clothes"},addTags:{brand:"Camp David","brand:wikidata":"Q50540636","brand:wikipedia":"en:Camp David (fashion)",name:"Camp David",shop:"clothes"},countryCodes:["at","de","ee","sk"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Carhartt":{name:"Carhartt",icon:"maki-clothing-store",imageURL:"https://pbs.twimg.com/profile_images/1101238172233752577/ngKE1Yid_bigger.png",geometry:["point","area"],tags:{"brand:wikidata":"Q527877",shop:"clothes"},addTags:{brand:"Carhartt","brand:wikidata":"Q527877","brand:wikipedia":"en:Carhartt",name:"Carhartt",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Caroll":{name:"Caroll",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/carollparis/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q63063871",shop:"clothes"},addTags:{brand:"Caroll","brand:wikidata":"Q63063871",name:"Caroll",shop:"clothes"},countryCodes:["ch","fr"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Carter's":{name:"Carter's",icon:"maki-clothing-store",geometry:["point","area"],tags:{"brand:wikidata":"Q5047083",shop:"clothes"},addTags:{brand:"Carter's","brand:wikidata":"Q5047083","brand:wikipedia":"en:Carter's",name:"Carter's",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Cato":{name:"Cato",icon:"maki-clothing-store",geometry:["point","area"],tags:{"brand:wikidata":"Q16956136",shop:"clothes"},addTags:{brand:"Cato","brand:wikidata":"Q16956136","brand:wikipedia":"en:Cato Corporation",name:"Cato",shop:"clothes"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Celio":{name:"Celio",icon:"maki-clothing-store",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FLogo%20celio%20RVB.jpg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q2672003",shop:"clothes"},addTags:{brand:"Celio","brand:wikidata":"Q2672003","brand:wikipedia":"en:Celio (retailer)",name:"Celio",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Charles Vögele":{name:"Charles Vögele",icon:"maki-clothing-store",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FCharles%20Voegele%20Logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q1066326",shop:"clothes"},addTags:{brand:"Charles Vögele","brand:wikidata":"Q1066326","brand:wikipedia":"de:Charles Vögele Holding",name:"Charles Vögele",shop:"clothes"},countryCodes:["at","be","ch","de","hu","nl"],terms:["vögele"],matchScore:2,suggestion:true},"shop/clothes/Charlotte Russe":{name:"Charlotte Russe",icon:"maki-clothing-store",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FCharlotte%20russe.png&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q5086126",shop:"clothes"},addTags:{brand:"Charlotte Russe","brand:wikidata":"Q5086126","brand:wikipedia":"en:Charlotte Russe (clothing retailer)",name:"Charlotte Russe",shop:"clothes"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Chico's":{name:"Chico's",icon:"maki-clothing-store",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FChico's%20FAS%20logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q5096393",shop:"clothes"},addTags:{brand:"Chico's","brand:wikidata":"Q5096393","brand:wikipedia":"en:Chico's (clothing retailer)",name:"Chico's",shop:"clothes"},countryCodes:["ar","us"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Christopher & Banks":{name:"Christopher & Banks",icon:"maki-clothing-store",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FChristopher%20%26%20Banks%20logo.png&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q5111816",shop:"clothes"},addTags:{brand:"Christopher & Banks","brand:wikidata":"Q5111816","brand:wikipedia":"en:Christopher & Banks",name:"Christopher & Banks",shop:"clothes"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Club Monaco":{name:"Club Monaco",icon:"maki-clothing-store",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FClub-monaco-logo.jpg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q2979949",shop:"clothes"},addTags:{brand:"Club Monaco","brand:wikidata":"Q2979949","brand:wikipedia":"en:Club Monaco",name:"Club Monaco",shop:"clothes"},countryCodes:["ca","gb","us"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Colin's":{name:"Colin's",icon:"maki-clothing-store",geometry:["point","area"],tags:{"brand:wikidata":"Q28729658",shop:"clothes"},addTags:{brand:"Colin's","brand:wikidata":"Q28729658",name:"Colin's",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Columbia":{name:"Columbia",icon:"maki-clothing-store",imageURL:"https://pbs.twimg.com/profile_images/378800000507623403/444cd8e60cf59b6fab58ba06c80c2a6c_bigger.png",geometry:["point","area"],tags:{"brand:wikidata":"Q1112588",shop:"clothes"},addTags:{brand:"Columbia","brand:wikidata":"Q1112588","brand:wikipedia":"en:Columbia Sportswear",name:"Columbia",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Cropp":{name:"Cropp",icon:"maki-clothing-store",geometry:["point","area"],tags:{"brand:wikidata":"Q9196793",shop:"clothes"},addTags:{brand:"Cropp","brand:wikidata":"Q9196793","brand:wikipedia":"pl:Cropp",name:"Cropp",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Cubus":{name:"Cubus",icon:"maki-clothing-store",geometry:["point","area"],tags:{"brand:wikidata":"Q3439593",shop:"clothes"},addTags:{brand:"Cubus","brand:wikidata":"Q3439593","brand:wikipedia":"no:Cubus",name:"Cubus",shop:"clothes"},countryCodes:["de","fi","lv","no","pl","se"],terms:[],matchScore:2,suggestion:true},"shop/clothes/DXL Men's Apparel":{name:"DXL Men's Apparel",icon:"maki-clothing-store",geometry:["point","area"],tags:{"brand:wikidata":"Q61981830",shop:"clothes"},addTags:{brand:"DXL Men's Apparel","brand:wikidata":"Q61981830",clothes:"oversize;men",name:"DXL Men's Apparel","operator:wikidata":"Q5050852","operator:wikipedia":"en:Destination XL Group",shop:"clothes"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Damart":{name:"Damart",icon:"maki-clothing-store",geometry:["point","area"],tags:{"brand:wikidata":"Q3012602",shop:"clothes"},addTags:{brand:"Damart","brand:wikidata":"Q3012602","brand:wikipedia":"en:Damart",name:"Damart",shop:"clothes"},countryCodes:["be","fr","lu"],terms:[],matchScore:2,suggestion:true},"shop/clothes/David's Bridal":{name:"David's Bridal",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/davidsbridal/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5230388",shop:"clothes"},addTags:{brand:"David's Bridal","brand:wikidata":"Q5230388","brand:wikipedia":"en:David's Bridal",name:"David's Bridal",shop:"clothes"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Desigual":{name:"Desigual",icon:"maki-clothing-store",imageURL:"https://pbs.twimg.com/profile_images/1105077887680548864/MXN9rGjm_bigger.png",geometry:["point","area"],tags:{"brand:wikidata":"Q83750",shop:"clothes"},addTags:{brand:"Desigual","brand:wikidata":"Q83750","brand:wikipedia":"en:Desigual",name:"Desigual",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Devred":{name:"Devred",icon:"maki-clothing-store",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FLogo%20DEVRED%201902.jpg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q3025542",shop:"clothes"},addTags:{brand:"Devred","brand:wikidata":"Q3025542","brand:wikipedia":"fr:Devred 1902",name:"Devred",shop:"clothes"},countryCodes:["be","fr","ma"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Diesel":{name:"Diesel",icon:"maki-clothing-store",imageURL:"https://pbs.twimg.com/profile_images/1059404541618253824/3amvryNj_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q158285",shop:"clothes"},addTags:{brand:"Diesel","brand:wikidata":"Q158285","brand:wikipedia":"en:Diesel (brand)",name:"Diesel",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Diverse":{name:"Diverse",icon:"maki-clothing-store",geometry:["point","area"],tags:{"brand:wikidata":"Q11694298",shop:"clothes"},addTags:{brand:"Diverse","brand:wikidata":"Q11694298","brand:wikipedia":"pl:Diverse",name:"Diverse",shop:"clothes"},countryCodes:["pl"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Dorothy Perkins":{name:"Dorothy Perkins",icon:"maki-clothing-store",imageURL:"https://pbs.twimg.com/profile_images/1124235640613351425/ZKhEqGyl_bigger.png",geometry:["point","area"],tags:{"brand:wikidata":"Q5298588",shop:"clothes"},addTags:{brand:"Dorothy Perkins","brand:wikidata":"Q5298588","brand:wikipedia":"en:Dorothy Perkins",name:"Dorothy Perkins",shop:"clothes"},countryCodes:["gb","gg","ie","im"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Dress Barn":{name:"Dress Barn",icon:"maki-clothing-store",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FDressBarn%20new%20logo.gif&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q5307031",shop:"clothes"},addTags:{brand:"Dress Barn","brand:wikidata":"Q5307031","brand:wikipedia":"en:Ascena Retail Group",name:"Dress Barn",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Dressmann":{name:"Dressmann",icon:"maki-clothing-store",geometry:["point","area"],tags:{"brand:wikidata":"Q3357081",shop:"clothes"},addTags:{brand:"Dressmann","brand:wikidata":"Q3357081","brand:wikipedia":"en:Dressmann",name:"Dressmann",shop:"clothes"},countryCodes:["at","fi","no","se"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Eddie Bauer":{name:"Eddie Bauer",icon:"maki-clothing-store",geometry:["point","area"],tags:{"brand:wikidata":"Q842174",shop:"clothes"},addTags:{brand:"Eddie Bauer","brand:wikidata":"Q842174","brand:wikipedia":"en:Eddie Bauer",name:"Eddie Bauer",shop:"clothes"},countryCodes:["ca","jp","us"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Engbers":{name:"Engbers",icon:"maki-clothing-store",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FEngbers%20(Unternehmen)%20logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q1290088",shop:"clothes"},addTags:{brand:"Engbers","brand:wikidata":"Q1290088","brand:wikipedia":"de:Engbers",name:"Engbers",shop:"clothes"},countryCodes:["at","de"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Ernsting's family":{name:"Ernsting's family",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/Ernstingsfamily/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1361016",shop:"clothes"},addTags:{brand:"Ernsting's family","brand:wikidata":"Q1361016","brand:wikipedia":"de:Ernsting’s family",name:"Ernsting's family",shop:"clothes"},countryCodes:["at","de"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Esprit":{name:"Esprit",icon:"maki-clothing-store",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FEsprit%20Logo%20neu.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q532746",shop:"clothes"},addTags:{brand:"Esprit","brand:wikidata":"Q532746","brand:wikipedia":"en:Esprit Holdings",name:"Esprit",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Etam":{name:"Etam",icon:"maki-clothing-store",geometry:["point","area"],tags:{"brand:wikidata":"Q3059202",shop:"clothes"},addTags:{brand:"Etam","brand:wikidata":"Q3059202","brand:wikipedia":"en:Etam Développement",name:"Etam",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Express":{name:"Express",icon:"maki-clothing-store",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FExpress%2C%20Inc.%20logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q1384784",shop:"clothes"},addTags:{brand:"Express","brand:wikidata":"Q1384784","brand:wikipedia":"en:Express, Inc.",name:"Express",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Fat Face":{name:"Fat Face",icon:"maki-clothing-store",imageURL:"https://pbs.twimg.com/profile_images/1055013284485779458/dtR2OyFc_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q5437186",shop:"clothes"},addTags:{brand:"Fat Face","brand:wikidata":"Q5437186","brand:wikipedia":"en:Fat Face",name:"Fat Face",shop:"clothes"},countryCodes:["gb","gg","ie"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Forever 21":{name:"Forever 21",icon:"maki-clothing-store",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FForever%2021%20logo.png&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q1060537",shop:"clothes"},addTags:{brand:"Forever 21","brand:wikidata":"Q1060537","brand:wikipedia":"en:Forever 21",name:"Forever 21",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Free People":{name:"Free People",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/FreePeople/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5499945",shop:"clothes"},addTags:{brand:"Free People","brand:wikidata":"Q5499945","brand:wikipedia":"en:Free People",name:"Free People",shop:"clothes"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"shop/clothes/GU":{name:"GU",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/g.u.japan/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5512642",shop:"clothes"},addTags:{brand:"GU","brand:wikidata":"Q5512642","brand:wikipedia":"en:GU (retailer)",name:"GU",shop:"clothes"},countryCodes:["cl","jp","tw"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Gant":{name:"Gant",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/gant/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1493667",shop:"clothes"},addTags:{brand:"Gant","brand:wikidata":"Q1493667","brand:wikipedia":"en:Gant (retailer)",name:"Gant",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Gap":{name:"Gap",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/GapJapan/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q420822",shop:"clothes"},addTags:{brand:"Gap","brand:wikidata":"Q420822","brand:wikipedia":"en:Gap Inc.",name:"Gap",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Gerry Weber":{name:"Gerry Weber",icon:"maki-clothing-store",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FGerry%20Weber%20Logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q873447",shop:"clothes"},addTags:{brand:"Gerry Weber","brand:wikidata":"Q873447","brand:wikipedia":"en:Gerry Weber",name:"Gerry Weber",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Gina Laura":{name:"Gina Laura",icon:"maki-clothing-store",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FGina%20Laura%20Logo.jpg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q2700576",shop:"clothes"},addTags:{brand:"Gina Laura","brand:wikidata":"Q2700576","brand:wikipedia":"de:Gina Laura",name:"Gina Laura",shop:"clothes"},countryCodes:["at","de"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Gloria Jeans":{name:"Gloria Jeans",icon:"maki-clothing-store",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FGloria%20Jeans.jpg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q4139985",shop:"clothes"},addTags:{brand:"Gloria Jeans","brand:wikidata":"Q4139985","brand:wikipedia":"ru:Глория Джинс",name:"Gloria Jeans",shop:"clothes"},countryCodes:["ru","ua"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Gucci":{name:"Gucci",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/GUCCI/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q178516",shop:"clothes"},addTags:{brand:"Gucci","brand:wikidata":"Q178516","brand:wikipedia":"en:Gucci",name:"Gucci",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Guess":{name:"Guess",icon:"maki-clothing-store",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FLogo%20Guess.jpg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q2470307",shop:"clothes"},addTags:{brand:"Guess","brand:wikidata":"Q2470307","brand:wikipedia":"en:Guess (clothing)",name:"Guess",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Gymboree":{name:"Gymboree",icon:"maki-clothing-store",imageURL:"https://pbs.twimg.com/profile_images/1018723545122131968/mBlwxTN2_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q4039771",shop:"clothes"},addTags:{brand:"Gymboree","brand:wikidata":"Q4039771","brand:wikipedia":"en:Gymboree",name:"Gymboree",shop:"clothes"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Gémo":{name:"Gémo",icon:"maki-clothing-store",geometry:["point","area"],tags:{"brand:wikidata":"Q3122954",shop:"clothes"},addTags:{brand:"Gémo","brand:wikidata":"Q3122954","brand:wikipedia":"fr:Gémo",name:"Gémo",shop:"clothes"},countryCodes:["be","ch","fr"],terms:[],matchScore:2,suggestion:true},"shop/clothes/H&M":{name:"H&M",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/hmhongkong/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q188326",shop:"clothes"},addTags:{brand:"H&M","brand:wikidata":"Q188326","brand:wikipedia":"en:H&M",name:"H&M",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Hallhuber":{name:"Hallhuber",icon:"maki-clothing-store",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FHH%20LOGO%202013.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q1571714",shop:"clothes"},addTags:{brand:"Hallhuber","brand:wikidata":"Q1571714","brand:wikipedia":"de:Hallhuber (Bekleidungshaus)",name:"Hallhuber",shop:"clothes"},countryCodes:["at","ch","de","lu","nl"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Hanna Andersson":{name:"Hanna Andersson",icon:"maki-clothing-store",geometry:["point","area"],tags:{"brand:wikidata":"Q17460802",shop:"clothes"},addTags:{brand:"Hanna Andersson","brand:wikidata":"Q17460802","brand:wikipedia":"en:Hanna Andersson",clothes:"baby;children;women",name:"Hanna Andersson",shop:"clothes"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Hollister":{name:"Hollister",icon:"maki-clothing-store",imageURL:"https://pbs.twimg.com/profile_images/1116351964030341120/DzjEYbxH_bigger.png",geometry:["point","area"],tags:{"brand:wikidata":"Q1257477",shop:"clothes"},addTags:{brand:"Hollister","brand:wikidata":"Q1257477","brand:wikipedia":"en:Hollister Co.",name:"Hollister",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Hot Topic":{name:"Hot Topic",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/hottopic/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q9294032",shop:"clothes"},addTags:{brand:"Hot Topic","brand:wikidata":"Q9294032","brand:wikipedia":"en:Hot Topic",name:"Hot Topic",shop:"clothes"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Hugo Boss":{name:"Hugo Boss",icon:"maki-clothing-store",imageURL:"https://pbs.twimg.com/profile_images/981463273836089344/mZoBl9wy_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q491627",shop:"clothes"},addTags:{brand:"Hugo Boss","brand:wikidata":"Q491627","brand:wikipedia":"en:Hugo Boss",name:"Hugo Boss",shop:"clothes"},terms:["boss"],matchScore:2,suggestion:true},"shop/clothes/Hunkemöller":{name:"Hunkemöller",icon:"maki-clothing-store",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FHunkemoeller%20Logo.png&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q2604175",shop:"clothes"},addTags:{brand:"Hunkemöller","brand:wikidata":"Q2604175","brand:wikipedia":"en:Hunkemöller",name:"Hunkemöller",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Intimissimi":{name:"Intimissimi",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/intimissimi/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q305404",shop:"clothes"},addTags:{brand:"Intimissimi","brand:wikidata":"Q305404","brand:wikipedia":"en:Intimissimi",clothes:"underwear",name:"Intimissimi",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/JBC":{name:"JBC",icon:"maki-clothing-store",geometry:["point","area"],tags:{"brand:wikidata":"Q2671470",shop:"clothes"},addTags:{brand:"JBC","brand:wikidata":"Q2671470","brand:wikipedia":"nl:JBC",name:"JBC",shop:"clothes"},countryCodes:["be","lu"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Jack & Jones":{name:"Jack & Jones",icon:"maki-clothing-store",imageURL:"https://pbs.twimg.com/profile_images/2735852177/8e4633c7fe64dadc067689fa0064c9c6_bigger.jpeg",geometry:["point","area"],tags:{"brand:wikidata":"Q6077665",shop:"clothes"},addTags:{brand:"Jack & Jones","brand:wikidata":"Q6077665","brand:wikipedia":"en:Jack & Jones",name:"Jack & Jones",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Jack Wills":{name:"Jack Wills",icon:"maki-clothing-store",imageURL:"https://pbs.twimg.com/profile_images/1121360723555299328/6uEb8cP1_bigger.png",geometry:["point","area"],tags:{"brand:wikidata":"Q6115814",shop:"clothes"},addTags:{brand:"Jack Wills","brand:wikidata":"Q6115814","brand:wikipedia":"en:Jack Wills",name:"Jack Wills",shop:"clothes"},countryCodes:["ae","gb","hk","ie","kw","lb","mo","sg","us"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Jeans Fritz":{name:"Jeans Fritz",icon:"maki-clothing-store",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FJeans-Fritz-Logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q1686071",shop:"clothes"},addTags:{brand:"Jeans Fritz","brand:wikidata":"Q1686071","brand:wikipedia":"de:Jeans Fritz",name:"Jeans Fritz",shop:"clothes"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Jennyfer":{name:"Jennyfer",icon:"maki-clothing-store",geometry:["point","area"],tags:{"brand:wikidata":"Q3177174",shop:"clothes"},addTags:{brand:"Jennyfer","brand:wikidata":"Q3177174","brand:wikipedia":"fr:Jennyfer",name:"Jennyfer",shop:"clothes"},countryCodes:["fr","it","lu"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Jet":{name:"Jet",icon:"maki-clothing-store",geometry:["point","area"],tags:{"brand:wikidata":"Q61995123",shop:"clothes"},addTags:{brand:"Jet","brand:wikidata":"Q61995123",name:"Jet",shop:"clothes"},countryCodes:["za"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Jigsaw":{name:"Jigsaw",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/InsideJigsaw/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6192383",shop:"clothes"},addTags:{brand:"Jigsaw","brand:wikidata":"Q6192383","brand:wikipedia":"en:Jigsaw (clothing retailer)",name:"Jigsaw",shop:"clothes"},countryCodes:["au","gb","us"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Jos. A. Bank":{name:"Jos. A. Bank",icon:"maki-clothing-store",imageURL:"https://pbs.twimg.com/profile_images/1001953978790313984/rZx5Eh6N_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q6204078",shop:"clothes"},addTags:{brand:"Jos. A. Bank","brand:wikidata":"Q6204078","brand:wikipedia":"en:JoS. A. Bank Clothiers",name:"Jos. A. Bank",shop:"clothes"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Joules":{name:"Joules",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/Joules/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q25351738",shop:"clothes"},addTags:{brand:"Joules","brand:wikidata":"Q25351738","brand:wikipedia":"en:Joules (clothing)",name:"Joules",shop:"clothes"},countryCodes:["gb","gg","ie"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Justice":{name:"Justice",icon:"maki-clothing-store",geometry:["point","area"],tags:{"brand:wikidata":"Q7857512",shop:"clothes"},addTags:{brand:"Justice","brand:wikidata":"Q7857512","brand:wikipedia":"en:Tween Brands",name:"Justice",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/KappAhl":{name:"KappAhl",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/kappahl/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4349016",shop:"clothes"},addTags:{brand:"KappAhl","brand:wikidata":"Q4349016","brand:wikipedia":"sv:Kappahl",name:"KappAhl",shop:"clothes"},countryCodes:["fi","no","pl","se"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Kate Spade New York":{name:"Kate Spade New York",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/katespadeny/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6375797",shop:"clothes"},addTags:{brand:"Kate Spade New York","brand:wikidata":"Q6375797","brand:wikipedia":"en:Kate Spade New York",name:"Kate Spade New York",shop:"clothes"},countryCodes:["ca","us"],terms:["kate spade","kate spade ny"],matchScore:2,suggestion:true},"shop/clothes/KiK":{name:"KiK",icon:"maki-clothing-store",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FKiK-Logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q883965",shop:"clothes"},addTags:{brand:"KiK","brand:wikidata":"Q883965","brand:wikipedia":"en:KiK",name:"KiK",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Kiabi":{name:"Kiabi",icon:"maki-clothing-store",geometry:["point","area"],tags:{"brand:wikidata":"Q3196299",shop:"clothes"},addTags:{brand:"Kiabi","brand:wikidata":"Q3196299","brand:wikipedia":"fr:Kiabi",name:"Kiabi",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/LC Waikiki":{name:"LC Waikiki",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/lcwaikiki/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3205965",shop:"clothes"},addTags:{brand:"LC Waikiki","brand:wikidata":"Q3205965","brand:wikipedia":"fr:LC Waikiki",name:"LC Waikiki",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/La Senza":{name:"La Senza",icon:"maki-clothing-store",imageURL:"https://pbs.twimg.com/profile_images/1112757964300083208/j-i4NaSr_bigger.png",geometry:["point","area"],tags:{"brand:wikidata":"Q3212802",shop:"clothes"},addTags:{brand:"La Senza","brand:wikidata":"Q3212802","brand:wikipedia":"en:La Senza",name:"La Senza",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Lacoste":{name:"Lacoste",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/Lacoste/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q309031",shop:"clothes"},addTags:{brand:"Lacoste","brand:wikidata":"Q309031","brand:wikipedia":"en:Lacoste",name:"Lacoste",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Lane Bryant":{name:"Lane Bryant",icon:"maki-clothing-store",geometry:["point","area"],tags:{"brand:wikidata":"Q6485350",shop:"clothes"},addTags:{brand:"Lane Bryant","brand:wikidata":"Q6485350","brand:wikipedia":"en:Lane Bryant",clothes:"oversize;women",name:"Lane Bryant",shop:"clothes"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Levi's":{name:"Levi's",icon:"maki-clothing-store",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FLevi's%20logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q127962",shop:"clothes"},addTags:{brand:"Levi's","brand:wikidata":"Q127962","brand:wikipedia":"en:Levi Strauss & Co.",clothes:"denim;men;women",name:"Levi's",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Lids":{name:"Lids",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/Lids/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q19841609",shop:"clothes"},addTags:{brand:"Lids","brand:wikidata":"Q19841609","brand:wikipedia":"en:Lids (store)",clothes:"hats",name:"Lids",shop:"clothes"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Lindex":{name:"Lindex",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/lindex/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1786717",shop:"clothes"},addTags:{brand:"Lindex","brand:wikidata":"Q1786717","brand:wikipedia":"en:Lindex",name:"Lindex",shop:"clothes"},countryCodes:["cz","ee","fi","no","se","sk"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Loft":{name:"Loft",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/LOFT/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62075137",shop:"clothes"},addTags:{brand:"Loft","brand:wikidata":"Q62075137",clothes:"women",name:"Loft",operator:"Ann Inc.","operator:wikidata":"Q4766699","operator:wikipedia":"en:Ann Inc.",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Louis Vuitton":{name:"Louis Vuitton",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/LouisVuitton/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q191485",shop:"clothes"},addTags:{brand:"Louis Vuitton","brand:wikidata":"Q191485","brand:wikipedia":"en:Louis Vuitton",name:"Louis Vuitton",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/M&Co":{name:"M&Co",icon:"maki-clothing-store",imageURL:"https://pbs.twimg.com/profile_images/3060281697/0cf4741ed2fcb2ab442637e226a3d538_bigger.jpeg",geometry:["point","area"],tags:{"brand:wikidata":"Q6711808",shop:"clothes"},addTags:{brand:"M&Co","brand:wikidata":"Q6711808","brand:wikipedia":"en:M&Co.",name:"M&Co",shop:"clothes"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Mango":{name:"Mango",icon:"maki-clothing-store",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FMango-logo.jpg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q136503",shop:"clothes"},addTags:{brand:"Mango","brand:wikidata":"Q136503","brand:wikipedia":"en:Mango (retailer)",name:"Mango",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Marc O'Polo":{name:"Marc O'Polo",icon:"maki-clothing-store",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FMarc%20O%E2%80%99Polo%20Logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q1892752",shop:"clothes"},addTags:{brand:"Marc O'Polo","brand:wikidata":"Q1892752","brand:wikipedia":"en:Marc O'Polo",name:"Marc O'Polo",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Mark's":{name:"Mark's",icon:"maki-clothing-store",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FMark's%20Work%20Wearhouse%20Logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q6766373",shop:"clothes"},addTags:{brand:"Mark's","brand:wikidata":"Q6766373","brand:wikipedia":"en:Mark's",name:"Mark's",shop:"clothes"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Marks & Spencer":{name:"Marks & Spencer",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/marksandspencerrussia/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q714491",shop:"clothes"},addTags:{brand:"Marks & Spencer","brand:wikidata":"Q714491","brand:wikipedia":"en:Marks & Spencer",name:"Marks & Spencer",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Massimo Dutti":{name:"Massimo Dutti",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/massimodutti/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q788231",shop:"clothes"},addTags:{brand:"Massimo Dutti","brand:wikidata":"Q788231","brand:wikipedia":"en:Massimo Dutti",name:"Massimo Dutti",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Matalan":{name:"Matalan",icon:"maki-clothing-store",imageURL:"https://pbs.twimg.com/profile_images/1059530620374867970/wCJvqGG5_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q12061509",shop:"clothes"},addTags:{brand:"Matalan","brand:wikidata":"Q12061509","brand:wikipedia":"en:Matalan",name:"Matalan",shop:"clothes"},countryCodes:["ae","gb"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Maurices":{name:"Maurices",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/maurices/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6793571",shop:"clothes"},addTags:{brand:"Maurices","brand:wikidata":"Q6793571","brand:wikipedia":"en:Maurices",name:"Maurices",shop:"clothes"},countryCodes:["ca","fr","us"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Max Mara":{name:"Max Mara",icon:"maki-clothing-store",geometry:["point","area"],tags:{"brand:wikidata":"Q1151774",shop:"clothes"},addTags:{brand:"Max Mara","brand:wikidata":"Q1151774","brand:wikipedia":"en:Max Mara",name:"Max Mara",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Men's Wearhouse":{name:"Men's Wearhouse",icon:"maki-clothing-store",geometry:["point","area"],tags:{"brand:wikidata":"Q57405513",shop:"clothes"},addTags:{brand:"Men's Wearhouse","brand:wikidata":"Q57405513",clothes:"suits",name:"Men's Wearhouse",shop:"clothes"},terms:["mens warehouse"],matchScore:2,suggestion:true},"shop/clothes/Mexx":{name:"Mexx",icon:"maki-clothing-store",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FMexx%20Logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q1837290",shop:"clothes"},addTags:{brand:"Mexx","brand:wikidata":"Q1837290","brand:wikipedia":"en:Mexx",name:"Mexx",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Michael Kors":{name:"Michael Kors",icon:"maki-clothing-store",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FMichael%20Kors%20Logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q19572998",shop:"clothes"},addTags:{brand:"Michael Kors","brand:wikidata":"Q19572998","brand:wikipedia":"en:Capri Holdings",name:"Michael Kors",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Monsoon":{name:"Monsoon",icon:"maki-clothing-store",imageURL:"https://pbs.twimg.com/profile_images/1014248943121813505/qNRJq7zh_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q3069980",shop:"clothes"},addTags:{brand:"Monsoon","brand:wikidata":"Q3069980","brand:wikipedia":"en:Monsoon Accessorize",name:"Monsoon",shop:"clothes"},countryCodes:["gb","gg","ie"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Mr Price":{name:"Mr Price",icon:"maki-clothing-store",geometry:["point","area"],tags:{"brand:wikidata":"Q6929120",shop:"clothes"},addTags:{brand:"Mr Price","brand:wikidata":"Q6929120","brand:wikipedia":"en:Mr. Price",name:"Mr Price",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/NKD":{name:"NKD",icon:"maki-clothing-store",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2F150707%20NKD%20Logog%20Wikipedia.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q927272",shop:"clothes"},addTags:{brand:"NKD","brand:wikidata":"Q927272","brand:wikipedia":"de:NKD",name:"NKD",shop:"clothes"},countryCodes:["at","de","it","si"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Naf Naf":{name:"Naf Naf",icon:"maki-clothing-store",geometry:["point","area"],tags:{"brand:wikidata":"Q3334188",shop:"clothes"},addTags:{brand:"Naf Naf","brand:wikidata":"Q3334188","brand:wikipedia":"fr:Naf Naf",name:"Naf Naf",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/New Look":{name:"New Look",icon:"maki-clothing-store",imageURL:"https://pbs.twimg.com/profile_images/1057923508460761088/9Gem24tH_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q12063852",shop:"clothes"},addTags:{brand:"New Look","brand:wikidata":"Q12063852","brand:wikipedia":"en:New Look (company)",name:"New Look",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/New Yorker":{name:"New Yorker",icon:"maki-clothing-store",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FNew%20Yorker.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q706421",shop:"clothes"},addTags:{brand:"New Yorker","brand:wikidata":"Q706421","brand:wikipedia":"en:New Yorker (clothing)",name:"New Yorker",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Next":{name:"Next",icon:"maki-clothing-store",imageURL:"https://pbs.twimg.com/profile_images/1047405356635344896/fbsYbE_N_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q246655",shop:"clothes"},addTags:{brand:"Next","brand:wikidata":"Q246655","brand:wikipedia":"en:Next plc",name:"Next",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Nike":{name:"Nike",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/nike/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q483915",shop:"clothes"},addTags:{brand:"Nike","brand:wikidata":"Q483915","brand:wikipedia":"en:Nike, Inc.",name:"Nike",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Nordstrom Rack":{name:"Nordstrom Rack",icon:"maki-clothing-store",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FCurrent%20Nordstrom%20Rack%20Logo.jpg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q21463374",shop:"clothes"},addTags:{brand:"Nordstrom Rack","brand:wikidata":"Q21463374","brand:wikipedia":"en:Nordstrom Rack",name:"Nordstrom Rack",shop:"clothes"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"shop/clothes/OVS":{name:"OVS",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/OVS/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2042514",shop:"clothes"},addTags:{brand:"OVS","brand:wikidata":"Q2042514","brand:wikipedia":"en:OVS (company)",name:"OVS",shop:"clothes"},countryCodes:["at","ch","fr","it","si"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Okaïdi":{name:"Okaïdi",icon:"maki-clothing-store",geometry:["point","area"],tags:{"brand:wikidata":"Q3350027",shop:"clothes"},addTags:{brand:"Okaïdi","brand:wikidata":"Q3350027","brand:wikipedia":"fr:Okaïdi",name:"Okaïdi",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Old Navy":{name:"Old Navy",icon:"maki-clothing-store",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FOld%20Navy%20Logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q2735242",shop:"clothes"},addTags:{brand:"Old Navy","brand:wikidata":"Q2735242","brand:wikipedia":"en:Old Navy",name:"Old Navy",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Only":{name:"Only",icon:"maki-clothing-store",geometry:["point","area"],tags:{"brand:wikidata":"Q61799370",shop:"clothes"},addTags:{brand:"Only","brand:wikidata":"Q61799370",name:"Only","operator:wikidata":"Q28172489","operator:wikipedia":"en:Bestseller (company)",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Orchestra":{name:"Orchestra",icon:"maki-clothing-store",geometry:["point","area"],tags:{"brand:wikidata":"Q28042940",shop:"clothes"},addTags:{brand:"Orchestra","brand:wikidata":"Q28042940","brand:wikipedia":"fr:Orchestra Prémaman",name:"Orchestra",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Orsay":{name:"Orsay",icon:"maki-clothing-store",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FORSAY.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q883245",shop:"clothes"},addTags:{brand:"Orsay","brand:wikidata":"Q883245","brand:wikipedia":"de:Orsay (Modeunternehmen)",name:"Orsay",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Outfit":{name:"Outfit",icon:"maki-clothing-store",geometry:["point","area"],tags:{"brand:wikidata":"Q7112061",shop:"clothes"},addTags:{brand:"Outfit","brand:wikidata":"Q7112061","brand:wikipedia":"en:Outfit (retailer)",name:"Outfit",shop:"clothes"},countryCodes:["de","gb"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Oysho":{name:"Oysho",icon:"maki-clothing-store",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FLOGO%20oysho%20wikipedia.png&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q3327046",shop:"clothes"},addTags:{brand:"Oysho","brand:wikidata":"Q3327046","brand:wikipedia":"en:Oysho",name:"Oysho",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/PacSun":{name:"PacSun",icon:"maki-clothing-store",imageURL:"https://pbs.twimg.com/profile_images/763503514890842112/oY_iKSnB_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q7121857",shop:"clothes"},addTags:{brand:"PacSun","brand:wikidata":"Q7121857","brand:wikipedia":"en:PacSun",name:"PacSun",shop:"clothes"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Palmers":{name:"Palmers",icon:"maki-clothing-store",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FPalmerslogo.jpg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q1509985",shop:"clothes"},addTags:{brand:"Palmers","brand:wikidata":"Q1509985","brand:wikipedia":"de:Palmers",name:"Palmers",shop:"clothes"},countryCodes:["at","de"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Peacocks":{name:"Peacocks",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/peacocksclothing/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7157762",shop:"clothes"},addTags:{brand:"Peacocks","brand:wikidata":"Q7157762","brand:wikipedia":"en:Peacocks (clothing)",name:"Peacocks",shop:"clothes"},countryCodes:["cy","gb"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Peek & Cloppenburg":{name:"Peek & Cloppenburg",icon:"maki-clothing-store",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FLogo%20Peek%20%26%20Cloppenburg.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q2066959",shop:"clothes"},addTags:{brand:"Peek & Cloppenburg","brand:wikidata":"Q2066959","brand:wikipedia":"en:Peek & Cloppenburg",name:"Peek & Cloppenburg",shop:"clothes"},countryCodes:["at","be","de","nl","pl"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Pep":{name:"Pep",icon:"maki-clothing-store",geometry:["point","area"],tags:{"brand:wikidata":"Q7166182",shop:"clothes"},addTags:{brand:"Pep","brand:wikidata":"Q7166182","brand:wikipedia":"en:Pep (store)",name:"Pep",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Pepco":{name:"Pepco",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/PEPCOpl/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11815580",shop:"clothes"},addTags:{brand:"Pepco","brand:wikidata":"Q11815580","brand:wikipedia":"pl:Pepco",name:"Pepco",shop:"clothes"},countryCodes:["cz","hu","pl","ro","sk"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Petit Bateau":{name:"Petit Bateau",icon:"maki-clothing-store",geometry:["point","area"],tags:{"brand:wikidata":"Q3377090",shop:"clothes"},addTags:{brand:"Petit Bateau","brand:wikidata":"Q3377090","brand:wikipedia":"en:Petit Bateau",name:"Petit Bateau",shop:"clothes"},countryCodes:["be","de","fr","gb","it","lu"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Phase Eight":{name:"Phase Eight",icon:"maki-clothing-store",imageURL:"https://pbs.twimg.com/profile_images/826031206961647617/L_YJKtfM_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q17020730",shop:"clothes"},addTags:{brand:"Phase Eight","brand:wikidata":"Q17020730","brand:wikipedia":"en:Phase Eight",name:"Phase Eight",shop:"clothes"},countryCodes:["ch","de","gb"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Pimkie":{name:"Pimkie",icon:"maki-clothing-store",geometry:["point","area"],tags:{"brand:wikidata":"Q1758066",shop:"clothes"},addTags:{brand:"Pimkie","brand:wikidata":"Q1758066","brand:wikipedia":"en:Pimkie",name:"Pimkie",shop:"clothes"},countryCodes:["at","be","de","es","fr","it"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Plato's Closet":{name:"Plato's Closet",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/platoscloset/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q61779112",shop:"clothes"},addTags:{brand:"Plato's Closet","brand:wikidata":"Q61779112",name:"Plato's Closet",operator:"Winmark","operator:wikidata":"Q28048853","operator:wikipedia":"en:Winmark",second_hand:"only",shop:"clothes"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Primark":{name:"Primark",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/Primark/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q137023",shop:"clothes"},addTags:{brand:"Primark","brand:wikidata":"Q137023","brand:wikipedia":"en:Primark",name:"Primark",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Promod":{name:"Promod",icon:"maki-clothing-store",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FPromod-Boutique%20Francaise.jpg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q3407429",shop:"clothes"},addTags:{brand:"Promod","brand:wikidata":"Q3407429","brand:wikipedia":"en:Promod",name:"Promod",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Pull & Bear":{name:"Pull & Bear",icon:"maki-clothing-store",imageURL:"https://pbs.twimg.com/profile_images/1065168584450674690/8NL1vlQR_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q691029",shop:"clothes"},addTags:{brand:"Pull & Bear","brand:wikidata":"Q691029","brand:wikipedia":"en:Pull&Bear",name:"Pull & Bear",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Puma":{name:"Puma",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/playitagainsports/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7203029",shop:"clothes"},addTags:{brand:"Puma","brand:wikidata":"Q7203029","brand:wikipedia":"en:Puma (brand)",name:"Puma",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Rainbow":{name:"Rainbow",icon:"maki-clothing-store",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FRainbow-logo.jpg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q7284708",shop:"clothes"},addTags:{brand:"Rainbow","brand:wikidata":"Q7284708","brand:wikipedia":"en:Rainbow Shops",name:"Rainbow",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Reebok":{name:"Reebok",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/ReebokUS/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q466183",shop:"clothes"},addTags:{brand:"Reebok","brand:wikidata":"Q466183","brand:wikipedia":"en:Reebok",name:"Reebok",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Reitmans":{name:"Reitmans",icon:"maki-clothing-store",geometry:["point","area"],tags:{"brand:wikidata":"Q7310506",shop:"clothes"},addTags:{brand:"Reitmans","brand:wikidata":"Q7310506","brand:wikipedia":"en:Reitmans",name:"Reitmans",shop:"clothes"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Reserved":{name:"Reserved",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/Reserved/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q21809354",shop:"clothes"},addTags:{brand:"Reserved","brand:wikidata":"Q21809354","brand:wikipedia":"en:Reserved",name:"Reserved",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/River Island":{name:"River Island",icon:"maki-clothing-store",imageURL:"https://pbs.twimg.com/profile_images/1072101180791287814/Y0vBqxNn_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q2670328",shop:"clothes"},addTags:{brand:"River Island","brand:wikidata":"Q2670328","brand:wikipedia":"en:River Island",name:"River Island",shop:"clothes"},countryCodes:["gb","ie","im","nl","pl"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Ross":{name:"Ross",icon:"maki-clothing-store",imageURL:"https://pbs.twimg.com/profile_images/666413791169503233/rCEE7G_S_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q3442791",shop:"clothes"},addTags:{brand:"Ross","brand:wikidata":"Q3442791","brand:wikipedia":"en:Ross Stores",name:"Ross",official_name:"Ross Dress for Less",shop:"clothes"},countryCodes:["us"],terms:["ross dress for less"],matchScore:2,suggestion:true},"shop/clothes/Sela":{name:"Sela",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/sela.shop/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62075111",shop:"clothes"},addTags:{brand:"Sela","brand:wikidata":"Q62075111",name:"Sela",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Sergent Major":{name:"Sergent Major",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/sergent.major.officiel/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62521738",shop:"clothes"},addTags:{brand:"Sergent Major","brand:wikidata":"Q62521738","brand:wikipedia":"fr:Sergent Major (entreprise)",clothes:"babies;children",name:"Sergent Major",shop:"clothes"},countryCodes:["be","de","es","fr","gb","it"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Sisley":{name:"Sisley",icon:"maki-clothing-store",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FSisley%20logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q12054325",shop:"clothes"},addTags:{brand:"Sisley","brand:wikidata":"Q12054325","brand:wikipedia":"cs:Sisley",name:"Sisley",operator:"Benetton Group","operator:wikidata":"Q817139","operator:wikipedia":"en:Benetton Group",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Springfield":{name:"Springfield",icon:"maki-clothing-store",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FMarca-springfield.png&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q958209",shop:"clothes"},addTags:{brand:"Springfield","brand:wikidata":"Q958209","brand:wikipedia":"es:Springfield (cadena de tiendas)",name:"Springfield",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Stefanel":{name:"Stefanel",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/Stefanel.Official/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2338087",shop:"clothes"},addTags:{brand:"Stefanel","brand:wikidata":"Q2338087","brand:wikipedia":"ro:Stefanel (companie)",name:"Stefanel",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Stradivarius":{name:"Stradivarius",icon:"maki-clothing-store",imageURL:"https://pbs.twimg.com/profile_images/1110919224480931841/ptq3UAwr_bigger.png",geometry:["point","area"],tags:{"brand:wikidata":"Q3322945",shop:"clothes"},addTags:{brand:"Stradivarius","brand:wikidata":"Q3322945","brand:wikipedia":"en:Stradivarius (clothing brand)",name:"Stradivarius",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Street One":{name:"Street One",icon:"maki-clothing-store",geometry:["point","area"],tags:{"brand:wikidata":"Q61997265",shop:"clothes"},addTags:{brand:"Street One","brand:wikidata":"Q61997265",name:"Street One",operator:"CBR Fashion Holding","operator:wikidata":"Q1022989","operator:wikipedia":"de:CBR Fashion Holding",shop:"clothes"},countryCodes:["at","be","bg","ch","cz","de","dk","es","fi","fr","hr","hu","ie","it","lt","lu","lv","nl","no","pl","ro","se","si","sk"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Suburbia":{name:"Suburbia",icon:"maki-clothing-store",geometry:["point","area"],tags:{"brand:wikidata":"Q6134992",shop:"clothes"},addTags:{brand:"Suburbia","brand:wikidata":"Q6134992","brand:wikipedia":"en:Suburbia (department store)",name:"Suburbia",shop:"clothes"},countryCodes:["mx"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Superdry":{name:"Superdry",icon:"maki-clothing-store",imageURL:"https://pbs.twimg.com/profile_images/1021773831546056704/C5cZqYeP_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q1684445",shop:"clothes"},addTags:{brand:"Superdry","brand:wikidata":"Q1684445","brand:wikipedia":"en:Superdry",name:"Superdry",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/TJ Maxx":{name:"TJ Maxx",icon:"maki-clothing-store",imageURL:"https://pbs.twimg.com/profile_images/578229320994295808/nAHcV1yx_bigger.png",geometry:["point","area"],tags:{"brand:wikidata":"Q10860683",shop:"clothes"},addTags:{brand:"TJ Maxx","brand:wikidata":"Q10860683","brand:wikipedia":"en:TJ Maxx",name:"TJ Maxx",shop:"clothes"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/clothes/TK Maxx":{name:"TK Maxx",icon:"maki-clothing-store",imageURL:"https://pbs.twimg.com/profile_images/1078275977426468866/QgWrQjee_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q23823668",shop:"clothes"},addTags:{brand:"TK Maxx","brand:wikidata":"Q23823668","brand:wikipedia":"en:TK Maxx",name:"TK Maxx",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Takko":{name:"Takko",icon:"maki-clothing-store",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FTakkoLogo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q1371302",shop:"clothes"},addTags:{brand:"Takko","brand:wikidata":"Q1371302","brand:wikipedia":"de:Takko",name:"Takko",shop:"clothes"},countryCodes:["at","cz","de","hu","nl"],terms:["takko fashion"],matchScore:2,suggestion:true},"shop/clothes/Talbots":{name:"Talbots",icon:"maki-clothing-store",imageURL:"https://pbs.twimg.com/profile_images/648526811479961600/EcfZDBkl_bigger.png",geometry:["point","area"],tags:{"brand:wikidata":"Q7679064",shop:"clothes"},addTags:{brand:"Talbots","brand:wikidata":"Q7679064","brand:wikipedia":"en:Talbots",name:"Talbots",shop:"clothes"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Tally Weijl":{name:"Tally Weijl",icon:"maki-clothing-store",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FTALLY%20WEiJL%20Logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q689695",shop:"clothes"},addTags:{brand:"Tally Weijl","brand:wikidata":"Q689695","brand:wikipedia":"en:Tally Weijl",name:"Tally Weijl",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Tati":{name:"Tati",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/Tati/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3516026",shop:"clothes"},addTags:{brand:"Tati","brand:wikidata":"Q3516026","brand:wikipedia":"fr:Tati (entreprise)",name:"Tati",shop:"clothes"},countryCodes:["dz","fr"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Tezenis":{name:"Tezenis",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/tezenis/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q28056374",shop:"clothes"},addTags:{brand:"Tezenis","brand:wikidata":"Q28056374",name:"Tezenis",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/The Children's Place":{name:"The Children's Place",icon:"maki-clothing-store",imageURL:"https://pbs.twimg.com/profile_images/200694312/Twitter_Logo_TCP_lockup_2995_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q3520257",shop:"clothes"},addTags:{brand:"The Children's Place","brand:wikidata":"Q3520257","brand:wikipedia":"en:The Children's Place",name:"The Children's Place",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/The North Face":{name:"The North Face",icon:"maki-clothing-store",imageURL:"https://pbs.twimg.com/profile_images/1042076860023275523/9qahAU7A_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q152784",shop:"clothes"},addTags:{brand:"The North Face","brand:wikidata":"Q152784","brand:wikipedia":"en:The North Face",name:"The North Face",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/The Sting":{name:"The Sting",icon:"maki-clothing-store",geometry:["point","area"],tags:{"brand:wikidata":"Q2518794",shop:"clothes"},addTags:{brand:"The Sting","brand:wikidata":"Q2518794","brand:wikipedia":"nl:The Sting Companies",name:"The Sting",shop:"clothes"},countryCodes:["be","de","gb","nl"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Timberland":{name:"Timberland",icon:"maki-clothing-store",geometry:["point","area"],tags:{"brand:wikidata":"Q1539185",shop:"clothes"},addTags:{brand:"Timberland","brand:wikidata":"Q1539185","brand:wikipedia":"en:The Timberland Company",name:"Timberland",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Tom Tailor":{name:"Tom Tailor",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/tomtailor/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q571206",shop:"clothes"},addTags:{brand:"Tom Tailor","brand:wikidata":"Q571206","brand:wikipedia":"en:Tom Tailor",name:"Tom Tailor",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Tommy Bahama":{name:"Tommy Bahama",icon:"maki-clothing-store",imageURL:"https://pbs.twimg.com/profile_images/817443720060506113/MAMMKuhr_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q3531299",shop:"clothes"},addTags:{brand:"Tommy Bahama","brand:wikidata":"Q3531299","brand:wikipedia":"en:Tommy Bahama",name:"Tommy Bahama",shop:"clothes"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Tommy Hilfiger":{name:"Tommy Hilfiger",icon:"maki-clothing-store",imageURL:"https://pbs.twimg.com/profile_images/1029280250331627520/VUFItzJv_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q634881",shop:"clothes"},addTags:{brand:"Tommy Hilfiger","brand:wikidata":"Q634881","brand:wikipedia":"en:Tommy Hilfiger (company)",name:"Tommy Hilfiger",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Topshop":{name:"Topshop",icon:"maki-clothing-store",imageURL:"https://pbs.twimg.com/profile_images/1121788834755125248/dla2FNMm_bigger.png",geometry:["point","area"],tags:{"brand:wikidata":"Q1893576",shop:"clothes"},addTags:{brand:"Topshop","brand:wikidata":"Q1893576","brand:wikipedia":"en:Topshop",name:"Topshop",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Torrid":{name:"Torrid",icon:"maki-clothing-store",geometry:["point","area"],tags:{"brand:wikidata":"Q7827120",shop:"clothes"},addTags:{brand:"Torrid","brand:wikidata":"Q7827120","brand:wikipedia":"en:Torrid (clothing retailer)",name:"Torrid",shop:"clothes"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Triumph":{name:"Triumph",icon:"maki-clothing-store",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FTriumph%20International%20Logo%202008.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q671216",shop:"clothes"},addTags:{brand:"Triumph","brand:wikidata":"Q671216","brand:wikipedia":"en:Triumph International",name:"Triumph",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Truworths":{name:"Truworths",icon:"maki-clothing-store",geometry:["point","area"],tags:{"brand:wikidata":"Q24233998",shop:"clothes"},addTags:{brand:"Truworths","brand:wikidata":"Q24233998","brand:wikipedia":"en:Truworths",name:"Truworths",shop:"clothes"},countryCodes:["za"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Ulla Popken":{name:"Ulla Popken",icon:"maki-clothing-store",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FUlla%20Popken%20neu.png&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q2475146",shop:"clothes"},addTags:{brand:"Ulla Popken","brand:wikidata":"Q2475146","brand:wikipedia":"en:Ulla Popken",name:"Ulla Popken",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Uniqlo":{name:"Uniqlo",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/uniqlo/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q26070",shop:"clothes"},addTags:{brand:"Uniqlo","brand:wikidata":"Q26070","brand:wikipedia":"en:Uniqlo",name:"Uniqlo",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/United Colors of Benetton":{name:"United Colors of Benetton",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/BenettonItalia/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q817139",shop:"clothes"},addTags:{brand:"United Colors of Benetton","brand:wikidata":"Q817139","brand:wikipedia":"en:Benetton Group",name:"United Colors of Benetton",shop:"clothes"},terms:["benetton"],matchScore:2,suggestion:true},"shop/clothes/Urban Outfitters":{name:"Urban Outfitters",icon:"maki-clothing-store",imageURL:"https://pbs.twimg.com/profile_images/761568776471052289/Wv_Cpxbw_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q3552193",shop:"clothes"},addTags:{brand:"Urban Outfitters","brand:wikidata":"Q3552193","brand:wikipedia":"en:Urban Outfitters",name:"Urban Outfitters",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Vero Moda":{name:"Vero Moda",icon:"maki-clothing-store",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FBS%20DK.JPG&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q594721",shop:"clothes"},addTags:{brand:"Vero Moda","brand:wikidata":"Q594721","brand:wikipedia":"en:Bestseller (company)",name:"Vero Moda",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Victoria's Secret":{name:"Victoria's Secret",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/victoriassecret/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q332477",shop:"clothes"},addTags:{brand:"Victoria's Secret","brand:wikidata":"Q332477","brand:wikipedia":"en:Victoria's Secret",clothes:"underwear;women",name:"Victoria's Secret",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Volcom":{name:"Volcom",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/Volcom/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2021416",shop:"clothes"},addTags:{brand:"Volcom","brand:wikidata":"Q2021416","brand:wikipedia":"en:Volcom",name:"Volcom",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/WE":{name:"WE",icon:"maki-clothing-store",geometry:["point","area"],tags:{"brand:wikidata":"Q1987861",shop:"clothes"},addTags:{brand:"WE","brand:wikidata":"Q1987861","brand:wikipedia":"en:WE (clothing)",name:"WE",shop:"clothes"},countryCodes:["be","ch","de","nl"],terms:[],matchScore:2,suggestion:true},"shop/clothes/White House Black Market":{name:"White House Black Market",icon:"maki-clothing-store",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FWHBM%20Logo.png&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q7994858",shop:"clothes"},addTags:{brand:"White House Black Market","brand:wikidata":"Q7994858","brand:wikipedia":"en:White House Black Market",name:"White House Black Market",shop:"clothes"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"shop/clothes/White Stuff":{name:"White Stuff",icon:"maki-clothing-store",imageURL:"https://pbs.twimg.com/profile_images/633617979469524993/ydbUTjT3_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q7995442",shop:"clothes"},addTags:{brand:"White Stuff","brand:wikidata":"Q7995442","brand:wikipedia":"en:White Stuff Clothing",name:"White Stuff",shop:"clothes"},countryCodes:["de","dk","gb","gg"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Wibra":{name:"Wibra",icon:"maki-clothing-store",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FWibra%20Wallonie%20logo.png&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q943405",shop:"clothes"},addTags:{brand:"Wibra","brand:wikidata":"Q943405","brand:wikipedia":"en:Wibra",name:"Wibra",shop:"clothes"},countryCodes:["be","nl"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Winners":{name:"Winners",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/Winners/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q845257",shop:"clothes"},addTags:{brand:"Winners","brand:wikidata":"Q845257","brand:wikipedia":"en:Winners",name:"Winners",shop:"clothes"},countryCodes:["ca","es"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Woolworths":{name:"Woolworths",icon:"maki-clothing-store",geometry:["point","area"],tags:{"brand:wikidata":"Q8033997",shop:"clothes"},addTags:{brand:"Woolworths","brand:wikidata":"Q8033997","brand:wikipedia":"en:Woolworths Holdings Limited",name:"Woolworths",shop:"clothes"},countryCodes:["za"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Yamamay":{name:"Yamamay",icon:"maki-clothing-store",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FYamamay%20logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q2599214",shop:"clothes"},addTags:{brand:"Yamamay","brand:wikidata":"Q2599214","brand:wikipedia":"it:Yamamay",name:"Yamamay",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Zara":{name:"Zara",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/zara/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q147662",shop:"clothes"},addTags:{brand:"Zara","brand:wikidata":"Q147662","brand:wikipedia":"en:Zara (retailer)",name:"Zara",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Zeeman":{name:"Zeeman",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/zeemantextielsupers/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q184399",shop:"clothes"},addTags:{brand:"Zeeman","brand:wikidata":"Q184399","brand:wikipedia":"en:Zeeman (store)",name:"Zeeman",shop:"clothes"},countryCodes:["be","de","fr","lu","nl"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Zumiez":{name:"Zumiez",icon:"maki-clothing-store",geometry:["point","area"],tags:{"brand:wikidata":"Q8075252",shop:"clothes"},addTags:{brand:"Zumiez","brand:wikidata":"Q8075252","brand:wikipedia":"en:Zumiez",name:"Zumiez",shop:"clothes"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"shop/clothes/mister*lady":{name:"mister*lady",icon:"maki-clothing-store",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FLogo%20Mister*lady.jpg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q18640136",shop:"clothes"},addTags:{brand:"mister*lady","brand:wikidata":"Q18640136","brand:wikipedia":"de:Mister*lady",name:"mister*lady",shop:"clothes"},countryCodes:["at","de"],terms:[],matchScore:2,suggestion:true},"shop/clothes/rue21":{name:"rue21",icon:"maki-clothing-store",imageURL:"https://pbs.twimg.com/profile_images/793801428380835840/XsjVskJq_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q7377762",shop:"clothes"},addTags:{brand:"rue21","brand:wikidata":"Q7377762","brand:wikipedia":"en:Rue21",name:"rue21",shop:"clothes"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/clothes/s.Oliver":{name:"s.Oliver",icon:"maki-clothing-store",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FS.Oliver.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q265056",shop:"clothes"},addTags:{brand:"s.Oliver","brand:wikidata":"Q265056","brand:wikipedia":"en:S.Oliver",name:"s.Oliver",shop:"clothes"},countryCodes:["at","be","de","fr","hr"],terms:[],matchScore:2,suggestion:true},"shop/clothes/しまむら":{name:"しまむら",icon:"maki-clothing-store",geometry:["point","area"],tags:{"brand:wikidata":"Q7758173",shop:"clothes"},addTags:{brand:"しまむら","brand:en":"Shimamura","brand:ja":"しまむら","brand:wikidata":"Q7758173","brand:wikipedia":"ja:しまむら",name:"しまむら","name:en":"Shimamura","name:ja":"しまむら",shop:"clothes"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/clothes/はるやま":{name:"はるやま",icon:"maki-clothing-store",geometry:["point","area"],tags:{"brand:wikidata":"Q11275918",shop:"clothes"},addTags:{brand:"はるやま","brand:en":"Haruyama","brand:ja":"はるやま","brand:wikidata":"Q11275918","brand:wikipedia":"ja:はるやま商事",name:"はるやま","name:en":"Haruyama","name:ja":"はるやま",shop:"clothes"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/clothes/ユニクロ":{name:"ユニクロ",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/uniqlo/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q26070",shop:"clothes"},addTags:{brand:"ユニクロ","brand:en":"UNIQLO","brand:ja":"ユニクロ","brand:wikidata":"Q26070","brand:wikipedia":"en:Uniqlo",name:"ユニクロ","name:en":"UNIQLO","name:ja":"ユニクロ",shop:"clothes"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/clothes/ライトオン":{name:"ライトオン",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/righton.co.jp/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11346416",shop:"clothes"},addTags:{brand:"ライトオン","brand:en":"Right-on","brand:ja":"ライトオン","brand:wikidata":"Q11346416","brand:wikipedia":"ja:ライトオン",name:"ライトオン","name:en":"Right-on","name:ja":"ライトオン",shop:"clothes"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/clothes/ワークマン":{name:"ワークマン",icon:"maki-clothing-store",geometry:["point","area"],tags:{"brand:wikidata":"Q11351660",shop:"clothes"},addTags:{brand:"ワークマン","brand:en":"Workman","brand:ja":"ワークマン","brand:wikidata":"Q11351660","brand:wikipedia":"ja:ワークマン",name:"ワークマン","name:en":"Workman","name:ja":"ワークマン",shop:"clothes"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/clothes/洋服の青山":{name:"洋服の青山",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/AoyamaOfficial/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11661241",shop:"clothes"},addTags:{brand:"洋服の青山","brand:en":"Aoyama Tailor","brand:ja":"洋服の青山","brand:wikidata":"Q11661241","brand:wikipedia":"ja:青山商事",name:"洋服の青山","name:en":"Aoyama Tailor","name:ja":"洋服の青山",shop:"clothes"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/coffee/Nespresso":{name:"Nespresso",icon:"maki-shop",imageURL:"https://graph.facebook.com/nespresso/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q301301",shop:"coffee"},addTags:{brand:"Nespresso","brand:wikidata":"Q301301","brand:wikipedia":"en:Nespresso",name:"Nespresso",shop:"coffee"},terms:[],matchScore:2,suggestion:true},"shop/coffee/Tchibo":{name:"Tchibo",icon:"maki-shop",imageURL:"https://graph.facebook.com/tchibo.de/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q564213",shop:"coffee"},addTags:{brand:"Tchibo","brand:wikidata":"Q564213","brand:wikipedia":"de:Tchibo",name:"Tchibo",shop:"coffee"},terms:[],matchScore:2,suggestion:true},"shop/computer/PC World":{name:"PC World",icon:"fas-laptop",imageURL:"https://graph.facebook.com/curryspcworld/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7118727",shop:"computer"},addTags:{brand:"PC World","brand:wikidata":"Q7118727","brand:wikipedia":"en:PC World (retailer)",name:"PC World",shop:"computer"},terms:[],matchScore:2,suggestion:true},"shop/confectionery/Adyar Ananda Bhavan":{name:"Adyar Ananda Bhavan",icon:"maki-confectionery",imageURL:"https://graph.facebook.com/a2b.officialpage/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q15178238",shop:"confectionery"},addTags:{brand:"Adyar Ananda Bhavan","brand:wikidata":"Q15178238","brand:wikipedia":"en:Adyar Ananda Bhavan",name:"Adyar Ananda Bhavan",shop:"confectionery"},countryCodes:["in"],terms:[],matchScore:2,suggestion:true},"shop/confectionery/Hemmakvall":{name:"Hemmakvall",icon:"maki-confectionery",imageURL:"https://graph.facebook.com/hemmakvall/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q10521791",shop:"confectionery"},addTags:{"brand:wikidata":"Q10521791","brand:wikipedia":"sv:Hemmakväll",name:"Hemmakväll",shop:"confectionery"},countryCodes:["se"],terms:[],matchScore:2,suggestion:true},"shop/confectionery/Hussel":{name:"Hussel",icon:"maki-confectionery",imageURL:"https://graph.facebook.com/HusselConfiserie/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q17123688",shop:"confectionery"},addTags:{brand:"Hussel","brand:wikidata":"Q17123688","brand:wikipedia":"de:Hussel",name:"Hussel",shop:"confectionery"},terms:[],matchScore:2,suggestion:true},"shop/confectionery/Jamin":{name:"Jamin",icon:"maki-confectionery",geometry:["point","area"],tags:{"brand:wikidata":"Q2291848",shop:"confectionery"},addTags:{brand:"Jamin","brand:wikidata":"Q2291848","brand:wikipedia":"nl:Jamin",name:"Jamin",shop:"confectionery"},countryCodes:["nl"],terms:[],matchScore:2,suggestion:true},"shop/confectionery/Thorntons":{name:"Thorntons",icon:"maki-confectionery",imageURL:"https://graph.facebook.com/Thorntons.Official/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q683102",shop:"confectionery"},addTags:{brand:"Thorntons","brand:wikidata":"Q683102","brand:wikipedia":"en:Thorntons",name:"Thorntons",shop:"confectionery"},terms:[],matchScore:2,suggestion:true},"shop/confectionery/Вацак":{name:"Вацак",icon:"maki-confectionery",imageURL:"https://graph.facebook.com/Vatsak.KD/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q30966576",shop:"confectionery"},addTags:{brand:"Вацак","brand:wikidata":"Q30966576","brand:wikipedia":"uk:Кондитерський Дім «Вацак»",name:"Вацак",shop:"confectionery"},countryCodes:["ua"],terms:[],matchScore:2,suggestion:true},"shop/confectionery/シャトレーゼ":{name:"シャトレーゼ",icon:"maki-confectionery",imageURL:"https://graph.facebook.com/chateraise.jp/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11307696",shop:"confectionery"},addTags:{brand:"シャトレーゼ","brand:en":"Chateraise","brand:ja":"シャトレーゼ","brand:wikidata":"Q11307696","brand:wikipedia":"ja:シャトレーゼ",name:"シャトレーゼ","name:en":"Chateraise","name:ja":"シャトレーゼ",shop:"confectionery"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/convenience/7-Eleven":{name:"7-Eleven",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/7ElevenMexico/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q259340",shop:"convenience"},addTags:{brand:"7-Eleven","brand:wikidata":"Q259340","brand:wikipedia":"en:7-Eleven",name:"7-Eleven",shop:"convenience"},terms:["7-11","seven eleven"],matchScore:2,suggestion:true},"shop/convenience/76":{name:"76",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/76gas/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1658320",shop:"convenience"},addTags:{brand:"76","brand:wikidata":"Q1658320","brand:wikipedia":"en:76 (gas station)",name:"76",shop:"convenience"},terms:[],matchScore:2,suggestion:true},"shop/convenience/8 à Huit":{name:"8 à Huit",icon:"fas-shopping-basket",geometry:["point","area"],tags:{"brand:wikidata":"Q2818601",shop:"convenience"},addTags:{brand:"8 à Huit","brand:wikidata":"Q2818601","brand:wikipedia":"fr:8 à Huit",name:"8 à Huit",shop:"convenience"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"shop/convenience/99 Speedmart":{name:"99 Speedmart",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/99speedmart/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62075061",shop:"convenience"},addTags:{brand:"99 Speedmart","brand:wikidata":"Q62075061",name:"99 Speedmart",shop:"convenience"},countryCodes:["br","my","us"],terms:[],matchScore:2,suggestion:true},"shop/convenience/ABC (Hawaii)":{name:"ABC (Hawaii)",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/abcstores/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4650251",shop:"convenience"},addTags:{brand:"ABC","brand:wikidata":"Q4650251","brand:wikipedia":"en:ABC Stores (Hawaii)",name:"ABC",shop:"convenience"},countryCodes:["us"],terms:["abc stores"],matchScore:2,suggestion:true},"shop/convenience/Aibė":{name:"Aibė",icon:"fas-shopping-basket",geometry:["point","area"],tags:{"brand:wikidata":"Q1022952",shop:"convenience"},addTags:{brand:"Aibė","brand:wikidata":"Q1022952","brand:wikipedia":"de:Aibė",name:"Aibė",shop:"convenience"},countryCodes:["lt","lv"],terms:[],matchScore:2,suggestion:true},"shop/convenience/Albert Heijn to go":{name:"Albert Heijn to go",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/albertheijn/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1653985",shop:"convenience"},addTags:{brand:"Albert Heijn to go","brand:wikidata":"Q1653985","brand:wikipedia":"en:Albert Heijn",name:"Albert Heijn to go",shop:"convenience"},countryCodes:["nl"],terms:[],matchScore:2,suggestion:true},"shop/convenience/Alfamidi":{name:"Alfamidi",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/alfamidiku/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q12471462",shop:"convenience"},addTags:{brand:"Alfamidi","brand:wikidata":"Q12471462","brand:wikipedia":"id:Alfamidi",name:"Alfamidi",shop:"convenience"},countryCodes:["id"],terms:[],matchScore:2,suggestion:true},"shop/convenience/Aral":{name:"Aral",icon:"fas-shopping-basket",geometry:["point","area"],tags:{"brand:wikidata":"Q565734",shop:"convenience"},addTags:{brand:"Aral","brand:wikidata":"Q565734","brand:wikipedia":"en:Aral AG",name:"Aral",shop:"convenience"},countryCodes:["de"],terms:["aral tankstelle"],matchScore:2,suggestion:true},"shop/convenience/BP Shop":{name:"BP Shop",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/bp/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q152057",shop:"convenience"},addTags:{brand:"BP Shop","brand:wikidata":"Q152057","brand:wikipedia":"en:BP",name:"BP Shop",shop:"convenience"},terms:[],matchScore:2,suggestion:true},"shop/convenience/Best-one":{name:"Best-one",icon:"fas-shopping-basket",geometry:["point","area"],tags:{"brand:wikidata":"Q4896532",shop:"convenience"},addTags:{brand:"Best-one","brand:wikidata":"Q4896532","brand:wikipedia":"en:Best-one",name:"Best-one",shop:"convenience"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/convenience/Buc-ee's":{name:"Buc-ee's",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/bucees/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4982335",shop:"convenience"},addTags:{brand:"Buc-ee's","brand:wikidata":"Q4982335","brand:wikipedia":"en:Buc-ee's",name:"Buc-ee's",shop:"convenience"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/convenience/Budgens":{name:"Budgens",icon:"fas-shopping-basket",imageURL:"https://pbs.twimg.com/profile_images/796001828966203392/69ZeL67f_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q4985016",shop:"convenience"},addTags:{brand:"Budgens","brand:wikidata":"Q4985016","brand:wikipedia":"en:Budgens",name:"Budgens",shop:"convenience"},terms:[],matchScore:2,suggestion:true},"shop/convenience/CBA":{name:"CBA",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/cbaboltok/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q779845",shop:"convenience"},addTags:{brand:"CBA","brand:wikidata":"Q779845","brand:wikipedia":"en:CBA (food retail)",name:"CBA",shop:"convenience"},terms:[],matchScore:2,suggestion:true},"shop/convenience/COOP Jednota":{name:"COOP Jednota",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/COOPJednota/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q41629254",shop:"convenience"},addTags:{brand:"COOP Jednota","brand:wikidata":"Q41629254","brand:wikipedia":"sk:COOP Jednota Slovensko",name:"COOP Jednota",shop:"convenience"},countryCodes:["cz","sk"],terms:["jednota"],matchScore:2,suggestion:true},"shop/convenience/Chata Polska":{name:"Chata Polska",icon:"fas-shopping-basket",geometry:["point","area"],tags:{"brand:wikidata":"Q61994406",shop:"convenience"},addTags:{brand:"Chata Polska","brand:wikidata":"Q61994406",name:"Chata Polska",shop:"convenience"},terms:[],matchScore:2,suggestion:true},"shop/convenience/Circle K":{name:"Circle K",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/circlekireland/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3268010",shop:"convenience"},addTags:{brand:"Circle K","brand:wikidata":"Q3268010","brand:wikipedia":"en:Circle K",name:"Circle K",shop:"convenience"},terms:["ok","ok-mart"],matchScore:2,suggestion:true},"shop/convenience/Co-op (Canada)":{name:"Co-op (Canada)",icon:"fas-shopping-basket",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FSaskatoon%20Co-op%20Logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q5440676",shop:"convenience"},addTags:{brand:"Federated Co-operatives","brand:wikidata":"Q5440676","brand:wikipedia":"en:Federated Co-operatives",name:"Co-op",shop:"convenience"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"shop/convenience/Coop Pronto":{name:"Coop Pronto",icon:"fas-shopping-basket",geometry:["point","area"],tags:{"brand:wikidata":"Q1129777",shop:"convenience"},addTags:{brand:"Coop Pronto","brand:wikidata":"Q1129777","brand:wikipedia":"de:Coop Mineraloel",name:"Coop Pronto",shop:"convenience"},countryCodes:["ch","li"],terms:[],matchScore:2,suggestion:true},"shop/convenience/Coop (Schweiz)":{name:"Coop (Schweiz)",icon:"fas-shopping-basket",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FCoop.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q432564",shop:"convenience"},addTags:{brand:"Coop","brand:wikidata":"Q432564","brand:wikipedia":"de:Coop (Schweiz)",name:"Coop",shop:"convenience"},countryCodes:["ch"],terms:[],matchScore:2,suggestion:true},"shop/convenience/Costcutter":{name:"Costcutter",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/costcutter/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5175072",shop:"convenience"},addTags:{brand:"Costcutter","brand:wikidata":"Q5175072","brand:wikipedia":"en:Costcutter",name:"Costcutter",shop:"convenience"},terms:[],matchScore:2,suggestion:true},"shop/convenience/Daisy Mart":{name:"Daisy Mart",icon:"fas-shopping-basket",geometry:["point","area"],tags:{"brand:wikidata":"Q61994934",shop:"convenience"},addTags:{brand:"Daisy Mart","brand:wikidata":"Q61994934",name:"Daisy Mart",shop:"convenience"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"shop/convenience/Delikatesy Centrum":{name:"Delikatesy Centrum",icon:"fas-shopping-basket",geometry:["point","area"],tags:{"brand:wikidata":"Q11693824",shop:"convenience"},addTags:{brand:"Delikatesy Centrum","brand:wikidata":"Q11693824","brand:wikipedia":"pl:Delikatesy Centrum",name:"Delikatesy Centrum",shop:"convenience"},countryCodes:["pl"],terms:[],matchScore:2,suggestion:true},"shop/convenience/FamilyMart":{name:"FamilyMart",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/familymart.japan/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1191685",shop:"convenience"},addTags:{brand:"FamilyMart","brand:wikidata":"Q1191685","brand:wikipedia":"en:FamilyMart",name:"FamilyMart",shop:"convenience"},terms:[],matchScore:2,suggestion:true},"shop/convenience/Four Square":{name:"Four Square",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/FourSquareNZ/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5475558",shop:"convenience"},addTags:{brand:"Four Square","brand:wikidata":"Q5475558","brand:wikipedia":"en:Four Square (supermarket)",name:"Four Square",shop:"convenience"},terms:[],matchScore:2,suggestion:true},"shop/convenience/Franprix":{name:"Franprix",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/franprix/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2420096",shop:"convenience"},addTags:{brand:"Franprix","brand:wikidata":"Q2420096","brand:wikipedia":"fr:Franprix",name:"Franprix",shop:"convenience"},terms:[],matchScore:2,suggestion:true},"shop/convenience/Freshmarket":{name:"Freshmarket",icon:"fas-shopping-basket",geometry:["point","area"],tags:{"brand:wikidata":"Q16546326",shop:"convenience"},addTags:{brand:"Freshmarket","brand:wikidata":"Q16546326","brand:wikipedia":"pl:Freshmarket",name:"Freshmarket",shop:"convenience"},countryCodes:["pl"],terms:[],matchScore:2,suggestion:true},"shop/convenience/Groszek":{name:"Groszek",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/Sklepy.Groszek/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q9280965",shop:"convenience"},addTags:{brand:"Groszek","brand:wikidata":"Q9280965","brand:wikipedia":"pl:Groszek (sieć sklepów)",name:"Groszek",shop:"convenience"},countryCodes:["pl"],terms:[],matchScore:2,suggestion:true},"shop/convenience/Hasty Market":{name:"Hasty Market",icon:"fas-shopping-basket",geometry:["point","area"],tags:{"brand:wikidata":"Q58022603",shop:"convenience"},addTags:{brand:"Hasty Market","brand:wikidata":"Q58022603",name:"Hasty Market",shop:"convenience"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"shop/convenience/Intermarché Contact":{name:"Intermarché Contact",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/tousuniscontrelaviechere/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3153200",shop:"convenience"},addTags:{brand:"Intermarché Contact","brand:wikidata":"Q3153200","brand:wikipedia":"fr:Intermarché",name:"Intermarché Contact",shop:"convenience"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"shop/convenience/Jacksons":{name:"Jacksons",icon:"fas-shopping-basket",geometry:["point","area"],tags:{"brand:wikidata":"Q6117880",shop:"convenience"},addTags:{brand:"Jacksons","brand:wikidata":"Q6117880","brand:wikipedia":"en:Jacksons Stores",name:"Jacksons",shop:"convenience"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/convenience/K-Market":{name:"K-Market",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/KMarketSuomi/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11868562",shop:"convenience"},addTags:{brand:"K-Market","brand:wikidata":"Q11868562","brand:wikipedia":"fi:K-Market",name:"K-Market",shop:"convenience"},countryCodes:["fi"],terms:[],matchScore:2,suggestion:true},"shop/convenience/Kwik Trip":{name:"Kwik Trip",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/KwikTrip/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6450420",shop:"convenience"},addTags:{brand:"Kwik Trip","brand:wikidata":"Q6450420","brand:wikipedia":"en:Kwik Trip",name:"Kwik Trip",shop:"convenience"},terms:[],matchScore:2,suggestion:true},"shop/convenience/Lawson":{name:"Lawson",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/lawson.fanpage/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1557223",shop:"convenience"},addTags:{brand:"Lawson","brand:wikidata":"Q1557223","brand:wikipedia":"en:Lawson (store)",name:"Lawson",shop:"convenience"},terms:[],matchScore:2,suggestion:true},"shop/convenience/Lewiatan":{name:"Lewiatan",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/psh.lewiatan/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11755396",shop:"convenience"},addTags:{brand:"Lewiatan","brand:wikidata":"Q11755396","brand:wikipedia":"pl:Lewiatan (sieć handlowa)",name:"Lewiatan",shop:"convenience"},countryCodes:["pl"],terms:[],matchScore:2,suggestion:true},"shop/convenience/Lifestyle Express":{name:"Lifestyle Express",icon:"fas-shopping-basket",geometry:["point","area"],tags:{"brand:wikidata":"Q61994869",shop:"convenience"},addTags:{brand:"Lifestyle Express","brand:wikidata":"Q61994869",name:"Lifestyle Express",shop:"convenience"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/convenience/Mace":{name:"Mace",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/maces.stores/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q17089386",shop:"convenience"},addTags:{brand:"Mace","brand:wikidata":"Q17089386","brand:wikipedia":"en:Mace (shop)",name:"Mace",shop:"convenience"},terms:[],matchScore:2,suggestion:true},"shop/convenience/Marathon":{name:"Marathon",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/MarathonPetroleumCorporation/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q458363",shop:"convenience"},addTags:{brand:"Marathon","brand:wikidata":"Q458363","brand:wikipedia":"en:Marathon Petroleum",name:"Marathon",shop:"convenience"},terms:[],matchScore:2,suggestion:true},"shop/convenience/Małpka Express":{name:"Małpka Express",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/malpkaexpress/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q18431946",shop:"convenience"},addTags:{brand:"Małpka Express","brand:wikidata":"Q18431946","brand:wikipedia":"pl:Małpka Express",name:"Małpka Express",shop:"convenience"},countryCodes:["pl"],terms:[],matchScore:2,suggestion:true},"shop/convenience/McColl's":{name:"McColl's",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/YourMcColls/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q16997477",shop:"convenience"},addTags:{brand:"McColl's","brand:wikidata":"Q16997477","brand:wikipedia":"en:McColl's",name:"McColl's",shop:"convenience"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/convenience/Migrolino":{name:"Migrolino",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/migrolino/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q56745088",shop:"convenience"},addTags:{brand:"Migrolino","brand:wikidata":"Q56745088","brand:wikipedia":"de:Migrolino",name:"Migrolino",shop:"convenience"},countryCodes:["ch"],terms:[],matchScore:2,suggestion:true},"shop/convenience/Ministop":{name:"Ministop",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/MiniStop-374173965530/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1038929",shop:"convenience"},addTags:{brand:"Ministop","brand:wikidata":"Q1038929","brand:wikipedia":"en:Ministop",name:"Ministop",shop:"convenience"},terms:[],matchScore:2,suggestion:true},"shop/convenience/Mobil Mart":{name:"Mobil Mart",icon:"fas-shopping-basket",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FMobil%20logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q3088656",shop:"convenience"},addTags:{brand:"Mobil Mart","brand:wikidata":"Q3088656","brand:wikipedia":"en:Mobil",name:"Mobil Mart",shop:"convenience"},terms:[],matchScore:2,suggestion:true},"shop/convenience/Nasz Sklep":{name:"Nasz Sklep",icon:"fas-shopping-basket",geometry:["point","area"],tags:{"brand:wikidata":"Q62070369",shop:"convenience"},addTags:{brand:"Nasz Sklep","brand:wikidata":"Q62070369",name:"Nasz Sklep",shop:"convenience"},countryCodes:["pl"],terms:[],matchScore:2,suggestion:true},"shop/convenience/NewDays":{name:"NewDays",icon:"fas-shopping-basket",geometry:["point","area"],tags:{"brand:wikidata":"Q11234763",shop:"convenience"},addTags:{alt_name:"ニューデイズ",brand:"NewDays","brand:wikidata":"Q11234763","brand:wikipedia":"ja:NewDays",name:"NewDays",shop:"convenience"},countryCodes:["jp"],terms:["newdays ミニ","ニューデイズ"],matchScore:2,suggestion:true},"shop/convenience/Nisa":{name:"Nisa",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/nisalocally/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q16999069",shop:"convenience"},addTags:{brand:"Nisa","brand:wikidata":"Q16999069","brand:wikipedia":"en:Nisa (retailer)",name:"Nisa",shop:"convenience"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/convenience/Nisa Local":{name:"Nisa Local",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/nisalocally/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q16999069",shop:"convenience"},addTags:{brand:"Nisa Local","brand:wikidata":"Q16999069","brand:wikipedia":"en:Nisa (retailer)",name:"Nisa Local",shop:"convenience"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/convenience/OK便利商店":{name:"OK便利商店",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/circlekireland/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3268010",shop:"convenience"},addTags:{brand:"OK便利商店","brand:en":"Circle K","brand:wikidata":"Q3268010","brand:wikipedia":"zh:OK便利店",name:"OK便利商店","name:en":"Circle K",shop:"convenience"},countryCodes:["cn","tw"],terms:["ok便利店 circle k"],matchScore:2,suggestion:true},"shop/convenience/On the Run":{name:"On the Run",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/OntheRunUS/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q16931259",shop:"convenience"},addTags:{brand:"On the Run","brand:wikidata":"Q16931259","brand:wikipedia":"en:On the Run (convenience store)",name:"On the Run",shop:"convenience"},terms:[],matchScore:2,suggestion:true},"shop/convenience/Oxxo":{name:"Oxxo",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/OXXOTiendas/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1342538",shop:"convenience"},addTags:{brand:"Oxxo","brand:wikidata":"Q1342538","brand:wikipedia":"es:Oxxo",name:"Oxxo",shop:"convenience"},terms:[],matchScore:2,suggestion:true},"shop/convenience/Petro-Canada":{name:"Petro-Canada",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/petrocanada/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1208279",shop:"convenience"},addTags:{brand:"Petro-Canada","brand:wikidata":"Q1208279","brand:wikipedia":"en:Petro-Canada",name:"Petro-Canada",shop:"convenience"},terms:[],matchScore:2,suggestion:true},"shop/convenience/Plaid Pantry":{name:"Plaid Pantry",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/plaidpantryOfficial/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7200591",shop:"convenience"},addTags:{brand:"Plaid Pantry","brand:wikidata":"Q7200591","brand:wikipedia":"en:Plaid Pantry",name:"Plaid Pantry",shop:"convenience"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/convenience/Premier":{name:"Premier",icon:"fas-shopping-basket",imageURL:"https://pbs.twimg.com/profile_images/552086468839997441/Ok2vWsQl_bigger.jpeg",geometry:["point","area"],tags:{"brand:wikidata":"Q7240340",shop:"convenience"},addTags:{brand:"Premier","brand:wikidata":"Q7240340","brand:wikipedia":"en:Premier Stores",name:"Premier",shop:"convenience"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/convenience/Proxi":{name:"Proxi",icon:"fas-shopping-basket",geometry:["point","area"],tags:{"brand:wikidata":"Q3408522",shop:"convenience"},addTags:{brand:"Proxi","brand:wikidata":"Q3408522","brand:wikipedia":"fr:Proxi",name:"Proxi",shop:"convenience"},terms:[],matchScore:2,suggestion:true},"shop/convenience/RaceTrac":{name:"RaceTrac",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/RaceTrac/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q735942",shop:"convenience"},addTags:{brand:"RaceTrac","brand:wikidata":"Q735942","brand:wikipedia":"en:RaceTrac",name:"RaceTrac",shop:"convenience"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/convenience/Sainsbury's Local":{name:"Sainsbury's Local",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/sainsburys/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q13218434",shop:"convenience"},addTags:{brand:"Sainsbury's Local","brand:wikidata":"Q13218434","brand:wikipedia":"en:Sainsbury's Local",name:"Sainsbury's Local",shop:"convenience"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/convenience/Sheetz":{name:"Sheetz",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/sheetz/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7492551",shop:"convenience"},addTags:{brand:"Sheetz","brand:wikidata":"Q7492551","brand:wikipedia":"en:Sheetz",name:"Sheetz",shop:"convenience"},terms:[],matchScore:2,suggestion:true},"shop/convenience/Shell Select":{name:"Shell Select",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/Shell/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q154950",shop:"convenience"},addTags:{brand:"Shell Select","brand:wikidata":"Q154950","brand:wikipedia":"en:Royal Dutch Shell",name:"Shell Select",shop:"convenience"},terms:[],matchScore:2,suggestion:true},"shop/convenience/Siwa":{name:"Siwa",icon:"fas-shopping-basket",geometry:["point","area"],tags:{"brand:wikidata":"Q11893827",shop:"convenience"},addTags:{brand:"Siwa","brand:wikidata":"Q11893827","brand:wikipedia":"fi:Siwa",name:"Siwa",shop:"convenience"},countryCodes:["fi"],terms:[],matchScore:2,suggestion:true},"shop/convenience/Spar":{name:"Spar",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/SPARintheUK/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q610492",shop:"convenience"},addTags:{brand:"Spar","brand:wikidata":"Q610492","brand:wikipedia":"en:Spar (retailer)",name:"Spar",shop:"convenience"},terms:[],matchScore:2,suggestion:true},"shop/convenience/Spar Express":{name:"Spar Express",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/SPARintheUK/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q610492",shop:"convenience"},addTags:{brand:"Spar","brand:wikidata":"Q610492","brand:wikipedia":"en:Spar (retailer)",name:"Spar Express",shop:"convenience"},terms:[],matchScore:2,suggestion:true},"shop/convenience/Speedway":{name:"Speedway",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/SpeedwayStores/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7575683",shop:"convenience"},addTags:{brand:"Speedway","brand:wikidata":"Q7575683","brand:wikipedia":"en:Speedway LLC",name:"Speedway",shop:"convenience"},terms:[],matchScore:2,suggestion:true},"shop/convenience/Społem":{name:"Społem",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/SpolemSpoldzielczoscSpozywcow/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11826043",shop:"convenience"},addTags:{brand:"Społem","brand:wikidata":"Q11826043","brand:wikipedia":"pl:Powszechna Spółdzielnia Spożywców „Społem”",name:"Społem",shop:"convenience"},terms:[],matchScore:2,suggestion:true},"shop/convenience/Star Mart":{name:"Star Mart",icon:"fas-shopping-basket",geometry:["point","area"],tags:{"brand:wikidata":"Q61994857",shop:"convenience"},addTags:{brand:"Star Mart","brand:wikidata":"Q61994857",name:"Star Mart",shop:"convenience"},terms:[],matchScore:2,suggestion:true},"shop/convenience/Stripes":{name:"Stripes",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/stripesstores/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7624135",shop:"convenience"},addTags:{brand:"Stripes","brand:wikidata":"Q7624135","brand:wikipedia":"en:Stripes Convenience Stores",name:"Stripes",shop:"convenience"},countryCodes:["cl","us"],terms:[],matchScore:2,suggestion:true},"shop/convenience/Tesco":{name:"Tesco",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/tesco/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q487494",shop:"convenience"},addTags:{brand:"Tesco","brand:wikidata":"Q487494","brand:wikipedia":"en:Tesco",name:"Tesco",shop:"convenience"},terms:[],matchScore:2,suggestion:true},"shop/convenience/Tesco Express":{name:"Tesco Express",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/tesco/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q487494",shop:"convenience"},addTags:{brand:"Tesco Express","brand:wikidata":"Q487494","brand:wikipedia":"en:Tesco",name:"Tesco Express",shop:"convenience"},terms:[],matchScore:2,suggestion:true},"shop/convenience/The Co-operative Food (UK)":{name:"The Co-operative Food (UK)",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/coopukfood/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3277439",shop:"convenience"},addTags:{brand:"The Co-operative Food","brand:wikidata":"Q3277439","brand:wikipedia":"en:Co-op Food",name:"The Co-operative Food",shop:"convenience"},countryCodes:["gb"],terms:["coop","coop food","cooperative food","the cooperative"],matchScore:2,suggestion:true},"shop/convenience/Tiger Mart":{name:"Tiger Mart",icon:"fas-shopping-basket",geometry:["point","area"],tags:{"brand:wikidata":"Q57643977",shop:"convenience"},addTags:{brand:"Tiger Mart","brand:wikidata":"Q57643977",name:"Tiger Mart",shop:"convenience"},terms:[],matchScore:2,suggestion:true},"shop/convenience/United Dairy Farmers":{name:"United Dairy Farmers",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/UnitedDairyFarmers/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7887677",shop:"convenience"},addTags:{amenity:"ice_cream",brand:"United Dairy Farmers","brand:wikidata":"Q7887677","brand:wikipedia":"en:United Dairy Farmers",name:"United Dairy Farmers",shop:"convenience",short_name:"UDF"},countryCodes:["us"],terms:["udf"],matchScore:2,suggestion:true},"shop/convenience/Utile":{name:"Utile",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/ULesCommercants/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2529029",shop:"convenience"},addTags:{brand:"Utile","brand:wikidata":"Q2529029","brand:wikipedia":"en:Système U",name:"Utile",shop:"convenience"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"shop/convenience/VinMart+":{name:"VinMart+",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/sieuthivinmart/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q60245505",shop:"convenience"},addTags:{brand:"VinMart","brand:wikidata":"Q60245505","brand:wikipedia":"vi:VinMart",name:"VinMart+",shop:"convenience"},countryCodes:["vn"],terms:[],matchScore:2,suggestion:true},"shop/convenience/Vival":{name:"Vival",icon:"fas-shopping-basket",geometry:["point","area"],tags:{"brand:wikidata":"Q7937525",shop:"convenience"},addTags:{brand:"Vival","brand:wikidata":"Q7937525","brand:wikipedia":"en:Vival (shop)",name:"Vival",shop:"convenience"},countryCodes:["fr","pe"],terms:[],matchScore:2,suggestion:true},"shop/convenience/Wawa":{name:"Wawa",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/wawa/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5936320",shop:"convenience"},addTags:{brand:"Wawa","brand:wikidata":"Q5936320","brand:wikipedia":"en:Wawa (company)",name:"Wawa",shop:"convenience"},terms:[],matchScore:2,suggestion:true},"shop/convenience/Weltladen":{name:"Weltladen",icon:"fas-shopping-basket",geometry:["point","area"],tags:{"brand:wikidata":"Q1640782",shop:"convenience"},addTags:{brand:"Weltladen","brand:wikidata":"Q1640782","brand:wikipedia":"de:Weltladen",name:"Weltladen",shop:"convenience"},countryCodes:["at","ch","de"],terms:[],matchScore:2,suggestion:true},"shop/convenience/Woolworths Petrol":{name:"Woolworths Petrol",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/woolworths/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5023980",shop:"convenience"},addTags:{brand:"Caltex","brand:wikidata":"Q5023980","brand:wikipedia":"en:Caltex Woolworths",name:"Woolworths Petrol",shop:"convenience"},countryCodes:["au"],terms:[],matchScore:2,suggestion:true},"shop/convenience/abc (Poland)":{name:"abc (Poland)",icon:"fas-shopping-basket",geometry:["point","area"],tags:{"brand:wikidata":"Q11683985",shop:"convenience"},addTags:{brand:"abc","brand:wikidata":"Q11683985","brand:wikipedia":"pl:Abc (sieć handlowa)",name:"abc",shop:"convenience"},countryCodes:["pl"],terms:[],matchScore:2,suggestion:true},"shop/convenience/ampm":{name:"ampm",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/ampm/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q306960",shop:"convenience"},addTags:{brand:"ampm","brand:wikidata":"Q306960","brand:wikipedia":"en:Ampm",name:"ampm",shop:"convenience"},terms:[],matchScore:2,suggestion:true},"shop/convenience/miniピアゴ":{name:"miniピアゴ",icon:"fas-shopping-basket",geometry:["point","area"],tags:{"brand:wikidata":"Q11188499",shop:"convenience"},addTags:{brand:"miniピアゴ","brand:en":"mini Piago","brand:ja":"miniピアゴ","brand:wikidata":"Q11188499","brand:wikipedia":"ja:Miniピアゴ",name:"miniピアゴ","name:en":"mini Piago","name:ja":"miniピアゴ",shop:"convenience"},countryCodes:["jp"],terms:["ミニピアゴ"],matchScore:2,suggestion:true},"shop/convenience/Żabka":{name:"Żabka",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/zabkapolska/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2589061",shop:"convenience"},addTags:{brand:"Żabka","brand:wikidata":"Q2589061","brand:wikipedia":"pl:Żabka (sieć sklepów)",name:"Żabka",shop:"convenience"},countryCodes:["pl"],terms:[],matchScore:2,suggestion:true},"shop/convenience/ВкусВилл":{name:"ВкусВилл",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/izbenka/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q57271676",shop:"convenience"},addTags:{brand:"ВкусВилл","brand:wikidata":"Q57271676","brand:wikipedia":"ru:Вкусвилл",name:"ВкусВилл",shop:"convenience"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"shop/convenience/Гроздь":{name:"Гроздь",icon:"fas-shopping-basket",geometry:["point","area"],tags:{"brand:wikidata":"Q21638412",shop:"convenience"},addTags:{brand:"Гроздь","brand:wikidata":"Q21638412","brand:wikipedia":"ru:Гроздь (сеть магазинов)",name:"Гроздь",shop:"convenience"},terms:[],matchScore:2,suggestion:true},"shop/convenience/Доброном":{name:"Доброном",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/Eurooptby/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2565040",shop:"convenience"},addTags:{brand:"Доброном","brand:wikidata":"Q2565040","brand:wikipedia":"be:Eurotorg",name:"Доброном",shop:"convenience"},countryCodes:["by","ru"],terms:[],matchScore:2,suggestion:true},"shop/convenience/Копейка":{name:"Копейка",icon:"fas-shopping-basket",geometry:["point","area"],tags:{"brand:wikidata":"Q1783878",shop:"convenience"},addTags:{brand:"Копейка","brand:en":"Kopeyka","brand:wikidata":"Q1783878","brand:wikipedia":"en:Kopeyka (supermarket)",name:"Копейка","name:en":"Kopeyka",shop:"convenience"},countryCodes:["by","ru","ua"],terms:[],matchScore:2,suggestion:true},"shop/convenience/Магнит":{name:"Магнит",icon:"fas-shopping-basket",imageURL:"https://pbs.twimg.com/profile_images/1098477357390856192/wILY9KdL_bigger.png",geometry:["point","area"],tags:{"brand:wikidata":"Q940518",shop:"convenience"},addTags:{brand:"Магнит","brand:en":"Magnit","brand:wikidata":"Q940518","brand:wikipedia":"ru:Магнит (сеть магазинов)",name:"Магнит","name:en":"Magnit",shop:"convenience"},terms:["магнит у дома"],matchScore:2,suggestion:true},"shop/convenience/Сельпо":{name:"Сельпо",icon:"fas-shopping-basket",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FSilpo.png&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q4419434",shop:"convenience"},addTags:{brand:"Сельпо","brand:wikidata":"Q4419434","brand:wikipedia":"ru:Сильпо",name:"Сельпо",shop:"convenience"},countryCodes:["kz","ru"],terms:[],matchScore:2,suggestion:true},"shop/convenience/アンスリー":{name:"アンスリー",icon:"fas-shopping-basket",geometry:["point","area"],tags:{"brand:wikidata":"Q17192555",shop:"convenience"},addTags:{brand:"アンスリー","brand:en":"Ansuri","brand:ja":"アンスリー","brand:wikidata":"Q17192555","brand:wikipedia":"ja:アンスリー",name:"アンスリー","name:en":"Ansuri","name:ja":"アンスリー",shop:"convenience"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/convenience/サンクス":{name:"サンクス",icon:"fas-shopping-basket",imageURL:"https://pbs.twimg.com/profile_images/875617750923616257/dCryLWcX_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q16141064",shop:"convenience"},addTags:{brand:"サンクス","brand:en":"Sunkus","brand:ja":"サンクス","brand:wikidata":"Q16141064","brand:wikipedia":"ja:サークルKサンクス",name:"サンクス","name:en":"Sunkus","name:ja":"サンクス",shop:"convenience"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/convenience/サークルK":{name:"サークルK",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/circlekireland/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3268010",shop:"convenience"},addTags:{brand:"サークルK","brand:en":"Circle K","brand:ja":"サークルK","brand:wikidata":"Q3268010","brand:wikipedia":"en:Circle K",name:"サークルK","name:en":"Circle K","name:ja":"サークルK",shop:"convenience"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/convenience/スリーエフ":{name:"スリーエフ",icon:"fas-shopping-basket",imageURL:"https://pbs.twimg.com/profile_images/875645560073539585/X1oFVQef_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q11313419",shop:"convenience"},addTags:{brand:"スリーエフ","brand:en":"Three F","brand:ja":"スリーエフ","brand:wikidata":"Q11313419","brand:wikipedia":"ja:スリーエフ",name:"スリーエフ","name:en":"Three F","name:ja":"スリーエフ",shop:"convenience"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/convenience/セイコーマート":{name:"セイコーマート",icon:"fas-shopping-basket",geometry:["point","area"],tags:{"brand:wikidata":"Q11314123",shop:"convenience"},addTags:{brand:"セイコーマート","brand:en":"Seicomart","brand:ja":"セイコーマート","brand:wikidata":"Q11314123","brand:wikipedia":"ja:セイコーマート",name:"セイコーマート","name:en":"Seicomart","name:ja":"セイコーマート",shop:"convenience"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/convenience/セブン-イレブン":{name:"セブン-イレブン",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/7ElevenMexico/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q259340",shop:"convenience"},addTags:{brand:"セブン-イレブン","brand:en":"7-Eleven","brand:ja":"セブン-イレブン","brand:wikidata":"Q259340","brand:wikipedia":"en:7-Eleven",name:"セブン-イレブン","name:en":"7-Eleven","name:ja":"セブン-イレブン","official_name:en":"Seven-Eleven",operator:"株式会社セブン&アイ・ホールディングス","operator:en":"Seven & I Holdings Co., Ltd.","operator:wikidata":"Q639447","operator:wikipedia":"en:Seven & I Holdings Co.",shop:"convenience"},countryCodes:["jp"],terms:["セブンイレブン(7-11)","セブンイレブン(seven-eleven)"],matchScore:2,suggestion:true},"shop/convenience/セーブオン":{name:"セーブオン",icon:"fas-shopping-basket",geometry:["point","area"],tags:{"brand:wikidata":"Q11314868",shop:"convenience"},addTags:{brand:"セーブオン","brand:en":"Save On","brand:ja":"セーブオン","brand:wikidata":"Q11314868","brand:wikipedia":"ja:セーブオン",name:"セーブオン","name:en":"Save On","name:ja":"セーブオン",shop:"convenience"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/convenience/デイリーヤマザキ":{name:"デイリーヤマザキ",icon:"fas-shopping-basket",geometry:["point","area"],tags:{"brand:wikidata":"Q5209392",shop:"convenience"},addTags:{brand:"デイリーヤマザキ","brand:en":"Daily Yamazaki","brand:ja":"デイリーヤマザキ","brand:wikidata":"Q5209392","brand:wikipedia":"en:Daily Yamazaki",name:"デイリーヤマザキ","name:en":"Daily Yamazaki","name:ja":"デイリーヤマザキ",shop:"convenience"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/convenience/ナチュラルローソン":{name:"ナチュラルローソン",icon:"fas-shopping-basket",geometry:["point","area"],tags:{"brand:wikidata":"Q11323850",shop:"convenience"},addTags:{brand:"ナチュラルローソン","brand:en":"NATURAL LAWSON","brand:ja":"ナチュラルローソン","brand:wikidata":"Q11323850","brand:wikipedia":"ja:ナチュラルローソン",name:"ナチュラルローソン","name:en":"Natural Lawson","name:ja":"ナチュラルローソン",shop:"convenience"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/convenience/ファミリーマート":{name:"ファミリーマート",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/familymart.japan/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1191685",shop:"convenience"},addTags:{brand:"ファミリーマート","brand:en":"FamilyMart","brand:ja":"ファミリーマート","brand:wikidata":"Q1191685","brand:wikipedia":"en:FamilyMart",name:"ファミリーマート","name:en":"FamilyMart","name:ja":"ファミリーマート",shop:"convenience"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/convenience/ポプラ":{name:"ポプラ",icon:"fas-shopping-basket",imageURL:"https://pbs.twimg.com/profile_images/826586791058644992/chXkmxnQ_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q7229380",shop:"convenience"},addTags:{brand:"ポプラ","brand:en":"Poplar","brand:ja":"ポプラ","brand:wikidata":"Q7229380","brand:wikipedia":"ja:ポプラ (コンビニエンスストア)",name:"ポプラ","name:en":"Poplar","name:ja":"ポプラ",shop:"convenience"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/convenience/ミニストップ":{name:"ミニストップ",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/MiniStop-374173965530/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1038929",shop:"convenience"},addTags:{brand:"ミニストップ","brand:en":"Ministop","brand:ja":"ミニストップ","brand:wikidata":"Q1038929","brand:wikipedia":"ja:ミニストップ",name:"ミニストップ","name:en":"Ministop","name:ja":"ミニストップ",shop:"convenience"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/convenience/ヤマザキショップ":{name:"ヤマザキショップ",icon:"fas-shopping-basket",geometry:["point","area"],tags:{"brand:wikidata":"Q11345131",shop:"convenience"},addTags:{brand:"ヤマザキショップ","brand:ja":"ヤマザキショップ","brand:wikidata":"Q11345131","brand:wikipedia":"ja:ヤマザキショップ",name:"ヤマザキショップ","name:en":"Yamazaki Shop","name:ja":"ヤマザキショップ",shop:"convenience"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/convenience/ローソン":{name:"ローソン",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/lawson.fanpage/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1557223",shop:"convenience"},addTags:{brand:"ローソン","brand:en":"LAWSON","brand:ja":"ローソン","brand:wikidata":"Q1557223","brand:wikipedia":"ja:ローソン",name:"ローソン","name:en":"Lawson","name:ja":"ローソン",shop:"convenience"},countryCodes:["jp"],terms:["ローソン"],matchScore:2,suggestion:true},"shop/convenience/ローソンストア100":{name:"ローソンストア100",icon:"fas-shopping-basket",geometry:["point","area"],tags:{"brand:wikidata":"Q11350960",shop:"convenience"},addTags:{brand:"ローソンストア100","brand:en":"LAWSON STORE 100","brand:ja":"ローソンストア100","brand:wikidata":"Q11350960","brand:wikipedia":"ja:ローソンストア100",name:"ローソンストア100","name:en":"Lawson Store 100","name:ja":"ローソンストア100",shop:"convenience"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/convenience/ローソン・スリーエフ":{name:"ローソン・スリーエフ",icon:"fas-shopping-basket",geometry:["point","area"],tags:{"brand:wikidata":"Q24866804",shop:"convenience"},addTags:{brand:"ローソン・スリーエフ","brand:en":"LAWSON・Three F","brand:ja":"ローソン・スリーエフ","brand:wikidata":"Q24866804","brand:wikipedia":"ja:ローソン・スリーエフ",name:"ローソン・スリーエフ","name:en":"Lawson・Three F","name:ja":"ローソン・スリーエフ",operator:"株式会社エル・ティーエフ","operator:en":"L・TF Co., Ltd.",shop:"convenience"},countryCodes:["jp"],terms:["lawson+スリーエフ","ローソン・スリーエフ"],matchScore:2,suggestion:true},"shop/convenience/全家":{name:"全家",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/familymart.japan/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1191685",shop:"convenience"},addTags:{brand:"全家","brand:en":"FamilyMart","brand:wikidata":"Q1191685","brand:wikipedia":"en:FamilyMart",name:"全家","name:en":"FamilyMart",shop:"convenience"},countryCodes:["cn","tw"],terms:[],matchScore:2,suggestion:true},"shop/convenience/全家便利商店":{name:"全家便利商店",icon:"fas-shopping-basket",geometry:["point","area"],tags:{"brand:wikidata":"Q10891564",shop:"convenience"},addTags:{brand:"全家便利商店","brand:wikidata":"Q10891564","brand:wikipedia":"zh:全家便利商店",name:"全家便利商店",shop:"convenience"},countryCodes:["tw"],terms:[],matchScore:2,suggestion:true},"shop/convenience/萊爾富":{name:"萊爾富",icon:"fas-shopping-basket",geometry:["point","area"],tags:{"brand:wikidata":"Q11326216",shop:"convenience"},addTags:{brand:"萊爾富","brand:wikidata":"Q11326216","brand:wikipedia":"zh:萊爾富",name:"萊爾富",shop:"convenience"},countryCodes:["tw"],terms:[],matchScore:2,suggestion:true},"shop/convenience/세븐일레븐":{name:"세븐일레븐",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/7ElevenMexico/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q259340",shop:"convenience"},addTags:{brand:"세븐일레븐","brand:en":"7-Eleven","brand:ko":"세븐일레븐","brand:wikidata":"Q259340","brand:wikipedia":"en:7-Eleven",name:"세븐일레븐","name:en":"7-Eleven","name:ko":"세븐일레븐",shop:"convenience"},countryCodes:["kr"],terms:[],matchScore:2,suggestion:true},"shop/copyshop/FedEx Office":{name:"FedEx Office",icon:"fas-print",imageURL:"https://graph.facebook.com/FedExOffice/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q474379",shop:"copyshop"},addTags:{brand:"FedEx Office","brand:wikidata":"Q474379","brand:wikipedia":"en:FedEx Office",name:"FedEx Office",shop:"copyshop"},countryCodes:["us"],terms:["fedex office print and ship center"],matchScore:2,suggestion:true},"shop/cosmetics/KIKO Milano":{name:"KIKO Milano",icon:"maki-shop",imageURL:"https://graph.facebook.com/KikoMilanoGlobal/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3812045",shop:"cosmetics"},addTags:{brand:"KIKO Milano","brand:wikidata":"Q3812045","brand:wikipedia":"it:KIKO",name:"KIKO Milano",shop:"cosmetics"},countryCodes:["be","fr","gb","nl"],terms:["kiko"],matchScore:2,suggestion:true},"shop/cosmetics/Kiehl's":{name:"Kiehl's",icon:"maki-shop",imageURL:"https://graph.facebook.com/KiehlsUS/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3196447",shop:"cosmetics"},addTags:{brand:"Kiehl's","brand:wikidata":"Q3196447","brand:wikipedia":"en:Kiehl's",name:"Kiehl's",shop:"cosmetics"},countryCodes:["ca","us"],terms:["kiehl's since 1851"],matchScore:2,suggestion:true},"shop/cosmetics/L'Occitane":{name:"L'Occitane",icon:"maki-shop",imageURL:"https://graph.facebook.com/loccitaneusa/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1880676",shop:"cosmetics"},addTags:{brand:"L'Occitane","brand:wikidata":"Q1880676","brand:wikipedia":"en:L'Occitane en Provence",name:"L'Occitane",shop:"cosmetics"},terms:["l'occitane en provence"],matchScore:2,suggestion:true},"shop/cosmetics/Lush":{name:"Lush",icon:"maki-shop",imageURL:"https://graph.facebook.com/LUSHJAPAN/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1585448",shop:"cosmetics"},addTags:{brand:"Lush","brand:wikidata":"Q1585448","brand:wikipedia":"en:Lush (company)",name:"Lush",shop:"cosmetics"},terms:[],matchScore:2,suggestion:true},"shop/cosmetics/MAC Cosmetics":{name:"MAC Cosmetics",icon:"maki-shop",imageURL:"https://graph.facebook.com/MACcosmetics/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2624442",shop:"cosmetics"},addTags:{brand:"MAC Cosmetics","brand:wikidata":"Q2624442","brand:wikipedia":"en:MAC Cosmetics",name:"MAC Cosmetics",shop:"cosmetics",short_name:"M·A·C"},countryCodes:["ca","de","us"],terms:["mac"],matchScore:2,suggestion:true},"shop/cosmetics/Nocibé":{name:"Nocibé",icon:"maki-shop",imageURL:"https://graph.facebook.com/nocibe/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3342592",shop:"cosmetics"},addTags:{brand:"Nocibé","brand:wikidata":"Q3342592","brand:wikipedia":"fr:Nocibé",name:"Nocibé",shop:"cosmetics"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"shop/cosmetics/Origins":{name:"Origins",icon:"maki-shop",imageURL:"https://graph.facebook.com/Origins/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6643229",shop:"cosmetics"},addTags:{brand:"Origins","brand:wikidata":"Q6643229","brand:wikipedia":"en:Origins (cosmetics)",name:"Origins",shop:"cosmetics"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/cosmetics/Sephora":{name:"Sephora",icon:"maki-shop",imageURL:"https://graph.facebook.com/sephora/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2408041",shop:"cosmetics"},addTags:{brand:"Sephora","brand:wikidata":"Q2408041","brand:wikipedia":"en:Sephora",name:"Sephora",shop:"cosmetics"},terms:[],matchScore:2,suggestion:true},"shop/cosmetics/The Body Shop":{name:"The Body Shop",icon:"maki-shop",imageURL:"https://graph.facebook.com/TheBodyShopUSA/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q837851",shop:"cosmetics"},addTags:{brand:"The Body Shop","brand:wikidata":"Q837851","brand:wikipedia":"en:The Body Shop",name:"The Body Shop",shop:"cosmetics"},terms:[],matchScore:2,suggestion:true},"shop/cosmetics/Л'Этуаль":{name:"Л'Этуаль",icon:"maki-shop",imageURL:"https://graph.facebook.com/letoile.ru/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q18400706",shop:"cosmetics"},addTags:{brand:"Л'Этуаль","brand:wikidata":"Q18400706","brand:wikipedia":"ru:Л’Этуаль",name:"Л'Этуаль",shop:"cosmetics"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"shop/cosmetics/Магнит Косметик":{name:"Магнит Косметик",icon:"maki-shop",imageURL:"https://pbs.twimg.com/profile_images/1098477357390856192/wILY9KdL_bigger.png",geometry:["point","area"],tags:{"brand:wikidata":"Q940518",shop:"cosmetics"},addTags:{brand:"Магнит Косметик","brand:en":"Magnit Cosmetics","brand:wikidata":"Q940518","brand:wikipedia":"ru:Магнит (сеть магазинов)",name:"Магнит Косметик","name:en":"Magnit Cosmetics",shop:"cosmetics"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"shop/country_store/Atwoods":{name:"Atwoods",icon:"maki-shop",imageURL:"https://graph.facebook.com/Atwoods.Ranch.and.Home.Stores/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4818874",shop:"country_store"},addTags:{brand:"Atwoods","brand:wikidata":"Q4818874","brand:wikipedia":"en:Atwoods",name:"Atwoods",shop:"country_store"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/country_store/Blain's Farm & Fleet":{name:"Blain's Farm & Fleet",icon:"maki-shop",imageURL:"https://graph.facebook.com/BlainsFarmandFleet/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4923906",shop:"country_store"},addTags:{brand:"Blain's Farm & Fleet","brand:wikidata":"Q4923906","brand:wikipedia":"en:Blain's Farm & Fleet",name:"Blain's Farm & Fleet",shop:"country_store"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/country_store/Bomgaars":{name:"Bomgaars",icon:"maki-shop",imageURL:"https://graph.facebook.com/BomgaarsSupply.Corporate/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q22059070",shop:"country_store"},addTags:{brand:"Bomgaars","brand:wikidata":"Q22059070","brand:wikipedia":"en:Bomgaars",name:"Bomgaars",shop:"country_store"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/country_store/Fleet Farm":{name:"Fleet Farm",icon:"maki-shop",imageURL:"https://graph.facebook.com/fleetfarm/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6859973",shop:"country_store"},addTags:{brand:"Fleet Farm","brand:wikidata":"Q6859973","brand:wikipedia":"en:Fleet Farm",name:"Fleet Farm",shop:"country_store"},countryCodes:["us"],terms:["mills fleet farm"],matchScore:2,suggestion:true},"shop/country_store/Grange Co-op":{name:"Grange Co-op",icon:"maki-shop",imageURL:"https://graph.facebook.com/grangecoop/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5595639",shop:"country_store"},addTags:{brand:"Grange Co-op","brand:wikidata":"Q5595639","brand:wikipedia":"en:Grange Cooperative",name:"Grange Co-op",shop:"country_store"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/country_store/Home of Economy":{name:"Home of Economy",icon:"maki-shop",imageURL:"https://graph.facebook.com/Homeofeconomy/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5889100",shop:"country_store"},addTags:{brand:"Home of Economy","brand:wikidata":"Q5889100","brand:wikipedia":"en:Home of Economy",name:"Home of Economy",shop:"country_store"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/country_store/Norbys Farm Fleet":{name:"Norbys Farm Fleet",icon:"maki-shop",imageURL:"https://graph.facebook.com/norbysfarmfleet/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7050461",shop:"country_store"},addTags:{brand:"Norbys Farm Fleet","brand:wikidata":"Q7050461","brand:wikipedia":"en:Norby's Farm Fleet",name:"Norbys Farm Fleet",shop:"country_store"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/country_store/Orscheln Farm & Home":{name:"Orscheln Farm & Home",icon:"maki-shop",imageURL:"https://graph.facebook.com/orschelnfarmandhome/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q22060331",shop:"country_store"},addTags:{brand:"Orscheln Farm & Home","brand:wikidata":"Q22060331","brand:wikipedia":"en:Orscheln Farm & Home",name:"Orscheln Farm & Home",shop:"country_store"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/country_store/Peavey Mart":{name:"Peavey Mart",icon:"maki-shop",imageURL:"https://graph.facebook.com/PeaveyMart/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7158483",shop:"country_store"},addTags:{brand:"Peavey Mart","brand:wikidata":"Q7158483","brand:wikipedia":"en:Peavey Mart",name:"Peavey Mart",shop:"country_store"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"shop/country_store/Rural King":{name:"Rural King",icon:"maki-shop",imageURL:"https://graph.facebook.com/RuralKing/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7380525",shop:"country_store"},addTags:{brand:"Rural King","brand:wikidata":"Q7380525","brand:wikipedia":"en:Rural King",name:"Rural King",shop:"country_store"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/country_store/TSC Stores":{name:"TSC Stores",icon:"maki-shop",imageURL:"https://graph.facebook.com/TSCStoresCanada/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62720230",shop:"country_store"},addTags:{brand:"TSC Stores","brand:wikidata":"Q62720230",name:"TSC Stores",shop:"country_store"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"shop/country_store/Theisen's":{name:"Theisen's",icon:"maki-shop",imageURL:"https://pbs.twimg.com/profile_images/743446346414227456/6V3KBxMe_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q7777850",shop:"country_store"},addTags:{brand:"Theisen's","brand:wikidata":"Q7777850","brand:wikipedia":"en:Theisen's",name:"Theisen's",shop:"country_store"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/country_store/Tractor Supply Company":{name:"Tractor Supply Company",icon:"maki-shop",imageURL:"https://graph.facebook.com/TractorSupplyCo/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q15109925",shop:"country_store"},addTags:{brand:"Tractor Supply Company","brand:wikidata":"Q15109925","brand:wikipedia":"en:Tractor Supply Company",name:"Tractor Supply Company",shop:"country_store"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/country_store/Wynnstay":{name:"Wynnstay",icon:"maki-shop",imageURL:"https://graph.facebook.com/WynnstayGroup/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q63016351",shop:"country_store"},addTags:{brand:"Wynnstay","brand:wikidata":"Q63016351",name:"Wynnstay",shop:"country_store"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/craft/Hobby Lobby":{name:"Hobby Lobby",icon:"fas-palette",imageURL:"https://graph.facebook.com/HobbyLobby/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5874938",shop:"craft"},addTags:{brand:"Hobby Lobby","brand:wikidata":"Q5874938","brand:wikipedia":"en:Hobby Lobby",name:"Hobby Lobby",shop:"craft"},countryCodes:["in","us"],terms:[],matchScore:2,suggestion:true},"shop/craft/Hobbycraft":{name:"Hobbycraft",icon:"fas-palette",imageURL:"https://graph.facebook.com/HobbycraftUK/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q16984508",shop:"craft"},addTags:{brand:"Hobbycraft","brand:wikidata":"Q16984508","brand:wikipedia":"en:Hobbycraft",name:"Hobbycraft",shop:"craft"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/craft/Jo-Ann":{name:"Jo-Ann",icon:"fas-palette",imageURL:"https://graph.facebook.com/JoAnn/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6203968",shop:"craft"},addTags:{brand:"Jo-Ann","brand:wikidata":"Q6203968","brand:wikipedia":"en:Jo-Ann Stores",name:"Jo-Ann",shop:"craft"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/craft/Michaels":{name:"Michaels",icon:"fas-palette",imageURL:"https://graph.facebook.com/Michaels/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6835667",shop:"craft"},addTags:{brand:"Michaels","brand:wikidata":"Q6835667","brand:wikipedia":"en:Michaels",name:"Michaels",shop:"craft"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"shop/deli/ほっともっと":{name:"ほっともっと",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/hottomotto/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q10850949",shop:"deli"},addTags:{brand:"ほっともっと","brand:en":"Hotto Motto","brand:ja":"ほっともっと","brand:wikidata":"Q10850949","brand:wikipedia":"ja:ほっともっと",name:"ほっともっと","name:en":"Hotto Motto","name:ja":"ほっともっと",shop:"deli"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/deli/京樽":{name:"京樽",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/kyotaru.sushi/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11374503",shop:"deli"},addTags:{brand:"京樽","brand:en":"Kyotaru","brand:ja":"京樽","brand:wikidata":"Q11374503","brand:wikipedia":"ja:京樽",name:"京樽","name:en":"Kyotaru","name:ja":"京樽",shop:"deli"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/department_store/Barneys New York":{name:"Barneys New York",icon:"maki-shop",imageURL:"https://graph.facebook.com/BarneysNY/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q59465",shop:"department_store"},addTags:{brand:"Barneys New York","brand:wikidata":"Q59465","brand:wikipedia":"en:Barneys New York",name:"Barneys New York",shop:"department_store"},countryCodes:["us"],terms:["barneys"],matchScore:2,suggestion:true},"shop/department_store/Belk":{name:"Belk",icon:"maki-shop",imageURL:"https://graph.facebook.com/Belk/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q127428",shop:"department_store"},addTags:{brand:"Belk","brand:wikidata":"Q127428","brand:wikipedia":"en:Belk",name:"Belk",shop:"department_store"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/department_store/Bi-Mart":{name:"Bi-Mart",icon:"maki-shop",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FBi-Mart.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q4902331",shop:"department_store"},addTags:{brand:"Bi-Mart","brand:wikidata":"Q4902331","brand:wikipedia":"en:Bi-Mart",name:"Bi-Mart",shop:"department_store"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/department_store/Big Lots":{name:"Big Lots",icon:"maki-shop",imageURL:"https://graph.facebook.com/biglots/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4905973",shop:"department_store"},addTags:{brand:"Big Lots","brand:wikidata":"Q4905973","brand:wikipedia":"en:Big Lots",name:"Big Lots",shop:"department_store"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/department_store/Big W":{name:"Big W",icon:"maki-shop",imageURL:"https://graph.facebook.com/BIGWaustralia/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4906646",shop:"department_store"},addTags:{brand:"Big W","brand:wikidata":"Q4906646","brand:wikipedia":"en:Big W",name:"Big W",shop:"department_store"},countryCodes:["au"],terms:[],matchScore:2,suggestion:true},"shop/department_store/Canadian Tire":{name:"Canadian Tire",icon:"maki-shop",imageURL:"https://graph.facebook.com/Canadiantire/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1032400",shop:"department_store"},addTags:{brand:"Canadian Tire","brand:wikidata":"Q1032400","brand:wikipedia":"en:Canadian Tire",name:"Canadian Tire",shop:"department_store"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"shop/department_store/Casas Bahia":{name:"Casas Bahia",icon:"maki-shop",imageURL:"https://graph.facebook.com/CasasBahia/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5048048",shop:"department_store"},addTags:{brand:"Casas Bahia","brand:wikidata":"Q5048048","brand:wikipedia":"en:Casas Bahia",name:"Casas Bahia",shop:"department_store"},countryCodes:["br"],terms:[],matchScore:2,suggestion:true},"shop/department_store/Century 21":{name:"Century 21",icon:"maki-shop",imageURL:"https://graph.facebook.com/century21stores/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5063125",shop:"department_store"},addTags:{brand:"Century 21","brand:wikidata":"Q5063125","brand:wikipedia":"en:Century 21 (department store)",name:"Century 21",shop:"department_store"},countryCodes:["us"],terms:["c21"],matchScore:2,suggestion:true},"shop/department_store/Coppel":{name:"Coppel",icon:"maki-shop",imageURL:"https://graph.facebook.com/tiendascoppel/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2497795",shop:"department_store"},addTags:{brand:"Coppel","brand:wikidata":"Q2497795","brand:wikipedia":"en:Coppel",name:"Coppel",shop:"department_store"},terms:[],matchScore:2,suggestion:true},"shop/department_store/Debenhams":{name:"Debenhams",icon:"maki-shop",imageURL:"https://graph.facebook.com/Debenhams/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1181484",shop:"department_store"},addTags:{brand:"Debenhams","brand:wikidata":"Q1181484","brand:wikipedia":"en:Debenhams",name:"Debenhams",shop:"department_store"},terms:[],matchScore:2,suggestion:true},"shop/department_store/Dillard's":{name:"Dillard's",icon:"maki-shop",imageURL:"https://graph.facebook.com/Dillards/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q844805",shop:"department_store"},addTags:{brand:"Dillard's","brand:wikidata":"Q844805","brand:wikipedia":"en:Dillard's",name:"Dillard's",shop:"department_store"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/department_store/El Corte Inglés":{name:"El Corte Inglés",icon:"maki-shop",imageURL:"https://graph.facebook.com/elcorteingles/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q623133",shop:"department_store"},addTags:{brand:"El Corte Inglés","brand:wikidata":"Q623133","brand:wikipedia":"en:El Corte Inglés",name:"El Corte Inglés",shop:"department_store"},countryCodes:["es"],terms:[],matchScore:2,suggestion:true},"shop/department_store/Falabella":{name:"Falabella",icon:"maki-shop",imageURL:"https://graph.facebook.com/falabellachile/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5135229",shop:"department_store"},addTags:{brand:"Falabella","brand:wikidata":"Q5135229","brand:wikipedia":"en:Falabella (retail store)",name:"Falabella",shop:"department_store"},terms:["saga falabella"],matchScore:2,suggestion:true},"shop/department_store/Galeria Kaufhof":{name:"Galeria Kaufhof",icon:"maki-shop",imageURL:"https://graph.facebook.com/GaleriaKarstadtKaufhof/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q322598",shop:"department_store"},addTags:{brand:"Galeria Kaufhof","brand:wikidata":"Q322598","brand:wikipedia":"en:Galeria Kaufhof",name:"Galeria Kaufhof",shop:"department_store"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/department_store/Giant Tiger":{name:"Giant Tiger",icon:"maki-shop",imageURL:"https://graph.facebook.com/GiantTiger/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5558429",shop:"department_store"},addTags:{brand:"Giant Tiger","brand:wikidata":"Q5558429","brand:wikipedia":"en:Giant Tiger",name:"Giant Tiger",shop:"department_store"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"shop/department_store/Gordmans":{name:"Gordmans",icon:"maki-shop",imageURL:"https://graph.facebook.com/gordmans/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5584725",shop:"department_store"},addTags:{brand:"Gordmans","brand:wikidata":"Q5584725","brand:wikipedia":"en:Gordmans",name:"Gordmans",shop:"department_store"},terms:[],matchScore:2,suggestion:true},"shop/department_store/HEMA":{name:"HEMA",icon:"maki-shop",imageURL:"https://graph.facebook.com/hema/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q903805",shop:"department_store"},addTags:{brand:"HEMA","brand:wikidata":"Q903805","brand:wikipedia":"en:HEMA (store)",name:"HEMA",shop:"department_store"},terms:[],matchScore:2,suggestion:true},"shop/department_store/Harvey Norman":{name:"Harvey Norman",icon:"maki-shop",imageURL:"https://graph.facebook.com/HarveyNormanAU/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4040441",shop:"department_store"},addTags:{brand:"Harvey Norman","brand:wikidata":"Q4040441","brand:wikipedia":"en:Harvey Norman",name:"Harvey Norman",shop:"department_store"},terms:[],matchScore:2,suggestion:true},"shop/department_store/Havan":{name:"Havan",icon:"maki-shop",imageURL:"https://graph.facebook.com/Havanoficial/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q61968827",shop:"department_store"},addTags:{brand:"Havan","brand:wikidata":"Q61968827",name:"Havan",shop:"department_store"},countryCodes:["br"],terms:[],matchScore:2,suggestion:true},"shop/department_store/JCPenney":{name:"JCPenney",icon:"maki-shop",imageURL:"https://graph.facebook.com/jcp/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q920037",shop:"department_store"},addTags:{brand:"JCPenney","brand:wikidata":"Q920037","brand:wikipedia":"en:J. C. Penney",name:"JCPenney",shop:"department_store"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/department_store/John Lewis":{name:"John Lewis",icon:"maki-shop",imageURL:"https://pbs.twimg.com/profile_images/1117907267343532035/bNbA3Pv5_bigger.png",geometry:["point","area"],tags:{"brand:wikidata":"Q1918981",shop:"department_store"},addTags:{brand:"John Lewis","brand:wikidata":"Q1918981","brand:wikipedia":"en:John Lewis & Partners",name:"John Lewis",shop:"department_store"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/department_store/Karstadt":{name:"Karstadt",icon:"maki-shop",imageURL:"https://graph.facebook.com/karstadt1881/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q182910",shop:"department_store"},addTags:{brand:"Karstadt","brand:wikidata":"Q182910","brand:wikipedia":"en:Karstadt",name:"Karstadt",shop:"department_store"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/department_store/Kmart (Australia)":{name:"Kmart (Australia)",icon:"maki-shop",imageURL:"https://graph.facebook.com/KmartAustralia/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6421682",shop:"department_store"},addTags:{brand:"Kmart","brand:wikidata":"Q6421682","brand:wikipedia":"en:Kmart Australia",name:"Kmart",shop:"department_store"},countryCodes:["au"],terms:[],matchScore:2,suggestion:true},"shop/department_store/Kmart (USA)":{name:"Kmart (USA)",icon:"maki-shop",imageURL:"https://graph.facebook.com/kmart/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1753080",shop:"department_store"},addTags:{brand:"Kmart","brand:wikidata":"Q1753080","brand:wikipedia":"en:Kmart",name:"Kmart",shop:"department_store"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/department_store/Kohl's":{name:"Kohl's",icon:"maki-shop",imageURL:"https://graph.facebook.com/kohls/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q967265",shop:"department_store"},addTags:{brand:"Kohl's","brand:wikidata":"Q967265","brand:wikipedia":"en:Kohl's",name:"Kohl's",shop:"department_store"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/department_store/Lojas Americanas":{name:"Lojas Americanas",icon:"maki-shop",imageURL:"https://graph.facebook.com/lojasamericanas/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3064093",shop:"department_store"},addTags:{brand:"Lojas Americanas","brand:wikidata":"Q3064093","brand:wikipedia":"en:Lojas Americanas",name:"Lojas Americanas",shop:"department_store"},countryCodes:["br"],terms:[],matchScore:2,suggestion:true},"shop/department_store/Lord & Taylor":{name:"Lord & Taylor",icon:"maki-shop",imageURL:"https://graph.facebook.com/lordandtaylor/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2749082",shop:"department_store"},addTags:{brand:"Lord & Taylor","brand:wikidata":"Q2749082","brand:wikipedia":"en:Lord & Taylor",name:"Lord & Taylor",shop:"department_store"},countryCodes:["us"],terms:["lord and taylor"],matchScore:2,suggestion:true},"shop/department_store/Lotte Department Store":{name:"Lotte Department Store",icon:"maki-shop",geometry:["point","area"],tags:{"brand:wikidata":"Q489905",shop:"department_store"},addTags:{brand:"Lotte Department Store","brand:wikidata":"Q489905","brand:wikipedia":"en:Lotte Department Store",name:"Lotte Department Store",shop:"department_store"},terms:["lotte"],matchScore:2,suggestion:true},"shop/department_store/Macy's":{name:"Macy's",icon:"maki-shop",imageURL:"https://graph.facebook.com/Macys/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q629269",shop:"department_store"},addTags:{brand:"Macy's","brand:wikidata":"Q629269","brand:wikipedia":"en:Macy's",name:"Macy's",shop:"department_store"},terms:[],matchScore:2,suggestion:true},"shop/department_store/Marks & Spencer":{name:"Marks & Spencer",icon:"maki-shop",imageURL:"https://graph.facebook.com/marksandspencerrussia/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q714491",shop:"department_store"},addTags:{brand:"Marks & Spencer","brand:wikidata":"Q714491","brand:wikipedia":"en:Marks & Spencer",name:"Marks & Spencer",shop:"department_store"},terms:[],matchScore:2,suggestion:true},"shop/department_store/Marshalls":{name:"Marshalls",icon:"maki-shop",imageURL:"https://graph.facebook.com/Marshalls/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q15903261",shop:"department_store"},addTags:{brand:"Marshalls","brand:wikidata":"Q15903261","brand:wikipedia":"en:Marshalls",name:"Marshalls",shop:"department_store"},terms:[],matchScore:2,suggestion:true},"shop/department_store/Myer":{name:"Myer",icon:"maki-shop",imageURL:"https://graph.facebook.com/myer/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1110323",shop:"department_store"},addTags:{brand:"Myer","brand:wikidata":"Q1110323","brand:wikipedia":"en:Myer",name:"Myer",shop:"department_store"},countryCodes:["au"],terms:[],matchScore:2,suggestion:true},"shop/department_store/Neiman Marcus":{name:"Neiman Marcus",icon:"maki-shop",imageURL:"https://graph.facebook.com/neimanmarcus/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q743497",shop:"department_store"},addTags:{brand:"Neiman Marcus","brand:wikidata":"Q743497","brand:wikipedia":"en:Neiman Marcus",name:"Neiman Marcus",shop:"department_store"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/department_store/Nordstrom":{name:"Nordstrom",icon:"maki-shop",imageURL:"https://graph.facebook.com/Nordstrom/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q174310",shop:"department_store"},addTags:{brand:"Nordstrom","brand:wikidata":"Q174310","brand:wikipedia":"en:Nordstrom",name:"Nordstrom",shop:"department_store"},terms:[],matchScore:2,suggestion:true},"shop/department_store/Oechsle":{name:"Oechsle",icon:"maki-shop",imageURL:"https://graph.facebook.com/tiendasoechsle/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6049096",shop:"department_store"},addTags:{brand:"Oechsle","brand:wikidata":"Q6049096","brand:wikipedia":"es:Oechsle",name:"Oechsle",shop:"department_store"},countryCodes:["pe"],terms:[],matchScore:2,suggestion:true},"shop/department_store/París":{name:"París",icon:"maki-shop",imageURL:"https://graph.facebook.com/TiendasParis/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q20812805",shop:"department_store"},addTags:{brand:"París","brand:wikidata":"Q20812805","brand:wikipedia":"en:París (retail store)",name:"París",operator:"Cencosud","operator:wikidata":"Q1053372","operator:wikipedia":"en:Cencosud",shop:"department_store"},countryCodes:["cl","pe"],terms:[],matchScore:2,suggestion:true},"shop/department_store/Ripley":{name:"Ripley",icon:"maki-shop",imageURL:"https://graph.facebook.com/ripleychile/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3433040",shop:"department_store"},addTags:{brand:"Ripley","brand:wikidata":"Q3433040","brand:wikipedia":"en:Ripley S.A.",name:"Ripley",shop:"department_store"},terms:[],matchScore:2,suggestion:true},"shop/department_store/Saks Fifth Avenue":{name:"Saks Fifth Avenue",icon:"maki-shop",imageURL:"https://graph.facebook.com/saks/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2723882",shop:"department_store"},addTags:{brand:"Saks Fifth Avenue","brand:wikidata":"Q2723882","brand:wikipedia":"en:Saks Fifth Avenue",name:"Saks Fifth Avenue",shop:"department_store"},terms:[],matchScore:2,suggestion:true},"shop/department_store/Saks Off 5th":{name:"Saks Off 5th",icon:"maki-shop",imageURL:"https://graph.facebook.com/saks/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2723882",shop:"department_store"},addTags:{brand:"Saks Off 5th","brand:wikidata":"Q2723882","brand:wikipedia":"en:Saks Fifth Avenue",name:"Saks Off 5th",shop:"department_store"},terms:[],matchScore:2,suggestion:true},"shop/department_store/Sears":{name:"Sears",icon:"maki-shop",imageURL:"https://graph.facebook.com/sears/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6499202",shop:"department_store"},addTags:{brand:"Sears","brand:wikidata":"Q6499202","brand:wikipedia":"en:Sears",name:"Sears",shop:"department_store"},terms:[],matchScore:2,suggestion:true},"shop/department_store/Shopko":{name:"Shopko",icon:"maki-shop",imageURL:"https://graph.facebook.com/shopko/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7501155",shop:"department_store"},addTags:{brand:"Shopko","brand:wikidata":"Q7501155","brand:wikipedia":"en:Shopko",name:"Shopko",shop:"department_store"},terms:[],matchScore:2,suggestion:true},"shop/department_store/Stein Mart":{name:"Stein Mart",icon:"maki-shop",imageURL:"https://graph.facebook.com/SteinMart/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7606770",shop:"department_store"},addTags:{brand:"Stein Mart","brand:wikidata":"Q7606770","brand:wikipedia":"en:Stein Mart",name:"Stein Mart",shop:"department_store"},terms:[],matchScore:2,suggestion:true},"shop/department_store/Target (Australia)":{name:"Target (Australia)",icon:"maki-shop",imageURL:"https://graph.facebook.com/targetaus/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7685854",shop:"department_store"},addTags:{brand:"Target","brand:wikidata":"Q7685854","brand:wikipedia":"en:Target Australia",name:"Target",shop:"department_store"},countryCodes:["au"],terms:[],matchScore:2,suggestion:true},"shop/department_store/Target (USA)":{name:"Target (USA)",icon:"maki-shop",imageURL:"https://graph.facebook.com/target/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1046951",shop:"department_store"},addTags:{brand:"Target","brand:wikidata":"Q1046951","brand:wikipedia":"en:Target Corporation",name:"Target",shop:"department_store"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/department_store/The Warehouse":{name:"The Warehouse",icon:"maki-shop",imageURL:"https://graph.facebook.com/TheWarehouseNZ/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3566291",shop:"department_store"},addTags:{brand:"The Warehouse","brand:wikidata":"Q3566291","brand:wikipedia":"en:The Warehouse Group",name:"The Warehouse",shop:"department_store"},countryCodes:["nz"],terms:[],matchScore:2,suggestion:true},"shop/department_store/Walmart":{name:"Walmart",icon:"maki-shop",imageURL:"https://graph.facebook.com/walmart/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q483551",shop:"department_store"},addTags:{brand:"Walmart","brand:wikidata":"Q483551","brand:wikipedia":"en:Walmart",name:"Walmart",operator:"Walmart","operator:wikidata":"Q483551","operator:wikipedia":"en:Walmart",shop:"department_store"},terms:[],matchScore:2,suggestion:true},"shop/department_store/Woolworth":{name:"Woolworth",icon:"maki-shop",imageURL:"https://graph.facebook.com/WoolworthDeutschland/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q183538",shop:"department_store"},addTags:{brand:"Woolworth","brand:wikidata":"Q183538","brand:wikipedia":"de:Woolworth Deutschland",name:"Woolworth",shop:"department_store"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/department_store/Åhléns":{name:"Åhléns",icon:"maki-shop",imageURL:"https://graph.facebook.com/ahlens/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q270851",shop:"department_store"},addTags:{brand:"Åhléns","brand:wikidata":"Q270851","brand:wikipedia":"sv:Åhléns",name:"Åhléns",shop:"department_store"},countryCodes:["se"],terms:[],matchScore:2,suggestion:true},"shop/department_store/東急ハンズ":{name:"東急ハンズ",icon:"maki-shop",imageURL:"https://graph.facebook.com/TokyuHandsInc/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q859212",shop:"department_store"},addTags:{brand:"東急ハンズ","brand:en":"Tokyu Hands","brand:ja":"東急ハンズ","brand:wikidata":"Q859212","brand:wikipedia":"ja:東急ハンズ",name:"東急ハンズ","name:en":"Tokyu Hands","name:ja":"東急ハンズ",shop:"department_store"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/department_store/롯데백화점":{name:"롯데백화점",icon:"maki-shop",geometry:["point","area"],tags:{"brand:wikidata":"Q489905",shop:"department_store"},addTags:{brand:"롯데백화점","brand:ko":"롯데백화점","brand:wikidata":"Q489905","brand:wikipedia":"ko:롯데백화점",name:"롯데백화점","name:en":"Lotte Department Store","name:ko":"롯데백화점",shop:"department_store"},countryCodes:["kr"],terms:[],matchScore:2,suggestion:true},"shop/doityourself/Ace Hardware":{name:"Ace Hardware",icon:"temaki-tools",imageURL:"https://graph.facebook.com/acehardware/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4672981",shop:"doityourself"},addTags:{brand:"Ace Hardware","brand:wikidata":"Q4672981","brand:wikipedia":"en:Ace Hardware",name:"Ace Hardware",shop:"doityourself"},terms:[],matchScore:2,suggestion:true},"shop/doityourself/B&Q":{name:"B&Q",icon:"temaki-tools",imageURL:"https://graph.facebook.com/bandq/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q707602",shop:"doityourself"},addTags:{brand:"B&Q","brand:wikidata":"Q707602","brand:wikipedia":"en:B&Q",name:"B&Q",shop:"doityourself"},terms:[],matchScore:2,suggestion:true},"shop/doityourself/Bauhaus":{name:"Bauhaus",icon:"temaki-tools",imageURL:"https://graph.facebook.com/137379942944322/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q672043",shop:"doityourself"},addTags:{brand:"Bauhaus","brand:wikidata":"Q672043","brand:wikipedia":"en:Bauhaus (company)",name:"Bauhaus",shop:"doityourself"},terms:[],matchScore:2,suggestion:true},"shop/doityourself/Biltema":{name:"Biltema",icon:"temaki-tools",imageURL:"https://graph.facebook.com/BiltemaSverige/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3355552",shop:"doityourself"},addTags:{brand:"Biltema","brand:wikidata":"Q3355552","brand:wikipedia":"en:Biltema",name:"Biltema",shop:"doityourself"},countryCodes:["dk","fi","no","se"],terms:[],matchScore:2,suggestion:true},"shop/doityourself/Brico":{name:"Brico",icon:"temaki-tools",imageURL:"https://graph.facebook.com/brico.be/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2510786",shop:"doityourself"},addTags:{brand:"Brico","brand:wikidata":"Q2510786","brand:wikipedia":"en:Brico",name:"Brico",shop:"doityourself"},terms:[],matchScore:2,suggestion:true},"shop/doityourself/Brico Dépôt":{name:"Brico Dépôt",icon:"temaki-tools",imageURL:"https://graph.facebook.com/BricoDepotFrance/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2889702",shop:"doityourself"},addTags:{brand:"Brico Dépôt","brand:wikidata":"Q2889702","brand:wikipedia":"en:Brico Dépôt",name:"Brico Dépôt",shop:"doityourself"},terms:[],matchScore:2,suggestion:true},"shop/doityourself/Bricoman":{name:"Bricoman",icon:"temaki-tools",imageURL:"https://graph.facebook.com/BricomanFrance/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2925142",shop:"doityourself"},addTags:{brand:"Bricoman","brand:wikidata":"Q2925142","brand:wikipedia":"it:Bricoman",name:"Bricoman",shop:"doityourself"},terms:[],matchScore:2,suggestion:true},"shop/doityourself/Bricomarché":{name:"Bricomarché",icon:"temaki-tools",imageURL:"https://graph.facebook.com/Bricomarche/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2925147",shop:"doityourself"},addTags:{brand:"Bricomarché","brand:wikidata":"Q2925147","brand:wikipedia":"en:Bricomarché",name:"Bricomarché",shop:"doityourself"},terms:[],matchScore:2,suggestion:true},"shop/doityourself/Bricorama":{name:"Bricorama",icon:"temaki-tools",imageURL:"https://graph.facebook.com/BricoramaFR/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2925146",shop:"doityourself"},addTags:{brand:"Bricorama","brand:wikidata":"Q2925146","brand:wikipedia":"en:Bricorama",name:"Bricorama",shop:"doityourself"},terms:[],matchScore:2,suggestion:true},"shop/doityourself/Bunnings Warehouse":{name:"Bunnings Warehouse",icon:"temaki-tools",imageURL:"https://pbs.twimg.com/profile_images/1405732718/hammer_bigger.png",geometry:["point","area"],tags:{"brand:wikidata":"Q4997829",shop:"doityourself"},addTags:{brand:"Bunnings Warehouse","brand:wikidata":"Q4997829","brand:wikipedia":"en:Bunnings Warehouse",name:"Bunnings Warehouse",shop:"doityourself"},countryCodes:["au","nz"],terms:[],matchScore:2,suggestion:true},"shop/doityourself/Castorama":{name:"Castorama",icon:"temaki-tools",imageURL:"https://graph.facebook.com/castorama/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q966971",shop:"doityourself"},addTags:{brand:"Castorama","brand:wikidata":"Q966971","brand:wikipedia":"en:Castorama",name:"Castorama",shop:"doityourself"},terms:[],matchScore:2,suggestion:true},"shop/doityourself/Clas Ohlson":{name:"Clas Ohlson",icon:"temaki-tools",imageURL:"https://graph.facebook.com/clasohlsonsverige/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3356220",shop:"doityourself"},addTags:{brand:"Clas Ohlson","brand:wikidata":"Q3356220","brand:wikipedia":"en:Clas Ohlson",name:"Clas Ohlson",shop:"doityourself"},terms:[],matchScore:2,suggestion:true},"shop/doityourself/Easy":{name:"Easy",icon:"temaki-tools",imageURL:"https://graph.facebook.com/EasyHomecenter/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5331091",shop:"doityourself"},addTags:{brand:"Easy","brand:wikidata":"Q5331091","brand:wikipedia":"en:Easy (store)",name:"Easy",shop:"doityourself"},terms:[],matchScore:2,suggestion:true},"shop/doityourself/Gamma":{name:"Gamma",icon:"temaki-tools",imageURL:"https://graph.facebook.com/gamma.be/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2294120",shop:"doityourself"},addTags:{brand:"Gamma","brand:wikidata":"Q2294120","brand:wikipedia":"en:Gamma (store)",name:"Gamma",shop:"doityourself"},terms:[],matchScore:2,suggestion:true},"shop/doityourself/Globus Baumarkt":{name:"Globus Baumarkt",icon:"temaki-tools",imageURL:"https://graph.facebook.com/Globus.de/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q457503",shop:"doityourself"},addTags:{brand:"Globus Baumarkt","brand:wikidata":"Q457503","brand:wikipedia":"de:Globus Holding",name:"Globus Baumarkt",shop:"doityourself"},countryCodes:["de","lu"],terms:[],matchScore:2,suggestion:true},"shop/doityourself/Hagebaumarkt":{name:"Hagebaumarkt",icon:"temaki-tools",imageURL:"https://graph.facebook.com/hagebau/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1568279",shop:"doityourself"},addTags:{brand:"Hagebaumarkt","brand:wikidata":"Q1568279","brand:wikipedia":"de:Hagebau",name:"Hagebaumarkt",shop:"doityourself"},countryCodes:["at","be","ch","de","es","fr","lu","nl"],terms:["hagebau"],matchScore:2,suggestion:true},"shop/doityourself/Hammer":{name:"Hammer",icon:"temaki-tools",imageURL:"https://graph.facebook.com/hammerzuhause/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q52159668",shop:"doityourself"},addTags:{brand:"Hammer","brand:wikidata":"Q52159668","brand:wikipedia":"de:Hammer (Fachmarktkette)",name:"Hammer",shop:"doityourself"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/doityourself/Hellweg":{name:"Hellweg",icon:"temaki-tools",imageURL:"https://graph.facebook.com/Hellweg.de/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1603084",shop:"doityourself"},addTags:{brand:"Hellweg","brand:wikidata":"Q1603084","brand:wikipedia":"de:Hellweg (Baumarkt)",name:"Hellweg",shop:"doityourself"},countryCodes:["at","de"],terms:[],matchScore:2,suggestion:true},"shop/doityourself/Home Building Centre":{name:"Home Building Centre",icon:"temaki-tools",imageURL:"https://graph.facebook.com/homehardwarestores/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3139611",shop:"doityourself"},addTags:{brand:"Home Hardware","brand:wikidata":"Q3139611","brand:wikipedia":"en:Home Hardware",name:"Home Building Centre",shop:"doityourself"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"shop/doityourself/Home Depot":{name:"Home Depot",icon:"temaki-tools",imageURL:"https://graph.facebook.com/homedepot/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q864407",shop:"doityourself"},addTags:{brand:"Home Depot","brand:wikidata":"Q864407","brand:wikipedia":"en:The Home Depot",name:"Home Depot",shop:"doityourself"},terms:["the home depot"],matchScore:2,suggestion:true},"shop/doityourself/Home Hardware Building Centre":{name:"Home Hardware Building Centre",icon:"temaki-tools",imageURL:"https://graph.facebook.com/homehardwarestores/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3139611",shop:"doityourself"},addTags:{brand:"Home Hardware","brand:wikidata":"Q3139611","brand:wikipedia":"en:Home Hardware",name:"Home Hardware Building Centre",shop:"doityourself"},countryCodes:["ca"],terms:["home hardware"],matchScore:2,suggestion:true},"shop/doityourself/Homebase":{name:"Homebase",icon:"temaki-tools",imageURL:"https://graph.facebook.com/homebase/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q9293447",shop:"doityourself"},addTags:{brand:"Homebase","brand:wikidata":"Q9293447","brand:wikipedia":"en:Homebase",name:"Homebase",shop:"doityourself"},terms:[],matchScore:2,suggestion:true},"shop/doityourself/Hornbach":{name:"Hornbach",icon:"temaki-tools",imageURL:"https://graph.facebook.com/hornbach.de/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q685926",shop:"doityourself"},addTags:{brand:"Hornbach","brand:wikidata":"Q685926","brand:wikipedia":"en:Hornbach (retailer)",name:"Hornbach",shop:"doityourself"},terms:[],matchScore:2,suggestion:true},"shop/doityourself/Hubo":{name:"Hubo",icon:"temaki-tools",imageURL:"https://graph.facebook.com/hubo.be/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3142153",shop:"doityourself"},addTags:{brand:"Hubo","brand:wikidata":"Q3142153","brand:wikipedia":"en:Hubo Belgium",name:"Hubo",shop:"doityourself"},terms:[],matchScore:2,suggestion:true},"shop/doityourself/Jewson":{name:"Jewson",icon:"temaki-tools",imageURL:"https://graph.facebook.com/jewsonuk/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6190226",shop:"doityourself"},addTags:{brand:"Jewson","brand:wikidata":"Q6190226","brand:wikipedia":"en:Jewson",name:"Jewson",shop:"doityourself"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/doityourself/Karwei":{name:"Karwei",icon:"temaki-tools",imageURL:"https://graph.facebook.com/karwei/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2097480",shop:"doityourself"},addTags:{brand:"Karwei","brand:wikidata":"Q2097480","brand:wikipedia":"en:Karwei",name:"Karwei",shop:"doityourself"},countryCodes:["nl"],terms:[],matchScore:2,suggestion:true},"shop/doityourself/Leroy Merlin":{name:"Leroy Merlin",icon:"temaki-tools",imageURL:"https://graph.facebook.com/leroymerlin/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q889624",shop:"doityourself"},addTags:{brand:"Leroy Merlin","brand:wikidata":"Q889624","brand:wikipedia":"en:Leroy Merlin",name:"Leroy Merlin",shop:"doityourself"},terms:[],matchScore:2,suggestion:true},"shop/doityourself/Lowe's":{name:"Lowe's",icon:"temaki-tools",imageURL:"https://graph.facebook.com/lowes/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1373493",shop:"doityourself"},addTags:{brand:"Lowe's","brand:wikidata":"Q1373493","brand:wikipedia":"en:Lowe's",name:"Lowe's",shop:"doityourself"},terms:[],matchScore:2,suggestion:true},"shop/doityourself/Menards":{name:"Menards",icon:"temaki-tools",imageURL:"https://graph.facebook.com/MenardsHomeImprovement/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1639897",shop:"doityourself"},addTags:{brand:"Menards","brand:wikidata":"Q1639897","brand:wikipedia":"en:Menards",name:"Menards",shop:"doityourself"},terms:[],matchScore:2,suggestion:true},"shop/doityourself/Mr.Bricolage":{name:"Mr.Bricolage",icon:"temaki-tools",imageURL:"https://graph.facebook.com/mr.bricolagefrance/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3141657",shop:"doityourself"},addTags:{brand:"Mr.Bricolage","brand:wikidata":"Q3141657","brand:wikipedia":"fr:Mr Bricolage",name:"Mr.Bricolage",shop:"doityourself"},terms:[],matchScore:2,suggestion:true},"shop/doityourself/OBI":{name:"OBI",icon:"temaki-tools",imageURL:"https://graph.facebook.com/obirussia/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q300518",shop:"doityourself"},addTags:{brand:"OBI","brand:wikidata":"Q300518","brand:wikipedia":"en:Obi (store)",name:"OBI",shop:"doityourself"},terms:[],matchScore:2,suggestion:true},"shop/doityourself/Praktiker":{name:"Praktiker",icon:"temaki-tools",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FPraktiker%20Logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q680214",shop:"doityourself"},addTags:{brand:"Praktiker","brand:wikidata":"Q680214","brand:wikipedia":"en:Praktiker",name:"Praktiker",shop:"doityourself"},terms:[],matchScore:2,suggestion:true},"shop/doityourself/Praxis":{name:"Praxis",icon:"temaki-tools",imageURL:"https://graph.facebook.com/praxis/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2741995",shop:"doityourself"},addTags:{brand:"Praxis","brand:wikidata":"Q2741995","brand:wikipedia":"nl:Praxis (winkel)",name:"Praxis",shop:"doityourself"},countryCodes:["nl"],terms:[],matchScore:2,suggestion:true},"shop/doityourself/Promart":{name:"Promart",icon:"temaki-tools",imageURL:"https://graph.facebook.com/PROMARTHomecenter/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q17626095",shop:"doityourself"},addTags:{brand:"Promart","brand:wikidata":"Q17626095","brand:wikipedia":"en:Promart",name:"Promart",shop:"doityourself"},countryCodes:["pe"],terms:[],matchScore:2,suggestion:true},"shop/doityourself/Rona":{name:"Rona",icon:"temaki-tools",imageURL:"https://graph.facebook.com/ronainc/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3415283",shop:"doityourself"},addTags:{brand:"Rona","brand:wikidata":"Q3415283","brand:wikipedia":"en:Rona, Inc.",name:"Rona",shop:"doityourself"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"shop/doityourself/Screwfix":{name:"Screwfix",icon:"temaki-tools",imageURL:"https://graph.facebook.com/Screwfix/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7439115",shop:"doityourself"},addTags:{brand:"Screwfix","brand:wikidata":"Q7439115","brand:wikipedia":"en:Screwfix",name:"Screwfix",shop:"doityourself"},terms:[],matchScore:2,suggestion:true},"shop/doityourself/Sodimac":{name:"Sodimac",icon:"temaki-tools",imageURL:"https://graph.facebook.com/homecenter/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7553274",shop:"doityourself"},addTags:{brand:"Sodimac","brand:wikidata":"Q7553274","brand:wikipedia":"es:Sodimac",name:"Sodimac",shop:"doityourself"},terms:["sodimac constructor"],matchScore:2,suggestion:true},"shop/doityourself/Tekzen":{name:"Tekzen",icon:"temaki-tools",imageURL:"https://graph.facebook.com/tekzenturkiye/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q25475379",shop:"doityourself"},addTags:{brand:"Tekzen","brand:wikidata":"Q25475379","brand:wikipedia":"tr:Tekzen",name:"Tekzen",shop:"doityourself"},countryCodes:["tr"],terms:[],matchScore:2,suggestion:true},"shop/doityourself/Toom Baumarkt":{name:"Toom Baumarkt",icon:"temaki-tools",imageURL:"https://graph.facebook.com/192246064148765/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2442970",shop:"doityourself"},addTags:{brand:"Toom Baumarkt","brand:wikidata":"Q2442970","brand:wikipedia":"de:Toom Baumarkt",name:"Toom Baumarkt",shop:"doityourself"},countryCodes:["de"],terms:["toom"],matchScore:2,suggestion:true},"shop/doityourself/Travis Perkins":{name:"Travis Perkins",icon:"temaki-tools",imageURL:"https://graph.facebook.com/TravisPerkinsPlcUK/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2450664",shop:"doityourself"},addTags:{brand:"Travis Perkins","brand:wikidata":"Q2450664","brand:wikipedia":"en:Travis Perkins",name:"Travis Perkins",shop:"doityourself"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/doityourself/Weldom":{name:"Weldom",icon:"temaki-tools",imageURL:"https://graph.facebook.com/Weldom/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q16683226",shop:"doityourself"},addTags:{brand:"Weldom","brand:wikidata":"Q16683226","brand:wikipedia":"fr:Weldom",name:"Weldom",shop:"doityourself"},terms:[],matchScore:2,suggestion:true},"shop/doityourself/Wickes":{name:"Wickes",icon:"temaki-tools",imageURL:"https://graph.facebook.com/Wickes.co.uk/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7998350",shop:"doityourself"},addTags:{brand:"Wickes","brand:wikidata":"Q7998350","brand:wikipedia":"en:Wickes",name:"Wickes",shop:"doityourself"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/doityourself/jem & fix":{name:"jem & fix",icon:"temaki-tools",imageURL:"https://graph.facebook.com/jemogfix/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q12319200",shop:"doityourself"},addTags:{brand:"jem & fix","brand:wikidata":"Q12319200","brand:wikipedia":"da:Jem & fix",name:"jem & fix",shop:"doityourself"},countryCodes:["dk"],terms:[],matchScore:2,suggestion:true},"shop/doityourself/Леруа Мерлен":{name:"Леруа Мерлен",icon:"temaki-tools",imageURL:"https://graph.facebook.com/leroymerlin/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q889624",shop:"doityourself"},addTags:{brand:"Леруа Мерлен","brand:en":"Leroy Merlin","brand:wikidata":"Q889624","brand:wikipedia":"en:Leroy Merlin",name:"Леруа Мерлен","name:en":"Leroy Merlin",shop:"doityourself"},terms:[],matchScore:2,suggestion:true},"shop/doityourself/カインズホーム":{name:"カインズホーム",icon:"temaki-tools",imageURL:"https://graph.facebook.com/cainzfun/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11293852",shop:"doityourself"},addTags:{brand:"カインズホーム","brand:en":"Cainz Home","brand:ja":"カインズホーム","brand:wikidata":"Q11293852","brand:wikipedia":"ja:カインズ",name:"カインズホーム","name:en":"Cainz Home","name:ja":"カインズホーム",shop:"doityourself"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/doityourself/コメリ":{name:"コメリ",icon:"temaki-tools",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FKOMERI%20LOGO.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q11302690",shop:"doityourself"},addTags:{brand:"コメリ","brand:ja":"コメリ","brand:wikidata":"Q11302690","brand:wikipedia":"ja:コメリ",name:"コメリ","name:en":"Komeri","name:ja":"コメリ",shop:"doityourself"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/doityourself/コーナン":{name:"コーナン",icon:"temaki-tools",imageURL:"https://graph.facebook.com/kohnan.official/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11303403",shop:"doityourself"},addTags:{brand:"コーナン","brand:ja":"コーナン","brand:wikidata":"Q11303403","brand:wikipedia":"ja:コーナン",name:"コーナン","name:en":"Kohnan","name:ja":"コーナン",shop:"doityourself"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/dry_cleaning/5àsec":{name:"5àsec",icon:"maki-shop",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FLogo%205%C3%A0sec.jpg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q2817899",shop:"dry_cleaning"},addTags:{brand:"5àsec","brand:wikidata":"Q2817899","brand:wikipedia":"fr:5àsec",name:"5àsec",shop:"dry_cleaning"},terms:[],matchScore:2,suggestion:true},"shop/dry_cleaning/Martinizing Dry Cleaning":{name:"Martinizing Dry Cleaning",icon:"maki-shop",geometry:["point","area"],tags:{"brand:wikidata":"Q6777169",shop:"dry_cleaning"},addTags:{brand:"Martinizing Dry Cleaning","brand:wikidata":"Q6777169","brand:wikipedia":"en:Martinizing Dry Cleaning",name:"Martinizing Dry Cleaning",shop:"dry_cleaning"},terms:[],matchScore:2,suggestion:true},"shop/dry_cleaning/Диана":{name:"Диана",icon:"maki-shop",imageURL:"https://graph.facebook.com/diana.dryclean/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62105088",shop:"dry_cleaning"},addTags:{brand:"Диана","brand:wikidata":"Q62105088",name:"Диана",shop:"dry_cleaning"},terms:[],matchScore:2,suggestion:true},"shop/dry_cleaning/タカケンサンシャイン":{name:"タカケンサンシャイン",icon:"maki-shop",geometry:["point","area"],tags:{"brand:wikidata":"Q11315914",shop:"dry_cleaning"},addTags:{brand:"タカケンサンシャイン","brand:en":"Takaken Sunshine","brand:ja":"タカケンサンシャイン","brand:wikidata":"Q11315914","brand:wikipedia":"ja:タカケンサンシャイン",name:"タカケンサンシャイン","name:en":"Takaken Sunshine","name:ja":"タカケンサンシャイン",shop:"dry_cleaning"},countryCodes:["jp"],terms:["タカケンクリーング"],matchScore:2,suggestion:true},"shop/dry_cleaning/ホワイト急便":{name:"ホワイト急便",icon:"maki-shop",geometry:["point","area"],tags:{"brand:wikidata":"Q11505557",shop:"dry_cleaning"},addTags:{brand:"ホワイト急便","brand:en":"White Kyuubin","brand:ja":"ホワイト急便","brand:wikidata":"Q11505557","brand:wikipedia":"ja:日本さわやかグループ",name:"ホワイト急便","name:en":"White Kyuubin","name:ja":"ホワイト急便",shop:"dry_cleaning"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/dry_cleaning/白洋舎":{name:"白洋舎",icon:"maki-shop",geometry:["point","area"],tags:{"brand:wikidata":"Q11579995",shop:"dry_cleaning"},addTags:{brand:"白洋舎","brand:en":"Hakuyosha","brand:wikidata":"Q11579995","brand:wikipedia":"ja:白洋舎",name:"白洋舎","name:en":"Hakuyosha",shop:"dry_cleaning"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/electronics/Apple Store":{name:"Apple Store",icon:"fas-plug",imageURL:"https://graph.facebook.com/apple/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q421253",shop:"electronics"},addTags:{brand:"Apple Store","brand:wikidata":"Q421253","brand:wikipedia":"en:Apple Store",name:"Apple Store",shop:"electronics"},terms:[],matchScore:2,suggestion:true},"shop/electronics/Batteries Plus Bulbs":{name:"Batteries Plus Bulbs",icon:"fas-plug",imageURL:"https://graph.facebook.com/batterieprofessionnelcom-1734242166818176/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q17005157",shop:"electronics"},addTags:{brand:"Batteries Plus Bulbs","brand:wikidata":"Q17005157","brand:wikipedia":"en:Batteries Plus Bulbs",name:"Batteries Plus Bulbs",shop:"electronics"},terms:["batteries plus"],matchScore:2,suggestion:true},"shop/electronics/Best Buy":{name:"Best Buy",icon:"fas-plug",imageURL:"https://graph.facebook.com/bestbuy/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q533415",shop:"electronics"},addTags:{brand:"Best Buy","brand:wikidata":"Q533415","brand:wikipedia":"en:Best Buy",name:"Best Buy",shop:"electronics"},terms:[],matchScore:2,suggestion:true},"shop/electronics/Boulanger":{name:"Boulanger",icon:"fas-plug",imageURL:"https://graph.facebook.com/Boulanger.Electromenager.Multimedia/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2921695",shop:"electronics"},addTags:{brand:"Boulanger","brand:wikidata":"Q2921695","brand:wikipedia":"fr:Boulanger (entreprise)",name:"Boulanger",shop:"electronics"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"shop/electronics/CeX":{name:"CeX",icon:"fas-plug",imageURL:"https://graph.facebook.com/CeX/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5055676",shop:"electronics"},addTags:{brand:"CeX","brand:wikidata":"Q5055676","brand:wikipedia":"en:CeX (company)",name:"CeX",shop:"electronics"},countryCodes:["au","es","gb","ie","in","it","mx","nl","pl","pt"],terms:[],matchScore:2,suggestion:true},"shop/electronics/Currys":{name:"Currys",icon:"fas-plug",imageURL:"https://graph.facebook.com/curryspcworld/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3246464",shop:"electronics"},addTags:{brand:"Currys","brand:wikidata":"Q3246464","brand:wikipedia":"en:Currys",name:"Currys",shop:"electronics"},countryCodes:["gb","ie"],terms:[],matchScore:2,suggestion:true},"shop/electronics/Currys PC World":{name:"Currys PC World",icon:"fas-plug",imageURL:"https://graph.facebook.com/curryspcworld/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7118727",shop:"electronics"},addTags:{brand:"Currys PC World","brand:wikidata":"Q7118727","brand:wikipedia":"en:PC World (retailer)",name:"Currys PC World",shop:"electronics"},countryCodes:["gb","ie"],terms:[],matchScore:2,suggestion:true},"shop/electronics/Darty":{name:"Darty",icon:"fas-plug",imageURL:"https://graph.facebook.com/darty/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3117381",shop:"electronics"},addTags:{brand:"Darty","brand:wikidata":"Q3117381","brand:wikipedia":"en:Groupe Fnac Darty",name:"Darty",shop:"electronics"},terms:[],matchScore:2,suggestion:true},"shop/electronics/Elektra":{name:"Elektra",icon:"fas-plug",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FMural%20Elektra.JPG&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q1142753",shop:"electronics"},addTags:{brand:"Elektra","brand:wikidata":"Q1142753","brand:wikipedia":"es:Grupo Elektra",name:"Elektra",shop:"electronics"},countryCodes:["gt","hn","pa","pe","sv"],terms:[],matchScore:2,suggestion:true},"shop/electronics/Elgiganten":{name:"Elgiganten",icon:"fas-plug",imageURL:"https://graph.facebook.com/elgiganten.dk/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q17050121",shop:"electronics"},addTags:{brand:"Elgiganten","brand:wikidata":"Q17050121","brand:wikipedia":"en:Elgiganten",name:"Elgiganten",shop:"electronics"},terms:[],matchScore:2,suggestion:true},"shop/electronics/Euronics":{name:"Euronics",icon:"fas-plug",imageURL:"https://graph.facebook.com/EuronicsItalia/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q184860",shop:"electronics"},addTags:{brand:"Euronics","brand:wikidata":"Q184860","brand:wikipedia":"en:Euronics",name:"Euronics",shop:"electronics"},terms:[],matchScore:2,suggestion:true},"shop/electronics/Expert":{name:"Expert",icon:"fas-plug",imageURL:"https://graph.facebook.com/expert.de/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q680990",shop:"electronics"},addTags:{brand:"Expert","brand:wikidata":"Q680990","brand:wikipedia":"en:Expert (company)",name:"Expert",shop:"electronics"},terms:[],matchScore:2,suggestion:true},"shop/electronics/Hartlauer":{name:"Hartlauer",icon:"fas-plug",imageURL:"https://graph.facebook.com/loewennews/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1587223",shop:"electronics"},addTags:{brand:"Hartlauer","brand:wikidata":"Q1587223","brand:wikipedia":"de:Hartlauer",name:"Hartlauer",shop:"electronics"},countryCodes:["at"],terms:[],matchScore:2,suggestion:true},"shop/electronics/Interdiscount":{name:"Interdiscount",icon:"fas-plug",imageURL:"https://graph.facebook.com/interdiscount/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1665980",shop:"electronics"},addTags:{brand:"Interdiscount","brand:wikidata":"Q1665980","brand:wikipedia":"de:Interdiscount",name:"Interdiscount",shop:"electronics"},countryCodes:["ch"],terms:[],matchScore:2,suggestion:true},"shop/electronics/JB Hi-Fi":{name:"JB Hi-Fi",icon:"fas-plug",imageURL:"https://graph.facebook.com/JBHiFi/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3310113",shop:"electronics"},addTags:{brand:"JB Hi-Fi","brand:wikidata":"Q3310113","brand:wikipedia":"en:JB Hi-Fi",name:"JB Hi-Fi",shop:"electronics"},countryCodes:["au","nz"],terms:[],matchScore:2,suggestion:true},"shop/electronics/Kjell & Company":{name:"Kjell & Company",icon:"fas-plug",imageURL:"https://graph.facebook.com/kjellcoSverige/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6419332",shop:"electronics"},addTags:{brand:"Kjell & Company","brand:wikidata":"Q6419332","brand:wikipedia":"en:Kjell & Company",name:"Kjell & Company",shop:"electronics"},countryCodes:["no","se"],terms:["kjell och company"],matchScore:2,suggestion:true},"shop/electronics/Komputronik":{name:"Komputronik",icon:"fas-plug",imageURL:"https://graph.facebook.com/komputronik/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11742085",shop:"electronics"},addTags:{brand:"Komputronik","brand:wikidata":"Q11742085","brand:wikipedia":"pl:Komputronik",name:"Komputronik",shop:"electronics"},countryCodes:["pl"],terms:[],matchScore:2,suggestion:true},"shop/electronics/La Curacao":{name:"La Curacao",icon:"fas-plug",imageURL:"https://graph.facebook.com/CuracaoUSA/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5194599",shop:"electronics"},addTags:{brand:"La Curacao","brand:wikidata":"Q5194599","brand:wikipedia":"en:Curacao (retail store)",name:"La Curacao",shop:"electronics"},terms:[],matchScore:2,suggestion:true},"shop/electronics/Maplin":{name:"Maplin",icon:"fas-plug",imageURL:"https://graph.facebook.com/Maplin/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6754124",shop:"electronics"},addTags:{brand:"Maplin","brand:wikidata":"Q6754124","brand:wikipedia":"en:Maplin (retailer)",name:"Maplin",shop:"electronics"},terms:[],matchScore:2,suggestion:true},"shop/electronics/Media Expert":{name:"Media Expert",icon:"fas-plug",imageURL:"https://graph.facebook.com/mediaexpert/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11776794",shop:"electronics"},addTags:{brand:"Media Expert","brand:wikidata":"Q11776794","brand:wikipedia":"pl:Media Expert",name:"Media Expert",shop:"electronics"},countryCodes:["pl"],terms:[],matchScore:2,suggestion:true},"shop/electronics/Media Markt":{name:"Media Markt",icon:"fas-plug",imageURL:"https://graph.facebook.com/mediamarkt/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2381223",shop:"electronics"},addTags:{brand:"Media Markt","brand:wikidata":"Q2381223","brand:wikipedia":"en:Media Markt",name:"Media Markt",shop:"electronics"},terms:[],matchScore:2,suggestion:true},"shop/electronics/Musimundo":{name:"Musimundo",icon:"fas-plug",imageURL:"https://graph.facebook.com/musimundo/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6034719",shop:"electronics"},addTags:{brand:"Musimundo","brand:wikidata":"Q6034719","brand:wikipedia":"es:Musimundo",name:"Musimundo",shop:"electronics"},countryCodes:["ar"],terms:[],matchScore:2,suggestion:true},"shop/electronics/Neonet":{name:"Neonet",icon:"fas-plug",imageURL:"https://graph.facebook.com/Neonetpl/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11790622",shop:"electronics"},addTags:{brand:"Neonet","brand:wikidata":"Q11790622","brand:wikipedia":"pl:Neonet",name:"Neonet",shop:"electronics"},countryCodes:["pl"],terms:[],matchScore:2,suggestion:true},"shop/electronics/RTV Euro AGD":{name:"RTV Euro AGD",icon:"fas-plug",imageURL:"https://graph.facebook.com/rtveuroagd/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7277895",shop:"electronics"},addTags:{brand:"RTV Euro AGD","brand:wikidata":"Q7277895","brand:wikipedia":"pl:RTV Euro AGD",name:"RTV Euro AGD",shop:"electronics"},countryCodes:["pl"],terms:[],matchScore:2,suggestion:true},"shop/electronics/RadioShack":{name:"RadioShack",icon:"fas-plug",imageURL:"https://graph.facebook.com/RadioShack/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1195490",shop:"electronics"},addTags:{brand:"RadioShack","brand:wikidata":"Q1195490","brand:wikipedia":"en:RadioShack",name:"RadioShack",shop:"electronics"},terms:[],matchScore:2,suggestion:true},"shop/electronics/Samsung":{name:"Samsung",icon:"fas-plug",imageURL:"https://graph.facebook.com/SamsungNewsroom/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q20718",shop:"electronics"},addTags:{brand:"Samsung","brand:wikidata":"Q20718","brand:wikipedia":"en:Samsung Electronics",name:"Samsung",shop:"electronics"},terms:[],matchScore:2,suggestion:true},"shop/electronics/Saturn":{name:"Saturn",icon:"fas-plug",imageURL:"https://graph.facebook.com/SaturnDE/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2543504",shop:"electronics"},addTags:{brand:"Saturn","brand:wikidata":"Q2543504","brand:wikipedia":"en:Saturn (retailer)",name:"Saturn",shop:"electronics"},countryCodes:["at","de","lu","pl"],terms:[],matchScore:2,suggestion:true},"shop/electronics/Sony":{name:"Sony",icon:"fas-plug",imageURL:"https://graph.facebook.com/sony.jpn/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q41187",shop:"electronics"},addTags:{brand:"Sony","brand:wikidata":"Q41187","brand:wikipedia":"en:Sony",name:"Sony",shop:"electronics"},terms:[],matchScore:2,suggestion:true},"shop/electronics/Teknikmagasinet":{name:"Teknikmagasinet",icon:"fas-plug",imageURL:"https://graph.facebook.com/TeknikmagasinetNorge/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3357520",shop:"electronics"},addTags:{brand:"Teknikmagasinet","brand:wikidata":"Q3357520","brand:wikipedia":"en:Teknikmagasinet",name:"Teknikmagasinet",shop:"electronics"},countryCodes:["fi","no","se"],terms:[],matchScore:2,suggestion:true},"shop/electronics/The Source":{name:"The Source",icon:"fas-plug",imageURL:"https://graph.facebook.com/thesourcecanada/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3212934",shop:"electronics"},addTags:{brand:"The Source","brand:wikidata":"Q3212934","brand:wikipedia":"en:The Source (retailer)",name:"The Source",shop:"electronics"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"shop/electronics/Unieuro":{name:"Unieuro",icon:"fas-plug",imageURL:"https://graph.facebook.com/unieuro/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4004687",shop:"electronics"},addTags:{brand:"Unieuro","brand:wikidata":"Q4004687","brand:wikipedia":"en:Unieuro",name:"Unieuro",shop:"electronics"},terms:[],matchScore:2,suggestion:true},"shop/electronics/Worten":{name:"Worten",icon:"fas-plug",imageURL:"https://graph.facebook.com/WortenES/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q10394039",shop:"electronics"},addTags:{brand:"Worten","brand:wikidata":"Q10394039","brand:wikipedia":"pt:Worten",name:"Worten",shop:"electronics"},countryCodes:["es","pt"],terms:[],matchScore:2,suggestion:true},"shop/electronics/М.Видео":{name:"М.Видео",icon:"fas-plug",imageURL:"https://graph.facebook.com/mvideo.ru/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6558800",shop:"electronics"},addTags:{brand:"М.Видео","brand:en":"M.video","brand:wikidata":"Q6558800","brand:wikipedia":"en:M.video",name:"М.Видео","name:en":"M.video",shop:"electronics"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"shop/electronics/Фокстрот":{name:"Фокстрот",icon:"fas-plug",imageURL:"https://graph.facebook.com/foxtrotinfo/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q16721578",shop:"electronics"},addTags:{brand:"Фокстрот","brand:wikidata":"Q16721578","brand:wikipedia":"uk:Фокстрот (торгова мережа)",name:"Фокстрот",shop:"electronics"},countryCodes:["ua"],terms:[],matchScore:2,suggestion:true},"shop/electronics/Эльдорадо":{name:"Эльдорадо",icon:"fas-plug",imageURL:"https://graph.facebook.com/Eldorado.Stores/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4531492",shop:"electronics"},addTags:{brand:"Эльдорадо","brand:wikidata":"Q4531492","brand:wikipedia":"ru:Эльдорадо (сеть магазинов)",name:"Эльдорадо",shop:"electronics"},terms:[],matchScore:2,suggestion:true},"shop/electronics/エディオン":{name:"エディオン",icon:"fas-plug",imageURL:"https://graph.facebook.com/edion.jp/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11290252",shop:"electronics"},addTags:{brand:"エディオン","brand:en":"EDION","brand:ja":"エディオン","brand:wikidata":"Q11290252","brand:wikipedia":"ja:エディオン",name:"エディオン","name:en":"EDION","name:ja":"エディオン",shop:"electronics"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/electronics/ケーズデンキ":{name:"ケーズデンキ",icon:"fas-plug",geometry:["point","area"],tags:{"brand:wikidata":"Q6322472",shop:"electronics"},addTags:{brand:"ケーズデンキ","brand:en":"K's Denki","brand:ja":"ケーズデンキ","brand:wikidata":"Q6322472","brand:wikipedia":"ja:ケーズホールディングス",name:"ケーズデンキ","name:en":"K's Denki","name:ja":"ケーズデンキ",shop:"electronics"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/electronics/コジマ":{name:"コジマ",icon:"fas-plug",imageURL:"https://graph.facebook.com/kojima.official/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11302052",shop:"electronics"},addTags:{brand:"コジマ","brand:en":"Kojima","brand:ja":"コジマ","brand:wikidata":"Q11302052","brand:wikipedia":"ja:コジマ",name:"コジマ","name:en":"Kojima","name:ja":"コジマ",shop:"electronics"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/electronics/ソフマップ":{name:"ソフマップ",icon:"fas-plug",imageURL:"https://pbs.twimg.com/profile_images/1073173217404043266/fIyrfOW-_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q7553789",shop:"electronics"},addTags:{brand:"ソフマップ","brand:en":"Sofmap","brand:ja":"ソフマップ","brand:wikidata":"Q7553789","brand:wikipedia":"ja:ソフマップ",name:"ソフマップ","name:en":"Sofmap","name:ja":"ソフマップ",shop:"electronics"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/electronics/ビックカメラ":{name:"ビックカメラ",icon:"fas-plug",imageURL:"https://graph.facebook.com/biccamera.page/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4903531",shop:"electronics"},addTags:{brand:"ビックカメラ","brand:en":"Bic Camera","brand:ja":"ビックカメラ","brand:wikidata":"Q4903531","brand:wikipedia":"ja:ビックカメラ",name:"ビックカメラ","name:en":"Bic Camera","name:ja":"ビックカメラ",shop:"electronics"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/electronics/ヤマダ電機":{name:"ヤマダ電機",icon:"fas-plug",geometry:["point","area"],tags:{"brand:wikidata":"Q1096390",shop:"electronics"},addTags:{brand:"ヤマダ電機","brand:en":"Yamada Denki","brand:ja":"ヤマダ電機","brand:wikidata":"Q1096390","brand:wikipedia":"en:Yamada Denki",name:"ヤマダ電機","name:en":"Yamada Denki","name:ja":"ヤマダ電機",shop:"electronics"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/electronics/全國電子":{name:"全國電子",icon:"fas-plug",imageURL:"https://graph.facebook.com/elifemall.com.tw/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q10891540",shop:"electronics"},addTags:{brand:"全國電子","brand:en":"E-life Mall","brand:wikidata":"Q10891540","brand:wikipedia":"zh:全國電子",name:"全國電子","name:en":"E-life Mall",shop:"electronics"},countryCodes:["tw"],terms:[],matchScore:2,suggestion:true},"shop/electronics/燦坤3C":{name:"燦坤3C",icon:"fas-plug",geometry:["point","area"],tags:{"brand:wikidata":"Q11569285",shop:"electronics"},addTags:{brand:"燦坤3C","brand:en":"Tsannkuen 3C","brand:wikidata":"Q11569285","brand:wikipedia":"zh:燦坤",name:"燦坤3C","name:en":"Tsannkuen 3C",shop:"electronics"},countryCodes:["tw"],terms:[],matchScore:2,suggestion:true},"shop/erotic/Ann Summers":{name:"Ann Summers",icon:"maki-shop",imageURL:"https://pbs.twimg.com/profile_images/1104069397008789504/jN1FCnL5_bigger.png",geometry:["point","area"],tags:{"brand:wikidata":"Q579524",shop:"erotic"},addTags:{brand:"Ann Summers","brand:wikidata":"Q579524","brand:wikipedia":"en:Ann Summers",name:"Ann Summers",shop:"erotic"},countryCodes:["gb","ie"],terms:[],matchScore:2,suggestion:true},"shop/erotic/Orion":{name:"Orion",icon:"maki-shop",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FNoimage%20pr.gif&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q1609577",shop:"erotic"},addTags:{brand:"Orion","brand:wikidata":"Q1609577","brand:wikipedia":"de:Orion (Erotik)",name:"Orion",shop:"erotic"},countryCodes:["at","de"],terms:[],matchScore:2,suggestion:true},"shop/fabric/Mondial Tissus":{name:"Mondial Tissus",icon:"fas-tape",imageURL:"https://graph.facebook.com/MondialTissus/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q17635288",shop:"fabric"},addTags:{brand:"Mondial Tissus","brand:wikidata":"Q17635288","brand:wikipedia":"fr:Mondial Tissus",name:"Mondial Tissus",shop:"fabric"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"shop/florist/Blume 2000":{name:"Blume 2000",icon:"maki-florist",imageURL:"https://graph.facebook.com/Blume2000.de/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q886166",shop:"florist"},addTags:{brand:"Blume 2000","brand:wikidata":"Q886166","brand:wikipedia":"de:Blume 2000",name:"Blume 2000",shop:"florist"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/florist/Blumen Risse":{name:"Blumen Risse",icon:"maki-florist",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FLogo%20Blumen%20Risse.jpg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q886177",shop:"florist"},addTags:{brand:"Blumen Risse","brand:wikidata":"Q886177","brand:wikipedia":"de:Blumen Risse",name:"Blumen Risse",shop:"florist"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/florist/Interflora":{name:"Interflora",icon:"maki-florist",imageURL:"https://graph.facebook.com/Interflora.France/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q692179",shop:"florist"},addTags:{brand:"Interflora","brand:wikidata":"Q692179","brand:wikipedia":"en:Interflora",name:"Interflora",shop:"florist"},countryCodes:["fr","gb","no","se"],terms:[],matchScore:2,suggestion:true},"shop/florist/Monceau Fleurs":{name:"Monceau Fleurs",icon:"maki-florist",geometry:["point","area"],tags:{"brand:wikidata":"Q17629431",shop:"florist"},addTags:{brand:"Monceau Fleurs","brand:wikidata":"Q17629431","brand:wikipedia":"fr:Emova Group",name:"Monceau Fleurs",shop:"florist"},countryCodes:["be","fr"],terms:[],matchScore:2,suggestion:true},"shop/frozen_food/Picard":{name:"Picard",icon:"maki-shop",imageURL:"https://graph.facebook.com/picardsurgeles/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3382454",shop:"frozen_food"},addTags:{brand:"Picard","brand:wikidata":"Q3382454","brand:wikipedia":"en:Picard Surgelés",name:"Picard",shop:"frozen_food"},terms:[],matchScore:2,suggestion:true},"shop/funeral_directors/PFG":{name:"PFG",icon:"maki-cemetery",geometry:["point","area"],tags:{"brand:wikidata":"Q3396087",shop:"funeral_directors"},addTags:{brand:"PFG","brand:wikidata":"Q3396087","brand:wikipedia":"fr:Pompes funèbres générales",name:"PFG",official_name:"Pompes Funèbres Générales",shop:"funeral_directors"},countryCodes:["fr"],terms:["pompes funèbres générales"],matchScore:2,suggestion:true},"shop/funeral_directors/Roblot":{name:"Roblot",icon:"maki-cemetery",geometry:["point","area"],tags:{"brand:wikidata":"Q63247414",shop:"funeral_directors"},addTags:{brand:"Roblot","brand:wikidata":"Q63247414",name:"Roblot",shop:"funeral_directors"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"shop/funeral_directors/Roc-Eclerc":{name:"Roc-Eclerc",icon:"maki-cemetery",imageURL:"https://graph.facebook.com/grouperoceclerc/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62558102",shop:"funeral_directors"},addTags:{brand:"Roc-Eclerc","brand:wikidata":"Q62558102",name:"Roc-Eclerc",shop:"funeral_directors"},terms:[],matchScore:2,suggestion:true},"shop/funeral_directors/The Co-operative Funeralcare":{name:"The Co-operative Funeralcare",icon:"maki-cemetery",imageURL:"https://pbs.twimg.com/profile_images/1034361261193134080/1PfqKyVV_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q7726521",shop:"funeral_directors"},addTags:{brand:"The Co-operative Funeralcare","brand:wikidata":"Q7726521","brand:wikipedia":"en:Co-op Funeralcare",name:"The Co-operative Funeralcare",shop:"funeral_directors"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/furniture/Aaron's":{name:"Aaron's",icon:"fas-couch",imageURL:"https://pbs.twimg.com/profile_images/1112819902178582528/GeuCBPI0_bigger.png",geometry:["point","area"],tags:{"brand:wikidata":"Q10397787",shop:"furniture"},addTags:{brand:"Aaron's","brand:wikidata":"Q10397787","brand:wikipedia":"en:Aaron's, Inc.",name:"Aaron's",shop:"furniture"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"shop/furniture/American Signature Furniture":{name:"American Signature Furniture",icon:"fas-couch",imageURL:"https://graph.facebook.com/AmericanSignatureFurnitureUSA/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q63859411",shop:"furniture"},addTags:{brand:"American Signature Furniture","brand:wikidata":"Q63859411",name:"American Signature Furniture",shop:"furniture"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/furniture/Arhaus":{name:"Arhaus",icon:"fas-couch",imageURL:"https://graph.facebook.com/44947264751/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q35689887",shop:"furniture"},addTags:{brand:"Arhaus","brand:wikidata":"Q35689887",name:"Arhaus",shop:"furniture"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/furniture/Ashley HomeStore":{name:"Ashley HomeStore",icon:"fas-couch",imageURL:"https://pbs.twimg.com/profile_images/793453568288325636/UiWzv4oc_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q4805437",shop:"furniture"},addTags:{brand:"Ashley HomeStore","brand:wikidata":"Q4805437","brand:wikipedia":"en:Ashley HomeStore",name:"Ashley Furniture",shop:"furniture"},countryCodes:["ca","us"],terms:["ashley furniture","ashley furniture homestore"],matchScore:2,suggestion:true},"shop/furniture/Black Red White":{name:"Black Red White",icon:"fas-couch",geometry:["point","area"],tags:{"brand:wikidata":"Q4921546",shop:"furniture"},addTags:{brand:"Black Red White","brand:wikidata":"Q4921546","brand:wikipedia":"en:Black Red White",name:"Black Red White",shop:"furniture"},terms:[],matchScore:2,suggestion:true},"shop/furniture/BoConcept":{name:"BoConcept",icon:"fas-couch",imageURL:"https://graph.facebook.com/boconceptusa/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11338915",shop:"furniture"},addTags:{brand:"BoConcept","brand:wikidata":"Q11338915","brand:wikipedia":"en:BoConcept",name:"BoConcept",shop:"furniture"},terms:[],matchScore:2,suggestion:true},"shop/furniture/Bob’s Discount Furniture":{name:"Bob’s Discount Furniture",icon:"fas-couch",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FBob's%20Discount%20Furniture%20Logo.png&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q4931582",shop:"furniture"},addTags:{brand:"Bob’s Discount Furniture","brand:wikidata":"Q4931582","brand:wikipedia":"en:Bob's Discount Furniture",name:"Bob’s Discount Furniture",shop:"furniture"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/furniture/Bodzio":{name:"Bodzio",icon:"fas-couch",geometry:["point","area"],tags:{"brand:wikidata":"Q20034845",shop:"furniture"},addTags:{brand:"Bodzio","brand:wikidata":"Q20034845","brand:wikipedia":"pl:Fabryka Mebli Bodzio",name:"Bodzio",shop:"furniture"},countryCodes:["pl"],terms:[],matchScore:2,suggestion:true},"shop/furniture/But":{name:"But",icon:"fas-couch",geometry:["point","area"],tags:{"brand:wikidata":"Q18720442",shop:"furniture"},addTags:{brand:"But","brand:wikidata":"Q18720442","brand:wikipedia":"en:BUT (retailer)",name:"But",shop:"furniture"},terms:[],matchScore:2,suggestion:true},"shop/furniture/Cabinets To Go":{name:"Cabinets To Go",icon:"fas-couch",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FCabinets%20To%20Go%20logo.png&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q25245346",shop:"furniture"},addTags:{brand:"Cabinets To Go","brand:wikidata":"Q25245346","brand:wikipedia":"en:Cabinets To Go",name:"Cabinets To Go",shop:"furniture"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/furniture/Conforama":{name:"Conforama",icon:"fas-couch",imageURL:"https://pbs.twimg.com/profile_images/1122801701830955008/6KvpWuQS_bigger.png",geometry:["point","area"],tags:{"brand:wikidata":"Q541134",shop:"furniture"},addTags:{brand:"Conforama","brand:wikidata":"Q541134","brand:wikipedia":"en:Conforama",name:"Conforama",shop:"furniture"},terms:[],matchScore:2,suggestion:true},"shop/furniture/Crate & Barrel":{name:"Crate & Barrel",icon:"fas-couch",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FCrateandBarrelLogo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q5182604",shop:"furniture"},addTags:{brand:"Crate & Barrel","brand:wikidata":"Q5182604","brand:wikipedia":"en:Crate & Barrel",name:"Crate & Barrel",shop:"furniture"},terms:["crate and barrel"],matchScore:2,suggestion:true},"shop/furniture/DFS":{name:"DFS",icon:"fas-couch",imageURL:"https://pbs.twimg.com/profile_images/676402722946621440/S5P4YZXG_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q5204927",shop:"furniture"},addTags:{brand:"DFS","brand:wikidata":"Q5204927","brand:wikipedia":"en:DFS Furniture",name:"DFS",shop:"furniture"},terms:[],matchScore:2,suggestion:true},"shop/furniture/Dänisches Bettenlager":{name:"Dänisches Bettenlager",icon:"fas-couch",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FLOGO%20JYSK.jpg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q138913",shop:"furniture"},addTags:{brand:"Dänisches Bettenlager","brand:wikidata":"Q138913","brand:wikipedia":"en:Jysk (store)",name:"Dänisches Bettenlager",shop:"furniture"},countryCodes:["at","de"],terms:[],matchScore:2,suggestion:true},"shop/furniture/Ethan Allen":{name:"Ethan Allen",icon:"fas-couch",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FEthan%20Allen%20Logo.JPG&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q5402870",shop:"furniture"},addTags:{brand:"Ethan Allen","brand:wikidata":"Q5402870","brand:wikipedia":"en:Ethan Allen (furniture company)",name:"Ethan Allen",shop:"furniture"},terms:[],matchScore:2,suggestion:true},"shop/furniture/Fly":{name:"Fly",icon:"fas-couch",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FFly-Logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q1389184",shop:"furniture"},addTags:{brand:"Fly","brand:wikidata":"Q1389184","brand:wikipedia":"fr:Fly (entreprise)",name:"Fly",shop:"furniture"},terms:[],matchScore:2,suggestion:true},"shop/furniture/Harveys":{name:"Harveys",icon:"fas-couch",imageURL:"https://pbs.twimg.com/profile_images/644090357416873984/nuqIAG7O_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q5677754",shop:"furniture"},addTags:{brand:"Harveys","brand:wikidata":"Q5677754","brand:wikipedia":"en:Harveys Furniture",name:"Harveys",shop:"furniture"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/furniture/Havertys":{name:"Havertys",icon:"fas-couch",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FHavertys-logo-new.jpg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q5683881",shop:"furniture"},addTags:{brand:"Havertys","brand:wikidata":"Q5683881","brand:wikipedia":"en:Havertys",name:"Havertys",shop:"furniture"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/furniture/IKEA":{name:"IKEA",icon:"fas-couch",imageURL:"https://graph.facebook.com/IKEA/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q54078",shop:"furniture"},addTags:{brand:"IKEA","brand:wikidata":"Q54078","brand:wikipedia":"en:IKEA",name:"IKEA",shop:"furniture"},terms:[],matchScore:2,suggestion:true},"shop/furniture/JYSK":{name:"JYSK",icon:"fas-couch",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FLOGO%20JYSK.jpg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q138913",shop:"furniture"},addTags:{brand:"JYSK","brand:wikidata":"Q138913","brand:wikipedia":"en:Jysk (store)",name:"JYSK",shop:"furniture"},terms:[],matchScore:2,suggestion:true},"shop/furniture/La-Z-Boy":{name:"La-Z-Boy",icon:"fas-couch",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FLa-Z-Boy%20Logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q6391583",shop:"furniture"},addTags:{brand:"La-Z-Boy","brand:wikidata":"Q6391583","brand:wikipedia":"en:La-Z-Boy",name:"La-Z-Boy",shop:"furniture"},terms:[],matchScore:2,suggestion:true},"shop/furniture/Pottery Barn":{name:"Pottery Barn",icon:"fas-couch",geometry:["point","area"],tags:{"brand:wikidata":"Q3400126",shop:"furniture"},addTags:{brand:"Pottery Barn","brand:wikidata":"Q3400126","brand:wikipedia":"en:Pottery Barn",name:"Pottery Barn",shop:"furniture"},countryCodes:["au","ca","mx","ph","us"],terms:[],matchScore:2,suggestion:true},"shop/furniture/Raymour & Flanigan":{name:"Raymour & Flanigan",icon:"fas-couch",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FRaymour%20%26%20Flanigan%20logo%202018.jpg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q7299290",shop:"furniture"},addTags:{brand:"Raymour & Flanigan","brand:wikidata":"Q7299290","brand:wikipedia":"en:Raymour & Flanigan",name:"Raymour & Flanigan",shop:"furniture"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/furniture/Rent-A-Center":{name:"Rent-A-Center",icon:"fas-couch",geometry:["point","area"],tags:{"brand:wikidata":"Q7313497",shop:"furniture"},addTags:{brand:"Rent-A-Center","brand:wikidata":"Q7313497","brand:wikipedia":"en:Rent-A-Center",name:"Rent-A-Center",shop:"furniture"},terms:[],matchScore:2,suggestion:true},"shop/furniture/Restoration Hardware":{name:"Restoration Hardware",icon:"fas-couch",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FLogo%20RH.gif&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q7316207",shop:"furniture"},addTags:{brand:"Restoration Hardware","brand:wikidata":"Q7316207","brand:wikipedia":"en:Restoration Hardware",name:"Restoration Hardware",shop:"furniture"},terms:[],matchScore:2,suggestion:true},"shop/furniture/Roller":{name:"Roller",icon:"fas-couch",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FROLLER%20Logo.jpg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q1621286",shop:"furniture"},addTags:{brand:"Roller","brand:wikidata":"Q1621286","brand:wikipedia":"de:Roller (Möbelhaus)",name:"Roller",shop:"furniture"},terms:[],matchScore:2,suggestion:true},"shop/furniture/Rooms To Go":{name:"Rooms To Go",icon:"fas-couch",geometry:["point","area"],tags:{"brand:wikidata":"Q7366329",shop:"furniture"},addTags:{brand:"Rooms To Go","brand:wikidata":"Q7366329","brand:wikipedia":"en:Rooms To Go",name:"Rooms To Go",shop:"furniture"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/furniture/ScS":{name:"ScS",icon:"fas-couch",imageURL:"https://pbs.twimg.com/profile_images/1113810857723609089/CHZevsPZ_bigger.png",geometry:["point","area"],tags:{"brand:wikidata":"Q19654399",shop:"furniture"},addTags:{brand:"ScS","brand:wikidata":"Q19654399","brand:wikipedia":"en:ScS",name:"ScS",shop:"furniture"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/furniture/The Brick":{name:"The Brick",icon:"fas-couch",geometry:["point","area"],tags:{"brand:wikidata":"Q7720000",shop:"furniture"},addTags:{brand:"The Brick","brand:wikidata":"Q7720000","brand:wikipedia":"en:The Brick",name:"The Brick",shop:"furniture"},terms:[],matchScore:2,suggestion:true},"shop/furniture/Urban Barn":{name:"Urban Barn",icon:"fas-couch",geometry:["point","area"],tags:{"brand:wikidata":"Q62515207",shop:"furniture"},addTags:{brand:"Urban Barn","brand:wikidata":"Q62515207",name:"Urban Barn",shop:"furniture"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"shop/furniture/Value City Furniture":{name:"Value City Furniture",icon:"fas-couch",imageURL:"https://graph.facebook.com/ValueCityFurnitureUSA/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q63859417",shop:"furniture"},addTags:{brand:"Value City Furniture","brand:wikidata":"Q63859417",name:"Value City Furniture",shop:"furniture"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/furniture/Williams-Sonoma":{name:"Williams-Sonoma",icon:"fas-couch",imageURL:"https://pbs.twimg.com/profile_images/811867470206214144/p1nrNSEb_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q2581220",shop:"furniture"},addTags:{brand:"Williams-Sonoma","brand:wikidata":"Q2581220","brand:wikipedia":"en:Williams-Sonoma",name:"Williams-Sonoma",shop:"furniture"},countryCodes:["ca","us"],terms:["william sonoma"],matchScore:2,suggestion:true},"shop/furniture/ニトリ":{name:"ニトリ",icon:"fas-couch",imageURL:"https://pbs.twimg.com/profile_images/911049695601991682/HCnF523x_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q10801453",shop:"furniture"},addTags:{brand:"ニトリ","brand:en":"Nitori","brand:ja":"ニトリ","brand:wikidata":"Q10801453","brand:wikipedia":"en:Nitori",name:"ニトリ","name:en":"Nitori","name:ja":"ニトリ",shop:"furniture"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/games/Games Workshop":{name:"Games Workshop",icon:"fas-dice",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FGames%20Workshop%20Logo.png&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q587270",shop:"games"},addTags:{brand:"Games Workshop","brand:wikidata":"Q587270","brand:wikipedia":"en:Games Workshop",name:"Games Workshop",shop:"games"},terms:[],matchScore:2,suggestion:true},"shop/garden_centre/Dehner":{name:"Dehner",icon:"maki-garden-centre",imageURL:"https://graph.facebook.com/dehner/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1183029",shop:"garden_centre"},addTags:{brand:"Dehner","brand:wikidata":"Q1183029","brand:wikipedia":"de:Dehner",name:"Dehner",shop:"garden_centre"},countryCodes:["at","de"],terms:[],matchScore:2,suggestion:true},"shop/garden_centre/Gamm Vert":{name:"Gamm Vert",icon:"maki-garden-centre",imageURL:"https://graph.facebook.com/gammvert.officiel/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3095006",shop:"garden_centre"},addTags:{brand:"Gamm Vert","brand:wikidata":"Q3095006","brand:wikipedia":"fr:Gamm Vert",name:"Gamm Vert",shop:"garden_centre"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"shop/garden_centre/Jardiland":{name:"Jardiland",icon:"maki-garden-centre",imageURL:"https://graph.facebook.com/Jardiland/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3162276",shop:"garden_centre"},addTags:{brand:"Jardiland","brand:wikidata":"Q3162276","brand:wikipedia":"fr:Jardiland",name:"Jardiland",shop:"garden_centre"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"shop/garden_centre/Point Vert":{name:"Point Vert",icon:"maki-garden-centre",imageURL:"https://graph.facebook.com/Magasin-Point-Vert-EST-444739795728913/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q16661975",shop:"garden_centre"},addTags:{brand:"Point Vert","brand:wikidata":"Q16661975","brand:wikipedia":"fr:Magasin vert",name:"Point Vert",shop:"garden_centre"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"shop/garden_centre/Truffaut":{name:"Truffaut",icon:"maki-garden-centre",geometry:["point","area"],tags:{"brand:wikidata":"Q3162640",shop:"garden_centre"},addTags:{brand:"Truffaut","brand:wikidata":"Q3162640","brand:wikipedia":"fr:Jardineries Truffaut",name:"Truffaut",shop:"garden_centre"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"shop/gift/Card Factory":{name:"Card Factory",icon:"maki-gift",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FCardfactorylogo.jpg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q5038192",shop:"gift"},addTags:{brand:"Card Factory","brand:wikidata":"Q5038192","brand:wikipedia":"en:Card Factory",name:"Card Factory",shop:"gift"},countryCodes:["gb","im"],terms:[],matchScore:2,suggestion:true},"shop/gift/Clintons":{name:"Clintons",icon:"maki-gift",imageURL:"https://pbs.twimg.com/profile_images/979391762551668736/CpD6EAk9_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q5134299",shop:"gift"},addTags:{brand:"Clintons","brand:wikidata":"Q5134299","brand:wikipedia":"en:Clintons",name:"Clintons",shop:"gift"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/gift/Disney Store":{name:"Disney Store",icon:"maki-gift",imageURL:"https://pbs.twimg.com/profile_images/378800000036541261/d457adabeec5508a3fd78d152896f12d_bigger.png",geometry:["point","area"],tags:{"brand:wikidata":"Q1047009",shop:"gift"},addTags:{brand:"Disney Store","brand:wikidata":"Q1047009","brand:wikipedia":"en:Disney Store",name:"Disney Store",operator:"Disney Consumer Products","operator:wikidata":"Q3030410","operator:wikipedia":"en:Disney Consumer Products and Interactive Media",shop:"gift"},countryCodes:["ca","fr","us"],terms:[],matchScore:2,suggestion:true},"shop/gift/Hallmark":{name:"Hallmark",icon:"maki-gift",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FHallmark%20logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q1521910",shop:"gift"},addTags:{brand:"Hallmark","brand:wikidata":"Q1521910","brand:wikipedia":"en:Hallmark Cards",name:"Hallmark",shop:"gift"},terms:[],matchScore:2,suggestion:true},"shop/gift/Nanu-Nana":{name:"Nanu-Nana",icon:"maki-gift",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FNanu%20Nana%20Logo%20500x417%2002.png&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q1720245",shop:"gift"},addTags:{brand:"Nanu-Nana","brand:wikidata":"Q1720245","brand:wikipedia":"de:Nanu-Nana",name:"Nanu-Nana",shop:"gift"},countryCodes:["at","de"],terms:[],matchScore:2,suggestion:true},"shop/greengrocer/Produce Junction":{name:"Produce Junction",icon:"fas-carrot",imageURL:"https://graph.facebook.com/ProduceJunction/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q60583541",shop:"greengrocer"},addTags:{brand:"Produce Junction","brand:wikidata":"Q60583541",name:"Produce Junction",shop:"greengrocer"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/hairdresser_supply/Sally Beauty Supply":{name:"Sally Beauty Supply",icon:"maki-shop",imageURL:"https://graph.facebook.com/sallybeauty/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7405065",shop:"hairdresser_supply"},addTags:{brand:"Sally Beauty Supply","brand:wikidata":"Q7405065","brand:wikipedia":"en:Sally Beauty Holdings",name:"Sally Beauty Supply",shop:"hairdresser_supply"},countryCodes:["ca","mx","us"],terms:[],matchScore:2,suggestion:true},"shop/hairdresser/Camille Albane":{name:"Camille Albane",icon:"temaki-beauty_salon",imageURL:"https://graph.facebook.com/CamilleAlbane.Paris/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62965183",shop:"hairdresser"},addTags:{brand:"Camille Albane","brand:wikidata":"Q62965183",name:"Camille Albane",shop:"hairdresser"},terms:[],matchScore:2,suggestion:true},"shop/hairdresser/Cost Cutters":{name:"Cost Cutters",icon:"temaki-beauty_salon",imageURL:"https://graph.facebook.com/CostCutters/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62029366",shop:"hairdresser"},addTags:{brand:"Cost Cutters","brand:wikidata":"Q62029366",name:"Cost Cutters",shop:"hairdresser"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/hairdresser/Dessange":{name:"Dessange",icon:"temaki-beauty_salon",imageURL:"https://graph.facebook.com/DESSANGE.Paris/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62979914",shop:"hairdresser"},addTags:{brand:"Dessange","brand:wikidata":"Q62979914",name:"Dessange",shop:"hairdresser"},terms:[],matchScore:2,suggestion:true},"shop/hairdresser/Fantastic Sams":{name:"Fantastic Sams",icon:"temaki-beauty_salon",imageURL:"https://graph.facebook.com/fantasticsamscutandcolor/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5434222",shop:"hairdresser"},addTags:{brand:"Fantastic Sams","brand:wikidata":"Q5434222","brand:wikipedia":"en:Fantastic Sams",name:"Fantastic Sams",shop:"hairdresser"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/hairdresser/First Choice Haircutters":{name:"First Choice Haircutters",icon:"temaki-beauty_salon",imageURL:"https://graph.facebook.com/SignatureStyleSalons/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5452622",shop:"hairdresser"},addTags:{brand:"First Choice Haircutters","brand:wikidata":"Q5452622","brand:wikipedia":"en:First Choice Haircutters",name:"First Choice Haircutters",shop:"hairdresser"},terms:[],matchScore:2,suggestion:true},"shop/hairdresser/Franck Provost":{name:"Franck Provost",icon:"temaki-beauty_salon",imageURL:"https://graph.facebook.com/franck.provost.paris/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62805922",shop:"hairdresser"},addTags:{brand:"Franck Provost","brand:wikidata":"Q62805922","brand:wikipedia":"fr:Franck Provost (Salons de coiffure)",name:"Franck Provost",shop:"hairdresser"},terms:[],matchScore:2,suggestion:true},"shop/hairdresser/Great Clips":{name:"Great Clips",icon:"temaki-beauty_salon",imageURL:"https://graph.facebook.com/GreatClips/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5598967",shop:"hairdresser"},addTags:{brand:"Great Clips","brand:wikidata":"Q5598967","brand:wikipedia":"en:Great Clips",name:"Great Clips",shop:"hairdresser"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"shop/hairdresser/Hair Cuttery":{name:"Hair Cuttery",icon:"temaki-beauty_salon",imageURL:"https://graph.facebook.com/haircuttery/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5639484",shop:"hairdresser"},addTags:{brand:"Hair Cuttery","brand:wikidata":"Q5639484","brand:wikipedia":"en:Hair Cuttery",name:"Hair Cuttery",shop:"hairdresser"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/hairdresser/Hair Express":{name:"Hair Express",icon:"temaki-beauty_salon",imageURL:"https://graph.facebook.com/hairexpressfriseur/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q57550814",shop:"hairdresser"},addTags:{brand:"Hair Express","brand:wikidata":"Q57550814",name:"Hair Express",shop:"hairdresser"},terms:[],matchScore:2,suggestion:true},"shop/hairdresser/Hairkiller":{name:"Hairkiller",icon:"temaki-beauty_salon",imageURL:"https://graph.facebook.com/hairkillerDetmold/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q58305998",shop:"hairdresser"},addTags:{brand:"Hairkiller","brand:wikidata":"Q58305998",name:"Hairkiller",shop:"hairdresser"},countryCodes:["at","de","lu"],terms:[],matchScore:2,suggestion:true},"shop/hairdresser/Klier":{name:"Klier",icon:"temaki-beauty_salon",imageURL:"https://graph.facebook.com/frisoerklier/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1465159",shop:"hairdresser"},addTags:{brand:"Klier","brand:wikidata":"Q1465159","brand:wikipedia":"de:Frisör Klier",name:"Klier",shop:"hairdresser"},terms:[],matchScore:2,suggestion:true},"shop/hairdresser/Klipp":{name:"Klipp",icon:"temaki-beauty_salon",imageURL:"https://graph.facebook.com/klipp.frisoer/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1737304",shop:"hairdresser"},addTags:{brand:"Klipp","brand:wikidata":"Q1737304","brand:wikipedia":"de:Klipp Frisör",name:"Klipp",shop:"hairdresser"},terms:[],matchScore:2,suggestion:true},"shop/hairdresser/Sport Clips":{name:"Sport Clips",icon:"temaki-beauty_salon",imageURL:"https://pbs.twimg.com/profile_images/969348279170342913/n2vPf8mc_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q7579310",shop:"hairdresser"},addTags:{brand:"Sport Clips","brand:wikidata":"Q7579310",name:"Sport Clips",shop:"hairdresser"},terms:[],matchScore:2,suggestion:true},"shop/hairdresser/Supercuts":{name:"Supercuts",icon:"temaki-beauty_salon",imageURL:"https://graph.facebook.com/Supercuts/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7643239",shop:"hairdresser"},addTags:{brand:"Supercuts","brand:wikidata":"Q7643239","brand:wikipedia":"en:Supercuts",name:"Supercuts",shop:"hairdresser"},terms:[],matchScore:2,suggestion:true},"shop/hairdresser/Tchip":{name:"Tchip",icon:"temaki-beauty_salon",imageURL:"https://graph.facebook.com/TCHIP.Coiffure.Officiel/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62871250",shop:"hairdresser"},addTags:{brand:"Tchip","brand:wikidata":"Q62871250",name:"Tchip",shop:"hairdresser"},terms:[],matchScore:2,suggestion:true},"shop/hairdresser/Toni & Guy":{name:"Toni & Guy",icon:"temaki-beauty_salon",imageURL:"https://graph.facebook.com/toniandguyworld/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q324784",shop:"hairdresser"},addTags:{brand:"Toni & Guy","brand:wikidata":"Q324784","brand:wikipedia":"en:Toni & Guy",name:"Toni & Guy",shop:"hairdresser"},terms:[],matchScore:2,suggestion:true},"shop/hairdresser/Top Hair":{name:"Top Hair",icon:"temaki-beauty_salon",imageURL:"https://graph.facebook.com/Mein.Friseur.Top.Hair/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62523343",shop:"hairdresser"},addTags:{brand:"Top Hair","brand:wikidata":"Q62523343",name:"Top Hair",shop:"hairdresser"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/hardware/Harbor Freight Tools":{name:"Harbor Freight Tools",icon:"temaki-tools",imageURL:"https://graph.facebook.com/harbor.f.tools/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5654601",shop:"hardware"},addTags:{brand:"Harbor Freight Tools","brand:wikidata":"Q5654601","brand:wikipedia":"en:Harbor Freight Tools",name:"Harbor Freight Tools",shop:"hardware"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/hardware/Home Hardware":{name:"Home Hardware",icon:"temaki-tools",imageURL:"https://graph.facebook.com/homehardwarestores/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3139611",shop:"hardware"},addTags:{brand:"Home Hardware","brand:wikidata":"Q3139611","brand:wikipedia":"en:Home Hardware",name:"Home Hardware",shop:"hardware"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"shop/hardware/True Value":{name:"True Value",icon:"temaki-tools",imageURL:"https://graph.facebook.com/TrueValue/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7847545",shop:"hardware"},addTags:{brand:"True Value","brand:wikidata":"Q7847545","brand:wikipedia":"en:True Value",name:"True Value",shop:"hardware"},terms:[],matchScore:2,suggestion:true},"shop/hardware/Würth":{name:"Würth",icon:"temaki-tools",imageURL:"https://graph.facebook.com/wuerth.germany/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q679750",shop:"hardware"},addTags:{brand:"Würth","brand:wikidata":"Q679750","brand:wikipedia":"de:Würth-Gruppe",name:"Würth",shop:"hardware"},terms:[],matchScore:2,suggestion:true},"shop/hardware/Мосхозторг":{name:"Мосхозторг",icon:"temaki-tools",imageURL:"https://graph.facebook.com/MosHozTorg/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62499092",shop:"hardware"},addTags:{brand:"Мосхозторг","brand:wikidata":"Q62499092",name:"Мосхозторг",shop:"hardware"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"shop/health_food/Holland & Barrett":{name:"Holland & Barrett",icon:"maki-shop",imageURL:"https://pbs.twimg.com/profile_images/1106856523878289408/YgV0vPoe_bigger.png",geometry:["point","area"],tags:{"brand:wikidata":"Q5880870",shop:"health_food"},addTags:{brand:"Holland & Barrett","brand:wikidata":"Q5880870","brand:wikipedia":"en:Holland & Barrett",name:"Holland & Barrett",shop:"health_food"},terms:[],matchScore:2,suggestion:true},"shop/hearing_aids/Amplifon":{name:"Amplifon",icon:"maki-shop",imageURL:"https://graph.facebook.com/AmplifonGroupCareers/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q477222",shop:"hearing_aids"},addTags:{brand:"Amplifon","brand:wikidata":"Q477222","brand:wikipedia":"en:Amplifon",name:"Amplifon",shop:"hearing_aids"},terms:[],matchScore:2,suggestion:true},"shop/hearing_aids/Audika":{name:"Audika",icon:"maki-shop",imageURL:"https://graph.facebook.com/audikafrance/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2870745",shop:"hearing_aids"},addTags:{brand:"Audika","brand:wikidata":"Q2870745","brand:wikipedia":"fr:Audika",name:"Audika",shop:"hearing_aids"},terms:[],matchScore:2,suggestion:true},"shop/hearing_aids/Geers":{name:"Geers",icon:"maki-shop",imageURL:"https://graph.facebook.com/geers.hoerakustik/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1497707",shop:"hearing_aids"},addTags:{brand:"Geers","brand:wikidata":"Q1497707","brand:wikipedia":"de:Geers Hörakustik",name:"Geers",shop:"hearing_aids"},terms:[],matchScore:2,suggestion:true},"shop/hearing_aids/Kind Hörgeräte":{name:"Kind Hörgeräte",icon:"maki-shop",imageURL:"https://graph.facebook.com/kindhoergeraete/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q43598590",shop:"hearing_aids"},addTags:{brand:"Kind Hörgeräte","brand:wikidata":"Q43598590","brand:wikipedia":"de:Kind Hörgeräte",name:"Kind Hörgeräte",shop:"hearing_aids"},countryCodes:["de"],terms:["kind"],matchScore:2,suggestion:true},"shop/hearing_aids/Neuroth":{name:"Neuroth",icon:"maki-shop",imageURL:"https://graph.facebook.com/NeurothAG/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q15836645",shop:"hearing_aids"},addTags:{brand:"Neuroth","brand:wikidata":"Q15836645","brand:wikipedia":"de:Neuroth AG",name:"Neuroth",shop:"hearing_aids"},countryCodes:["at","de"],terms:[],matchScore:2,suggestion:true},"shop/hifi/Bang & Olufsen":{name:"Bang & Olufsen",icon:"maki-shop",imageURL:"https://graph.facebook.com/bangolufsenusa/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q790020",shop:"hifi"},addTags:{brand:"Bang & Olufsen","brand:wikidata":"Q790020","brand:wikipedia":"en:Bang & Olufsen",name:"Bang & Olufsen",shop:"hifi"},terms:[],matchScore:2,suggestion:true},"shop/houseware/Bed Bath & Beyond":{name:"Bed Bath & Beyond",icon:"fas-blender",imageURL:"https://graph.facebook.com/BedBathAndBeyond/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q813782",shop:"houseware"},addTags:{brand:"Bed Bath & Beyond","brand:wikidata":"Q813782","brand:wikipedia":"en:Bed Bath & Beyond",name:"Bed Bath & Beyond",shop:"houseware"},terms:["bed bath and beyond"],matchScore:2,suggestion:true},"shop/houseware/Blokker":{name:"Blokker",icon:"fas-blender",imageURL:"https://graph.facebook.com/BlokkerNL/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q884934",shop:"houseware"},addTags:{brand:"Blokker","brand:wikidata":"Q884934","brand:wikipedia":"en:Blokker Holding",name:"Blokker",shop:"houseware"},terms:[],matchScore:2,suggestion:true},"shop/houseware/Cervera":{name:"Cervera",icon:"fas-blender",imageURL:"https://graph.facebook.com/CerveraAB/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q10447179",shop:"houseware"},addTags:{brand:"Cervera","brand:wikidata":"Q10447179","brand:wikipedia":"sv:Cervera (företag)",name:"Cervera",shop:"houseware"},countryCodes:["se"],terms:[],matchScore:2,suggestion:true},"shop/houseware/HomeGoods":{name:"HomeGoods",icon:"fas-blender",imageURL:"https://graph.facebook.com/Homegoods/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5887941",shop:"houseware"},addTags:{brand:"HomeGoods","brand:wikidata":"Q5887941","brand:wikipedia":"en:HomeGoods",name:"HomeGoods",shop:"houseware"},terms:[],matchScore:2,suggestion:true},"shop/houseware/Lagerhaus":{name:"Lagerhaus",icon:"fas-blender",imageURL:"https://graph.facebook.com/lagerhaus.se/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q10553211",shop:"houseware"},addTags:{brand:"Lagerhaus","brand:wikidata":"Q10553211","brand:wikipedia":"sv:Lagerhaus",name:"Lagerhaus",shop:"houseware"},terms:[],matchScore:2,suggestion:true},"shop/houseware/Marskramer":{name:"Marskramer",icon:"fas-blender",imageURL:"https://graph.facebook.com/marskramer.nl/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2305917",shop:"houseware"},addTags:{brand:"Marskramer","brand:wikidata":"Q2305917","brand:wikipedia":"nl:Marskramer (warenhuis)",name:"Marskramer",shop:"houseware"},countryCodes:["nl"],terms:[],matchScore:2,suggestion:true},"shop/houseware/Old Time Pottery":{name:"Old Time Pottery",icon:"fas-blender",imageURL:"https://graph.facebook.com/oldtimepottery/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7085222",shop:"houseware"},addTags:{brand:"Old Time Pottery","brand:website":"http://www.oldtimepottery.com","brand:wikidata":"Q7085222","brand:wikipedia":"en:Old Time Pottery",name:"Old Time Pottery",shop:"houseware"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/houseware/Sur La Table":{name:"Sur La Table",icon:"fas-blender",imageURL:"https://graph.facebook.com/SurLaTable/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7645220",shop:"houseware"},addTags:{brand:"Sur La Table","brand:wikidata":"Q7645220","brand:wikipedia":"en:Sur La Table",name:"Sur La Table",shop:"houseware"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/houseware/The Container Store":{name:"The Container Store",icon:"fas-blender",imageURL:"https://graph.facebook.com/containerstore/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7727445",shop:"houseware"},addTags:{brand:"The Container Store","brand:wikidata":"Q7727445","brand:wikipedia":"en:The Container Store",name:"The Container Store",shop:"houseware"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/houseware/Tuesday Morning":{name:"Tuesday Morning",icon:"fas-blender",imageURL:"https://graph.facebook.com/TuesdayMorning/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7851426",shop:"houseware"},addTags:{brand:"Tuesday Morning","brand:wikidata":"Q7851426","brand:wikipedia":"en:Tuesday Morning",name:"Tuesday Morning",shop:"houseware"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/houseware/WMF":{name:"WMF",icon:"fas-blender",imageURL:"https://graph.facebook.com/WMF/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q451423",shop:"houseware"},addTags:{brand:"WMF","brand:wikidata":"Q451423","brand:wikipedia":"en:WMF Group",name:"WMF",shop:"houseware"},countryCodes:["at","de"],terms:[],matchScore:2,suggestion:true},"shop/houseware/World Market":{name:"World Market",icon:"fas-blender",imageURL:"https://graph.facebook.com/worldmarket/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5174750",shop:"interior_decoration"},addTags:{brand:"World Market","brand:wikidata":"Q5174750","brand:wikipedia":"en:Cost Plus World Market",name:"World Market",official_name:"Cost Plus World Market",shop:"interior_decoration"},countryCodes:["us"],terms:["cost plus"],matchScore:2,suggestion:true},"shop/houseware/Xenos":{name:"Xenos",icon:"fas-blender",imageURL:"https://graph.facebook.com/XenosNL/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q16547960",shop:"houseware"},addTags:{brand:"Xenos","brand:wikidata":"Q16547960","brand:wikipedia":"nl:Xenos",name:"Xenos",shop:"houseware"},terms:[],matchScore:2,suggestion:true},"shop/interior_decoration/Depot":{name:"Depot",icon:"maki-shop",imageURL:"https://graph.facebook.com/DEPOTonline/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1191740",shop:"interior_decoration"},addTags:{brand:"Depot","brand:wikidata":"Q1191740","brand:wikipedia":"de:Gries Deco Holding",name:"Depot",shop:"interior_decoration"},countryCodes:["at","ch","de"],terms:[],matchScore:2,suggestion:true},"shop/interior_decoration/Hemtex":{name:"Hemtex",icon:"maki-shop",imageURL:"https://graph.facebook.com/hemtex/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q10521868",shop:"interior_decoration"},addTags:{brand:"Hemtex","brand:wikidata":"Q10521868","brand:wikipedia":"sv:Hemtex",name:"Hemtex",shop:"interior_decoration"},countryCodes:["ee","fi","se"],terms:[],matchScore:2,suggestion:true},"shop/interior_decoration/Kirkland's":{name:"Kirkland's",icon:"maki-shop",imageURL:"https://graph.facebook.com/Kirklands/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6415714",shop:"interior_decoration"},addTags:{brand:"Kirkland's","brand:wikidata":"Q6415714","brand:wikipedia":"en:Kirkland's",name:"Kirkland's",shop:"interior_decoration"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/interior_decoration/Pier 1 Imports":{name:"Pier 1 Imports",icon:"maki-shop",imageURL:"https://graph.facebook.com/pier1/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7191691",shop:"interior_decoration"},addTags:{brand:"Pier 1 Imports","brand:wikidata":"Q7191691","brand:wikipedia":"en:Pier 1 Imports",name:"Pier 1 Imports",shop:"interior_decoration"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"shop/jewelry/Alex and Ani":{name:"Alex and Ani",icon:"maki-jewelry-store",imageURL:"https://graph.facebook.com/alexandaniusa/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q16198810",shop:"jewelry"},addTags:{brand:"Alex and Ani","brand:wikidata":"Q16198810","brand:wikipedia":"en:Alex and Ani",name:"Alex and Ani",shop:"jewelry"},terms:[],matchScore:2,suggestion:true},"shop/jewelry/Apart":{name:"Apart",icon:"maki-jewelry-store",imageURL:"https://graph.facebook.com/BizuteriaApart/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11686561",shop:"jewelry"},addTags:{brand:"Apart","brand:wikidata":"Q11686561","brand:wikipedia":"pl:Apart",name:"Apart",shop:"jewelry"},countryCodes:["pl"],terms:[],matchScore:2,suggestion:true},"shop/jewelry/Bijou Brigitte":{name:"Bijou Brigitte",icon:"maki-jewelry-store",imageURL:"https://graph.facebook.com/bijoubrigitte/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q599545",shop:"jewelry"},addTags:{brand:"Bijou Brigitte","brand:wikidata":"Q599545","brand:wikipedia":"de:Bijou Brigitte",name:"Bijou Brigitte",shop:"jewelry"},terms:[],matchScore:2,suggestion:true},"shop/jewelry/Cartier":{name:"Cartier",icon:"maki-jewelry-store",imageURL:"https://graph.facebook.com/cartier.usa/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q538587",shop:"jewelry"},addTags:{brand:"Cartier","brand:wikidata":"Q538587","brand:wikipedia":"en:Cartier (jeweler)",name:"Cartier",shop:"jewelry"},terms:[],matchScore:2,suggestion:true},"shop/jewelry/Christ":{name:"Christ",icon:"maki-jewelry-store",imageURL:"https://graph.facebook.com/juwelierchrist/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1077957",shop:"jewelry"},addTags:{brand:"Christ","brand:wikidata":"Q1077957","brand:wikipedia":"de:Christ (Juwelier)",name:"Christ",shop:"jewelry"},countryCodes:["ch","de","nl"],terms:[],matchScore:2,suggestion:true},"shop/jewelry/Claire's":{name:"Claire's",icon:"maki-jewelry-store",imageURL:"https://graph.facebook.com/claires/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2974996",shop:"jewelry"},addTags:{brand:"Claire's","brand:wikidata":"Q2974996","brand:wikipedia":"en:Claire's",name:"Claire's",shop:"jewelry"},terms:[],matchScore:2,suggestion:true},"shop/jewelry/Ernest Jones":{name:"Ernest Jones",icon:"maki-jewelry-store",imageURL:"https://graph.facebook.com/ernestjonesjewellers/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5393358",shop:"jewelry"},addTags:{brand:"Ernest Jones","brand:wikidata":"Q5393358","brand:wikipedia":"en:Ernest Jones (retailer)",name:"Ernest Jones",shop:"jewelry"},terms:[],matchScore:2,suggestion:true},"shop/jewelry/Guldfynd":{name:"Guldfynd",icon:"maki-jewelry-store",imageURL:"https://graph.facebook.com/Guldfynd/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q49099223",shop:"jewelry"},addTags:{brand:"Guldfynd","brand:wikidata":"Q49099223","brand:wikipedia":"sv:Guldfynd",name:"Guldfynd",shop:"jewelry"},countryCodes:["se"],terms:[],matchScore:2,suggestion:true},"shop/jewelry/H Samuel":{name:"H Samuel",icon:"maki-jewelry-store",imageURL:"https://graph.facebook.com/HSamuelTheJeweller/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5628558",shop:"jewelry"},addTags:{brand:"H Samuel","brand:wikidata":"Q5628558","brand:wikipedia":"en:H. Samuel",name:"H Samuel",shop:"jewelry"},terms:[],matchScore:2,suggestion:true},"shop/jewelry/Histoire d'Or":{name:"Histoire d'Or",icon:"maki-jewelry-store",imageURL:"https://graph.facebook.com/HistoiredOr/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62529245",shop:"jewelry"},addTags:{brand:"Histoire d'Or","brand:wikidata":"Q62529245",name:"Histoire d'Or",shop:"jewelry"},countryCodes:["be","fr","it","nl"],terms:[],matchScore:2,suggestion:true},"shop/jewelry/James Avery Jewelry":{name:"James Avery Jewelry",icon:"maki-jewelry-store",imageURL:"https://graph.facebook.com/JamesAvery/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6129024",shop:"jewelry"},addTags:{brand:"James Avery Jewelry","brand:wikidata":"Q6129024","brand:wikipedia":"en:James Avery Artisan Jewelry",name:"James Avery Jewelry",shop:"jewelry"},terms:[],matchScore:2,suggestion:true},"shop/jewelry/Jared":{name:"Jared",icon:"maki-jewelry-store",imageURL:"https://graph.facebook.com/JaredTheGalleriaOfJewelry/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62029282",shop:"jewelry"},addTags:{brand:"Jared","brand:wikidata":"Q62029282",name:"Jared",operator:"Sterling Jewelers","operator:wikidata":"Q7611434","operator:wikipedia":"en:Sterling Jewelers",shop:"jewelry"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/jewelry/Julien d'Orcel":{name:"Julien d'Orcel",icon:"maki-jewelry-store",imageURL:"https://graph.facebook.com/juliendorcel.bijouteries/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62497463",shop:"jewelry"},addTags:{brand:"Julien d'Orcel","brand:wikidata":"Q62497463",name:"Julien d'Orcel",shop:"jewelry"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"shop/jewelry/Kay Jewelers":{name:"Kay Jewelers",icon:"maki-jewelry-store",imageURL:"https://graph.facebook.com/KayJewelers/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62029290",shop:"jewelry"},addTags:{brand:"Kay Jewelers","brand:wikidata":"Q62029290",name:"Kay Jewelers",operator:"Sterling Jewelers","operator:wikidata":"Q7611434","operator:wikipedia":"en:Sterling Jewelers",shop:"jewelry"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/jewelry/PNJ":{name:"PNJ",icon:"maki-jewelry-store",imageURL:"https://graph.facebook.com/PNJ.COM.VN/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q61129183",shop:"jewelry"},addTags:{brand:"PNJ","brand:wikidata":"Q61129183","brand:wikipedia":"vi:PNJ",name:"PNJ",shop:"jewelry"},terms:[],matchScore:2,suggestion:true},"shop/jewelry/Pandora":{name:"Pandora",icon:"maki-jewelry-store",imageURL:"https://graph.facebook.com/PANDORA.Japan/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2241604",shop:"jewelry"},addTags:{brand:"Pandora","brand:wikidata":"Q2241604","brand:wikipedia":"en:Pandora (jewelry)",name:"Pandora",shop:"jewelry"},terms:[],matchScore:2,suggestion:true},"shop/jewelry/Swarovski":{name:"Swarovski",icon:"maki-jewelry-store",imageURL:"https://graph.facebook.com/SWAROVSKI.NorthAmerica/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q611115",shop:"jewelry"},addTags:{brand:"Swarovski","brand:wikidata":"Q611115","brand:wikipedia":"en:Swarovski",name:"Swarovski",shop:"jewelry"},terms:[],matchScore:2,suggestion:true},"shop/jewelry/Адамас":{name:"Адамас",icon:"maki-jewelry-store",imageURL:"https://graph.facebook.com/adamas.club/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62393709",shop:"jewelry"},addTags:{brand:"Адамас","brand:wikidata":"Q62393709",name:"Адамас",shop:"jewelry"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"shop/kiosk/Lietuvos spauda":{name:"Lietuvos spauda",icon:"maki-shop",imageURL:"https://graph.facebook.com/narvesen.no/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6514414",shop:"kiosk"},addTags:{brand:"Lietuvos spauda","brand:wikidata":"Q6514414","brand:wikipedia":"lt:Lietuvos spauda",name:"Lietuvos spauda",shop:"kiosk"},countryCodes:["lt"],terms:[],matchScore:2,suggestion:true},"shop/kiosk/Narvesen":{name:"Narvesen",icon:"maki-shop",imageURL:"https://graph.facebook.com/narvesen.no/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6514414",shop:"kiosk"},addTags:{brand:"Narvesen","brand:wikidata":"Q6514414","brand:wikipedia":"en:Narvesen",name:"Narvesen",shop:"kiosk"},terms:[],matchScore:2,suggestion:true},"shop/kiosk/Pressbyrån":{name:"Pressbyrån",icon:"maki-shop",imageURL:"https://graph.facebook.com/Pressbyran/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2489072",shop:"kiosk"},addTags:{brand:"Pressbyrån","brand:wikidata":"Q2489072","brand:wikipedia":"en:Pressbyrån",name:"Pressbyrån",shop:"kiosk"},countryCodes:["se"],terms:[],matchScore:2,suggestion:true},"shop/kiosk/R-Kioski":{name:"R-Kioski",icon:"maki-shop",imageURL:"https://graph.facebook.com/rkioski/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1571400",shop:"kiosk"},addTags:{brand:"R-Kioski","brand:wikidata":"Q1571400","brand:wikipedia":"en:R-kioski",name:"R-Kioski",shop:"kiosk"},terms:[],matchScore:2,suggestion:true},"shop/kiosk/Ruch":{name:"Ruch",icon:"maki-shop",imageURL:"https://graph.facebook.com/ruch/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1260314",shop:"kiosk"},addTags:{brand:"Ruch","brand:wikidata":"Q1260314","brand:wikipedia":"pl:Ruch (przedsiębiorstwo)",name:"Ruch",shop:"kiosk"},countryCodes:["pl"],terms:[],matchScore:2,suggestion:true},"shop/kiosk/Tisak":{name:"Tisak",icon:"maki-shop",imageURL:"https://graph.facebook.com/tisakmedia/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q12643627",shop:"kiosk"},addTags:{brand:"Tisak","brand:wikidata":"Q12643627","brand:wikipedia":"hr:Tisak (tvrtka)",name:"Tisak",shop:"kiosk"},terms:[],matchScore:2,suggestion:true},"shop/kiosk/k kiosk":{name:"k kiosk",icon:"maki-shop",imageURL:"https://graph.facebook.com/kkiosk/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q60381703",shop:"kiosk"},addTags:{brand:"k kiosk","brand:wikidata":"Q60381703","brand:wikipedia":"it:K Kiosk",name:"k kiosk",shop:"kiosk"},countryCodes:["ch"],terms:[],matchScore:2,suggestion:true},"shop/kitchen/Cuisinella":{name:"Cuisinella",icon:"maki-shop",imageURL:"https://graph.facebook.com/CuisinellaFR/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3007012",shop:"kitchen"},addTags:{brand:"Cuisinella","brand:wikidata":"Q3007012","brand:wikipedia":"fr:Cuisinella",name:"Cuisinella",shop:"kitchen"},countryCodes:["fr","tn"],terms:[],matchScore:2,suggestion:true},"shop/kitchen/Mobalpa":{name:"Mobalpa",icon:"maki-shop",geometry:["point","area"],tags:{"brand:wikidata":"Q3317571",shop:"kitchen"},addTags:{brand:"Mobalpa","brand:wikidata":"Q3317571","brand:wikipedia":"fr:Mobalpa",name:"Mobalpa",shop:"kitchen"},countryCodes:["be","fr","gb"],terms:[],matchScore:2,suggestion:true},"shop/kitchen/Schmidt":{name:"Schmidt",icon:"maki-shop",imageURL:"https://graph.facebook.com/Schmidt.HomeDesign/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3487620",shop:"kitchen"},addTags:{brand:"Schmidt","brand:wikidata":"Q3487620","brand:wikipedia":"de:Schmidt Groupe",name:"Schmidt",shop:"kitchen"},countryCodes:["be","es","fr","gb"],terms:[],matchScore:2,suggestion:true},"shop/kitchen/SoCoo'c":{name:"SoCoo'c",icon:"maki-shop",geometry:["point","area"],tags:{"brand:wikidata":"Q62783840",shop:"kitchen"},addTags:{brand:"SoCoo'c","brand:wikidata":"Q62783840","brand:wikipedia":"fr:SoCoo'c",name:"SoCoo'c",shop:"kitchen"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"shop/massage/Massage Envy":{name:"Massage Envy",icon:"temaki-spa",imageURL:"https://graph.facebook.com/MassageEnvy/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q22922899",shop:"massage"},addTags:{brand:"Massage Envy","brand:wikidata":"Q22922899","brand:wikipedia":"en:Massage Envy",name:"Massage Envy",shop:"massage"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/medical_supply/Pofam-Poznań":{name:"Pofam-Poznań",icon:"maki-shop",geometry:["point","area"],tags:{"brand:wikidata":"Q62057457",shop:"medical_supply"},addTags:{brand:"Pofam-Poznań","brand:wikidata":"Q62057457",name:"Pofam-Poznań",shop:"medical_supply"},countryCodes:["pl"],terms:[],matchScore:2,suggestion:true},"shop/medical_supply/Ортека":{name:"Ортека",icon:"maki-shop",imageURL:"https://graph.facebook.com/orteka.rus/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62393660",shop:"medical_supply"},addTags:{brand:"Ортека","brand:wikidata":"Q62393660",name:"Ортека",shop:"medical_supply"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"shop/mobile_phone/3 Store":{name:"3 Store",icon:"fas-mobile-alt",imageURL:"https://graph.facebook.com/ThreeUK/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q407009",shop:"mobile_phone"},addTags:{brand:"3 Store","brand:wikidata":"Q407009","brand:wikipedia":"en:3 (telecommunications)",name:"3 Store",shop:"mobile_phone"},terms:["3","three","three store"],matchScore:2,suggestion:true},"shop/mobile_phone/AT&T":{name:"AT&T",icon:"fas-mobile-alt",imageURL:"https://graph.facebook.com/ATT/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q298594",shop:"mobile_phone"},addTags:{brand:"AT&T","brand:wikidata":"Q298594","brand:wikipedia":"en:AT&T Mobility",name:"AT&T",shop:"mobile_phone"},countryCodes:["mx","us"],terms:[],matchScore:2,suggestion:true},"shop/mobile_phone/Bell":{name:"Bell",icon:"fas-mobile-alt",imageURL:"https://graph.facebook.com/BellCanada/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2894594",shop:"mobile_phone"},addTags:{brand:"Bell","brand:wikidata":"Q2894594","brand:wikipedia":"en:Bell Mobility",name:"Bell",shop:"mobile_phone"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"shop/mobile_phone/Bitė":{name:"Bitė",icon:"fas-mobile-alt",geometry:["point","area"],tags:{"brand:wikidata":"Q796010",shop:"mobile_phone"},addTags:{brand:"Bitė","brand:wikidata":"Q796010","brand:wikipedia":"lt:Bitės grupė",name:"Bitė",shop:"mobile_phone"},countryCodes:["lt"],terms:[],matchScore:2,suggestion:true},"shop/mobile_phone/Boost Mobile":{name:"Boost Mobile",icon:"fas-mobile-alt",imageURL:"https://graph.facebook.com/boostmobile/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4943790",shop:"mobile_phone"},addTags:{brand:"Boost Mobile","brand:wikidata":"Q4943790","brand:wikipedia":"en:Boost Mobile",name:"Boost Mobile",shop:"mobile_phone"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/mobile_phone/Carphone Warehouse":{name:"Carphone Warehouse",icon:"fas-mobile-alt",imageURL:"https://graph.facebook.com/carphonewarehouse/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q118046",shop:"mobile_phone"},addTags:{brand:"Carphone Warehouse","brand:wikidata":"Q118046","brand:wikipedia":"en:Carphone Warehouse",name:"Carphone Warehouse",shop:"mobile_phone"},countryCodes:["by","gb","ie"],terms:[],matchScore:2,suggestion:true},"shop/mobile_phone/Claro":{name:"Claro",icon:"fas-mobile-alt",imageURL:"https://graph.facebook.com/ClaroCol/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1770208",shop:"mobile_phone"},addTags:{brand:"Claro","brand:wikidata":"Q1770208","brand:wikipedia":"en:Claro (company)",name:"Claro",shop:"mobile_phone"},terms:[],matchScore:2,suggestion:true},"shop/mobile_phone/Cricket Wireless":{name:"Cricket Wireless",icon:"fas-mobile-alt",imageURL:"https://graph.facebook.com/cricketwireless/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5184987",shop:"mobile_phone"},addTags:{brand:"Cricket Wireless","brand:wikidata":"Q5184987","brand:wikipedia":"en:Cricket Wireless",name:"Cricket Wireless",shop:"mobile_phone"},countryCodes:["us"],terms:["cricket"],matchScore:2,suggestion:true},"shop/mobile_phone/Digicel":{name:"Digicel",icon:"fas-mobile-alt",imageURL:"https://graph.facebook.com/digicel/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2117506",shop:"mobile_phone"},addTags:{brand:"Digicel","brand:wikidata":"Q2117506","brand:wikipedia":"en:Digicel",name:"Digicel",shop:"mobile_phone"},terms:[],matchScore:2,suggestion:true},"shop/mobile_phone/EE":{name:"EE",icon:"fas-mobile-alt",imageURL:"https://graph.facebook.com/ee/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5322942",shop:"mobile_phone"},addTags:{brand:"EE","brand:wikidata":"Q5322942","brand:wikipedia":"en:EE Limited",name:"EE",shop:"mobile_phone"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/mobile_phone/Entel":{name:"Entel",icon:"fas-mobile-alt",imageURL:"https://graph.facebook.com/entelsa/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q450420",shop:"mobile_phone"},addTags:{brand:"Entel","brand:wikidata":"Q450420","brand:wikipedia":"en:Entel (Chile)",name:"Entel",shop:"mobile_phone"},terms:[],matchScore:2,suggestion:true},"shop/mobile_phone/Freedom Mobile":{name:"Freedom Mobile",icon:"fas-mobile-alt",imageURL:"https://graph.facebook.com/frdmmobile/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q8023931",shop:"mobile_phone"},addTags:{brand:"Freedom Mobile","brand:wikidata":"Q8023931","brand:wikipedia":"en:Freedom Mobile",name:"Freedom Mobile",shop:"mobile_phone"},countryCodes:["ca"],terms:["wind mobile"],matchScore:2,suggestion:true},"shop/mobile_phone/MTN":{name:"MTN",icon:"fas-mobile-alt",imageURL:"https://graph.facebook.com/MTN/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1813361",shop:"mobile_phone"},addTags:{brand:"MTN","brand:wikidata":"Q1813361","brand:wikipedia":"en:MTN Group",name:"MTN",shop:"mobile_phone"},terms:["agence mtn"],matchScore:2,suggestion:true},"shop/mobile_phone/MetroPCS":{name:"MetroPCS",icon:"fas-mobile-alt",imageURL:"https://graph.facebook.com/MetroByTMobile/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1925685",shop:"mobile_phone"},addTags:{brand:"MetroPCS","brand:wikidata":"Q1925685","brand:wikipedia":"en:Metro by T-Mobile",name:"MetroPCS",shop:"mobile_phone"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/mobile_phone/Mobilcom Debitel":{name:"Mobilcom Debitel",icon:"fas-mobile-alt",geometry:["point","area"],tags:{"brand:wikidata":"Q344744",shop:"mobile_phone"},addTags:{brand:"Mobilcom Debitel","brand:wikidata":"Q344744","brand:wikipedia":"en:Debitel",name:"Mobilcom Debitel",shop:"mobile_phone"},countryCodes:["de","ir"],terms:["debitel"],matchScore:2,suggestion:true},"shop/mobile_phone/Moov":{name:"Moov",icon:"fas-mobile-alt",imageURL:"https://graph.facebook.com/moovcotedivoire/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3323637",shop:"mobile_phone"},addTags:{brand:"Moov","brand:wikidata":"Q3323637","brand:wikipedia":"fr:Moov Côte d'Ivoire",name:"Moov",shop:"mobile_phone"},countryCodes:["ci","tg"],terms:["agence moov"],matchScore:2,suggestion:true},"shop/mobile_phone/Movistar":{name:"Movistar",icon:"fas-mobile-alt",imageURL:"https://graph.facebook.com/movistar.es/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q967735",shop:"mobile_phone"},addTags:{brand:"Movistar","brand:wikidata":"Q967735","brand:wikipedia":"en:Movistar",name:"Movistar",shop:"mobile_phone"},terms:[],matchScore:2,suggestion:true},"shop/mobile_phone/O2":{name:"O2",icon:"fas-mobile-alt",imageURL:"https://graph.facebook.com/o2uk/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7072246",shop:"mobile_phone"},addTags:{brand:"O2","brand:wikidata":"Q7072246","brand:wikipedia":"en:O2 (Ireland)",name:"O2",shop:"mobile_phone"},countryCodes:["cz","de","gb","ie","sk"],terms:[],matchScore:2,suggestion:true},"shop/mobile_phone/Optie1":{name:"Optie1",icon:"fas-mobile-alt",imageURL:"https://graph.facebook.com/Optie1/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62393564",shop:"mobile_phone"},addTags:{brand:"Optie1","brand:wikidata":"Q62393564",name:"Optie1",shop:"mobile_phone"},countryCodes:["nl"],terms:[],matchScore:2,suggestion:true},"shop/mobile_phone/Orange":{name:"Orange",icon:"fas-mobile-alt",imageURL:"https://graph.facebook.com/orange/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1431486",shop:"mobile_phone"},addTags:{brand:"Orange","brand:wikidata":"Q1431486","brand:wikipedia":"fr:Orange (entreprise)",name:"Orange",shop:"mobile_phone"},terms:["agence orange"],matchScore:2,suggestion:true},"shop/mobile_phone/Personal":{name:"Personal",icon:"fas-mobile-alt",imageURL:"https://graph.facebook.com/personalargentina/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q10933021",shop:"mobile_phone"},addTags:{brand:"Personal","brand:wikidata":"Q10933021","brand:wikipedia":"es:Personal (Argentina)",name:"Personal",shop:"mobile_phone"},countryCodes:["ar","py"],terms:[],matchScore:2,suggestion:true},"shop/mobile_phone/Phone House":{name:"Phone House",icon:"fas-mobile-alt",imageURL:"https://graph.facebook.com/carphonewarehouse/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q118046",shop:"mobile_phone"},addTags:{brand:"Phone House","brand:wikidata":"Q118046","brand:wikipedia":"en:Carphone Warehouse",name:"Phone House",shop:"mobile_phone"},terms:["the phone house"],matchScore:2,suggestion:true},"shop/mobile_phone/Play":{name:"Play",icon:"fas-mobile-alt",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FPlay%20logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q7202998",shop:"mobile_phone"},addTags:{brand:"Play","brand:wikidata":"Q7202998","brand:wikipedia":"pl:Play (sieć telefonii komórkowej)",name:"Play",shop:"mobile_phone"},countryCodes:["pl"],terms:[],matchScore:2,suggestion:true},"shop/mobile_phone/Plus":{name:"Plus",icon:"fas-mobile-alt",imageURL:"https://graph.facebook.com/plus/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7205598",shop:"mobile_phone"},addTags:{brand:"Plus","brand:wikidata":"Q7205598","brand:wikipedia":"pl:Plus (sieć telefonii komórkowej)",name:"Plus",shop:"mobile_phone"},countryCodes:["pl"],terms:[],matchScore:2,suggestion:true},"shop/mobile_phone/Rogers":{name:"Rogers",icon:"fas-mobile-alt",imageURL:"https://graph.facebook.com/Rogers/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3439663",shop:"mobile_phone"},addTags:{brand:"Rogers","brand:wikidata":"Q3439663","brand:wikipedia":"en:Rogers Wireless",name:"Rogers",shop:"mobile_phone"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"shop/mobile_phone/SFR":{name:"SFR",icon:"fas-mobile-alt",imageURL:"https://graph.facebook.com/SFR/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q218765",shop:"mobile_phone"},addTags:{brand:"SFR","brand:wikidata":"Q218765","brand:wikipedia":"en:SFR",name:"SFR",shop:"mobile_phone"},countryCodes:["fr","lu"],terms:["espace sfr"],matchScore:2,suggestion:true},"shop/mobile_phone/Sprint":{name:"Sprint",icon:"fas-mobile-alt",imageURL:"https://graph.facebook.com/sprint/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q301965",shop:"mobile_phone"},addTags:{brand:"Sprint","brand:wikidata":"Q301965","brand:wikipedia":"en:Sprint Corporation",name:"Sprint",shop:"mobile_phone"},terms:[],matchScore:2,suggestion:true},"shop/mobile_phone/T-Mobile":{name:"T-Mobile",icon:"fas-mobile-alt",imageURL:"https://graph.facebook.com/TMobile/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q327634",shop:"mobile_phone"},addTags:{brand:"T-Mobile","brand:wikidata":"Q327634","brand:wikipedia":"en:T-Mobile",name:"T-Mobile",shop:"mobile_phone"},terms:[],matchScore:2,suggestion:true},"shop/mobile_phone/TIM":{name:"TIM",icon:"fas-mobile-alt",imageURL:"https://graph.facebook.com/TimOfficialPage/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q144617",shop:"mobile_phone"},addTags:{brand:"TIM","brand:wikidata":"Q144617","brand:wikipedia":"en:Telecom Italia",name:"TIM",shop:"mobile_phone"},countryCodes:["br","it"],terms:[],matchScore:2,suggestion:true},"shop/mobile_phone/Telcel":{name:"Telcel",icon:"fas-mobile-alt",imageURL:"https://graph.facebook.com/Telcel/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3517255",shop:"mobile_phone"},addTags:{brand:"Telcel","brand:wikidata":"Q3517255","brand:wikipedia":"en:Telcel",name:"Telcel",shop:"mobile_phone"},countryCodes:["cu","mx"],terms:[],matchScore:2,suggestion:true},"shop/mobile_phone/Tele2":{name:"Tele2",icon:"fas-mobile-alt",imageURL:"https://graph.facebook.com/WeAreTele2/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q309865",shop:"mobile_phone"},addTags:{brand:"Tele2","brand:wikidata":"Q309865","brand:wikipedia":"en:Tele2",name:"Tele2",shop:"mobile_phone"},terms:[],matchScore:2,suggestion:true},"shop/mobile_phone/Telekom":{name:"Telekom",icon:"fas-mobile-alt",imageURL:"https://graph.facebook.com/deutschetelekom/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q9396",shop:"mobile_phone"},addTags:{brand:"Telekom","brand:wikidata":"Q9396","brand:wikipedia":"en:Deutsche Telekom",name:"Telekom",shop:"mobile_phone"},countryCodes:["de","hu","ro","si","sk"],terms:["telekom shop"],matchScore:2,suggestion:true},"shop/mobile_phone/Telenor":{name:"Telenor",icon:"fas-mobile-alt",imageURL:"https://graph.facebook.com/telenorgroup/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q845632",shop:"mobile_phone"},addTags:{brand:"Telenor","brand:wikidata":"Q845632","brand:wikipedia":"en:Telenor",name:"Telenor",shop:"mobile_phone"},terms:[],matchScore:2,suggestion:true},"shop/mobile_phone/Telstra":{name:"Telstra",icon:"fas-mobile-alt",imageURL:"https://graph.facebook.com/Telstra/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q721162",shop:"mobile_phone"},addTags:{brand:"Telstra","brand:wikidata":"Q721162","brand:wikipedia":"en:Telstra",name:"Telstra",shop:"mobile_phone"},countryCodes:["au"],terms:[],matchScore:2,suggestion:true},"shop/mobile_phone/Telus":{name:"Telus",icon:"fas-mobile-alt",imageURL:"https://graph.facebook.com/telus/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q165858",shop:"mobile_phone"},addTags:{brand:"Telus","brand:wikidata":"Q165858","brand:wikipedia":"en:Telus",name:"Telus",shop:"mobile_phone"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"shop/mobile_phone/Turkcell":{name:"Turkcell",icon:"fas-mobile-alt",imageURL:"https://graph.facebook.com/Turkcell/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q283852",shop:"mobile_phone"},addTags:{brand:"Turkcell","brand:wikidata":"Q283852","brand:wikipedia":"en:Turkcell",name:"Turkcell",shop:"mobile_phone"},countryCodes:["cy","tr"],terms:[],matchScore:2,suggestion:true},"shop/mobile_phone/U.S. Cellular":{name:"U.S. Cellular",icon:"fas-mobile-alt",imageURL:"https://graph.facebook.com/USCellular/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2466256",shop:"mobile_phone"},addTags:{brand:"U.S. Cellular","brand:wikidata":"Q2466256","brand:wikipedia":"en:U.S. Cellular",name:"U.S. Cellular",shop:"mobile_phone"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/mobile_phone/Verizon Wireless":{name:"Verizon Wireless",icon:"fas-mobile-alt",imageURL:"https://graph.facebook.com/verizon/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q919641",shop:"mobile_phone"},addTags:{brand:"Verizon Wireless","brand:wikidata":"Q919641","brand:wikipedia":"en:Verizon Wireless",name:"Verizon Wireless",shop:"mobile_phone"},countryCodes:["us"],terms:["verizon"],matchScore:2,suggestion:true},"shop/mobile_phone/Vodafone":{name:"Vodafone",icon:"fas-mobile-alt",imageURL:"https://graph.facebook.com/vodafoneUK/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q122141",shop:"mobile_phone"},addTags:{brand:"Vodafone","brand:wikidata":"Q122141","brand:wikipedia":"en:Vodafone",name:"Vodafone",shop:"mobile_phone"},terms:["vodafone shop"],matchScore:2,suggestion:true},"shop/mobile_phone/WIFI_ETECSA":{name:"WIFI_ETECSA",icon:"fas-mobile-alt",imageURL:"https://graph.facebook.com/etecsa.cu/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q490323",shop:"mobile_phone"},addTags:{brand:"WIFI_ETECSA","brand:wikidata":"Q490323","brand:wikipedia":"es:Empresa de Telecomunicaciones de Cuba",name:"WIFI_ETECSA",shop:"mobile_phone"},countryCodes:["cu"],terms:[],matchScore:2,suggestion:true},"shop/mobile_phone/Wind":{name:"Wind",icon:"fas-mobile-alt",imageURL:"https://graph.facebook.com/Wind/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q650467",shop:"mobile_phone"},addTags:{brand:"Wind","brand:wikidata":"Q650467","brand:wikipedia":"en:WIND (Italy)",name:"Wind",shop:"mobile_phone"},countryCodes:["it"],terms:[],matchScore:2,suggestion:true},"shop/mobile_phone/Yoigo":{name:"Yoigo",icon:"fas-mobile-alt",imageURL:"https://graph.facebook.com/Yoigo/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2630989",shop:"mobile_phone"},addTags:{brand:"Yoigo","brand:wikidata":"Q2630989","brand:wikipedia":"en:Yoigo",name:"Yoigo",shop:"mobile_phone"},countryCodes:["es"],terms:[],matchScore:2,suggestion:true},"shop/mobile_phone/auショップ":{name:"auショップ",icon:"fas-mobile-alt",imageURL:"https://graph.facebook.com/aubyKDDI/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q307110",shop:"mobile_phone"},addTags:{brand:"au","brand:ja":"au","brand:wikidata":"Q307110","brand:wikipedia":"ja:Au (携帯電話)",name:"auショップ","name:en":"au","name:ja":"auショップ",shop:"mobile_phone"},countryCodes:["jp"],terms:["au"],matchScore:2,suggestion:true},"shop/mobile_phone/Алло":{name:"Алло",icon:"fas-mobile-alt",imageURL:"https://graph.facebook.com/allo/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q18683057",shop:"mobile_phone"},addTags:{brand:"Алло","brand:wikidata":"Q18683057","brand:wikipedia":"uk:Алло (торгова мережа)",name:"Алло",shop:"mobile_phone"},countryCodes:["md","ua"],terms:[],matchScore:2,suggestion:true},"shop/mobile_phone/Билайн":{name:"Билайн",icon:"fas-mobile-alt",imageURL:"https://graph.facebook.com/Beelinerus/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q402880",shop:"mobile_phone"},addTags:{brand:"Билайн","brand:en":"Beeline","brand:wikidata":"Q402880","brand:wikipedia":"en:Beeline (brand)",name:"Билайн","name:en":"Beeline",shop:"mobile_phone"},terms:[],matchScore:2,suggestion:true},"shop/mobile_phone/Евросеть":{name:"Евросеть",icon:"fas-mobile-alt",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FEuroset.png&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q65310",shop:"mobile_phone"},addTags:{brand:"Евросеть","brand:en":"Euroset","brand:wikidata":"Q65310","brand:wikipedia":"en:Euroset",name:"Евросеть","name:en":"Euroset",shop:"mobile_phone"},countryCodes:["by","kz","ru","ua"],terms:[],matchScore:2,suggestion:true},"shop/mobile_phone/Київстар":{name:"Київстар",icon:"fas-mobile-alt",imageURL:"https://graph.facebook.com/kyivstar/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2288463",shop:"mobile_phone"},addTags:{brand:"Київстар","brand:en":"Kyivstar","brand:wikidata":"Q2288463","brand:wikipedia":"en:Kyivstar",name:"Київстар","name:en":"Kyivstar",shop:"mobile_phone"},countryCodes:["ua"],terms:[],matchScore:2,suggestion:true},"shop/mobile_phone/МТС":{name:"МТС",icon:"fas-mobile-alt",imageURL:"https://graph.facebook.com/mts/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1368919",shop:"mobile_phone"},addTags:{brand:"МТС","brand:en":"MTS","brand:wikidata":"Q1368919","brand:wikipedia":"en:MTS (network provider)",name:"МТС","name:en":"MTS",shop:"mobile_phone"},countryCodes:["by","ru","ua"],terms:[],matchScore:2,suggestion:true},"shop/mobile_phone/Мегафон":{name:"Мегафон",icon:"fas-mobile-alt",imageURL:"https://graph.facebook.com/MegaFon.ru/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1720713",shop:"mobile_phone"},addTags:{brand:"Мегафон","brand:en":"MegaFon","brand:wikidata":"Q1720713","brand:wikipedia":"en:MegaFon",name:"Мегафон","name:en":"MegaFon",shop:"mobile_phone"},countryCodes:["ru","tj"],terms:[],matchScore:2,suggestion:true},"shop/mobile_phone/Связной":{name:"Связной",icon:"fas-mobile-alt",imageURL:"https://graph.facebook.com/svyaznoy.ru/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q65371",shop:"mobile_phone"},addTags:{brand:"Связной","brand:en":"Svyaznoy","brand:wikidata":"Q65371","brand:wikipedia":"en:Svyaznoy",name:"Связной","name:en":"Svyaznoy",shop:"mobile_phone"},countryCodes:["by","ru","uz"],terms:[],matchScore:2,suggestion:true},"shop/mobile_phone/Теле2":{name:"Теле2",icon:"fas-mobile-alt",imageURL:"https://graph.facebook.com/WeAreTele2/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q309865",shop:"mobile_phone"},addTags:{brand:"Теле2","brand:en":"Tele2","brand:wikidata":"Q309865","brand:wikipedia":"en:Tele2",name:"Теле2","name:en":"Tele2",shop:"mobile_phone"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"shop/mobile_phone/ソフトバンク":{name:"ソフトバンク",icon:"fas-mobile-alt",imageURL:"https://graph.facebook.com/SoftBank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7553832",shop:"mobile_phone"},addTags:{brand:"ソフトバンク","brand:en":"SoftBank Telecom","brand:ja":"ソフトバンク","brand:wikidata":"Q7553832","brand:wikipedia":"en:SoftBank Telecom",name:"ソフトバンク","name:en":"SoftBank Telecom","name:ja":"ソフトバンク",shop:"mobile_phone"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/mobile_phone/ソフトバンクショップ":{name:"ソフトバンクショップ",icon:"fas-mobile-alt",imageURL:"https://graph.facebook.com/SoftBank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11315281",shop:"mobile_phone"},addTags:{brand:"ソフトバンクショップ","brand:en":"SoftBankShop","brand:ja":"ソフトバンクショップ","brand:wikidata":"Q11315281","brand:wikipedia":"ja:ソフトバンクショップ",name:"ソフトバンクショップ","name:en":"SoftBankShop","name:ja":"ソフトバンクショップ",shop:"mobile_phone"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/mobile_phone/ドコモショップ":{name:"ドコモショップ",icon:"fas-mobile-alt",imageURL:"https://graph.facebook.com/docomo.official/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q853958",shop:"mobile_phone"},addTags:{brand:"ドコモショップ","brand:en":"DoCoMo Shop","brand:ja":"ドコモショップ","brand:wikidata":"Q853958","brand:wikipedia":"ja:NTTドコモ",name:"ドコモショップ","name:en":"DoCoMo Shop","name:ja":"ドコモショップ",shop:"mobile_phone"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/money_lender/Cash Store":{name:"Cash Store",icon:"maki-bank",imageURL:"https://graph.facebook.com/cashstore/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q61943411",shop:"money_lender"},addTags:{brand:"Cash Store","brand:wikidata":"Q61943411",name:"Cash Store",shop:"money_lender"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/money_lender/Check Into Cash":{name:"Check Into Cash",icon:"maki-bank",imageURL:"https://graph.facebook.com/checkintocash/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q16961246",shop:"money_lender"},addTags:{brand:"Check Into Cash","brand:wikidata":"Q16961246","brand:wikipedia":"en:Check Into Cash",name:"Check Into Cash",shop:"money_lender"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/money_lender/Money Mart":{name:"Money Mart",icon:"maki-bank",imageURL:"https://graph.facebook.com/moneymartusa/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6899166",shop:"money_lender"},addTags:{brand:"Money Mart","brand:wikidata":"Q6899166","brand:wikipedia":"en:Money Mart",name:"Money Mart",shop:"money_lender"},terms:[],matchScore:2,suggestion:true},"shop/motorcycle/Harley-Davidson":{name:"Harley-Davidson",icon:"fas-motorcycle",imageURL:"https://graph.facebook.com/harley-davidson/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q192814",shop:"motorcycle"},addTags:{brand:"Harley-Davidson","brand:wikidata":"Q192814","brand:wikipedia":"en:Harley-Davidson",name:"Harley-Davidson",shop:"motorcycle"},terms:[],matchScore:2,suggestion:true},"shop/motorcycle/Honda":{name:"Honda",icon:"fas-motorcycle",imageURL:"https://graph.facebook.com/HondaJP/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q9584",shop:"motorcycle"},addTags:{brand:"Honda","brand:wikidata":"Q9584","brand:wikipedia":"en:Honda",name:"Honda",shop:"motorcycle"},terms:[],matchScore:2,suggestion:true},"shop/motorcycle/Kawasaki":{name:"Kawasaki",icon:"fas-motorcycle",imageURL:"https://graph.facebook.com/kawasaki/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6379855",shop:"motorcycle"},addTags:{brand:"Kawasaki","brand:wikidata":"Q6379855","brand:wikipedia":"en:Kawasaki motorcycles",name:"Kawasaki",shop:"motorcycle"},terms:[],matchScore:2,suggestion:true},"shop/motorcycle/Motortrade":{name:"Motortrade",icon:"fas-motorcycle",imageURL:"https://graph.facebook.com/MotortradePh/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q48803162",shop:"motorcycle"},addTags:{brand:"Motortrade","brand:wikidata":"Q48803162","brand:wikipedia":"en:Motortrade",name:"Motortrade",shop:"motorcycle"},countryCodes:["ph"],terms:[],matchScore:2,suggestion:true},"shop/motorcycle/Suzuki":{name:"Suzuki",icon:"fas-motorcycle",imageURL:"https://graph.facebook.com/SuzukiGlobalOfficial/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q181642",shop:"motorcycle"},addTags:{brand:"Suzuki","brand:wikidata":"Q181642","brand:wikipedia":"en:Suzuki",name:"Suzuki",shop:"motorcycle"},terms:[],matchScore:2,suggestion:true},"shop/motorcycle/Yamaha":{name:"Yamaha",icon:"fas-motorcycle",imageURL:"https://graph.facebook.com/yamahamotorusa/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q158888",shop:"motorcycle"},addTags:{brand:"Yamaha","brand:wikidata":"Q158888","brand:wikipedia":"en:Yamaha Motor Company",name:"Yamaha",shop:"motorcycle"},terms:[],matchScore:2,suggestion:true},"shop/music/HMV":{name:"HMV",icon:"fas-compact-disc",imageURL:"https://graph.facebook.com/hmv/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q10854572",shop:"music"},addTags:{brand:"HMV","brand:wikidata":"Q10854572","brand:wikipedia":"en:HMV",name:"HMV",shop:"music"},terms:[],matchScore:2,suggestion:true},"shop/music/TSUTAYA":{name:"TSUTAYA",icon:"fas-compact-disc",imageURL:"https://pbs.twimg.com/profile_images/1016247734720851968/R9agm3pA_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q5193457",shop:"music"},addTags:{brand:"TSUTAYA","brand:wikidata":"Q5193457","brand:wikipedia":"ja:カルチュア・コンビニエンス・クラブ",name:"TSUTAYA",shop:"music"},terms:[],matchScore:2,suggestion:true},"shop/musical_instrument/Guitar Center":{name:"Guitar Center",icon:"fas-guitar",imageURL:"https://graph.facebook.com/GuitarCenter/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3622794",shop:"musical_instrument"},addTags:{brand:"Guitar Center","brand:wikidata":"Q3622794","brand:wikipedia":"en:Guitar Center",name:"Guitar Center",shop:"musical_instrument"},terms:[],matchScore:2,suggestion:true},"shop/newsagent/Cigo":{name:"Cigo",icon:"fas-newspaper",imageURL:"https://graph.facebook.com/cigo.nl/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62391977",shop:"newsagent"},addTags:{brand:"Cigo","brand:wikidata":"Q62391977",name:"Cigo",shop:"newsagent"},countryCodes:["de","nl"],terms:[],matchScore:2,suggestion:true},"shop/newsagent/Kolporter":{name:"Kolporter",icon:"fas-newspaper",geometry:["point","area"],tags:{"brand:wikidata":"Q6427874",shop:"kiosk"},addTags:{brand:"Kolporter","brand:wikidata":"Q6427874","brand:wikipedia":"pl:Kolporter (przedsiębiorstwo)",name:"Kolporter",shop:"kiosk"},countryCodes:["pl"],terms:[],matchScore:2,suggestion:true},"shop/newsagent/Maison de la Presse":{name:"Maison de la Presse",icon:"fas-newspaper",imageURL:"https://graph.facebook.com/260230084083052/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62085960",shop:"newsagent"},addTags:{brand:"Maison de la Presse","brand:wikidata":"Q62085960",name:"Maison de la Presse",shop:"newsagent"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"shop/newsagent/Martin's":{name:"Martin's",icon:"fas-newspaper",imageURL:"https://graph.facebook.com/YourMcColls/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q16997477",shop:"newsagent"},addTags:{brand:"Martin's","brand:wikidata":"Q16997477","brand:wikipedia":"en:McColl's",name:"Martin's",shop:"newsagent"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/newsagent/Primera":{name:"Primera",icon:"fas-newspaper",imageURL:"https://graph.facebook.com/Primera.nl/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2176149",shop:"newsagent"},addTags:{brand:"Primera","brand:wikidata":"Q2176149","brand:wikipedia":"nl:Primera (winkelketen)",name:"Primera",shop:"newsagent"},countryCodes:["nl"],terms:[],matchScore:2,suggestion:true},"shop/newsagent/Relay":{name:"Relay",icon:"fas-newspaper",geometry:["point","area"],tags:{"brand:wikidata":"Q3424298",shop:"newsagent"},addTags:{brand:"Relay","brand:wikidata":"Q3424298","brand:wikipedia":"en:Relay (shop)",name:"Relay",shop:"newsagent"},terms:[],matchScore:2,suggestion:true},"shop/newsagent/WHSmith":{name:"WHSmith",icon:"fas-newspaper",imageURL:"https://graph.facebook.com/WHSmithuk/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1548712",shop:"newsagent"},addTags:{brand:"WHSmith","brand:wikidata":"Q1548712","brand:wikipedia":"en:WHSmith",name:"WHSmith",shop:"newsagent"},terms:[],matchScore:2,suggestion:true},"shop/newsagent/k kiosk":{name:"k kiosk",icon:"fas-newspaper",imageURL:"https://graph.facebook.com/kkiosk/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q60381703",shop:"newsagent"},addTags:{brand:"k kiosk","brand:wikidata":"Q60381703","brand:wikipedia":"it:K Kiosk",name:"k kiosk",shop:"newsagent"},countryCodes:["ch"],terms:[],matchScore:2,suggestion:true},"shop/newsagent/Белсоюзпечать":{name:"Белсоюзпечать",icon:"fas-newspaper",geometry:["point","area"],tags:{"brand:wikidata":"Q4430611",shop:"newsagent"},addTags:{brand:"Белсоюзпечать","brand:wikidata":"Q4430611","brand:wikipedia":"ru:Союзпечать",name:"Белсоюзпечать",shop:"newsagent"},countryCodes:["by"],terms:[],matchScore:2,suggestion:true},"shop/newsagent/Витебскоблсоюзпечать":{name:"Витебскоблсоюзпечать",icon:"fas-newspaper",geometry:["point","area"],tags:{"brand:wikidata":"Q4430611",shop:"newsagent"},addTags:{brand:"Витебскоблсоюзпечать","brand:wikidata":"Q4430611","brand:wikipedia":"ru:Союзпечать",name:"Витебскоблсоюзпечать",shop:"newsagent"},countryCodes:["by"],terms:[],matchScore:2,suggestion:true},"shop/newsagent/Первая полоса":{name:"Первая полоса",icon:"fas-newspaper",geometry:["point","area"],tags:{"brand:wikidata":"Q62736412",shop:"newsagent"},addTags:{brand:"Первая полоса","brand:wikidata":"Q62736412",name:"Первая полоса",shop:"newsagent"},terms:[],matchScore:2,suggestion:true},"shop/newsagent/Союзпечать":{name:"Союзпечать",icon:"fas-newspaper",geometry:["point","area"],tags:{"brand:wikidata":"Q4430611",shop:"newsagent"},addTags:{brand:"Союзпечать","brand:wikidata":"Q4430611","brand:wikipedia":"ru:Союзпечать",name:"Союзпечать",shop:"newsagent"},countryCodes:["by","kz","ru","ua"],terms:[],matchScore:2,suggestion:true},"shop/newsagent/読売新聞":{name:"読売新聞",icon:"fas-newspaper",imageURL:"https://pbs.twimg.com/profile_images/1091035339232227328/elp0X_L6_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q645218",shop:"newsagent"},addTags:{brand:"読売新聞","brand:en":"Yomiuri Shimbun","brand:wikidata":"Q645218","brand:wikipedia":"en:Yomiuri Shimbun",name:"読売新聞","name:en":"Yomiuri Shimbun",shop:"newsagent"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/nutrition_supplements/GNC":{name:"GNC",icon:"maki-shop",imageURL:"https://graph.facebook.com/GNCLiveWell/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4808595",shop:"nutrition_supplements"},addTags:{brand:"GNC","brand:wikidata":"Q4808595","brand:wikipedia":"en:GNC (store)",name:"GNC",shop:"nutrition_supplements"},terms:[],matchScore:2,suggestion:true},"shop/nutrition_supplements/The Vitamin Shoppe":{name:"The Vitamin Shoppe",icon:"maki-shop",imageURL:"https://graph.facebook.com/THEVITAMINSHOPPE/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7772938",shop:"nutrition_supplements"},addTags:{brand:"The Vitamin Shoppe","brand:wikidata":"Q7772938","brand:wikipedia":"en:The Vitamin Shoppe",name:"The Vitamin Shoppe",shop:"nutrition_supplements"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/optician/Alain Afflelou":{name:"Alain Afflelou",icon:"maki-optician",imageURL:"https://graph.facebook.com/AlainAfflelouOptico/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2829511",shop:"optician"},addTags:{brand:"Alain Afflelou","brand:wikidata":"Q2829511","brand:wikipedia":"fr:Alain Afflelou (entreprise)",name:"Alain Afflelou",shop:"optician"},terms:[],matchScore:2,suggestion:true},"shop/optician/America's Best Contacts & Eyeglasses":{name:"America's Best Contacts & Eyeglasses",icon:"maki-optician",imageURL:"https://graph.facebook.com/AmericasBestContactsandEyeglasses/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4742504",shop:"optician"},addTags:{brand:"America's Best Contacts & Eyeglasses","brand:wikidata":"Q4742504","brand:wikipedia":"en:America's Best Contacts & Eyeglasses",name:"America's Best Contacts & Eyeglasses",shop:"optician"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/optician/Apollo":{name:"Apollo",icon:"maki-optician",imageURL:"https://graph.facebook.com/ApolloOptik/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q618940",shop:"optician"},addTags:{brand:"Apollo","brand:wikidata":"Q618940","brand:wikipedia":"de:Apollo-Optik",name:"Apollo",shop:"optician"},countryCodes:["de"],terms:["apollo optik"],matchScore:2,suggestion:true},"shop/optician/Atol":{name:"Atol",icon:"maki-optician",imageURL:"https://graph.facebook.com/opticiensatol/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2869542",shop:"optician"},addTags:{brand:"Atol","brand:wikidata":"Q2869542","brand:wikipedia":"fr:Atol (opticien)",name:"Atol",shop:"optician"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"shop/optician/Boots Opticians":{name:"Boots Opticians",icon:"maki-optician",imageURL:"https://graph.facebook.com/BootsUK/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4944037",shop:"optician"},addTags:{brand:"Boots Opticians","brand:wikidata":"Q4944037","brand:wikipedia":"en:Boots Opticians",name:"Boots Opticians",shop:"optician"},terms:[],matchScore:2,suggestion:true},"shop/optician/Eye Wish":{name:"Eye Wish",icon:"maki-optician",imageURL:"https://graph.facebook.com/EyeWishOpticiens/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62391641",shop:"optician"},addTags:{brand:"Eye Wish","brand:wikidata":"Q62391641",name:"Eye Wish",operator:"GrandVision","operator:wikidata":"Q15812731","operator:wikipedia":"nl:GrandVision",shop:"optician"},countryCodes:["nl"],terms:[],matchScore:2,suggestion:true},"shop/optician/Fielmann":{name:"Fielmann",icon:"maki-optician",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2F160506%20Fielmann%20LogoNEU%20pos%20wiki.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q457822",shop:"optician"},addTags:{brand:"Fielmann","brand:wikidata":"Q457822","brand:wikipedia":"en:Fielmann",name:"Fielmann",shop:"optician"},terms:[],matchScore:2,suggestion:true},"shop/optician/General Óptica":{name:"General Óptica",icon:"maki-optician",imageURL:"https://graph.facebook.com/generaloptica/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62391672",shop:"optician"},addTags:{brand:"General Óptica","brand:wikidata":"Q62391672",name:"General Óptica",shop:"optician"},countryCodes:["es"],terms:[],matchScore:2,suggestion:true},"shop/optician/Grand Optical":{name:"Grand Optical",icon:"maki-optician",imageURL:"https://graph.facebook.com/grandoptical/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3113677",shop:"optician"},addTags:{brand:"Grand Optical","brand:wikidata":"Q3113677","brand:wikipedia":"fr:Grand Optical",name:"Grand Optical",shop:"optician"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"shop/optician/Générale d'Optique":{name:"Générale d'Optique",icon:"maki-optician",imageURL:"https://graph.facebook.com/generaledoptique/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62391701",shop:"optician"},addTags:{brand:"Générale d'Optique","brand:wikidata":"Q62391701",name:"Générale d'Optique",shop:"optician"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"shop/optician/Hakim Optical":{name:"Hakim Optical",icon:"maki-optician",imageURL:"https://graph.facebook.com/HakimOptical/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q28232761",shop:"optician"},addTags:{brand:"Hakim Optical","brand:wikidata":"Q28232761","brand:wikipedia":"en:Hakim Optical",name:"Hakim Optical",shop:"optician"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"shop/optician/Hans Anders":{name:"Hans Anders",icon:"maki-optician",imageURL:"https://graph.facebook.com/hansanders.nl/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1884976",shop:"optician"},addTags:{brand:"Hans Anders","brand:wikidata":"Q1884976","brand:wikipedia":"nl:Hans Anders",name:"Hans Anders",shop:"optician"},terms:[],matchScore:2,suggestion:true},"shop/optician/Instrumentarium":{name:"Instrumentarium",icon:"maki-optician",imageURL:"https://graph.facebook.com/instru.fi/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11864937",shop:"optician"},addTags:{brand:"Instrumentarium","brand:wikidata":"Q11864937","brand:wikipedia":"fi:Instrumentarium",name:"Instrumentarium",shop:"optician"},countryCodes:["fi"],terms:[],matchScore:2,suggestion:true},"shop/optician/Krys":{name:"Krys",icon:"maki-optician",imageURL:"https://graph.facebook.com/Krys/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3119538",shop:"optician"},addTags:{brand:"Krys","brand:wikidata":"Q3119538","brand:wikipedia":"fr:Krys Group",name:"Krys",shop:"optician"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"shop/optician/LensCrafters":{name:"LensCrafters",icon:"maki-optician",imageURL:"https://graph.facebook.com/LensCrafters/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6523209",shop:"optician"},addTags:{brand:"LensCrafters","brand:wikidata":"Q6523209","brand:wikipedia":"en:LensCrafters",name:"LensCrafters",shop:"optician"},terms:[],matchScore:2,suggestion:true},"shop/optician/Les Opticiens Mutualistes":{name:"Les Opticiens Mutualistes",icon:"maki-optician",imageURL:"https://graph.facebook.com/lesopticiensmutualistes.officiel/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q18414551",shop:"optician"},addTags:{brand:"Les Opticiens Mutualistes","brand:wikidata":"Q18414551","brand:wikipedia":"fr:Les Opticiens Mutualistes",name:"Les Opticiens Mutualistes",shop:"optician"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"shop/optician/Lissac":{name:"Lissac",icon:"maki-optician",imageURL:"https://graph.facebook.com/lissac.opticien/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q63102559",shop:"optician"},addTags:{brand:"Lissac","brand:wikidata":"Q63102559",name:"Lissac",shop:"optician"},terms:[],matchScore:2,suggestion:true},"shop/optician/Multiópticas (Portugal)":{name:"Multiópticas (Portugal)",icon:"maki-optician",imageURL:"https://graph.facebook.com/MultiOpticasPortugal/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62391722",shop:"optician"},addTags:{brand:"Multiópticas","brand:wikidata":"Q62391722",name:"Multiópticas",shop:"optician"},countryCodes:["pt"],terms:[],matchScore:2,suggestion:true},"shop/optician/Multiópticas (Spain)":{name:"Multiópticas (Spain)",icon:"maki-optician",imageURL:"https://graph.facebook.com/Multiopticas/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62391719",shop:"optician"},addTags:{brand:"Multiópticas","brand:wikidata":"Q62391719",name:"Multiópticas",shop:"optician"},countryCodes:["es"],terms:[],matchScore:2,suggestion:true},"shop/optician/Oakley":{name:"Oakley",icon:"maki-optician",imageURL:"https://graph.facebook.com/Oakley/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q161906",shop:"optician"},addTags:{brand:"Oakley","brand:wikidata":"Q161906","brand:wikipedia":"en:Oakley, Inc.",name:"Oakley",shop:"optician"},terms:[],matchScore:2,suggestion:true},"shop/optician/Optic 2000":{name:"Optic 2000",icon:"maki-optician",imageURL:"https://graph.facebook.com/optic2000/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3354445",shop:"optician"},addTags:{brand:"Optic 2000","brand:wikidata":"Q3354445","brand:wikipedia":"fr:Optic 2000",name:"Optic 2000",shop:"optician"},terms:[],matchScore:2,suggestion:true},"shop/optician/Opticalia":{name:"Opticalia",icon:"maki-optician",imageURL:"https://graph.facebook.com/OPTICALIAGRUPO/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62082114",shop:"optician"},addTags:{brand:"Opticalia","brand:wikidata":"Q62082114",name:"Opticalia",shop:"optician"},terms:[],matchScore:2,suggestion:true},"shop/optician/Pearle":{name:"Pearle",icon:"maki-optician",imageURL:"https://graph.facebook.com/pearlevision/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2231148",shop:"optician"},addTags:{brand:"Pearle","brand:wikidata":"Q2231148","brand:wikipedia":"en:Pearle Vision",name:"Pearle",shop:"optician"},terms:["pearle vision"],matchScore:2,suggestion:true},"shop/optician/Specsavers":{name:"Specsavers",icon:"maki-optician",imageURL:"https://graph.facebook.com/Specsavers/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2000610",shop:"optician"},addTags:{brand:"Specsavers","brand:wikidata":"Q2000610","brand:wikipedia":"en:Specsavers",name:"Specsavers",shop:"optician"},terms:[],matchScore:2,suggestion:true},"shop/optician/Sunglass Hut":{name:"Sunglass Hut",icon:"maki-optician",imageURL:"https://graph.facebook.com/SunglassHut/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q136311",shop:"optician"},addTags:{brand:"Sunglass Hut","brand:wikidata":"Q136311","brand:wikipedia":"en:Sunglass Hut",name:"Sunglass Hut",shop:"optician"},terms:[],matchScore:2,suggestion:true},"shop/optician/Synoptik":{name:"Synoptik",icon:"maki-optician",imageURL:"https://graph.facebook.com/synoptiksverige/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q10687541",shop:"optician"},addTags:{brand:"Synoptik","brand:wikidata":"Q10687541","brand:wikipedia":"sv:Synoptik",name:"Synoptik",shop:"optician"},countryCodes:["se"],terms:[],matchScore:2,suggestion:true},"shop/optician/Synsam":{name:"Synsam",icon:"maki-optician",imageURL:"https://graph.facebook.com/synsam.se/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q12004589",shop:"optician"},addTags:{brand:"Synsam","brand:wikidata":"Q12004589","brand:wikipedia":"sv:Synsam",name:"Synsam",shop:"optician"},countryCodes:["fi","no","se"],terms:[],matchScore:2,suggestion:true},"shop/optician/Target Optical":{name:"Target Optical",icon:"maki-optician",geometry:["point","area"],tags:{"brand:wikidata":"Q19903688",shop:"optician"},addTags:{brand:"Target Optical","brand:wikidata":"Q19903688","brand:wikipedia":"en:Target Optical",name:"Target Optical",shop:"optician"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/optician/Vision Express":{name:"Vision Express",icon:"maki-optician",imageURL:"https://graph.facebook.com/visionexpress/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7936150",shop:"optician"},addTags:{brand:"Vision Express","brand:wikidata":"Q7936150","brand:wikipedia":"en:Vision Express",name:"Vision Express",shop:"optician"},terms:[],matchScore:2,suggestion:true},"shop/optician/Visionworks":{name:"Visionworks",icon:"maki-optician",imageURL:"https://graph.facebook.com/Visionworks/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5422607",shop:"optician"},addTags:{brand:"Visionworks","brand:wikidata":"Q5422607","brand:wikipedia":"en:Visionworks",name:"Visionworks",shop:"optician"},terms:[],matchScore:2,suggestion:true},"shop/optician/แว่นท็อปเจริญ":{name:"แว่นท็อปเจริญ",icon:"maki-optician",imageURL:"https://graph.facebook.com/TopCharoenOpticalOfficial/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62391732",shop:"optician"},addTags:{brand:"แว่นท็อปเจริญ","brand:th":"แว่นท็อปเจริญ","brand:wikidata":"Q62391732",name:"แว่นท็อปเจริญ","name:th":"แว่นท็อปเจริญ",shop:"optician"},countryCodes:["th"],terms:[],matchScore:2,suggestion:true},"shop/optician/メガネスーパー":{name:"メガネスーパー",icon:"maki-optician",imageURL:"https://graph.facebook.com/meganesuper/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11343504",shop:"optician"},addTags:{brand:"メガネスーパー","brand:ja":"メガネスーパー","brand:wikidata":"Q11343504","brand:wikipedia":"ja:メガネスーパー",name:"メガネスーパー","name:en":"Meganesuper","name:ja":"メガネスーパー",shop:"optician"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/optician/寶島眼鏡":{name:"寶島眼鏡",icon:"maki-optician",imageURL:"https://graph.facebook.com/formosafans/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62391741",shop:"optician"},addTags:{brand:"寶島眼鏡","brand:wikidata":"Q62391741",name:"寶島眼鏡",shop:"optician"},countryCodes:["zh"],terms:[],matchScore:2,suggestion:true},"shop/optician/眼鏡市場":{name:"眼鏡市場",icon:"maki-optician",imageURL:"https://graph.facebook.com/meganeichiba.jp/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11343506",shop:"optician"},addTags:{brand:"眼鏡市場","brand:en":"Megane Ichiba","brand:wikidata":"Q11343506","brand:wikipedia":"ja:メガネトップ",name:"眼鏡市場","name:en":"Megane Ichiba",shop:"optician"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/outdoor/Bass Pro Shops":{name:"Bass Pro Shops",icon:"temaki-compass",imageURL:"https://graph.facebook.com/bassproshops/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4867953",shop:"outdoor"},addTags:{brand:"Bass Pro Shops","brand:wikidata":"Q4867953","brand:wikipedia":"en:Bass Pro Shops",name:"Bass Pro Shops",shop:"outdoor"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"shop/outdoor/Cabela's":{name:"Cabela's",icon:"temaki-compass",imageURL:"https://graph.facebook.com/Cabelas/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2793714",shop:"outdoor"},addTags:{brand:"Cabela's","brand:wikidata":"Q2793714","brand:wikipedia":"en:Cabela's",name:"Cabela's",shop:"outdoor"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"shop/outdoor/Jack Wolfskin":{name:"Jack Wolfskin",icon:"temaki-compass",imageURL:"https://graph.facebook.com/JACKWOLFSKINofficial/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q536133",shop:"outdoor"},addTags:{brand:"Jack Wolfskin","brand:wikidata":"Q536133","brand:wikipedia":"en:Jack Wolfskin",name:"Jack Wolfskin",shop:"outdoor"},countryCodes:["ch","de","fr"],terms:[],matchScore:2,suggestion:true},"shop/outdoor/Kathmandu":{name:"Kathmandu",icon:"temaki-compass",imageURL:"https://graph.facebook.com/kathmandu/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1736294",shop:"outdoor"},addTags:{brand:"Kathmandu","brand:wikidata":"Q1736294","brand:wikipedia":"en:Kathmandu (company)",name:"Kathmandu",shop:"outdoor"},countryCodes:["au","nz"],terms:[],matchScore:2,suggestion:true},"shop/outdoor/Mountain Warehouse":{name:"Mountain Warehouse",icon:"temaki-compass",imageURL:"https://graph.facebook.com/MountainWarehouse/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6925414",shop:"outdoor"},addTags:{brand:"Mountain Warehouse","brand:wikidata":"Q6925414","brand:wikipedia":"en:Mountain Warehouse",name:"Mountain Warehouse",shop:"outdoor"},terms:[],matchScore:2,suggestion:true},"shop/outdoor/REI":{name:"REI",icon:"temaki-compass",imageURL:"https://graph.facebook.com/9062006483/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3414933",shop:"outdoor"},addTags:{brand:"REI","brand:wikidata":"Q3414933","brand:wikipedia":"en:Recreational Equipment, Inc.",name:"REI",shop:"outdoor"},countryCodes:["id","us"],terms:[],matchScore:2,suggestion:true},"shop/outdoor/Sportsman's Warehouse":{name:"Sportsman's Warehouse",icon:"temaki-compass",imageURL:"https://graph.facebook.com/sportsmanswh/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7579979",shop:"outdoor"},addTags:{brand:"Sportsman's Warehouse","brand:wikidata":"Q7579979","brand:wikipedia":"en:Sportsman's Warehouse",name:"Sportsman's Warehouse",shop:"outdoor"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/outdoor/Trespass":{name:"Trespass",icon:"temaki-compass",imageURL:"https://graph.facebook.com/trespass/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q17035733",shop:"outdoor"},addTags:{brand:"Trespass","brand:wikidata":"Q17035733","brand:wikipedia":"en:Trespass (clothing)",name:"Trespass",shop:"outdoor"},countryCodes:["fr","gb","ie"],terms:[],matchScore:2,suggestion:true},"shop/outpost/Wildberries":{name:"Wildberries",icon:"maki-shop",imageURL:"https://graph.facebook.com/wildberries.ru/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q24933714",shop:"outpost"},addTags:{brand:"Wildberries","brand:wikidata":"Q24933714","brand:wikipedia":"ru:Wildberries",name:"Wildberries",shop:"outpost"},countryCodes:["by","ru"],terms:[],matchScore:2,suggestion:true},"shop/paint/Benjamin Moore":{name:"Benjamin Moore",icon:"fas-paint-roller",geometry:["point","area"],tags:{"brand:wikidata":"Q4889038",shop:"paint"},addTags:{brand:"Benjamin Moore","brand:wikidata":"Q4889038","brand:wikipedia":"en:Benjamin Moore & Co.",name:"Benjamin Moore",shop:"paint"},terms:[],matchScore:2,suggestion:true},"shop/paint/Comex":{name:"Comex",icon:"fas-paint-roller",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FComex.png&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q5151654",shop:"paint"},addTags:{brand:"Comex","brand:wikidata":"Q5151654","brand:wikipedia":"en:Comex Group",name:"Comex",shop:"paint"},terms:[],matchScore:2,suggestion:true},"shop/paint/Jotun":{name:"Jotun",icon:"fas-paint-roller",geometry:["point","area"],tags:{"brand:wikidata":"Q1778870",shop:"paint"},addTags:{brand:"Jotun","brand:wikidata":"Q1778870","brand:wikipedia":"en:Jotun (company)",name:"Jotun",shop:"paint"},terms:[],matchScore:2,suggestion:true},"shop/paint/National Paints":{name:"National Paints",icon:"fas-paint-roller",imageURL:"https://graph.facebook.com/NationalPaints/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62073521",shop:"paint"},addTags:{brand:"National Paints","brand:wikidata":"Q62073521",name:"National Paints",shop:"paint"},terms:[],matchScore:2,suggestion:true},"shop/paint/Sherwin Williams":{name:"Sherwin Williams",icon:"fas-paint-roller",geometry:["point","area"],tags:{"brand:wikidata":"Q48881",shop:"paint"},addTags:{brand:"Sherwin Williams","brand:wikidata":"Q48881","brand:wikipedia":"en:Sherwin-Williams",name:"Sherwin Williams",shop:"paint"},terms:["sherwin williams paints"],matchScore:2,suggestion:true},"shop/party/Party City":{name:"Party City",icon:"fas-mask",imageURL:"https://graph.facebook.com/PartyCity/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7140896",shop:"party"},addTags:{brand:"Party City","brand:wikidata":"Q7140896","brand:wikipedia":"en:Party City",name:"Party City",shop:"party"},terms:[],matchScore:2,suggestion:true},"shop/pastry/Smallcakes":{name:"Smallcakes",icon:"maki-bakery",imageURL:"https://graph.facebook.com/SmallcakesKC/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62384749",shop:"pastry"},addTags:{brand:"Smallcakes","brand:wikidata":"Q62384749",name:"Smallcakes",shop:"pastry"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/pawnbroker/Cash Converters":{name:"Cash Converters",icon:"maki-shop",imageURL:"https://graph.facebook.com/CashConvertersUK/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5048645",shop:"pawnbroker"},addTags:{brand:"Cash Converters","brand:wikidata":"Q5048645","brand:wikipedia":"en:Cash Converters",name:"Cash Converters",shop:"pawnbroker"},terms:[],matchScore:2,suggestion:true},"shop/pawnbroker/Cebuana Lhuillier":{name:"Cebuana Lhuillier",icon:"maki-shop",imageURL:"https://graph.facebook.com/cebuanalhuillierpawnshop/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q17064661",shop:"pawnbroker"},addTags:{brand:"Cebuana Lhuillier","brand:wikidata":"Q17064661","brand:wikipedia":"en:Cebuana Lhuillier",name:"Cebuana Lhuillier",shop:"pawnbroker"},countryCodes:["ph"],terms:[],matchScore:2,suggestion:true},"shop/pawnbroker/Palawan Pawnshop":{name:"Palawan Pawnshop",icon:"maki-shop",imageURL:"https://graph.facebook.com/palawan.pawnshop/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62391488",shop:"pawnbroker"},addTags:{brand:"Palawan Pawnshop","brand:wikidata":"Q62391488",name:"Palawan Pawnshop",shop:"pawnbroker"},countryCodes:["ph"],terms:[],matchScore:2,suggestion:true},"shop/pawnbroker/Villarica Pawnshop":{name:"Villarica Pawnshop",icon:"maki-shop",imageURL:"https://graph.facebook.com/155765647803482/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62391438",shop:"pawnbroker"},addTags:{brand:"Villarica Pawnshop","brand:wikidata":"Q62391438",name:"Villarica Pawnshop",shop:"pawnbroker"},countryCodes:["ph"],terms:[],matchScore:2,suggestion:true},"shop/perfumery/Douglas":{name:"Douglas",icon:"maki-shop",imageURL:"https://graph.facebook.com/DouglasDeutschland/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2052213",shop:"perfumery"},addTags:{brand:"Douglas","brand:wikidata":"Q2052213","brand:wikipedia":"de:Parfümerie Douglas",name:"Douglas",shop:"perfumery"},terms:[],matchScore:2,suggestion:true},"shop/perfumery/FAnn":{name:"FAnn",icon:"maki-shop",imageURL:"https://graph.facebook.com/FAnn.cz/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62391353",shop:"perfumery"},addTags:{brand:"FAnn","brand:wikidata":"Q62391353",name:"FAnn",shop:"perfumery"},countryCodes:["cz","sk"],terms:[],matchScore:2,suggestion:true},"shop/perfumery/ICI PARIS XL":{name:"ICI PARIS XL",icon:"maki-shop",imageURL:"https://graph.facebook.com/iciparisxlbe/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q769749",shop:"perfumery"},addTags:{brand:"ICI PARIS XL","brand:wikidata":"Q769749","brand:wikipedia":"en:ICI Paris XL",name:"ICI PARIS XL",shop:"perfumery"},countryCodes:["be","lu","nl"],terms:[],matchScore:2,suggestion:true},"shop/perfumery/Marionnaud":{name:"Marionnaud",icon:"maki-shop",imageURL:"https://graph.facebook.com/Marionnaud.France/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1129073",shop:"perfumery"},addTags:{brand:"Marionnaud","brand:wikidata":"Q1129073","brand:wikipedia":"fr:Marionnaud",name:"Marionnaud",shop:"perfumery"},countryCodes:["at","ch","es","fr","it","sk"],terms:[],matchScore:2,suggestion:true},"shop/perfumery/O Boticário":{name:"O Boticário",icon:"maki-shop",imageURL:"https://graph.facebook.com/oboticario/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7073219",shop:"perfumery"},addTags:{brand:"O Boticário","brand:wikidata":"Q7073219","brand:wikipedia":"en:O Boticário",name:"O Boticário",shop:"perfumery"},countryCodes:["br"],terms:[],matchScore:2,suggestion:true},"shop/pet/Das Futterhaus":{name:"Das Futterhaus",icon:"maki-dog-park",imageURL:"https://graph.facebook.com/futterhaus.deutschland/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1167914",shop:"pet"},addTags:{brand:"Das Futterhaus","brand:wikidata":"Q1167914","brand:wikipedia":"de:Das Futterhaus",name:"Das Futterhaus",shop:"pet"},countryCodes:["at","de"],terms:[],matchScore:2,suggestion:true},"shop/pet/Fressnapf":{name:"Fressnapf",icon:"maki-dog-park",imageURL:"https://graph.facebook.com/Fressnapf/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q875796",shop:"pet"},addTags:{brand:"Fressnapf","brand:wikidata":"Q875796","brand:wikipedia":"en:Fressnapf",name:"Fressnapf",shop:"pet"},terms:[],matchScore:2,suggestion:true},"shop/pet/Global Pet Foods":{name:"Global Pet Foods",icon:"maki-dog-park",geometry:["point","area"],tags:{"brand:wikidata":"Q57985699",shop:"pet"},addTags:{brand:"Global Pet Foods","brand:wikidata":"Q57985699",name:"Global Pet Foods",shop:"pet"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"shop/pet/Maxi Zoo":{name:"Maxi Zoo",icon:"maki-dog-park",imageURL:"https://graph.facebook.com/Fressnapf/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q875796",shop:"pet"},addTags:{brand:"Maxi Zoo","brand:wikidata":"Q875796","brand:wikipedia":"en:Fressnapf",name:"Maxi Zoo",shop:"pet"},terms:[],matchScore:2,suggestion:true},"shop/pet/Mud Bay":{name:"Mud Bay",icon:"maki-dog-park",imageURL:"https://graph.facebook.com/mudbay/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q30324179",shop:"pet"},addTags:{brand:"Mud Bay","brand:wikidata":"Q30324179","brand:wikipedia":"en:Mud Bay pet store",name:"Mud Bay",shop:"pet"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/pet/Pet Food Express":{name:"Pet Food Express",icon:"maki-dog-park",imageURL:"https://graph.facebook.com/petfoodexpress/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7171541",shop:"pet"},addTags:{brand:"Pet Food Express","brand:wikidata":"Q7171541","brand:wikipedia":"en:Pet Food Express",name:"Pet Food Express",shop:"pet"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/pet/Pet Supermarket":{name:"Pet Supermarket",icon:"maki-dog-park",imageURL:"https://graph.facebook.com/PetSupermarket/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q61968363",shop:"pet"},addTags:{brand:"Pet Supermarket","brand:wikidata":"Q61968363",name:"Pet Supermarket",shop:"pet"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/pet/Pet Supplies Plus":{name:"Pet Supplies Plus",icon:"maki-dog-park",imageURL:"https://graph.facebook.com/petsuppliesplus/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7171563",shop:"pet"},addTags:{brand:"Pet Supplies Plus","brand:wikidata":"Q7171563","brand:wikipedia":"en:Pet Supplies Plus",name:"Pet Supplies Plus",shop:"pet"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/pet/Pet Valu":{name:"Pet Valu",icon:"maki-dog-park",imageURL:"https://graph.facebook.com/PetValuUS/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q58009635",shop:"pet"},addTags:{brand:"Pet Valu","brand:wikidata":"Q58009635",name:"Pet Valu",shop:"pet"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"shop/pet/PetSmart":{name:"PetSmart",icon:"maki-dog-park",imageURL:"https://graph.facebook.com/PetSmart/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3307147",shop:"pet"},addTags:{brand:"PetSmart","brand:wikidata":"Q3307147","brand:wikipedia":"en:PetSmart",name:"PetSmart",shop:"pet"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"shop/pet/Petco":{name:"Petco",icon:"maki-dog-park",imageURL:"https://graph.facebook.com/Petco/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7171798",shop:"pet"},addTags:{brand:"Petco","brand:wikidata":"Q7171798","brand:wikipedia":"en:Petco",name:"Petco",shop:"pet"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/pet/Petland":{name:"Petland",icon:"maki-dog-park",imageURL:"https://graph.facebook.com/PetlandUSA/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q17111474",shop:"pet"},addTags:{brand:"Petland","brand:wikidata":"Q17111474","brand:wikipedia":"en:Petland",name:"Petland",shop:"pet"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/pet/Petland Discounts":{name:"Petland Discounts",icon:"maki-dog-park",imageURL:"https://graph.facebook.com/petlanddiscount/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7178463",shop:"pet"},addTags:{brand:"Petland Discounts","brand:wikidata":"Q7178463","brand:wikipedia":"en:Petland Discounts",name:"Petland Discounts",shop:"pet"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/pet/Pets at Home":{name:"Pets at Home",icon:"maki-dog-park",imageURL:"https://graph.facebook.com/petsathomeUK/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7179258",shop:"pet"},addTags:{brand:"Pets at Home","brand:wikidata":"Q7179258","brand:wikipedia":"en:Pets at Home",name:"Pets at Home",shop:"pet"},terms:[],matchScore:2,suggestion:true},"shop/pet/Unleashed":{name:"Unleashed",icon:"maki-dog-park",imageURL:"https://graph.facebook.com/Petco/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62122874",shop:"pet"},addTags:{alt_name:"Unleashed by Petco",brand:"Unleashed","brand:wikidata":"Q62122874",name:"Unleashed",operator:"Petco","operator:wikidata":"Q7171798","operator:wikipedia":"en:Petco",shop:"pet"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/pet/Бетховен":{name:"Бетховен",icon:"maki-dog-park",imageURL:"https://graph.facebook.com/zoobethowenclub/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62390798",shop:"pet"},addTags:{brand:"Бетховен","brand:wikidata":"Q62390798",name:"Бетховен",shop:"pet"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"shop/pet/Четыре лапы":{name:"Четыре лапы",icon:"maki-dog-park",imageURL:"https://graph.facebook.com/4laps/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62390783",shop:"pet"},addTags:{brand:"Четыре лапы","brand:wikidata":"Q62390783",name:"Четыре лапы",shop:"pet"},countryCodes:["kz","ru"],terms:[],matchScore:2,suggestion:true},"shop/photo/Kodak Express":{name:"Kodak Express",icon:"fas-camera-retro",imageURL:"https://graph.facebook.com/kodakexpress/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6425126",shop:"photo"},addTags:{brand:"Kodak Express","brand:wikidata":"Q6425126","brand:wikipedia":"en:Kodak Express",name:"Kodak Express",shop:"photo"},terms:["kodak"],matchScore:2,suggestion:true},"shop/second_hand/Value Village":{name:"Value Village",icon:"maki-shop",imageURL:"https://graph.facebook.com/savers/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7428188",shop:"second_hand"},addTags:{brand:"Value Village","brand:wikidata":"Q7428188","brand:wikipedia":"en:Savers",name:"Value Village",shop:"second_hand"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"shop/shoes/ABCマート":{name:"ABCマート",icon:"maki-shoe",imageURL:"https://graph.facebook.com/172547912801644/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11188787",shop:"shoes"},addTags:{brand:"ABCマート","brand:ja":"ABCマート","brand:wikidata":"Q11188787","brand:wikipedia":"en:ABC-Mart",name:"ABCマート","name:ja":"ABCマート",shop:"shoes"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/shoes/Aldo":{name:"Aldo",icon:"maki-shoe",imageURL:"https://graph.facebook.com/ALDO/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2832297",shop:"shoes"},addTags:{brand:"Aldo","brand:wikidata":"Q2832297","brand:wikipedia":"en:Aldo Group",name:"Aldo",shop:"shoes"},terms:[],matchScore:2,suggestion:true},"shop/shoes/André":{name:"André",icon:"maki-shoe",geometry:["point","area"],tags:{"brand:wikidata":"Q2847114",shop:"shoes"},addTags:{brand:"André","brand:wikidata":"Q2847114","brand:wikipedia":"fr:André (chaussure)",name:"André",shop:"shoes"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"shop/shoes/Bata":{name:"Bata",icon:"maki-shoe",imageURL:"https://graph.facebook.com/Bata/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q688082",shop:"shoes"},addTags:{brand:"Bata","brand:wikidata":"Q688082","brand:wikipedia":"en:Bata (company)",name:"Bata",shop:"shoes"},terms:[],matchScore:2,suggestion:true},"shop/shoes/Besson Chaussures":{name:"Besson Chaussures",icon:"maki-shoe",imageURL:"https://graph.facebook.com/besson.chaussures/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2899930",shop:"shoes"},addTags:{brand:"Besson Chaussures","brand:wikidata":"Q2899930","brand:wikipedia":"fr:Besson Chaussures",name:"Besson Chaussures",operator:"Vivarte","operator:wikidata":"Q3561446","operator:wikipedia":"fr:Vivarte",shop:"shoes"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"shop/shoes/Birkenstock":{name:"Birkenstock",icon:"maki-shoe",imageURL:"https://graph.facebook.com/birkenstock/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q648458",shop:"shoes"},addTags:{brand:"Birkenstock","brand:wikidata":"Q648458","brand:wikipedia":"en:Birkenstock",name:"Birkenstock",shop:"shoes"},terms:[],matchScore:2,suggestion:true},"shop/shoes/Brantano":{name:"Brantano",icon:"maki-shoe",imageURL:"https://graph.facebook.com/brantano.belgie/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4957616",shop:"shoes"},addTags:{brand:"Brantano","brand:wikidata":"Q4957616","brand:wikipedia":"en:Brantano Footwear",name:"Brantano",shop:"shoes"},countryCodes:["be","gb","lu"],terms:[],matchScore:2,suggestion:true},"shop/shoes/CCC":{name:"CCC",icon:"maki-shoe",imageURL:"https://graph.facebook.com/CCC/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11788344",shop:"shoes"},addTags:{brand:"CCC","brand:wikidata":"Q11788344","brand:wikipedia":"de:CCC (Unternehmen)",name:"CCC",shop:"shoes"},terms:[],matchScore:2,suggestion:true},"shop/shoes/Camper":{name:"Camper",icon:"maki-shoe",imageURL:"https://graph.facebook.com/Camper/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1030922",shop:"shoes"},addTags:{brand:"Camper","brand:wikidata":"Q1030922","brand:wikipedia":"en:Camper (company)",name:"Camper",shop:"shoes"},terms:[],matchScore:2,suggestion:true},"shop/shoes/Chaussea":{name:"Chaussea",icon:"maki-shoe",imageURL:"https://graph.facebook.com/chaussea.fr/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62082044",shop:"shoes"},addTags:{brand:"Chaussea","brand:wikidata":"Q62082044",name:"Chaussea",shop:"shoes"},countryCodes:["be","es","fr","lu"],terms:[],matchScore:2,suggestion:true},"shop/shoes/Clarks":{name:"Clarks",icon:"maki-shoe",imageURL:"https://graph.facebook.com/ClarksShoesUS/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1095857",shop:"shoes"},addTags:{brand:"Clarks","brand:wikidata":"Q1095857","brand:wikipedia":"en:C. & J. Clark",name:"Clarks",shop:"shoes"},terms:[],matchScore:2,suggestion:true},"shop/shoes/Converse":{name:"Converse",icon:"maki-shoe",imageURL:"https://graph.facebook.com/converse/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q319515",shop:"shoes"},addTags:{brand:"Converse","brand:wikidata":"Q319515","brand:wikipedia":"en:Converse (shoe company)",name:"Converse",shop:"shoes"},terms:[],matchScore:2,suggestion:true},"shop/shoes/Crocs":{name:"Crocs",icon:"maki-shoe",imageURL:"https://graph.facebook.com/Crocs/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q926699",shop:"shoes"},addTags:{brand:"Crocs","brand:wikidata":"Q926699","brand:wikipedia":"en:Crocs",name:"Crocs",shop:"shoes"},terms:[],matchScore:2,suggestion:true},"shop/shoes/DSW":{name:"DSW",icon:"maki-shoe",imageURL:"https://graph.facebook.com/designerbrands/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5206207",shop:"shoes"},addTags:{brand:"DSW","brand:wikidata":"Q5206207","brand:wikipedia":"en:Designer Brands",name:"DSW",shop:"shoes"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"shop/shoes/Deichmann":{name:"Deichmann",icon:"maki-shoe",imageURL:"https://graph.facebook.com/Deichmann/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q664543",shop:"shoes"},addTags:{brand:"Deichmann","brand:wikidata":"Q664543","brand:wikipedia":"en:Deichmann SE",name:"Deichmann",shop:"shoes"},terms:[],matchScore:2,suggestion:true},"shop/shoes/Din sko":{name:"Din sko",icon:"maki-shoe",imageURL:"https://graph.facebook.com/dinsko/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q10472869",shop:"shoes"},addTags:{brand:"Din sko","brand:wikidata":"Q10472869","brand:wikipedia":"sv:Din sko",name:"Din sko",shop:"shoes"},countryCodes:["no","se"],terms:[],matchScore:2,suggestion:true},"shop/shoes/Dosenbach":{name:"Dosenbach",icon:"maki-shoe",imageURL:"https://graph.facebook.com/Dosenbach.CH/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2677329",shop:"shoes"},addTags:{brand:"Dosenbach","brand:wikidata":"Q2677329","brand:wikipedia":"de:Dosenbach-Ochsner",name:"Dosenbach",shop:"shoes"},countryCodes:["ch"],terms:[],matchScore:2,suggestion:true},"shop/shoes/Ecco":{name:"Ecco",icon:"maki-shoe",imageURL:"https://graph.facebook.com/Ecco/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1280255",shop:"shoes"},addTags:{brand:"Ecco","brand:wikidata":"Q1280255","brand:wikipedia":"en:ECCO",name:"Ecco",shop:"shoes"},terms:[],matchScore:2,suggestion:true},"shop/shoes/FLO":{name:"FLO",icon:"maki-shoe",imageURL:"https://graph.facebook.com/FLOShoesGlobal/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q61994802",shop:"shoes"},addTags:{brand:"FLO","brand:wikidata":"Q61994802",name:"FLO",shop:"shoes"},countryCodes:["al","tr"],terms:[],matchScore:2,suggestion:true},"shop/shoes/Famous Footwear":{name:"Famous Footwear",icon:"maki-shoe",imageURL:"https://graph.facebook.com/famousfootwear/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5433457",shop:"shoes"},addTags:{brand:"Famous Footwear","brand:wikidata":"Q5433457","brand:wikipedia":"en:Famous Footwear",name:"Famous Footwear",shop:"shoes"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/shoes/Foot Locker":{name:"Foot Locker",icon:"maki-shoe",imageURL:"https://graph.facebook.com/footlocker/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q63335",shop:"shoes"},addTags:{brand:"Foot Locker","brand:wikidata":"Q63335","brand:wikipedia":"en:Foot Locker",name:"Foot Locker",shop:"shoes"},terms:[],matchScore:2,suggestion:true},"shop/shoes/Gabor":{name:"Gabor",icon:"maki-shoe",imageURL:"https://graph.facebook.com/gaborshoesag/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1488760",shop:"shoes"},addTags:{brand:"Gabor","brand:wikidata":"Q1488760","brand:wikipedia":"de:Gabor Shoes",name:"Gabor",shop:"shoes"},countryCodes:["de","it"],terms:[],matchScore:2,suggestion:true},"shop/shoes/Geox":{name:"Geox",icon:"maki-shoe",imageURL:"https://graph.facebook.com/GEOX/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q588001",shop:"shoes"},addTags:{brand:"Geox","brand:wikidata":"Q588001","brand:wikipedia":"en:Geox",name:"Geox",shop:"shoes"},terms:[],matchScore:2,suggestion:true},"shop/shoes/Görtz":{name:"Görtz",icon:"maki-shoe",imageURL:"https://graph.facebook.com/goertz/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1559593",shop:"shoes"},addTags:{brand:"Görtz","brand:wikidata":"Q1559593","brand:wikipedia":"de:Ludwig Görtz",name:"Görtz",shop:"shoes"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/shoes/Humanic":{name:"Humanic",icon:"maki-shoe",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FHumanic%202013.jpg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q1636668",shop:"shoes"},addTags:{brand:"Humanic","brand:wikidata":"Q1636668","brand:wikipedia":"en:Humanic",name:"Humanic",shop:"shoes"},terms:[],matchScore:2,suggestion:true},"shop/shoes/Hush Puppies":{name:"Hush Puppies",icon:"maki-shoe",imageURL:"https://graph.facebook.com/hushpuppiesglobal/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1828588",shop:"shoes"},addTags:{brand:"Hush Puppies","brand:wikidata":"Q1828588","brand:wikipedia":"en:Hush Puppies",name:"Hush Puppies",shop:"shoes"},terms:[],matchScore:2,suggestion:true},"shop/shoes/Johnston & Murphy":{name:"Johnston & Murphy",icon:"maki-shoe",imageURL:"https://graph.facebook.com/johnstonmurphy/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6268615",shop:"shoes"},addTags:{brand:"Johnston & Murphy","brand:wikidata":"Q6268615","brand:wikipedia":"en:Johnston & Murphy",name:"Johnston & Murphy",shop:"shoes"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"shop/shoes/Journeys":{name:"Journeys",icon:"maki-shoe",imageURL:"https://graph.facebook.com/Journeys/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q61994838",shop:"shoes"},addTags:{brand:"Journeys","brand:wikidata":"Q61994838",name:"Journeys",operator:"Genesco","operator:wikidata":"Q5532704","operator:wikipedia":"en:Genesco",shop:"shoes"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"shop/shoes/Kari":{name:"Kari",icon:"maki-shoe",imageURL:"https://graph.facebook.com/shopkari/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q47155680",shop:"shoes"},addTags:{brand:"Kari","brand:wikidata":"Q47155680","brand:wikipedia":"ru:Kari (компания)",name:"Kari",shop:"shoes"},terms:[],matchScore:2,suggestion:true},"shop/shoes/La Halle aux Chaussures":{name:"La Halle aux Chaussures",icon:"maki-shoe",imageURL:"https://graph.facebook.com/lahalle.com/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62390731",shop:"shoes"},addTags:{brand:"La Halle aux Chaussures","brand:wikidata":"Q62390731",name:"La Halle aux Chaussures",operator:"Vivarte","operator:wikidata":"Q3561446","operator:wikipedia":"fr:Vivarte",shop:"shoes"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"shop/shoes/Mephisto":{name:"Mephisto",icon:"maki-shoe",imageURL:"https://graph.facebook.com/mephisto.usa/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q822975",shop:"shoes"},addTags:{brand:"Mephisto","brand:wikidata":"Q822975","brand:wikipedia":"fr:Mephisto (chaussure)",name:"Mephisto",shop:"shoes"},terms:[],matchScore:2,suggestion:true},"shop/shoes/Merrell":{name:"Merrell",icon:"maki-shoe",imageURL:"https://graph.facebook.com/merrell/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1921997",shop:"shoes"},addTags:{brand:"Merrell","brand:wikidata":"Q1921997","brand:wikipedia":"en:Merrell (company)",name:"Merrell",shop:"shoes"},terms:[],matchScore:2,suggestion:true},"shop/shoes/Minelli":{name:"Minelli",icon:"maki-shoe",imageURL:"https://graph.facebook.com/Minelli/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q61994831",shop:"shoes"},addTags:{brand:"Minelli","brand:wikidata":"Q61994831",name:"Minelli",operator:"Vivarte","operator:wikidata":"Q3561446","operator:wikipedia":"fr:Vivarte",shop:"shoes"},terms:[],matchScore:2,suggestion:true},"shop/shoes/New Balance":{name:"New Balance",icon:"maki-shoe",imageURL:"https://graph.facebook.com/newbalanceusa/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q742988",shop:"shoes"},addTags:{brand:"New Balance","brand:wikidata":"Q742988","brand:wikipedia":"en:New Balance",name:"New Balance",shop:"shoes"},terms:[],matchScore:2,suggestion:true},"shop/shoes/Office":{name:"Office",icon:"maki-shoe",imageURL:"https://graph.facebook.com/Officeshoes1/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7079121",shop:"shoes"},addTags:{brand:"Office","brand:wikidata":"Q7079121","brand:wikipedia":"en:Office Holdings",name:"Office",shop:"shoes"},countryCodes:["de","gb","ie","ro"],terms:[],matchScore:2,suggestion:true},"shop/shoes/Payless ShoeSource":{name:"Payless ShoeSource",icon:"maki-shoe",imageURL:"https://graph.facebook.com/payless/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7156755",shop:"shoes"},addTags:{brand:"Payless ShoeSource","brand:wikidata":"Q7156755","brand:wikipedia":"en:Payless ShoeSource",name:"Payless ShoeSource",shop:"shoes"},terms:["payless"],matchScore:2,suggestion:true},"shop/shoes/Quick Schuh":{name:"Quick Schuh",icon:"maki-shoe",imageURL:"https://graph.facebook.com/quick.schuh/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2123069",shop:"shoes"},addTags:{brand:"Quick Schuh","brand:wikidata":"Q2123069","brand:wikipedia":"de:Quick Schuh",name:"Quick Schuh",shop:"shoes"},countryCodes:["at","de"],terms:[],matchScore:2,suggestion:true},"shop/shoes/Rack Room Shoes":{name:"Rack Room Shoes",icon:"maki-shoe",imageURL:"https://graph.facebook.com/myrackroomshoes/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q17109937",shop:"shoes"},addTags:{brand:"Rack Room Shoes","brand:wikidata":"Q17109937","brand:wikipedia":"en:Rack Room Shoes",name:"Rack Room Shoes",shop:"shoes"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/shoes/Red Wing":{name:"Red Wing",icon:"maki-shoe",imageURL:"https://graph.facebook.com/RedWingShoes/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q934096",shop:"shoes"},addTags:{brand:"Red Wing","brand:wikidata":"Q934096","brand:wikipedia":"en:Red Wing Shoes",name:"Red Wing",shop:"shoes"},countryCodes:["de","gb","nl","us"],terms:[],matchScore:2,suggestion:true},"shop/shoes/Reno":{name:"Reno",icon:"maki-shoe",imageURL:"https://graph.facebook.com/RENO/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2144204",shop:"shoes"},addTags:{brand:"Reno","brand:wikidata":"Q2144204","brand:wikipedia":"de:Reno (Schuhhandel)",name:"Reno",shop:"shoes"},countryCodes:["at","ch","de","hu","sk"],terms:[],matchScore:2,suggestion:true},"shop/shoes/Rieker":{name:"Rieker",icon:"maki-shoe",imageURL:"https://graph.facebook.com/riekerofficial/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2152193",shop:"shoes"},addTags:{brand:"Rieker","brand:wikidata":"Q2152193","brand:wikipedia":"en:Rieker Shoes",name:"Rieker",shop:"shoes"},terms:[],matchScore:2,suggestion:true},"shop/shoes/Rockport":{name:"Rockport",icon:"maki-shoe",imageURL:"https://graph.facebook.com/Rockport/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4048384",shop:"shoes"},addTags:{brand:"Rockport","brand:wikidata":"Q4048384","brand:wikipedia":"en:Rockport (company)",name:"Rockport",shop:"shoes"},terms:[],matchScore:2,suggestion:true},"shop/shoes/Salamander":{name:"Salamander",icon:"maki-shoe",imageURL:"https://graph.facebook.com/SalamanderCzech/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q878354",shop:"shoes"},addTags:{brand:"Salamander","brand:wikidata":"Q878354","brand:wikipedia":"de:Salamander (Schuhe)",name:"Salamander",shop:"shoes"},terms:[],matchScore:2,suggestion:true},"shop/shoes/San Marina":{name:"San Marina",icon:"maki-shoe",imageURL:"https://graph.facebook.com/sanmarina/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3471558",shop:"shoes"},addTags:{brand:"San Marina","brand:wikidata":"Q3471558","brand:wikipedia":"fr:San Marina",name:"San Marina",shop:"shoes"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"shop/shoes/Scapino":{name:"Scapino",icon:"maki-shoe",imageURL:"https://graph.facebook.com/ScapinoNL/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2298792",shop:"shoes"},addTags:{brand:"Scapino","brand:wikidata":"Q2298792","brand:wikipedia":"nl:Scapino (winkelketen)",name:"Scapino",shop:"shoes"},countryCodes:["nl"],terms:[],matchScore:2,suggestion:true},"shop/shoes/Schuh":{name:"Schuh",icon:"maki-shoe",imageURL:"https://graph.facebook.com/schuhshoes/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7432952",shop:"shoes"},addTags:{brand:"Schuh","brand:wikidata":"Q7432952","brand:wikipedia":"en:Schuh",name:"Schuh",shop:"shoes"},countryCodes:["de","gb","gg","ie"],terms:[],matchScore:2,suggestion:true},"shop/shoes/Shoe Carnival":{name:"Shoe Carnival",icon:"maki-shoe",imageURL:"https://graph.facebook.com/ShoeCarnival/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7500007",shop:"shoes"},addTags:{brand:"Shoe Carnival","brand:wikidata":"Q7500007","brand:wikipedia":"en:Shoe Carnival",name:"Shoe Carnival",shop:"shoes"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/shoes/Shoe Zone":{name:"Shoe Zone",icon:"maki-shoe",imageURL:"https://graph.facebook.com/shoezone/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7500016",shop:"shoes"},addTags:{brand:"Shoe Zone","brand:wikidata":"Q7500016","brand:wikipedia":"en:Shoe Zone",name:"Shoe Zone",shop:"shoes"},terms:[],matchScore:2,suggestion:true},"shop/shoes/Siemes Schuhcenter":{name:"Siemes Schuhcenter",icon:"maki-shoe",imageURL:"https://graph.facebook.com/Schuhcenter.de/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2800720",shop:"shoes"},addTags:{brand:"Siemes Schuhcenter","brand:wikidata":"Q2800720","brand:wikipedia":"de:Siemes (Unternehmen)",name:"Siemes Schuhcenter",shop:"shoes"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/shoes/Skechers":{name:"Skechers",icon:"maki-shoe",imageURL:"https://graph.facebook.com/SKECHERS/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2945643",shop:"shoes"},addTags:{brand:"Skechers","brand:wikidata":"Q2945643","brand:wikipedia":"en:Skechers",name:"Skechers",shop:"shoes"},terms:[],matchScore:2,suggestion:true},"shop/shoes/Sperry":{name:"Sperry",icon:"maki-shoe",imageURL:"https://graph.facebook.com/sperry/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7576421",shop:"shoes"},addTags:{brand:"Sperry","brand:wikidata":"Q7576421","brand:wikipedia":"en:Sperry Top-Sider",name:"Sperry",shop:"shoes"},countryCodes:["us"],terms:["sperry top sider"],matchScore:2,suggestion:true},"shop/shoes/Stride Rite":{name:"Stride Rite",icon:"maki-shoe",imageURL:"https://graph.facebook.com/striderite/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2356171",shop:"shoes"},addTags:{brand:"Stride Rite","brand:wikidata":"Q2356171","brand:wikipedia":"en:Stride Rite Corporation",name:"Stride Rite",shop:"shoes"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/shoes/Tamaris":{name:"Tamaris",icon:"maki-shoe",imageURL:"https://graph.facebook.com/tamarisinternational/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q61994827",shop:"shoes"},addTags:{brand:"Tamaris","brand:wikidata":"Q61994827",name:"Tamaris",operator:"Wortmann Schuh-Holding","operator:wikidata":"Q1726079","operator:wikipedia":"de:Wortmann Schuh-Holding",shop:"shoes"},terms:[],matchScore:2,suggestion:true},"shop/shoes/The Shoe Company":{name:"The Shoe Company",icon:"maki-shoe",imageURL:"https://graph.facebook.com/theshoeco/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7763892",shop:"shoes"},addTags:{brand:"The Shoe Company","brand:wikidata":"Q7763892","brand:wikipedia":"en:The Shoe Company",name:"The Shoe Company",shop:"shoes"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"shop/shoes/UGG":{name:"UGG",icon:"maki-shoe",imageURL:"https://graph.facebook.com/UGG/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1138480",shop:"shoes"},addTags:{brand:"UGG","brand:wikidata":"Q1138480","brand:wikipedia":"en:UGG (brand)",name:"UGG",shop:"shoes"},countryCodes:["au","us"],terms:[],matchScore:2,suggestion:true},"shop/shoes/Vans":{name:"Vans",icon:"maki-shoe",imageURL:"https://graph.facebook.com/VANS/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1135366",shop:"shoes"},addTags:{brand:"Vans","brand:wikidata":"Q1135366","brand:wikipedia":"en:Vans",name:"Vans",shop:"shoes"},terms:[],matchScore:2,suggestion:true},"shop/shoes/vanHaren":{name:"vanHaren",icon:"maki-shoe",imageURL:"https://graph.facebook.com/vanharenschoenen/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62390668",shop:"shoes"},addTags:{brand:"vanHaren","brand:wikidata":"Q62390668",name:"vanHaren",shop:"shoes"},countryCodes:["be","nl"],terms:[],matchScore:2,suggestion:true},"shop/shoes/Éram":{name:"Éram",icon:"maki-shoe",imageURL:"https://graph.facebook.com/eram.fr/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q16684192",shop:"shoes"},addTags:{brand:"Éram","brand:wikidata":"Q16684192","brand:wikipedia":"fr:Éram",name:"Éram",shop:"shoes"},countryCodes:["be","fr"],terms:[],matchScore:2,suggestion:true},"shop/shoes/ЦентрОбувь":{name:"ЦентрОбувь",icon:"maki-shoe",geometry:["point","area"],tags:{"brand:wikidata":"Q4504072",shop:"shoes"},addTags:{brand:"ЦентрОбувь","brand:wikidata":"Q4504072","brand:wikipedia":"ru:ЦентрОбувь",name:"ЦентрОбувь",shop:"shoes"},countryCodes:["by","ru","ua"],terms:[],matchScore:2,suggestion:true},"shop/shoes/Юничел":{name:"Юничел",icon:"maki-shoe",imageURL:"https://graph.facebook.com/unichel.shoes/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62390569",shop:"shoes"},addTags:{brand:"Юничел","brand:wikidata":"Q62390569",name:"Юничел",shop:"shoes"},countryCodes:["kz","ru"],terms:[],matchScore:2,suggestion:true},"shop/shoes/東京靴流通センター":{name:"東京靴流通センター",icon:"maki-shoe",imageURL:"https://graph.facebook.com/chiyodafanpage/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11318515",shop:"shoes"},addTags:{brand:"東京靴流通センター","brand:en":"Tokyo Shoes Retailing Center","brand:ja":"東京靴流通センター","brand:wikidata":"Q11318515","brand:wikipedia":"ja:チヨダ",name:"東京靴流通センター","name:en":"Tokyo Shoes Retailing Center","name:ja":"東京靴流通センター",shop:"shoes"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/sports/Academy Sports + Outdoors":{name:"Academy Sports + Outdoors",icon:"fas-futbol",imageURL:"https://graph.facebook.com/Academy/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4671380",shop:"sports"},addTags:{brand:"Academy Sports + Outdoors","brand:wikidata":"Q4671380","brand:wikipedia":"en:Academy Sports + Outdoors",name:"Academy Sports + Outdoors",shop:"sports"},countryCodes:["us"],terms:["academy","academy sports and outdoors"],matchScore:2,suggestion:true},"shop/sports/Adidas":{name:"Adidas",icon:"fas-futbol",imageURL:"https://graph.facebook.com/adidasUK/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3895",shop:"sports"},addTags:{brand:"Adidas","brand:wikidata":"Q3895","brand:wikipedia":"en:Adidas",name:"Adidas",shop:"sports"},terms:[],matchScore:2,suggestion:true},"shop/sports/Aktiesport":{name:"Aktiesport",icon:"fas-futbol",geometry:["point","area"],tags:{"brand:wikidata":"Q57546889",shop:"sports"},addTags:{brand:"Aktiesport","brand:wikidata":"Q57546889",name:"Aktiesport",shop:"sports"},countryCodes:["nl"],terms:[],matchScore:2,suggestion:true},"shop/sports/American Golf":{name:"American Golf",icon:"fas-futbol",imageURL:"https://graph.facebook.com/americangolf/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62657494",shop:"sports"},addTags:{brand:"American Golf","brand:wikidata":"Q62657494",name:"American Golf",shop:"sports",sport:"golf"},countryCodes:["gb","ie"],terms:[],matchScore:2,suggestion:true},"shop/sports/Big 5 Sporting Goods":{name:"Big 5 Sporting Goods",icon:"fas-futbol",imageURL:"https://graph.facebook.com/Big5SportingGoods/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4904902",shop:"sports"},addTags:{brand:"Big 5 Sporting Goods","brand:wikidata":"Q4904902","brand:wikipedia":"en:Big 5 Sporting Goods",name:"Big 5 Sporting Goods",shop:"sports"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/sports/Centauro":{name:"Centauro",icon:"fas-futbol",imageURL:"https://graph.facebook.com/centauroesporte/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q28679561",shop:"sports"},addTags:{brand:"Centauro","brand:wikidata":"Q28679561","brand:wikipedia":"pt:Lojas Centauro",name:"Centauro",shop:"sports"},countryCodes:["br"],terms:[],matchScore:2,suggestion:true},"shop/sports/Decathlon":{name:"Decathlon",icon:"fas-futbol",imageURL:"https://graph.facebook.com/DecathlonUSA/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q509349",shop:"sports"},addTags:{brand:"Decathlon","brand:wikidata":"Q509349","brand:wikipedia":"en:Decathlon Group",name:"Decathlon",shop:"sports"},terms:[],matchScore:2,suggestion:true},"shop/sports/Dick's Sporting Goods":{name:"Dick's Sporting Goods",icon:"fas-futbol",imageURL:"https://graph.facebook.com/dickssportinggoods/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5272601",shop:"sports"},addTags:{brand:"Dick's Sporting Goods","brand:wikidata":"Q5272601","brand:wikipedia":"en:Dick's Sporting Goods",name:"Dick's Sporting Goods",shop:"sports"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/sports/Hervis":{name:"Hervis",icon:"fas-futbol",imageURL:"https://graph.facebook.com/hervissports.at/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1614816",shop:"sports"},addTags:{brand:"Hervis","brand:wikidata":"Q1614816","brand:wikipedia":"de:Hervis",name:"Hervis",shop:"sports"},countryCodes:["at","cz","de","hr","hu","ro","si"],terms:["hervis sport","hervis sports"],matchScore:2,suggestion:true},"shop/sports/Hibbett Sports":{name:"Hibbett Sports",icon:"fas-futbol",imageURL:"https://graph.facebook.com/HibbettSports/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5750671",shop:"sports"},addTags:{brand:"Hibbett Sports","brand:wikidata":"Q5750671","brand:wikipedia":"en:Hibbett Sports",name:"Hibbett Sports",shop:"sports"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/sports/Intersport":{name:"Intersport",icon:"fas-futbol",imageURL:"https://graph.facebook.com/intersportAT/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q666888",shop:"sports"},addTags:{brand:"Intersport","brand:wikidata":"Q666888","brand:wikipedia":"en:Intersport",name:"Intersport",shop:"sports"},terms:[],matchScore:2,suggestion:true},"shop/sports/JD Sports":{name:"JD Sports",icon:"fas-futbol",imageURL:"https://graph.facebook.com/JDSportsOfficial/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6108019",shop:"sports"},addTags:{brand:"JD Sports","brand:wikidata":"Q6108019","brand:wikipedia":"en:JD Sports",name:"JD Sports",shop:"sports"},countryCodes:["de","es","fr","gb","ie","nl"],terms:[],matchScore:2,suggestion:true},"shop/sports/Marathon Sports":{name:"Marathon Sports",icon:"fas-futbol",imageURL:"https://graph.facebook.com/marathonsports/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3027516",shop:"sports"},addTags:{brand:"Marathon Sports","brand:wikidata":"Q3027516","brand:wikipedia":"es:Marathon Sports",name:"Marathon Sports",shop:"sports"},countryCodes:["bo","ec","pe"],terms:[],matchScore:2,suggestion:true},"shop/sports/Martes Sport":{name:"Martes Sport",icon:"fas-futbol",imageURL:"https://graph.facebook.com/sklepmartes/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62073490",shop:"sports"},addTags:{brand:"Martes Sport","brand:wikidata":"Q62073490",name:"Martes Sport",shop:"sports"},countryCodes:["pl"],terms:[],matchScore:2,suggestion:true},"shop/sports/Modell’s Sporting Goods":{name:"Modell’s Sporting Goods",icon:"fas-futbol",imageURL:"https://graph.facebook.com/modells/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3317844",shop:"sports"},addTags:{brand:"Modell’s Sporting Goods","brand:wikidata":"Q3317844","brand:wikipedia":"en:Modell's Sporting Goods",name:"Modell’s Sporting Goods",shop:"sports"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/sports/Play It Again Sports":{name:"Play It Again Sports",icon:"fas-futbol",imageURL:"https://graph.facebook.com/playitagainsports/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7203029",shop:"sports"},addTags:{brand:"Play It Again Sports","brand:wikidata":"Q7203029","brand:wikipedia":"en:Play It Again Sports",name:"Play It Again Sports",shop:"sports"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"shop/sports/Sport 2000":{name:"Sport 2000",icon:"fas-futbol",imageURL:"https://graph.facebook.com/SPORT2000France/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q262394",shop:"sports"},addTags:{brand:"Sport 2000","brand:wikidata":"Q262394","brand:wikipedia":"de:Sport 2000",name:"Sport 2000",shop:"sports"},terms:[],matchScore:2,suggestion:true},"shop/sports/Sportisimo":{name:"Sportisimo",icon:"fas-futbol",imageURL:"https://graph.facebook.com/1463426373966592/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q54974273",shop:"sports"},addTags:{brand:"Sportisimo","brand:wikidata":"Q54974273",name:"Sportisimo",shop:"sports"},countryCodes:["cz","sk"],terms:[],matchScore:2,suggestion:true},"shop/sports/Sports Authority":{name:"Sports Authority",icon:"fas-futbol",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FSports%20Authority%20logo2011.jpg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q7579688",shop:"sports"},addTags:{brand:"Sports Authority","brand:wikidata":"Q7579688","brand:wikipedia":"en:Sports Authority",name:"Sports Authority",shop:"sports"},terms:[],matchScore:2,suggestion:true},"shop/sports/Sports Direct":{name:"Sports Direct",icon:"fas-futbol",imageURL:"https://graph.facebook.com/SportsDirect/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2913554",shop:"sports"},addTags:{brand:"Sports Direct","brand:wikidata":"Q2913554","brand:wikipedia":"en:Sports Direct",name:"Sports Direct",shop:"sports"},terms:[],matchScore:2,suggestion:true},"shop/sports/Спортмастер":{name:"Спортмастер",icon:"fas-futbol",imageURL:"https://graph.facebook.com/sportmaster.ru/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4438176",shop:"sports"},addTags:{brand:"Спортмастер","brand:en":"Sportmaster","brand:ru":"Спортмастер","brand:wikidata":"Q4438176","brand:wikipedia":"ru:Спортмастер",name:"Спортмастер","name:en":"Sportmaster","name:ru":"Спортмастер",shop:"sports"},countryCodes:["by","kz","ru","ua"],terms:["спортмастер гипер"],matchScore:2,suggestion:true},"shop/stationery/Bureau Vallée":{name:"Bureau Vallée",icon:"fas-paperclip",imageURL:"https://graph.facebook.com/BureauVallee/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q18385014",shop:"stationery"},addTags:{brand:"Bureau Vallée","brand:wikidata":"Q18385014","brand:wikipedia":"fr:Bureau Vallée",name:"Bureau Vallée",shop:"stationery"},terms:[],matchScore:2,suggestion:true},"shop/stationery/McPaper":{name:"McPaper",icon:"fas-paperclip",imageURL:"https://graph.facebook.com/mcpaperberlin/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1915329",shop:"stationery"},addTags:{brand:"McPaper","brand:wikidata":"Q1915329","brand:wikipedia":"de:McPaper",name:"McPaper",shop:"stationery"},countryCodes:["ch","de"],terms:[],matchScore:2,suggestion:true},"shop/stationery/Office Depot":{name:"Office Depot",icon:"fas-paperclip",imageURL:"https://graph.facebook.com/OfficeDepot/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1337797",shop:"stationery"},addTags:{brand:"Office Depot","brand:wikidata":"Q1337797","brand:wikipedia":"en:Office Depot",name:"Office Depot",shop:"stationery"},terms:[],matchScore:2,suggestion:true},"shop/stationery/OfficeMax":{name:"OfficeMax",icon:"fas-paperclip",imageURL:"https://graph.facebook.com/OfficeDepot/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7079111",shop:"stationery"},addTags:{brand:"OfficeMax","brand:wikidata":"Q7079111","brand:wikipedia":"en:OfficeMax",name:"OfficeMax",shop:"stationery"},terms:[],matchScore:2,suggestion:true},"shop/stationery/Officeworks":{name:"Officeworks",icon:"fas-paperclip",imageURL:"https://graph.facebook.com/officeworks/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7079486",shop:"stationery"},addTags:{brand:"Officeworks","brand:wikidata":"Q7079486","brand:wikipedia":"en:Officeworks",name:"Officeworks",shop:"stationery"},countryCodes:["au"],terms:[],matchScore:2,suggestion:true},"shop/stationery/Pagro":{name:"Pagro",icon:"fas-paperclip",imageURL:"https://graph.facebook.com/pagro.at/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q57550022",shop:"stationery"},addTags:{brand:"Pagro","brand:wikidata":"Q57550022",name:"Pagro",shop:"stationery"},countryCodes:["at"],terms:[],matchScore:2,suggestion:true},"shop/stationery/Paper Source":{name:"Paper Source",icon:"fas-paperclip",imageURL:"https://graph.facebook.com/PaperSource/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q25000269",shop:"stationery"},addTags:{brand:"Paper Source","brand:wikidata":"Q25000269","brand:wikipedia":"en:Paper Source",name:"Paper Source",shop:"stationery"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/stationery/Paperchase":{name:"Paperchase",icon:"fas-paperclip",imageURL:"https://graph.facebook.com/paperchase/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7132739",shop:"stationery"},addTags:{brand:"Paperchase","brand:wikidata":"Q7132739","brand:wikipedia":"en:Paperchase",name:"Paperchase",shop:"stationery"},terms:[],matchScore:2,suggestion:true},"shop/stationery/Ryman":{name:"Ryman",icon:"fas-paperclip",imageURL:"https://graph.facebook.com/ryman/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7385188",shop:"stationery"},addTags:{brand:"Ryman","brand:wikidata":"Q7385188","brand:wikipedia":"en:Ryman",name:"Ryman",shop:"stationery"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/stationery/Staples":{name:"Staples",icon:"fas-paperclip",imageURL:"https://graph.facebook.com/staples/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q785943",shop:"stationery"},addTags:{brand:"Staples","brand:wikidata":"Q785943","brand:wikipedia":"en:Staples Inc.",name:"Staples",shop:"stationery"},terms:[],matchScore:2,suggestion:true},"shop/stationery/Комус":{name:"Комус",icon:"fas-paperclip",imageURL:"https://graph.facebook.com/komusclub/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4230314",shop:"stationery"},addTags:{brand:"Комус","brand:en":"Komus","brand:wikidata":"Q4230314","brand:wikipedia":"en:Komus (company)",name:"Комус","name:en":"Komus",shop:"stationery"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"shop/storage_rental/Extra Space Storage":{name:"Extra Space Storage",icon:"fas-warehouse",imageURL:"https://graph.facebook.com/extraspace/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5422162",shop:"storage_rental"},addTags:{brand:"Extra Space Storage","brand:wikidata":"Q5422162","brand:wikipedia":"en:Extra Space Storage",name:"Extra Space Storage",shop:"storage_rental"},countryCodes:["pr","us"],terms:[],matchScore:2,suggestion:true},"shop/storage_rental/Public Storage":{name:"Public Storage",icon:"fas-warehouse",imageURL:"https://graph.facebook.com/PublicStorage/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1156045",shop:"storage_rental"},addTags:{brand:"Public Storage","brand:wikidata":"Q1156045","brand:wikipedia":"en:Public Storage",name:"Public Storage",shop:"storage_rental"},terms:[],matchScore:2,suggestion:true},"shop/supermarket/8 à Huit":{name:"8 à Huit",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q2818601",shop:"supermarket"},addTags:{brand:"8 à Huit","brand:wikidata":"Q2818601","brand:wikipedia":"fr:8 à Huit",name:"8 à Huit",shop:"supermarket"},terms:[],matchScore:2,suggestion:true},"shop/supermarket/99 Ranch Market":{name:"99 Ranch Market",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q3600279",shop:"supermarket"},addTags:{brand:"99 Ranch Market","brand:wikidata":"Q3600279","brand:wikipedia":"en:99 Ranch Market",cuisine:"asian",name:"99 Ranch Market","name:en":"99 Ranch Market","name:zh-Hans":"大华超级市场","name:zh-Hant":"大華超級市場",shop:"supermarket"},countryCodes:["us"],terms:["99 ranch","ranch 99"],matchScore:2,suggestion:true},"shop/supermarket/A&O":{name:"A&O",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q3600279",shop:"supermarket"},addTags:{brand:"A&O","brand:wikidata":"Q3600279","brand:wikipedia":"it:A&O",name:"A&O",shop:"supermarket"},countryCodes:["it"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/A101":{name:"A101",icon:"maki-grocery",imageURL:"https://pbs.twimg.com/profile_images/996489765544448000/kwXc3FEH_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q6034496",shop:"supermarket"},addTags:{brand:"A101","brand:wikidata":"Q6034496","brand:wikipedia":"tr:A101",name:"A101",shop:"supermarket"},countryCodes:["tr"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/AD Delhaize":{name:"AD Delhaize",icon:"maki-grocery",imageURL:"https://graph.facebook.com/Delhaize/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1184173",shop:"supermarket"},addTags:{brand:"AD Delhaize","brand:wikidata":"Q1184173","brand:wikipedia":"fr:Delhaize",name:"AD Delhaize",shop:"supermarket"},countryCodes:["be","lu"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/ADEG":{name:"ADEG",icon:"maki-grocery",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FAdeg%20logo%20gruen%202015.jpg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q290211",shop:"supermarket"},addTags:{brand:"ADEG","brand:wikidata":"Q290211","brand:wikipedia":"de:ADEG Österreich",name:"ADEG",shop:"supermarket"},countryCodes:["at"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Acme":{name:"Acme",icon:"maki-grocery",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FAcme%20Markets%20lolo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q341975",shop:"supermarket"},addTags:{brand:"Acme","brand:wikidata":"Q341975","brand:wikipedia":"en:Acme Markets",name:"Acme",shop:"supermarket"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Ahorramás":{name:"Ahorramás",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q58221883",shop:"supermarket"},addTags:{brand:"Ahorramás","brand:wikidata":"Q58221883",name:"Ahorramás",shop:"supermarket"},countryCodes:["es"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Albert":{name:"Albert",icon:"maki-grocery",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FAlbert%20Logo.png&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q9144241",shop:"supermarket"},addTags:{brand:"Albert","brand:wikidata":"Q9144241","brand:wikipedia":"cs:Albert (obchodní řetězec)",name:"Albert",shop:"supermarket"},countryCodes:["cz"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Albert Heijn":{name:"Albert Heijn",icon:"maki-grocery",imageURL:"https://graph.facebook.com/albertheijn/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1653985",shop:"supermarket"},addTags:{brand:"Albert Heijn","brand:wikidata":"Q1653985","brand:wikipedia":"nl:Albert Heijn (supermarkt)",name:"Albert Heijn",shop:"supermarket"},countryCodes:["be","nl"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Albertsons":{name:"Albertsons",icon:"maki-grocery",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FAlbertsons%20logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q4712282",shop:"supermarket"},addTags:{brand:"Albertsons","brand:wikidata":"Q4712282","brand:wikipedia":"en:Albertsons",name:"Albertsons",shop:"supermarket"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Aldi":{name:"Aldi",icon:"maki-grocery",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FAldiWorldwideLogo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q125054",shop:"supermarket"},addTags:{brand:"Aldi","brand:wikidata":"Q125054","brand:wikipedia":"en:Aldi",name:"Aldi",shop:"supermarket"},terms:[],matchScore:2,suggestion:true},"shop/supermarket/Aldi Nord":{name:"Aldi Nord",icon:"maki-grocery",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FALDI%20Nord%20Logo%202015.png&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q41171373",shop:"supermarket"},addTags:{brand:"Aldi Nord","brand:wikidata":"Q41171373","brand:wikipedia":"en:Aldi",name:"Aldi Nord",shop:"supermarket"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Aldi Süd":{name:"Aldi Süd",icon:"maki-grocery",imageURL:"https://graph.facebook.com/ALDI.SUED/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q41171672",shop:"supermarket"},addTags:{brand:"Aldi Süd","brand:wikidata":"Q41171672","brand:wikipedia":"en:Aldi",name:"Aldi Süd",shop:"supermarket"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Alfamart":{name:"Alfamart",icon:"maki-grocery",imageURL:"https://graph.facebook.com/alfamartku/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q23745600",shop:"supermarket"},addTags:{brand:"Alfamart","brand:wikidata":"Q23745600","brand:wikipedia":"en:Alfamart",name:"Alfamart",shop:"supermarket"},terms:[],matchScore:2,suggestion:true},"shop/supermarket/Alimerka":{name:"Alimerka",icon:"maki-grocery",imageURL:"https://pbs.twimg.com/profile_images/659793335503204352/7J6NiZzm_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q16482738",shop:"supermarket"},addTags:{brand:"Alimerka","brand:wikidata":"Q16482738","brand:wikipedia":"es:Alimerka",name:"Alimerka",shop:"supermarket"},countryCodes:["es"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Alnatura":{name:"Alnatura",icon:"maki-grocery",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FAlnatura-Logo-2017.png&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q876811",shop:"supermarket"},addTags:{brand:"Alnatura","brand:wikidata":"Q876811","brand:wikipedia":"en:Alnatura",name:"Alnatura",organic:"only",shop:"supermarket"},countryCodes:["ch","de"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Asda":{name:"Asda",icon:"maki-grocery",imageURL:"https://graph.facebook.com/Asda/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q297410",shop:"supermarket"},addTags:{brand:"Asda","brand:wikidata":"Q297410","brand:wikipedia":"en:Asda",name:"Asda",shop:"supermarket"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Atacadão":{name:"Atacadão",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q2868739",shop:"supermarket"},addTags:{brand:"Atacadão","brand:wikidata":"Q2868739","brand:wikipedia":"en:Atacadão",name:"Atacadão",shop:"supermarket"},countryCodes:["br"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Auchan":{name:"Auchan",icon:"maki-grocery",imageURL:"https://pbs.twimg.com/profile_images/877095334316576768/bhQDPUWZ_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q758603",shop:"supermarket"},addTags:{brand:"Auchan","brand:wikidata":"Q758603","brand:wikipedia":"en:Auchan",name:"Auchan",shop:"supermarket"},terms:[],matchScore:2,suggestion:true},"shop/supermarket/BM":{name:"BM",icon:"maki-grocery",imageURL:"https://graph.facebook.com/BM-Supermercados-147042362658546/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62073462",shop:"supermarket"},addTags:{brand:"BM","brand:wikidata":"Q62073462",name:"BM",shop:"supermarket"},terms:[],matchScore:2,suggestion:true},"shop/supermarket/Bi-Lo":{name:"Bi-Lo",icon:"maki-grocery",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FBI%E2%80%A2LO-brand.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q4835622",shop:"supermarket"},addTags:{brand:"Bi-Lo","brand:wikidata":"Q4835622","brand:wikipedia":"en:BI-LO (Australia)",name:"Bi-Lo",shop:"supermarket"},countryCodes:["au","us"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Biedronka":{name:"Biedronka",icon:"maki-grocery",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FGda%C5%84sk%20ulica%20Pomorska%2024%20(Biedronka).JPG&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q857182",shop:"supermarket"},addTags:{brand:"Biedronka","brand:wikidata":"Q857182","brand:wikipedia":"pl:Biedronka (sieć handlowa)",name:"Biedronka",shop:"supermarket"},countryCodes:["pl"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Big Bazaar":{name:"Big Bazaar",icon:"maki-grocery",imageURL:"https://graph.facebook.com/BigBazaar/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3631008",shop:"supermarket"},addTags:{brand:"Big Bazaar","brand:wikidata":"Q3631008","brand:wikipedia":"en:Big Bazaar",name:"Big Bazaar",shop:"supermarket"},countryCodes:["in"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Big C":{name:"Big C",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q858665",shop:"supermarket"},addTags:{brand:"Big C","brand:wikidata":"Q858665","brand:wikipedia":"en:Big C",name:"Big C",shop:"supermarket"},countryCodes:["th","vn"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Billa":{name:"Billa",icon:"maki-grocery",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FBilla-Logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q537781",shop:"supermarket"},addTags:{brand:"Billa","brand:wikidata":"Q537781","brand:wikipedia":"en:Billa (supermarket)",name:"Billa",shop:"supermarket"},terms:[],matchScore:2,suggestion:true},"shop/supermarket/Bim":{name:"Bim",icon:"maki-grocery",imageURL:"https://graph.facebook.com/bimturkiye/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1022075",shop:"supermarket"},addTags:{brand:"Bim","brand:wikidata":"Q1022075","brand:wikipedia":"en:Bim (company)",name:"Bim",shop:"supermarket"},countryCodes:["ma","tr"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Bingo":{name:"Bingo",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q16842066",shop:"supermarket"},addTags:{brand:"Bingo","brand:wikidata":"Q16842066","brand:wikipedia":"bs:Bingo (kompanija)",name:"Bingo",shop:"supermarket"},countryCodes:["ba"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Bio Company":{name:"Bio Company",icon:"maki-grocery",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FBio%20Company%20logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q864179",shop:"supermarket"},addTags:{brand:"Bio Company","brand:wikidata":"Q864179","brand:wikipedia":"de:Bio Company",name:"Bio Company",organic:"only",shop:"supermarket"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Biocoop":{name:"Biocoop",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q2904039",shop:"supermarket"},addTags:{brand:"Biocoop","brand:wikidata":"Q2904039","brand:wikipedia":"fr:Biocoop",name:"Biocoop",shop:"supermarket"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Bodega Aurrera":{name:"Bodega Aurrera",icon:"maki-grocery",imageURL:"https://graph.facebook.com/BodegaAurrera/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3365858",shop:"supermarket"},addTags:{brand:"Bodega Aurrera","brand:wikidata":"Q3365858","brand:wikipedia":"en:Bodega Aurrerá",name:"Bodega Aurrera",shop:"supermarket"},terms:[],matchScore:2,suggestion:true},"shop/supermarket/Bravo":{name:"Bravo",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q16985159",shop:"supermarket"},addTags:{brand:"Bravo","brand:wikidata":"Q16985159","brand:wikipedia":"en:Bravo (supermarket)",name:"Bravo",shop:"supermarket"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Brookshire Brothers":{name:"Brookshire Brothers",icon:"maki-grocery",imageURL:"https://graph.facebook.com/BrookshireBros/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4975084",shop:"supermarket"},addTags:{brand:"Brookshire Brothers","brand:wikidata":"Q4975084","brand:wikipedia":"en:Brookshire Brothers",name:"Brookshire Brothers",shop:"supermarket"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Brookshire's":{name:"Brookshire's",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q4975085",shop:"supermarket"},addTags:{brand:"Brookshire's","brand:wikidata":"Q4975085","brand:wikipedia":"en:Brookshire Grocery Company",name:"Brookshire's",shop:"supermarket"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Budgens":{name:"Budgens",icon:"maki-grocery",imageURL:"https://pbs.twimg.com/profile_images/796001828966203392/69ZeL67f_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q4985016",shop:"supermarket"},addTags:{brand:"Budgens","brand:wikidata":"Q4985016","brand:wikipedia":"en:Budgens",name:"Budgens",shop:"supermarket"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Bulk Barn":{name:"Bulk Barn",icon:"maki-grocery",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FBulk%20Barn%20Logo.jpg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q4996466",shop:"supermarket"},addTags:{brand:"Bulk Barn","brand:wikidata":"Q4996466",name:"Bulk Barn",shop:"supermarket"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Bunnpris":{name:"Bunnpris",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q1774634",shop:"supermarket"},addTags:{brand:"Bunnpris","brand:wikidata":"Q1774634","brand:wikipedia":"en:Bunnpris",name:"Bunnpris",shop:"supermarket"},countryCodes:["no"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/C-Town Supermarkets":{name:"C-Town Supermarkets",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q5005929",shop:"supermarket"},addTags:{brand:"C-Town Supermarkets","brand:wikidata":"Q5005929","brand:wikipedia":"en:C-Town Supermarkets",name:"C-Town",shop:"supermarket"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/CBA":{name:"CBA",icon:"maki-grocery",imageURL:"https://graph.facebook.com/cbaboltok/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q779845",shop:"supermarket"},addTags:{brand:"CBA","brand:wikidata":"Q779845","brand:wikipedia":"en:CBA (food retail)",name:"CBA",shop:"supermarket"},terms:[],matchScore:2,suggestion:true},"shop/supermarket/COOP Jednota":{name:"COOP Jednota",icon:"maki-grocery",imageURL:"https://graph.facebook.com/COOPJednota/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q41629254",shop:"supermarket"},addTags:{brand:"COOP Jednota","brand:wikidata":"Q41629254","brand:wikipedia":"sk:COOP Jednota Slovensko",name:"COOP Jednota",shop:"supermarket"},countryCodes:["cz","sk"],terms:["jednota"],matchScore:2,suggestion:true},"shop/supermarket/Caprabo":{name:"Caprabo",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q1980781",shop:"supermarket"},addTags:{brand:"Caprabo","brand:wikidata":"Q1980781","brand:wikipedia":"en:Caprabo",name:"Caprabo",shop:"supermarket"},countryCodes:["ad","es"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Cargills Food City":{name:"Cargills Food City",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q58353955",shop:"supermarket"},addTags:{brand:"Cargills Food City","brand:wikidata":"Q58353955",name:"Cargills Food City","operator:wikidata":"Q5039260","operator:wikipedia":"en:Cargills (Ceylon)",shop:"supermarket"},countryCodes:["lk"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Carrefour":{name:"Carrefour",icon:"maki-grocery",imageURL:"https://graph.facebook.com/carrefouritalia/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q217599",shop:"supermarket"},addTags:{brand:"Carrefour","brand:wikidata":"Q217599","brand:wikipedia":"fr:Carrefour (enseigne)",name:"Carrefour",operator:"Groupe Carrefour","operator:wikidata":"Q3117359","operator:wikipedia":"fr:Groupe Carrefour",shop:"supermarket"},terms:[],matchScore:2,suggestion:true},"shop/supermarket/Carrefour City":{name:"Carrefour City",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q2940187",shop:"supermarket"},addTags:{brand:"Carrefour City","brand:wikidata":"Q2940187","brand:wikipedia":"fr:Carrefour City",name:"Carrefour City",operator:"Groupe Carrefour","operator:wikidata":"Q3117359","operator:wikipedia":"fr:Groupe Carrefour",shop:"supermarket"},terms:[],matchScore:2,suggestion:true},"shop/supermarket/Carrefour Contact":{name:"Carrefour Contact",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q2940188",shop:"supermarket"},addTags:{brand:"Carrefour Contact","brand:wikidata":"Q2940188","brand:wikipedia":"fr:Carrefour Contact",name:"Carrefour Contact",operator:"Groupe Carrefour","operator:wikidata":"Q3117359","operator:wikipedia":"fr:Groupe Carrefour",shop:"supermarket"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Carrefour Express":{name:"Carrefour Express",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q2940190",shop:"supermarket"},addTags:{brand:"Carrefour Express","brand:wikidata":"Q2940190","brand:wikipedia":"fr:Carrefour Express",name:"Carrefour Express",operator:"Groupe Carrefour","operator:wikidata":"Q3117359","operator:wikipedia":"fr:Groupe Carrefour",shop:"supermarket"},terms:[],matchScore:2,suggestion:true},"shop/supermarket/Carrefour Market":{name:"Carrefour Market",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q2689639",shop:"supermarket"},addTags:{brand:"Carrefour Market","brand:wikidata":"Q2689639","brand:wikipedia":"fr:Carrefour Market",name:"Carrefour Market",operator:"Groupe Carrefour","operator:wikidata":"Q3117359","operator:wikipedia":"fr:Groupe Carrefour",shop:"supermarket"},terms:[],matchScore:2,suggestion:true},"shop/supermarket/Carulla":{name:"Carulla",icon:"maki-grocery",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FCarulla%20logo.png&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q5047480",shop:"supermarket"},addTags:{brand:"Carulla","brand:wikidata":"Q5047480","brand:wikipedia":"en:Carulla",name:"Carulla",shop:"supermarket"},countryCodes:["co"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Centre Commercial E. Leclerc":{name:"Centre Commercial E. Leclerc",icon:"maki-grocery",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FE.Leclerc%20logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q1273376",shop:"supermarket"},addTags:{brand:"Centre Commercial E. Leclerc","brand:wikidata":"Q1273376","brand:wikipedia":"fr:E.Leclerc",name:"Centre Commercial E. Leclerc",shop:"supermarket"},terms:[],matchScore:2,suggestion:true},"shop/supermarket/Chata Polska":{name:"Chata Polska",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q61994406",shop:"supermarket"},addTags:{brand:"Chata Polska","brand:wikidata":"Q61994406",name:"Chata Polska",shop:"supermarket"},countryCodes:["pl"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Checkers":{name:"Checkers",icon:"maki-grocery",imageURL:"https://graph.facebook.com/checkerssa/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5089126",shop:"supermarket"},addTags:{brand:"Checkers","brand:wikidata":"Q5089126","brand:wikipedia":"en:Checkers (supermarket chain)",name:"Checkers",shop:"supermarket"},countryCodes:["bw","na","za"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Chedraui":{name:"Chedraui",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q2961952",shop:"supermarket"},addTags:{brand:"Chedraui","brand:wikidata":"Q2961952","brand:wikipedia":"en:Chedraui",name:"Chedraui",shop:"supermarket"},countryCodes:["mx"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/City Market":{name:"City Market",icon:"maki-grocery",imageURL:"https://graph.facebook.com/CityMarketGrocery/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5123299",shop:"supermarket"},addTags:{brand:"City Market","brand:wikidata":"Q5123299","brand:wikipedia":"en:City Market (US grocery store chain)",name:"City Market",shop:"supermarket"},terms:[],matchScore:2,suggestion:true},"shop/supermarket/Co-op (Canada)":{name:"Co-op (Canada)",icon:"maki-grocery",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FSaskatoon%20Co-op%20Logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q5440676",shop:"supermarket"},addTags:{brand:"Federated Co-operatives","brand:wikidata":"Q5440676","brand:wikipedia":"en:Federated Co-operatives",name:"Co-op",shop:"supermarket"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Coles":{name:"Coles",icon:"maki-grocery",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FColes%20logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q1108172",shop:"supermarket"},addTags:{brand:"Coles","brand:wikidata":"Q1108172","brand:wikipedia":"en:Coles Supermarkets",name:"Coles",shop:"supermarket"},countryCodes:["au","gb"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Colruyt":{name:"Colruyt",icon:"maki-grocery",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FColruyt%20logo.png&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q2363991",shop:"supermarket"},addTags:{brand:"Colruyt","brand:wikidata":"Q2363991","brand:wikipedia":"en:Colruyt (supermarket)",name:"Colruyt",shop:"supermarket"},countryCodes:["be","fr","lu"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Combi":{name:"Combi",icon:"maki-grocery",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FCombi.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q1113618",shop:"supermarket"},addTags:{brand:"Combi","brand:wikidata":"Q1113618","brand:wikipedia":"de:Combi (Einkaufsmarkt)",name:"Combi",shop:"supermarket"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Comercial Mexicana":{name:"Comercial Mexicana",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q2985173",shop:"supermarket"},addTags:{brand:"Comercial Mexicana","brand:wikidata":"Q2985173","brand:wikipedia":"en:Comercial Mexicana",name:"Comercial Mexicana",shop:"supermarket"},countryCodes:["mx","us"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Conad":{name:"Conad",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q639075",shop:"supermarket"},addTags:{brand:"Conad","brand:wikidata":"Q639075","brand:wikipedia":"it:Conad",name:"Conad",shop:"supermarket"},countryCodes:["al","it"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Conad City":{name:"Conad City",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q57543102",shop:"supermarket"},addTags:{brand:"Conad City","brand:wikidata":"Q57543102",name:"Conad City",shop:"supermarket"},countryCodes:["it"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Condis":{name:"Condis",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q57417581",shop:"supermarket"},addTags:{brand:"Condis","brand:wikidata":"Q57417581",name:"Condis",shop:"supermarket"},countryCodes:["es"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Consum":{name:"Consum",icon:"maki-grocery",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FConsum%20Cooperativa.jpg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q8350308",shop:"supermarket"},addTags:{brand:"Consum","brand:wikidata":"Q8350308","brand:wikipedia":"es:Consum",name:"Consum",shop:"supermarket"},countryCodes:["es"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Continente":{name:"Continente",icon:"maki-grocery",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FLogocontinente.jpg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q2995683",shop:"supermarket"},addTags:{brand:"Continente","brand:wikidata":"Q2995683","brand:wikipedia":"en:Continente (Supermarket)",name:"Continente",shop:"supermarket"},countryCodes:["pt"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Coop Prix":{name:"Coop Prix",icon:"maki-grocery",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FCoop%20Prix.png&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q5167705",shop:"supermarket"},addTags:{brand:"Coop Prix","brand:wikidata":"Q5167705","brand:wikipedia":"no:Coop Prix",name:"Coop Prix",shop:"supermarket"},countryCodes:["no"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Coop (Schweiz)":{name:"Coop (Schweiz)",icon:"maki-grocery",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FCoop.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q432564",shop:"supermarket"},addTags:{brand:"Coop","brand:wikidata":"Q432564","brand:wikipedia":"de:Coop (Schweiz)",name:"Coop",shop:"supermarket"},countryCodes:["ch"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Cora":{name:"Cora",icon:"maki-grocery",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FCora%20logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q686643",shop:"supermarket"},addTags:{brand:"Cora","brand:wikidata":"Q686643","brand:wikipedia":"en:Cora (hypermarket)",name:"Cora",shop:"supermarket"},countryCodes:["be","fr","lu","ro"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Costcutter":{name:"Costcutter",icon:"maki-grocery",imageURL:"https://graph.facebook.com/costcutter/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5175072",shop:"supermarket"},addTags:{brand:"Costcutter","brand:wikidata":"Q5175072","brand:wikipedia":"en:Costcutter",name:"Costcutter",shop:"supermarket"},terms:[],matchScore:2,suggestion:true},"shop/supermarket/Coto":{name:"Coto",icon:"maki-grocery",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FCoto%20superm%20logo.png&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q5175411",shop:"supermarket"},addTags:{brand:"Coto","brand:wikidata":"Q5175411","brand:wikipedia":"es:Coto (supermercado)",name:"Coto",shop:"supermarket"},countryCodes:["ar"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Countdown":{name:"Countdown",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q5176845",shop:"supermarket"},addTags:{brand:"Countdown","brand:wikidata":"Q5176845","brand:wikipedia":"en:Countdown (supermarket)",name:"Countdown",shop:"supermarket"},countryCodes:["nz"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Cub Foods":{name:"Cub Foods",icon:"maki-grocery",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FCub%20Foods.png&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q5191916",shop:"supermarket"},addTags:{brand:"Cub Foods","brand:wikidata":"Q5191916","brand:wikipedia":"en:Cub Foods",name:"Cub Foods",shop:"supermarket"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/D'Agostino":{name:"D'Agostino",icon:"maki-grocery",imageURL:"https://graph.facebook.com/yourdagnyc/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q20656844",shop:"supermarket"},addTags:{brand:"D'Agostino","brand:wikidata":"Q20656844","brand:wikipedia":"en:D'Agostino Supermarkets",name:"D'Agostino",shop:"supermarket"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/D1":{name:"D1",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q43403418",shop:"supermarket"},addTags:{brand:"D1","brand:wikidata":"Q43403418","brand:wikipedia":"es:Tiendas D1",name:"D1",shop:"supermarket"},countryCodes:["co"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Dagli'Brugsen":{name:"Dagli'Brugsen",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q12307017",shop:"supermarket"},addTags:{brand:"Dagli'Brugsen","brand:wikidata":"Q12307017","brand:wikipedia":"en:Dagli'Brugsen",name:"Dagli'Brugsen",shop:"supermarket"},countryCodes:["dk"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Deen":{name:"Deen",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q13571727",shop:"supermarket"},addTags:{brand:"Deen","brand:wikidata":"Q13571727","brand:wikipedia":"nl:Deen (supermarkt)",name:"Deen",shop:"supermarket"},countryCodes:["nl"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Delhaize":{name:"Delhaize",icon:"maki-grocery",imageURL:"https://graph.facebook.com/Delhaize/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1184173",shop:"supermarket"},addTags:{brand:"Delhaize","brand:wikidata":"Q1184173","brand:wikipedia":"fr:Delhaize",name:"Delhaize",shop:"supermarket"},countryCodes:["be","lu"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Delikatesy Centrum":{name:"Delikatesy Centrum",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q11693824",shop:"supermarket"},addTags:{brand:"Delikatesy Centrum","brand:wikidata":"Q11693824","brand:wikipedia":"pl:Delikatesy Centrum",name:"Delikatesy Centrum",shop:"supermarket"},countryCodes:["pl"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Denner":{name:"Denner",icon:"maki-grocery",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FDenner%20Logo%202014.jpg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q379911",shop:"supermarket"},addTags:{brand:"Denner","brand:wikidata":"Q379911","brand:wikipedia":"en:Denner (supermarket)",name:"Denner",shop:"supermarket"},countryCodes:["ch","li"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Despar":{name:"Despar",icon:"maki-grocery",imageURL:"https://graph.facebook.com/SPARintheUK/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q610492",shop:"supermarket"},addTags:{brand:"Spar","brand:wikidata":"Q610492","brand:wikipedia":"en:Spar (retailer)",name:"Despar",shop:"supermarket"},countryCodes:["it"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Despensa Familiar":{name:"Despensa Familiar",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q61994849",shop:"supermarket"},addTags:{brand:"Despensa Familiar","brand:wikidata":"Q61994849",name:"Despensa Familiar",shop:"supermarket"},terms:[],matchScore:2,suggestion:true},"shop/supermarket/Dia":{name:"Dia",icon:"maki-grocery",imageURL:"https://pbs.twimg.com/profile_images/800711981225410560/cuzfS3Pk_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q925132",shop:"supermarket"},addTags:{brand:"Dia","brand:wikidata":"Q925132","brand:wikipedia":"es:Supermercados DIA",name:"Dia",shop:"supermarket"},terms:["supermercado dia"],matchScore:2,suggestion:true},"shop/supermarket/Dia Market":{name:"Dia Market",icon:"maki-grocery",imageURL:"https://pbs.twimg.com/profile_images/800711981225410560/cuzfS3Pk_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q925132",shop:"supermarket"},addTags:{brand:"Dia Market","brand:wikidata":"Q925132","brand:wikipedia":"es:Supermercados DIA",name:"Dia Market",shop:"supermarket"},terms:[],matchScore:2,suggestion:true},"shop/supermarket/Dino":{name:"Dino",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q11694239",shop:"supermarket"},addTags:{brand:"Dino","brand:wikidata":"Q11694239","brand:wikipedia":"pl:Dino Polska",name:"Dino",shop:"supermarket"},countryCodes:["pl"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Dirk van den Broek":{name:"Dirk van den Broek",icon:"maki-grocery",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FDirk%20logo.png&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q17502722",shop:"supermarket"},addTags:{brand:"Dirk van den Broek","brand:wikidata":"Q17502722","brand:wikipedia":"en:Dirk (supermarket)",name:"Dirk van den Broek",shop:"supermarket"},countryCodes:["nl"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Disco (Argentina)":{name:"Disco (Argentina)",icon:"maki-grocery",imageURL:"https://graph.facebook.com/DiscoArgentina/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6135978",shop:"supermarket"},addTags:{brand:"Disco","brand:wikidata":"Q6135978","brand:wikipedia":"es:Disco (supermercado de Argentina)",name:"Disco",shop:"supermarket"},countryCodes:["ar"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Disco (Uruguay)":{name:"Disco (Uruguay)",icon:"maki-grocery",imageURL:"https://graph.facebook.com/discouruguay/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q16636819",shop:"supermarket"},addTags:{brand:"Disco","brand:wikidata":"Q16636819","brand:wikipedia":"es:Disco (supermercado de Uruguay)",name:"Disco",shop:"supermarket"},countryCodes:["uy"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Diska":{name:"Diska",icon:"maki-grocery",imageURL:"https://graph.facebook.com/diskamarkt/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62390177",shop:"supermarket"},addTags:{brand:"Diska","brand:wikidata":"Q62390177",name:"Diska",operator:"Edeka","operator:wikidata":"Q701755","operator:wikipedia":"en:Edeka",shop:"supermarket"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Dunnes Stores":{name:"Dunnes Stores",icon:"maki-grocery",imageURL:"https://pbs.twimg.com/profile_images/839449686054432768/Udhd8DjK_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q1266203",shop:"supermarket"},addTags:{brand:"Dunnes Stores","brand:wikidata":"Q1266203","brand:wikipedia":"en:Dunnes Stores",name:"Dunnes Stores",shop:"supermarket"},terms:[],matchScore:2,suggestion:true},"shop/supermarket/E-Center":{name:"E-Center",icon:"maki-grocery",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FLogo%20Edeka.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q701755",shop:"supermarket"},addTags:{brand:"E-Center","brand:wikidata":"Q701755","brand:wikipedia":"en:Edeka",name:"E-Center",shop:"supermarket"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/E. Leclerc":{name:"E. Leclerc",icon:"maki-grocery",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FE.Leclerc%20logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q1273376",shop:"supermarket"},addTags:{brand:"E. Leclerc","brand:wikidata":"Q1273376","brand:wikipedia":"en:E.Leclerc",name:"E. Leclerc",shop:"supermarket"},countryCodes:["es","fr","pl","pt"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/E. Leclerc Drive":{name:"E. Leclerc Drive",icon:"maki-grocery",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FE.Leclerc%20logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q1273376",shop:"supermarket"},addTags:{brand:"E. Leclerc Drive","brand:wikidata":"Q1273376","brand:wikipedia":"fr:E.Leclerc",name:"E. Leclerc Drive",operator:"E.Leclerc","operator:wikidata":"Q1273376","operator:wikipedia":"en:E.Leclerc",shop:"supermarket"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/EMTÉ":{name:"EMTÉ",icon:"maki-grocery",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FEmte%20logo.jpg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q3119122",shop:"supermarket"},addTags:{brand:"EMTÉ","brand:wikidata":"Q3119122","brand:wikipedia":"en:EMTÉ",name:"EMTÉ",shop:"supermarket"},countryCodes:["nl"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Edeka":{name:"Edeka",icon:"maki-grocery",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FLogo%20Edeka.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q701755",shop:"supermarket"},addTags:{brand:"Edeka","brand:wikidata":"Q701755","brand:wikipedia":"en:Edeka",name:"Edeka",shop:"supermarket"},countryCodes:["de"],terms:["edeka neukauf"],matchScore:2,suggestion:true},"shop/supermarket/Eko":{name:"Eko",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q9251859",shop:"supermarket"},addTags:{brand:"Eko","brand:wikidata":"Q9251859","brand:wikipedia":"pl:Eko Holding",name:"Eko",shop:"supermarket"},countryCodes:["pl"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Ekom":{name:"Ekom",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q62073442",shop:"supermarket"},addTags:{brand:"Ekom","brand:wikidata":"Q62073442",name:"Ekom",shop:"supermarket"},countryCodes:["it"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Ekono":{name:"Ekono",icon:"maki-grocery",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FLogotipo%20Ekono.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q2842729",shop:"supermarket"},addTags:{brand:"Ekono","brand:wikidata":"Q2842729","brand:wikipedia":"es:Ekono",name:"Ekono",shop:"supermarket"},countryCodes:["cl"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Eroski":{name:"Eroski",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q1361349",shop:"supermarket"},addTags:{brand:"Eroski","brand:wikidata":"Q1361349","brand:wikipedia":"en:Eroski",name:"Eroski",shop:"supermarket"},countryCodes:["es","gi"],terms:["charter","eroski center"],matchScore:2,suggestion:true},"shop/supermarket/Esselunga":{name:"Esselunga",icon:"maki-grocery",imageURL:"https://graph.facebook.com/Esselunga/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1059636",shop:"supermarket"},addTags:{brand:"Esselunga","brand:wikidata":"Q1059636","brand:wikipedia":"en:Esselunga",name:"Esselunga",shop:"supermarket"},countryCodes:["it"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/EuroSpin":{name:"EuroSpin",icon:"maki-grocery",imageURL:"https://graph.facebook.com/EurospinItaliaSpa/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1374674",shop:"supermarket"},addTags:{brand:"EuroSpin","brand:wikidata":"Q1374674","brand:wikipedia":"it:Eurospin",name:"EuroSpin",shop:"supermarket"},countryCodes:["it","si"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Eurospar":{name:"Eurospar",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q12309283",shop:"supermarket"},addTags:{brand:"Eurospar","brand:wikidata":"Q12309283","brand:wikipedia":"da:Eurospar",name:"Eurospar",shop:"supermarket"},terms:[],matchScore:2,suggestion:true},"shop/supermarket/Extra":{name:"Extra",icon:"maki-grocery",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FExtra%20mobillogo.png&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q11964085",shop:"supermarket"},addTags:{brand:"Extra","brand:wikidata":"Q11964085","brand:wikipedia":"no:Extra (Coop)",name:"Extra",shop:"supermarket"},terms:["coop extra"],matchScore:2,suggestion:true},"shop/supermarket/Famila":{name:"Famila",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q1395108",shop:"supermarket"},addTags:{brand:"Famila","brand:wikidata":"Q1395108","brand:wikipedia":"de:Famila",name:"Famila",shop:"supermarket"},countryCodes:["de","it"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Fareway":{name:"Fareway",icon:"maki-grocery",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FFareway%20Food%20Stores%2C%20Inc-%20company%20logo-%202014-04-03%2017-22.jpg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q5434998",shop:"supermarket"},addTags:{brand:"Fareway","brand:wikidata":"Q5434998","brand:wikipedia":"en:Fareway",name:"Fareway",shop:"supermarket"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Farm Boy":{name:"Farm Boy",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q5435469",shop:"supermarket"},addTags:{brand:"Farm Boy","brand:wikidata":"Q5435469","brand:wikipedia":"en:Farm Boy",name:"Farm Boy",shop:"supermarket"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Farmfoods":{name:"Farmfoods",icon:"maki-grocery",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FFarmfoods%20Limited%20Logo.jpg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q5435841",shop:"supermarket"},addTags:{brand:"Farmfoods","brand:wikidata":"Q5435841","brand:wikipedia":"en:Farmfoods",name:"Farmfoods",shop:"supermarket"},countryCodes:["gb","sk"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Feneberg":{name:"Feneberg",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q5345378",shop:"supermarket"},addTags:{brand:"Feneberg","brand:wikidata":"Q5345378","brand:wikipedia":"de:Feneberg Lebensmittel",name:"Feneberg",shop:"supermarket"},countryCodes:["at","de"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Food 4 Less":{name:"Food 4 Less",icon:"maki-grocery",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FFood4Less%20logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q5465282",shop:"supermarket"},addTags:{brand:"Food 4 Less","brand:wikidata":"Q5465282","brand:wikipedia":"en:Food 4 Less",name:"Food 4 Less",shop:"supermarket"},terms:[],matchScore:2,suggestion:true},"shop/supermarket/Food Basics":{name:"Food Basics",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q5465300",shop:"supermarket"},addTags:{brand:"Food Basics","brand:wikidata":"Q5465300","brand:wikipedia":"en:Food Basics",name:"Food Basics",shop:"supermarket"},terms:[],matchScore:2,suggestion:true},"shop/supermarket/Food City":{name:"Food City",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q5465306",shop:"supermarket"},addTags:{brand:"Food City","brand:wikidata":"Q5465306","brand:wikipedia":"en:Food City (Canada)",name:"Food City",shop:"supermarket"},terms:[],matchScore:2,suggestion:true},"shop/supermarket/Food Lion":{name:"Food Lion",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q1435950",shop:"supermarket"},addTags:{brand:"Food Lion","brand:wikidata":"Q1435950","brand:wikipedia":"en:Food Lion",name:"Food Lion",shop:"supermarket"},countryCodes:["es","us"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/FoodLand (US)":{name:"FoodLand (US)",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q5465271",shop:"supermarket"},addTags:{brand:"FoodLand","brand:wikidata":"Q5465271","brand:wikipedia":"en:FoodLand",name:"FoodLand",shop:"supermarket"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/FoodMaxx":{name:"FoodMaxx",icon:"maki-grocery",imageURL:"https://graph.facebook.com/Foodmaxx/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q61894844",shop:"supermarket"},addTags:{brand:"FoodMaxx","brand:wikidata":"Q61894844",name:"FoodMaxx","operator:wikidata":"Q7428009","operator:wikipedia":"en:Save Mart Supermarkets",shop:"supermarket"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Foodland (Australia)":{name:"Foodland (Australia)",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q5465555",shop:"supermarket"},addTags:{brand:"Foodland","brand:wikidata":"Q5465555","brand:wikipedia":"en:Foodland (South Australia)",name:"Foodland",shop:"supermarket"},countryCodes:["au"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Foodland (Canada)":{name:"Foodland (Canada)",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q5465554",shop:"supermarket"},addTags:{brand:"Foodland","brand:wikidata":"Q5465554","brand:wikipedia":"en:Foodland (Canada)",name:"Foodland",shop:"supermarket"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Foodland (Hawaii)":{name:"Foodland (Hawaii)",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q5465560",shop:"supermarket"},addTags:{brand:"Foodland","brand:wikidata":"Q5465560","brand:wikipedia":"en:Foodland Hawaii",name:"Foodland",shop:"supermarket"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Foodworks":{name:"Foodworks",icon:"maki-grocery",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FFoodworks-Logo.jpg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q5465579",shop:"supermarket"},addTags:{brand:"Foodworks","brand:wikidata":"Q5465579","brand:wikipedia":"en:Foodworks",name:"Foodworks",shop:"supermarket"},countryCodes:["au"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Franprix":{name:"Franprix",icon:"maki-grocery",imageURL:"https://graph.facebook.com/franprix/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2420096",shop:"supermarket"},addTags:{brand:"Franprix","brand:wikidata":"Q2420096","brand:wikipedia":"fr:Franprix",name:"Franprix",shop:"supermarket"},terms:[],matchScore:2,suggestion:true},"shop/supermarket/Fred Meyer":{name:"Fred Meyer",icon:"maki-grocery",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FFred%20Meyer%20logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q5495932",shop:"supermarket"},addTags:{brand:"Fred Meyer","brand:wikidata":"Q5495932","brand:wikipedia":"en:Fred Meyer",name:"Fred Meyer",shop:"supermarket"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/FreshCo":{name:"FreshCo",icon:"maki-grocery",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FFreshCo%20logo.png&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q5502915",shop:"supermarket"},addTags:{brand:"FreshCo","brand:wikidata":"Q5502915","brand:wikipedia":"en:FreshCo",name:"FreshCo",shop:"supermarket"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Froiz":{name:"Froiz",icon:"maki-grocery",imageURL:"https://graph.facebook.com/158051157541336/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q17070775",shop:"supermarket"},addTags:{brand:"Froiz","brand:wikidata":"Q17070775","brand:wikipedia":"en:Froiz",name:"Froiz",shop:"supermarket"},countryCodes:["es","pt"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Føtex":{name:"Føtex",icon:"maki-grocery",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FF%C3%B8tex%20logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q1480395",shop:"supermarket"},addTags:{brand:"Føtex","brand:wikidata":"Q1480395","brand:wikipedia":"en:Føtex",name:"Føtex",shop:"supermarket"},countryCodes:["dk"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/G20":{name:"G20",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q3504731",shop:"supermarket"},addTags:{brand:"G20","brand:wikidata":"Q3504731","brand:wikipedia":"fr:Supermarchés G20",name:"G20",shop:"supermarket"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/GBarbosa":{name:"GBarbosa",icon:"maki-grocery",imageURL:"https://graph.facebook.com/oficialgbarbosa/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q10287817",shop:"supermarket"},addTags:{brand:"GBarbosa","brand:website":"http://www.gbarbosa.com.br","brand:wikidata":"Q10287817","brand:wikipedia":"pt:GBarbosa",name:"GBarbosa",shop:"supermarket"},countryCodes:["br"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Gadis":{name:"Gadis",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q12389151",shop:"supermarket"},addTags:{brand:"Gadis","brand:wikidata":"Q12389151","brand:wikipedia":"gl:Gadisa",name:"Gadis",shop:"supermarket"},countryCodes:["es"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Giant Eagle":{name:"Giant Eagle",icon:"maki-grocery",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FGiantEagle.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q1522721",shop:"supermarket"},addTags:{brand:"Giant Eagle","brand:wikidata":"Q1522721","brand:wikipedia":"en:Giant Eagle",name:"Giant Eagle",shop:"supermarket"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Globus":{name:"Globus",icon:"maki-grocery",imageURL:"https://graph.facebook.com/Globus.de/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q457503",shop:"supermarket"},addTags:{brand:"Globus","brand:wikidata":"Q457503","brand:wikipedia":"en:Globus (hypermarket)",name:"Globus",shop:"supermarket"},terms:[],matchScore:2,suggestion:true},"shop/supermarket/Gordon Food Service":{name:"Gordon Food Service",icon:"maki-grocery",imageURL:"https://graph.facebook.com/GordonFoodService/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1538006",shop:"supermarket"},addTags:{brand:"Gordon Food Service","brand:wikidata":"Q1538006","brand:wikipedia":"en:Gordon Food Service",name:"Gordon Food Service",shop:"supermarket"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Grand Frais":{name:"Grand Frais",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q3114675",shop:"supermarket"},addTags:{brand:"Grand Frais","brand:wikidata":"Q3114675","brand:wikipedia":"fr:Grand Frais",name:"Grand Frais",shop:"supermarket"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Grocery Outlet":{name:"Grocery Outlet",icon:"maki-grocery",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FGroceryoutlet%20logo.png&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q5609934",shop:"supermarket"},addTags:{brand:"Grocery Outlet","brand:wikidata":"Q5609934","brand:wikipedia":"en:Grocery Outlet",name:"Grocery Outlet",shop:"supermarket"},terms:[],matchScore:2,suggestion:true},"shop/supermarket/Groszek":{name:"Groszek",icon:"maki-grocery",imageURL:"https://graph.facebook.com/Sklepy.Groszek/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q9280965",shop:"supermarket"},addTags:{brand:"Groszek","brand:wikidata":"Q9280965","brand:wikipedia":"pl:Groszek (sieć sklepów)",name:"Groszek",shop:"supermarket"},countryCodes:["pl"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Géant Casino":{name:"Géant Casino",icon:"maki-grocery",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FLogo%20geant%202015%20rvb.png&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q1380537",shop:"supermarket"},addTags:{brand:"Géant Casino","brand:wikidata":"Q1380537","brand:wikipedia":"en:Géant Casino",name:"Géant Casino",shop:"supermarket"},countryCodes:["cg","fr"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/H Mart":{name:"H Mart",icon:"maki-grocery",imageURL:"https://graph.facebook.com/hmartofficial/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5636306",shop:"supermarket"},addTags:{"alt_name:ko":"H 마트",brand:"H Mart","brand:wikidata":"Q5636306","brand:wikipedia":"en:H Mart",cuisine:"asian",name:"H Mart","name:en":"H Mart","name:ko":"한아름","name:zh-Hans":"韩亚龙","name:zh-Hant":"韓亞龍",shop:"supermarket"},countryCodes:["ca","gb","us"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/H-E-B":{name:"H-E-B",icon:"maki-grocery",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FLogo%20of%20the%20HEB%20Grocery%20Company%2C%20LP.png&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q830621",shop:"supermarket"},addTags:{brand:"H-E-B","brand:wikidata":"Q830621","brand:wikipedia":"en:H-E-B",name:"H-E-B",shop:"supermarket"},countryCodes:["mx","us"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/HIT":{name:"HIT",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q1548713",shop:"supermarket"},addTags:{brand:"HIT","brand:wikidata":"Q1548713","brand:wikipedia":"de:HIT Handelsgruppe",name:"HIT",shop:"supermarket"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Hannaford":{name:"Hannaford",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q5648760",shop:"supermarket"},addTags:{brand:"Hannaford","brand:wikidata":"Q5648760","brand:wikipedia":"en:Hannaford Brothers Company",name:"Hannaford",shop:"supermarket"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Harris Teeter":{name:"Harris Teeter",icon:"maki-grocery",imageURL:"https://graph.facebook.com/harristeeter/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5665067",shop:"supermarket"},addTags:{brand:"Harris Teeter","brand:wikidata":"Q5665067","brand:wikipedia":"en:Harris Teeter",name:"Harris Teeter",shop:"supermarket"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Hemköp":{name:"Hemköp",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q10521746",shop:"supermarket"},addTags:{brand:"Hemköp","brand:wikidata":"Q10521746","brand:wikipedia":"sv:Hemköp",name:"Hemköp",shop:"supermarket"},countryCodes:["se"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Heron Foods":{name:"Heron Foods",icon:"maki-grocery",imageURL:"https://pbs.twimg.com/profile_images/589070024230440960/ZBf4EE6m_bigger.png",geometry:["point","area"],tags:{"brand:wikidata":"Q5743472",shop:"supermarket"},addTags:{brand:"Heron Foods","brand:wikidata":"Q5743472","brand:wikipedia":"en:Heron Foods",name:"Heron Foods",shop:"supermarket"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Hofer":{name:"Hofer",icon:"maki-grocery",imageURL:"https://graph.facebook.com/HOFER.AT/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q15815751",shop:"supermarket"},addTags:{brand:"Hofer","brand:wikidata":"Q15815751","brand:wikipedia":"de:Hofer KG",name:"Hofer",shop:"supermarket"},countryCodes:["at","si"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Hoogvliet":{name:"Hoogvliet",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q2770647",shop:"supermarket"},addTags:{brand:"Hoogvliet","brand:wikidata":"Q2770647","brand:wikipedia":"nl:Hoogvliet (supermarkt)",name:"Hoogvliet",shop:"supermarket"},countryCodes:["nl"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Hy-Vee":{name:"Hy-Vee",icon:"maki-grocery",imageURL:"https://graph.facebook.com/HyVee/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1639719",shop:"supermarket"},addTags:{brand:"Hy-Vee","brand:wikidata":"Q1639719","brand:wikipedia":"en:Hy-Vee",name:"Hy-Vee",shop:"supermarket"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Hyper U":{name:"Hyper U",icon:"maki-grocery",imageURL:"https://graph.facebook.com/ULesCommercants/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2529029",shop:"supermarket"},addTags:{brand:"Hyper U","brand:wikidata":"Q2529029","brand:wikipedia":"en:Système U",name:"Hyper U",shop:"supermarket"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/ICA":{name:"ICA",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q1663776",shop:"supermarket"},addTags:{brand:"ICA","brand:wikidata":"Q1663776","brand:wikipedia":"sv:Ica",name:"ICA",shop:"supermarket"},countryCodes:["no","se"],terms:["ica supermarket"],matchScore:2,suggestion:true},"shop/supermarket/ICA Kvantum":{name:"ICA Kvantum",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q1663776",shop:"supermarket"},addTags:{brand:"ICA Kvantum","brand:wikidata":"Q1663776","brand:wikipedia":"sv:Ica",name:"ICA Kvantum",shop:"supermarket"},countryCodes:["se"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/ICA Maxi":{name:"ICA Maxi",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q1663776",shop:"supermarket"},addTags:{brand:"ICA Maxi","brand:wikidata":"Q1663776","brand:wikipedia":"sv:Ica",name:"ICA Maxi",shop:"supermarket"},countryCodes:["no","se"],terms:["maxi"],matchScore:2,suggestion:true},"shop/supermarket/IDEA":{name:"IDEA",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q23461622",shop:"supermarket"},addTags:{brand:"IDEA","brand:wikidata":"Q23461622","brand:wikipedia":"en:Idea (supermarkets)",name:"IDEA",shop:"supermarket"},countryCodes:["rs"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/IGA":{name:"IGA",icon:"maki-grocery",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FIGA%20logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q3146662",shop:"supermarket"},addTags:{brand:"IGA","brand:wikidata":"Q3146662","brand:wikipedia":"en:IGA (supermarkets)",name:"IGA",shop:"supermarket"},terms:[],matchScore:2,suggestion:true},"shop/supermarket/Iceland":{name:"Iceland",icon:"maki-grocery",imageURL:"https://pbs.twimg.com/profile_images/998234843736457216/AqtyY1Rc_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q721810",shop:"supermarket"},addTags:{brand:"Iceland","brand:wikidata":"Q721810","brand:wikipedia":"en:Iceland (supermarket)",name:"Iceland",shop:"supermarket"},terms:[],matchScore:2,suggestion:true},"shop/supermarket/Ingles":{name:"Ingles",icon:"maki-grocery",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FIngles%20Markets%20Logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q6032595",shop:"supermarket"},addTags:{brand:"Ingles","brand:wikidata":"Q6032595","brand:wikipedia":"en:Ingles",name:"Ingles",shop:"supermarket"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Intermarché":{name:"Intermarché",icon:"maki-grocery",imageURL:"https://graph.facebook.com/tousuniscontrelaviechere/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3153200",shop:"supermarket"},addTags:{brand:"Intermarché","brand:wikidata":"Q3153200","brand:wikipedia":"fr:Intermarché",name:"Intermarché",shop:"supermarket"},terms:[],matchScore:2,suggestion:true},"shop/supermarket/Intermarché Super":{name:"Intermarché Super",icon:"maki-grocery",imageURL:"https://graph.facebook.com/tousuniscontrelaviechere/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3153200",shop:"supermarket"},addTags:{brand:"Intermarché Super","brand:wikidata":"Q3153200","brand:wikipedia":"fr:Intermarché",name:"Intermarché Super",shop:"supermarket"},countryCodes:["be","fr","pl","pt"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Interspar":{name:"Interspar",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q15820339",shop:"supermarket"},addTags:{brand:"Interspar","brand:wikidata":"Q15820339","brand:wikipedia":"de:Interspar (Österreich)",name:"Interspar",shop:"supermarket"},countryCodes:["at"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Irma":{name:"Irma",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q797150",shop:"supermarket"},addTags:{brand:"Irma","brand:wikidata":"Q797150","brand:wikipedia":"en:Irma (supermarket)",name:"Irma",shop:"supermarket"},countryCodes:["dk"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Jan Linders":{name:"Jan Linders",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q2200982",shop:"supermarket"},addTags:{brand:"Jan Linders","brand:wikidata":"Q2200982","brand:wikipedia":"nl:Jan Linders Supermarkten",name:"Jan Linders",shop:"supermarket"},countryCodes:["nl"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Jewel-Osco":{name:"Jewel-Osco",icon:"maki-grocery",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FJewel%20Osco%20logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q3178470",shop:"supermarket"},addTags:{brand:"Jewel-Osco","brand:wikidata":"Q3178470","brand:wikipedia":"en:Jewel (supermarket)",name:"Jewel-Osco",shop:"supermarket"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Joker":{name:"Joker",icon:"maki-grocery",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FJoker%20butikkjede%20norgesgruppen%20joker.jpg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q716328",shop:"supermarket"},addTags:{brand:"Joker","brand:wikidata":"Q716328","brand:wikipedia":"en:Joker (store)",name:"Joker",shop:"supermarket"},countryCodes:["no"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Jumbo":{name:"Jumbo",icon:"maki-grocery",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FJumbo%20Logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q2262314",shop:"supermarket"},addTags:{brand:"Jumbo","brand:wikidata":"Q2262314","brand:wikipedia":"en:Jumbo (supermarket)",name:"Jumbo",shop:"supermarket"},terms:[],matchScore:2,suggestion:true},"shop/supermarket/K+K":{name:"K+K",icon:"maki-grocery",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FK%2BK%20Logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q1718009",shop:"supermarket"},addTags:{brand:"K+K","brand:wikidata":"Q1718009","brand:wikipedia":"de:K+K Klaas & Kock",name:"K+K",shop:"supermarket"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Kaufland":{name:"Kaufland",icon:"maki-grocery",imageURL:"https://graph.facebook.com/132476996783723/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q685967",shop:"supermarket"},addTags:{brand:"Kaufland","brand:wikidata":"Q685967","brand:wikipedia":"en:Kaufland",name:"Kaufland",shop:"supermarket"},terms:[],matchScore:2,suggestion:true},"shop/supermarket/King Soopers":{name:"King Soopers",icon:"maki-grocery",imageURL:"https://pbs.twimg.com/profile_images/829113723746922497/a4882k9S_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q6412065",shop:"supermarket"},addTags:{brand:"King Soopers","brand:wikidata":"Q6412065","brand:wikipedia":"en:King Soopers",name:"King Soopers",shop:"supermarket"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Kiwi":{name:"Kiwi",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q1613639",shop:"supermarket"},addTags:{brand:"Kiwi","brand:wikidata":"Q1613639","brand:wikipedia":"en:Kiwi (store)",name:"Kiwi",shop:"supermarket"},countryCodes:["dk","no"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Kroger":{name:"Kroger",icon:"maki-grocery",imageURL:"https://graph.facebook.com/Kroger/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q153417",shop:"supermarket"},addTags:{brand:"Kroger","brand:wikidata":"Q153417","brand:wikipedia":"en:Kroger",name:"Kroger",shop:"supermarket"},terms:[],matchScore:2,suggestion:true},"shop/supermarket/Kvickly":{name:"Kvickly",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q7061148",shop:"supermarket"},addTags:{brand:"Kvickly","brand:wikidata":"Q7061148","brand:wikipedia":"en:Kvickly",name:"Kvickly",shop:"supermarket"},countryCodes:["dk"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/La Anónima":{name:"La Anónima",icon:"maki-grocery",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FSupermercados%20La%20anonima%20logo.jpg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q6135985",shop:"supermarket"},addTags:{brand:"La Anónima","brand:wikidata":"Q6135985","brand:wikipedia":"es:La Anónima",name:"La Anónima",shop:"supermarket"},countryCodes:["ar"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/La Plaza de DIA":{name:"La Plaza de DIA",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q58904673",shop:"supermarket"},addTags:{brand:"La Plaza de DIA","brand:wikidata":"Q58904673",name:"La Plaza de DIA","operator:wikidata":"Q925132","operator:wikipedia":"es:Supermercados DIA",shop:"supermarket"},countryCodes:["es"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/La Vie Claire":{name:"La Vie Claire",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q3213589",shop:"supermarket"},addTags:{brand:"La Vie Claire","brand:wikidata":"Q3213589","brand:wikipedia":"en:La Vie Claire (company)",name:"La Vie Claire",shop:"supermarket"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Landi":{name:"Landi",icon:"maki-grocery",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FLandi.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q1803010",shop:"supermarket"},addTags:{brand:"Landi","brand:wikidata":"Q1803010","brand:wikipedia":"en:Landi (Unternehmen)",name:"Landi",shop:"supermarket"},countryCodes:["ch"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Leader Price":{name:"Leader Price",icon:"maki-grocery",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FLeader%20Price%202010%20Logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q2181426",shop:"supermarket"},addTags:{brand:"Leader Price","brand:wikidata":"Q2181426","brand:wikipedia":"en:Leader Price",name:"Leader Price",shop:"supermarket"},terms:[],matchScore:2,suggestion:true},"shop/supermarket/Lewiatan":{name:"Lewiatan",icon:"maki-grocery",imageURL:"https://graph.facebook.com/psh.lewiatan/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11755396",shop:"supermarket"},addTags:{brand:"Lewiatan","brand:wikidata":"Q11755396","brand:wikipedia":"pl:Lewiatan (sieć handlowa)",name:"Lewiatan",shop:"supermarket"},countryCodes:["pl"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Lider":{name:"Lider",icon:"maki-grocery",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FL%C3%ADder%20logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q6711261",shop:"supermarket"},addTags:{brand:"Lider","brand:wikidata":"Q6711261","brand:wikipedia":"es:Líder (supermercado)",name:"Lider",shop:"supermarket"},countryCodes:["cl"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Lider Express":{name:"Lider Express",icon:"maki-grocery",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FL%C3%ADder%20logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q6711261",shop:"supermarket"},addTags:{brand:"Lider","brand:wikidata":"Q6711261","brand:wikipedia":"es:Líder (supermercado)",name:"Lider Express",shop:"supermarket"},countryCodes:["cl"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Lidl":{name:"Lidl",icon:"maki-grocery",imageURL:"https://graph.facebook.com/lidl/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q151954",shop:"supermarket"},addTags:{brand:"Lidl","brand:wikidata":"Q151954","brand:wikipedia":"en:Lidl",name:"Lidl",shop:"supermarket"},terms:[],matchScore:2,suggestion:true},"shop/supermarket/Lincolnshire Co-op":{name:"Lincolnshire Co-op",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q6551231",shop:"supermarket"},addTags:{brand:"Lincolnshire Co-op","brand:wikidata":"Q6551231","brand:wikipedia":"en:Lincolnshire Co-operative",name:"Lincolnshire Co-op",shop:"supermarket"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Linella":{name:"Linella",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q61085990",shop:"supermarket"},addTags:{brand:"Linella","brand:wikidata":"Q61085990","brand:wikipedia":"ro:Linella",name:"Linella",shop:"supermarket"},countryCodes:["md"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Loblaws":{name:"Loblaws",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q3257626",shop:"supermarket"},addTags:{brand:"Loblaws","brand:wikidata":"Q3257626","brand:wikipedia":"en:Loblaws",name:"Loblaws",shop:"supermarket"},countryCodes:["ca"],terms:["loblaws great food"],matchScore:2,suggestion:true},"shop/supermarket/Lotte Mart":{name:"Lotte Mart",icon:"maki-grocery",imageURL:"https://graph.facebook.com/lottemart/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q326715",shop:"supermarket"},addTags:{brand:"Lotte Mart","brand:wikidata":"Q326715","brand:wikipedia":"en:Lotte Mart",name:"Lotte Mart",shop:"supermarket"},terms:[],matchScore:2,suggestion:true},"shop/supermarket/Lowe's Market":{name:"Lowe's Market",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q6693107",shop:"supermarket"},addTags:{brand:"Lowe's Market","brand:wikidata":"Q6693107","brand:wikipedia":"en:Lowe's Market",name:"Lowe's Market",shop:"supermarket"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Lowes Foods":{name:"Lowes Foods",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q6693991",shop:"supermarket"},addTags:{brand:"Lowes Foods","brand:wikidata":"Q6693991","brand:wikipedia":"en:Lowes Foods",name:"Lowes Foods",shop:"supermarket"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Lucky":{name:"Lucky",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q6698032",shop:"supermarket"},addTags:{brand:"Lucky","brand:wikidata":"Q6698032","brand:wikipedia":"en:Lucky Stores",name:"Lucky","operator:wikidata":"Q7428009","operator:wikipedia":"en:Save Mart Supermarkets",shop:"supermarket"},countryCodes:["us"],terms:["luckys"],matchScore:2,suggestion:true},"shop/supermarket/Lupa":{name:"Lupa",icon:"maki-grocery",imageURL:"https://graph.facebook.com/LupaSupermercados/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q58044048",shop:"supermarket"},addTags:{brand:"Lupa","brand:wikidata":"Q58044048",name:"Lupa",shop:"supermarket"},countryCodes:["es"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/MD":{name:"MD",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q3841263",shop:"supermarket"},addTags:{brand:"MD","brand:wikidata":"Q3841263","brand:wikipedia":"en:MD Discount",name:"MD",shop:"supermarket"},countryCodes:["it"],terms:["md discount"],matchScore:2,suggestion:true},"shop/supermarket/MPREIS":{name:"MPREIS",icon:"maki-grocery",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FMPreis%20Logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q873491",shop:"supermarket"},addTags:{brand:"MPREIS","brand:wikidata":"Q873491","brand:wikipedia":"de:MPreis",name:"MPREIS",shop:"supermarket"},countryCodes:["at","it"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Marc's":{name:"Marc's",icon:"maki-grocery",imageURL:"https://graph.facebook.com/MarcsStores/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q17080259",shop:"supermarket"},addTags:{brand:"Marc's","brand:wikidata":"Q17080259","brand:wikipedia":"en:Marc's",name:"Marc's",shop:"supermarket"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Markant":{name:"Markant",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q57523365",shop:"supermarket"},addTags:{brand:"Markant","brand:wikidata":"Q57523365",name:"Markant",shop:"supermarket"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Market Basket":{name:"Market Basket",icon:"maki-grocery",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FMarket%20Basket%20Logo.png&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q2079198",shop:"supermarket"},addTags:{brand:"Market Basket","brand:wikidata":"Q2079198","brand:wikipedia":"en:Market Basket (New England)",name:"Market Basket",shop:"supermarket"},terms:[],matchScore:2,suggestion:true},"shop/supermarket/Marktkauf":{name:"Marktkauf",icon:"maki-grocery",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FMarktkauf.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q1533254",shop:"supermarket"},addTags:{brand:"Marktkauf","brand:wikidata":"Q1533254","brand:wikipedia":"de:Marktkauf Holding",name:"Marktkauf",shop:"supermarket"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Martin's Super Markets":{name:"Martin's Super Markets",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q6774803",shop:"supermarket"},addTags:{brand:"Martin's Super Markets","brand:wikidata":"Q6774803","brand:wikipedia":"en:Martin's Super Markets",name:"Martin's Super Markets",shop:"supermarket"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Match":{name:"Match",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q513977",shop:"supermarket"},addTags:{brand:"Match","brand:wikidata":"Q513977","brand:wikipedia":"en:Match (supermarket)",name:"Match",shop:"supermarket"},countryCodes:["be","fr","hu","lu"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Maxi Dia":{name:"Maxi Dia",icon:"maki-grocery",imageURL:"https://pbs.twimg.com/profile_images/800711981225410560/cuzfS3Pk_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q925132",shop:"supermarket"},addTags:{brand:"Maxi Dia","brand:wikidata":"Q925132","brand:wikipedia":"es:Supermercados DIA",name:"Maxi Dia",shop:"supermarket"},countryCodes:["es"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Maxima X":{name:"Maxima X",icon:"maki-grocery",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FMaxima%20logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q1881222",shop:"supermarket"},addTags:{brand:"Maxima X","brand:wikidata":"Q1881222","brand:wikipedia":"en:Maxima Group",name:"Maxima X",shop:"supermarket"},countryCodes:["bg","ee","lt","lv","pl"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Maxima XX":{name:"Maxima XX",icon:"maki-grocery",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FMaxima%20logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q1881222",shop:"supermarket"},addTags:{brand:"Maxima XX","brand:wikidata":"Q1881222","brand:wikipedia":"en:Maxima Group",name:"Maxima XX",shop:"supermarket"},countryCodes:["bg","ee","lt","lv","pl"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Maxima XXX":{name:"Maxima XXX",icon:"maki-grocery",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FMaxima%20logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q1881222",shop:"supermarket"},addTags:{brand:"Maxima XXX","brand:wikidata":"Q1881222","brand:wikipedia":"en:Maxima Group",name:"Maxima XXX",shop:"supermarket"},countryCodes:["bg","ee","lt","lv","pl"],terms:["maxima"],matchScore:2,suggestion:true},"shop/supermarket/Maxi (Canada)":{name:"Maxi (Canada)",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q3302441",shop:"supermarket"},addTags:{brand:"Maxi","brand:wikidata":"Q3302441","brand:wikipedia":"en:Maxi (Canadian supermarket)",name:"Maxi",shop:"supermarket"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Maxi (Serbia)":{name:"Maxi (Serbia)",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q6795490",shop:"supermarket"},addTags:{brand:"Maxi","brand:wikidata":"Q6795490","brand:wikipedia":"en:Maxi (Serbian supermarket)",name:"Maxi",shop:"supermarket"},countryCodes:["rs"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Mega Image":{name:"Mega Image",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q6808085",shop:"supermarket"},addTags:{brand:"Mega Image","brand:wikidata":"Q6808085","brand:wikipedia":"en:Mega Image",name:"Mega Image",shop:"supermarket"},countryCodes:["ro"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Mego":{name:"Mego",icon:"maki-grocery",imageURL:"https://graph.facebook.com/mego.lv/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q16363314",shop:"supermarket"},addTags:{brand:"Mego","brand:wikidata":"Q16363314","brand:wikipedia":"lv:Mego",name:"Mego",shop:"supermarket"},countryCodes:["lv"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Meijer":{name:"Meijer",icon:"maki-grocery",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FMeijer%20logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q1917753",shop:"supermarket"},addTags:{brand:"Meijer","brand:wikidata":"Q1917753","brand:wikipedia":"en:Meijer",name:"Meijer",shop:"supermarket"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Meny":{name:"Meny",icon:"maki-grocery",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FMeny%20butikkjede%20norgesgruppen%20logo.jpg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q10581720",shop:"supermarket"},addTags:{brand:"Meny","brand:wikidata":"Q10581720","brand:wikipedia":"en:Meny",name:"Meny",shop:"supermarket"},countryCodes:["dk","no"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Mercadona":{name:"Mercadona",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q377705",shop:"supermarket"},addTags:{brand:"Mercadona","brand:wikidata":"Q377705","brand:wikipedia":"en:Mercadona",name:"Mercadona",shop:"supermarket"},terms:[],matchScore:2,suggestion:true},"shop/supermarket/Merkur":{name:"Merkur",icon:"maki-grocery",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FLogo%20Merkur.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q1921857",shop:"supermarket"},addTags:{brand:"Merkur","brand:wikidata":"Q1921857","brand:wikipedia":"de:Merkur (Österreich)",name:"Merkur",shop:"supermarket"},countryCodes:["at"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Metro (Canada)":{name:"Metro (Canada)",icon:"maki-grocery",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FMetro%20Inc.%20logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q1145669",shop:"supermarket"},addTags:{brand:"Metro","brand:wikidata":"Q1145669","brand:wikipedia":"en:Metro Inc.",name:"Metro",shop:"supermarket"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Metro (Peru)":{name:"Metro (Peru)",icon:"maki-grocery",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FLogo%20Metro%20Cencosud.png&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q16640217",shop:"supermarket"},addTags:{brand:"Metro","brand:wikidata":"Q16640217","brand:wikipedia":"en:Tiendas Metro",name:"Metro",operator:"Cencosud","operator:wikidata":"Q1053372","operator:wikipedia":"en:Cencosud",shop:"supermarket"},countryCodes:["pe"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Migros":{name:"Migros",icon:"maki-grocery",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FMigros.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q680727",shop:"supermarket"},addTags:{brand:"Migros","brand:wikidata":"Q680727","brand:wikipedia":"en:Migros",name:"Migros",shop:"supermarket"},terms:[],matchScore:2,suggestion:true},"shop/supermarket/Mila":{name:"Mila",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q48844636",shop:"supermarket"},addTags:{brand:"Mila","brand:wikidata":"Q48844636","brand:wikipedia":"pl:Mila (sieć sklepów)",name:"Mila",shop:"supermarket"},countryCodes:["pl"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Minipreço":{name:"Minipreço",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q3042224",shop:"supermarket"},addTags:{brand:"Minipreço","brand:wikidata":"Q3042224","brand:wikipedia":"en:Minipreço",name:"Minipreço",shop:"supermarket"},terms:[],matchScore:2,suggestion:true},"shop/supermarket/Mix Markt":{name:"Mix Markt",icon:"maki-grocery",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FMIX%20Markt%20Logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q327854",shop:"supermarket"},addTags:{brand:"Mix Markt","brand:wikidata":"Q327854","brand:wikipedia":"de:Mix Markt",name:"Mix Markt",shop:"supermarket"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Monoprix":{name:"Monoprix",icon:"maki-grocery",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FMonoprix%20logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q3321241",shop:"supermarket"},addTags:{brand:"Monoprix","brand:wikidata":"Q3321241","brand:wikipedia":"en:Monoprix",name:"Monoprix",shop:"supermarket"},terms:[],matchScore:2,suggestion:true},"shop/supermarket/More":{name:"More",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q6910891",shop:"supermarket"},addTags:{brand:"More","brand:wikidata":"Q6910891","brand:wikipedia":"en:More (store)",name:"More",shop:"supermarket"},countryCodes:["in"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Morrisons":{name:"Morrisons",icon:"maki-grocery",imageURL:"https://pbs.twimg.com/profile_images/1069883324204769280/cbPhjnwc_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q922344",shop:"supermarket"},addTags:{brand:"Morrisons","brand:wikidata":"Q922344","brand:wikipedia":"en:Morrisons",name:"Morrisons",shop:"supermarket"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Nah & Frisch":{name:"Nah & Frisch",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q1963643",shop:"supermarket"},addTags:{brand:"Nah & Frisch","brand:wikidata":"Q1963643","brand:wikipedia":"de:Nah & Frisch",name:"Nah & Frisch",shop:"supermarket"},countryCodes:["at","de"],terms:["nah und frisch"],matchScore:2,suggestion:true},"shop/supermarket/Nahkauf":{name:"Nahkauf",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q57515238",shop:"supermarket"},addTags:{brand:"Nahkauf","brand:wikidata":"Q57515238",name:"Nahkauf",shop:"supermarket"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Naturalia":{name:"Naturalia",icon:"maki-grocery",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FNaturalia%20logo.png&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q3337081",shop:"supermarket"},addTags:{brand:"Naturalia","brand:wikidata":"Q3337081","brand:wikipedia":"fr:Naturalia",name:"Naturalia",shop:"supermarket"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Netto":{name:"Netto",icon:"maki-grocery",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FGda%C5%84sk%20ulica%20D%C4%85browszczak%C3%B3w%2020%20(logo%20Netto).JPG&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q552652",shop:"supermarket"},addTags:{brand:"Netto","brand:wikidata":"Q552652","brand:wikipedia":"en:Netto (store)",name:"Netto",shop:"supermarket"},terms:[],matchScore:2,suggestion:true},"shop/supermarket/Netto Marken-Discount":{name:"Netto Marken-Discount",icon:"maki-grocery",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FNetto%20Marken-Discount%202018%20logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q879858",shop:"supermarket"},addTags:{brand:"Netto Marken-Discount","brand:wikidata":"Q879858","brand:wikipedia":"en:Netto Marken-Discount",name:"Netto Marken-Discount",shop:"supermarket"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/New World":{name:"New World",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q7012488",shop:"supermarket"},addTags:{brand:"New World","brand:wikidata":"Q7012488","brand:wikipedia":"en:New World (supermarket)",name:"New World",shop:"supermarket"},countryCodes:["nz"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/No Frills":{name:"No Frills",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q3342407",shop:"supermarket"},addTags:{brand:"No Frills","brand:wikidata":"Q3342407","brand:wikipedia":"en:No Frills (grocery store)",name:"No Frills",shop:"supermarket"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Norfa XL":{name:"Norfa XL",icon:"maki-grocery",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FNorfa%20Logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q1998983",shop:"supermarket"},addTags:{brand:"Norfa XL","brand:wikidata":"Q1998983","brand:wikipedia":"lt:Norfa",name:"Norfa XL",shop:"supermarket"},countryCodes:["lt"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Norma":{name:"Norma",icon:"maki-grocery",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FNorma%20Logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q450180",shop:"supermarket"},addTags:{brand:"Norma","brand:wikidata":"Q450180","brand:wikipedia":"de:Norma (Handelskette)",name:"Norma",shop:"supermarket"},countryCodes:["at","cz","de","fr"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Okay":{name:"Okay",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q2159701",shop:"supermarket"},addTags:{brand:"Okay","brand:wikidata":"Q2159701","brand:wikipedia":"fr:OKay",name:"Okay",shop:"supermarket"},countryCodes:["be"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Olímpica":{name:"Olímpica",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q24749847",shop:"supermarket"},addTags:{brand:"Olímpica","brand:wikidata":"Q24749847","brand:wikipedia":"es:Grupo Empresarial Olímpica",name:"Olímpica",shop:"supermarket"},countryCodes:["co"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/PLUS":{name:"PLUS",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q1978981",shop:"supermarket"},addTags:{brand:"PLUS","brand:wikidata":"Q1978981","brand:wikipedia":"nl:PLUS (Nederlandse supermarkt)",name:"PLUS",shop:"supermarket"},countryCodes:["nl"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/POLOmarket":{name:"POLOmarket",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q11821937",shop:"supermarket"},addTags:{brand:"POLOmarket","brand:wikidata":"Q11821937","brand:wikipedia":"pl:Polomarket",name:"POLOmarket",shop:"supermarket"},countryCodes:["pl"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Palí":{name:"Palí",icon:"maki-grocery",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FLogo%20de%20Walmart%20Mexico%20y%20Centroamerica.jpg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q1064887",shop:"supermarket"},addTags:{brand:"Palí","brand:wikidata":"Q1064887","brand:wikipedia":"es:Walmart de México y Centroamérica",name:"Palí",shop:"supermarket"},countryCodes:["cr","ni"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Pam":{name:"Pam",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q3777398",shop:"supermarket"},addTags:{brand:"Pam","brand:wikidata":"Q3777398","brand:wikipedia":"it:Gruppo PAM",name:"Pam",shop:"supermarket"},countryCodes:["ch","it"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Pavilions":{name:"Pavilions",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q7155886",shop:"supermarket"},addTags:{brand:"Pavilions","brand:wikidata":"Q7155886","brand:wikipedia":"en:Pavilions (supermarket)",name:"Pavilions",shop:"supermarket"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Penny":{name:"Penny",icon:"maki-grocery",imageURL:"https://graph.facebook.com/PennyDeutschland/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q284688",shop:"supermarket"},addTags:{brand:"Penny","brand:wikidata":"Q284688","brand:wikipedia":"en:Penny (supermarket)",name:"Penny",shop:"supermarket"},countryCodes:["at","cz","de","hu","it","ro"],terms:["penny market","penny markt"],matchScore:2,suggestion:true},"shop/supermarket/Pick 'n Save":{name:"Pick 'n Save",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q7371288",shop:"supermarket"},addTags:{brand:"Pick 'n Save","brand:wikidata":"Q7371288","brand:wikipedia":"en:Roundy's",name:"Pick 'n Save",shop:"supermarket"},countryCodes:["us","za"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Pick n Pay":{name:"Pick n Pay",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q7190735",shop:"supermarket"},addTags:{brand:"Pick n Pay","brand:wikidata":"Q7190735","brand:wikipedia":"en:Pick n Pay Stores",name:"Pick n Pay",shop:"supermarket"},terms:[],matchScore:2,suggestion:true},"shop/supermarket/Piggly Wiggly":{name:"Piggly Wiggly",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q3388303",shop:"supermarket"},addTags:{brand:"Piggly Wiggly","brand:wikidata":"Q3388303","brand:wikipedia":"en:Piggly Wiggly",name:"Piggly Wiggly",shop:"supermarket"},countryCodes:["gb","us"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Pingo Doce":{name:"Pingo Doce",icon:"maki-grocery",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FPingo%20Doce%20Advertising%2011%20September%202015.JPG&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q1575057",shop:"supermarket"},addTags:{brand:"Pingo Doce","brand:wikidata":"Q1575057","brand:wikipedia":"en:Pingo Doce",name:"Pingo Doce",shop:"supermarket"},countryCodes:["pt"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Piotr i Paweł":{name:"Piotr i Paweł",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q2096356",shop:"supermarket"},addTags:{brand:"Piotr i Paweł","brand:wikidata":"Q2096356","brand:wikipedia":"pl:Piotr i Paweł",name:"Piotr i Paweł",shop:"supermarket"},countryCodes:["pl"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Plaza Vea":{name:"Plaza Vea",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q7203672",shop:"supermarket"},addTags:{brand:"Plaza Vea","brand:wikidata":"Q7203672","brand:wikipedia":"en:Plaza Vea",name:"Plaza Vea",shop:"supermarket"},terms:[],matchScore:2,suggestion:true},"shop/supermarket/Plodine":{name:"Plodine",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q58040098",shop:"supermarket"},addTags:{brand:"Plodine","brand:wikidata":"Q58040098",name:"Plodine",shop:"supermarket"},countryCodes:["hr"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Poiesz":{name:"Poiesz",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q2521700",shop:"supermarket"},addTags:{brand:"Poiesz","brand:wikidata":"Q2521700","brand:wikipedia":"nl:Poiesz Supermarkten",name:"Poiesz",shop:"supermarket"},countryCodes:["nl"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Price Chopper (Kansas City)":{name:"Price Chopper (Kansas City)",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q7242572",shop:"supermarket"},addTags:{brand:"Price Chopper","brand:wikidata":"Q7242572","brand:wikipedia":"en:Price Chopper (supermarket)",name:"Price Chopper",shop:"supermarket"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Price Chopper (New York)":{name:"Price Chopper (New York)",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q7242574",shop:"supermarket"},addTags:{brand:"Price Chopper","brand:wikidata":"Q7242574","brand:wikipedia":"en:Price Chopper Supermarkets",name:"Price Chopper",shop:"supermarket"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Prix":{name:"Prix",icon:"maki-grocery",imageURL:"https://graph.facebook.com/prixqualitaitaliana/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q61994819",shop:"supermarket"},addTags:{brand:"Prix","brand:wikidata":"Q61994819",name:"Prix",shop:"supermarket"},countryCodes:["it"],terms:["prix quality"],matchScore:2,suggestion:true},"shop/supermarket/Profi":{name:"Profi",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q956664",shop:"supermarket"},addTags:{brand:"Profi","brand:wikidata":"Q956664","brand:wikipedia":"en:Profi",name:"Profi",shop:"supermarket"},terms:[],matchScore:2,suggestion:true},"shop/supermarket/Provigo":{name:"Provigo",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q3408306",shop:"supermarket"},addTags:{brand:"Provigo","brand:wikidata":"Q3408306","brand:wikipedia":"en:Provigo",name:"Provigo",shop:"supermarket"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Proxy Delhaize":{name:"Proxy Delhaize",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q14903417",shop:"supermarket"},addTags:{brand:"Proxy Delhaize","brand:wikidata":"Q14903417","brand:wikipedia":"en:Delhaize Group",name:"Proxy Delhaize",shop:"supermarket"},countryCodes:["be","lu"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Publix":{name:"Publix",icon:"maki-grocery",imageURL:"https://graph.facebook.com/publix/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q672170",shop:"supermarket"},addTags:{brand:"Publix","brand:wikidata":"Q672170","brand:wikipedia":"en:Publix",name:"Publix",shop:"supermarket"},countryCodes:["br","us"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Punto Simply":{name:"Punto Simply",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q3484790",shop:"supermarket"},addTags:{brand:"Punto Simply","brand:wikidata":"Q3484790","brand:wikipedia":"it:Simply Market",name:"Punto Simply",shop:"supermarket"},countryCodes:["it"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Puregold":{name:"Puregold",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q7261170",shop:"supermarket"},addTags:{brand:"Puregold","brand:wikidata":"Q7261170","brand:wikipedia":"en:Puregold",name:"Puregold",shop:"supermarket"},countryCodes:["ph"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Pão de Açúcar":{name:"Pão de Açúcar",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q3411543",shop:"supermarket"},addTags:{brand:"Pão de Açúcar","brand:wikidata":"Q3411543","brand:wikipedia":"pt:Pão de Açúcar (supermercado brasileiro)",name:"Pão de Açúcar",shop:"supermarket"},countryCodes:["br","pt"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/QFC":{name:"QFC",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q7265425",shop:"supermarket"},addTags:{brand:"QFC","brand:wikidata":"Q7265425","brand:wikipedia":"en:QFC",name:"QFC",shop:"supermarket"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Raley's":{name:"Raley's",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q7286970",shop:"supermarket"},addTags:{brand:"Raley's","brand:wikidata":"Q7286970","brand:wikipedia":"en:Raley's Supermarkets",name:"Raley's",shop:"supermarket"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Ralphs":{name:"Ralphs",icon:"maki-grocery",imageURL:"https://pbs.twimg.com/profile_images/829113387929972737/Ve6U9Jd9_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q3929820",shop:"supermarket"},addTags:{brand:"Ralphs","brand:wikidata":"Q3929820","brand:wikipedia":"en:Ralphs",name:"Ralphs",shop:"supermarket"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Real":{name:"Real",icon:"maki-grocery",imageURL:"https://graph.facebook.com/real/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q698473",shop:"supermarket"},addTags:{brand:"Real","brand:wikidata":"Q698473","brand:wikipedia":"en:Real (hypermarket)",name:"Real",shop:"supermarket"},terms:[],matchScore:2,suggestion:true},"shop/supermarket/Real Canadian Superstore":{name:"Real Canadian Superstore",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q7300856",shop:"supermarket"},addTags:{brand:"Real Canadian Superstore","brand:wikidata":"Q7300856","brand:wikipedia":"en:Real Canadian Superstore",name:"Real Canadian Superstore",shop:"supermarket"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Redner's":{name:"Redner's",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q7306166",shop:"supermarket"},addTags:{brand:"Redner's","brand:wikidata":"Q7306166","brand:wikipedia":"en:Redner's Markets",name:"Redner's",shop:"supermarket"},countryCodes:["us"],terms:["redners warehouse market"],matchScore:2,suggestion:true},"shop/supermarket/Reliance Fresh":{name:"Reliance Fresh",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q7311014",shop:"supermarket"},addTags:{brand:"Reliance Fresh","brand:wikidata":"Q7311014","brand:wikipedia":"en:Reliance Fresh",name:"Reliance Fresh",shop:"supermarket"},countryCodes:["in"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Rema 1000":{name:"Rema 1000",icon:"maki-grocery",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FREMA1000.jpg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q28459",shop:"supermarket"},addTags:{brand:"Rema 1000","brand:wikidata":"Q28459","brand:wikipedia":"en:REMA 1000",name:"Rema 1000",shop:"supermarket"},countryCodes:["dk","no"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Rewe":{name:"Rewe",icon:"maki-grocery",imageURL:"https://graph.facebook.com/Rewe/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q16968817",shop:"supermarket"},addTags:{brand:"Rewe","brand:wikidata":"Q16968817","brand:wikipedia":"en:REWE",name:"Rewe",shop:"supermarket"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Rewe City":{name:"Rewe City",icon:"maki-grocery",imageURL:"https://graph.facebook.com/Rewe/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q16968817",shop:"supermarket"},addTags:{brand:"Rewe City","brand:wikidata":"Q16968817","brand:wikipedia":"en:REWE",name:"Rewe City",shop:"supermarket"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Rimi":{name:"Rimi",icon:"maki-grocery",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FRimi%20logo.png&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q7334456",shop:"supermarket"},addTags:{brand:"Rimi","brand:wikidata":"Q7334456","brand:wikipedia":"en:Rimi (Norway)",name:"Rimi",shop:"supermarket"},countryCodes:["ee","lt","lv"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/S-Market":{name:"S-Market",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q11891613",shop:"supermarket"},addTags:{brand:"S-Market","brand:wikidata":"Q11891613","brand:wikipedia":"fi:S-market",name:"S-Market",shop:"supermarket"},countryCodes:["fi"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Safeway":{name:"Safeway",icon:"maki-grocery",imageURL:"https://pbs.twimg.com/profile_images/813782141259497472/inQrmCRf_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q1508234",shop:"supermarket"},addTags:{brand:"Safeway","brand:wikidata":"Q1508234","brand:wikipedia":"en:Safeway Inc.",name:"Safeway",shop:"supermarket"},terms:[],matchScore:2,suggestion:true},"shop/supermarket/Sainsbury's":{name:"Sainsbury's",icon:"maki-grocery",imageURL:"https://pbs.twimg.com/profile_images/1101419025421225984/xsPc8EfW_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q152096",shop:"supermarket"},addTags:{brand:"Sainsbury's","brand:wikidata":"Q152096","brand:wikipedia":"en:Sainsbury's",name:"Sainsbury's",shop:"supermarket"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Santa Isabel":{name:"Santa Isabel",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q7419620",shop:"supermarket"},addTags:{brand:"Santa Isabel","brand:wikidata":"Q7419620","brand:wikipedia":"es:Santa Isabel (supermercado)",name:"Santa Isabel",shop:"supermarket"},countryCodes:["cl"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Save-A-Lot":{name:"Save-A-Lot",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q7427972",shop:"supermarket"},addTags:{brand:"Save-A-Lot","brand:wikidata":"Q7427972","brand:wikipedia":"en:Save-A-Lot",name:"Save-A-Lot",shop:"supermarket"},terms:[],matchScore:2,suggestion:true},"shop/supermarket/Save-On-Foods":{name:"Save-On-Foods",icon:"maki-grocery",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FSave%20On%20Foods%20Logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q7427974",shop:"supermarket"},addTags:{brand:"Save-On-Foods","brand:wikidata":"Q7427974","brand:wikipedia":"en:Save-On-Foods",name:"Save-On-Foods",shop:"supermarket"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Schnucks":{name:"Schnucks",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q7431920",shop:"supermarket"},addTags:{brand:"Schnucks","brand:wikidata":"Q7431920","brand:wikipedia":"en:Schnucks",name:"Schnucks",shop:"supermarket"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Shaw's":{name:"Shaw's",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q578387",shop:"supermarket"},addTags:{brand:"Shaw's","brand:wikidata":"Q578387","brand:wikipedia":"en:Shaw's and Star Market",name:"Shaw's",shop:"supermarket"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/ShopRite (USA)":{name:"ShopRite (USA)",icon:"maki-grocery",imageURL:"https://pbs.twimg.com/profile_images/466948326969987072/F66s5ItP_bigger.png",geometry:["point","area"],tags:{"brand:wikidata":"Q7501097",shop:"supermarket"},addTags:{brand:"ShopRite","brand:wikidata":"Q7501097","brand:wikipedia":"en:ShopRite (United States)",name:"ShopRite",shop:"supermarket"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Shoprite (Africa)":{name:"Shoprite (Africa)",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q1857639",shop:"supermarket"},addTags:{brand:"Shoprite","brand:wikidata":"Q1857639","brand:wikipedia":"en:Shoprite (South Africa)",name:"Shoprite",shop:"supermarket"},countryCodes:["ao","bw","cd","gh","ls","mg","mu","mw","mz","na","ng","sz","ug","za","zm"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Shoprite (Isle of Man)":{name:"Shoprite (Isle of Man)",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q7501242",shop:"supermarket"},addTags:{brand:"Shoprite","brand:wikidata":"Q7501242","brand:wikipedia":"en:Shoprite (Isle of Man)",name:"Shoprite",shop:"supermarket"},countryCodes:["im"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Sigma":{name:"Sigma",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q3977979",shop:"supermarket"},addTags:{brand:"Sigma","brand:wikidata":"Q3977979","brand:wikipedia":"it:Supermercati Sigma",name:"Sigma",shop:"supermarket"},countryCodes:["it"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Simply Market":{name:"Simply Market",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q3484790",shop:"supermarket"},addTags:{brand:"Simply Market","brand:wikidata":"Q3484790","brand:wikipedia":"en:Simply Market",name:"Simply Market",shop:"supermarket"},terms:["simply"],matchScore:2,suggestion:true},"shop/supermarket/Sky":{name:"Sky",icon:"maki-grocery",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FCoop%20Deutschland%20Logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q1129779",shop:"supermarket"},addTags:{brand:"Sky","brand:wikidata":"Q1129779","brand:wikipedia":"de:Coop eG",name:"Sky",shop:"supermarket"},countryCodes:["de","lv","nl"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Smith's":{name:"Smith's",icon:"maki-grocery",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FSmithsFoodDrug-logo.png&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q7544856",shop:"supermarket"},addTags:{brand:"Smith's","brand:wikidata":"Q7544856","brand:wikipedia":"en:Smith's Food and Drug",name:"Smith's",shop:"supermarket"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Sobeys":{name:"Sobeys",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q1143340",shop:"supermarket"},addTags:{brand:"Sobeys","brand:wikidata":"Q1143340","brand:wikipedia":"en:Sobeys",name:"Sobeys",shop:"supermarket"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Soriana":{name:"Soriana",icon:"maki-grocery",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FLogoSoriana.PNG&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q735562",shop:"supermarket"},addTags:{brand:"Soriana","brand:wikidata":"Q735562","brand:wikipedia":"en:Soriana",name:"Soriana",shop:"supermarket"},countryCodes:["mx"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Spar":{name:"Spar",icon:"maki-grocery",imageURL:"https://graph.facebook.com/SPARintheUK/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q610492",shop:"supermarket"},addTags:{brand:"Spar","brand:wikidata":"Q610492","brand:wikipedia":"en:Spar (retailer)",name:"Spar",shop:"supermarket"},terms:[],matchScore:2,suggestion:true},"shop/supermarket/Społem":{name:"Społem",icon:"maki-grocery",imageURL:"https://graph.facebook.com/SpolemSpoldzielczoscSpozywcow/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11826043",shop:"supermarket"},addTags:{brand:"Społem","brand:wikidata":"Q11826043","brand:wikipedia":"pl:Powszechna Spółdzielnia Spożywców „Społem”",name:"Społem",shop:"supermarket"},terms:[],matchScore:2,suggestion:true},"shop/supermarket/Sprouts Farmers Market":{name:"Sprouts Farmers Market",icon:"maki-grocery",imageURL:"https://graph.facebook.com/SproutsFarmersMarket/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7581369",shop:"supermarket"},addTags:{brand:"Sprouts Farmers Market","brand:wikidata":"Q7581369","brand:wikipedia":"en:Sprouts Farmers Market",name:"Sprouts Farmers Market",shop:"supermarket"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Stater Bros.":{name:"Stater Bros.",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q7604016",shop:"supermarket"},addTags:{brand:"Stater Bros.","brand:wikidata":"Q7604016","brand:wikipedia":"en:Stater Bros.",name:"Stater Bros.",shop:"supermarket"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Stokrotka":{name:"Stokrotka",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q9345945",shop:"supermarket"},addTags:{brand:"Stokrotka","brand:wikidata":"Q9345945","brand:wikipedia":"pl:Stokrotka (sieć handlowa)",name:"Stokrotka",shop:"supermarket"},countryCodes:["pl"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Stop & Shop":{name:"Stop & Shop",icon:"maki-grocery",imageURL:"https://pbs.twimg.com/profile_images/913035570263314432/JnBRkmWC_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q3658429",shop:"supermarket"},addTags:{brand:"Stop & Shop","brand:wikidata":"Q3658429","brand:wikipedia":"en:Stop & Shop",name:"Stop & Shop",shop:"supermarket"},terms:[],matchScore:2,suggestion:true},"shop/supermarket/Suma":{name:"Suma",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q58012362",shop:"supermarket"},addTags:{brand:"Suma","brand:wikidata":"Q58012362",name:"Suma",shop:"supermarket"},countryCodes:["es"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Super C":{name:"Super C",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q3504127",shop:"supermarket"},addTags:{brand:"Super C","brand:wikidata":"Q3504127","brand:wikipedia":"en:Super C (supermarket)",name:"Super C",shop:"supermarket"},terms:[],matchScore:2,suggestion:true},"shop/supermarket/Super H Mart":{name:"Super H Mart",icon:"maki-grocery",imageURL:"https://graph.facebook.com/hmartofficial/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5636306",shop:"supermarket"},addTags:{brand:"H Mart","brand:wikidata":"Q5636306","brand:wikipedia":"en:H Mart",cuisine:"asian",name:"Super H Mart",shop:"supermarket"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Super One Foods":{name:"Super One Foods",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q17108733",shop:"supermarket"},addTags:{brand:"Super One Foods","brand:wikidata":"Q17108733","brand:wikipedia":"en:Super One Foods",name:"Super One Foods",shop:"supermarket"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Super U":{name:"Super U",icon:"maki-grocery",imageURL:"https://graph.facebook.com/ULesCommercants/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2529029",shop:"supermarket"},addTags:{brand:"Super U","brand:wikidata":"Q2529029","brand:wikipedia":"en:Système U",name:"Super U",shop:"supermarket"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/SuperBrugsen":{name:"SuperBrugsen",icon:"maki-grocery",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FSB%20logo%20rektangel%20RGB%20standard.jpg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q12337746",shop:"supermarket"},addTags:{brand:"SuperBrugsen","brand:wikidata":"Q12337746","brand:wikipedia":"en:SuperBrugsen",name:"SuperBrugsen",shop:"supermarket"},countryCodes:["dk"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/SuperValu":{name:"SuperValu",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q7642081",shop:"supermarket"},addTags:{brand:"SuperValu","brand:wikidata":"Q7642081","brand:wikipedia":"en:SuperValu (Ireland)",name:"SuperValu",shop:"supermarket"},terms:[],matchScore:2,suggestion:true},"shop/supermarket/Superama":{name:"Superama",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q6135762",shop:"supermarket"},addTags:{brand:"Superama","brand:wikidata":"Q6135762","brand:wikipedia":"es:Superama",name:"Superama",shop:"supermarket"},countryCodes:["mx"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Supercor":{name:"Supercor",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q6135841",shop:"supermarket"},addTags:{brand:"Supercor","brand:wikidata":"Q6135841","brand:wikipedia":"es:Supercor",name:"Supercor",shop:"supermarket"},countryCodes:["es","pt"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Supersol":{name:"Supersol",icon:"maki-grocery",imageURL:"https://graph.facebook.com/SupersolSupermercados/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62073427",shop:"supermarket"},addTags:{brand:"Supersol","brand:wikidata":"Q62073427",name:"Supersol",shop:"supermarket"},countryCodes:["ar","es","ma","uy"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Superspar":{name:"Superspar",icon:"maki-grocery",imageURL:"https://graph.facebook.com/SPARintheUK/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q610492",shop:"supermarket"},addTags:{brand:"Superspar","brand:wikidata":"Q610492","brand:wikipedia":"en:Spar (retailer)",name:"Superspar",shop:"supermarket"},countryCodes:["es","za"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Tegut":{name:"Tegut",icon:"maki-grocery",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FTegut%E2%80%A6.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q1547993",shop:"supermarket"},addTags:{brand:"Tegut","brand:wikidata":"Q1547993","brand:wikipedia":"en:Tegut",name:"Tegut",shop:"supermarket"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Tesco":{name:"Tesco",icon:"maki-grocery",imageURL:"https://graph.facebook.com/tesco/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q487494",shop:"supermarket"},addTags:{brand:"Tesco","brand:wikidata":"Q487494","brand:wikipedia":"en:Tesco",name:"Tesco",shop:"supermarket"},terms:[],matchScore:2,suggestion:true},"shop/supermarket/Tesco Express":{name:"Tesco Express",icon:"maki-grocery",imageURL:"https://graph.facebook.com/tesco/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q487494",shop:"supermarket"},addTags:{brand:"Tesco Express","brand:wikidata":"Q487494","brand:wikipedia":"en:Tesco",name:"Tesco Express",shop:"supermarket"},terms:[],matchScore:2,suggestion:true},"shop/supermarket/Tesco Extra":{name:"Tesco Extra",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q25172225",shop:"supermarket"},addTags:{brand:"Tesco Extra","brand:wikidata":"Q25172225","brand:wikipedia":"en:Tesco Extra",name:"Tesco Extra",shop:"supermarket"},terms:[],matchScore:2,suggestion:true},"shop/supermarket/Tesco Metro":{name:"Tesco Metro",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q57551648",shop:"supermarket"},addTags:{brand:"Tesco Metro","brand:wikidata":"Q57551648",name:"Tesco Metro",shop:"supermarket"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/The Co-operative Food (UK)":{name:"The Co-operative Food (UK)",icon:"maki-grocery",imageURL:"https://graph.facebook.com/coopukfood/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3277439",shop:"supermarket"},addTags:{brand:"The Co-operative Food","brand:wikidata":"Q3277439","brand:wikipedia":"en:Co-op Food",name:"The Co-operative Food",shop:"supermarket"},countryCodes:["gb"],terms:["coop","coop food","cooperative food","the cooperative"],matchScore:2,suggestion:true},"shop/supermarket/The Fresh Market":{name:"The Fresh Market",icon:"maki-grocery",imageURL:"https://pbs.twimg.com/profile_images/791251254337036288/0VUcaeIf_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q7735265",shop:"supermarket"},addTags:{brand:"The Fresh Market","brand:wikidata":"Q7735265","brand:wikipedia":"en:The Fresh Market",name:"The Fresh Market",shop:"supermarket"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Todis":{name:"Todis",icon:"maki-grocery",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FLogo%20Todis%20lungo%20verde.jpg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q3992174",shop:"supermarket"},addTags:{brand:"Todis","brand:wikidata":"Q3992174","brand:wikipedia":"it:Todis",name:"Todis",shop:"supermarket"},countryCodes:["it"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Tommy":{name:"Tommy",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q12643718",shop:"supermarket"},addTags:{brand:"Tommy","brand:wikidata":"Q12643718","brand:wikipedia":"hr:Tommy",name:"Tommy",shop:"supermarket"},countryCodes:["hr"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Top Market":{name:"Top Market",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q9360044",shop:"supermarket"},addTags:{brand:"Top Market","brand:wikidata":"Q9360044","brand:wikipedia":"pl:Top Market",name:"Top Market",shop:"supermarket"},countryCodes:["pl"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Tops":{name:"Tops",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q7825137",shop:"supermarket"},addTags:{brand:"Tops","brand:wikidata":"Q7825137","brand:wikipedia":"en:Tops Friendly Markets",name:"Tops",shop:"supermarket"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Tottus":{name:"Tottus",icon:"maki-grocery",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FLogotipo%20Tottus.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q7828510",shop:"supermarket"},addTags:{brand:"Tottus","brand:wikidata":"Q7828510","brand:wikipedia":"en:Tottus",name:"Tottus",shop:"supermarket"},countryCodes:["cl","pe"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Trader Joe's":{name:"Trader Joe's",icon:"maki-grocery",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FTrader%20Joes%20Logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q688825",shop:"supermarket"},addTags:{brand:"Trader Joe's","brand:wikidata":"Q688825","brand:wikipedia":"en:Trader Joe's",name:"Trader Joe's",shop:"supermarket"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Treff 3000":{name:"Treff 3000",icon:"maki-grocery",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FLogo%20Edeka.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q701755",shop:"supermarket"},addTags:{brand:"Treff 3000","brand:wikidata":"Q701755","brand:wikipedia":"de:Edeka",name:"Treff 3000",shop:"supermarket"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Tuodì":{name:"Tuodì",icon:"maki-grocery",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FLogo%20Dico.png&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q3706995",shop:"supermarket"},addTags:{brand:"Tuodì","brand:wikidata":"Q3706995","brand:wikipedia":"it:Tuodì",name:"Tuodì",shop:"supermarket"},countryCodes:["it"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/U Express":{name:"U Express",icon:"maki-grocery",imageURL:"https://graph.facebook.com/ULesCommercants/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2529029",shop:"supermarket"},addTags:{brand:"U Express","brand:wikidata":"Q2529029","brand:wikipedia":"en:Système U",name:"U Express",shop:"supermarket"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Unimarc":{name:"Unimarc",icon:"maki-grocery",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FUnimarc%20logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q6156244",shop:"supermarket"},addTags:{brand:"Unimarc","brand:wikidata":"Q6156244","brand:wikipedia":"es:Unimarc",name:"Unimarc",shop:"supermarket"},countryCodes:["cl"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Unimarkt":{name:"Unimarkt",icon:"maki-grocery",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FUnimarktLogoNeu.jpg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q1169599",shop:"supermarket"},addTags:{brand:"Unimarkt","brand:wikidata":"Q1169599","brand:wikipedia":"de:Unimarkt",name:"Unimarkt",shop:"supermarket"},countryCodes:["at"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Vea":{name:"Vea",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q5858167",shop:"supermarket"},addTags:{brand:"Vea","brand:wikidata":"Q5858167","brand:wikipedia":"es:Vea (supermercado)",name:"Vea",shop:"supermarket"},countryCodes:["ar"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/VinMart":{name:"VinMart",icon:"maki-grocery",imageURL:"https://graph.facebook.com/sieuthivinmart/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q60245505",shop:"supermarket"},addTags:{brand:"VinMart","brand:wikidata":"Q60245505","brand:wikipedia":"vi:VinMart",name:"VinMart",shop:"supermarket"},countryCodes:["vn"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Volg":{name:"Volg",icon:"maki-grocery",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FVolg.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q2530746",shop:"supermarket"},addTags:{brand:"Volg","brand:wikidata":"Q2530746","brand:wikipedia":"de:Volg",name:"Volg",shop:"supermarket"},countryCodes:["ch","li"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Vomar":{name:"Vomar",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q3202837",shop:"supermarket"},addTags:{brand:"Vomar","brand:wikidata":"Q3202837","brand:wikipedia":"nl:Vomar",name:"Vomar",shop:"supermarket"},countryCodes:["nl"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Vons":{name:"Vons",icon:"maki-grocery",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FVons%20logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q7941609",shop:"supermarket"},addTags:{brand:"Vons","brand:wikidata":"Q7941609","brand:wikipedia":"en:Vons",name:"Vons",shop:"supermarket"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Waitrose":{name:"Waitrose",icon:"maki-grocery",imageURL:"https://pbs.twimg.com/profile_images/1036753874512687104/1ef8sudl_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q771734",shop:"supermarket"},addTags:{brand:"Waitrose","brand:wikidata":"Q771734","brand:wikipedia":"en:Waitrose & Partners",name:"Waitrose",shop:"supermarket"},countryCodes:["gb","je"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Walmart Neighborhood Market":{name:"Walmart Neighborhood Market",icon:"maki-grocery",imageURL:"https://graph.facebook.com/walmart/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q483551",shop:"supermarket"},addTags:{brand:"Walmart","brand:wikidata":"Q483551","brand:wikipedia":"en:Walmart",name:"Walmart Neighborhood Market",operator:"Walmart","operator:wikidata":"Q483551","operator:wikipedia":"en:Walmart",shop:"supermarket"},countryCodes:["ca","mx","us"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Walmart Supercenter":{name:"Walmart Supercenter",icon:"maki-grocery",imageURL:"https://graph.facebook.com/walmart/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q483551",shop:"supermarket"},addTags:{brand:"Walmart","brand:wikidata":"Q483551","brand:wikipedia":"en:Walmart",name:"Walmart Supercenter",operator:"Walmart","operator:wikidata":"Q483551","operator:wikipedia":"en:Walmart",shop:"supermarket"},terms:["walmart supercentre"],matchScore:2,suggestion:true},"shop/supermarket/Wasgau":{name:"Wasgau",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q2536857",shop:"supermarket"},addTags:{brand:"Wasgau","brand:wikidata":"Q2536857","brand:wikipedia":"de:Wasgau (Unternehmen)",name:"Wasgau",shop:"supermarket"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Wegmans":{name:"Wegmans",icon:"maki-grocery",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FWegmansLogo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q11288478",shop:"supermarket"},addTags:{brand:"Wegmans","brand:wikidata":"Q11288478","brand:wikipedia":"en:Wegmans",name:"Wegmans",shop:"supermarket"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Weis":{name:"Weis",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q7980370",shop:"supermarket"},addTags:{brand:"Weis","brand:wikidata":"Q7980370","brand:wikipedia":"en:Weis Markets",name:"Weis",shop:"supermarket"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Whole Foods Market":{name:"Whole Foods Market",icon:"maki-grocery",imageURL:"https://graph.facebook.com/WholeFoods/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1809448",shop:"supermarket"},addTags:{brand:"Whole Foods Market","brand:wikidata":"Q1809448","brand:wikipedia":"en:Whole Foods Market",name:"Whole Foods Market",shop:"supermarket"},countryCodes:["ca","gb","us"],terms:["whole foods"],matchScore:2,suggestion:true},"shop/supermarket/Willys":{name:"Willys",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q10720214",shop:"supermarket"},addTags:{brand:"Willys","brand:wikidata":"Q10720214","brand:wikipedia":"sv:Willys",name:"Willys",shop:"supermarket"},countryCodes:["se"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/WinCo Foods":{name:"WinCo Foods",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q8023592",shop:"supermarket"},addTags:{brand:"WinCo Foods","brand:wikidata":"Q8023592","brand:wikipedia":"en:WinCo Foods",name:"WinCo Foods",shop:"supermarket"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Winn Dixie":{name:"Winn Dixie",icon:"maki-grocery",imageURL:"https://graph.facebook.com/winndixie/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1264366",shop:"supermarket"},addTags:{brand:"Winn Dixie","brand:wikidata":"Q1264366","brand:wikipedia":"en:Winn-Dixie",name:"Winn Dixie",shop:"supermarket"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Woolworths":{name:"Woolworths",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q3249145",shop:"supermarket"},addTags:{brand:"Woolworths","brand:wikidata":"Q3249145","brand:wikipedia":"en:Woolworths Supermarkets",name:"Woolworths",shop:"supermarket"},countryCodes:["au"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Your Independent Grocer":{name:"Your Independent Grocer",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q8058833",shop:"supermarket"},addTags:{brand:"Your Independent Grocer","brand:wikidata":"Q8058833","brand:wikipedia":"en:Your Independent Grocer",name:"Your Independent Grocer",shop:"supermarket"},countryCodes:["ca"],terms:["independent"],matchScore:2,suggestion:true},"shop/supermarket/basic":{name:"basic",icon:"maki-grocery",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FBasic%20logo.jpg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q809994",shop:"supermarket"},addTags:{brand:"basic","brand:wikidata":"Q809994","brand:wikipedia":"de:Basic AG",name:"basic",organic:"only",shop:"supermarket"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/denn's Biomarkt":{name:"denn's Biomarkt",icon:"maki-grocery",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FDenns%20Biomarkt%20logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q48883773",shop:"supermarket"},addTags:{brand:"denn's Biomarkt","brand:wikidata":"Q48883773","brand:wikipedia":"de:Dennree",name:"denn's Biomarkt",organic:"only",shop:"supermarket"},countryCodes:["at","de"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/fakta":{name:"fakta",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q3172238",shop:"supermarket"},addTags:{brand:"fakta","brand:wikidata":"Q3172238","brand:wikipedia":"en:Fakta",name:"fakta",shop:"supermarket"},countryCodes:["dk"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Şok":{name:"Şok",icon:"maki-grocery",imageURL:"https://pbs.twimg.com/profile_images/831881850201194496/HxDzAV5x_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q19613992",shop:"supermarket"},addTags:{brand:"Şok","brand:wikidata":"Q19613992","brand:wikipedia":"tr:Şok (market)",name:"Şok",shop:"supermarket"},countryCodes:["tr"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/ΑΒ Βασιλόπουλος":{name:"ΑΒ Βασιλόπουλος",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q4721807",shop:"supermarket"},addTags:{brand:"ΑΒ Βασιλόπουλος","brand:en":"AB Vassilopoulos","brand:wikidata":"Q4721807","brand:wikipedia":"el:Άλφα Βήτα Βασιλόπουλος",name:"ΑΒ Βασιλόπουλος","name:en":"AB Vassilopoulos",shop:"supermarket"},countryCodes:["gr"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Γαλαξίας":{name:"Γαλαξίας",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q5518063",shop:"supermarket"},addTags:{brand:"Γαλαξίας","brand:en":"Galaxias","brand:wikidata":"Q5518063","brand:wikipedia":"el:Γαλαξίας (σούπερ μάρκετ)",name:"Γαλαξίας","name:en":"Galaxias",shop:"supermarket"},countryCodes:["gr"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Μασούτης":{name:"Μασούτης",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q6783887",shop:"supermarket"},addTags:{brand:"Μασούτης","brand:en":"Masoutis","brand:wikidata":"Q6783887","brand:wikipedia":"en:Masoutis",name:"Μασούτης","name:en":"Masoutis",shop:"supermarket"},countryCodes:["gr"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Σκλαβενίτης":{name:"Σκλαβενίτης",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q7536037",shop:"supermarket"},addTags:{brand:"Σκλαβενίτης","brand:en":"Sklavenitis","brand:wikidata":"Q7536037","brand:wikipedia":"el:Σκλαβενίτης",name:"Σκλαβενίτης","name:en":"Sklavenitis",shop:"supermarket"},countryCodes:["gr"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Абсолют (Russia)":{name:"Абсолют (Russia)",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q62389597",shop:"supermarket"},addTags:{brand:"Абсолют","brand:wikidata":"Q62389597",name:"Абсолют",shop:"supermarket"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Абсолют (Ukraine)":{name:"Абсолют (Ukraine)",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q62389546",shop:"supermarket"},addTags:{brand:"Абсолют","brand:wikidata":"Q62389546",name:"Абсолют",shop:"supermarket"},countryCodes:["ua"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Азбука Вкуса":{name:"Азбука Вкуса",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q4058209",shop:"supermarket"},addTags:{brand:"Азбука Вкуса","brand:en":"Azbuka Vkusa","brand:wikidata":"Q4058209","brand:wikipedia":"en:Azbuka Vkusa",name:"Азбука Вкуса","name:en":"Azbuka Vkusa",shop:"supermarket"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Атак":{name:"Атак",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q2868738",shop:"supermarket"},addTags:{brand:"Атак","brand:en":"Atac","brand:wikidata":"Q2868738","brand:wikipedia":"ru:Atac",name:"Атак","name:en":"Atac",shop:"supermarket"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Ашан":{name:"Ашан",icon:"maki-grocery",imageURL:"https://pbs.twimg.com/profile_images/877095334316576768/bhQDPUWZ_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q758603",shop:"supermarket"},addTags:{brand:"Ашан","brand:en":"Auchan","brand:wikidata":"Q758603","brand:wikipedia":"ru:Auchan",name:"Ашан","name:en":"Auchan",shop:"supermarket"},terms:[],matchScore:2,suggestion:true},"shop/supermarket/Брусничка":{name:"Брусничка",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q21656645",shop:"supermarket"},addTags:{brand:"Брусничка","brand:en":"Brusnichka","brand:wikidata":"Q21656645","brand:wikipedia":"uk:Брусничка (торгова мережа)",name:"Брусничка","name:en":"Brusnichka",shop:"supermarket"},countryCodes:["ua"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Виктория":{name:"Виктория",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q4111046",shop:"supermarket"},addTags:{brand:"Виктория","brand:wikidata":"Q4111046","brand:wikipedia":"ru:Виктория (сеть магазинов)",name:"Виктория",shop:"supermarket"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Виталюр":{name:"Виталюр",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q55663075",shop:"supermarket"},addTags:{brand:"Виталюр","brand:wikidata":"Q55663075","brand:wikipedia":"ru:Виталюр",name:"Виталюр",shop:"supermarket"},countryCodes:["by"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Вопак":{name:"Вопак",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q30966107",shop:"supermarket"},addTags:{brand:"Вопак","brand:en":"Vopak","brand:wikidata":"Q30966107","brand:wikipedia":"uk:Вопак",name:"Вопак","name:en":"Vopak",shop:"supermarket"},countryCodes:["ua"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Гроздь":{name:"Гроздь",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q21638412",shop:"supermarket"},addTags:{brand:"Гроздь","brand:wikidata":"Q21638412","brand:wikipedia":"ru:Гроздь (сеть магазинов)",name:"Гроздь",shop:"supermarket"},terms:[],matchScore:2,suggestion:true},"shop/supermarket/Гулливер":{name:"Гулливер",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q58003470",shop:"supermarket"},addTags:{brand:"Гулливер","brand:wikidata":"Q58003470",name:"Гулливер",shop:"supermarket"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Десяточка":{name:"Десяточка",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q61876182",shop:"supermarket"},addTags:{brand:"Десяточка","brand:en":"Desyatochka","brand:wikidata":"Q61876182",name:"Десяточка",shop:"supermarket"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Дикси":{name:"Дикси",icon:"maki-grocery",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FDixi.gif&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q4161561",shop:"supermarket"},addTags:{brand:"Дикси","brand:en":"Dixy","brand:wikidata":"Q4161561","brand:wikipedia":"ru:Дикси (сеть магазинов)",name:"Дикси",shop:"supermarket"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Евроопт":{name:"Евроопт",icon:"maki-grocery",imageURL:"https://graph.facebook.com/Eurooptby/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2565040",shop:"supermarket"},addTags:{brand:"Евроопт","brand:en":"Euroopt","brand:ru":"Евроопт","brand:wikidata":"Q2565040","brand:wikipedia":"be:Еўрагандаль",name:"Евроопт","name:en":"Euroopt","name:ru":"Евроопт",shop:"supermarket"},terms:["евроопт market"],matchScore:2,suggestion:true},"shop/supermarket/Карусель":{name:"Карусель",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q4216307",shop:"supermarket"},addTags:{brand:"Карусель","brand:en":"Karusel","brand:wikidata":"Q4216307","brand:wikipedia":"ru:Карусель (сеть магазинов)",name:"Карусель","name:en":"Karusel",shop:"supermarket"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Кировский":{name:"Кировский",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q63301903",shop:"supermarket"},addTags:{brand:"Кировский","brand:wikidata":"Q63301903",name:"Кировский",shop:"supermarket"},terms:[],matchScore:2,suggestion:true},"shop/supermarket/Командор":{name:"Командор",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q61876152",shop:"supermarket"},addTags:{brand:"Командор","brand:en":"Komandor","brand:wikidata":"Q61876152",name:"Командор",shop:"supermarket"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Красный Яр":{name:"Красный Яр",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q1786753",shop:"supermarket"},addTags:{brand:"Красный Яр","brand:en":"Krasnyj Jar","brand:wikidata":"Q1786753","brand:wikipedia":"ru:Красный Яр",name:"Красный Яр",shop:"supermarket"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Лента":{name:"Лента",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q4258608",shop:"supermarket"},addTags:{brand:"Лента","brand:en":"Lenta","brand:wikidata":"Q4258608","brand:wikipedia":"ru:Лента (сеть магазинов)",name:"Лента","name:en":"Lenta",shop:"supermarket"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Магнит":{name:"Магнит",icon:"maki-grocery",imageURL:"https://pbs.twimg.com/profile_images/1098477357390856192/wILY9KdL_bigger.png",geometry:["point","area"],tags:{"brand:wikidata":"Q940518",shop:"supermarket"},addTags:{brand:"Магнит","brand:en":"Magnit","brand:wikidata":"Q940518","brand:wikipedia":"ru:Магнит (сеть магазинов)",name:"Магнит","name:en":"Magnit",shop:"supermarket"},terms:[],matchScore:2,suggestion:true},"shop/supermarket/Мария-Ра":{name:"Мария-Ра",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q4281631",shop:"supermarket"},addTags:{brand:"Мария-Ра","brand:en":"Maria-ra","brand:wikidata":"Q4281631","brand:wikipedia":"ru:Мария-Ра",name:"Мария-Ра","name:en":"Maria-ra",shop:"supermarket"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Монетка":{name:"Монетка",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q4301704",shop:"supermarket"},addTags:{brand:"Монетка","brand:en":"Monetka","brand:wikidata":"Q4301704","brand:wikipedia":"ru:Монетка (сеть магазинов)",name:"Монетка","name:en":"Monetka",shop:"supermarket"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Народная 7Я семьЯ":{name:"Народная 7Я семьЯ",icon:"maki-grocery",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2F7Family.png&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q4032436",shop:"supermarket"},addTags:{brand:"Народная 7Я семьЯ","brand:en":"People's 7th Family","brand:wikidata":"Q4032436","brand:wikipedia":"ru:Народная 7Я семья",name:"Народная 7Я семьЯ","name:en":"People's 7th Family",shop:"supermarket"},countryCodes:["ru"],terms:["семья"],matchScore:2,suggestion:true},"shop/supermarket/Перекрёсток":{name:"Перекрёсток",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q1684639",shop:"supermarket"},addTags:{brand:"Перекрёсток","brand:en":"Perekryostok","brand:wikidata":"Q1684639","brand:wikipedia":"en:Perekrestok (supermarket chain)",name:"Перекрёсток",shop:"supermarket"},countryCodes:["ru"],terms:["перекресток"],matchScore:2,suggestion:true},"shop/supermarket/Покупочка":{name:"Покупочка",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q58003270",shop:"supermarket"},addTags:{brand:"Покупочка","brand:wikidata":"Q58003270",name:"Покупочка",shop:"supermarket"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Полушка":{name:"Полушка",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q4371080",shop:"supermarket"},addTags:{brand:"Полушка","brand:en":"Polushka","brand:wikidata":"Q4371080","brand:wikipedia":"ru:Полушка (сеть магазинов)",name:"Полушка","name:en":"Polushka",shop:"supermarket"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Пятёрочка":{name:"Пятёрочка",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q1768969",shop:"supermarket"},addTags:{brand:"Пятёрочка","brand:en":"Pyaterochka","brand:wikidata":"Q1768969","brand:wikipedia":"ru:Пятёрочка",name:"Пятёрочка","name:en":"Pyaterochka",shop:"supermarket"},countryCodes:["ru"],terms:["пятерочка"],matchScore:2,suggestion:true},"shop/supermarket/Радеж":{name:"Радеж",icon:"maki-grocery",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FRadezh%20logo.png&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q4387165",shop:"supermarket"},addTags:{brand:"Радеж","brand:en":"Radezh","brand:wikidata":"Q4387165","brand:wikipedia":"ru:Радеж (торговая сеть)",name:"Радеж","name:en":"Radezh",shop:"supermarket"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Рукавичка":{name:"Рукавичка",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q20092568",shop:"supermarket"},addTags:{brand:"Рукавичка","brand:en":"Rukavychka","brand:wikidata":"Q20092568","brand:wikipedia":"uk:Рукавичка (торгова мережа)",name:"Рукавичка","name:en":"Rukavychka",shop:"supermarket"},countryCodes:["ua"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Светофор":{name:"Светофор",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q61875920",shop:"supermarket"},addTags:{brand:"Светофор","brand:en":"Svetofor","brand:wikidata":"Q61875920",name:"Светофор",shop:"supermarket"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Семишагофф":{name:"Семишагофф",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q58003374",shop:"supermarket"},addTags:{brand:"Семишагофф","brand:wikidata":"Q58003374",name:"Семишагофф",shop:"supermarket"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Сільпо":{name:"Сільпо",icon:"maki-grocery",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FSilpo.png&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q4419434",shop:"supermarket"},addTags:{brand:"Сільпо","brand:en":"Silpo","brand:wikidata":"Q4419434","brand:wikipedia":"en:Silpo",name:"Сільпо","name:en":"Silpo",shop:"supermarket"},countryCodes:["ua"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Таврия В":{name:"Таврия В",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q61823146",shop:"supermarket"},addTags:{brand:"Таврия В","brand:wikidata":"Q61823146","brand:wikipedia":"uk:Таврія В",name:"Таврия В",shop:"supermarket"},countryCodes:["ua"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Фора":{name:"Фора",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q12165977",shop:"supermarket"},addTags:{brand:"Фора","brand:en":"Fora","brand:wikidata":"Q12165977","brand:wikipedia":"uk:Фора (мережа магазинів)",name:"Фора","name:en":"Fora",shop:"supermarket"},countryCodes:["ua"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Фуршет":{name:"Фуршет",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q4493564",shop:"supermarket"},addTags:{brand:"Фуршет","brand:en":"Furshet","brand:wikidata":"Q4493564","brand:wikipedia":"uk:Фуршет (мережа супермаркетів)",name:"Фуршет","name:en":"Furshet",shop:"supermarket"},countryCodes:["ua"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Эдельвейс":{name:"Эдельвейс",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q57979368",shop:"supermarket"},addTags:{brand:"Эдельвейс","brand:en":"Edelveis","brand:wikidata":"Q57979368",name:"Эдельвейс","name:en":"Edelveis",shop:"supermarket"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/いなげや":{name:"いなげや",icon:"maki-grocery",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FInageya%20Co.%20logo.png&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q17193392",shop:"supermarket"},addTags:{brand:"いなげや","brand:en":"Inageya","brand:ja":"いなげや","brand:wikidata":"Q17193392","brand:wikipedia":"ja:いなげや",name:"いなげや","name:en":"Inageya","name:ja":"いなげや",shop:"supermarket"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/まいばすけっと":{name:"まいばすけっと",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q11278154",shop:"supermarket"},addTags:{brand:"まいばすけっと","brand:en":"My Basket","brand:ja":"まいばすけっと","brand:wikidata":"Q11278154","brand:wikipedia":"ja:まいばすけっと",name:"まいばすけっと","name:en":"My Basket","name:ja":"まいばすけっと",shop:"supermarket"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/イオン":{name:"イオン",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q11285951",shop:"supermarket"},addTags:{brand:"イオン","brand:en":"AEON","brand:ja":"イオン","brand:wikidata":"Q11285951","brand:wikipedia":"ja:イオン (店舗ブランド)",name:"イオン","name:en":"AEON","name:ja":"イオン",shop:"supermarket"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/イトーヨーカドー":{name:"イトーヨーカドー",icon:"maki-grocery",imageURL:"https://graph.facebook.com/itoyokado/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3088746",shop:"supermarket"},addTags:{brand:"イトーヨーカドー","brand:en":"Ito-Yokado","brand:ja":"イトーヨーカドー","brand:wikidata":"Q3088746","brand:wikipedia":"en:Ito-Yokado",name:"イトーヨーカドー","name:en":"Ito-Yokado","name:ja":"イトーヨーカドー",shop:"supermarket"},countryCodes:["jp"],terms:["イトーヨーカ堂"],matchScore:2,suggestion:true},"shop/supermarket/カスミ":{name:"カスミ",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q11294160",shop:"supermarket"},addTags:{brand:"カスミ","brand:en":"Kasumi","brand:ja":"カスミ","brand:wikidata":"Q11294160","brand:wikipedia":"ja:カスミ",name:"カスミ","name:en":"Kasumi","name:ja":"カスミ",shop:"supermarket"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/バロー":{name:"バロー",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q11328346",shop:"supermarket"},addTags:{brand:"バロー","brand:en":"Valor","brand:ja":"バロー","brand:wikidata":"Q11328346","brand:wikipedia":"ja:バロー (チェーンストア)",name:"バロー","name:en":"Valor","name:ja":"バロー",shop:"supermarket"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/マックスバリュ":{name:"マックスバリュ",icon:"maki-grocery",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FMaxValu.JPG&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q1960109",shop:"supermarket"},addTags:{brand:"マックスバリュ","brand:en":"Maxvalu Tokai","brand:ja":"マックスバリュ","brand:wikidata":"Q1960109","brand:wikipedia":"en:MaxValu",name:"マックスバリュ","name:en":"Maxvalu Tokai","name:ja":"マックスバリュ",shop:"supermarket"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/マルエツ":{name:"マルエツ",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q11341197",shop:"supermarket"},addTags:{brand:"マルエツ","brand:en":"Maruetsu","brand:ja":"マルエツ","brand:wikidata":"Q11341197","brand:wikipedia":"ja:マルエツ",name:"マルエツ","name:en":"Maruetsu","name:ja":"マルエツ",shop:"supermarket"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/ヤオコー":{name:"ヤオコー",icon:"maki-grocery",imageURL:"https://graph.facebook.com/yaokococoro/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11344967",shop:"supermarket"},addTags:{brand:"ヤオコー","brand:en":"Yaoko","brand:ja":"ヤオコー","brand:wikidata":"Q11344967","brand:wikipedia":"ja:ヤオコー",name:"ヤオコー","name:en":"Yaoko","name:ja":"ヤオコー",shop:"supermarket"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/ヨークベニマル":{name:"ヨークベニマル",icon:"maki-grocery",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FYork%20benimaru%20logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q11346199",shop:"supermarket"},addTags:{brand:"ヨークベニマル","brand:en":"York Benimaru","brand:ja":"ヨークベニマル","brand:wikidata":"Q11346199","brand:wikipedia":"ja:ヨークベニマル",name:"ヨークベニマル","name:en":"York Benimaru","name:ja":"ヨークベニマル",shop:"supermarket"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/ヨークマート":{name:"ヨークマート",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q11346201",shop:"supermarket"},addTags:{brand:"ヨークマート","brand:en":"YorkMart","brand:ja":"ヨークマート","brand:wikidata":"Q11346201","brand:wikipedia":"ja:ヨークマート",name:"ヨークマート","name:en":"YorkMart","name:ja":"ヨークマート",operator:"株式会社セブン&アイ・ホールディングス","operator:en":"Seven & I Holdings Co., Ltd.","operator:wikidata":"Q639447","operator:wikipedia":"ja:セブン&アイ・ホールディングス",shop:"supermarket"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/ライフ":{name:"ライフ",icon:"maki-grocery",imageURL:"https://graph.facebook.com/lifecorp428/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11346476",shop:"supermarket"},addTags:{brand:"ライフ","brand:en":"Life","brand:ja":"ライフ","brand:wikidata":"Q11346476","brand:wikipedia":"ja:ライフコーポレーション",name:"ライフ","name:en":"Life","name:ja":"ライフ",shop:"supermarket"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/全聯":{name:"全聯",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q7262792",shop:"supermarket"},addTags:{brand:"全聯","brand:en":"Pxmart","brand:wikidata":"Q7262792","brand:wikipedia":"en:PX Mart",name:"全聯","name:en":"Pxmart",shop:"supermarket"},countryCodes:["tw"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/全聯福利中心":{name:"全聯福利中心",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q7262792",shop:"supermarket"},addTags:{brand:"全聯福利中心","brand:en":"Pxmart","brand:wikidata":"Q7262792","brand:wikipedia":"en:PX Mart",name:"全聯福利中心","name:en":"Pxmart",shop:"supermarket"},countryCodes:["tw"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/家乐福":{name:"家乐福",icon:"maki-grocery",imageURL:"https://graph.facebook.com/carrefouritalia/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q217599",shop:"supermarket"},addTags:{brand:"家乐福","brand:wikidata":"Q217599","brand:wikipedia":"wuu:家乐福",name:"家乐福",shop:"supermarket"},countryCodes:["cn"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/惠康 Wellcome":{name:"惠康 Wellcome",icon:"maki-grocery",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FWellcome%20Supermarket.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q706247",shop:"supermarket"},addTags:{brand:"惠康 Wellcome","brand:en":"Wellcome","brand:wikidata":"Q706247","brand:wikipedia":"zh:惠康",name:"惠康 Wellcome","name:en":"Wellcome",shop:"supermarket"},countryCodes:["hk"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/業務スーパー":{name:"業務スーパー",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q11590183",shop:"supermarket"},addTags:{brand:"業務スーパー","brand:en":"Gyōmu sūpā","brand:ja":"業務スーパー","brand:wikidata":"Q11590183","brand:wikipedia":"ja:神戸物産",name:"業務スーパー","name:en":"Gyōmu sūpā","name:ja":"業務スーパー",shop:"supermarket"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/沃尔玛":{name:"沃尔玛",icon:"maki-grocery",imageURL:"https://graph.facebook.com/walmart/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q483551",shop:"supermarket"},addTags:{brand:"沃尔玛","brand:en":"Walmart","brand:wikidata":"Q483551","brand:wikipedia":"wuu:沃尔玛",name:"沃尔玛","name:en":"Walmart",shop:"supermarket"},countryCodes:["cn"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/美廉社":{name:"美廉社",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q15914017",shop:"supermarket"},addTags:{brand:"美廉社","brand:en":"Simple Mart","brand:wikidata":"Q15914017","brand:wikipedia":"zh:美廉社",name:"美廉社","name:en":"Simple Mart",shop:"supermarket"},countryCodes:["tw"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/西友":{name:"西友",icon:"maki-grocery",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FSEIYU%20logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q3108542",shop:"supermarket"},addTags:{brand:"西友","brand:en":"Seiyu Group","brand:wikidata":"Q3108542","brand:wikipedia":"en:Seiyu Group",name:"西友","name:en":"Seiyu Group",shop:"supermarket"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/頂好":{name:"頂好",icon:"maki-grocery",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FWellcome%20Supermarket.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q706247",shop:"supermarket"},addTags:{brand:"頂好","brand:en":"Wellcome","brand:wikidata":"Q706247","brand:wikipedia":"en:Wellcome",name:"頂好","name:en":"Wellcome",shop:"supermarket"},countryCodes:["tw"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/頂好超市":{name:"頂好超市",icon:"maki-grocery",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FWellcome%20Supermarket.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q706247",shop:"supermarket"},addTags:{brand:"頂好超市","brand:en":"Wellcome","brand:wikidata":"Q706247","brand:wikipedia":"en:Wellcome",name:"頂好超市","name:en":"Wellcome",shop:"supermarket"},terms:[],matchScore:2,suggestion:true},"shop/supermarket/롯데마트":{name:"롯데마트",icon:"maki-grocery",imageURL:"https://graph.facebook.com/lottemart/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q326715",shop:"supermarket"},addTags:{brand:"롯데마트","brand:ko":"롯데마트","brand:wikidata":"Q326715","brand:wikipedia":"ko:롯데마트",name:"롯데마트","name:en":"Lotte Mart","name:ko":"롯데마트",shop:"supermarket"},countryCodes:["kr"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/하나로마트":{name:"하나로마트",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q12590611",shop:"supermarket"},addTags:{brand:"하나로마트","brand:en":"Hanaro Mart","brand:ko":"하나로마트","brand:wikidata":"Q12590611","brand:wikipedia":"ko:농협유통",name:"하나로마트","name:ko":"하나로마트",shop:"supermarket"},countryCodes:["kr"],terms:[],matchScore:2,suggestion:true},"shop/tea/T2":{name:"T2",icon:"maki-teahouse",imageURL:"https://graph.facebook.com/T2Tea/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q48802134",shop:"tea"},addTags:{brand:"T2","brand:wikidata":"Q48802134","brand:wikipedia":"en:T2 (Australian company)",name:"T2",shop:"tea"},countryCodes:["au"],terms:[],matchScore:2,suggestion:true},"shop/tea/TeeGschwendner":{name:"TeeGschwendner",icon:"maki-teahouse",imageURL:"https://graph.facebook.com/TeeGschwendner/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2399969",shop:"tea"},addTags:{brand:"TeeGschwendner","brand:wikidata":"Q2399969","brand:wikipedia":"de:TeeGschwendner",name:"TeeGschwendner",shop:"tea"},terms:[],matchScore:2,suggestion:true},"shop/ticket/Boutique Grandes Lignes":{name:"Boutique Grandes Lignes",icon:"fas-ticket-alt",imageURL:"https://graph.facebook.com/SNCFOFFICIEL/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q13646",shop:"ticket"},addTags:{brand:"Boutique Grandes Lignes","brand:wikidata":"Q13646","brand:wikipedia":"fr:Société nationale des chemins de fer français",name:"Boutique Grandes Lignes",shop:"ticket"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"shop/ticket/DB Reisezentrum":{name:"DB Reisezentrum",icon:"fas-ticket-alt",imageURL:"https://graph.facebook.com/348950735250586/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q15842100",shop:"ticket"},addTags:{brand:"DB Reisezentrum","brand:wikidata":"Q15842100","brand:wikipedia":"de:Reisezentrum",name:"DB Reisezentrum",shop:"ticket"},countryCodes:["de"],terms:["reisezentrum"],matchScore:2,suggestion:true},"shop/ticket/Guichet Transilien":{name:"Guichet Transilien",icon:"fas-ticket-alt",imageURL:"https://pbs.twimg.com/profile_images/776102546045865984/-NPGF3eG_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q389554",shop:"ticket"},addTags:{brand:"Guichet Transilien","brand:wikidata":"Q389554","brand:wikipedia":"fr:Transilien",name:"Guichet Transilien",shop:"ticket"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"shop/tobacco/Nemzeti Dohánybolt":{name:"Nemzeti Dohánybolt",icon:"maki-shop",geometry:["point","area"],tags:{"brand:wikidata":"Q20639040",shop:"tobacco"},addTags:{brand:"Nemzeti Dohánybolt","brand:wikidata":"Q20639040","brand:wikipedia":"en:Dohánybolt",name:"Nemzeti Dohánybolt",shop:"tobacco"},countryCodes:["hu"],terms:["dohánybolt"],matchScore:2,suggestion:true},"shop/toys/Build-A-Bear Workshop":{name:"Build-A-Bear Workshop",icon:"fas-space-shuttle",imageURL:"https://graph.facebook.com/Buildabear/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1002992",shop:"toys"},addTags:{brand:"Build-A-Bear Workshop","brand:wikidata":"Q1002992","brand:wikipedia":"en:Build-A-Bear Workshop",name:"Build-A-Bear Workshop",shop:"toys"},countryCodes:["ca","gb","us"],terms:["build a bear"],matchScore:2,suggestion:true},"shop/toys/Dráčik":{name:"Dráčik",icon:"fas-space-shuttle",geometry:["point","area"],tags:{"brand:wikidata":"Q57653669",shop:"toys"},addTags:{brand:"Dráčik","brand:wikidata":"Q57653669",name:"Dráčik",shop:"toys"},countryCodes:["cz","sk"],terms:[],matchScore:2,suggestion:true},"shop/toys/Intertoys":{name:"Intertoys",icon:"fas-space-shuttle",imageURL:"https://graph.facebook.com/Intertoys/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1891407",shop:"toys"},addTags:{brand:"Intertoys","brand:wikidata":"Q1891407","brand:wikipedia":"nl:Intertoys",name:"Intertoys",shop:"toys"},countryCodes:["be","de","nl"],terms:[],matchScore:2,suggestion:true},"shop/toys/JouéClub":{name:"JouéClub",icon:"fas-space-shuttle",imageURL:"https://graph.facebook.com/JoueClubFr/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3187152",shop:"toys"},addTags:{brand:"JouéClub","brand:wikidata":"Q3187152","brand:wikipedia":"fr:JouéClub",name:"JouéClub",shop:"toys"},countryCodes:["ad","fr","it","lb","ma","qa"],terms:[],matchScore:2,suggestion:true},"shop/toys/King Jouet":{name:"King Jouet",icon:"fas-space-shuttle",imageURL:"https://graph.facebook.com/KingJouet/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3197009",shop:"toys"},addTags:{brand:"King Jouet","brand:en":"King Toy","brand:wikidata":"Q3197009","brand:wikipedia":"fr:King Jouet",name:"King Jouet","name:en":"King Toy",shop:"toys"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"shop/toys/La Grande Récré":{name:"La Grande Récré",icon:"fas-space-shuttle",imageURL:"https://graph.facebook.com/lagranderecre/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3209556",shop:"toys"},addTags:{brand:"La Grande Récré","brand:wikidata":"Q3209556","brand:wikipedia":"fr:La Grande Récré (magasin)",name:"La Grande Récré",shop:"toys"},countryCodes:["be","ci","es","fr","ma"],terms:[],matchScore:2,suggestion:true},"shop/toys/Lego":{name:"Lego",icon:"fas-space-shuttle",imageURL:"https://graph.facebook.com/lego/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1063455",shop:"toys"},addTags:{brand:"Lego","brand:wikidata":"Q1063455","brand:wikipedia":"en:The Lego Group",name:"Lego",shop:"toys"},terms:[],matchScore:2,suggestion:true},"shop/toys/Lekia":{name:"Lekia",icon:"fas-space-shuttle",imageURL:"https://graph.facebook.com/lekiasweden/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q56303274",shop:"toys"},addTags:{brand:"Lekia","brand:wikidata":"Q56303274","brand:wikipedia":"sv:Lekia",name:"Lekia",shop:"toys"},countryCodes:["no","se"],terms:[],matchScore:2,suggestion:true},"shop/toys/Maxi Toys":{name:"Maxi Toys",icon:"fas-space-shuttle",imageURL:"https://graph.facebook.com/MaxiToys.FR/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q16663879",shop:"toys"},addTags:{brand:"Maxi Toys","brand:wikidata":"Q16663879","brand:wikipedia":"fr:Maxi Toys",name:"Maxi Toys",shop:"toys"},countryCodes:["be","de","fr","it"],terms:[],matchScore:2,suggestion:true},"shop/toys/The Entertainer":{name:"The Entertainer",icon:"fas-space-shuttle",imageURL:"https://graph.facebook.com/TheEntertainerToyShop/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7732289",shop:"toys"},addTags:{brand:"The Entertainer","brand:wikidata":"Q7732289","brand:wikipedia":"en:The Entertainer (retailer)",name:"The Entertainer",shop:"toys"},countryCodes:["gb","je"],terms:[],matchScore:2,suggestion:true},"shop/toys/Toys R Us":{name:"Toys R Us",icon:"fas-space-shuttle",imageURL:"https://graph.facebook.com/toysrus/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q696334",shop:"toys"},addTags:{brand:"Toys R Us","brand:wikidata":"Q696334","brand:wikipedia":"en:Toys \"R\" Us",name:"Toys R Us",shop:"toys"},terms:[],matchScore:2,suggestion:true},"shop/toys/Детский мир":{name:"Детский мир",icon:"fas-space-shuttle",imageURL:"https://graph.facebook.com/detmir/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q16643324",shop:"toys"},addTags:{brand:"Детский мир","brand:en":"Detskiy Mir","brand:wikidata":"Q16643324","brand:wikipedia":"en:Detsky Mir",name:"Детский мир","name:en":"Detskiy Mir",shop:"toys"},terms:[],matchScore:2,suggestion:true},"shop/toys/Кораблик":{name:"Кораблик",icon:"fas-space-shuttle",imageURL:"https://graph.facebook.com/korablik.ru/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q57653416",shop:"toys"},addTags:{brand:"Кораблик","brand:wikidata":"Q57653416",name:"Кораблик",shop:"toys"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"shop/travel_agency/Coral Travel":{name:"Coral Travel",icon:"fas-suitcase",imageURL:"https://graph.facebook.com/coraltravelofficial/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q58011479",shop:"travel_agency"},addTags:{brand:"Coral Travel","brand:wikidata":"Q58011479",name:"Coral Travel",shop:"travel_agency"},countryCodes:["pl","ru","ua"],terms:[],matchScore:2,suggestion:true},"shop/travel_agency/D-reizen":{name:"D-reizen",icon:"fas-suitcase",imageURL:"https://graph.facebook.com/dreizenvakanties/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2445498",shop:"travel_agency"},addTags:{brand:"D-reizen","brand:wikidata":"Q2445498","brand:wikipedia":"nl:D-reizen",name:"D-reizen",shop:"travel_agency"},countryCodes:["nl"],terms:[],matchScore:2,suggestion:true},"shop/travel_agency/DER Reisebüro":{name:"DER Reisebüro",icon:"fas-suitcase",imageURL:"https://graph.facebook.com/DER/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q56729186",shop:"travel_agency"},addTags:{brand:"DER Reisebüro","brand:wikidata":"Q56729186","brand:wikipedia":"de:Deutsches Reisebüro",name:"DER Reisebüro",shop:"travel_agency"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/travel_agency/First Reisebüro":{name:"First Reisebüro",icon:"fas-suitcase",imageURL:"https://graph.facebook.com/TUIDeutschland/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q573103",shop:"travel_agency"},addTags:{brand:"First Reisebüro","brand:wikidata":"Q573103","brand:wikipedia":"en:TUI Group",name:"First Reisebüro",shop:"travel_agency"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/travel_agency/Flight Centre":{name:"Flight Centre",icon:"fas-suitcase",imageURL:"https://graph.facebook.com/flightcentreAU/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5459202",shop:"travel_agency"},addTags:{brand:"Flight Centre","brand:wikidata":"Q5459202","brand:wikipedia":"en:Flight Centre",name:"Flight Centre",shop:"travel_agency"},terms:[],matchScore:2,suggestion:true},"shop/travel_agency/Halcón Viajes":{name:"Halcón Viajes",icon:"fas-suitcase",imageURL:"https://graph.facebook.com/halconviajes.oficial/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q57591939",shop:"travel_agency"},addTags:{brand:"Halcón Viajes","brand:wikidata":"Q57591939",name:"Halcón Viajes",shop:"travel_agency"},countryCodes:["es"],terms:[],matchScore:2,suggestion:true},"shop/travel_agency/Havas Voyages":{name:"Havas Voyages",icon:"fas-suitcase",imageURL:"https://graph.facebook.com/havas.voyages/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q57628091",shop:"travel_agency"},addTags:{brand:"Havas Voyages","brand:wikidata":"Q57628091",name:"Havas Voyages",shop:"travel_agency"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"shop/travel_agency/Reiseland":{name:"Reiseland",icon:"fas-suitcase",imageURL:"https://graph.facebook.com/reiseland/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q40387610",shop:"travel_agency"},addTags:{brand:"Reiseland","brand:wikidata":"Q40387610","brand:wikipedia":"de:OTTO Reisen",name:"Reiseland",shop:"travel_agency"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/travel_agency/Selectour":{name:"Selectour",icon:"fas-suitcase",imageURL:"https://graph.facebook.com/SelectourVoyages/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3478073",shop:"travel_agency"},addTags:{brand:"Selectour","brand:wikidata":"Q3478073","brand:wikipedia":"fr:Selectour",name:"Selectour",shop:"travel_agency"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"shop/travel_agency/TUI":{name:"TUI",icon:"fas-suitcase",imageURL:"https://graph.facebook.com/TUIDeutschland/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q573103",shop:"travel_agency"},addTags:{brand:"TUI","brand:wikidata":"Q573103","brand:wikipedia":"en:TUI Group",name:"TUI",shop:"travel_agency"},terms:["tui reisecenter"],matchScore:2,suggestion:true},"shop/travel_agency/The Co-operative Travel":{name:"The Co-operative Travel",icon:"fas-suitcase",imageURL:"https://graph.facebook.com/cooperativetraveluk/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7726526",shop:"travel_agency"},addTags:{brand:"The Co-operative Travel","brand:wikidata":"Q7726526","brand:wikipedia":"en:The Co-operative Travel",name:"The Co-operative Travel",shop:"travel_agency"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/travel_agency/Thomas Cook":{name:"Thomas Cook",icon:"fas-suitcase",imageURL:"https://graph.facebook.com/thomascook/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2141800",shop:"travel_agency"},addTags:{brand:"Thomas Cook","brand:wikidata":"Q2141800","brand:wikipedia":"en:Thomas Cook Group",name:"Thomas Cook",shop:"travel_agency"},terms:[],matchScore:2,suggestion:true},"shop/travel_agency/Thomson":{name:"Thomson",icon:"fas-suitcase",imageURL:"https://graph.facebook.com/worldofTUI/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7795876",shop:"travel_agency"},addTags:{brand:"Thomson","brand:wikidata":"Q7795876","brand:wikipedia":"en:TUI UK",name:"Thomson",shop:"travel_agency"},terms:[],matchScore:2,suggestion:true},"shop/travel_agency/Поехали с нами":{name:"Поехали с нами",icon:"fas-suitcase",imageURL:"https://graph.facebook.com/PoehaliSNamiua/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q25439141",shop:"travel_agency"},addTags:{brand:"Поехали с нами","brand:wikidata":"Q25439141","brand:wikipedia":"uk:Поїхали з нами",name:"Поехали с нами",shop:"travel_agency"},countryCodes:["ua"],terms:[],matchScore:2,suggestion:true},"shop/tyres/Big O Tires":{name:"Big O Tires",icon:"maki-shop",imageURL:"https://graph.facebook.com/BigOTires/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4906085",shop:"tyres"},addTags:{brand:"Big O Tires","brand:wikidata":"Q4906085","brand:wikipedia":"en:Big O Tires",name:"Big O Tires",shop:"tyres"},terms:[],matchScore:2,suggestion:true},"shop/tyres/Bridgestone":{name:"Bridgestone",icon:"maki-shop",imageURL:"https://graph.facebook.com/BridgestoneTires/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q179433",shop:"tyres"},addTags:{brand:"Bridgestone","brand:wikidata":"Q179433","brand:wikipedia":"en:Bridgestone",name:"Bridgestone",shop:"tyres"},terms:[],matchScore:2,suggestion:true},"shop/tyres/Discount Tire":{name:"Discount Tire",icon:"maki-shop",imageURL:"https://graph.facebook.com/DiscountTire/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5281735",shop:"tyres"},addTags:{brand:"Discount Tire","brand:wikidata":"Q5281735","brand:wikipedia":"en:Discount Tire",name:"Discount Tire",shop:"tyres"},terms:[],matchScore:2,suggestion:true},"shop/tyres/Express Oil Change & Tire Engineers":{name:"Express Oil Change & Tire Engineers",icon:"maki-shop",imageURL:"https://graph.facebook.com/expressoil/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q39057654",shop:"tyres"},addTags:{brand:"Express Oil Change & Tire Engineers","brand:wikidata":"Q39057654","brand:wikipedia":"en:Express Oil Change & Tire Engineers",name:"Express Oil Change & Tire Engineers",shop:"tyres"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/tyres/Les Schwab Tire Center":{name:"Les Schwab Tire Center",icon:"maki-shop",imageURL:"https://graph.facebook.com/lesschwab/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6529977",shop:"tyres"},addTags:{brand:"Les Schwab Tire Center","brand:wikidata":"Q6529977","brand:wikipedia":"en:Les Schwab Tire Centers",name:"Les Schwab Tire Center",shop:"tyres"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/tyres/Michelin":{name:"Michelin",icon:"maki-shop",imageURL:"https://graph.facebook.com/MichelinSustainableMobility/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q151107",shop:"tyres"},addTags:{brand:"Michelin","brand:wikidata":"Q151107","brand:wikipedia":"en:Michelin",name:"Michelin",shop:"tyres"},terms:[],matchScore:2,suggestion:true},"shop/tyres/Tire Discounters":{name:"Tire Discounters",icon:"maki-shop",imageURL:"https://graph.facebook.com/TireDiscounters/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q29093639",shop:"tyres"},addTags:{brand:"Tire Discounters","brand:wikidata":"Q29093639","brand:wikipedia":"en:Tire Discounters",name:"Tire Discounters",shop:"tyres"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/tyres/Vianor":{name:"Vianor",icon:"maki-shop",imageURL:"https://graph.facebook.com/VianorNorthAmerica/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q10714920",shop:"tyres"},addTags:{brand:"Vianor","brand:wikidata":"Q10714920","brand:wikipedia":"sv:Vianor",name:"Vianor",shop:"tyres"},terms:[],matchScore:2,suggestion:true},"shop/variety_store/99 Cents Only Stores":{name:"99 Cents Only Stores",icon:"maki-shop",imageURL:"https://graph.facebook.com/99CentsOnly/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4646294",shop:"variety_store"},addTags:{brand:"99 Cents Only Stores","brand:wikidata":"Q4646294","brand:wikipedia":"en:99 Cents Only Stores",name:"99 Cents Only Stores",shop:"variety_store"},countryCodes:["us"],terms:["99 cents only"],matchScore:2,suggestion:true},"shop/variety_store/Action":{name:"Action",icon:"maki-shop",imageURL:"https://graph.facebook.com/actiondotcom/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2634111",shop:"variety_store"},addTags:{brand:"Action","brand:wikidata":"Q2634111","brand:wikipedia":"nl:Action (winkel)",name:"Action",shop:"variety_store"},terms:[],matchScore:2,suggestion:true},"shop/variety_store/B&M Bargains":{name:"B&M Bargains",icon:"maki-shop",imageURL:"https://graph.facebook.com/bmstores/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4836931",shop:"variety_store"},addTags:{brand:"B&M Bargains","brand:wikidata":"Q4836931","brand:wikipedia":"en:B & M",name:"B&M Bargains",shop:"variety_store"},terms:[],matchScore:2,suggestion:true},"shop/variety_store/Big Bazar":{name:"Big Bazar",icon:"maki-shop",imageURL:"https://graph.facebook.com/bigbazarbv/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q15873104",shop:"variety_store"},addTags:{brand:"Big Bazar","brand:wikidata":"Q15873104","brand:wikipedia":"nl:Big Bazar",name:"Big Bazar",shop:"variety_store"},terms:[],matchScore:2,suggestion:true},"shop/variety_store/Dollar General":{name:"Dollar General",icon:"maki-shop",imageURL:"https://graph.facebook.com/dollargeneral/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q145168",shop:"variety_store"},addTags:{brand:"Dollar General","brand:wikidata":"Q145168","brand:wikipedia":"en:Dollar General",name:"Dollar General",shop:"variety_store"},terms:[],matchScore:2,suggestion:true},"shop/variety_store/Dollar Tree":{name:"Dollar Tree",icon:"maki-shop",imageURL:"https://graph.facebook.com/dollartree/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5289230",shop:"variety_store"},addTags:{brand:"Dollar Tree","brand:wikidata":"Q5289230","brand:wikipedia":"en:Dollar Tree",name:"Dollar Tree",shop:"variety_store"},terms:[],matchScore:2,suggestion:true},"shop/variety_store/Dollarama":{name:"Dollarama",icon:"maki-shop",imageURL:"https://graph.facebook.com/415845051799232/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3033947",shop:"variety_store"},addTags:{brand:"Dollarama","brand:wikidata":"Q3033947","brand:wikipedia":"en:Dollarama",name:"Dollarama",shop:"variety_store"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"shop/variety_store/Family Dollar":{name:"Family Dollar",icon:"maki-shop",imageURL:"https://graph.facebook.com/familydollar/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5433101",shop:"variety_store"},addTags:{brand:"Family Dollar","brand:wikidata":"Q5433101","brand:wikipedia":"en:Family Dollar",name:"Family Dollar",shop:"variety_store"},terms:[],matchScore:2,suggestion:true},"shop/variety_store/Five Below":{name:"Five Below",icon:"maki-shop",imageURL:"https://graph.facebook.com/FiveBelow/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5455836",shop:"variety_store"},addTags:{brand:"Five Below","brand:wikidata":"Q5455836","brand:wikipedia":"en:Five Below",name:"Five Below",shop:"variety_store"},terms:[],matchScore:2,suggestion:true},"shop/variety_store/Fix Price":{name:"Fix Price",icon:"maki-shop",imageURL:"https://graph.facebook.com/fixprice.russia/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4038791",shop:"variety_store"},addTags:{brand:"Fix Price","brand:wikidata":"Q4038791","brand:wikipedia":"ru:Fix Price (сеть магазинов)",name:"Fix Price",shop:"variety_store"},terms:[],matchScore:2,suggestion:true},"shop/variety_store/GiFi":{name:"GiFi",icon:"maki-shop",imageURL:"https://graph.facebook.com/GiFi.Officiel/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3105439",shop:"variety_store"},addTags:{brand:"GiFi","brand:wikidata":"Q3105439","brand:wikipedia":"fr:Gifi",name:"GiFi",shop:"variety_store"},terms:[],matchScore:2,suggestion:true},"shop/variety_store/Home Bargains":{name:"Home Bargains",icon:"maki-shop",imageURL:"https://graph.facebook.com/homebargains/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5888229",shop:"variety_store"},addTags:{brand:"Home Bargains","brand:wikidata":"Q5888229","brand:wikipedia":"en:Home Bargains",name:"Home Bargains",shop:"variety_store"},terms:[],matchScore:2,suggestion:true},"shop/variety_store/Mäc-Geiz":{name:"Mäc-Geiz",icon:"maki-shop",imageURL:"https://graph.facebook.com/1652809328274529/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1957126",shop:"variety_store"},addTags:{brand:"Mäc-Geiz","brand:wikidata":"Q1957126","brand:wikipedia":"de:Mäc-Geiz",name:"Mäc-Geiz",shop:"variety_store"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/variety_store/NOZ":{name:"NOZ",icon:"maki-shop",imageURL:"https://graph.facebook.com/UniversNOZ/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3345688",shop:"variety_store"},addTags:{brand:"NOZ","brand:wikidata":"Q3345688","brand:wikipedia":"fr:Noz",name:"NOZ",shop:"variety_store"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"shop/variety_store/Poundland":{name:"Poundland",icon:"maki-shop",imageURL:"https://graph.facebook.com/Poundland/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1434528",shop:"variety_store"},addTags:{brand:"Poundland","brand:wikidata":"Q1434528","brand:wikipedia":"en:Poundland",name:"Poundland",shop:"variety_store"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/variety_store/Poundstretcher":{name:"Poundstretcher",icon:"maki-shop",imageURL:"https://graph.facebook.com/Poundstretcher/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7235675",shop:"variety_store"},addTags:{brand:"Poundstretcher","brand:wikidata":"Q7235675","brand:wikipedia":"en:Poundstretcher",name:"Poundstretcher",shop:"variety_store"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/variety_store/Poundworld":{name:"Poundworld",icon:"maki-shop",imageURL:"https://graph.facebook.com/PoundWorld/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q16967516",shop:"variety_store"},addTags:{brand:"Poundworld","brand:wikidata":"Q16967516","brand:wikipedia":"en:Poundworld",name:"Poundworld",shop:"variety_store"},terms:[],matchScore:2,suggestion:true},"shop/variety_store/TEDi":{name:"TEDi",icon:"maki-shop",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FTEDi-Logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q1364603",shop:"variety_store"},addTags:{brand:"TEDi","brand:wikidata":"Q1364603","brand:wikipedia":"de:TEDi",name:"TEDi",shop:"variety_store"},countryCodes:["at","de","es","hr","si","sk"],terms:[],matchScore:2,suggestion:true},"shop/variety_store/Tokmanni":{name:"Tokmanni",icon:"maki-shop",imageURL:"https://graph.facebook.com/Tokmanni.fi/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q13423470",shop:"variety_store"},addTags:{brand:"Tokmanni","brand:wikidata":"Q13423470","brand:wikipedia":"fi:Tokmanni",name:"Tokmanni",shop:"variety_store"},countryCodes:["fi"],terms:[],matchScore:2,suggestion:true},"shop/variety_store/Wilko":{name:"Wilko",icon:"maki-shop",imageURL:"https://graph.facebook.com/LoveWilko/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q8002536",shop:"variety_store"},addTags:{brand:"Wilko","brand:wikidata":"Q8002536","brand:wikipedia":"en:Wilko (retailer)",name:"Wilko",shop:"variety_store"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/variety_store/キャンドゥ":{name:"キャンドゥ",icon:"maki-shop",imageURL:"https://pbs.twimg.com/profile_images/986887047209091072/PPjs7xOK_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q11297367",shop:"variety_store"},addTags:{brand:"キャンドゥ","brand:en":"CAN DO","brand:ja":"キャンドゥ","brand:wikidata":"Q11297367","brand:wikipedia":"ja:キャンドゥ",name:"キャンドゥ","name:en":"CAN DO","name:ja":"キャンドゥ",shop:"variety_store"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/variety_store/セリア":{name:"セリア",icon:"maki-shop",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FSeria%20logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q11314509",shop:"variety_store"},addTags:{brand:"セリア","brand:en":"Seria","brand:ja":"セリア","brand:wikidata":"Q11314509","brand:wikipedia":"ja:セリア (100円ショップ)",name:"セリア","name:en":"Seria","name:ja":"セリア",shop:"variety_store"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/variety_store/ダイソー":{name:"ダイソー",icon:"maki-shop",imageURL:"https://graph.facebook.com/daisojapanusa/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q866991",shop:"variety_store"},addTags:{brand:"ダイソー","brand:en":"Daiso","brand:ja":"ダイソー","brand:wikidata":"Q866991","brand:wikipedia":"ja:大創産業",name:"ダイソー","name:en":"Daiso","name:ja":"ダイソー",shop:"variety_store"},countryCodes:["jp"],terms:["ザ・ダイソー"],matchScore:2,suggestion:true},"shop/variety_store/ダイレックス":{name:"ダイレックス",icon:"maki-shop",geometry:["point","area"],tags:{"brand:wikidata":"Q11317051",shop:"variety_store"},addTags:{brand:"ダイレックス","brand:en":"Direx","brand:ja":"ダイレックス","brand:wikidata":"Q11317051","brand:wikipedia":"ja:ダイレックス (ディスカウントストア)",name:"ダイレックス","name:en":"Direx","name:ja":"ダイレックス",shop:"variety_store"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/variety_store/トライアル":{name:"トライアル",icon:"maki-shop",geometry:["point","area"],tags:{"brand:wikidata":"Q11321723",shop:"variety_store"},addTags:{brand:"トライアル","brand:en":"Trial","brand:ja":"トライアル","brand:wikidata":"Q11321723","brand:wikipedia":"ja:トライアルカンパニー",name:"トライアル","name:en":"Trial","name:ja":"トライアル",shop:"variety_store"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/variety_store/ドン・キホーテ":{name:"ドン・キホーテ",icon:"maki-shop",imageURL:"https://pbs.twimg.com/profile_images/1098907826305421312/KCKaI33I_bigger.png",geometry:["point","area"],tags:{"brand:wikidata":"Q1185381",shop:"variety_store"},addTags:{brand:"ドン・キホーテ","brand:en":"Don Quijote","brand:ja":"ドン・キホーテ","brand:wikidata":"Q1185381","brand:wikipedia":"ja:ドン・キホーテ (企業)",name:"ドン・キホーテ","name:en":"Don Quijote","name:ja":"ドン・キホーテ",opening_hours:"24/7",shop:"variety_store",short_name:"ドンキ","short_name:en":"Donki","short_name:ja":"ドンキ"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/video_games/EB Games":{name:"EB Games",icon:"maki-gaming",imageURL:"https://graph.facebook.com/ebgamescanada/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4993686",shop:"video_games"},addTags:{brand:"EB Games","brand:wikidata":"Q4993686","brand:wikipedia":"en:EB Games",name:"EB Games",shop:"video_games"},terms:[],matchScore:2,suggestion:true},"shop/video_games/Game":{name:"Game",icon:"maki-gaming",imageURL:"https://pbs.twimg.com/profile_images/925661697230163968/GTdV1FP7_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q5519813",shop:"video_games"},addTags:{brand:"Game","brand:wikidata":"Q5519813","brand:wikipedia":"en:Game (retailer)",name:"Game",shop:"video_games"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/video_games/GameStop":{name:"GameStop",icon:"maki-gaming",imageURL:"https://graph.facebook.com/GameStop/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q202210",shop:"video_games"},addTags:{brand:"GameStop","brand:wikidata":"Q202210","brand:wikipedia":"en:GameStop",name:"GameStop",shop:"video_games"},terms:[],matchScore:2,suggestion:true},"shop/video_games/Micromania":{name:"Micromania",icon:"maki-gaming",imageURL:"https://graph.facebook.com/MicromaniaFr/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3312221",shop:"video_games"},addTags:{brand:"Micromania","brand:wikidata":"Q3312221","brand:wikipedia":"en:Micromania (video game retailer)",name:"Micromania",shop:"video_games"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"shop/video/Blockbuster":{name:"Blockbuster",icon:"temaki-movie_rental",imageURL:"https://graph.facebook.com/blockbuster/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q884711",shop:"video"},addTags:{brand:"Blockbuster","brand:wikidata":"Q884711","brand:wikipedia":"en:Blockbuster LLC",name:"Blockbuster",shop:"video"},terms:[],matchScore:2,suggestion:true},"shop/video/Family Video":{name:"Family Video",icon:"temaki-movie_rental",imageURL:"https://graph.facebook.com/FamilyVideo/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5433297",shop:"video"},addTags:{brand:"Family Video","brand:wikidata":"Q5433297","brand:wikipedia":"en:Family Video",name:"Family Video",shop:"video"},terms:[],matchScore:2,suggestion:true},"shop/video/TSUTAYA":{name:"TSUTAYA",icon:"temaki-movie_rental",imageURL:"https://pbs.twimg.com/profile_images/1016247734720851968/R9agm3pA_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q5193457",shop:"video"},addTags:{brand:"TSUTAYA","brand:wikidata":"Q5193457","brand:wikipedia":"ja:カルチュア・コンビニエンス・クラブ",name:"TSUTAYA",shop:"video"},terms:[],matchScore:2,suggestion:true},"shop/video/ゲオ":{name:"ゲオ",icon:"temaki-movie_rental",imageURL:"https://graph.facebook.com/geomediashop/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5533938",shop:"video"},addTags:{brand:"GEO","brand:ja":"GEO","brand:wikidata":"Q5533938","brand:wikipedia":"ja:ゲオ",name:"ゲオ","name:en":"GEO","name:ja":"ゲオ",shop:"video"},countryCodes:["jp"],terms:["geo"],matchScore:2,suggestion:true},"shop/watches/Fossil":{name:"Fossil",icon:"maki-watch",imageURL:"https://graph.facebook.com/Fossil/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q356212",shop:"watches"},addTags:{brand:"Fossil","brand:wikidata":"Q356212","brand:wikipedia":"en:Fossil Group",name:"Fossil",shop:"watches"},terms:[],matchScore:2,suggestion:true},"shop/watches/Swatch":{name:"Swatch",icon:"maki-watch",imageURL:"https://graph.facebook.com/SwatchUS/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q573422",shop:"watches"},addTags:{brand:"Swatch","brand:wikidata":"Q573422","brand:wikipedia":"en:Swatch",name:"Swatch",shop:"watches"},terms:[],matchScore:2,suggestion:true},"shop/wholesale/BJ's Wholesale Club":{name:"BJ's Wholesale Club",icon:"maki-warehouse",imageURL:"https://graph.facebook.com/bjswholesaleclub/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4835754",shop:"wholesale"},addTags:{brand:"BJ's Wholesale Club","brand:wikidata":"Q4835754","brand:wikipedia":"en:BJ's Wholesale Club",name:"BJ's Wholesale Club",operator:"BJ's Wholesale Club",shop:"wholesale"},terms:[],matchScore:2,suggestion:true},"shop/wholesale/Costco":{name:"Costco",icon:"maki-warehouse",imageURL:"https://graph.facebook.com/Costco/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q715583",shop:"wholesale"},addTags:{brand:"Costco","brand:wikidata":"Q715583","brand:wikipedia":"en:Costco",name:"Costco",operator:"Costco",shop:"wholesale"},terms:["costco wholesale"],matchScore:2,suggestion:true},"shop/wholesale/Makro":{name:"Makro",icon:"maki-warehouse",imageURL:"https://graph.facebook.com/makrohipermayorista/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q704606",shop:"wholesale"},addTags:{brand:"Makro","brand:wikidata":"Q704606","brand:wikipedia":"en:Makro",name:"Makro",shop:"wholesale"},terms:[],matchScore:2,suggestion:true},"shop/wholesale/Metro":{name:"Metro",icon:"maki-warehouse",imageURL:"https://graph.facebook.com/metro.deutschland/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q13610282",shop:"wholesale"},addTags:{brand:"Metro","brand:wikidata":"Q13610282","brand:wikipedia":"en:Metro Cash and Carry",name:"Metro",shop:"wholesale"},terms:[],matchScore:2,suggestion:true},"shop/wholesale/Sam's Club":{name:"Sam's Club",icon:"maki-warehouse",imageURL:"https://graph.facebook.com/samsclub/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1972120",shop:"wholesale"},addTags:{brand:"Sam's Club","brand:wikidata":"Q1972120","brand:wikipedia":"en:Sam's Club",name:"Sam's Club",operator:"Walmart","operator:wikidata":"Q483551","operator:wikipedia":"en:Walmart",shop:"wholesale"},terms:[],matchScore:2,suggestion:true},"shop/wholesale/コストコ":{name:"コストコ",icon:"maki-warehouse",imageURL:"https://graph.facebook.com/Costco/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q715583",shop:"wholesale"},addTags:{brand:"コストコ","brand:en":"Costco","brand:ja":"コストコ","brand:wikidata":"Q715583","brand:wikipedia":"ja:コストコ",name:"コストコ","name:en":"Costco","name:ja":"コストコ",operator:"コストコホールセールジャパン株式会社","operator:en":"Costco Wholesale Japan Co., Ltd.",shop:"wholesale"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"tourism/hotel/B&B Hôtel":{name:"B&B Hôtel",icon:"fas-concierge-bell",imageURL:"https://graph.facebook.com/bbhotels.france/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q794939",tourism:"hotel"},addTags:{brand:"B&B Hôtel","brand:wikidata":"Q794939","brand:wikipedia":"en:B&B Hotels",name:"B&B Hôtel",tourism:"hotel"},terms:[],matchScore:2,suggestion:true},"tourism/hotel/Best Western":{name:"Best Western",icon:"fas-concierge-bell",imageURL:"https://graph.facebook.com/BestWestern/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q830334",tourism:"hotel"},addTags:{brand:"Best Western","brand:wikidata":"Q830334","brand:wikipedia":"en:Best Western",name:"Best Western",tourism:"hotel"},terms:[],matchScore:2,suggestion:true},"tourism/hotel/Best Western Plus":{name:"Best Western Plus",icon:"fas-concierge-bell",imageURL:"https://graph.facebook.com/BestWestern/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q830334",tourism:"hotel"},addTags:{brand:"Best Western","brand:wikidata":"Q830334","brand:wikipedia":"en:Best Western",name:"Best Western Plus",tourism:"hotel"},terms:[],matchScore:2,suggestion:true},"tourism/hotel/Campanile":{name:"Campanile",icon:"fas-concierge-bell",imageURL:"https://graph.facebook.com/campanile/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2412064",tourism:"hotel"},addTags:{brand:"Campanile","brand:wikidata":"Q2412064","brand:wikipedia":"fr:Campanile (chaîne d'hôtels)",name:"Campanile",tourism:"hotel"},terms:[],matchScore:2,suggestion:true},"tourism/hotel/Candlewood Suites":{name:"Candlewood Suites",icon:"fas-concierge-bell",imageURL:"https://graph.facebook.com/CandlewoodSuites/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5032010",tourism:"hotel"},addTags:{brand:"Candlewood Suites","brand:wikidata":"Q5032010","brand:wikipedia":"en:Candlewood Suites",name:"Candlewood Suites",tourism:"hotel"},terms:[],matchScore:2,suggestion:true},"tourism/hotel/Comfort Inn":{name:"Comfort Inn",icon:"fas-concierge-bell",imageURL:"https://graph.facebook.com/choicehotels/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1075788",tourism:"hotel"},addTags:{brand:"Comfort Inn","brand:wikidata":"Q1075788","brand:wikipedia":"en:Choice Hotels",name:"Comfort Inn",tourism:"hotel"},terms:[],matchScore:2,suggestion:true},"tourism/hotel/Comfort Inn & Suites":{name:"Comfort Inn & Suites",icon:"fas-concierge-bell",imageURL:"https://graph.facebook.com/choicehotels/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1075788",tourism:"hotel"},addTags:{brand:"Comfort Inn & Suites","brand:wikidata":"Q1075788","brand:wikipedia":"en:Choice Hotels",name:"Comfort Inn & Suites",tourism:"hotel"},terms:[],matchScore:2,suggestion:true},"tourism/hotel/Comfort Suites":{name:"Comfort Suites",icon:"fas-concierge-bell",imageURL:"https://graph.facebook.com/choicehotels/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1075788",tourism:"hotel"},addTags:{brand:"Comfort Suites","brand:wikidata":"Q1075788","brand:wikipedia":"en:Choice Hotels",name:"Comfort Suites",tourism:"hotel"},terms:[],matchScore:2,suggestion:true},"tourism/hotel/Country Inn & Suites":{name:"Country Inn & Suites",icon:"fas-concierge-bell",imageURL:"https://graph.facebook.com/countryinn/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5177332",tourism:"hotel"},addTags:{brand:"Country Inn & Suites","brand:wikidata":"Q5177332","brand:wikipedia":"en:Country Inns & Suites",name:"Country Inn & Suites",tourism:"hotel"},terms:[],matchScore:2,suggestion:true},"tourism/hotel/Courtyard by Marriott":{name:"Courtyard by Marriott",icon:"fas-concierge-bell",imageURL:"https://graph.facebook.com/courtyard/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1053170",tourism:"hotel"},addTags:{brand:"Courtyard by Marriott","brand:wikidata":"Q1053170","brand:wikipedia":"en:Courtyard by Marriott",name:"Courtyard by Marriott",tourism:"hotel"},terms:["courtyard marriott"],matchScore:2,suggestion:true},"tourism/hotel/Crowne Plaza":{name:"Crowne Plaza",icon:"fas-concierge-bell",imageURL:"https://graph.facebook.com/crowneplaza/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2746220",tourism:"hotel"},addTags:{brand:"Crowne Plaza","brand:wikidata":"Q2746220","brand:wikipedia":"en:Crowne Plaza",name:"Crowne Plaza",tourism:"hotel"},terms:[],matchScore:2,suggestion:true},"tourism/hotel/Days Inn":{name:"Days Inn",icon:"fas-concierge-bell",imageURL:"https://graph.facebook.com/DaysInn/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1047239",tourism:"hotel"},addTags:{brand:"Days Inn","brand:wikidata":"Q1047239","brand:wikipedia":"en:Days Inn",name:"Days Inn",operator:"Wyndham Hotels and Resorts","operator:wikidata":"Q8040120","operator:wikipedia":"en:Wyndham Hotels and Resorts",tourism:"hotel"},terms:[],matchScore:2,suggestion:true},"tourism/hotel/Embassy Suites":{name:"Embassy Suites",icon:"fas-concierge-bell",imageURL:"https://graph.facebook.com/EmbassySuites/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5369524",tourism:"hotel"},addTags:{brand:"Embassy Suites","brand:wikidata":"Q5369524","brand:wikipedia":"en:Embassy Suites by Hilton",name:"Embassy Suites",tourism:"hotel"},terms:[],matchScore:2,suggestion:true},"tourism/hotel/Extended Stay America":{name:"Extended Stay America",icon:"fas-concierge-bell",imageURL:"https://graph.facebook.com/ExtendedStayAmerica/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5421850",tourism:"hotel"},addTags:{brand:"Extended Stay America","brand:wikidata":"Q5421850","brand:wikipedia":"en:Extended Stay America",name:"Extended Stay America",tourism:"hotel"},terms:[],matchScore:2,suggestion:true},"tourism/hotel/Fairfield Inn":{name:"Fairfield Inn",icon:"fas-concierge-bell",imageURL:"https://graph.facebook.com/fairfieldbymarriott/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5430314",tourism:"hotel"},addTags:{brand:"Fairfield Inn","brand:wikidata":"Q5430314","brand:wikipedia":"en:Fairfield Inn by Marriott",name:"Fairfield Inn",tourism:"hotel"},terms:["fairfield inn & suites","fairfield inn and suites"],matchScore:2,suggestion:true},"tourism/hotel/Formule 1":{name:"Formule 1",icon:"fas-concierge-bell",imageURL:"https://graph.facebook.com/HotelF1/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1630895",tourism:"hotel"},addTags:{brand:"Formule 1","brand:wikidata":"Q1630895","brand:wikipedia":"en:Hotel Formule 1",name:"Formule 1",tourism:"hotel"},terms:[],matchScore:2,suggestion:true},"tourism/hotel/Grand Hyatt":{name:"Grand Hyatt",icon:"fas-concierge-bell",imageURL:"https://graph.facebook.com/hyatt/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1425063",tourism:"hotel"},addTags:{brand:"Grand Hyatt","brand:wikidata":"Q1425063","brand:wikipedia":"en:Hyatt",name:"Grand Hyatt",operator:"Hyatt",tourism:"hotel"},terms:[],matchScore:2,suggestion:true},"tourism/hotel/Hampton":{name:"Hampton",icon:"fas-concierge-bell",imageURL:"https://graph.facebook.com/hamptonbyhilton/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5646230",tourism:"hotel"},addTags:{alt_name:"Hampton Inn",brand:"Hampton","brand:wikidata":"Q5646230","brand:wikipedia":"en:Hampton by Hilton",name:"Hampton",tourism:"hotel"},terms:["hampton inn","hampton inn & suites","hampton inn and suites"],matchScore:2,suggestion:true},"tourism/hotel/Hilton":{name:"Hilton",icon:"fas-concierge-bell",imageURL:"https://graph.facebook.com/hilton/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q598884",tourism:"hotel"},addTags:{brand:"Hilton","brand:wikidata":"Q598884","brand:wikipedia":"en:Hilton Hotels & Resorts",name:"Hilton",tourism:"hotel"},terms:[],matchScore:2,suggestion:true},"tourism/hotel/Hilton Garden Inn":{name:"Hilton Garden Inn",icon:"fas-concierge-bell",imageURL:"https://graph.facebook.com/HiltonGardenInn/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1162859",tourism:"hotel"},addTags:{brand:"Hilton Garden Inn","brand:wikidata":"Q1162859","brand:wikipedia":"en:Hilton Garden Inn",name:"Hilton Garden Inn",tourism:"hotel"},terms:[],matchScore:2,suggestion:true},"tourism/hotel/Holiday Inn":{name:"Holiday Inn",icon:"fas-concierge-bell",imageURL:"https://graph.facebook.com/HolidayInn/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2717882",tourism:"hotel"},addTags:{brand:"Holiday Inn","brand:wikidata":"Q2717882","brand:wikipedia":"en:Holiday Inn",name:"Holiday Inn",tourism:"hotel"},terms:[],matchScore:2,suggestion:true},"tourism/hotel/Holiday Inn Express":{name:"Holiday Inn Express",icon:"fas-concierge-bell",imageURL:"https://graph.facebook.com/holidayinnexpress/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5880423",tourism:"hotel"},addTags:{brand:"Holiday Inn Express","brand:wikidata":"Q5880423","brand:wikipedia":"en:Holiday Inn Express",name:"Holiday Inn Express",tourism:"hotel"},terms:[],matchScore:2,suggestion:true},"tourism/hotel/Holiday Inn Express & Suites":{name:"Holiday Inn Express & Suites",icon:"fas-concierge-bell",imageURL:"https://graph.facebook.com/holidayinnexpress/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5880423",tourism:"hotel"},addTags:{brand:"Holiday Inn Express & Suites","brand:wikidata":"Q5880423","brand:wikipedia":"en:Holiday Inn Express",name:"Holiday Inn Express & Suites",tourism:"hotel"},terms:[],matchScore:2,suggestion:true},"tourism/hotel/Homewood Suites":{name:"Homewood Suites",icon:"fas-concierge-bell",imageURL:"https://graph.facebook.com/HomewoodSuites/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5890701",tourism:"hotel"},addTags:{brand:"Homewood Suites","brand:wikidata":"Q5890701","brand:wikipedia":"en:Homewood Suites by Hilton",name:"Homewood Suites",tourism:"hotel"},terms:[],matchScore:2,suggestion:true},"tourism/hotel/Hyatt":{name:"Hyatt",icon:"fas-concierge-bell",imageURL:"https://graph.facebook.com/hyatt/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1425063",tourism:"hotel"},addTags:{brand:"Hyatt","brand:wikidata":"Q1425063","brand:wikipedia":"en:Hyatt",name:"Hyatt",operator:"Hyatt",tourism:"hotel"},terms:[],matchScore:2,suggestion:true},"tourism/hotel/Hyatt Centric":{name:"Hyatt Centric",icon:"fas-concierge-bell",imageURL:"https://graph.facebook.com/hyatt/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1425063",tourism:"hotel"},addTags:{brand:"Hyatt Centric","brand:wikidata":"Q1425063","brand:wikipedia":"en:Hyatt",name:"Hyatt Centric",operator:"Hyatt",tourism:"hotel"},terms:[],matchScore:2,suggestion:true},"tourism/hotel/Hyatt House":{name:"Hyatt House",icon:"fas-concierge-bell",imageURL:"https://graph.facebook.com/hyatt/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1425063",tourism:"hotel"},addTags:{brand:"Hyatt House","brand:wikidata":"Q1425063","brand:wikipedia":"en:Hyatt",name:"Hyatt House",operator:"Hyatt",tourism:"hotel"},terms:[],matchScore:2,suggestion:true},"tourism/hotel/Hyatt Place":{name:"Hyatt Place",icon:"fas-concierge-bell",imageURL:"https://graph.facebook.com/hyatt/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1425063",tourism:"hotel"},addTags:{brand:"Hyatt","brand:wikidata":"Q1425063","brand:wikipedia":"en:Hyatt",name:"Hyatt Place",tourism:"hotel"},terms:[],matchScore:2,suggestion:true},"tourism/hotel/Hyatt Regency":{name:"Hyatt Regency",icon:"fas-concierge-bell",imageURL:"https://graph.facebook.com/hyatt/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1425063",tourism:"hotel"},addTags:{brand:"Hyatt Regency","brand:wikidata":"Q1425063","brand:wikipedia":"en:Hyatt",name:"Hyatt Regency",operator:"Hyatt",tourism:"hotel"},terms:[],matchScore:2,suggestion:true},"tourism/hotel/Ibis":{name:"Ibis",icon:"fas-concierge-bell",imageURL:"https://graph.facebook.com/ibishotels.fr/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q920166",tourism:"hotel"},addTags:{brand:"Ibis","brand:wikidata":"Q920166","brand:wikipedia":"en:Ibis (hotel)",name:"Ibis",tourism:"hotel"},terms:["hotel ibis","ibis hotel"],matchScore:2,suggestion:true},"tourism/hotel/Ibis Budget":{name:"Ibis Budget",icon:"fas-concierge-bell",imageURL:"https://graph.facebook.com/ibisbudget.fr/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1458135",tourism:"hotel"},addTags:{brand:"Ibis Budget","brand:wikidata":"Q1458135","brand:wikipedia":"en:Ibis Budget",name:"Ibis Budget",tourism:"hotel"},terms:[],matchScore:2,suggestion:true},"tourism/hotel/Ibis Styles":{name:"Ibis Styles",icon:"fas-concierge-bell",imageURL:"https://graph.facebook.com/ibisstyles.fr/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3147425",tourism:"hotel"},addTags:{brand:"Ibis Styles","brand:wikidata":"Q3147425","brand:wikipedia":"en:Ibis Styles",name:"Ibis Styles",tourism:"hotel"},terms:[],matchScore:2,suggestion:true},"tourism/hotel/Kyriad":{name:"Kyriad",icon:"fas-concierge-bell",imageURL:"https://graph.facebook.com/kyriadindia/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11751808",tourism:"hotel"},addTags:{brand:"Kyriad","brand:wikidata":"Q11751808","brand:wikipedia":"pl:Kyriad",name:"Kyriad",tourism:"hotel"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"tourism/hotel/La Quinta":{name:"La Quinta",icon:"fas-concierge-bell",imageURL:"https://graph.facebook.com/laquinta/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6464734",tourism:"hotel"},addTags:{brand:"La Quinta","brand:wikidata":"Q6464734","brand:wikipedia":"en:La Quinta Inns & Suites",name:"La Quinta",operator:"Wyndham Hotels and Resorts","operator:wikidata":"Q8040120","operator:wikipedia":"en:Wyndham Hotels and Resorts",tourism:"hotel"},terms:["la quinta inn & suites","la quinta inn and suites","la quinta inns & suites","la quinta inns and suites"],matchScore:2,suggestion:true},"tourism/hotel/Marriott":{name:"Marriott",icon:"fas-concierge-bell",imageURL:"https://graph.facebook.com/marriottinternational/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1141173",tourism:"hotel"},addTags:{brand:"Marriott","brand:wikidata":"Q1141173","brand:wikipedia":"en:Marriott International",name:"Marriott",tourism:"hotel"},terms:[],matchScore:2,suggestion:true},"tourism/hotel/Mercure":{name:"Mercure",icon:"fas-concierge-bell",imageURL:"https://graph.facebook.com/MercureHotels/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1709809",tourism:"hotel"},addTags:{brand:"Mercure","brand:wikidata":"Q1709809","brand:wikipedia":"en:Mercure (hotel)",name:"Mercure",tourism:"hotel"},terms:[],matchScore:2,suggestion:true},"tourism/hotel/Novotel":{name:"Novotel",icon:"fas-concierge-bell",imageURL:"https://graph.facebook.com/Novotelhotels/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q420545",tourism:"hotel"},addTags:{brand:"Novotel","brand:wikidata":"Q420545","brand:wikipedia":"en:Novotel",name:"Novotel",tourism:"hotel"},terms:[],matchScore:2,suggestion:true},"tourism/hotel/Park Hyatt":{name:"Park Hyatt",icon:"fas-concierge-bell",imageURL:"https://graph.facebook.com/hyatt/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1425063",tourism:"hotel"},addTags:{brand:"Park Hyatt","brand:wikidata":"Q1425063","brand:wikipedia":"en:Hyatt",name:"Park Hyatt",operator:"Hyatt",tourism:"hotel"},terms:[],matchScore:2,suggestion:true},"tourism/hotel/Premier Inn":{name:"Premier Inn",icon:"fas-concierge-bell",imageURL:"https://graph.facebook.com/premierinn/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2108626",tourism:"hotel"},addTags:{brand:"Premier Inn","brand:wikidata":"Q2108626","brand:wikipedia":"en:Premier Inn",name:"Premier Inn",tourism:"hotel"},terms:[],matchScore:2,suggestion:true},"tourism/hotel/Première Classe":{name:"Première Classe",icon:"fas-concierge-bell",imageURL:"https://graph.facebook.com/PremiereClasseHotels/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5964551",tourism:"hotel"},addTags:{brand:"Première Classe","brand:wikidata":"Q5964551","brand:wikipedia":"en:Hôtel Première Classe",name:"Première Classe",tourism:"hotel"},terms:[],matchScore:2,suggestion:true},"tourism/hotel/Quality Inn":{name:"Quality Inn",icon:"fas-concierge-bell",imageURL:"https://graph.facebook.com/choicehotels/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1075788",tourism:"hotel"},addTags:{brand:"Quality Inn","brand:wikidata":"Q1075788","brand:wikipedia":"en:Choice Hotels",name:"Quality Inn",tourism:"hotel"},terms:[],matchScore:2,suggestion:true},"tourism/hotel/Quality Inn & Suites":{name:"Quality Inn & Suites",icon:"fas-concierge-bell",imageURL:"https://graph.facebook.com/choicehotels/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1075788",tourism:"hotel"},addTags:{brand:"Quality Inn & Suites","brand:wikidata":"Q1075788","brand:wikipedia":"en:Choice Hotels",name:"Quality Inn & Suites",tourism:"hotel"},terms:[],matchScore:2,suggestion:true},"tourism/hotel/Ramada":{name:"Ramada",icon:"fas-concierge-bell",imageURL:"https://graph.facebook.com/ramada/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1502859",tourism:"hotel"},addTags:{brand:"Ramada","brand:wikidata":"Q1502859","brand:wikipedia":"en:Ramada",name:"Ramada",operator:"Wyndham Hotels and Resorts","operator:wikidata":"Q8040120","operator:wikipedia":"en:Wyndham Hotels and Resorts",tourism:"hotel"},terms:[],matchScore:2,suggestion:true},"tourism/hotel/Red Roof Inn":{name:"Red Roof Inn",icon:"fas-concierge-bell",imageURL:"https://graph.facebook.com/redroofinn/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7304949",tourism:"hotel"},addTags:{brand:"Red Roof Inn","brand:wikidata":"Q7304949","brand:wikipedia":"en:Red Roof Inn",name:"Red Roof Inn",tourism:"hotel"},terms:[],matchScore:2,suggestion:true},"tourism/hotel/Renaissance Hotel":{name:"Renaissance Hotel",icon:"fas-concierge-bell",imageURL:"https://graph.facebook.com/RenaissanceHotels/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2143252",tourism:"hotel"},addTags:{brand:"Renaissance Hotels","brand:wikidata":"Q2143252","brand:wikipedia":"en:Renaissance Hotels",name:"Renaissance Hotel",operator:"Marriott International","operator:wikidata":"Q1141173","operator:wikipedia":"en:Marriott International",tourism:"hotel"},terms:[],matchScore:2,suggestion:true},"tourism/hotel/Residence Inn":{name:"Residence Inn",icon:"fas-concierge-bell",imageURL:"https://graph.facebook.com/residenceinn/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7315394",tourism:"hotel"},addTags:{brand:"Residence Inn","brand:wikidata":"Q7315394","brand:wikipedia":"en:Residence Inn by Marriott",name:"Residence Inn",tourism:"hotel"},terms:[],matchScore:2,suggestion:true},"tourism/hotel/Sheraton":{name:"Sheraton",icon:"fas-concierge-bell",imageURL:"https://graph.facebook.com/Sheraton/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q634831",tourism:"hotel"},addTags:{brand:"Sheraton","brand:wikidata":"Q634831","brand:wikipedia":"en:Sheraton Hotels and Resorts",name:"Sheraton",tourism:"hotel"},terms:[],matchScore:2,suggestion:true},"tourism/hotel/Sleep Inn":{name:"Sleep Inn",icon:"fas-concierge-bell",imageURL:"https://graph.facebook.com/choicehotels/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1075788",tourism:"hotel"},addTags:{brand:"Sleep Inn","brand:wikidata":"Q1075788","brand:wikipedia":"en:Choice Hotels",name:"Sleep Inn",tourism:"hotel"},terms:[],matchScore:2,suggestion:true},"tourism/hotel/Staybridge Suites":{name:"Staybridge Suites",icon:"fas-concierge-bell",imageURL:"https://graph.facebook.com/StaybridgeSuites/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7605116",tourism:"hotel"},addTags:{brand:"Staybridge Suites","brand:wikidata":"Q7605116","brand:wikipedia":"en:Staybridge Suites",name:"Staybridge Suites",tourism:"hotel"},terms:[],matchScore:2,suggestion:true},"tourism/hotel/Travelodge":{name:"Travelodge",icon:"fas-concierge-bell",imageURL:"https://graph.facebook.com/Travelodge/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7836087",tourism:"hotel"},addTags:{brand:"Travelodge","brand:wikidata":"Q7836087","brand:wikipedia":"en:Travelodge",name:"Travelodge",operator:"Wyndham Hotels and Resorts","operator:wikidata":"Q8040120","operator:wikipedia":"en:Wyndham Hotels and Resorts",tourism:"hotel"},terms:[],matchScore:2,suggestion:true},"tourism/hotel/W Hotels":{name:"W Hotels",icon:"fas-concierge-bell",imageURL:"https://graph.facebook.com/WHotels/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7958488",tourism:"hotel"},addTags:{brand:"W Hotels","brand:wikidata":"Q7958488","brand:wikipedia":"en:W Hotels",name:"W Hotels",short_name:"W",tourism:"hotel"},terms:[],matchScore:2,suggestion:true},"tourism/hotel/東横イン":{name:"東横イン",icon:"fas-concierge-bell",geometry:["point","area"],tags:{"brand:wikidata":"Q1320541",tourism:"hotel"},addTags:{brand:"東横イン","brand:en":"Toyoko Inn","brand:ja":"東横イン","brand:wikidata":"Q1320541","brand:wikipedia":"en:Toyoko Inn",name:"東横イン","name:en":"Toyoko Inn","name:ja":"東横イン",tourism:"hotel"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"tourism/motel/Econo Lodge":{name:"Econo Lodge",icon:"maki-lodging",imageURL:"https://graph.facebook.com/choicehotels/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5333330",tourism:"motel"},addTags:{brand:"Econo Lodge","brand:wikidata":"Q5333330","brand:wikipedia":"en:Econo Lodge",name:"Econo Lodge",tourism:"motel"},terms:[],matchScore:2,suggestion:true},"tourism/motel/Motel 6":{name:"Motel 6",icon:"maki-lodging",imageURL:"https://graph.facebook.com/motel6/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2188884",tourism:"motel"},addTags:{brand:"Motel 6","brand:wikidata":"Q2188884","brand:wikipedia":"en:Motel 6",name:"Motel 6",tourism:"motel"},terms:[],matchScore:2,suggestion:true},"tourism/motel/Rodeway Inn":{name:"Rodeway Inn",icon:"maki-lodging",imageURL:"https://graph.facebook.com/choicehotels/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7356709",tourism:"motel"},addTags:{brand:"Rodeway Inn","brand:wikidata":"Q7356709","brand:wikipedia":"en:Rodeway Inn",name:"Rodeway Inn",tourism:"motel"},terms:[],matchScore:2,suggestion:true},"tourism/motel/Super 8":{name:"Super 8",icon:"maki-lodging",imageURL:"https://graph.facebook.com/Super8/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5364003",tourism:"motel"},addTags:{brand:"Super 8","brand:wikidata":"Q5364003","brand:wikipedia":"en:Super 8 Motels",name:"Super 8",operator:"Wyndham Hotels and Resorts","operator:wikidata":"Q8040120","operator:wikipedia":"en:Wyndham Hotels and Resorts",tourism:"motel"},terms:[],matchScore:2,suggestion:true}};
24699
24700         var defaults = {area:["category-landuse","category-building","category-water","category-natural","leisure/park","amenity/hospital","amenity/place_of_worship","amenity/cafe","amenity/restaurant","area"],line:["category-road_major","category-road_minor","category-rail","category-path","category-waterway","category-barrier","category-natural","category-utility","line"],point:["category-natural","leisure/park","amenity/hospital","amenity/place_of_worship","amenity/cafe","amenity/restaurant","amenity/fast_food","amenity/bar","amenity/bank","shop/supermarket","point"],vertex:["highway/crossing/marked","highway/crossing/unmarked","railway/level_crossing","highway/traffic_signals","highway/turning_circle","highway/turning_loop","traffic_calming","highway/mini_roundabout","highway/motorway_junction","point"],relation:["category-route","category-restriction","public_transport/stop_area","type/boundary","type/waterway","type/multipolygon","type/enforcement","type/site","relation"]};
24701
24702         var categories = {"category-barrier":{icon:"maki-roadblock",name:"Barrier Features",members:["barrier/fence","barrier/wall","barrier/ditch","barrier/gate","barrier/hedge","barrier/kerb","barrier"]},"category-building":{icon:"maki-building",name:"Building Features",members:["building","building/house","building/apartments","building/garage","building/retail","building/commercial","building/industrial","building/residential"]},"category-golf":{icon:"maki-golf",name:"Golf Features",members:["golf/fairway","golf/green","golf/lateral_water_hazard","golf/rough","golf/bunker","golf/tee","golf/water_hazard","golf/driving_range","golf/hole","golf/cartpath","golf/path"]},"category-landuse":{icon:"maki-landuse",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":{icon:"maki-natural",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","natural/coastline","natural/tree_row","natural/peak","natural/cliff","natural/beach"]},"category-path":{icon:"temaki-pedestrian",name:"Paths",members:["highway/path","highway/footway","highway/footway/marked","highway/footway/sidewalk","highway/steps","highway/cycleway","highway/bridleway","highway/pedestrian_line"]},"category-rail":{icon:"iD-railway-rail",name:"Rails",members:["railway/rail","railway/disused","railway/tram","railway/subway","railway/narrow_gauge","railway/light_rail","railway/monorail","railway/funicular"]},"category-restriction":{icon:"iD-restriction",name:"Restriction Features",members:["type/restriction/no_left_turn","type/restriction/no_right_turn","type/restriction/no_straight_on","type/restriction/no_u_turn","type/restriction/only_left_turn","type/restriction/only_right_turn","type/restriction/only_straight_on","type/restriction/only_u_turn","type/restriction"]},"category-road_major":{icon:"iD-highway-unclassified",name:"Major Roads",members:["highway/motorway","highway/trunk","highway/primary","highway/secondary","highway/tertiary","highway/motorway_link","highway/trunk_link","highway/primary_link","highway/secondary_link","highway/tertiary_link"]},"category-road_minor":{icon:"iD-highway-unclassified",name:"Minor Roads",members:["highway/unclassified","highway/residential","highway/living_street","highway/service","highway/track"]},"category-road_service":{icon:"iD-highway-service",name:"Service Roads",members:["highway/service","highway/service/parking_aisle","highway/service/driveway","highway/service/alley","highway/service/emergency_access","highway/service/drive-through"]},"category-route":{icon:"iD-route",name:"Route Features",members:["type/route/road","type/route/bicycle","type/route/foot","type/route/hiking","type/route/horse","type/route/piste","type/route/bus","type/route/train","type/route/light_rail","type/route/tram","type/route/subway","type/route/ferry","type/route/power","type/route/pipeline","type/route/detour","type/route_master","type/route"]},"category-utility":{icon:"iD-power-line",name:"Utility Features",members:["power/line","power/minor_line","man_made/pipeline","power/cable/underground"]},"category-water":{icon:"maki-water",name:"Water Bodies",members:["natural/water","natural/water/pond","natural/water/basin","natural/water/lake","natural/water/reservoir"]},"category-waterway":{icon:"iD-waterway-stream",name:"Waterways",members:["waterway/stream","waterway/drain","waterway/river","waterway/canal","waterway/ditch","natural/water/stream","natural/water/river","natural/water/canal"]}};
24703
24704         var fields = {access_simple:{key:"access",type:"combo",label:"Allowed Access",options:["yes","permissive","private","customers","permit","no"]},access:{keys:["access","foot","motor_vehicle","bicycle","horse"],reference:{key:"access"},type:"access",label:"Allowed Access",placeholder:"Not Specified",strings:{types:{access:"All",foot:"Foot",motor_vehicle:"Motor Vehicles",bicycle:"Bicycles",horse:"Horses"},options:{yes:{title:"Allowed",description:"Access allowed by law; a right of way"},no:{title:"Prohibited",description:"Access not allowed to the general public"},permissive:{title:"Permissive",description:"Access allowed until such time as the owner revokes the permission"},"private":{title:"Private",description:"Access allowed only with permission of the owner on an individual basis"},designated:{title:"Designated",description:"Access allowed according to signs or specific local laws"},destination:{title:"Destination",description:"Access allowed only to reach a destination"},dismount:{title:"Dismount",description:"Access allowed but rider must dismount"},permit:{title:"Permit",description:"Access allowed only with a valid permit or license"}}}},address:{type:"address",keys:["addr:block_number","addr:city","addr:block_number","addr:conscriptionnumber","addr:county","addr:country","addr:county","addr:district","addr:floor","addr:hamlet","addr:housename","addr:housenumber","addr:neighbourhood","addr:place","addr:postcode","addr:province","addr:quarter","addr:state","addr:street","addr:subdistrict","addr:suburb","addr:unit"],reference:{key:"addr"},icon:"address",label:"Address",strings:{placeholders:{block_number:"Block Number","block_number!jp":"Block No.",city:"City","city!jp":"City/Town/Village/Tokyo Special Ward","city!vn":"City/Town",conscriptionnumber:"123",country:"Country",county:"County","county!jp":"District",district:"District","district!vn":"Arrondissement/Town/District",floor:"Floor",hamlet:"Hamlet",housename:"Housename",housenumber:"123","housenumber!jp":"Building No./Lot No.",neighbourhood:"Neighbourhood","neighbourhood!jp":"Chōme/Aza/Koaza",place:"Place",postcode:"Postcode",province:"Province","province!jp":"Prefecture",quarter:"Quarter","quarter!jp":"Ōaza/Machi",state:"State",street:"Street",subdistrict:"Subdistrict","subdistrict!vn":"Ward/Commune/Townlet",suburb:"Suburb","suburb!jp":"Ward",unit:"Unit"}}},admin_level:{key:"admin_level",type:"number",minValue:1,label:"Admin Level"},aerialway:{key:"aerialway",type:"typeCombo",label:"Type"},"aerialway/access":{key:"aerialway:access",type:"combo",label:"Access",strings:{options:{entry:"Entry",exit:"Exit",both:"Both"}}},"aerialway/bubble":{key:"aerialway:bubble",type:"check",label:"Bubble"},"aerialway/capacity":{key:"aerialway:capacity",type:"number",minValue:0,label:"Capacity (per hour)",placeholder:"500, 2500, 5000..."},"aerialway/duration":{key:"aerialway:duration",type:"number",minValue:0,label:"Duration (minutes)",placeholder:"1, 2, 3..."},"aerialway/heating":{key:"aerialway:heating",type:"check",label:"Heated"},"aerialway/occupancy":{key:"aerialway:occupancy",type:"number",minValue:0,label:"Occupancy",placeholder:"2, 4, 8..."},"aerialway/summer/access":{key:"aerialway:summer:access",type:"combo",label:"Access (summer)",strings:{options:{entry:"Entry",exit:"Exit",both:"Both"}}},aeroway:{key:"aeroway",type:"typeCombo",label:"Type"},agrarian:{key:"agrarian",type:"semiCombo",label:"Products"},air_conditioning:{key:"air_conditioning",type:"check",label:"Air Conditioning"},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"},architect:{key:"architect",type:"text",label:"Architect"},"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"},attraction:{key:"attraction",type:"typeCombo",label:"Type"},backrest:{key:"backrest",type:"check",label:"Backrest"},bar:{key:"bar",type:"check",label:"Bar"},barrier:{key:"barrier",type:"typeCombo",label:"Type"},basin:{key:"basin",type:"combo",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:"Beauty Specialty"},bench:{key:"bench",type:"check",label:"Bench"},bicycle_parking:{key:"bicycle_parking",type:"combo",label:"Type"},bin:{key:"bin",type:"check",label:"Waste Bin"},blood_components:{key:"blood:",type:"multiCombo",label:"Blood Components",strings:{options:{whole:"whole blood",plasma:"plasma",platelets:"platelets",stemcells:"stem cell samples"}}},board_type:{key:"board_type",type:"typeCombo",label:"Type"},booth:{key:"booth",type:"combo",label:"Booth",caseSensitive:true},boules:{key:"boules",type:"typeCombo",label:"Type"},boundary:{key:"boundary",type:"combo",label:"Type"},brand:{key:"brand",type:"text",label:"Brand"},brewery:{key:"brewery",type:"semiCombo",label:"Draft Beers"},bridge:{key:"bridge",type:"typeCombo",label:"Type",placeholder:"Default"},"bridge/support":{key:"bridge:support",type:"combo",label:"Type"},building_area:{key:"building",type:"combo","default":"yes",geometry:"area",label:"Building"},building:{key:"building",type:"combo",label:"Building"},"building/levels_building":{key:"building:levels",type:"number",minValue:0,label:"Building Levels",placeholder:"2, 4, 6...",prerequisiteTag:{key:"building",valueNot:"no"}},"building/material":{key:"building:material",type:"combo",label:"Material"},bunker_type:{key:"bunker_type",type:"combo",label:"Type"},cables:{key:"cables",type:"number",minValue:1,label:"Cables",placeholder:"1, 2, 3..."},"camera/direction":{key:"camera:direction",type:"number",label:"Direction (Degrees Clockwise)",placeholder:"45, 90, 180, 270"},"camera/mount":{key:"camera:mount",type:"combo",label:"Camera Mount"},"camera/type":{key:"camera:type",type:"combo",label:"Camera Type",strings:{options:{fixed:"Fixed",panning:"Panning",dome:"Dome"}}},capacity:{key:"capacity",type:"number",minValue:0,label:"Capacity",placeholder:"50, 100, 200..."},cash_in:{key:"cash_in",type:"check",label:"Cash In"},castle_type:{key:"castle_type",type:"combo",label:"Type"},check_date:{key:"check_date",type:"text",label:"Last Checked Date"},clothes:{key:"clothes",type:"semiCombo",label:"Clothes"},club:{key:"club",type:"typeCombo",label:"Type"},collection_times:{key:"collection_times",type:"text",label:"Collection Times"},colour:{key:"colour",type:"text",label:"Color"},comment:{key:"comment",type:"textarea",label:"Changeset Comment",placeholder:"Brief description of your contributions (required)"},communication_multi:{key:"communication:",type:"multiCombo",label:"Communication Types"},construction:{key:"construction",type:"combo",label:"Type"},consulate:{key:"consulate",type:"combo",label:"Type"},"contact/webcam":{key:"contact:webcam",type:"url",icon:"website",label:"Webcam URL",placeholder:"http://example.com/"},content:{key:"content",type:"combo",label:"Content",options:["silage","water","oil","fuel","slurry","gas","manure","sewage"]},conveying:{key:"conveying",type:"typeCombo",label:"Movement Direction",strings:{options:{forward:"Forward",backward:"Backward",reversible:"Reversible"}}},country:{key:"country",type:"combo",label:"Country"},couplings:{key:"couplings",type:"number",minValue:1,label:"Couplings",placeholder:"1, 2, 3..."},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","cycleway:left","cycleway:right"],reference:{key:"cycleway"},type:"cycleway",label:"Bike Lanes",placeholder:"none",strings:{types:{"cycleway:left":"Left side","cycleway:right":"Right side"},options:{none:{title:"None",description:"No bike lane"},lane:{title:"Standard bike lane",description:"A bike lane separated from auto traffic by a painted line"},shared_lane:{title:"Shared bike lane",description:"A bike lane with no separation from auto traffic"},track:{title:"Bike track",description:"A bike lane separated from traffic by a physical barrier"},share_busway:{title:"Bike lane shared with bus",description:"A bike lane shared with a bus lane"},opposite_lane:{title:"Opposite bike lane",description:"A bike lane that travels in the opposite direction of traffic"},opposite:{title:"Contraflow bike lane",description:"A bike lane that travels in both directions on a one-way street"}}}},"dance/style":{key:"dance:style",type:"semiCombo",label:"Dance Styles"},date:{key:"date",type:"check",label:"Date"},delivery:{key:"delivery",type:"check",label:"Delivery"},denomination:{key:"denomination",type:"combo",label:"Denomination",prerequisiteTag:{key:"religion"}},denotation:{key:"denotation",type:"combo",label:"Denotation"},departures_board:{key:"departures_board",type:"combo",label:"Departures Board",strings:{options:{yes:"Yes",timetable:"Timetable",realtime:"Realtime",no:"None"}}},description:{key:"description",type:"textarea",label:"Description",universal:true},design:{key:"design",type:"combo",label:"Design"},destination_oneway:{key:"destination",type:"semiCombo",label:"Destinations",prerequisiteTag:{key:"oneway",value:"yes"},snake_case:false},"destination/ref_oneway":{key:"destination:ref",type:"semiCombo",label:"Destination Road Numbers",prerequisiteTag:{key:"oneway",value:"yes"},snake_case:false},"destination/symbol_oneway":{key:"destination:symbol",type:"semiCombo",label:"Destination Symbols",prerequisiteTag:{key:"oneway",value:"yes"}},devices:{key:"devices",type:"number",minValue:0,label:"Devices",placeholder:"1, 2, 3..."},diaper:{key:"diaper",type:"combo",label:"Diaper Changing Available",options:["yes","no","room","1","2","3","4","5"]},diet_multi:{key:"diet:",type:"multiCombo",label:"Diet Types"},diplomatic:{key:"diplomatic",type:"combo",label:"Type"},"diplomatic/services":{key:"diplomatic:services:",type:"multiCombo",label:"Services"},direction_cardinal:{key:"direction",type:"combo",label:"Direction",strings:{options:{N:"North",E:"East",S:"South",W:"West",NE:"Northeast",SE:"Southeast",SW:"Southwest",NW:"Northwest",NNE:"North-northeast",ENE:"East-northeast",ESE:"East-southeast",SSE:"South-southeast",SSW:"South-southwest",WSW:"West-southwest",WNW:"West-northwest",NNW:"North-northwest"}}},direction_clock:{key:"direction",type:"combo",label:"Direction",strings:{options:{clockwise:"Clockwise",anticlockwise:"Counterclockwise"}}},direction_vertex:{key:"direction",type:"combo",label:"Direction",strings:{options:{forward:"Forward",backward:"Backward",both:"Both / All"}}},direction:{key:"direction",type:"number",label:"Direction (Degrees Clockwise)",placeholder:"45, 90, 180, 270"},dispensing:{key:"dispensing",type:"check",label:"Dispenses Prescriptions","default":"yes"},display:{key:"display",type:"combo",label:"Display",options:["analog","digital","sundial","unorthodox"]},distance:{key:"distance",type:"text",label:"Distance"},dock:{key:"dock",type:"combo",label:"Type"},dog:{key:"dog",type:"combo",label:"Dogs",strings:{options:{yes:"Allowed",leashed:"Leashed Only",no:"Not Allowed"}}},door_type:{key:"door",type:"typeCombo",label:"Type"},door:{key:"door",type:"combo",label:"Door"},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",label:"Email"},embankment:{key:"embankment",type:"typeCombo",label:"Type",placeholder:"Default"},embassy:{key:"embassy",type:"combo",label:"Type"},emergency_combo:{key:"emergency",type:"combo",label:"Type"},emergency:{key:"emergency",type:"check",label:"Emergency"},enforcement:{key:"enforcement",type:"combo",label:"Type"},entrance:{key:"entrance",type:"typeCombo",label:"Type"},except:{key:"except",type:"combo",label:"Exceptions"},faces:{key:"faces",type:"number",minValue:0,label:"Faces"},fax:{key:"fax",type:"tel",label:"Fax",placeholder:"+31 42 123 4567"},fee:{key:"fee",type:"check",label:"Fee"},fence_type:{key:"fence_type",type:"combo",label:"Type"},"fire_hydrant/diameter":{key:"fire_hydrant:diameter",type:"combo",label:"Diameter (mm, in, or letters)",snake_case:false},"fire_hydrant/pressure":{key:"fire_hydrant:pressure",type:"combo",label:"Pressure (bar)",snake_case:false},"fire_hydrant/type":{key:"fire_hydrant:type",type:"combo",label:"Shape",strings:{options:{pillar:"Pillar/Aboveground",underground:"Underground",wall:"Wall",pipe:"Capped Pipe"}}},fireplace:{key:"fireplace",type:"check",label:"Fireplace"},fishing:{key:"fishing",type:"combo",label:"Fishing"},fitness_station:{key:"fitness_station",type:"typeCombo",label:"Equipment Type"},fixme:{key:"fixme",type:"textarea",label:"Fix Me",universal:true},"flag/type":{key:"flag:type",type:"combo",label:"Flag Type"},floating:{key:"floating",type:"check",label:"Floating"},flood_prone:{key:"flood_prone",type:"check",label:"Flood Prone"},ford:{key:"ford",type:"typeCombo",label:"Type",placeholder:"Default"},frequency_electrified:{key:"frequency",type:"combo",label:"Operating Frequency",prerequisiteTag:{key:"electrified",valueNot:"no"}},frequency:{key:"frequency",type:"combo",label:"Operating Frequency"},from:{key:"from",type:"text",label:"From"},fuel_multi:{key:"fuel:",type:"multiCombo",label:"Fuel Types"},fuel:{key:"fuel",type:"combo",label:"Fuel"},gauge:{key:"gauge",type:"combo",label:"Gauge"},gender:{type:"radio",keys:["male","female","unisex"],label:"Gender",placeholder:"Unknown",strings:{options:{male:"Male",female:"Female",unisex:"Unisex"}}},"generator/method":{key:"generator:method",type:"combo",label:"Method"},"generator/output/electricity":{key:"generator:output:electricity",type:"typeCombo",label:"Power Output",placeholder:"50 MW, 100 MW, 200 MW...",snake_case:false},"generator/source":{key:"generator:source",type:"combo",label:"Source"},"generator/type":{key:"generator:type",type:"combo",label:"Type"},government:{key:"government",type:"typeCombo",label:"Type"},grape_variety:{key:"grape_variety",type:"semiCombo",label:"Grape Varieties"},guest_house:{key:"guest_house",type:"combo",label:"Type"},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_building:{key:"height",minValue:0,type:"number",label:"Building Height (Meters)",prerequisiteTag:{key:"building",valueNot:"no"}},height:{key:"height",minValue:0,type:"number",label:"Height (Meters)"},highspeed:{key:"highspeed",type:"check",label:"High-Speed"},highway:{key:"highway",type:"typeCombo",label:"Type"},historic:{key:"historic",type:"typeCombo",label:"Type"},"historic/civilization":{key:"historic:civilization",type:"combo",label:"Historic Civilization"},"historic/wreck/date_sunk":{key:"wreck:date_sunk",type:"text",label:"Date Sunk"},"historic/wreck/visible_at_high_tide":{key:"wreck:visible_at_high_tide",type:"check",label:"Visible At High Tide"},"historic/wreck/visible_at_low_tide":{key:"wreck:visible_at_low_tide",type:"check",label:"Visible At Low Tide"},hoops:{key:"hoops",type:"number",minValue:0,label:"Hoops",placeholder:"1, 2, 4..."},horse_dressage:{key:"sport",type:"check",label:"Dressage Riding",strings:{options:{"undefined":"No",equestrian:"Yes"}},reference:{key:"sport",value:"equestrian"}},horse_riding:{key:"leisure",type:"check",label:"Horseback Riding",strings:{options:{"undefined":"No",horse_riding:"Yes"}},reference:{key:"leisure",value:"horse_riding"}},horse_scale:{key:"horse_scale",type:"combo",label:"Horseback Riding Difficulty",placeholder:"Difficult, Dangerous...",strings:{options:{common:"Easy: No problems or difficulties. (default)",demanding:"Use with caution: Uneven way, occasional difficult passages.",difficult:"Difficult: Way narrow and exposed. May contain obstacles to step over and narrow passages.",critical:"Borderline: Passable only for experienced riders and horses. Major obstacles. Bridges should be examined carefully.",dangerous:"Dangerous: Passable only for very experienced riders and horses and only in good weather. Dismount.",impossible:"Impassable: Way or bridge not passable for horses. Too narrow, insuffient support, obstacles like ladders. Danger of life."}}},horse_stables:{key:"amenity",type:"check",label:"Riding Stable",strings:{options:{"undefined":"No",stables:"Yes"}},reference:{key:"amenity",value:"stables"}},iata:{key:"iata",type:"text",label:"IATA"},icao:{key:"icao",type:"text",label:"ICAO"},incline_steps:{key:"incline",type:"combo",label:"Incline",strings:{options:{up:"Up",down:"Down"}}},incline:{key:"incline",type:"combo",label:"Incline"},indoor_type:{key:"indoor",type:"typeCombo",label:"Type"},indoor:{key:"indoor",type:"check",label:"Indoor"},industrial:{key:"industrial",type:"combo",label:"Type"},information:{key:"information",type:"typeCombo",label:"Type"},inscription:{key:"inscription",type:"textarea",label:"Inscription"},intermittent_yes:{key:"intermittent",type:"check",label:"Intermittent","default":"yes"},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",prerequisiteTag:{key:"internet_access",valueNot:"no"}},"internet_access/ssid":{key:"internet_access:ssid",type:"text",label:"Wifi Network Name",prerequisiteTag:{key:"internet_access",valueNot:"no"}},interval:{key:"interval",type:"text",label:"Interval"},junction_line:{key:"junction",type:"combo",label:"Junction",strings:{options:{roundabout:"Roundabout",circular:"Traffic Circle",jughandle:"Jughandle"}}},"junction/ref_oneway":{key:"junction:ref",type:"text",label:"Junction Number",prerequisiteTag:{key:"oneway",value:"yes"}},kerb:{key:"kerb",type:"combo",label:"Curb"},"kerb/height":{key:"kerb:height",type:"combo",snake_case:false,label:"Height"},label:{key:"label",type:"textarea",label:"Label"},lamp_type:{key:"lamp_type",type:"combo",label:"Type"},landuse:{key:"landuse",type:"typeCombo",label:"Type"},lanes:{key:"lanes",type:"number",minValue:0,label:"Lanes",placeholder:"1, 2, 3..."},language_multi:{key:"language:",type:"multiCombo",label:"Languages"},layer:{key:"layer",type:"number",label:"Layer",placeholder:"0"},leaf_cycle_singular:{key:"leaf_cycle",type:"combo",label:"Leaf Cycle",strings:{options:{evergreen:"Evergreen",deciduous:"Deciduous",semi_evergreen:"Semi-Evergreen",semi_deciduous:"Semi-Deciduous"}}},leaf_cycle:{key:"leaf_cycle",type:"combo",label:"Leaf Cycle",strings:{options:{evergreen:"Evergreen",deciduous:"Deciduous",semi_evergreen:"Semi-Evergreen",semi_deciduous:"Semi-Deciduous",mixed:"Mixed"}}},leaf_type_singular:{key:"leaf_type",type:"combo",label:"Leaf Type",strings:{options:{broadleaved:"Broadleaved",needleleaved:"Needleleaved",leafless:"Leafless"}}},leaf_type:{key:"leaf_type",type:"combo",label:"Leaf Type",strings:{options:{broadleaved:"Broadleaved",needleleaved:"Needleleaved",mixed:"Mixed",leafless:"Leafless"}}},leisure:{key:"leisure",type:"typeCombo",label:"Type"},length:{key:"length",type:"number",minValue:0,label:"Length (Meters)"},level:{key:"level",type:"combo",label:"Level",universal:true},levels:{key:"building:levels",type:"number",minValue:0,label:"Levels",placeholder:"2, 4, 6..."},liaison:{key:"liaison",type:"combo",label:"Type"},lit:{key:"lit",type:"check",label:"Lit"},location_pool:{key:"location",type:"typeCombo",label:"Location",strings:{options:{outdoor:"Outdoor",indoor:"Indoor",roof:"Rooftop"}}},location:{key:"location",type:"combo",label:"Location"},lock:{key:"lock",type:"check",label:"Lock"},man_made:{key:"man_made",type:"typeCombo",label:"Type"},manhole:{key:"manhole",type:"typeCombo",label:"Type"},manufacturer:{key:"manufacturer",type:"combo",snake_case:false,caseSensitive:true,label:"Manufacturer"},map_size:{key:"map_size",type:"typeCombo",label:"Coverage"},map_type:{key:"map_type",type:"typeCombo",label:"Type"},material:{key:"material",type:"combo",label:"Material"},maxheight:{key:"maxheight",type:"combo",label:"Max Height",placeholder:"4, 4.5, 5, 14'0\", 14'6\", 15'0\"",snake_case:false},maxspeed:{key:"maxspeed",type:"maxspeed",label:"Speed Limit",placeholder:"40, 50, 60..."},"maxspeed/advisory":{key:"maxspeed:advisory",type:"maxspeed",label:"Advisory Speed Limit",placeholder:"40, 50, 60..."},maxstay:{key:"maxstay",type:"combo",label:"Max Stay",options:["15 min","30 min","45 min","1 hr","1.5 hr","2 hr","2.5 hr","3 hr","4 hr","1 day","2 day"],snake_case:false},maxweight_bridge:{key:"maxweight",type:"combo",label:"Max Weight",snake_case:false,prerequisiteTag:{key:"bridge",valueNot:"no"}},maxweight:{key:"maxweight",type:"combo",label:"Max Weight",snake_case:false},memorial:{key:"memorial",type:"typeCombo",label:"Type"},microbrewery:{key:"microbrewery",type:"check",label:"Microbrewery"},minspeed:{key:"minspeed",type:"maxspeed",label:"Minimum Speed Limit",placeholder:"20, 30, 40..."},monitoring_multi:{key:"monitoring:",type:"multiCombo",label:"Monitoring"},"mtb/scale":{key:"mtb:scale",type:"combo",label:"Mountain Biking Difficulty",placeholder:"0, 1, 2, 3...",strings:{options:{"0":"0: Solid gravel/packed earth, no obstacles, wide curves","1":"1: Some loose surface, small obstacles, wide curves","2":"2: Much loose surface, large obstacles, easy hairpins","3":"3: Slippery surface, large obstacles, tight hairpins","4":"4: Loose surface or boulders, dangerous hairpins","5":"5: Maximum difficulty, boulder fields, landslides","6":"6: Not rideable except by the very best mountain bikers"}}},"mtb/scale/imba":{key:"mtb:scale:imba",type:"combo",label:"IMBA Trail Difficulty",placeholder:"Easy, Medium, Difficult...",strings:{options:{"0":"Easiest (white circle)","1":"Easy (green circle)","2":"Medium (blue square)","3":"Difficult (black diamond)","4":"Extremely Difficult (double black diamond)"}}},"mtb/scale/uphill":{key:"mtb:scale:uphill",type:"combo",label:"Mountain Biking Uphill Difficulty",placeholder:"0, 1, 2, 3...",strings:{options:{"0":"0: Avg. incline <10%, gravel/packed earth, no obstacles","1":"1: Avg. incline <15%, gravel/packed earth, few small objects","2":"2: Avg. incline <20%, stable surface, fistsize rocks/roots","3":"3: Avg. incline <25%, variable surface, fistsize rocks/branches","4":"4: Avg. incline <30%, poor condition, big rocks/branches","5":"5: Very steep, bike generally needs to be pushed or carried"}}},name:{key:"name",type:"localized",label:"Name",universal:true,placeholder:"Common name (if any)"},natural:{key:"natural",type:"typeCombo",label:"Natural"},network_bicycle:{key:"network",type:"combo",label:"Network Type",placeholder:"Local, Regional, National, International",strings:{options:{lcn:"Local",rcn:"Regional",ncn:"National",icn:"International"}}},network_foot:{key:"network",type:"combo",label:"Network Type",placeholder:"Local, Regional, National, International",strings:{options:{lwn:"Local",rwn:"Regional",nwn:"National",iwn:"International"}}},network_horse:{key:"network",type:"combo",label:"Network Type",placeholder:"Local, Regional, National, International",strings:{options:{lhn:"Local",rhn:"Regional",nhn:"National",ihn:"International"}}},network_road:{key:"network",type:"networkCombo",label:"Network"},network:{key:"network",type:"text",label:"Network"},note:{key:"note",type:"textarea",universal:true,icon:"note",label:"Note"},office:{key:"office",type:"typeCombo",label:"Type"},oneway_yes:{key:"oneway",type:"onewayCheck",label:"One Way",strings:{options:{"undefined":"Assumed to be Yes",yes:"Yes",no:"No",reversible:"Reversible",alternating:"Alternating"}}},oneway:{key:"oneway",type:"onewayCheck",label:"One Way",strings:{options:{"undefined":"Assumed to be No",yes:"Yes",no:"No",reversible:"Reversible",alternating:"Alternating"}}},"oneway/bicycle":{key:"oneway:bicycle",type:"check",label:"One Way (Bicycles)",prerequisiteTag:{key:"oneway"}},opening_date:{key:"opening_date",type:"text",label:"Expected Opening Date"},opening_hours:{key:"opening_hours",type:"combo",label:"Hours",placeholder:"Unknown",snake_case:false},operator:{key:"operator",type:"text",label:"Operator"},outdoor_seating:{key:"outdoor_seating",type:"check",label:"Outdoor Seating"},par:{key:"par",type:"number",minValue:1,label:"Par",placeholder:"3, 4, 5..."},park_ride:{key:"park_ride",type:"check",label:"Park and Ride"},parking:{key:"parking",type:"combo",label:"Type",strings:{options:{surface:"Surface","multi-storey":"Multilevel",underground:"Underground",sheds:"Sheds",carports:"Carports",garage_boxes:"Garage Boxes",lane:"Roadside Lane"}}},payment_multi_fee:{key:"payment:",type:"multiCombo",label:"Payment Types",prerequisiteTag:{key:"fee",valueNot:"no"}},payment_multi:{key:"payment:",type:"multiCombo",label:"Payment Types"},phases:{key:"phases",type:"number",minValue:1,label:"Phases",placeholder:"1, 2, 3..."},phone:{key:"phone",type:"tel",icon:"maki-telephone",label:"Telephone",placeholder:"+31 42 123 4567"},"piste/difficulty_downhill":{key:"piste:difficulty",type:"combo",label:"Difficulty",placeholder:"Easy, Intermediate, Advanced...",strings:{options:{novice:"Novice (instructional)",easy:"Easy (green circle)",intermediate:"Intermediate (blue square)",advanced:"Advanced (black diamond)",expert:"Expert (double black diamond)",freeride:"Freeride (off-piste)",extreme:"Extreme (climbing equipment required)"}}},"piste/difficulty_nordic":{key:"piste:difficulty",type:"combo",label:"Difficulty",placeholder:"Easy, Intermediate, Advanced...",strings:{options:{novice:"Novice - Flat, no effort needed",easy:"Easy - Soft hills, short steep section",intermediate:"Intermediate - Steep section",advanced:"Advanced - Narrow, steep or icy section, sharp turn",expert:"Expert - Dangerous terrain around"}}},"piste/difficulty_skitour":{key:"piste:difficulty",type:"combo",label:"Difficulty",placeholder:"Easy, Intermediate, Advanced...",strings:{options:{novice:"Novice - L: <30° incline",easy:"Easy - WS: 30-35° incline",intermediate:"Intermediate - ZS: 35-40° incline",advanced:"Advanced - S: 40-45° incline",expert:"Expert - SS: 45–50° incline",freeride:"Freeride - AS: 50–55° incline",extreme:"Extreme - EX: >55° incline"}}},"piste/difficulty":{key:"piste:difficulty",type:"combo",label:"Difficulty",placeholder:"Easy, Intermediate, Advanced...",strings:{options:{novice:"Novice",easy:"Easy",intermediate:"Intermediate",advanced:"Advanced",expert:"Expert",freeride:"Freeride",extreme:"Extreme"}}},"piste/grooming_downhill":{key:"piste:grooming",type:"combo",label:"Grooming",strings:{options:{classic:"Classic",mogul:"Mogul",backcountry:"Backcountry - no grooming"}}},"piste/grooming_hike":{key:"piste:grooming",type:"combo",label:"Grooming",strings:{options:{classic:"Classic - Winter Hiking",backcountry:"Backcountry - Snowshoeing"}}},"piste/grooming_nordic":{key:"piste:grooming",type:"combo",label:"Grooming",strings:{options:{classic:"Classic",backcountry:"Backcountry, no grooming","classic+skating":"Classic and Skating",scooter:"Scooter/Snowmobile",skating:"Skating"}}},"piste/grooming":{key:"piste:grooming",type:"combo",label:"Grooming",strings:{options:{classic:"Classic",mogul:"Mogul",backcountry:"Backcountry","classic+skating":"Classic and Skating",scooter:"Scooter/Snowmobile",skating:"Skating"}}},"piste/type":{key:"piste:type",type:"typeCombo",label:"Type",strings:{options:{downhill:"Downhill",nordic:"Nordic",skitour:"Skitour",sled:"Sled",hike:"Hike",sleigh:"Sleigh",ice_skate:"Ice Skate",snow_park:"Snow Park",playground:"Playground",connection:"Connection"}}},place:{key:"place",type:"typeCombo",label:"Type"},plant:{key:"plant",type:"combo",label:"Plant"},"plant/output/electricity":{key:"plant:output:electricity",type:"text",label:"Power Output",placeholder:"500 MW, 1000 MW, 2000 MW..."},playground:{key:"playground",type:"combo",label:"Type"},"playground/baby":{key:"baby",type:"check",label:"Baby Seat"},"playground/max_age":{key:"max_age",type:"number",minValue:0,label:"Maximum Age"},"playground/min_age":{key:"min_age",type:"number",minValue:0,label:"Minimum Age"},population:{key:"population",type:"text",label:"Population"},power_supply:{key:"power_supply",type:"check",label:"Power Supply"},power:{key:"power",type:"typeCombo",label:"Type"},produce:{key:"produce",type:"semiCombo",label:"Produce"},product:{key:"product",type:"semiCombo",label:"Products"},railway:{key:"railway",type:"typeCombo",label:"Type"},"railway/position":{key:"railway:position",type:"text",placeholder:"Distance to one decimal (123.4)",label:"Milestone Position"},"railway/signal/direction":{key:"railway:signal:direction",type:"combo",label:"Direction",strings:{options:{forward:"Forward",backward:"Backward",both:"Both / All"}}},rating:{key:"rating",type:"combo",label:"Power Rating",snake_case:false},recycling_accepts:{key:"recycling:",type:"multiCombo",label:"Accepts"},recycling_type:{key:"recycling_type",type:"combo",label:"Type",placeholder:"Container, Center",strings:{options:{container:"Container",centre:"Center"}}},ref_aeroway_gate:{key:"ref",type:"text",label:"Gate Number"},ref_golf_hole:{key:"ref",type:"text",label:"Hole Number",placeholder:"1-18"},ref_highway_junction:{key:"ref",type:"text",label:"Junction Number"},ref_platform:{key:"ref",type:"text",label:"Platform Number"},ref_road_number:{key:"ref",type:"text",label:"Road Number"},ref_room_number:{key:"ref",type:"text",label:"Room Number"},ref_route:{key:"ref",type:"text",label:"Route Number"},ref_runway:{key:"ref",type:"text",label:"Runway Number",placeholder:"e.g. 01L/19R"},ref_stop_position:{key:"ref",type:"text",label:"Stop Number"},ref_taxiway:{key:"ref",type:"text",label:"Taxiway Name",placeholder:"e.g. A5"},ref:{key:"ref",type:"text",label:"Reference Code"},"ref/isil":{key:"ref:isil",type:"text",label:"ISIL Code"},relation:{key:"type",type:"combo",label:"Type"},religion:{key:"religion",type:"combo",label:"Religion"},reservation:{key:"reservation",type:"combo",label:"Reservations",strings:{options:{yes:"Accepted",no:"Not Accepted",required:"Required",recommended:"Recommended"}}},resource:{key:"resource",type:"semiCombo",label:"Resources"},restriction:{key:"restriction",type:"combo",label:"Type"},restrictions:{type:"restrictions",geometry:"vertex",icon:"iD-restrictions",reference:{rtype:"restriction"},label:"Turn Restrictions"},"roof/colour":{key:"roof:colour",type:"combo",label:"Roof Color"},room:{key:"room",type:"combo",label:"Type"},rooms:{key:"rooms",type:"number",minValue:0,label:"Rooms"},route_master:{key:"route_master",type:"combo",label:"Type"},route:{key:"route",type:"combo",label:"Type"},sac_scale:{key:"sac_scale",type:"combo",label:"Hiking Difficulty",placeholder:"Mountain Hiking, Alpine Hiking...",strings:{options:{hiking:"T1: Hiking",mountain_hiking:"T2: Mountain Hiking",demanding_mountain_hiking:"T3: Demanding Mountain Hiking",alpine_hiking:"T4: Alpine Hiking",demanding_alpine_hiking:"T5: Demanding Alpine Hiking",difficult_alpine_hiking:"T6: Difficult Alpine Hiking"}}},salt:{key:"salt",type:"check",label:"Salt"},sanitary_dump_station:{key:"sanitary_dump_station",type:"check",label:"Toilet Disposal"},screen:{key:"screen",type:"number",label:"Screens",placeholder:"1, 4, 8…",minValue:0},scuba_diving:{key:"scuba_diving:",type:"multiCombo",label:"Services",options:["repair","courses","rental","filling","air_filling","nitrox_filling","trimix_filling","oxygen_filling"]},"seamark/beacon_isolated_danger/shape":{key:"seamark:beacon_isolated_danger:shape",type:"combo",label:"Shape"},"seamark/beacon_lateral/category":{key:"seamark:beacon_lateral:category",type:"combo",label:"Category",strings:{options:{port:"Port",starboard:"Starboard",waterway_left:"Waterway Left",waterway_right:"Waterway Right",danger_left:"Danger Left",danger_right:"Danger Right"}}},"seamark/beacon_lateral/colour":{key:"seamark:beacon_lateral:colour",type:"combo",label:"Color",strings:{options:{red:"Red",green:"Green",grey:"Grey"}}},"seamark/beacon_lateral/shape":{key:"seamark:beacon_lateral:shape",type:"combo",label:"Shape"},"seamark/beacon_lateral/system":{key:"seamark:beacon_lateral:system",type:"combo",label:"System",strings:{options:{"iala-a":"IALA A","iala-b":"IALA B",cevni:"CEVNI",other:"Other"}}},"seamark/buoy_lateral/category":{key:"seamark:buoy_lateral:category",type:"combo",label:"Category",strings:{options:{port:"Port",starboard:"Starboard",channel_left:"Channel Left",channel_right:"Channel Right",waterway_left:"Waterway Left",waterway_right:"Waterway Right",danger_left:"Danger Left",danger_right:"Danger Right",preferred_channel_port:"Preferred Channel Port",preferred_channel_starboard:"Preferred Channel Starboard"}}},"seamark/buoy_lateral/colour":{key:"seamark:buoy_lateral:colour",type:"combo",label:"Color",strings:{options:{red:"Red",green:"Green","red;white;red;white":"Red-White-Red-White","green;white;green;white":"Green-White-Green-White","red;green;red":"Red-Green-Red","green;red;green":"Green-Red-Green",white:"White",yellow:"Yellow"}}},"seamark/buoy_lateral/shape":{key:"seamark:buoy_lateral:shape",type:"combo",label:"Shape"},"seamark/buoy_lateral/system":{key:"seamark:buoy_lateral:system",type:"combo",label:"System",strings:{options:{"iala-a":"IALA A","iala-b":"IALA B",cevni:"CEVNI",other:"Other"}}},"seamark/mooring/category":{key:"seamark:mooring:category",type:"combo",label:"Category"},"seamark/type":{key:"seamark:type",type:"combo",label:"Seamark"},"seamark/wreck/category":{key:"seamark:wreck:category",type:"combo",label:"Category"},seasonal:{key:"seasonal",type:"check",label:"Seasonal"},seats:{key:"seats",type:"number",minValue:0,label:"Seats",placeholder:"2, 4, 6..."},second_hand:{key:"second_hand",type:"combo",label:"Sells Used",placeholder:"Yes, No, Only",strings:{options:{yes:"Yes",no:"No",only:"Only"}}},self_service:{key:"self_service",type:"check",label:"Self-Service"},service_rail:{key:"service",type:"combo",label:"Service Type",strings:{options:{spur:"Spur",yard:"Yard",siding:"Siding",crossover:"Crossover"}}},service_times:{key:"service_times",type:"text",label:"Service Times"},service:{key:"service",type:"combo",label:"Type",options:["parking_aisle","driveway","alley","emergency_access","drive-through"]},"service/bicycle":{key:"service:bicycle:",type:"multiCombo",label:"Services"},"service/vehicle":{key:"service:vehicle:",type:"multiCombo",label:"Services"},shelter_type:{key:"shelter_type",type:"combo",label:"Type"},shelter:{key:"shelter",type:"check",label:"Shelter"},shop:{key:"shop",type:"typeCombo",label:"Type"},"siren/purpose":{key:"siren:purpose",type:"combo",label:"Purpose"},"siren/type":{key:"siren:type",type:"combo",label:"Type",strings:{options:{pneumatic:"Pneumatic",electronic:"Electronic",other:"Other"}}},site_type:{key:"site_type",type:"combo",label:"Site Type"},site:{key:"site",type:"combo",label:"Type"},smoking:{key:"smoking",type:"combo",label:"Smoking",placeholder:"No, Separated, Yes...",strings:{options:{no:"No smoking anywhere",separated:"In smoking areas, not physically isolated",isolated:"In smoking areas, physically isolated",outside:"Allowed outside",yes:"Allowed everywhere",dedicated:"Dedicated to smokers (e.g. smokers' club)"}}},smoothness:{key:"smoothness",type:"combo",label:"Smoothness",placeholder:"Thin Rollers, Wheels, Off-Road...",strings:{options:{excellent:"Thin Rollers: rollerblade, skateboard",good:"Thin Wheels: racing bike",intermediate:"Wheels: city bike, wheelchair, scooter",bad:"Robust Wheels: trekking bike, car, rickshaw",very_bad:"High Clearance: light duty off-road vehicle",horrible:"Off-Road: heavy duty off-road vehicle",very_horrible:"Specialized off-road: tractor, ATV",impassable:"Impassable / No wheeled vehicle"}}},social_facility_for:{key:"social_facility:for",type:"combo",label:"People Served"},social_facility:{key:"social_facility",type:"combo",label:"Type"},source:{key:"source",type:"semiCombo",icon:"source",universal:true,label:"Sources",snake_case:false,caseSensitive:true,options:["survey","local knowledge","gps","aerial imagery","streetlevel imagery"]},sport_ice:{key:"sport",type:"semiCombo",label:"Sports",options:["skating","hockey","multi","curling","ice_stock"]},sport_racing_motor:{key:"sport",type:"semiCombo",label:"Sports",options:["motor","karting","motocross"]},sport_racing_nonmotor:{key:"sport",type:"semiCombo",label:"Sports",options:["bmx","cycling","dog_racing","horse_racing","running"]},sport:{key:"sport",type:"semiCombo",label:"Sports"},stars:{key:"stars",type:"combo",label:"Stars"},start_date:{key:"start_date",type:"text",universal:true,label:"Start Date"},step_count:{key:"step_count",type:"number",minValue:0,label:"Number of Steps"},stop:{key:"stop",type:"combo",label:"Stop Type",strings:{options:{all:"All Ways",minor:"Minor Road"}}},street_cabinet:{key:"street_cabinet",type:"combo",label:"Type"},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"},"survey/date":{key:"survey:date",type:"text",label:"Last Survey Date"},swimming_pool:{key:"swimming_pool",type:"combo",label:"Type"},"switch":{key:"switch",type:"combo",label:"Type",strings:{options:{mechanical:"Mechanical",circuit_breaker:"Circuit Breaker",disconnector:"Disconnector",earthing:"Earthing"}}},tactile_paving:{key:"tactile_paving",type:"check",label:"Tactile Paving"},takeaway:{key:"takeaway",type:"combo",label:"Takeaway",placeholder:"Yes, No, Takeaway Only...",strings:{options:{yes:"Yes",no:"No",only:"Takeaway Only"}}},target:{key:"target",type:"combo",label:"Target"},tidal:{key:"tidal",type:"check",label:"Tidal"},to:{key:"to",type:"text",label:"To"},"toilets/disposal":{key:"toilets:disposal",type:"combo",label:"Disposal",strings:{options:{flush:"Flush",pitlatrine:"Pit Latrine",chemical:"Chemical",bucket:"Bucket"}}},"toilets/handwashing":{key:"toilets:handwashing",type:"check",label:"Handwashing"},"toilets/position":{key:"toilets:position",type:"semiCombo",label:"Positions"},toll:{key:"toll",type:"check",label:"Toll"},tomb:{key:"tomb",type:"typeCombo",label:"Type"},tourism:{key:"tourism",type:"typeCombo",label:"Type"},"tower/construction":{key:"tower:construction",type:"combo",label:"Construction",placeholder:"Guyed, Lattice, Concealed, ..."},"tower/type":{key:"tower:type",type:"combo",label:"Type"},tracktype:{key:"tracktype",type:"combo",label:"Track Type",placeholder:"Solid, Mostly Solid, Soft...",strings:{options:{grade1:"Solid: paved or heavily compacted hardcore surface",grade2:"Mostly Solid: gravel/rock with some soft material mixed in",grade3:"Even mixture of hard and soft materials",grade4:"Mostly Soft: soil/sand/grass with some hard material mixed in",grade5:"Soft: soil/sand/grass"}}},trade:{key:"trade",type:"typeCombo",label:"Type"},traffic_calming:{key:"traffic_calming",type:"typeCombo",label:"Type"},traffic_sign:{key:"traffic_sign",type:"typeCombo",label:"Traffic Sign"},"traffic_sign/direction":{key:"traffic_sign:direction",type:"combo",label:"Direction",strings:{options:{forward:"Forward",backward:"Backward",both:"Both / All"}}},traffic_signals:{key:"traffic_signals",type:"combo",label:"Type","default":"signal"},"traffic_signals/direction":{key:"traffic_signals:direction",type:"combo",label:"Direction",strings:{options:{forward:"Forward",backward:"Backward",both:"Both / All"}}},trail_visibility:{key:"trail_visibility",type:"combo",label:"Trail Visibility",placeholder:"Excellent, Good, Bad...",strings:{options:{excellent:"Excellent: unambiguous path or markers everywhere",good:"Good: markers visible, sometimes require searching",intermediate:"Intermediate: few markers, path mostly visible",bad:"Bad: no markers, path sometimes invisible/pathless",horrible:"Horrible: often pathless, some orientation skills required",no:"No: pathless, excellent orientation skills required"}}},transformer:{key:"transformer",type:"combo",label:"Type",strings:{options:{distribution:"Distribution",generator:"Generator",converter:"Converter",traction:"Traction",auto:"Autotransformer",phase_angle_regulator:"Phase Angle Regulator",auxiliary:"Auxiliary",yes:"Unknown"}}},trees:{key:"trees",type:"semiCombo",label:"Trees"},trolley_wire:{key:"trolley_wire",type:"check",label:"Overhead Trolley Wires"},tunnel:{key:"tunnel",type:"typeCombo",label:"Type",placeholder:"Default"},usage_rail:{key:"usage",type:"combo",label:"Usage Type",strings:{options:{main:"Main",branch:"Branch",industrial:"Industrial",military:"Military",test:"Test",tourism:"Tourism"}}},vending:{key:"vending",type:"semiCombo",label:"Types of Goods"},visibility:{key:"visibility",type:"combo",label:"Visibility",strings:{options:{house:"Up to 5m (16ft)",street:"5 to 20m (16 to 65ft)",area:"Over 20m (65ft)"}}},"volcano/status":{key:"volcano:status",type:"combo",label:"Volcano Status",strings:{options:{active:"Active",dormant:"Dormant",extinct:"Extinct"}}},"volcano/type":{key:"volcano:type",type:"combo",label:"Volcano Type",strings:{options:{stratovolcano:"Stratovolcano",shield:"Shield",scoria:"Scoria"}}},voltage_electrified:{key:"voltage",type:"combo",label:"Voltage",prerequisiteTag:{key:"electrified",valueNot:"no"}},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_source:{key:"water_source","default":"main",type:"combo",label:"Water Source"},water_volume:{key:"water_volume",type:"number",label:"Water Reserve Volume (m³)",snake_case:false},water:{key:"water",type:"combo",label:"Type"},waterway:{key:"waterway",type:"typeCombo",label:"Type"},website:{key:"website",type:"url",icon:"website",placeholder:"https://example.com",label:"Website"},wetland:{key:"wetland",type:"combo",label:"Type"},wheelchair:{key:"wheelchair",type:"radio",options:["yes","limited","no"],icon:"maki-wheelchair",label:"Wheelchair Access"},wholesale:{key:"wholesale",type:"typeCombo",label:"Wholesale"},width:{key:"width",type:"number",minValue:0,label:"Width (Meters)"},wikidata:{key:"wikidata",keys:["wikidata","wikipedia"],type:"wikidata",icon:"wikipedia",universal:true,label:"Wikidata"},wikipedia:{key:"wikipedia",keys:["wikipedia","wikidata"],type:"wikipedia",icon:"wikipedia",universal:true,label:"Wikipedia"},windings:{key:"windings",type:"number",minValue:1,label:"Windings",placeholder:"1, 2, 3..."},"windings/configuration":{key:"windings:configuration",type:"combo",label:"Windings Configuration",strings:{options:{star:"Star / Wye",delta:"Delta","open-delta":"Open Delta",zigzag:"Zig Zag",open:"Open",scott:"Scott",leblanc:"Leblanc"}}}};
24705
24706         var quickselect = createCommonjsModule(function (module, exports) {
24707         (function (global, factory) {
24708                 module.exports = factory();
24709         }(commonjsGlobal, (function () {
24710         function quickselect(arr, k, left, right, compare) {
24711             quickselectStep(arr, k, left || 0, right || (arr.length - 1), compare || defaultCompare);
24712         }
24713
24714         function quickselectStep(arr, k, left, right, compare) {
24715
24716             while (right > left) {
24717                 if (right - left > 600) {
24718                     var n = right - left + 1;
24719                     var m = k - left + 1;
24720                     var z = Math.log(n);
24721                     var s = 0.5 * Math.exp(2 * z / 3);
24722                     var sd = 0.5 * Math.sqrt(z * s * (n - s) / n) * (m - n / 2 < 0 ? -1 : 1);
24723                     var newLeft = Math.max(left, Math.floor(k - m * s / n + sd));
24724                     var newRight = Math.min(right, Math.floor(k + (n - m) * s / n + sd));
24725                     quickselectStep(arr, k, newLeft, newRight, compare);
24726                 }
24727
24728                 var t = arr[k];
24729                 var i = left;
24730                 var j = right;
24731
24732                 swap(arr, left, k);
24733                 if (compare(arr[right], t) > 0) swap(arr, left, right);
24734
24735                 while (i < j) {
24736                     swap(arr, i, j);
24737                     i++;
24738                     j--;
24739                     while (compare(arr[i], t) < 0) i++;
24740                     while (compare(arr[j], t) > 0) j--;
24741                 }
24742
24743                 if (compare(arr[left], t) === 0) swap(arr, left, j);
24744                 else {
24745                     j++;
24746                     swap(arr, j, right);
24747                 }
24748
24749                 if (j <= k) left = j + 1;
24750                 if (k <= j) right = j - 1;
24751             }
24752         }
24753
24754         function swap(arr, i, j) {
24755             var tmp = arr[i];
24756             arr[i] = arr[j];
24757             arr[j] = tmp;
24758         }
24759
24760         function defaultCompare(a, b) {
24761             return a < b ? -1 : a > b ? 1 : 0;
24762         }
24763
24764         return quickselect;
24765
24766         })));
24767         });
24768
24769         var rbush_1 = rbush;
24770         var default_1 = rbush;
24771
24772
24773
24774         function rbush(maxEntries, format) {
24775             if (!(this instanceof rbush)) return new rbush(maxEntries, format);
24776
24777             // max entries in a node is 9 by default; min node fill is 40% for best performance
24778             this._maxEntries = Math.max(4, maxEntries || 9);
24779             this._minEntries = Math.max(2, Math.ceil(this._maxEntries * 0.4));
24780
24781             if (format) {
24782                 this._initFormat(format);
24783             }
24784
24785             this.clear();
24786         }
24787
24788         rbush.prototype = {
24789
24790             all: function () {
24791                 return this._all(this.data, []);
24792             },
24793
24794             search: function (bbox) {
24795
24796                 var node = this.data,
24797                     result = [],
24798                     toBBox = this.toBBox;
24799
24800                 if (!intersects$1(bbox, node)) return result;
24801
24802                 var nodesToSearch = [],
24803                     i, len, child, childBBox;
24804
24805                 while (node) {
24806                     for (i = 0, len = node.children.length; i < len; i++) {
24807
24808                         child = node.children[i];
24809                         childBBox = node.leaf ? toBBox(child) : child;
24810
24811                         if (intersects$1(bbox, childBBox)) {
24812                             if (node.leaf) result.push(child);
24813                             else if (contains$4(bbox, childBBox)) this._all(child, result);
24814                             else nodesToSearch.push(child);
24815                         }
24816                     }
24817                     node = nodesToSearch.pop();
24818                 }
24819
24820                 return result;
24821             },
24822
24823             collides: function (bbox) {
24824
24825                 var node = this.data,
24826                     toBBox = this.toBBox;
24827
24828                 if (!intersects$1(bbox, node)) return false;
24829
24830                 var nodesToSearch = [],
24831                     i, len, child, childBBox;
24832
24833                 while (node) {
24834                     for (i = 0, len = node.children.length; i < len; i++) {
24835
24836                         child = node.children[i];
24837                         childBBox = node.leaf ? toBBox(child) : child;
24838
24839                         if (intersects$1(bbox, childBBox)) {
24840                             if (node.leaf || contains$4(bbox, childBBox)) return true;
24841                             nodesToSearch.push(child);
24842                         }
24843                     }
24844                     node = nodesToSearch.pop();
24845                 }
24846
24847                 return false;
24848             },
24849
24850             load: function (data) {
24851                 if (!(data && data.length)) return this;
24852
24853                 if (data.length < this._minEntries) {
24854                     for (var i = 0, len = data.length; i < len; i++) {
24855                         this.insert(data[i]);
24856                     }
24857                     return this;
24858                 }
24859
24860                 // recursively build the tree with the given data from scratch using OMT algorithm
24861                 var node = this._build(data.slice(), 0, data.length - 1, 0);
24862
24863                 if (!this.data.children.length) {
24864                     // save as is if tree is empty
24865                     this.data = node;
24866
24867                 } else if (this.data.height === node.height) {
24868                     // split root if trees have the same height
24869                     this._splitRoot(this.data, node);
24870
24871                 } else {
24872                     if (this.data.height < node.height) {
24873                         // swap trees if inserted one is bigger
24874                         var tmpNode = this.data;
24875                         this.data = node;
24876                         node = tmpNode;
24877                     }
24878
24879                     // insert the small tree into the large tree at appropriate level
24880                     this._insert(node, this.data.height - node.height - 1, true);
24881                 }
24882
24883                 return this;
24884             },
24885
24886             insert: function (item) {
24887                 if (item) this._insert(item, this.data.height - 1);
24888                 return this;
24889             },
24890
24891             clear: function () {
24892                 this.data = createNode([]);
24893                 return this;
24894             },
24895
24896             remove: function (item, equalsFn) {
24897                 if (!item) return this;
24898
24899                 var node = this.data,
24900                     bbox = this.toBBox(item),
24901                     path = [],
24902                     indexes = [],
24903                     i, parent, index, goingUp;
24904
24905                 // depth-first iterative tree traversal
24906                 while (node || path.length) {
24907
24908                     if (!node) { // go up
24909                         node = path.pop();
24910                         parent = path[path.length - 1];
24911                         i = indexes.pop();
24912                         goingUp = true;
24913                     }
24914
24915                     if (node.leaf) { // check current node
24916                         index = findItem(item, node.children, equalsFn);
24917
24918                         if (index !== -1) {
24919                             // item found, remove the item and condense tree upwards
24920                             node.children.splice(index, 1);
24921                             path.push(node);
24922                             this._condense(path);
24923                             return this;
24924                         }
24925                     }
24926
24927                     if (!goingUp && !node.leaf && contains$4(node, bbox)) { // go down
24928                         path.push(node);
24929                         indexes.push(i);
24930                         i = 0;
24931                         parent = node;
24932                         node = node.children[0];
24933
24934                     } else if (parent) { // go right
24935                         i++;
24936                         node = parent.children[i];
24937                         goingUp = false;
24938
24939                     } else node = null; // nothing found
24940                 }
24941
24942                 return this;
24943             },
24944
24945             toBBox: function (item) { return item; },
24946
24947             compareMinX: compareNodeMinX,
24948             compareMinY: compareNodeMinY,
24949
24950             toJSON: function () { return this.data; },
24951
24952             fromJSON: function (data) {
24953                 this.data = data;
24954                 return this;
24955             },
24956
24957             _all: function (node, result) {
24958                 var nodesToSearch = [];
24959                 while (node) {
24960                     if (node.leaf) result.push.apply(result, node.children);
24961                     else nodesToSearch.push.apply(nodesToSearch, node.children);
24962
24963                     node = nodesToSearch.pop();
24964                 }
24965                 return result;
24966             },
24967
24968             _build: function (items, left, right, height) {
24969
24970                 var N = right - left + 1,
24971                     M = this._maxEntries,
24972                     node;
24973
24974                 if (N <= M) {
24975                     // reached leaf level; return leaf
24976                     node = createNode(items.slice(left, right + 1));
24977                     calcBBox(node, this.toBBox);
24978                     return node;
24979                 }
24980
24981                 if (!height) {
24982                     // target height of the bulk-loaded tree
24983                     height = Math.ceil(Math.log(N) / Math.log(M));
24984
24985                     // target number of root entries to maximize storage utilization
24986                     M = Math.ceil(N / Math.pow(M, height - 1));
24987                 }
24988
24989                 node = createNode([]);
24990                 node.leaf = false;
24991                 node.height = height;
24992
24993                 // split the items into M mostly square tiles
24994
24995                 var N2 = Math.ceil(N / M),
24996                     N1 = N2 * Math.ceil(Math.sqrt(M)),
24997                     i, j, right2, right3;
24998
24999                 multiSelect(items, left, right, N1, this.compareMinX);
25000
25001                 for (i = left; i <= right; i += N1) {
25002
25003                     right2 = Math.min(i + N1 - 1, right);
25004
25005                     multiSelect(items, i, right2, N2, this.compareMinY);
25006
25007                     for (j = i; j <= right2; j += N2) {
25008
25009                         right3 = Math.min(j + N2 - 1, right2);
25010
25011                         // pack each entry recursively
25012                         node.children.push(this._build(items, j, right3, height - 1));
25013                     }
25014                 }
25015
25016                 calcBBox(node, this.toBBox);
25017
25018                 return node;
25019             },
25020
25021             _chooseSubtree: function (bbox, node, level, path) {
25022
25023                 var i, len, child, targetNode, area, enlargement, minArea, minEnlargement;
25024
25025                 while (true) {
25026                     path.push(node);
25027
25028                     if (node.leaf || path.length - 1 === level) break;
25029
25030                     minArea = minEnlargement = Infinity;
25031
25032                     for (i = 0, len = node.children.length; i < len; i++) {
25033                         child = node.children[i];
25034                         area = bboxArea(child);
25035                         enlargement = enlargedArea(bbox, child) - area;
25036
25037                         // choose entry with the least area enlargement
25038                         if (enlargement < minEnlargement) {
25039                             minEnlargement = enlargement;
25040                             minArea = area < minArea ? area : minArea;
25041                             targetNode = child;
25042
25043                         } else if (enlargement === minEnlargement) {
25044                             // otherwise choose one with the smallest area
25045                             if (area < minArea) {
25046                                 minArea = area;
25047                                 targetNode = child;
25048                             }
25049                         }
25050                     }
25051
25052                     node = targetNode || node.children[0];
25053                 }
25054
25055                 return node;
25056             },
25057
25058             _insert: function (item, level, isNode) {
25059
25060                 var toBBox = this.toBBox,
25061                     bbox = isNode ? item : toBBox(item),
25062                     insertPath = [];
25063
25064                 // find the best node for accommodating the item, saving all nodes along the path too
25065                 var node = this._chooseSubtree(bbox, this.data, level, insertPath);
25066
25067                 // put the item into the node
25068                 node.children.push(item);
25069                 extend$1(node, bbox);
25070
25071                 // split on node overflow; propagate upwards if necessary
25072                 while (level >= 0) {
25073                     if (insertPath[level].children.length > this._maxEntries) {
25074                         this._split(insertPath, level);
25075                         level--;
25076                     } else break;
25077                 }
25078
25079                 // adjust bboxes along the insertion path
25080                 this._adjustParentBBoxes(bbox, insertPath, level);
25081             },
25082
25083             // split overflowed node into two
25084             _split: function (insertPath, level) {
25085
25086                 var node = insertPath[level],
25087                     M = node.children.length,
25088                     m = this._minEntries;
25089
25090                 this._chooseSplitAxis(node, m, M);
25091
25092                 var splitIndex = this._chooseSplitIndex(node, m, M);
25093
25094                 var newNode = createNode(node.children.splice(splitIndex, node.children.length - splitIndex));
25095                 newNode.height = node.height;
25096                 newNode.leaf = node.leaf;
25097
25098                 calcBBox(node, this.toBBox);
25099                 calcBBox(newNode, this.toBBox);
25100
25101                 if (level) insertPath[level - 1].children.push(newNode);
25102                 else this._splitRoot(node, newNode);
25103             },
25104
25105             _splitRoot: function (node, newNode) {
25106                 // split root node
25107                 this.data = createNode([node, newNode]);
25108                 this.data.height = node.height + 1;
25109                 this.data.leaf = false;
25110                 calcBBox(this.data, this.toBBox);
25111             },
25112
25113             _chooseSplitIndex: function (node, m, M) {
25114
25115                 var i, bbox1, bbox2, overlap, area, minOverlap, minArea, index;
25116
25117                 minOverlap = minArea = Infinity;
25118
25119                 for (i = m; i <= M - m; i++) {
25120                     bbox1 = distBBox(node, 0, i, this.toBBox);
25121                     bbox2 = distBBox(node, i, M, this.toBBox);
25122
25123                     overlap = intersectionArea(bbox1, bbox2);
25124                     area = bboxArea(bbox1) + bboxArea(bbox2);
25125
25126                     // choose distribution with minimum overlap
25127                     if (overlap < minOverlap) {
25128                         minOverlap = overlap;
25129                         index = i;
25130
25131                         minArea = area < minArea ? area : minArea;
25132
25133                     } else if (overlap === minOverlap) {
25134                         // otherwise choose distribution with minimum area
25135                         if (area < minArea) {
25136                             minArea = area;
25137                             index = i;
25138                         }
25139                     }
25140                 }
25141
25142                 return index;
25143             },
25144
25145             // sorts node children by the best axis for split
25146             _chooseSplitAxis: function (node, m, M) {
25147
25148                 var compareMinX = node.leaf ? this.compareMinX : compareNodeMinX,
25149                     compareMinY = node.leaf ? this.compareMinY : compareNodeMinY,
25150                     xMargin = this._allDistMargin(node, m, M, compareMinX),
25151                     yMargin = this._allDistMargin(node, m, M, compareMinY);
25152
25153                 // if total distributions margin value is minimal for x, sort by minX,
25154                 // otherwise it's already sorted by minY
25155                 if (xMargin < yMargin) node.children.sort(compareMinX);
25156             },
25157
25158             // total margin of all possible split distributions where each node is at least m full
25159             _allDistMargin: function (node, m, M, compare) {
25160
25161                 node.children.sort(compare);
25162
25163                 var toBBox = this.toBBox,
25164                     leftBBox = distBBox(node, 0, m, toBBox),
25165                     rightBBox = distBBox(node, M - m, M, toBBox),
25166                     margin = bboxMargin(leftBBox) + bboxMargin(rightBBox),
25167                     i, child;
25168
25169                 for (i = m; i < M - m; i++) {
25170                     child = node.children[i];
25171                     extend$1(leftBBox, node.leaf ? toBBox(child) : child);
25172                     margin += bboxMargin(leftBBox);
25173                 }
25174
25175                 for (i = M - m - 1; i >= m; i--) {
25176                     child = node.children[i];
25177                     extend$1(rightBBox, node.leaf ? toBBox(child) : child);
25178                     margin += bboxMargin(rightBBox);
25179                 }
25180
25181                 return margin;
25182             },
25183
25184             _adjustParentBBoxes: function (bbox, path, level) {
25185                 // adjust bboxes along the given tree path
25186                 for (var i = level; i >= 0; i--) {
25187                     extend$1(path[i], bbox);
25188                 }
25189             },
25190
25191             _condense: function (path) {
25192                 // go through the path, removing empty nodes and updating bboxes
25193                 for (var i = path.length - 1, siblings; i >= 0; i--) {
25194                     if (path[i].children.length === 0) {
25195                         if (i > 0) {
25196                             siblings = path[i - 1].children;
25197                             siblings.splice(siblings.indexOf(path[i]), 1);
25198
25199                         } else this.clear();
25200
25201                     } else calcBBox(path[i], this.toBBox);
25202                 }
25203             },
25204
25205             _initFormat: function (format) {
25206                 // data format (minX, minY, maxX, maxY accessors)
25207
25208                 // uses eval-type function compilation instead of just accepting a toBBox function
25209                 // because the algorithms are very sensitive to sorting functions performance,
25210                 // so they should be dead simple and without inner calls
25211
25212                 var compareArr = ['return a', ' - b', ';'];
25213
25214                 this.compareMinX = new Function('a', 'b', compareArr.join(format[0]));
25215                 this.compareMinY = new Function('a', 'b', compareArr.join(format[1]));
25216
25217                 this.toBBox = new Function('a',
25218                     'return {minX: a' + format[0] +
25219                     ', minY: a' + format[1] +
25220                     ', maxX: a' + format[2] +
25221                     ', maxY: a' + format[3] + '};');
25222             }
25223         };
25224
25225         function findItem(item, items, equalsFn) {
25226             if (!equalsFn) return items.indexOf(item);
25227
25228             for (var i = 0; i < items.length; i++) {
25229                 if (equalsFn(item, items[i])) return i;
25230             }
25231             return -1;
25232         }
25233
25234         // calculate node's bbox from bboxes of its children
25235         function calcBBox(node, toBBox) {
25236             distBBox(node, 0, node.children.length, toBBox, node);
25237         }
25238
25239         // min bounding rectangle of node children from k to p-1
25240         function distBBox(node, k, p, toBBox, destNode) {
25241             if (!destNode) destNode = createNode(null);
25242             destNode.minX = Infinity;
25243             destNode.minY = Infinity;
25244             destNode.maxX = -Infinity;
25245             destNode.maxY = -Infinity;
25246
25247             for (var i = k, child; i < p; i++) {
25248                 child = node.children[i];
25249                 extend$1(destNode, node.leaf ? toBBox(child) : child);
25250             }
25251
25252             return destNode;
25253         }
25254
25255         function extend$1(a, b) {
25256             a.minX = Math.min(a.minX, b.minX);
25257             a.minY = Math.min(a.minY, b.minY);
25258             a.maxX = Math.max(a.maxX, b.maxX);
25259             a.maxY = Math.max(a.maxY, b.maxY);
25260             return a;
25261         }
25262
25263         function compareNodeMinX(a, b) { return a.minX - b.minX; }
25264         function compareNodeMinY(a, b) { return a.minY - b.minY; }
25265
25266         function bboxArea(a)   { return (a.maxX - a.minX) * (a.maxY - a.minY); }
25267         function bboxMargin(a) { return (a.maxX - a.minX) + (a.maxY - a.minY); }
25268
25269         function enlargedArea(a, b) {
25270             return (Math.max(b.maxX, a.maxX) - Math.min(b.minX, a.minX)) *
25271                    (Math.max(b.maxY, a.maxY) - Math.min(b.minY, a.minY));
25272         }
25273
25274         function intersectionArea(a, b) {
25275             var minX = Math.max(a.minX, b.minX),
25276                 minY = Math.max(a.minY, b.minY),
25277                 maxX = Math.min(a.maxX, b.maxX),
25278                 maxY = Math.min(a.maxY, b.maxY);
25279
25280             return Math.max(0, maxX - minX) *
25281                    Math.max(0, maxY - minY);
25282         }
25283
25284         function contains$4(a, b) {
25285             return a.minX <= b.minX &&
25286                    a.minY <= b.minY &&
25287                    b.maxX <= a.maxX &&
25288                    b.maxY <= a.maxY;
25289         }
25290
25291         function intersects$1(a, b) {
25292             return b.minX <= a.maxX &&
25293                    b.minY <= a.maxY &&
25294                    b.maxX >= a.minX &&
25295                    b.maxY >= a.minY;
25296         }
25297
25298         function createNode(children) {
25299             return {
25300                 children: children,
25301                 height: 1,
25302                 leaf: true,
25303                 minX: Infinity,
25304                 minY: Infinity,
25305                 maxX: -Infinity,
25306                 maxY: -Infinity
25307             };
25308         }
25309
25310         // sort an array so that items come in groups of n unsorted items, with groups sorted between each other;
25311         // combines selection algorithm with binary divide & conquer approach
25312
25313         function multiSelect(arr, left, right, n, compare) {
25314             var stack = [left, right],
25315                 mid;
25316
25317             while (stack.length) {
25318                 right = stack.pop();
25319                 left = stack.pop();
25320
25321                 if (right - left <= n) continue;
25322
25323                 mid = left + Math.ceil((right - left) / n / 2) * n;
25324                 quickselect(arr, mid, left, right, compare);
25325
25326                 stack.push(left, mid, mid, right);
25327             }
25328         }
25329         rbush_1.default = default_1;
25330
25331         var lineclip_1 = lineclip;
25332
25333         lineclip.polyline = lineclip;
25334         lineclip.polygon = polygonclip;
25335
25336
25337         // Cohen-Sutherland line clippign algorithm, adapted to efficiently
25338         // handle polylines rather than just segments
25339
25340         function lineclip(points, bbox, result) {
25341
25342             var len = points.length,
25343                 codeA = bitCode(points[0], bbox),
25344                 part = [],
25345                 i, a, b, codeB, lastCode;
25346
25347             if (!result) result = [];
25348
25349             for (i = 1; i < len; i++) {
25350                 a = points[i - 1];
25351                 b = points[i];
25352                 codeB = lastCode = bitCode(b, bbox);
25353
25354                 while (true) {
25355
25356                     if (!(codeA | codeB)) { // accept
25357                         part.push(a);
25358
25359                         if (codeB !== lastCode) { // segment went outside
25360                             part.push(b);
25361
25362                             if (i < len - 1) { // start a new line
25363                                 result.push(part);
25364                                 part = [];
25365                             }
25366                         } else if (i === len - 1) {
25367                             part.push(b);
25368                         }
25369                         break;
25370
25371                     } else if (codeA & codeB) { // trivial reject
25372                         break;
25373
25374                     } else if (codeA) { // a outside, intersect with clip edge
25375                         a = intersect$1(a, b, codeA, bbox);
25376                         codeA = bitCode(a, bbox);
25377
25378                     } else { // b outside
25379                         b = intersect$1(a, b, codeB, bbox);
25380                         codeB = bitCode(b, bbox);
25381                     }
25382                 }
25383
25384                 codeA = lastCode;
25385             }
25386
25387             if (part.length) result.push(part);
25388
25389             return result;
25390         }
25391
25392         // Sutherland-Hodgeman polygon clipping algorithm
25393
25394         function polygonclip(points, bbox) {
25395
25396             var result, edge, prev, prevInside, i, p, inside;
25397
25398             // clip against each side of the clip rectangle
25399             for (edge = 1; edge <= 8; edge *= 2) {
25400                 result = [];
25401                 prev = points[points.length - 1];
25402                 prevInside = !(bitCode(prev, bbox) & edge);
25403
25404                 for (i = 0; i < points.length; i++) {
25405                     p = points[i];
25406                     inside = !(bitCode(p, bbox) & edge);
25407
25408                     // if segment goes through the clip window, add an intersection
25409                     if (inside !== prevInside) result.push(intersect$1(prev, p, edge, bbox));
25410
25411                     if (inside) result.push(p); // add a point if it's inside
25412
25413                     prev = p;
25414                     prevInside = inside;
25415                 }
25416
25417                 points = result;
25418
25419                 if (!points.length) break;
25420             }
25421
25422             return result;
25423         }
25424
25425         // intersect a segment against one of the 4 lines that make up the bbox
25426
25427         function intersect$1(a, b, edge, bbox) {
25428             return edge & 8 ? [a[0] + (b[0] - a[0]) * (bbox[3] - a[1]) / (b[1] - a[1]), bbox[3]] : // top
25429                    edge & 4 ? [a[0] + (b[0] - a[0]) * (bbox[1] - a[1]) / (b[1] - a[1]), bbox[1]] : // bottom
25430                    edge & 2 ? [bbox[2], a[1] + (b[1] - a[1]) * (bbox[2] - a[0]) / (b[0] - a[0])] : // right
25431                    edge & 1 ? [bbox[0], a[1] + (b[1] - a[1]) * (bbox[0] - a[0]) / (b[0] - a[0])] : // left
25432                    null;
25433         }
25434
25435         // bit code reflects the point position relative to the bbox:
25436
25437         //         left  mid  right
25438         //    top  1001  1000  1010
25439         //    mid  0001  0000  0010
25440         // bottom  0101  0100  0110
25441
25442         function bitCode(p, bbox) {
25443             var code = 0;
25444
25445             if (p[0] < bbox[0]) code |= 1; // left
25446             else if (p[0] > bbox[2]) code |= 2; // right
25447
25448             if (p[1] < bbox[1]) code |= 4; // bottom
25449             else if (p[1] > bbox[3]) code |= 8; // top
25450
25451             return code;
25452         }
25453
25454         var whichPolygon_1 = whichPolygon;
25455
25456         function whichPolygon(data) {
25457             var bboxes = [];
25458             for (var i = 0; i < data.features.length; i++) {
25459                 var feature = data.features[i];
25460                 var coords = feature.geometry.coordinates;
25461
25462                 if (feature.geometry.type === 'Polygon') {
25463                     bboxes.push(treeItem(coords, feature.properties));
25464
25465                 } else if (feature.geometry.type === 'MultiPolygon') {
25466                     for (var j = 0; j < coords.length; j++) {
25467                         bboxes.push(treeItem(coords[j], feature.properties));
25468                     }
25469                 }
25470             }
25471
25472             var tree = rbush_1().load(bboxes);
25473
25474             function query(p, multi) {
25475                 var output = [],
25476                     result = tree.search({
25477                         minX: p[0],
25478                         minY: p[1],
25479                         maxX: p[0],
25480                         maxY: p[1]
25481                     });
25482                 for (var i = 0; i < result.length; i++) {
25483                     if (insidePolygon(result[i].coords, p)) {
25484                         if (multi)
25485                             output.push(result[i].props);
25486                         else
25487                             return result[i].props;
25488                     }
25489                 }
25490                 return multi && output.length ? output : null;
25491             }
25492
25493             query.tree = tree;
25494             query.bbox = function queryBBox(bbox) {
25495                 var output = [];
25496                 var result = tree.search({
25497                     minX: bbox[0],
25498                     minY: bbox[1],
25499                     maxX: bbox[2],
25500                     maxY: bbox[3]
25501                 });
25502                 for (var i = 0; i < result.length; i++) {
25503                     if (polygonIntersectsBBox(result[i].coords, bbox)) {
25504                         output.push(result[i].props);
25505                     }
25506                 }
25507                 return output;
25508             };
25509
25510             return query;
25511         }
25512
25513         function polygonIntersectsBBox(polygon, bbox) {
25514             var bboxCenter = [
25515                 (bbox[0] + bbox[2]) / 2,
25516                 (bbox[1] + bbox[3]) / 2
25517             ];
25518             if (insidePolygon(polygon, bboxCenter)) return true;
25519             for (var i = 0; i < polygon.length; i++) {
25520                 if (lineclip_1(polygon[i], bbox).length > 0) return true;
25521             }
25522             return false;
25523         }
25524
25525         // ray casting algorithm for detecting if point is in polygon
25526         function insidePolygon(rings, p) {
25527             var inside = false;
25528             for (var i = 0, len = rings.length; i < len; i++) {
25529                 var ring = rings[i];
25530                 for (var j = 0, len2 = ring.length, k = len2 - 1; j < len2; k = j++) {
25531                     if (rayIntersect(p, ring[j], ring[k])) inside = !inside;
25532                 }
25533             }
25534             return inside;
25535         }
25536
25537         function rayIntersect(p, p1, p2) {
25538             return ((p1[1] > p[1]) !== (p2[1] > p[1])) && (p[0] < (p2[0] - p1[0]) * (p[1] - p1[1]) / (p2[1] - p1[1]) + p1[0]);
25539         }
25540
25541         function treeItem(coords, props) {
25542             var item = {
25543                 minX: Infinity,
25544                 minY: Infinity,
25545                 maxX: -Infinity,
25546                 maxY: -Infinity,
25547                 coords: coords,
25548                 props: props
25549             };
25550
25551             for (var i = 0; i < coords[0].length; i++) {
25552                 var p = coords[0][i];
25553                 item.minX = Math.min(item.minX, p[0]);
25554                 item.minY = Math.min(item.minY, p[1]);
25555                 item.maxX = Math.max(item.maxX, p[0]);
25556                 item.maxY = Math.max(item.maxY, p[1]);
25557             }
25558             return item;
25559         }
25560
25561         // index the osm-community-index
25562         var ociFeatureCollection = Object.values(features$2).map(function(feature) {
25563             // workaround for which-polygon: only supports `properties`, not `id`
25564             // https://github.com/mapbox/which-polygon/pull/6
25565             feature.properties = {
25566                 id: feature.id,
25567                 area: d3_geoArea(feature)   // also precompute areas
25568             };
25569             return feature;
25570         });
25571
25572
25573         var data = {
25574             community: {
25575                 features: features$2,
25576                 resources: resources,
25577                 query: whichPolygon_1({
25578                     type: 'FeatureCollection',
25579                     features: ociFeatureCollection
25580                 })
25581             },
25582             imagery: dataImagery,  //legacy
25583             presets: {
25584                 presets: presets,
25585                 defaults: defaults,
25586                 categories: categories,
25587                 fields: fields
25588             }
25589         };
25590
25591         // http://2ality.com/2015/01/es6-set-operations.html
25592
25593         // Difference (a \ b): create a set that contains those elements of set a that are not in set b.
25594         // This operation is also sometimes called minus (-).
25595         // var a = [1,2,3];
25596         // var b = [4,3,2];
25597         // utilArrayDifference(a, b)
25598         //   [1]
25599         // utilArrayDifference(b, a)
25600         //   [4]
25601         function utilArrayDifference(a, b) {
25602             var other = new Set(b);
25603             return Array.from(new Set(a))
25604                 .filter(function(v) { return !other.has(v); });
25605         }
25606
25607         // Intersection (a ∩ b): create a set that contains those elements of set a that are also in set b.
25608         // var a = [1,2,3];
25609         // var b = [4,3,2];
25610         // utilArrayIntersection(a, b)
25611         //   [2,3]
25612         function utilArrayIntersection(a, b) {
25613             var other = new Set(b);
25614             return Array.from(new Set(a))
25615                 .filter(function(v) { return other.has(v); });
25616         }
25617
25618         // Union (a ∪ b): create a set that contains the elements of both set a and set b.
25619         // var a = [1,2,3];
25620         // var b = [4,3,2];
25621         // utilArrayUnion(a, b)
25622         //   [1,2,3,4]
25623         function utilArrayUnion(a, b) {
25624             var result = new Set(a);
25625             b.forEach(function(v) { result.add(v); });
25626             return Array.from(result);
25627         }
25628
25629         // Returns an Array with all the duplicates removed
25630         // var a = [1,1,2,3,3];
25631         // utilArrayUniq(a)
25632         //   [1,2,3]
25633         function utilArrayUniq(a) {
25634             return Array.from(new Set(a));
25635         }
25636
25637
25638         // Splits array into chunks of given chunk size
25639         // var a = [1,2,3,4,5,6,7];
25640         // utilArrayChunk(a, 3);
25641         //   [[1,2,3],[4,5,6],[7]];
25642         function utilArrayChunk(a, chunkSize) {
25643             if (!chunkSize || chunkSize < 0) return [a.slice()];
25644
25645             var result = new Array(Math.ceil(a.length / chunkSize));
25646             return Array.from(result, function(item, i) {
25647                 return a.slice(i * chunkSize, i * chunkSize + chunkSize);
25648             });
25649         }
25650
25651
25652         // Flattens two level array into a single level
25653         // var a = [[1,2,3],[4,5,6],[7]];
25654         // utilArrayFlatten(a);
25655         //   [1,2,3,4,5,6,7];
25656         function utilArrayFlatten(a) {
25657             return a.reduce(function(acc, val) {
25658                 return acc.concat(val);
25659             }, []);
25660         }
25661
25662
25663         // Groups the items of the Array according to the given key
25664         // `key` can be passed as a property or as a key function
25665         //
25666         // var pets = [
25667         //     { type: 'Dog', name: 'Spot' },
25668         //     { type: 'Cat', name: 'Tiger' },
25669         //     { type: 'Dog', name: 'Rover' },
25670         //     { type: 'Cat', name: 'Leo' }
25671         // ];
25672         //
25673         // utilArrayGroupBy(pets, 'type')
25674         //   {
25675         //     'Dog': [{type: 'Dog', name: 'Spot'}, {type: 'Dog', name: 'Rover'}],
25676         //     'Cat': [{type: 'Cat', name: 'Tiger'}, {type: 'Cat', name: 'Leo'}]
25677         //   }
25678         //
25679         // utilArrayGroupBy(pets, function(item) { return item.name.length; })
25680         //   {
25681         //     3: [{type: 'Cat', name: 'Leo'}],
25682         //     4: [{type: 'Dog', name: 'Spot'}],
25683         //     5: [{type: 'Cat', name: 'Tiger'}, {type: 'Dog', name: 'Rover'}]
25684         //   }
25685         function utilArrayGroupBy(a, key) {
25686             return a.reduce(function(acc, item) {
25687                 var group = (typeof key === 'function') ? key(item) : item[key];
25688                 (acc[group] = acc[group] || []).push(item);
25689                 return acc;
25690             }, {});
25691         }
25692
25693
25694         // Returns an Array with all the duplicates removed
25695         // where uniqueness determined by the given key
25696         // `key` can be passed as a property or as a key function
25697         //
25698         // var pets = [
25699         //     { type: 'Dog', name: 'Spot' },
25700         //     { type: 'Cat', name: 'Tiger' },
25701         //     { type: 'Dog', name: 'Rover' },
25702         //     { type: 'Cat', name: 'Leo' }
25703         // ];
25704         //
25705         // utilArrayUniqBy(pets, 'type')
25706         //   [
25707         //     { type: 'Dog', name: 'Spot' },
25708         //     { type: 'Cat', name: 'Tiger' }
25709         //   ]
25710         //
25711         // utilArrayUniqBy(pets, function(item) { return item.name.length; })
25712         //   [
25713         //     { type: 'Dog', name: 'Spot' },
25714         //     { type: 'Cat', name: 'Tiger' },
25715         //     { type: 'Cat', name: 'Leo' }
25716         //   }
25717         function utilArrayUniqBy(a, key) {
25718             var seen = new Set();
25719             return a.reduce(function(acc, item) {
25720                 var val = (typeof key === 'function') ? key(item) : item[key];
25721                 if (val && !seen.has(val)) {
25722                     seen.add(val);
25723                     acc.push(item);
25724                 }
25725                 return acc;
25726             }, []);
25727         }
25728
25729         var remove$1 = removeDiacritics;
25730
25731         var replacementList = [
25732           {
25733             base: ' ',
25734             chars: "\u00A0",
25735           }, {
25736             base: '0',
25737             chars: "\u07C0",
25738           }, {
25739             base: 'A',
25740             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",
25741           }, {
25742             base: 'AA',
25743             chars: "\uA732",
25744           }, {
25745             base: 'AE',
25746             chars: "\u00C6\u01FC\u01E2",
25747           }, {
25748             base: 'AO',
25749             chars: "\uA734",
25750           }, {
25751             base: 'AU',
25752             chars: "\uA736",
25753           }, {
25754             base: 'AV',
25755             chars: "\uA738\uA73A",
25756           }, {
25757             base: 'AY',
25758             chars: "\uA73C",
25759           }, {
25760             base: 'B',
25761             chars: "\u24B7\uFF22\u1E02\u1E04\u1E06\u0243\u0181",
25762           }, {
25763             base: 'C',
25764             chars: "\u24b8\uff23\uA73E\u1E08\u0106\u0043\u0108\u010A\u010C\u00C7\u0187\u023B",
25765           }, {
25766             base: 'D',
25767             chars: "\u24B9\uFF24\u1E0A\u010E\u1E0C\u1E10\u1E12\u1E0E\u0110\u018A\u0189\u1D05\uA779",
25768           }, {
25769             base: 'Dh',
25770             chars: "\u00D0",
25771           }, {
25772             base: 'DZ',
25773             chars: "\u01F1\u01C4",
25774           }, {
25775             base: 'Dz',
25776             chars: "\u01F2\u01C5",
25777           }, {
25778             base: 'E',
25779             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",
25780           }, {
25781             base: 'F',
25782             chars: "\uA77C\u24BB\uFF26\u1E1E\u0191\uA77B",
25783           }, {
25784             base: 'G',
25785             chars: "\u24BC\uFF27\u01F4\u011C\u1E20\u011E\u0120\u01E6\u0122\u01E4\u0193\uA7A0\uA77D\uA77E\u0262",
25786           }, {
25787             base: 'H',
25788             chars: "\u24BD\uFF28\u0124\u1E22\u1E26\u021E\u1E24\u1E28\u1E2A\u0126\u2C67\u2C75\uA78D",
25789           }, {
25790             base: 'I',
25791             chars: "\u24BE\uFF29\xCC\xCD\xCE\u0128\u012A\u012C\u0130\xCF\u1E2E\u1EC8\u01CF\u0208\u020A\u1ECA\u012E\u1E2C\u0197",
25792           }, {
25793             base: 'J',
25794             chars: "\u24BF\uFF2A\u0134\u0248\u0237",
25795           }, {
25796             base: 'K',
25797             chars: "\u24C0\uFF2B\u1E30\u01E8\u1E32\u0136\u1E34\u0198\u2C69\uA740\uA742\uA744\uA7A2",
25798           }, {
25799             base: 'L',
25800             chars: "\u24C1\uFF2C\u013F\u0139\u013D\u1E36\u1E38\u013B\u1E3C\u1E3A\u0141\u023D\u2C62\u2C60\uA748\uA746\uA780",
25801           }, {
25802             base: 'LJ',
25803             chars: "\u01C7",
25804           }, {
25805             base: 'Lj',
25806             chars: "\u01C8",
25807           }, {
25808             base: 'M',
25809             chars: "\u24C2\uFF2D\u1E3E\u1E40\u1E42\u2C6E\u019C\u03FB",
25810           }, {
25811             base: 'N',
25812             chars: "\uA7A4\u0220\u24C3\uFF2E\u01F8\u0143\xD1\u1E44\u0147\u1E46\u0145\u1E4A\u1E48\u019D\uA790\u1D0E",
25813           }, {
25814             base: 'NJ',
25815             chars: "\u01CA",
25816           }, {
25817             base: 'Nj',
25818             chars: "\u01CB",
25819           }, {
25820             base: 'O',
25821             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",
25822           }, {
25823             base: 'OE',
25824             chars: "\u0152",
25825           }, {
25826             base: 'OI',
25827             chars: "\u01A2",
25828           }, {
25829             base: 'OO',
25830             chars: "\uA74E",
25831           }, {
25832             base: 'OU',
25833             chars: "\u0222",
25834           }, {
25835             base: 'P',
25836             chars: "\u24C5\uFF30\u1E54\u1E56\u01A4\u2C63\uA750\uA752\uA754",
25837           }, {
25838             base: 'Q',
25839             chars: "\u24C6\uFF31\uA756\uA758\u024A",
25840           }, {
25841             base: 'R',
25842             chars: "\u24C7\uFF32\u0154\u1E58\u0158\u0210\u0212\u1E5A\u1E5C\u0156\u1E5E\u024C\u2C64\uA75A\uA7A6\uA782",
25843           }, {
25844             base: 'S',
25845             chars: "\u24C8\uFF33\u1E9E\u015A\u1E64\u015C\u1E60\u0160\u1E66\u1E62\u1E68\u0218\u015E\u2C7E\uA7A8\uA784",
25846           }, {
25847             base: 'T',
25848             chars: "\u24C9\uFF34\u1E6A\u0164\u1E6C\u021A\u0162\u1E70\u1E6E\u0166\u01AC\u01AE\u023E\uA786",
25849           }, {
25850             base: 'Th',
25851             chars: "\u00DE",
25852           }, {
25853             base: 'TZ',
25854             chars: "\uA728",
25855           }, {
25856             base: 'U',
25857             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",
25858           }, {
25859             base: 'V',
25860             chars: "\u24CB\uFF36\u1E7C\u1E7E\u01B2\uA75E\u0245",
25861           }, {
25862             base: 'VY',
25863             chars: "\uA760",
25864           }, {
25865             base: 'W',
25866             chars: "\u24CC\uFF37\u1E80\u1E82\u0174\u1E86\u1E84\u1E88\u2C72",
25867           }, {
25868             base: 'X',
25869             chars: "\u24CD\uFF38\u1E8A\u1E8C",
25870           }, {
25871             base: 'Y',
25872             chars: "\u24CE\uFF39\u1EF2\xDD\u0176\u1EF8\u0232\u1E8E\u0178\u1EF6\u1EF4\u01B3\u024E\u1EFE",
25873           }, {
25874             base: 'Z',
25875             chars: "\u24CF\uFF3A\u0179\u1E90\u017B\u017D\u1E92\u1E94\u01B5\u0224\u2C7F\u2C6B\uA762",
25876           }, {
25877             base: 'a',
25878             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",
25879           }, {
25880             base: 'aa',
25881             chars: "\uA733",
25882           }, {
25883             base: 'ae',
25884             chars: "\u00E6\u01FD\u01E3",
25885           }, {
25886             base: 'ao',
25887             chars: "\uA735",
25888           }, {
25889             base: 'au',
25890             chars: "\uA737",
25891           }, {
25892             base: 'av',
25893             chars: "\uA739\uA73B",
25894           }, {
25895             base: 'ay',
25896             chars: "\uA73D",
25897           }, {
25898             base: 'b',
25899             chars: "\u24D1\uFF42\u1E03\u1E05\u1E07\u0180\u0183\u0253\u0182",
25900           }, {
25901             base: 'c',
25902             chars: "\uFF43\u24D2\u0107\u0109\u010B\u010D\u00E7\u1E09\u0188\u023C\uA73F\u2184",
25903           }, {
25904             base: 'd',
25905             chars: "\u24D3\uFF44\u1E0B\u010F\u1E0D\u1E11\u1E13\u1E0F\u0111\u018C\u0256\u0257\u018B\u13E7\u0501\uA7AA",
25906           }, {
25907             base: 'dh',
25908             chars: "\u00F0",
25909           }, {
25910             base: 'dz',
25911             chars: "\u01F3\u01C6",
25912           }, {
25913             base: 'e',
25914             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",
25915           }, {
25916             base: 'f',
25917             chars: "\u24D5\uFF46\u1E1F\u0192",
25918           }, {
25919             base: 'ff',
25920             chars: "\uFB00",
25921           }, {
25922             base: 'fi',
25923             chars: "\uFB01",
25924           }, {
25925             base: 'fl',
25926             chars: "\uFB02",
25927           }, {
25928             base: 'ffi',
25929             chars: "\uFB03",
25930           }, {
25931             base: 'ffl',
25932             chars: "\uFB04",
25933           }, {
25934             base: 'g',
25935             chars: "\u24D6\uFF47\u01F5\u011D\u1E21\u011F\u0121\u01E7\u0123\u01E5\u0260\uA7A1\uA77F\u1D79",
25936           }, {
25937             base: 'h',
25938             chars: "\u24D7\uFF48\u0125\u1E23\u1E27\u021F\u1E25\u1E29\u1E2B\u1E96\u0127\u2C68\u2C76\u0265",
25939           }, {
25940             base: 'hv',
25941             chars: "\u0195",
25942           }, {
25943             base: 'i',
25944             chars: "\u24D8\uFF49\xEC\xED\xEE\u0129\u012B\u012D\xEF\u1E2F\u1EC9\u01D0\u0209\u020B\u1ECB\u012F\u1E2D\u0268\u0131",
25945           }, {
25946             base: 'j',
25947             chars: "\u24D9\uFF4A\u0135\u01F0\u0249",
25948           }, {
25949             base: 'k',
25950             chars: "\u24DA\uFF4B\u1E31\u01E9\u1E33\u0137\u1E35\u0199\u2C6A\uA741\uA743\uA745\uA7A3",
25951           }, {
25952             base: 'l',
25953             chars: "\u24DB\uFF4C\u0140\u013A\u013E\u1E37\u1E39\u013C\u1E3D\u1E3B\u017F\u0142\u019A\u026B\u2C61\uA749\uA781\uA747\u026D",
25954           }, {
25955             base: 'lj',
25956             chars: "\u01C9",
25957           }, {
25958             base: 'm',
25959             chars: "\u24DC\uFF4D\u1E3F\u1E41\u1E43\u0271\u026F",
25960           }, {
25961             base: 'n',
25962             chars: "\u24DD\uFF4E\u01F9\u0144\xF1\u1E45\u0148\u1E47\u0146\u1E4B\u1E49\u019E\u0272\u0149\uA791\uA7A5\u043B\u0509",
25963           }, {
25964             base: 'nj',
25965             chars: "\u01CC",
25966           }, {
25967             base: 'o',
25968             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",
25969           }, {
25970             base: 'oe',
25971             chars: "\u0153",
25972           }, {
25973             base: 'oi',
25974             chars: "\u01A3",
25975           }, {
25976             base: 'oo',
25977             chars: "\uA74F",
25978           }, {
25979             base: 'ou',
25980             chars: "\u0223",
25981           }, {
25982             base: 'p',
25983             chars: "\u24DF\uFF50\u1E55\u1E57\u01A5\u1D7D\uA751\uA753\uA755\u03C1",
25984           }, {
25985             base: 'q',
25986             chars: "\u24E0\uFF51\u024B\uA757\uA759",
25987           }, {
25988             base: 'r',
25989             chars: "\u24E1\uFF52\u0155\u1E59\u0159\u0211\u0213\u1E5B\u1E5D\u0157\u1E5F\u024D\u027D\uA75B\uA7A7\uA783",
25990           }, {
25991             base: 's',
25992             chars: "\u24E2\uFF53\u015B\u1E65\u015D\u1E61\u0161\u1E67\u1E63\u1E69\u0219\u015F\u023F\uA7A9\uA785\u1E9B\u0282",
25993           }, {
25994             base: 'ss',
25995             chars: "\xDF",
25996           }, {
25997             base: 't',
25998             chars: "\u24E3\uFF54\u1E6B\u1E97\u0165\u1E6D\u021B\u0163\u1E71\u1E6F\u0167\u01AD\u0288\u2C66\uA787",
25999           }, {
26000             base: 'th',
26001             chars: "\u00FE",
26002           }, {
26003             base: 'tz',
26004             chars: "\uA729",
26005           }, {
26006             base: 'u',
26007             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",
26008           }, {
26009             base: 'v',
26010             chars: "\u24E5\uFF56\u1E7D\u1E7F\u028B\uA75F\u028C",
26011           }, {
26012             base: 'vy',
26013             chars: "\uA761",
26014           }, {
26015             base: 'w',
26016             chars: "\u24E6\uFF57\u1E81\u1E83\u0175\u1E87\u1E85\u1E98\u1E89\u2C73",
26017           }, {
26018             base: 'x',
26019             chars: "\u24E7\uFF58\u1E8B\u1E8D",
26020           }, {
26021             base: 'y',
26022             chars: "\u24E8\uFF59\u1EF3\xFD\u0177\u1EF9\u0233\u1E8F\xFF\u1EF7\u1E99\u1EF5\u01B4\u024F\u1EFF",
26023           }, {
26024             base: 'z',
26025             chars: "\u24E9\uFF5A\u017A\u1E91\u017C\u017E\u1E93\u1E95\u01B6\u0225\u0240\u2C6C\uA763",
26026           }
26027         ];
26028
26029         var diacriticsMap = {};
26030         for (var i$1 = 0; i$1 < replacementList.length; i$1 += 1) {
26031           var chars = replacementList[i$1].chars;
26032           for (var j = 0; j < chars.length; j += 1) {
26033             diacriticsMap[chars[j]] = replacementList[i$1].base;
26034           }
26035         }
26036
26037         function removeDiacritics(str) {
26038           return str.replace(/[^\u0000-\u007e]/g, function(c) {
26039             return diacriticsMap[c] || c;
26040           });
26041         }
26042
26043         var replacementList_1 = replacementList;
26044         var diacriticsMap_1 = diacriticsMap;
26045
26046         var diacritics = {
26047                 remove: remove$1,
26048                 replacementList: replacementList_1,
26049                 diacriticsMap: diacriticsMap_1
26050         };
26051
26052         var isArabic_1 = createCommonjsModule(function (module, exports) {
26053         Object.defineProperty(exports, "__esModule", { value: true });
26054         var arabicBlocks = [
26055             [0x0600, 0x06FF],
26056             [0x0750, 0x077F],
26057             [0x08A0, 0x08FF],
26058             [0xFB50, 0xFDFF],
26059             [0xFE70, 0xFEFF],
26060             [0x10E60, 0x10E7F],
26061             [0x1EC70, 0x1ECBF],
26062             [0x1EE00, 0x1EEFF] // Mathematical Alphabetic symbols https://www.unicode.org/charts/PDF/U1EE00.pdf
26063         ];
26064         function isArabic(char) {
26065             if (char.length > 1) {
26066                 // allow the newer chars?
26067                 throw new Error('isArabic works on only one-character strings');
26068             }
26069             var code = char.charCodeAt(0);
26070             for (var i = 0; i < arabicBlocks.length; i++) {
26071                 var block = arabicBlocks[i];
26072                 if (code >= block[0] && code <= block[1]) {
26073                     return true;
26074                 }
26075             }
26076             return false;
26077         }
26078         exports.isArabic = isArabic;
26079         function isMath(char) {
26080             if (char.length > 2) {
26081                 // allow the newer chars?
26082                 throw new Error('isMath works on only one-character strings');
26083             }
26084             var code = char.charCodeAt(0);
26085             return (code >= 0x660 && code <= 0x66C);
26086         }
26087         exports.isMath = isMath;
26088         });
26089
26090         unwrapExports(isArabic_1);
26091         var isArabic_2 = isArabic_1.isArabic;
26092         var isArabic_3 = isArabic_1.isMath;
26093
26094         var unicodeArabic = createCommonjsModule(function (module, exports) {
26095         Object.defineProperty(exports, "__esModule", { value: true });
26096         var arabicReference = {
26097             "alef": {
26098                 "normal": [
26099                     "\u0627"
26100                 ],
26101                 "madda_above": {
26102                     "normal": [
26103                         "\u0627\u0653",
26104                         "\u0622"
26105                     ],
26106                     "isolated": "\uFE81",
26107                     "final": "\uFE82"
26108                 },
26109                 "hamza_above": {
26110                     "normal": [
26111                         "\u0627\u0654",
26112                         "\u0623"
26113                     ],
26114                     "isolated": "\uFE83",
26115                     "final": "\uFE84"
26116                 },
26117                 "hamza_below": {
26118                     "normal": [
26119                         "\u0627\u0655",
26120                         "\u0625"
26121                     ],
26122                     "isolated": "\uFE87",
26123                     "final": "\uFE88"
26124                 },
26125                 "wasla": {
26126                     "normal": "\u0671",
26127                     "isolated": "\uFB50",
26128                     "final": "\uFB51"
26129                 },
26130                 "wavy_hamza_above": [
26131                     "\u0672"
26132                 ],
26133                 "wavy_hamza_below": [
26134                     "\u0627\u065F",
26135                     "\u0673"
26136                 ],
26137                 "high_hamza": [
26138                     "\u0675",
26139                     "\u0627\u0674"
26140                 ],
26141                 "indic_two_above": [
26142                     "\u0773"
26143                 ],
26144                 "indic_three_above": [
26145                     "\u0774"
26146                 ],
26147                 "fathatan": {
26148                     "normal": [
26149                         "\u0627\u064B"
26150                     ],
26151                     "final": "\uFD3C",
26152                     "isolated": "\uFD3D"
26153                 },
26154                 "isolated": "\uFE8D",
26155                 "final": "\uFE8E"
26156             },
26157             "beh": {
26158                 "normal": [
26159                     "\u0628"
26160                 ],
26161                 "dotless": [
26162                     "\u066E"
26163                 ],
26164                 "three_dots_horizontally_below": [
26165                     "\u0750"
26166                 ],
26167                 "dot_below_three_dots_above": [
26168                     "\u0751"
26169                 ],
26170                 "three_dots_pointing_upwards_below": [
26171                     "\u0752"
26172                 ],
26173                 "three_dots_pointing_upwards_below_two_dots_above": [
26174                     "\u0753"
26175                 ],
26176                 "two_dots_below_dot_above": [
26177                     "\u0754"
26178                 ],
26179                 "inverted_small_v_below": [
26180                     "\u0755"
26181                 ],
26182                 "small_v": [
26183                     "\u0756"
26184                 ],
26185                 "small_v_below": [
26186                     "\u08A0"
26187                 ],
26188                 "hamza_above": [
26189                     "\u08A1"
26190                 ],
26191                 "small_meem_above": [
26192                     "\u08B6"
26193                 ],
26194                 "isolated": "\uFE8F",
26195                 "final": "\uFE90",
26196                 "initial": "\uFE91",
26197                 "medial": "\uFE92"
26198             },
26199             "teh marbuta": {
26200                 "normal": [
26201                     "\u0629"
26202                 ],
26203                 "isolated": "\uFE93",
26204                 "final": "\uFE94"
26205             },
26206             "teh": {
26207                 "normal": [
26208                     "\u062A"
26209                 ],
26210                 "ring": [
26211                     "\u067C"
26212                 ],
26213                 "three_dots_above_downwards": [
26214                     "\u067D"
26215                 ],
26216                 "small_teh_above": [
26217                     "\u08B8"
26218                 ],
26219                 "isolated": "\uFE95",
26220                 "final": "\uFE96",
26221                 "initial": "\uFE97",
26222                 "medial": "\uFE98"
26223             },
26224             "theh": {
26225                 "normal": [
26226                     "\u062B"
26227                 ],
26228                 "isolated": "\uFE99",
26229                 "final": "\uFE9A",
26230                 "initial": "\uFE9B",
26231                 "medial": "\uFE9C"
26232             },
26233             "jeem": {
26234                 "normal": [
26235                     "\u062C"
26236                 ],
26237                 "two_dots_above": [
26238                     "\u08A2"
26239                 ],
26240                 "isolated": "\uFE9D",
26241                 "final": "\uFE9E",
26242                 "initial": "\uFE9F",
26243                 "medial": "\uFEA0"
26244             },
26245             "hah": {
26246                 "normal": [
26247                     "\u062D"
26248                 ],
26249                 "hamza_above": [
26250                     "\u0681"
26251                 ],
26252                 "two_dots_vertical_above": [
26253                     "\u0682"
26254                 ],
26255                 "three_dots_above": [
26256                     "\u0685"
26257                 ],
26258                 "two_dots_above": [
26259                     "\u0757"
26260                 ],
26261                 "three_dots_pointing_upwards_below": [
26262                     "\u0758"
26263                 ],
26264                 "small_tah_below": [
26265                     "\u076E"
26266                 ],
26267                 "small_tah_two_dots": [
26268                     "\u076F"
26269                 ],
26270                 "small_tah_above": [
26271                     "\u0772"
26272                 ],
26273                 "indic_four_below": [
26274                     "\u077C"
26275                 ],
26276                 "isolated": "\uFEA1",
26277                 "final": "\uFEA2",
26278                 "initial": "\uFEA3",
26279                 "medial": "\uFEA4"
26280             },
26281             "khah": {
26282                 "normal": [
26283                     "\u062E"
26284                 ],
26285                 "isolated": "\uFEA5",
26286                 "final": "\uFEA6",
26287                 "initial": "\uFEA7",
26288                 "medial": "\uFEA8"
26289             },
26290             "dal": {
26291                 "normal": [
26292                     "\u062F"
26293                 ],
26294                 "ring": [
26295                     "\u0689"
26296                 ],
26297                 "dot_below": [
26298                     "\u068A"
26299                 ],
26300                 "dot_below_small_tah": [
26301                     "\u068B"
26302                 ],
26303                 "three_dots_above_downwards": [
26304                     "\u068F"
26305                 ],
26306                 "four_dots_above": [
26307                     "\u0690"
26308                 ],
26309                 "inverted_v": [
26310                     "\u06EE"
26311                 ],
26312                 "two_dots_vertically_below_small_tah": [
26313                     "\u0759"
26314                 ],
26315                 "inverted_small_v_below": [
26316                     "\u075A"
26317                 ],
26318                 "three_dots_below": [
26319                     "\u08AE"
26320                 ],
26321                 "isolated": "\uFEA9",
26322                 "final": "\uFEAA"
26323             },
26324             "thal": {
26325                 "normal": [
26326                     "\u0630"
26327                 ],
26328                 "isolated": "\uFEAB",
26329                 "final": "\uFEAC"
26330             },
26331             "reh": {
26332                 "normal": [
26333                     "\u0631"
26334                 ],
26335                 "small_v": [
26336                     "\u0692"
26337                 ],
26338                 "ring": [
26339                     "\u0693"
26340                 ],
26341                 "dot_below": [
26342                     "\u0694"
26343                 ],
26344                 "small_v_below": [
26345                     "\u0695"
26346                 ],
26347                 "dot_below_dot_above": [
26348                     "\u0696"
26349                 ],
26350                 "two_dots_above": [
26351                     "\u0697"
26352                 ],
26353                 "four_dots_above": [
26354                     "\u0699"
26355                 ],
26356                 "inverted_v": [
26357                     "\u06EF"
26358                 ],
26359                 "stroke": [
26360                     "\u075B"
26361                 ],
26362                 "two_dots_vertically_above": [
26363                     "\u076B"
26364                 ],
26365                 "hamza_above": [
26366                     "\u076C"
26367                 ],
26368                 "small_tah_two_dots": [
26369                     "\u0771"
26370                 ],
26371                 "loop": [
26372                     "\u08AA"
26373                 ],
26374                 "small_noon_above": [
26375                     "\u08B9"
26376                 ],
26377                 "isolated": "\uFEAD",
26378                 "final": "\uFEAE"
26379             },
26380             "zain": {
26381                 "normal": [
26382                     "\u0632"
26383                 ],
26384                 "inverted_v_above": [
26385                     "\u08B2"
26386                 ],
26387                 "isolated": "\uFEAF",
26388                 "final": "\uFEB0"
26389             },
26390             "seen": {
26391                 "normal": [
26392                     "\u0633"
26393                 ],
26394                 "dot_below_dot_above": [
26395                     "\u069A"
26396                 ],
26397                 "three_dots_below": [
26398                     "\u069B"
26399                 ],
26400                 "three_dots_below_three_dots_above": [
26401                     "\u069C"
26402                 ],
26403                 "four_dots_above": [
26404                     "\u075C"
26405                 ],
26406                 "two_dots_vertically_above": [
26407                     "\u076D"
26408                 ],
26409                 "small_tah_two_dots": [
26410                     "\u0770"
26411                 ],
26412                 "indic_four_above": [
26413                     "\u077D"
26414                 ],
26415                 "inverted_v": [
26416                     "\u077E"
26417                 ],
26418                 "isolated": "\uFEB1",
26419                 "final": "\uFEB2",
26420                 "initial": "\uFEB3",
26421                 "medial": "\uFEB4"
26422             },
26423             "sheen": {
26424                 "normal": [
26425                     "\u0634"
26426                 ],
26427                 "dot_below": [
26428                     "\u06FA"
26429                 ],
26430                 "isolated": "\uFEB5",
26431                 "final": "\uFEB6",
26432                 "initial": "\uFEB7",
26433                 "medial": "\uFEB8"
26434             },
26435             "sad": {
26436                 "normal": [
26437                     "\u0635"
26438                 ],
26439                 "two_dots_below": [
26440                     "\u069D"
26441                 ],
26442                 "three_dots_above": [
26443                     "\u069E"
26444                 ],
26445                 "three_dots_below": [
26446                     "\u08AF"
26447                 ],
26448                 "isolated": "\uFEB9",
26449                 "final": "\uFEBA",
26450                 "initial": "\uFEBB",
26451                 "medial": "\uFEBC"
26452             },
26453             "dad": {
26454                 "normal": [
26455                     "\u0636"
26456                 ],
26457                 "dot_below": [
26458                     "\u06FB"
26459                 ],
26460                 "isolated": "\uFEBD",
26461                 "final": "\uFEBE",
26462                 "initial": "\uFEBF",
26463                 "medial": "\uFEC0"
26464             },
26465             "tah": {
26466                 "normal": [
26467                     "\u0637"
26468                 ],
26469                 "three_dots_above": [
26470                     "\u069F"
26471                 ],
26472                 "two_dots_above": [
26473                     "\u08A3"
26474                 ],
26475                 "isolated": "\uFEC1",
26476                 "final": "\uFEC2",
26477                 "initial": "\uFEC3",
26478                 "medial": "\uFEC4"
26479             },
26480             "zah": {
26481                 "normal": [
26482                     "\u0638"
26483                 ],
26484                 "isolated": "\uFEC5",
26485                 "final": "\uFEC6",
26486                 "initial": "\uFEC7",
26487                 "medial": "\uFEC8"
26488             },
26489             "ain": {
26490                 "normal": [
26491                     "\u0639"
26492                 ],
26493                 "three_dots_above": [
26494                     "\u06A0"
26495                 ],
26496                 "two_dots_above": [
26497                     "\u075D"
26498                 ],
26499                 "three_dots_pointing_downwards_above": [
26500                     "\u075E"
26501                 ],
26502                 "two_dots_vertically_above": [
26503                     "\u075F"
26504                 ],
26505                 "three_dots_below": [
26506                     "\u08B3"
26507                 ],
26508                 "isolated": "\uFEC9",
26509                 "final": "\uFECA",
26510                 "initial": "\uFECB",
26511                 "medial": "\uFECC"
26512             },
26513             "ghain": {
26514                 "normal": [
26515                     "\u063A"
26516                 ],
26517                 "dot_below": [
26518                     "\u06FC"
26519                 ],
26520                 "isolated": "\uFECD",
26521                 "final": "\uFECE",
26522                 "initial": "\uFECF",
26523                 "medial": "\uFED0"
26524             },
26525             "feh": {
26526                 "normal": [
26527                     "\u0641"
26528                 ],
26529                 "dotless": [
26530                     "\u06A1"
26531                 ],
26532                 "dot_moved_below": [
26533                     "\u06A2"
26534                 ],
26535                 "dot_below": [
26536                     "\u06A3"
26537                 ],
26538                 "three_dots_below": [
26539                     "\u06A5"
26540                 ],
26541                 "two_dots_below": [
26542                     "\u0760"
26543                 ],
26544                 "three_dots_pointing_upwards_below": [
26545                     "\u0761"
26546                 ],
26547                 "dot_below_three_dots_above": [
26548                     "\u08A4"
26549                 ],
26550                 "isolated": "\uFED1",
26551                 "final": "\uFED2",
26552                 "initial": "\uFED3",
26553                 "medial": "\uFED4"
26554             },
26555             "qaf": {
26556                 "normal": [
26557                     "\u0642"
26558                 ],
26559                 "dotless": [
26560                     "\u066F"
26561                 ],
26562                 "dot_above": [
26563                     "\u06A7"
26564                 ],
26565                 "three_dots_above": [
26566                     "\u06A8"
26567                 ],
26568                 "dot_below": [
26569                     "\u08A5"
26570                 ],
26571                 "isolated": "\uFED5",
26572                 "final": "\uFED6",
26573                 "initial": "\uFED7",
26574                 "medial": "\uFED8"
26575             },
26576             "kaf": {
26577                 "normal": [
26578                     "\u0643"
26579                 ],
26580                 "swash": [
26581                     "\u06AA"
26582                 ],
26583                 "ring": [
26584                     "\u06AB"
26585                 ],
26586                 "dot_above": [
26587                     "\u06AC"
26588                 ],
26589                 "three_dots_below": [
26590                     "\u06AE"
26591                 ],
26592                 "two_dots_above": [
26593                     "\u077F"
26594                 ],
26595                 "dot_below": [
26596                     "\u08B4"
26597                 ],
26598                 "isolated": "\uFED9",
26599                 "final": "\uFEDA",
26600                 "initial": "\uFEDB",
26601                 "medial": "\uFEDC"
26602             },
26603             "lam": {
26604                 "normal": [
26605                     "\u0644"
26606                 ],
26607                 "small_v": [
26608                     "\u06B5"
26609                 ],
26610                 "dot_above": [
26611                     "\u06B6"
26612                 ],
26613                 "three_dots_above": [
26614                     "\u06B7"
26615                 ],
26616                 "three_dots_below": [
26617                     "\u06B8"
26618                 ],
26619                 "bar": [
26620                     "\u076A"
26621                 ],
26622                 "double_bar": [
26623                     "\u08A6"
26624                 ],
26625                 "isolated": "\uFEDD",
26626                 "final": "\uFEDE",
26627                 "initial": "\uFEDF",
26628                 "medial": "\uFEE0"
26629             },
26630             "meem": {
26631                 "normal": [
26632                     "\u0645"
26633                 ],
26634                 "dot_above": [
26635                     "\u0765"
26636                 ],
26637                 "dot_below": [
26638                     "\u0766"
26639                 ],
26640                 "three_dots_above": [
26641                     "\u08A7"
26642                 ],
26643                 "isolated": "\uFEE1",
26644                 "final": "\uFEE2",
26645                 "initial": "\uFEE3",
26646                 "medial": "\uFEE4"
26647             },
26648             "noon": {
26649                 "normal": [
26650                     "\u0646"
26651                 ],
26652                 "dot_below": [
26653                     "\u06B9"
26654                 ],
26655                 "ring": [
26656                     "\u06BC"
26657                 ],
26658                 "three_dots_above": [
26659                     "\u06BD"
26660                 ],
26661                 "two_dots_below": [
26662                     "\u0767"
26663                 ],
26664                 "small_tah": [
26665                     "\u0768"
26666                 ],
26667                 "small_v": [
26668                     "\u0769"
26669                 ],
26670                 "isolated": "\uFEE5",
26671                 "final": "\uFEE6",
26672                 "initial": "\uFEE7",
26673                 "medial": "\uFEE8"
26674             },
26675             "heh": {
26676                 "normal": [
26677                     "\u0647"
26678                 ],
26679                 "isolated": "\uFEE9",
26680                 "final": "\uFEEA",
26681                 "initial": "\uFEEB",
26682                 "medial": "\uFEEC"
26683             },
26684             "waw": {
26685                 "normal": [
26686                     "\u0648"
26687                 ],
26688                 "hamza_above": {
26689                     "normal": [
26690                         "\u0624",
26691                         "\u0648\u0654"
26692                     ],
26693                     "isolated": "\uFE85",
26694                     "final": "\uFE86"
26695                 },
26696                 "high_hamza": [
26697                     "\u0676",
26698                     "\u0648\u0674"
26699                 ],
26700                 "ring": [
26701                     "\u06C4"
26702                 ],
26703                 "two_dots_above": [
26704                     "\u06CA"
26705                 ],
26706                 "dot_above": [
26707                     "\u06CF"
26708                 ],
26709                 "indic_two_above": [
26710                     "\u0778"
26711                 ],
26712                 "indic_three_above": [
26713                     "\u0779"
26714                 ],
26715                 "dot_within": [
26716                     "\u08AB"
26717                 ],
26718                 "isolated": "\uFEED",
26719                 "final": "\uFEEE"
26720             },
26721             "alef_maksura": {
26722                 "normal": [
26723                     "\u0649"
26724                 ],
26725                 "hamza_above": [
26726                     "\u0626",
26727                     "\u064A\u0654"
26728                 ],
26729                 "initial": "\uFBE8",
26730                 "medial": "\uFBE9",
26731                 "isolated": "\uFEEF",
26732                 "final": "\uFEF0"
26733             },
26734             "yeh": {
26735                 "normal": [
26736                     "\u064A"
26737                 ],
26738                 "hamza_above": {
26739                     "normal": [
26740                         "\u0626",
26741                         "\u0649\u0654"
26742                     ],
26743                     "isolated": "\uFE89",
26744                     "final": "\uFE8A",
26745                     "initial": "\uFE8B",
26746                     "medial": "\uFE8C"
26747                 },
26748                 "two_dots_below_hamza_above": [
26749                     "\u08A8"
26750                 ],
26751                 "high_hamza": [
26752                     "\u0678",
26753                     "\u064A\u0674"
26754                 ],
26755                 "tail": [
26756                     "\u06CD"
26757                 ],
26758                 "small_v": [
26759                     "\u06CE"
26760                 ],
26761                 "three_dots_below": [
26762                     "\u06D1"
26763                 ],
26764                 "two_dots_below_dot_above": [
26765                     "\u08A9"
26766                 ],
26767                 "two_dots_below_small_noon_above": [
26768                     "\u08BA"
26769                 ],
26770                 "isolated": "\uFEF1",
26771                 "final": "\uFEF2",
26772                 "initial": "\uFEF3",
26773                 "medial": "\uFEF4"
26774             },
26775             "tteh": {
26776                 "normal": [
26777                     "\u0679"
26778                 ],
26779                 "isolated": "\uFB66",
26780                 "final": "\uFB67",
26781                 "initial": "\uFB68",
26782                 "medial": "\uFB69"
26783             },
26784             "tteheh": {
26785                 "normal": [
26786                     "\u067A"
26787                 ],
26788                 "isolated": "\uFB5E",
26789                 "final": "\uFB5F",
26790                 "initial": "\uFB60",
26791                 "medial": "\uFB61"
26792             },
26793             "beeh": {
26794                 "normal": [
26795                     "\u067B"
26796                 ],
26797                 "isolated": "\uFB52",
26798                 "final": "\uFB53",
26799                 "initial": "\uFB54",
26800                 "medial": "\uFB55"
26801             },
26802             "peh": {
26803                 "normal": [
26804                     "\u067E"
26805                 ],
26806                 "small_meem_above": [
26807                     "\u08B7"
26808                 ],
26809                 "isolated": "\uFB56",
26810                 "final": "\uFB57",
26811                 "initial": "\uFB58",
26812                 "medial": "\uFB59"
26813             },
26814             "teheh": {
26815                 "normal": [
26816                     "\u067F"
26817                 ],
26818                 "isolated": "\uFB62",
26819                 "final": "\uFB63",
26820                 "initial": "\uFB64",
26821                 "medial": "\uFB65"
26822             },
26823             "beheh": {
26824                 "normal": [
26825                     "\u0680"
26826                 ],
26827                 "isolated": "\uFB5A",
26828                 "final": "\uFB5B",
26829                 "initial": "\uFB5C",
26830                 "medial": "\uFB5D"
26831             },
26832             "nyeh": {
26833                 "normal": [
26834                     "\u0683"
26835                 ],
26836                 "isolated": "\uFB76",
26837                 "final": "\uFB77",
26838                 "initial": "\uFB78",
26839                 "medial": "\uFB79"
26840             },
26841             "dyeh": {
26842                 "normal": [
26843                     "\u0684"
26844                 ],
26845                 "isolated": "\uFB72",
26846                 "final": "\uFB73",
26847                 "initial": "\uFB74",
26848                 "medial": "\uFB75"
26849             },
26850             "tcheh": {
26851                 "normal": [
26852                     "\u0686"
26853                 ],
26854                 "dot_above": [
26855                     "\u06BF"
26856                 ],
26857                 "isolated": "\uFB7A",
26858                 "final": "\uFB7B",
26859                 "initial": "\uFB7C",
26860                 "medial": "\uFB7D"
26861             },
26862             "tcheheh": {
26863                 "normal": [
26864                     "\u0687"
26865                 ],
26866                 "isolated": "\uFB7E",
26867                 "final": "\uFB7F",
26868                 "initial": "\uFB80",
26869                 "medial": "\uFB81"
26870             },
26871             "ddal": {
26872                 "normal": [
26873                     "\u0688"
26874                 ],
26875                 "isolated": "\uFB88",
26876                 "final": "\uFB89"
26877             },
26878             "dahal": {
26879                 "normal": [
26880                     "\u068C"
26881                 ],
26882                 "isolated": "\uFB84",
26883                 "final": "\uFB85"
26884             },
26885             "ddahal": {
26886                 "normal": [
26887                     "\u068D"
26888                 ],
26889                 "isolated": "\uFB82",
26890                 "final": "\uFB83"
26891             },
26892             "dul": {
26893                 "normal": [
26894                     "\u068F",
26895                     "\u068E"
26896                 ],
26897                 "isolated": "\uFB86",
26898                 "final": "\uFB87"
26899             },
26900             "rreh": {
26901                 "normal": [
26902                     "\u0691"
26903                 ],
26904                 "isolated": "\uFB8C",
26905                 "final": "\uFB8D"
26906             },
26907             "jeh": {
26908                 "normal": [
26909                     "\u0698"
26910                 ],
26911                 "isolated": "\uFB8A",
26912                 "final": "\uFB8B"
26913             },
26914             "veh": {
26915                 "normal": [
26916                     "\u06A4"
26917                 ],
26918                 "isolated": "\uFB6A",
26919                 "final": "\uFB6B",
26920                 "initial": "\uFB6C",
26921                 "medial": "\uFB6D"
26922             },
26923             "peheh": {
26924                 "normal": [
26925                     "\u06A6"
26926                 ],
26927                 "isolated": "\uFB6E",
26928                 "final": "\uFB6F",
26929                 "initial": "\uFB70",
26930                 "medial": "\uFB71"
26931             },
26932             "keheh": {
26933                 "normal": [
26934                     "\u06A9"
26935                 ],
26936                 "dot_above": [
26937                     "\u0762"
26938                 ],
26939                 "three_dots_above": [
26940                     "\u0763"
26941                 ],
26942                 "three_dots_pointing_upwards_below": [
26943                     "\u0764"
26944                 ],
26945                 "isolated": "\uFB8E",
26946                 "final": "\uFB8F",
26947                 "initial": "\uFB90",
26948                 "medial": "\uFB91"
26949             },
26950             "ng": {
26951                 "normal": [
26952                     "\u06AD"
26953                 ],
26954                 "isolated": "\uFBD3",
26955                 "final": "\uFBD4",
26956                 "initial": "\uFBD5",
26957                 "medial": "\uFBD6"
26958             },
26959             "gaf": {
26960                 "normal": [
26961                     "\u06AF"
26962                 ],
26963                 "ring": [
26964                     "\u06B0"
26965                 ],
26966                 "two_dots_below": [
26967                     "\u06B2"
26968                 ],
26969                 "three_dots_above": [
26970                     "\u06B4"
26971                 ],
26972                 "inverted_stroke": [
26973                     "\u08B0"
26974                 ],
26975                 "isolated": "\uFB92",
26976                 "final": "\uFB93",
26977                 "initial": "\uFB94",
26978                 "medial": "\uFB95"
26979             },
26980             "ngoeh": {
26981                 "normal": [
26982                     "\u06B1"
26983                 ],
26984                 "isolated": "\uFB9A",
26985                 "final": "\uFB9B",
26986                 "initial": "\uFB9C",
26987                 "medial": "\uFB9D"
26988             },
26989             "gueh": {
26990                 "normal": [
26991                     "\u06B3"
26992                 ],
26993                 "isolated": "\uFB96",
26994                 "final": "\uFB97",
26995                 "initial": "\uFB98",
26996                 "medial": "\uFB99"
26997             },
26998             "noon ghunna": {
26999                 "normal": [
27000                     "\u06BA"
27001                 ],
27002                 "isolated": "\uFB9E",
27003                 "final": "\uFB9F"
27004             },
27005             "rnoon": {
27006                 "normal": [
27007                     "\u06BB"
27008                 ],
27009                 "isolated": "\uFBA0",
27010                 "final": "\uFBA1",
27011                 "initial": "\uFBA2",
27012                 "medial": "\uFBA3"
27013             },
27014             "heh doachashmee": {
27015                 "normal": [
27016                     "\u06BE"
27017                 ],
27018                 "isolated": "\uFBAA",
27019                 "final": "\uFBAB",
27020                 "initial": "\uFBAC",
27021                 "medial": "\uFBAD"
27022             },
27023             "heh goal": {
27024                 "normal": [
27025                     "\u06C1"
27026                 ],
27027                 "hamza_above": [
27028                     "\u06C1\u0654",
27029                     "\u06C2"
27030                 ],
27031                 "isolated": "\uFBA6",
27032                 "final": "\uFBA7",
27033                 "initial": "\uFBA8",
27034                 "medial": "\uFBA9"
27035             },
27036             "teh marbuta goal": {
27037                 "normal": [
27038                     "\u06C3"
27039                 ]
27040             },
27041             "kirghiz oe": {
27042                 "normal": [
27043                     "\u06C5"
27044                 ],
27045                 "isolated": "\uFBE0",
27046                 "final": "\uFBE1"
27047             },
27048             "oe": {
27049                 "normal": [
27050                     "\u06C6"
27051                 ],
27052                 "isolated": "\uFBD9",
27053                 "final": "\uFBDA"
27054             },
27055             "u": {
27056                 "normal": [
27057                     "\u06C7"
27058                 ],
27059                 "hamza_above": {
27060                     "normal": [
27061                         "\u0677",
27062                         "\u06C7\u0674"
27063                     ],
27064                     "isolated": "\uFBDD"
27065                 },
27066                 "isolated": "\uFBD7",
27067                 "final": "\uFBD8"
27068             },
27069             "yu": {
27070                 "normal": [
27071                     "\u06C8"
27072                 ],
27073                 "isolated": "\uFBDB",
27074                 "final": "\uFBDC"
27075             },
27076             "kirghiz yu": {
27077                 "normal": [
27078                     "\u06C9"
27079                 ],
27080                 "isolated": "\uFBE2",
27081                 "final": "\uFBE3"
27082             },
27083             "ve": {
27084                 "normal": [
27085                     "\u06CB"
27086                 ],
27087                 "isolated": "\uFBDE",
27088                 "final": "\uFBDF"
27089             },
27090             "farsi yeh": {
27091                 "normal": [
27092                     "\u06CC"
27093                 ],
27094                 "indic_two_above": [
27095                     "\u0775"
27096                 ],
27097                 "indic_three_above": [
27098                     "\u0776"
27099                 ],
27100                 "indic_four_above": [
27101                     "\u0777"
27102                 ],
27103                 "isolated": "\uFBFC",
27104                 "final": "\uFBFD",
27105                 "initial": "\uFBFE",
27106                 "medial": "\uFBFF"
27107             },
27108             "e": {
27109                 "normal": [
27110                     "\u06D0"
27111                 ],
27112                 "isolated": "\uFBE4",
27113                 "final": "\uFBE5",
27114                 "initial": "\uFBE6",
27115                 "medial": "\uFBE7"
27116             },
27117             "yeh barree": {
27118                 "normal": [
27119                     "\u06D2"
27120                 ],
27121                 "hamza_above": {
27122                     "normal": [
27123                         "\u06D2\u0654",
27124                         "\u06D3"
27125                     ],
27126                     "isolated": "\uFBB0",
27127                     "final": "\uFBB1"
27128                 },
27129                 "indic_two_above": [
27130                     "\u077A"
27131                 ],
27132                 "indic_three_above": [
27133                     "\u077B"
27134                 ],
27135                 "isolated": "\uFBAE",
27136                 "final": "\uFBAF"
27137             },
27138             "ae": {
27139                 "normal": [
27140                     "\u06D5"
27141                 ],
27142                 "isolated": "\u06D5",
27143                 "final": "\uFEEA",
27144                 "yeh_above": {
27145                     "normal": [
27146                         "\u06C0",
27147                         "\u06D5\u0654"
27148                     ],
27149                     "isolated": "\uFBA4",
27150                     "final": "\uFBA5"
27151                 }
27152             },
27153             "rohingya yeh": {
27154                 "normal": [
27155                     "\u08AC"
27156                 ]
27157             },
27158             "low alef": {
27159                 "normal": [
27160                     "\u08AD"
27161                 ]
27162             },
27163             "straight waw": {
27164                 "normal": [
27165                     "\u08B1"
27166                 ]
27167             },
27168             "african feh": {
27169                 "normal": [
27170                     "\u08BB"
27171                 ]
27172             },
27173             "african qaf": {
27174                 "normal": [
27175                     "\u08BC"
27176                 ]
27177             },
27178             "african noon": {
27179                 "normal": [
27180                     "\u08BD"
27181                 ]
27182             }
27183         };
27184         exports.default = arabicReference;
27185         });
27186
27187         unwrapExports(unicodeArabic);
27188
27189         var unicodeLigatures = createCommonjsModule(function (module, exports) {
27190         Object.defineProperty(exports, "__esModule", { value: true });
27191         var ligatureReference = {
27192             "\u0626\u0627": {
27193                 "isolated": "\uFBEA",
27194                 "final": "\uFBEB"
27195             },
27196             "\u0626\u06D5": {
27197                 "isolated": "\uFBEC",
27198                 "final": "\uFBED"
27199             },
27200             "\u0626\u0648": {
27201                 "isolated": "\uFBEE",
27202                 "final": "\uFBEF"
27203             },
27204             "\u0626\u06C7": {
27205                 "isolated": "\uFBF0",
27206                 "final": "\uFBF1"
27207             },
27208             "\u0626\u06C6": {
27209                 "isolated": "\uFBF2",
27210                 "final": "\uFBF3"
27211             },
27212             "\u0626\u06C8": {
27213                 "isolated": "\uFBF4",
27214                 "final": "\uFBF5"
27215             },
27216             "\u0626\u06D0": {
27217                 "isolated": "\uFBF6",
27218                 "final": "\uFBF7",
27219                 "initial": "\uFBF8"
27220             },
27221             "\u0626\u0649": {
27222                 "uighur_kirghiz": {
27223                     "isolated": "\uFBF9",
27224                     "final": "\uFBFA",
27225                     "initial": "\uFBFB"
27226                 },
27227                 "isolated": "\uFC03",
27228                 "final": "\uFC68"
27229             },
27230             "\u0626\u062C": {
27231                 "isolated": "\uFC00",
27232                 "initial": "\uFC97"
27233             },
27234             "\u0626\u062D": {
27235                 "isolated": "\uFC01",
27236                 "initial": "\uFC98"
27237             },
27238             "\u0626\u0645": {
27239                 "isolated": "\uFC02",
27240                 "final": "\uFC66",
27241                 "initial": "\uFC9A",
27242                 "medial": "\uFCDF"
27243             },
27244             "\u0626\u064A": {
27245                 "isolated": "\uFC04",
27246                 "final": "\uFC69"
27247             },
27248             "\u0628\u062C": {
27249                 "isolated": "\uFC05",
27250                 "initial": "\uFC9C"
27251             },
27252             "\u0628\u062D": {
27253                 "isolated": "\uFC06",
27254                 "initial": "\uFC9D"
27255             },
27256             "\u0628\u062E": {
27257                 "isolated": "\uFC07",
27258                 "initial": "\uFC9E"
27259             },
27260             "\u0628\u0645": {
27261                 "isolated": "\uFC08",
27262                 "final": "\uFC6C",
27263                 "initial": "\uFC9F",
27264                 "medial": "\uFCE1"
27265             },
27266             "\u0628\u0649": {
27267                 "isolated": "\uFC09",
27268                 "final": "\uFC6E"
27269             },
27270             "\u0628\u064A": {
27271                 "isolated": "\uFC0A",
27272                 "final": "\uFC6F"
27273             },
27274             "\u062A\u062C": {
27275                 "isolated": "\uFC0B",
27276                 "initial": "\uFCA1"
27277             },
27278             "\u062A\u062D": {
27279                 "isolated": "\uFC0C",
27280                 "initial": "\uFCA2"
27281             },
27282             "\u062A\u062E": {
27283                 "isolated": "\uFC0D",
27284                 "initial": "\uFCA3"
27285             },
27286             "\u062A\u0645": {
27287                 "isolated": "\uFC0E",
27288                 "final": "\uFC72",
27289                 "initial": "\uFCA4",
27290                 "medial": "\uFCE3"
27291             },
27292             "\u062A\u0649": {
27293                 "isolated": "\uFC0F",
27294                 "final": "\uFC74"
27295             },
27296             "\u062A\u064A": {
27297                 "isolated": "\uFC10",
27298                 "final": "\uFC75"
27299             },
27300             "\u062B\u062C": {
27301                 "isolated": "\uFC11"
27302             },
27303             "\u062B\u0645": {
27304                 "isolated": "\uFC12",
27305                 "final": "\uFC78",
27306                 "initial": "\uFCA6",
27307                 "medial": "\uFCE5"
27308             },
27309             "\u062B\u0649": {
27310                 "isolated": "\uFC13",
27311                 "final": "\uFC7A"
27312             },
27313             "\u062B\u0648": {
27314                 "isolated": "\uFC14"
27315             },
27316             "\u062C\u062D": {
27317                 "isolated": "\uFC15",
27318                 "initial": "\uFCA7"
27319             },
27320             "\u062C\u0645": {
27321                 "isolated": "\uFC16",
27322                 "initial": "\uFCA8"
27323             },
27324             "\u062D\u062C": {
27325                 "isolated": "\uFC17",
27326                 "initial": "\uFCA9"
27327             },
27328             "\u062D\u0645": {
27329                 "isolated": "\uFC18",
27330                 "initial": "\uFCAA"
27331             },
27332             "\u062E\u062C": {
27333                 "isolated": "\uFC19",
27334                 "initial": "\uFCAB"
27335             },
27336             "\u062E\u062D": {
27337                 "isolated": "\uFC1A"
27338             },
27339             "\u062E\u0645": {
27340                 "isolated": "\uFC1B",
27341                 "initial": "\uFCAC"
27342             },
27343             "\u0633\u062C": {
27344                 "isolated": "\uFC1C",
27345                 "initial": "\uFCAD",
27346                 "medial": "\uFD34"
27347             },
27348             "\u0633\u062D": {
27349                 "isolated": "\uFC1D",
27350                 "initial": "\uFCAE",
27351                 "medial": "\uFD35"
27352             },
27353             "\u0633\u062E": {
27354                 "isolated": "\uFC1E",
27355                 "initial": "\uFCAF",
27356                 "medial": "\uFD36"
27357             },
27358             "\u0633\u0645": {
27359                 "isolated": "\uFC1F",
27360                 "initial": "\uFCB0",
27361                 "medial": "\uFCE7"
27362             },
27363             "\u0635\u062D": {
27364                 "isolated": "\uFC20",
27365                 "initial": "\uFCB1"
27366             },
27367             "\u0635\u0645": {
27368                 "isolated": "\uFC21",
27369                 "initial": "\uFCB3"
27370             },
27371             "\u0636\u062C": {
27372                 "isolated": "\uFC22",
27373                 "initial": "\uFCB4"
27374             },
27375             "\u0636\u062D": {
27376                 "isolated": "\uFC23",
27377                 "initial": "\uFCB5"
27378             },
27379             "\u0636\u062E": {
27380                 "isolated": "\uFC24",
27381                 "initial": "\uFCB6"
27382             },
27383             "\u0636\u0645": {
27384                 "isolated": "\uFC25",
27385                 "initial": "\uFCB7"
27386             },
27387             "\u0637\u062D": {
27388                 "isolated": "\uFC26",
27389                 "initial": "\uFCB8"
27390             },
27391             "\u0637\u0645": {
27392                 "isolated": "\uFC27",
27393                 "initial": "\uFD33",
27394                 "medial": "\uFD3A"
27395             },
27396             "\u0638\u0645": {
27397                 "isolated": "\uFC28",
27398                 "initial": "\uFCB9",
27399                 "medial": "\uFD3B"
27400             },
27401             "\u0639\u062C": {
27402                 "isolated": "\uFC29",
27403                 "initial": "\uFCBA"
27404             },
27405             "\u0639\u0645": {
27406                 "isolated": "\uFC2A",
27407                 "initial": "\uFCBB"
27408             },
27409             "\u063A\u062C": {
27410                 "isolated": "\uFC2B",
27411                 "initial": "\uFCBC"
27412             },
27413             "\u063A\u0645": {
27414                 "isolated": "\uFC2C",
27415                 "initial": "\uFCBD"
27416             },
27417             "\u0641\u062C": {
27418                 "isolated": "\uFC2D",
27419                 "initial": "\uFCBE"
27420             },
27421             "\u0641\u062D": {
27422                 "isolated": "\uFC2E",
27423                 "initial": "\uFCBF"
27424             },
27425             "\u0641\u062E": {
27426                 "isolated": "\uFC2F",
27427                 "initial": "\uFCC0"
27428             },
27429             "\u0641\u0645": {
27430                 "isolated": "\uFC30",
27431                 "initial": "\uFCC1"
27432             },
27433             "\u0641\u0649": {
27434                 "isolated": "\uFC31",
27435                 "final": "\uFC7C"
27436             },
27437             "\u0641\u064A": {
27438                 "isolated": "\uFC32",
27439                 "final": "\uFC7D"
27440             },
27441             "\u0642\u062D": {
27442                 "isolated": "\uFC33",
27443                 "initial": "\uFCC2"
27444             },
27445             "\u0642\u0645": {
27446                 "isolated": "\uFC34",
27447                 "initial": "\uFCC3"
27448             },
27449             "\u0642\u0649": {
27450                 "isolated": "\uFC35",
27451                 "final": "\uFC7E"
27452             },
27453             "\u0642\u064A": {
27454                 "isolated": "\uFC36",
27455                 "final": "\uFC7F"
27456             },
27457             "\u0643\u0627": {
27458                 "isolated": "\uFC37",
27459                 "final": "\uFC80"
27460             },
27461             "\u0643\u062C": {
27462                 "isolated": "\uFC38",
27463                 "initial": "\uFCC4"
27464             },
27465             "\u0643\u062D": {
27466                 "isolated": "\uFC39",
27467                 "initial": "\uFCC5"
27468             },
27469             "\u0643\u062E": {
27470                 "isolated": "\uFC3A",
27471                 "initial": "\uFCC6"
27472             },
27473             "\u0643\u0644": {
27474                 "isolated": "\uFC3B",
27475                 "final": "\uFC81",
27476                 "initial": "\uFCC7",
27477                 "medial": "\uFCEB"
27478             },
27479             "\u0643\u0645": {
27480                 "isolated": "\uFC3C",
27481                 "final": "\uFC82",
27482                 "initial": "\uFCC8",
27483                 "medial": "\uFCEC"
27484             },
27485             "\u0643\u0649": {
27486                 "isolated": "\uFC3D",
27487                 "final": "\uFC83"
27488             },
27489             "\u0643\u064A": {
27490                 "isolated": "\uFC3E",
27491                 "final": "\uFC84"
27492             },
27493             "\u0644\u062C": {
27494                 "isolated": "\uFC3F",
27495                 "initial": "\uFCC9"
27496             },
27497             "\u0644\u062D": {
27498                 "isolated": "\uFC40",
27499                 "initial": "\uFCCA"
27500             },
27501             "\u0644\u062E": {
27502                 "isolated": "\uFC41",
27503                 "initial": "\uFCCB"
27504             },
27505             "\u0644\u0645": {
27506                 "isolated": "\uFC42",
27507                 "final": "\uFC85",
27508                 "initial": "\uFCCC",
27509                 "medial": "\uFCED"
27510             },
27511             "\u0644\u0649": {
27512                 "isolated": "\uFC43",
27513                 "final": "\uFC86"
27514             },
27515             "\u0644\u064A": {
27516                 "isolated": "\uFC44",
27517                 "final": "\uFC87"
27518             },
27519             "\u0645\u062C": {
27520                 "isolated": "\uFC45",
27521                 "initial": "\uFCCE"
27522             },
27523             "\u0645\u062D": {
27524                 "isolated": "\uFC46",
27525                 "initial": "\uFCCF"
27526             },
27527             "\u0645\u062E": {
27528                 "isolated": "\uFC47",
27529                 "initial": "\uFCD0"
27530             },
27531             "\u0645\u0645": {
27532                 "isolated": "\uFC48",
27533                 "final": "\uFC89",
27534                 "initial": "\uFCD1"
27535             },
27536             "\u0645\u0649": {
27537                 "isolated": "\uFC49"
27538             },
27539             "\u0645\u064A": {
27540                 "isolated": "\uFC4A"
27541             },
27542             "\u0646\u062C": {
27543                 "isolated": "\uFC4B",
27544                 "initial": "\uFCD2"
27545             },
27546             "\u0646\u062D": {
27547                 "isolated": "\uFC4C",
27548                 "initial": "\uFCD3"
27549             },
27550             "\u0646\u062E": {
27551                 "isolated": "\uFC4D",
27552                 "initial": "\uFCD4"
27553             },
27554             "\u0646\u0645": {
27555                 "isolated": "\uFC4E",
27556                 "final": "\uFC8C",
27557                 "initial": "\uFCD5",
27558                 "medial": "\uFCEE"
27559             },
27560             "\u0646\u0649": {
27561                 "isolated": "\uFC4F",
27562                 "final": "\uFC8E"
27563             },
27564             "\u0646\u064A": {
27565                 "isolated": "\uFC50",
27566                 "final": "\uFC8F"
27567             },
27568             "\u0647\u062C": {
27569                 "isolated": "\uFC51",
27570                 "initial": "\uFCD7"
27571             },
27572             "\u0647\u0645": {
27573                 "isolated": "\uFC52",
27574                 "initial": "\uFCD8"
27575             },
27576             "\u0647\u0649": {
27577                 "isolated": "\uFC53"
27578             },
27579             "\u0647\u064A": {
27580                 "isolated": "\uFC54"
27581             },
27582             "\u064A\u062C": {
27583                 "isolated": "\uFC55",
27584                 "initial": "\uFCDA"
27585             },
27586             "\u064A\u062D": {
27587                 "isolated": "\uFC56",
27588                 "initial": "\uFCDB"
27589             },
27590             "\u064A\u062E": {
27591                 "isolated": "\uFC57",
27592                 "initial": "\uFCDC"
27593             },
27594             "\u064A\u0645": {
27595                 "isolated": "\uFC58",
27596                 "final": "\uFC93",
27597                 "initial": "\uFCDD",
27598                 "medial": "\uFCF0"
27599             },
27600             "\u064A\u0649": {
27601                 "isolated": "\uFC59",
27602                 "final": "\uFC95"
27603             },
27604             "\u064A\u064A": {
27605                 "isolated": "\uFC5A",
27606                 "final": "\uFC96"
27607             },
27608             "\u0630\u0670": {
27609                 "isolated": "\uFC5B"
27610             },
27611             "\u0631\u0670": {
27612                 "isolated": "\uFC5C"
27613             },
27614             "\u0649\u0670": {
27615                 "isolated": "\uFC5D",
27616                 "final": "\uFC90"
27617             },
27618             "\u064C\u0651": {
27619                 "isolated": "\uFC5E"
27620             },
27621             "\u064D\u0651": {
27622                 "isolated": "\uFC5F"
27623             },
27624             "\u064E\u0651": {
27625                 "isolated": "\uFC60"
27626             },
27627             "\u064F\u0651": {
27628                 "isolated": "\uFC61"
27629             },
27630             "\u0650\u0651": {
27631                 "isolated": "\uFC62"
27632             },
27633             "\u0651\u0670": {
27634                 "isolated": "\uFC63"
27635             },
27636             "\u0626\u0631": {
27637                 "final": "\uFC64"
27638             },
27639             "\u0626\u0632": {
27640                 "final": "\uFC65"
27641             },
27642             "\u0626\u0646": {
27643                 "final": "\uFC67"
27644             },
27645             "\u0628\u0631": {
27646                 "final": "\uFC6A"
27647             },
27648             "\u0628\u0632": {
27649                 "final": "\uFC6B"
27650             },
27651             "\u0628\u0646": {
27652                 "final": "\uFC6D"
27653             },
27654             "\u062A\u0631": {
27655                 "final": "\uFC70"
27656             },
27657             "\u062A\u0632": {
27658                 "final": "\uFC71"
27659             },
27660             "\u062A\u0646": {
27661                 "final": "\uFC73"
27662             },
27663             "\u062B\u0631": {
27664                 "final": "\uFC76"
27665             },
27666             "\u062B\u0632": {
27667                 "final": "\uFC77"
27668             },
27669             "\u062B\u0646": {
27670                 "final": "\uFC79"
27671             },
27672             "\u062B\u064A": {
27673                 "final": "\uFC7B"
27674             },
27675             "\u0645\u0627": {
27676                 "final": "\uFC88"
27677             },
27678             "\u0646\u0631": {
27679                 "final": "\uFC8A"
27680             },
27681             "\u0646\u0632": {
27682                 "final": "\uFC8B"
27683             },
27684             "\u0646\u0646": {
27685                 "final": "\uFC8D"
27686             },
27687             "\u064A\u0631": {
27688                 "final": "\uFC91"
27689             },
27690             "\u064A\u0632": {
27691                 "final": "\uFC92"
27692             },
27693             "\u064A\u0646": {
27694                 "final": "\uFC94"
27695             },
27696             "\u0626\u062E": {
27697                 "initial": "\uFC99"
27698             },
27699             "\u0626\u0647": {
27700                 "initial": "\uFC9B",
27701                 "medial": "\uFCE0"
27702             },
27703             "\u0628\u0647": {
27704                 "initial": "\uFCA0",
27705                 "medial": "\uFCE2"
27706             },
27707             "\u062A\u0647": {
27708                 "initial": "\uFCA5",
27709                 "medial": "\uFCE4"
27710             },
27711             "\u0635\u062E": {
27712                 "initial": "\uFCB2"
27713             },
27714             "\u0644\u0647": {
27715                 "initial": "\uFCCD"
27716             },
27717             "\u0646\u0647": {
27718                 "initial": "\uFCD6",
27719                 "medial": "\uFCEF"
27720             },
27721             "\u0647\u0670": {
27722                 "initial": "\uFCD9"
27723             },
27724             "\u064A\u0647": {
27725                 "initial": "\uFCDE",
27726                 "medial": "\uFCF1"
27727             },
27728             "\u062B\u0647": {
27729                 "medial": "\uFCE6"
27730             },
27731             "\u0633\u0647": {
27732                 "medial": "\uFCE8",
27733                 "initial": "\uFD31"
27734             },
27735             "\u0634\u0645": {
27736                 "medial": "\uFCE9",
27737                 "isolated": "\uFD0C",
27738                 "final": "\uFD28",
27739                 "initial": "\uFD30"
27740             },
27741             "\u0634\u0647": {
27742                 "medial": "\uFCEA",
27743                 "initial": "\uFD32"
27744             },
27745             "\u0640\u064E\u0651": {
27746                 "medial": "\uFCF2"
27747             },
27748             "\u0640\u064F\u0651": {
27749                 "medial": "\uFCF3"
27750             },
27751             "\u0640\u0650\u0651": {
27752                 "medial": "\uFCF4"
27753             },
27754             "\u0637\u0649": {
27755                 "isolated": "\uFCF5",
27756                 "final": "\uFD11"
27757             },
27758             "\u0637\u064A": {
27759                 "isolated": "\uFCF6",
27760                 "final": "\uFD12"
27761             },
27762             "\u0639\u0649": {
27763                 "isolated": "\uFCF7",
27764                 "final": "\uFD13"
27765             },
27766             "\u0639\u064A": {
27767                 "isolated": "\uFCF8",
27768                 "final": "\uFD14"
27769             },
27770             "\u063A\u0649": {
27771                 "isolated": "\uFCF9",
27772                 "final": "\uFD15"
27773             },
27774             "\u063A\u064A": {
27775                 "isolated": "\uFCFA",
27776                 "final": "\uFD16"
27777             },
27778             "\u0633\u0649": {
27779                 "isolated": "\uFCFB"
27780             },
27781             "\u0633\u064A": {
27782                 "isolated": "\uFCFC",
27783                 "final": "\uFD18"
27784             },
27785             "\u0634\u0649": {
27786                 "isolated": "\uFCFD",
27787                 "final": "\uFD19"
27788             },
27789             "\u0634\u064A": {
27790                 "isolated": "\uFCFE",
27791                 "final": "\uFD1A"
27792             },
27793             "\u062D\u0649": {
27794                 "isolated": "\uFCFF",
27795                 "final": "\uFD1B"
27796             },
27797             "\u062D\u064A": {
27798                 "isolated": "\uFD00",
27799                 "final": "\uFD1C"
27800             },
27801             "\u062C\u0649": {
27802                 "isolated": "\uFD01",
27803                 "final": "\uFD1D"
27804             },
27805             "\u062C\u064A": {
27806                 "isolated": "\uFD02",
27807                 "final": "\uFD1E"
27808             },
27809             "\u062E\u0649": {
27810                 "isolated": "\uFD03",
27811                 "final": "\uFD1F"
27812             },
27813             "\u062E\u064A": {
27814                 "isolated": "\uFD04",
27815                 "final": "\uFD20"
27816             },
27817             "\u0635\u0649": {
27818                 "isolated": "\uFD05",
27819                 "final": "\uFD21"
27820             },
27821             "\u0635\u064A": {
27822                 "isolated": "\uFD06",
27823                 "final": "\uFD22"
27824             },
27825             "\u0636\u0649": {
27826                 "isolated": "\uFD07",
27827                 "final": "\uFD23"
27828             },
27829             "\u0636\u064A": {
27830                 "isolated": "\uFD08",
27831                 "final": "\uFD24"
27832             },
27833             "\u0634\u062C": {
27834                 "isolated": "\uFD09",
27835                 "final": "\uFD25",
27836                 "initial": "\uFD2D",
27837                 "medial": "\uFD37"
27838             },
27839             "\u0634\u062D": {
27840                 "isolated": "\uFD0A",
27841                 "final": "\uFD26",
27842                 "initial": "\uFD2E",
27843                 "medial": "\uFD38"
27844             },
27845             "\u0634\u062E": {
27846                 "isolated": "\uFD0B",
27847                 "final": "\uFD27",
27848                 "initial": "\uFD2F",
27849                 "medial": "\uFD39"
27850             },
27851             "\u0634\u0631": {
27852                 "isolated": "\uFD0D",
27853                 "final": "\uFD29"
27854             },
27855             "\u0633\u0631": {
27856                 "isolated": "\uFD0E",
27857                 "final": "\uFD2A"
27858             },
27859             "\u0635\u0631": {
27860                 "isolated": "\uFD0F",
27861                 "final": "\uFD2B"
27862             },
27863             "\u0636\u0631": {
27864                 "isolated": "\uFD10",
27865                 "final": "\uFD2C"
27866             },
27867             "\u0633\u0639": {
27868                 "final": "\uFD17"
27869             },
27870             "\u062A\u062C\u0645": {
27871                 "initial": "\uFD50"
27872             },
27873             "\u062A\u062D\u062C": {
27874                 "final": "\uFD51",
27875                 "initial": "\uFD52"
27876             },
27877             "\u062A\u062D\u0645": {
27878                 "initial": "\uFD53"
27879             },
27880             "\u062A\u062E\u0645": {
27881                 "initial": "\uFD54"
27882             },
27883             "\u062A\u0645\u062C": {
27884                 "initial": "\uFD55"
27885             },
27886             "\u062A\u0645\u062D": {
27887                 "initial": "\uFD56"
27888             },
27889             "\u062A\u0645\u062E": {
27890                 "initial": "\uFD57"
27891             },
27892             "\u062C\u0645\u062D": {
27893                 "final": "\uFD58",
27894                 "initial": "\uFD59"
27895             },
27896             "\u062D\u0645\u064A": {
27897                 "final": "\uFD5A"
27898             },
27899             "\u062D\u0645\u0649": {
27900                 "final": "\uFD5B"
27901             },
27902             "\u0633\u062D\u062C": {
27903                 "initial": "\uFD5C"
27904             },
27905             "\u0633\u062C\u062D": {
27906                 "initial": "\uFD5D"
27907             },
27908             "\u0633\u062C\u0649": {
27909                 "final": "\uFD5E"
27910             },
27911             "\u0633\u0645\u062D": {
27912                 "final": "\uFD5F",
27913                 "initial": "\uFD60"
27914             },
27915             "\u0633\u0645\u062C": {
27916                 "initial": "\uFD61"
27917             },
27918             "\u0633\u0645\u0645": {
27919                 "final": "\uFD62",
27920                 "initial": "\uFD63"
27921             },
27922             "\u0635\u062D\u062D": {
27923                 "final": "\uFD64",
27924                 "initial": "\uFD65"
27925             },
27926             "\u0635\u0645\u0645": {
27927                 "final": "\uFD66",
27928                 "initial": "\uFDC5"
27929             },
27930             "\u0634\u062D\u0645": {
27931                 "final": "\uFD67",
27932                 "initial": "\uFD68"
27933             },
27934             "\u0634\u062C\u064A": {
27935                 "final": "\uFD69"
27936             },
27937             "\u0634\u0645\u062E": {
27938                 "final": "\uFD6A",
27939                 "initial": "\uFD6B"
27940             },
27941             "\u0634\u0645\u0645": {
27942                 "final": "\uFD6C",
27943                 "initial": "\uFD6D"
27944             },
27945             "\u0636\u062D\u0649": {
27946                 "final": "\uFD6E"
27947             },
27948             "\u0636\u062E\u0645": {
27949                 "final": "\uFD6F",
27950                 "initial": "\uFD70"
27951             },
27952             "\u0636\u0645\u062D": {
27953                 "final": "\uFD71"
27954             },
27955             "\u0637\u0645\u062D": {
27956                 "initial": "\uFD72"
27957             },
27958             "\u0637\u0645\u0645": {
27959                 "initial": "\uFD73"
27960             },
27961             "\u0637\u0645\u064A": {
27962                 "final": "\uFD74"
27963             },
27964             "\u0639\u062C\u0645": {
27965                 "final": "\uFD75",
27966                 "initial": "\uFDC4"
27967             },
27968             "\u0639\u0645\u0645": {
27969                 "final": "\uFD76",
27970                 "initial": "\uFD77"
27971             },
27972             "\u0639\u0645\u0649": {
27973                 "final": "\uFD78"
27974             },
27975             "\u063A\u0645\u0645": {
27976                 "final": "\uFD79"
27977             },
27978             "\u063A\u0645\u064A": {
27979                 "final": "\uFD7A"
27980             },
27981             "\u063A\u0645\u0649": {
27982                 "final": "\uFD7B"
27983             },
27984             "\u0641\u062E\u0645": {
27985                 "final": "\uFD7C",
27986                 "initial": "\uFD7D"
27987             },
27988             "\u0642\u0645\u062D": {
27989                 "final": "\uFD7E",
27990                 "initial": "\uFDB4"
27991             },
27992             "\u0642\u0645\u0645": {
27993                 "final": "\uFD7F"
27994             },
27995             "\u0644\u062D\u0645": {
27996                 "final": "\uFD80",
27997                 "initial": "\uFDB5"
27998             },
27999             "\u0644\u062D\u064A": {
28000                 "final": "\uFD81"
28001             },
28002             "\u0644\u062D\u0649": {
28003                 "final": "\uFD82"
28004             },
28005             "\u0644\u062C\u062C": {
28006                 "initial": "\uFD83",
28007                 "final": "\uFD84"
28008             },
28009             "\u0644\u062E\u0645": {
28010                 "final": "\uFD85",
28011                 "initial": "\uFD86"
28012             },
28013             "\u0644\u0645\u062D": {
28014                 "final": "\uFD87",
28015                 "initial": "\uFD88"
28016             },
28017             "\u0645\u062D\u062C": {
28018                 "initial": "\uFD89"
28019             },
28020             "\u0645\u062D\u0645": {
28021                 "initial": "\uFD8A"
28022             },
28023             "\u0645\u062D\u064A": {
28024                 "final": "\uFD8B"
28025             },
28026             "\u0645\u062C\u062D": {
28027                 "initial": "\uFD8C"
28028             },
28029             "\u0645\u062C\u0645": {
28030                 "initial": "\uFD8D"
28031             },
28032             "\u0645\u062E\u062C": {
28033                 "initial": "\uFD8E"
28034             },
28035             "\u0645\u062E\u0645": {
28036                 "initial": "\uFD8F"
28037             },
28038             "\u0645\u062C\u062E": {
28039                 "initial": "\uFD92"
28040             },
28041             "\u0647\u0645\u062C": {
28042                 "initial": "\uFD93"
28043             },
28044             "\u0647\u0645\u0645": {
28045                 "initial": "\uFD94"
28046             },
28047             "\u0646\u062D\u0645": {
28048                 "initial": "\uFD95"
28049             },
28050             "\u0646\u062D\u0649": {
28051                 "final": "\uFD96"
28052             },
28053             "\u0646\u062C\u0645": {
28054                 "final": "\uFD97",
28055                 "initial": "\uFD98"
28056             },
28057             "\u0646\u062C\u0649": {
28058                 "final": "\uFD99"
28059             },
28060             "\u0646\u0645\u064A": {
28061                 "final": "\uFD9A"
28062             },
28063             "\u0646\u0645\u0649": {
28064                 "final": "\uFD9B"
28065             },
28066             "\u064A\u0645\u0645": {
28067                 "final": "\uFD9C",
28068                 "initial": "\uFD9D"
28069             },
28070             "\u0628\u062E\u064A": {
28071                 "final": "\uFD9E"
28072             },
28073             "\u062A\u062C\u064A": {
28074                 "final": "\uFD9F"
28075             },
28076             "\u062A\u062C\u0649": {
28077                 "final": "\uFDA0"
28078             },
28079             "\u062A\u062E\u064A": {
28080                 "final": "\uFDA1"
28081             },
28082             "\u062A\u062E\u0649": {
28083                 "final": "\uFDA2"
28084             },
28085             "\u062A\u0645\u064A": {
28086                 "final": "\uFDA3"
28087             },
28088             "\u062A\u0645\u0649": {
28089                 "final": "\uFDA4"
28090             },
28091             "\u062C\u0645\u064A": {
28092                 "final": "\uFDA5"
28093             },
28094             "\u062C\u062D\u0649": {
28095                 "final": "\uFDA6"
28096             },
28097             "\u062C\u0645\u0649": {
28098                 "final": "\uFDA7"
28099             },
28100             "\u0633\u062E\u0649": {
28101                 "final": "\uFDA8"
28102             },
28103             "\u0635\u062D\u064A": {
28104                 "final": "\uFDA9"
28105             },
28106             "\u0634\u062D\u064A": {
28107                 "final": "\uFDAA"
28108             },
28109             "\u0636\u062D\u064A": {
28110                 "final": "\uFDAB"
28111             },
28112             "\u0644\u062C\u064A": {
28113                 "final": "\uFDAC"
28114             },
28115             "\u0644\u0645\u064A": {
28116                 "final": "\uFDAD"
28117             },
28118             "\u064A\u062D\u064A": {
28119                 "final": "\uFDAE"
28120             },
28121             "\u064A\u062C\u064A": {
28122                 "final": "\uFDAF"
28123             },
28124             "\u064A\u0645\u064A": {
28125                 "final": "\uFDB0"
28126             },
28127             "\u0645\u0645\u064A": {
28128                 "final": "\uFDB1"
28129             },
28130             "\u0642\u0645\u064A": {
28131                 "final": "\uFDB2"
28132             },
28133             "\u0646\u062D\u064A": {
28134                 "final": "\uFDB3"
28135             },
28136             "\u0639\u0645\u064A": {
28137                 "final": "\uFDB6"
28138             },
28139             "\u0643\u0645\u064A": {
28140                 "final": "\uFDB7"
28141             },
28142             "\u0646\u062C\u062D": {
28143                 "initial": "\uFDB8",
28144                 "final": "\uFDBD"
28145             },
28146             "\u0645\u062E\u064A": {
28147                 "final": "\uFDB9"
28148             },
28149             "\u0644\u062C\u0645": {
28150                 "initial": "\uFDBA",
28151                 "final": "\uFDBC"
28152             },
28153             "\u0643\u0645\u0645": {
28154                 "final": "\uFDBB",
28155                 "initial": "\uFDC3"
28156             },
28157             "\u062C\u062D\u064A": {
28158                 "final": "\uFDBE"
28159             },
28160             "\u062D\u062C\u064A": {
28161                 "final": "\uFDBF"
28162             },
28163             "\u0645\u062C\u064A": {
28164                 "final": "\uFDC0"
28165             },
28166             "\u0641\u0645\u064A": {
28167                 "final": "\uFDC1"
28168             },
28169             "\u0628\u062D\u064A": {
28170                 "final": "\uFDC2"
28171             },
28172             "\u0633\u062E\u064A": {
28173                 "final": "\uFDC6"
28174             },
28175             "\u0646\u062C\u064A": {
28176                 "final": "\uFDC7"
28177             },
28178             "\u0644\u0622": {
28179                 "isolated": "\uFEF5",
28180                 "final": "\uFEF6"
28181             },
28182             "\u0644\u0623": {
28183                 "isolated": "\uFEF7",
28184                 "final": "\uFEF8"
28185             },
28186             "\u0644\u0625": {
28187                 "isolated": "\uFEF9",
28188                 "final": "\uFEFA"
28189             },
28190             "\u0644\u0627": {
28191                 "isolated": "\uFEFB",
28192                 "final": "\uFEFC"
28193             },
28194             "words": {
28195                 "\u0635\u0644\u06D2": "\uFDF0",
28196                 "\u0642\u0644\u06D2": "\uFDF1",
28197                 "\u0627\u0644\u0644\u0647": "\uFDF2",
28198                 "\u0627\u0643\u0628\u0631": "\uFDF3",
28199                 "\u0645\u062D\u0645\u062F": "\uFDF4",
28200                 "\u0635\u0644\u0639\u0645": "\uFDF5",
28201                 "\u0631\u0633\u0648\u0644": "\uFDF6",
28202                 "\u0639\u0644\u064A\u0647": "\uFDF7",
28203                 "\u0648\u0633\u0644\u0645": "\uFDF8",
28204                 "\u0635\u0644\u0649": "\uFDF9",
28205                 "\u0635\u0644\u0649\u0627\u0644\u0644\u0647\u0639\u0644\u064A\u0647\u0648\u0633\u0644\u0645": "\uFDFA",
28206                 "\u062C\u0644\u062C\u0644\u0627\u0644\u0647": "\uFDFB",
28207                 "\u0631\u06CC\u0627\u0644": "\uFDFC"
28208             }
28209         };
28210         exports.default = ligatureReference;
28211         });
28212
28213         unwrapExports(unicodeLigatures);
28214
28215         var reference = createCommonjsModule(function (module, exports) {
28216         Object.defineProperty(exports, "__esModule", { value: true });
28217
28218
28219         var letterList = Object.keys(unicodeArabic.default);
28220         exports.letterList = letterList;
28221         var ligatureList = Object.keys(unicodeLigatures.default);
28222         exports.ligatureList = ligatureList;
28223         var ligatureWordList = Object.keys(unicodeLigatures.default.words);
28224         exports.ligatureWordList = ligatureWordList;
28225         var lams = '\u0644\u06B5\u06B6\u06B7\u06B8';
28226         exports.lams = lams;
28227         var alefs = '\u0627\u0622\u0623\u0625\u0671\u0672\u0673\u0675\u0773\u0774';
28228         exports.alefs = alefs;
28229         // for (var l = 1; l < lams.length; l++) {
28230         //   console.log('-');
28231         //   for (var a = 0; a < alefs.length; a++) {
28232         //     console.log(a + ': ' + lams[l] + alefs[a]);
28233         //   }
28234         // }
28235         var tashkeel = '\u0605\u0640\u0670\u0674\u06DF\u06E7\u06E8';
28236         exports.tashkeel = tashkeel;
28237         function addToTashkeel(start, finish) {
28238             for (var i = start; i <= finish; i++) {
28239                 exports.tashkeel = tashkeel += String.fromCharCode(i);
28240             }
28241         }
28242         addToTashkeel(0x0610, 0x061A);
28243         addToTashkeel(0x064B, 0x065F);
28244         addToTashkeel(0x06D6, 0x06DC);
28245         addToTashkeel(0x06E0, 0x06E4);
28246         addToTashkeel(0x06EA, 0x06ED);
28247         addToTashkeel(0x08D3, 0x08E1);
28248         addToTashkeel(0x08E3, 0x08FF);
28249         addToTashkeel(0xFE70, 0xFE7F);
28250         var lineBreakers = '\u0627\u0629\u0648\u06C0\u06CF\u06FD\u06FE\u076B\u076C\u0771\u0773\u0774\u0778\u0779\u08E2\u08B1\u08B2\u08B9';
28251         exports.lineBreakers = lineBreakers;
28252         function addToLineBreakers(start, finish) {
28253             for (var i = start; i <= finish; i++) {
28254                 exports.lineBreakers = lineBreakers += String.fromCharCode(i);
28255             }
28256         }
28257         addToLineBreakers(0x0600, 0x061F); // it's OK to include tashkeel in this range as it is ignored
28258         addToLineBreakers(0x0621, 0x0625);
28259         addToLineBreakers(0x062F, 0x0632);
28260         addToLineBreakers(0x0660, 0x066D); // numerals, math
28261         addToLineBreakers(0x0671, 0x0677);
28262         addToLineBreakers(0x0688, 0x0699);
28263         addToLineBreakers(0x06C3, 0x06CB);
28264         addToLineBreakers(0x06D2, 0x06F9);
28265         addToLineBreakers(0x0759, 0x075B);
28266         addToLineBreakers(0x08AA, 0x08AE);
28267         addToLineBreakers(0xFB50, 0xFDFD); // presentation forms look like they could connect, but never do
28268         // Presentation Forms A includes diacritics but they are meant to stand alone
28269         addToLineBreakers(0xFE80, 0xFEFC); // presentation forms look like they could connect, but never do
28270         // numerals, math
28271         addToLineBreakers(0x10E60, 0x10E7F);
28272         addToLineBreakers(0x1EC70, 0x1ECBF);
28273         addToLineBreakers(0x1EE00, 0x1EEFF);
28274         });
28275
28276         unwrapExports(reference);
28277         var reference_1 = reference.letterList;
28278         var reference_2 = reference.ligatureList;
28279         var reference_3 = reference.ligatureWordList;
28280         var reference_4 = reference.lams;
28281         var reference_5 = reference.alefs;
28282         var reference_6 = reference.tashkeel;
28283         var reference_7 = reference.lineBreakers;
28284
28285         var GlyphSplitter_1 = createCommonjsModule(function (module, exports) {
28286         Object.defineProperty(exports, "__esModule", { value: true });
28287
28288
28289         function GlyphSplitter(word) {
28290             var letters = [];
28291             var lastLetter = '';
28292             word.split('').forEach(function (letter) {
28293                 if (isArabic_1.isArabic(letter)) {
28294                     if (reference.tashkeel.indexOf(letter) > -1) {
28295                         letters[letters.length - 1] += letter;
28296                     }
28297                     else if (lastLetter.length && ((reference.lams.indexOf(lastLetter) === 0 && reference.alefs.indexOf(letter) > -1) || (reference.lams.indexOf(lastLetter) > 0 && reference.alefs.indexOf(letter) === 0))) {
28298                         // valid LA forms
28299                         letters[letters.length - 1] += letter;
28300                     }
28301                     else {
28302                         letters.push(letter);
28303                     }
28304                 }
28305                 else {
28306                     letters.push(letter);
28307                 }
28308                 if (reference.tashkeel.indexOf(letter) === -1) {
28309                     lastLetter = letter;
28310                 }
28311             });
28312             return letters;
28313         }
28314         exports.GlyphSplitter = GlyphSplitter;
28315         });
28316
28317         unwrapExports(GlyphSplitter_1);
28318         var GlyphSplitter_2 = GlyphSplitter_1.GlyphSplitter;
28319
28320         var BaselineSplitter_1 = createCommonjsModule(function (module, exports) {
28321         Object.defineProperty(exports, "__esModule", { value: true });
28322
28323
28324         function BaselineSplitter(word) {
28325             var letters = [];
28326             var lastLetter = '';
28327             word.split('').forEach(function (letter) {
28328                 if (isArabic_1.isArabic(letter) && isArabic_1.isArabic(lastLetter)) {
28329                     if (lastLetter.length && reference.tashkeel.indexOf(letter) > -1) {
28330                         letters[letters.length - 1] += letter;
28331                     }
28332                     else if (reference.lineBreakers.indexOf(lastLetter) > -1) {
28333                         letters.push(letter);
28334                     }
28335                     else {
28336                         letters[letters.length - 1] += letter;
28337                     }
28338                 }
28339                 else {
28340                     letters.push(letter);
28341                 }
28342                 if (reference.tashkeel.indexOf(letter) === -1) {
28343                     // don't allow tashkeel to hide line break
28344                     lastLetter = letter;
28345                 }
28346             });
28347             return letters;
28348         }
28349         exports.BaselineSplitter = BaselineSplitter;
28350         });
28351
28352         unwrapExports(BaselineSplitter_1);
28353         var BaselineSplitter_2 = BaselineSplitter_1.BaselineSplitter;
28354
28355         var Normalization = createCommonjsModule(function (module, exports) {
28356         Object.defineProperty(exports, "__esModule", { value: true });
28357
28358
28359
28360
28361         function Normal(word, breakPresentationForm) {
28362             // default is to turn initial/isolated/medial/final presentation form to generic
28363             if (typeof breakPresentationForm === 'undefined') {
28364                 breakPresentationForm = true;
28365             }
28366             var returnable = '';
28367             word.split('').forEach(function (letter) {
28368                 if (!isArabic_1.isArabic(letter)) {
28369                     returnable += letter;
28370                     return;
28371                 }
28372                 for (var w = 0; w < reference.letterList.length; w++) {
28373                     // ok so we are checking this potential lettertron
28374                     var letterForms = unicodeArabic.default[reference.letterList[w]];
28375                     var versions = Object.keys(letterForms);
28376                     for (var v = 0; v < versions.length; v++) {
28377                         var localVersion = letterForms[versions[v]];
28378                         if (typeof localVersion === 'object' && typeof localVersion.indexOf === 'undefined') {
28379                             // look at this embedded object
28380                             var embeddedForms = Object.keys(localVersion);
28381                             for (var ef = 0; ef < embeddedForms.length; ef++) {
28382                                 var form = localVersion[embeddedForms[ef]];
28383                                 if (form === letter || (typeof form === 'object' && form.indexOf && form.indexOf(letter) > -1)) {
28384                                     // match
28385                                     // console.log('embedded match');
28386                                     if (form === letter) {
28387                                         // match exact
28388                                         if (breakPresentationForm && localVersion['normal'] && ['isolated', 'initial', 'medial', 'final'].indexOf(embeddedForms[ef]) > -1) {
28389                                             // replace presentation form
28390                                             // console.log('keeping normal form of the letter');
28391                                             if (typeof localVersion['normal'] === 'object') {
28392                                                 returnable += localVersion['normal'][0];
28393                                             }
28394                                             else {
28395                                                 returnable += localVersion['normal'];
28396                                             }
28397                                             return;
28398                                         }
28399                                         // console.log('keeping this letter');
28400                                         returnable += letter;
28401                                         return;
28402                                     }
28403                                     else if (typeof form === 'object' && form.indexOf && form.indexOf(letter) > -1) {
28404                                         // match
28405                                         returnable += form[0];
28406                                         // console.log('added the first letter from the same array');
28407                                         return;
28408                                     }
28409                                 }
28410                             }
28411                         }
28412                         else if (localVersion === letter) {
28413                             // match exact
28414                             if (breakPresentationForm && letterForms['normal'] && ['isolated', 'initial', 'medial', 'final'].indexOf(versions[v]) > -1) {
28415                                 // replace presentation form
28416                                 // console.log('keeping normal form of the letter');
28417                                 if (typeof letterForms['normal'] === 'object') {
28418                                     returnable += letterForms['normal'][0];
28419                                 }
28420                                 else {
28421                                     returnable += letterForms['normal'];
28422                                 }
28423                                 return;
28424                             }
28425                             // console.log('keeping this letter');
28426                             returnable += letter;
28427                             return;
28428                         }
28429                         else if (typeof localVersion === 'object' && localVersion.indexOf && localVersion.indexOf(letter) > -1) {
28430                             // match
28431                             returnable += localVersion[0];
28432                             // console.log('added the first letter from the same array');
28433                             return;
28434                         }
28435                     }
28436                 }
28437                 // try ligatures
28438                 for (var v2 = 0; v2 < reference.ligatureList.length; v2++) {
28439                     var normalForm = reference.ligatureList[v2];
28440                     if (normalForm !== 'words') {
28441                         var ligForms = Object.keys(unicodeLigatures.default[normalForm]);
28442                         for (var f = 0; f < ligForms.length; f++) {
28443                             if (unicodeLigatures.default[normalForm][ligForms[f]] === letter) {
28444                                 returnable += normalForm;
28445                                 return;
28446                             }
28447                         }
28448                     }
28449                 }
28450                 // try words ligatures
28451                 for (var v3 = 0; v3 < reference.ligatureWordList.length; v3++) {
28452                     var normalForm = reference.ligatureWordList[v3];
28453                     if (unicodeLigatures.default.words[normalForm] === letter) {
28454                         returnable += normalForm;
28455                         return;
28456                     }
28457                 }
28458                 returnable += letter;
28459                 // console.log('kept the letter')
28460             });
28461             return returnable;
28462         }
28463         exports.Normal = Normal;
28464         });
28465
28466         unwrapExports(Normalization);
28467         var Normalization_1 = Normalization.Normal;
28468
28469         var CharShaper_1 = createCommonjsModule(function (module, exports) {
28470         Object.defineProperty(exports, "__esModule", { value: true });
28471
28472
28473
28474         function CharShaper(letter, form) {
28475             if (!isArabic_1.isArabic(letter)) {
28476                 // fail not Arabic
28477                 throw new Error('Not Arabic');
28478             }
28479             if (letter === "\u0621") {
28480                 // hamza alone
28481                 return "\u0621";
28482             }
28483             for (var w = 0; w < reference.letterList.length; w++) {
28484                 // ok so we are checking this potential lettertron
28485                 var letterForms = unicodeArabic.default[reference.letterList[w]];
28486                 var versions = Object.keys(letterForms);
28487                 for (var v = 0; v < versions.length; v++) {
28488                     var localVersion = letterForms[versions[v]];
28489                     if ((localVersion === letter) ||
28490                         (typeof localVersion === 'object' && localVersion.indexOf && localVersion.indexOf(letter) > -1)) {
28491                         if (versions.indexOf(form) > -1) {
28492                             return letterForms[form];
28493                         }
28494                     }
28495                     else if (typeof localVersion === 'object' && typeof localVersion.indexOf === 'undefined') {
28496                         // check embedded
28497                         var embeddedVersions = Object.keys(localVersion);
28498                         for (var ev = 0; ev < embeddedVersions.length; ev++) {
28499                             if ((localVersion[embeddedVersions[ev]] === letter) ||
28500                                 (typeof localVersion[embeddedVersions[ev]] === 'object' && localVersion[embeddedVersions[ev]].indexOf && localVersion[embeddedVersions[ev]].indexOf(letter) > -1)) {
28501                                 if (embeddedVersions.indexOf(form) > -1) {
28502                                     return localVersion[form];
28503                                 }
28504                             }
28505                         }
28506                     }
28507                 }
28508             }
28509         }
28510         exports.CharShaper = CharShaper;
28511         });
28512
28513         unwrapExports(CharShaper_1);
28514         var CharShaper_2 = CharShaper_1.CharShaper;
28515
28516         var WordShaper_1 = createCommonjsModule(function (module, exports) {
28517         Object.defineProperty(exports, "__esModule", { value: true });
28518
28519
28520
28521
28522         function WordShaper(word) {
28523             var state = 'initial';
28524             var output = '';
28525             for (var w = 0; w < word.length; w++) {
28526                 var nextLetter = ' ';
28527                 for (var nxw = w + 1; nxw < word.length; nxw++) {
28528                     if (!isArabic_1.isArabic(word[nxw])) {
28529                         break;
28530                     }
28531                     if (reference.tashkeel.indexOf(word[nxw]) === -1) {
28532                         nextLetter = word[nxw];
28533                         break;
28534                     }
28535                 }
28536                 if (!isArabic_1.isArabic(word[w]) || isArabic_1.isMath(word[w])) {
28537                     // space or other non-Arabic
28538                     output += word[w];
28539                     state = 'initial';
28540                 }
28541                 else if (reference.tashkeel.indexOf(word[w]) > -1) {
28542                     // tashkeel - add without changing state
28543                     output += word[w];
28544                 }
28545                 else if ((nextLetter === ' ') // last Arabic letter in this word
28546                     || (reference.lineBreakers.indexOf(word[w]) > -1)) { // the current letter is known to break lines
28547                     output += CharShaper_1.CharShaper(word[w], state === 'initial' ? 'isolated' : 'final');
28548                     state = 'initial';
28549                 }
28550                 else if (reference.lams.indexOf(word[w]) > -1 && reference.alefs.indexOf(nextLetter) > -1) {
28551                     // LA letters - advance an additional letter after this
28552                     output += unicodeLigatures.default[word[w] + nextLetter][(state === 'initial' ? 'isolated' : 'final')];
28553                     while (word[w] !== nextLetter) {
28554                         w++;
28555                     }
28556                     state = 'initial';
28557                 }
28558                 else {
28559                     output += CharShaper_1.CharShaper(word[w], state);
28560                     state = 'medial';
28561                 }
28562             }
28563             return output;
28564         }
28565         exports.WordShaper = WordShaper;
28566         });
28567
28568         unwrapExports(WordShaper_1);
28569         var WordShaper_2 = WordShaper_1.WordShaper;
28570
28571         var ParentLetter_1 = createCommonjsModule(function (module, exports) {
28572         Object.defineProperty(exports, "__esModule", { value: true });
28573
28574
28575
28576         function ParentLetter(letter) {
28577             if (!isArabic_1.isArabic(letter)) {
28578                 throw new Error('Not an Arabic letter');
28579             }
28580             for (var w = 0; w < reference.letterList.length; w++) {
28581                 // ok so we are checking this potential lettertron
28582                 var letterForms = unicodeArabic.default[reference.letterList[w]];
28583                 var versions = Object.keys(letterForms);
28584                 for (var v = 0; v < versions.length; v++) {
28585                     var localVersion = letterForms[versions[v]];
28586                     if (typeof localVersion === 'object' && typeof localVersion.indexOf === 'undefined') {
28587                         // look at this embedded object
28588                         var embeddedForms = Object.keys(localVersion);
28589                         for (var ef = 0; ef < embeddedForms.length; ef++) {
28590                             var form = localVersion[embeddedForms[ef]];
28591                             if (form === letter || (typeof form === 'object' && form.indexOf && form.indexOf(letter) > -1)) {
28592                                 // match
28593                                 return localVersion;
28594                             }
28595                         }
28596                     }
28597                     else if (localVersion === letter || (typeof localVersion === 'object' && localVersion.indexOf && localVersion.indexOf(letter) > -1)) {
28598                         // match
28599                         return letterForms;
28600                     }
28601                 }
28602                 return null;
28603             }
28604         }
28605         exports.ParentLetter = ParentLetter;
28606         function GrandparentLetter(letter) {
28607             if (!isArabic_1.isArabic(letter)) {
28608                 throw new Error('Not an Arabic letter');
28609             }
28610             for (var w = 0; w < reference.letterList.length; w++) {
28611                 // ok so we are checking this potential lettertron
28612                 var letterForms = unicodeArabic.default[reference.letterList[w]];
28613                 var versions = Object.keys(letterForms);
28614                 for (var v = 0; v < versions.length; v++) {
28615                     var localVersion = letterForms[versions[v]];
28616                     if (typeof localVersion === 'object' && typeof localVersion.indexOf === 'undefined') {
28617                         // look at this embedded object
28618                         var embeddedForms = Object.keys(localVersion);
28619                         for (var ef = 0; ef < embeddedForms.length; ef++) {
28620                             var form = localVersion[embeddedForms[ef]];
28621                             if (form === letter || (typeof form === 'object' && form.indexOf && form.indexOf(letter) > -1)) {
28622                                 // match
28623                                 return letterForms;
28624                             }
28625                         }
28626                     }
28627                     else if (localVersion === letter || (typeof localVersion === 'object' && localVersion.indexOf && localVersion.indexOf(letter) > -1)) {
28628                         // match
28629                         return letterForms;
28630                     }
28631                 }
28632                 return null;
28633             }
28634         }
28635         exports.GrandparentLetter = GrandparentLetter;
28636         });
28637
28638         unwrapExports(ParentLetter_1);
28639         var ParentLetter_2 = ParentLetter_1.ParentLetter;
28640         var ParentLetter_3 = ParentLetter_1.GrandparentLetter;
28641
28642         var lib$1 = createCommonjsModule(function (module, exports) {
28643         Object.defineProperty(exports, "__esModule", { value: true });
28644
28645         exports.isArabic = isArabic_1.isArabic;
28646
28647         exports.GlyphSplitter = GlyphSplitter_1.GlyphSplitter;
28648
28649         exports.BaselineSplitter = BaselineSplitter_1.BaselineSplitter;
28650
28651         exports.Normal = Normalization.Normal;
28652
28653         exports.CharShaper = CharShaper_1.CharShaper;
28654
28655         exports.WordShaper = WordShaper_1.WordShaper;
28656
28657         exports.ParentLetter = ParentLetter_1.ParentLetter;
28658         exports.GrandparentLetter = ParentLetter_1.GrandparentLetter;
28659         });
28660
28661         unwrapExports(lib$1);
28662         var lib_1 = lib$1.isArabic;
28663         var lib_2 = lib$1.GlyphSplitter;
28664         var lib_3 = lib$1.BaselineSplitter;
28665         var lib_4 = lib$1.Normal;
28666         var lib_5 = lib$1.CharShaper;
28667         var lib_6 = lib$1.WordShaper;
28668         var lib_7 = lib$1.ParentLetter;
28669         var lib_8 = lib$1.GrandparentLetter;
28670
28671         // see https://github.com/openstreetmap/iD/pull/3707
28672
28673         var rtlRegex = /[\u0590-\u05FF\u0600-\u06FF\u0780-\u07BF]/;
28674
28675         function fixRTLTextForSvg(inputText) {
28676             var ret = '', rtlBuffer = [];
28677             var arabicRegex = /[\u0600-\u06FF]/g;
28678             var arabicMath = /[\u0660-\u066C]+/g;
28679             var thaanaVowel = /[\u07A6-\u07B0]/;
28680             var hebrewSign = /[\u0591-\u05bd\u05bf\u05c1-\u05c5\u05c7]/;
28681
28682             if (!arabicRegex.test(inputText)) {
28683                 // Hebrew or Thaana RTL script
28684                 for (var n = 0; n < inputText.length; n++) {
28685                     var c = inputText[n];
28686                     if ((thaanaVowel.test(c) || hebrewSign.test(c)) && rtlBuffer.length) {
28687                         rtlBuffer[rtlBuffer.length - 1] += c;
28688                     } else if (rtlRegex.test(c)) {
28689                         rtlBuffer.push(c);
28690                     } else if (c === ' ' && rtlBuffer.length) {
28691                         // whitespace within RTL text
28692                         rtlBuffer = [rtlBuffer.reverse().join('') + ' '];
28693                     } else {
28694                         // non-RTL character
28695                         ret += rtlBuffer.reverse().join('') + c;
28696                         rtlBuffer = [];
28697                     }
28698                 }
28699                 ret += rtlBuffer.reverse().join('');
28700                 return ret;
28701             } else {
28702                 var label = lib_6(inputText).split('').reverse().join('');
28703                 // prevent Arabic numbers from being reversed
28704                 var numericSwaps = label.match(arabicMath) || [];
28705                 for (var i = 0; i < numericSwaps.length; i++) {
28706                     if (numericSwaps[i].length > 1) {
28707                         label = label.replace(numericSwaps[i], numericSwaps[i].split('').reverse().join(''));
28708                     }
28709                 }
28710                 return label;
28711             }
28712         }
28713
28714         var translations = Object.create(null);
28715
28716         var currentLocale = 'en';
28717         var textDirection = 'ltr';
28718
28719         function setLocale(val) {
28720             if (translations[val] !== undefined) {
28721                 currentLocale = val;
28722             } else if (translations[val.split('-')[0]]) {
28723                 currentLocale = val.split('-')[0];
28724             }
28725         }
28726
28727         function addTranslation(id, value) {
28728             translations[id] = value;
28729         }
28730
28731         /**
28732          * Given a string identifier, try to find that string in the current
28733          * language, and return it.  This function will be called recursively
28734          * with locale `en` if a string can not be found in the requested language.
28735          *
28736          * @param {string}   s   string identifier
28737          * @param {object?}  o   object of token replacements and default string
28738          * @param {string?}  loc locale to use
28739          * @returns {string?} locale string
28740          */
28741         function t(s, o, loc) {
28742             loc = loc || currentLocale;
28743
28744             var path = s
28745                 .split('.')
28746                 .map(function (s) { return s.replace(/<TX_DOT>/g, '.'); })
28747                 .reverse();
28748
28749             var rep = translations[loc];
28750
28751             while (rep !== undefined && path.length) {
28752                 rep = rep[path.pop()];
28753             }
28754
28755             if (rep !== undefined) {
28756                 if (o) {
28757                     for (var k in o) {
28758                         var variable = '{' + k + '}';
28759                         var re = new RegExp(variable, 'g'); // check globally for variables
28760                         rep = rep.replace(re, o[k]);
28761                     }
28762                 }
28763                 return rep;
28764             }
28765
28766             if (loc !== 'en') {
28767                 return t(s, o, 'en');
28768             }
28769
28770             if (o && 'default' in o) {
28771                 return o.default;
28772             }
28773
28774             var missing = 'Missing ' + loc + ' translation: ' + s;
28775             if (typeof console !== 'undefined') console.error(missing); // eslint-disable-line
28776
28777             return missing;
28778         }
28779
28780         /**
28781          * Given string 'ltr' or 'rtl', save that setting
28782          *
28783          * @param {string} dir ltr or rtl
28784          */
28785
28786         function setTextDirection(dir) {
28787             textDirection = dir;
28788         }
28789
28790         var detected;
28791
28792         function utilDetect(force) {
28793             if (detected && !force) return detected;
28794             detected = {};
28795
28796             var ua = navigator.userAgent,
28797                 m = null,
28798                 q = utilStringQs(window.location.hash.substring(1));
28799
28800             m = ua.match(/(edge)\/?\s*(\.?\d+(\.\d+)*)/i);   // Edge
28801             if (m !== null) {
28802                 detected.browser = m[1];
28803                 detected.version = m[2];
28804             }
28805             if (!detected.browser) {
28806                 m = ua.match(/Trident\/.*rv:([0-9]{1,}[\.0-9]{0,})/i);   // IE11
28807                 if (m !== null) {
28808                     detected.browser = 'msie';
28809                     detected.version = m[1];
28810                 }
28811             }
28812             if (!detected.browser) {
28813                 m = ua.match(/(opr)\/?\s*(\.?\d+(\.\d+)*)/i);   // Opera 15+
28814                 if (m !== null) {
28815                     detected.browser = 'Opera';
28816                     detected.version = m[2];
28817                 }
28818             }
28819             if (!detected.browser) {
28820                 m = ua.match(/(opera|chrome|safari|firefox|msie)\/?\s*(\.?\d+(\.\d+)*)/i);
28821                 if (m !== null) {
28822                     detected.browser = m[1];
28823                     detected.version = m[2];
28824                     m = ua.match(/version\/([\.\d]+)/i);
28825                     if (m !== null) detected.version = m[1];
28826                 }
28827             }
28828             if (!detected.browser) {
28829                 detected.browser = navigator.appName;
28830                 detected.version = navigator.appVersion;
28831             }
28832
28833             // keep major.minor version only..
28834             detected.version = detected.version.split(/\W/).slice(0,2).join('.');
28835
28836             if (detected.browser.toLowerCase() === 'msie') {
28837                 detected.ie = true;
28838                 detected.browser = 'Internet Explorer';
28839                 detected.support = parseFloat(detected.version) >= 11;
28840             } else {
28841                 detected.ie = false;
28842                 detected.support = true;
28843             }
28844
28845             // Added due to incomplete svg style support. See #715
28846             detected.opera = (detected.browser.toLowerCase() === 'opera' && parseFloat(detected.version) < 15 );
28847
28848             // Set locale based on url param (format 'en-US') or browser lang (default)
28849             if (q.hasOwnProperty('locale')) {
28850                 detected.locale = q.locale;
28851                 detected.language = q.locale.split('-')[0];
28852             } else {
28853                 detected.locale = (navigator.language || navigator.userLanguage || 'en-US');
28854                 detected.language = detected.locale.split('-')[0];
28855
28856                 // Search `navigator.languages` for a better locale. Prefer the first language,
28857                 // unless the second language is a culture-specific version of the first one, see #3842
28858                 if (navigator.languages && navigator.languages.length > 0) {
28859                     var code0 = navigator.languages[0],
28860                         parts0 = code0.split('-');
28861
28862                     detected.locale = code0;
28863                     detected.language = parts0[0];
28864
28865                     if (navigator.languages.length > 1 && parts0.length === 1) {
28866                         var code1 = navigator.languages[1],
28867                             parts1 = code1.split('-');
28868
28869                         if (parts1[0] === parts0[0]) {
28870                             detected.locale = code1;
28871                         }
28872                     }
28873                 }
28874             }
28875
28876             // Loaded locale is stored in currentLocale
28877             // return that instead (except in the situation where 'en' might override 'en-US')
28878             var loadedLocale = currentLocale || 'en';
28879             if (loadedLocale !== 'en') {
28880                 detected.locale = loadedLocale;
28881                 detected.language = detected.locale.split('-')[0];
28882             }
28883
28884             // detect text direction
28885             var lang = dataLocales[detected.locale];
28886             if ((lang && lang.rtl) || (q.rtl === 'true')) {
28887                 detected.textDirection = 'rtl';
28888             } else {
28889                 detected.textDirection = 'ltr';
28890             }
28891             setTextDirection(detected.textDirection);
28892
28893             // detect host
28894             var loc = window.top.location;
28895             var origin = loc.origin;
28896             if (!origin) {  // for unpatched IE11
28897                 origin = loc.protocol + '//' + loc.hostname + (loc.port ? ':' + loc.port: '');
28898             }
28899
28900             detected.host = origin + loc.pathname;
28901
28902             detected.filedrop = (window.FileReader && 'ondrop' in window);
28903
28904             detected.download = !(detected.ie || detected.browser.toLowerCase() === 'edge');
28905
28906             detected.cssfilters = !(detected.ie || detected.browser.toLowerCase() === 'edge');
28907
28908             function nav(x) {
28909                 return navigator.userAgent.indexOf(x) !== -1;
28910             }
28911
28912             if (nav('Win')) {
28913                 detected.os = 'win';
28914                 detected.platform = 'Windows';
28915             }
28916             else if (nav('Mac')) {
28917                 detected.os = 'mac';
28918                 detected.platform = 'Macintosh';
28919             }
28920             else if (nav('X11') || nav('Linux')) {
28921                 detected.os = 'linux';
28922                 detected.platform = 'Linux';
28923             }
28924             else {
28925                 detected.os = 'win';
28926                 detected.platform = 'Unknown';
28927             }
28928
28929             return detected;
28930         }
28931
28932         function utilTagText(entity) {
28933             var obj = (entity && entity.tags) || {};
28934             return Object.keys(obj)
28935                 .map(function(k) { return k + '=' + obj[k]; })
28936                 .join(', ');
28937         }
28938
28939
28940         function utilTagDiff(oldTags, newTags) {
28941             var tagDiff = [];
28942             var keys = utilArrayUnion(Object.keys(oldTags), Object.keys(newTags)).sort();
28943             keys.forEach(function(k) {
28944                 var oldVal = oldTags[k];
28945                 var newVal = newTags[k];
28946
28947                 if (oldVal && (!newVal || newVal !== oldVal)) {
28948                     tagDiff.push({
28949                         type: '-',
28950                         key: k,
28951                         oldVal: oldVal,
28952                         newVal: newVal,
28953                         display: '- ' + k + '=' + oldVal
28954                     });
28955                 }
28956                 if (newVal && (!oldVal || newVal !== oldVal)) {
28957                     tagDiff.push({
28958                         type: '+',
28959                         key: k,
28960                         oldVal: oldVal,
28961                         newVal: newVal,
28962                         display: '+ ' + k + '=' + newVal
28963                     });
28964                 }
28965             });
28966             return tagDiff;
28967         }
28968
28969
28970         function utilEntitySelector(ids) {
28971             return ids.length ? '.' + ids.join(',.') : 'nothing';
28972         }
28973
28974
28975         // returns an selector to select entity ids for:
28976         //  - entityIDs passed in
28977         //  - shallow descendant entityIDs for any of those entities that are relations
28978         function utilEntityOrMemberSelector(ids, graph) {
28979             var seen = new Set(ids);
28980             ids.forEach(collectShallowDescendants);
28981             return utilEntitySelector(Array.from(seen));
28982
28983             function collectShallowDescendants(id) {
28984                 var entity = graph.hasEntity(id);
28985                 if (!entity || entity.type !== 'relation') return;
28986
28987                 entity.members
28988                     .map(function(member) { return member.id; })
28989                     .forEach(function(id) { seen.add(id); });
28990             }
28991         }
28992
28993
28994         // returns an selector to select entity ids for:
28995         //  - entityIDs passed in
28996         //  - deep descendant entityIDs for any of those entities that are relations
28997         function utilEntityOrDeepMemberSelector(ids, graph) {
28998             var seen = new Set();
28999             ids.forEach(collectDeepDescendants);
29000             return utilEntitySelector(Array.from(seen));
29001
29002             function collectDeepDescendants(id) {
29003                 if (seen.has(id)) return;
29004                 seen.add(id);
29005
29006                 var entity = graph.hasEntity(id);
29007                 if (!entity || entity.type !== 'relation') return;
29008
29009                 entity.members
29010                     .map(function(member) { return member.id; })
29011                     .forEach(collectDeepDescendants);   // recurse
29012             }
29013         }
29014
29015
29016         // Adds or removes highlight styling for the specified entities
29017         function utilHighlightEntities(ids, highlighted, context) {
29018             context.surface()
29019                 .selectAll(utilEntityOrDeepMemberSelector(ids, context.graph()))
29020                 .classed('highlighted', highlighted);
29021         }
29022
29023
29024         // returns an Array that is the union of:
29025         //  - nodes for any nodeIDs passed in
29026         //  - child nodes of any wayIDs passed in
29027         //  - descendant member and child nodes of relationIDs passed in
29028         function utilGetAllNodes(ids, graph) {
29029             var seen = new Set();
29030             var nodes = new Set();
29031
29032             ids.forEach(collectNodes);
29033             return Array.from(nodes);
29034
29035             function collectNodes(id) {
29036                 if (seen.has(id)) return;
29037                 seen.add(id);
29038
29039                 var entity = graph.hasEntity(id);
29040                 if (!entity) return;
29041
29042                 if (entity.type === 'node') {
29043                     nodes.add(entity);
29044                 } else if (entity.type === 'way') {
29045                     entity.nodes.forEach(collectNodes);
29046                 } else {
29047                     entity.members
29048                         .map(function(member) { return member.id; })
29049                         .forEach(collectNodes);   // recurse
29050                 }
29051             }
29052         }
29053
29054
29055         function utilDisplayName(entity) {
29056             var localizedNameKey = 'name:' + utilDetect().locale.toLowerCase().split('-')[0];
29057             var name = entity.tags[localizedNameKey] || entity.tags.name || '';
29058             var network = entity.tags.cycle_network || entity.tags.network;
29059
29060             if (!name && entity.tags.ref) {
29061                 name = entity.tags.ref;
29062                 if (network) {
29063                     name = network + ' ' + name;
29064                 }
29065             }
29066
29067             return name;
29068         }
29069
29070
29071         function utilDisplayNameForPath(entity) {
29072             var name = utilDisplayName(entity);
29073             var isFirefox = utilDetect().browser.toLowerCase().indexOf('firefox') > -1;
29074
29075             if (!isFirefox && name && rtlRegex.test(name)) {
29076                 name = fixRTLTextForSvg(name);
29077             }
29078
29079             return name;
29080         }
29081
29082
29083         function utilDisplayType(id) {
29084             return {
29085                 n: t('inspector.node'),
29086                 w: t('inspector.way'),
29087                 r: t('inspector.relation')
29088             }[id.charAt(0)];
29089         }
29090
29091
29092         function utilDisplayLabel(entity, context) {
29093             var displayName = utilDisplayName(entity);
29094             if (displayName) {
29095                 // use the display name if there is one
29096                 return displayName;
29097             }
29098             var preset = utilPreset(entity, context);
29099             if (preset && preset.name()) {
29100                 // use the preset name if there is a match
29101                 return preset.name();
29102             }
29103             // fallback to the display type (node/way/relation)
29104             return utilDisplayType(entity.id);
29105         }
29106
29107
29108         function utilPreset(entity, context) {
29109             return context.presets().match(entity, context.graph());
29110         }
29111
29112
29113         function utilEntityRoot(entityType) {
29114             return {
29115                 node: 'n',
29116                 way: 'w',
29117                 relation: 'r'
29118             }[entityType];
29119         }
29120
29121
29122         function utilStringQs(str) {
29123             return str.split('&').reduce(function(obj, pair){
29124                 var parts = pair.split('=');
29125                 if (parts.length === 2) {
29126                     obj[parts[0]] = (null === parts[1]) ? '' : decodeURIComponent(parts[1]);
29127                 }
29128                 return obj;
29129             }, {});
29130         }
29131
29132
29133         function utilQsString(obj, noencode) {
29134             // encode everything except special characters used in certain hash parameters:
29135             // "/" in map states, ":", ",", {" and "}" in background
29136             function softEncode(s) {
29137                 return encodeURIComponent(s).replace(/(%2F|%3A|%2C|%7B|%7D)/g, decodeURIComponent);
29138             }
29139
29140             return Object.keys(obj).sort().map(function(key) {
29141                 return encodeURIComponent(key) + '=' + (
29142                     noencode ? softEncode(obj[key]) : encodeURIComponent(obj[key]));
29143             }).join('&');
29144         }
29145
29146
29147         function utilPrefixDOMProperty(property) {
29148             var prefixes = ['webkit', 'ms', 'moz', 'o'];
29149             var i = -1;
29150             var n = prefixes.length;
29151             var s = document.body;
29152
29153             if (property in s)
29154                 return property;
29155
29156             property = property.substr(0, 1).toUpperCase() + property.substr(1);
29157
29158             while (++i < n) {
29159                 if (prefixes[i] + property in s) {
29160                     return prefixes[i] + property;
29161                 }
29162             }
29163
29164             return false;
29165         }
29166
29167
29168         function utilPrefixCSSProperty(property) {
29169             var prefixes = ['webkit', 'ms', 'Moz', 'O'];
29170             var i = -1;
29171             var n = prefixes.length;
29172             var s = document.body.style;
29173
29174             if (property.toLowerCase() in s) {
29175                 return property.toLowerCase();
29176             }
29177
29178             while (++i < n) {
29179                 if (prefixes[i] + property in s) {
29180                     return '-' + prefixes[i].toLowerCase() + property.replace(/([A-Z])/g, '-$1').toLowerCase();
29181                 }
29182             }
29183
29184             return false;
29185         }
29186
29187
29188         var transformProperty;
29189         function utilSetTransform(el, x, y, scale) {
29190             var prop = transformProperty = transformProperty || utilPrefixCSSProperty('Transform');
29191             var translate = utilDetect().opera ? 'translate('   + x + 'px,' + y + 'px)'
29192                 : 'translate3d(' + x + 'px,' + y + 'px,0)';
29193             return el.style(prop, translate + (scale ? ' scale(' + scale + ')' : ''));
29194         }
29195
29196
29197         // Calculates Levenshtein distance between two strings
29198         // see:  https://en.wikipedia.org/wiki/Levenshtein_distance
29199         // first converts the strings to lowercase and replaces diacritic marks with ascii equivalents.
29200         function utilEditDistance(a, b) {
29201             a = remove$1(a.toLowerCase());
29202             b = remove$1(b.toLowerCase());
29203             if (a.length === 0) return b.length;
29204             if (b.length === 0) return a.length;
29205             var matrix = [];
29206             for (var i = 0; i <= b.length; i++) { matrix[i] = [i]; }
29207             for (var j = 0; j <= a.length; j++) { matrix[0][j] = j; }
29208             for (i = 1; i <= b.length; i++) {
29209                 for (j = 1; j <= a.length; j++) {
29210                     if (b.charAt(i-1) === a.charAt(j-1)) {
29211                         matrix[i][j] = matrix[i-1][j-1];
29212                     } else {
29213                         matrix[i][j] = Math.min(matrix[i-1][j-1] + 1, // substitution
29214                             Math.min(matrix[i][j-1] + 1, // insertion
29215                             matrix[i-1][j] + 1)); // deletion
29216                     }
29217                 }
29218             }
29219             return matrix[b.length][a.length];
29220         }
29221
29222
29223         // a d3.mouse-alike which
29224         // 1. Only works on HTML elements, not SVG
29225         // 2. Does not cause style recalculation
29226         function utilFastMouse(container) {
29227             var rect = container.getBoundingClientRect();
29228             var rectLeft = rect.left;
29229             var rectTop = rect.top;
29230             var clientLeft = +container.clientLeft;
29231             var clientTop = +container.clientTop;
29232
29233             if (textDirection === 'rtl') {
29234                 rectLeft = 0;
29235             }
29236             return function(e) {
29237                 return [
29238                     e.clientX - rectLeft - clientLeft,
29239                     e.clientY - rectTop - clientTop];
29240             };
29241         }
29242
29243
29244         function utilAsyncMap(inputs, func, callback) {
29245             var remaining = inputs.length;
29246             var results = [];
29247             var errors = [];
29248
29249             inputs.forEach(function(d, i) {
29250                 func(d, function done(err, data) {
29251                     errors[i] = err;
29252                     results[i] = data;
29253                     remaining--;
29254                     if (!remaining) callback(errors, results);
29255                 });
29256             });
29257         }
29258
29259
29260         // wraps an index to an interval [0..length-1]
29261         function utilWrap(index, length) {
29262             if (index < 0) {
29263                 index += Math.ceil(-index/length)*length;
29264             }
29265             return index % length;
29266         }
29267
29268
29269         /**
29270          * a replacement for functor
29271          *
29272          * @param {*} value any value
29273          * @returns {Function} a function that returns that value or the value if it's a function
29274          */
29275         function utilFunctor(value) {
29276             if (typeof value === 'function') return value;
29277             return function() {
29278                 return value;
29279             };
29280         }
29281
29282
29283         function utilNoAuto(selection) {
29284             var isText = (selection.size() && selection.node().tagName.toLowerCase() === 'textarea');
29285
29286             return selection
29287                 // assign 'new-password' even for non-password fields to prevent browsers (Chrome) ignoring 'off'
29288                 .attr('autocomplete', 'new-password')
29289                 .attr('autocorrect', 'off')
29290                 .attr('autocapitalize', 'off')
29291                 .attr('spellcheck', isText ? 'true' : 'false');
29292         }
29293
29294
29295         // https://stackoverflow.com/questions/194846/is-there-any-kind-of-hash-code-function-in-javascript
29296         // https://werxltd.com/wp/2010/05/13/javascript-implementation-of-javas-string-hashcode-method/
29297         function utilHashcode(str) {
29298             var hash = 0;
29299             if (str.length === 0) {
29300                 return hash;
29301             }
29302             for (var i = 0; i < str.length; i++) {
29303                 var char = str.charCodeAt(i);
29304                 hash = ((hash << 5) - hash) + char;
29305                 hash = hash & hash; // Convert to 32bit integer
29306             }
29307             return hash;
29308         }
29309
29310         function utilCleanTags(tags) {
29311             var out = {};
29312             for (var k in tags) {
29313                 if (!k) continue;
29314                 var v = tags[k];
29315                 if (v !== undefined) {
29316                     out[k] = cleanValue(k, v);
29317                 }
29318             }
29319
29320             return out;
29321
29322
29323             function cleanValue(k, v) {
29324                 function keepSpaces(k) {
29325                     return /_hours|_times|:conditional$/.test(k);
29326                 }
29327
29328                 function skip(k) {
29329                     return /^(description|note|fixme)$/.test(k);
29330                 }
29331
29332                 if (skip(k)) return v;
29333
29334                 var cleaned = v
29335                     .split(';')
29336                     .map(function(s) { return s.trim(); })
29337                     .join(keepSpaces(k) ? '; ' : ';');
29338
29339                 // The code below is not intended to validate websites and emails.
29340                 // It is only intended to prevent obvious copy-paste errors. (#2323)
29341                 // clean website- and email-like tags
29342                 if (k.indexOf('website') !== -1 ||
29343                     k.indexOf('email') !== -1 ||
29344                     cleaned.indexOf('http') === 0) {
29345                     cleaned = cleaned
29346                         .replace(/[\u200B-\u200F\uFEFF]/g, '');  // strip LRM and other zero width chars
29347
29348                 }
29349
29350                 return cleaned;
29351             }
29352         }
29353
29354         // Like selection.property('value', ...), but avoids no-op value sets,
29355         // which can result in layout/repaint thrashing in some situations.
29356         function utilGetSetValue(selection, value) {
29357             function d3_selection_value(value) {
29358                 function valueNull() {
29359                     delete this.value;
29360                 }
29361
29362                 function valueConstant() {
29363                     if (this.value !== value) {
29364                         this.value = value;
29365                     }
29366                 }
29367
29368                 function valueFunction() {
29369                     var x = value.apply(this, arguments);
29370                     if (x == null) {
29371                         delete this.value;
29372                     } else if (this.value !== x) {
29373                         this.value = x;
29374                     }
29375                 }
29376
29377                 return value == null
29378                     ? valueNull : (typeof value === 'function'
29379                     ? valueFunction : valueConstant);
29380             }
29381
29382             if (arguments.length === 1) {
29383                 return selection.property('value');
29384             }
29385
29386             return selection.each(d3_selection_value(value));
29387         }
29388
29389         function utilKeybinding(namespace) {
29390             var _keybindings = {};
29391
29392
29393             function testBindings(isCapturing) {
29394                 var didMatch = false;
29395                 var bindings = Object.keys(_keybindings).map(function(id) { return _keybindings[id]; });
29396                 var i, binding;
29397
29398                 // Most key shortcuts will accept either lower or uppercase ('h' or 'H'),
29399                 // so we don't strictly match on the shift key, but we prioritize
29400                 // shifted keybindings first, and fallback to unshifted only if no match.
29401                 // (This lets us differentiate between '←'/'⇧←' or '⌘Z'/'⌘⇧Z')
29402
29403                 // priority match shifted keybindings first
29404                 for (i = 0; i < bindings.length; i++) {
29405                     binding = bindings[i];
29406                     if (!binding.event.modifiers.shiftKey) continue;  // no shift
29407                     if (!!binding.capture !== isCapturing) continue;
29408                     if (matches(binding, true)) {
29409                         binding.callback();
29410                         didMatch = true;
29411                     }
29412                 }
29413
29414                 // then unshifted keybindings
29415                 if (didMatch) return;
29416                 for (i = 0; i < bindings.length; i++) {
29417                     binding = bindings[i];
29418                     if (binding.event.modifiers.shiftKey) continue;   // shift
29419                     if (!!binding.capture !== isCapturing) continue;
29420                     if (matches(binding, false)) {
29421                         binding.callback();
29422                     }
29423                 }
29424
29425
29426                 function matches(binding, testShift) {
29427                     var event$1 = event;
29428                     var isMatch = false;
29429                     var tryKeyCode = true;
29430
29431                     // Prefer a match on `KeyboardEvent.key`
29432                     if (event$1.key !== undefined) {
29433                         tryKeyCode = (event$1.key.charCodeAt(0) > 255);  // outside ISO-Latin-1
29434                         isMatch = true;
29435
29436                         if (binding.event.key === undefined) {
29437                             isMatch = false;
29438                         } else if (Array.isArray(binding.event.key)) {
29439                             if (binding.event.key.map(function(s) { return s.toLowerCase(); }).indexOf(event$1.key.toLowerCase()) === -1)
29440                                 isMatch = false;
29441                         } else {
29442                             if (event$1.key.toLowerCase() !== binding.event.key.toLowerCase())
29443                                 isMatch = false;
29444                         }
29445                     }
29446
29447                     // Fallback match on `KeyboardEvent.keyCode`, can happen if:
29448                     // - browser doesn't support `KeyboardEvent.key`
29449                     // - `KeyboardEvent.key` is outside ISO-Latin-1 range (cyrillic?)
29450                     if (!isMatch && tryKeyCode) {
29451                         isMatch = (event$1.keyCode === binding.event.keyCode);
29452                     }
29453
29454                     if (!isMatch) return false;
29455
29456                     // test modifier keys
29457                     if (!(event$1.ctrlKey && event$1.altKey)) {  // if both are set, assume AltGr and skip it - #4096
29458                         if (event$1.ctrlKey !== binding.event.modifiers.ctrlKey) return false;
29459                         if (event$1.altKey !== binding.event.modifiers.altKey) return false;
29460                     }
29461                     if (event$1.metaKey !== binding.event.modifiers.metaKey) return false;
29462                     if (testShift && event$1.shiftKey !== binding.event.modifiers.shiftKey) return false;
29463
29464                     return true;
29465                 }
29466             }
29467
29468
29469             function capture() {
29470                 testBindings(true);
29471             }
29472
29473
29474             function bubble() {
29475                 var tagName = d3_select(event.target).node().tagName;
29476                 if (tagName === 'INPUT' || tagName === 'SELECT' || tagName === 'TEXTAREA') {
29477                     return;
29478                 }
29479                 testBindings(false);
29480             }
29481
29482
29483             function keybinding(selection) {
29484                 selection = selection || d3_select(document);
29485                 selection.on('keydown.capture.' + namespace, capture, true);
29486                 selection.on('keydown.bubble.' + namespace, bubble, false);
29487                 return keybinding;
29488             }
29489
29490             // was: keybinding.off()
29491             keybinding.unbind = function(selection) {
29492                 _keybindings = [];
29493                 selection = selection || d3_select(document);
29494                 selection.on('keydown.capture.' + namespace, null);
29495                 selection.on('keydown.bubble.' + namespace, null);
29496                 return keybinding;
29497             };
29498
29499
29500             keybinding.clear = function() {
29501                 _keybindings = {};
29502                 return keybinding;
29503             };
29504
29505
29506             // Remove one or more keycode bindings.
29507             keybinding.off = function(codes, capture) {
29508                 var arr = utilArrayUniq([].concat(codes));
29509
29510                 for (var i = 0; i < arr.length; i++) {
29511                     var id = arr[i] + (capture ? '-capture' : '-bubble');
29512                     delete _keybindings[id];
29513                 }
29514                 return keybinding;
29515             };
29516
29517
29518             // Add one or more keycode bindings.
29519             keybinding.on = function(codes, callback, capture) {
29520                 if (typeof callback !== 'function') {
29521                     return keybinding.off(codes, capture);
29522                 }
29523
29524                 var arr = utilArrayUniq([].concat(codes));
29525
29526                 for (var i = 0; i < arr.length; i++) {
29527                     var id = arr[i] + (capture ? '-capture' : '-bubble');
29528                     var binding = {
29529                         id: id,
29530                         capture: capture,
29531                         callback: callback,
29532                         event: {
29533                             key: undefined,  // preferred
29534                             keyCode: 0,      // fallback
29535                             modifiers: {
29536                                 shiftKey: false,
29537                                 ctrlKey: false,
29538                                 altKey: false,
29539                                 metaKey: false
29540                             }
29541                         }
29542                     };
29543
29544                     if (_keybindings[id]) {
29545                         console.warn('warning: duplicate keybinding for "' + id + '"'); // eslint-disable-line no-console
29546                     }
29547
29548                     _keybindings[id] = binding;
29549
29550                     var matches = arr[i].toLowerCase().match(/(?:(?:[^+⇧⌃⌥⌘])+|[⇧⌃⌥⌘]|\+\+|^\+$)/g);
29551                     for (var j = 0; j < matches.length; j++) {
29552                         // Normalise matching errors
29553                         if (matches[j] === '++') matches[j] = '+';
29554
29555                         if (matches[j] in utilKeybinding.modifierCodes) {
29556                             var prop = utilKeybinding.modifierProperties[utilKeybinding.modifierCodes[matches[j]]];
29557                             binding.event.modifiers[prop] = true;
29558                         } else {
29559                             binding.event.key = utilKeybinding.keys[matches[j]] || matches[j];
29560                             if (matches[j] in utilKeybinding.keyCodes) {
29561                                 binding.event.keyCode = utilKeybinding.keyCodes[matches[j]];
29562                             }
29563                         }
29564                     }
29565                 }
29566
29567                 return keybinding;
29568             };
29569
29570
29571             return keybinding;
29572         }
29573
29574
29575         /*
29576          * See https://github.com/keithamus/jwerty
29577          */
29578
29579         utilKeybinding.modifierCodes = {
29580             // Shift key, ⇧
29581             '⇧': 16, shift: 16,
29582             // CTRL key, on Mac: ⌃
29583             '⌃': 17, ctrl: 17,
29584             // ALT key, on Mac: ⌥ (Alt)
29585             '⌥': 18, alt: 18, option: 18,
29586             // META, on Mac: ⌘ (CMD), on Windows (Win), on Linux (Super)
29587             '⌘': 91, meta: 91, cmd: 91, 'super': 91, win: 91
29588         };
29589
29590         utilKeybinding.modifierProperties = {
29591             16: 'shiftKey',
29592             17: 'ctrlKey',
29593             18: 'altKey',
29594             91: 'metaKey'
29595         };
29596
29597         utilKeybinding.keys = {
29598             // Backspace key, on Mac: ⌫ (Backspace)
29599             '⌫': 'Backspace', backspace: 'Backspace',
29600             // Tab Key, on Mac: ⇥ (Tab), on Windows ⇥⇥
29601             '⇥': 'Tab', '⇆': 'Tab', tab: 'Tab',
29602             // Return key, ↩
29603             '↩': 'Enter', 'return': 'Enter', enter: 'Enter', '⌅': 'Enter',
29604             // Pause/Break key
29605             'pause': 'Pause', 'pause-break': 'Pause',
29606             // Caps Lock key, ⇪
29607             '⇪': 'CapsLock', caps: 'CapsLock', 'caps-lock': 'CapsLock',
29608             // Escape key, on Mac: ⎋, on Windows: Esc
29609             '⎋': ['Escape', 'Esc'], escape: ['Escape', 'Esc'], esc: ['Escape', 'Esc'],
29610             // Space key
29611             space: [' ', 'Spacebar'],
29612             // Page-Up key, or pgup, on Mac: ↖
29613             '↖': 'PageUp', pgup: 'PageUp', 'page-up': 'PageUp',
29614             // Page-Down key, or pgdown, on Mac: ↘
29615             '↘': 'PageDown', pgdown: 'PageDown', 'page-down': 'PageDown',
29616             // END key, on Mac: ⇟
29617             '⇟': 'End', end: 'End',
29618             // HOME key, on Mac: ⇞
29619             '⇞': 'Home', home: 'Home',
29620             // Insert key, or ins
29621             ins: 'Insert', insert: 'Insert',
29622             // Delete key, on Mac: ⌦ (Delete)
29623             '⌦': ['Delete', 'Del'], del: ['Delete', 'Del'], 'delete': ['Delete', 'Del'],
29624             // Left Arrow Key, or ←
29625             '←': ['ArrowLeft', 'Left'], left: ['ArrowLeft', 'Left'], 'arrow-left': ['ArrowLeft', 'Left'],
29626             // Up Arrow Key, or ↑
29627             '↑': ['ArrowUp', 'Up'], up: ['ArrowUp', 'Up'], 'arrow-up': ['ArrowUp', 'Up'],
29628             // Right Arrow Key, or →
29629             '→': ['ArrowRight', 'Right'], right: ['ArrowRight', 'Right'], 'arrow-right': ['ArrowRight', 'Right'],
29630             // Up Arrow Key, or ↓
29631             '↓': ['ArrowDown', 'Down'], down: ['ArrowDown', 'Down'], 'arrow-down': ['ArrowDown', 'Down'],
29632             // odities, stuff for backward compatibility (browsers and code):
29633             // Num-Multiply, or *
29634             '*': ['*', 'Multiply'], star: ['*', 'Multiply'], asterisk: ['*', 'Multiply'], multiply: ['*', 'Multiply'],
29635             // Num-Plus or +
29636             '+': ['+', 'Add'], 'plus': ['+', 'Add'],
29637             // Num-Subtract, or -
29638             '-': ['-', 'Subtract'], subtract: ['-', 'Subtract'], 'dash': ['-', 'Subtract'],
29639             // Semicolon
29640             semicolon: ';',
29641             // = or equals
29642             equals: '=',
29643             // Comma, or ,
29644             comma: ',',
29645             // Period, or ., or full-stop
29646             period: '.', 'full-stop': '.',
29647             // Slash, or /, or forward-slash
29648             slash: '/', 'forward-slash': '/',
29649             // Tick, or `, or back-quote
29650             tick: '`', 'back-quote': '`',
29651             // Open bracket, or [
29652             'open-bracket': '[',
29653             // Back slash, or \
29654             'back-slash': '\\',
29655             // Close backet, or ]
29656             'close-bracket': ']',
29657             // Apostrophe, or Quote, or '
29658             quote: '\'', apostrophe: '\'',
29659             // NUMPAD 0-9
29660             'num-0': '0',
29661             'num-1': '1',
29662             'num-2': '2',
29663             'num-3': '3',
29664             'num-4': '4',
29665             'num-5': '5',
29666             'num-6': '6',
29667             'num-7': '7',
29668             'num-8': '8',
29669             'num-9': '9',
29670             // F1-F25
29671             f1: 'F1',
29672             f2: 'F2',
29673             f3: 'F3',
29674             f4: 'F4',
29675             f5: 'F5',
29676             f6: 'F6',
29677             f7: 'F7',
29678             f8: 'F8',
29679             f9: 'F9',
29680             f10: 'F10',
29681             f11: 'F11',
29682             f12: 'F12',
29683             f13: 'F13',
29684             f14: 'F14',
29685             f15: 'F15',
29686             f16: 'F16',
29687             f17: 'F17',
29688             f18: 'F18',
29689             f19: 'F19',
29690             f20: 'F20',
29691             f21: 'F21',
29692             f22: 'F22',
29693             f23: 'F23',
29694             f24: 'F24',
29695             f25: 'F25'
29696         };
29697
29698         utilKeybinding.keyCodes = {
29699             // Backspace key, on Mac: ⌫ (Backspace)
29700             '⌫': 8, backspace: 8,
29701             // Tab Key, on Mac: ⇥ (Tab), on Windows ⇥⇥
29702             '⇥': 9, '⇆': 9, tab: 9,
29703             // Return key, ↩
29704             '↩': 13, 'return': 13, enter: 13, '⌅': 13,
29705             // Pause/Break key
29706             'pause': 19, 'pause-break': 19,
29707             // Caps Lock key, ⇪
29708             '⇪': 20, caps: 20, 'caps-lock': 20,
29709             // Escape key, on Mac: ⎋, on Windows: Esc
29710             '⎋': 27, escape: 27, esc: 27,
29711             // Space key
29712             space: 32,
29713             // Page-Up key, or pgup, on Mac: ↖
29714             '↖': 33, pgup: 33, 'page-up': 33,
29715             // Page-Down key, or pgdown, on Mac: ↘
29716             '↘': 34, pgdown: 34, 'page-down': 34,
29717             // END key, on Mac: ⇟
29718             '⇟': 35, end: 35,
29719             // HOME key, on Mac: ⇞
29720             '⇞': 36, home: 36,
29721             // Insert key, or ins
29722             ins: 45, insert: 45,
29723             // Delete key, on Mac: ⌦ (Delete)
29724             '⌦': 46, del: 46, 'delete': 46,
29725             // Left Arrow Key, or ←
29726             '←': 37, left: 37, 'arrow-left': 37,
29727             // Up Arrow Key, or ↑
29728             '↑': 38, up: 38, 'arrow-up': 38,
29729             // Right Arrow Key, or →
29730             '→': 39, right: 39, 'arrow-right': 39,
29731             // Up Arrow Key, or ↓
29732             '↓': 40, down: 40, 'arrow-down': 40,
29733             // odities, printing characters that come out wrong:
29734             // Firefox Equals
29735             'ffequals': 61,
29736             // Num-Multiply, or *
29737             '*': 106, star: 106, asterisk: 106, multiply: 106,
29738             // Num-Plus or +
29739             '+': 107, 'plus': 107,
29740             // Num-Subtract, or -
29741             '-': 109, subtract: 109,
29742             // Firefox Plus
29743             'ffplus': 171,
29744             // Firefox Minus
29745             'ffminus': 173,
29746             // Semicolon
29747             ';': 186, semicolon: 186,
29748             // = or equals
29749             '=': 187, 'equals': 187,
29750             // Comma, or ,
29751             ',': 188, comma: 188,
29752             // Dash / Underscore key
29753             'dash': 189,
29754             // Period, or ., or full-stop
29755             '.': 190, period: 190, 'full-stop': 190,
29756             // Slash, or /, or forward-slash
29757             '/': 191, slash: 191, 'forward-slash': 191,
29758             // Tick, or `, or back-quote
29759             '`': 192, tick: 192, 'back-quote': 192,
29760             // Open bracket, or [
29761             '[': 219, 'open-bracket': 219,
29762             // Back slash, or \
29763             '\\': 220, 'back-slash': 220,
29764             // Close backet, or ]
29765             ']': 221, 'close-bracket': 221,
29766             // Apostrophe, or Quote, or '
29767             '\'': 222, quote: 222, apostrophe: 222
29768         };
29769
29770         // NUMPAD 0-9
29771         var i$2 = 95, n = 0;
29772         while (++i$2 < 106) {
29773             utilKeybinding.keyCodes['num-' + n] = i$2;
29774             ++n;
29775         }
29776
29777         // 0-9
29778         i$2 = 47; n = 0;
29779         while (++i$2 < 58) {
29780             utilKeybinding.keyCodes[n] = i$2;
29781             ++n;
29782         }
29783
29784         // F1-F25
29785         i$2 = 111; n = 1;
29786         while (++i$2 < 136) {
29787             utilKeybinding.keyCodes['f' + n] = i$2;
29788             ++n;
29789         }
29790
29791         // a-z
29792         i$2 = 64;
29793         while (++i$2 < 91) {
29794             utilKeybinding.keyCodes[String.fromCharCode(i$2).toLowerCase()] = i$2;
29795         }
29796
29797         function utilObjectOmit(obj, omitKeys) {
29798             return Object.keys(obj).reduce(function(result, key) {
29799                 if (omitKeys.indexOf(key) === -1) {
29800                     result[key] = obj[key];  // keep
29801                 }
29802                 return result;
29803             }, {});
29804         }
29805
29806         // Copies a variable number of methods from source to target.
29807         function utilRebind(target, source) {
29808             var i = 1, n = arguments.length, method;
29809             while (++i < n) {
29810                 target[method = arguments[i]] = d3_rebind(target, source, source[method]);
29811             }
29812             return target;
29813         }
29814
29815         // Method is assumed to be a standard D3 getter-setter:
29816         // If passed with no arguments, gets the value.
29817         // If passed with arguments, sets the value and returns the target.
29818         function d3_rebind(target, source, method) {
29819             return function() {
29820                 var value = method.apply(source, arguments);
29821                 return value === source ? target : value;
29822             };
29823         }
29824
29825         // A per-domain session mutex backed by a cookie and dead man's
29826         // switch. If the session crashes, the mutex will auto-release
29827         // after 5 seconds.
29828
29829         // This accepts a string and returns an object that complies with utilSessionMutexType
29830         function utilSessionMutex(name) {
29831             var mutex = {};
29832             var intervalID;
29833
29834             function renew() {
29835                 var expires = new Date();
29836                 expires.setSeconds(expires.getSeconds() + 5);
29837                 document.cookie = name + '=1; expires=' + expires.toUTCString();
29838             }
29839
29840             mutex.lock = function () {
29841                 if (intervalID) return true;
29842                 var cookie = document.cookie.replace(new RegExp('(?:(?:^|.*;)\\s*' + name + '\\s*\\=\\s*([^;]*).*$)|^.*$'), '$1');
29843                 if (cookie) return false;
29844                 renew();
29845                 intervalID = window.setInterval(renew, 4000);
29846                 return true;
29847             };
29848
29849             mutex.unlock = function () {
29850                 if (!intervalID) return;
29851                 document.cookie = name + '=; expires=Thu, 01 Jan 1970 00:00:00 GMT';
29852                 clearInterval(intervalID);
29853                 intervalID = null;
29854             };
29855
29856             mutex.locked = function () {
29857                 return !!intervalID;
29858             };
29859
29860             return mutex;
29861         }
29862
29863         function utilTiler() {
29864             var _size = [256, 256];
29865             var _scale = 256;
29866             var _tileSize = 256;
29867             var _zoomExtent = [0, 20];
29868             var _translate = [_size[0] / 2, _size[1] / 2];
29869             var _margin = 0;
29870             var _skipNullIsland = false;
29871
29872
29873             function clamp(num, min, max) {
29874                 return Math.max(min, Math.min(num, max));
29875             }
29876
29877
29878             function nearNullIsland(tile) {
29879                 var x = tile[0];
29880                 var y = tile[1];
29881                 var z = tile[2];
29882                 if (z >= 7) {
29883                     var center = Math.pow(2, z - 1);
29884                     var width = Math.pow(2, z - 6);
29885                     var min = center - (width / 2);
29886                     var max = center + (width / 2) - 1;
29887                     return x >= min && x <= max && y >= min && y <= max;
29888                 }
29889                 return false;
29890             }
29891
29892
29893             function tiler() {
29894                 var z = geoScaleToZoom(_scale / (2 * Math.PI), _tileSize);
29895                 var z0 = clamp(Math.round(z), _zoomExtent[0], _zoomExtent[1]);
29896                 var tileMin = 0;
29897                 var tileMax = Math.pow(2, z0) - 1;
29898                 var log2ts = Math.log(_tileSize) * Math.LOG2E;
29899                 var k = Math.pow(2, z - z0 + log2ts);
29900                 var origin = [
29901                     (_translate[0] - _scale / 2) / k,
29902                     (_translate[1] - _scale / 2) / k
29903                 ];
29904
29905                 var cols = d3_range(
29906                     clamp(Math.floor(-origin[0]) - _margin,               tileMin, tileMax + 1),
29907                     clamp(Math.ceil(_size[0] / k - origin[0]) + _margin,  tileMin, tileMax + 1)
29908                 );
29909                 var rows = d3_range(
29910                     clamp(Math.floor(-origin[1]) - _margin,               tileMin, tileMax + 1),
29911                     clamp(Math.ceil(_size[1] / k - origin[1]) + _margin,  tileMin, tileMax + 1)
29912                 );
29913
29914                 var tiles = [];
29915                 for (var i = 0; i < rows.length; i++) {
29916                     var y = rows[i];
29917                     for (var j = 0; j < cols.length; j++) {
29918                         var x = cols[j];
29919
29920                         if (i >= _margin && i <= rows.length - _margin &&
29921                             j >= _margin && j <= cols.length - _margin) {
29922                             tiles.unshift([x, y, z0]);  // tiles in view at beginning
29923                         } else {
29924                             tiles.push([x, y, z0]);     // tiles in margin at the end
29925                         }
29926                     }
29927                 }
29928
29929                 tiles.translate = origin;
29930                 tiles.scale = k;
29931
29932                 return tiles;
29933             }
29934
29935
29936             /**
29937              * getTiles() returns an array of tiles that cover the map view
29938              */
29939             tiler.getTiles = function(projection) {
29940                 var origin = [
29941                     projection.scale() * Math.PI - projection.translate()[0],
29942                     projection.scale() * Math.PI - projection.translate()[1]
29943                 ];
29944
29945                 this
29946                     .size(projection.clipExtent()[1])
29947                     .scale(projection.scale() * 2 * Math.PI)
29948                     .translate(projection.translate());
29949
29950                 var tiles = tiler();
29951                 var ts = tiles.scale;
29952
29953                 return tiles
29954                     .map(function(tile) {
29955                         if (_skipNullIsland && nearNullIsland(tile)) {
29956                             return false;
29957                         }
29958                         var x = tile[0] * ts - origin[0];
29959                         var y = tile[1] * ts - origin[1];
29960                         return {
29961                             id: tile.toString(),
29962                             xyz: tile,
29963                             extent: geoExtent(
29964                                 projection.invert([x, y + ts]),
29965                                 projection.invert([x + ts, y])
29966                             )
29967                         };
29968                     }).filter(Boolean);
29969             };
29970
29971
29972             /**
29973              * getGeoJSON() returns a FeatureCollection for debugging tiles
29974              */
29975             tiler.getGeoJSON = function(projection) {
29976                 var features = tiler.getTiles(projection).map(function(tile) {
29977                     return {
29978                         type: 'Feature',
29979                         properties: {
29980                             id: tile.id,
29981                             name: tile.id
29982                         },
29983                         geometry: {
29984                             type: 'Polygon',
29985                             coordinates: [ tile.extent.polygon() ]
29986                         }
29987                     };
29988                 });
29989
29990                 return {
29991                     type: 'FeatureCollection',
29992                     features: features
29993                 };
29994             };
29995
29996
29997             tiler.tileSize = function(val) {
29998                 if (!arguments.length) return _tileSize;
29999                 _tileSize = val;
30000                 return tiler;
30001             };
30002
30003
30004             tiler.zoomExtent = function(val) {
30005                 if (!arguments.length) return _zoomExtent;
30006                 _zoomExtent = val;
30007                 return tiler;
30008             };
30009
30010
30011             tiler.size = function(val) {
30012                 if (!arguments.length) return _size;
30013                 _size = val;
30014                 return tiler;
30015             };
30016
30017
30018             tiler.scale = function(val) {
30019                 if (!arguments.length) return _scale;
30020                 _scale = val;
30021                 return tiler;
30022             };
30023
30024
30025             tiler.translate = function(val) {
30026                 if (!arguments.length) return _translate;
30027                 _translate = val;
30028                 return tiler;
30029             };
30030
30031
30032             // number to extend the rows/columns beyond those covering the viewport
30033             tiler.margin = function(val) {
30034                 if (!arguments.length) return _margin;
30035                 _margin = +val;
30036                 return tiler;
30037             };
30038
30039
30040             tiler.skipNullIsland = function(val) {
30041                 if (!arguments.length) return _skipNullIsland;
30042                 _skipNullIsland = val;
30043                 return tiler;
30044             };
30045
30046
30047             return tiler;
30048         }
30049
30050         function utilTriggerEvent(target, type) {
30051             target.each(function() {
30052                 var evt = document.createEvent('HTMLEvents');
30053                 evt.initEvent(type, true, true);
30054                 this.dispatchEvent(evt);
30055             });
30056         }
30057
30058         function osmEntity(attrs) {
30059             // For prototypal inheritance.
30060             if (this instanceof osmEntity) return;
30061
30062             // Create the appropriate subtype.
30063             if (attrs && attrs.type) {
30064                 return osmEntity[attrs.type].apply(this, arguments);
30065             } else if (attrs && attrs.id) {
30066                 return osmEntity[osmEntity.id.type(attrs.id)].apply(this, arguments);
30067             }
30068
30069             // Initialize a generic Entity (used only in tests).
30070             return (new osmEntity()).initialize(arguments);
30071         }
30072
30073
30074         osmEntity.id = function(type) {
30075             return osmEntity.id.fromOSM(type, osmEntity.id.next[type]--);
30076         };
30077
30078
30079         osmEntity.id.next = {
30080             changeset: -1, node: -1, way: -1, relation: -1
30081         };
30082
30083
30084         osmEntity.id.fromOSM = function(type, id) {
30085             return type[0] + id;
30086         };
30087
30088
30089         osmEntity.id.toOSM = function(id) {
30090             return id.slice(1);
30091         };
30092
30093
30094         osmEntity.id.type = function(id) {
30095             return { 'c': 'changeset', 'n': 'node', 'w': 'way', 'r': 'relation' }[id[0]];
30096         };
30097
30098
30099         // A function suitable for use as the second argument to d3.selection#data().
30100         osmEntity.key = function(entity) {
30101             return entity.id + 'v' + (entity.v || 0);
30102         };
30103
30104         var _deprecatedTagValuesByKey;
30105
30106         osmEntity.deprecatedTagValuesByKey = function() {
30107             if (!_deprecatedTagValuesByKey) {
30108                 _deprecatedTagValuesByKey = {};
30109                 dataDeprecated.forEach(function(d) {
30110                     var oldKeys = Object.keys(d.old);
30111                     if (oldKeys.length === 1) {
30112                         var oldKey = oldKeys[0];
30113                         var oldValue = d.old[oldKey];
30114                         if (oldValue !== '*') {
30115                             if (!_deprecatedTagValuesByKey[oldKey]) {
30116                                 _deprecatedTagValuesByKey[oldKey] = [oldValue];
30117                             } else {
30118                                 _deprecatedTagValuesByKey[oldKey].push(oldValue);
30119                             }
30120                         }
30121                     }
30122                 });
30123             }
30124             return _deprecatedTagValuesByKey;
30125         };
30126
30127
30128         osmEntity.prototype = {
30129
30130             tags: {},
30131
30132
30133             initialize: function(sources) {
30134                 for (var i = 0; i < sources.length; ++i) {
30135                     var source = sources[i];
30136                     for (var prop in source) {
30137                         if (Object.prototype.hasOwnProperty.call(source, prop)) {
30138                             if (source[prop] === undefined) {
30139                                 delete this[prop];
30140                             } else {
30141                                 this[prop] = source[prop];
30142                             }
30143                         }
30144                     }
30145                 }
30146
30147                 if (!this.id && this.type) {
30148                     this.id = osmEntity.id(this.type);
30149                 }
30150                 if (!this.hasOwnProperty('visible')) {
30151                     this.visible = true;
30152                 }
30153
30154                 return this;
30155             },
30156
30157
30158             copy: function(resolver, copies) {
30159                 if (copies[this.id])
30160                     return copies[this.id];
30161
30162                 var copy = osmEntity(this, { id: undefined, user: undefined, version: undefined });
30163                 copies[this.id] = copy;
30164
30165                 return copy;
30166             },
30167
30168
30169             osmId: function() {
30170                 return osmEntity.id.toOSM(this.id);
30171             },
30172
30173
30174             isNew: function() {
30175                 return this.osmId() < 0;
30176             },
30177
30178
30179             update: function(attrs) {
30180                 return osmEntity(this, attrs, { v: 1 + (this.v || 0) });
30181             },
30182
30183
30184             mergeTags: function(tags) {
30185                 var merged = Object.assign({}, this.tags);   // shallow copy
30186                 var changed = false;
30187                 for (var k in tags) {
30188                     var t1 = merged[k];
30189                     var t2 = tags[k];
30190                     if (!t1) {
30191                         changed = true;
30192                         merged[k] = t2;
30193                     } else if (t1 !== t2) {
30194                         changed = true;
30195                         merged[k] = utilArrayUnion(t1.split(/;\s*/), t2.split(/;\s*/)).join(';');
30196                     }
30197                 }
30198                 return changed ? this.update({ tags: merged }) : this;
30199             },
30200
30201
30202             intersects: function(extent, resolver) {
30203                 return this.extent(resolver).intersects(extent);
30204             },
30205
30206
30207             hasNonGeometryTags: function() {
30208                 return Object.keys(this.tags).some(function(k) { return k !== 'area'; });
30209             },
30210
30211             hasParentRelations: function(resolver) {
30212                 return resolver.parentRelations(this).length > 0;
30213             },
30214
30215             hasInterestingTags: function() {
30216                 return Object.keys(this.tags).some(osmIsInterestingTag);
30217             },
30218
30219             hasWikidata: function() {
30220                 return !!this.tags.wikidata || !!this.tags['brand:wikidata'];
30221             },
30222
30223             isHighwayIntersection: function() {
30224                 return false;
30225             },
30226
30227             isDegenerate: function() {
30228                 return true;
30229             },
30230
30231             deprecatedTags: function() {
30232                 var tags = this.tags;
30233
30234                 // if there are no tags, none can be deprecated
30235                 if (Object.keys(tags).length === 0) return [];
30236
30237                 var deprecated = [];
30238                 dataDeprecated.forEach(function(d) {
30239                     var matchesDeprecatedTags = Object.keys(d.old).every(function(key) {
30240                         if (!tags[key]) return false;
30241                         if (d.old[key] === '*') return true;
30242
30243                         var vals = tags[key].split(';').filter(Boolean);
30244                         if (vals.length === 0) {
30245                             return false;
30246                         } else if (vals.length > 1) {
30247                             return vals.indexOf(d.old[key]) !== -1;
30248                         } else {
30249                             if (tags[key] === d.old[key]) {
30250                                 if (d.old[key] === d.replace[key]) {
30251                                     return !Object.keys(d.replace).every(function(key) {
30252                                         return tags[key] === d.replace[key];
30253                                     });
30254                                 } else {
30255                                     return true;
30256                                 }
30257                             }
30258                         }
30259                         return false;
30260                     });
30261                     if (matchesDeprecatedTags) {
30262                         deprecated.push(d);
30263                     }
30264                 });
30265
30266                 return deprecated;
30267             }
30268         };
30269
30270         function osmLanes(entity) {
30271             if (entity.type !== 'way') return null;
30272             if (!entity.tags.highway) return null;
30273
30274             var tags = entity.tags;
30275             var isOneWay = entity.isOneWay();
30276             var laneCount = getLaneCount(tags, isOneWay);
30277             var maxspeed = parseMaxspeed(tags);
30278
30279             var laneDirections = parseLaneDirections(tags, isOneWay, laneCount);
30280             var forward = laneDirections.forward;
30281             var backward = laneDirections.backward;
30282             var bothways = laneDirections.bothways;
30283
30284             // parse the piped string 'x|y|z' format
30285             var turnLanes = {};
30286             turnLanes.unspecified = parseTurnLanes(tags['turn:lanes']);
30287             turnLanes.forward = parseTurnLanes(tags['turn:lanes:forward']);
30288             turnLanes.backward = parseTurnLanes(tags['turn:lanes:backward']);
30289
30290             var maxspeedLanes = {};
30291             maxspeedLanes.unspecified = parseMaxspeedLanes(tags['maxspeed:lanes'], maxspeed);
30292             maxspeedLanes.forward = parseMaxspeedLanes(tags['maxspeed:lanes:forward'], maxspeed);
30293             maxspeedLanes.backward = parseMaxspeedLanes(tags['maxspeed:lanes:backward'], maxspeed);
30294
30295             var psvLanes = {};
30296             psvLanes.unspecified = parseMiscLanes(tags['psv:lanes']);
30297             psvLanes.forward = parseMiscLanes(tags['psv:lanes:forward']);
30298             psvLanes.backward = parseMiscLanes(tags['psv:lanes:backward']);
30299
30300             var busLanes = {};
30301             busLanes.unspecified = parseMiscLanes(tags['bus:lanes']);
30302             busLanes.forward = parseMiscLanes(tags['bus:lanes:forward']);
30303             busLanes.backward = parseMiscLanes(tags['bus:lanes:backward']);
30304
30305             var taxiLanes = {};
30306             taxiLanes.unspecified = parseMiscLanes(tags['taxi:lanes']);
30307             taxiLanes.forward = parseMiscLanes(tags['taxi:lanes:forward']);
30308             taxiLanes.backward = parseMiscLanes(tags['taxi:lanes:backward']);
30309
30310             var hovLanes = {};
30311             hovLanes.unspecified = parseMiscLanes(tags['hov:lanes']);
30312             hovLanes.forward = parseMiscLanes(tags['hov:lanes:forward']);
30313             hovLanes.backward = parseMiscLanes(tags['hov:lanes:backward']);
30314
30315             var hgvLanes = {};
30316             hgvLanes.unspecified = parseMiscLanes(tags['hgv:lanes']);
30317             hgvLanes.forward = parseMiscLanes(tags['hgv:lanes:forward']);
30318             hgvLanes.backward = parseMiscLanes(tags['hgv:lanes:backward']);
30319
30320             var bicyclewayLanes = {};
30321             bicyclewayLanes.unspecified = parseBicycleWay(tags['bicycleway:lanes']);
30322             bicyclewayLanes.forward = parseBicycleWay(tags['bicycleway:lanes:forward']);
30323             bicyclewayLanes.backward = parseBicycleWay(tags['bicycleway:lanes:backward']);
30324
30325             var lanesObj = {
30326                 forward: [],
30327                 backward: [],
30328                 unspecified: []
30329             };
30330
30331             // map forward/backward/unspecified of each lane type to lanesObj
30332             mapToLanesObj(lanesObj, turnLanes, 'turnLane');
30333             mapToLanesObj(lanesObj, maxspeedLanes, 'maxspeed');
30334             mapToLanesObj(lanesObj, psvLanes, 'psv');
30335             mapToLanesObj(lanesObj, busLanes, 'bus');
30336             mapToLanesObj(lanesObj, taxiLanes, 'taxi');
30337             mapToLanesObj(lanesObj, hovLanes, 'hov');
30338             mapToLanesObj(lanesObj, hgvLanes, 'hgv');
30339             mapToLanesObj(lanesObj, bicyclewayLanes, 'bicycleway');
30340
30341             return {
30342                 metadata: {
30343                     count: laneCount,
30344                     oneway: isOneWay,
30345                     forward: forward,
30346                     backward: backward,
30347                     bothways: bothways,
30348                     turnLanes: turnLanes,
30349                     maxspeed: maxspeed,
30350                     maxspeedLanes: maxspeedLanes,
30351                     psvLanes: psvLanes,
30352                     busLanes: busLanes,
30353                     taxiLanes: taxiLanes,
30354                     hovLanes: hovLanes,
30355                     hgvLanes: hgvLanes,
30356                     bicyclewayLanes: bicyclewayLanes
30357                 },
30358                 lanes: lanesObj
30359             };
30360         }
30361
30362
30363         function getLaneCount(tags, isOneWay) {
30364             var count;
30365             if (tags.lanes) {
30366                 count = parseInt(tags.lanes, 10);
30367                 if (count > 0) {
30368                     return count;
30369                 }
30370             }
30371
30372
30373             switch (tags.highway) {
30374                 case 'trunk':
30375                 case 'motorway':
30376                     count = isOneWay ? 2 : 4;
30377                     break;
30378                 default:
30379                     count = isOneWay ? 1 : 2;
30380                     break;
30381             }
30382
30383             return count;
30384         }
30385
30386
30387         function parseMaxspeed(tags) {
30388             var maxspeed = tags.maxspeed;
30389             if (!maxspeed) return;
30390
30391             var maxspeedRegex = /^([0-9][\.0-9]+?)(?:[ ]?(?:km\/h|kmh|kph|mph|knots))?$/;
30392             if (!maxspeedRegex.test(maxspeed)) return;
30393
30394             return parseInt(maxspeed, 10);
30395         }
30396
30397
30398         function parseLaneDirections(tags, isOneWay, laneCount) {
30399             var forward = parseInt(tags['lanes:forward'], 10);
30400             var backward = parseInt(tags['lanes:backward'], 10);
30401             var bothways = parseInt(tags['lanes:both_ways'], 10) > 0 ? 1 : 0;
30402
30403             if (parseInt(tags.oneway, 10) === -1) {
30404                 forward = 0;
30405                 bothways = 0;
30406                 backward = laneCount;
30407             }
30408             else if (isOneWay) {
30409                 forward = laneCount;
30410                 bothways = 0;
30411                 backward = 0;
30412             }
30413             else if (isNaN(forward) && isNaN(backward)) {
30414                 backward = Math.floor((laneCount - bothways) / 2);
30415                 forward = laneCount - bothways - backward;
30416             }
30417             else if (isNaN(forward)) {
30418                 if (backward > laneCount - bothways) {
30419                     backward = laneCount - bothways;
30420                 }
30421                 forward = laneCount - bothways - backward;
30422             }
30423             else if (isNaN(backward)) {
30424                 if (forward > laneCount - bothways) {
30425                     forward = laneCount - bothways;
30426                 }
30427                 backward = laneCount - bothways - forward;
30428             }
30429             return {
30430                 forward: forward,
30431                 backward: backward,
30432                 bothways: bothways
30433             };
30434         }
30435
30436
30437         function parseTurnLanes(tag){
30438             if (!tag) return;
30439
30440             var validValues = [
30441                 'left', 'slight_left', 'sharp_left', 'through', 'right', 'slight_right',
30442                 'sharp_right', 'reverse', 'merge_to_left', 'merge_to_right', 'none'
30443             ];
30444
30445             return tag.split('|')
30446                 .map(function (s) {
30447                     if (s === '') s = 'none';
30448                     return s.split(';')
30449                         .map(function (d) {
30450                             return validValues.indexOf(d) === -1 ? 'unknown': d;
30451                         });
30452                 });
30453         }
30454
30455
30456         function parseMaxspeedLanes(tag, maxspeed) {
30457             if (!tag) return;
30458
30459             return tag.split('|')
30460                 .map(function (s) {
30461                     if (s === 'none') return s;
30462                     var m = parseInt(s, 10);
30463                     if (s === '' || m === maxspeed) return null;
30464                     return isNaN(m) ? 'unknown': m;
30465                 });
30466         }
30467
30468
30469         function parseMiscLanes(tag) {
30470             if (!tag) return;
30471
30472             var validValues = [
30473                 'yes', 'no', 'designated'
30474             ];
30475
30476             return tag.split('|')
30477                 .map(function (s) {
30478                     if (s === '') s = 'no';
30479                     return validValues.indexOf(s) === -1 ? 'unknown': s;
30480                 });
30481         }
30482
30483
30484         function parseBicycleWay(tag) {
30485             if (!tag) return;
30486
30487             var validValues = [
30488                 'yes', 'no', 'designated', 'lane'
30489             ];
30490
30491             return tag.split('|')
30492                 .map(function (s) {
30493                     if (s === '') s = 'no';
30494                     return validValues.indexOf(s) === -1 ? 'unknown': s;
30495                 });
30496         }
30497
30498
30499         function mapToLanesObj(lanesObj, data, key) {
30500             if (data.forward) data.forward.forEach(function(l, i) {
30501                 if (!lanesObj.forward[i]) lanesObj.forward[i] = {};
30502                 lanesObj.forward[i][key] = l;
30503             });
30504             if (data.backward) data.backward.forEach(function(l, i) {
30505                 if (!lanesObj.backward[i]) lanesObj.backward[i] = {};
30506                 lanesObj.backward[i][key] = l;
30507             });
30508             if (data.unspecified) data.unspecified.forEach(function(l, i) {
30509                 if (!lanesObj.unspecified[i]) lanesObj.unspecified[i] = {};
30510                 lanesObj.unspecified[i][key] = l;
30511             });
30512         }
30513
30514         function osmWay() {
30515             if (!(this instanceof osmWay)) {
30516                 return (new osmWay()).initialize(arguments);
30517             } else if (arguments.length) {
30518                 this.initialize(arguments);
30519             }
30520         }
30521
30522
30523         osmEntity.way = osmWay;
30524
30525         osmWay.prototype = Object.create(osmEntity.prototype);
30526
30527
30528         Object.assign(osmWay.prototype, {
30529             type: 'way',
30530             nodes: [],
30531
30532
30533             copy: function(resolver, copies) {
30534                 if (copies[this.id]) return copies[this.id];
30535
30536                 var copy = osmEntity.prototype.copy.call(this, resolver, copies);
30537
30538                 var nodes = this.nodes.map(function(id) {
30539                     return resolver.entity(id).copy(resolver, copies).id;
30540                 });
30541
30542                 copy = copy.update({ nodes: nodes });
30543                 copies[this.id] = copy;
30544
30545                 return copy;
30546             },
30547
30548
30549             extent: function(resolver) {
30550                 return resolver.transient(this, 'extent', function() {
30551                     var extent = geoExtent();
30552                     for (var i = 0; i < this.nodes.length; i++) {
30553                         var node = resolver.hasEntity(this.nodes[i]);
30554                         if (node) {
30555                             extent._extend(node.extent());
30556                         }
30557                     }
30558                     return extent;
30559                 });
30560             },
30561
30562
30563             first: function() {
30564                 return this.nodes[0];
30565             },
30566
30567
30568             last: function() {
30569                 return this.nodes[this.nodes.length - 1];
30570             },
30571
30572
30573             contains: function(node) {
30574                 return this.nodes.indexOf(node) >= 0;
30575             },
30576
30577
30578             affix: function(node) {
30579                 if (this.nodes[0] === node) return 'prefix';
30580                 if (this.nodes[this.nodes.length - 1] === node) return 'suffix';
30581             },
30582
30583
30584             layer: function() {
30585                 // explicit layer tag, clamp between -10, 10..
30586                 if (isFinite(this.tags.layer)) {
30587                     return Math.max(-10, Math.min(+(this.tags.layer), 10));
30588                 }
30589
30590                 // implied layer tag..
30591                 if (this.tags.covered === 'yes') return -1;
30592                 if (this.tags.location === 'overground') return 1;
30593                 if (this.tags.location === 'underground') return -1;
30594                 if (this.tags.location === 'underwater') return -10;
30595
30596                 if (this.tags.power === 'line') return 10;
30597                 if (this.tags.power === 'minor_line') return 10;
30598                 if (this.tags.aerialway) return 10;
30599                 if (this.tags.bridge) return 1;
30600                 if (this.tags.cutting) return -1;
30601                 if (this.tags.tunnel) return -1;
30602                 if (this.tags.waterway) return -1;
30603                 if (this.tags.man_made === 'pipeline') return -10;
30604                 if (this.tags.boundary) return -10;
30605                 return 0;
30606             },
30607
30608
30609             isOneWay: function() {
30610                 // explicit oneway tag..
30611                 var values = {
30612                     'yes': true,
30613                     '1': true,
30614                     '-1': true,
30615                     'reversible': true,
30616                     'alternating': true,
30617                     'no': false,
30618                     '0': false
30619                 };
30620                 if (values[this.tags.oneway] !== undefined) {
30621                     return values[this.tags.oneway];
30622                 }
30623
30624                 // implied oneway tag..
30625                 for (var key in this.tags) {
30626                     if (key in osmOneWayTags && (this.tags[key] in osmOneWayTags[key]))
30627                         return true;
30628                 }
30629                 return false;
30630             },
30631
30632             // Some identifier for tag that implies that this way is "sided",
30633             // i.e. the right side is the 'inside' (e.g. the right side of a
30634             // natural=cliff is lower).
30635             sidednessIdentifier: function() {
30636                 for (var key in this.tags) {
30637                     var value = this.tags[key];
30638                     if (key in osmRightSideIsInsideTags && (value in osmRightSideIsInsideTags[key])) {
30639                         if (osmRightSideIsInsideTags[key][value] === true) {
30640                             return key;
30641                         } else {
30642                             // if the map's value is something other than a
30643                             // literal true, we should use it so we can
30644                             // special case some keys (e.g. natural=coastline
30645                             // is handled differently to other naturals).
30646                             return osmRightSideIsInsideTags[key][value];
30647                         }
30648                     }
30649                 }
30650
30651                 return null;
30652             },
30653
30654             isSided: function() {
30655                 if (this.tags.two_sided === 'yes') {
30656                     return false;
30657                 }
30658
30659                 return this.sidednessIdentifier() !== null;
30660             },
30661
30662             lanes: function() {
30663                 return osmLanes(this);
30664             },
30665
30666
30667             isClosed: function() {
30668                 return this.nodes.length > 1 && this.first() === this.last();
30669             },
30670
30671
30672             isConvex: function(resolver) {
30673                 if (!this.isClosed() || this.isDegenerate()) return null;
30674
30675                 var nodes = utilArrayUniq(resolver.childNodes(this));
30676                 var coords = nodes.map(function(n) { return n.loc; });
30677                 var curr = 0;
30678                 var prev = 0;
30679
30680                 for (var i = 0; i < coords.length; i++) {
30681                     var o = coords[(i+1) % coords.length];
30682                     var a = coords[i];
30683                     var b = coords[(i+2) % coords.length];
30684                     var res = geoVecCross(a, b, o);
30685
30686                     curr = (res > 0) ? 1 : (res < 0) ? -1 : 0;
30687                     if (curr === 0) {
30688                         continue;
30689                     } else if (prev && curr !== prev) {
30690                         return false;
30691                     }
30692                     prev = curr;
30693                 }
30694                 return true;
30695             },
30696
30697             // returns an object with the tag that implies this is an area, if any
30698             tagSuggestingArea: function() {
30699                 if (this.tags.area === 'yes') return { area: 'yes' };
30700                 if (this.tags.area === 'no') return null;
30701
30702                 // `highway` and `railway` are typically linear features, but there
30703                 // are a few exceptions that should be treated as areas, even in the
30704                 // absence of a proper `area=yes` or `areaKeys` tag.. see #4194
30705                 var lineKeys = {
30706                     highway: {
30707                         rest_area: true,
30708                         services: true
30709                     },
30710                     railway: {
30711                         roundhouse: true,
30712                         station: true,
30713                         traverser: true,
30714                         turntable: true,
30715                         wash: true
30716                     }
30717                 };
30718                 var returnTags = {};
30719                 for (var key in this.tags) {
30720                     if (key in osmAreaKeys && !(this.tags[key] in osmAreaKeys[key])) {
30721                         returnTags[key] = this.tags[key];
30722                         return returnTags;
30723                     }
30724                     if (key in lineKeys && this.tags[key] in lineKeys[key]) {
30725                         returnTags[key] = this.tags[key];
30726                         return returnTags;
30727                     }
30728                 }
30729                 return null;
30730             },
30731
30732             isArea: function() {
30733                 if (this.tags.area === 'yes')
30734                     return true;
30735                 if (!this.isClosed() || this.tags.area === 'no')
30736                     return false;
30737                 return this.tagSuggestingArea() !== null;
30738             },
30739
30740
30741             isDegenerate: function() {
30742                 return (new Set(this.nodes).size < (this.isArea() ? 3 : 2));
30743             },
30744
30745
30746             areAdjacent: function(n1, n2) {
30747                 for (var i = 0; i < this.nodes.length; i++) {
30748                     if (this.nodes[i] === n1) {
30749                         if (this.nodes[i - 1] === n2) return true;
30750                         if (this.nodes[i + 1] === n2) return true;
30751                     }
30752                 }
30753                 return false;
30754             },
30755
30756
30757             geometry: function(graph) {
30758                 return graph.transient(this, 'geometry', function() {
30759                     return this.isArea() ? 'area' : 'line';
30760                 });
30761             },
30762
30763
30764             // If this way is not closed, append the beginning node to the end of the nodelist to close it.
30765             close: function() {
30766                 if (this.isClosed() || !this.nodes.length) return this;
30767
30768                 var nodes = this.nodes.slice();
30769                 nodes = nodes.filter(noRepeatNodes);
30770                 nodes.push(nodes[0]);
30771                 return this.update({ nodes: nodes });
30772             },
30773
30774
30775             // If this way is closed, remove any connector nodes from the end of the nodelist to unclose it.
30776             unclose: function() {
30777                 if (!this.isClosed()) return this;
30778
30779                 var nodes = this.nodes.slice();
30780                 var connector = this.first();
30781                 var i = nodes.length - 1;
30782
30783                 // remove trailing connectors..
30784                 while (i > 0 && nodes.length > 1 && nodes[i] === connector) {
30785                     nodes.splice(i, 1);
30786                     i = nodes.length - 1;
30787                 }
30788
30789                 nodes = nodes.filter(noRepeatNodes);
30790                 return this.update({ nodes: nodes });
30791             },
30792
30793
30794             // Adds a node (id) in front of the node which is currently at position index.
30795             // If index is undefined, the node will be added to the end of the way for linear ways,
30796             //   or just before the final connecting node for circular ways.
30797             // Consecutive duplicates are eliminated including existing ones.
30798             // Circularity is always preserved when adding a node.
30799             addNode: function(id, index) {
30800                 var nodes = this.nodes.slice();
30801                 var isClosed = this.isClosed();
30802                 var max = isClosed ? nodes.length - 1 : nodes.length;
30803
30804                 if (index === undefined) {
30805                     index = max;
30806                 }
30807
30808                 if (index < 0 || index > max) {
30809                     throw new RangeError('index ' + index + ' out of range 0..' + max);
30810                 }
30811
30812                 // If this is a closed way, remove all connector nodes except the first one
30813                 // (there may be duplicates) and adjust index if necessary..
30814                 if (isClosed) {
30815                     var connector = this.first();
30816
30817                     // leading connectors..
30818                     var i = 1;
30819                     while (i < nodes.length && nodes.length > 2 && nodes[i] === connector) {
30820                         nodes.splice(i, 1);
30821                         if (index > i) index--;
30822                     }
30823
30824                     // trailing connectors..
30825                     i = nodes.length - 1;
30826                     while (i > 0 && nodes.length > 1 && nodes[i] === connector) {
30827                         nodes.splice(i, 1);
30828                         if (index > i) index--;
30829                         i = nodes.length - 1;
30830                     }
30831                 }
30832
30833                 nodes.splice(index, 0, id);
30834                 nodes = nodes.filter(noRepeatNodes);
30835
30836                 // If the way was closed before, append a connector node to keep it closed..
30837                 if (isClosed && (nodes.length === 1 || nodes[0] !== nodes[nodes.length - 1])) {
30838                     nodes.push(nodes[0]);
30839                 }
30840
30841                 return this.update({ nodes: nodes });
30842             },
30843
30844
30845             // Replaces the node which is currently at position index with the given node (id).
30846             // Consecutive duplicates are eliminated including existing ones.
30847             // Circularity is preserved when updating a node.
30848             updateNode: function(id, index) {
30849                 var nodes = this.nodes.slice();
30850                 var isClosed = this.isClosed();
30851                 var max = nodes.length - 1;
30852
30853                 if (index === undefined || index < 0 || index > max) {
30854                     throw new RangeError('index ' + index + ' out of range 0..' + max);
30855                 }
30856
30857                 // If this is a closed way, remove all connector nodes except the first one
30858                 // (there may be duplicates) and adjust index if necessary..
30859                 if (isClosed) {
30860                     var connector = this.first();
30861
30862                     // leading connectors..
30863                     var i = 1;
30864                     while (i < nodes.length && nodes.length > 2 && nodes[i] === connector) {
30865                         nodes.splice(i, 1);
30866                         if (index > i) index--;
30867                     }
30868
30869                     // trailing connectors..
30870                     i = nodes.length - 1;
30871                     while (i > 0 && nodes.length > 1 && nodes[i] === connector) {
30872                         nodes.splice(i, 1);
30873                         if (index === i) index = 0;  // update leading connector instead
30874                         i = nodes.length - 1;
30875                     }
30876                 }
30877
30878                 nodes.splice(index, 1, id);
30879                 nodes = nodes.filter(noRepeatNodes);
30880
30881                 // If the way was closed before, append a connector node to keep it closed..
30882                 if (isClosed && (nodes.length === 1 || nodes[0] !== nodes[nodes.length - 1])) {
30883                     nodes.push(nodes[0]);
30884                 }
30885
30886                 return this.update({nodes: nodes});
30887             },
30888
30889
30890             // Replaces each occurrence of node id needle with replacement.
30891             // Consecutive duplicates are eliminated including existing ones.
30892             // Circularity is preserved.
30893             replaceNode: function(needleID, replacementID) {
30894                 var nodes = this.nodes.slice();
30895                 var isClosed = this.isClosed();
30896
30897                 for (var i = 0; i < nodes.length; i++) {
30898                     if (nodes[i] === needleID) {
30899                         nodes[i] = replacementID;
30900                     }
30901                 }
30902
30903                 nodes = nodes.filter(noRepeatNodes);
30904
30905                 // If the way was closed before, append a connector node to keep it closed..
30906                 if (isClosed && (nodes.length === 1 || nodes[0] !== nodes[nodes.length - 1])) {
30907                     nodes.push(nodes[0]);
30908                 }
30909
30910                 return this.update({nodes: nodes});
30911             },
30912
30913
30914             // Removes each occurrence of node id.
30915             // Consecutive duplicates are eliminated including existing ones.
30916             // Circularity is preserved.
30917             removeNode: function(id) {
30918                 var nodes = this.nodes.slice();
30919                 var isClosed = this.isClosed();
30920
30921                 nodes = nodes
30922                     .filter(function(node) { return node !== id; })
30923                     .filter(noRepeatNodes);
30924
30925                 // If the way was closed before, append a connector node to keep it closed..
30926                 if (isClosed && (nodes.length === 1 || nodes[0] !== nodes[nodes.length - 1])) {
30927                     nodes.push(nodes[0]);
30928                 }
30929
30930                 return this.update({nodes: nodes});
30931             },
30932
30933
30934             asJXON: function(changeset_id) {
30935                 var r = {
30936                     way: {
30937                         '@id': this.osmId(),
30938                         '@version': this.version || 0,
30939                         nd: this.nodes.map(function(id) {
30940                             return { keyAttributes: { ref: osmEntity.id.toOSM(id) } };
30941                         }, this),
30942                         tag: Object.keys(this.tags).map(function(k) {
30943                             return { keyAttributes: { k: k, v: this.tags[k] } };
30944                         }, this)
30945                     }
30946                 };
30947                 if (changeset_id) {
30948                     r.way['@changeset'] = changeset_id;
30949                 }
30950                 return r;
30951             },
30952
30953
30954             asGeoJSON: function(resolver) {
30955                 return resolver.transient(this, 'GeoJSON', function() {
30956                     var coordinates = resolver.childNodes(this)
30957                         .map(function(n) { return n.loc; });
30958
30959                     if (this.isArea() && this.isClosed()) {
30960                         return {
30961                             type: 'Polygon',
30962                             coordinates: [coordinates]
30963                         };
30964                     } else {
30965                         return {
30966                             type: 'LineString',
30967                             coordinates: coordinates
30968                         };
30969                     }
30970                 });
30971             },
30972
30973
30974             area: function(resolver) {
30975                 return resolver.transient(this, 'area', function() {
30976                     var nodes = resolver.childNodes(this);
30977
30978                     var json = {
30979                         type: 'Polygon',
30980                         coordinates: [ nodes.map(function(n) { return n.loc; }) ]
30981                     };
30982
30983                     if (!this.isClosed() && nodes.length) {
30984                         json.coordinates[0].push(nodes[0].loc);
30985                     }
30986
30987                     var area = d3_geoArea(json);
30988
30989                     // Heuristic for detecting counterclockwise winding order. Assumes
30990                     // that OpenStreetMap polygons are not hemisphere-spanning.
30991                     if (area > 2 * Math.PI) {
30992                         json.coordinates[0] = json.coordinates[0].reverse();
30993                         area = d3_geoArea(json);
30994                     }
30995
30996                     return isNaN(area) ? 0 : area;
30997                 });
30998             }
30999         });
31000
31001
31002         // Filter function to eliminate consecutive duplicates.
31003         function noRepeatNodes(node, i, arr) {
31004             return i === 0 || node !== arr[i - 1];
31005         }
31006
31007         // "Old" multipolyons, previously known as "simple" multipolygons, are as follows:
31008         //
31009         // 1. Relation tagged with `type=multipolygon` and no interesting tags.
31010         // 2. One and only one member with the `outer` role. Must be a way with interesting tags.
31011         // 3. No members without a role.
31012         //
31013         // Old multipolygons are no longer recommended but are still rendered as areas by iD.
31014
31015         function osmOldMultipolygonOuterMemberOfRelation(entity, graph) {
31016             if (entity.type !== 'relation' ||
31017                 !entity.isMultipolygon()
31018                 || Object.keys(entity.tags).filter(osmIsInterestingTag).length > 1) {
31019                 return false;
31020             }
31021
31022             var outerMember;
31023             for (var memberIndex in entity.members) {
31024                 var member = entity.members[memberIndex];
31025                 if (!member.role || member.role === 'outer') {
31026                     if (outerMember) return false;
31027                     if (member.type !== 'way') return false;
31028                     if (!graph.hasEntity(member.id)) return false;
31029
31030                     outerMember = graph.entity(member.id);
31031
31032                     if (Object.keys(outerMember.tags).filter(osmIsInterestingTag).length === 0) {
31033                         return false;
31034                     }
31035                 }
31036             }
31037
31038             return outerMember;
31039         }
31040
31041         // For fixing up rendering of multipolygons with tags on the outer member.
31042         // https://github.com/openstreetmap/iD/issues/613
31043         function osmIsOldMultipolygonOuterMember(entity, graph) {
31044             if (entity.type !== 'way' || Object.keys(entity.tags).filter(osmIsInterestingTag).length === 0)
31045                 return false;
31046
31047             var parents = graph.parentRelations(entity);
31048             if (parents.length !== 1)
31049                 return false;
31050
31051             var parent = parents[0];
31052             if (!parent.isMultipolygon() || Object.keys(parent.tags).filter(osmIsInterestingTag).length > 1)
31053                 return false;
31054
31055             var members = parent.members, member;
31056             for (var i = 0; i < members.length; i++) {
31057                 member = members[i];
31058                 if (member.id === entity.id && member.role && member.role !== 'outer')
31059                     return false; // Not outer member
31060                 if (member.id !== entity.id && (!member.role || member.role === 'outer'))
31061                     return false; // Not a simple multipolygon
31062             }
31063
31064             return parent;
31065         }
31066
31067
31068         function osmOldMultipolygonOuterMember(entity, graph) {
31069             if (entity.type !== 'way')
31070                 return false;
31071
31072             var parents = graph.parentRelations(entity);
31073             if (parents.length !== 1)
31074                 return false;
31075
31076             var parent = parents[0];
31077             if (!parent.isMultipolygon() || Object.keys(parent.tags).filter(osmIsInterestingTag).length > 1)
31078                 return false;
31079
31080             var members = parent.members, member, outerMember;
31081             for (var i = 0; i < members.length; i++) {
31082                 member = members[i];
31083                 if (!member.role || member.role === 'outer') {
31084                     if (outerMember)
31085                         return false; // Not a simple multipolygon
31086                     outerMember = member;
31087                 }
31088             }
31089
31090             if (!outerMember)
31091                 return false;
31092
31093             var outerEntity = graph.hasEntity(outerMember.id);
31094             if (!outerEntity || !Object.keys(outerEntity.tags).filter(osmIsInterestingTag).length)
31095                 return false;
31096
31097             return outerEntity;
31098         }
31099
31100
31101         // Join `toJoin` array into sequences of connecting ways.
31102
31103         // Segments which share identical start/end nodes will, as much as possible,
31104         // be connected with each other.
31105         //
31106         // The return value is a nested array. Each constituent array contains elements
31107         // of `toJoin` which have been determined to connect.
31108         //
31109         // Each consitituent array also has a `nodes` property whose value is an
31110         // ordered array of member nodes, with appropriate order reversal and
31111         // start/end coordinate de-duplication.
31112         //
31113         // Members of `toJoin` must have, at minimum, `type` and `id` properties.
31114         // Thus either an array of `osmWay`s or a relation member array may be used.
31115         //
31116         // If an member is an `osmWay`, its tags and childnodes may be reversed via
31117         // `actionReverse` in the output.
31118         //
31119         // The returned sequences array also has an `actions` array property, containing
31120         // any reversal actions that should be applied to the graph, should the calling
31121         // code attempt to actually join the given ways.
31122         //
31123         // Incomplete members (those for which `graph.hasEntity(element.id)` returns
31124         // false) and non-way members are ignored.
31125         //
31126         function osmJoinWays(toJoin, graph) {
31127             function resolve(member) {
31128                 return graph.childNodes(graph.entity(member.id));
31129             }
31130
31131             function reverse(item) {
31132                 var action = actionReverse(item.id, { reverseOneway: true });
31133                 sequences.actions.push(action);
31134                 return (item instanceof osmWay) ? action(graph).entity(item.id) : item;
31135             }
31136
31137             // make a copy containing only the items to join
31138             toJoin = toJoin.filter(function(member) {
31139                 return member.type === 'way' && graph.hasEntity(member.id);
31140             });
31141
31142             // Are the things we are joining relation members or `osmWays`?
31143             // If `osmWays`, skip the "prefer a forward path" code below (see #4872)
31144             var i;
31145             var joinAsMembers = true;
31146             for (i = 0; i < toJoin.length; i++) {
31147                 if (toJoin[i] instanceof osmWay) {
31148                     joinAsMembers = false;
31149                     break;
31150                 }
31151             }
31152
31153             var sequences = [];
31154             sequences.actions = [];
31155
31156             while (toJoin.length) {
31157                 // start a new sequence
31158                 var item = toJoin.shift();
31159                 var currWays = [item];
31160                 var currNodes = resolve(item).slice();
31161                 var doneSequence = false;
31162
31163                 // add to it
31164                 while (toJoin.length && !doneSequence) {
31165                     var start = currNodes[0];
31166                     var end = currNodes[currNodes.length - 1];
31167                     var fn = null;
31168                     var nodes = null;
31169
31170                     // Find the next way/member to join.
31171                     for (i = 0; i < toJoin.length; i++) {
31172                         item = toJoin[i];
31173                         nodes = resolve(item);
31174
31175                         // (for member ordering only, not way ordering - see #4872)
31176                         // Strongly prefer to generate a forward path that preserves the order
31177                         // of the members array. For multipolygons and most relations, member
31178                         // order does not matter - but for routes, it does. (see #4589)
31179                         // If we started this sequence backwards (i.e. next member way attaches to
31180                         // the start node and not the end node), reverse the initial way before continuing.
31181                         if (joinAsMembers && currWays.length === 1 && nodes[0] !== end && nodes[nodes.length - 1] !== end &&
31182                             (nodes[nodes.length - 1] === start || nodes[0] === start)
31183                         ) {
31184                             currWays[0] = reverse(currWays[0]);
31185                             currNodes.reverse();
31186                             start = currNodes[0];
31187                             end = currNodes[currNodes.length - 1];
31188                         }
31189
31190                         if (nodes[0] === end) {
31191                             fn = currNodes.push;               // join to end
31192                             nodes = nodes.slice(1);
31193                             break;
31194                         } else if (nodes[nodes.length - 1] === end) {
31195                             fn = currNodes.push;               // join to end
31196                             nodes = nodes.slice(0, -1).reverse();
31197                             item = reverse(item);
31198                             break;
31199                         } else if (nodes[nodes.length - 1] === start) {
31200                             fn = currNodes.unshift;            // join to beginning
31201                             nodes = nodes.slice(0, -1);
31202                             break;
31203                         } else if (nodes[0] === start) {
31204                             fn = currNodes.unshift;            // join to beginning
31205                             nodes = nodes.slice(1).reverse();
31206                             item = reverse(item);
31207                             break;
31208                         } else {
31209                             fn = nodes = null;
31210                         }
31211                     }
31212
31213                     if (!nodes) {     // couldn't find a joinable way/member
31214                         doneSequence = true;
31215                         break;
31216                     }
31217
31218                     fn.apply(currWays, [item]);
31219                     fn.apply(currNodes, nodes);
31220
31221                     toJoin.splice(i, 1);
31222                 }
31223
31224                 currWays.nodes = currNodes;
31225                 sequences.push(currWays);
31226             }
31227
31228             return sequences;
31229         }
31230
31231         function actionAddMember(relationId, member, memberIndex, insertPair) {
31232
31233             return function action(graph) {
31234                 var relation = graph.entity(relationId);
31235
31236                 // There are some special rules for Public Transport v2 routes.
31237                 var isPTv2 = /stop|platform/.test(member.role);
31238
31239                 if ((isNaN(memberIndex) || insertPair) && member.type === 'way' && !isPTv2) {
31240                     // Try to perform sensible inserts based on how the ways join together
31241                     graph = addWayMember(relation, graph);
31242                 } else {
31243                     // see https://wiki.openstreetmap.org/wiki/Public_transport#Service_routes
31244                     // Stops and Platforms for PTv2 should be ordered first.
31245                     // hack: We do not currently have the ability to place them in the exactly correct order.
31246                     if (isPTv2 && isNaN(memberIndex)) {
31247                         memberIndex = 0;
31248                     }
31249
31250                     graph = graph.replace(relation.addMember(member, memberIndex));
31251                 }
31252
31253                 return graph;
31254             };
31255
31256
31257             // Add a way member into the relation "wherever it makes sense".
31258             // In this situation we were not supplied a memberIndex.
31259             function addWayMember(relation, graph) {
31260                 var groups, tempWay, item, i, j, k;
31261
31262                 // remove PTv2 stops and platforms before doing anything.
31263                 var PTv2members = [];
31264                 var members = [];
31265                 for (i = 0; i < relation.members.length; i++) {
31266                     var m = relation.members[i];
31267                     if (/stop|platform/.test(m.role)) {
31268                         PTv2members.push(m);
31269                     } else {
31270                         members.push(m);
31271                     }
31272                 }
31273                 relation = relation.update({ members: members });
31274
31275
31276                 if (insertPair) {
31277                     // We're adding a member that must stay paired with an existing member.
31278                     // (This feature is used by `actionSplit`)
31279                     //
31280                     // This is tricky because the members may exist multiple times in the
31281                     // member list, and with different A-B/B-A ordering and different roles.
31282                     // (e.g. a bus route that loops out and back - #4589).
31283                     //
31284                     // Replace the existing member with a temporary way,
31285                     // so that `osmJoinWays` can treat the pair like a single way.
31286                     tempWay = osmWay({ id: 'wTemp', nodes: insertPair.nodes });
31287                     graph = graph.replace(tempWay);
31288                     var tempMember = { id: tempWay.id, type: 'way', role: member.role };
31289                     var tempRelation = relation.replaceMember({id: insertPair.originalID}, tempMember, true);
31290                     groups = utilArrayGroupBy(tempRelation.members, 'type');
31291                     groups.way = groups.way || [];
31292
31293                 } else {
31294                     // Add the member anywhere, one time. Just push and let `osmJoinWays` decide where to put it.
31295                     groups = utilArrayGroupBy(relation.members, 'type');
31296                     groups.way = groups.way || [];
31297                     groups.way.push(member);
31298                 }
31299
31300                 members = withIndex(groups.way);
31301                 var joined = osmJoinWays(members, graph);
31302
31303                 // `joined` might not contain all of the way members,
31304                 // But will contain only the completed (downloaded) members
31305                 for (i = 0; i < joined.length; i++) {
31306                     var segment = joined[i];
31307                     var nodes = segment.nodes.slice();
31308                     var startIndex = segment[0].index;
31309
31310                     // j = array index in `members` where this segment starts
31311                     for (j = 0; j < members.length; j++) {
31312                         if (members[j].index === startIndex) {
31313                             break;
31314                         }
31315                     }
31316
31317                     // k = each member in segment
31318                     for (k = 0; k < segment.length; k++) {
31319                         item = segment[k];
31320                         var way = graph.entity(item.id);
31321
31322                         // If this is a paired item, generate members in correct order and role
31323                         if (tempWay && item.id === tempWay.id) {
31324                             if (nodes[0].id === insertPair.nodes[0]) {
31325                                 item.pair = [
31326                                     { id: insertPair.originalID, type: 'way', role: item.role },
31327                                     { id: insertPair.insertedID, type: 'way', role: item.role }
31328                                 ];
31329                             } else {
31330                                 item.pair = [
31331                                     { id: insertPair.insertedID, type: 'way', role: item.role },
31332                                     { id: insertPair.originalID, type: 'way', role: item.role }
31333                                 ];
31334                             }
31335                         }
31336
31337                         // reorder `members` if necessary
31338                         if (k > 0) {
31339                             if (j+k >= members.length || item.index !== members[j+k].index) {
31340                                 moveMember(members, item.index, j+k);
31341                             }
31342                         }
31343
31344                         nodes.splice(0, way.nodes.length - 1);
31345                     }
31346                 }
31347
31348                 if (tempWay) {
31349                     graph = graph.remove(tempWay);
31350                 }
31351
31352                 // Final pass: skip dead items, split pairs, remove index properties
31353                 var wayMembers = [];
31354                 for (i = 0; i < members.length; i++) {
31355                     item = members[i];
31356                     if (item.index === -1) continue;
31357
31358                     if (item.pair) {
31359                         wayMembers.push(item.pair[0]);
31360                         wayMembers.push(item.pair[1]);
31361                     } else {
31362                         wayMembers.push(utilObjectOmit(item, ['index']));
31363                     }
31364                 }
31365
31366                 // Put stops and platforms first, then nodes, ways, relations
31367                 // This is recommended for Public Transport v2 routes:
31368                 // see https://wiki.openstreetmap.org/wiki/Public_transport#Service_routes
31369                 var newMembers = PTv2members.concat( (groups.node || []), wayMembers, (groups.relation || []) );
31370
31371                 return graph.replace(relation.update({ members: newMembers }));
31372
31373
31374                 // `moveMember()` changes the `members` array in place by splicing
31375                 // the item with `.index = findIndex` to where it belongs,
31376                 // and marking the old position as "dead" with `.index = -1`
31377                 //
31378                 // j=5, k=0                jk
31379                 // segment                 5 4 7 6
31380                 // members       0 1 2 3 4 5 6 7 8 9        keep 5 in j+k
31381                 //
31382                 // j=5, k=1                j k
31383                 // segment                 5 4 7 6
31384                 // members       0 1 2 3 4 5 6 7 8 9        move 4 to j+k
31385                 // members       0 1 2 3 x 5 4 6 7 8 9      moved
31386                 //
31387                 // j=5, k=2                j   k
31388                 // segment                 5 4 7 6
31389                 // members       0 1 2 3 x 5 4 6 7 8 9      move 7 to j+k
31390                 // members       0 1 2 3 x 5 4 7 6 x 8 9    moved
31391                 //
31392                 // j=5, k=3                j     k
31393                 // segment                 5 4 7 6
31394                 // members       0 1 2 3 x 5 4 7 6 x 8 9    keep 6 in j+k
31395                 //
31396                 function moveMember(arr, findIndex, toIndex) {
31397                     for (var i = 0; i < arr.length; i++) {
31398                         if (arr[i].index === findIndex) {
31399                             break;
31400                         }
31401                     }
31402
31403                     var item = Object.assign({}, arr[i]);   // shallow copy
31404                     arr[i].index = -1;   // mark as dead
31405                     item.index = toIndex;
31406                     arr.splice(toIndex, 0, item);
31407                 }
31408
31409
31410                 // This is the same as `Relation.indexedMembers`,
31411                 // Except we don't want to index all the members, only the ways
31412                 function withIndex(arr) {
31413                     var result = new Array(arr.length);
31414                     for (var i = 0; i < arr.length; i++) {
31415                         result[i] = Object.assign({}, arr[i]);   // shallow copy
31416                         result[i].index = i;
31417                     }
31418                     return result;
31419                 }
31420             }
31421
31422         }
31423
31424         function actionAddMidpoint(midpoint, node) {
31425             return function(graph) {
31426                 graph = graph.replace(node.move(midpoint.loc));
31427
31428                 var parents = utilArrayIntersection(
31429                     graph.parentWays(graph.entity(midpoint.edge[0])),
31430                     graph.parentWays(graph.entity(midpoint.edge[1]))
31431                 );
31432
31433                 parents.forEach(function(way) {
31434                     for (var i = 0; i < way.nodes.length - 1; i++) {
31435                         if (geoEdgeEqual([way.nodes[i], way.nodes[i + 1]], midpoint.edge)) {
31436                             graph = graph.replace(graph.entity(way.id).addNode(node.id, i + 1));
31437
31438                             // Add only one midpoint on doubled-back segments,
31439                             // turning them into self-intersections.
31440                             return;
31441                         }
31442                     }
31443                 });
31444
31445                 return graph;
31446             };
31447         }
31448
31449         // https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/AddNodeToWayAction.as
31450         function actionAddVertex(wayId, nodeId, index) {
31451             return function(graph) {
31452                 return graph.replace(graph.entity(wayId).addNode(nodeId, index));
31453             };
31454         }
31455
31456         function actionChangeMember(relationId, member, memberIndex) {
31457             return function(graph) {
31458                 return graph.replace(graph.entity(relationId).updateMember(member, memberIndex));
31459             };
31460         }
31461
31462         function actionChangePreset(entityID, oldPreset, newPreset, skipFieldDefaults) {
31463             return function action(graph) {
31464                 var entity = graph.entity(entityID);
31465                 var geometry = entity.geometry(graph);
31466                 var tags = entity.tags;
31467
31468                 if (oldPreset) tags = oldPreset.unsetTags(tags, geometry);
31469                 if (newPreset) tags = newPreset.setTags(tags, geometry, skipFieldDefaults);
31470
31471                 return graph.replace(entity.update({tags: tags}));
31472             };
31473         }
31474
31475         function actionChangeTags(entityId, tags) {
31476             return function(graph) {
31477                 var entity = graph.entity(entityId);
31478                 return graph.replace(entity.update({tags: tags}));
31479             };
31480         }
31481
31482         function osmNode() {
31483             if (!(this instanceof osmNode)) {
31484                 return (new osmNode()).initialize(arguments);
31485             } else if (arguments.length) {
31486                 this.initialize(arguments);
31487             }
31488         }
31489
31490         osmEntity.node = osmNode;
31491
31492         osmNode.prototype = Object.create(osmEntity.prototype);
31493
31494         Object.assign(osmNode.prototype, {
31495             type: 'node',
31496             loc: [9999, 9999],
31497
31498             extent: function() {
31499                 return new geoExtent(this.loc);
31500             },
31501
31502
31503             geometry: function(graph) {
31504                 return graph.transient(this, 'geometry', function() {
31505                     return graph.isPoi(this) ? 'point' : 'vertex';
31506                 });
31507             },
31508
31509
31510             move: function(loc) {
31511                 return this.update({loc: loc});
31512             },
31513
31514
31515             isDegenerate: function() {
31516                 return !(
31517                     Array.isArray(this.loc) && this.loc.length === 2 &&
31518                     this.loc[0] >= -180 && this.loc[0] <= 180 &&
31519                     this.loc[1] >= -90 && this.loc[1] <= 90
31520                 );
31521             },
31522
31523
31524             // Inspect tags and geometry to determine which direction(s) this node/vertex points
31525             directions: function(resolver, projection) {
31526                 var val;
31527                 var i;
31528
31529                 // which tag to use?
31530                 if (this.isHighwayIntersection(resolver) && (this.tags.stop || '').toLowerCase() === 'all') {
31531                     // all-way stop tag on a highway intersection
31532                     val = 'all';
31533                 } else {
31534                     // generic direction tag
31535                     val = (this.tags.direction || '').toLowerCase();
31536
31537                     // better suffix-style direction tag
31538                     var re = /:direction$/i;
31539                     var keys = Object.keys(this.tags);
31540                     for (i = 0; i < keys.length; i++) {
31541                         if (re.test(keys[i])) {
31542                             val = this.tags[keys[i]].toLowerCase();
31543                             break;
31544                         }
31545                     }
31546                 }
31547
31548                 if (val === '') return [];
31549
31550                 var cardinal = {
31551                     north: 0,               n: 0,
31552                     northnortheast: 22,     nne: 22,
31553                     northeast: 45,          ne: 45,
31554                     eastnortheast: 67,      ene: 67,
31555                     east: 90,               e: 90,
31556                     eastsoutheast: 112,     ese: 112,
31557                     southeast: 135,         se: 135,
31558                     southsoutheast: 157,    sse: 157,
31559                     south: 180,             s: 180,
31560                     southsouthwest: 202,    ssw: 202,
31561                     southwest: 225,         sw: 225,
31562                     westsouthwest: 247,     wsw: 247,
31563                     west: 270,              w: 270,
31564                     westnorthwest: 292,     wnw: 292,
31565                     northwest: 315,         nw: 315,
31566                     northnorthwest: 337,    nnw: 337
31567                 };
31568
31569
31570                 var values = val.split(';');
31571                 var results = [];
31572
31573                 values.forEach(function(v) {
31574                     // swap cardinal for numeric directions
31575                     if (cardinal[v] !== undefined) {
31576                         v = cardinal[v];
31577                     }
31578
31579                     // numeric direction - just add to results
31580                     if (v !== '' && !isNaN(+v)) {
31581                         results.push(+v);
31582                         return;
31583                     }
31584
31585                     // string direction - inspect parent ways
31586                     var lookBackward =
31587                         (this.tags['traffic_sign:backward'] || v === 'backward' || v === 'both' || v === 'all');
31588                     var lookForward =
31589                         (this.tags['traffic_sign:forward'] || v === 'forward' || v === 'both' || v === 'all');
31590
31591                     if (!lookForward && !lookBackward) return;
31592
31593                     var nodeIds = {};
31594                     resolver.parentWays(this).forEach(function(parent) {
31595                         var nodes = parent.nodes;
31596                         for (i = 0; i < nodes.length; i++) {
31597                             if (nodes[i] === this.id) {  // match current entity
31598                                 if (lookForward && i > 0) {
31599                                     nodeIds[nodes[i - 1]] = true;  // look back to prev node
31600                                 }
31601                                 if (lookBackward && i < nodes.length - 1) {
31602                                     nodeIds[nodes[i + 1]] = true;  // look ahead to next node
31603                                 }
31604                             }
31605                         }
31606                     }, this);
31607
31608                     Object.keys(nodeIds).forEach(function(nodeId) {
31609                         // +90 because geoAngle returns angle from X axis, not Y (north)
31610                         results.push(
31611                             (geoAngle(this, resolver.entity(nodeId), projection) * (180 / Math.PI)) + 90
31612                         );
31613                     }, this);
31614
31615                 }, this);
31616
31617                 return utilArrayUniq(results);
31618             },
31619
31620
31621             isEndpoint: function(resolver) {
31622                 return resolver.transient(this, 'isEndpoint', function() {
31623                     var id = this.id;
31624                     return resolver.parentWays(this).filter(function(parent) {
31625                         return !parent.isClosed() && !!parent.affix(id);
31626                     }).length > 0;
31627                 });
31628             },
31629
31630
31631             isConnected: function(resolver) {
31632                 return resolver.transient(this, 'isConnected', function() {
31633                     var parents = resolver.parentWays(this);
31634
31635                     function isLine(entity) {
31636                         return entity.geometry(resolver) === 'line' &&
31637                             entity.hasInterestingTags();
31638                     }
31639
31640                     // vertex is connected to multiple parent lines
31641                     if (parents.length > 1 && parents.some(isLine)) {
31642                         return true;
31643
31644                     } else if (parents.length === 1) {
31645                         var way = parents[0];
31646                         var nodes = way.nodes.slice();
31647                         if (way.isClosed()) { nodes.pop(); }  // ignore connecting node if closed
31648
31649                         // return true if vertex appears multiple times (way is self intersecting)
31650                         return nodes.indexOf(this.id) !== nodes.lastIndexOf(this.id);
31651                     }
31652
31653                     return false;
31654                 });
31655             },
31656
31657
31658             isIntersection: function(resolver) {
31659                 return resolver.transient(this, 'isIntersection', function() {
31660                     return resolver.parentWays(this).filter(function(parent) {
31661                         return (parent.tags.highway ||
31662                             parent.tags.waterway ||
31663                             parent.tags.railway ||
31664                             parent.tags.aeroway) &&
31665                             parent.geometry(resolver) === 'line';
31666                     }).length > 1;
31667                 });
31668             },
31669
31670
31671             isHighwayIntersection: function(resolver) {
31672                 return resolver.transient(this, 'isHighwayIntersection', function() {
31673                     return resolver.parentWays(this).filter(function(parent) {
31674                         return parent.tags.highway && parent.geometry(resolver) === 'line';
31675                     }).length > 1;
31676                 });
31677             },
31678
31679
31680             isOnAddressLine: function(resolver) {
31681                 return resolver.transient(this, 'isOnAddressLine', function() {
31682                     return resolver.parentWays(this).filter(function(parent) {
31683                         return parent.tags.hasOwnProperty('addr:interpolation') &&
31684                             parent.geometry(resolver) === 'line';
31685                     }).length > 0;
31686                 });
31687             },
31688
31689
31690             asJXON: function(changeset_id) {
31691                 var r = {
31692                     node: {
31693                         '@id': this.osmId(),
31694                         '@lon': this.loc[0],
31695                         '@lat': this.loc[1],
31696                         '@version': (this.version || 0),
31697                         tag: Object.keys(this.tags).map(function(k) {
31698                             return { keyAttributes: { k: k, v: this.tags[k] } };
31699                         }, this)
31700                     }
31701                 };
31702                 if (changeset_id) r.node['@changeset'] = changeset_id;
31703                 return r;
31704             },
31705
31706
31707             asGeoJSON: function() {
31708                 return {
31709                     type: 'Point',
31710                     coordinates: this.loc
31711                 };
31712             }
31713         });
31714
31715         function actionCircularize(wayId, projection, maxAngle) {
31716             maxAngle = (maxAngle || 20) * Math.PI / 180;
31717
31718
31719             var action = function(graph, t) {
31720                 if (t === null || !isFinite(t)) t = 1;
31721                 t = Math.min(Math.max(+t, 0), 1);
31722
31723                 var way = graph.entity(wayId);
31724                 var origNodes = {};
31725
31726                 graph.childNodes(way).forEach(function(node) {
31727                     if (!origNodes[node.id]) origNodes[node.id] = node;
31728                 });
31729
31730                 if (!way.isConvex(graph)) {
31731                     graph = action.makeConvex(graph);
31732                 }
31733
31734                 var nodes = utilArrayUniq(graph.childNodes(way));
31735                 var keyNodes = nodes.filter(function(n) { return graph.parentWays(n).length !== 1; });
31736                 var points = nodes.map(function(n) { return projection(n.loc); });
31737                 var keyPoints = keyNodes.map(function(n) { return projection(n.loc); });
31738                 var centroid = (points.length === 2) ? geoVecInterp(points[0], points[1], 0.5) : d3_polygonCentroid(points);
31739                 var radius = d3_median(points, function(p) { return geoVecLength(centroid, p); });
31740                 var sign = d3_polygonArea(points) > 0 ? 1 : -1;
31741                 var ids, i, j, k;
31742
31743                 // we need atleast two key nodes for the algorithm to work
31744                 if (!keyNodes.length) {
31745                     keyNodes = [nodes[0]];
31746                     keyPoints = [points[0]];
31747                 }
31748
31749                 if (keyNodes.length === 1) {
31750                     var index = nodes.indexOf(keyNodes[0]);
31751                     var oppositeIndex = Math.floor((index + nodes.length / 2) % nodes.length);
31752
31753                     keyNodes.push(nodes[oppositeIndex]);
31754                     keyPoints.push(points[oppositeIndex]);
31755                 }
31756
31757                 // key points and nodes are those connected to the ways,
31758                 // they are projected onto the circle, inbetween nodes are moved
31759                 // to constant intervals between key nodes, extra inbetween nodes are
31760                 // added if necessary.
31761                 for (i = 0; i < keyPoints.length; i++) {
31762                     var nextKeyNodeIndex = (i + 1) % keyNodes.length;
31763                     var startNode = keyNodes[i];
31764                     var endNode = keyNodes[nextKeyNodeIndex];
31765                     var startNodeIndex = nodes.indexOf(startNode);
31766                     var endNodeIndex = nodes.indexOf(endNode);
31767                     var numberNewPoints = -1;
31768                     var indexRange = endNodeIndex - startNodeIndex;
31769                     var nearNodes = {};
31770                     var inBetweenNodes = [];
31771                     var startAngle, endAngle, totalAngle, eachAngle;
31772                     var angle, loc, node, origNode;
31773
31774                     if (indexRange < 0) {
31775                         indexRange += nodes.length;
31776                     }
31777
31778                     // position this key node
31779                     var distance = geoVecLength(centroid, keyPoints[i]) || 1e-4;
31780                     keyPoints[i] = [
31781                         centroid[0] + (keyPoints[i][0] - centroid[0]) / distance * radius,
31782                         centroid[1] + (keyPoints[i][1] - centroid[1]) / distance * radius
31783                     ];
31784                     loc = projection.invert(keyPoints[i]);
31785                     node = keyNodes[i];
31786                     origNode = origNodes[node.id];
31787                     node = node.move(geoVecInterp(origNode.loc, loc, t));
31788                     graph = graph.replace(node);
31789
31790                     // figure out the between delta angle we want to match to
31791                     startAngle = Math.atan2(keyPoints[i][1] - centroid[1], keyPoints[i][0] - centroid[0]);
31792                     endAngle = Math.atan2(keyPoints[nextKeyNodeIndex][1] - centroid[1], keyPoints[nextKeyNodeIndex][0] - centroid[0]);
31793                     totalAngle = endAngle - startAngle;
31794
31795                     // detects looping around -pi/pi
31796                     if (totalAngle * sign > 0) {
31797                         totalAngle = -sign * (2 * Math.PI - Math.abs(totalAngle));
31798                     }
31799
31800                     do {
31801                         numberNewPoints++;
31802                         eachAngle = totalAngle / (indexRange + numberNewPoints);
31803                     } while (Math.abs(eachAngle) > maxAngle);
31804
31805
31806                     // move existing nodes
31807                     for (j = 1; j < indexRange; j++) {
31808                         angle = startAngle + j * eachAngle;
31809                         loc = projection.invert([
31810                             centroid[0] + Math.cos(angle) * radius,
31811                             centroid[1] + Math.sin(angle) * radius
31812                         ]);
31813
31814                         node = nodes[(j + startNodeIndex) % nodes.length];
31815                         origNode = origNodes[node.id];
31816                         nearNodes[node.id] = angle;
31817
31818                         node = node.move(geoVecInterp(origNode.loc, loc, t));
31819                         graph = graph.replace(node);
31820                     }
31821
31822                     // add new inbetween nodes if necessary
31823                     for (j = 0; j < numberNewPoints; j++) {
31824                         angle = startAngle + (indexRange + j) * eachAngle;
31825                         loc = projection.invert([
31826                             centroid[0] + Math.cos(angle) * radius,
31827                             centroid[1] + Math.sin(angle) * radius
31828                         ]);
31829
31830                         // choose a nearnode to use as the original
31831                         var min = Infinity;
31832                         for (var nodeId in nearNodes) {
31833                             var nearAngle = nearNodes[nodeId];
31834                             var dist = Math.abs(nearAngle - angle);
31835                             if (dist < min) {
31836                                 dist = min;
31837                                 origNode = origNodes[nodeId];
31838                             }
31839                         }
31840
31841                         node = osmNode({ loc: geoVecInterp(origNode.loc, loc, t) });
31842                         graph = graph.replace(node);
31843
31844                         nodes.splice(endNodeIndex + j, 0, node);
31845                         inBetweenNodes.push(node.id);
31846                     }
31847
31848                     // Check for other ways that share these keyNodes..
31849                     // If keyNodes are adjacent in both ways,
31850                     // we can add inBetween nodes to that shared way too..
31851                     if (indexRange === 1 && inBetweenNodes.length) {
31852                         var startIndex1 = way.nodes.lastIndexOf(startNode.id);
31853                         var endIndex1 = way.nodes.lastIndexOf(endNode.id);
31854                         var wayDirection1 = (endIndex1 - startIndex1);
31855                         if (wayDirection1 < -1) { wayDirection1 = 1; }
31856
31857                         var parentWays = graph.parentWays(keyNodes[i]);
31858                         for (j = 0; j < parentWays.length; j++) {
31859                             var sharedWay = parentWays[j];
31860                             if (sharedWay === way) continue;
31861
31862                             if (sharedWay.areAdjacent(startNode.id, endNode.id)) {
31863                                 var startIndex2 = sharedWay.nodes.lastIndexOf(startNode.id);
31864                                 var endIndex2 = sharedWay.nodes.lastIndexOf(endNode.id);
31865                                 var wayDirection2 = (endIndex2 - startIndex2);
31866                                 var insertAt = endIndex2;
31867                                 if (wayDirection2 < -1) { wayDirection2 = 1; }
31868
31869                                 if (wayDirection1 !== wayDirection2) {
31870                                     inBetweenNodes.reverse();
31871                                     insertAt = startIndex2;
31872                                 }
31873                                 for (k = 0; k < inBetweenNodes.length; k++) {
31874                                     sharedWay = sharedWay.addNode(inBetweenNodes[k], insertAt + k);
31875                                 }
31876                                 graph = graph.replace(sharedWay);
31877                             }
31878                         }
31879                     }
31880
31881                 }
31882
31883                 // update the way to have all the new nodes
31884                 ids = nodes.map(function(n) { return n.id; });
31885                 ids.push(ids[0]);
31886
31887                 way = way.update({nodes: ids});
31888                 graph = graph.replace(way);
31889
31890                 return graph;
31891             };
31892
31893
31894             action.makeConvex = function(graph) {
31895                 var way = graph.entity(wayId);
31896                 var nodes = utilArrayUniq(graph.childNodes(way));
31897                 var points = nodes.map(function(n) { return projection(n.loc); });
31898                 var sign = d3_polygonArea(points) > 0 ? 1 : -1;
31899                 var hull = d3_polygonHull(points);
31900                 var i, j;
31901
31902                 // D3 convex hulls go counterclockwise..
31903                 if (sign === -1) {
31904                     nodes.reverse();
31905                     points.reverse();
31906                 }
31907
31908                 for (i = 0; i < hull.length - 1; i++) {
31909                     var startIndex = points.indexOf(hull[i]);
31910                     var endIndex = points.indexOf(hull[i+1]);
31911                     var indexRange = (endIndex - startIndex);
31912
31913                     if (indexRange < 0) {
31914                         indexRange += nodes.length;
31915                     }
31916
31917                     // move interior nodes to the surface of the convex hull..
31918                     for (j = 1; j < indexRange; j++) {
31919                         var point = geoVecInterp(hull[i], hull[i+1], j / indexRange);
31920                         var node = nodes[(j + startIndex) % nodes.length].move(projection.invert(point));
31921                         graph = graph.replace(node);
31922                     }
31923                 }
31924                 return graph;
31925             };
31926
31927
31928             action.disabled = function(graph) {
31929                 if (!graph.entity(wayId).isClosed()) {
31930                     return 'not_closed';
31931                 }
31932             };
31933
31934
31935             action.transitionable = true;
31936
31937
31938             return action;
31939         }
31940
31941         // https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/DeleteWayAction.as
31942         function actionDeleteWay(wayID) {
31943
31944             function canDeleteNode(node, graph) {
31945                 // don't delete nodes still attached to ways or relations
31946                 if (graph.parentWays(node).length ||
31947                     graph.parentRelations(node).length) return false;
31948
31949                 var geometries = osmNodeGeometriesForTags(node.tags);
31950                 // don't delete if this node can be a standalone point
31951                 if (geometries.point) return false;
31952                 // delete if this node only be a vertex
31953                 if (geometries.vertex) return true;
31954
31955                 // iD doesn't know if this should be a point or vertex,
31956                 // so only delete if there are no interesting tags
31957                 return !node.hasInterestingTags();
31958             }
31959
31960
31961             var action = function(graph) {
31962                 var way = graph.entity(wayID);
31963
31964                 graph.parentRelations(way).forEach(function(parent) {
31965                     parent = parent.removeMembersWithID(wayID);
31966                     graph = graph.replace(parent);
31967
31968                     if (parent.isDegenerate()) {
31969                         graph = actionDeleteRelation(parent.id)(graph);
31970                     }
31971                 });
31972
31973                 (new Set(way.nodes)).forEach(function(nodeID) {
31974                     graph = graph.replace(way.removeNode(nodeID));
31975
31976                     var node = graph.entity(nodeID);
31977                     if (canDeleteNode(node, graph)) {
31978                         graph = graph.remove(node);
31979                     }
31980                 });
31981
31982                 return graph.remove(way);
31983             };
31984
31985
31986             return action;
31987         }
31988
31989         function actionDeleteMultiple(ids) {
31990             var actions = {
31991                 way: actionDeleteWay,
31992                 node: actionDeleteNode,
31993                 relation: actionDeleteRelation
31994             };
31995
31996
31997             var action = function(graph) {
31998                 ids.forEach(function(id) {
31999                     if (graph.hasEntity(id)) { // It may have been deleted aready.
32000                         graph = actions[graph.entity(id).type](id)(graph);
32001                     }
32002                 });
32003
32004                 return graph;
32005             };
32006
32007
32008             return action;
32009         }
32010
32011         // https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/DeleteRelationAction.as
32012         function actionDeleteRelation(relationID, allowUntaggedMembers) {
32013
32014             function canDeleteEntity(entity, graph) {
32015                 return !graph.parentWays(entity).length &&
32016                     !graph.parentRelations(entity).length &&
32017                     (!entity.hasInterestingTags() && !allowUntaggedMembers);
32018             }
32019
32020
32021             var action = function(graph) {
32022                 var relation = graph.entity(relationID);
32023
32024                 graph.parentRelations(relation)
32025                     .forEach(function(parent) {
32026                         parent = parent.removeMembersWithID(relationID);
32027                         graph = graph.replace(parent);
32028
32029                         if (parent.isDegenerate()) {
32030                             graph = actionDeleteRelation(parent.id)(graph);
32031                         }
32032                     });
32033
32034                 var memberIDs = utilArrayUniq(relation.members.map(function(m) { return m.id; }));
32035                 memberIDs.forEach(function(memberID) {
32036                     graph = graph.replace(relation.removeMembersWithID(memberID));
32037
32038                     var entity = graph.entity(memberID);
32039                     if (canDeleteEntity(entity, graph)) {
32040                         graph = actionDeleteMultiple([memberID])(graph);
32041                     }
32042                 });
32043
32044                 return graph.remove(relation);
32045             };
32046
32047
32048             return action;
32049         }
32050
32051         // https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/DeleteNodeAction.as
32052         function actionDeleteNode(nodeId) {
32053             var action = function(graph) {
32054                 var node = graph.entity(nodeId);
32055
32056                 graph.parentWays(node)
32057                     .forEach(function(parent) {
32058                         parent = parent.removeNode(nodeId);
32059                         graph = graph.replace(parent);
32060
32061                         if (parent.isDegenerate()) {
32062                             graph = actionDeleteWay(parent.id)(graph);
32063                         }
32064                     });
32065
32066                 graph.parentRelations(node)
32067                     .forEach(function(parent) {
32068                         parent = parent.removeMembersWithID(nodeId);
32069                         graph = graph.replace(parent);
32070
32071                         if (parent.isDegenerate()) {
32072                             graph = actionDeleteRelation(parent.id)(graph);
32073                         }
32074                     });
32075
32076                 return graph.remove(node);
32077             };
32078
32079
32080             return action;
32081         }
32082
32083         // Connect the ways at the given nodes.
32084         //
32085         // First choose a node to be the survivor, with preference given
32086         // to an existing (not new) node.
32087         //
32088         // Tags and relation memberships of of non-surviving nodes are merged
32089         // to the survivor.
32090         //
32091         // This is the inverse of `iD.actionDisconnect`.
32092         //
32093         // Reference:
32094         //   https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/MergeNodesAction.as
32095         //   https://github.com/openstreetmap/josm/blob/mirror/src/org/openstreetmap/josm/actions/MergeNodesAction.java
32096         //
32097         function actionConnect(nodeIDs) {
32098             var action = function(graph) {
32099                 var survivor;
32100                 var node;
32101                 var parents;
32102                 var i, j;
32103
32104                 // Choose a survivor node, prefer an existing (not new) node - #4974
32105                 for (i = 0; i < nodeIDs.length; i++) {
32106                     survivor = graph.entity(nodeIDs[i]);
32107                     if (survivor.version) break;  // found one
32108                 }
32109
32110                 // Replace all non-surviving nodes with the survivor and merge tags.
32111                 for (i = 0; i < nodeIDs.length; i++) {
32112                     node = graph.entity(nodeIDs[i]);
32113                     if (node.id === survivor.id) continue;
32114
32115                     parents = graph.parentWays(node);
32116                     for (j = 0; j < parents.length; j++) {
32117                         if (!parents[j].areAdjacent(node.id, survivor.id)) {
32118                             graph = graph.replace(parents[j].replaceNode(node.id, survivor.id));
32119                         }
32120                     }
32121
32122                     parents = graph.parentRelations(node);
32123                     for (j = 0; j < parents.length; j++) {
32124                         graph = graph.replace(parents[j].replaceMember(node, survivor));
32125                     }
32126
32127                     survivor = survivor.mergeTags(node.tags);
32128                     graph = actionDeleteNode(node.id)(graph);
32129                 }
32130
32131                 graph = graph.replace(survivor);
32132
32133                 return graph;
32134             };
32135
32136
32137             action.disabled = function(graph) {
32138                 var seen = {};
32139                 var restrictionIDs = [];
32140                 var survivor;
32141                 var node, way;
32142                 var relations, relation, role;
32143                 var i, j, k;
32144
32145                 // Choose a survivor node, prefer an existing (not new) node - #4974
32146                 for (i = 0; i < nodeIDs.length; i++) {
32147                     survivor = graph.entity(nodeIDs[i]);
32148                     if (survivor.version) break;  // found one
32149                 }
32150
32151                 // 1. disable if the nodes being connected have conflicting relation roles
32152                 for (i = 0; i < nodeIDs.length; i++) {
32153                     node = graph.entity(nodeIDs[i]);
32154                     relations = graph.parentRelations(node);
32155
32156                     for (j = 0; j < relations.length; j++) {
32157                         relation = relations[j];
32158                         role = relation.memberById(node.id).role || '';
32159
32160                         // if this node is a via node in a restriction, remember for later
32161                         if (relation.hasFromViaTo()) {
32162                             restrictionIDs.push(relation.id);
32163                         }
32164
32165                         if (seen[relation.id] !== undefined && seen[relation.id] !== role) {
32166                             return 'relation';
32167                         } else {
32168                             seen[relation.id] = role;
32169                         }
32170                     }
32171                 }
32172
32173                 // gather restrictions for parent ways
32174                 for (i = 0; i < nodeIDs.length; i++) {
32175                     node = graph.entity(nodeIDs[i]);
32176
32177                     var parents = graph.parentWays(node);
32178                     for (j = 0; j < parents.length; j++) {
32179                         var parent = parents[j];
32180                         relations = graph.parentRelations(parent);
32181
32182                         for (k = 0; k < relations.length; k++) {
32183                             relation = relations[k];
32184                             if (relation.hasFromViaTo()) {
32185                                 restrictionIDs.push(relation.id);
32186                             }
32187                         }
32188                     }
32189                 }
32190
32191
32192                 // test restrictions
32193                 restrictionIDs = utilArrayUniq(restrictionIDs);
32194                 for (i = 0; i < restrictionIDs.length; i++) {
32195                     relation = graph.entity(restrictionIDs[i]);
32196                     if (!relation.isComplete(graph)) continue;
32197
32198                     var memberWays = relation.members
32199                         .filter(function(m) { return m.type === 'way'; })
32200                         .map(function(m) { return graph.entity(m.id); });
32201
32202                     memberWays = utilArrayUniq(memberWays);
32203                     var f = relation.memberByRole('from');
32204                     var t = relation.memberByRole('to');
32205                     var isUturn = (f.id === t.id);
32206
32207                     // 2a. disable if connection would damage a restriction
32208                     // (a key node is a node at the junction of ways)
32209                     var nodes = { from: [], via: [], to: [], keyfrom: [], keyto: [] };
32210                     for (j = 0; j < relation.members.length; j++) {
32211                         collectNodes(relation.members[j], nodes);
32212                     }
32213
32214                     nodes.keyfrom = utilArrayUniq(nodes.keyfrom.filter(hasDuplicates));
32215                     nodes.keyto = utilArrayUniq(nodes.keyto.filter(hasDuplicates));
32216
32217                     var filter = keyNodeFilter(nodes.keyfrom, nodes.keyto);
32218                     nodes.from = nodes.from.filter(filter);
32219                     nodes.via = nodes.via.filter(filter);
32220                     nodes.to = nodes.to.filter(filter);
32221
32222                     var connectFrom = false;
32223                     var connectVia = false;
32224                     var connectTo = false;
32225                     var connectKeyFrom = false;
32226                     var connectKeyTo = false;
32227
32228                     for (j = 0; j < nodeIDs.length; j++) {
32229                         var n = nodeIDs[j];
32230                         if (nodes.from.indexOf(n) !== -1)    { connectFrom = true; }
32231                         if (nodes.via.indexOf(n) !== -1)     { connectVia = true; }
32232                         if (nodes.to.indexOf(n) !== -1)      { connectTo = true; }
32233                         if (nodes.keyfrom.indexOf(n) !== -1) { connectKeyFrom = true; }
32234                         if (nodes.keyto.indexOf(n) !== -1)   { connectKeyTo = true; }
32235                     }
32236                     if (connectFrom && connectTo && !isUturn) { return 'restriction'; }
32237                     if (connectFrom && connectVia) { return 'restriction'; }
32238                     if (connectTo   && connectVia) { return 'restriction'; }
32239
32240                     // connecting to a key node -
32241                     // if both nodes are on a member way (i.e. part of the turn restriction),
32242                     // the connecting node must be adjacent to the key node.
32243                     if (connectKeyFrom || connectKeyTo) {
32244                         if (nodeIDs.length !== 2) { return 'restriction'; }
32245
32246                         var n0 = null;
32247                         var n1 = null;
32248                         for (j = 0; j < memberWays.length; j++) {
32249                             way = memberWays[j];
32250                             if (way.contains(nodeIDs[0])) { n0 = nodeIDs[0]; }
32251                             if (way.contains(nodeIDs[1])) { n1 = nodeIDs[1]; }
32252                         }
32253
32254                         if (n0 && n1) {    // both nodes are part of the restriction
32255                             var ok = false;
32256                             for (j = 0; j < memberWays.length; j++) {
32257                                 way = memberWays[j];
32258                                 if (way.areAdjacent(n0, n1)) {
32259                                     ok = true;
32260                                     break;
32261                                 }
32262                             }
32263                             if (!ok) {
32264                                 return 'restriction';
32265                             }
32266                         }
32267                     }
32268
32269                     // 2b. disable if nodes being connected will destroy a member way in a restriction
32270                     // (to test, make a copy and try actually connecting the nodes)
32271                     for (j = 0; j < memberWays.length; j++) {
32272                         way = memberWays[j].update({});   // make copy
32273                         for (k = 0; k < nodeIDs.length; k++) {
32274                             if (nodeIDs[k] === survivor.id) continue;
32275
32276                             if (way.areAdjacent(nodeIDs[k], survivor.id)) {
32277                                 way = way.removeNode(nodeIDs[k]);
32278                             } else {
32279                                 way = way.replaceNode(nodeIDs[k], survivor.id);
32280                             }
32281                         }
32282                         if (way.isDegenerate()) {
32283                             return 'restriction';
32284                         }
32285                     }
32286                 }
32287
32288                 return false;
32289
32290
32291                 // if a key node appears multiple times (indexOf !== lastIndexOf) it's a FROM-VIA or TO-VIA junction
32292                 function hasDuplicates(n, i, arr) {
32293                     return arr.indexOf(n) !== arr.lastIndexOf(n);
32294                 }
32295
32296                 function keyNodeFilter(froms, tos) {
32297                     return function(n) {
32298                         return froms.indexOf(n) === -1 && tos.indexOf(n) === -1;
32299                     };
32300                 }
32301
32302                 function collectNodes(member, collection) {
32303                     var entity = graph.hasEntity(member.id);
32304                     if (!entity) return;
32305
32306                     var role = member.role || '';
32307                     if (!collection[role]) {
32308                         collection[role] = [];
32309                     }
32310
32311                     if (member.type === 'node') {
32312                         collection[role].push(member.id);
32313                         if (role === 'via') {
32314                             collection.keyfrom.push(member.id);
32315                             collection.keyto.push(member.id);
32316                         }
32317
32318                     } else if (member.type === 'way') {
32319                         collection[role].push.apply(collection[role], entity.nodes);
32320                         if (role === 'from' || role === 'via') {
32321                             collection.keyfrom.push(entity.first());
32322                             collection.keyfrom.push(entity.last());
32323                         }
32324                         if (role === 'to' || role === 'via') {
32325                             collection.keyto.push(entity.first());
32326                             collection.keyto.push(entity.last());
32327                         }
32328                     }
32329                 }
32330             };
32331
32332
32333             return action;
32334         }
32335
32336         function actionCopyEntities(ids, fromGraph) {
32337             var _copies = {};
32338
32339
32340             var action = function(graph) {
32341                 ids.forEach(function(id) {
32342                     fromGraph.entity(id).copy(fromGraph, _copies);
32343                 });
32344
32345                 for (var id in _copies) {
32346                     graph = graph.replace(_copies[id]);
32347                 }
32348
32349                 return graph;
32350             };
32351
32352
32353             action.copies = function() {
32354                 return _copies;
32355             };
32356
32357
32358             return action;
32359         }
32360
32361         function actionDeleteMember(relationId, memberIndex) {
32362             return function(graph) {
32363                 var relation = graph.entity(relationId)
32364                     .removeMember(memberIndex);
32365
32366                 graph = graph.replace(relation);
32367
32368                 if (relation.isDegenerate())
32369                     graph = actionDeleteRelation(relation.id)(graph);
32370
32371                 return graph;
32372             };
32373         }
32374
32375         function actionDiscardTags(difference) {
32376
32377             return function(graph) {
32378                 function discardTags(entity) {
32379                     var tags = {};
32380                     var keys = Object.keys(entity.tags);
32381                     var discarded = false;
32382
32383                     for (var i = 0; i < keys.length; i++) {
32384                         var k = keys[i];
32385                         if (dataDiscarded[k] || !entity.tags[k]) {
32386                             discarded = true;
32387                         } else {
32388                             tags[k] = entity.tags[k];
32389                         }
32390                     }
32391
32392                     if (discarded) {
32393                         graph = graph.replace(entity.update({ tags: tags }));
32394                     }
32395                 }
32396
32397                 difference.modified().forEach(discardTags);
32398                 difference.created().forEach(discardTags);
32399
32400                 return graph;
32401             };
32402         }
32403
32404         // Disconect the ways at the given node.
32405         //
32406         // Optionally, disconnect only the given ways.
32407         //
32408         // For testing convenience, accepts an ID to assign to the (first) new node.
32409         // Normally, this will be undefined and the way will automatically
32410         // be assigned a new ID.
32411         //
32412         // This is the inverse of `iD.actionConnect`.
32413         //
32414         // Reference:
32415         //   https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/UnjoinNodeAction.as
32416         //   https://github.com/openstreetmap/josm/blob/mirror/src/org/openstreetmap/josm/actions/UnGlueAction.java
32417         //
32418         function actionDisconnect(nodeId, newNodeId) {
32419             var wayIds;
32420
32421
32422             var action = function(graph) {
32423                 var node = graph.entity(nodeId);
32424                 var connections = action.connections(graph);
32425
32426                 connections.forEach(function(connection) {
32427                     var way = graph.entity(connection.wayID);
32428                     var newNode = osmNode({id: newNodeId, loc: node.loc, tags: node.tags});
32429
32430                     graph = graph.replace(newNode);
32431                     if (connection.index === 0 && way.isArea()) {
32432                         // replace shared node with shared node..
32433                         graph = graph.replace(way.replaceNode(way.nodes[0], newNode.id));
32434                     } else if (way.isClosed() && connection.index === way.nodes.length - 1) {
32435                         // replace closing node with new new node..
32436                         graph = graph.replace(way.unclose().addNode(newNode.id));
32437                     } else {
32438                         // replace shared node with multiple new nodes..
32439                         graph = graph.replace(way.updateNode(newNode.id, connection.index));
32440                     }
32441                 });
32442
32443                 return graph;
32444             };
32445
32446
32447             action.connections = function(graph) {
32448                 var candidates = [];
32449                 var keeping = false;
32450                 var parentWays = graph.parentWays(graph.entity(nodeId));
32451
32452                 parentWays.forEach(function(way) {
32453                     if (wayIds && wayIds.indexOf(way.id) === -1) {
32454                         keeping = true;
32455                         return;
32456                     }
32457                     if (way.isArea() && (way.nodes[0] === nodeId)) {
32458                         candidates.push({ wayID: way.id, index: 0 });
32459                     } else {
32460                         way.nodes.forEach(function(waynode, index) {
32461                             if (waynode === nodeId) {
32462                                 if (way.isClosed() && parentWays.length > 1 && wayIds && wayIds.indexOf(way.id) !== -1 && index === way.nodes.length-1) {
32463                                     return;
32464                                 }
32465                                 candidates.push({ wayID: way.id, index: index });
32466                             }
32467                         });
32468                     }
32469                 });
32470
32471                 return keeping ? candidates : candidates.slice(1);
32472             };
32473
32474
32475             action.disabled = function(graph) {
32476                 var connections = action.connections(graph);
32477                 if (connections.length === 0)
32478                     return 'not_connected';
32479
32480                 var parentWays = graph.parentWays(graph.entity(nodeId));
32481                 var seenRelationIds = {};
32482                 var sharedRelation;
32483
32484                 parentWays.forEach(function(way) {
32485                     var relations = graph.parentRelations(way);
32486                     relations.forEach(function(relation) {
32487                         if (relation.id in seenRelationIds) {
32488                             if (wayIds) {
32489                                 if (wayIds.indexOf(way.id) !== -1 ||
32490                                     wayIds.indexOf(seenRelationIds[relation.id]) !== -1) {
32491                                     sharedRelation = relation;
32492                                 }
32493                             } else {
32494                                 sharedRelation = relation;
32495                             }
32496                         } else {
32497                             seenRelationIds[relation.id] = way.id;
32498                         }
32499                     });
32500                 });
32501
32502                 if (sharedRelation)
32503                     return 'relation';
32504             };
32505
32506
32507             action.limitWays = function(val) {
32508                 if (!arguments.length) return wayIds;
32509                 wayIds = val;
32510                 return action;
32511             };
32512
32513
32514             return action;
32515         }
32516
32517         function actionExtract(entityID, projection) {
32518
32519             var extractedNodeID;
32520
32521             var action = function(graph) {
32522                 var entity = graph.entity(entityID);
32523
32524                 if (entity.type === 'node') {
32525                     return extractFromNode(entity, graph);
32526                 }
32527
32528                 return extractFromArea(entity, graph);
32529             };
32530
32531             function extractFromNode(node, graph) {
32532
32533                 extractedNodeID = node.id;
32534
32535                 // Create a new node to replace the one we will detach
32536                 var replacement = osmNode({ loc: node.loc });
32537                 graph = graph.replace(replacement);
32538
32539                 // Process each way in turn, updating the graph as we go
32540                 graph = graph.parentWays(node)
32541                     .reduce(function(accGraph, parentWay) {
32542                         return accGraph.replace(parentWay.replaceNode(entityID, replacement.id));
32543                     }, graph);
32544
32545                 // Process any relations too
32546                 return graph.parentRelations(node)
32547                     .reduce(function(accGraph, parentRel) {
32548                         return accGraph.replace(parentRel.replaceMember(node, replacement));
32549                     }, graph);
32550             }
32551
32552             function extractFromArea(entity, graph) {
32553
32554                 var keysToCopyAndRetain = ['source', 'wheelchair'];
32555                 var keysToRetain = ['type'];
32556                 var buildingKeysToRetain = ['architect', 'building', 'height', 'layer'];
32557
32558                 var centroid = d3_geoPath(projection).centroid(entity.asGeoJSON(graph, true));
32559
32560                 var isBuilding = entity.tags.building;
32561
32562                 var areaTags = Object.assign({}, entity.tags);  // shallow copy
32563                 var pointTags = {};
32564                 for (var key in areaTags) {
32565
32566                     if (keysToRetain.indexOf(key) !== -1) {
32567                         continue;
32568                     }
32569
32570                     if (isBuilding) {
32571                         // don't transfer building-related tags
32572                         if (buildingKeysToRetain.indexOf(key) !== -1 ||
32573                             key.match(/^building:.{1,}/) ||
32574                             key.match(/^roof:.{1,}/)) continue;
32575                     }
32576
32577                     // copy the tag from the area to the point
32578                     pointTags[key] = areaTags[key];
32579
32580                     // leave addresses and some other tags so they're on both features
32581                     if (keysToCopyAndRetain.indexOf(key) !== -1 || key.match(/^addr:.{1,}/)) {
32582                         continue;
32583                     }
32584
32585                     // remove the tag from the area
32586                     delete areaTags[key];
32587                 }
32588
32589                 if (!isBuilding) {
32590                     // ensure that the area keeps the area geometry
32591                     areaTags.area = 'yes';
32592                 }
32593
32594                 var replacement = osmNode({ loc: centroid, tags: pointTags });
32595                 graph = graph.replace(replacement);
32596
32597                 extractedNodeID = replacement.id;
32598
32599                 return graph.replace(entity.update({tags: areaTags}));
32600             }
32601
32602             action.getExtractedNodeID = function() {
32603                 return extractedNodeID;
32604             };
32605
32606             action.disabled = function(graph) {
32607                 var entity = graph.entity(entityID);
32608
32609                 if (entity.type === 'node') {
32610                     var parentRels = graph.parentRelations(entity);
32611                     for (var i = 0; i < parentRels.length; i++) {
32612                         var relation = parentRels[i];
32613                         if (!relation.hasFromViaTo()) continue;
32614
32615                         for (var j = 0; j < relation.members.length; j++) {
32616                             var m = relation.members[j];
32617                             if (m.id === entityID && (m.role === 'via' || m.role === 'location_hint')) {
32618                                 return 'restriction';
32619                             }
32620                         }
32621                     }
32622                 }
32623
32624                 return false;
32625             };
32626
32627
32628             return action;
32629         }
32630
32631         // Join ways at the end node they share.
32632         //
32633         // This is the inverse of `iD.actionSplit`.
32634         //
32635         // Reference:
32636         //   https://github.com/systemed/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/MergeWaysAction.as
32637         //   https://github.com/openstreetmap/josm/blob/mirror/src/org/openstreetmap/josm/actions/CombineWayAction.java
32638         //
32639         function actionJoin(ids) {
32640
32641             function groupEntitiesByGeometry(graph) {
32642                 var entities = ids.map(function(id) { return graph.entity(id); });
32643                 return Object.assign(
32644                     { line: [] },
32645                     utilArrayGroupBy(entities, function(entity) { return entity.geometry(graph); })
32646                 );
32647             }
32648
32649
32650             var action = function(graph) {
32651                 var ways = ids.map(graph.entity, graph);
32652                 var survivorID = ways[0].id;
32653
32654                 // if any of the ways are sided (e.g. coastline, cliff, kerb)
32655                 // sort them first so they establish the overall order - #6033
32656                 ways.sort(function(a, b) {
32657                     var aSided = a.isSided();
32658                     var bSided = b.isSided();
32659                     return (aSided && !bSided) ? -1
32660                         : (bSided && !aSided) ? 1
32661                         : 0;
32662                 });
32663
32664                 // Prefer to keep an existing way.
32665                 for (var i = 0; i < ways.length; i++) {
32666                     if (!ways[i].isNew()) {
32667                         survivorID = ways[i].id;
32668                         break;
32669                     }
32670                 }
32671
32672                 var sequences = osmJoinWays(ways, graph);
32673                 var joined = sequences[0];
32674
32675                 // We might need to reverse some of these ways before joining them.  #4688
32676                 // `joined.actions` property will contain any actions we need to apply.
32677                 graph = sequences.actions.reduce(function(g, action) { return action(g); }, graph);
32678
32679                 var survivor = graph.entity(survivorID);
32680                 survivor = survivor.update({ nodes: joined.nodes.map(function(n) { return n.id; }) });
32681                 graph = graph.replace(survivor);
32682
32683                 joined.forEach(function(way) {
32684                     if (way.id === survivorID) return;
32685
32686                     graph.parentRelations(way).forEach(function(parent) {
32687                         graph = graph.replace(parent.replaceMember(way, survivor));
32688                     });
32689
32690                     survivor = survivor.mergeTags(way.tags);
32691
32692                     graph = graph.replace(survivor);
32693                     graph = actionDeleteWay(way.id)(graph);
32694                 });
32695
32696                 return graph;
32697             };
32698
32699
32700             action.disabled = function(graph) {
32701                 var geometries = groupEntitiesByGeometry(graph);
32702                 if (ids.length < 2 || ids.length !== geometries.line.length) {
32703                     return 'not_eligible';
32704                 }
32705
32706                 var joined = osmJoinWays(ids.map(graph.entity, graph), graph);
32707                 if (joined.length > 1) {
32708                     return 'not_adjacent';
32709                 }
32710
32711                 // Loop through all combinations of path-pairs
32712                 // to check potential intersections between all pairs
32713                 for (var i = 0; i < ids.length - 1; i++) {
32714                     for (var j = i + 1; j < ids.length; j++) {
32715                         var path1 = graph.childNodes(graph.entity(ids[i]))
32716                             .map(function(e) { return e.loc; });
32717                         var path2 = graph.childNodes(graph.entity(ids[j]))
32718                             .map(function(e) { return e.loc; });
32719                         var intersections = geoPathIntersections(path1, path2);
32720
32721                         // Check if intersections are just nodes lying on top of
32722                         // each other/the line, as opposed to crossing it
32723                         var common = utilArrayIntersection(
32724                             joined[0].nodes.map(function(n) { return n.loc.toString(); }),
32725                             intersections.map(function(n) { return n.toString(); })
32726                         );
32727                         if (common.length !== intersections.length) {
32728                             return 'paths_intersect';
32729                         }
32730                     }
32731                 }
32732
32733                 var nodeIds = joined[0].nodes.map(function(n) { return n.id; }).slice(1, -1);
32734                 var relation;
32735                 var tags = {};
32736                 var conflicting = false;
32737
32738                 joined[0].forEach(function(way) {
32739                     var parents = graph.parentRelations(way);
32740                     parents.forEach(function(parent) {
32741                         if (parent.isRestriction() && parent.members.some(function(m) { return nodeIds.indexOf(m.id) >= 0; })) {
32742                             relation = parent;
32743                         }
32744                     });
32745
32746                     for (var k in way.tags) {
32747                         if (!(k in tags)) {
32748                             tags[k] = way.tags[k];
32749                         } else if (tags[k] && osmIsInterestingTag(k) && tags[k] !== way.tags[k]) {
32750                             conflicting = true;
32751                         }
32752                     }
32753                 });
32754
32755                 if (relation) {
32756                     return 'restriction';
32757                 }
32758
32759                 if (conflicting) {
32760                     return 'conflicting_tags';
32761                 }
32762             };
32763
32764
32765             return action;
32766         }
32767
32768         function actionMerge(ids) {
32769
32770             function groupEntitiesByGeometry(graph) {
32771                 var entities = ids.map(function(id) { return graph.entity(id); });
32772                 return Object.assign(
32773                     { point: [], area: [], line: [], relation: [] },
32774                     utilArrayGroupBy(entities, function(entity) { return entity.geometry(graph); })
32775                 );
32776             }
32777
32778
32779             var action = function(graph) {
32780                 var geometries = groupEntitiesByGeometry(graph);
32781                 var target = geometries.area[0] || geometries.line[0];
32782                 var points = geometries.point;
32783
32784                 points.forEach(function(point) {
32785                     target = target.mergeTags(point.tags);
32786                     graph = graph.replace(target);
32787
32788                     graph.parentRelations(point).forEach(function(parent) {
32789                         graph = graph.replace(parent.replaceMember(point, target));
32790                     });
32791
32792                     var nodes = utilArrayUniq(graph.childNodes(target));
32793                     var removeNode = point;
32794
32795                     for (var i = 0; i < nodes.length; i++) {
32796                         var node = nodes[i];
32797                         if (graph.parentWays(node).length > 1 ||
32798                             graph.parentRelations(node).length ||
32799                             node.hasInterestingTags()) {
32800                             continue;
32801                         }
32802
32803                         // Found an uninteresting child node on the target way.
32804                         // Move orig point into its place to preserve point's history. #3683
32805                         graph = graph.replace(point.update({ tags: {}, loc: node.loc }));
32806                         target = target.replaceNode(node.id, point.id);
32807                         graph = graph.replace(target);
32808                         removeNode = node;
32809                         break;
32810                     }
32811
32812                     graph = graph.remove(removeNode);
32813                 });
32814
32815                 return graph;
32816             };
32817
32818
32819             action.disabled = function(graph) {
32820                 var geometries = groupEntitiesByGeometry(graph);
32821                 if (geometries.point.length === 0 ||
32822                     (geometries.area.length + geometries.line.length) !== 1 ||
32823                     geometries.relation.length !== 0) {
32824                     return 'not_eligible';
32825                 }
32826             };
32827
32828
32829             return action;
32830         }
32831
32832         // `actionMergeNodes` is just a combination of:
32833         //
32834         // 1. move all the nodes to a common location
32835         // 2. `actionConnect` them
32836
32837         function actionMergeNodes(nodeIDs, loc) {
32838
32839             // If there is a single "interesting" node, use that as the location.
32840             // Otherwise return the average location of all the nodes.
32841             function chooseLoc(graph) {
32842                 if (!nodeIDs.length) return null;
32843                 var sum = [0,0];
32844                 var interestingCount = 0;
32845                 var interestingLoc;
32846
32847                 for (var i = 0; i < nodeIDs.length; i++) {
32848                     var node = graph.entity(nodeIDs[i]);
32849                     if (node.hasInterestingTags()) {
32850                         interestingLoc = (++interestingCount === 1) ? node.loc : null;
32851                     }
32852                     sum = geoVecAdd(sum, node.loc);
32853                 }
32854
32855                 return interestingLoc || geoVecScale(sum, 1 / nodeIDs.length);
32856             }
32857
32858
32859             var action = function(graph) {
32860                 if (nodeIDs.length < 2) return graph;
32861                 var toLoc = loc;
32862                 if (!toLoc) {
32863                     toLoc = chooseLoc(graph);
32864                 }
32865
32866                 for (var i = 0; i < nodeIDs.length; i++) {
32867                     var node = graph.entity(nodeIDs[i]);
32868                     if (node.loc !== toLoc) {
32869                         graph = graph.replace(node.move(toLoc));
32870                     }
32871                 }
32872
32873                 return actionConnect(nodeIDs)(graph);
32874             };
32875
32876
32877             action.disabled = function(graph) {
32878                 if (nodeIDs.length < 2) return 'not_eligible';
32879
32880                 for (var i = 0; i < nodeIDs.length; i++) {
32881                     var entity = graph.entity(nodeIDs[i]);
32882                     if (entity.type !== 'node') return 'not_eligible';
32883                 }
32884
32885                 return actionConnect(nodeIDs).disabled(graph);
32886             };
32887
32888             return action;
32889         }
32890
32891         function osmChangeset() {
32892             if (!(this instanceof osmChangeset)) {
32893                 return (new osmChangeset()).initialize(arguments);
32894             } else if (arguments.length) {
32895                 this.initialize(arguments);
32896             }
32897         }
32898
32899
32900         osmEntity.changeset = osmChangeset;
32901
32902         osmChangeset.prototype = Object.create(osmEntity.prototype);
32903
32904         Object.assign(osmChangeset.prototype, {
32905
32906             type: 'changeset',
32907
32908
32909             extent: function() {
32910                 return new geoExtent();
32911             },
32912
32913
32914             geometry: function() {
32915                 return 'changeset';
32916             },
32917
32918
32919             asJXON: function() {
32920                 return {
32921                     osm: {
32922                         changeset: {
32923                             tag: Object.keys(this.tags).map(function(k) {
32924                                 return { '@k': k, '@v': this.tags[k] };
32925                             }, this),
32926                             '@version': 0.6,
32927                             '@generator': 'iD'
32928                         }
32929                     }
32930                 };
32931             },
32932
32933
32934             // Generate [osmChange](http://wiki.openstreetmap.org/wiki/OsmChange)
32935             // XML. Returns a string.
32936             osmChangeJXON: function(changes) {
32937                 var changeset_id = this.id;
32938
32939                 function nest(x, order) {
32940                     var groups = {};
32941                     for (var i = 0; i < x.length; i++) {
32942                         var tagName = Object.keys(x[i])[0];
32943                         if (!groups[tagName]) groups[tagName] = [];
32944                         groups[tagName].push(x[i][tagName]);
32945                     }
32946                     var ordered = {};
32947                     order.forEach(function(o) {
32948                         if (groups[o]) ordered[o] = groups[o];
32949                     });
32950                     return ordered;
32951                 }
32952
32953
32954                 // sort relations in a changeset by dependencies
32955                 function sort(changes) {
32956
32957                     // find a referenced relation in the current changeset
32958                     function resolve(item) {
32959                         return relations.find(function(relation) {
32960                             return item.keyAttributes.type === 'relation'
32961                                 && item.keyAttributes.ref === relation['@id'];
32962                         });
32963                     }
32964
32965                     // a new item is an item that has not been already processed
32966                     function isNew(item) {
32967                         return !sorted[ item['@id'] ] && !processing.find(function(proc) {
32968                             return proc['@id'] === item['@id'];
32969                         });
32970                     }
32971
32972                     var processing = [];
32973                     var sorted = {};
32974                     var relations = changes.relation;
32975
32976                     if (!relations) return changes;
32977
32978                     for (var i = 0; i < relations.length; i++) {
32979                         var relation = relations[i];
32980
32981                         // skip relation if already sorted
32982                         if (!sorted[relation['@id']]) {
32983                             processing.push(relation);
32984                         }
32985
32986                         while (processing.length > 0) {
32987                             var next = processing[0],
32988                             deps = next.member.map(resolve).filter(Boolean).filter(isNew);
32989                             if (deps.length === 0) {
32990                                 sorted[next['@id']] = next;
32991                                 processing.shift();
32992                             } else {
32993                                 processing = deps.concat(processing);
32994                             }
32995                         }
32996                     }
32997
32998                     changes.relation = Object.values(sorted);
32999                     return changes;
33000                 }
33001
33002                 function rep(entity) {
33003                     return entity.asJXON(changeset_id);
33004                 }
33005
33006                 return {
33007                     osmChange: {
33008                         '@version': 0.6,
33009                         '@generator': 'iD',
33010                         'create': sort(nest(changes.created.map(rep), ['node', 'way', 'relation'])),
33011                         'modify': nest(changes.modified.map(rep), ['node', 'way', 'relation']),
33012                         'delete': Object.assign(nest(changes.deleted.map(rep), ['relation', 'way', 'node']), { '@if-unused': true })
33013                     }
33014                 };
33015             },
33016
33017
33018             asGeoJSON: function() {
33019                 return {};
33020             }
33021
33022         });
33023
33024         function osmNote() {
33025             if (!(this instanceof osmNote)) {
33026                 return (new osmNote()).initialize(arguments);
33027             } else if (arguments.length) {
33028                 this.initialize(arguments);
33029             }
33030         }
33031
33032
33033         osmNote.id = function() {
33034             return osmNote.id.next--;
33035         };
33036
33037
33038         osmNote.id.next = -1;
33039
33040
33041         Object.assign(osmNote.prototype, {
33042
33043             type: 'note',
33044
33045             initialize: function(sources) {
33046                 for (var i = 0; i < sources.length; ++i) {
33047                     var source = sources[i];
33048                     for (var prop in source) {
33049                         if (Object.prototype.hasOwnProperty.call(source, prop)) {
33050                             if (source[prop] === undefined) {
33051                                 delete this[prop];
33052                             } else {
33053                                 this[prop] = source[prop];
33054                             }
33055                         }
33056                     }
33057                 }
33058
33059                 if (!this.id) {
33060                     this.id = osmNote.id() + '';  // as string
33061                 }
33062
33063                 return this;
33064             },
33065
33066             extent: function() {
33067                 return new geoExtent(this.loc);
33068             },
33069
33070             update: function(attrs) {
33071                 return osmNote(this, attrs); // {v: 1 + (this.v || 0)}
33072             },
33073
33074             isNew: function() {
33075                 return this.id < 0;
33076             },
33077
33078             move: function(loc) {
33079                 return this.update({ loc: loc });
33080             }
33081
33082         });
33083
33084         function osmRelation() {
33085             if (!(this instanceof osmRelation)) {
33086                 return (new osmRelation()).initialize(arguments);
33087             } else if (arguments.length) {
33088                 this.initialize(arguments);
33089             }
33090         }
33091
33092
33093         osmEntity.relation = osmRelation;
33094
33095         osmRelation.prototype = Object.create(osmEntity.prototype);
33096
33097
33098         osmRelation.creationOrder = function(a, b) {
33099             var aId = parseInt(osmEntity.id.toOSM(a.id), 10);
33100             var bId = parseInt(osmEntity.id.toOSM(b.id), 10);
33101
33102             if (aId < 0 || bId < 0) return aId - bId;
33103             return bId - aId;
33104         };
33105
33106
33107         Object.assign(osmRelation.prototype, {
33108             type: 'relation',
33109             members: [],
33110
33111
33112             copy: function(resolver, copies) {
33113                 if (copies[this.id]) return copies[this.id];
33114
33115                 var copy = osmEntity.prototype.copy.call(this, resolver, copies);
33116
33117                 var members = this.members.map(function(member) {
33118                     return Object.assign({}, member, { id: resolver.entity(member.id).copy(resolver, copies).id });
33119                 });
33120
33121                 copy = copy.update({members: members});
33122                 copies[this.id] = copy;
33123
33124                 return copy;
33125             },
33126
33127
33128             extent: function(resolver, memo) {
33129                 return resolver.transient(this, 'extent', function() {
33130                     if (memo && memo[this.id]) return geoExtent();
33131                     memo = memo || {};
33132                     memo[this.id] = true;
33133
33134                     var extent = geoExtent();
33135                     for (var i = 0; i < this.members.length; i++) {
33136                         var member = resolver.hasEntity(this.members[i].id);
33137                         if (member) {
33138                             extent._extend(member.extent(resolver, memo));
33139                         }
33140                     }
33141                     return extent;
33142                 });
33143             },
33144
33145
33146             geometry: function(graph) {
33147                 return graph.transient(this, 'geometry', function() {
33148                     return this.isMultipolygon() ? 'area' : 'relation';
33149                 });
33150             },
33151
33152
33153             isDegenerate: function() {
33154                 return this.members.length === 0;
33155             },
33156
33157
33158             // Return an array of members, each extended with an 'index' property whose value
33159             // is the member index.
33160             indexedMembers: function() {
33161                 var result = new Array(this.members.length);
33162                 for (var i = 0; i < this.members.length; i++) {
33163                     result[i] = Object.assign({}, this.members[i], {index: i});
33164                 }
33165                 return result;
33166             },
33167
33168
33169             // Return the first member with the given role. A copy of the member object
33170             // is returned, extended with an 'index' property whose value is the member index.
33171             memberByRole: function(role) {
33172                 for (var i = 0; i < this.members.length; i++) {
33173                     if (this.members[i].role === role) {
33174                         return Object.assign({}, this.members[i], {index: i});
33175                     }
33176                 }
33177             },
33178
33179             // Same as memberByRole, but returns all members with the given role
33180             membersByRole: function(role) {
33181                 var result = [];
33182                 for (var i = 0; i < this.members.length; i++) {
33183                     if (this.members[i].role === role) {
33184                         result.push(Object.assign({}, this.members[i], {index: i}));
33185                     }
33186                 }
33187                 return result;
33188             },
33189
33190             // Return the first member with the given id. A copy of the member object
33191             // is returned, extended with an 'index' property whose value is the member index.
33192             memberById: function(id) {
33193                 for (var i = 0; i < this.members.length; i++) {
33194                     if (this.members[i].id === id) {
33195                         return Object.assign({}, this.members[i], {index: i});
33196                     }
33197                 }
33198             },
33199
33200
33201             // Return the first member with the given id and role. A copy of the member object
33202             // is returned, extended with an 'index' property whose value is the member index.
33203             memberByIdAndRole: function(id, role) {
33204                 for (var i = 0; i < this.members.length; i++) {
33205                     if (this.members[i].id === id && this.members[i].role === role) {
33206                         return Object.assign({}, this.members[i], {index: i});
33207                     }
33208                 }
33209             },
33210
33211
33212             addMember: function(member, index) {
33213                 var members = this.members.slice();
33214                 members.splice(index === undefined ? members.length : index, 0, member);
33215                 return this.update({members: members});
33216             },
33217
33218
33219             updateMember: function(member, index) {
33220                 var members = this.members.slice();
33221                 members.splice(index, 1, Object.assign({}, members[index], member));
33222                 return this.update({members: members});
33223             },
33224
33225
33226             removeMember: function(index) {
33227                 var members = this.members.slice();
33228                 members.splice(index, 1);
33229                 return this.update({members: members});
33230             },
33231
33232
33233             removeMembersWithID: function(id) {
33234                 var members = this.members.filter(function(m) { return m.id !== id; });
33235                 return this.update({members: members});
33236             },
33237
33238             moveMember: function(fromIndex, toIndex) {
33239                 var members = this.members.slice();
33240                 members.splice(toIndex, 0, members.splice(fromIndex, 1)[0]);
33241                 return this.update({members: members});
33242             },
33243
33244
33245             // Wherever a member appears with id `needle.id`, replace it with a member
33246             // with id `replacement.id`, type `replacement.type`, and the original role,
33247             // By default, adding a duplicate member (by id and role) is prevented.
33248             // Return an updated relation.
33249             replaceMember: function(needle, replacement, keepDuplicates) {
33250                 if (!this.memberById(needle.id)) return this;
33251
33252                 var members = [];
33253
33254                 for (var i = 0; i < this.members.length; i++) {
33255                     var member = this.members[i];
33256                     if (member.id !== needle.id) {
33257                         members.push(member);
33258                     } else if (keepDuplicates || !this.memberByIdAndRole(replacement.id, member.role)) {
33259                         members.push({ id: replacement.id, type: replacement.type, role: member.role });
33260                     }
33261                 }
33262
33263                 return this.update({ members: members });
33264             },
33265
33266
33267             asJXON: function(changeset_id) {
33268                 var r = {
33269                     relation: {
33270                         '@id': this.osmId(),
33271                         '@version': this.version || 0,
33272                         member: this.members.map(function(member) {
33273                             return {
33274                                 keyAttributes: {
33275                                     type: member.type,
33276                                     role: member.role,
33277                                     ref: osmEntity.id.toOSM(member.id)
33278                                 }
33279                             };
33280                         }, this),
33281                         tag: Object.keys(this.tags).map(function(k) {
33282                             return { keyAttributes: { k: k, v: this.tags[k] } };
33283                         }, this)
33284                     }
33285                 };
33286                 if (changeset_id) {
33287                     r.relation['@changeset'] = changeset_id;
33288                 }
33289                 return r;
33290             },
33291
33292
33293             asGeoJSON: function(resolver) {
33294                 return resolver.transient(this, 'GeoJSON', function () {
33295                     if (this.isMultipolygon()) {
33296                         return {
33297                             type: 'MultiPolygon',
33298                             coordinates: this.multipolygon(resolver)
33299                         };
33300                     } else {
33301                         return {
33302                             type: 'FeatureCollection',
33303                             properties: this.tags,
33304                             features: this.members.map(function (member) {
33305                                 return Object.assign({role: member.role}, resolver.entity(member.id).asGeoJSON(resolver));
33306                             })
33307                         };
33308                     }
33309                 });
33310             },
33311
33312
33313             area: function(resolver) {
33314                 return resolver.transient(this, 'area', function() {
33315                     return d3_geoArea(this.asGeoJSON(resolver));
33316                 });
33317             },
33318
33319
33320             isMultipolygon: function() {
33321                 return this.tags.type === 'multipolygon';
33322             },
33323
33324
33325             isComplete: function(resolver) {
33326                 for (var i = 0; i < this.members.length; i++) {
33327                     if (!resolver.hasEntity(this.members[i].id)) {
33328                         return false;
33329                     }
33330                 }
33331                 return true;
33332             },
33333
33334
33335             hasFromViaTo: function() {
33336                 return (
33337                     this.members.some(function(m) { return m.role === 'from'; }) &&
33338                     this.members.some(function(m) { return m.role === 'via'; }) &&
33339                     this.members.some(function(m) { return m.role === 'to'; })
33340                 );
33341             },
33342
33343
33344             isRestriction: function() {
33345                 return !!(this.tags.type && this.tags.type.match(/^restriction:?/));
33346             },
33347
33348
33349             isValidRestriction: function() {
33350                 if (!this.isRestriction()) return false;
33351
33352                 var froms = this.members.filter(function(m) { return m.role === 'from'; });
33353                 var vias = this.members.filter(function(m) { return m.role === 'via'; });
33354                 var tos = this.members.filter(function(m) { return m.role === 'to'; });
33355
33356                 if (froms.length !== 1 && this.tags.restriction !== 'no_entry') return false;
33357                 if (froms.some(function(m) { return m.type !== 'way'; })) return false;
33358
33359                 if (tos.length !== 1 && this.tags.restriction !== 'no_exit') return false;
33360                 if (tos.some(function(m) { return m.type !== 'way'; })) return false;
33361
33362                 if (vias.length === 0) return false;
33363                 if (vias.length > 1 && vias.some(function(m) { return m.type !== 'way'; })) return false;
33364
33365                 return true;
33366             },
33367
33368
33369             // Returns an array [A0, ... An], each Ai being an array of node arrays [Nds0, ... Ndsm],
33370             // where Nds0 is an outer ring and subsequent Ndsi's (if any i > 0) being inner rings.
33371             //
33372             // This corresponds to the structure needed for rendering a multipolygon path using a
33373             // `evenodd` fill rule, as well as the structure of a GeoJSON MultiPolygon geometry.
33374             //
33375             // In the case of invalid geometries, this function will still return a result which
33376             // includes the nodes of all way members, but some Nds may be unclosed and some inner
33377             // rings not matched with the intended outer ring.
33378             //
33379             multipolygon: function(resolver) {
33380                 var outers = this.members.filter(function(m) { return 'outer' === (m.role || 'outer'); });
33381                 var inners = this.members.filter(function(m) { return 'inner' === m.role; });
33382
33383                 outers = osmJoinWays(outers, resolver);
33384                 inners = osmJoinWays(inners, resolver);
33385
33386                 outers = outers.map(function(outer) {
33387                     return outer.nodes.map(function(node) { return node.loc; });
33388                 });
33389                 inners = inners.map(function(inner) {
33390                     return inner.nodes.map(function(node) { return node.loc; });
33391                 });
33392
33393                 var result = outers.map(function(o) {
33394                     // Heuristic for detecting counterclockwise winding order. Assumes
33395                     // that OpenStreetMap polygons are not hemisphere-spanning.
33396                     return [d3_geoArea({ type: 'Polygon', coordinates: [o] }) > 2 * Math.PI ? o.reverse() : o];
33397                 });
33398
33399                 function findOuter(inner) {
33400                     var o, outer;
33401
33402                     for (o = 0; o < outers.length; o++) {
33403                         outer = outers[o];
33404                         if (geoPolygonContainsPolygon(outer, inner))
33405                             return o;
33406                     }
33407
33408                     for (o = 0; o < outers.length; o++) {
33409                         outer = outers[o];
33410                         if (geoPolygonIntersectsPolygon(outer, inner, false))
33411                             return o;
33412                     }
33413                 }
33414
33415                 for (var i = 0; i < inners.length; i++) {
33416                     var inner = inners[i];
33417
33418                     if (d3_geoArea({ type: 'Polygon', coordinates: [inner] }) < 2 * Math.PI) {
33419                         inner = inner.reverse();
33420                     }
33421
33422                     var o = findOuter(inners[i]);
33423                     if (o !== undefined) {
33424                         result[o].push(inners[i]);
33425                     } else {
33426                         result.push([inners[i]]); // Invalid geometry
33427                     }
33428                 }
33429
33430                 return result;
33431             }
33432         });
33433
33434         var services = {improveOSM:{errorTypes:{ow:{icon:"fas-long-arrow-alt-right",category:"routing"},"mr-both":{icon:"maki-car",category:"geometry"},"mr-parking":{icon:"maki-parking",category:"geometry"},"mr-path":{icon:"maki-shoe",category:"geometry"},"mr-road":{icon:"maki-car",category:"geometry"},tr:{icon:"temaki-junction",category:"routing"}}},keepRight:{errorTypes:{}}};
33435
33436         function qaError() {
33437             if (!(this instanceof qaError)) {
33438                 return (new qaError()).initialize(arguments);
33439             } else if (arguments.length) {
33440                 this.initialize(arguments);
33441             }
33442         }
33443
33444         // Generic handling for services without nice IDs
33445         qaError.id = function() {
33446             return qaError.id.next--;
33447         };
33448
33449         qaError.id.next = -1;
33450
33451         Object.assign(qaError.prototype, {
33452             type: 'qaError',
33453
33454             // All errors need a position
33455             loc: [0, 0],
33456
33457             // These should be passed in, used to retrieve from qa_errors.json
33458             service: '',
33459             error_type: '',
33460
33461             initialize: function(sources) {
33462                 for (var i = 0; i < sources.length; ++i) {
33463                     var source = sources[i];
33464                     for (var prop in source) {
33465                         if (Object.prototype.hasOwnProperty.call(source, prop)) {
33466                             if (source[prop] === undefined) {
33467                                 delete this[prop];
33468                             } else {
33469                                 this[prop] = source[prop];
33470                             }
33471                         }
33472                     }
33473                 }
33474
33475                 // Extract common error information from data
33476                 if (this.service && this.error_type) {
33477                     var serviceInfo = services[this.service];
33478
33479                     if (serviceInfo) {
33480                         var errInfo = serviceInfo.errorTypes[this.error_type];
33481
33482                         if (errInfo) {
33483                             this.icon = errInfo.icon;
33484                             this.category = errInfo.category;
33485                         }
33486                     }
33487                 }
33488
33489                 // All errors must have an ID for selection
33490                 if (!this.id) {
33491                     this.id = qaError.id() + '';  // as string
33492                 }
33493
33494                 return this;
33495             },
33496
33497             update: function(attrs) {
33498                 return qaError(this, attrs); // {v: 1 + (this.v || 0)}
33499             }
33500         });
33501
33502         // Split a way at the given node.
33503         //
33504         // Optionally, split only the given ways, if multiple ways share
33505         // the given node.
33506         //
33507         // This is the inverse of `iD.actionJoin`.
33508         //
33509         // For testing convenience, accepts an ID to assign to the new way.
33510         // Normally, this will be undefined and the way will automatically
33511         // be assigned a new ID.
33512         //
33513         // Reference:
33514         //   https://github.com/systemed/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/SplitWayAction.as
33515         //
33516         function actionSplit(nodeId, newWayIds) {
33517             var _wayIDs;
33518
33519             // If the way is closed, we need to search for a partner node
33520             // to split the way at.
33521             //
33522             // The following looks for a node that is both far away from
33523             // the initial node in terms of way segment length and nearby
33524             // in terms of beeline-distance. This assures that areas get
33525             // split on the most "natural" points (independent of the number
33526             // of nodes).
33527             // For example: bone-shaped areas get split across their waist
33528             // line, circles across the diameter.
33529             function splitArea(nodes, idxA, graph) {
33530                 var lengths = new Array(nodes.length);
33531                 var length;
33532                 var i;
33533                 var best = 0;
33534                 var idxB;
33535
33536                 function wrap(index) {
33537                     return utilWrap(index, nodes.length);
33538                 }
33539
33540                 function dist(nA, nB) {
33541                     var locA = graph.entity(nA).loc;
33542                     var locB = graph.entity(nB).loc;
33543                     var epsilon = 1e-6;
33544                     return (locA && locB) ? geoSphericalDistance(locA, locB) : epsilon;
33545                 }
33546
33547                 // calculate lengths
33548                 length = 0;
33549                 for (i = wrap(idxA + 1); i !== idxA; i = wrap(i + 1)) {
33550                     length += dist(nodes[i], nodes[wrap(i - 1)]);
33551                     lengths[i] = length;
33552                 }
33553
33554                 length = 0;
33555                 for (i = wrap(idxA - 1); i !== idxA; i = wrap(i - 1)) {
33556                     length += dist(nodes[i], nodes[wrap(i + 1)]);
33557                     if (length < lengths[i]) {
33558                         lengths[i] = length;
33559                     }
33560                 }
33561
33562                 // determine best opposite node to split
33563                 for (i = 0; i < nodes.length; i++) {
33564                     var cost = lengths[i] / dist(nodes[idxA], nodes[i]);
33565                     if (cost > best) {
33566                         idxB = i;
33567                         best = cost;
33568                     }
33569                 }
33570
33571                 return idxB;
33572             }
33573
33574
33575             function split(graph, wayA, newWayId) {
33576                 var wayB = osmWay({ id: newWayId, tags: wayA.tags });   // `wayB` is the NEW way
33577                 var origNodes = wayA.nodes.slice();
33578                 var nodesA;
33579                 var nodesB;
33580                 var isArea = wayA.isArea();
33581                 var isOuter = osmIsOldMultipolygonOuterMember(wayA, graph);
33582
33583                 if (wayA.isClosed()) {
33584                     var nodes = wayA.nodes.slice(0, -1);
33585                     var idxA = nodes.indexOf(nodeId);
33586                     var idxB = splitArea(nodes, idxA, graph);
33587
33588                     if (idxB < idxA) {
33589                         nodesA = nodes.slice(idxA).concat(nodes.slice(0, idxB + 1));
33590                         nodesB = nodes.slice(idxB, idxA + 1);
33591                     } else {
33592                         nodesA = nodes.slice(idxA, idxB + 1);
33593                         nodesB = nodes.slice(idxB).concat(nodes.slice(0, idxA + 1));
33594                     }
33595                 } else {
33596                     var idx = wayA.nodes.indexOf(nodeId, 1);
33597                     nodesA = wayA.nodes.slice(0, idx + 1);
33598                     nodesB = wayA.nodes.slice(idx);
33599                 }
33600
33601                 wayA = wayA.update({ nodes: nodesA });
33602                 wayB = wayB.update({ nodes: nodesB });
33603
33604                 graph = graph.replace(wayA);
33605                 graph = graph.replace(wayB);
33606
33607                 graph.parentRelations(wayA).forEach(function(relation) {
33608                     var member;
33609
33610                     // Turn restrictions - make sure:
33611                     // 1. Splitting a FROM/TO way - only `wayA` OR `wayB` remains in relation
33612                     //    (whichever one is connected to the VIA node/ways)
33613                     // 2. Splitting a VIA way - `wayB` remains in relation as a VIA way
33614                     if (relation.hasFromViaTo()) {
33615                         var f = relation.memberByRole('from');
33616                         var v = relation.membersByRole('via');
33617                         var t = relation.memberByRole('to');
33618                         var i;
33619
33620                         // 1. split a FROM/TO
33621                         if (f.id === wayA.id || t.id === wayA.id) {
33622                             var keepB = false;
33623                             if (v.length === 1 && v[0].type === 'node') {   // check via node
33624                                 keepB = wayB.contains(v[0].id);
33625                             } else {                                        // check via way(s)
33626                                 for (i = 0; i < v.length; i++) {
33627                                     if (v[i].type === 'way') {
33628                                         var wayVia = graph.hasEntity(v[i].id);
33629                                         if (wayVia && utilArrayIntersection(wayB.nodes, wayVia.nodes).length) {
33630                                             keepB = true;
33631                                             break;
33632                                         }
33633                                     }
33634                                 }
33635                             }
33636
33637                             if (keepB) {
33638                                 relation = relation.replaceMember(wayA, wayB);
33639                                 graph = graph.replace(relation);
33640                             }
33641
33642                         // 2. split a VIA
33643                         } else {
33644                             for (i = 0; i < v.length; i++) {
33645                                 if (v[i].type === 'way' && v[i].id === wayA.id) {
33646                                     member = {
33647                                         id: wayB.id,
33648                                         type: 'way',
33649                                         role: 'via'
33650                                     };
33651                                     graph = actionAddMember(relation.id, member, v[i].index + 1)(graph);
33652                                     break;
33653                                 }
33654                             }
33655                         }
33656
33657                     // All other relations (Routes, Multipolygons, etc):
33658                     // 1. Both `wayA` and `wayB` remain in the relation
33659                     // 2. But must be inserted as a pair (see `actionAddMember` for details)
33660                     } else {
33661                         if (relation === isOuter) {
33662                             graph = graph.replace(relation.mergeTags(wayA.tags));
33663                             graph = graph.replace(wayA.update({ tags: {} }));
33664                             graph = graph.replace(wayB.update({ tags: {} }));
33665                         }
33666
33667                         member = {
33668                             id: wayB.id,
33669                             type: 'way',
33670                             role: relation.memberById(wayA.id).role
33671                         };
33672
33673                         var insertPair = {
33674                             originalID: wayA.id,
33675                             insertedID: wayB.id,
33676                             nodes: origNodes
33677                         };
33678
33679                         graph = actionAddMember(relation.id, member, undefined, insertPair)(graph);
33680                     }
33681                 });
33682
33683                 if (!isOuter && isArea) {
33684                     var multipolygon = osmRelation({
33685                         tags: Object.assign({}, wayA.tags, { type: 'multipolygon' }),
33686                         members: [
33687                             { id: wayA.id, role: 'outer', type: 'way' },
33688                             { id: wayB.id, role: 'outer', type: 'way' }
33689                         ]
33690                     });
33691
33692                     graph = graph.replace(multipolygon);
33693                     graph = graph.replace(wayA.update({ tags: {} }));
33694                     graph = graph.replace(wayB.update({ tags: {} }));
33695                 }
33696
33697                 return graph;
33698             }
33699
33700
33701             var action = function(graph) {
33702                 var candidates = action.ways(graph);
33703                 for (var i = 0; i < candidates.length; i++) {
33704                     graph = split(graph, candidates[i], newWayIds && newWayIds[i]);
33705                 }
33706                 return graph;
33707             };
33708
33709
33710             action.ways = function(graph) {
33711                 var node = graph.entity(nodeId);
33712                 var parents = graph.parentWays(node);
33713                 var hasLines = parents.some(function(parent) {
33714                     return parent.geometry(graph) === 'line';
33715                 });
33716
33717                 return parents.filter(function(parent) {
33718                     if (_wayIDs && _wayIDs.indexOf(parent.id) === -1)
33719                         return false;
33720
33721                     if (!_wayIDs && hasLines && parent.geometry(graph) !== 'line')
33722                         return false;
33723
33724                     if (parent.isClosed()) {
33725                         return true;
33726                     }
33727
33728                     for (var i = 1; i < parent.nodes.length - 1; i++) {
33729                         if (parent.nodes[i] === nodeId) {
33730                             return true;
33731                         }
33732                     }
33733
33734                     return false;
33735                 });
33736             };
33737
33738
33739             action.disabled = function(graph) {
33740                 var candidates = action.ways(graph);
33741                 if (candidates.length === 0 || (_wayIDs && _wayIDs.length !== candidates.length)) {
33742                     return 'not_eligible';
33743                 }
33744             };
33745
33746
33747             action.limitWays = function(val) {
33748                 if (!arguments.length) return _wayIDs;
33749                 _wayIDs = val;
33750                 return action;
33751             };
33752
33753
33754             return action;
33755         }
33756
33757         function coreGraph(other, mutable) {
33758             if (!(this instanceof coreGraph)) return new coreGraph(other, mutable);
33759
33760             if (other instanceof coreGraph) {
33761                 var base = other.base();
33762                 this.entities = Object.assign(Object.create(base.entities), other.entities);
33763                 this._parentWays = Object.assign(Object.create(base.parentWays), other._parentWays);
33764                 this._parentRels = Object.assign(Object.create(base.parentRels), other._parentRels);
33765
33766             } else {
33767                 this.entities = Object.create({});
33768                 this._parentWays = Object.create({});
33769                 this._parentRels = Object.create({});
33770                 this.rebase(other || [], [this]);
33771             }
33772
33773             this.transients = {};
33774             this._childNodes = {};
33775             this.frozen = !mutable;
33776         }
33777
33778
33779         coreGraph.prototype = {
33780
33781             hasEntity: function(id) {
33782                 return this.entities[id];
33783             },
33784
33785
33786             entity: function(id) {
33787                 var entity = this.entities[id];
33788
33789                 //https://github.com/openstreetmap/iD/issues/3973#issuecomment-307052376
33790                 if (!entity) {
33791                     entity = this.entities.__proto__[id];  // eslint-disable-line no-proto
33792                 }
33793
33794                 if (!entity) {
33795                     throw new Error('entity ' + id + ' not found');
33796                 }
33797                 return entity;
33798             },
33799
33800
33801             transient: function(entity, key, fn) {
33802                 var id = entity.id;
33803                 var transients = this.transients[id] || (this.transients[id] = {});
33804
33805                 if (transients[key] !== undefined) {
33806                     return transients[key];
33807                 }
33808
33809                 transients[key] = fn.call(entity);
33810
33811                 return transients[key];
33812             },
33813
33814
33815             parentWays: function(entity) {
33816                 var parents = this._parentWays[entity.id];
33817                 var result = [];
33818                 if (parents) {
33819                     parents.forEach(function(id) {
33820                         result.push(this.entity(id));
33821                     }, this);
33822                 }
33823                 return result;
33824             },
33825
33826
33827             isPoi: function(entity) {
33828                 var parents = this._parentWays[entity.id];
33829                 return !parents || parents.size === 0;
33830             },
33831
33832
33833             isShared: function(entity) {
33834                 var parents = this._parentWays[entity.id];
33835                 return parents && parents.size > 1;
33836             },
33837
33838
33839             parentRelations: function(entity) {
33840                 var parents = this._parentRels[entity.id];
33841                 var result = [];
33842                 if (parents) {
33843                     parents.forEach(function(id) {
33844                         result.push(this.entity(id));
33845                     }, this);
33846                 }
33847                 return result;
33848             },
33849
33850             parentMultipolygons: function(entity) {
33851                 return this.parentRelations(entity).filter(function(relation) {
33852                     return relation.isMultipolygon();
33853                 });
33854             },
33855
33856
33857             childNodes: function(entity) {
33858                 if (this._childNodes[entity.id]) return this._childNodes[entity.id];
33859                 if (!entity.nodes) return [];
33860
33861                 var nodes = [];
33862                 for (var i = 0; i < entity.nodes.length; i++) {
33863                     nodes[i] = this.entity(entity.nodes[i]);
33864                 }
33865
33866                 this._childNodes[entity.id] = nodes;
33867                 return this._childNodes[entity.id];
33868             },
33869
33870
33871             base: function() {
33872                 return {
33873                     'entities': Object.getPrototypeOf(this.entities),
33874                     'parentWays': Object.getPrototypeOf(this._parentWays),
33875                     'parentRels': Object.getPrototypeOf(this._parentRels)
33876                 };
33877             },
33878
33879
33880             // Unlike other graph methods, rebase mutates in place. This is because it
33881             // is used only during the history operation that merges newly downloaded
33882             // data into each state. To external consumers, it should appear as if the
33883             // graph always contained the newly downloaded data.
33884             rebase: function(entities, stack, force) {
33885                 var base = this.base();
33886                 var i, j, k, id;
33887
33888                 for (i = 0; i < entities.length; i++) {
33889                     var entity = entities[i];
33890
33891                     if (!entity.visible || (!force && base.entities[entity.id]))
33892                         continue;
33893
33894                     // Merging data into the base graph
33895                     base.entities[entity.id] = entity;
33896                     this._updateCalculated(undefined, entity, base.parentWays, base.parentRels);
33897
33898                     // Restore provisionally-deleted nodes that are discovered to have an extant parent
33899                     if (entity.type === 'way') {
33900                         for (j = 0; j < entity.nodes.length; j++) {
33901                             id = entity.nodes[j];
33902                             for (k = 1; k < stack.length; k++) {
33903                                 var ents = stack[k].entities;
33904                                 if (ents.hasOwnProperty(id) && ents[id] === undefined) {
33905                                     delete ents[id];
33906                                 }
33907                             }
33908                         }
33909                     }
33910                 }
33911
33912                 for (i = 0; i < stack.length; i++) {
33913                     stack[i]._updateRebased();
33914                 }
33915             },
33916
33917
33918             _updateRebased: function() {
33919                 var base = this.base();
33920
33921                 Object.keys(this._parentWays).forEach(function(child) {
33922                     if (base.parentWays[child]) {
33923                         base.parentWays[child].forEach(function(id) {
33924                             if (!this.entities.hasOwnProperty(id)) {
33925                                 this._parentWays[child].add(id);
33926                             }
33927                         }, this);
33928                     }
33929                 }, this);
33930
33931                 Object.keys(this._parentRels).forEach(function(child) {
33932                     if (base.parentRels[child]) {
33933                         base.parentRels[child].forEach(function(id) {
33934                             if (!this.entities.hasOwnProperty(id)) {
33935                                 this._parentRels[child].add(id);
33936                             }
33937                         }, this);
33938                     }
33939                 }, this);
33940
33941                 this.transients = {};
33942
33943                 // this._childNodes is not updated, under the assumption that
33944                 // ways are always downloaded with their child nodes.
33945             },
33946
33947
33948             // Updates calculated properties (parentWays, parentRels) for the specified change
33949             _updateCalculated: function(oldentity, entity, parentWays, parentRels) {
33950                 parentWays = parentWays || this._parentWays;
33951                 parentRels = parentRels || this._parentRels;
33952
33953                 var type = entity && entity.type || oldentity && oldentity.type;
33954                 var removed, added, i;
33955
33956                 if (type === 'way') {   // Update parentWays
33957                     if (oldentity && entity) {
33958                         removed = utilArrayDifference(oldentity.nodes, entity.nodes);
33959                         added = utilArrayDifference(entity.nodes, oldentity.nodes);
33960                     } else if (oldentity) {
33961                         removed = oldentity.nodes;
33962                         added = [];
33963                     } else if (entity) {
33964                         removed = [];
33965                         added = entity.nodes;
33966                     }
33967                     for (i = 0; i < removed.length; i++) {
33968                         // make a copy of prototype property, store as own property, and update..
33969                         parentWays[removed[i]] = new Set(parentWays[removed[i]]);
33970                         parentWays[removed[i]].delete(oldentity.id);
33971                     }
33972                     for (i = 0; i < added.length; i++) {
33973                         // make a copy of prototype property, store as own property, and update..
33974                         parentWays[added[i]] = new Set(parentWays[added[i]]);
33975                         parentWays[added[i]].add(entity.id);
33976                     }
33977
33978                 } else if (type === 'relation') {   // Update parentRels
33979                     if (oldentity && entity) {
33980                         removed = utilArrayDifference(oldentity.members, entity.members);
33981                         added = utilArrayDifference(entity.members, oldentity.members);
33982                     } else if (oldentity) {
33983                         removed = oldentity.members;
33984                         added = [];
33985                     } else if (entity) {
33986                         removed = [];
33987                         added = entity.members;
33988                     }
33989                     for (i = 0; i < removed.length; i++) {
33990                         // make a copy of prototype property, store as own property, and update..
33991                         parentRels[removed[i].id] = new Set(parentRels[removed[i].id]);
33992                         parentRels[removed[i].id].delete(oldentity.id);
33993                     }
33994                     for (i = 0; i < added.length; i++) {
33995                         // make a copy of prototype property, store as own property, and update..
33996                         parentRels[added[i].id] = new Set(parentRels[added[i].id]);
33997                         parentRels[added[i].id].add(entity.id);
33998                     }
33999                 }
34000             },
34001
34002
34003             replace: function(entity) {
34004                 if (this.entities[entity.id] === entity) return this;
34005
34006                 return this.update(function() {
34007                     this._updateCalculated(this.entities[entity.id], entity);
34008                     this.entities[entity.id] = entity;
34009                 });
34010             },
34011
34012
34013             remove: function(entity) {
34014                 return this.update(function() {
34015                     this._updateCalculated(entity, undefined);
34016                     this.entities[entity.id] = undefined;
34017                 });
34018             },
34019
34020
34021             revert: function(id) {
34022                 var baseEntity = this.base().entities[id];
34023                 var headEntity = this.entities[id];
34024                 if (headEntity === baseEntity) return this;
34025
34026                 return this.update(function() {
34027                     this._updateCalculated(headEntity, baseEntity);
34028                     delete this.entities[id];
34029                 });
34030             },
34031
34032
34033             update: function() {
34034                 var graph = this.frozen ? coreGraph(this, true) : this;
34035                 for (var i = 0; i < arguments.length; i++) {
34036                     arguments[i].call(graph, graph);
34037                 }
34038
34039                 if (this.frozen) graph.frozen = true;
34040
34041                 return graph;
34042             },
34043
34044
34045             // Obliterates any existing entities
34046             load: function(entities) {
34047                 var base = this.base();
34048                 this.entities = Object.create(base.entities);
34049
34050                 for (var i in entities) {
34051                     this.entities[i] = entities[i];
34052                     this._updateCalculated(base.entities[i], this.entities[i]);
34053                 }
34054
34055                 return this;
34056             }
34057         };
34058
34059         function osmTurn(turn) {
34060             if (!(this instanceof osmTurn)) {
34061                 return new osmTurn(turn);
34062             }
34063             Object.assign(this, turn);
34064         }
34065
34066
34067         function osmIntersection(graph, startVertexId, maxDistance) {
34068             maxDistance = maxDistance || 30;    // in meters
34069             var vgraph = coreGraph();           // virtual graph
34070             var i, j, k;
34071
34072
34073             function memberOfRestriction(entity) {
34074                 return graph.parentRelations(entity)
34075                     .some(function(r) { return r.isRestriction(); });
34076             }
34077
34078             function isRoad(way) {
34079                 if (way.isArea() || way.isDegenerate()) return false;
34080                 var roads = {
34081                     'motorway': true,
34082                     'motorway_link': true,
34083                     'trunk': true,
34084                     'trunk_link': true,
34085                     'primary': true,
34086                     'primary_link': true,
34087                     'secondary': true,
34088                     'secondary_link': true,
34089                     'tertiary': true,
34090                     'tertiary_link': true,
34091                     'residential': true,
34092                     'unclassified': true,
34093                     'living_street': true,
34094                     'service': true,
34095                     'road': true,
34096                     'track': true
34097                 };
34098                 return roads[way.tags.highway];
34099             }
34100
34101
34102             var startNode = graph.entity(startVertexId);
34103             var checkVertices = [startNode];
34104             var checkWays;
34105             var vertices = [];
34106             var vertexIds = [];
34107             var vertex;
34108             var ways = [];
34109             var wayIds = [];
34110             var way;
34111             var nodes = [];
34112             var node;
34113             var parents = [];
34114             var parent;
34115
34116             // `actions` will store whatever actions must be performed to satisfy
34117             // preconditions for adding a turn restriction to this intersection.
34118             //  - Remove any existing degenerate turn restrictions (missing from/to, etc)
34119             //  - Reverse oneways so that they are drawn in the forward direction
34120             //  - Split ways on key vertices
34121             var actions = [];
34122
34123
34124             // STEP 1:  walk the graph outwards from starting vertex to search
34125             //  for more key vertices and ways to include in the intersection..
34126
34127             while (checkVertices.length) {
34128                 vertex = checkVertices.pop();
34129
34130                 // check this vertex for parent ways that are roads
34131                 checkWays = graph.parentWays(vertex);
34132                 var hasWays = false;
34133                 for (i = 0; i < checkWays.length; i++) {
34134                     way = checkWays[i];
34135                     if (!isRoad(way) && !memberOfRestriction(way)) continue;
34136
34137                     ways.push(way);   // it's a road, or it's already in a turn restriction
34138                     hasWays = true;
34139
34140                     // check the way's children for more key vertices
34141                     nodes = utilArrayUniq(graph.childNodes(way));
34142                     for (j = 0; j < nodes.length; j++) {
34143                         node = nodes[j];
34144                         if (node === vertex) continue;                                           // same thing
34145                         if (vertices.indexOf(node) !== -1) continue;                             // seen it already
34146                         if (geoSphericalDistance(node.loc, startNode.loc) > maxDistance) continue;   // too far from start
34147
34148                         // a key vertex will have parents that are also roads
34149                         var hasParents = false;
34150                         parents = graph.parentWays(node);
34151                         for (k = 0; k < parents.length; k++) {
34152                             parent = parents[k];
34153                             if (parent === way) continue;                 // same thing
34154                             if (ways.indexOf(parent) !== -1) continue;    // seen it already
34155                             if (!isRoad(parent)) continue;                // not a road
34156                             hasParents = true;
34157                             break;
34158                         }
34159
34160                         if (hasParents) {
34161                             checkVertices.push(node);
34162                         }
34163                     }
34164                 }
34165
34166                 if (hasWays) {
34167                     vertices.push(vertex);
34168                 }
34169             }
34170
34171             vertices = utilArrayUniq(vertices);
34172             ways = utilArrayUniq(ways);
34173
34174
34175             // STEP 2:  Build a virtual graph containing only the entities in the intersection..
34176             // Everything done after this step should act on the virtual graph
34177             // Any actions that must be performed later to the main graph go in `actions` array
34178             ways.forEach(function(way) {
34179                 graph.childNodes(way).forEach(function(node) {
34180                     vgraph = vgraph.replace(node);
34181                 });
34182
34183                 vgraph = vgraph.replace(way);
34184
34185                 graph.parentRelations(way).forEach(function(relation) {
34186                     if (relation.isRestriction()) {
34187                         if (relation.isValidRestriction(graph)) {
34188                             vgraph = vgraph.replace(relation);
34189                         } else if (relation.isComplete(graph)) {
34190                             actions.push(actionDeleteRelation(relation.id));
34191                         }
34192                     }
34193                 });
34194             });
34195
34196
34197             // STEP 3:  Force all oneways to be drawn in the forward direction
34198             ways.forEach(function(w) {
34199                 var way = vgraph.entity(w.id);
34200                 if (way.tags.oneway === '-1') {
34201                     var action = actionReverse(way.id, { reverseOneway: true });
34202                     actions.push(action);
34203                     vgraph = action(vgraph);
34204                 }
34205             });
34206
34207
34208             // STEP 4:  Split ways on key vertices
34209             var origCount = osmEntity.id.next.way;
34210             vertices.forEach(function(v) {
34211                 // This is an odd way to do it, but we need to find all the ways that
34212                 // will be split here, then split them one at a time to ensure that these
34213                 // actions can be replayed on the main graph exactly in the same order.
34214                 // (It is unintuitive, but the order of ways returned from graph.parentWays()
34215                 // is arbitrary, depending on how the main graph and vgraph were built)
34216                 var splitAll = actionSplit(v.id);
34217                 if (!splitAll.disabled(vgraph)) {
34218                     splitAll.ways(vgraph).forEach(function(way) {
34219                         var splitOne = actionSplit(v.id).limitWays([way.id]);
34220                         actions.push(splitOne);
34221                         vgraph = splitOne(vgraph);
34222                     });
34223                 }
34224             });
34225
34226             // In here is where we should also split the intersection at nearby junction.
34227             //   for https://github.com/mapbox/iD-internal/issues/31
34228             // nearbyVertices.forEach(function(v) {
34229             // });
34230
34231             // Reasons why we reset the way id count here:
34232             //  1. Continuity with way ids created by the splits so that we can replay
34233             //     these actions later if the user decides to create a turn restriction
34234             //  2. Avoids churning way ids just by hovering over a vertex
34235             //     and displaying the turn restriction editor
34236             osmEntity.id.next.way = origCount;
34237
34238
34239             // STEP 5:  Update arrays to point to vgraph entities
34240             vertexIds = vertices.map(function(v) { return v.id; });
34241             vertices = [];
34242             ways = [];
34243
34244             vertexIds.forEach(function(id) {
34245                 var vertex = vgraph.entity(id);
34246                 var parents = vgraph.parentWays(vertex);
34247                 vertices.push(vertex);
34248                 ways = ways.concat(parents);
34249             });
34250
34251             vertices = utilArrayUniq(vertices);
34252             ways = utilArrayUniq(ways);
34253
34254             vertexIds = vertices.map(function(v) { return v.id; });
34255             wayIds = ways.map(function(w) { return w.id; });
34256
34257
34258             // STEP 6:  Update the ways with some metadata that will be useful for
34259             // walking the intersection graph later and rendering turn arrows.
34260
34261             function withMetadata(way, vertexIds) {
34262                 var __oneWay = way.isOneWay();
34263
34264                 // which affixes are key vertices?
34265                 var __first = (vertexIds.indexOf(way.first()) !== -1);
34266                 var __last = (vertexIds.indexOf(way.last()) !== -1);
34267
34268                 // what roles is this way eligible for?
34269                 var __via = (__first && __last);
34270                 var __from = ((__first && !__oneWay) || __last);
34271                 var __to = (__first || (__last && !__oneWay));
34272
34273                 return way.update({
34274                     __first:  __first,
34275                     __last:  __last,
34276                     __from:  __from,
34277                     __via: __via,
34278                     __to:  __to,
34279                     __oneWay:  __oneWay
34280                 });
34281             }
34282
34283             ways = [];
34284             wayIds.forEach(function(id) {
34285                 var way = withMetadata(vgraph.entity(id), vertexIds);
34286                 vgraph = vgraph.replace(way);
34287                 ways.push(way);
34288             });
34289
34290
34291             // STEP 7:  Simplify - This is an iterative process where we:
34292             //  1. Find trivial vertices with only 2 parents
34293             //  2. trim off the leaf way from those vertices and remove from vgraph
34294
34295             var keepGoing;
34296             var removeWayIds = [];
34297             var removeVertexIds = [];
34298
34299             do {
34300                 keepGoing = false;
34301                 checkVertices = vertexIds.slice();
34302
34303                 for (i = 0; i < checkVertices.length; i++) {
34304                     var vertexId = checkVertices[i];
34305                     vertex = vgraph.hasEntity(vertexId);
34306
34307                     if (!vertex) {
34308                         if (vertexIds.indexOf(vertexId) !== -1) {
34309                             vertexIds.splice(vertexIds.indexOf(vertexId), 1);   // stop checking this one
34310                         }
34311                         removeVertexIds.push(vertexId);
34312                         continue;
34313                     }
34314
34315                     parents = vgraph.parentWays(vertex);
34316                     if (parents.length < 3) {
34317                         if (vertexIds.indexOf(vertexId) !== -1) {
34318                             vertexIds.splice(vertexIds.indexOf(vertexId), 1);   // stop checking this one
34319                         }
34320                     }
34321
34322                     if (parents.length === 2) {     // vertex with 2 parents is trivial
34323                         var a = parents[0];
34324                         var b = parents[1];
34325                         var aIsLeaf = a && !a.__via;
34326                         var bIsLeaf = b && !b.__via;
34327                         var leaf, survivor;
34328
34329                         if (aIsLeaf && !bIsLeaf) {
34330                             leaf = a;
34331                             survivor = b;
34332                         } else if (!aIsLeaf && bIsLeaf) {
34333                             leaf = b;
34334                             survivor = a;
34335                         }
34336
34337                         if (leaf && survivor) {
34338                             survivor = withMetadata(survivor, vertexIds);      // update survivor way
34339                             vgraph = vgraph.replace(survivor).remove(leaf);    // update graph
34340                             removeWayIds.push(leaf.id);
34341                             keepGoing = true;
34342                         }
34343                     }
34344
34345                     parents = vgraph.parentWays(vertex);
34346
34347                     if (parents.length < 2) {     // vertex is no longer a key vertex
34348                         if (vertexIds.indexOf(vertexId) !== -1) {
34349                             vertexIds.splice(vertexIds.indexOf(vertexId), 1);   // stop checking this one
34350                         }
34351                         removeVertexIds.push(vertexId);
34352                         keepGoing = true;
34353                     }
34354
34355                     if (parents.length < 1) {     // vertex is no longer attached to anything
34356                         vgraph = vgraph.remove(vertex);
34357                     }
34358
34359                 }
34360             } while (keepGoing);
34361
34362
34363             vertices = vertices
34364                 .filter(function(vertex) { return removeVertexIds.indexOf(vertex.id) === -1; })
34365                 .map(function(vertex) { return vgraph.entity(vertex.id); });
34366             ways = ways
34367                 .filter(function(way) { return removeWayIds.indexOf(way.id) === -1; })
34368                 .map(function(way) { return vgraph.entity(way.id); });
34369
34370
34371             // OK!  Here is our intersection..
34372             var intersection = {
34373                 graph: vgraph,
34374                 actions: actions,
34375                 vertices: vertices,
34376                 ways: ways,
34377             };
34378
34379
34380
34381             // Get all the valid turns through this intersection given a starting way id.
34382             // This operates on the virtual graph for everything.
34383             //
34384             // Basically, walk through all possible paths from starting way,
34385             //   honoring the existing turn restrictions as we go (watch out for loops!)
34386             //
34387             // For each path found, generate and return a `osmTurn` datastructure.
34388             //
34389             intersection.turns = function(fromWayId, maxViaWay) {
34390                 if (!fromWayId) return [];
34391                 if (!maxViaWay) maxViaWay = 0;
34392
34393                 var vgraph = intersection.graph;
34394                 var keyVertexIds = intersection.vertices.map(function(v) { return v.id; });
34395
34396                 var start = vgraph.entity(fromWayId);
34397                 if (!start || !(start.__from || start.__via)) return [];
34398
34399                 // maxViaWay=0   from-*-to              (0 vias)
34400                 // maxViaWay=1   from-*-via-*-to        (1 via max)
34401                 // maxViaWay=2   from-*-via-*-via-*-to  (2 vias max)
34402                 var maxPathLength = (maxViaWay * 2) + 3;
34403                 var turns = [];
34404
34405                 step(start);
34406                 return turns;
34407
34408
34409                 // traverse the intersection graph and find all the valid paths
34410                 function step(entity, currPath, currRestrictions, matchedRestriction) {
34411                     currPath = (currPath || []).slice();  // shallow copy
34412                     if (currPath.length >= maxPathLength) return;
34413                     currPath.push(entity.id);
34414                     currRestrictions = (currRestrictions || []).slice();  // shallow copy
34415                     var i, j;
34416
34417                     if (entity.type === 'node') {
34418                         var parents = vgraph.parentWays(entity);
34419                         var nextWays = [];
34420
34421                         // which ways can we step into?
34422                         for (i = 0; i < parents.length; i++) {
34423                             var way = parents[i];
34424
34425                             // if next way is a oneway incoming to this vertex, skip
34426                             if (way.__oneWay && way.nodes[0] !== entity.id) continue;
34427
34428                             // if we have seen it before (allowing for an initial u-turn), skip
34429                             if (currPath.indexOf(way.id) !== -1 && currPath.length >= 3) continue;
34430
34431                             // Check all "current" restrictions (where we've already walked the `FROM`)
34432                             var restrict = undefined;
34433                             for (j = 0; j < currRestrictions.length; j++) {
34434                                 var restriction = currRestrictions[j];
34435                                 var f = restriction.memberByRole('from');
34436                                 var v = restriction.membersByRole('via');
34437                                 var t = restriction.memberByRole('to');
34438                                 var isOnly = /^only_/.test(restriction.tags.restriction);
34439
34440                                 // Does the current path match this turn restriction?
34441                                 var matchesFrom = (f.id === fromWayId);
34442                                 var matchesViaTo = false;
34443                                 var isAlongOnlyPath = false;
34444
34445                                 if (t.id === way.id) {     // match TO
34446
34447                                     if (v.length === 1 && v[0].type === 'node') {    // match VIA node
34448                                         matchesViaTo = (v[0].id === entity.id && (
34449                                             (matchesFrom && currPath.length === 2) ||
34450                                             (!matchesFrom && currPath.length > 2)
34451                                         ));
34452
34453                                     } else {                                         // match all VIA ways
34454                                         var pathVias = [];
34455                                         for (k = 2; k < currPath.length; k +=2 ) {   // k = 2 skips FROM
34456                                             pathVias.push(currPath[k]);              // (path goes way-node-way...)
34457                                         }
34458                                         var restrictionVias = [];
34459                                         for (k = 0; k < v.length; k++) {
34460                                             if (v[k].type === 'way') {
34461                                                 restrictionVias.push(v[k].id);
34462                                             }
34463                                         }
34464                                         var diff = utilArrayDifference(pathVias, restrictionVias);
34465                                         matchesViaTo = !diff.length;
34466                                     }
34467
34468                                 } else if (isOnly) {
34469                                     for (k = 0; k < v.length; k++) {
34470                                         // way doesn't match TO, but is one of the via ways along the path of an "only"
34471                                         if (v[k].type === 'way' && v[k].id === way.id) {
34472                                             isAlongOnlyPath = true;
34473                                             break;
34474                                         }
34475                                     }
34476                                 }
34477
34478                                 if (matchesViaTo) {
34479                                     if (isOnly) {
34480                                         restrict = { id: restriction.id, direct: matchesFrom, from: f.id, only: true, end: true };
34481                                     } else {
34482                                         restrict = { id: restriction.id, direct: matchesFrom, from: f.id, no: true, end: true };
34483                                     }
34484                                 } else {    // indirect - caused by a different nearby restriction
34485                                     if (isAlongOnlyPath) {
34486                                         restrict = { id: restriction.id, direct: false, from: f.id, only: true, end: false };
34487                                     } else if (isOnly) {
34488                                         restrict = { id: restriction.id, direct: false, from: f.id, no: true, end: true };
34489                                     }
34490                                 }
34491
34492                                 // stop looking if we find a "direct" restriction (matching FROM, VIA, TO)
34493                                 if (restrict && restrict.direct)
34494                                     break;
34495                             }
34496
34497                             nextWays.push({ way: way, restrict: restrict });
34498                         }
34499
34500                         nextWays.forEach(function(nextWay) {
34501                             step(nextWay.way, currPath, currRestrictions, nextWay.restrict);
34502                         });
34503
34504
34505                     } else {  // entity.type === 'way'
34506                         if (currPath.length >= 3) {     // this is a "complete" path..
34507                             var turnPath = currPath.slice();   // shallow copy
34508
34509                             // an indirect restriction - only include the partial path (starting at FROM)
34510                             if (matchedRestriction && matchedRestriction.direct === false) {
34511                                 for (i = 0; i < turnPath.length; i++) {
34512                                     if (turnPath[i] === matchedRestriction.from) {
34513                                         turnPath = turnPath.slice(i);
34514                                         break;
34515                                     }
34516                                 }
34517                             }
34518
34519                             var turn = pathToTurn(turnPath);
34520                             if (turn) {
34521                                 if (matchedRestriction) {
34522                                     turn.restrictionID = matchedRestriction.id;
34523                                     turn.no = matchedRestriction.no;
34524                                     turn.only = matchedRestriction.only;
34525                                     turn.direct = matchedRestriction.direct;
34526                                 }
34527                                 turns.push(osmTurn(turn));
34528                             }
34529
34530                             if (currPath[0] === currPath[2]) return;   // if we made a u-turn - stop here
34531                         }
34532
34533                         if (matchedRestriction && matchedRestriction.end) return;  // don't advance any further
34534
34535                         // which nodes can we step into?
34536                         var n1 = vgraph.entity(entity.first());
34537                         var n2 = vgraph.entity(entity.last());
34538                         var dist = geoSphericalDistance(n1.loc, n2.loc);
34539                         var nextNodes = [];
34540
34541                         if (currPath.length > 1) {
34542                             if (dist > maxDistance) return;   // the next node is too far
34543                             if (!entity.__via) return;        // this way is a leaf / can't be a via
34544                         }
34545
34546                         if (!entity.__oneWay &&                     // bidirectional..
34547                             keyVertexIds.indexOf(n1.id) !== -1 &&   // key vertex..
34548                             currPath.indexOf(n1.id) === -1) {       // haven't seen it yet..
34549                             nextNodes.push(n1);                     // can advance to first node
34550                         }
34551                         if (keyVertexIds.indexOf(n2.id) !== -1 &&   // key vertex..
34552                             currPath.indexOf(n2.id) === -1) {       // haven't seen it yet..
34553                             nextNodes.push(n2);                     // can advance to last node
34554                         }
34555
34556                         nextNodes.forEach(function(nextNode) {
34557                             // gather restrictions FROM this way
34558                             var fromRestrictions = vgraph.parentRelations(entity).filter(function(r) {
34559                                 if (!r.isRestriction()) return false;
34560
34561                                 var f = r.memberByRole('from');
34562                                 if (!f || f.id !== entity.id) return false;
34563
34564                                 var isOnly = /^only_/.test(r.tags.restriction);
34565                                 if (!isOnly) return true;
34566
34567                                 // `only_` restrictions only matter along the direction of the VIA - #4849
34568                                 var isOnlyVia = false;
34569                                 var v = r.membersByRole('via');
34570                                 if (v.length === 1 && v[0].type === 'node') {   // via node
34571                                     isOnlyVia = (v[0].id === nextNode.id);
34572                                 } else {                                        // via way(s)
34573                                     for (var i = 0; i < v.length; i++) {
34574                                         if (v[i].type !== 'way') continue;
34575                                         var viaWay = vgraph.entity(v[i].id);
34576                                         if (viaWay.first() === nextNode.id || viaWay.last() === nextNode.id) {
34577                                             isOnlyVia = true;
34578                                             break;
34579                                         }
34580                                     }
34581                                 }
34582                                 return isOnlyVia;
34583                             });
34584
34585                             step(nextNode, currPath, currRestrictions.concat(fromRestrictions), false);
34586                         });
34587                     }
34588                 }
34589
34590
34591                 // assumes path is alternating way-node-way of odd length
34592                 function pathToTurn(path) {
34593                     if (path.length < 3) return;
34594                     var fromWayId, fromNodeId, fromVertexId;
34595                     var toWayId, toNodeId, toVertexId;
34596                     var viaWayIds, viaNodeId, isUturn;
34597
34598                     fromWayId = path[0];
34599                     toWayId = path[path.length - 1];
34600
34601                     if (path.length === 3 && fromWayId === toWayId) {  // u turn
34602                         var way = vgraph.entity(fromWayId);
34603                         if (way.__oneWay) return null;
34604
34605                         isUturn = true;
34606                         viaNodeId = fromVertexId = toVertexId = path[1];
34607                         fromNodeId = toNodeId = adjacentNode(fromWayId, viaNodeId);
34608
34609                     } else {
34610                         isUturn = false;
34611                         fromVertexId = path[1];
34612                         fromNodeId = adjacentNode(fromWayId, fromVertexId);
34613                         toVertexId = path[path.length - 2];
34614                         toNodeId = adjacentNode(toWayId, toVertexId);
34615
34616                         if (path.length === 3) {
34617                             viaNodeId = path[1];
34618                         } else {
34619                             viaWayIds = path.filter(function(entityId) { return entityId[0] === 'w'; });
34620                             viaWayIds = viaWayIds.slice(1, viaWayIds.length - 1);  // remove first, last
34621                         }
34622                     }
34623
34624                     return {
34625                         key:  path.join('_'),
34626                         path: path,
34627                         from: { node: fromNodeId, way:  fromWayId, vertex: fromVertexId },
34628                         via:  { node: viaNodeId,  ways: viaWayIds },
34629                         to:   { node: toNodeId,   way:  toWayId, vertex: toVertexId },
34630                         u:    isUturn
34631                     };
34632
34633
34634                     function adjacentNode(wayId, affixId) {
34635                         var nodes = vgraph.entity(wayId).nodes;
34636                         return affixId === nodes[0] ? nodes[1] : nodes[nodes.length - 2];
34637                     }
34638                 }
34639
34640             };
34641
34642             return intersection;
34643         }
34644
34645
34646         function osmInferRestriction(graph, turn, projection) {
34647             var fromWay = graph.entity(turn.from.way);
34648             var fromNode = graph.entity(turn.from.node);
34649             var fromVertex = graph.entity(turn.from.vertex);
34650             var toWay = graph.entity(turn.to.way);
34651             var toNode = graph.entity(turn.to.node);
34652             var toVertex = graph.entity(turn.to.vertex);
34653
34654             var fromOneWay = (fromWay.tags.oneway === 'yes');
34655             var toOneWay = (toWay.tags.oneway === 'yes');
34656             var angle = (geoAngle(fromVertex, fromNode, projection) -
34657                         geoAngle(toVertex, toNode, projection)) * 180 / Math.PI;
34658
34659             while (angle < 0)
34660                 angle += 360;
34661
34662             if (fromNode === toNode)
34663                 return 'no_u_turn';
34664             if ((angle < 23 || angle > 336) && fromOneWay && toOneWay)
34665                 return 'no_u_turn';   // wider tolerance for u-turn if both ways are oneway
34666             if ((angle < 40 || angle > 319) && fromOneWay && toOneWay && turn.from.vertex !== turn.to.vertex)
34667                 return 'no_u_turn';   // even wider tolerance for u-turn if there is a via way (from !== to)
34668             if (angle < 158)
34669                 return 'no_right_turn';
34670             if (angle > 202)
34671                 return 'no_left_turn';
34672
34673             return 'no_straight_on';
34674         }
34675
34676         function actionMergePolygon(ids, newRelationId) {
34677
34678             function groupEntities(graph) {
34679                 var entities = ids.map(function (id) { return graph.entity(id); });
34680                 var geometryGroups = utilArrayGroupBy(entities, function(entity) {
34681                     if (entity.type === 'way' && entity.isClosed()) {
34682                         return 'closedWay';
34683                     } else if (entity.type === 'relation' && entity.isMultipolygon()) {
34684                         return 'multipolygon';
34685                     } else {
34686                         return 'other';
34687                     }
34688                 });
34689
34690                 return Object.assign(
34691                     { closedWay: [], multipolygon: [], other: [] },
34692                     geometryGroups
34693                 );
34694             }
34695
34696
34697             var action = function(graph) {
34698                 var entities = groupEntities(graph);
34699
34700                 // An array representing all the polygons that are part of the multipolygon.
34701                 //
34702                 // Each element is itself an array of objects with an id property, and has a
34703                 // locs property which is an array of the locations forming the polygon.
34704                 var polygons = entities.multipolygon.reduce(function(polygons, m) {
34705                     return polygons.concat(osmJoinWays(m.members, graph));
34706                 }, []).concat(entities.closedWay.map(function(d) {
34707                     var member = [{id: d.id}];
34708                     member.nodes = graph.childNodes(d);
34709                     return member;
34710                 }));
34711
34712                 // contained is an array of arrays of boolean values,
34713                 // where contained[j][k] is true iff the jth way is
34714                 // contained by the kth way.
34715                 var contained = polygons.map(function(w, i) {
34716                     return polygons.map(function(d, n) {
34717                         if (i === n) return null;
34718                         return geoPolygonContainsPolygon(
34719                             d.nodes.map(function(n) { return n.loc; }),
34720                             w.nodes.map(function(n) { return n.loc; })
34721                         );
34722                     });
34723                 });
34724
34725                 // Sort all polygons as either outer or inner ways
34726                 var members = [];
34727                 var outer = true;
34728
34729                 while (polygons.length) {
34730                     extractUncontained(polygons);
34731                     polygons = polygons.filter(isContained);
34732                     contained = contained.filter(isContained).map(filterContained);
34733                 }
34734
34735                 function isContained(d, i) {
34736                     return contained[i].some(function(val) { return val; });
34737                 }
34738
34739                 function filterContained(d) {
34740                     return d.filter(isContained);
34741                 }
34742
34743                 function extractUncontained(polygons) {
34744                     polygons.forEach(function(d, i) {
34745                         if (!isContained(d, i)) {
34746                             d.forEach(function(member) {
34747                                 members.push({
34748                                     type: 'way',
34749                                     id: member.id,
34750                                     role: outer ? 'outer' : 'inner'
34751                                 });
34752                             });
34753                         }
34754                     });
34755                     outer = !outer;
34756                 }
34757
34758                 // Move all tags to one relation
34759                 var relation = entities.multipolygon[0] ||
34760                     osmRelation({ id: newRelationId, tags: { type: 'multipolygon' }});
34761
34762                 entities.multipolygon.slice(1).forEach(function(m) {
34763                     relation = relation.mergeTags(m.tags);
34764                     graph = graph.remove(m);
34765                 });
34766
34767                 entities.closedWay.forEach(function(way) {
34768                     function isThisOuter(m) {
34769                         return m.id === way.id && m.role !== 'inner';
34770                     }
34771                     if (members.some(isThisOuter)) {
34772                         relation = relation.mergeTags(way.tags);
34773                         graph = graph.replace(way.update({ tags: {} }));
34774                     }
34775                 });
34776
34777                 return graph.replace(relation.update({
34778                     members: members,
34779                     tags: utilObjectOmit(relation.tags, ['area'])
34780                 }));
34781             };
34782
34783
34784             action.disabled = function(graph) {
34785                 var entities = groupEntities(graph);
34786                 if (entities.other.length > 0 ||
34787                     entities.closedWay.length + entities.multipolygon.length < 2)
34788                     return 'not_eligible';
34789                 if (!entities.multipolygon.every(function(r) { return r.isComplete(graph); }))
34790                     return 'incomplete_relation';
34791             };
34792
34793
34794             return action;
34795         }
34796
34797         var isArray$3 = Array.isArray;
34798         var keyList = Object.keys;
34799         var hasProp = Object.prototype.hasOwnProperty;
34800
34801         var fastDeepEqual = function equal(a, b) {
34802           if (a === b) return true;
34803
34804           if (a && b && typeof a == 'object' && typeof b == 'object') {
34805             var arrA = isArray$3(a)
34806               , arrB = isArray$3(b)
34807               , i
34808               , length
34809               , key;
34810
34811             if (arrA && arrB) {
34812               length = a.length;
34813               if (length != b.length) return false;
34814               for (i = length; i-- !== 0;)
34815                 if (!equal(a[i], b[i])) return false;
34816               return true;
34817             }
34818
34819             if (arrA != arrB) return false;
34820
34821             var dateA = a instanceof Date
34822               , dateB = b instanceof Date;
34823             if (dateA != dateB) return false;
34824             if (dateA && dateB) return a.getTime() == b.getTime();
34825
34826             var regexpA = a instanceof RegExp
34827               , regexpB = b instanceof RegExp;
34828             if (regexpA != regexpB) return false;
34829             if (regexpA && regexpB) return a.toString() == b.toString();
34830
34831             var keys = keyList(a);
34832             length = keys.length;
34833
34834             if (length !== keyList(b).length)
34835               return false;
34836
34837             for (i = length; i-- !== 0;)
34838               if (!hasProp.call(b, keys[i])) return false;
34839
34840             for (i = length; i-- !== 0;) {
34841               key = keys[i];
34842               if (!equal(a[key], b[key])) return false;
34843             }
34844
34845             return true;
34846           }
34847
34848           return a!==a && b!==b;
34849         };
34850
34851         // Text diff algorithm following Hunt and McIlroy 1976.
34852         // J. W. Hunt and M. D. McIlroy, An algorithm for differential file
34853         // comparison, Bell Telephone Laboratories CSTR #41 (1976)
34854         // http://www.cs.dartmouth.edu/~doug/
34855         //
34856         // Expects two arrays of strings.
34857         function LCS(file1, file2) {
34858           var equivalenceClasses;
34859           var file2indices;
34860           var newCandidate;
34861           var candidates;
34862           var line;
34863           var c, i, j, jX, r, s;
34864
34865           equivalenceClasses = {};
34866           for (j = 0; j < file2.length; j++) {
34867             line = file2[j];
34868             if (equivalenceClasses[line]) {
34869               equivalenceClasses[line].push(j);
34870             } else {
34871               equivalenceClasses[line] = [j];
34872             }
34873           }
34874
34875           candidates = [
34876             { file1index: -1, file2index: -1, chain: null }
34877           ];
34878
34879           for (i = 0; i < file1.length; i++) {
34880             line = file1[i];
34881             file2indices = equivalenceClasses[line] || [];
34882
34883             r = 0;
34884             c = candidates[0];
34885
34886             for (jX = 0; jX < file2indices.length; jX++) {
34887               j = file2indices[jX];
34888
34889               for (s = r; s < candidates.length; s++) {
34890                 if ((candidates[s].file2index < j) && ((s === candidates.length - 1) || (candidates[s + 1].file2index > j))) {
34891                   break;
34892                 }
34893               }
34894
34895               if (s < candidates.length) {
34896                 newCandidate = { file1index: i, file2index: j, chain: candidates[s] };
34897                 if (r === candidates.length) {
34898                   candidates.push(c);
34899                 } else {
34900                   candidates[r] = c;
34901                 }
34902                 r = s + 1;
34903                 c = newCandidate;
34904                 if (r === candidates.length) {
34905                   break; // no point in examining further (j)s
34906                 }
34907               }
34908             }
34909
34910             candidates[r] = c;
34911           }
34912
34913           // At this point, we know the LCS: it's in the reverse of the
34914           // linked-list through .chain of candidates[candidates.length - 1].
34915
34916           return candidates[candidates.length - 1];
34917         }
34918
34919
34920         // We apply the LCS to give a simple representation of the
34921         // offsets and lengths of mismatched chunks in the input
34922         // files. This is used by diff3MergeIndices below.
34923         function diffIndices(file1, file2) {
34924           var result = [];
34925           var tail1 = file1.length;
34926           var tail2 = file2.length;
34927
34928           for (var candidate = LCS(file1, file2);
34929              candidate !== null;
34930              candidate = candidate.chain)
34931           {
34932             var mismatchLength1 = tail1 - candidate.file1index - 1;
34933             var mismatchLength2 = tail2 - candidate.file2index - 1;
34934             tail1 = candidate.file1index;
34935             tail2 = candidate.file2index;
34936
34937             if (mismatchLength1 || mismatchLength2) {
34938               result.push({
34939                 file1: [tail1 + 1, mismatchLength1],
34940                 file2: [tail2 + 1, mismatchLength2]
34941               });
34942             }
34943           }
34944
34945           result.reverse();
34946           return result;
34947         }
34948
34949
34950         // Given three files, A, O, and B, where both A and B are
34951         // independently derived from O, returns a fairly complicated
34952         // internal representation of merge decisions it's taken. The
34953         // interested reader may wish to consult
34954         //
34955         // Sanjeev Khanna, Keshav Kunal, and Benjamin C. Pierce.
34956         // 'A Formal Investigation of ' In Arvind and Prasad,
34957         // editors, Foundations of Software Technology and Theoretical
34958         // Computer Science (FSTTCS), December 2007.
34959         //
34960         // (http://www.cis.upenn.edu/~bcpierce/papers/diff3-short.pdf)
34961         function diff3MergeIndices(a, o, b) {
34962           var i;
34963           var m1 = diffIndices(o, a);
34964           var m2 = diffIndices(o, b);
34965
34966           var hunks = [];
34967           function addHunk(h, side) {
34968             hunks.push([h.file1[0], side, h.file1[1], h.file2[0], h.file2[1]]);
34969           }
34970           for (i = 0; i < m1.length; i++) { addHunk(m1[i], 0); }
34971           for (i = 0; i < m2.length; i++) { addHunk(m2[i], 2); }
34972           hunks.sort(function (x, y) { return x[0] - y[0]; });
34973
34974           var result = [];
34975           var commonOffset = 0;
34976           function copyCommon(targetOffset) {
34977             if (targetOffset > commonOffset) {
34978               result.push([1, commonOffset, targetOffset - commonOffset]);
34979               commonOffset = targetOffset;
34980             }
34981           }
34982
34983           for (var hunkIndex = 0; hunkIndex < hunks.length; hunkIndex++) {
34984             var firstHunkIndex = hunkIndex;
34985             var hunk = hunks[hunkIndex];
34986             var regionLhs = hunk[0];
34987             var regionRhs = regionLhs + hunk[2];
34988             while (hunkIndex < hunks.length - 1) {
34989               var maybeOverlapping = hunks[hunkIndex + 1];
34990               var maybeLhs = maybeOverlapping[0];
34991               if (maybeLhs > regionRhs) {
34992                 break;
34993               }
34994               regionRhs = Math.max(regionRhs, maybeLhs + maybeOverlapping[2]);
34995               hunkIndex++;
34996             }
34997
34998             copyCommon(regionLhs);
34999             if (firstHunkIndex === hunkIndex) {
35000               // The 'overlap' was only one hunk long, meaning that
35001               // there's no conflict here. Either a and o were the
35002               // same, or b and o were the same.
35003               if (hunk[4] > 0) {
35004                 result.push([hunk[1], hunk[3], hunk[4]]);
35005               }
35006             } else {
35007               // A proper conflict. Determine the extents of the
35008               // regions involved from a, o and b. Effectively merge
35009               // all the hunks on the left into one giant hunk, and
35010               // do the same for the right; then, correct for skew
35011               // in the regions of o that each side changed, and
35012               // report appropriate spans for the three sides.
35013               var regions = {
35014                 0: [a.length, -1, o.length, -1],
35015                 2: [b.length, -1, o.length, -1]
35016               };
35017               for (i = firstHunkIndex; i <= hunkIndex; i++) {
35018                 hunk = hunks[i];
35019                 var side = hunk[1];
35020                 var r = regions[side];
35021                 var oLhs = hunk[0];
35022                 var oRhs = oLhs + hunk[2];
35023                 var abLhs = hunk[3];
35024                 var abRhs = abLhs + hunk[4];
35025                 r[0] = Math.min(abLhs, r[0]);
35026                 r[1] = Math.max(abRhs, r[1]);
35027                 r[2] = Math.min(oLhs, r[2]);
35028                 r[3] = Math.max(oRhs, r[3]);
35029               }
35030               var aLhs = regions[0][0] + (regionLhs - regions[0][2]);
35031               var aRhs = regions[0][1] + (regionRhs - regions[0][3]);
35032               var bLhs = regions[2][0] + (regionLhs - regions[2][2]);
35033               var bRhs = regions[2][1] + (regionRhs - regions[2][3]);
35034               result.push([-1,
35035                            aLhs,      aRhs      - aLhs,
35036                            regionLhs, regionRhs - regionLhs,
35037                            bLhs,      bRhs      - bLhs]);
35038             }
35039             commonOffset = regionRhs;
35040           }
35041
35042           copyCommon(o.length);
35043           return result;
35044         }
35045
35046
35047         // Applies the output of diff3MergeIndices to actually
35048         // construct the merged file; the returned result alternates
35049         // between 'ok' and 'conflict' blocks.
35050         function diff3Merge(a, o, b, excludeFalseConflicts) {
35051           var result = [];
35052           var files = [a, o, b];
35053           var indices = diff3MergeIndices(a, o, b);
35054
35055           var okLines = [];
35056           function flushOk() {
35057             if (okLines.length) {
35058               result.push({ok: okLines});
35059             }
35060             okLines = [];
35061           }
35062           function pushOk(xs) {
35063             for (var j = 0; j < xs.length; j++) {
35064               okLines.push(xs[j]);
35065             }
35066           }
35067
35068           function isTrueConflict(rec) {
35069             if (rec[2] !== rec[6]) return true;
35070             var aoff = rec[1];
35071             var boff = rec[5];
35072             for (var j = 0; j < rec[2]; j++) {
35073               if (a[j + aoff] !== b[j + boff]) {
35074                 return true;
35075               }
35076             }
35077             return false;
35078           }
35079
35080           for (var i = 0; i < indices.length; i++) {
35081             var x = indices[i];
35082             var side = x[0];
35083             if (side === -1) {
35084               if (excludeFalseConflicts && !isTrueConflict(x)) {
35085                 pushOk(files[0].slice(x[1], x[1] + x[2]));
35086               } else {
35087                 flushOk();
35088                 result.push({
35089                   conflict: {
35090                     a: a.slice(x[1], x[1] + x[2]),
35091                     aIndex: x[1],
35092                     o: o.slice(x[3], x[3] + x[4]),
35093                     oIndex: x[3],
35094                     b: b.slice(x[5], x[5] + x[6]),
35095                     bIndex: x[5]
35096                   }
35097                 });
35098               }
35099             } else {
35100               pushOk(files[side].slice(x[1], x[1] + x[2]));
35101             }
35102           }
35103
35104           flushOk();
35105           return result;
35106         }
35107
35108         function actionMergeRemoteChanges(id, localGraph, remoteGraph, formatUser) {
35109             var _option = 'safe';  // 'safe', 'force_local', 'force_remote'
35110             var _conflicts = [];
35111
35112
35113             function user(d) {
35114                 return (typeof formatUser === 'function') ? formatUser(d) : d;
35115             }
35116
35117
35118             function mergeLocation(remote, target) {
35119                 function pointEqual(a, b) {
35120                     var epsilon = 1e-6;
35121                     return (Math.abs(a[0] - b[0]) < epsilon) && (Math.abs(a[1] - b[1]) < epsilon);
35122                 }
35123
35124                 if (_option === 'force_local' || pointEqual(target.loc, remote.loc)) {
35125                     return target;
35126                 }
35127                 if (_option === 'force_remote') {
35128                     return target.update({loc: remote.loc});
35129                 }
35130
35131                 _conflicts.push(t('merge_remote_changes.conflict.location', { user: user(remote.user) }));
35132                 return target;
35133             }
35134
35135
35136             function mergeNodes(base, remote, target) {
35137                 if (_option === 'force_local' || fastDeepEqual(target.nodes, remote.nodes)) {
35138                     return target;
35139                 }
35140                 if (_option === 'force_remote') {
35141                     return target.update({nodes: remote.nodes});
35142                 }
35143
35144                 var ccount = _conflicts.length;
35145                 var o = base.nodes || [];
35146                 var a = target.nodes || [];
35147                 var b = remote.nodes || [];
35148                 var nodes = [];
35149                 var hunks = diff3Merge(a, o, b, true);
35150
35151                 for (var i = 0; i < hunks.length; i++) {
35152                     var hunk = hunks[i];
35153                     if (hunk.ok) {
35154                         nodes.push.apply(nodes, hunk.ok);
35155                     } else {
35156                         // for all conflicts, we can assume c.a !== c.b
35157                         // because `diff3Merge` called with `true` option to exclude false conflicts..
35158                         var c = hunk.conflict;
35159                         if (fastDeepEqual(c.o, c.a)) {  // only changed remotely
35160                             nodes.push.apply(nodes, c.b);
35161                         } else if (fastDeepEqual(c.o, c.b)) {  // only changed locally
35162                             nodes.push.apply(nodes, c.a);
35163                         } else {       // changed both locally and remotely
35164                             _conflicts.push(t('merge_remote_changes.conflict.nodelist', { user: user(remote.user) }));
35165                             break;
35166                         }
35167                     }
35168                 }
35169
35170                 return (_conflicts.length === ccount) ? target.update({nodes: nodes}) : target;
35171             }
35172
35173
35174             function mergeChildren(targetWay, children, updates, graph) {
35175                 function isUsed(node, targetWay) {
35176                     var hasInterestingParent = graph.parentWays(node)
35177                         .some(function(way) { return way.id !== targetWay.id; });
35178
35179                     return node.hasInterestingTags() ||
35180                         hasInterestingParent ||
35181                         graph.parentRelations(node).length > 0;
35182                 }
35183
35184                 var ccount = _conflicts.length;
35185
35186                 for (var i = 0; i < children.length; i++) {
35187                     var id = children[i];
35188                     var node = graph.hasEntity(id);
35189
35190                     // remove unused childNodes..
35191                     if (targetWay.nodes.indexOf(id) === -1) {
35192                         if (node && !isUsed(node, targetWay)) {
35193                             updates.removeIds.push(id);
35194                         }
35195                         continue;
35196                     }
35197
35198                     // restore used childNodes..
35199                     var local = localGraph.hasEntity(id);
35200                     var remote = remoteGraph.hasEntity(id);
35201                     var target;
35202
35203                     if (_option === 'force_remote' && remote && remote.visible) {
35204                         updates.replacements.push(remote);
35205
35206                     } else if (_option === 'force_local' && local) {
35207                         target = osmEntity(local);
35208                         if (remote) {
35209                             target = target.update({ version: remote.version });
35210                         }
35211                         updates.replacements.push(target);
35212
35213                     } else if (_option === 'safe' && local && remote && local.version !== remote.version) {
35214                         target = osmEntity(local, { version: remote.version });
35215                         if (remote.visible) {
35216                             target = mergeLocation(remote, target);
35217                         } else {
35218                             _conflicts.push(t('merge_remote_changes.conflict.deleted', { user: user(remote.user) }));
35219                         }
35220
35221                         if (_conflicts.length !== ccount) break;
35222                         updates.replacements.push(target);
35223                     }
35224                 }
35225
35226                 return targetWay;
35227             }
35228
35229
35230             function updateChildren(updates, graph) {
35231                 for (var i = 0; i < updates.replacements.length; i++) {
35232                     graph = graph.replace(updates.replacements[i]);
35233                 }
35234                 if (updates.removeIds.length) {
35235                     graph = actionDeleteMultiple(updates.removeIds)(graph);
35236                 }
35237                 return graph;
35238             }
35239
35240
35241             function mergeMembers(remote, target) {
35242                 if (_option === 'force_local' || fastDeepEqual(target.members, remote.members)) {
35243                     return target;
35244                 }
35245                 if (_option === 'force_remote') {
35246                     return target.update({members: remote.members});
35247                 }
35248
35249                 _conflicts.push(t('merge_remote_changes.conflict.memberlist', { user: user(remote.user) }));
35250                 return target;
35251             }
35252
35253
35254             function mergeTags(base, remote, target) {
35255                 if (_option === 'force_local' || fastDeepEqual(target.tags, remote.tags)) {
35256                     return target;
35257                 }
35258                 if (_option === 'force_remote') {
35259                     return target.update({tags: remote.tags});
35260                 }
35261
35262                 var ccount = _conflicts.length;
35263                 var o = base.tags || {};
35264                 var a = target.tags || {};
35265                 var b = remote.tags || {};
35266                 var keys = utilArrayUnion(utilArrayUnion(Object.keys(o), Object.keys(a)), Object.keys(b))
35267                     .filter(function(k) { return !dataDiscarded[k]; });
35268                 var tags = Object.assign({}, a);   // shallow copy
35269                 var changed = false;
35270
35271                 for (var i = 0; i < keys.length; i++) {
35272                     var k = keys[i];
35273
35274                     if (o[k] !== b[k] && a[k] !== b[k]) {    // changed remotely..
35275                         if (o[k] !== a[k]) {      // changed locally..
35276                             _conflicts.push(t('merge_remote_changes.conflict.tags',
35277                                 { tag: k, local: a[k], remote: b[k], user: user(remote.user) }));
35278
35279                         } else {                  // unchanged locally, accept remote change..
35280                             if (b.hasOwnProperty(k)) {
35281                                 tags[k] = b[k];
35282                             } else {
35283                                 delete tags[k];
35284                             }
35285                             changed = true;
35286                         }
35287                     }
35288                 }
35289
35290                 return (changed && _conflicts.length === ccount) ? target.update({tags: tags}) : target;
35291             }
35292
35293
35294             //  `graph.base()` is the common ancestor of the two graphs.
35295             //  `localGraph` contains user's edits up to saving
35296             //  `remoteGraph` contains remote edits to modified nodes
35297             //  `graph` must be a descendent of `localGraph` and may include
35298             //      some conflict resolution actions performed on it.
35299             //
35300             //                  --- ... --- `localGraph` -- ... -- `graph`
35301             //                 /
35302             //  `graph.base()` --- ... --- `remoteGraph`
35303             //
35304             var action = function(graph) {
35305                 var updates = { replacements: [], removeIds: [] };
35306                 var base = graph.base().entities[id];
35307                 var local = localGraph.entity(id);
35308                 var remote = remoteGraph.entity(id);
35309                 var target = osmEntity(local, { version: remote.version });
35310
35311                 // delete/undelete
35312                 if (!remote.visible) {
35313                     if (_option === 'force_remote') {
35314                         return actionDeleteMultiple([id])(graph);
35315
35316                     } else if (_option === 'force_local') {
35317                         if (target.type === 'way') {
35318                             target = mergeChildren(target, utilArrayUniq(local.nodes), updates, graph);
35319                             graph = updateChildren(updates, graph);
35320                         }
35321                         return graph.replace(target);
35322
35323                     } else {
35324                         _conflicts.push(t('merge_remote_changes.conflict.deleted', { user: user(remote.user) }));
35325                         return graph;  // do nothing
35326                     }
35327                 }
35328
35329                 // merge
35330                 if (target.type === 'node') {
35331                     target = mergeLocation(remote, target);
35332
35333                 } else if (target.type === 'way') {
35334                     // pull in any child nodes that may not be present locally..
35335                     graph.rebase(remoteGraph.childNodes(remote), [graph], false);
35336                     target = mergeNodes(base, remote, target);
35337                     target = mergeChildren(target, utilArrayUnion(local.nodes, remote.nodes), updates, graph);
35338
35339                 } else if (target.type === 'relation') {
35340                     target = mergeMembers(remote, target);
35341                 }
35342
35343                 target = mergeTags(base, remote, target);
35344
35345                 if (!_conflicts.length) {
35346                     graph = updateChildren(updates, graph).replace(target);
35347                 }
35348
35349                 return graph;
35350             };
35351
35352
35353             action.withOption = function(opt) {
35354                 _option = opt;
35355                 return action;
35356             };
35357
35358
35359             action.conflicts = function() {
35360                 return _conflicts;
35361             };
35362
35363
35364             return action;
35365         }
35366
35367         // https://github.com/openstreetmap/josm/blob/mirror/src/org/openstreetmap/josm/command/MoveCommand.java
35368         // https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/MoveNodeAction.as
35369         function actionMove(moveIDs, tryDelta, projection, cache) {
35370             var _delta = tryDelta;
35371
35372             function setupCache(graph) {
35373                 function canMove(nodeID) {
35374                     // Allow movement of any node that is in the selectedIDs list..
35375                     if (moveIDs.indexOf(nodeID) !== -1) return true;
35376
35377                     // Allow movement of a vertex where 2 ways meet..
35378                     var parents = graph.parentWays(graph.entity(nodeID));
35379                     if (parents.length < 3) return true;
35380
35381                     // Restrict movement of a vertex where >2 ways meet, unless all parentWays are moving too..
35382                     var parentsMoving = parents.every(function(way) { return cache.moving[way.id]; });
35383                     if (!parentsMoving) delete cache.moving[nodeID];
35384
35385                     return parentsMoving;
35386                 }
35387
35388                 function cacheEntities(ids) {
35389                     for (var i = 0; i < ids.length; i++) {
35390                         var id = ids[i];
35391                         if (cache.moving[id]) continue;
35392                         cache.moving[id] = true;
35393
35394                         var entity = graph.hasEntity(id);
35395                         if (!entity) continue;
35396
35397                         if (entity.type === 'node') {
35398                             cache.nodes.push(id);
35399                             cache.startLoc[id] = entity.loc;
35400                         } else if (entity.type === 'way') {
35401                             cache.ways.push(id);
35402                             cacheEntities(entity.nodes);
35403                         } else {
35404                             cacheEntities(entity.members.map(function(member) {
35405                                 return member.id;
35406                             }));
35407                         }
35408                     }
35409                 }
35410
35411                 function cacheIntersections(ids) {
35412                     function isEndpoint(way, id) {
35413                         return !way.isClosed() && !!way.affix(id);
35414                     }
35415
35416                     for (var i = 0; i < ids.length; i++) {
35417                         var id = ids[i];
35418
35419                         // consider only intersections with 1 moved and 1 unmoved way.
35420                         var childNodes = graph.childNodes(graph.entity(id));
35421                         for (var j = 0; j < childNodes.length; j++) {
35422                             var node = childNodes[j];
35423                             var parents = graph.parentWays(node);
35424                             if (parents.length !== 2) continue;
35425
35426                             var moved = graph.entity(id);
35427                             var unmoved = null;
35428                             for (var k = 0; k < parents.length; k++) {
35429                                 var way = parents[k];
35430                                 if (!cache.moving[way.id]) {
35431                                     unmoved = way;
35432                                     break;
35433                                 }
35434                             }
35435                             if (!unmoved) continue;
35436
35437                             // exclude ways that are overly connected..
35438                             if (utilArrayIntersection(moved.nodes, unmoved.nodes).length > 2) continue;
35439                             if (moved.isArea() || unmoved.isArea()) continue;
35440
35441                             cache.intersections.push({
35442                                 nodeId: node.id,
35443                                 movedId: moved.id,
35444                                 unmovedId: unmoved.id,
35445                                 movedIsEP: isEndpoint(moved, node.id),
35446                                 unmovedIsEP: isEndpoint(unmoved, node.id)
35447                             });
35448                         }
35449                     }
35450                 }
35451
35452
35453                 if (!cache) {
35454                     cache = {};
35455                 }
35456                 if (!cache.ok) {
35457                     cache.moving = {};
35458                     cache.intersections = [];
35459                     cache.replacedVertex = {};
35460                     cache.startLoc = {};
35461                     cache.nodes = [];
35462                     cache.ways = [];
35463
35464                     cacheEntities(moveIDs);
35465                     cacheIntersections(cache.ways);
35466                     cache.nodes = cache.nodes.filter(canMove);
35467
35468                     cache.ok = true;
35469                 }
35470             }
35471
35472
35473             // Place a vertex where the moved vertex used to be, to preserve way shape..
35474             //
35475             //  Start:
35476             //      b ---- e
35477             //     / \
35478             //    /   \
35479             //   /     \
35480             //  a       c
35481             //
35482             //      *               node '*' added to preserve shape
35483             //     / \
35484             //    /   b ---- e      way `b,e` moved here:
35485             //   /     \
35486             //  a       c
35487             //
35488             //
35489             function replaceMovedVertex(nodeId, wayId, graph, delta) {
35490                 var way = graph.entity(wayId);
35491                 var moved = graph.entity(nodeId);
35492                 var movedIndex = way.nodes.indexOf(nodeId);
35493                 var len, prevIndex, nextIndex;
35494
35495                 if (way.isClosed()) {
35496                     len = way.nodes.length - 1;
35497                     prevIndex = (movedIndex + len - 1) % len;
35498                     nextIndex = (movedIndex + len + 1) % len;
35499                 } else {
35500                     len = way.nodes.length;
35501                     prevIndex = movedIndex - 1;
35502                     nextIndex = movedIndex + 1;
35503                 }
35504
35505                 var prev = graph.hasEntity(way.nodes[prevIndex]);
35506                 var next = graph.hasEntity(way.nodes[nextIndex]);
35507
35508                 // Don't add orig vertex at endpoint..
35509                 if (!prev || !next) return graph;
35510
35511                 var key = wayId + '_' + nodeId;
35512                 var orig = cache.replacedVertex[key];
35513                 if (!orig) {
35514                     orig = osmNode();
35515                     cache.replacedVertex[key] = orig;
35516                     cache.startLoc[orig.id] = cache.startLoc[nodeId];
35517                 }
35518
35519                 var start, end;
35520                 if (delta) {
35521                     start = projection(cache.startLoc[nodeId]);
35522                     end = projection.invert(geoVecAdd(start, delta));
35523                 } else {
35524                     end = cache.startLoc[nodeId];
35525                 }
35526                 orig = orig.move(end);
35527
35528                 var angle = Math.abs(geoAngle(orig, prev, projection) -
35529                         geoAngle(orig, next, projection)) * 180 / Math.PI;
35530
35531                 // Don't add orig vertex if it would just make a straight line..
35532                 if (angle > 175 && angle < 185) return graph;
35533
35534                 // moving forward or backward along way?
35535                 var p1 = [prev.loc, orig.loc, moved.loc, next.loc].map(projection);
35536                 var p2 = [prev.loc, moved.loc, orig.loc, next.loc].map(projection);
35537                 var d1 = geoPathLength(p1);
35538                 var d2 = geoPathLength(p2);
35539                 var insertAt = (d1 <= d2) ? movedIndex : nextIndex;
35540
35541                 // moving around closed loop?
35542                 if (way.isClosed() && insertAt === 0) insertAt = len;
35543
35544                 way = way.addNode(orig.id, insertAt);
35545                 return graph.replace(orig).replace(way);
35546             }
35547
35548
35549             // Remove duplicate vertex that might have been added by
35550             // replaceMovedVertex.  This is done after the unzorro checks.
35551             function removeDuplicateVertices(wayId, graph) {
35552                 var way = graph.entity(wayId);
35553                 var epsilon = 1e-6;
35554                 var prev, curr;
35555
35556                 function isInteresting(node, graph) {
35557                     return graph.parentWays(node).length > 1 ||
35558                         graph.parentRelations(node).length ||
35559                         node.hasInterestingTags();
35560                 }
35561
35562                 for (var i = 0; i < way.nodes.length; i++) {
35563                     curr = graph.entity(way.nodes[i]);
35564
35565                     if (prev && curr && geoVecEqual(prev.loc, curr.loc, epsilon)) {
35566                         if (!isInteresting(prev, graph)) {
35567                             way = way.removeNode(prev.id);
35568                             graph = graph.replace(way).remove(prev);
35569                         } else if (!isInteresting(curr, graph)) {
35570                             way = way.removeNode(curr.id);
35571                             graph = graph.replace(way).remove(curr);
35572                         }
35573                     }
35574
35575                     prev = curr;
35576                 }
35577
35578                 return graph;
35579             }
35580
35581
35582             // Reorder nodes around intersections that have moved..
35583             //
35584             //  Start:                way1.nodes: b,e         (moving)
35585             //  a - b - c ----- d     way2.nodes: a,b,c,d     (static)
35586             //      |                 vertex: b
35587             //      e                 isEP1: true,  isEP2, false
35588             //
35589             //  way1 `b,e` moved here:
35590             //  a ----- c = b - d
35591             //              |
35592             //              e
35593             //
35594             //  reorder nodes         way1.nodes: b,e
35595             //  a ----- c - b - d     way2.nodes: a,c,b,d
35596             //              |
35597             //              e
35598             //
35599             function unZorroIntersection(intersection, graph) {
35600                 var vertex = graph.entity(intersection.nodeId);
35601                 var way1 = graph.entity(intersection.movedId);
35602                 var way2 = graph.entity(intersection.unmovedId);
35603                 var isEP1 = intersection.movedIsEP;
35604                 var isEP2 = intersection.unmovedIsEP;
35605
35606                 // don't move the vertex if it is the endpoint of both ways.
35607                 if (isEP1 && isEP2) return graph;
35608
35609                 var nodes1 = graph.childNodes(way1).filter(function(n) { return n !== vertex; });
35610                 var nodes2 = graph.childNodes(way2).filter(function(n) { return n !== vertex; });
35611
35612                 if (way1.isClosed() && way1.first() === vertex.id) nodes1.push(nodes1[0]);
35613                 if (way2.isClosed() && way2.first() === vertex.id) nodes2.push(nodes2[0]);
35614
35615                 var edge1 = !isEP1 && geoChooseEdge(nodes1, projection(vertex.loc), projection);
35616                 var edge2 = !isEP2 && geoChooseEdge(nodes2, projection(vertex.loc), projection);
35617                 var loc;
35618
35619                 // snap vertex to nearest edge (or some point between them)..
35620                 if (!isEP1 && !isEP2) {
35621                     var epsilon = 1e-6, maxIter = 10;
35622                     for (var i = 0; i < maxIter; i++) {
35623                         loc = geoVecInterp(edge1.loc, edge2.loc, 0.5);
35624                         edge1 = geoChooseEdge(nodes1, projection(loc), projection);
35625                         edge2 = geoChooseEdge(nodes2, projection(loc), projection);
35626                         if (Math.abs(edge1.distance - edge2.distance) < epsilon) break;
35627                     }
35628                 } else if (!isEP1) {
35629                     loc = edge1.loc;
35630                 } else {
35631                     loc = edge2.loc;
35632                 }
35633
35634                 graph = graph.replace(vertex.move(loc));
35635
35636                 // if zorro happened, reorder nodes..
35637                 if (!isEP1 && edge1.index !== way1.nodes.indexOf(vertex.id)) {
35638                     way1 = way1.removeNode(vertex.id).addNode(vertex.id, edge1.index);
35639                     graph = graph.replace(way1);
35640                 }
35641                 if (!isEP2 && edge2.index !== way2.nodes.indexOf(vertex.id)) {
35642                     way2 = way2.removeNode(vertex.id).addNode(vertex.id, edge2.index);
35643                     graph = graph.replace(way2);
35644                 }
35645
35646                 return graph;
35647             }
35648
35649
35650             function cleanupIntersections(graph) {
35651                 for (var i = 0; i < cache.intersections.length; i++) {
35652                     var obj = cache.intersections[i];
35653                     graph = replaceMovedVertex(obj.nodeId, obj.movedId, graph, _delta);
35654                     graph = replaceMovedVertex(obj.nodeId, obj.unmovedId, graph, null);
35655                     graph = unZorroIntersection(obj, graph);
35656                     graph = removeDuplicateVertices(obj.movedId, graph);
35657                     graph = removeDuplicateVertices(obj.unmovedId, graph);
35658                 }
35659
35660                 return graph;
35661             }
35662
35663
35664             // check if moving way endpoint can cross an unmoved way, if so limit delta..
35665             function limitDelta(graph) {
35666                 function moveNode(loc) {
35667                     return geoVecAdd(projection(loc), _delta);
35668                 }
35669
35670                 for (var i = 0; i < cache.intersections.length; i++) {
35671                     var obj = cache.intersections[i];
35672
35673                     // Don't limit movement if this is vertex joins 2 endpoints..
35674                     if (obj.movedIsEP && obj.unmovedIsEP) continue;
35675                     // Don't limit movement if this vertex is not an endpoint anyway..
35676                     if (!obj.movedIsEP) continue;
35677
35678                     var node = graph.entity(obj.nodeId);
35679                     var start = projection(node.loc);
35680                     var end = geoVecAdd(start, _delta);
35681                     var movedNodes = graph.childNodes(graph.entity(obj.movedId));
35682                     var movedPath = movedNodes.map(function(n) { return moveNode(n.loc); });
35683                     var unmovedNodes = graph.childNodes(graph.entity(obj.unmovedId));
35684                     var unmovedPath = unmovedNodes.map(function(n) { return projection(n.loc); });
35685                     var hits = geoPathIntersections(movedPath, unmovedPath);
35686
35687                     for (var j = 0; i < hits.length; i++) {
35688                         if (geoVecEqual(hits[j], end)) continue;
35689                         var edge = geoChooseEdge(unmovedNodes, end, projection);
35690                         _delta = geoVecSubtract(projection(edge.loc), start);
35691                     }
35692                 }
35693             }
35694
35695
35696             var action = function(graph) {
35697                 if (_delta[0] === 0 && _delta[1] === 0) return graph;
35698
35699                 setupCache(graph);
35700
35701                 if (cache.intersections.length) {
35702                     limitDelta(graph);
35703                 }
35704
35705                 for (var i = 0; i < cache.nodes.length; i++) {
35706                     var node = graph.entity(cache.nodes[i]);
35707                     var start = projection(node.loc);
35708                     var end = geoVecAdd(start, _delta);
35709                     graph = graph.replace(node.move(projection.invert(end)));
35710                 }
35711
35712                 if (cache.intersections.length) {
35713                     graph = cleanupIntersections(graph);
35714                 }
35715
35716                 return graph;
35717             };
35718
35719
35720             action.delta = function() {
35721                 return _delta;
35722             };
35723
35724
35725             return action;
35726         }
35727
35728         function actionMoveMember(relationId, fromIndex, toIndex) {
35729             return function(graph) {
35730                 return graph.replace(graph.entity(relationId).moveMember(fromIndex, toIndex));
35731             };
35732         }
35733
35734         function actionMoveNode(nodeID, toLoc) {
35735
35736             var action = function(graph, t) {
35737                 if (t === null || !isFinite(t)) t = 1;
35738                 t = Math.min(Math.max(+t, 0), 1);
35739
35740                 var node = graph.entity(nodeID);
35741                 return graph.replace(
35742                     node.move(geoVecInterp(node.loc, toLoc, t))
35743                 );
35744             };
35745
35746             action.transitionable = true;
35747
35748             return action;
35749         }
35750
35751         function actionNoop() {
35752             return function(graph) {
35753                 return graph;
35754             };
35755         }
35756
35757         function actionOrthogonalize(wayID, projection, vertexID, degThresh, ep) {
35758             var epsilon = ep || 1e-4;
35759             var threshold = degThresh || 13;  // degrees within right or straight to alter
35760
35761             // We test normalized dot products so we can compare as cos(angle)
35762             var lowerThreshold = Math.cos((90 - threshold) * Math.PI / 180);
35763             var upperThreshold = Math.cos(threshold * Math.PI / 180);
35764
35765
35766             var action = function(graph, t) {
35767                 if (t === null || !isFinite(t)) t = 1;
35768                 t = Math.min(Math.max(+t, 0), 1);
35769
35770                 var way = graph.entity(wayID);
35771                 way = way.removeNode('');   // sanity check - remove any consecutive duplicates
35772
35773                 if (way.tags.nonsquare) {
35774                     var tags = Object.assign({}, way.tags);
35775                     // since we're squaring, remove indication that this is physically unsquare
35776                     delete tags.nonsquare;
35777                     way = way.update({tags: tags});
35778                 }
35779
35780                 graph = graph.replace(way);
35781
35782                 var isClosed = way.isClosed();
35783                 var nodes = graph.childNodes(way).slice();  // shallow copy
35784                 if (isClosed) nodes.pop();
35785
35786                 if (vertexID !== undefined) {
35787                     nodes = nodeSubset(nodes, vertexID, isClosed);
35788                     if (nodes.length !== 3) return graph;
35789                 }
35790
35791                 // note: all geometry functions here use the unclosed node/point/coord list
35792
35793                 var nodeCount = {};
35794                 var points = [];
35795                 var corner = { i: 0, dotp: 1 };
35796                 var node, point, loc, score, motions, i, j;
35797
35798                 for (i = 0; i < nodes.length; i++) {
35799                     node = nodes[i];
35800                     nodeCount[node.id] = (nodeCount[node.id] || 0) + 1;
35801                     points.push({ id: node.id, coord: projection(node.loc) });
35802                 }
35803
35804
35805                 if (points.length === 3) {   // move only one vertex for right triangle
35806                     for (i = 0; i < 1000; i++) {
35807                         motions = points.map(calcMotion);
35808
35809                         points[corner.i].coord = geoVecAdd(points[corner.i].coord, motions[corner.i]);
35810                         score = corner.dotp;
35811                         if (score < epsilon) {
35812                             break;
35813                         }
35814                     }
35815
35816                     node = graph.entity(nodes[corner.i].id);
35817                     loc = projection.invert(points[corner.i].coord);
35818                     graph = graph.replace(node.move(geoVecInterp(node.loc, loc, t)));
35819
35820                 } else {
35821                     var straights = [];
35822                     var simplified = [];
35823
35824                     // Remove points from nearly straight sections..
35825                     // This produces a simplified shape to orthogonalize
35826                     for (i = 0; i < points.length; i++) {
35827                         point = points[i];
35828                         var dotp = 0;
35829                         if (isClosed || (i > 0 && i < points.length - 1)) {
35830                             var a = points[(i - 1 + points.length) % points.length];
35831                             var b = points[(i + 1) % points.length];
35832                             dotp = Math.abs(geoOrthoNormalizedDotProduct(a.coord, b.coord, point.coord));
35833                         }
35834
35835                         if (dotp > upperThreshold) {
35836                             straights.push(point);
35837                         } else {
35838                             simplified.push(point);
35839                         }
35840                     }
35841
35842                     // Orthogonalize the simplified shape
35843                     var bestPoints = clonePoints(simplified);
35844                     var originalPoints = clonePoints(simplified);
35845
35846                     score = Infinity;
35847                     for (i = 0; i < 1000; i++) {
35848                         motions = simplified.map(calcMotion);
35849
35850                         for (j = 0; j < motions.length; j++) {
35851                             simplified[j].coord = geoVecAdd(simplified[j].coord, motions[j]);
35852                         }
35853                         var newScore = geoOrthoCalcScore(simplified, isClosed, epsilon, threshold);
35854                         if (newScore < score) {
35855                             bestPoints = clonePoints(simplified);
35856                             score = newScore;
35857                         }
35858                         if (score < epsilon) {
35859                             break;
35860                         }
35861                     }
35862
35863                     var bestCoords = bestPoints.map(function(p) { return p.coord; });
35864                     if (isClosed) bestCoords.push(bestCoords[0]);
35865
35866                     // move the nodes that should move
35867                     for (i = 0; i < bestPoints.length; i++) {
35868                         point = bestPoints[i];
35869                         if (!geoVecEqual(originalPoints[i].coord, point.coord)) {
35870                             node = graph.entity(point.id);
35871                             loc = projection.invert(point.coord);
35872                             graph = graph.replace(node.move(geoVecInterp(node.loc, loc, t)));
35873                         }
35874                     }
35875
35876                     // move the nodes along straight segments
35877                     for (i = 0; i < straights.length; i++) {
35878                         point = straights[i];
35879                         if (nodeCount[point.id] > 1) continue;   // skip self-intersections
35880
35881                         node = graph.entity(point.id);
35882
35883                         if (t === 1 &&
35884                             graph.parentWays(node).length === 1 &&
35885                             graph.parentRelations(node).length === 0 &&
35886                             !node.hasInterestingTags()
35887                         ) {
35888                             // remove uninteresting points..
35889                             graph = actionDeleteNode(node.id)(graph);
35890
35891                         } else {
35892                             // move interesting points to the nearest edge..
35893                             var choice = geoVecProject(point.coord, bestCoords);
35894                             if (choice) {
35895                                 loc = projection.invert(choice.target);
35896                                 graph = graph.replace(node.move(geoVecInterp(node.loc, loc, t)));
35897                             }
35898                         }
35899                     }
35900                 }
35901
35902                 return graph;
35903
35904
35905                 function clonePoints(array) {
35906                     return array.map(function(p) {
35907                         return { id: p.id, coord: [p.coord[0], p.coord[1]] };
35908                     });
35909                 }
35910
35911
35912                 function calcMotion(point, i, array) {
35913                     // don't try to move the endpoints of a non-closed way.
35914                     if (!isClosed && (i === 0 || i === array.length - 1)) return [0, 0];
35915                     // don't try to move a node that appears more than once (self intersection)
35916                     if (nodeCount[array[i].id] > 1) return [0, 0];
35917
35918                     var a = array[(i - 1 + array.length) % array.length].coord;
35919                     var origin = point.coord;
35920                     var b = array[(i + 1) % array.length].coord;
35921                     var p = geoVecSubtract(a, origin);
35922                     var q = geoVecSubtract(b, origin);
35923
35924                     var scale = 2 * Math.min(geoVecLength(p), geoVecLength(q));
35925                     p = geoVecNormalize(p);
35926                     q = geoVecNormalize(q);
35927
35928                     var dotp = (p[0] * q[0] + p[1] * q[1]);
35929                     var val = Math.abs(dotp);
35930
35931                     if (val < lowerThreshold) {  // nearly orthogonal
35932                         corner.i = i;
35933                         corner.dotp = val;
35934                         var vec = geoVecNormalize(geoVecAdd(p, q));
35935                         return geoVecScale(vec, 0.1 * dotp * scale);
35936                     }
35937
35938                     return [0, 0];   // do nothing
35939                 }
35940             };
35941
35942
35943             // if we are only orthogonalizing one vertex,
35944             // get that vertex and the previous and next
35945             function nodeSubset(nodes, vertexID, isClosed) {
35946                 var first = isClosed ? 0 : 1;
35947                 var last = isClosed ? nodes.length : nodes.length - 1;
35948
35949                 for (var i = first; i < last; i++) {
35950                     if (nodes[i].id === vertexID) {
35951                         return [
35952                             nodes[(i - 1 + nodes.length) % nodes.length],
35953                             nodes[i],
35954                             nodes[(i + 1) % nodes.length]
35955                         ];
35956                     }
35957                 }
35958
35959                 return [];
35960             }
35961
35962
35963             action.disabled = function(graph) {
35964                 var way = graph.entity(wayID);
35965                 way = way.removeNode('');  // sanity check - remove any consecutive duplicates
35966                 graph = graph.replace(way);
35967
35968                 var isClosed = way.isClosed();
35969                 var nodes = graph.childNodes(way).slice();  // shallow copy
35970                 if (isClosed) nodes.pop();
35971
35972                 var allowStraightAngles = false;
35973                 if (vertexID !== undefined) {
35974                     allowStraightAngles = true;
35975                     nodes = nodeSubset(nodes, vertexID, isClosed);
35976                     if (nodes.length !== 3) return 'end_vertex';
35977                 }
35978
35979                 var coords = nodes.map(function(n) { return projection(n.loc); });
35980                 var score = geoOrthoCanOrthogonalize(coords, isClosed, epsilon, threshold, allowStraightAngles);
35981
35982                 if (score === null) {
35983                     return 'not_squarish';
35984                 } else if (score === 0) {
35985                     return 'square_enough';
35986                 } else {
35987                     return false;
35988                 }
35989             };
35990
35991
35992             action.transitionable = true;
35993
35994             return action;
35995         }
35996
35997         // `actionRestrictTurn` creates a turn restriction relation.
35998         //
35999         // `turn` must be an `osmTurn` object
36000         // see osm/intersection.js, pathToTurn()
36001         //
36002         // This specifies a restriction of type `restriction` when traveling from
36003         // `turn.from.way` toward `turn.to.way` via `turn.via.node` OR `turn.via.ways`.
36004         // (The action does not check that these entities form a valid intersection.)
36005         //
36006         // From, to, and via ways should be split before calling this action.
36007         // (old versions of the code would split the ways here, but we no longer do it)
36008         //
36009         // For testing convenience, accepts a restrictionID to assign to the new
36010         // relation. Normally, this will be undefined and the relation will
36011         // automatically be assigned a new ID.
36012         //
36013         function actionRestrictTurn(turn, restrictionType, restrictionID) {
36014
36015             return function(graph) {
36016                 var fromWay = graph.entity(turn.from.way);
36017                 var toWay = graph.entity(turn.to.way);
36018                 var viaNode = turn.via.node && graph.entity(turn.via.node);
36019                 var viaWays = turn.via.ways && turn.via.ways.map(function(id) { return graph.entity(id); });
36020                 var members = [];
36021
36022                 members.push({ id: fromWay.id, type: 'way',  role: 'from' });
36023
36024                 if (viaNode) {
36025                     members.push({ id: viaNode.id,  type: 'node', role: 'via' });
36026                 } else if (viaWays) {
36027                     viaWays.forEach(function(viaWay) {
36028                         members.push({ id: viaWay.id,  type: 'way', role: 'via' });
36029                     });
36030                 }
36031
36032                 members.push({ id: toWay.id, type: 'way',  role: 'to' });
36033
36034                 return graph.replace(osmRelation({
36035                     id: restrictionID,
36036                     tags: {
36037                         type: 'restriction',
36038                         restriction: restrictionType
36039                     },
36040                     members: members
36041                 }));
36042             };
36043         }
36044
36045         function actionRevert(id) {
36046             var action = function(graph) {
36047                 var entity = graph.hasEntity(id),
36048                     base = graph.base().entities[id];
36049
36050                 if (entity && !base) {    // entity will be removed..
36051                     if (entity.type === 'node') {
36052                         graph.parentWays(entity)
36053                             .forEach(function(parent) {
36054                                 parent = parent.removeNode(id);
36055                                 graph = graph.replace(parent);
36056
36057                                 if (parent.isDegenerate()) {
36058                                     graph = actionDeleteWay(parent.id)(graph);
36059                                 }
36060                             });
36061                     }
36062
36063                     graph.parentRelations(entity)
36064                         .forEach(function(parent) {
36065                             parent = parent.removeMembersWithID(id);
36066                             graph = graph.replace(parent);
36067
36068                             if (parent.isDegenerate()) {
36069                                 graph = actionDeleteRelation(parent.id)(graph);
36070                             }
36071                         });
36072                 }
36073
36074                 return graph.revert(id);
36075             };
36076
36077             return action;
36078         }
36079
36080         function actionRotate(rotateIds, pivot, angle, projection) {
36081
36082             var action = function(graph) {
36083                 return graph.update(function(graph) {
36084                     utilGetAllNodes(rotateIds, graph).forEach(function(node) {
36085                         var point = geoRotate([projection(node.loc)], angle, pivot)[0];
36086                         graph = graph.replace(node.move(projection.invert(point)));
36087                     });
36088                 });
36089             };
36090
36091             return action;
36092         }
36093
36094         /* Align nodes along their common axis */
36095         function actionStraightenNodes(nodeIDs, projection) {
36096
36097             function positionAlongWay(a, o, b) {
36098                 return geoVecDot(a, b, o) / geoVecDot(b, b, o);
36099             }
36100
36101
36102             var action = function(graph, t) {
36103                 if (t === null || !isFinite(t)) t = 1;
36104                 t = Math.min(Math.max(+t, 0), 1);
36105
36106                 var nodes = nodeIDs.map(function(id) { return graph.entity(id); });
36107                 var points = nodes.map(function(n) { return projection(n.loc); });
36108                 var ssr = geoGetSmallestSurroundingRectangle(points);
36109
36110                 // Choose line pq = axis of symmetry.
36111                 // The shape's surrounding rectangle has 2 axes of symmetry.
36112                 // Snap points to the long axis
36113                 var p1 = [(ssr.poly[0][0] + ssr.poly[1][0]) / 2, (ssr.poly[0][1] + ssr.poly[1][1]) / 2 ];
36114                 var q1 = [(ssr.poly[2][0] + ssr.poly[3][0]) / 2, (ssr.poly[2][1] + ssr.poly[3][1]) / 2 ];
36115                 var p2 = [(ssr.poly[3][0] + ssr.poly[4][0]) / 2, (ssr.poly[3][1] + ssr.poly[4][1]) / 2 ];
36116                 var q2 = [(ssr.poly[1][0] + ssr.poly[2][0]) / 2, (ssr.poly[1][1] + ssr.poly[2][1]) / 2 ];
36117                 var p, q;
36118
36119                 var isLong = (geoVecLength(p1, q1) > geoVecLength(p2, q2));
36120                 if (isLong) {
36121                     p = p1;
36122                     q = q1;
36123                 } else {
36124                     p = p2;
36125                     q = q2;
36126                 }
36127
36128                 // Move points onto line pq
36129                 for (var i = 0; i < points.length; i++) {
36130                     var node = nodes[i];
36131                     var point = points[i];
36132                     var u = positionAlongWay(point, p, q);
36133                     var point2 = geoVecInterp(p, q, u);
36134                     var loc2 = projection.invert(point2);
36135                     graph = graph.replace(node.move(geoVecInterp(node.loc, loc2, t)));
36136                 }
36137
36138                 return graph;
36139             };
36140
36141
36142             action.disabled = function() {
36143                 return false;
36144             };
36145
36146
36147             action.transitionable = true;
36148
36149
36150             return action;
36151         }
36152
36153         /*
36154          * Based on https://github.com/openstreetmap/potlatch2/net/systemeD/potlatch2/tools/Straighten.as
36155          */
36156         function actionStraightenWay(selectedIDs, projection) {
36157
36158             function positionAlongWay(a, o, b) {
36159                 return geoVecDot(a, b, o) / geoVecDot(b, b, o);
36160             }
36161
36162             // Return all selected ways as a continuous, ordered array of nodes
36163             function allNodes(graph) {
36164                 var nodes = [];
36165                 var startNodes = [];
36166                 var endNodes = [];
36167                 var remainingWays = [];
36168                 var selectedWays = selectedIDs.filter(function(w) {
36169                     return graph.entity(w).type === 'way';
36170                 });
36171                 var selectedNodes = selectedIDs.filter(function(n) {
36172                     return graph.entity(n).type === 'node';
36173                 });
36174
36175                 for (var i = 0; i < selectedWays.length; i++) {
36176                     var way = graph.entity(selectedWays[i]);
36177                     nodes = way.nodes.slice(0);
36178                     remainingWays.push(nodes);
36179                     startNodes.push(nodes[0]);
36180                     endNodes.push(nodes[nodes.length-1]);
36181                 }
36182
36183                 // Remove duplicate end/startNodes (duplicate nodes cannot be at the line end,
36184                 //   and need to be removed so currNode difference calculation below works)
36185                 // i.e. ["n-1", "n-1", "n-2"] => ["n-2"]
36186                 startNodes = startNodes.filter(function(n) {
36187                     return startNodes.indexOf(n) === startNodes.lastIndexOf(n);
36188                 });
36189                 endNodes = endNodes.filter(function(n) {
36190                     return endNodes.indexOf(n) === endNodes.lastIndexOf(n);
36191                 });
36192
36193                 // Choose the initial endpoint to start from
36194                 var currNode = utilArrayDifference(startNodes, endNodes)
36195                     .concat(utilArrayDifference(endNodes, startNodes))[0];
36196                 var nextWay = [];
36197                 nodes = [];
36198
36199                 // Create nested function outside of loop to avoid "function in loop" lint error
36200                 var getNextWay = function(currNode, remainingWays) {
36201                     return remainingWays.filter(function(way) {
36202                         return way[0] === currNode || way[way.length-1] === currNode;
36203                     })[0];
36204                 };
36205
36206                 // Add nodes to end of nodes array, until all ways are added
36207                 while (remainingWays.length) {
36208                     nextWay = getNextWay(currNode, remainingWays);
36209                     remainingWays = utilArrayDifference(remainingWays, [nextWay]);
36210
36211                     if (nextWay[0] !== currNode) {
36212                         nextWay.reverse();
36213                     }
36214                     nodes = nodes.concat(nextWay);
36215                     currNode = nodes[nodes.length-1];
36216                 }
36217
36218                 // If user selected 2 nodes to straighten between, then slice nodes array to those nodes
36219                 if (selectedNodes.length === 2) {
36220                     var startNodeIdx = nodes.indexOf(selectedNodes[0]);
36221                     var endNodeIdx = nodes.indexOf(selectedNodes[1]);
36222                     var sortedStartEnd = [startNodeIdx, endNodeIdx];
36223
36224                     sortedStartEnd.sort(function(a, b) { return a - b; });
36225                     nodes = nodes.slice(sortedStartEnd[0], sortedStartEnd[1]+1);
36226                 }
36227
36228                 return nodes.map(function(n) { return graph.entity(n); });
36229             }
36230
36231
36232             var action = function(graph, t) {
36233                 if (t === null || !isFinite(t)) t = 1;
36234                 t = Math.min(Math.max(+t, 0), 1);
36235
36236                 var nodes = allNodes(graph);
36237                 var points = nodes.map(function(n) { return projection(n.loc); });
36238                 var startPoint = points[0];
36239                 var endPoint = points[points.length-1];
36240                 var toDelete = [];
36241                 var i;
36242
36243                 for (i = 1; i < points.length-1; i++) {
36244                     var node = nodes[i];
36245                     var point = points[i];
36246
36247                     if (t < 1 || graph.parentWays(node).length > 1 ||
36248                         graph.parentRelations(node).length ||
36249                         node.hasInterestingTags()
36250                     ) {
36251                         var u = positionAlongWay(point, startPoint, endPoint);
36252                         var p = geoVecInterp(startPoint, endPoint, u);
36253                         var loc2 = projection.invert(p);
36254                         graph = graph.replace(node.move(geoVecInterp(node.loc, loc2, t)));
36255
36256                     } else {
36257                         // safe to delete
36258                         if (toDelete.indexOf(node) === -1) {
36259                             toDelete.push(node);
36260                         }
36261                     }
36262                 }
36263
36264                 for (i = 0; i < toDelete.length; i++) {
36265                     graph = actionDeleteNode(toDelete[i].id)(graph);
36266                 }
36267
36268                 return graph;
36269             };
36270
36271
36272             action.disabled = function(graph) {
36273                 // check way isn't too bendy
36274                 var nodes = allNodes(graph);
36275                 var points = nodes.map(function(n) { return projection(n.loc); });
36276                 var startPoint = points[0];
36277                 var endPoint = points[points.length-1];
36278                 var threshold = 0.2 * geoVecLength(startPoint, endPoint);
36279                 var i;
36280
36281                 if (threshold === 0) {
36282                     return 'too_bendy';
36283                 }
36284
36285                 for (i = 1; i < points.length - 1; i++) {
36286                     var point = points[i];
36287                     var u = positionAlongWay(point, startPoint, endPoint);
36288                     var p = geoVecInterp(startPoint, endPoint, u);
36289                     var dist = geoVecLength(p, point);
36290
36291                     // to bendy if point is off by 20% of total start/end distance in projected space
36292                     if (isNaN(dist) || dist > threshold) {
36293                         return 'too_bendy';
36294                     }
36295                 }
36296             };
36297
36298             action.transitionable = true;
36299
36300
36301             return action;
36302         }
36303
36304         // `actionUnrestrictTurn` deletes a turn restriction relation.
36305         //
36306         // `turn` must be an `osmTurn` object with a `restrictionID` property.
36307         // see osm/intersection.js, pathToTurn()
36308         //
36309         function actionUnrestrictTurn(turn) {
36310             return function(graph) {
36311                 return actionDeleteRelation(turn.restrictionID)(graph);
36312             };
36313         }
36314
36315         /* Reflect the given area around its axis of symmetry */
36316         function actionReflect(reflectIds, projection) {
36317             var _useLongAxis = true;
36318
36319
36320             var action = function(graph, t) {
36321                 if (t === null || !isFinite(t)) t = 1;
36322                 t = Math.min(Math.max(+t, 0), 1);
36323
36324                 var nodes = utilGetAllNodes(reflectIds, graph);
36325                 var points = nodes.map(function(n) { return projection(n.loc); });
36326                 var ssr = geoGetSmallestSurroundingRectangle(points);
36327
36328                 // Choose line pq = axis of symmetry.
36329                 // The shape's surrounding rectangle has 2 axes of symmetry.
36330                 // Reflect across the longer axis by default.
36331                 var p1 = [(ssr.poly[0][0] + ssr.poly[1][0]) / 2, (ssr.poly[0][1] + ssr.poly[1][1]) / 2 ];
36332                 var q1 = [(ssr.poly[2][0] + ssr.poly[3][0]) / 2, (ssr.poly[2][1] + ssr.poly[3][1]) / 2 ];
36333                 var p2 = [(ssr.poly[3][0] + ssr.poly[4][0]) / 2, (ssr.poly[3][1] + ssr.poly[4][1]) / 2 ];
36334                 var q2 = [(ssr.poly[1][0] + ssr.poly[2][0]) / 2, (ssr.poly[1][1] + ssr.poly[2][1]) / 2 ];
36335                 var p, q;
36336
36337                 var isLong = (geoVecLength(p1, q1) > geoVecLength(p2, q2));
36338                 if ((_useLongAxis && isLong) || (!_useLongAxis && !isLong)) {
36339                     p = p1;
36340                     q = q1;
36341                 } else {
36342                     p = p2;
36343                     q = q2;
36344                 }
36345
36346                 // reflect c across pq
36347                 // http://math.stackexchange.com/questions/65503/point-reflection-over-a-line
36348                 var dx = q[0] - p[0];
36349                 var dy = q[1] - p[1];
36350                 var a = (dx * dx - dy * dy) / (dx * dx + dy * dy);
36351                 var b = 2 * dx * dy / (dx * dx + dy * dy);
36352                 for (var i = 0; i < nodes.length; i++) {
36353                     var node = nodes[i];
36354                     var c = projection(node.loc);
36355                     var c2 = [
36356                         a * (c[0] - p[0]) + b * (c[1] - p[1]) + p[0],
36357                         b * (c[0] - p[0]) - a * (c[1] - p[1]) + p[1]
36358                     ];
36359                     var loc2 = projection.invert(c2);
36360                     node = node.move(geoVecInterp(node.loc, loc2, t));
36361                     graph = graph.replace(node);
36362                 }
36363
36364                 return graph;
36365             };
36366
36367
36368             action.useLongAxis = function(val) {
36369                 if (!arguments.length) return _useLongAxis;
36370                 _useLongAxis = val;
36371                 return action;
36372             };
36373
36374
36375             action.transitionable = true;
36376
36377
36378             return action;
36379         }
36380
36381         function actionUpgradeTags(entityId, oldTags, replaceTags) {
36382
36383             return function(graph) {
36384                 var entity = graph.entity(entityId);
36385                 var tags = Object.assign({}, entity.tags);  // shallow copy
36386                 var transferValue;
36387
36388                 for (var oldTagKey in oldTags) {
36389                     if (oldTags[oldTagKey] === '*') {
36390                         transferValue = tags[oldTagKey];
36391                         delete tags[oldTagKey];
36392                     } else {
36393                         var vals = tags[oldTagKey].split(';').filter(Boolean);
36394                         var oldIndex = vals.indexOf(oldTags[oldTagKey]);
36395                         if (vals.length === 1 || oldIndex === -1) {
36396                             delete tags[oldTagKey];
36397                         } else {
36398                             vals.splice(oldIndex, 1);
36399                             tags[oldTagKey] = vals.join(';');
36400                         }
36401                     }
36402                 }
36403
36404                 if (replaceTags) {
36405                     for (var replaceKey in replaceTags) {
36406                         var replaceValue = replaceTags[replaceKey];
36407                         if (replaceValue === '*') {
36408                             if (tags[replaceKey]) {
36409                                 // any value is okay and there already
36410                                 // is one, so don't update it
36411                                 continue;
36412                             } else {
36413                                 // otherwise assume `yes` is okay
36414                                 tags[replaceKey] = 'yes';
36415                             }
36416                         } else if (replaceValue === '$1') {
36417                             tags[replaceKey] = transferValue;
36418                         } else {
36419                             tags[replaceKey] = replaceValue;
36420                         }
36421                     }
36422                 }
36423
36424                 return graph.replace(entity.update({ tags: tags }));
36425             };
36426         }
36427
36428         function behaviorEdit(context) {
36429
36430             function behavior() {
36431                 context.map()
36432                     .minzoom(context.minEditableZoom());
36433             }
36434
36435
36436             behavior.off = function() {
36437                 context.map()
36438                     .minzoom(0);
36439             };
36440
36441             return behavior;
36442         }
36443
36444         /*
36445            The hover behavior adds the `.hover` class on mouseover to all elements to which
36446            the identical datum is bound, and removes it on mouseout.
36447
36448            The :hover pseudo-class is insufficient for iD's purposes because a datum's visual
36449            representation may consist of several elements scattered throughout the DOM hierarchy.
36450            Only one of these elements can have the :hover pseudo-class, but all of them will
36451            have the .hover class.
36452          */
36453         function behaviorHover(context) {
36454             var dispatch$1 = dispatch('hover');
36455             var _selection = d3_select(null);
36456             var _newNodeId = null;
36457             var _initialNodeID = null;
36458             var _buttonDown;
36459             var _altDisables;
36460             var _ignoreVertex;
36461             var _target;
36462
36463
36464             function keydown() {
36465                 if (_altDisables && event.keyCode === utilKeybinding.modifierCodes.alt) {
36466                     _selection.selectAll('.hover')
36467                         .classed('hover-suppressed', true)
36468                         .classed('hover', false);
36469
36470                     _selection
36471                         .classed('hover-disabled', true);
36472
36473                     dispatch$1.call('hover', this, null);
36474                 }
36475             }
36476
36477
36478             function keyup() {
36479                 if (_altDisables && event.keyCode === utilKeybinding.modifierCodes.alt) {
36480                     _selection.selectAll('.hover-suppressed')
36481                         .classed('hover-suppressed', false)
36482                         .classed('hover', true);
36483
36484                     _selection
36485                         .classed('hover-disabled', false);
36486
36487                     dispatch$1.call('hover', this, _target ? _target.id : null);
36488                 }
36489             }
36490
36491
36492             function behavior(selection) {
36493                 _selection = selection;
36494
36495                 if (_initialNodeID) {
36496                     _newNodeId = _initialNodeID;
36497                     _initialNodeID = null;
36498                 } else {
36499                     _newNodeId = null;
36500                 }
36501
36502                 _selection
36503                     .on('mouseover.hover', mouseover)
36504                     .on('mouseout.hover', mouseout)
36505                     .on('mousedown.hover', mousedown);
36506
36507                 d3_select(window)
36508                     .on('keydown.hover', keydown)
36509                     .on('keyup.hover', keyup);
36510
36511
36512                 function mouseover() {
36513                     if (_buttonDown) return;
36514                     var target = event.target;
36515                     enter(target ? target.__data__ : null);
36516                 }
36517
36518
36519                 function mouseout() {
36520                     if (_buttonDown) return;
36521                     var target = event.relatedTarget;
36522                     enter(target ? target.__data__ : null);
36523                 }
36524
36525
36526                 function mousedown() {
36527                     _buttonDown = true;
36528                     d3_select(window)
36529                         .on('mouseup.hover', mouseup, true);
36530                 }
36531
36532
36533                 function mouseup() {
36534                     _buttonDown = false;
36535                     d3_select(window)
36536                         .on('mouseup.hover', null, true);
36537                 }
36538
36539                 function allowsVertex(d) {
36540                     return d.geometry(context.graph()) === 'vertex' || context.presets().allowsVertex(d, context.graph());
36541                 }
36542
36543                 function modeAllowsHover(target) {
36544                     var mode = context.mode();
36545                     if (mode.id === 'add-point') {
36546                         return mode.preset.matchGeometry('vertex') ||
36547                             (target.type !== 'way' && target.geometry(context.graph()) !== 'vertex');
36548                     }
36549                     return true;
36550                 }
36551
36552                 function enter(datum) {
36553                     if (datum === _target) return;
36554                     _target = datum;
36555
36556                     _selection.selectAll('.hover')
36557                         .classed('hover', false);
36558                     _selection.selectAll('.hover-suppressed')
36559                         .classed('hover-suppressed', false);
36560
36561                     // What are we hovering over?
36562                     var entity, selector;
36563                     if (datum && datum.__featurehash__) {
36564                         entity = datum;
36565                         selector = '.data' + datum.__featurehash__;
36566
36567                     } else if (datum instanceof qaError) {
36568                         entity = datum;
36569                         selector = '.' + datum.service + '.error_id-' + datum.id;
36570
36571                     } else if (datum instanceof osmNote) {
36572                         entity = datum;
36573                         selector = '.note-' + datum.id;
36574
36575                     } else if (datum instanceof osmEntity) {
36576                         entity = datum;
36577                         selector = '.' + entity.id;
36578                         if (entity.type === 'relation') {
36579                             entity.members.forEach(function(member) { selector += ', .' + member.id; });
36580                         }
36581                     } else if (datum && datum.properties && (datum.properties.entity instanceof osmEntity)) {
36582                         entity = datum.properties.entity;
36583                         selector = '.' + entity.id;
36584                         if (entity.type === 'relation') {
36585                             entity.members.forEach(function(member) { selector += ', .' + member.id; });
36586                         }
36587                     }
36588
36589                     var mode = context.mode();
36590
36591                     // Update hover state and dispatch event
36592                     if (entity && entity.id !== _newNodeId) {
36593                         // If drawing a way, don't hover on a node that was just placed. #3974
36594
36595                         if ((mode.id === 'draw-line' || mode.id === 'draw-area') && !_newNodeId && entity.type === 'node') {
36596                             _newNodeId = entity.id;
36597                             return;
36598                         }
36599
36600                         var suppressed = (_altDisables && event && event.altKey) ||
36601                             (entity.type === 'node' && _ignoreVertex && !allowsVertex(entity)) ||
36602                             !modeAllowsHover(entity);
36603                         _selection.selectAll(selector)
36604                             .classed(suppressed ? 'hover-suppressed' : 'hover', true);
36605
36606                         dispatch$1.call('hover', this, !suppressed && entity);
36607
36608                     } else {
36609                         dispatch$1.call('hover', this, null);
36610                     }
36611                 }
36612             }
36613
36614
36615             behavior.off = function(selection) {
36616                 selection.selectAll('.hover')
36617                     .classed('hover', false);
36618                 selection.selectAll('.hover-suppressed')
36619                     .classed('hover-suppressed', false);
36620                 selection
36621                     .classed('hover-disabled', false);
36622
36623                 selection
36624                     .on('mouseover.hover', null)
36625                     .on('mouseout.hover', null)
36626                     .on('mousedown.hover', null);
36627
36628                 d3_select(window)
36629                     .on('keydown.hover', null)
36630                     .on('keyup.hover', null);
36631             };
36632
36633
36634             behavior.altDisables = function(val) {
36635                 if (!arguments.length) return _altDisables;
36636                 _altDisables = val;
36637                 return behavior;
36638             };
36639
36640             behavior.ignoreVertex = function(val) {
36641                 if (!arguments.length) return _ignoreVertex;
36642                 _ignoreVertex = val;
36643                 return behavior;
36644             };
36645
36646             behavior.initialNodeID = function(nodeId) {
36647                 _initialNodeID = nodeId;
36648                 return behavior;
36649             };
36650
36651             return utilRebind(behavior, dispatch$1, 'on');
36652         }
36653
36654         function refresh(selection, node) {
36655             var cr = node.getBoundingClientRect();
36656             var prop = [cr.width, cr.height];
36657             selection.property('__dimensions__', prop);
36658             return prop;
36659         }
36660
36661         function utilGetDimensions(selection, force) {
36662             if (!selection || selection.empty()) {
36663                 return [0, 0];
36664             }
36665             var node = selection.node(),
36666                 cached = selection.property('__dimensions__');
36667             return (!cached || force) ? refresh(selection, node) : cached;
36668         }
36669
36670
36671         function utilSetDimensions(selection, dimensions) {
36672             if (!selection || selection.empty()) {
36673                 return selection;
36674             }
36675             var node = selection.node();
36676             if (dimensions === null) {
36677                 refresh(selection, node);
36678                 return selection;
36679             }
36680             return selection
36681                 .property('__dimensions__', [dimensions[0], dimensions[1]])
36682                 .attr('width', dimensions[0])
36683                 .attr('height', dimensions[1]);
36684         }
36685
36686         function behaviorTail() {
36687             var container;
36688             var xmargin = 25;
36689             var tooltipSize = [0, 0];
36690             var selectionSize = [0, 0];
36691             var _text;
36692
36693
36694             function behavior(selection) {
36695                 if (!_text) return;
36696
36697                 d3_select(window)
36698                     .on('resize.tail', function() { selectionSize = utilGetDimensions(selection); });
36699
36700                 container = d3_select(document.body)
36701                     .append('div')
36702                     .style('display', 'none')
36703                     .attr('class', 'tail tooltip-inner');
36704
36705                 container.append('div')
36706                     .text(_text);
36707
36708                 selection
36709                     .on('mousemove.tail', mousemove)
36710                     .on('mouseenter.tail', mouseenter)
36711                     .on('mouseleave.tail', mouseleave);
36712
36713                 container
36714                     .on('mousemove.tail', mousemove);
36715
36716                 tooltipSize = utilGetDimensions(container);
36717                 selectionSize = utilGetDimensions(selection);
36718
36719
36720                 function show() {
36721                     container.style('display', 'block');
36722                     tooltipSize = utilGetDimensions(container);
36723                 }
36724
36725
36726                 function mousemove() {
36727                     if (container.style('display') === 'none') show();
36728                     var xoffset = ((event.clientX + tooltipSize[0] + xmargin) > selectionSize[0]) ?
36729                         -tooltipSize[0] - xmargin : xmargin;
36730                     container.classed('left', xoffset > 0);
36731                     utilSetTransform(container, event.clientX + xoffset, event.clientY);
36732                 }
36733
36734
36735                 function mouseleave() {
36736                     if (event.relatedTarget !== container.node()) {
36737                         container.style('display', 'none');
36738                     }
36739                 }
36740
36741
36742                 function mouseenter() {
36743                     if (event.relatedTarget !== container.node()) {
36744                         show();
36745                     }
36746                 }
36747             }
36748
36749
36750             behavior.off = function(selection) {
36751                 if (!_text) return;
36752
36753                 container
36754                     .on('mousemove.tail', null)
36755                     .remove();
36756
36757                 selection
36758                     .on('mousemove.tail', null)
36759                     .on('mouseenter.tail', null)
36760                     .on('mouseleave.tail', null);
36761
36762                 d3_select(window)
36763                     .on('resize.tail', null);
36764             };
36765
36766
36767             behavior.text = function(val) {
36768                 if (!arguments.length) return _text;
36769                 _text = val;
36770                 return behavior;
36771             };
36772
36773
36774             return behavior;
36775         }
36776
36777         var _usedTails = {};
36778         var _disableSpace = false;
36779         var _lastSpace = null;
36780
36781
36782         function behaviorDraw(context) {
36783             var dispatch$1 = dispatch(
36784                 'move', 'click', 'clickWay', 'clickNode', 'undo', 'cancel', 'finish'
36785             );
36786
36787             var keybinding = utilKeybinding('draw');
36788
36789             var _hover = behaviorHover(context).altDisables(true).ignoreVertex(true)
36790                 .on('hover', context.ui().sidebar.hover);
36791             var tail = behaviorTail();
36792             var edit = behaviorEdit(context);
36793
36794             var closeTolerance = 4;
36795             var tolerance = 12;
36796             var _mouseLeave = false;
36797             var _lastMouse = null;
36798
36799
36800             // related code
36801             // - `mode/drag_node.js` `datum()`
36802             function datum() {
36803                 var mode = context.mode();
36804                 var isNote = mode && (mode.id.indexOf('note') !== -1);
36805                 if (event.altKey || isNote) return {};
36806
36807                 var element;
36808                 if (event.type === 'keydown') {
36809                     element = _lastMouse && _lastMouse.target;
36810                 } else {
36811                     element = event.target;
36812                 }
36813
36814                 // When drawing, snap only to touch targets..
36815                 // (this excludes area fills and active drawing elements)
36816                 var d = element.__data__;
36817                 return (d && d.properties && d.properties.target) ? d : {};
36818             }
36819
36820
36821             function mousedown() {
36822
36823                 function point() {
36824                     var p = context.container().node();
36825                     return touchId !== null ? d3_touches(p).filter(function(p) {
36826                         return p.identifier === touchId;
36827                     })[0] : d3_mouse(p);
36828                 }
36829
36830                 var element = d3_select(this);
36831                 var touchId = event.touches ? event.changedTouches[0].identifier : null;
36832                 var t1 = +new Date();
36833                 var p1 = point();
36834
36835                 element.on('mousemove.draw', null);
36836
36837                 d3_select(window).on('mouseup.draw', function() {
36838                     var t2 = +new Date();
36839                     var p2 = point();
36840                     var dist = geoVecLength(p1, p2);
36841
36842                     element.on('mousemove.draw', mousemove);
36843                     d3_select(window).on('mouseup.draw', null);
36844
36845                     if (dist < closeTolerance || (dist < tolerance && (t2 - t1) < 500)) {
36846                         // Prevent a quick second click
36847                         d3_select(window).on('click.draw-block', function() {
36848                             event.stopPropagation();
36849                         }, true);
36850
36851                         context.map().dblclickEnable(false);
36852
36853                         window.setTimeout(function() {
36854                             context.map().dblclickEnable(true);
36855                             d3_select(window).on('click.draw-block', null);
36856                         }, 500);
36857
36858                         click();
36859                     }
36860                 }, true);
36861             }
36862
36863
36864             function mousemove() {
36865                 _lastMouse = event;
36866                 dispatch$1.call('move', this, datum());
36867             }
36868
36869
36870             function mouseenter() {
36871                 _mouseLeave = false;
36872             }
36873
36874
36875             function mouseleave() {
36876                 _mouseLeave = true;
36877             }
36878
36879             function allowsVertex(d) {
36880                 return d.geometry(context.graph()) === 'vertex' || context.presets().allowsVertex(d, context.graph());
36881             }
36882
36883             // related code
36884             // - `mode/drag_node.js`     `doMode()`
36885             // - `behavior/draw.js`      `click()`
36886             // - `behavior/draw_way.js`  `move()`
36887             function click() {
36888                 var d = datum();
36889                 var target = d && d.properties && d.properties.entity;
36890
36891                 var mode = context.mode();
36892
36893                 if (target && target.type === 'node' && allowsVertex(target)) {   // Snap to a node
36894                     dispatch$1.call('clickNode', this, target, d);
36895                     return;
36896
36897                 } else if (target && target.type === 'way' && (mode.id !== 'add-point' || mode.preset.matchGeometry('vertex'))) {   // Snap to a way
36898                     var choice = geoChooseEdge(
36899                         context.childNodes(target), context.mouse(), context.projection, context.activeID()
36900                     );
36901                     if (choice) {
36902                         var edge = [target.nodes[choice.index - 1], target.nodes[choice.index]];
36903                         dispatch$1.call('clickWay', this, choice.loc, edge, d);
36904                         return;
36905                     }
36906                 } else if (mode.id !== 'add-point' || mode.preset.matchGeometry('point')) {
36907                     dispatch$1.call('click', this, context.map().mouseCoordinates(), d);
36908                 }
36909
36910             }
36911
36912
36913             function space() {
36914                 event.preventDefault();
36915                 event.stopPropagation();
36916
36917                 var currSpace = context.mouse();
36918                 if (_disableSpace && _lastSpace) {
36919                     var dist = geoVecLength(_lastSpace, currSpace);
36920                     if (dist > tolerance) {
36921                         _disableSpace = false;
36922                     }
36923                 }
36924
36925                 if (_disableSpace || _mouseLeave || !_lastMouse) return;
36926
36927                 // user must move mouse or release space bar to allow another click
36928                 _lastSpace = currSpace;
36929                 _disableSpace = true;
36930
36931                 d3_select(window).on('keyup.space-block', function() {
36932                     event.preventDefault();
36933                     event.stopPropagation();
36934                     _disableSpace = false;
36935                     d3_select(window).on('keyup.space-block', null);
36936                 });
36937
36938                 click();
36939             }
36940
36941
36942             function backspace() {
36943                 event.preventDefault();
36944                 dispatch$1.call('undo');
36945             }
36946
36947
36948             function del() {
36949                 event.preventDefault();
36950                 dispatch$1.call('cancel');
36951             }
36952
36953
36954             function ret() {
36955                 event.preventDefault();
36956                 dispatch$1.call('finish');
36957             }
36958
36959
36960             function behavior(selection) {
36961                 context.install(_hover);
36962                 context.install(edit);
36963
36964                 if (!context.inIntro() && !_usedTails[tail.text()]) {
36965                     context.install(tail);
36966                 }
36967
36968                 keybinding
36969                     .on('⌫', backspace)
36970                     .on('⌦', del)
36971                     .on('⎋', ret)
36972                     .on('↩', ret)
36973                     .on('space', space)
36974                     .on('⌥space', space);
36975
36976                 selection
36977                     .on('mouseenter.draw', mouseenter)
36978                     .on('mouseleave.draw', mouseleave)
36979                     .on('mousedown.draw', mousedown)
36980                     .on('mousemove.draw', mousemove);
36981
36982                 d3_select(document)
36983                     .call(keybinding);
36984
36985                 return behavior;
36986             }
36987
36988
36989             behavior.off = function(selection) {
36990                 context.ui().sidebar.hover.cancel();
36991                 context.uninstall(_hover);
36992                 context.uninstall(edit);
36993
36994                 if (!context.inIntro() && !_usedTails[tail.text()]) {
36995                     context.uninstall(tail);
36996                     _usedTails[tail.text()] = true;
36997                 }
36998
36999                 selection
37000                     .on('mouseenter.draw', null)
37001                     .on('mouseleave.draw', null)
37002                     .on('mousedown.draw', null)
37003                     .on('mousemove.draw', null);
37004
37005                 d3_select(window)
37006                     .on('mouseup.draw', null);
37007                     // note: keyup.space-block, click.draw-block should remain
37008
37009                 d3_select(document)
37010                     .call(keybinding.unbind);
37011             };
37012
37013
37014             behavior.tail = function(_) {
37015                 tail.text(_);
37016                 return behavior;
37017             };
37018
37019             behavior.hover = function() {
37020                 return _hover;
37021             };
37022
37023
37024             return utilRebind(behavior, dispatch$1, 'on');
37025         }
37026
37027         function behaviorBreathe() {
37028             var duration = 800;
37029             var steps = 4;
37030             var selector = '.selected.shadow, .selected .shadow';
37031             var _selected = d3_select(null);
37032             var _classed = '';
37033             var _params = {};
37034             var _done = false;
37035             var _timer;
37036
37037
37038             function ratchetyInterpolator(a, b, steps, units) {
37039                 a = parseFloat(a);
37040                 b = parseFloat(b);
37041                 var sample = quantize()
37042                     .domain([0, 1])
37043                     .range(d3_quantize(d3_interpolateNumber(a, b), steps));
37044
37045                 return function(t) {
37046                     return String(sample(t)) + (units || '');
37047                 };
37048             }
37049
37050
37051             function reset(selection) {
37052                 selection
37053                     .style('stroke-opacity', null)
37054                     .style('stroke-width', null)
37055                     .style('fill-opacity', null)
37056                     .style('r', null);
37057             }
37058
37059
37060             function setAnimationParams(transition, fromTo) {
37061                 var toFrom = (fromTo === 'from' ? 'to' : 'from');
37062
37063                 transition
37064                     .styleTween('stroke-opacity', function(d) {
37065                         return ratchetyInterpolator(
37066                             _params[d.id][toFrom].opacity,
37067                             _params[d.id][fromTo].opacity,
37068                             steps
37069                         );
37070                     })
37071                     .styleTween('stroke-width', function(d) {
37072                         return ratchetyInterpolator(
37073                             _params[d.id][toFrom].width,
37074                             _params[d.id][fromTo].width,
37075                             steps,
37076                             'px'
37077                         );
37078                     })
37079                     .styleTween('fill-opacity', function(d) {
37080                         return ratchetyInterpolator(
37081                             _params[d.id][toFrom].opacity,
37082                             _params[d.id][fromTo].opacity,
37083                             steps
37084                         );
37085                     })
37086                     .styleTween('r', function(d) {
37087                         return ratchetyInterpolator(
37088                             _params[d.id][toFrom].width,
37089                             _params[d.id][fromTo].width,
37090                             steps,
37091                             'px'
37092                         );
37093                     });
37094             }
37095
37096
37097             function calcAnimationParams(selection) {
37098                 selection
37099                     .call(reset)
37100                     .each(function(d) {
37101                         var s = d3_select(this);
37102                         var tag = s.node().tagName;
37103                         var p = {'from': {}, 'to': {}};
37104                         var opacity;
37105                         var width;
37106
37107                         // determine base opacity and width
37108                         if (tag === 'circle') {
37109                             opacity = parseFloat(s.style('fill-opacity') || 0.5);
37110                             width = parseFloat(s.style('r') || 15.5);
37111                         } else {
37112                             opacity = parseFloat(s.style('stroke-opacity') || 0.7);
37113                             width = parseFloat(s.style('stroke-width') || 10);
37114                         }
37115
37116                         // calculate from/to interpolation params..
37117                         p.tag = tag;
37118                         p.from.opacity = opacity * 0.6;
37119                         p.to.opacity = opacity * 1.25;
37120                         p.from.width = width * 0.7;
37121                         p.to.width = width * (tag === 'circle' ? 1.5 : 1);
37122                         _params[d.id] = p;
37123                     });
37124             }
37125
37126
37127             function run(surface, fromTo) {
37128                 var toFrom = (fromTo === 'from' ? 'to' : 'from');
37129                 var currSelected = surface.selectAll(selector);
37130                 var currClassed = surface.attr('class');
37131
37132                 if (_done || currSelected.empty()) {
37133                     _selected.call(reset);
37134                     return;
37135                 }
37136
37137                 if (!fastDeepEqual(currSelected.data(), _selected.data()) || currClassed !== _classed) {
37138                     _selected.call(reset);
37139                     _classed = currClassed;
37140                     _selected = currSelected.call(calcAnimationParams);
37141                 }
37142
37143                 _selected
37144                     .transition()
37145                     .duration(duration)
37146                     .call(setAnimationParams, fromTo)
37147                     .on('end', function() {
37148                         surface.call(run, toFrom);
37149                     });
37150             }
37151
37152
37153             function behavior(surface) {
37154                 _done = false;
37155                 _timer = timer(function() {
37156                     // wait for elements to actually become selected
37157                     if (surface.selectAll(selector).empty()) {
37158                         return false;
37159                     }
37160
37161                     surface.call(run, 'from');
37162                     _timer.stop();
37163                     return true;
37164                 }, 20);
37165             }
37166
37167
37168             behavior.off = function() {
37169                 _done = true;
37170                 if (_timer) {
37171                     _timer.stop();
37172                 }
37173                 _selected
37174                     .interrupt()
37175                     .call(reset);
37176             };
37177
37178
37179             return behavior;
37180         }
37181
37182         // Translate a MacOS key command into the appropriate Windows/Linux equivalent.
37183         // For example, ⌘Z -> Ctrl+Z
37184         var uiCmd = function (code) {
37185             var detected = utilDetect();
37186
37187             if (detected.os === 'mac') {
37188                 return code;
37189             }
37190
37191             if (detected.os === 'win') {
37192                 if (code === '⌘⇧Z') return 'Ctrl+Y';
37193             }
37194
37195             var result = '',
37196                 replacements = {
37197                     '⌘': 'Ctrl',
37198                     '⇧': 'Shift',
37199                     '⌥': 'Alt',
37200                     '⌫': 'Backspace',
37201                     '⌦': 'Delete'
37202                 };
37203
37204             for (var i = 0; i < code.length; i++) {
37205                 if (code[i] in replacements) {
37206                     result += replacements[code[i]] + (i < code.length - 1 ? '+' : '');
37207                 } else {
37208                     result += code[i];
37209                 }
37210             }
37211
37212             return result;
37213         };
37214
37215
37216         // return a display-focused string for a given keyboard code
37217         uiCmd.display = function(code) {
37218             if (code.length !== 1) return code;
37219
37220             var detected = utilDetect();
37221             var mac = (detected.os === 'mac');
37222             var replacements = {
37223                 '⌘': mac ? '⌘ ' + t('shortcuts.key.cmd')    : t('shortcuts.key.ctrl'),
37224                 '⇧': mac ? '⇧ ' + t('shortcuts.key.shift')  : t('shortcuts.key.shift'),
37225                 '⌥': mac ? '⌥ ' + t('shortcuts.key.option') : t('shortcuts.key.alt'),
37226                 '⌃': mac ? '⌃ ' + t('shortcuts.key.ctrl')   : t('shortcuts.key.ctrl'),
37227                 '⌫': mac ? '⌫ ' + t('shortcuts.key.delete') : t('shortcuts.key.backspace'),
37228                 '⌦': mac ? '⌦ ' + t('shortcuts.key.del')    : t('shortcuts.key.del'),
37229                 '↖': mac ? '↖ ' + t('shortcuts.key.pgup')   : t('shortcuts.key.pgup'),
37230                 '↘': mac ? '↘ ' + t('shortcuts.key.pgdn')   : t('shortcuts.key.pgdn'),
37231                 '⇞': mac ? '⇞ ' + t('shortcuts.key.home')   : t('shortcuts.key.home'),
37232                 '⇟': mac ? '⇟ ' + t('shortcuts.key.end')    : t('shortcuts.key.end'),
37233                 '↵': mac ? '↵ ' + t('shortcuts.key.return') : t('shortcuts.key.enter'),
37234                 '⎋': mac ? '⎋ ' + t('shortcuts.key.esc')    : t('shortcuts.key.esc'),
37235             };
37236
37237             return replacements[code] || code;
37238         };
37239
37240         function behaviorCopy(context) {
37241
37242             function groupEntities(ids, graph) {
37243                 var entities = ids.map(function (id) { return graph.entity(id); });
37244                 return Object.assign(
37245                     { relation: [], way: [], node: [] },
37246                     utilArrayGroupBy(entities, 'type')
37247                 );
37248             }
37249
37250
37251             function getDescendants(id, graph, descendants) {
37252                 var entity = graph.entity(id);
37253                 var children;
37254
37255                 descendants = descendants || {};
37256
37257                 if (entity.type === 'relation') {
37258                     children = entity.members.map(function(m) { return m.id; });
37259                 } else if (entity.type === 'way') {
37260                     children = entity.nodes;
37261                 } else {
37262                     children = [];
37263                 }
37264
37265                 for (var i = 0; i < children.length; i++) {
37266                     if (!descendants[children[i]]) {
37267                         descendants[children[i]] = true;
37268                         descendants = getDescendants(children[i], graph, descendants);
37269                     }
37270                 }
37271
37272                 return descendants;
37273             }
37274
37275
37276             function getSelectionText() {
37277                 return window.getSelection().toString();
37278             }
37279
37280
37281             function doCopy() {
37282                 if (!getSelectionText()) {
37283                     event.preventDefault();
37284                 }
37285
37286                 var graph = context.graph();
37287                 var selected = groupEntities(context.selectedIDs(), graph);
37288                 var canCopy = [];
37289                 var skip = {};
37290                 var entity;
37291                 var i;
37292
37293                 for (i = 0; i < selected.relation.length; i++) {
37294                     entity = selected.relation[i];
37295                     if (!skip[entity.id] && entity.isComplete(graph)) {
37296                         canCopy.push(entity.id);
37297                         skip = getDescendants(entity.id, graph, skip);
37298                     }
37299                 }
37300                 for (i = 0; i < selected.way.length; i++) {
37301                     entity = selected.way[i];
37302                     if (!skip[entity.id]) {
37303                         canCopy.push(entity.id);
37304                         skip = getDescendants(entity.id, graph, skip);
37305                     }
37306                 }
37307                 for (i = 0; i < selected.node.length; i++) {
37308                     entity = selected.node[i];
37309                     if (!skip[entity.id]) {
37310                         canCopy.push(entity.id);
37311                     }
37312                 }
37313
37314                 context.copyIDs(canCopy);
37315             }
37316
37317
37318             function behavior() {
37319                 context.keybinding().on(uiCmd('⌘C'), doCopy);
37320                 return behavior;
37321             }
37322
37323             behavior.off = function() {
37324                 context.keybinding().off(uiCmd('⌘C'));
37325             };
37326
37327
37328             return behavior;
37329         }
37330
37331         var _flashTimer;
37332
37333
37334         function uiFlash() {
37335             var _duration = 2000;
37336             var _iconName = '#iD-icon-no';
37337             var _iconClass = 'disabled';
37338             var _text = '';
37339             var _textClass;
37340
37341
37342             function flash() {
37343                 if (_flashTimer) {
37344                     _flashTimer.stop();
37345                 }
37346
37347                 d3_select('#footer-wrap')
37348                     .attr('class', 'footer-hide');
37349                 d3_select('#flash-wrap')
37350                     .attr('class', 'footer-show');
37351
37352                 var content = d3_select('#flash-wrap').selectAll('.flash-content')
37353                     .data([0]);
37354
37355                 // Enter
37356                 var contentEnter = content.enter()
37357                     .append('div')
37358                     .attr('class', 'flash-content');
37359
37360                 var iconEnter = contentEnter
37361                     .append('svg')
37362                     .attr('class', 'flash-icon')
37363                     .append('g')
37364                     .attr('transform', 'translate(10,10)');
37365
37366                 iconEnter
37367                     .append('circle')
37368                     .attr('r', 9);
37369
37370                 iconEnter
37371                     .append('use')
37372                     .attr('transform', 'translate(-7,-7)')
37373                     .attr('width', '14')
37374                     .attr('height', '14');
37375
37376                 contentEnter
37377                     .append('div')
37378                     .attr('class', 'flash-text');
37379
37380
37381                 // Update
37382                 content = content
37383                     .merge(contentEnter);
37384
37385                 content
37386                     .selectAll('.flash-icon')
37387                     .attr('class', 'flash-icon ' + (_iconClass || ''));
37388
37389                 content
37390                     .selectAll('.flash-icon use')
37391                     .attr('xlink:href', _iconName);
37392
37393                 content
37394                     .selectAll('.flash-text')
37395                     .attr('class', 'flash-text ' + (_textClass || ''))
37396                     .text(_text);
37397
37398
37399                 _flashTimer = d3_timeout(function() {
37400                     _flashTimer = null;
37401                     d3_select('#footer-wrap')
37402                         .attr('class', 'footer-show');
37403                     d3_select('#flash-wrap')
37404                         .attr('class', 'footer-hide');
37405                 }, _duration);
37406
37407                 return content;
37408             }
37409
37410
37411             flash.duration = function(_) {
37412                 if (!arguments.length) return _duration;
37413                 _duration = _;
37414                 return flash;
37415             };
37416
37417             flash.text = function(_) {
37418                 if (!arguments.length) return _text;
37419                 _text = _;
37420                 return flash;
37421             };
37422
37423             flash.textClass = function(_) {
37424                 if (!arguments.length) return _textClass;
37425                 _textClass = _;
37426                 return flash;
37427             };
37428
37429             flash.iconName = function(_) {
37430                 if (!arguments.length) return _iconName;
37431                 _iconName = _;
37432                 return flash;
37433             };
37434
37435             flash.iconClass = function(_) {
37436                 if (!arguments.length) return _iconClass;
37437                 _iconClass = _;
37438                 return flash;
37439             };
37440
37441             return flash;
37442         }
37443
37444         /* Creates a keybinding behavior for an operation */
37445         function behaviorOperation(context) {
37446             var _operation;
37447
37448             function keypress() {
37449                 event.preventDefault();
37450                 var disabled = _operation.disabled();
37451                 var flash;
37452
37453                 if (disabled) {
37454                     flash = uiFlash()
37455                         .duration(4000)
37456                         .iconName('#iD-operation-' + _operation.id)
37457                         .iconClass('operation disabled')
37458                         .text(_operation.tooltip);
37459
37460                     flash();
37461
37462                 } else {
37463                     flash = uiFlash()
37464                         .duration(2000)
37465                         .iconName('#iD-operation-' + _operation.id)
37466                         .iconClass('operation')
37467                         .text(_operation.annotation() || _operation.title);
37468
37469                     flash();
37470                     _operation();
37471                 }
37472             }
37473
37474
37475             function behavior() {
37476                 if (_operation && _operation.available()) {
37477                     context.keybinding()
37478                         .on(_operation.keys, keypress);
37479                 }
37480
37481                 return behavior;
37482             }
37483
37484
37485             behavior.off = function() {
37486                 context.keybinding()
37487                     .off(_operation.keys);
37488             };
37489
37490
37491             behavior.which = function (_) {
37492                 if (!arguments.length) return _operation;
37493                 _operation = _;
37494                 return behavior;
37495             };
37496
37497
37498             return behavior;
37499         }
37500
37501         function operationCircularize(selectedIDs, context) {
37502             var entityID = selectedIDs[0];
37503             var entity = context.entity(entityID);
37504             var extent = entity.extent(context.graph());
37505             var geometry = context.geometry(entityID);
37506             var action = actionCircularize(entityID, context.projection);
37507             var nodes = utilGetAllNodes(selectedIDs, context.graph());
37508             var coords = nodes.map(function(n) { return n.loc; });
37509
37510             var operation = function() {
37511                 context.perform(action, operation.annotation());
37512
37513                 window.setTimeout(function() {
37514                     context.validator().validate();
37515                 }, 300);  // after any transition
37516             };
37517
37518
37519             operation.available = function() {
37520                 return selectedIDs.length === 1 &&
37521                     entity.type === 'way' &&
37522                     new Set(entity.nodes).size > 1;
37523             };
37524
37525
37526             // don't cache this because the visible extent could change
37527             operation.disabled = function() {
37528                 var actionDisabled = action.disabled(context.graph());
37529                 if (actionDisabled) {
37530                     return actionDisabled;
37531                 } else if (extent.percentContainedIn(context.extent()) < 0.8) {
37532                     return 'too_large';
37533                 } else if (someMissing()) {
37534                     return 'not_downloaded';
37535                 } else if (selectedIDs.some(context.hasHiddenConnections)) {
37536                     return 'connected_to_hidden';
37537                 }
37538
37539                 return false;
37540
37541
37542                 function someMissing() {
37543                     if (context.inIntro()) return false;
37544                     var osm = context.connection();
37545                     if (osm) {
37546                         var missing = coords.filter(function(loc) { return !osm.isDataLoaded(loc); });
37547                         if (missing.length) {
37548                             missing.forEach(function(loc) { context.loadTileAtLoc(loc); });
37549                             return true;
37550                         }
37551                     }
37552                     return false;
37553                 }
37554             };
37555
37556
37557             operation.tooltip = function() {
37558                 var disable = operation.disabled();
37559                 return disable ?
37560                     t('operations.circularize.' + disable) :
37561                     t('operations.circularize.description.' + geometry);
37562             };
37563
37564
37565             operation.annotation = function() {
37566                 return t('operations.circularize.annotation.' + geometry);
37567             };
37568
37569
37570             operation.id = 'circularize';
37571             operation.keys = [t('operations.circularize.key')];
37572             operation.title = t('operations.circularize.title');
37573             operation.behavior = behaviorOperation(context).which(operation);
37574
37575             return operation;
37576         }
37577
37578         function operationDelete(selectedIDs, context) {
37579             var multi = (selectedIDs.length === 1 ? 'single' : 'multiple');
37580             var action = actionDeleteMultiple(selectedIDs);
37581             var nodes = utilGetAllNodes(selectedIDs, context.graph());
37582             var coords = nodes.map(function(n) { return n.loc; });
37583             var extent = nodes.reduce(function(extent, node) {
37584                 return extent.extend(node.extent(context.graph()));
37585             }, geoExtent());
37586
37587
37588             var operation = function() {
37589                 var nextSelectedID;
37590                 var nextSelectedLoc;
37591
37592                 if (selectedIDs.length === 1) {
37593                     var id = selectedIDs[0];
37594                     var entity = context.entity(id);
37595                     var geometry = context.geometry(id);
37596                     var parents = context.graph().parentWays(entity);
37597                     var parent = parents[0];
37598
37599                     // Select the next closest node in the way.
37600                     if (geometry === 'vertex') {
37601                         var nodes = parent.nodes;
37602                         var i = nodes.indexOf(id);
37603
37604                         if (i === 0) {
37605                             i++;
37606                         } else if (i === nodes.length - 1) {
37607                             i--;
37608                         } else {
37609                             var a = geoSphericalDistance(entity.loc, context.entity(nodes[i - 1]).loc);
37610                             var b = geoSphericalDistance(entity.loc, context.entity(nodes[i + 1]).loc);
37611                             i = a < b ? i - 1 : i + 1;
37612                         }
37613
37614                         nextSelectedID = nodes[i];
37615                         nextSelectedLoc = context.entity(nextSelectedID).loc;
37616                     }
37617                 }
37618
37619                 context.perform(action, operation.annotation());
37620                 context.validator().validate();
37621
37622                 if (nextSelectedID && nextSelectedLoc) {
37623                     if (context.hasEntity(nextSelectedID)) {
37624                         context.enter(modeSelect(context, [nextSelectedID]).follow(true));
37625                     } else {
37626                         context.map().centerEase(nextSelectedLoc);
37627                         context.enter(modeBrowse(context));
37628                     }
37629                 } else {
37630                     context.enter(modeBrowse(context));
37631                 }
37632
37633             };
37634
37635
37636             operation.available = function() {
37637                 return true;
37638             };
37639
37640
37641             operation.disabled = function() {
37642                 if (extent.area() && extent.percentContainedIn(context.extent()) < 0.8) {
37643                     return 'too_large';
37644                 } else if (someMissing()) {
37645                     return 'not_downloaded';
37646                 } else if (selectedIDs.some(context.hasHiddenConnections)) {
37647                     return 'connected_to_hidden';
37648                 } else if (selectedIDs.some(protectedMember)) {
37649                     return 'part_of_relation';
37650                 } else if (selectedIDs.some(incompleteRelation)) {
37651                     return 'incomplete_relation';
37652                 } else if (selectedIDs.some(hasWikidataTag)) {
37653                     return 'has_wikidata_tag';
37654                 }
37655
37656                 return false;
37657
37658
37659                 function someMissing() {
37660                     if (context.inIntro()) return false;
37661                     var osm = context.connection();
37662                     if (osm) {
37663                         var missing = coords.filter(function(loc) { return !osm.isDataLoaded(loc); });
37664                         if (missing.length) {
37665                             missing.forEach(function(loc) { context.loadTileAtLoc(loc); });
37666                             return true;
37667                         }
37668                     }
37669                     return false;
37670                 }
37671
37672                 function hasWikidataTag(id) {
37673                     var entity = context.entity(id);
37674                     return entity.tags.wikidata && entity.tags.wikidata.trim().length > 0;
37675                 }
37676
37677                 function incompleteRelation(id) {
37678                     var entity = context.entity(id);
37679                     return entity.type === 'relation' && !entity.isComplete(context.graph());
37680                 }
37681
37682                 function protectedMember(id) {
37683                     var entity = context.entity(id);
37684                     if (entity.type !== 'way') return false;
37685
37686                     var parents = context.graph().parentRelations(entity);
37687                     for (var i = 0; i < parents.length; i++) {
37688                         var parent = parents[i];
37689                         var type = parent.tags.type;
37690                         var role = parent.memberById(id).role || 'outer';
37691                         if (type === 'route' || type === 'boundary' || (type === 'multipolygon' && role === 'outer')) {
37692                             return true;
37693                         }
37694                     }
37695                     return false;
37696                 }
37697             };
37698
37699
37700             operation.tooltip = function() {
37701                 var disable = operation.disabled();
37702                 return disable ?
37703                     t('operations.delete.' + disable + '.' + multi) :
37704                     t('operations.delete.description' + '.' + multi);
37705             };
37706
37707
37708             operation.annotation = function() {
37709                 return selectedIDs.length === 1 ?
37710                     t('operations.delete.annotation.' + context.geometry(selectedIDs[0])) :
37711                     t('operations.delete.annotation.multiple', { n: selectedIDs.length });
37712             };
37713
37714
37715             operation.id = 'delete';
37716             operation.keys = [uiCmd('⌘⌫'), uiCmd('⌘⌦'), uiCmd('⌦')];
37717             operation.title = t('operations.delete.title');
37718             operation.behavior = behaviorOperation(context).which(operation);
37719
37720             return operation;
37721         }
37722
37723         function operationOrthogonalize(selectedIDs, context) {
37724             var _entityID;
37725             var _entity;
37726             var _geometry;
37727             var action = chooseAction();
37728             var nodes = utilGetAllNodes(selectedIDs, context.graph());
37729             var coords = nodes.map(function(n) { return n.loc; });
37730
37731
37732             function chooseAction() {
37733                 if (selectedIDs.length !== 1) return null;
37734
37735                 _entityID = selectedIDs[0];
37736                 _entity = context.entity(_entityID);
37737                 _geometry = context.geometry(_entityID);
37738
37739                 // square a line/area
37740                 if (_entity.type === 'way' && new Set(_entity.nodes).size > 2 ) {
37741                     return actionOrthogonalize(_entityID, context.projection);
37742
37743                 // square a single vertex
37744                 } else if (_geometry === 'vertex') {
37745                     var graph = context.graph();
37746                     var parents = graph.parentWays(_entity);
37747                     if (parents.length === 1) {
37748                         var way = parents[0];
37749                         if (way.nodes.indexOf(_entityID) !== -1) {
37750                             return actionOrthogonalize(way.id, context.projection, _entityID);
37751                         }
37752                     }
37753                 }
37754
37755                 return null;
37756             }
37757
37758
37759             var operation = function() {
37760                 if (!action) return;
37761
37762                 context.perform(action, operation.annotation());
37763
37764                 window.setTimeout(function() {
37765                     context.validator().validate();
37766                 }, 300);  // after any transition
37767             };
37768
37769
37770             operation.available = function() {
37771                 return Boolean(action);
37772             };
37773
37774
37775             // don't cache this because the visible extent could change
37776             operation.disabled = function() {
37777                 if (!action) return '';
37778
37779                 var actionDisabled = action.disabled(context.graph());
37780                 if (actionDisabled) {
37781                     return actionDisabled;
37782                 } else if (_geometry !== 'vertex' &&
37783                            _entity.extent(context.graph()).percentContainedIn(context.extent()) < 0.8) {
37784                     return 'too_large';
37785                 } else if (someMissing()) {
37786                     return 'not_downloaded';
37787                 } else if (selectedIDs.some(context.hasHiddenConnections)) {
37788                     return 'connected_to_hidden';
37789                 }
37790
37791                 return false;
37792
37793
37794                 function someMissing() {
37795                     if (context.inIntro()) return false;
37796                     var osm = context.connection();
37797                     if (osm) {
37798                         var missing = coords.filter(function(loc) { return !osm.isDataLoaded(loc); });
37799                         if (missing.length) {
37800                             missing.forEach(function(loc) { context.loadTileAtLoc(loc); });
37801                             return true;
37802                         }
37803                     }
37804                     return false;
37805                 }
37806             };
37807
37808
37809             operation.tooltip = function() {
37810                 var disable = operation.disabled();
37811                 return disable ?
37812                     t('operations.orthogonalize.' + disable) :
37813                     t('operations.orthogonalize.description.' + _geometry);
37814             };
37815
37816
37817             operation.annotation = function() {
37818                 return t('operations.orthogonalize.annotation.' + _geometry);
37819             };
37820
37821
37822             operation.id = 'orthogonalize';
37823             operation.keys = [t('operations.orthogonalize.key')];
37824             operation.title = t('operations.orthogonalize.title');
37825             operation.behavior = behaviorOperation(context).which(operation);
37826
37827             return operation;
37828         }
37829
37830         function operationReflectShort(selectedIDs, context) {
37831             return operationReflect(selectedIDs, context, 'short');
37832         }
37833
37834
37835         function operationReflectLong(selectedIDs, context) {
37836             return operationReflect(selectedIDs, context, 'long');
37837         }
37838
37839
37840         function operationReflect(selectedIDs, context, axis) {
37841             axis = axis || 'long';
37842             var multi = (selectedIDs.length === 1 ? 'single' : 'multiple');
37843             var nodes = utilGetAllNodes(selectedIDs, context.graph());
37844             var coords = nodes.map(function(n) { return n.loc; });
37845             var extent = nodes.reduce(function(extent, node) {
37846                 return extent.extend(node.extent(context.graph()));
37847             }, geoExtent());
37848
37849
37850             var operation = function() {
37851                 var action = actionReflect(selectedIDs, context.projection)
37852                     .useLongAxis(Boolean(axis === 'long'));
37853
37854                 context.perform(action, operation.annotation());
37855
37856                 window.setTimeout(function() {
37857                     context.validator().validate();
37858                 }, 300);  // after any transition
37859             };
37860
37861
37862             operation.available = function() {
37863                 return nodes.length >= 3;
37864             };
37865
37866
37867             // don't cache this because the visible extent could change
37868             operation.disabled = function() {
37869                 if (extent.area() && extent.percentContainedIn(context.extent()) < 0.8) {
37870                     return 'too_large';
37871                 } else if (someMissing()) {
37872                     return 'not_downloaded';
37873                 } else if (selectedIDs.some(context.hasHiddenConnections)) {
37874                     return 'connected_to_hidden';
37875                 } else if (selectedIDs.some(incompleteRelation)) {
37876                     return 'incomplete_relation';
37877                 }
37878
37879                 return false;
37880
37881
37882                 function someMissing() {
37883                     if (context.inIntro()) return false;
37884                     var osm = context.connection();
37885                     if (osm) {
37886                         var missing = coords.filter(function(loc) { return !osm.isDataLoaded(loc); });
37887                         if (missing.length) {
37888                             missing.forEach(function(loc) { context.loadTileAtLoc(loc); });
37889                             return true;
37890                         }
37891                     }
37892                     return false;
37893                 }
37894
37895                 function incompleteRelation(id) {
37896                     var entity = context.entity(id);
37897                     return entity.type === 'relation' && !entity.isComplete(context.graph());
37898                 }
37899             };
37900
37901
37902             operation.tooltip = function() {
37903                 var disable = operation.disabled();
37904                 return disable ?
37905                     t('operations.reflect.' + disable + '.' + multi) :
37906                     t('operations.reflect.description.' + axis + '.' + multi);
37907             };
37908
37909
37910             operation.annotation = function() {
37911                 return t('operations.reflect.annotation.' + axis + '.' + multi);
37912             };
37913
37914
37915             operation.id = 'reflect-' + axis;
37916             operation.keys = [t('operations.reflect.key.' + axis)];
37917             operation.title = t('operations.reflect.title.' + axis);
37918             operation.behavior = behaviorOperation(context).which(operation);
37919
37920             return operation;
37921         }
37922
37923         function operationMove(selectedIDs, context) {
37924             var multi = (selectedIDs.length === 1 ? 'single' : 'multiple');
37925             var nodes = utilGetAllNodes(selectedIDs, context.graph());
37926             var coords = nodes.map(function(n) { return n.loc; });
37927             var extent = nodes.reduce(function(extent, node) {
37928                 return extent.extend(node.extent(context.graph()));
37929             }, geoExtent());
37930
37931
37932             var operation = function() {
37933                 context.enter(modeMove(context, selectedIDs));
37934             };
37935
37936
37937             operation.available = function() {
37938                 return selectedIDs.length > 1 ||
37939                     context.entity(selectedIDs[0]).type !== 'node';
37940             };
37941
37942
37943             operation.disabled = function() {
37944                 if (extent.area() && extent.percentContainedIn(context.extent()) < 0.8) {
37945                     return 'too_large';
37946                 } else if (someMissing()) {
37947                     return 'not_downloaded';
37948                 } else if (selectedIDs.some(context.hasHiddenConnections)) {
37949                     return 'connected_to_hidden';
37950                 } else if (selectedIDs.some(incompleteRelation)) {
37951                     return 'incomplete_relation';
37952                 }
37953
37954                 return false;
37955
37956
37957                 function someMissing() {
37958                     if (context.inIntro()) return false;
37959                     var osm = context.connection();
37960                     if (osm) {
37961                         var missing = coords.filter(function(loc) { return !osm.isDataLoaded(loc); });
37962                         if (missing.length) {
37963                             missing.forEach(function(loc) { context.loadTileAtLoc(loc); });
37964                             return true;
37965                         }
37966                     }
37967                     return false;
37968                 }
37969
37970                 function incompleteRelation(id) {
37971                     var entity = context.entity(id);
37972                     return entity.type === 'relation' && !entity.isComplete(context.graph());
37973                 }
37974             };
37975
37976
37977             operation.tooltip = function() {
37978                 var disable = operation.disabled();
37979                 return disable ?
37980                     t('operations.move.' + disable + '.' + multi) :
37981                     t('operations.move.description.' + multi);
37982             };
37983
37984
37985             operation.annotation = function() {
37986                 return selectedIDs.length === 1 ?
37987                     t('operations.move.annotation.' + context.geometry(selectedIDs[0])) :
37988                     t('operations.move.annotation.multiple');
37989             };
37990
37991
37992             operation.id = 'move';
37993             operation.keys = [t('operations.move.key')];
37994             operation.title = t('operations.move.title');
37995             operation.behavior = behaviorOperation(context).which(operation);
37996
37997             return operation;
37998         }
37999
38000         function modeRotate(context, entityIDs) {
38001             var mode = {
38002                 id: 'rotate',
38003                 button: 'browse'
38004             };
38005
38006             var keybinding = utilKeybinding('rotate');
38007             var behaviors = [
38008                 behaviorEdit(context),
38009                 operationCircularize(entityIDs, context).behavior,
38010                 operationDelete(entityIDs, context).behavior,
38011                 operationMove(entityIDs, context).behavior,
38012                 operationOrthogonalize(entityIDs, context).behavior,
38013                 operationReflectLong(entityIDs, context).behavior,
38014                 operationReflectShort(entityIDs, context).behavior
38015             ];
38016             var annotation = entityIDs.length === 1 ?
38017                 t('operations.rotate.annotation.' + context.geometry(entityIDs[0])) :
38018                 t('operations.rotate.annotation.multiple');
38019
38020             var _prevGraph;
38021             var _prevAngle;
38022             var _prevTransform;
38023             var _pivot;
38024
38025
38026             function doRotate() {
38027                 var fn;
38028                 if (context.graph() !== _prevGraph) {
38029                     fn = context.perform;
38030                 } else {
38031                     fn = context.replace;
38032                 }
38033
38034                 // projection changed, recalculate _pivot
38035                 var projection = context.projection;
38036                 var currTransform = projection.transform();
38037                 if (!_prevTransform ||
38038                     currTransform.k !== _prevTransform.k ||
38039                     currTransform.x !== _prevTransform.x ||
38040                     currTransform.y !== _prevTransform.y) {
38041
38042                     var nodes = utilGetAllNodes(entityIDs, context.graph());
38043                     var points = nodes.map(function(n) { return projection(n.loc); });
38044
38045                     if (points.length === 1) {  // degenerate case
38046                         _pivot = points[0];
38047                     } else if (points.length === 2) {
38048                         _pivot = geoVecInterp(points[0], points[1], 0.5);
38049                     } else {
38050                         _pivot = d3_polygonCentroid(d3_polygonHull(points));
38051                     }
38052                     _prevAngle = undefined;
38053                 }
38054
38055
38056                 var currMouse = context.mouse();
38057                 var currAngle = Math.atan2(currMouse[1] - _pivot[1], currMouse[0] - _pivot[0]);
38058
38059                 if (typeof _prevAngle === 'undefined') _prevAngle = currAngle;
38060                 var delta = currAngle - _prevAngle;
38061
38062                 fn(actionRotate(entityIDs, _pivot, delta, projection));
38063
38064                 _prevTransform = currTransform;
38065                 _prevAngle = currAngle;
38066                 _prevGraph = context.graph();
38067             }
38068
38069
38070             function finish() {
38071                 event.stopPropagation();
38072                 context.replace(actionNoop(), annotation);
38073                 context.enter(modeSelect(context, entityIDs));
38074             }
38075
38076
38077             function cancel() {
38078                 context.pop();
38079                 context.enter(modeSelect(context, entityIDs));
38080             }
38081
38082
38083             function undone() {
38084                 context.enter(modeBrowse(context));
38085             }
38086
38087
38088             mode.enter = function() {
38089                 context.features().forceVisible(entityIDs);
38090
38091                 behaviors.forEach(context.install);
38092
38093                 context.surface()
38094                     .on('mousemove.rotate', doRotate)
38095                     .on('click.rotate', finish);
38096
38097                 context.history()
38098                     .on('undone.rotate', undone);
38099
38100                 keybinding
38101                     .on('⎋', cancel)
38102                     .on('↩', finish);
38103
38104                 d3_select(document)
38105                     .call(keybinding);
38106             };
38107
38108
38109             mode.exit = function() {
38110                 behaviors.forEach(context.uninstall);
38111
38112                 context.surface()
38113                     .on('mousemove.rotate', null)
38114                     .on('click.rotate', null);
38115
38116                 context.history()
38117                     .on('undone.rotate', null);
38118
38119                 d3_select(document)
38120                     .call(keybinding.unbind);
38121
38122                 context.features().forceVisible([]);
38123             };
38124
38125
38126             mode.selectedIDs = function() {
38127                 if (!arguments.length) return entityIDs;
38128                 // no assign
38129                 return mode;
38130             };
38131
38132
38133             return mode;
38134         }
38135
38136         function operationRotate(selectedIDs, context) {
38137             var multi = (selectedIDs.length === 1 ? 'single' : 'multiple');
38138             var nodes = utilGetAllNodes(selectedIDs, context.graph());
38139             var coords = nodes.map(function(n) { return n.loc; });
38140             var extent = nodes.reduce(function(extent, node) {
38141                 return extent.extend(node.extent(context.graph()));
38142             }, geoExtent());
38143
38144
38145             var operation = function() {
38146                 context.enter(modeRotate(context, selectedIDs));
38147             };
38148
38149
38150             operation.available = function() {
38151                 return nodes.length >= 2;
38152             };
38153
38154
38155             operation.disabled = function() {
38156
38157                 if (extent.area() && extent.percentContainedIn(context.extent()) < 0.8) {
38158                     return 'too_large';
38159                 } else if (someMissing()) {
38160                     return 'not_downloaded';
38161                 } else if (selectedIDs.some(context.hasHiddenConnections)) {
38162                     return 'connected_to_hidden';
38163                 } else if (selectedIDs.some(incompleteRelation)) {
38164                     return 'incomplete_relation';
38165                 }
38166
38167                 return false;
38168
38169
38170                 function someMissing() {
38171                     if (context.inIntro()) return false;
38172                     var osm = context.connection();
38173                     if (osm) {
38174                         var missing = coords.filter(function(loc) { return !osm.isDataLoaded(loc); });
38175                         if (missing.length) {
38176                             missing.forEach(function(loc) { context.loadTileAtLoc(loc); });
38177                             return true;
38178                         }
38179                     }
38180                     return false;
38181                 }
38182
38183                 function incompleteRelation(id) {
38184                     var entity = context.entity(id);
38185                     return entity.type === 'relation' && !entity.isComplete(context.graph());
38186                 }
38187             };
38188
38189
38190             operation.tooltip = function() {
38191                 var disable = operation.disabled();
38192                 return disable ?
38193                     t('operations.rotate.' + disable + '.' + multi) :
38194                     t('operations.rotate.description.' + multi);
38195             };
38196
38197
38198             operation.annotation = function() {
38199                 return selectedIDs.length === 1 ?
38200                     t('operations.rotate.annotation.' + context.geometry(selectedIDs[0])) :
38201                     t('operations.rotate.annotation.multiple');
38202             };
38203
38204
38205             operation.id = 'rotate';
38206             operation.keys = [t('operations.rotate.key')];
38207             operation.title = t('operations.rotate.title');
38208             operation.behavior = behaviorOperation(context).which(operation);
38209
38210             return operation;
38211         }
38212
38213         function modeMove(context, entityIDs, baseGraph) {
38214             var mode = {
38215                 id: 'move',
38216                 button: 'browse'
38217             };
38218
38219             var keybinding = utilKeybinding('move');
38220             var behaviors = [
38221                 behaviorEdit(context),
38222                 operationCircularize(entityIDs, context).behavior,
38223                 operationDelete(entityIDs, context).behavior,
38224                 operationOrthogonalize(entityIDs, context).behavior,
38225                 operationReflectLong(entityIDs, context).behavior,
38226                 operationReflectShort(entityIDs, context).behavior,
38227                 operationRotate(entityIDs, context).behavior
38228             ];
38229             var annotation = entityIDs.length === 1 ?
38230                 t('operations.move.annotation.' + context.geometry(entityIDs[0])) :
38231                 t('operations.move.annotation.multiple');
38232
38233             var _prevGraph;
38234             var _cache;
38235             var _origin;
38236             var _nudgeInterval;
38237
38238
38239             function doMove(nudge) {
38240                 nudge = nudge || [0, 0];
38241
38242                 var fn;
38243                 if (_prevGraph !== context.graph()) {
38244                     _cache = {};
38245                     _origin = context.map().mouseCoordinates();
38246                     fn = context.perform;
38247                 } else {
38248                     fn = context.overwrite;
38249                 }
38250
38251                 var currMouse = context.mouse();
38252                 var origMouse = context.projection(_origin);
38253                 var delta = geoVecSubtract(geoVecSubtract(currMouse, origMouse), nudge);
38254
38255                 fn(actionMove(entityIDs, delta, context.projection, _cache));
38256                 _prevGraph = context.graph();
38257             }
38258
38259
38260             function startNudge(nudge) {
38261                 if (_nudgeInterval) window.clearInterval(_nudgeInterval);
38262                 _nudgeInterval = window.setInterval(function() {
38263                     context.pan(nudge);
38264                     doMove(nudge);
38265                 }, 50);
38266             }
38267
38268
38269             function stopNudge() {
38270                 if (_nudgeInterval) {
38271                     window.clearInterval(_nudgeInterval);
38272                     _nudgeInterval = null;
38273                 }
38274             }
38275
38276
38277             function move() {
38278                 doMove();
38279                 var nudge = geoViewportEdge(context.mouse(), context.map().dimensions());
38280                 if (nudge) {
38281                     startNudge(nudge);
38282                 } else {
38283                     stopNudge();
38284                 }
38285             }
38286
38287
38288             function finish() {
38289                 event.stopPropagation();
38290                 context.replace(actionNoop(), annotation);
38291                 context.enter(modeSelect(context, entityIDs));
38292                 stopNudge();
38293             }
38294
38295
38296             function cancel() {
38297                 if (baseGraph) {
38298                     while (context.graph() !== baseGraph) context.pop();
38299                     context.enter(modeBrowse(context));
38300                 } else {
38301                     context.pop();
38302                     context.enter(modeSelect(context, entityIDs));
38303                 }
38304                 stopNudge();
38305             }
38306
38307
38308             function undone() {
38309                 context.enter(modeBrowse(context));
38310             }
38311
38312
38313             mode.enter = function() {
38314                 _origin = context.map().mouseCoordinates();
38315                 _prevGraph = null;
38316                 _cache = {};
38317
38318                 context.features().forceVisible(entityIDs);
38319
38320                 behaviors.forEach(context.install);
38321
38322                 context.surface()
38323                     .on('mousemove.move', move)
38324                     .on('click.move', finish);
38325
38326                 context.history()
38327                     .on('undone.move', undone);
38328
38329                 keybinding
38330                     .on('⎋', cancel)
38331                     .on('↩', finish);
38332
38333                 d3_select(document)
38334                     .call(keybinding);
38335             };
38336
38337
38338             mode.exit = function() {
38339                 stopNudge();
38340
38341                 behaviors.forEach(function(behavior) {
38342                     context.uninstall(behavior);
38343                 });
38344
38345                 context.surface()
38346                     .on('mousemove.move', null)
38347                     .on('click.move', null);
38348
38349                 context.history()
38350                     .on('undone.move', null);
38351
38352                 d3_select(document)
38353                     .call(keybinding.unbind);
38354
38355                 context.features().forceVisible([]);
38356             };
38357
38358
38359             mode.selectedIDs = function() {
38360                 if (!arguments.length) return entityIDs;
38361                 // no assign
38362                 return mode;
38363             };
38364
38365
38366             return mode;
38367         }
38368
38369         function behaviorPaste(context) {
38370
38371             function doPaste() {
38372                 event.preventDefault();
38373
38374                 var baseGraph = context.graph();
38375                 var mouse = context.mouse();
38376                 var projection = context.projection;
38377                 var viewport = geoExtent(projection.clipExtent()).polygon();
38378
38379                 if (!geoPointInPolygon(mouse, viewport)) return;
38380
38381                 var extent = geoExtent();
38382                 var oldIDs = context.copyIDs();
38383                 var oldGraph = context.copyGraph();
38384                 var newIDs = [];
38385
38386                 if (!oldIDs.length) return;
38387
38388                 var action = actionCopyEntities(oldIDs, oldGraph);
38389                 context.perform(action);
38390
38391                 var copies = action.copies();
38392                 var originals = new Set();
38393                 Object.values(copies).forEach(function(entity) { originals.add(entity.id); });
38394
38395                 for (var id in copies) {
38396                     var oldEntity = oldGraph.entity(id);
38397                     var newEntity = copies[id];
38398
38399                     extent._extend(oldEntity.extent(oldGraph));
38400
38401                     // Exclude child nodes from newIDs if their parent way was also copied.
38402                     var parents = context.graph().parentWays(newEntity);
38403                     var parentCopied = parents.some(function(parent) {
38404                         return originals.has(parent.id);
38405                     });
38406
38407                     if (!parentCopied) {
38408                         newIDs.push(newEntity.id);
38409                     }
38410                 }
38411
38412                 // Put pasted objects where mouse pointer is..
38413                 var center = projection(extent.center());
38414                 var delta = geoVecSubtract(mouse, center);
38415
38416                 context.perform(actionMove(newIDs, delta, projection));
38417                 context.enter(modeMove(context, newIDs, baseGraph));
38418             }
38419
38420
38421             function behavior() {
38422                 context.keybinding().on(uiCmd('⌘V'), doPaste);
38423                 return behavior;
38424             }
38425
38426
38427             behavior.off = function() {
38428                 context.keybinding().off(uiCmd('⌘V'));
38429             };
38430
38431
38432             return behavior;
38433         }
38434
38435         /*
38436             `behaviorDrag` is like `d3_behavior.drag`, with the following differences:
38437
38438             * The `origin` function is expected to return an [x, y] tuple rather than an
38439               {x, y} object.
38440             * The events are `start`, `move`, and `end`.
38441               (https://github.com/mbostock/d3/issues/563)
38442             * The `start` event is not dispatched until the first cursor movement occurs.
38443               (https://github.com/mbostock/d3/pull/368)
38444             * The `move` event has a `point` and `delta` [x, y] tuple properties rather
38445               than `x`, `y`, `dx`, and `dy` properties.
38446             * The `end` event is not dispatched if no movement occurs.
38447             * An `off` function is available that unbinds the drag's internal event handlers.
38448          */
38449
38450         function behaviorDrag() {
38451             var dispatch$1 = dispatch('start', 'move', 'end');
38452             var _origin = null;
38453             var _selector = '';
38454             var _event;
38455             var _target;
38456             var _surface;
38457
38458
38459             var d3_event_userSelectProperty = utilPrefixCSSProperty('UserSelect');
38460             var d3_event_userSelectSuppress = function() {
38461                     var selection$1 = selection();
38462                     var select = selection$1.style(d3_event_userSelectProperty);
38463                     selection$1.style(d3_event_userSelectProperty, 'none');
38464                     return function() {
38465                         selection$1.style(d3_event_userSelectProperty, select);
38466                     };
38467                 };
38468
38469
38470             function d3_eventCancel() {
38471                 event.stopPropagation();
38472                 event.preventDefault();
38473             }
38474
38475
38476             function eventOf(thiz, argumentz) {
38477                 return function(e1) {
38478                     e1.target = behavior;
38479                     customEvent(e1, dispatch$1.apply, dispatch$1, [e1.type, thiz, argumentz]);
38480                 };
38481             }
38482
38483
38484             function dragstart() {
38485                 _target = this;
38486                 _event = eventOf(_target, arguments);
38487
38488                 var eventTarget = event.target;
38489                 var touchId = event.touches ? event.changedTouches[0].identifier : null;
38490                 var offset;
38491                 var startOrigin = point();
38492                 var started = false;
38493                 var selectEnable = d3_event_userSelectSuppress(touchId !== null ? 'drag-' + touchId : 'drag');
38494
38495                 d3_select(window)
38496                     .on(touchId !== null ? 'touchmove.drag-' + touchId : 'mousemove.drag', dragmove)
38497                     .on(touchId !== null ? 'touchend.drag-' + touchId : 'mouseup.drag', dragend, true);
38498
38499                 if (_origin) {
38500                     offset = _origin.apply(_target, arguments);
38501                     offset = [offset[0] - startOrigin[0], offset[1] - startOrigin[1]];
38502                 } else {
38503                     offset = [0, 0];
38504                 }
38505
38506                 if (touchId === null) {
38507                     event.stopPropagation();
38508                 }
38509
38510
38511                 function point() {
38512                     var p = _surface || _target.parentNode;
38513                     return touchId !== null ? d3_touches(p).filter(function(p) {
38514                         return p.identifier === touchId;
38515                     })[0] : d3_mouse(p);
38516                 }
38517
38518
38519                 function dragmove() {
38520                     var p = point();
38521                     var dx = p[0] - startOrigin[0];
38522                     var dy = p[1] - startOrigin[1];
38523
38524                     if (dx === 0 && dy === 0)
38525                         return;
38526
38527                     startOrigin = p;
38528                     d3_eventCancel();
38529
38530                     if (!started) {
38531                         started = true;
38532                         _event({ type: 'start' });
38533                     } else {
38534                         _event({
38535                             type: 'move',
38536                             point: [p[0] + offset[0],  p[1] + offset[1]],
38537                             delta: [dx, dy]
38538                         });
38539                     }
38540                 }
38541
38542
38543                 function dragend() {
38544                     if (started) {
38545                         _event({ type: 'end' });
38546
38547                         d3_eventCancel();
38548                         if (event.target === eventTarget) {
38549                             d3_select(window)
38550                                 .on('click.drag', click, true);
38551                         }
38552                     }
38553
38554                     d3_select(window)
38555                         .on(touchId !== null ? 'touchmove.drag-' + touchId : 'mousemove.drag', null)
38556                         .on(touchId !== null ? 'touchend.drag-' + touchId : 'mouseup.drag', null);
38557
38558                     selectEnable();
38559                 }
38560
38561
38562                 function click() {
38563                     d3_eventCancel();
38564                     d3_select(window)
38565                         .on('click.drag', null);
38566                 }
38567             }
38568
38569
38570             function behavior(selection) {
38571                 var matchesSelector = utilPrefixDOMProperty('matchesSelector');
38572                 var delegate = dragstart;
38573
38574                 if (_selector) {
38575                     delegate = function() {
38576                         var root = this;
38577                         var target = event.target;
38578                         for (; target && target !== root; target = target.parentNode) {
38579                             var datum = target.__data__;
38580
38581                             var entity = datum instanceof osmNote ? datum
38582                                 : datum && datum.properties && datum.properties.entity;
38583
38584                             if (entity && target[matchesSelector](_selector)) {
38585                                 return dragstart.call(target, entity);
38586                             }
38587                         }
38588                     };
38589                 }
38590
38591                 selection
38592                     .on('mousedown.drag' + _selector, delegate)
38593                     .on('touchstart.drag' + _selector, delegate);
38594             }
38595
38596
38597             behavior.off = function(selection) {
38598                 selection
38599                     .on('mousedown.drag' + _selector, null)
38600                     .on('touchstart.drag' + _selector, null);
38601             };
38602
38603
38604             behavior.selector = function(_) {
38605                 if (!arguments.length) return _selector;
38606                 _selector = _;
38607                 return behavior;
38608             };
38609
38610
38611             behavior.origin = function(_) {
38612                 if (!arguments.length) return _origin;
38613                 _origin = _;
38614                 return behavior;
38615             };
38616
38617
38618             behavior.cancel = function() {
38619                 d3_select(window)
38620                     .on('mousemove.drag', null)
38621                     .on('mouseup.drag', null);
38622                 return behavior;
38623             };
38624
38625
38626             behavior.target = function() {
38627                 if (!arguments.length) return _target;
38628                 _target = arguments[0];
38629                 _event = eventOf(_target, Array.prototype.slice.call(arguments, 1));
38630                 return behavior;
38631             };
38632
38633
38634             behavior.surface = function() {
38635                 if (!arguments.length) return _surface;
38636                 _surface = arguments[0];
38637                 return behavior;
38638             };
38639
38640
38641             return utilRebind(behavior, dispatch$1, 'on');
38642         }
38643
38644         function modeDragNode(context) {
38645             var mode = {
38646                 id: 'drag-node',
38647                 button: 'browse'
38648             };
38649             var hover = behaviorHover(context).altDisables(true)
38650                 .on('hover', context.ui().sidebar.hover);
38651             var edit = behaviorEdit(context);
38652
38653             var _nudgeInterval;
38654             var _restoreSelectedIDs = [];
38655             var _wasMidpoint = false;
38656             var _isCancelled = false;
38657             var _activeEntity;
38658             var _startLoc;
38659             var _lastLoc;
38660
38661
38662             function startNudge(entity, nudge) {
38663                 if (_nudgeInterval) window.clearInterval(_nudgeInterval);
38664                 _nudgeInterval = window.setInterval(function() {
38665                     context.pan(nudge);
38666                     doMove(entity, nudge);
38667                 }, 50);
38668             }
38669
38670
38671             function stopNudge() {
38672                 if (_nudgeInterval) {
38673                     window.clearInterval(_nudgeInterval);
38674                     _nudgeInterval = null;
38675                 }
38676             }
38677
38678
38679             function moveAnnotation(entity) {
38680                 return t('operations.move.annotation.' + entity.geometry(context.graph()));
38681             }
38682
38683
38684             function connectAnnotation(nodeEntity, targetEntity) {
38685                 var nodeGeometry = nodeEntity.geometry(context.graph());
38686                 var targetGeometry = targetEntity.geometry(context.graph());
38687                 if (nodeGeometry === 'vertex' && targetGeometry === 'vertex') {
38688                     var nodeParentWayIDs = context.graph().parentWays(nodeEntity);
38689                     var targetParentWayIDs = context.graph().parentWays(targetEntity);
38690                     var sharedParentWays = utilArrayIntersection(nodeParentWayIDs, targetParentWayIDs);
38691                     // if both vertices are part of the same way
38692                     if (sharedParentWays.length !== 0) {
38693                         // if the nodes are next to each other, they are merged
38694                         if (sharedParentWays[0].areAdjacent(nodeEntity.id, targetEntity.id)) {
38695                             return t('operations.connect.annotation.from_vertex.to_adjacent_vertex');
38696                         }
38697                         return t('operations.connect.annotation.from_vertex.to_sibling_vertex');
38698                     }
38699                 }
38700                 return t('operations.connect.annotation.from_' + nodeGeometry + '.to_' + targetGeometry);
38701             }
38702
38703
38704             function shouldSnapToNode(target) {
38705                 if (!_activeEntity) return false;
38706                 return _activeEntity.geometry(context.graph()) !== 'vertex' ||
38707                     (target.geometry(context.graph()) === 'vertex' || context.presets().allowsVertex(target, context.graph()));
38708             }
38709
38710
38711             function origin(entity) {
38712                 return context.projection(entity.loc);
38713             }
38714
38715
38716             function keydown() {
38717                 if (event.keyCode === utilKeybinding.modifierCodes.alt) {
38718                     if (context.surface().classed('nope')) {
38719                         context.surface()
38720                             .classed('nope-suppressed', true);
38721                     }
38722                     context.surface()
38723                         .classed('nope', false)
38724                         .classed('nope-disabled', true);
38725                 }
38726             }
38727
38728
38729             function keyup() {
38730                 if (event.keyCode === utilKeybinding.modifierCodes.alt) {
38731                     if (context.surface().classed('nope-suppressed')) {
38732                         context.surface()
38733                             .classed('nope', true);
38734                     }
38735                     context.surface()
38736                         .classed('nope-suppressed', false)
38737                         .classed('nope-disabled', false);
38738                 }
38739             }
38740
38741
38742             function start(entity) {
38743                 _wasMidpoint = entity.type === 'midpoint';
38744                 var hasHidden = context.features().hasHiddenConnections(entity, context.graph());
38745                 _isCancelled = event.sourceEvent.shiftKey || hasHidden;
38746
38747
38748                 if (_isCancelled) {
38749                     if (hasHidden) {
38750                         uiFlash()
38751                             .duration(4000)
38752                             .text(t('modes.drag_node.connected_to_hidden'))();
38753                     }
38754                     return drag.cancel();
38755                 }
38756
38757                 if (_wasMidpoint) {
38758                     var midpoint = entity;
38759                     entity = osmNode();
38760                     context.perform(actionAddMidpoint(midpoint, entity));
38761                     entity = context.entity(entity.id);   // get post-action entity
38762
38763                     var vertex = context.surface().selectAll('.' + entity.id);
38764                     drag.target(vertex.node(), entity);
38765
38766                 } else {
38767                     context.perform(actionNoop());
38768                 }
38769
38770                 _activeEntity = entity;
38771                 _startLoc = entity.loc;
38772
38773                 hover.ignoreVertex(entity.geometry(context.graph()) === 'vertex');
38774
38775                 context.surface().selectAll('.' + _activeEntity.id)
38776                     .classed('active', true);
38777
38778                 context.enter(mode);
38779             }
38780
38781
38782             // related code
38783             // - `behavior/draw.js` `datum()`
38784             function datum() {
38785                 var event$1 = event && event.sourceEvent;
38786                 if (!event$1 || event$1.altKey) {
38787                     return {};
38788                 } else {
38789                     // When dragging, snap only to touch targets..
38790                     // (this excludes area fills and active drawing elements)
38791                     var d = event$1.target.__data__;
38792                     return (d && d.properties && d.properties.target) ? d : {};
38793                 }
38794             }
38795
38796
38797             function doMove(entity, nudge) {
38798                 nudge = nudge || [0, 0];
38799
38800                 var currPoint = (event && event.point) || context.projection(_lastLoc);
38801                 var currMouse = geoVecSubtract(currPoint, nudge);
38802                 var loc = context.projection.invert(currMouse);
38803
38804                 if (!_nudgeInterval) {   // If not nudging at the edge of the viewport, try to snap..
38805                     // related code
38806                     // - `mode/drag_node.js`     `doMode()`
38807                     // - `behavior/draw.js`      `click()`
38808                     // - `behavior/draw_way.js`  `move()`
38809                     var d = datum();
38810                     var target = d && d.properties && d.properties.entity;
38811                     var targetLoc = target && target.loc;
38812                     var targetNodes = d && d.properties && d.properties.nodes;
38813                     var edge;
38814
38815                     if (targetLoc) {   // snap to node/vertex - a point target with `.loc`
38816                         if (shouldSnapToNode(target)) {
38817                             loc = targetLoc;
38818                         }
38819
38820                     } else if (targetNodes) {   // snap to way - a line target with `.nodes`
38821                         edge = geoChooseEdge(targetNodes, context.mouse(), context.projection, end.id);
38822                         if (edge) {
38823                             loc = edge.loc;
38824                         }
38825                     }
38826                 }
38827
38828                 context.replace(
38829                     actionMoveNode(entity.id, loc)
38830                 );
38831
38832                 // Below here: validations
38833                 var isInvalid = false;
38834
38835                 // Check if this connection to `target` could cause relations to break..
38836                 if (target) {
38837                     isInvalid = hasRelationConflict(entity, target, edge, context.graph());
38838                 }
38839
38840                 // Check if this drag causes the geometry to break..
38841                 if (!isInvalid) {
38842                     isInvalid = hasInvalidGeometry(entity, context.graph());
38843                 }
38844
38845
38846                 var nope = context.surface().classed('nope');
38847                 if (isInvalid === 'relation' || isInvalid === 'restriction') {
38848                     if (!nope) {   // about to nope - show hint
38849                         uiFlash()
38850                             .duration(4000)
38851                             .text(t('operations.connect.' + isInvalid,
38852                                 { relation: context.presets().item('type/restriction').name() }
38853                             ))();
38854                     }
38855                 } else {
38856                     if (nope) {   // about to un-nope, remove hint
38857                         uiFlash()
38858                             .duration(1)
38859                             .text('')();
38860                     }
38861                 }
38862
38863
38864                 var nopeDisabled = context.surface().classed('nope-disabled');
38865                 if (nopeDisabled) {
38866                     context.surface()
38867                         .classed('nope', false)
38868                         .classed('nope-suppressed', isInvalid);
38869                 } else {
38870                     context.surface()
38871                         .classed('nope', isInvalid)
38872                         .classed('nope-suppressed', false);
38873                 }
38874
38875                 _lastLoc = loc;
38876             }
38877
38878
38879             // Uses `actionConnect.disabled()` to know whether this connection is ok..
38880             function hasRelationConflict(entity, target, edge, graph) {
38881                 var testGraph = graph.update();  // copy
38882
38883                 // if snapping to way - add midpoint there and consider that the target..
38884                 if (edge) {
38885                     var midpoint = osmNode();
38886                     var action = actionAddMidpoint({
38887                         loc: edge.loc,
38888                         edge: [target.nodes[edge.index - 1], target.nodes[edge.index]]
38889                     }, midpoint);
38890
38891                     testGraph = action(testGraph);
38892                     target = midpoint;
38893                 }
38894
38895                 // can we connect to it?
38896                 var ids = [entity.id, target.id];
38897                 return actionConnect(ids).disabled(testGraph);
38898             }
38899
38900
38901             function hasInvalidGeometry(entity, graph) {
38902                 var parents = graph.parentWays(entity);
38903                 var i, j, k;
38904
38905                 for (i = 0; i < parents.length; i++) {
38906                     var parent = parents[i];
38907                     var nodes = [];
38908                     var activeIndex = null;    // which multipolygon ring contains node being dragged
38909
38910                     // test any parent multipolygons for valid geometry
38911                     var relations = graph.parentRelations(parent);
38912                     for (j = 0; j < relations.length; j++) {
38913                         if (!relations[j].isMultipolygon()) continue;
38914
38915                         var rings = osmJoinWays(relations[j].members, graph);
38916
38917                         // find active ring and test it for self intersections
38918                         for (k = 0; k < rings.length; k++) {
38919                             nodes = rings[k].nodes;
38920                             if (nodes.find(function(n) { return n.id === entity.id; })) {
38921                                 activeIndex = k;
38922                                 if (geoHasSelfIntersections(nodes, entity.id)) {
38923                                     return true;
38924                                 }
38925                             }
38926                             rings[k].coords = nodes.map(function(n) { return n.loc; });
38927                         }
38928
38929                         // test active ring for intersections with other rings in the multipolygon
38930                         for (k = 0; k < rings.length; k++) {
38931                             if (k === activeIndex) continue;
38932
38933                             // make sure active ring doesnt cross passive rings
38934                             if (geoHasLineIntersections(rings[activeIndex].nodes, rings[k].nodes, entity.id)) {
38935                                 return true;
38936                             }
38937                         }
38938                     }
38939
38940
38941                     // If we still haven't tested this node's parent way for self-intersections.
38942                     // (because it's not a member of a multipolygon), test it now.
38943                     if (activeIndex === null) {
38944                         nodes = parent.nodes.map(function(nodeID) { return graph.entity(nodeID); });
38945                         if (nodes.length && geoHasSelfIntersections(nodes, entity.id)) {
38946                             return true;
38947                         }
38948                     }
38949
38950                 }
38951
38952                 return false;
38953             }
38954
38955
38956             function move(entity) {
38957                 if (_isCancelled) return;
38958                 event.sourceEvent.stopPropagation();
38959
38960                 context.surface().classed('nope-disabled', event.sourceEvent.altKey);
38961
38962                 _lastLoc = context.projection.invert(event.point);
38963
38964                 doMove(entity);
38965                 var nudge = geoViewportEdge(event.point, context.map().dimensions());
38966                 if (nudge) {
38967                     startNudge(entity, nudge);
38968                 } else {
38969                     stopNudge();
38970                 }
38971             }
38972
38973             function end(entity) {
38974                 if (_isCancelled) return;
38975
38976                 var d = datum();
38977                 var nope = (d && d.properties && d.properties.nope) || context.surface().classed('nope');
38978                 var target = d && d.properties && d.properties.entity;   // entity to snap to
38979
38980                 if (nope) {   // bounce back
38981                     context.perform(
38982                         _actionBounceBack(entity.id, _startLoc)
38983                     );
38984
38985                 } else if (target && target.type === 'way') {
38986                     var choice = geoChooseEdge(context.childNodes(target), context.mouse(), context.projection, entity.id);
38987                     context.replace(
38988                         actionAddMidpoint({
38989                             loc: choice.loc,
38990                             edge: [target.nodes[choice.index - 1], target.nodes[choice.index]]
38991                         }, entity),
38992                         connectAnnotation(entity, target)
38993                     );
38994
38995                 } else if (target && target.type === 'node' && shouldSnapToNode(target)) {
38996                     context.replace(
38997                         actionConnect([target.id, entity.id]),
38998                         connectAnnotation(entity, target)
38999                     );
39000
39001                 } else if (_wasMidpoint) {
39002                     context.replace(
39003                         actionNoop(),
39004                         t('operations.add.annotation.vertex')
39005                     );
39006
39007                 } else {
39008                     context.replace(
39009                         actionNoop(),
39010                         moveAnnotation(entity)
39011                     );
39012                 }
39013
39014                 var reselection = _restoreSelectedIDs.filter(function(id) {
39015                     return context.graph().hasEntity(id);
39016                 });
39017
39018                 if (reselection.length) {
39019                     context.enter(modeSelect(context, reselection));
39020                 } else {
39021                     context.enter(modeBrowse(context));
39022                 }
39023             }
39024
39025
39026             function _actionBounceBack(nodeID, toLoc) {
39027                 var moveNode = actionMoveNode(nodeID, toLoc);
39028                 var action = function(graph, t) {
39029                     // last time through, pop off the bounceback perform.
39030                     // it will then overwrite the initial perform with a moveNode that does nothing
39031                     if (t === 1) context.pop();
39032                     return moveNode(graph, t);
39033                 };
39034                 action.transitionable = true;
39035                 return action;
39036             }
39037
39038
39039             function cancel() {
39040                 drag.cancel();
39041                 context.enter(modeBrowse(context));
39042             }
39043
39044
39045             var drag = behaviorDrag()
39046                 .selector('.layer-touch.points .target')
39047                 .surface(d3_select('#map').node())
39048                 .origin(origin)
39049                 .on('start', start)
39050                 .on('move', move)
39051                 .on('end', end);
39052
39053
39054             mode.enter = function() {
39055                 context.install(hover);
39056                 context.install(edit);
39057
39058                 d3_select(window)
39059                     .on('keydown.drawWay', keydown)
39060                     .on('keyup.drawWay', keyup);
39061
39062                 context.history()
39063                     .on('undone.drag-node', cancel);
39064             };
39065
39066
39067             mode.exit = function() {
39068                 context.ui().sidebar.hover.cancel();
39069                 context.uninstall(hover);
39070                 context.uninstall(edit);
39071
39072                 d3_select(window)
39073                     .on('keydown.hover', null)
39074                     .on('keyup.hover', null);
39075
39076                 context.history()
39077                     .on('undone.drag-node', null);
39078
39079                 _activeEntity = null;
39080
39081                 context.surface()
39082                     .classed('nope', false)
39083                     .classed('nope-suppressed', false)
39084                     .classed('nope-disabled', false)
39085                     .selectAll('.active')
39086                     .classed('active', false);
39087
39088                 stopNudge();
39089             };
39090
39091
39092             mode.selectedIDs = function() {
39093                 if (!arguments.length) return _activeEntity ? [_activeEntity.id] : [];
39094                 // no assign
39095                 return mode;
39096             };
39097
39098
39099             mode.activeID = function() {
39100                 if (!arguments.length) return _activeEntity && _activeEntity.id;
39101                 // no assign
39102                 return mode;
39103             };
39104
39105
39106             mode.restoreSelectedIDs = function(_) {
39107                 if (!arguments.length) return _restoreSelectedIDs;
39108                 _restoreSelectedIDs = _;
39109                 return mode;
39110             };
39111
39112
39113             mode.behavior = drag;
39114
39115
39116             return mode;
39117         }
39118
39119         var localizeStrings = {"this node":"this_node","this way":"this_way","this relation":"this_relation","this one-way":"this_oneway","this highway":"this_highway","this railway":"this_railway","this waterway":"this_waterway","this cycleway":"this_cycleway","this footpath":"this_footpath","this cycleway/footpath":"this_cycleway_footpath","this riverbank":"this_riverbank","this crossing":"this_crossing","this railway crossing":"this_railway_crossing","this bridge":"this_bridge","this tunnel":"this_tunnel","this boundary":"this_boundary","this turn-restriction":"this_turn_restriction","this roundabout":"this_roundabout","this mini-roundabout":"this_mini_roundabout","this track":"this_track","this feature":"this_feature",highway:"highway",railway:"railway",waterway:"waterway",cycleway:"cycleway",cycleway_footpath:"cycleway/footpath",riverbank:"riverbank",place_of_worship:"place_of_worship",pub:"pub",restaurant:"restaurant",school:"school",university:"university",hospital:"hospital",library:"library",theatre:"theatre",courthouse:"courthouse",bank:"bank",cinema:"cinema",pharmacy:"pharmacy",cafe:"cafe",fast_food:"fast_food",fuel:"fuel",from:"from",to:"to","left-hand":"left_hand","right-hand":"right_hand"};
39120         var errorTypes = {"20":{title:"multiple nodes on the same spot",severity:"warning",description:"There is more than one node in this spot. Offending node IDs: $1",IDs:["20"],regex:"IDs: ((?:#\\d+,?)+)"},"30":{title:"non-closed_areas",severity:"error",description:"This way is tagged with '$1' and should be closed-loop.",IDs:["this",""],regex:"(this way) is tagged with '(.+)'"},"40":{title:"dead-ended one-ways",severity:"error",description:"The first node (id $1) of this one-way is not connected to any other way",IDs:["n","this"],regex:"\\(id (\\d+)\\) of (this one-way)"},"41":{title:"",severity:"error",description:"The last node (id $1) of this one-way is not connected to any other way",IDs:["n","this"],regex:"\\(id (\\d+)\\) of (this one-way)"},"42":{title:"",severity:"error",description:"This node cannot be reached because one-ways only lead away from here",IDs:["this"],regex:"(this node)"},"43":{title:"",severity:"error",description:"You cannot escape from this node because one-ways only lead to here",IDs:["this"],regex:"(this node)"},"50":{title:"almost-junctions",severity:"error",description:"This node is very close but not connected to way #$1",IDs:["this","w"],regex:"(this node) is very close but not connected to way #(\\d+)"},"60":{title:"deprecated tags",severity:"warning",description:"This $1 uses deprecated tag $2. Please use $3 instead!",IDs:["this","",""],regex:"(this (?:node|way|relation)) uses deprecated tag '(.+)'\\. Please use &quot;(.+)&quot;"},"70":{title:"missing tags",severity:"error",description:"This $1 has an empty tag: $2",IDs:["this",""],regex:"(this (?:node|way|relation)) has an empty tag: &quot;(.+)=&quot;"},"71":{title:"",severity:"error",description:"This way has no tags",IDs:["this"],regex:"(this way)"},"72":{title:"",severity:"error",description:"This node is not member of any way and does not have any tags",IDs:["this"],regex:"(this node)"},"73":{title:"",severity:"error",description:"This way has a $1 tag but no highway tag",IDs:["this",""],regex:"(this way) has a (.+) tag"},"74":{title:"missing tags",severity:"error",description:"This $1 has an empty tag: $2",IDs:["this",""],regex:"(this (?:node|way|relation)) has an empty tag: &quot;(.+)=&quot;"},"75":{description:"This (node|way|relation) has a name \\((.+)\\) but no other tag",IDs:["this",""],regex:"(this (?:node|way|relation)) has a name \\((.+)\\)"},"90":{title:"motorways without ref",severity:"error",description:"This way is tagged as motorway and therefore needs a ref nat_ref or int_ref tag",IDs:["this"],regex:"(this way)"},"100":{title:"places of worship without religion",severity:"error",description:"This $1 is tagged as place of worship and therefore needs a religion tag",IDs:["this"],regex:"(this (?:node|way|relation))"},"110":{title:"point of interest without name",severity:"error",description:"This node is tagged as $1 and therefore needs a name tag",IDs:["this",""],regex:"(this (?:node|way|relation)) is tagged as (.+) and"},"120":{title:"ways without nodes",severity:"error",description:"This way has just one single node",IDs:["this"],regex:"(this way)"},"130":{title:"floating islands",severity:"error",description:"This way is not connected to the rest of the map",IDs:["this"],regex:"(this way)"},"150":{title:"railway crossing without tag",severity:"error",description:"This crossing of a highway and a railway needs to be tagged as railway=crossing or railway=level_crossing",IDs:["this"],regex:"(this crossing)"},"160":{title:"wrongly used railway tag",severity:"error",description:"There are ways in different layers coming together in this railway crossing. There are ways tagged as tunnel or bridge coming together in this railway crossing",IDs:["this"],regex:"(this railway crossing)"},"170":{title:"FIXME tagged items",severity:"error",description:"This feature has a FIXME tag: (.*)",IDs:["this"],regex:"(this feature) has a FIXME tag: (.*)"},"180":{title:"relations without type",severity:"error",description:"This relation has no type tag which is mandatory for relations",IDs:["this"],regex:"(this relation)"},"190":{title:"intersections without junctions",severity:"error",description:"This $1 intersects the $2 #$3 but there is no junction node",IDs:["this","","w"],regex:"(this .+) intersects the (.+) #(\\d+)"},"200":{title:"overlapping ways",severity:"error",description:"This $1 overlaps the $2 #$3",IDs:["this","","w"],regex:"(this .+) overlaps the (.+) #(\\d+)"},"210":{title:"loopings",severity:"error",description:"These errors contain self intersecting ways"},"211":{title:"",severity:"error",description:"This way contains more than one node at least twice. Nodes are $1.",IDs:["this","211"],regex:"(this way) contains more than one node at least twice. Nodes are ((?:#\\d+(?:, )?)+)\\."},"212":{title:"",severity:"error",description:"This way has only two different nodes and contains one of them more than once",IDs:["this"],regex:"(this way)"},"220":{title:"misspelled tags",severity:"error",description:"This $1 is tagged '$2' where $3 looks like $4",regex:"(this (?:node|way|relation)) is tagged '(.+)' where &quot;(.+)&quot; looks like &quot;(.+)&quot;"},"221":{title:"",severity:"error",description:"The key of this $1's tag is 'key': $2",regex:"(this (?:node|way|relation))\\'s tag is \\'key\\': (.+)"},"230":{title:"layer conflicts",severity:"error",description:"This node is a junction of ways on different layers.",IDs:["this"],regex:"(this node)"},"231":{title:"mixed layers intersection",severity:"error",description:"This node is a junction of ways on different layers: $1",IDs:["this","231"],regex:"(this node) is a junction of ways on different layers: (.+)"},"232":{title:"strange layers",severity:"error",description:"This $1 is tagged with layer $2. This need not be an error, but it looks strange",IDs:["this",""],regex:"(this (?:bridge|tunnel)) is tagged with layer (-?\\d+)\\."},"270":{title:"motorways connected directly",severity:"error",description:"This node is a junction of a motorway and a highway other than motorway, motorway_link, trunk, rest_area or construction. Service or unclassified is only valid if it has access=no/private or it leads to a motorway service area or if it is a service=parking_aisle.",IDs:["this"],regex:"(this node)"},"280":{title:"boundaries",severity:"error",description:"Administrative Boundaries can be expressed either by tagging ways or by adding them to a relation. They should be closed-loop sequences of ways, they must not self-intersect or split and they must have a name and an admin_level."},"281":{title:"missing name",severity:"error",description:"This boundary has no name",IDs:["this"],regex:"(this boundary)"},"282":{title:"missing admin level",severity:"error",description:"The boundary of $1 has no (?:valid numeric)?admin_level",regex:"of (.+) has"},"283":{title:"no closed loop",severity:"error",description:"The boundary of $1 is not closed-loop",regex:"boundary of (.+) is"},"284":{title:"splitting boundary",severity:"error",description:"The boundary of $1 splits here",regex:"boundary of (.+) splits"},"285":{title:"admin_level too high",severity:"error",description:"This boundary-way has admin_level $1 but belongs to a relation with lower admin_level (higher priority); it should have the lowest admin_level of all relations",IDs:["this",""],regex:"(this boundary)-way has admin_level (-?\\d+) but"},"290":{title:"restrictions",severity:"error",description:"Analyses all relations tagged type=restriction or following variations type=restriction:hgv type=restriction:caravan type=restriction:motorcar type=restriction:bus type=restriction:agricultural type=restriction:motorcycle type=restriction:bicycle and type=restriction:hazmat"},"291":{title:"missing type",severity:"error",description:"This turn-restriction has no (?:known )?restriction type",IDs:["this"],regex:"(this turn-restriction) has"},"292":{title:"missing from way",severity:"error",description:"This turn-restriction needs exactly one from member. This one has $1",IDs:["this",""],regex:"(this turn-restriction) needs.+has (\\d+)"},"293":{title:"missing to way",severity:"error",description:"This turn-restriction needs exactly one to member. This one has $1",IDs:["this",""],regex:"(this turn-restriction) needs.+has (\\d+)"},"294":{title:"from or to not a way",severity:"error",description:"From- and To-members of this turn-restriction need to be ways. $1",IDs:["this","294"],regex:"(this turn-restriction)~.+ways\\. ((?:(?:from|to) (?:node|relation) #\\d+,?)+)"},"295":{title:"via is not on the way ends",severity:"error",description:"via (node #$1) is not the first or the last member of (from|to) (way #$3)",IDs:["this","n","","w"],regex:"(this turn-restriction)~via \\(node #(\\d+)\\).+ of (from|to) \\(way #(\\d+)\\)"},"296":{title:"wrong restriction angle",severity:"error",description:"This turn-restriction type is $1, but angle is $2 degrees. Maybe the restriction type is not appropriate?",IDs:["this","",""],regex:"(this turn-restriction)~.+is (\\w+), but angle is (-?\\d+)"},"297":{title:"wrong direction of to member",severity:"error",description:"wrong direction of to way $1",IDs:["this","w"],regex:"(this turn-restriction)~.+to way (\\d+)"},"298":{title:"already restricted by oneway",severity:"error",description:"entry already prohibited by oneway tag on $1",IDs:["this","w"],regex:"(this turn-restriction)~.+tag on (\\d+)"},"300":{title:"missing maxspeed",severity:"warning",description:"This highway is missing a maxspeed tag",IDs:["this"],regex:"(this highway)"},"310":{title:"roundabouts",severity:"error",description:"Analyses ways with tag junction=roundabout. More then one way can form a roundabout. It supports tag oneway=-1"},"311":{title:"not closed loop",severity:"error",description:"This way is part of a roundabout but is not closed-loop. (split carriageways approaching a roundabout should not be tagged as roundabout)",IDs:["this"],regex:"(this way)"},"312":{title:"wrong direction",severity:"error",description:"If this ((?:mini_)?roundabout) is in a country with (left|right)-hand traffic then its orientation goes the wrong way around",IDs:["this",""],regex:"(this (?:mini_)?roundabout) is in a country with ((?:left|right)-hand)"},"313":{title:"faintly connected",severity:"error",description:"This roundabout has only $1 other roads connected. Roundabouts typically have three",IDs:["this",""],regex:"(this roundabout) has only (\\d) other"},"320":{title:"*_link connections",severity:"error",description:"This way is tagged as highway=$1_link but doesn't have a connection to any other $1 or $1_link",IDs:["this","","","",""],regex:"(this way) is tagged as (highway=.+) but doesn't have a connection to any other (.+) or (.+)"},"350":{title:"bridge-tags",severity:"error",description:"This bridge does not have a tag in common with its surrounding ways that shows the purpose of this bridge. There should be one of these tags: (.+)",NOTE:"Group can be arbitrary list of form: key=value,key=value,key=value...",IDs:["this",""],regex:"(this bridge).*tags: (.+)"},"360":{title:"language unknown",severity:"warning",description:"It would be nice if this (node|way|relation) had an additional tag 'name:XX=(.+)' where XX shows the language of its name '\\2'",IDs:["this",""],regex:"(this (?:node|way|relation)) had an additional tag 'name:XX=(.+)' where"},"370":{title:"doubled places",severity:"error",description:"This node has tags in common with the surrounding way #$1 ((?:\\(including the name '.+'\\) )?)and seems to be redundand",IDs:["this","w","370"],regex:"(this node) has tags in common with the surrounding way #(\\d+) ((?:\\(including the name '.+'\\) )?)and"},"380":{title:"non-physical use of sport-tag",severity:"error",description:"This way is tagged sport=$1 but has no physical tag like e.g. leisure, building, amenity or highway",IDs:["this",""],regex:"(this way) is tagged (sport=.+) but"},"390":{title:"missing tracktype",severity:"warning",description:"This track doesn''t have a tracktype",IDs:["this"],regex:"(this track)"},"400":{title:"geometry glitches",severity:"error",description:""},"401":{title:"missing turn restriction",severity:"error",description:"ways $1 and $2 join in a very sharp angle here and there is no oneway tag or turn restriction that prevents turning( from way (\\1|\\2) to (\\1|\\2))?",IDs:["w","w"],regex:"ways (\\d+) and (\\d+) join"},"402":{title:"impossible angles",severity:"error",description:"this way bends in a very sharp angle here",IDs:["this"],regex:"(this way)"},"410":{title:"website",severity:"error",description:"Web pages are analyzed. Web page is defined by any of the following tags website=* url=* website:mobile=* contact:website=* contact:url=* image=* source:website=* or source:url=*"},"411":{title:"http error",severity:"error",description:"The URL (<a target=_blank href=$1>$1</a>) cannot be opened (HTTP status code $2)",IDs:["this","url",""],regex:"(this feature)~.+ href=([^>]+)>.+ code (\\d+)\\)"},"412":{title:"domain hijacking",severity:"error",description:"Possible domain squatting: <a target=_blank href=$1>$1</a>. Suspicious text is: \"$2\"",IDs:["this","url",""],regex:"(this feature)~.+ href=([^>]+)>.+ is: &quot;(.+)&quot;"},"413":{title:"non-match",severity:"error",description:"Content of the URL (<a target=_blank href=$1>$1</a>) did not contain these keywords: ($2)",IDs:["this","url",""],regex:"(this feature)~.+ href=([^>]+)>.+ keywords: \\((.+)\\)"}};
39121
39122         var tiler = utilTiler();
39123         var dispatch$1 = dispatch('loaded');
39124
39125         var _krCache;
39126         var _krZoom = 14;
39127         var _krUrlRoot = 'https://www.keepright.at/';
39128
39129         var _krRuleset = [
39130             // no 20 - multiple node on same spot - these are mostly boundaries overlapping roads
39131             30, 40, 50, 60, 70, 90, 100, 110, 120, 130, 150, 160, 170, 180,
39132             190, 191, 192, 193, 194, 195, 196, 197, 198,
39133             200, 201, 202, 203, 204, 205, 206, 207, 208, 210, 220,
39134             230, 231, 232, 270, 280, 281, 282, 283, 284, 285,
39135             290, 291, 292, 293, 294, 295, 296, 297, 298, 300, 310, 311, 312, 313,
39136             320, 350, 360, 370, 380, 390, 400, 401, 402, 410, 411, 412, 413
39137         ];
39138
39139
39140         function abortRequest(controller) {
39141             if (controller) {
39142                 controller.abort();
39143             }
39144         }
39145
39146         function abortUnwantedRequests(cache, tiles) {
39147             Object.keys(cache.inflightTile).forEach(function(k) {
39148                 var wanted = tiles.find(function(tile) { return k === tile.id; });
39149                 if (!wanted) {
39150                     abortRequest(cache.inflightTile[k]);
39151                     delete cache.inflightTile[k];
39152                 }
39153             });
39154         }
39155
39156
39157         function encodeErrorRtree(d) {
39158             return { minX: d.loc[0], minY: d.loc[1], maxX: d.loc[0], maxY: d.loc[1], data: d };
39159         }
39160
39161
39162         // replace or remove error from rtree
39163         function updateRtree(item, replace) {
39164             _krCache.rtree.remove(item, function isEql(a, b) {
39165                 return a.data.id === b.data.id;
39166             });
39167
39168             if (replace) {
39169                 _krCache.rtree.insert(item);
39170             }
39171         }
39172
39173
39174         function tokenReplacements(d) {
39175             if (!(d instanceof qaError)) return;
39176
39177             var htmlRegex = new RegExp(/<\/[a-z][\s\S]*>/);
39178             var replacements = {};
39179
39180             var errorTemplate = errorTypes[d.which_type];
39181             if (!errorTemplate) {
39182                 /* eslint-disable no-console */
39183                 console.log('No Template: ', d.which_type);
39184                 console.log('  ', d.description);
39185                 /* eslint-enable no-console */
39186                 return;
39187             }
39188
39189             // some descriptions are just fixed text
39190             if (!errorTemplate.regex) return;
39191
39192             // regex pattern should match description with variable details captured
39193             var errorRegex = new RegExp(errorTemplate.regex, 'i');
39194             var errorMatch = errorRegex.exec(d.description);
39195             if (!errorMatch) {
39196                 /* eslint-disable no-console */
39197                 console.log('Unmatched: ', d.which_type);
39198                 console.log('  ', d.description);
39199                 console.log('  ', errorRegex);
39200                 /* eslint-enable no-console */
39201                 return;
39202             }
39203
39204             for (var i = 1; i < errorMatch.length; i++) {   // skip first
39205                 var capture = errorMatch[i];
39206                 var idType;
39207
39208                 idType = 'IDs' in errorTemplate ? errorTemplate.IDs[i-1] : '';
39209                 if (idType && capture) {   // link IDs if present in the capture
39210                     capture = parseError(capture, idType);
39211                 } else if (htmlRegex.test(capture)) {   // escape any html in non-IDs
39212                     capture = '\\' +  capture + '\\';
39213                 } else {
39214                     var compare = capture.toLowerCase();
39215                     if (localizeStrings[compare]) {   // some replacement strings can be localized
39216                         capture = t('QA.keepRight.error_parts.' + localizeStrings[compare]);
39217                     }
39218                 }
39219
39220                 replacements['var' + i] = capture;
39221             }
39222
39223             return replacements;
39224         }
39225
39226
39227         function parseError(capture, idType) {
39228             var compare = capture.toLowerCase();
39229             if (localizeStrings[compare]) {   // some replacement strings can be localized
39230                 capture = t('QA.keepRight.error_parts.' + localizeStrings[compare]);
39231             }
39232
39233             switch (idType) {
39234                 // link a string like "this node"
39235                 case 'this':
39236                     capture = linkErrorObject(capture);
39237                     break;
39238
39239                 case 'url':
39240                     capture = linkURL(capture);
39241                     break;
39242
39243                 // link an entity ID
39244                 case 'n':
39245                 case 'w':
39246                 case 'r':
39247                     capture = linkEntity(idType + capture);
39248                     break;
39249
39250                 // some errors have more complex ID lists/variance
39251                 case '20':
39252                     capture = parse20(capture);
39253                     break;
39254                 case '211':
39255                     capture = parse211(capture);
39256                     break;
39257                 case '231':
39258                     capture = parse231(capture);
39259                     break;
39260                 case '294':
39261                     capture = parse294(capture);
39262                     break;
39263                 case '370':
39264                     capture = parse370(capture);
39265                     break;
39266             }
39267
39268             return capture;
39269
39270
39271             function linkErrorObject(d) {
39272                 return '<a class="error_object_link">' + d + '</a>';
39273             }
39274
39275             function linkEntity(d) {
39276                 return '<a class="error_entity_link">' + d + '</a>';
39277             }
39278
39279             function linkURL(d) {
39280                 return '<a class="kr_external_link" target="_blank" href="' + d + '">' + d + '</a>';
39281             }
39282
39283             // arbitrary node list of form: #ID, #ID, #ID...
39284             function parse211(capture) {
39285                 var newList = [];
39286                 var items = capture.split(', ');
39287
39288                 items.forEach(function(item) {
39289                     // ID has # at the front
39290                     var id = linkEntity('n' + item.slice(1));
39291                     newList.push(id);
39292                 });
39293
39294                 return newList.join(', ');
39295             }
39296
39297             // arbitrary way list of form: #ID(layer),#ID(layer),#ID(layer)...
39298             function parse231(capture) {
39299                 var newList = [];
39300                 // unfortunately 'layer' can itself contain commas, so we split on '),'
39301                 var items = capture.split('),');
39302
39303                 items.forEach(function(item) {
39304                     var match = item.match(/\#(\d+)\((.+)\)?/);
39305                     if (match !== null && match.length > 2) {
39306                         newList.push(linkEntity('w' + match[1]) + ' ' +
39307                             t('QA.keepRight.errorTypes.231.layer', { layer: match[2] })
39308                         );
39309                     }
39310                 });
39311
39312                 return newList.join(', ');
39313             }
39314
39315             // arbitrary node/relation list of form: from node #ID,to relation #ID,to node #ID...
39316             function parse294(capture) {
39317                 var newList = [];
39318                 var items = capture.split(',');
39319
39320                 items.forEach(function(item) {
39321                     var role;
39322                     var idType;
39323                     var id;
39324
39325                     // item of form "from/to node/relation #ID"
39326                     item = item.split(' ');
39327
39328                     // to/from role is more clear in quotes
39329                     role = '"' + item[0] + '"';
39330
39331                     // first letter of node/relation provides the type
39332                     idType = item[1].slice(0,1);
39333
39334                     // ID has # at the front
39335                     id = item[2].slice(1);
39336                     id = linkEntity(idType + id);
39337
39338                     item = [role, item[1], id].join(' ');
39339                     newList.push(item);
39340                 });
39341
39342                 return newList.join(', ');
39343             }
39344
39345             // may or may not include the string "(including the name 'name')"
39346             function parse370(capture) {
39347                 if (!capture) return '';
39348
39349                 var match = capture.match(/\(including the name (\'.+\')\)/);
39350                 if (match !== null && match.length) {
39351                     return t('QA.keepRight.errorTypes.370.including_the_name', { name: match[1] });
39352                 }
39353                 return '';
39354             }
39355
39356             // arbitrary node list of form: #ID,#ID,#ID...
39357             function parse20(capture) {
39358                 var newList = [];
39359                 var items = capture.split(',');
39360
39361                 items.forEach(function(item) {
39362                     // ID has # at the front
39363                     var id = linkEntity('n' + item.slice(1));
39364                     newList.push(id);
39365                 });
39366
39367                 return newList.join(', ');
39368             }
39369         }
39370
39371
39372         var serviceKeepRight = {
39373             init: function() {
39374                 if (!_krCache) {
39375                     this.reset();
39376                 }
39377
39378                 this.event = utilRebind(this, dispatch$1, 'on');
39379             },
39380
39381             reset: function() {
39382                 if (_krCache) {
39383                     Object.values(_krCache.inflightTile).forEach(abortRequest);
39384                 }
39385
39386                 _krCache = {
39387                     data: {},
39388                     loadedTile: {},
39389                     inflightTile: {},
39390                     inflightPost: {},
39391                     closed: {},
39392                     rtree: rbush_1()
39393                 };
39394             },
39395
39396
39397             // KeepRight API:  http://osm.mueschelsoft.de/keepright/interfacing.php
39398             loadErrors: function(projection) {
39399                 var options = { format: 'geojson' };
39400                 var rules = _krRuleset.join();
39401
39402                 // determine the needed tiles to cover the view
39403                 var tiles = tiler
39404                     .zoomExtent([_krZoom, _krZoom])
39405                     .getTiles(projection);
39406
39407                 // abort inflight requests that are no longer needed
39408                 abortUnwantedRequests(_krCache, tiles);
39409
39410                 // issue new requests..
39411                 tiles.forEach(function(tile) {
39412                     if (_krCache.loadedTile[tile.id] || _krCache.inflightTile[tile.id]) return;
39413
39414                     var rect = tile.extent.rectangle();
39415                     var params = Object.assign({}, options, { left: rect[0], bottom: rect[3], right: rect[2], top: rect[1] });
39416                     var url = _krUrlRoot + 'export.php?' + utilQsString(params) + '&ch=' + rules;
39417
39418                     var controller = new AbortController();
39419                     _krCache.inflightTile[tile.id] = controller;
39420
39421                     d3_json(url, { signal: controller.signal })
39422                         .then(function(data) {
39423                             delete _krCache.inflightTile[tile.id];
39424                             _krCache.loadedTile[tile.id] = true;
39425                             if (!data || !data.features || !data.features.length) {
39426                                 throw new Error('No Data');
39427                             }
39428
39429                             data.features.forEach(function(feature) {
39430                                 var loc = feature.geometry.coordinates;
39431                                 var props = feature.properties;
39432
39433                                 // if there is a parent, save its error type e.g.:
39434                                 //  Error 191 = "highway-highway"
39435                                 //  Error 190 = "intersections without junctions"  (parent)
39436                                 var errorType = props.error_type;
39437                                 var errorTemplate = errorTypes[errorType];
39438                                 var parentErrorType = (Math.floor(errorType / 10) * 10).toString();
39439
39440                                 // try to handle error type directly, fallback to parent error type.
39441                                 var whichType = errorTemplate ? errorType : parentErrorType;
39442                                 var whichTemplate = errorTypes[whichType];
39443
39444                                 // Rewrite a few of the errors at this point..
39445                                 // This is done to make them easier to linkify and translate.
39446                                 switch (whichType) {
39447                                     case '170':
39448                                         props.description = 'This feature has a FIXME tag: ' + props.description;
39449                                         break;
39450                                     case '292':
39451                                     case '293':
39452                                         props.description = props.description.replace('A turn-', 'This turn-');
39453                                         break;
39454                                     case '294':
39455                                     case '295':
39456                                     case '296':
39457                                     case '297':
39458                                     case '298':
39459                                         props.description = 'This turn-restriction~' + props.description;
39460                                         break;
39461                                     case '300':
39462                                         props.description = 'This highway is missing a maxspeed tag';
39463                                         break;
39464                                     case '411':
39465                                     case '412':
39466                                     case '413':
39467                                         props.description = 'This feature~' + props.description;
39468                                         break;
39469                                 }
39470
39471                                 // - move markers slightly so it doesn't obscure the geometry,
39472                                 // - then move markers away from other coincident markers
39473                                 var coincident = false;
39474                                 do {
39475                                     // first time, move marker up. after that, move marker right.
39476                                     var delta = coincident ? [0.00001, 0] : [0, 0.00001];
39477                                     loc = geoVecAdd(loc, delta);
39478                                     var bbox = geoExtent(loc).bbox();
39479                                     coincident = _krCache.rtree.search(bbox).length;
39480                                 } while (coincident);
39481
39482                                 var d = new qaError({
39483                                     // Required values
39484                                     loc: loc,
39485                                     service: 'keepRight',
39486                                     error_type: errorType,
39487                                     // Extra values for this service
39488                                     id: props.error_id,
39489                                     comment: props.comment || null,
39490                                     description: props.description || '',
39491                                     error_id: props.error_id,
39492                                     which_type: whichType,
39493                                     parent_error_type: parentErrorType,
39494                                     severity: whichTemplate.severity || 'error',
39495                                     object_id: props.object_id,
39496                                     object_type: props.object_type,
39497                                     schema: props.schema,
39498                                     title: props.title
39499                                 });
39500
39501                                 d.replacements = tokenReplacements(d);
39502
39503                                 _krCache.data[d.id] = d;
39504                                 _krCache.rtree.insert(encodeErrorRtree(d));
39505                             });
39506
39507                             dispatch$1.call('loaded');
39508                         })
39509                         .catch(function() {
39510                             delete _krCache.inflightTile[tile.id];
39511                             _krCache.loadedTile[tile.id] = true;
39512                         });
39513
39514                 });
39515             },
39516
39517
39518             postKeepRightUpdate: function(d, callback) {
39519                 if (_krCache.inflightPost[d.id]) {
39520                     return callback({ message: 'Error update already inflight', status: -2 }, d);
39521                 }
39522
39523                 var that = this;
39524                 var params = { schema: d.schema, id: d.error_id };
39525
39526                 if (d.state) {
39527                     params.st = d.state;
39528                 }
39529                 if (d.newComment !== undefined) {
39530                     params.co = d.newComment;
39531                 }
39532
39533                 // NOTE: This throws a CORS err, but it seems successful.
39534                 // We don't care too much about the response, so this is fine.
39535                 var url = _krUrlRoot + 'comment.php?' + utilQsString(params);
39536
39537                 var controller = new AbortController();
39538                 _krCache.inflightPost[d.id] = controller;
39539
39540                 fetch(url, { method: 'POST', signal: controller.signal })
39541                     .then(function(response) {
39542                         delete _krCache.inflightPost[d.id];
39543                         if (!response.ok) {
39544                             throw new Error(response.status + ' ' + response.statusText);
39545                         }
39546
39547                         if (d.state === 'ignore') {   // ignore permanently (false positive)
39548                             that.removeError(d);
39549
39550                         } else if (d.state === 'ignore_t') {  // ignore temporarily (error fixed)
39551                             that.removeError(d);
39552                             _krCache.closed[d.schema + ':' + d.error_id] = true;
39553
39554                         } else {
39555                             d = that.replaceError(d.update({
39556                                 comment: d.newComment,
39557                                 newComment: undefined,
39558                                 state: undefined
39559                             }));
39560                         }
39561
39562                         if (callback) callback(null, d);
39563                     })
39564                     .catch(function(err) {
39565                         delete _krCache.inflightPost[d.id];
39566                         if (callback) callback(err.message);
39567                     });
39568             },
39569
39570
39571             // get all cached errors covering the viewport
39572             getErrors: function(projection) {
39573                 var viewport = projection.clipExtent();
39574                 var min = [viewport[0][0], viewport[1][1]];
39575                 var max = [viewport[1][0], viewport[0][1]];
39576                 var bbox = geoExtent(projection.invert(min), projection.invert(max)).bbox();
39577
39578                 return _krCache.rtree.search(bbox).map(function(d) {
39579                     return d.data;
39580                 });
39581             },
39582
39583
39584             // get a single error from the cache
39585             getError: function(id) {
39586                 return _krCache.data[id];
39587             },
39588
39589
39590             // replace a single error in the cache
39591             replaceError: function(error) {
39592                 if (!(error instanceof qaError) || !error.id) return;
39593
39594                 _krCache.data[error.id] = error;
39595                 updateRtree(encodeErrorRtree(error), true); // true = replace
39596                 return error;
39597             },
39598
39599
39600             // remove a single error from the cache
39601             removeError: function(error) {
39602                 if (!(error instanceof qaError) || !error.id) return;
39603
39604                 delete _krCache.data[error.id];
39605                 updateRtree(encodeErrorRtree(error), false); // false = remove
39606             },
39607
39608
39609             errorURL: function(error) {
39610                 return _krUrlRoot + 'report_map.php?schema=' + error.schema + '&error=' + error.id;
39611             },
39612
39613
39614             // Get an array of errors closed during this session.
39615             // Used to populate `closed:keepright` changeset tag
39616             getClosedIDs: function() {
39617                 return Object.keys(_krCache.closed).sort();
39618             }
39619
39620         };
39621
39622         var tiler$1 = utilTiler();
39623         var dispatch$2 = dispatch('loaded');
39624
39625         var _erCache;
39626         var _erZoom = 14;
39627
39628         var _impOsmUrls = {
39629             ow: 'https://directionofflow.skobbler.net/directionOfFlowService',
39630             mr: 'https://missingroads.skobbler.net/missingGeoService',
39631             tr: 'https://turnrestrictionservice.skobbler.net/turnRestrictionService'
39632         };
39633
39634         function abortRequest$1(i) {
39635             Object.values(i).forEach(function(controller) {
39636                 if (controller) {
39637                     controller.abort();
39638                 }
39639             });
39640         }
39641
39642         function abortUnwantedRequests$1(cache, tiles) {
39643             Object.keys(cache.inflightTile).forEach(function(k) {
39644                 var wanted = tiles.find(function(tile) { return k === tile.id; });
39645                 if (!wanted) {
39646                     abortRequest$1(cache.inflightTile[k]);
39647                     delete cache.inflightTile[k];
39648                 }
39649             });
39650         }
39651
39652
39653         function encodeErrorRtree$1(d) {
39654             return { minX: d.loc[0], minY: d.loc[1], maxX: d.loc[0], maxY: d.loc[1], data: d };
39655         }
39656
39657
39658         // replace or remove error from rtree
39659         function updateRtree$1(item, replace) {
39660             _erCache.rtree.remove(item, function isEql(a, b) {
39661                 return a.data.id === b.data.id;
39662             });
39663
39664             if (replace) {
39665                 _erCache.rtree.insert(item);
39666             }
39667         }
39668
39669         function linkErrorObject(d) {
39670             return '<a class="error_object_link">' + d + '</a>';
39671         }
39672
39673         function linkEntity(d) {
39674             return '<a class="error_entity_link">' + d + '</a>';
39675         }
39676
39677         function pointAverage(points) {
39678             if (points.length) {
39679                 var sum = points.reduce(function(acc, point) {
39680                     return geoVecAdd(acc, [point.lon, point.lat]);
39681                 }, [0,0]);
39682                 return geoVecScale(sum, 1 / points.length);
39683             } else {
39684                 return [0,0];
39685             }
39686         }
39687
39688         function relativeBearing(p1, p2) {
39689             var angle = Math.atan2(p2.lon - p1.lon, p2.lat - p1.lat);
39690             if (angle < 0) {
39691                 angle += 2 * Math.PI;
39692             }
39693
39694             // Return degrees
39695             return angle * 180 / Math.PI;
39696         }
39697
39698         // Assuming range [0,360)
39699         function cardinalDirection(bearing) {
39700             var dir = 45 * Math.round(bearing / 45);
39701             var compass = {
39702                 0: 'north',
39703                 45: 'northeast',
39704                 90: 'east',
39705                 135: 'southeast',
39706                 180: 'south',
39707                 225: 'southwest',
39708                 270: 'west',
39709                 315: 'northwest',
39710                 360: 'north'
39711             };
39712
39713             return t('QA.improveOSM.directions.' + compass[dir]);
39714         }
39715
39716         // Errors shouldn't obscure eachother
39717         function preventCoincident(loc, bumpUp) {
39718             var coincident = false;
39719             do {
39720                 // first time, move marker up. after that, move marker right.
39721                 var delta = coincident ? [0.00001, 0] : (bumpUp ? [0, 0.00001] : [0, 0]);
39722                 loc = geoVecAdd(loc, delta);
39723                 var bbox = geoExtent(loc).bbox();
39724                 coincident = _erCache.rtree.search(bbox).length;
39725             } while (coincident);
39726
39727             return loc;
39728         }
39729
39730         var serviceImproveOSM = {
39731             init: function() {
39732                 if (!_erCache) {
39733                     this.reset();
39734                 }
39735
39736                 this.event = utilRebind(this, dispatch$2, 'on');
39737             },
39738
39739             reset: function() {
39740                 if (_erCache) {
39741                     Object.values(_erCache.inflightTile).forEach(abortRequest$1);
39742                 }
39743                 _erCache = {
39744                     data: {},
39745                     loadedTile: {},
39746                     inflightTile: {},
39747                     inflightPost: {},
39748                     closed: {},
39749                     rtree: rbush_1()
39750                 };
39751             },
39752
39753             loadErrors: function(projection) {
39754                 var options = {
39755                     client: 'iD',
39756                     status: 'OPEN',
39757                     zoom: '19' // Use a high zoom so that clusters aren't returned
39758                 };
39759
39760                 // determine the needed tiles to cover the view
39761                 var tiles = tiler$1
39762                     .zoomExtent([_erZoom, _erZoom])
39763                     .getTiles(projection);
39764
39765                 // abort inflight requests that are no longer needed
39766                 abortUnwantedRequests$1(_erCache, tiles);
39767
39768                 // issue new requests..
39769                 tiles.forEach(function(tile) {
39770                     if (_erCache.loadedTile[tile.id] || _erCache.inflightTile[tile.id]) return;
39771
39772                     var rect = tile.extent.rectangle();
39773                     var params = Object.assign({}, options, { east: rect[0], south: rect[3], west: rect[2], north: rect[1] });
39774
39775                     // 3 separate requests to store for each tile
39776                     var requests = {};
39777
39778                     Object.keys(_impOsmUrls).forEach(function(k) {
39779                         var v = _impOsmUrls[k];
39780                         // We exclude WATER from missing geometry as it doesn't seem useful
39781                         // We use most confident one-way and turn restrictions only, still have false positives
39782                         var kParams = Object.assign({},
39783                             params,
39784                             (k === 'mr') ? { type: 'PARKING,ROAD,BOTH,PATH' } : { confidenceLevel: 'C1' }
39785                         );
39786                         var url = v + '/search?' + utilQsString(kParams);
39787
39788                         var controller = new AbortController();
39789                         requests[k] = controller;
39790
39791                         d3_json(url, { signal: controller.signal })
39792                             .then(function(data) {
39793                                 delete _erCache.inflightTile[tile.id][k];
39794                                 if (!Object.keys(_erCache.inflightTile[tile.id]).length) {
39795                                     delete _erCache.inflightTile[tile.id];
39796                                     _erCache.loadedTile[tile.id] = true;
39797                                 }
39798
39799                                 // Road segments at high zoom == oneways
39800                                 if (data.roadSegments) {
39801                                     data.roadSegments.forEach(function(feature) {
39802                                         // Position error at the approximate middle of the segment
39803                                         var points = feature.points;
39804                                         var mid = points.length / 2;
39805                                         var loc;
39806
39807                                         // Even number of points, find midpoint of the middle two
39808                                         // Odd number of points, use position of very middle point
39809                                         if (mid % 1 === 0) {
39810                                             loc = pointAverage([points[mid - 1], points[mid]]);
39811                                         } else {
39812                                             mid = points[Math.floor(mid)];
39813                                             loc = [mid.lon, mid.lat];
39814                                         }
39815
39816                                         // One-ways can land on same segment in opposite direction
39817                                         loc = preventCoincident(loc, false);
39818
39819                                         var d = new qaError({
39820                                             // Info required for every error
39821                                             loc: loc,
39822                                             service: 'improveOSM',
39823                                             error_type: k,
39824                                             // Extra details needed for this service
39825                                             error_key: k,
39826                                             identifier: { // this is used to post changes to the error
39827                                                 wayId: feature.wayId,
39828                                                 fromNodeId: feature.fromNodeId,
39829                                                 toNodeId: feature.toNodeId
39830                                             },
39831                                             object_id: feature.wayId,
39832                                             object_type: 'way',
39833                                             status: feature.status
39834                                         });
39835
39836                                         // Variables used in the description
39837                                         d.replacements = {
39838                                             percentage: feature.percentOfTrips,
39839                                             num_trips: feature.numberOfTrips,
39840                                             highway: linkErrorObject(t('QA.keepRight.error_parts.highway')),
39841                                             from_node: linkEntity('n' + feature.fromNodeId),
39842                                             to_node: linkEntity('n' + feature.toNodeId)
39843                                         };
39844
39845                                         _erCache.data[d.id] = d;
39846                                         _erCache.rtree.insert(encodeErrorRtree$1(d));
39847                                     });
39848                                 }
39849
39850                                 // Tiles at high zoom == missing roads
39851                                 if (data.tiles) {
39852                                     data.tiles.forEach(function(feature) {
39853                                         var geoType = feature.type.toLowerCase();
39854
39855                                         // Average of recorded points should land on the missing geometry
39856                                         // Missing geometry could happen to land on another error
39857                                         var loc = pointAverage(feature.points);
39858                                         loc = preventCoincident(loc, false);
39859
39860                                         var d = new qaError({
39861                                             // Info required for every error
39862                                             loc: loc,
39863                                             service: 'improveOSM',
39864                                             error_type: k + '-' + geoType,
39865                                             // Extra details needed for this service
39866                                             error_key: k,
39867                                             identifier: { x: feature.x, y: feature.y },
39868                                             status: feature.status
39869                                         });
39870
39871                                         d.replacements = {
39872                                             num_trips: feature.numberOfTrips,
39873                                             geometry_type: t('QA.improveOSM.geometry_types.' + geoType)
39874                                         };
39875
39876                                         // -1 trips indicates data came from a 3rd party
39877                                         if (feature.numberOfTrips === -1) {
39878                                             d.desc = t('QA.improveOSM.error_types.mr.description_alt', d.replacements);
39879                                         }
39880
39881                                         _erCache.data[d.id] = d;
39882                                         _erCache.rtree.insert(encodeErrorRtree$1(d));
39883                                     });
39884                                 }
39885
39886                                 // Entities at high zoom == turn restrictions
39887                                 if (data.entities) {
39888                                     data.entities.forEach(function(feature) {
39889                                         // Turn restrictions could be missing at same junction
39890                                         // We also want to bump the error up so node is accessible
39891                                         var loc = feature.point;
39892                                         loc = preventCoincident([loc.lon, loc.lat], true);
39893
39894                                         // Elements are presented in a strange way
39895                                         var ids = feature.id.split(',');
39896                                         var from_way = ids[0];
39897                                         var via_node = ids[3];
39898                                         var to_way = ids[2].split(':')[1];
39899
39900                                         var d = new qaError({
39901                                             // Info required for every error
39902                                             loc: loc,
39903                                             service: 'improveOSM',
39904                                             error_type: k,
39905                                             // Extra details needed for this service
39906                                             error_key: k,
39907                                             identifier: feature.id,
39908                                             object_id: via_node,
39909                                             object_type: 'node',
39910                                             status: feature.status
39911                                         });
39912
39913                                         // Travel direction along from_way clarifies the turn restriction
39914                                         var p1 = feature.segments[0].points[0];
39915                                         var p2 = feature.segments[0].points[1];
39916
39917                                         var dir_of_travel = cardinalDirection(relativeBearing(p1, p2));
39918
39919                                         // Variables used in the description
39920                                         d.replacements = {
39921                                             num_passed: feature.numberOfPasses,
39922                                             num_trips: feature.segments[0].numberOfTrips,
39923                                             turn_restriction: feature.turnType.toLowerCase(),
39924                                             from_way: linkEntity('w' + from_way),
39925                                             to_way: linkEntity('w' + to_way),
39926                                             travel_direction: dir_of_travel,
39927                                             junction: linkErrorObject(t('QA.keepRight.error_parts.this_node'))
39928                                         };
39929
39930                                         _erCache.data[d.id] = d;
39931                                         _erCache.rtree.insert(encodeErrorRtree$1(d));
39932                                         dispatch$2.call('loaded');
39933                                     });
39934                                 }
39935                             })
39936                             .catch(function() {
39937                                 delete _erCache.inflightTile[tile.id][k];
39938                                 if (!Object.keys(_erCache.inflightTile[tile.id]).length) {
39939                                     delete _erCache.inflightTile[tile.id];
39940                                     _erCache.loadedTile[tile.id] = true;
39941                                 }
39942                             });
39943                     });
39944
39945                     _erCache.inflightTile[tile.id] = requests;
39946                 });
39947             },
39948
39949             getComments: function(d, callback) {
39950                 // If comments already retrieved no need to do so again
39951                 if (d.comments !== undefined) {
39952                     if (callback) callback({}, d);
39953                     return;
39954                 }
39955
39956                 var key = d.error_key;
39957                 var qParams = {};
39958
39959                 if (key === 'ow') {
39960                     qParams = d.identifier;
39961                 } else if (key === 'mr') {
39962                     qParams.tileX = d.identifier.x;
39963                     qParams.tileY = d.identifier.y;
39964                 } else if (key === 'tr') {
39965                     qParams.targetId = d.identifier;
39966                 }
39967
39968                 var url = _impOsmUrls[key] + '/retrieveComments?' + utilQsString(qParams);
39969
39970                 var that = this;
39971                 d3_json(url)
39972                     .then(function(data) {
39973                         // comments are served newest to oldest
39974                         var comments = data.comments ? data.comments.reverse() : [];
39975                         that.replaceError(d.update({ comments: comments }));
39976                         if (callback) callback(null, d);
39977                     })
39978                     .catch(function(err) {
39979                         if (callback) callback(err.message);
39980                     });
39981             },
39982
39983             postUpdate: function(d, callback) {
39984                 if (!serviceOsm.authenticated()) { // Username required in payload
39985                     return callback({ message: 'Not Authenticated', status: -3}, d);
39986                 }
39987                 if (_erCache.inflightPost[d.id]) {
39988                     return callback({ message: 'Error update already inflight', status: -2 }, d);
39989                 }
39990
39991                 var that = this;
39992
39993                 // Payload can only be sent once username is established
39994                 serviceOsm.userDetails(sendPayload);
39995
39996                 function sendPayload(err, user) {
39997                     if (err) { return callback(err, d); }
39998
39999                     var key = d.error_key;
40000                     var url = _impOsmUrls[key] + '/comment';
40001                     var payload = {
40002                         username: user.display_name
40003                     };
40004
40005                     // Each error type has different data for identification
40006                     if (key === 'ow') {
40007                         payload.roadSegments = [ d.identifier ];
40008                     } else if (key === 'mr') {
40009                         payload.tiles = [ d.identifier ];
40010                     } else if (key === 'tr') {
40011                         payload.targetIds = [ d.identifier ];
40012                     }
40013
40014                     if (d.newStatus !== undefined) {
40015                         payload.status = d.newStatus;
40016                         payload.text = 'status changed';
40017                     }
40018
40019                     // Comment take place of default text
40020                     if (d.newComment !== undefined) {
40021                         payload.text = d.newComment;
40022                     }
40023
40024                     var controller = new AbortController();
40025                     _erCache.inflightPost[d.id] = controller;
40026
40027                     var options = {
40028                         method: 'POST',
40029                         signal: controller.signal,
40030                         body: JSON.stringify(payload)
40031                     };
40032
40033                      d3_json(url, options)
40034                         .then(function() {
40035                             delete _erCache.inflightPost[d.id];
40036
40037                             // Just a comment, update error in cache
40038                             if (d.newStatus === undefined) {
40039                                 var now = new Date();
40040                                 var comments = d.comments ? d.comments : [];
40041
40042                                 comments.push({
40043                                     username: payload.username,
40044                                     text: payload.text,
40045                                     timestamp: now.getTime() / 1000
40046                                 });
40047
40048                                 that.replaceError(d.update({
40049                                     comments: comments,
40050                                     newComment: undefined
40051                                 }));
40052                             } else {
40053                                 that.removeError(d);
40054                                 if (d.newStatus === 'SOLVED') {
40055                                     // No pretty identifier, so we just use coordinates
40056                                     var closedID = d.loc[1].toFixed(5) + '/' + d.loc[0].toFixed(5);
40057                                     _erCache.closed[key + ':' + closedID] = true;
40058                                 }
40059                             }
40060                             if (callback) callback(null, d);
40061                         })
40062                         .catch(function(err) {
40063                             delete _erCache.inflightPost[d.id];
40064                             if (callback) callback(err.message);
40065                         });
40066                 }
40067             },
40068
40069
40070             // get all cached errors covering the viewport
40071             getErrors: function(projection) {
40072                 var viewport = projection.clipExtent();
40073                 var min = [viewport[0][0], viewport[1][1]];
40074                 var max = [viewport[1][0], viewport[0][1]];
40075                 var bbox = geoExtent(projection.invert(min), projection.invert(max)).bbox();
40076
40077                 return _erCache.rtree.search(bbox).map(function(d) {
40078                     return d.data;
40079                 });
40080             },
40081
40082             // get a single error from the cache
40083             getError: function(id) {
40084                 return _erCache.data[id];
40085             },
40086
40087             // replace a single error in the cache
40088             replaceError: function(error) {
40089                 if (!(error instanceof qaError) || !error.id) return;
40090
40091                 _erCache.data[error.id] = error;
40092                 updateRtree$1(encodeErrorRtree$1(error), true); // true = replace
40093                 return error;
40094             },
40095
40096             // remove a single error from the cache
40097             removeError: function(error) {
40098                 if (!(error instanceof qaError) || !error.id) return;
40099
40100                 delete _erCache.data[error.id];
40101                 updateRtree$1(encodeErrorRtree$1(error), false); // false = remove
40102             },
40103
40104             // Used to populate `closed:improveosm` changeset tag
40105             getClosedIDs: function() {
40106                 return Object.keys(_erCache.closed).sort();
40107             }
40108         };
40109
40110         /*
40111             A standalone SVG element that contains only a `defs` sub-element. To be
40112             used once globally, since defs IDs must be unique within a document.
40113         */
40114         function svgDefs(context) {
40115
40116             function drawDefs(selection) {
40117                 var defs = selection.append('defs');
40118
40119                 // add markers
40120                 defs
40121                     .append('marker')
40122                     .attr('id', 'oneway-marker')
40123                     .attr('viewBox', '0 0 10 5')
40124                     .attr('refX', 2.5)
40125                     .attr('refY', 2.5)
40126                     .attr('markerWidth', 2)
40127                     .attr('markerHeight', 2)
40128                     .attr('markerUnits', 'strokeWidth')
40129                     .attr('orient', 'auto')
40130                     .append('path')
40131                     .attr('class', 'oneway-marker-path')
40132                     .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')
40133                     .attr('stroke', 'none')
40134                     .attr('fill', '#000')
40135                     .attr('opacity', '0.75');
40136
40137                 // SVG markers have to be given a colour where they're defined
40138                 // (they can't inherit it from the line they're attached to),
40139                 // so we need to manually define markers for each color of tag
40140                 // (also, it's slightly nicer if we can control the
40141                 // positioning for different tags)
40142                 function addSidedMarker(name, color, offset) {
40143                     defs
40144                         .append('marker')
40145                         .attr('id', 'sided-marker-' + name)
40146                         .attr('viewBox', '0 0 2 2')
40147                         .attr('refX', 1)
40148                         .attr('refY', -offset)
40149                         .attr('markerWidth', 1.5)
40150                         .attr('markerHeight', 1.5)
40151                         .attr('markerUnits', 'strokeWidth')
40152                         .attr('orient', 'auto')
40153                         .append('path')
40154                         .attr('class', 'sided-marker-path sided-marker-' + name + '-path')
40155                         .attr('d', 'M 0,0 L 1,1 L 2,0 z')
40156                         .attr('stroke', 'none')
40157                         .attr('fill', color);
40158                 }
40159                 addSidedMarker('natural', 'rgb(140, 208, 95)', 0);
40160                 // for a coastline, the arrows are (somewhat unintuitively) on
40161                 // the water side, so let's color them blue (with a gap) to
40162                 // give a stronger indication
40163                 addSidedMarker('coastline', '#77dede', 1);
40164                 // barriers have a dashed line, and separating the triangle
40165                 // from the line visually suits that
40166                 addSidedMarker('barrier', '#ddd', 1);
40167                 addSidedMarker('man_made', '#fff', 0);
40168
40169                 defs
40170                     .append('marker')
40171                     .attr('id', 'viewfield-marker')
40172                     .attr('viewBox', '0 0 16 16')
40173                     .attr('refX', 8)
40174                     .attr('refY', 16)
40175                     .attr('markerWidth', 4)
40176                     .attr('markerHeight', 4)
40177                     .attr('markerUnits', 'strokeWidth')
40178                     .attr('orient', 'auto')
40179                     .append('path')
40180                     .attr('class', 'viewfield-marker-path')
40181                     .attr('d', 'M 6,14 C 8,13.4 8,13.4 10,14 L 16,3 C 12,0 4,0 0,3 z')
40182                     .attr('fill', '#333')
40183                     .attr('fill-opacity', '0.75')
40184                     .attr('stroke', '#fff')
40185                     .attr('stroke-width', '0.5px')
40186                     .attr('stroke-opacity', '0.75');
40187
40188                 defs
40189                     .append('marker')
40190                     .attr('id', 'viewfield-marker-wireframe')
40191                     .attr('viewBox', '0 0 16 16')
40192                     .attr('refX', 8)
40193                     .attr('refY', 16)
40194                     .attr('markerWidth', 4)
40195                     .attr('markerHeight', 4)
40196                     .attr('markerUnits', 'strokeWidth')
40197                     .attr('orient', 'auto')
40198                     .append('path')
40199                     .attr('class', 'viewfield-marker-path')
40200                     .attr('d', 'M 6,14 C 8,13.4 8,13.4 10,14 L 16,3 C 12,0 4,0 0,3 z')
40201                     .attr('fill', 'none')
40202                     .attr('stroke', '#fff')
40203                     .attr('stroke-width', '0.5px')
40204                     .attr('stroke-opacity', '0.75');
40205
40206                 // add patterns
40207                 var patterns = defs.selectAll('pattern')
40208                     .data([
40209                         // pattern name, pattern image name
40210                         ['beach', 'dots'],
40211                         ['construction', 'construction'],
40212                         ['cemetery', 'cemetery'],
40213                         ['cemetery_christian', 'cemetery_christian'],
40214                         ['cemetery_buddhist', 'cemetery_buddhist'],
40215                         ['cemetery_muslim', 'cemetery_muslim'],
40216                         ['cemetery_jewish', 'cemetery_jewish'],
40217                         ['farmland', 'farmland'],
40218                         ['farmyard', 'farmyard'],
40219                         ['forest', 'forest'],
40220                         ['forest_broadleaved', 'forest_broadleaved'],
40221                         ['forest_needleleaved', 'forest_needleleaved'],
40222                         ['forest_leafless', 'forest_leafless'],
40223                         ['grass', 'grass'],
40224                         ['landfill', 'landfill'],
40225                         ['meadow', 'grass'],
40226                         ['orchard', 'orchard'],
40227                         ['pond', 'pond'],
40228                         ['quarry', 'quarry'],
40229                         ['scrub', 'bushes'],
40230                         ['vineyard', 'vineyard'],
40231                         ['water_standing', 'lines'],
40232                         ['waves', 'waves'],
40233                         ['wetland', 'wetland'],
40234                         ['wetland_marsh', 'wetland_marsh'],
40235                         ['wetland_swamp', 'wetland_swamp'],
40236                         ['wetland_bog', 'wetland_bog'],
40237                         ['wetland_reedbed', 'wetland_reedbed']
40238                     ])
40239                     .enter()
40240                     .append('pattern')
40241                     .attr('id', function (d) { return 'pattern-' + d[0]; })
40242                     .attr('width', 32)
40243                     .attr('height', 32)
40244                     .attr('patternUnits', 'userSpaceOnUse');
40245
40246                 patterns
40247                     .append('rect')
40248                     .attr('x', 0)
40249                     .attr('y', 0)
40250                     .attr('width', 32)
40251                     .attr('height', 32)
40252                     .attr('class', function (d) { return 'pattern-color-' + d[0]; });
40253
40254                 patterns
40255                     .append('image')
40256                     .attr('x', 0)
40257                     .attr('y', 0)
40258                     .attr('width', 32)
40259                     .attr('height', 32)
40260                     .attr('xlink:href', function (d) {
40261                         return context.imagePath('pattern/' + d[1] + '.png');
40262                     });
40263
40264                 // add clip paths
40265                 defs.selectAll('clipPath')
40266                     .data([12, 18, 20, 32, 45])
40267                     .enter()
40268                     .append('clipPath')
40269                     .attr('id', function (d) { return 'clip-square-' + d; })
40270                     .append('rect')
40271                     .attr('x', 0)
40272                     .attr('y', 0)
40273                     .attr('width', function (d) { return d; })
40274                     .attr('height', function (d) { return d; });
40275
40276                 // add symbol spritesheets
40277                 defs
40278                     .call(drawDefs.addSprites, [
40279                         'iD-sprite', 'maki-sprite', 'temaki-sprite', 'fa-sprite', 'tnp-sprite', 'community-sprite'
40280                     ], true);
40281             }
40282
40283
40284             drawDefs.addSprites = function(selection, ids, overrideColors) {
40285                 var spritesheets = selection.selectAll('.spritesheet');
40286                 var currData = spritesheets.data();
40287                 var data = utilArrayUniq(currData.concat(ids));
40288
40289                 spritesheets
40290                     .data(data)
40291                     .enter()
40292                     .append('g')
40293                     .attr('class', function(d) { return 'spritesheet spritesheet-' + d; })
40294                     .each(function(d) {
40295                         var url = context.imagePath(d + '.svg');
40296                         var node = d3_select(this).node();
40297
40298                         svg(url)
40299                             .then(function(svg) {
40300                                 node.appendChild(
40301                                     d3_select(svg.documentElement).attr('id', d).node()
40302                                 );
40303                                 if (overrideColors && d !== 'iD-sprite') {   // allow icon colors to be overridden..
40304                                     d3_select(node).selectAll('path')
40305                                         .attr('fill', 'currentColor');
40306                                 }
40307                             })
40308                             .catch(function() {
40309                                 /* ignore */
40310                             });
40311                     });
40312             };
40313
40314
40315             return drawDefs;
40316         }
40317
40318         /* global Mapillary:false */
40319
40320
40321         var apibase = 'https://a.mapillary.com/v3/';
40322         var viewercss = 'mapillary-js/mapillary.min.css';
40323         var viewerjs = 'mapillary-js/mapillary.min.js';
40324         var clientId = 'NzNRM2otQkR2SHJzaXJmNmdQWVQ0dzo1ZWYyMmYwNjdmNDdlNmVi';
40325         var maxResults = 1000;
40326         var tileZoom = 14;
40327         var tiler$2 = utilTiler().zoomExtent([tileZoom, tileZoom]).skipNullIsland(true);
40328         var dispatch$3 = dispatch('loadedImages', 'loadedSigns', 'bearingChanged');
40329         var _mlyFallback = false;
40330         var _mlyCache;
40331         var _mlyClicks;
40332         var _mlySelectedImage;
40333         var _mlyViewer;
40334
40335
40336         function abortRequest$2(controller) {
40337             controller.abort();
40338         }
40339
40340
40341         function maxPageAtZoom(z) {
40342             if (z < 15)   return 2;
40343             if (z === 15) return 5;
40344             if (z === 16) return 10;
40345             if (z === 17) return 20;
40346             if (z === 18) return 40;
40347             if (z > 18)   return 80;
40348         }
40349
40350
40351         function loadTiles(which, url, projection) {
40352             var currZoom = Math.floor(geoScaleToZoom(projection.scale()));
40353             var tiles = tiler$2.getTiles(projection);
40354
40355             // abort inflight requests that are no longer needed
40356             var cache = _mlyCache[which];
40357             Object.keys(cache.inflight).forEach(function(k) {
40358                 var wanted = tiles.find(function(tile) { return k.indexOf(tile.id + ',') === 0; });
40359                 if (!wanted) {
40360                     abortRequest$2(cache.inflight[k]);
40361                     delete cache.inflight[k];
40362                 }
40363             });
40364
40365             tiles.forEach(function(tile) {
40366                 loadNextTilePage(which, currZoom, url, tile);
40367             });
40368         }
40369
40370
40371         function loadNextTilePage(which, currZoom, url, tile) {
40372             var cache = _mlyCache[which];
40373             var rect = tile.extent.rectangle();
40374             var maxPages = maxPageAtZoom(currZoom);
40375             var nextPage = cache.nextPage[tile.id] || 0;
40376             var nextURL = cache.nextURL[tile.id] || url +
40377                 utilQsString({
40378                     per_page: maxResults,
40379                     page: nextPage,
40380                     client_id: clientId,
40381                     bbox: [rect[0], rect[1], rect[2], rect[3]].join(','),
40382                 });
40383
40384             if (nextPage > maxPages) return;
40385
40386             var id = tile.id + ',' + String(nextPage);
40387             if (cache.loaded[id] || cache.inflight[id]) return;
40388
40389             var controller = new AbortController();
40390             cache.inflight[id] = controller;
40391
40392             var options = {
40393                 method: 'GET',
40394                 signal: controller.signal,
40395                 headers: { 'Content-Type': 'application/json' }
40396             };
40397
40398             fetch(nextURL, options)
40399                 .then(function(response) {
40400                     if (!response.ok) {
40401                         throw new Error(response.status + ' ' + response.statusText);
40402                     }
40403                     var linkHeader = response.headers.get('Link');
40404                     if (linkHeader) {
40405                         var pagination = parsePagination(linkHeader);
40406                         if (pagination.next) {
40407                             cache.nextURL[tile.id] = pagination.next;
40408                         }
40409                     }
40410                     return response.json();
40411                 })
40412                 .then(function(data) {
40413                     cache.loaded[id] = true;
40414                     delete cache.inflight[id];
40415                     if (!data || !data.features || !data.features.length) {
40416                         throw new Error('No Data');
40417                     }
40418
40419                     var features = data.features.map(function(feature) {
40420                         var loc = feature.geometry.coordinates;
40421                         var d;
40422
40423                         // An image (shown as a green dot on the map) is a single street photo with extra
40424                         // information such as location, camera angle (CA), camera model, and so on.
40425                         // Each image feature is a GeoJSON Point
40426                         if (which === 'images') {
40427                             d = {
40428                                 loc: loc,
40429                                 key: feature.properties.key,
40430                                 ca: feature.properties.ca,
40431                                 captured_at: feature.properties.captured_at,
40432                                 captured_by: feature.properties.username,
40433                                 pano: feature.properties.pano
40434                             };
40435
40436                             cache.forImageKey[d.key] = d;     // cache imageKey -> image
40437
40438                         // Mapillary organizes images as sequences. A sequence of images are continuously captured
40439                         // by a user at a give time. Sequences are shown on the map as green lines.
40440                         // Each sequence feature is a GeoJSON LineString
40441                         } else if (which === 'sequences') {
40442                             var sequenceKey = feature.properties.key;
40443                             cache.lineString[sequenceKey] = feature;           // cache sequenceKey -> lineString
40444                             feature.properties.coordinateProperties.image_keys.forEach(function(imageKey) {
40445                                 cache.forImageKey[imageKey] = sequenceKey;     // cache imageKey -> sequenceKey
40446                             });
40447                             return false;    // because no `d` data worth loading into an rbush
40448
40449                         // An image detection is a semantic pixel area on an image. The area could indicate
40450                         // sky, trees, sidewalk in the image. A detection can be a polygon, a bounding box, or a point.
40451                         // Each image_detection feature is a GeoJSON Point (located where the image was taken)
40452                         } else if (which === 'image_detections') {
40453                             d = {
40454                                 key: feature.properties.key,
40455                                 image_key: feature.properties.image_key,
40456                                 value: feature.properties.value,
40457                                 package: feature.properties.package,
40458                                 shape: feature.properties.shape
40459                             };
40460
40461                             // cache imageKey -> image_detections
40462                             if (!cache.forImageKey[d.image_key]) {
40463                                 cache.forImageKey[d.image_key] = [];
40464                             }
40465                             cache.forImageKey[d.image_key].push(d);
40466                             return false;    // because no `d` data worth loading into an rbush
40467
40468
40469                         // A map feature is a real world object that can be shown on a map. It could be any object
40470                         // recognized from images, manually added in images, or added on the map.
40471                         // Each map feature is a GeoJSON Point (located where the feature is)
40472                         } else if (which === 'map_features') {
40473                             d = {
40474                                 loc: loc,
40475                                 key: feature.properties.key,
40476                                 value: feature.properties.value,
40477                                 package: feature.properties.package,
40478                                 detections: feature.properties.detections
40479                             };
40480                         }
40481
40482                         return {
40483                             minX: loc[0], minY: loc[1], maxX: loc[0], maxY: loc[1], data: d
40484                         };
40485
40486                     }).filter(Boolean);
40487
40488                     if (cache.rtree && features) {
40489                         cache.rtree.load(features);
40490                     }
40491
40492                     if (data.features.length === maxResults) {  // more pages to load
40493                         cache.nextPage[tile.id] = nextPage + 1;
40494                         loadNextTilePage(which, currZoom, url, tile);
40495                     } else {
40496                         cache.nextPage[tile.id] = Infinity;     // no more pages to load
40497                     }
40498
40499                     if (which === 'images' || which === 'sequences') {
40500                         dispatch$3.call('loadedImages');
40501                     } else if (which === 'map_features') {
40502                         dispatch$3.call('loadedSigns');
40503                     }
40504                 })
40505                 .catch(function() {
40506                     cache.loaded[id] = true;
40507                     delete cache.inflight[id];
40508                 });
40509         }
40510
40511         // extract links to pages of API results
40512         function parsePagination(links) {
40513             return links.split(',').map(function(rel) {
40514                 var elements = rel.split(';');
40515                 if (elements.length === 2) {
40516                     return [
40517                         /<(.+)>/.exec(elements[0])[1],
40518                         /rel="(.+)"/.exec(elements[1])[1]
40519                     ];
40520                 } else {
40521                     return ['',''];
40522                 }
40523             }).reduce(function(pagination, val) {
40524                 pagination[val[1]] = val[0];
40525                 return pagination;
40526             }, {});
40527         }
40528
40529
40530         // partition viewport into higher zoom tiles
40531         function partitionViewport(projection) {
40532             var z = geoScaleToZoom(projection.scale());
40533             var z2 = (Math.ceil(z * 2) / 2) + 2.5;   // round to next 0.5 and add 2.5
40534             var tiler = utilTiler().zoomExtent([z2, z2]);
40535
40536             return tiler.getTiles(projection)
40537                 .map(function(tile) { return tile.extent; });
40538         }
40539
40540
40541         // no more than `limit` results per partition.
40542         function searchLimited(limit, projection, rtree) {
40543             limit = limit || 5;
40544
40545             return partitionViewport(projection)
40546                 .reduce(function(result, extent) {
40547                     var found = rtree.search(extent.bbox())
40548                         .slice(0, limit)
40549                         .map(function(d) { return d.data; });
40550
40551                     return (found.length ? result.concat(found) : result);
40552                 }, []);
40553         }
40554
40555
40556
40557         var serviceMapillary = {
40558
40559             init: function() {
40560                 if (!_mlyCache) {
40561                     this.reset();
40562                 }
40563
40564                 this.event = utilRebind(this, dispatch$3, 'on');
40565             },
40566
40567             reset: function() {
40568                 if (_mlyCache) {
40569                     Object.values(_mlyCache.images.inflight).forEach(abortRequest$2);
40570                     Object.values(_mlyCache.image_detections.inflight).forEach(abortRequest$2);
40571                     Object.values(_mlyCache.map_features.inflight).forEach(abortRequest$2);
40572                     Object.values(_mlyCache.sequences.inflight).forEach(abortRequest$2);
40573                 }
40574
40575                 _mlyCache = {
40576                     images: { inflight: {}, loaded: {}, nextPage: {}, nextURL: {}, rtree: rbush_1(), forImageKey: {} },
40577                     image_detections: { inflight: {}, loaded: {}, nextPage: {}, nextURL: {}, forImageKey: {} },
40578                     map_features: { inflight: {}, loaded: {}, nextPage: {}, nextURL: {}, rtree: rbush_1() },
40579                     sequences: { inflight: {}, loaded: {}, nextPage: {}, nextURL: {}, rtree: rbush_1(), forImageKey: {}, lineString: {} }
40580                 };
40581
40582                 _mlySelectedImage = null;
40583                 _mlyClicks = [];
40584             },
40585
40586
40587             images: function(projection) {
40588                 var limit = 5;
40589                 return searchLimited(limit, projection, _mlyCache.images.rtree);
40590             },
40591
40592
40593             signs: function(projection) {
40594                 var limit = 5;
40595                 return searchLimited(limit, projection, _mlyCache.map_features.rtree);
40596             },
40597
40598
40599             cachedImage: function(imageKey) {
40600                 return _mlyCache.images.forImageKey[imageKey];
40601             },
40602
40603
40604             sequences: function(projection) {
40605                 var viewport = projection.clipExtent();
40606                 var min = [viewport[0][0], viewport[1][1]];
40607                 var max = [viewport[1][0], viewport[0][1]];
40608                 var bbox = geoExtent(projection.invert(min), projection.invert(max)).bbox();
40609                 var sequenceKeys = {};
40610
40611                 // all sequences for images in viewport
40612                 _mlyCache.images.rtree.search(bbox)
40613                     .forEach(function(d) {
40614                         var sequenceKey = _mlyCache.sequences.forImageKey[d.data.key];
40615                         if (sequenceKey) {
40616                             sequenceKeys[sequenceKey] = true;
40617                         }
40618                     });
40619
40620                 // Return lineStrings for the sequences
40621                 return Object.keys(sequenceKeys).map(function(sequenceKey) {
40622                     return _mlyCache.sequences.lineString[sequenceKey];
40623                 });
40624             },
40625
40626
40627             signsSupported: function() {
40628                 return true;
40629             },
40630
40631
40632             loadImages: function(projection) {
40633                 loadTiles('images', apibase + 'images?', projection);
40634                 loadTiles('sequences', apibase + 'sequences?', projection);
40635             },
40636
40637
40638             loadSigns: function(projection) {
40639                 // if we are looking at signs, we'll actually need to fetch images too
40640                 loadTiles('images', apibase + 'images?', projection);
40641                 loadTiles('map_features', apibase + 'map_features?layers=trafficsigns&min_nbr_image_detections=1&', projection);
40642                 loadTiles('image_detections', apibase + 'image_detections?layers=trafficsigns&', projection);
40643             },
40644
40645
40646             loadViewer: function(context) {
40647                 // add mly-wrapper
40648                 var wrap = d3_select('#photoviewer').selectAll('.mly-wrapper')
40649                     .data([0]);
40650
40651                 wrap.enter()
40652                     .append('div')
40653                     .attr('id', 'mly')
40654                     .attr('class', 'photo-wrapper mly-wrapper')
40655                     .classed('hide', true);
40656
40657                 // load mapillary-viewercss
40658                 d3_select('head').selectAll('#mapillary-viewercss')
40659                     .data([0])
40660                     .enter()
40661                     .append('link')
40662                     .attr('id', 'mapillary-viewercss')
40663                     .attr('rel', 'stylesheet')
40664                     .attr('href', context.asset(viewercss));
40665
40666                 // load mapillary-viewerjs
40667                 d3_select('head').selectAll('#mapillary-viewerjs')
40668                     .data([0])
40669                     .enter()
40670                     .append('script')
40671                     .attr('id', 'mapillary-viewerjs')
40672                     .attr('src', context.asset(viewerjs));
40673
40674                 // load mapillary signs sprite
40675                 var defs = context.container().select('defs');
40676                 defs.call(svgDefs(context).addSprites, ['mapillary-sprite'], false /* don't override colors */ );
40677
40678                 // Register viewer resize handler
40679                 context.ui().photoviewer.on('resize', function() {
40680                     if (_mlyViewer) {
40681                         _mlyViewer.resize();
40682                     }
40683                 });
40684             },
40685
40686
40687             showViewer: function() {
40688                 var wrap = d3_select('#photoviewer')
40689                     .classed('hide', false);
40690
40691                 var isHidden = wrap.selectAll('.photo-wrapper.mly-wrapper.hide').size();
40692
40693                 if (isHidden && _mlyViewer) {
40694                     wrap
40695                         .selectAll('.photo-wrapper:not(.mly-wrapper)')
40696                         .classed('hide', true);
40697
40698                     wrap
40699                         .selectAll('.photo-wrapper.mly-wrapper')
40700                         .classed('hide', false);
40701
40702                     _mlyViewer.resize();
40703                 }
40704
40705                 return this;
40706             },
40707
40708
40709             hideViewer: function() {
40710                 _mlySelectedImage = null;
40711
40712                 if (!_mlyFallback && _mlyViewer) {
40713                     _mlyViewer.getComponent('sequence').stop();
40714                 }
40715
40716                 var viewer = d3_select('#photoviewer');
40717                 if (!viewer.empty()) viewer.datum(null);
40718
40719                 viewer
40720                     .classed('hide', true)
40721                     .selectAll('.photo-wrapper')
40722                     .classed('hide', true);
40723
40724                 d3_selectAll('.viewfield-group, .sequence, .icon-sign')
40725                     .classed('currentView', false);
40726
40727                 return this.setStyles(null, true);
40728             },
40729
40730
40731             parsePagination: parsePagination,
40732
40733
40734             updateViewer: function(imageKey, context) {
40735                 if (!imageKey) return this;
40736
40737                 if (!_mlyViewer) {
40738                     this.initViewer(imageKey, context);
40739                 } else {
40740                     _mlyViewer.moveToKey(imageKey)
40741                         .catch(function(e) { console.error('mly3', e); });  // eslint-disable-line no-console
40742                 }
40743
40744                 return this;
40745             },
40746
40747
40748             initViewer: function(imageKey, context) {
40749                 var that = this;
40750                 if (window.Mapillary && imageKey) {
40751                     var opts = {
40752                         baseImageSize: 320,
40753                         component: {
40754                             cover: false,
40755                             keyboard: false,
40756                             tag: true
40757                         }
40758                     };
40759
40760                     // Disable components requiring WebGL support
40761                     if (!Mapillary.isSupported() && Mapillary.isFallbackSupported()) {
40762                         _mlyFallback = true;
40763                         opts.component = {
40764                             cover: false,
40765                             direction: false,
40766                             imagePlane: false,
40767                             keyboard: false,
40768                             mouse: false,
40769                             sequence: false,
40770                             tag: false,
40771                             image: true,        // fallback
40772                             navigation: true    // fallback
40773                         };
40774                     }
40775
40776                     _mlyViewer = new Mapillary.Viewer('mly', clientId, null, opts);
40777                     _mlyViewer.on('nodechanged', nodeChanged);
40778                     _mlyViewer.on('bearingchanged', bearingChanged);
40779                     _mlyViewer.moveToKey(imageKey)
40780                         .catch(function(e) { console.error('mly3', e); });  // eslint-disable-line no-console
40781                 }
40782
40783                 // nodeChanged: called after the viewer has changed images and is ready.
40784                 //
40785                 // There is some logic here to batch up clicks into a _mlyClicks array
40786                 // because the user might click on a lot of markers quickly and nodechanged
40787                 // may be called out of order asychronously.
40788                 //
40789                 // Clicks are added to the array in `selectedImage` and removed here.
40790                 //
40791                 function nodeChanged(node) {
40792                     if (!_mlyFallback) {
40793                         _mlyViewer.getComponent('tag').removeAll();  // remove previous detections
40794                     }
40795
40796                     var clicks = _mlyClicks;
40797                     var index = clicks.indexOf(node.key);
40798                     var selectedKey = _mlySelectedImage && _mlySelectedImage.key;
40799
40800                     if (index > -1) {              // `nodechanged` initiated from clicking on a marker..
40801                         clicks.splice(index, 1);   // remove the click
40802                         // If `node.key` matches the current _mlySelectedImage, call `selectImage()`
40803                         // one more time to update the detections and attribution..
40804                         if (node.key === selectedKey) {
40805                             that.selectImage(_mlySelectedImage, node.key, true);
40806                         }
40807                     } else {             // `nodechanged` initiated from the Mapillary viewer controls..
40808                         var loc = node.computedLatLon ? [node.computedLatLon.lon, node.computedLatLon.lat] : [node.latLon.lon, node.latLon.lat];
40809                         context.map().centerEase(loc);
40810                         that.selectImage(undefined, node.key, true);
40811                     }
40812                 }
40813
40814                 function bearingChanged(e) {
40815                     dispatch$3.call('bearingChanged', undefined, e);
40816                 }
40817             },
40818
40819
40820             // Pass the image datum itself in `d` or the `imageKey` string.
40821             // This allows images to be selected from places that dont have access
40822             // to the full image datum (like the street signs layer or the js viewer)
40823             selectImage: function(d, imageKey, fromViewer) {
40824                 if (!d && imageKey) {
40825                     // If the user clicked on something that's not an image marker, we
40826                     // might get in here.. Cache lookup can fail, e.g. if the user
40827                     // clicked a streetsign, but images are loading slowly asynchronously.
40828                     // We'll try to carry on anyway if there is no datum.  There just
40829                     // might be a delay before user sees detections, captured_at, etc.
40830                     d = _mlyCache.images.forImageKey[imageKey];
40831                 }
40832
40833                 _mlySelectedImage = d;
40834                 var viewer = d3_select('#photoviewer');
40835                 if (!viewer.empty()) viewer.datum(d);
40836
40837                 imageKey = (d && d.key) || imageKey;
40838                 if (!fromViewer && imageKey) {
40839                     _mlyClicks.push(imageKey);
40840                 }
40841
40842                 this.setStyles(null, true);
40843
40844                 // if signs signs are shown, highlight the ones that appear in this image
40845                 d3_selectAll('.layer-mapillary-signs .icon-sign')
40846                     .classed('currentView', function(d) {
40847                         return d.detections.some(function(detection) {
40848                             return detection.image_key === imageKey;
40849                         });
40850                     });
40851
40852                 if (d) {
40853                     this.updateDetections(d);
40854                 }
40855
40856                 return this;
40857             },
40858
40859
40860             getSelectedImage: function() {
40861                 return _mlySelectedImage;
40862             },
40863
40864
40865             getSequenceKeyForImage: function(d) {
40866                 var imageKey = d && d.key;
40867                 return imageKey && _mlyCache.sequences.forImageKey[imageKey];
40868             },
40869
40870
40871             // Updates the currently highlighted sequence and selected bubble.
40872             // Reset is only necessary when interacting with the viewport because
40873             // this implicitly changes the currently selected bubble/sequence
40874             setStyles: function(hovered, reset) {
40875                 if (reset) {  // reset all layers
40876                     d3_selectAll('.viewfield-group')
40877                         .classed('highlighted', false)
40878                         .classed('hovered', false)
40879                         .classed('currentView', false);
40880
40881                     d3_selectAll('.sequence')
40882                         .classed('highlighted', false)
40883                         .classed('currentView', false);
40884                 }
40885
40886                 var hoveredImageKey = hovered && hovered.key;
40887                 var hoveredSequenceKey = this.getSequenceKeyForImage(hovered);
40888                 var hoveredLineString = hoveredSequenceKey && _mlyCache.sequences.lineString[hoveredSequenceKey];
40889                 var hoveredImageKeys = (hoveredLineString && hoveredLineString.properties.coordinateProperties.image_keys) || [];
40890
40891                 var viewer = d3_select('#photoviewer');
40892                 var selected = viewer.empty() ? undefined : viewer.datum();
40893                 var selectedImageKey = selected && selected.key;
40894                 var selectedSequenceKey = this.getSequenceKeyForImage(selected);
40895                 var selectedLineString = selectedSequenceKey && _mlyCache.sequences.lineString[selectedSequenceKey];
40896                 var selectedImageKeys = (selectedLineString && selectedLineString.properties.coordinateProperties.image_keys) || [];
40897
40898                 // highlight sibling viewfields on either the selected or the hovered sequences
40899                 var highlightedImageKeys = utilArrayUnion(hoveredImageKeys, selectedImageKeys);
40900
40901                 d3_selectAll('.layer-mapillary .viewfield-group')
40902                     .classed('highlighted', function(d) { return highlightedImageKeys.indexOf(d.key) !== -1; })
40903                     .classed('hovered', function(d) { return d.key === hoveredImageKey; })
40904                     .classed('currentView', function(d) { return d.key === selectedImageKey; });
40905
40906                 d3_selectAll('.layer-mapillary .sequence')
40907                     .classed('highlighted', function(d) { return d.properties.key === hoveredSequenceKey; })
40908                     .classed('currentView', function(d) { return d.properties.key === selectedSequenceKey; });
40909
40910                 // update viewfields if needed
40911                 d3_selectAll('.viewfield-group .viewfield')
40912                     .attr('d', viewfieldPath);
40913
40914                 function viewfieldPath() {
40915                     var d = this.parentNode.__data__;
40916                     if (d.pano && d.key !== selectedImageKey) {
40917                         return 'M 8,13 m -10,0 a 10,10 0 1,0 20,0 a 10,10 0 1,0 -20,0';
40918                     } else {
40919                         return 'M 6,9 C 8,8.4 8,8.4 10,9 L 16,-2 C 12,-5 4,-5 0,-2 z';
40920                     }
40921                 }
40922
40923                 return this;
40924             },
40925
40926
40927             updateDetections: function(d) {
40928                 if (!_mlyViewer || _mlyFallback) return;
40929
40930                 var imageKey = d && d.key;
40931                 if (!imageKey) return;
40932
40933                 var detections = _mlyCache.image_detections.forImageKey[imageKey] || [];
40934                 detections.forEach(function(data) {
40935                     var tag = makeTag(data);
40936                     if (tag) {
40937                         var tagComponent = _mlyViewer.getComponent('tag');
40938                         tagComponent.add([tag]);
40939                     }
40940                 });
40941
40942                 function makeTag(data) {
40943                     var valueParts = data.value.split('--');
40944                     if (valueParts.length !== 3) return;
40945
40946                     var text = valueParts[1].replace(/-/g, ' ');
40947                     var tag;
40948
40949                     // Currently only two shapes <Polygon|Point>
40950                     if (data.shape.type === 'Polygon') {
40951                         var polygonGeometry = new Mapillary
40952                             .TagComponent
40953                             .PolygonGeometry(data.shape.coordinates[0]);
40954
40955                         tag = new Mapillary.TagComponent.OutlineTag(
40956                             data.key,
40957                             polygonGeometry,
40958                             {
40959                                 text: text,
40960                                 textColor: 0xffff00,
40961                                 lineColor: 0xffff00,
40962                                 lineWidth: 2,
40963                                 fillColor: 0xffff00,
40964                                 fillOpacity: 0.3,
40965                             }
40966                         );
40967
40968                     } else if (data.shape.type === 'Point') {
40969                         var pointGeometry = new Mapillary
40970                             .TagComponent
40971                             .PointGeometry(data.shape.coordinates[0]);
40972
40973                         tag = new Mapillary.TagComponent.SpotTag(
40974                             data.key,
40975                             pointGeometry,
40976                             {
40977                                 text: text,
40978                                 color: 0xffff00,
40979                                 textColor: 0xffff00
40980                             }
40981                         );
40982                     }
40983
40984                     return tag;
40985                 }
40986             },
40987
40988
40989             cache: function() {
40990                 return _mlyCache;
40991             }
40992
40993         };
40994
40995         function validationIssue(attrs) {
40996             this.type = attrs.type;                // required - name of rule that created the issue (e.g. 'missing_tag')
40997             this.subtype = attrs.subtype;          // optional - category of the issue within the type (e.g. 'relation_type' under 'missing_tag')
40998             this.severity = attrs.severity;        // required - 'warning' or 'error'
40999             this.message = attrs.message;          // required - function returning localized string
41000             this.reference = attrs.reference;      // optional - function(selection) to render reference information
41001             this.entityIds = attrs.entityIds;      // optional - array of IDs of entities involved in the issue
41002             this.loc = attrs.loc;                  // optional - [lon, lat] to zoom in on to see the issue
41003             this.data = attrs.data;                // optional - object containing extra data for the fixes
41004             this.fixes = attrs.fixes || [];              // optional - array of validationIssueFix objects
41005             this.hash = attrs.hash;                // optional - string to further differentiate the issue
41006
41007             this.id = generateID.apply(this);      // generated - see below
41008             this.autoFix = null;                   // generated - if autofix exists, will be set below
41009
41010             // A unique, deterministic string hash.
41011             // Issues with identical id values are considered identical.
41012             function generateID() {
41013                 var parts = [this.type];
41014
41015                 if (this.hash) {   // subclasses can pass in their own differentiator
41016                     parts.push(this.hash);
41017                 }
41018
41019                 if (this.subtype) {
41020                     parts.push(this.subtype);
41021                 }
41022
41023                 // include the entities this issue is for
41024                 // (sort them so the id is deterministic)
41025                 if (this.entityIds) {
41026                     var entityKeys = this.entityIds.slice().sort();
41027                     parts.push.apply(parts, entityKeys);
41028                 }
41029
41030                 return parts.join(':');
41031             }
41032
41033             this.extent = function(resolver) {
41034                 if (this.loc) {
41035                     return geoExtent(this.loc);
41036                 }
41037                 if (this.entityIds && this.entityIds.length) {
41038                     return this.entityIds.reduce(function(extent, entityId) {
41039                         return extent.extend(resolver.entity(entityId).extent(resolver));
41040                     }, geoExtent());
41041                 }
41042                 return null;
41043             };
41044
41045
41046             if (this.fixes) {   // add a reference in the fixes to the issue for use in fix actions
41047                 for (var i = 0; i < this.fixes.length; i++) {
41048                     var fix = this.fixes[i];
41049                     fix.issue = this;
41050                     if (fix.autoArgs) {
41051                         this.autoFix = fix;
41052                     }
41053                 }
41054             }
41055         }
41056
41057
41058         function validationIssueFix(attrs) {
41059             this.title = attrs.title;                 // Required
41060             this.onClick = attrs.onClick;             // Required
41061             this.icon = attrs.icon;                   // Optional - shows 'iD-icon-wrench' if not set
41062             this.entityIds = attrs.entityIds || [];   // Optional - Used for hover-higlighting.
41063             this.autoArgs = attrs.autoArgs;           // Optional - pass [actions, annotation] arglist if this fix can automatically run
41064
41065             this.issue = null;    // Generated link - added by ValidationIssue constructor
41066         }
41067
41068         var buildRuleChecks = function() {
41069             return {
41070                 equals: function (equals) {
41071                     return function(tags) {
41072                         return Object.keys(equals).every(function(k) {
41073                             return equals[k] === tags[k];
41074                         });
41075                     };
41076                 },
41077                 notEquals: function (notEquals) {
41078                     return function(tags) {
41079                         return Object.keys(notEquals).some(function(k) {
41080                             return notEquals[k] !== tags[k];
41081                         });
41082                     };
41083                 },
41084                 absence: function(absence) {
41085                     return function(tags) {
41086                         return Object.keys(tags).indexOf(absence) === -1;
41087                     };
41088                 },
41089                 presence: function(presence) {
41090                     return function(tags) {
41091                         return Object.keys(tags).indexOf(presence) > -1;
41092                     };
41093                 },
41094                 greaterThan: function(greaterThan) {
41095                     var key = Object.keys(greaterThan)[0];
41096                     var value = greaterThan[key];
41097
41098                     return function(tags) {
41099                         return tags[key] > value;
41100                     };
41101                 },
41102                 greaterThanEqual: function(greaterThanEqual) {
41103                     var key = Object.keys(greaterThanEqual)[0];
41104                     var value = greaterThanEqual[key];
41105
41106                     return function(tags) {
41107                         return tags[key] >= value;
41108                     };
41109                 },
41110                 lessThan: function(lessThan) {
41111                     var key = Object.keys(lessThan)[0];
41112                     var value = lessThan[key];
41113
41114                     return function(tags) {
41115                         return tags[key] < value;
41116                     };
41117                 },
41118                 lessThanEqual: function(lessThanEqual) {
41119                     var key = Object.keys(lessThanEqual)[0];
41120                     var value = lessThanEqual[key];
41121
41122                     return function(tags) {
41123                         return tags[key] <= value;
41124                     };
41125                 },
41126                 positiveRegex: function(positiveRegex) {
41127                     var tagKey = Object.keys(positiveRegex)[0];
41128                     var expression = positiveRegex[tagKey].join('|');
41129                     var regex = new RegExp(expression);
41130
41131                     return function(tags) {
41132                         return regex.test(tags[tagKey]);
41133                     };
41134                 },
41135                 negativeRegex: function(negativeRegex) {
41136                     var tagKey = Object.keys(negativeRegex)[0];
41137                     var expression = negativeRegex[tagKey].join('|');
41138                     var regex = new RegExp(expression);
41139
41140                     return function(tags) {
41141                         return !regex.test(tags[tagKey]);
41142                     };
41143                 }
41144             };
41145         };
41146
41147         var buildLineKeys = function() {
41148             return {
41149                 highway: {
41150                     rest_area: true,
41151                     services: true
41152                 },
41153                 railway: {
41154                     roundhouse: true,
41155                     station: true,
41156                     traverser: true,
41157                     turntable: true,
41158                     wash: true
41159                 }
41160             };
41161         };
41162
41163         var serviceMapRules = {
41164             init: function() {
41165                 this._ruleChecks  = buildRuleChecks();
41166                 this._validationRules = [];
41167                 this._areaKeys = osmAreaKeys;
41168                 this._lineKeys = buildLineKeys();
41169             },
41170
41171             // list of rules only relevant to tag checks...
41172             filterRuleChecks: function(selector) {
41173                 var _ruleChecks = this._ruleChecks;
41174                 return Object.keys(selector).reduce(function(rules, key) {
41175                     if (['geometry', 'error', 'warning'].indexOf(key) === -1) {
41176                         rules.push(_ruleChecks[key](selector[key]));
41177                     }
41178                     return rules;
41179                 }, []);
41180             },
41181
41182             // builds tagMap from mapcss-parse selector object...
41183             buildTagMap: function(selector) {
41184                 var getRegexValues = function(regexes) {
41185                     return regexes.map(function(regex) {
41186                         return regex.replace(/\$|\^/g, '');
41187                     });
41188                 };
41189
41190                 var tagMap = Object.keys(selector).reduce(function (expectedTags, key) {
41191                     var values;
41192                     var isRegex = /regex/gi.test(key);
41193                     var isEqual = /equals/gi.test(key);
41194
41195                     if (isRegex || isEqual) {
41196                         Object.keys(selector[key]).forEach(function(selectorKey) {
41197                             values = isEqual ? [selector[key][selectorKey]] : getRegexValues(selector[key][selectorKey]);
41198
41199                             if (expectedTags.hasOwnProperty(selectorKey)) {
41200                                 values = values.concat(expectedTags[selectorKey]);
41201                             }
41202
41203                             expectedTags[selectorKey] = values;
41204                         });
41205
41206                     } else if (/(greater|less)Than(Equal)?|presence/g.test(key)) {
41207                         var tagKey = /presence/.test(key) ? selector[key] : Object.keys(selector[key])[0];
41208
41209                         values = [selector[key][tagKey]];
41210
41211                         if (expectedTags.hasOwnProperty(tagKey)) {
41212                             values = values.concat(expectedTags[tagKey]);
41213                         }
41214
41215                         expectedTags[tagKey] = values;
41216                     }
41217
41218                     return expectedTags;
41219                 }, {});
41220
41221                 return tagMap;
41222             },
41223
41224             // inspired by osmWay#isArea()
41225             inferGeometry: function(tagMap) {
41226                 var _lineKeys = this._lineKeys;
41227                 var _areaKeys = this._areaKeys;
41228
41229                 var isAreaKeyBlackList = function(key) {
41230                     return utilArrayIntersection(tagMap[key], Object.keys(_areaKeys[key])).length > 0;
41231                 };
41232                 var isLineKeysWhiteList = function(key) {
41233                     return utilArrayIntersection(tagMap[key], Object.keys(_lineKeys[key])).length > 0;
41234                 };
41235
41236                 if (tagMap.hasOwnProperty('area')) {
41237                     if (tagMap.area.indexOf('yes') > -1) {
41238                         return 'area';
41239                     }
41240                     if (tagMap.area.indexOf('no') > -1) {
41241                         return 'line';
41242                     }
41243                 }
41244
41245                 for (var key in tagMap) {
41246                     if (key in _areaKeys && !isAreaKeyBlackList(key)) {
41247                         return 'area';
41248                     }
41249                     if (key in _lineKeys && isLineKeysWhiteList(key)) {
41250                         return 'area';
41251                     }
41252                 }
41253
41254                 return 'line';
41255             },
41256
41257             // adds from mapcss-parse selector check...
41258             addRule: function(selector) {
41259                 var rule = {
41260                     // checks relevant to mapcss-selector
41261                     checks: this.filterRuleChecks(selector),
41262                     // true if all conditions for a tag error are true..
41263                     matches: function(entity) {
41264                         return this.checks.every(function(check) {
41265                             return check(entity.tags);
41266                         });
41267                     },
41268                     // borrowed from Way#isArea()
41269                     inferredGeometry: this.inferGeometry(this.buildTagMap(selector), this._areaKeys),
41270                     geometryMatches: function(entity, graph) {
41271                         if (entity.type === 'node' || entity.type === 'relation') {
41272                             return selector.geometry === entity.type;
41273                         } else if (entity.type === 'way') {
41274                             return this.inferredGeometry === entity.geometry(graph);
41275                         }
41276                     },
41277                     // when geometries match and tag matches are present, return a warning...
41278                     findIssues: function (entity, graph, issues) {
41279                         if (this.geometryMatches(entity, graph) && this.matches(entity)) {
41280                             var severity = Object.keys(selector).indexOf('error') > -1
41281                                     ? 'error'
41282                                     : 'warning';
41283                             var message = selector[severity];
41284                             issues.push(new validationIssue({
41285                                 type: 'maprules',
41286                                 severity: severity,
41287                                 message: function() {
41288                                     return message;
41289                                 },
41290                                 entityIds: [entity.id]
41291                             }));
41292                         }
41293                     }
41294                 };
41295                 this._validationRules.push(rule);
41296             },
41297
41298             clearRules: function() { this._validationRules = []; },
41299
41300             // returns validationRules...
41301             validationRules: function() { return this._validationRules; },
41302
41303             // returns ruleChecks
41304             ruleChecks: function() { return this._ruleChecks; }
41305         };
41306
41307         var apibase$1 = 'https://nominatim.openstreetmap.org/';
41308         var _inflight = {};
41309         var _nominatimCache;
41310
41311
41312         var serviceNominatim = {
41313
41314             init: function() {
41315                 _inflight = {};
41316                 _nominatimCache = rbush_1();
41317             },
41318
41319             reset: function() {
41320                 Object.values(_inflight).forEach(function(controller) { controller.abort(); });
41321                 _inflight = {};
41322                 _nominatimCache = rbush_1();
41323             },
41324
41325
41326             countryCode: function (location, callback) {
41327                 this.reverse(location, function(err, result) {
41328                     if (err) {
41329                         return callback(err);
41330                     } else if (result.address) {
41331                         return callback(null, result.address.country_code);
41332                     } else {
41333                         return callback('Unable to geocode', null);
41334                     }
41335                 });
41336             },
41337
41338
41339             reverse: function (loc, callback) {
41340                 var cached = _nominatimCache.search(
41341                     { minX: loc[0], minY: loc[1], maxX: loc[0], maxY: loc[1] }
41342                 );
41343
41344                 if (cached.length > 0) {
41345                     if (callback) callback(null, cached[0].data);
41346                     return;
41347                 }
41348
41349                 var params = { zoom: 13, format: 'json', addressdetails: 1, lat: loc[1], lon: loc[0] };
41350                 var url = apibase$1 + 'reverse?' + utilQsString(params);
41351
41352                 if (_inflight[url]) return;
41353                 var controller = new AbortController();
41354                 _inflight[url] = controller;
41355
41356                 d3_json(url, { signal: controller.signal })
41357                     .then(function(result) {
41358                         delete _inflight[url];
41359                         if (result && result.error) {
41360                             throw new Error(result.error);
41361                         }
41362                         var extent = geoExtent(loc).padByMeters(200);
41363                         _nominatimCache.insert(Object.assign(extent.bbox(), {data: result}));
41364                         if (callback) callback(null, result);
41365                     })
41366                     .catch(function(err) {
41367                         delete _inflight[url];
41368                         if (err.name === 'AbortError') return;
41369                         if (callback) callback(err.message);
41370                     });
41371             },
41372
41373
41374             search: function (val, callback) {
41375                 var searchVal = encodeURIComponent(val);
41376                 var url = apibase$1 + 'search/' + searchVal + '?limit=10&format=json';
41377
41378                 if (_inflight[url]) return;
41379                 var controller = new AbortController();
41380                 _inflight[url] = controller;
41381
41382                 d3_json(url, { signal: controller.signal })
41383                     .then(function(result) {
41384                         delete _inflight[url];
41385                         if (result && result.error) {
41386                             throw new Error(result.error);
41387                         }
41388                         if (callback) callback(null, result);
41389                     })
41390                     .catch(function(err) {
41391                         delete _inflight[url];
41392                         if (err.name === 'AbortError') return;
41393                         if (callback) callback(err.message);
41394                     });
41395             }
41396
41397         };
41398
41399         var apibase$2 = 'https://openstreetcam.org';
41400         var maxResults$1 = 1000;
41401         var tileZoom$1 = 14;
41402         var tiler$3 = utilTiler().zoomExtent([tileZoom$1, tileZoom$1]).skipNullIsland(true);
41403         var dispatch$4 = dispatch('loadedImages');
41404         var imgZoom = d3_zoom()
41405             .extent([[0, 0], [320, 240]])
41406             .translateExtent([[0, 0], [320, 240]])
41407             .scaleExtent([1, 15])
41408             .on('zoom', zoomPan);
41409         var _oscCache;
41410         var _oscSelectedImage;
41411
41412
41413         function abortRequest$3(controller) {
41414             controller.abort();
41415         }
41416
41417
41418         function maxPageAtZoom$1(z) {
41419             if (z < 15)   return 2;
41420             if (z === 15) return 5;
41421             if (z === 16) return 10;
41422             if (z === 17) return 20;
41423             if (z === 18) return 40;
41424             if (z > 18)   return 80;
41425         }
41426
41427
41428         function loadTiles$1(which, url, projection) {
41429             var currZoom = Math.floor(geoScaleToZoom(projection.scale()));
41430             var tiles = tiler$3.getTiles(projection);
41431
41432             // abort inflight requests that are no longer needed
41433             var cache = _oscCache[which];
41434             Object.keys(cache.inflight).forEach(function(k) {
41435                 var wanted = tiles.find(function(tile) { return k.indexOf(tile.id + ',') === 0; });
41436                 if (!wanted) {
41437                     abortRequest$3(cache.inflight[k]);
41438                     delete cache.inflight[k];
41439                 }
41440             });
41441
41442             tiles.forEach(function(tile) {
41443                 loadNextTilePage$1(which, currZoom, url, tile);
41444             });
41445         }
41446
41447
41448         function loadNextTilePage$1(which, currZoom, url, tile) {
41449             var cache = _oscCache[which];
41450             var bbox = tile.extent.bbox();
41451             var maxPages = maxPageAtZoom$1(currZoom);
41452             var nextPage = cache.nextPage[tile.id] || 1;
41453             var params = utilQsString({
41454                 ipp: maxResults$1,
41455                 page: nextPage,
41456                 // client_id: clientId,
41457                 bbTopLeft: [bbox.maxY, bbox.minX].join(','),
41458                 bbBottomRight: [bbox.minY, bbox.maxX].join(',')
41459             }, true);
41460
41461             if (nextPage > maxPages) return;
41462
41463             var id = tile.id + ',' + String(nextPage);
41464             if (cache.loaded[id] || cache.inflight[id]) return;
41465
41466             var controller = new AbortController();
41467             cache.inflight[id] = controller;
41468
41469             var options = {
41470                 method: 'POST',
41471                 signal: controller.signal,
41472                 body: params,
41473                 headers: { 'Content-Type': 'application/x-www-form-urlencoded' }
41474             };
41475
41476             d3_json(url, options)
41477                 .then(function(data) {
41478                     cache.loaded[id] = true;
41479                     delete cache.inflight[id];
41480                     if (!data || !data.currentPageItems || !data.currentPageItems.length) {
41481                         throw new Error('No Data');
41482                     }
41483
41484                     var features = data.currentPageItems.map(function(item) {
41485                         var loc = [+item.lng, +item.lat];
41486                         var d;
41487
41488                         if (which === 'images') {
41489                             d = {
41490                                 loc: loc,
41491                                 key: item.id,
41492                                 ca: +item.heading,
41493                                 captured_at: (item.shot_date || item.date_added),
41494                                 captured_by: item.username,
41495                                 imagePath: item.lth_name,
41496                                 sequence_id: item.sequence_id,
41497                                 sequence_index: +item.sequence_index
41498                             };
41499
41500                             // cache sequence info
41501                             var seq = _oscCache.sequences[d.sequence_id];
41502                             if (!seq) {
41503                                 seq = { rotation: 0, images: [] };
41504                                 _oscCache.sequences[d.sequence_id] = seq;
41505                             }
41506                             seq.images[d.sequence_index] = d;
41507                         }
41508
41509                         return {
41510                             minX: loc[0], minY: loc[1], maxX: loc[0], maxY: loc[1], data: d
41511                         };
41512                     });
41513
41514                     cache.rtree.load(features);
41515
41516                     if (data.currentPageItems.length === maxResults$1) {  // more pages to load
41517                         cache.nextPage[tile.id] = nextPage + 1;
41518                         loadNextTilePage$1(which, currZoom, url, tile);
41519                     } else {
41520                         cache.nextPage[tile.id] = Infinity;     // no more pages to load
41521                     }
41522
41523                     if (which === 'images') {
41524                         dispatch$4.call('loadedImages');
41525                     }
41526                 })
41527                 .catch(function() {
41528                     cache.loaded[id] = true;
41529                     delete cache.inflight[id];
41530                 });
41531         }
41532
41533
41534         // partition viewport into higher zoom tiles
41535         function partitionViewport$1(projection) {
41536             var z = geoScaleToZoom(projection.scale());
41537             var z2 = (Math.ceil(z * 2) / 2) + 2.5;   // round to next 0.5 and add 2.5
41538             var tiler = utilTiler().zoomExtent([z2, z2]);
41539
41540             return tiler.getTiles(projection)
41541                 .map(function(tile) { return tile.extent; });
41542         }
41543
41544
41545         // no more than `limit` results per partition.
41546         function searchLimited$1(limit, projection, rtree) {
41547             limit = limit || 5;
41548
41549             return partitionViewport$1(projection)
41550                 .reduce(function(result, extent) {
41551                     var found = rtree.search(extent.bbox())
41552                         .slice(0, limit)
41553                         .map(function(d) { return d.data; });
41554
41555                     return (found.length ? result.concat(found) : result);
41556                 }, []);
41557         }
41558
41559
41560         function zoomPan() {
41561             var t = event.transform;
41562             d3_select('#photoviewer .osc-image-wrap')
41563                 .call(utilSetTransform, t.x, t.y, t.k);
41564         }
41565
41566
41567         var serviceOpenstreetcam = {
41568
41569             init: function() {
41570                 if (!_oscCache) {
41571                     this.reset();
41572                 }
41573
41574                 this.event = utilRebind(this, dispatch$4, 'on');
41575             },
41576
41577             reset: function() {
41578                 if (_oscCache) {
41579                     Object.values(_oscCache.images.inflight).forEach(abortRequest$3);
41580                 }
41581
41582                 _oscCache = {
41583                     images: { inflight: {}, loaded: {}, nextPage: {}, rtree: rbush_1() },
41584                     sequences: {}
41585                 };
41586
41587                 _oscSelectedImage = null;
41588             },
41589
41590
41591             images: function(projection) {
41592                 var limit = 5;
41593                 return searchLimited$1(limit, projection, _oscCache.images.rtree);
41594             },
41595
41596
41597             sequences: function(projection) {
41598                 var viewport = projection.clipExtent();
41599                 var min = [viewport[0][0], viewport[1][1]];
41600                 var max = [viewport[1][0], viewport[0][1]];
41601                 var bbox = geoExtent(projection.invert(min), projection.invert(max)).bbox();
41602                 var sequenceKeys = {};
41603
41604                 // all sequences for images in viewport
41605                 _oscCache.images.rtree.search(bbox)
41606                     .forEach(function(d) { sequenceKeys[d.data.sequence_id] = true; });
41607
41608                 // make linestrings from those sequences
41609                 var lineStrings = [];
41610                 Object.keys(sequenceKeys)
41611                     .forEach(function(sequenceKey) {
41612                         var seq = _oscCache.sequences[sequenceKey];
41613                         var images = seq && seq.images;
41614                         if (images) {
41615                             lineStrings.push({
41616                                 type: 'LineString',
41617                                 coordinates: images.map(function (d) { return d.loc; }).filter(Boolean),
41618                                 properties: { key: sequenceKey }
41619                             });
41620                         }
41621                     });
41622                 return lineStrings;
41623             },
41624
41625
41626             loadImages: function(projection) {
41627                 var url = apibase$2 + '/1.0/list/nearby-photos/';
41628                 loadTiles$1('images', url, projection);
41629             },
41630
41631
41632             loadViewer: function(context) {
41633                 var that = this;
41634
41635                 // add osc-wrapper
41636                 var wrap = d3_select('#photoviewer').selectAll('.osc-wrapper')
41637                     .data([0]);
41638
41639                 var wrapEnter = wrap.enter()
41640                     .append('div')
41641                     .attr('class', 'photo-wrapper osc-wrapper')
41642                     .classed('hide', true)
41643                     .call(imgZoom)
41644                     .on('dblclick.zoom', null);
41645
41646                 wrapEnter
41647                     .append('div')
41648                     .attr('class', 'photo-attribution fillD');
41649
41650                 var controlsEnter = wrapEnter
41651                     .append('div')
41652                     .attr('class', 'photo-controls-wrap')
41653                     .append('div')
41654                     .attr('class', 'photo-controls');
41655
41656                 controlsEnter
41657                     .append('button')
41658                     .on('click.back', step(-1))
41659                     .text('◄');
41660
41661                 controlsEnter
41662                     .append('button')
41663                     .on('click.rotate-ccw', rotate(-90))
41664                     .text('⤿');
41665
41666                 controlsEnter
41667                     .append('button')
41668                     .on('click.rotate-cw', rotate(90))
41669                     .text('⤾');
41670
41671                 controlsEnter
41672                     .append('button')
41673                     .on('click.forward', step(1))
41674                     .text('►');
41675
41676                 wrapEnter
41677                     .append('div')
41678                     .attr('class', 'osc-image-wrap');
41679
41680
41681                 // Register viewer resize handler
41682                 context.ui().photoviewer.on('resize', function(dimensions) {
41683                     imgZoom = d3_zoom()
41684                         .extent([[0, 0], dimensions])
41685                         .translateExtent([[0, 0], dimensions])
41686                         .scaleExtent([1, 15])
41687                         .on('zoom', zoomPan);
41688                 });
41689
41690
41691                 function rotate(deg) {
41692                     return function() {
41693                         if (!_oscSelectedImage) return;
41694                         var sequenceKey = _oscSelectedImage.sequence_id;
41695                         var sequence = _oscCache.sequences[sequenceKey];
41696                         if (!sequence) return;
41697
41698                         var r = sequence.rotation || 0;
41699                         r += deg;
41700
41701                         if (r > 180) r -= 360;
41702                         if (r < -180) r += 360;
41703                         sequence.rotation = r;
41704
41705                         var wrap = d3_select('#photoviewer .osc-wrapper');
41706
41707                         wrap
41708                             .transition()
41709                             .duration(100)
41710                             .call(imgZoom.transform, identity$8);
41711
41712                         wrap.selectAll('.osc-image')
41713                             .transition()
41714                             .duration(100)
41715                             .style('transform', 'rotate(' + r + 'deg)');
41716                     };
41717                 }
41718
41719                 function step(stepBy) {
41720                     return function() {
41721                         if (!_oscSelectedImage) return;
41722                         var sequenceKey = _oscSelectedImage.sequence_id;
41723                         var sequence = _oscCache.sequences[sequenceKey];
41724                         if (!sequence) return;
41725
41726                         var nextIndex = _oscSelectedImage.sequence_index + stepBy;
41727                         var nextImage = sequence.images[nextIndex];
41728                         if (!nextImage) return;
41729
41730                         context.map().centerEase(nextImage.loc);
41731
41732                         that
41733                             .selectImage(nextImage)
41734                             .updateViewer(nextImage);
41735                     };
41736                 }
41737             },
41738
41739
41740             showViewer: function() {
41741                 var viewer = d3_select('#photoviewer')
41742                     .classed('hide', false);
41743
41744                 var isHidden = viewer.selectAll('.photo-wrapper.osc-wrapper.hide').size();
41745
41746                 if (isHidden) {
41747                     viewer
41748                         .selectAll('.photo-wrapper:not(.osc-wrapper)')
41749                         .classed('hide', true);
41750
41751                     viewer
41752                         .selectAll('.photo-wrapper.osc-wrapper')
41753                         .classed('hide', false);
41754                 }
41755
41756                 return this;
41757             },
41758
41759
41760             hideViewer: function() {
41761                 _oscSelectedImage = null;
41762
41763                 var viewer = d3_select('#photoviewer');
41764                 if (!viewer.empty()) viewer.datum(null);
41765
41766                 viewer
41767                     .classed('hide', true)
41768                     .selectAll('.photo-wrapper')
41769                     .classed('hide', true);
41770
41771                 d3_selectAll('.viewfield-group, .sequence, .icon-sign')
41772                     .classed('currentView', false);
41773
41774                 return this.setStyles(null, true);
41775             },
41776
41777
41778             updateViewer: function(d) {
41779                 var wrap = d3_select('#photoviewer .osc-wrapper');
41780                 var imageWrap = wrap.selectAll('.osc-image-wrap');
41781                 var attribution = wrap.selectAll('.photo-attribution').html('');
41782
41783                 wrap
41784                     .transition()
41785                     .duration(100)
41786                     .call(imgZoom.transform, identity$8);
41787
41788                 imageWrap
41789                     .selectAll('.osc-image')
41790                     .remove();
41791
41792                 if (d) {
41793                     var sequence = _oscCache.sequences[d.sequence_id];
41794                     var r = (sequence && sequence.rotation) || 0;
41795
41796                     imageWrap
41797                         .append('img')
41798                         .attr('class', 'osc-image')
41799                         .attr('src', apibase$2 + '/' + d.imagePath)
41800                         .style('transform', 'rotate(' + r + 'deg)');
41801
41802                     if (d.captured_by) {
41803                         attribution
41804                             .append('a')
41805                             .attr('class', 'captured_by')
41806                             .attr('target', '_blank')
41807                             .attr('href', 'https://openstreetcam.org/user/' + encodeURIComponent(d.captured_by))
41808                             .text('@' + d.captured_by);
41809
41810                         attribution
41811                             .append('span')
41812                             .text('|');
41813                     }
41814
41815                     if (d.captured_at) {
41816                         attribution
41817                             .append('span')
41818                             .attr('class', 'captured_at')
41819                             .text(localeDateString(d.captured_at));
41820
41821                         attribution
41822                             .append('span')
41823                             .text('|');
41824                     }
41825
41826                     attribution
41827                         .append('a')
41828                         .attr('class', 'image-link')
41829                         .attr('target', '_blank')
41830                         .attr('href', 'https://openstreetcam.org/details/' + d.sequence_id + '/' + d.sequence_index)
41831                         .text('openstreetcam.org');
41832                 }
41833
41834                 return this;
41835
41836
41837                 function localeDateString(s) {
41838                     if (!s) return null;
41839                     var detected = utilDetect();
41840                     var options = { day: 'numeric', month: 'short', year: 'numeric' };
41841                     var d = new Date(s);
41842                     if (isNaN(d.getTime())) return null;
41843                     return d.toLocaleDateString(detected.locale, options);
41844                 }
41845             },
41846
41847
41848             selectImage: function(d) {
41849                 _oscSelectedImage = d;
41850                 var viewer = d3_select('#photoviewer');
41851                 if (!viewer.empty()) viewer.datum(d);
41852
41853                 this.setStyles(null, true);
41854
41855                 d3_selectAll('.icon-sign')
41856                     .classed('currentView', false);
41857
41858                 return this;
41859             },
41860
41861
41862             getSelectedImage: function() {
41863                 return _oscSelectedImage;
41864             },
41865
41866
41867             getSequenceKeyForImage: function(d) {
41868                 return d && d.sequence_id;
41869             },
41870
41871
41872             // Updates the currently highlighted sequence and selected bubble.
41873             // Reset is only necessary when interacting with the viewport because
41874             // this implicitly changes the currently selected bubble/sequence
41875             setStyles: function(hovered, reset) {
41876                 if (reset) {  // reset all layers
41877                     d3_selectAll('.viewfield-group')
41878                         .classed('highlighted', false)
41879                         .classed('hovered', false)
41880                         .classed('currentView', false);
41881
41882                     d3_selectAll('.sequence')
41883                         .classed('highlighted', false)
41884                         .classed('currentView', false);
41885                 }
41886
41887                 var hoveredImageKey = hovered && hovered.key;
41888                 var hoveredSequenceKey = this.getSequenceKeyForImage(hovered);
41889                 var hoveredSequence = hoveredSequenceKey && _oscCache.sequences[hoveredSequenceKey];
41890                 var hoveredImageKeys = (hoveredSequence && hoveredSequence.images.map(function (d) { return d.key; })) || [];
41891
41892                 var viewer = d3_select('#photoviewer');
41893                 var selected = viewer.empty() ? undefined : viewer.datum();
41894                 var selectedImageKey = selected && selected.key;
41895                 var selectedSequenceKey = this.getSequenceKeyForImage(selected);
41896                 var selectedSequence = selectedSequenceKey && _oscCache.sequences[selectedSequenceKey];
41897                 var selectedImageKeys = (selectedSequence && selectedSequence.images.map(function (d) { return d.key; })) || [];
41898
41899                 // highlight sibling viewfields on either the selected or the hovered sequences
41900                 var highlightedImageKeys = utilArrayUnion(hoveredImageKeys, selectedImageKeys);
41901
41902                 d3_selectAll('.layer-openstreetcam .viewfield-group')
41903                     .classed('highlighted', function(d) { return highlightedImageKeys.indexOf(d.key) !== -1; })
41904                     .classed('hovered', function(d) { return d.key === hoveredImageKey; })
41905                     .classed('currentView', function(d) { return d.key === selectedImageKey; });
41906
41907                 d3_selectAll('.layer-openstreetcam .sequence')
41908                     .classed('highlighted', function(d) { return d.properties.key === hoveredSequenceKey; })
41909                     .classed('currentView', function(d) { return d.properties.key === selectedSequenceKey; });
41910
41911                 // update viewfields if needed
41912                 d3_selectAll('.viewfield-group .viewfield')
41913                     .attr('d', viewfieldPath);
41914
41915                 function viewfieldPath() {
41916                     var d = this.parentNode.__data__;
41917                     if (d.pano && d.key !== selectedImageKey) {
41918                         return 'M 8,13 m -10,0 a 10,10 0 1,0 20,0 a 10,10 0 1,0 -20,0';
41919                     } else {
41920                         return 'M 6,9 C 8,8.4 8,8.4 10,9 L 16,-2 C 12,-5 4,-5 0,-2 z';
41921                     }
41922                 }
41923
41924                 return this;
41925             },
41926
41927
41928             cache: function() {
41929                 return _oscCache;
41930             }
41931
41932         };
41933
41934         /**
41935          * Checks if `value` is the
41936          * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)
41937          * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)
41938          *
41939          * @static
41940          * @memberOf _
41941          * @since 0.1.0
41942          * @category Lang
41943          * @param {*} value The value to check.
41944          * @returns {boolean} Returns `true` if `value` is an object, else `false`.
41945          * @example
41946          *
41947          * _.isObject({});
41948          * // => true
41949          *
41950          * _.isObject([1, 2, 3]);
41951          * // => true
41952          *
41953          * _.isObject(_.noop);
41954          * // => true
41955          *
41956          * _.isObject(null);
41957          * // => false
41958          */
41959         function isObject$1(value) {
41960           var type = typeof value;
41961           return value != null && (type == 'object' || type == 'function');
41962         }
41963
41964         /** Detect free variable `global` from Node.js. */
41965         var freeGlobal = typeof global == 'object' && global && global.Object === Object && global;
41966
41967         /** Detect free variable `self`. */
41968         var freeSelf = typeof self == 'object' && self && self.Object === Object && self;
41969
41970         /** Used as a reference to the global object. */
41971         var root$3 = freeGlobal || freeSelf || Function('return this')();
41972
41973         /**
41974          * Gets the timestamp of the number of milliseconds that have elapsed since
41975          * the Unix epoch (1 January 1970 00:00:00 UTC).
41976          *
41977          * @static
41978          * @memberOf _
41979          * @since 2.4.0
41980          * @category Date
41981          * @returns {number} Returns the timestamp.
41982          * @example
41983          *
41984          * _.defer(function(stamp) {
41985          *   console.log(_.now() - stamp);
41986          * }, _.now());
41987          * // => Logs the number of milliseconds it took for the deferred invocation.
41988          */
41989         var now$1 = function() {
41990           return root$3.Date.now();
41991         };
41992
41993         /** Built-in value references. */
41994         var Symbol$1 = root$3.Symbol;
41995
41996         /** Used for built-in method references. */
41997         var objectProto = Object.prototype;
41998
41999         /** Used to check objects for own properties. */
42000         var hasOwnProperty$1 = objectProto.hasOwnProperty;
42001
42002         /**
42003          * Used to resolve the
42004          * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)
42005          * of values.
42006          */
42007         var nativeObjectToString = objectProto.toString;
42008
42009         /** Built-in value references. */
42010         var symToStringTag = Symbol$1 ? Symbol$1.toStringTag : undefined;
42011
42012         /**
42013          * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.
42014          *
42015          * @private
42016          * @param {*} value The value to query.
42017          * @returns {string} Returns the raw `toStringTag`.
42018          */
42019         function getRawTag(value) {
42020           var isOwn = hasOwnProperty$1.call(value, symToStringTag),
42021               tag = value[symToStringTag];
42022
42023           try {
42024             value[symToStringTag] = undefined;
42025             var unmasked = true;
42026           } catch (e) {}
42027
42028           var result = nativeObjectToString.call(value);
42029           if (unmasked) {
42030             if (isOwn) {
42031               value[symToStringTag] = tag;
42032             } else {
42033               delete value[symToStringTag];
42034             }
42035           }
42036           return result;
42037         }
42038
42039         /** Used for built-in method references. */
42040         var objectProto$1 = Object.prototype;
42041
42042         /**
42043          * Used to resolve the
42044          * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)
42045          * of values.
42046          */
42047         var nativeObjectToString$1 = objectProto$1.toString;
42048
42049         /**
42050          * Converts `value` to a string using `Object.prototype.toString`.
42051          *
42052          * @private
42053          * @param {*} value The value to convert.
42054          * @returns {string} Returns the converted string.
42055          */
42056         function objectToString(value) {
42057           return nativeObjectToString$1.call(value);
42058         }
42059
42060         /** `Object#toString` result references. */
42061         var nullTag = '[object Null]',
42062             undefinedTag = '[object Undefined]';
42063
42064         /** Built-in value references. */
42065         var symToStringTag$1 = Symbol$1 ? Symbol$1.toStringTag : undefined;
42066
42067         /**
42068          * The base implementation of `getTag` without fallbacks for buggy environments.
42069          *
42070          * @private
42071          * @param {*} value The value to query.
42072          * @returns {string} Returns the `toStringTag`.
42073          */
42074         function baseGetTag(value) {
42075           if (value == null) {
42076             return value === undefined ? undefinedTag : nullTag;
42077           }
42078           return (symToStringTag$1 && symToStringTag$1 in Object(value))
42079             ? getRawTag(value)
42080             : objectToString(value);
42081         }
42082
42083         /**
42084          * Checks if `value` is object-like. A value is object-like if it's not `null`
42085          * and has a `typeof` result of "object".
42086          *
42087          * @static
42088          * @memberOf _
42089          * @since 4.0.0
42090          * @category Lang
42091          * @param {*} value The value to check.
42092          * @returns {boolean} Returns `true` if `value` is object-like, else `false`.
42093          * @example
42094          *
42095          * _.isObjectLike({});
42096          * // => true
42097          *
42098          * _.isObjectLike([1, 2, 3]);
42099          * // => true
42100          *
42101          * _.isObjectLike(_.noop);
42102          * // => false
42103          *
42104          * _.isObjectLike(null);
42105          * // => false
42106          */
42107         function isObjectLike(value) {
42108           return value != null && typeof value == 'object';
42109         }
42110
42111         /** `Object#toString` result references. */
42112         var symbolTag = '[object Symbol]';
42113
42114         /**
42115          * Checks if `value` is classified as a `Symbol` primitive or object.
42116          *
42117          * @static
42118          * @memberOf _
42119          * @since 4.0.0
42120          * @category Lang
42121          * @param {*} value The value to check.
42122          * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.
42123          * @example
42124          *
42125          * _.isSymbol(Symbol.iterator);
42126          * // => true
42127          *
42128          * _.isSymbol('abc');
42129          * // => false
42130          */
42131         function isSymbol$2(value) {
42132           return typeof value == 'symbol' ||
42133             (isObjectLike(value) && baseGetTag(value) == symbolTag);
42134         }
42135
42136         /** Used as references for various `Number` constants. */
42137         var NAN = 0 / 0;
42138
42139         /** Used to match leading and trailing whitespace. */
42140         var reTrim = /^\s+|\s+$/g;
42141
42142         /** Used to detect bad signed hexadecimal string values. */
42143         var reIsBadHex = /^[-+]0x[0-9a-f]+$/i;
42144
42145         /** Used to detect binary string values. */
42146         var reIsBinary = /^0b[01]+$/i;
42147
42148         /** Used to detect octal string values. */
42149         var reIsOctal = /^0o[0-7]+$/i;
42150
42151         /** Built-in method references without a dependency on `root`. */
42152         var freeParseInt = parseInt;
42153
42154         /**
42155          * Converts `value` to a number.
42156          *
42157          * @static
42158          * @memberOf _
42159          * @since 4.0.0
42160          * @category Lang
42161          * @param {*} value The value to process.
42162          * @returns {number} Returns the number.
42163          * @example
42164          *
42165          * _.toNumber(3.2);
42166          * // => 3.2
42167          *
42168          * _.toNumber(Number.MIN_VALUE);
42169          * // => 5e-324
42170          *
42171          * _.toNumber(Infinity);
42172          * // => Infinity
42173          *
42174          * _.toNumber('3.2');
42175          * // => 3.2
42176          */
42177         function toNumber(value) {
42178           if (typeof value == 'number') {
42179             return value;
42180           }
42181           if (isSymbol$2(value)) {
42182             return NAN;
42183           }
42184           if (isObject$1(value)) {
42185             var other = typeof value.valueOf == 'function' ? value.valueOf() : value;
42186             value = isObject$1(other) ? (other + '') : other;
42187           }
42188           if (typeof value != 'string') {
42189             return value === 0 ? value : +value;
42190           }
42191           value = value.replace(reTrim, '');
42192           var isBinary = reIsBinary.test(value);
42193           return (isBinary || reIsOctal.test(value))
42194             ? freeParseInt(value.slice(2), isBinary ? 2 : 8)
42195             : (reIsBadHex.test(value) ? NAN : +value);
42196         }
42197
42198         /** Error message constants. */
42199         var FUNC_ERROR_TEXT = 'Expected a function';
42200
42201         /* Built-in method references for those with the same name as other `lodash` methods. */
42202         var nativeMax = Math.max,
42203             nativeMin = Math.min;
42204
42205         /**
42206          * Creates a debounced function that delays invoking `func` until after `wait`
42207          * milliseconds have elapsed since the last time the debounced function was
42208          * invoked. The debounced function comes with a `cancel` method to cancel
42209          * delayed `func` invocations and a `flush` method to immediately invoke them.
42210          * Provide `options` to indicate whether `func` should be invoked on the
42211          * leading and/or trailing edge of the `wait` timeout. The `func` is invoked
42212          * with the last arguments provided to the debounced function. Subsequent
42213          * calls to the debounced function return the result of the last `func`
42214          * invocation.
42215          *
42216          * **Note:** If `leading` and `trailing` options are `true`, `func` is
42217          * invoked on the trailing edge of the timeout only if the debounced function
42218          * is invoked more than once during the `wait` timeout.
42219          *
42220          * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred
42221          * until to the next tick, similar to `setTimeout` with a timeout of `0`.
42222          *
42223          * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)
42224          * for details over the differences between `_.debounce` and `_.throttle`.
42225          *
42226          * @static
42227          * @memberOf _
42228          * @since 0.1.0
42229          * @category Function
42230          * @param {Function} func The function to debounce.
42231          * @param {number} [wait=0] The number of milliseconds to delay.
42232          * @param {Object} [options={}] The options object.
42233          * @param {boolean} [options.leading=false]
42234          *  Specify invoking on the leading edge of the timeout.
42235          * @param {number} [options.maxWait]
42236          *  The maximum time `func` is allowed to be delayed before it's invoked.
42237          * @param {boolean} [options.trailing=true]
42238          *  Specify invoking on the trailing edge of the timeout.
42239          * @returns {Function} Returns the new debounced function.
42240          * @example
42241          *
42242          * // Avoid costly calculations while the window size is in flux.
42243          * jQuery(window).on('resize', _.debounce(calculateLayout, 150));
42244          *
42245          * // Invoke `sendMail` when clicked, debouncing subsequent calls.
42246          * jQuery(element).on('click', _.debounce(sendMail, 300, {
42247          *   'leading': true,
42248          *   'trailing': false
42249          * }));
42250          *
42251          * // Ensure `batchLog` is invoked once after 1 second of debounced calls.
42252          * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });
42253          * var source = new EventSource('/stream');
42254          * jQuery(source).on('message', debounced);
42255          *
42256          * // Cancel the trailing debounced invocation.
42257          * jQuery(window).on('popstate', debounced.cancel);
42258          */
42259         function debounce(func, wait, options) {
42260           var lastArgs,
42261               lastThis,
42262               maxWait,
42263               result,
42264               timerId,
42265               lastCallTime,
42266               lastInvokeTime = 0,
42267               leading = false,
42268               maxing = false,
42269               trailing = true;
42270
42271           if (typeof func != 'function') {
42272             throw new TypeError(FUNC_ERROR_TEXT);
42273           }
42274           wait = toNumber(wait) || 0;
42275           if (isObject$1(options)) {
42276             leading = !!options.leading;
42277             maxing = 'maxWait' in options;
42278             maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait;
42279             trailing = 'trailing' in options ? !!options.trailing : trailing;
42280           }
42281
42282           function invokeFunc(time) {
42283             var args = lastArgs,
42284                 thisArg = lastThis;
42285
42286             lastArgs = lastThis = undefined;
42287             lastInvokeTime = time;
42288             result = func.apply(thisArg, args);
42289             return result;
42290           }
42291
42292           function leadingEdge(time) {
42293             // Reset any `maxWait` timer.
42294             lastInvokeTime = time;
42295             // Start the timer for the trailing edge.
42296             timerId = setTimeout(timerExpired, wait);
42297             // Invoke the leading edge.
42298             return leading ? invokeFunc(time) : result;
42299           }
42300
42301           function remainingWait(time) {
42302             var timeSinceLastCall = time - lastCallTime,
42303                 timeSinceLastInvoke = time - lastInvokeTime,
42304                 timeWaiting = wait - timeSinceLastCall;
42305
42306             return maxing
42307               ? nativeMin(timeWaiting, maxWait - timeSinceLastInvoke)
42308               : timeWaiting;
42309           }
42310
42311           function shouldInvoke(time) {
42312             var timeSinceLastCall = time - lastCallTime,
42313                 timeSinceLastInvoke = time - lastInvokeTime;
42314
42315             // Either this is the first call, activity has stopped and we're at the
42316             // trailing edge, the system time has gone backwards and we're treating
42317             // it as the trailing edge, or we've hit the `maxWait` limit.
42318             return (lastCallTime === undefined || (timeSinceLastCall >= wait) ||
42319               (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait));
42320           }
42321
42322           function timerExpired() {
42323             var time = now$1();
42324             if (shouldInvoke(time)) {
42325               return trailingEdge(time);
42326             }
42327             // Restart the timer.
42328             timerId = setTimeout(timerExpired, remainingWait(time));
42329           }
42330
42331           function trailingEdge(time) {
42332             timerId = undefined;
42333
42334             // Only invoke if we have `lastArgs` which means `func` has been
42335             // debounced at least once.
42336             if (trailing && lastArgs) {
42337               return invokeFunc(time);
42338             }
42339             lastArgs = lastThis = undefined;
42340             return result;
42341           }
42342
42343           function cancel() {
42344             if (timerId !== undefined) {
42345               clearTimeout(timerId);
42346             }
42347             lastInvokeTime = 0;
42348             lastArgs = lastCallTime = lastThis = timerId = undefined;
42349           }
42350
42351           function flush() {
42352             return timerId === undefined ? result : trailingEdge(now$1());
42353           }
42354
42355           function debounced() {
42356             var time = now$1(),
42357                 isInvoking = shouldInvoke(time);
42358
42359             lastArgs = arguments;
42360             lastThis = this;
42361             lastCallTime = time;
42362
42363             if (isInvoking) {
42364               if (timerId === undefined) {
42365                 return leadingEdge(lastCallTime);
42366               }
42367               if (maxing) {
42368                 // Handle invocations in a tight loop.
42369                 timerId = setTimeout(timerExpired, wait);
42370                 return invokeFunc(lastCallTime);
42371               }
42372             }
42373             if (timerId === undefined) {
42374               timerId = setTimeout(timerExpired, wait);
42375             }
42376             return result;
42377           }
42378           debounced.cancel = cancel;
42379           debounced.flush = flush;
42380           return debounced;
42381         }
42382
42383         /** Error message constants. */
42384         var FUNC_ERROR_TEXT$1 = 'Expected a function';
42385
42386         /**
42387          * Creates a throttled function that only invokes `func` at most once per
42388          * every `wait` milliseconds. The throttled function comes with a `cancel`
42389          * method to cancel delayed `func` invocations and a `flush` method to
42390          * immediately invoke them. Provide `options` to indicate whether `func`
42391          * should be invoked on the leading and/or trailing edge of the `wait`
42392          * timeout. The `func` is invoked with the last arguments provided to the
42393          * throttled function. Subsequent calls to the throttled function return the
42394          * result of the last `func` invocation.
42395          *
42396          * **Note:** If `leading` and `trailing` options are `true`, `func` is
42397          * invoked on the trailing edge of the timeout only if the throttled function
42398          * is invoked more than once during the `wait` timeout.
42399          *
42400          * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred
42401          * until to the next tick, similar to `setTimeout` with a timeout of `0`.
42402          *
42403          * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)
42404          * for details over the differences between `_.throttle` and `_.debounce`.
42405          *
42406          * @static
42407          * @memberOf _
42408          * @since 0.1.0
42409          * @category Function
42410          * @param {Function} func The function to throttle.
42411          * @param {number} [wait=0] The number of milliseconds to throttle invocations to.
42412          * @param {Object} [options={}] The options object.
42413          * @param {boolean} [options.leading=true]
42414          *  Specify invoking on the leading edge of the timeout.
42415          * @param {boolean} [options.trailing=true]
42416          *  Specify invoking on the trailing edge of the timeout.
42417          * @returns {Function} Returns the new throttled function.
42418          * @example
42419          *
42420          * // Avoid excessively updating the position while scrolling.
42421          * jQuery(window).on('scroll', _.throttle(updatePosition, 100));
42422          *
42423          * // Invoke `renewToken` when the click event is fired, but not more than once every 5 minutes.
42424          * var throttled = _.throttle(renewToken, 300000, { 'trailing': false });
42425          * jQuery(element).on('click', throttled);
42426          *
42427          * // Cancel the trailing throttled invocation.
42428          * jQuery(window).on('popstate', throttled.cancel);
42429          */
42430         function throttle(func, wait, options) {
42431           var leading = true,
42432               trailing = true;
42433
42434           if (typeof func != 'function') {
42435             throw new TypeError(FUNC_ERROR_TEXT$1);
42436           }
42437           if (isObject$1(options)) {
42438             leading = 'leading' in options ? !!options.leading : leading;
42439             trailing = 'trailing' in options ? !!options.trailing : trailing;
42440           }
42441           return debounce(func, wait, {
42442             'leading': leading,
42443             'maxWait': wait,
42444             'trailing': trailing
42445           });
42446         }
42447
42448         var hashes = createCommonjsModule(function (module, exports) {
42449         /**
42450          * jshashes - https://github.com/h2non/jshashes
42451          * Released under the "New BSD" license
42452          *
42453          * Algorithms specification:
42454          *
42455          * MD5 - http://www.ietf.org/rfc/rfc1321.txt
42456          * RIPEMD-160 - http://homes.esat.kuleuven.be/~bosselae/ripemd160.html
42457          * SHA1   - http://csrc.nist.gov/publications/fips/fips180-4/fips-180-4.pdf
42458          * SHA256 - http://csrc.nist.gov/publications/fips/fips180-4/fips-180-4.pdf
42459          * SHA512 - http://csrc.nist.gov/publications/fips/fips180-4/fips-180-4.pdf
42460          * HMAC - http://www.ietf.org/rfc/rfc2104.txt
42461          */
42462         (function() {
42463           var Hashes;
42464
42465           function utf8Encode(str) {
42466             var x, y, output = '',
42467               i = -1,
42468               l;
42469
42470             if (str && str.length) {
42471               l = str.length;
42472               while ((i += 1) < l) {
42473                 /* Decode utf-16 surrogate pairs */
42474                 x = str.charCodeAt(i);
42475                 y = i + 1 < l ? str.charCodeAt(i + 1) : 0;
42476                 if (0xD800 <= x && x <= 0xDBFF && 0xDC00 <= y && y <= 0xDFFF) {
42477                   x = 0x10000 + ((x & 0x03FF) << 10) + (y & 0x03FF);
42478                   i += 1;
42479                 }
42480                 /* Encode output as utf-8 */
42481                 if (x <= 0x7F) {
42482                   output += String.fromCharCode(x);
42483                 } else if (x <= 0x7FF) {
42484                   output += String.fromCharCode(0xC0 | ((x >>> 6) & 0x1F),
42485                     0x80 | (x & 0x3F));
42486                 } else if (x <= 0xFFFF) {
42487                   output += String.fromCharCode(0xE0 | ((x >>> 12) & 0x0F),
42488                     0x80 | ((x >>> 6) & 0x3F),
42489                     0x80 | (x & 0x3F));
42490                 } else if (x <= 0x1FFFFF) {
42491                   output += String.fromCharCode(0xF0 | ((x >>> 18) & 0x07),
42492                     0x80 | ((x >>> 12) & 0x3F),
42493                     0x80 | ((x >>> 6) & 0x3F),
42494                     0x80 | (x & 0x3F));
42495                 }
42496               }
42497             }
42498             return output;
42499           }
42500
42501           function utf8Decode(str) {
42502             var i, ac, c1, c2, c3, arr = [],
42503               l;
42504             i = ac = c1 = c2 = c3 = 0;
42505
42506             if (str && str.length) {
42507               l = str.length;
42508               str += '';
42509
42510               while (i < l) {
42511                 c1 = str.charCodeAt(i);
42512                 ac += 1;
42513                 if (c1 < 128) {
42514                   arr[ac] = String.fromCharCode(c1);
42515                   i += 1;
42516                 } else if (c1 > 191 && c1 < 224) {
42517                   c2 = str.charCodeAt(i + 1);
42518                   arr[ac] = String.fromCharCode(((c1 & 31) << 6) | (c2 & 63));
42519                   i += 2;
42520                 } else {
42521                   c2 = str.charCodeAt(i + 1);
42522                   c3 = str.charCodeAt(i + 2);
42523                   arr[ac] = String.fromCharCode(((c1 & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
42524                   i += 3;
42525                 }
42526               }
42527             }
42528             return arr.join('');
42529           }
42530
42531           /**
42532            * Add integers, wrapping at 2^32. This uses 16-bit operations internally
42533            * to work around bugs in some JS interpreters.
42534            */
42535
42536           function safe_add(x, y) {
42537             var lsw = (x & 0xFFFF) + (y & 0xFFFF),
42538               msw = (x >> 16) + (y >> 16) + (lsw >> 16);
42539             return (msw << 16) | (lsw & 0xFFFF);
42540           }
42541
42542           /**
42543            * Bitwise rotate a 32-bit number to the left.
42544            */
42545
42546           function bit_rol(num, cnt) {
42547             return (num << cnt) | (num >>> (32 - cnt));
42548           }
42549
42550           /**
42551            * Convert a raw string to a hex string
42552            */
42553
42554           function rstr2hex(input, hexcase) {
42555             var hex_tab = hexcase ? '0123456789ABCDEF' : '0123456789abcdef',
42556               output = '',
42557               x, i = 0,
42558               l = input.length;
42559             for (; i < l; i += 1) {
42560               x = input.charCodeAt(i);
42561               output += hex_tab.charAt((x >>> 4) & 0x0F) + hex_tab.charAt(x & 0x0F);
42562             }
42563             return output;
42564           }
42565
42566           /**
42567            * Convert an array of big-endian words to a string
42568            */
42569
42570           function binb2rstr(input) {
42571             var i, l = input.length * 32,
42572               output = '';
42573             for (i = 0; i < l; i += 8) {
42574               output += String.fromCharCode((input[i >> 5] >>> (24 - i % 32)) & 0xFF);
42575             }
42576             return output;
42577           }
42578
42579           /**
42580            * Convert an array of little-endian words to a string
42581            */
42582
42583           function binl2rstr(input) {
42584             var i, l = input.length * 32,
42585               output = '';
42586             for (i = 0; i < l; i += 8) {
42587               output += String.fromCharCode((input[i >> 5] >>> (i % 32)) & 0xFF);
42588             }
42589             return output;
42590           }
42591
42592           /**
42593            * Convert a raw string to an array of little-endian words
42594            * Characters >255 have their high-byte silently ignored.
42595            */
42596
42597           function rstr2binl(input) {
42598             var i, l = input.length * 8,
42599               output = Array(input.length >> 2),
42600               lo = output.length;
42601             for (i = 0; i < lo; i += 1) {
42602               output[i] = 0;
42603             }
42604             for (i = 0; i < l; i += 8) {
42605               output[i >> 5] |= (input.charCodeAt(i / 8) & 0xFF) << (i % 32);
42606             }
42607             return output;
42608           }
42609
42610           /**
42611            * Convert a raw string to an array of big-endian words
42612            * Characters >255 have their high-byte silently ignored.
42613            */
42614
42615           function rstr2binb(input) {
42616             var i, l = input.length * 8,
42617               output = Array(input.length >> 2),
42618               lo = output.length;
42619             for (i = 0; i < lo; i += 1) {
42620               output[i] = 0;
42621             }
42622             for (i = 0; i < l; i += 8) {
42623               output[i >> 5] |= (input.charCodeAt(i / 8) & 0xFF) << (24 - i % 32);
42624             }
42625             return output;
42626           }
42627
42628           /**
42629            * Convert a raw string to an arbitrary string encoding
42630            */
42631
42632           function rstr2any(input, encoding) {
42633             var divisor = encoding.length,
42634               remainders = Array(),
42635               i, q, x, ld, quotient, dividend, output, full_length;
42636
42637             /* Convert to an array of 16-bit big-endian values, forming the dividend */
42638             dividend = Array(Math.ceil(input.length / 2));
42639             ld = dividend.length;
42640             for (i = 0; i < ld; i += 1) {
42641               dividend[i] = (input.charCodeAt(i * 2) << 8) | input.charCodeAt(i * 2 + 1);
42642             }
42643
42644             /**
42645              * Repeatedly perform a long division. The binary array forms the dividend,
42646              * the length of the encoding is the divisor. Once computed, the quotient
42647              * forms the dividend for the next step. We stop when the dividend is zerHashes.
42648              * All remainders are stored for later use.
42649              */
42650             while (dividend.length > 0) {
42651               quotient = Array();
42652               x = 0;
42653               for (i = 0; i < dividend.length; i += 1) {
42654                 x = (x << 16) + dividend[i];
42655                 q = Math.floor(x / divisor);
42656                 x -= q * divisor;
42657                 if (quotient.length > 0 || q > 0) {
42658                   quotient[quotient.length] = q;
42659                 }
42660               }
42661               remainders[remainders.length] = x;
42662               dividend = quotient;
42663             }
42664
42665             /* Convert the remainders to the output string */
42666             output = '';
42667             for (i = remainders.length - 1; i >= 0; i--) {
42668               output += encoding.charAt(remainders[i]);
42669             }
42670
42671             /* Append leading zero equivalents */
42672             full_length = Math.ceil(input.length * 8 / (Math.log(encoding.length) / Math.log(2)));
42673             for (i = output.length; i < full_length; i += 1) {
42674               output = encoding[0] + output;
42675             }
42676             return output;
42677           }
42678
42679           /**
42680            * Convert a raw string to a base-64 string
42681            */
42682
42683           function rstr2b64(input, b64pad) {
42684             var tab = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/',
42685               output = '',
42686               len = input.length,
42687               i, j, triplet;
42688             b64pad = b64pad || '=';
42689             for (i = 0; i < len; i += 3) {
42690               triplet = (input.charCodeAt(i) << 16) | (i + 1 < len ? input.charCodeAt(i + 1) << 8 : 0) | (i + 2 < len ? input.charCodeAt(i + 2) : 0);
42691               for (j = 0; j < 4; j += 1) {
42692                 if (i * 8 + j * 6 > input.length * 8) {
42693                   output += b64pad;
42694                 } else {
42695                   output += tab.charAt((triplet >>> 6 * (3 - j)) & 0x3F);
42696                 }
42697               }
42698             }
42699             return output;
42700           }
42701
42702           Hashes = {
42703             /**
42704              * @property {String} version
42705              * @readonly
42706              */
42707             VERSION: '1.0.6',
42708             /**
42709              * @member Hashes
42710              * @class Base64
42711              * @constructor
42712              */
42713             Base64: function() {
42714               // private properties
42715               var tab = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/',
42716                 pad = '=', // default pad according with the RFC standard
42717                 utf8 = true; // by default enable UTF-8 support encoding
42718
42719               // public method for encoding
42720               this.encode = function(input) {
42721                 var i, j, triplet,
42722                   output = '',
42723                   len = input.length;
42724
42725                 pad = pad || '=';
42726                 input = (utf8) ? utf8Encode(input) : input;
42727
42728                 for (i = 0; i < len; i += 3) {
42729                   triplet = (input.charCodeAt(i) << 16) | (i + 1 < len ? input.charCodeAt(i + 1) << 8 : 0) | (i + 2 < len ? input.charCodeAt(i + 2) : 0);
42730                   for (j = 0; j < 4; j += 1) {
42731                     if (i * 8 + j * 6 > len * 8) {
42732                       output += pad;
42733                     } else {
42734                       output += tab.charAt((triplet >>> 6 * (3 - j)) & 0x3F);
42735                     }
42736                   }
42737                 }
42738                 return output;
42739               };
42740
42741               // public method for decoding
42742               this.decode = function(input) {
42743                 // var b64 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';
42744                 var i, o1, o2, o3, h1, h2, h3, h4, bits, ac,
42745                   dec = '',
42746                   arr = [];
42747                 if (!input) {
42748                   return input;
42749                 }
42750
42751                 i = ac = 0;
42752                 input = input.replace(new RegExp('\\' + pad, 'gi'), ''); // use '='
42753                 //input += '';
42754
42755                 do { // unpack four hexets into three octets using index points in b64
42756                   h1 = tab.indexOf(input.charAt(i += 1));
42757                   h2 = tab.indexOf(input.charAt(i += 1));
42758                   h3 = tab.indexOf(input.charAt(i += 1));
42759                   h4 = tab.indexOf(input.charAt(i += 1));
42760
42761                   bits = h1 << 18 | h2 << 12 | h3 << 6 | h4;
42762
42763                   o1 = bits >> 16 & 0xff;
42764                   o2 = bits >> 8 & 0xff;
42765                   o3 = bits & 0xff;
42766                   ac += 1;
42767
42768                   if (h3 === 64) {
42769                     arr[ac] = String.fromCharCode(o1);
42770                   } else if (h4 === 64) {
42771                     arr[ac] = String.fromCharCode(o1, o2);
42772                   } else {
42773                     arr[ac] = String.fromCharCode(o1, o2, o3);
42774                   }
42775                 } while (i < input.length);
42776
42777                 dec = arr.join('');
42778                 dec = (utf8) ? utf8Decode(dec) : dec;
42779
42780                 return dec;
42781               };
42782
42783               // set custom pad string
42784               this.setPad = function(str) {
42785                 pad = str || pad;
42786                 return this;
42787               };
42788               // set custom tab string characters
42789               this.setTab = function(str) {
42790                 tab = str || tab;
42791                 return this;
42792               };
42793               this.setUTF8 = function(bool) {
42794                 if (typeof bool === 'boolean') {
42795                   utf8 = bool;
42796                 }
42797                 return this;
42798               };
42799             },
42800
42801             /**
42802              * CRC-32 calculation
42803              * @member Hashes
42804              * @method CRC32
42805              * @static
42806              * @param {String} str Input String
42807              * @return {String}
42808              */
42809             CRC32: function(str) {
42810               var crc = 0,
42811                 x = 0,
42812                 y = 0,
42813                 table, i, iTop;
42814               str = utf8Encode(str);
42815
42816               table = [
42817                 '00000000 77073096 EE0E612C 990951BA 076DC419 706AF48F E963A535 9E6495A3 0EDB8832 ',
42818                 '79DCB8A4 E0D5E91E 97D2D988 09B64C2B 7EB17CBD E7B82D07 90BF1D91 1DB71064 6AB020F2 F3B97148 ',
42819                 '84BE41DE 1ADAD47D 6DDDE4EB F4D4B551 83D385C7 136C9856 646BA8C0 FD62F97A 8A65C9EC 14015C4F ',
42820                 '63066CD9 FA0F3D63 8D080DF5 3B6E20C8 4C69105E D56041E4 A2677172 3C03E4D1 4B04D447 D20D85FD ',
42821                 'A50AB56B 35B5A8FA 42B2986C DBBBC9D6 ACBCF940 32D86CE3 45DF5C75 DCD60DCF ABD13D59 26D930AC ',
42822                 '51DE003A C8D75180 BFD06116 21B4F4B5 56B3C423 CFBA9599 B8BDA50F 2802B89E 5F058808 C60CD9B2 ',
42823                 'B10BE924 2F6F7C87 58684C11 C1611DAB B6662D3D 76DC4190 01DB7106 98D220BC EFD5102A 71B18589 ',
42824                 '06B6B51F 9FBFE4A5 E8B8D433 7807C9A2 0F00F934 9609A88E E10E9818 7F6A0DBB 086D3D2D 91646C97 ',
42825                 'E6635C01 6B6B51F4 1C6C6162 856530D8 F262004E 6C0695ED 1B01A57B 8208F4C1 F50FC457 65B0D9C6 ',
42826                 '12B7E950 8BBEB8EA FCB9887C 62DD1DDF 15DA2D49 8CD37CF3 FBD44C65 4DB26158 3AB551CE A3BC0074 ',
42827                 'D4BB30E2 4ADFA541 3DD895D7 A4D1C46D D3D6F4FB 4369E96A 346ED9FC AD678846 DA60B8D0 44042D73 ',
42828                 '33031DE5 AA0A4C5F DD0D7CC9 5005713C 270241AA BE0B1010 C90C2086 5768B525 206F85B3 B966D409 ',
42829                 'CE61E49F 5EDEF90E 29D9C998 B0D09822 C7D7A8B4 59B33D17 2EB40D81 B7BD5C3B C0BA6CAD EDB88320 ',
42830                 '9ABFB3B6 03B6E20C 74B1D29A EAD54739 9DD277AF 04DB2615 73DC1683 E3630B12 94643B84 0D6D6A3E ',
42831                 '7A6A5AA8 E40ECF0B 9309FF9D 0A00AE27 7D079EB1 F00F9344 8708A3D2 1E01F268 6906C2FE F762575D ',
42832                 '806567CB 196C3671 6E6B06E7 FED41B76 89D32BE0 10DA7A5A 67DD4ACC F9B9DF6F 8EBEEFF9 17B7BE43 ',
42833                 '60B08ED5 D6D6A3E8 A1D1937E 38D8C2C4 4FDFF252 D1BB67F1 A6BC5767 3FB506DD 48B2364B D80D2BDA ',
42834                 'AF0A1B4C 36034AF6 41047A60 DF60EFC3 A867DF55 316E8EEF 4669BE79 CB61B38C BC66831A 256FD2A0 ',
42835                 '5268E236 CC0C7795 BB0B4703 220216B9 5505262F C5BA3BBE B2BD0B28 2BB45A92 5CB36A04 C2D7FFA7 ',
42836                 'B5D0CF31 2CD99E8B 5BDEAE1D 9B64C2B0 EC63F226 756AA39C 026D930A 9C0906A9 EB0E363F 72076785 ',
42837                 '05005713 95BF4A82 E2B87A14 7BB12BAE 0CB61B38 92D28E9B E5D5BE0D 7CDCEFB7 0BDBDF21 86D3D2D4 ',
42838                 'F1D4E242 68DDB3F8 1FDA836E 81BE16CD F6B9265B 6FB077E1 18B74777 88085AE6 FF0F6A70 66063BCA ',
42839                 '11010B5C 8F659EFF F862AE69 616BFFD3 166CCF45 A00AE278 D70DD2EE 4E048354 3903B3C2 A7672661 ',
42840                 'D06016F7 4969474D 3E6E77DB AED16A4A D9D65ADC 40DF0B66 37D83BF0 A9BCAE53 DEBB9EC5 47B2CF7F ',
42841                 '30B5FFE9 BDBDF21C CABAC28A 53B39330 24B4A3A6 BAD03605 CDD70693 54DE5729 23D967BF B3667A2E ',
42842                 'C4614AB8 5D681B02 2A6F2B94 B40BBE37 C30C8EA1 5A05DF1B 2D02EF8D'
42843               ].join('');
42844
42845               crc = crc ^ (-1);
42846               for (i = 0, iTop = str.length; i < iTop; i += 1) {
42847                 y = (crc ^ str.charCodeAt(i)) & 0xFF;
42848                 x = '0x' + table.substr(y * 9, 8);
42849                 crc = (crc >>> 8) ^ x;
42850               }
42851               // always return a positive number (that's what >>> 0 does)
42852               return (crc ^ (-1)) >>> 0;
42853             },
42854             /**
42855              * @member Hashes
42856              * @class MD5
42857              * @constructor
42858              * @param {Object} [config]
42859              *
42860              * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message
42861              * Digest Algorithm, as defined in RFC 1321.
42862              * Version 2.2 Copyright (C) Paul Johnston 1999 - 2009
42863              * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
42864              * See <http://pajhome.org.uk/crypt/md5> for more infHashes.
42865              */
42866             MD5: function(options) {
42867               /**
42868                * Private config properties. You may need to tweak these to be compatible with
42869                * the server-side, but the defaults work in most cases.
42870                * See {@link Hashes.MD5#method-setUpperCase} and {@link Hashes.SHA1#method-setUpperCase}
42871                */
42872               var hexcase = (options && typeof options.uppercase === 'boolean') ? options.uppercase : false, // hexadecimal output case format. false - lowercase; true - uppercase
42873                 b64pad = (options && typeof options.pad === 'string') ? options.pad : '=', // base-64 pad character. Defaults to '=' for strict RFC compliance
42874                 utf8 = (options && typeof options.utf8 === 'boolean') ? options.utf8 : true; // enable/disable utf8 encoding
42875
42876               // privileged (public) methods
42877               this.hex = function(s) {
42878                 return rstr2hex(rstr(s, utf8), hexcase);
42879               };
42880               this.b64 = function(s) {
42881                 return rstr2b64(rstr(s), b64pad);
42882               };
42883               this.any = function(s, e) {
42884                 return rstr2any(rstr(s, utf8), e);
42885               };
42886               this.raw = function(s) {
42887                 return rstr(s, utf8);
42888               };
42889               this.hex_hmac = function(k, d) {
42890                 return rstr2hex(rstr_hmac(k, d), hexcase);
42891               };
42892               this.b64_hmac = function(k, d) {
42893                 return rstr2b64(rstr_hmac(k, d), b64pad);
42894               };
42895               this.any_hmac = function(k, d, e) {
42896                 return rstr2any(rstr_hmac(k, d), e);
42897               };
42898               /**
42899                * Perform a simple self-test to see if the VM is working
42900                * @return {String} Hexadecimal hash sample
42901                */
42902               this.vm_test = function() {
42903                 return hex('abc').toLowerCase() === '900150983cd24fb0d6963f7d28e17f72';
42904               };
42905               /**
42906                * Enable/disable uppercase hexadecimal returned string
42907                * @param {Boolean}
42908                * @return {Object} this
42909                */
42910               this.setUpperCase = function(a) {
42911                 if (typeof a === 'boolean') {
42912                   hexcase = a;
42913                 }
42914                 return this;
42915               };
42916               /**
42917                * Defines a base64 pad string
42918                * @param {String} Pad
42919                * @return {Object} this
42920                */
42921               this.setPad = function(a) {
42922                 b64pad = a || b64pad;
42923                 return this;
42924               };
42925               /**
42926                * Defines a base64 pad string
42927                * @param {Boolean}
42928                * @return {Object} [this]
42929                */
42930               this.setUTF8 = function(a) {
42931                 if (typeof a === 'boolean') {
42932                   utf8 = a;
42933                 }
42934                 return this;
42935               };
42936
42937               // private methods
42938
42939               /**
42940                * Calculate the MD5 of a raw string
42941                */
42942
42943               function rstr(s) {
42944                 s = (utf8) ? utf8Encode(s) : s;
42945                 return binl2rstr(binl(rstr2binl(s), s.length * 8));
42946               }
42947
42948               /**
42949                * Calculate the HMAC-MD5, of a key and some data (raw strings)
42950                */
42951
42952               function rstr_hmac(key, data) {
42953                 var bkey, ipad, opad, hash, i;
42954
42955                 key = (utf8) ? utf8Encode(key) : key;
42956                 data = (utf8) ? utf8Encode(data) : data;
42957                 bkey = rstr2binl(key);
42958                 if (bkey.length > 16) {
42959                   bkey = binl(bkey, key.length * 8);
42960                 }
42961
42962                 ipad = Array(16), opad = Array(16);
42963                 for (i = 0; i < 16; i += 1) {
42964                   ipad[i] = bkey[i] ^ 0x36363636;
42965                   opad[i] = bkey[i] ^ 0x5C5C5C5C;
42966                 }
42967                 hash = binl(ipad.concat(rstr2binl(data)), 512 + data.length * 8);
42968                 return binl2rstr(binl(opad.concat(hash), 512 + 128));
42969               }
42970
42971               /**
42972                * Calculate the MD5 of an array of little-endian words, and a bit length.
42973                */
42974
42975               function binl(x, len) {
42976                 var i, olda, oldb, oldc, oldd,
42977                   a = 1732584193,
42978                   b = -271733879,
42979                   c = -1732584194,
42980                   d = 271733878;
42981
42982                 /* append padding */
42983                 x[len >> 5] |= 0x80 << ((len) % 32);
42984                 x[(((len + 64) >>> 9) << 4) + 14] = len;
42985
42986                 for (i = 0; i < x.length; i += 16) {
42987                   olda = a;
42988                   oldb = b;
42989                   oldc = c;
42990                   oldd = d;
42991
42992                   a = md5_ff(a, b, c, d, x[i + 0], 7, -680876936);
42993                   d = md5_ff(d, a, b, c, x[i + 1], 12, -389564586);
42994                   c = md5_ff(c, d, a, b, x[i + 2], 17, 606105819);
42995                   b = md5_ff(b, c, d, a, x[i + 3], 22, -1044525330);
42996                   a = md5_ff(a, b, c, d, x[i + 4], 7, -176418897);
42997                   d = md5_ff(d, a, b, c, x[i + 5], 12, 1200080426);
42998                   c = md5_ff(c, d, a, b, x[i + 6], 17, -1473231341);
42999                   b = md5_ff(b, c, d, a, x[i + 7], 22, -45705983);
43000                   a = md5_ff(a, b, c, d, x[i + 8], 7, 1770035416);
43001                   d = md5_ff(d, a, b, c, x[i + 9], 12, -1958414417);
43002                   c = md5_ff(c, d, a, b, x[i + 10], 17, -42063);
43003                   b = md5_ff(b, c, d, a, x[i + 11], 22, -1990404162);
43004                   a = md5_ff(a, b, c, d, x[i + 12], 7, 1804603682);
43005                   d = md5_ff(d, a, b, c, x[i + 13], 12, -40341101);
43006                   c = md5_ff(c, d, a, b, x[i + 14], 17, -1502002290);
43007                   b = md5_ff(b, c, d, a, x[i + 15], 22, 1236535329);
43008
43009                   a = md5_gg(a, b, c, d, x[i + 1], 5, -165796510);
43010                   d = md5_gg(d, a, b, c, x[i + 6], 9, -1069501632);
43011                   c = md5_gg(c, d, a, b, x[i + 11], 14, 643717713);
43012                   b = md5_gg(b, c, d, a, x[i + 0], 20, -373897302);
43013                   a = md5_gg(a, b, c, d, x[i + 5], 5, -701558691);
43014                   d = md5_gg(d, a, b, c, x[i + 10], 9, 38016083);
43015                   c = md5_gg(c, d, a, b, x[i + 15], 14, -660478335);
43016                   b = md5_gg(b, c, d, a, x[i + 4], 20, -405537848);
43017                   a = md5_gg(a, b, c, d, x[i + 9], 5, 568446438);
43018                   d = md5_gg(d, a, b, c, x[i + 14], 9, -1019803690);
43019                   c = md5_gg(c, d, a, b, x[i + 3], 14, -187363961);
43020                   b = md5_gg(b, c, d, a, x[i + 8], 20, 1163531501);
43021                   a = md5_gg(a, b, c, d, x[i + 13], 5, -1444681467);
43022                   d = md5_gg(d, a, b, c, x[i + 2], 9, -51403784);
43023                   c = md5_gg(c, d, a, b, x[i + 7], 14, 1735328473);
43024                   b = md5_gg(b, c, d, a, x[i + 12], 20, -1926607734);
43025
43026                   a = md5_hh(a, b, c, d, x[i + 5], 4, -378558);
43027                   d = md5_hh(d, a, b, c, x[i + 8], 11, -2022574463);
43028                   c = md5_hh(c, d, a, b, x[i + 11], 16, 1839030562);
43029                   b = md5_hh(b, c, d, a, x[i + 14], 23, -35309556);
43030                   a = md5_hh(a, b, c, d, x[i + 1], 4, -1530992060);
43031                   d = md5_hh(d, a, b, c, x[i + 4], 11, 1272893353);
43032                   c = md5_hh(c, d, a, b, x[i + 7], 16, -155497632);
43033                   b = md5_hh(b, c, d, a, x[i + 10], 23, -1094730640);
43034                   a = md5_hh(a, b, c, d, x[i + 13], 4, 681279174);
43035                   d = md5_hh(d, a, b, c, x[i + 0], 11, -358537222);
43036                   c = md5_hh(c, d, a, b, x[i + 3], 16, -722521979);
43037                   b = md5_hh(b, c, d, a, x[i + 6], 23, 76029189);
43038                   a = md5_hh(a, b, c, d, x[i + 9], 4, -640364487);
43039                   d = md5_hh(d, a, b, c, x[i + 12], 11, -421815835);
43040                   c = md5_hh(c, d, a, b, x[i + 15], 16, 530742520);
43041                   b = md5_hh(b, c, d, a, x[i + 2], 23, -995338651);
43042
43043                   a = md5_ii(a, b, c, d, x[i + 0], 6, -198630844);
43044                   d = md5_ii(d, a, b, c, x[i + 7], 10, 1126891415);
43045                   c = md5_ii(c, d, a, b, x[i + 14], 15, -1416354905);
43046                   b = md5_ii(b, c, d, a, x[i + 5], 21, -57434055);
43047                   a = md5_ii(a, b, c, d, x[i + 12], 6, 1700485571);
43048                   d = md5_ii(d, a, b, c, x[i + 3], 10, -1894986606);
43049                   c = md5_ii(c, d, a, b, x[i + 10], 15, -1051523);
43050                   b = md5_ii(b, c, d, a, x[i + 1], 21, -2054922799);
43051                   a = md5_ii(a, b, c, d, x[i + 8], 6, 1873313359);
43052                   d = md5_ii(d, a, b, c, x[i + 15], 10, -30611744);
43053                   c = md5_ii(c, d, a, b, x[i + 6], 15, -1560198380);
43054                   b = md5_ii(b, c, d, a, x[i + 13], 21, 1309151649);
43055                   a = md5_ii(a, b, c, d, x[i + 4], 6, -145523070);
43056                   d = md5_ii(d, a, b, c, x[i + 11], 10, -1120210379);
43057                   c = md5_ii(c, d, a, b, x[i + 2], 15, 718787259);
43058                   b = md5_ii(b, c, d, a, x[i + 9], 21, -343485551);
43059
43060                   a = safe_add(a, olda);
43061                   b = safe_add(b, oldb);
43062                   c = safe_add(c, oldc);
43063                   d = safe_add(d, oldd);
43064                 }
43065                 return Array(a, b, c, d);
43066               }
43067
43068               /**
43069                * These functions implement the four basic operations the algorithm uses.
43070                */
43071
43072               function md5_cmn(q, a, b, x, s, t) {
43073                 return safe_add(bit_rol(safe_add(safe_add(a, q), safe_add(x, t)), s), b);
43074               }
43075
43076               function md5_ff(a, b, c, d, x, s, t) {
43077                 return md5_cmn((b & c) | ((~b) & d), a, b, x, s, t);
43078               }
43079
43080               function md5_gg(a, b, c, d, x, s, t) {
43081                 return md5_cmn((b & d) | (c & (~d)), a, b, x, s, t);
43082               }
43083
43084               function md5_hh(a, b, c, d, x, s, t) {
43085                 return md5_cmn(b ^ c ^ d, a, b, x, s, t);
43086               }
43087
43088               function md5_ii(a, b, c, d, x, s, t) {
43089                 return md5_cmn(c ^ (b | (~d)), a, b, x, s, t);
43090               }
43091             },
43092             /**
43093              * @member Hashes
43094              * @class Hashes.SHA1
43095              * @param {Object} [config]
43096              * @constructor
43097              *
43098              * A JavaScript implementation of the Secure Hash Algorithm, SHA-1, as defined in FIPS 180-1
43099              * Version 2.2 Copyright Paul Johnston 2000 - 2009.
43100              * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
43101              * See http://pajhome.org.uk/crypt/md5 for details.
43102              */
43103             SHA1: function(options) {
43104               /**
43105                * Private config properties. You may need to tweak these to be compatible with
43106                * the server-side, but the defaults work in most cases.
43107                * See {@link Hashes.MD5#method-setUpperCase} and {@link Hashes.SHA1#method-setUpperCase}
43108                */
43109               var hexcase = (options && typeof options.uppercase === 'boolean') ? options.uppercase : false, // hexadecimal output case format. false - lowercase; true - uppercase
43110                 b64pad = (options && typeof options.pad === 'string') ? options.pad : '=', // base-64 pad character. Defaults to '=' for strict RFC compliance
43111                 utf8 = (options && typeof options.utf8 === 'boolean') ? options.utf8 : true; // enable/disable utf8 encoding
43112
43113               // public methods
43114               this.hex = function(s) {
43115                 return rstr2hex(rstr(s, utf8), hexcase);
43116               };
43117               this.b64 = function(s) {
43118                 return rstr2b64(rstr(s, utf8), b64pad);
43119               };
43120               this.any = function(s, e) {
43121                 return rstr2any(rstr(s, utf8), e);
43122               };
43123               this.raw = function(s) {
43124                 return rstr(s, utf8);
43125               };
43126               this.hex_hmac = function(k, d) {
43127                 return rstr2hex(rstr_hmac(k, d));
43128               };
43129               this.b64_hmac = function(k, d) {
43130                 return rstr2b64(rstr_hmac(k, d), b64pad);
43131               };
43132               this.any_hmac = function(k, d, e) {
43133                 return rstr2any(rstr_hmac(k, d), e);
43134               };
43135               /**
43136                * Perform a simple self-test to see if the VM is working
43137                * @return {String} Hexadecimal hash sample
43138                * @public
43139                */
43140               this.vm_test = function() {
43141                 return hex('abc').toLowerCase() === '900150983cd24fb0d6963f7d28e17f72';
43142               };
43143               /**
43144                * @description Enable/disable uppercase hexadecimal returned string
43145                * @param {boolean}
43146                * @return {Object} this
43147                * @public
43148                */
43149               this.setUpperCase = function(a) {
43150                 if (typeof a === 'boolean') {
43151                   hexcase = a;
43152                 }
43153                 return this;
43154               };
43155               /**
43156                * @description Defines a base64 pad string
43157                * @param {string} Pad
43158                * @return {Object} this
43159                * @public
43160                */
43161               this.setPad = function(a) {
43162                 b64pad = a || b64pad;
43163                 return this;
43164               };
43165               /**
43166                * @description Defines a base64 pad string
43167                * @param {boolean}
43168                * @return {Object} this
43169                * @public
43170                */
43171               this.setUTF8 = function(a) {
43172                 if (typeof a === 'boolean') {
43173                   utf8 = a;
43174                 }
43175                 return this;
43176               };
43177
43178               // private methods
43179
43180               /**
43181                * Calculate the SHA-512 of a raw string
43182                */
43183
43184               function rstr(s) {
43185                 s = (utf8) ? utf8Encode(s) : s;
43186                 return binb2rstr(binb(rstr2binb(s), s.length * 8));
43187               }
43188
43189               /**
43190                * Calculate the HMAC-SHA1 of a key and some data (raw strings)
43191                */
43192
43193               function rstr_hmac(key, data) {
43194                 var bkey, ipad, opad, i, hash;
43195                 key = (utf8) ? utf8Encode(key) : key;
43196                 data = (utf8) ? utf8Encode(data) : data;
43197                 bkey = rstr2binb(key);
43198
43199                 if (bkey.length > 16) {
43200                   bkey = binb(bkey, key.length * 8);
43201                 }
43202                 ipad = Array(16), opad = Array(16);
43203                 for (i = 0; i < 16; i += 1) {
43204                   ipad[i] = bkey[i] ^ 0x36363636;
43205                   opad[i] = bkey[i] ^ 0x5C5C5C5C;
43206                 }
43207                 hash = binb(ipad.concat(rstr2binb(data)), 512 + data.length * 8);
43208                 return binb2rstr(binb(opad.concat(hash), 512 + 160));
43209               }
43210
43211               /**
43212                * Calculate the SHA-1 of an array of big-endian words, and a bit length
43213                */
43214
43215               function binb(x, len) {
43216                 var i, j, t, olda, oldb, oldc, oldd, olde,
43217                   w = Array(80),
43218                   a = 1732584193,
43219                   b = -271733879,
43220                   c = -1732584194,
43221                   d = 271733878,
43222                   e = -1009589776;
43223
43224                 /* append padding */
43225                 x[len >> 5] |= 0x80 << (24 - len % 32);
43226                 x[((len + 64 >> 9) << 4) + 15] = len;
43227
43228                 for (i = 0; i < x.length; i += 16) {
43229                   olda = a;
43230                   oldb = b;
43231                   oldc = c;
43232                   oldd = d;
43233                   olde = e;
43234
43235                   for (j = 0; j < 80; j += 1) {
43236                     if (j < 16) {
43237                       w[j] = x[i + j];
43238                     } else {
43239                       w[j] = bit_rol(w[j - 3] ^ w[j - 8] ^ w[j - 14] ^ w[j - 16], 1);
43240                     }
43241                     t = safe_add(safe_add(bit_rol(a, 5), sha1_ft(j, b, c, d)),
43242                       safe_add(safe_add(e, w[j]), sha1_kt(j)));
43243                     e = d;
43244                     d = c;
43245                     c = bit_rol(b, 30);
43246                     b = a;
43247                     a = t;
43248                   }
43249
43250                   a = safe_add(a, olda);
43251                   b = safe_add(b, oldb);
43252                   c = safe_add(c, oldc);
43253                   d = safe_add(d, oldd);
43254                   e = safe_add(e, olde);
43255                 }
43256                 return Array(a, b, c, d, e);
43257               }
43258
43259               /**
43260                * Perform the appropriate triplet combination function for the current
43261                * iteration
43262                */
43263
43264               function sha1_ft(t, b, c, d) {
43265                 if (t < 20) {
43266                   return (b & c) | ((~b) & d);
43267                 }
43268                 if (t < 40) {
43269                   return b ^ c ^ d;
43270                 }
43271                 if (t < 60) {
43272                   return (b & c) | (b & d) | (c & d);
43273                 }
43274                 return b ^ c ^ d;
43275               }
43276
43277               /**
43278                * Determine the appropriate additive constant for the current iteration
43279                */
43280
43281               function sha1_kt(t) {
43282                 return (t < 20) ? 1518500249 : (t < 40) ? 1859775393 :
43283                   (t < 60) ? -1894007588 : -899497514;
43284               }
43285             },
43286             /**
43287              * @class Hashes.SHA256
43288              * @param {config}
43289              *
43290              * A JavaScript implementation of the Secure Hash Algorithm, SHA-256, as defined in FIPS 180-2
43291              * Version 2.2 Copyright Angel Marin, Paul Johnston 2000 - 2009.
43292              * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
43293              * See http://pajhome.org.uk/crypt/md5 for details.
43294              * Also http://anmar.eu.org/projects/jssha2/
43295              */
43296             SHA256: function(options) {
43297               /**
43298                * Private properties configuration variables. You may need to tweak these to be compatible with
43299                * the server-side, but the defaults work in most cases.
43300                * @see this.setUpperCase() method
43301                * @see this.setPad() method
43302                */
43303               var hexcase = (options && typeof options.uppercase === 'boolean') ? options.uppercase : false, // hexadecimal output case format. false - lowercase; true - uppercase  */
43304                 b64pad = (options && typeof options.pad === 'string') ? options.pad : '=',
43305                 /* base-64 pad character. Default '=' for strict RFC compliance   */
43306                 utf8 = (options && typeof options.utf8 === 'boolean') ? options.utf8 : true,
43307                 /* enable/disable utf8 encoding */
43308                 sha256_K;
43309
43310               /* privileged (public) methods */
43311               this.hex = function(s) {
43312                 return rstr2hex(rstr(s, utf8));
43313               };
43314               this.b64 = function(s) {
43315                 return rstr2b64(rstr(s, utf8), b64pad);
43316               };
43317               this.any = function(s, e) {
43318                 return rstr2any(rstr(s, utf8), e);
43319               };
43320               this.raw = function(s) {
43321                 return rstr(s, utf8);
43322               };
43323               this.hex_hmac = function(k, d) {
43324                 return rstr2hex(rstr_hmac(k, d));
43325               };
43326               this.b64_hmac = function(k, d) {
43327                 return rstr2b64(rstr_hmac(k, d), b64pad);
43328               };
43329               this.any_hmac = function(k, d, e) {
43330                 return rstr2any(rstr_hmac(k, d), e);
43331               };
43332               /**
43333                * Perform a simple self-test to see if the VM is working
43334                * @return {String} Hexadecimal hash sample
43335                * @public
43336                */
43337               this.vm_test = function() {
43338                 return hex('abc').toLowerCase() === '900150983cd24fb0d6963f7d28e17f72';
43339               };
43340               /**
43341                * Enable/disable uppercase hexadecimal returned string
43342                * @param {boolean}
43343                * @return {Object} this
43344                * @public
43345                */
43346               this.setUpperCase = function(a) {
43347                 if (typeof a === 'boolean') {
43348                   hexcase = a;
43349                 }
43350                 return this;
43351               };
43352               /**
43353                * @description Defines a base64 pad string
43354                * @param {string} Pad
43355                * @return {Object} this
43356                * @public
43357                */
43358               this.setPad = function(a) {
43359                 b64pad = a || b64pad;
43360                 return this;
43361               };
43362               /**
43363                * Defines a base64 pad string
43364                * @param {boolean}
43365                * @return {Object} this
43366                * @public
43367                */
43368               this.setUTF8 = function(a) {
43369                 if (typeof a === 'boolean') {
43370                   utf8 = a;
43371                 }
43372                 return this;
43373               };
43374
43375               // private methods
43376
43377               /**
43378                * Calculate the SHA-512 of a raw string
43379                */
43380
43381               function rstr(s, utf8) {
43382                 s = (utf8) ? utf8Encode(s) : s;
43383                 return binb2rstr(binb(rstr2binb(s), s.length * 8));
43384               }
43385
43386               /**
43387                * Calculate the HMAC-sha256 of a key and some data (raw strings)
43388                */
43389
43390               function rstr_hmac(key, data) {
43391                 key = (utf8) ? utf8Encode(key) : key;
43392                 data = (utf8) ? utf8Encode(data) : data;
43393                 var hash, i = 0,
43394                   bkey = rstr2binb(key),
43395                   ipad = Array(16),
43396                   opad = Array(16);
43397
43398                 if (bkey.length > 16) {
43399                   bkey = binb(bkey, key.length * 8);
43400                 }
43401
43402                 for (; i < 16; i += 1) {
43403                   ipad[i] = bkey[i] ^ 0x36363636;
43404                   opad[i] = bkey[i] ^ 0x5C5C5C5C;
43405                 }
43406
43407                 hash = binb(ipad.concat(rstr2binb(data)), 512 + data.length * 8);
43408                 return binb2rstr(binb(opad.concat(hash), 512 + 256));
43409               }
43410
43411               /*
43412                * Main sha256 function, with its support functions
43413                */
43414
43415               function sha256_S(X, n) {
43416                 return (X >>> n) | (X << (32 - n));
43417               }
43418
43419               function sha256_R(X, n) {
43420                 return (X >>> n);
43421               }
43422
43423               function sha256_Ch(x, y, z) {
43424                 return ((x & y) ^ ((~x) & z));
43425               }
43426
43427               function sha256_Maj(x, y, z) {
43428                 return ((x & y) ^ (x & z) ^ (y & z));
43429               }
43430
43431               function sha256_Sigma0256(x) {
43432                 return (sha256_S(x, 2) ^ sha256_S(x, 13) ^ sha256_S(x, 22));
43433               }
43434
43435               function sha256_Sigma1256(x) {
43436                 return (sha256_S(x, 6) ^ sha256_S(x, 11) ^ sha256_S(x, 25));
43437               }
43438
43439               function sha256_Gamma0256(x) {
43440                 return (sha256_S(x, 7) ^ sha256_S(x, 18) ^ sha256_R(x, 3));
43441               }
43442
43443               function sha256_Gamma1256(x) {
43444                 return (sha256_S(x, 17) ^ sha256_S(x, 19) ^ sha256_R(x, 10));
43445               }
43446
43447               sha256_K = [
43448                 1116352408, 1899447441, -1245643825, -373957723, 961987163, 1508970993, -1841331548, -1424204075, -670586216, 310598401, 607225278, 1426881987,
43449                 1925078388, -2132889090, -1680079193, -1046744716, -459576895, -272742522,
43450                 264347078, 604807628, 770255983, 1249150122, 1555081692, 1996064986, -1740746414, -1473132947, -1341970488, -1084653625, -958395405, -710438585,
43451                 113926993, 338241895, 666307205, 773529912, 1294757372, 1396182291,
43452                 1695183700, 1986661051, -2117940946, -1838011259, -1564481375, -1474664885, -1035236496, -949202525, -778901479, -694614492, -200395387, 275423344,
43453                 430227734, 506948616, 659060556, 883997877, 958139571, 1322822218,
43454                 1537002063, 1747873779, 1955562222, 2024104815, -2067236844, -1933114872, -1866530822, -1538233109, -1090935817, -965641998
43455               ];
43456
43457               function binb(m, l) {
43458                 var HASH = [1779033703, -1150833019, 1013904242, -1521486534,
43459                   1359893119, -1694144372, 528734635, 1541459225
43460                 ];
43461                 var W = new Array(64);
43462                 var a, b, c, d, e, f, g, h;
43463                 var i, j, T1, T2;
43464
43465                 /* append padding */
43466                 m[l >> 5] |= 0x80 << (24 - l % 32);
43467                 m[((l + 64 >> 9) << 4) + 15] = l;
43468
43469                 for (i = 0; i < m.length; i += 16) {
43470                   a = HASH[0];
43471                   b = HASH[1];
43472                   c = HASH[2];
43473                   d = HASH[3];
43474                   e = HASH[4];
43475                   f = HASH[5];
43476                   g = HASH[6];
43477                   h = HASH[7];
43478
43479                   for (j = 0; j < 64; j += 1) {
43480                     if (j < 16) {
43481                       W[j] = m[j + i];
43482                     } else {
43483                       W[j] = safe_add(safe_add(safe_add(sha256_Gamma1256(W[j - 2]), W[j - 7]),
43484                         sha256_Gamma0256(W[j - 15])), W[j - 16]);
43485                     }
43486
43487                     T1 = safe_add(safe_add(safe_add(safe_add(h, sha256_Sigma1256(e)), sha256_Ch(e, f, g)),
43488                       sha256_K[j]), W[j]);
43489                     T2 = safe_add(sha256_Sigma0256(a), sha256_Maj(a, b, c));
43490                     h = g;
43491                     g = f;
43492                     f = e;
43493                     e = safe_add(d, T1);
43494                     d = c;
43495                     c = b;
43496                     b = a;
43497                     a = safe_add(T1, T2);
43498                   }
43499
43500                   HASH[0] = safe_add(a, HASH[0]);
43501                   HASH[1] = safe_add(b, HASH[1]);
43502                   HASH[2] = safe_add(c, HASH[2]);
43503                   HASH[3] = safe_add(d, HASH[3]);
43504                   HASH[4] = safe_add(e, HASH[4]);
43505                   HASH[5] = safe_add(f, HASH[5]);
43506                   HASH[6] = safe_add(g, HASH[6]);
43507                   HASH[7] = safe_add(h, HASH[7]);
43508                 }
43509                 return HASH;
43510               }
43511
43512             },
43513
43514             /**
43515              * @class Hashes.SHA512
43516              * @param {config}
43517              *
43518              * A JavaScript implementation of the Secure Hash Algorithm, SHA-512, as defined in FIPS 180-2
43519              * Version 2.2 Copyright Anonymous Contributor, Paul Johnston 2000 - 2009.
43520              * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
43521              * See http://pajhome.org.uk/crypt/md5 for details.
43522              */
43523             SHA512: function(options) {
43524               /**
43525                * Private properties configuration variables. You may need to tweak these to be compatible with
43526                * the server-side, but the defaults work in most cases.
43527                * @see this.setUpperCase() method
43528                * @see this.setPad() method
43529                */
43530               var hexcase = (options && typeof options.uppercase === 'boolean') ? options.uppercase : false,
43531                 /* hexadecimal output case format. false - lowercase; true - uppercase  */
43532                 b64pad = (options && typeof options.pad === 'string') ? options.pad : '=',
43533                 /* base-64 pad character. Default '=' for strict RFC compliance   */
43534                 utf8 = (options && typeof options.utf8 === 'boolean') ? options.utf8 : true,
43535                 /* enable/disable utf8 encoding */
43536                 sha512_k;
43537
43538               /* privileged (public) methods */
43539               this.hex = function(s) {
43540                 return rstr2hex(rstr(s));
43541               };
43542               this.b64 = function(s) {
43543                 return rstr2b64(rstr(s), b64pad);
43544               };
43545               this.any = function(s, e) {
43546                 return rstr2any(rstr(s), e);
43547               };
43548               this.raw = function(s) {
43549                 return rstr(s, utf8);
43550               };
43551               this.hex_hmac = function(k, d) {
43552                 return rstr2hex(rstr_hmac(k, d));
43553               };
43554               this.b64_hmac = function(k, d) {
43555                 return rstr2b64(rstr_hmac(k, d), b64pad);
43556               };
43557               this.any_hmac = function(k, d, e) {
43558                 return rstr2any(rstr_hmac(k, d), e);
43559               };
43560               /**
43561                * Perform a simple self-test to see if the VM is working
43562                * @return {String} Hexadecimal hash sample
43563                * @public
43564                */
43565               this.vm_test = function() {
43566                 return hex('abc').toLowerCase() === '900150983cd24fb0d6963f7d28e17f72';
43567               };
43568               /**
43569                * @description Enable/disable uppercase hexadecimal returned string
43570                * @param {boolean}
43571                * @return {Object} this
43572                * @public
43573                */
43574               this.setUpperCase = function(a) {
43575                 if (typeof a === 'boolean') {
43576                   hexcase = a;
43577                 }
43578                 return this;
43579               };
43580               /**
43581                * @description Defines a base64 pad string
43582                * @param {string} Pad
43583                * @return {Object} this
43584                * @public
43585                */
43586               this.setPad = function(a) {
43587                 b64pad = a || b64pad;
43588                 return this;
43589               };
43590               /**
43591                * @description Defines a base64 pad string
43592                * @param {boolean}
43593                * @return {Object} this
43594                * @public
43595                */
43596               this.setUTF8 = function(a) {
43597                 if (typeof a === 'boolean') {
43598                   utf8 = a;
43599                 }
43600                 return this;
43601               };
43602
43603               /* private methods */
43604
43605               /**
43606                * Calculate the SHA-512 of a raw string
43607                */
43608
43609               function rstr(s) {
43610                 s = (utf8) ? utf8Encode(s) : s;
43611                 return binb2rstr(binb(rstr2binb(s), s.length * 8));
43612               }
43613               /*
43614                * Calculate the HMAC-SHA-512 of a key and some data (raw strings)
43615                */
43616
43617               function rstr_hmac(key, data) {
43618                 key = (utf8) ? utf8Encode(key) : key;
43619                 data = (utf8) ? utf8Encode(data) : data;
43620
43621                 var hash, i = 0,
43622                   bkey = rstr2binb(key),
43623                   ipad = Array(32),
43624                   opad = Array(32);
43625
43626                 if (bkey.length > 32) {
43627                   bkey = binb(bkey, key.length * 8);
43628                 }
43629
43630                 for (; i < 32; i += 1) {
43631                   ipad[i] = bkey[i] ^ 0x36363636;
43632                   opad[i] = bkey[i] ^ 0x5C5C5C5C;
43633                 }
43634
43635                 hash = binb(ipad.concat(rstr2binb(data)), 1024 + data.length * 8);
43636                 return binb2rstr(binb(opad.concat(hash), 1024 + 512));
43637               }
43638
43639               /**
43640                * Calculate the SHA-512 of an array of big-endian dwords, and a bit length
43641                */
43642
43643               function binb(x, len) {
43644                 var j, i, l,
43645                   W = new Array(80),
43646                   hash = new Array(16),
43647                   //Initial hash values
43648                   H = [
43649                     new int64(0x6a09e667, -205731576),
43650                     new int64(-1150833019, -2067093701),
43651                     new int64(0x3c6ef372, -23791573),
43652                     new int64(-1521486534, 0x5f1d36f1),
43653                     new int64(0x510e527f, -1377402159),
43654                     new int64(-1694144372, 0x2b3e6c1f),
43655                     new int64(0x1f83d9ab, -79577749),
43656                     new int64(0x5be0cd19, 0x137e2179)
43657                   ],
43658                   T1 = new int64(0, 0),
43659                   T2 = new int64(0, 0),
43660                   a = new int64(0, 0),
43661                   b = new int64(0, 0),
43662                   c = new int64(0, 0),
43663                   d = new int64(0, 0),
43664                   e = new int64(0, 0),
43665                   f = new int64(0, 0),
43666                   g = new int64(0, 0),
43667                   h = new int64(0, 0),
43668                   //Temporary variables not specified by the document
43669                   s0 = new int64(0, 0),
43670                   s1 = new int64(0, 0),
43671                   Ch = new int64(0, 0),
43672                   Maj = new int64(0, 0),
43673                   r1 = new int64(0, 0),
43674                   r2 = new int64(0, 0),
43675                   r3 = new int64(0, 0);
43676
43677                 if (sha512_k === undefined) {
43678                   //SHA512 constants
43679                   sha512_k = [
43680                     new int64(0x428a2f98, -685199838), new int64(0x71374491, 0x23ef65cd),
43681                     new int64(-1245643825, -330482897), new int64(-373957723, -2121671748),
43682                     new int64(0x3956c25b, -213338824), new int64(0x59f111f1, -1241133031),
43683                     new int64(-1841331548, -1357295717), new int64(-1424204075, -630357736),
43684                     new int64(-670586216, -1560083902), new int64(0x12835b01, 0x45706fbe),
43685                     new int64(0x243185be, 0x4ee4b28c), new int64(0x550c7dc3, -704662302),
43686                     new int64(0x72be5d74, -226784913), new int64(-2132889090, 0x3b1696b1),
43687                     new int64(-1680079193, 0x25c71235), new int64(-1046744716, -815192428),
43688                     new int64(-459576895, -1628353838), new int64(-272742522, 0x384f25e3),
43689                     new int64(0xfc19dc6, -1953704523), new int64(0x240ca1cc, 0x77ac9c65),
43690                     new int64(0x2de92c6f, 0x592b0275), new int64(0x4a7484aa, 0x6ea6e483),
43691                     new int64(0x5cb0a9dc, -1119749164), new int64(0x76f988da, -2096016459),
43692                     new int64(-1740746414, -295247957), new int64(-1473132947, 0x2db43210),
43693                     new int64(-1341970488, -1728372417), new int64(-1084653625, -1091629340),
43694                     new int64(-958395405, 0x3da88fc2), new int64(-710438585, -1828018395),
43695                     new int64(0x6ca6351, -536640913), new int64(0x14292967, 0xa0e6e70),
43696                     new int64(0x27b70a85, 0x46d22ffc), new int64(0x2e1b2138, 0x5c26c926),
43697                     new int64(0x4d2c6dfc, 0x5ac42aed), new int64(0x53380d13, -1651133473),
43698                     new int64(0x650a7354, -1951439906), new int64(0x766a0abb, 0x3c77b2a8),
43699                     new int64(-2117940946, 0x47edaee6), new int64(-1838011259, 0x1482353b),
43700                     new int64(-1564481375, 0x4cf10364), new int64(-1474664885, -1136513023),
43701                     new int64(-1035236496, -789014639), new int64(-949202525, 0x654be30),
43702                     new int64(-778901479, -688958952), new int64(-694614492, 0x5565a910),
43703                     new int64(-200395387, 0x5771202a), new int64(0x106aa070, 0x32bbd1b8),
43704                     new int64(0x19a4c116, -1194143544), new int64(0x1e376c08, 0x5141ab53),
43705                     new int64(0x2748774c, -544281703), new int64(0x34b0bcb5, -509917016),
43706                     new int64(0x391c0cb3, -976659869), new int64(0x4ed8aa4a, -482243893),
43707                     new int64(0x5b9cca4f, 0x7763e373), new int64(0x682e6ff3, -692930397),
43708                     new int64(0x748f82ee, 0x5defb2fc), new int64(0x78a5636f, 0x43172f60),
43709                     new int64(-2067236844, -1578062990), new int64(-1933114872, 0x1a6439ec),
43710                     new int64(-1866530822, 0x23631e28), new int64(-1538233109, -561857047),
43711                     new int64(-1090935817, -1295615723), new int64(-965641998, -479046869),
43712                     new int64(-903397682, -366583396), new int64(-779700025, 0x21c0c207),
43713                     new int64(-354779690, -840897762), new int64(-176337025, -294727304),
43714                     new int64(0x6f067aa, 0x72176fba), new int64(0xa637dc5, -1563912026),
43715                     new int64(0x113f9804, -1090974290), new int64(0x1b710b35, 0x131c471b),
43716                     new int64(0x28db77f5, 0x23047d84), new int64(0x32caab7b, 0x40c72493),
43717                     new int64(0x3c9ebe0a, 0x15c9bebc), new int64(0x431d67c4, -1676669620),
43718                     new int64(0x4cc5d4be, -885112138), new int64(0x597f299c, -60457430),
43719                     new int64(0x5fcb6fab, 0x3ad6faec), new int64(0x6c44198c, 0x4a475817)
43720                   ];
43721                 }
43722
43723                 for (i = 0; i < 80; i += 1) {
43724                   W[i] = new int64(0, 0);
43725                 }
43726
43727                 // append padding to the source string. The format is described in the FIPS.
43728                 x[len >> 5] |= 0x80 << (24 - (len & 0x1f));
43729                 x[((len + 128 >> 10) << 5) + 31] = len;
43730                 l = x.length;
43731                 for (i = 0; i < l; i += 32) { //32 dwords is the block size
43732                   int64copy(a, H[0]);
43733                   int64copy(b, H[1]);
43734                   int64copy(c, H[2]);
43735                   int64copy(d, H[3]);
43736                   int64copy(e, H[4]);
43737                   int64copy(f, H[5]);
43738                   int64copy(g, H[6]);
43739                   int64copy(h, H[7]);
43740
43741                   for (j = 0; j < 16; j += 1) {
43742                     W[j].h = x[i + 2 * j];
43743                     W[j].l = x[i + 2 * j + 1];
43744                   }
43745
43746                   for (j = 16; j < 80; j += 1) {
43747                     //sigma1
43748                     int64rrot(r1, W[j - 2], 19);
43749                     int64revrrot(r2, W[j - 2], 29);
43750                     int64shr(r3, W[j - 2], 6);
43751                     s1.l = r1.l ^ r2.l ^ r3.l;
43752                     s1.h = r1.h ^ r2.h ^ r3.h;
43753                     //sigma0
43754                     int64rrot(r1, W[j - 15], 1);
43755                     int64rrot(r2, W[j - 15], 8);
43756                     int64shr(r3, W[j - 15], 7);
43757                     s0.l = r1.l ^ r2.l ^ r3.l;
43758                     s0.h = r1.h ^ r2.h ^ r3.h;
43759
43760                     int64add4(W[j], s1, W[j - 7], s0, W[j - 16]);
43761                   }
43762
43763                   for (j = 0; j < 80; j += 1) {
43764                     //Ch
43765                     Ch.l = (e.l & f.l) ^ (~e.l & g.l);
43766                     Ch.h = (e.h & f.h) ^ (~e.h & g.h);
43767
43768                     //Sigma1
43769                     int64rrot(r1, e, 14);
43770                     int64rrot(r2, e, 18);
43771                     int64revrrot(r3, e, 9);
43772                     s1.l = r1.l ^ r2.l ^ r3.l;
43773                     s1.h = r1.h ^ r2.h ^ r3.h;
43774
43775                     //Sigma0
43776                     int64rrot(r1, a, 28);
43777                     int64revrrot(r2, a, 2);
43778                     int64revrrot(r3, a, 7);
43779                     s0.l = r1.l ^ r2.l ^ r3.l;
43780                     s0.h = r1.h ^ r2.h ^ r3.h;
43781
43782                     //Maj
43783                     Maj.l = (a.l & b.l) ^ (a.l & c.l) ^ (b.l & c.l);
43784                     Maj.h = (a.h & b.h) ^ (a.h & c.h) ^ (b.h & c.h);
43785
43786                     int64add5(T1, h, s1, Ch, sha512_k[j], W[j]);
43787                     int64add(T2, s0, Maj);
43788
43789                     int64copy(h, g);
43790                     int64copy(g, f);
43791                     int64copy(f, e);
43792                     int64add(e, d, T1);
43793                     int64copy(d, c);
43794                     int64copy(c, b);
43795                     int64copy(b, a);
43796                     int64add(a, T1, T2);
43797                   }
43798                   int64add(H[0], H[0], a);
43799                   int64add(H[1], H[1], b);
43800                   int64add(H[2], H[2], c);
43801                   int64add(H[3], H[3], d);
43802                   int64add(H[4], H[4], e);
43803                   int64add(H[5], H[5], f);
43804                   int64add(H[6], H[6], g);
43805                   int64add(H[7], H[7], h);
43806                 }
43807
43808                 //represent the hash as an array of 32-bit dwords
43809                 for (i = 0; i < 8; i += 1) {
43810                   hash[2 * i] = H[i].h;
43811                   hash[2 * i + 1] = H[i].l;
43812                 }
43813                 return hash;
43814               }
43815
43816               //A constructor for 64-bit numbers
43817
43818               function int64(h, l) {
43819                 this.h = h;
43820                 this.l = l;
43821                 //this.toString = int64toString;
43822               }
43823
43824               //Copies src into dst, assuming both are 64-bit numbers
43825
43826               function int64copy(dst, src) {
43827                 dst.h = src.h;
43828                 dst.l = src.l;
43829               }
43830
43831               //Right-rotates a 64-bit number by shift
43832               //Won't handle cases of shift>=32
43833               //The function revrrot() is for that
43834
43835               function int64rrot(dst, x, shift) {
43836                 dst.l = (x.l >>> shift) | (x.h << (32 - shift));
43837                 dst.h = (x.h >>> shift) | (x.l << (32 - shift));
43838               }
43839
43840               //Reverses the dwords of the source and then rotates right by shift.
43841               //This is equivalent to rotation by 32+shift
43842
43843               function int64revrrot(dst, x, shift) {
43844                 dst.l = (x.h >>> shift) | (x.l << (32 - shift));
43845                 dst.h = (x.l >>> shift) | (x.h << (32 - shift));
43846               }
43847
43848               //Bitwise-shifts right a 64-bit number by shift
43849               //Won't handle shift>=32, but it's never needed in SHA512
43850
43851               function int64shr(dst, x, shift) {
43852                 dst.l = (x.l >>> shift) | (x.h << (32 - shift));
43853                 dst.h = (x.h >>> shift);
43854               }
43855
43856               //Adds two 64-bit numbers
43857               //Like the original implementation, does not rely on 32-bit operations
43858
43859               function int64add(dst, x, y) {
43860                 var w0 = (x.l & 0xffff) + (y.l & 0xffff);
43861                 var w1 = (x.l >>> 16) + (y.l >>> 16) + (w0 >>> 16);
43862                 var w2 = (x.h & 0xffff) + (y.h & 0xffff) + (w1 >>> 16);
43863                 var w3 = (x.h >>> 16) + (y.h >>> 16) + (w2 >>> 16);
43864                 dst.l = (w0 & 0xffff) | (w1 << 16);
43865                 dst.h = (w2 & 0xffff) | (w3 << 16);
43866               }
43867
43868               //Same, except with 4 addends. Works faster than adding them one by one.
43869
43870               function int64add4(dst, a, b, c, d) {
43871                 var w0 = (a.l & 0xffff) + (b.l & 0xffff) + (c.l & 0xffff) + (d.l & 0xffff);
43872                 var w1 = (a.l >>> 16) + (b.l >>> 16) + (c.l >>> 16) + (d.l >>> 16) + (w0 >>> 16);
43873                 var w2 = (a.h & 0xffff) + (b.h & 0xffff) + (c.h & 0xffff) + (d.h & 0xffff) + (w1 >>> 16);
43874                 var w3 = (a.h >>> 16) + (b.h >>> 16) + (c.h >>> 16) + (d.h >>> 16) + (w2 >>> 16);
43875                 dst.l = (w0 & 0xffff) | (w1 << 16);
43876                 dst.h = (w2 & 0xffff) | (w3 << 16);
43877               }
43878
43879               //Same, except with 5 addends
43880
43881               function int64add5(dst, a, b, c, d, e) {
43882                 var w0 = (a.l & 0xffff) + (b.l & 0xffff) + (c.l & 0xffff) + (d.l & 0xffff) + (e.l & 0xffff),
43883                   w1 = (a.l >>> 16) + (b.l >>> 16) + (c.l >>> 16) + (d.l >>> 16) + (e.l >>> 16) + (w0 >>> 16),
43884                   w2 = (a.h & 0xffff) + (b.h & 0xffff) + (c.h & 0xffff) + (d.h & 0xffff) + (e.h & 0xffff) + (w1 >>> 16),
43885                   w3 = (a.h >>> 16) + (b.h >>> 16) + (c.h >>> 16) + (d.h >>> 16) + (e.h >>> 16) + (w2 >>> 16);
43886                 dst.l = (w0 & 0xffff) | (w1 << 16);
43887                 dst.h = (w2 & 0xffff) | (w3 << 16);
43888               }
43889             },
43890             /**
43891              * @class Hashes.RMD160
43892              * @constructor
43893              * @param {Object} [config]
43894              *
43895              * A JavaScript implementation of the RIPEMD-160 Algorithm
43896              * Version 2.2 Copyright Jeremy Lin, Paul Johnston 2000 - 2009.
43897              * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
43898              * See http://pajhome.org.uk/crypt/md5 for details.
43899              * Also http://www.ocf.berkeley.edu/~jjlin/jsotp/
43900              */
43901             RMD160: function(options) {
43902               /**
43903                * Private properties configuration variables. You may need to tweak these to be compatible with
43904                * the server-side, but the defaults work in most cases.
43905                * @see this.setUpperCase() method
43906                * @see this.setPad() method
43907                */
43908               var hexcase = (options && typeof options.uppercase === 'boolean') ? options.uppercase : false,
43909                 /* hexadecimal output case format. false - lowercase; true - uppercase  */
43910                 b64pad = (options && typeof options.pad === 'string') ? options.pa : '=',
43911                 /* base-64 pad character. Default '=' for strict RFC compliance   */
43912                 utf8 = (options && typeof options.utf8 === 'boolean') ? options.utf8 : true,
43913                 /* enable/disable utf8 encoding */
43914                 rmd160_r1 = [
43915                   0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
43916                   7, 4, 13, 1, 10, 6, 15, 3, 12, 0, 9, 5, 2, 14, 11, 8,
43917                   3, 10, 14, 4, 9, 15, 8, 1, 2, 7, 0, 6, 13, 11, 5, 12,
43918                   1, 9, 11, 10, 0, 8, 12, 4, 13, 3, 7, 15, 14, 5, 6, 2,
43919                   4, 0, 5, 9, 7, 12, 2, 10, 14, 1, 3, 8, 11, 6, 15, 13
43920                 ],
43921                 rmd160_r2 = [
43922                   5, 14, 7, 0, 9, 2, 11, 4, 13, 6, 15, 8, 1, 10, 3, 12,
43923                   6, 11, 3, 7, 0, 13, 5, 10, 14, 15, 8, 12, 4, 9, 1, 2,
43924                   15, 5, 1, 3, 7, 14, 6, 9, 11, 8, 12, 2, 10, 0, 4, 13,
43925                   8, 6, 4, 1, 3, 11, 15, 0, 5, 12, 2, 13, 9, 7, 10, 14,
43926                   12, 15, 10, 4, 1, 5, 8, 7, 6, 2, 13, 14, 0, 3, 9, 11
43927                 ],
43928                 rmd160_s1 = [
43929                   11, 14, 15, 12, 5, 8, 7, 9, 11, 13, 14, 15, 6, 7, 9, 8,
43930                   7, 6, 8, 13, 11, 9, 7, 15, 7, 12, 15, 9, 11, 7, 13, 12,
43931                   11, 13, 6, 7, 14, 9, 13, 15, 14, 8, 13, 6, 5, 12, 7, 5,
43932                   11, 12, 14, 15, 14, 15, 9, 8, 9, 14, 5, 6, 8, 6, 5, 12,
43933                   9, 15, 5, 11, 6, 8, 13, 12, 5, 12, 13, 14, 11, 8, 5, 6
43934                 ],
43935                 rmd160_s2 = [
43936                   8, 9, 9, 11, 13, 15, 15, 5, 7, 7, 8, 11, 14, 14, 12, 6,
43937                   9, 13, 15, 7, 12, 8, 9, 11, 7, 7, 12, 7, 6, 15, 13, 11,
43938                   9, 7, 15, 11, 8, 6, 6, 14, 12, 13, 5, 14, 13, 13, 7, 5,
43939                   15, 5, 8, 11, 14, 14, 6, 14, 6, 9, 12, 9, 12, 5, 15, 8,
43940                   8, 5, 12, 9, 12, 5, 14, 6, 8, 13, 6, 5, 15, 13, 11, 11
43941                 ];
43942
43943               /* privileged (public) methods */
43944               this.hex = function(s) {
43945                 return rstr2hex(rstr(s, utf8));
43946               };
43947               this.b64 = function(s) {
43948                 return rstr2b64(rstr(s, utf8), b64pad);
43949               };
43950               this.any = function(s, e) {
43951                 return rstr2any(rstr(s, utf8), e);
43952               };
43953               this.raw = function(s) {
43954                 return rstr(s, utf8);
43955               };
43956               this.hex_hmac = function(k, d) {
43957                 return rstr2hex(rstr_hmac(k, d));
43958               };
43959               this.b64_hmac = function(k, d) {
43960                 return rstr2b64(rstr_hmac(k, d), b64pad);
43961               };
43962               this.any_hmac = function(k, d, e) {
43963                 return rstr2any(rstr_hmac(k, d), e);
43964               };
43965               /**
43966                * Perform a simple self-test to see if the VM is working
43967                * @return {String} Hexadecimal hash sample
43968                * @public
43969                */
43970               this.vm_test = function() {
43971                 return hex('abc').toLowerCase() === '900150983cd24fb0d6963f7d28e17f72';
43972               };
43973               /**
43974                * @description Enable/disable uppercase hexadecimal returned string
43975                * @param {boolean}
43976                * @return {Object} this
43977                * @public
43978                */
43979               this.setUpperCase = function(a) {
43980                 if (typeof a === 'boolean') {
43981                   hexcase = a;
43982                 }
43983                 return this;
43984               };
43985               /**
43986                * @description Defines a base64 pad string
43987                * @param {string} Pad
43988                * @return {Object} this
43989                * @public
43990                */
43991               this.setPad = function(a) {
43992                 if (typeof a !== 'undefined') {
43993                   b64pad = a;
43994                 }
43995                 return this;
43996               };
43997               /**
43998                * @description Defines a base64 pad string
43999                * @param {boolean}
44000                * @return {Object} this
44001                * @public
44002                */
44003               this.setUTF8 = function(a) {
44004                 if (typeof a === 'boolean') {
44005                   utf8 = a;
44006                 }
44007                 return this;
44008               };
44009
44010               /* private methods */
44011
44012               /**
44013                * Calculate the rmd160 of a raw string
44014                */
44015
44016               function rstr(s) {
44017                 s = (utf8) ? utf8Encode(s) : s;
44018                 return binl2rstr(binl(rstr2binl(s), s.length * 8));
44019               }
44020
44021               /**
44022                * Calculate the HMAC-rmd160 of a key and some data (raw strings)
44023                */
44024
44025               function rstr_hmac(key, data) {
44026                 key = (utf8) ? utf8Encode(key) : key;
44027                 data = (utf8) ? utf8Encode(data) : data;
44028                 var i, hash,
44029                   bkey = rstr2binl(key),
44030                   ipad = Array(16),
44031                   opad = Array(16);
44032
44033                 if (bkey.length > 16) {
44034                   bkey = binl(bkey, key.length * 8);
44035                 }
44036
44037                 for (i = 0; i < 16; i += 1) {
44038                   ipad[i] = bkey[i] ^ 0x36363636;
44039                   opad[i] = bkey[i] ^ 0x5C5C5C5C;
44040                 }
44041                 hash = binl(ipad.concat(rstr2binl(data)), 512 + data.length * 8);
44042                 return binl2rstr(binl(opad.concat(hash), 512 + 160));
44043               }
44044
44045               /**
44046                * Convert an array of little-endian words to a string
44047                */
44048
44049               function binl2rstr(input) {
44050                 var i, output = '',
44051                   l = input.length * 32;
44052                 for (i = 0; i < l; i += 8) {
44053                   output += String.fromCharCode((input[i >> 5] >>> (i % 32)) & 0xFF);
44054                 }
44055                 return output;
44056               }
44057
44058               /**
44059                * Calculate the RIPE-MD160 of an array of little-endian words, and a bit length.
44060                */
44061
44062               function binl(x, len) {
44063                 var T, j, i, l,
44064                   h0 = 0x67452301,
44065                   h1 = 0xefcdab89,
44066                   h2 = 0x98badcfe,
44067                   h3 = 0x10325476,
44068                   h4 = 0xc3d2e1f0,
44069                   A1, B1, C1, D1, E1,
44070                   A2, B2, C2, D2, E2;
44071
44072                 /* append padding */
44073                 x[len >> 5] |= 0x80 << (len % 32);
44074                 x[(((len + 64) >>> 9) << 4) + 14] = len;
44075                 l = x.length;
44076
44077                 for (i = 0; i < l; i += 16) {
44078                   A1 = A2 = h0;
44079                   B1 = B2 = h1;
44080                   C1 = C2 = h2;
44081                   D1 = D2 = h3;
44082                   E1 = E2 = h4;
44083                   for (j = 0; j <= 79; j += 1) {
44084                     T = safe_add(A1, rmd160_f(j, B1, C1, D1));
44085                     T = safe_add(T, x[i + rmd160_r1[j]]);
44086                     T = safe_add(T, rmd160_K1(j));
44087                     T = safe_add(bit_rol(T, rmd160_s1[j]), E1);
44088                     A1 = E1;
44089                     E1 = D1;
44090                     D1 = bit_rol(C1, 10);
44091                     C1 = B1;
44092                     B1 = T;
44093                     T = safe_add(A2, rmd160_f(79 - j, B2, C2, D2));
44094                     T = safe_add(T, x[i + rmd160_r2[j]]);
44095                     T = safe_add(T, rmd160_K2(j));
44096                     T = safe_add(bit_rol(T, rmd160_s2[j]), E2);
44097                     A2 = E2;
44098                     E2 = D2;
44099                     D2 = bit_rol(C2, 10);
44100                     C2 = B2;
44101                     B2 = T;
44102                   }
44103
44104                   T = safe_add(h1, safe_add(C1, D2));
44105                   h1 = safe_add(h2, safe_add(D1, E2));
44106                   h2 = safe_add(h3, safe_add(E1, A2));
44107                   h3 = safe_add(h4, safe_add(A1, B2));
44108                   h4 = safe_add(h0, safe_add(B1, C2));
44109                   h0 = T;
44110                 }
44111                 return [h0, h1, h2, h3, h4];
44112               }
44113
44114               // specific algorithm methods
44115
44116               function rmd160_f(j, x, y, z) {
44117                 return (0 <= j && j <= 15) ? (x ^ y ^ z) :
44118                   (16 <= j && j <= 31) ? (x & y) | (~x & z) :
44119                   (32 <= j && j <= 47) ? (x | ~y) ^ z :
44120                   (48 <= j && j <= 63) ? (x & z) | (y & ~z) :
44121                   (64 <= j && j <= 79) ? x ^ (y | ~z) :
44122                   'rmd160_f: j out of range';
44123               }
44124
44125               function rmd160_K1(j) {
44126                 return (0 <= j && j <= 15) ? 0x00000000 :
44127                   (16 <= j && j <= 31) ? 0x5a827999 :
44128                   (32 <= j && j <= 47) ? 0x6ed9eba1 :
44129                   (48 <= j && j <= 63) ? 0x8f1bbcdc :
44130                   (64 <= j && j <= 79) ? 0xa953fd4e :
44131                   'rmd160_K1: j out of range';
44132               }
44133
44134               function rmd160_K2(j) {
44135                 return (0 <= j && j <= 15) ? 0x50a28be6 :
44136                   (16 <= j && j <= 31) ? 0x5c4dd124 :
44137                   (32 <= j && j <= 47) ? 0x6d703ef3 :
44138                   (48 <= j && j <= 63) ? 0x7a6d76e9 :
44139                   (64 <= j && j <= 79) ? 0x00000000 :
44140                   'rmd160_K2: j out of range';
44141               }
44142             }
44143           };
44144
44145           // exposes Hashes
44146           (function(window, undefined$1) {
44147             var freeExports = false;
44148             {
44149               freeExports = exports;
44150               if (exports && typeof commonjsGlobal === 'object' && commonjsGlobal && commonjsGlobal === commonjsGlobal.global) {
44151                 window = commonjsGlobal;
44152               }
44153             }
44154
44155             if (typeof undefined$1 === 'function' && typeof undefined$1.amd === 'object' && undefined$1.amd) {
44156               // define as an anonymous module, so, through path mapping, it can be aliased
44157               undefined$1(function() {
44158                 return Hashes;
44159               });
44160             } else if (freeExports) {
44161               // in Node.js or RingoJS v0.8.0+
44162               if (module && module.exports === freeExports) {
44163                 module.exports = Hashes;
44164               }
44165               // in Narwhal or RingoJS v0.7.0-
44166               else {
44167                 freeExports.Hashes = Hashes;
44168               }
44169             } else {
44170               // in a browser or Rhino
44171               window.Hashes = Hashes;
44172             }
44173           }(this));
44174         }()); // IIFE
44175         });
44176
44177         var immutable = extend$2;
44178
44179         var hasOwnProperty$2 = Object.prototype.hasOwnProperty;
44180
44181         function extend$2() {
44182             var target = {};
44183
44184             for (var i = 0; i < arguments.length; i++) {
44185                 var source = arguments[i];
44186
44187                 for (var key in source) {
44188                     if (hasOwnProperty$2.call(source, key)) {
44189                         target[key] = source[key];
44190                     }
44191                 }
44192             }
44193
44194             return target
44195         }
44196
44197         var sha1 = new hashes.SHA1();
44198
44199         var ohauth = {};
44200
44201         ohauth.qsString = function(obj) {
44202             return Object.keys(obj).sort().map(function(key) {
44203                 return ohauth.percentEncode(key) + '=' +
44204                     ohauth.percentEncode(obj[key]);
44205             }).join('&');
44206         };
44207
44208         ohauth.stringQs = function(str) {
44209             return str.split('&').filter(function (pair) {
44210                 return pair !== '';
44211             }).reduce(function(obj, pair){
44212                 var parts = pair.split('=');
44213                 obj[decodeURIComponent(parts[0])] = (null === parts[1]) ?
44214                     '' : decodeURIComponent(parts[1]);
44215                 return obj;
44216             }, {});
44217         };
44218
44219         ohauth.rawxhr = function(method, url, data, headers, callback) {
44220             var xhr = new XMLHttpRequest(),
44221                 twoHundred = /^20\d$/;
44222             xhr.onreadystatechange = function() {
44223                 if (4 === xhr.readyState && 0 !== xhr.status) {
44224                     if (twoHundred.test(xhr.status)) callback(null, xhr);
44225                     else return callback(xhr, null);
44226                 }
44227             };
44228             xhr.onerror = function(e) { return callback(e, null); };
44229             xhr.open(method, url, true);
44230             for (var h in headers) xhr.setRequestHeader(h, headers[h]);
44231             xhr.send(data);
44232             return xhr;
44233         };
44234
44235         ohauth.xhr = function(method, url, auth, data, options, callback) {
44236             var headers = (options && options.header) || {
44237                 'Content-Type': 'application/x-www-form-urlencoded'
44238             };
44239             headers.Authorization = 'OAuth ' + ohauth.authHeader(auth);
44240             return ohauth.rawxhr(method, url, data, headers, callback);
44241         };
44242
44243         ohauth.nonce = function() {
44244             for (var o = ''; o.length < 6;) {
44245                 o += '0123456789ABCDEFGHIJKLMNOPQRSTUVWXTZabcdefghiklmnopqrstuvwxyz'[Math.floor(Math.random() * 61)];
44246             }
44247             return o;
44248         };
44249
44250         ohauth.authHeader = function(obj) {
44251             return Object.keys(obj).sort().map(function(key) {
44252                 return encodeURIComponent(key) + '="' + encodeURIComponent(obj[key]) + '"';
44253             }).join(', ');
44254         };
44255
44256         ohauth.timestamp = function() { return ~~((+new Date()) / 1000); };
44257
44258         ohauth.percentEncode = function(s) {
44259             return encodeURIComponent(s)
44260                 .replace(/\!/g, '%21').replace(/\'/g, '%27')
44261                 .replace(/\*/g, '%2A').replace(/\(/g, '%28').replace(/\)/g, '%29');
44262         };
44263
44264         ohauth.baseString = function(method, url, params) {
44265             if (params.oauth_signature) delete params.oauth_signature;
44266             return [
44267                 method,
44268                 ohauth.percentEncode(url),
44269                 ohauth.percentEncode(ohauth.qsString(params))].join('&');
44270         };
44271
44272         ohauth.signature = function(oauth_secret, token_secret, baseString) {
44273             return sha1.b64_hmac(
44274                 ohauth.percentEncode(oauth_secret) + '&' +
44275                 ohauth.percentEncode(token_secret),
44276                 baseString);
44277         };
44278
44279         /**
44280          * Takes an options object for configuration (consumer_key,
44281          * consumer_secret, version, signature_method, token, token_secret)
44282          * and returns a function that generates the Authorization header
44283          * for given data.
44284          *
44285          * The returned function takes these parameters:
44286          * - method: GET/POST/...
44287          * - uri: full URI with protocol, port, path and query string
44288          * - extra_params: any extra parameters (that are passed in the POST data),
44289          *   can be an object or a from-urlencoded string.
44290          *
44291          * Returned function returns full OAuth header with "OAuth" string in it.
44292          */
44293
44294         ohauth.headerGenerator = function(options) {
44295             options = options || {};
44296             var consumer_key = options.consumer_key || '',
44297                 consumer_secret = options.consumer_secret || '',
44298                 signature_method = options.signature_method || 'HMAC-SHA1',
44299                 version = options.version || '1.0',
44300                 token = options.token || '',
44301                 token_secret = options.token_secret || '';
44302
44303             return function(method, uri, extra_params) {
44304                 method = method.toUpperCase();
44305                 if (typeof extra_params === 'string' && extra_params.length > 0) {
44306                     extra_params = ohauth.stringQs(extra_params);
44307                 }
44308
44309                 var uri_parts = uri.split('?', 2),
44310                 base_uri = uri_parts[0];
44311
44312                 var query_params = uri_parts.length === 2 ?
44313                     ohauth.stringQs(uri_parts[1]) : {};
44314
44315                 var oauth_params = {
44316                     oauth_consumer_key: consumer_key,
44317                     oauth_signature_method: signature_method,
44318                     oauth_version: version,
44319                     oauth_timestamp: ohauth.timestamp(),
44320                     oauth_nonce: ohauth.nonce()
44321                 };
44322
44323                 if (token) oauth_params.oauth_token = token;
44324
44325                 var all_params = immutable({}, oauth_params, query_params, extra_params),
44326                     base_str = ohauth.baseString(method, base_uri, all_params);
44327
44328                 oauth_params.oauth_signature = ohauth.signature(consumer_secret, token_secret, base_str);
44329
44330                 return 'OAuth ' + ohauth.authHeader(oauth_params);
44331             };
44332         };
44333
44334         var ohauth_1 = ohauth;
44335
44336         var resolveUrl = createCommonjsModule(function (module, exports) {
44337         // Copyright 2014 Simon Lydell
44338         // X11 (“MIT”) Licensed. (See LICENSE.)
44339
44340         void (function(root, factory) {
44341           {
44342             module.exports = factory();
44343           }
44344         }(commonjsGlobal, function() {
44345
44346           function resolveUrl(/* ...urls */) {
44347             var numUrls = arguments.length;
44348
44349             if (numUrls === 0) {
44350               throw new Error("resolveUrl requires at least one argument; got none.")
44351             }
44352
44353             var base = document.createElement("base");
44354             base.href = arguments[0];
44355
44356             if (numUrls === 1) {
44357               return base.href
44358             }
44359
44360             var head = document.getElementsByTagName("head")[0];
44361             head.insertBefore(base, head.firstChild);
44362
44363             var a = document.createElement("a");
44364             var resolved;
44365
44366             for (var index = 1; index < numUrls; index++) {
44367               a.href = arguments[index];
44368               resolved = a.href;
44369               base.href = resolved;
44370             }
44371
44372             head.removeChild(base);
44373
44374             return resolved
44375           }
44376
44377           return resolveUrl
44378
44379         }));
44380         });
44381
44382         var assign$2 = make_assign();
44383         var create$7 = make_create();
44384         var trim$1 = make_trim();
44385         var Global = (typeof window !== 'undefined' ? window : commonjsGlobal);
44386
44387         var util = {
44388                 assign: assign$2,
44389                 create: create$7,
44390                 trim: trim$1,
44391                 bind: bind$3,
44392                 slice: slice$b,
44393                 each: each,
44394                 map: map$5,
44395                 pluck: pluck,
44396                 isList: isList,
44397                 isFunction: isFunction$2,
44398                 isObject: isObject$2,
44399                 Global: Global
44400         };
44401
44402         function make_assign() {
44403                 if (Object.assign) {
44404                         return Object.assign
44405                 } else {
44406                         return function shimAssign(obj, props1, props2, etc) {
44407                                 for (var i = 1; i < arguments.length; i++) {
44408                                         each(Object(arguments[i]), function(val, key) {
44409                                                 obj[key] = val;
44410                                         });
44411                                 }                       
44412                                 return obj
44413                         }
44414                 }
44415         }
44416
44417         function make_create() {
44418                 if (Object.create) {
44419                         return function create(obj, assignProps1, assignProps2, etc) {
44420                                 var assignArgsList = slice$b(arguments, 1);
44421                                 return assign$2.apply(this, [Object.create(obj)].concat(assignArgsList))
44422                         }
44423                 } else {
44424                         function F() {} // eslint-disable-line no-inner-declarations
44425                         return function create(obj, assignProps1, assignProps2, etc) {
44426                                 var assignArgsList = slice$b(arguments, 1);
44427                                 F.prototype = obj;
44428                                 return assign$2.apply(this, [new F()].concat(assignArgsList))
44429                         }
44430                 }
44431         }
44432
44433         function make_trim() {
44434                 if (String.prototype.trim) {
44435                         return function trim(str) {
44436                                 return String.prototype.trim.call(str)
44437                         }
44438                 } else {
44439                         return function trim(str) {
44440                                 return str.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, '')
44441                         }
44442                 }
44443         }
44444
44445         function bind$3(obj, fn) {
44446                 return function() {
44447                         return fn.apply(obj, Array.prototype.slice.call(arguments, 0))
44448                 }
44449         }
44450
44451         function slice$b(arr, index) {
44452                 return Array.prototype.slice.call(arr, index || 0)
44453         }
44454
44455         function each(obj, fn) {
44456                 pluck(obj, function(val, key) {
44457                         fn(val, key);
44458                         return false
44459                 });
44460         }
44461
44462         function map$5(obj, fn) {
44463                 var res = (isList(obj) ? [] : {});
44464                 pluck(obj, function(v, k) {
44465                         res[k] = fn(v, k);
44466                         return false
44467                 });
44468                 return res
44469         }
44470
44471         function pluck(obj, fn) {
44472                 if (isList(obj)) {
44473                         for (var i=0; i<obj.length; i++) {
44474                                 if (fn(obj[i], i)) {
44475                                         return obj[i]
44476                                 }
44477                         }
44478                 } else {
44479                         for (var key in obj) {
44480                                 if (obj.hasOwnProperty(key)) {
44481                                         if (fn(obj[key], key)) {
44482                                                 return obj[key]
44483                                         }
44484                                 }
44485                         }
44486                 }
44487         }
44488
44489         function isList(val) {
44490                 return (val != null && typeof val != 'function' && typeof val.length == 'number')
44491         }
44492
44493         function isFunction$2(val) {
44494                 return val && {}.toString.call(val) === '[object Function]'
44495         }
44496
44497         function isObject$2(val) {
44498                 return val && {}.toString.call(val) === '[object Object]'
44499         }
44500
44501         var slice$c = util.slice;
44502         var pluck$1 = util.pluck;
44503         var each$1 = util.each;
44504         var bind$4 = util.bind;
44505         var create$8 = util.create;
44506         var isList$1 = util.isList;
44507         var isFunction$3 = util.isFunction;
44508         var isObject$3 = util.isObject;
44509
44510         var storeEngine = {
44511                 createStore: createStore
44512         };
44513
44514         var storeAPI = {
44515                 version: '2.0.12',
44516                 enabled: false,
44517                 
44518                 // get returns the value of the given key. If that value
44519                 // is undefined, it returns optionalDefaultValue instead.
44520                 get: function(key, optionalDefaultValue) {
44521                         var data = this.storage.read(this._namespacePrefix + key);
44522                         return this._deserialize(data, optionalDefaultValue)
44523                 },
44524
44525                 // set will store the given value at key and returns value.
44526                 // Calling set with value === undefined is equivalent to calling remove.
44527                 set: function(key, value) {
44528                         if (value === undefined) {
44529                                 return this.remove(key)
44530                         }
44531                         this.storage.write(this._namespacePrefix + key, this._serialize(value));
44532                         return value
44533                 },
44534
44535                 // remove deletes the key and value stored at the given key.
44536                 remove: function(key) {
44537                         this.storage.remove(this._namespacePrefix + key);
44538                 },
44539
44540                 // each will call the given callback once for each key-value pair
44541                 // in this store.
44542                 each: function(callback) {
44543                         var self = this;
44544                         this.storage.each(function(val, namespacedKey) {
44545                                 callback.call(self, self._deserialize(val), (namespacedKey || '').replace(self._namespaceRegexp, ''));
44546                         });
44547                 },
44548
44549                 // clearAll will remove all the stored key-value pairs in this store.
44550                 clearAll: function() {
44551                         this.storage.clearAll();
44552                 },
44553
44554                 // additional functionality that can't live in plugins
44555                 // ---------------------------------------------------
44556
44557                 // hasNamespace returns true if this store instance has the given namespace.
44558                 hasNamespace: function(namespace) {
44559                         return (this._namespacePrefix == '__storejs_'+namespace+'_')
44560                 },
44561
44562                 // createStore creates a store.js instance with the first
44563                 // functioning storage in the list of storage candidates,
44564                 // and applies the the given mixins to the instance.
44565                 createStore: function() {
44566                         return createStore.apply(this, arguments)
44567                 },
44568                 
44569                 addPlugin: function(plugin) {
44570                         this._addPlugin(plugin);
44571                 },
44572                 
44573                 namespace: function(namespace) {
44574                         return createStore(this.storage, this.plugins, namespace)
44575                 }
44576         };
44577
44578         function _warn() {
44579                 var _console = (typeof console == 'undefined' ? null : console);
44580                 if (!_console) { return }
44581                 var fn = (_console.warn ? _console.warn : _console.log);
44582                 fn.apply(_console, arguments);
44583         }
44584
44585         function createStore(storages, plugins, namespace) {
44586                 if (!namespace) {
44587                         namespace = '';
44588                 }
44589                 if (storages && !isList$1(storages)) {
44590                         storages = [storages];
44591                 }
44592                 if (plugins && !isList$1(plugins)) {
44593                         plugins = [plugins];
44594                 }
44595
44596                 var namespacePrefix = (namespace ? '__storejs_'+namespace+'_' : '');
44597                 var namespaceRegexp = (namespace ? new RegExp('^'+namespacePrefix) : null);
44598                 var legalNamespaces = /^[a-zA-Z0-9_\-]*$/; // alpha-numeric + underscore and dash
44599                 if (!legalNamespaces.test(namespace)) {
44600                         throw new Error('store.js namespaces can only have alphanumerics + underscores and dashes')
44601                 }
44602                 
44603                 var _privateStoreProps = {
44604                         _namespacePrefix: namespacePrefix,
44605                         _namespaceRegexp: namespaceRegexp,
44606
44607                         _testStorage: function(storage) {
44608                                 try {
44609                                         var testStr = '__storejs__test__';
44610                                         storage.write(testStr, testStr);
44611                                         var ok = (storage.read(testStr) === testStr);
44612                                         storage.remove(testStr);
44613                                         return ok
44614                                 } catch(e) {
44615                                         return false
44616                                 }
44617                         },
44618
44619                         _assignPluginFnProp: function(pluginFnProp, propName) {
44620                                 var oldFn = this[propName];
44621                                 this[propName] = function pluginFn() {
44622                                         var args = slice$c(arguments, 0);
44623                                         var self = this;
44624
44625                                         // super_fn calls the old function which was overwritten by
44626                                         // this mixin.
44627                                         function super_fn() {
44628                                                 if (!oldFn) { return }
44629                                                 each$1(arguments, function(arg, i) {
44630                                                         args[i] = arg;
44631                                                 });
44632                                                 return oldFn.apply(self, args)
44633                                         }
44634
44635                                         // Give mixing function access to super_fn by prefixing all mixin function
44636                                         // arguments with super_fn.
44637                                         var newFnArgs = [super_fn].concat(args);
44638
44639                                         return pluginFnProp.apply(self, newFnArgs)
44640                                 };
44641                         },
44642
44643                         _serialize: function(obj) {
44644                                 return JSON.stringify(obj)
44645                         },
44646
44647                         _deserialize: function(strVal, defaultVal) {
44648                                 if (!strVal) { return defaultVal }
44649                                 // It is possible that a raw string value has been previously stored
44650                                 // in a storage without using store.js, meaning it will be a raw
44651                                 // string value instead of a JSON serialized string. By defaulting
44652                                 // to the raw string value in case of a JSON parse error, we allow
44653                                 // for past stored values to be forwards-compatible with store.js
44654                                 var val = '';
44655                                 try { val = JSON.parse(strVal); }
44656                                 catch(e) { val = strVal; }
44657
44658                                 return (val !== undefined ? val : defaultVal)
44659                         },
44660                         
44661                         _addStorage: function(storage) {
44662                                 if (this.enabled) { return }
44663                                 if (this._testStorage(storage)) {
44664                                         this.storage = storage;
44665                                         this.enabled = true;
44666                                 }
44667                         },
44668
44669                         _addPlugin: function(plugin) {
44670                                 var self = this;
44671
44672                                 // If the plugin is an array, then add all plugins in the array.
44673                                 // This allows for a plugin to depend on other plugins.
44674                                 if (isList$1(plugin)) {
44675                                         each$1(plugin, function(plugin) {
44676                                                 self._addPlugin(plugin);
44677                                         });
44678                                         return
44679                                 }
44680
44681                                 // Keep track of all plugins we've seen so far, so that we
44682                                 // don't add any of them twice.
44683                                 var seenPlugin = pluck$1(this.plugins, function(seenPlugin) {
44684                                         return (plugin === seenPlugin)
44685                                 });
44686                                 if (seenPlugin) {
44687                                         return
44688                                 }
44689                                 this.plugins.push(plugin);
44690
44691                                 // Check that the plugin is properly formed
44692                                 if (!isFunction$3(plugin)) {
44693                                         throw new Error('Plugins must be function values that return objects')
44694                                 }
44695
44696                                 var pluginProperties = plugin.call(this);
44697                                 if (!isObject$3(pluginProperties)) {
44698                                         throw new Error('Plugins must return an object of function properties')
44699                                 }
44700
44701                                 // Add the plugin function properties to this store instance.
44702                                 each$1(pluginProperties, function(pluginFnProp, propName) {
44703                                         if (!isFunction$3(pluginFnProp)) {
44704                                                 throw new Error('Bad plugin property: '+propName+' from plugin '+plugin.name+'. Plugins should only return functions.')
44705                                         }
44706                                         self._assignPluginFnProp(pluginFnProp, propName);
44707                                 });
44708                         },
44709                         
44710                         // Put deprecated properties in the private API, so as to not expose it to accidential
44711                         // discovery through inspection of the store object.
44712                         
44713                         // Deprecated: addStorage
44714                         addStorage: function(storage) {
44715                                 _warn('store.addStorage(storage) is deprecated. Use createStore([storages])');
44716                                 this._addStorage(storage);
44717                         }
44718                 };
44719
44720                 var store = create$8(_privateStoreProps, storeAPI, {
44721                         plugins: []
44722                 });
44723                 store.raw = {};
44724                 each$1(store, function(prop, propName) {
44725                         if (isFunction$3(prop)) {
44726                                 store.raw[propName] = bind$4(store, prop);                      
44727                         }
44728                 });
44729                 each$1(storages, function(storage) {
44730                         store._addStorage(storage);
44731                 });
44732                 each$1(plugins, function(plugin) {
44733                         store._addPlugin(plugin);
44734                 });
44735                 return store
44736         }
44737
44738         var Global$1 = util.Global;
44739
44740         var localStorage_1 = {
44741                 name: 'localStorage',
44742                 read: read,
44743                 write: write,
44744                 each: each$2,
44745                 remove: remove$2,
44746                 clearAll: clearAll,
44747         };
44748
44749         function localStorage$1() {
44750                 return Global$1.localStorage
44751         }
44752
44753         function read(key) {
44754                 return localStorage$1().getItem(key)
44755         }
44756
44757         function write(key, data) {
44758                 return localStorage$1().setItem(key, data)
44759         }
44760
44761         function each$2(fn) {
44762                 for (var i = localStorage$1().length - 1; i >= 0; i--) {
44763                         var key = localStorage$1().key(i);
44764                         fn(read(key), key);
44765                 }
44766         }
44767
44768         function remove$2(key) {
44769                 return localStorage$1().removeItem(key)
44770         }
44771
44772         function clearAll() {
44773                 return localStorage$1().clear()
44774         }
44775
44776         // oldFF-globalStorage provides storage for Firefox
44777         // versions 6 and 7, where no localStorage, etc
44778         // is available.
44779
44780
44781         var Global$2 = util.Global;
44782
44783         var oldFFGlobalStorage = {
44784                 name: 'oldFF-globalStorage',
44785                 read: read$1,
44786                 write: write$1,
44787                 each: each$3,
44788                 remove: remove$3,
44789                 clearAll: clearAll$1,
44790         };
44791
44792         var globalStorage = Global$2.globalStorage;
44793
44794         function read$1(key) {
44795                 return globalStorage[key]
44796         }
44797
44798         function write$1(key, data) {
44799                 globalStorage[key] = data;
44800         }
44801
44802         function each$3(fn) {
44803                 for (var i = globalStorage.length - 1; i >= 0; i--) {
44804                         var key = globalStorage.key(i);
44805                         fn(globalStorage[key], key);
44806                 }
44807         }
44808
44809         function remove$3(key) {
44810                 return globalStorage.removeItem(key)
44811         }
44812
44813         function clearAll$1() {
44814                 each$3(function(key, _) {
44815                         delete globalStorage[key];
44816                 });
44817         }
44818
44819         // oldIE-userDataStorage provides storage for Internet Explorer
44820         // versions 6 and 7, where no localStorage, sessionStorage, etc
44821         // is available.
44822
44823
44824         var Global$3 = util.Global;
44825
44826         var oldIEUserDataStorage = {
44827                 name: 'oldIE-userDataStorage',
44828                 write: write$2,
44829                 read: read$2,
44830                 each: each$4,
44831                 remove: remove$4,
44832                 clearAll: clearAll$2,
44833         };
44834
44835         var storageName = 'storejs';
44836         var doc = Global$3.document;
44837         var _withStorageEl = _makeIEStorageElFunction();
44838         var disable = (Global$3.navigator ? Global$3.navigator.userAgent : '').match(/ (MSIE 8|MSIE 9|MSIE 10)\./); // MSIE 9.x, MSIE 10.x
44839
44840         function write$2(unfixedKey, data) {
44841                 if (disable) { return }
44842                 var fixedKey = fixKey(unfixedKey);
44843                 _withStorageEl(function(storageEl) {
44844                         storageEl.setAttribute(fixedKey, data);
44845                         storageEl.save(storageName);
44846                 });
44847         }
44848
44849         function read$2(unfixedKey) {
44850                 if (disable) { return }
44851                 var fixedKey = fixKey(unfixedKey);
44852                 var res = null;
44853                 _withStorageEl(function(storageEl) {
44854                         res = storageEl.getAttribute(fixedKey);
44855                 });
44856                 return res
44857         }
44858
44859         function each$4(callback) {
44860                 _withStorageEl(function(storageEl) {
44861                         var attributes = storageEl.XMLDocument.documentElement.attributes;
44862                         for (var i=attributes.length-1; i>=0; i--) {
44863                                 var attr = attributes[i];
44864                                 callback(storageEl.getAttribute(attr.name), attr.name);
44865                         }
44866                 });
44867         }
44868
44869         function remove$4(unfixedKey) {
44870                 var fixedKey = fixKey(unfixedKey);
44871                 _withStorageEl(function(storageEl) {
44872                         storageEl.removeAttribute(fixedKey);
44873                         storageEl.save(storageName);
44874                 });
44875         }
44876
44877         function clearAll$2() {
44878                 _withStorageEl(function(storageEl) {
44879                         var attributes = storageEl.XMLDocument.documentElement.attributes;
44880                         storageEl.load(storageName);
44881                         for (var i=attributes.length-1; i>=0; i--) {
44882                                 storageEl.removeAttribute(attributes[i].name);
44883                         }
44884                         storageEl.save(storageName);
44885                 });
44886         }
44887
44888         // Helpers
44889         //////////
44890
44891         // In IE7, keys cannot start with a digit or contain certain chars.
44892         // See https://github.com/marcuswestin/store.js/issues/40
44893         // See https://github.com/marcuswestin/store.js/issues/83
44894         var forbiddenCharsRegex = new RegExp("[!\"#$%&'()*+,/\\\\:;<=>?@[\\]^`{|}~]", "g");
44895         function fixKey(key) {
44896                 return key.replace(/^\d/, '___$&').replace(forbiddenCharsRegex, '___')
44897         }
44898
44899         function _makeIEStorageElFunction() {
44900                 if (!doc || !doc.documentElement || !doc.documentElement.addBehavior) {
44901                         return null
44902                 }
44903                 var scriptTag = 'script',
44904                         storageOwner,
44905                         storageContainer,
44906                         storageEl;
44907
44908                 // Since #userData storage applies only to specific paths, we need to
44909                 // somehow link our data to a specific path.  We choose /favicon.ico
44910                 // as a pretty safe option, since all browsers already make a request to
44911                 // this URL anyway and being a 404 will not hurt us here.  We wrap an
44912                 // iframe pointing to the favicon in an ActiveXObject(htmlfile) object
44913                 // (see: http://msdn.microsoft.com/en-us/library/aa752574(v=VS.85).aspx)
44914                 // since the iframe access rules appear to allow direct access and
44915                 // manipulation of the document element, even for a 404 page.  This
44916                 // document can be used instead of the current document (which would
44917                 // have been limited to the current path) to perform #userData storage.
44918                 try {
44919                         /* global ActiveXObject */
44920                         storageContainer = new ActiveXObject('htmlfile');
44921                         storageContainer.open();
44922                         storageContainer.write('<'+scriptTag+'>document.w=window</'+scriptTag+'><iframe src="/favicon.ico"></iframe>');
44923                         storageContainer.close();
44924                         storageOwner = storageContainer.w.frames[0].document;
44925                         storageEl = storageOwner.createElement('div');
44926                 } catch(e) {
44927                         // somehow ActiveXObject instantiation failed (perhaps some special
44928                         // security settings or otherwse), fall back to per-path storage
44929                         storageEl = doc.createElement('div');
44930                         storageOwner = doc.body;
44931                 }
44932
44933                 return function(storeFunction) {
44934                         var args = [].slice.call(arguments, 0);
44935                         args.unshift(storageEl);
44936                         // See http://msdn.microsoft.com/en-us/library/ms531081(v=VS.85).aspx
44937                         // and http://msdn.microsoft.com/en-us/library/ms531424(v=VS.85).aspx
44938                         storageOwner.appendChild(storageEl);
44939                         storageEl.addBehavior('#default#userData');
44940                         storageEl.load(storageName);
44941                         storeFunction.apply(this, args);
44942                         storageOwner.removeChild(storageEl);
44943                         return
44944                 }
44945         }
44946
44947         // cookieStorage is useful Safari private browser mode, where localStorage
44948         // doesn't work but cookies do. This implementation is adopted from
44949         // https://developer.mozilla.org/en-US/docs/Web/API/Storage/LocalStorage
44950
44951
44952         var Global$4 = util.Global;
44953         var trim$2 = util.trim;
44954
44955         var cookieStorage = {
44956                 name: 'cookieStorage',
44957                 read: read$3,
44958                 write: write$3,
44959                 each: each$5,
44960                 remove: remove$5,
44961                 clearAll: clearAll$3,
44962         };
44963
44964         var doc$1 = Global$4.document;
44965
44966         function read$3(key) {
44967                 if (!key || !_has(key)) { return null }
44968                 var regexpStr = "(?:^|.*;\\s*)" +
44969                         escape(key).replace(/[\-\.\+\*]/g, "\\$&") +
44970                         "\\s*\\=\\s*((?:[^;](?!;))*[^;]?).*";
44971                 return unescape(doc$1.cookie.replace(new RegExp(regexpStr), "$1"))
44972         }
44973
44974         function each$5(callback) {
44975                 var cookies = doc$1.cookie.split(/; ?/g);
44976                 for (var i = cookies.length - 1; i >= 0; i--) {
44977                         if (!trim$2(cookies[i])) {
44978                                 continue
44979                         }
44980                         var kvp = cookies[i].split('=');
44981                         var key = unescape(kvp[0]);
44982                         var val = unescape(kvp[1]);
44983                         callback(val, key);
44984                 }
44985         }
44986
44987         function write$3(key, data) {
44988                 if(!key) { return }
44989                 doc$1.cookie = escape(key) + "=" + escape(data) + "; expires=Tue, 19 Jan 2038 03:14:07 GMT; path=/";
44990         }
44991
44992         function remove$5(key) {
44993                 if (!key || !_has(key)) {
44994                         return
44995                 }
44996                 doc$1.cookie = escape(key) + "=; expires=Thu, 01 Jan 1970 00:00:00 GMT; path=/";
44997         }
44998
44999         function clearAll$3() {
45000                 each$5(function(_, key) {
45001                         remove$5(key);
45002                 });
45003         }
45004
45005         function _has(key) {
45006                 return (new RegExp("(?:^|;\\s*)" + escape(key).replace(/[\-\.\+\*]/g, "\\$&") + "\\s*\\=")).test(doc$1.cookie)
45007         }
45008
45009         var Global$5 = util.Global;
45010
45011         var sessionStorage_1 = {
45012                 name: 'sessionStorage',
45013                 read: read$4,
45014                 write: write$4,
45015                 each: each$6,
45016                 remove: remove$6,
45017                 clearAll: clearAll$4
45018         };
45019
45020         function sessionStorage() {
45021                 return Global$5.sessionStorage
45022         }
45023
45024         function read$4(key) {
45025                 return sessionStorage().getItem(key)
45026         }
45027
45028         function write$4(key, data) {
45029                 return sessionStorage().setItem(key, data)
45030         }
45031
45032         function each$6(fn) {
45033                 for (var i = sessionStorage().length - 1; i >= 0; i--) {
45034                         var key = sessionStorage().key(i);
45035                         fn(read$4(key), key);
45036                 }
45037         }
45038
45039         function remove$6(key) {
45040                 return sessionStorage().removeItem(key)
45041         }
45042
45043         function clearAll$4() {
45044                 return sessionStorage().clear()
45045         }
45046
45047         // memoryStorage is a useful last fallback to ensure that the store
45048         // is functions (meaning store.get(), store.set(), etc will all function).
45049         // However, stored values will not persist when the browser navigates to
45050         // a new page or reloads the current page.
45051
45052         var memoryStorage_1 = {
45053                 name: 'memoryStorage',
45054                 read: read$5,
45055                 write: write$5,
45056                 each: each$7,
45057                 remove: remove$7,
45058                 clearAll: clearAll$5,
45059         };
45060
45061         var memoryStorage = {};
45062
45063         function read$5(key) {
45064                 return memoryStorage[key]
45065         }
45066
45067         function write$5(key, data) {
45068                 memoryStorage[key] = data;
45069         }
45070
45071         function each$7(callback) {
45072                 for (var key in memoryStorage) {
45073                         if (memoryStorage.hasOwnProperty(key)) {
45074                                 callback(memoryStorage[key], key);
45075                         }
45076                 }
45077         }
45078
45079         function remove$7(key) {
45080                 delete memoryStorage[key];
45081         }
45082
45083         function clearAll$5(key) {
45084                 memoryStorage = {};
45085         }
45086
45087         var all = [
45088                 // Listed in order of usage preference
45089                 localStorage_1,
45090                 oldFFGlobalStorage,
45091                 oldIEUserDataStorage,
45092                 cookieStorage,
45093                 sessionStorage_1,
45094                 memoryStorage_1
45095         ];
45096
45097         /* eslint-disable */
45098
45099         //  json2.js
45100         //  2016-10-28
45101         //  Public Domain.
45102         //  NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK.
45103         //  See http://www.JSON.org/js.html
45104         //  This code should be minified before deployment.
45105         //  See http://javascript.crockford.com/jsmin.html
45106
45107         //  USE YOUR OWN COPY. IT IS EXTREMELY UNWISE TO LOAD CODE FROM SERVERS YOU DO
45108         //  NOT CONTROL.
45109
45110         //  This file creates a global JSON object containing two methods: stringify
45111         //  and parse. This file provides the ES5 JSON capability to ES3 systems.
45112         //  If a project might run on IE8 or earlier, then this file should be included.
45113         //  This file does nothing on ES5 systems.
45114
45115         //      JSON.stringify(value, replacer, space)
45116         //          value       any JavaScript value, usually an object or array.
45117         //          replacer    an optional parameter that determines how object
45118         //                      values are stringified for objects. It can be a
45119         //                      function or an array of strings.
45120         //          space       an optional parameter that specifies the indentation
45121         //                      of nested structures. If it is omitted, the text will
45122         //                      be packed without extra whitespace. If it is a number,
45123         //                      it will specify the number of spaces to indent at each
45124         //                      level. If it is a string (such as "\t" or "&nbsp;"),
45125         //                      it contains the characters used to indent at each level.
45126         //          This method produces a JSON text from a JavaScript value.
45127         //          When an object value is found, if the object contains a toJSON
45128         //          method, its toJSON method will be called and the result will be
45129         //          stringified. A toJSON method does not serialize: it returns the
45130         //          value represented by the name/value pair that should be serialized,
45131         //          or undefined if nothing should be serialized. The toJSON method
45132         //          will be passed the key associated with the value, and this will be
45133         //          bound to the value.
45134
45135         //          For example, this would serialize Dates as ISO strings.
45136
45137         //              Date.prototype.toJSON = function (key) {
45138         //                  function f(n) {
45139         //                      // Format integers to have at least two digits.
45140         //                      return (n < 10)
45141         //                          ? "0" + n
45142         //                          : n;
45143         //                  }
45144         //                  return this.getUTCFullYear()   + "-" +
45145         //                       f(this.getUTCMonth() + 1) + "-" +
45146         //                       f(this.getUTCDate())      + "T" +
45147         //                       f(this.getUTCHours())     + ":" +
45148         //                       f(this.getUTCMinutes())   + ":" +
45149         //                       f(this.getUTCSeconds())   + "Z";
45150         //              };
45151
45152         //          You can provide an optional replacer method. It will be passed the
45153         //          key and value of each member, with this bound to the containing
45154         //          object. The value that is returned from your method will be
45155         //          serialized. If your method returns undefined, then the member will
45156         //          be excluded from the serialization.
45157
45158         //          If the replacer parameter is an array of strings, then it will be
45159         //          used to select the members to be serialized. It filters the results
45160         //          such that only members with keys listed in the replacer array are
45161         //          stringified.
45162
45163         //          Values that do not have JSON representations, such as undefined or
45164         //          functions, will not be serialized. Such values in objects will be
45165         //          dropped; in arrays they will be replaced with null. You can use
45166         //          a replacer function to replace those with JSON values.
45167
45168         //          JSON.stringify(undefined) returns undefined.
45169
45170         //          The optional space parameter produces a stringification of the
45171         //          value that is filled with line breaks and indentation to make it
45172         //          easier to read.
45173
45174         //          If the space parameter is a non-empty string, then that string will
45175         //          be used for indentation. If the space parameter is a number, then
45176         //          the indentation will be that many spaces.
45177
45178         //          Example:
45179
45180         //          text = JSON.stringify(["e", {pluribus: "unum"}]);
45181         //          // text is '["e",{"pluribus":"unum"}]'
45182
45183         //          text = JSON.stringify(["e", {pluribus: "unum"}], null, "\t");
45184         //          // text is '[\n\t"e",\n\t{\n\t\t"pluribus": "unum"\n\t}\n]'
45185
45186         //          text = JSON.stringify([new Date()], function (key, value) {
45187         //              return this[key] instanceof Date
45188         //                  ? "Date(" + this[key] + ")"
45189         //                  : value;
45190         //          });
45191         //          // text is '["Date(---current time---)"]'
45192
45193         //      JSON.parse(text, reviver)
45194         //          This method parses a JSON text to produce an object or array.
45195         //          It can throw a SyntaxError exception.
45196
45197         //          The optional reviver parameter is a function that can filter and
45198         //          transform the results. It receives each of the keys and values,
45199         //          and its return value is used instead of the original value.
45200         //          If it returns what it received, then the structure is not modified.
45201         //          If it returns undefined then the member is deleted.
45202
45203         //          Example:
45204
45205         //          // Parse the text. Values that look like ISO date strings will
45206         //          // be converted to Date objects.
45207
45208         //          myData = JSON.parse(text, function (key, value) {
45209         //              var a;
45210         //              if (typeof value === "string") {
45211         //                  a =
45212         //   /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)Z$/.exec(value);
45213         //                  if (a) {
45214         //                      return new Date(Date.UTC(+a[1], +a[2] - 1, +a[3], +a[4],
45215         //                          +a[5], +a[6]));
45216         //                  }
45217         //              }
45218         //              return value;
45219         //          });
45220
45221         //          myData = JSON.parse('["Date(09/09/2001)"]', function (key, value) {
45222         //              var d;
45223         //              if (typeof value === "string" &&
45224         //                      value.slice(0, 5) === "Date(" &&
45225         //                      value.slice(-1) === ")") {
45226         //                  d = new Date(value.slice(5, -1));
45227         //                  if (d) {
45228         //                      return d;
45229         //                  }
45230         //              }
45231         //              return value;
45232         //          });
45233
45234         //  This is a reference implementation. You are free to copy, modify, or
45235         //  redistribute.
45236
45237         /*jslint
45238             eval, for, this
45239         */
45240
45241         /*property
45242             JSON, apply, call, charCodeAt, getUTCDate, getUTCFullYear, getUTCHours,
45243             getUTCMinutes, getUTCMonth, getUTCSeconds, hasOwnProperty, join,
45244             lastIndex, length, parse, prototype, push, replace, slice, stringify,
45245             test, toJSON, toString, valueOf
45246         */
45247
45248
45249         // Create a JSON object only if one does not already exist. We create the
45250         // methods in a closure to avoid creating global variables.
45251
45252         if (typeof JSON !== "object") {
45253             JSON = {};
45254         }
45255
45256         (function () {
45257
45258             var rx_one = /^[\],:{}\s]*$/;
45259             var rx_two = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g;
45260             var rx_three = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g;
45261             var rx_four = /(?:^|:|,)(?:\s*\[)+/g;
45262             var rx_escapable = /[\\"\u0000-\u001f\u007f-\u009f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g;
45263             var rx_dangerous = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g;
45264
45265             function f(n) {
45266                 // Format integers to have at least two digits.
45267                 return n < 10
45268                     ? "0" + n
45269                     : n;
45270             }
45271
45272             function this_value() {
45273                 return this.valueOf();
45274             }
45275
45276             if (typeof Date.prototype.toJSON !== "function") {
45277
45278                 Date.prototype.toJSON = function () {
45279
45280                     return isFinite(this.valueOf())
45281                         ? this.getUTCFullYear() + "-" +
45282                                 f(this.getUTCMonth() + 1) + "-" +
45283                                 f(this.getUTCDate()) + "T" +
45284                                 f(this.getUTCHours()) + ":" +
45285                                 f(this.getUTCMinutes()) + ":" +
45286                                 f(this.getUTCSeconds()) + "Z"
45287                         : null;
45288                 };
45289
45290                 Boolean.prototype.toJSON = this_value;
45291                 Number.prototype.toJSON = this_value;
45292                 String.prototype.toJSON = this_value;
45293             }
45294
45295             var gap;
45296             var indent;
45297             var meta;
45298             var rep;
45299
45300
45301             function quote(string) {
45302
45303         // If the string contains no control characters, no quote characters, and no
45304         // backslash characters, then we can safely slap some quotes around it.
45305         // Otherwise we must also replace the offending characters with safe escape
45306         // sequences.
45307
45308                 rx_escapable.lastIndex = 0;
45309                 return rx_escapable.test(string)
45310                     ? "\"" + string.replace(rx_escapable, function (a) {
45311                         var c = meta[a];
45312                         return typeof c === "string"
45313                             ? c
45314                             : "\\u" + ("0000" + a.charCodeAt(0).toString(16)).slice(-4);
45315                     }) + "\""
45316                     : "\"" + string + "\"";
45317             }
45318
45319
45320             function str(key, holder) {
45321
45322         // Produce a string from holder[key].
45323
45324                 var i;          // The loop counter.
45325                 var k;          // The member key.
45326                 var v;          // The member value.
45327                 var length;
45328                 var mind = gap;
45329                 var partial;
45330                 var value = holder[key];
45331
45332         // If the value has a toJSON method, call it to obtain a replacement value.
45333
45334                 if (value && typeof value === "object" &&
45335                         typeof value.toJSON === "function") {
45336                     value = value.toJSON(key);
45337                 }
45338
45339         // If we were called with a replacer function, then call the replacer to
45340         // obtain a replacement value.
45341
45342                 if (typeof rep === "function") {
45343                     value = rep.call(holder, key, value);
45344                 }
45345
45346         // What happens next depends on the value's type.
45347
45348                 switch (typeof value) {
45349                 case "string":
45350                     return quote(value);
45351
45352                 case "number":
45353
45354         // JSON numbers must be finite. Encode non-finite numbers as null.
45355
45356                     return isFinite(value)
45357                         ? String(value)
45358                         : "null";
45359
45360                 case "boolean":
45361                 case "null":
45362
45363         // If the value is a boolean or null, convert it to a string. Note:
45364         // typeof null does not produce "null". The case is included here in
45365         // the remote chance that this gets fixed someday.
45366
45367                     return String(value);
45368
45369         // If the type is "object", we might be dealing with an object or an array or
45370         // null.
45371
45372                 case "object":
45373
45374         // Due to a specification blunder in ECMAScript, typeof null is "object",
45375         // so watch out for that case.
45376
45377                     if (!value) {
45378                         return "null";
45379                     }
45380
45381         // Make an array to hold the partial results of stringifying this object value.
45382
45383                     gap += indent;
45384                     partial = [];
45385
45386         // Is the value an array?
45387
45388                     if (Object.prototype.toString.apply(value) === "[object Array]") {
45389
45390         // The value is an array. Stringify every element. Use null as a placeholder
45391         // for non-JSON values.
45392
45393                         length = value.length;
45394                         for (i = 0; i < length; i += 1) {
45395                             partial[i] = str(i, value) || "null";
45396                         }
45397
45398         // Join all of the elements together, separated with commas, and wrap them in
45399         // brackets.
45400
45401                         v = partial.length === 0
45402                             ? "[]"
45403                             : gap
45404                                 ? "[\n" + gap + partial.join(",\n" + gap) + "\n" + mind + "]"
45405                                 : "[" + partial.join(",") + "]";
45406                         gap = mind;
45407                         return v;
45408                     }
45409
45410         // If the replacer is an array, use it to select the members to be stringified.
45411
45412                     if (rep && typeof rep === "object") {
45413                         length = rep.length;
45414                         for (i = 0; i < length; i += 1) {
45415                             if (typeof rep[i] === "string") {
45416                                 k = rep[i];
45417                                 v = str(k, value);
45418                                 if (v) {
45419                                     partial.push(quote(k) + (
45420                                         gap
45421                                             ? ": "
45422                                             : ":"
45423                                     ) + v);
45424                                 }
45425                             }
45426                         }
45427                     } else {
45428
45429         // Otherwise, iterate through all of the keys in the object.
45430
45431                         for (k in value) {
45432                             if (Object.prototype.hasOwnProperty.call(value, k)) {
45433                                 v = str(k, value);
45434                                 if (v) {
45435                                     partial.push(quote(k) + (
45436                                         gap
45437                                             ? ": "
45438                                             : ":"
45439                                     ) + v);
45440                                 }
45441                             }
45442                         }
45443                     }
45444
45445         // Join all of the member texts together, separated with commas,
45446         // and wrap them in braces.
45447
45448                     v = partial.length === 0
45449                         ? "{}"
45450                         : gap
45451                             ? "{\n" + gap + partial.join(",\n" + gap) + "\n" + mind + "}"
45452                             : "{" + partial.join(",") + "}";
45453                     gap = mind;
45454                     return v;
45455                 }
45456             }
45457
45458         // If the JSON object does not yet have a stringify method, give it one.
45459
45460             if (typeof JSON.stringify !== "function") {
45461                 meta = {    // table of character substitutions
45462                     "\b": "\\b",
45463                     "\t": "\\t",
45464                     "\n": "\\n",
45465                     "\f": "\\f",
45466                     "\r": "\\r",
45467                     "\"": "\\\"",
45468                     "\\": "\\\\"
45469                 };
45470                 JSON.stringify = function (value, replacer, space) {
45471
45472         // The stringify method takes a value and an optional replacer, and an optional
45473         // space parameter, and returns a JSON text. The replacer can be a function
45474         // that can replace values, or an array of strings that will select the keys.
45475         // A default replacer method can be provided. Use of the space parameter can
45476         // produce text that is more easily readable.
45477
45478                     var i;
45479                     gap = "";
45480                     indent = "";
45481
45482         // If the space parameter is a number, make an indent string containing that
45483         // many spaces.
45484
45485                     if (typeof space === "number") {
45486                         for (i = 0; i < space; i += 1) {
45487                             indent += " ";
45488                         }
45489
45490         // If the space parameter is a string, it will be used as the indent string.
45491
45492                     } else if (typeof space === "string") {
45493                         indent = space;
45494                     }
45495
45496         // If there is a replacer, it must be a function or an array.
45497         // Otherwise, throw an error.
45498
45499                     rep = replacer;
45500                     if (replacer && typeof replacer !== "function" &&
45501                             (typeof replacer !== "object" ||
45502                             typeof replacer.length !== "number")) {
45503                         throw new Error("JSON.stringify");
45504                     }
45505
45506         // Make a fake root object containing our value under the key of "".
45507         // Return the result of stringifying the value.
45508
45509                     return str("", {"": value});
45510                 };
45511             }
45512
45513
45514         // If the JSON object does not yet have a parse method, give it one.
45515
45516             if (typeof JSON.parse !== "function") {
45517                 JSON.parse = function (text, reviver) {
45518
45519         // The parse method takes a text and an optional reviver function, and returns
45520         // a JavaScript value if the text is a valid JSON text.
45521
45522                     var j;
45523
45524                     function walk(holder, key) {
45525
45526         // The walk method is used to recursively walk the resulting structure so
45527         // that modifications can be made.
45528
45529                         var k;
45530                         var v;
45531                         var value = holder[key];
45532                         if (value && typeof value === "object") {
45533                             for (k in value) {
45534                                 if (Object.prototype.hasOwnProperty.call(value, k)) {
45535                                     v = walk(value, k);
45536                                     if (v !== undefined) {
45537                                         value[k] = v;
45538                                     } else {
45539                                         delete value[k];
45540                                     }
45541                                 }
45542                             }
45543                         }
45544                         return reviver.call(holder, key, value);
45545                     }
45546
45547
45548         // Parsing happens in four stages. In the first stage, we replace certain
45549         // Unicode characters with escape sequences. JavaScript handles many characters
45550         // incorrectly, either silently deleting them, or treating them as line endings.
45551
45552                     text = String(text);
45553                     rx_dangerous.lastIndex = 0;
45554                     if (rx_dangerous.test(text)) {
45555                         text = text.replace(rx_dangerous, function (a) {
45556                             return "\\u" +
45557                                     ("0000" + a.charCodeAt(0).toString(16)).slice(-4);
45558                         });
45559                     }
45560
45561         // In the second stage, we run the text against regular expressions that look
45562         // for non-JSON patterns. We are especially concerned with "()" and "new"
45563         // because they can cause invocation, and "=" because it can cause mutation.
45564         // But just to be safe, we want to reject all unexpected forms.
45565
45566         // We split the second stage into 4 regexp operations in order to work around
45567         // crippling inefficiencies in IE's and Safari's regexp engines. First we
45568         // replace the JSON backslash pairs with "@" (a non-JSON character). Second, we
45569         // replace all simple value tokens with "]" characters. Third, we delete all
45570         // open brackets that follow a colon or comma or that begin the text. Finally,
45571         // we look to see that the remaining characters are only whitespace or "]" or
45572         // "," or ":" or "{" or "}". If that is so, then the text is safe for eval.
45573
45574                     if (
45575                         rx_one.test(
45576                             text
45577                                 .replace(rx_two, "@")
45578                                 .replace(rx_three, "]")
45579                                 .replace(rx_four, "")
45580                         )
45581                     ) {
45582
45583         // In the third stage we use the eval function to compile the text into a
45584         // JavaScript structure. The "{" operator is subject to a syntactic ambiguity
45585         // in JavaScript: it can begin a block or an object literal. We wrap the text
45586         // in parens to eliminate the ambiguity.
45587
45588                         j = eval("(" + text + ")");
45589
45590         // In the optional fourth stage, we recursively walk the new structure, passing
45591         // each name/value pair to a reviver function for possible transformation.
45592
45593                         return (typeof reviver === "function")
45594                             ? walk({"": j}, "")
45595                             : j;
45596                     }
45597
45598         // If the text is not JSON parseable, then a SyntaxError is thrown.
45599
45600                     throw new SyntaxError("JSON.parse");
45601                 };
45602             }
45603         }());
45604
45605         var json2 = json2Plugin;
45606
45607         function json2Plugin() {
45608                 
45609                 return {}
45610         }
45611
45612         var plugins = [json2];
45613
45614         var store_legacy = storeEngine.createStore(all, plugins);
45615
45616         // # osm-auth
45617         //
45618         // This code is only compatible with IE10+ because the [XDomainRequest](http://bit.ly/LfO7xo)
45619         // object, IE<10's idea of [CORS](http://en.wikipedia.org/wiki/Cross-origin_resource_sharing),
45620         // does not support custom headers, which this uses everywhere.
45621         var osmAuth = function(o) {
45622
45623             var oauth = {};
45624
45625             // authenticated users will also have a request token secret, but it's
45626             // not used in transactions with the server
45627             oauth.authenticated = function() {
45628                 return !!(token('oauth_token') && token('oauth_token_secret'));
45629             };
45630
45631             oauth.logout = function() {
45632                 token('oauth_token', '');
45633                 token('oauth_token_secret', '');
45634                 token('oauth_request_token_secret', '');
45635                 return oauth;
45636             };
45637
45638             // TODO: detect lack of click event
45639             oauth.authenticate = function(callback) {
45640                 if (oauth.authenticated()) return callback();
45641
45642                 oauth.logout();
45643
45644                 // ## Getting a request token
45645                 var params = timenonce(getAuth(o)),
45646                     url = o.url + '/oauth/request_token';
45647
45648                 params.oauth_signature = ohauth_1.signature(
45649                     o.oauth_secret, '',
45650                     ohauth_1.baseString('POST', url, params));
45651
45652                 if (!o.singlepage) {
45653                     // Create a 600x550 popup window in the center of the screen
45654                     var w = 600, h = 550,
45655                         settings = [
45656                             ['width', w], ['height', h],
45657                             ['left', screen.width / 2 - w / 2],
45658                             ['top', screen.height / 2 - h / 2]].map(function(x) {
45659                                 return x.join('=');
45660                             }).join(','),
45661                         popup = window.open('about:blank', 'oauth_window', settings);
45662                 }
45663
45664                 // Request a request token. When this is complete, the popup
45665                 // window is redirected to OSM's authorization page.
45666                 ohauth_1.xhr('POST', url, params, null, {}, reqTokenDone);
45667                 o.loading();
45668
45669                 function reqTokenDone(err, xhr) {
45670                     o.done();
45671                     if (err) return callback(err);
45672                     var resp = ohauth_1.stringQs(xhr.response);
45673                     token('oauth_request_token_secret', resp.oauth_token_secret);
45674                     var authorize_url = o.url + '/oauth/authorize?' + ohauth_1.qsString({
45675                         oauth_token: resp.oauth_token,
45676                         oauth_callback: resolveUrl(o.landing)
45677                     });
45678
45679                     if (o.singlepage) {
45680                         location.href = authorize_url;
45681                     } else {
45682                         popup.location = authorize_url;
45683                     }
45684                 }
45685
45686                 // Called by a function in a landing page, in the popup window. The
45687                 // window closes itself.
45688                 window.authComplete = function(token) {
45689                     var oauth_token = ohauth_1.stringQs(token.split('?')[1]);
45690                     get_access_token(oauth_token.oauth_token);
45691                     delete window.authComplete;
45692                 };
45693
45694                 // ## Getting an request token
45695                 //
45696                 // At this point we have an `oauth_token`, brought in from a function
45697                 // call on a landing page popup.
45698                 function get_access_token(oauth_token) {
45699                     var url = o.url + '/oauth/access_token',
45700                         params = timenonce(getAuth(o)),
45701                         request_token_secret = token('oauth_request_token_secret');
45702                     params.oauth_token = oauth_token;
45703                     params.oauth_signature = ohauth_1.signature(
45704                         o.oauth_secret,
45705                         request_token_secret,
45706                         ohauth_1.baseString('POST', url, params));
45707
45708                     // ## Getting an access token
45709                     //
45710                     // The final token required for authentication. At this point
45711                     // we have a `request token secret`
45712                     ohauth_1.xhr('POST', url, params, null, {}, accessTokenDone);
45713                     o.loading();
45714                 }
45715
45716                 function accessTokenDone(err, xhr) {
45717                     o.done();
45718                     if (err) return callback(err);
45719                     var access_token = ohauth_1.stringQs(xhr.response);
45720                     token('oauth_token', access_token.oauth_token);
45721                     token('oauth_token_secret', access_token.oauth_token_secret);
45722                     callback(null, oauth);
45723                 }
45724             };
45725
45726             oauth.bootstrapToken = function(oauth_token, callback) {
45727                 // ## Getting an request token
45728                 // At this point we have an `oauth_token`, brought in from a function
45729                 // call on a landing page popup.
45730                 function get_access_token(oauth_token) {
45731                     var url = o.url + '/oauth/access_token',
45732                         params = timenonce(getAuth(o)),
45733                         request_token_secret = token('oauth_request_token_secret');
45734                     params.oauth_token = oauth_token;
45735                     params.oauth_signature = ohauth_1.signature(
45736                         o.oauth_secret,
45737                         request_token_secret,
45738                         ohauth_1.baseString('POST', url, params));
45739
45740                     // ## Getting an access token
45741                     // The final token required for authentication. At this point
45742                     // we have a `request token secret`
45743                     ohauth_1.xhr('POST', url, params, null, {}, accessTokenDone);
45744                     o.loading();
45745                 }
45746
45747                 function accessTokenDone(err, xhr) {
45748                     o.done();
45749                     if (err) return callback(err);
45750                     var access_token = ohauth_1.stringQs(xhr.response);
45751                     token('oauth_token', access_token.oauth_token);
45752                     token('oauth_token_secret', access_token.oauth_token_secret);
45753                     callback(null, oauth);
45754                 }
45755
45756                 get_access_token(oauth_token);
45757             };
45758
45759             // # xhr
45760             //
45761             // A single XMLHttpRequest wrapper that does authenticated calls if the
45762             // user has logged in.
45763             oauth.xhr = function(options, callback) {
45764                 if (!oauth.authenticated()) {
45765                     if (o.auto) {
45766                         return oauth.authenticate(run);
45767                     } else {
45768                         callback('not authenticated', null);
45769                         return;
45770                     }
45771                 } else {
45772                     return run();
45773                 }
45774
45775                 function run() {
45776                     var params = timenonce(getAuth(o)),
45777                         oauth_token_secret = token('oauth_token_secret'),
45778                         url = (options.prefix !== false) ? o.url + options.path : options.path,
45779                         url_parts = url.replace(/#.*$/, '').split('?', 2),
45780                         base_url = url_parts[0],
45781                         query = (url_parts.length === 2) ? url_parts[1] : '';
45782
45783                     // https://tools.ietf.org/html/rfc5849#section-3.4.1.3.1
45784                     if ((!options.options || !options.options.header ||
45785                         options.options.header['Content-Type'] === 'application/x-www-form-urlencoded') &&
45786                         options.content) {
45787                         params = immutable(params, ohauth_1.stringQs(options.content));
45788                     }
45789
45790                     params.oauth_token = token('oauth_token');
45791                     params.oauth_signature = ohauth_1.signature(
45792                         o.oauth_secret,
45793                         oauth_token_secret,
45794                         ohauth_1.baseString(options.method, base_url, immutable(params, ohauth_1.stringQs(query)))
45795                     );
45796
45797                     return ohauth_1.xhr(options.method, url, params, options.content, options.options, done);
45798                 }
45799
45800                 function done(err, xhr) {
45801                     if (err) return callback(err);
45802                     else if (xhr.responseXML) return callback(err, xhr.responseXML);
45803                     else return callback(err, xhr.response);
45804                 }
45805             };
45806
45807             // pre-authorize this object, if we can just get a token and token_secret
45808             // from the start
45809             oauth.preauth = function(c) {
45810                 if (!c) return;
45811                 if (c.oauth_token) token('oauth_token', c.oauth_token);
45812                 if (c.oauth_token_secret) token('oauth_token_secret', c.oauth_token_secret);
45813                 return oauth;
45814             };
45815
45816             oauth.options = function(_) {
45817                 if (!arguments.length) return o;
45818
45819                 o = _;
45820                 o.url = o.url || 'https://www.openstreetmap.org';
45821                 o.landing = o.landing || 'land.html';
45822                 o.singlepage = o.singlepage || false;
45823
45824                 // Optional loading and loading-done functions for nice UI feedback.
45825                 // by default, no-ops
45826                 o.loading = o.loading || function() {};
45827                 o.done = o.done || function() {};
45828
45829                 return oauth.preauth(o);
45830             };
45831
45832             // 'stamp' an authentication object from `getAuth()`
45833             // with a [nonce](http://en.wikipedia.org/wiki/Cryptographic_nonce)
45834             // and timestamp
45835             function timenonce(o) {
45836                 o.oauth_timestamp = ohauth_1.timestamp();
45837                 o.oauth_nonce = ohauth_1.nonce();
45838                 return o;
45839             }
45840
45841             // get/set tokens. These are prefixed with the base URL so that `osm-auth`
45842             // can be used with multiple APIs and the keys in `localStorage`
45843             // will not clash
45844             var token;
45845
45846             if (store_legacy.enabled) {
45847                 token = function (x, y) {
45848                     if (arguments.length === 1) return store_legacy.get(o.url + x);
45849                     else if (arguments.length === 2) return store_legacy.set(o.url + x, y);
45850                 };
45851             } else {
45852                 var storage = {};
45853                 token = function (x, y) {
45854                     if (arguments.length === 1) return storage[o.url + x];
45855                     else if (arguments.length === 2) return storage[o.url + x] = y;
45856                 };
45857             }
45858
45859             // Get an authentication object. If you just add and remove properties
45860             // from a single object, you'll need to use `delete` to make sure that
45861             // it doesn't contain undesired properties for authentication
45862             function getAuth(o) {
45863                 return {
45864                     oauth_consumer_key: o.oauth_consumer_key,
45865                     oauth_signature_method: 'HMAC-SHA1'
45866                 };
45867             }
45868
45869             // potentially pre-authorize
45870             oauth.options(o);
45871
45872             return oauth;
45873         };
45874
45875         var JXON = new (function () {
45876           var
45877             sValueProp = 'keyValue', sAttributesProp = 'keyAttributes', sAttrPref = '@', /* you can customize these values */
45878             aCache = [], rIsNull = /^\s*$/, rIsBool = /^(?:true|false)$/i;
45879
45880           function parseText (sValue) {
45881             if (rIsNull.test(sValue)) { return null; }
45882             if (rIsBool.test(sValue)) { return sValue.toLowerCase() === 'true'; }
45883             if (isFinite(sValue)) { return parseFloat(sValue); }
45884             if (isFinite(Date.parse(sValue))) { return new Date(sValue); }
45885             return sValue;
45886           }
45887
45888           function EmptyTree () { }
45889           EmptyTree.prototype.toString = function () { return 'null'; };
45890           EmptyTree.prototype.valueOf = function () { return null; };
45891
45892           function objectify (vValue) {
45893             return vValue === null ? new EmptyTree() : vValue instanceof Object ? vValue : new vValue.constructor(vValue);
45894           }
45895
45896           function createObjTree (oParentNode, nVerb, bFreeze, bNesteAttr) {
45897             var
45898               nLevelStart = aCache.length, bChildren = oParentNode.hasChildNodes(),
45899               bAttributes = oParentNode.hasAttributes(), bHighVerb = Boolean(nVerb & 2);
45900
45901             var
45902               sProp, vContent, nLength = 0, sCollectedTxt = '',
45903               vResult = bHighVerb ? {} : /* put here the default value for empty nodes: */ true;
45904
45905             if (bChildren) {
45906               for (var oNode, nItem = 0; nItem < oParentNode.childNodes.length; nItem++) {
45907                 oNode = oParentNode.childNodes.item(nItem);
45908                 if (oNode.nodeType === 4) { sCollectedTxt += oNode.nodeValue; } /* nodeType is 'CDATASection' (4) */
45909                 else if (oNode.nodeType === 3) { sCollectedTxt += oNode.nodeValue.trim(); } /* nodeType is 'Text' (3) */
45910                 else if (oNode.nodeType === 1 && !oNode.prefix) { aCache.push(oNode); } /* nodeType is 'Element' (1) */
45911               }
45912             }
45913
45914             var nLevelEnd = aCache.length, vBuiltVal = parseText(sCollectedTxt);
45915
45916             if (!bHighVerb && (bChildren || bAttributes)) { vResult = nVerb === 0 ? objectify(vBuiltVal) : {}; }
45917
45918             for (var nElId = nLevelStart; nElId < nLevelEnd; nElId++) {
45919               sProp = aCache[nElId].nodeName.toLowerCase();
45920               vContent = createObjTree(aCache[nElId], nVerb, bFreeze, bNesteAttr);
45921               if (vResult.hasOwnProperty(sProp)) {
45922                 if (vResult[sProp].constructor !== Array) { vResult[sProp] = [vResult[sProp]]; }
45923                 vResult[sProp].push(vContent);
45924               } else {
45925                 vResult[sProp] = vContent;
45926                 nLength++;
45927               }
45928             }
45929
45930             if (bAttributes) {
45931               var
45932                 nAttrLen = oParentNode.attributes.length,
45933                 sAPrefix = bNesteAttr ? '' : sAttrPref, oAttrParent = bNesteAttr ? {} : vResult;
45934
45935               for (var oAttrib, nAttrib = 0; nAttrib < nAttrLen; nLength++, nAttrib++) {
45936                 oAttrib = oParentNode.attributes.item(nAttrib);
45937                 oAttrParent[sAPrefix + oAttrib.name.toLowerCase()] = parseText(oAttrib.value.trim());
45938               }
45939
45940               if (bNesteAttr) {
45941                 if (bFreeze) { Object.freeze(oAttrParent); }
45942                 vResult[sAttributesProp] = oAttrParent;
45943                 nLength -= nAttrLen - 1;
45944               }
45945             }
45946
45947             if (nVerb === 3 || (nVerb === 2 || nVerb === 1 && nLength > 0) && sCollectedTxt) {
45948               vResult[sValueProp] = vBuiltVal;
45949             } else if (!bHighVerb && nLength === 0 && sCollectedTxt) {
45950               vResult = vBuiltVal;
45951             }
45952
45953             if (bFreeze && (bHighVerb || nLength > 0)) { Object.freeze(vResult); }
45954
45955             aCache.length = nLevelStart;
45956
45957             return vResult;
45958           }
45959
45960           function loadObjTree (oXMLDoc, oParentEl, oParentObj) {
45961             var vValue, oChild;
45962
45963             if (oParentObj instanceof String || oParentObj instanceof Number || oParentObj instanceof Boolean) {
45964               oParentEl.appendChild(oXMLDoc.createTextNode(oParentObj.toString())); /* verbosity level is 0 */
45965             } else if (oParentObj.constructor === Date) {
45966               oParentEl.appendChild(oXMLDoc.createTextNode(oParentObj.toGMTString()));    
45967             }
45968
45969             for (var sName in oParentObj) {
45970               vValue = oParentObj[sName];
45971               if (isFinite(sName) || vValue instanceof Function) { continue; } /* verbosity level is 0 */
45972               if (sName === sValueProp) {
45973                 if (vValue !== null && vValue !== true) { oParentEl.appendChild(oXMLDoc.createTextNode(vValue.constructor === Date ? vValue.toGMTString() : String(vValue))); }
45974               } else if (sName === sAttributesProp) { /* verbosity level is 3 */
45975                 for (var sAttrib in vValue) { oParentEl.setAttribute(sAttrib, vValue[sAttrib]); }
45976               } else if (sName.charAt(0) === sAttrPref) {
45977                 oParentEl.setAttribute(sName.slice(1), vValue);
45978               } else if (vValue.constructor === Array) {
45979                 for (var nItem = 0; nItem < vValue.length; nItem++) {
45980                   oChild = oXMLDoc.createElement(sName);
45981                   loadObjTree(oXMLDoc, oChild, vValue[nItem]);
45982                   oParentEl.appendChild(oChild);
45983                 }
45984               } else {
45985                 oChild = oXMLDoc.createElement(sName);
45986                 if (vValue instanceof Object) {
45987                   loadObjTree(oXMLDoc, oChild, vValue);
45988                 } else if (vValue !== null && vValue !== true) {
45989                   oChild.appendChild(oXMLDoc.createTextNode(vValue.toString()));
45990                 }
45991                 oParentEl.appendChild(oChild);
45992              }
45993            }
45994           }
45995
45996           this.build = function (oXMLParent, nVerbosity /* optional */, bFreeze /* optional */, bNesteAttributes /* optional */) {
45997             var _nVerb = arguments.length > 1 && typeof nVerbosity === 'number' ? nVerbosity & 3 : /* put here the default verbosity level: */ 1;
45998             return createObjTree(oXMLParent, _nVerb, bFreeze || false, arguments.length > 3 ? bNesteAttributes : _nVerb === 3);    
45999           };
46000
46001           this.unbuild = function (oObjTree) {    
46002             var oNewDoc = document.implementation.createDocument('', '', null);
46003             loadObjTree(oNewDoc, oNewDoc, oObjTree);
46004             return oNewDoc;
46005           };
46006
46007           this.stringify = function (oObjTree) {
46008             return (new XMLSerializer()).serializeToString(JXON.unbuild(oObjTree));
46009           };
46010         })();
46011
46012         // var myObject = JXON.build(doc);
46013         // we got our javascript object! try: alert(JSON.stringify(myObject));
46014
46015         // var newDoc = JXON.unbuild(myObject);
46016         // we got our Document instance! try: alert((new XMLSerializer()).serializeToString(newDoc));
46017
46018         var tiler$4 = utilTiler();
46019         var dispatch$5 = dispatch('authLoading', 'authDone', 'change', 'loading', 'loaded', 'loadedNotes');
46020         var urlroot = 'https://www.openstreetmap.org';
46021         var oauth = osmAuth({
46022             url: urlroot,
46023             oauth_consumer_key: '5A043yRSEugj4DJ5TljuapfnrflWDte8jTOcWLlT',
46024             oauth_secret: 'aB3jKq1TRsCOUrfOIZ6oQMEDmv2ptV76PA54NGLL',
46025             loading: authLoading,
46026             done: authDone
46027         });
46028
46029         var _blacklists = ['.*\.google(apis)?\..*/(vt|kh)[\?/].*([xyz]=.*){3}.*'];
46030         var _tileCache = { toLoad: {}, loaded: {}, inflight: {}, seen: {}, rtree: rbush_1() };
46031         var _noteCache = { toLoad: {}, loaded: {}, inflight: {}, inflightPost: {}, note: {}, closed: {}, rtree: rbush_1() };
46032         var _userCache = { toLoad: {}, user: {} };
46033         var _changeset = {};
46034
46035         var _deferred = new Set();
46036         var _connectionID = 1;
46037         var _tileZoom = 16;
46038         var _noteZoom = 12;
46039         var _rateLimitError;
46040         var _userChangesets;
46041         var _userDetails;
46042         var _off;
46043
46044
46045         function authLoading() {
46046             dispatch$5.call('authLoading');
46047         }
46048
46049
46050         function authDone() {
46051             dispatch$5.call('authDone');
46052         }
46053
46054
46055         function abortRequest$4(controllerOrXHR) {
46056             if (controllerOrXHR) {
46057                 controllerOrXHR.abort();
46058             }
46059         }
46060
46061
46062         function hasInflightRequests(cache) {
46063             return Object.keys(cache.inflight).length;
46064         }
46065
46066
46067         function abortUnwantedRequests$2(cache, visibleTiles) {
46068             Object.keys(cache.inflight).forEach(function(k) {
46069                 if (cache.toLoad[k]) return;
46070                 if (visibleTiles.find(function(tile) { return k === tile.id; })) return;
46071
46072                 abortRequest$4(cache.inflight[k]);
46073                 delete cache.inflight[k];
46074             });
46075         }
46076
46077
46078         function getLoc(attrs) {
46079             var lon = attrs.lon && attrs.lon.value;
46080             var lat = attrs.lat && attrs.lat.value;
46081             return [parseFloat(lon), parseFloat(lat)];
46082         }
46083
46084
46085         function getNodes(obj) {
46086             var elems = obj.getElementsByTagName('nd');
46087             var nodes = new Array(elems.length);
46088             for (var i = 0, l = elems.length; i < l; i++) {
46089                 nodes[i] = 'n' + elems[i].attributes.ref.value;
46090             }
46091             return nodes;
46092         }
46093
46094
46095         function getTags(obj) {
46096             var elems = obj.getElementsByTagName('tag');
46097             var tags = {};
46098             for (var i = 0, l = elems.length; i < l; i++) {
46099                 var attrs = elems[i].attributes;
46100                 tags[attrs.k.value] = attrs.v.value;
46101             }
46102
46103             return tags;
46104         }
46105
46106
46107         function getMembers(obj) {
46108             var elems = obj.getElementsByTagName('member');
46109             var members = new Array(elems.length);
46110             for (var i = 0, l = elems.length; i < l; i++) {
46111                 var attrs = elems[i].attributes;
46112                 members[i] = {
46113                     id: attrs.type.value[0] + attrs.ref.value,
46114                     type: attrs.type.value,
46115                     role: attrs.role.value
46116                 };
46117             }
46118             return members;
46119         }
46120
46121
46122         function getVisible(attrs) {
46123             return (!attrs.visible || attrs.visible.value !== 'false');
46124         }
46125
46126
46127         function parseComments(comments) {
46128             var parsedComments = [];
46129
46130             // for each comment
46131             for (var i = 0; i < comments.length; i++) {
46132                 var comment = comments[i];
46133                 if (comment.nodeName === 'comment') {
46134                     var childNodes = comment.childNodes;
46135                     var parsedComment = {};
46136
46137                     for (var j = 0; j < childNodes.length; j++) {
46138                         var node = childNodes[j];
46139                         var nodeName = node.nodeName;
46140                         if (nodeName === '#text') continue;
46141                         parsedComment[nodeName] = node.textContent;
46142
46143                         if (nodeName === 'uid') {
46144                             var uid = node.textContent;
46145                             if (uid && !_userCache.user[uid]) {
46146                                 _userCache.toLoad[uid] = true;
46147                             }
46148                         }
46149                     }
46150
46151                     if (parsedComment) {
46152                         parsedComments.push(parsedComment);
46153                     }
46154                 }
46155             }
46156             return parsedComments;
46157         }
46158
46159
46160         function encodeNoteRtree(note) {
46161             return {
46162                 minX: note.loc[0],
46163                 minY: note.loc[1],
46164                 maxX: note.loc[0],
46165                 maxY: note.loc[1],
46166                 data: note
46167             };
46168         }
46169
46170
46171         var parsers = {
46172             node: function nodeData(obj, uid) {
46173                 var attrs = obj.attributes;
46174                 return new osmNode({
46175                     id: uid,
46176                     visible: getVisible(attrs),
46177                     version: attrs.version.value,
46178                     changeset: attrs.changeset && attrs.changeset.value,
46179                     timestamp: attrs.timestamp && attrs.timestamp.value,
46180                     user: attrs.user && attrs.user.value,
46181                     uid: attrs.uid && attrs.uid.value,
46182                     loc: getLoc(attrs),
46183                     tags: getTags(obj)
46184                 });
46185             },
46186
46187             way: function wayData(obj, uid) {
46188                 var attrs = obj.attributes;
46189                 return new osmWay({
46190                     id: uid,
46191                     visible: getVisible(attrs),
46192                     version: attrs.version.value,
46193                     changeset: attrs.changeset && attrs.changeset.value,
46194                     timestamp: attrs.timestamp && attrs.timestamp.value,
46195                     user: attrs.user && attrs.user.value,
46196                     uid: attrs.uid && attrs.uid.value,
46197                     tags: getTags(obj),
46198                     nodes: getNodes(obj),
46199                 });
46200             },
46201
46202             relation: function relationData(obj, uid) {
46203                 var attrs = obj.attributes;
46204                 return new osmRelation({
46205                     id: uid,
46206                     visible: getVisible(attrs),
46207                     version: attrs.version.value,
46208                     changeset: attrs.changeset && attrs.changeset.value,
46209                     timestamp: attrs.timestamp && attrs.timestamp.value,
46210                     user: attrs.user && attrs.user.value,
46211                     uid: attrs.uid && attrs.uid.value,
46212                     tags: getTags(obj),
46213                     members: getMembers(obj)
46214                 });
46215             },
46216
46217             note: function parseNote(obj, uid) {
46218                 var attrs = obj.attributes;
46219                 var childNodes = obj.childNodes;
46220                 var props = {};
46221
46222                 props.id = uid;
46223                 props.loc = getLoc(attrs);
46224
46225                 // if notes are coincident, move them apart slightly
46226                 var coincident = false;
46227                 var epsilon = 0.00001;
46228                 do {
46229                     if (coincident) {
46230                         props.loc = geoVecAdd(props.loc, [epsilon, epsilon]);
46231                     }
46232                     var bbox = geoExtent(props.loc).bbox();
46233                     coincident = _noteCache.rtree.search(bbox).length;
46234                 } while (coincident);
46235
46236                 // parse note contents
46237                 for (var i = 0; i < childNodes.length; i++) {
46238                     var node = childNodes[i];
46239                     var nodeName = node.nodeName;
46240                     if (nodeName === '#text') continue;
46241
46242                     // if the element is comments, parse the comments
46243                     if (nodeName === 'comments') {
46244                         props[nodeName] = parseComments(node.childNodes);
46245                     } else {
46246                         props[nodeName] = node.textContent;
46247                     }
46248                 }
46249
46250                 var note = new osmNote(props);
46251                 var item = encodeNoteRtree(note);
46252                 _noteCache.note[note.id] = note;
46253                 _noteCache.rtree.insert(item);
46254
46255                 return note;
46256             },
46257
46258             user: function parseUser(obj, uid) {
46259                 var attrs = obj.attributes;
46260                 var user = {
46261                     id: uid,
46262                     display_name: attrs.display_name && attrs.display_name.value,
46263                     account_created: attrs.account_created && attrs.account_created.value,
46264                     changesets_count: 0
46265                 };
46266
46267                 var img = obj.getElementsByTagName('img');
46268                 if (img && img[0] && img[0].getAttribute('href')) {
46269                     user.image_url = img[0].getAttribute('href');
46270                 }
46271
46272                 var changesets = obj.getElementsByTagName('changesets');
46273                 if (changesets && changesets[0] && changesets[0].getAttribute('count')) {
46274                     user.changesets_count = changesets[0].getAttribute('count');
46275                 }
46276
46277                 _userCache.user[uid] = user;
46278                 delete _userCache.toLoad[uid];
46279                 return user;
46280             }
46281         };
46282
46283
46284         function parseXML(xml, callback, options) {
46285             options = Object.assign({ skipSeen: true }, options);
46286             if (!xml || !xml.childNodes) {
46287                 return callback({ message: 'No XML', status: -1 });
46288             }
46289
46290             var root = xml.childNodes[0];
46291             var children = root.childNodes;
46292
46293             var handle = window.requestIdleCallback(function() {
46294                 var results = [];
46295                 var result;
46296                 for (var i = 0; i < children.length; i++) {
46297                     result = parseChild(children[i]);
46298                     if (result) results.push(result);
46299                 }
46300                 callback(null, results);
46301             });
46302
46303             _deferred.add(handle);
46304
46305
46306             function parseChild(child) {
46307                 var parser = parsers[child.nodeName];
46308                 if (!parser) return null;
46309
46310                 var uid;
46311                 if (child.nodeName === 'user') {
46312                     uid = child.attributes.id.value;
46313                     if (options.skipSeen && _userCache.user[uid]) {
46314                         delete _userCache.toLoad[uid];
46315                         return null;
46316                     }
46317
46318                 } else if (child.nodeName === 'note') {
46319                     uid = child.getElementsByTagName('id')[0].textContent;
46320
46321                 } else {
46322                     uid = osmEntity.id.fromOSM(child.nodeName, child.attributes.id.value);
46323                     if (options.skipSeen) {
46324                         if (_tileCache.seen[uid]) return null;  // avoid reparsing a "seen" entity
46325                         _tileCache.seen[uid] = true;
46326                     }
46327                 }
46328
46329                 return parser(child, uid);
46330             }
46331         }
46332
46333
46334         // replace or remove note from rtree
46335         function updateRtree$2(item, replace) {
46336             _noteCache.rtree.remove(item, function isEql(a, b) { return a.data.id === b.data.id; });
46337
46338             if (replace) {
46339                 _noteCache.rtree.insert(item);
46340             }
46341         }
46342
46343
46344         function wrapcb(thisArg, callback, cid) {
46345             return function(err, result) {
46346                 if (err) {
46347                     // 400 Bad Request, 401 Unauthorized, 403 Forbidden..
46348                     if (err.status === 400 || err.status === 401 || err.status === 403) {
46349                         thisArg.logout();
46350                     }
46351                     return callback.call(thisArg, err);
46352
46353                 } else if (thisArg.getConnectionId() !== cid) {
46354                     return callback.call(thisArg, { message: 'Connection Switched', status: -1 });
46355
46356                 } else {
46357                     return callback.call(thisArg, err, result);
46358                 }
46359             };
46360         }
46361
46362
46363         var serviceOsm = {
46364
46365             init: function() {
46366                 utilRebind(this, dispatch$5, 'on');
46367             },
46368
46369
46370             reset: function() {
46371                 Array.from(_deferred).forEach(function(handle) {
46372                     window.cancelIdleCallback(handle);
46373                     _deferred.delete(handle);
46374                 });
46375
46376                 _connectionID++;
46377                 _userChangesets = undefined;
46378                 _userDetails = undefined;
46379                 _rateLimitError = undefined;
46380
46381                 Object.values(_tileCache.inflight).forEach(abortRequest$4);
46382                 Object.values(_noteCache.inflight).forEach(abortRequest$4);
46383                 Object.values(_noteCache.inflightPost).forEach(abortRequest$4);
46384                 if (_changeset.inflight) abortRequest$4(_changeset.inflight);
46385
46386                 _tileCache = { toLoad: {}, loaded: {}, inflight: {}, seen: {}, rtree: rbush_1() };
46387                 _noteCache = { toLoad: {}, loaded: {}, inflight: {}, inflightPost: {}, note: {}, closed: {}, rtree: rbush_1() };
46388                 _userCache = { toLoad: {}, user: {} };
46389                 _changeset = {};
46390
46391                 return this;
46392             },
46393
46394
46395             getConnectionId: function() {
46396                 return _connectionID;
46397             },
46398
46399
46400             changesetURL: function(changesetID) {
46401                 return urlroot + '/changeset/' + changesetID;
46402             },
46403
46404
46405             changesetsURL: function(center, zoom) {
46406                 var precision = Math.max(0, Math.ceil(Math.log(zoom) / Math.LN2));
46407                 return urlroot + '/history#map=' +
46408                     Math.floor(zoom) + '/' +
46409                     center[1].toFixed(precision) + '/' +
46410                     center[0].toFixed(precision);
46411             },
46412
46413
46414             entityURL: function(entity) {
46415                 return urlroot + '/' + entity.type + '/' + entity.osmId();
46416             },
46417
46418
46419             historyURL: function(entity) {
46420                 return urlroot + '/' + entity.type + '/' + entity.osmId() + '/history';
46421             },
46422
46423
46424             userURL: function(username) {
46425                 return urlroot + '/user/' + username;
46426             },
46427
46428
46429             noteURL: function(note) {
46430                 return urlroot + '/note/' + note.id;
46431             },
46432
46433
46434             noteReportURL: function(note) {
46435                 return urlroot + '/reports/new?reportable_type=Note&reportable_id=' + note.id;
46436             },
46437
46438
46439             // Generic method to load data from the OSM API
46440             // Can handle either auth or unauth calls.
46441             loadFromAPI: function(path, callback, options) {
46442                 options = Object.assign({ skipSeen: true }, options);
46443                 var that = this;
46444                 var cid = _connectionID;
46445
46446                 function done(err, xml) {
46447                     if (that.getConnectionId() !== cid) {
46448                         if (callback) callback({ message: 'Connection Switched', status: -1 });
46449                         return;
46450                     }
46451
46452                     var isAuthenticated = that.authenticated();
46453
46454                     // 400 Bad Request, 401 Unauthorized, 403 Forbidden
46455                     // Logout and retry the request..
46456                     if (isAuthenticated && err && err.status &&
46457                             (err.status === 400 || err.status === 401 || err.status === 403)) {
46458                         that.logout();
46459                         that.loadFromAPI(path, callback, options);
46460
46461                     // else, no retry..
46462                     } else {
46463                         // 509 Bandwidth Limit Exceeded, 429 Too Many Requests
46464                         // Set the rateLimitError flag and trigger a warning..
46465                         if (!isAuthenticated && !_rateLimitError && err && err.status &&
46466                                 (err.status === 509 || err.status === 429)) {
46467                             _rateLimitError = err;
46468                             dispatch$5.call('change');
46469                         }
46470
46471                         if (callback) {
46472                             if (err) {
46473                                 return callback(err);
46474                             } else {
46475                                 return parseXML(xml, callback, options);
46476                             }
46477                         }
46478                     }
46479                 }
46480
46481                 if (this.authenticated()) {
46482                     return oauth.xhr({ method: 'GET', path: path }, done);
46483                 } else {
46484                     var url = urlroot + path;
46485                     var controller = new AbortController();
46486                     d3_xml(url, { signal: controller.signal })
46487                         .then(function(data) {
46488                             done(null, data);
46489                         })
46490                         .catch(function(err) {
46491                             if (err.name === 'AbortError') return;
46492                             // d3-fetch includes status in the error message,
46493                             // but we can't access the response itself
46494                             // https://github.com/d3/d3-fetch/issues/27
46495                             var match = err.message.match(/^\d{3}/);
46496                             if (match) {
46497                                 done({ status: +match[0], statusText: err.message });
46498                             } else {
46499                                 done(err.message);
46500                             }
46501                         });
46502                     return controller;
46503                 }
46504             },
46505
46506
46507             // Load a single entity by id (ways and relations use the `/full` call)
46508             // GET /api/0.6/node/#id
46509             // GET /api/0.6/[way|relation]/#id/full
46510             loadEntity: function(id, callback) {
46511                 var type = osmEntity.id.type(id);
46512                 var osmID = osmEntity.id.toOSM(id);
46513                 var options = { skipSeen: false };
46514
46515                 this.loadFromAPI(
46516                     '/api/0.6/' + type + '/' + osmID + (type !== 'node' ? '/full' : ''),
46517                     function(err, entities) {
46518                         if (callback) callback(err, { data: entities });
46519                     },
46520                     options
46521                 );
46522             },
46523
46524
46525             // Load a single entity with a specific version
46526             // GET /api/0.6/[node|way|relation]/#id/#version
46527             loadEntityVersion: function(id, version, callback) {
46528                 var type = osmEntity.id.type(id);
46529                 var osmID = osmEntity.id.toOSM(id);
46530                 var options = { skipSeen: false };
46531
46532                 this.loadFromAPI(
46533                     '/api/0.6/' + type + '/' + osmID + '/' + version,
46534                     function(err, entities) {
46535                         if (callback) callback(err, { data: entities });
46536                     },
46537                     options
46538                 );
46539             },
46540
46541
46542             // Load multiple entities in chunks
46543             // (note: callback may be called multiple times)
46544             // GET /api/0.6/[nodes|ways|relations]?#parameters
46545             loadMultiple: function(ids, callback) {
46546                 var that = this;
46547                 var groups = utilArrayGroupBy(utilArrayUniq(ids), osmEntity.id.type);
46548
46549                 Object.keys(groups).forEach(function(k) {
46550                     var type = k + 's';   // nodes, ways, relations
46551                     var osmIDs = groups[k].map(function(id) { return osmEntity.id.toOSM(id); });
46552                     var options = { skipSeen: false };
46553
46554                     utilArrayChunk(osmIDs, 150).forEach(function(arr) {
46555                         that.loadFromAPI(
46556                             '/api/0.6/' + type + '?' + type + '=' + arr.join(),
46557                             function(err, entities) {
46558                                 if (callback) callback(err, { data: entities });
46559                             },
46560                             options
46561                         );
46562                     });
46563                 });
46564             },
46565
46566
46567             // Create, upload, and close a changeset
46568             // PUT /api/0.6/changeset/create
46569             // POST /api/0.6/changeset/#id/upload
46570             // PUT /api/0.6/changeset/#id/close
46571             putChangeset: function(changeset, changes, callback) {
46572                 var cid = _connectionID;
46573
46574                 if (_changeset.inflight) {
46575                     return callback({ message: 'Changeset already inflight', status: -2 }, changeset);
46576
46577                 } else if (_changeset.open) {   // reuse existing open changeset..
46578                     return createdChangeset.call(this, null, _changeset.open);
46579
46580                 } else {   // Open a new changeset..
46581                     var options = {
46582                         method: 'PUT',
46583                         path: '/api/0.6/changeset/create',
46584                         options: { header: { 'Content-Type': 'text/xml' } },
46585                         content: JXON.stringify(changeset.asJXON())
46586                     };
46587                     _changeset.inflight = oauth.xhr(
46588                         options,
46589                         wrapcb(this, createdChangeset, cid)
46590                     );
46591                 }
46592
46593
46594                 function createdChangeset(err, changesetID) {
46595                     _changeset.inflight = null;
46596                     if (err) { return callback(err, changeset); }
46597
46598                     _changeset.open = changesetID;
46599                     changeset = changeset.update({ id: changesetID });
46600
46601                     // Upload the changeset..
46602                     var options = {
46603                         method: 'POST',
46604                         path: '/api/0.6/changeset/' + changesetID + '/upload',
46605                         options: { header: { 'Content-Type': 'text/xml' } },
46606                         content: JXON.stringify(changeset.osmChangeJXON(changes))
46607                     };
46608                     _changeset.inflight = oauth.xhr(
46609                         options,
46610                         wrapcb(this, uploadedChangeset, cid)
46611                     );
46612                 }
46613
46614
46615                 function uploadedChangeset(err) {
46616                     _changeset.inflight = null;
46617                     if (err) return callback(err, changeset);
46618
46619                     // Upload was successful, safe to call the callback.
46620                     // Add delay to allow for postgres replication #1646 #2678
46621                     window.setTimeout(function() { callback(null, changeset); }, 2500);
46622                     _changeset.open = null;
46623
46624                     // At this point, we don't really care if the connection was switched..
46625                     // Only try to close the changeset if we're still talking to the same server.
46626                     if (this.getConnectionId() === cid) {
46627                         // Still attempt to close changeset, but ignore response because #2667
46628                         oauth.xhr({
46629                             method: 'PUT',
46630                             path: '/api/0.6/changeset/' + changeset.id + '/close',
46631                             options: { header: { 'Content-Type': 'text/xml' } }
46632                         }, function() { return true; });
46633                     }
46634                 }
46635             },
46636
46637
46638             // Load multiple users in chunks
46639             // (note: callback may be called multiple times)
46640             // GET /api/0.6/users?users=#id1,#id2,...,#idn
46641             loadUsers: function(uids, callback) {
46642                 var toLoad = [];
46643                 var cached = [];
46644
46645                 utilArrayUniq(uids).forEach(function(uid) {
46646                     if (_userCache.user[uid]) {
46647                         delete _userCache.toLoad[uid];
46648                         cached.push(_userCache.user[uid]);
46649                     } else {
46650                         toLoad.push(uid);
46651                     }
46652                 });
46653
46654                 if (cached.length || !this.authenticated()) {
46655                     callback(undefined, cached);
46656                     if (!this.authenticated()) return;  // require auth
46657                 }
46658
46659                 utilArrayChunk(toLoad, 150).forEach(function(arr) {
46660                     oauth.xhr(
46661                         { method: 'GET', path: '/api/0.6/users?users=' + arr.join() },
46662                         wrapcb(this, done, _connectionID)
46663                     );
46664                 }.bind(this));
46665
46666                 function done(err, xml) {
46667                     if (err) { return callback(err); }
46668
46669                     var options = { skipSeen: true };
46670                     return parseXML(xml, function(err, results) {
46671                         if (err) {
46672                             return callback(err);
46673                         } else {
46674                             return callback(undefined, results);
46675                         }
46676                     }, options);
46677                 }
46678             },
46679
46680
46681             // Load a given user by id
46682             // GET /api/0.6/user/#id
46683             loadUser: function(uid, callback) {
46684                 if (_userCache.user[uid] || !this.authenticated()) {   // require auth
46685                     delete _userCache.toLoad[uid];
46686                     return callback(undefined, _userCache.user[uid]);
46687                 }
46688
46689                 oauth.xhr(
46690                     { method: 'GET', path: '/api/0.6/user/' + uid },
46691                     wrapcb(this, done, _connectionID)
46692                 );
46693
46694                 function done(err, xml) {
46695                     if (err) { return callback(err); }
46696
46697                     var options = { skipSeen: true };
46698                     return parseXML(xml, function(err, results) {
46699                         if (err) {
46700                             return callback(err);
46701                         } else {
46702                             return callback(undefined, results[0]);
46703                         }
46704                     }, options);
46705                 }
46706             },
46707
46708
46709             // Load the details of the logged-in user
46710             // GET /api/0.6/user/details
46711             userDetails: function(callback) {
46712                 if (_userDetails) {    // retrieve cached
46713                     return callback(undefined, _userDetails);
46714                 }
46715
46716                 oauth.xhr(
46717                     { method: 'GET', path: '/api/0.6/user/details' },
46718                     wrapcb(this, done, _connectionID)
46719                 );
46720
46721                 function done(err, xml) {
46722                     if (err) { return callback(err); }
46723
46724                     var options = { skipSeen: false };
46725                     return parseXML(xml, function(err, results) {
46726                         if (err) {
46727                             return callback(err);
46728                         } else {
46729                             _userDetails = results[0];
46730                             return callback(undefined, _userDetails);
46731                         }
46732                     }, options);
46733                 }
46734             },
46735
46736
46737             // Load previous changesets for the logged in user
46738             // GET /api/0.6/changesets?user=#id
46739             userChangesets: function(callback) {
46740                 if (_userChangesets) {    // retrieve cached
46741                     return callback(undefined, _userChangesets);
46742                 }
46743
46744                 this.userDetails(
46745                     wrapcb(this, gotDetails, _connectionID)
46746                 );
46747
46748
46749                 function gotDetails(err, user) {
46750                     if (err) { return callback(err); }
46751
46752                     oauth.xhr(
46753                         { method: 'GET', path: '/api/0.6/changesets?user=' + user.id },
46754                         wrapcb(this, done, _connectionID)
46755                     );
46756                 }
46757
46758                 function done(err, xml) {
46759                     if (err) { return callback(err); }
46760
46761                     _userChangesets = Array.prototype.map.call(
46762                         xml.getElementsByTagName('changeset'),
46763                         function (changeset) { return { tags: getTags(changeset) }; }
46764                     ).filter(function (changeset) {
46765                         var comment = changeset.tags.comment;
46766                         return comment && comment !== '';
46767                     });
46768
46769                     return callback(undefined, _userChangesets);
46770                 }
46771             },
46772
46773
46774             // Fetch the status of the OSM API
46775             // GET /api/capabilities
46776             status: function(callback) {
46777                 var url = urlroot + '/api/capabilities';
46778                 var errback = wrapcb(this, done, _connectionID);
46779                 d3_xml(url)
46780                     .then(function(data) { errback(null, data); })
46781                     .catch(function(err) { errback(err.message); });
46782
46783                 function done(err, xml) {
46784                     if (err) { return callback(err); }
46785
46786                     // update blacklists
46787                     var elements = xml.getElementsByTagName('blacklist');
46788                     var regexes = [];
46789                     for (var i = 0; i < elements.length; i++) {
46790                         var regex = elements[i].getAttribute('regex');  // needs unencode?
46791                         if (regex) {
46792                             regexes.push(regex);
46793                         }
46794                     }
46795                     if (regexes.length) {
46796                         _blacklists = regexes;
46797                     }
46798
46799                     if (_rateLimitError) {
46800                         return callback(_rateLimitError, 'rateLimited');
46801                     } else {
46802                         var apiStatus = xml.getElementsByTagName('status');
46803                         var val = apiStatus[0].getAttribute('api');
46804                         return callback(undefined, val);
46805                     }
46806                 }
46807             },
46808
46809
46810             // Load data (entities) from the API in tiles
46811             // GET /api/0.6/map?bbox=
46812             loadTiles: function(projection, callback) {
46813                 if (_off) return;
46814
46815                 // determine the needed tiles to cover the view
46816                 var tiles = tiler$4.zoomExtent([_tileZoom, _tileZoom]).getTiles(projection);
46817
46818                 // abort inflight requests that are no longer needed
46819                 var hadRequests = hasInflightRequests(_tileCache);
46820                 abortUnwantedRequests$2(_tileCache, tiles);
46821                 if (hadRequests && !hasInflightRequests(_tileCache)) {
46822                     dispatch$5.call('loaded');    // stop the spinner
46823                 }
46824
46825                 // issue new requests..
46826                 tiles.forEach(function(tile) {
46827                     this.loadTile(tile, callback);
46828                 }, this);
46829             },
46830
46831
46832             // Load a single data tile
46833             // GET /api/0.6/map?bbox=
46834             loadTile: function(tile, callback) {
46835                 if (_off) return;
46836                 if (_tileCache.loaded[tile.id] || _tileCache.inflight[tile.id]) return;
46837
46838                 if (!hasInflightRequests(_tileCache)) {
46839                     dispatch$5.call('loading');   // start the spinner
46840                 }
46841
46842                 var path = '/api/0.6/map?bbox=';
46843                 var options = { skipSeen: true };
46844
46845                 _tileCache.inflight[tile.id] = this.loadFromAPI(
46846                     path + tile.extent.toParam(),
46847                     function(err, parsed) {
46848                         delete _tileCache.inflight[tile.id];
46849                         if (!err) {
46850                             delete _tileCache.toLoad[tile.id];
46851                             _tileCache.loaded[tile.id] = true;
46852                             var bbox = tile.extent.bbox();
46853                             bbox.id = tile.id;
46854                             _tileCache.rtree.insert(bbox);
46855                         }
46856                         if (callback) {
46857                             callback(err, Object.assign({ data: parsed }, tile));
46858                         }
46859                         if (!hasInflightRequests(_tileCache)) {
46860                             dispatch$5.call('loaded');     // stop the spinner
46861                         }
46862                     },
46863                     options
46864                 );
46865             },
46866
46867
46868             isDataLoaded: function(loc) {
46869                 var bbox = { minX: loc[0], minY: loc[1], maxX: loc[0], maxY: loc[1] };
46870                 return _tileCache.rtree.collides(bbox);
46871             },
46872
46873
46874             // load the tile that covers the given `loc`
46875             loadTileAtLoc: function(loc, callback) {
46876                 var k = geoZoomToScale(_tileZoom + 1);
46877                 var offset = geoRawMercator().scale(k)(loc);
46878                 var projection = geoRawMercator().transform({ k: k, x: -offset[0], y: -offset[1] });
46879                 var tiles = tiler$4.zoomExtent([_tileZoom, _tileZoom]).getTiles(projection);
46880
46881                 tiles.forEach(function(tile) {
46882                     if (_tileCache.toLoad[tile.id]) return;  // already in queue
46883                     _tileCache.toLoad[tile.id] = true;
46884                     this.loadTile(tile, callback);
46885                 }, this);
46886             },
46887
46888
46889             // Load notes from the API in tiles
46890             // GET /api/0.6/notes?bbox=
46891             loadNotes: function(projection, noteOptions) {
46892                 noteOptions = Object.assign({ limit: 10000, closed: 7 }, noteOptions);
46893                 if (_off) return;
46894
46895                 var that = this;
46896                 var path = '/api/0.6/notes?limit=' + noteOptions.limit + '&closed=' + noteOptions.closed + '&bbox=';
46897                 var throttleLoadUsers = throttle(function() {
46898                     var uids = Object.keys(_userCache.toLoad);
46899                     if (!uids.length) return;
46900                     that.loadUsers(uids, function() {});  // eagerly load user details
46901                 }, 750);
46902
46903                 // determine the needed tiles to cover the view
46904                 var tiles = tiler$4.zoomExtent([_noteZoom, _noteZoom]).getTiles(projection);
46905
46906                 // abort inflight requests that are no longer needed
46907                 abortUnwantedRequests$2(_noteCache, tiles);
46908
46909                 // issue new requests..
46910                 tiles.forEach(function(tile) {
46911                     if (_noteCache.loaded[tile.id] || _noteCache.inflight[tile.id]) return;
46912
46913                     var options = { skipSeen: false };
46914                     _noteCache.inflight[tile.id] = that.loadFromAPI(
46915                         path + tile.extent.toParam(),
46916                         function(err) {
46917                             delete _noteCache.inflight[tile.id];
46918                             if (!err) {
46919                                 _noteCache.loaded[tile.id] = true;
46920                             }
46921                             throttleLoadUsers();
46922                             dispatch$5.call('loadedNotes');
46923                         },
46924                         options
46925                     );
46926                 });
46927             },
46928
46929
46930             // Create a note
46931             // POST /api/0.6/notes?params
46932             postNoteCreate: function(note, callback) {
46933                 if (!this.authenticated()) {
46934                     return callback({ message: 'Not Authenticated', status: -3 }, note);
46935                 }
46936                 if (_noteCache.inflightPost[note.id]) {
46937                     return callback({ message: 'Note update already inflight', status: -2 }, note);
46938                 }
46939
46940                 if (!note.loc[0] || !note.loc[1] || !note.newComment) return; // location & description required
46941
46942                 var comment = note.newComment;
46943                 if (note.newCategory && note.newCategory !== 'None') { comment += ' #' + note.newCategory; }
46944
46945                 var path = '/api/0.6/notes?' + utilQsString({ lon: note.loc[0], lat: note.loc[1], text: comment });
46946
46947                 _noteCache.inflightPost[note.id] = oauth.xhr(
46948                     { method: 'POST', path: path },
46949                     wrapcb(this, done, _connectionID)
46950                 );
46951
46952
46953                 function done(err, xml) {
46954                     delete _noteCache.inflightPost[note.id];
46955                     if (err) { return callback(err); }
46956
46957                     // we get the updated note back, remove from caches and reparse..
46958                     this.removeNote(note);
46959
46960                     var options = { skipSeen: false };
46961                     return parseXML(xml, function(err, results) {
46962                         if (err) {
46963                             return callback(err);
46964                         } else {
46965                             return callback(undefined, results[0]);
46966                         }
46967                     }, options);
46968                 }
46969             },
46970
46971
46972             // Update a note
46973             // POST /api/0.6/notes/#id/comment?text=comment
46974             // POST /api/0.6/notes/#id/close?text=comment
46975             // POST /api/0.6/notes/#id/reopen?text=comment
46976             postNoteUpdate: function(note, newStatus, callback) {
46977                 if (!this.authenticated()) {
46978                     return callback({ message: 'Not Authenticated', status: -3 }, note);
46979                 }
46980                 if (_noteCache.inflightPost[note.id]) {
46981                     return callback({ message: 'Note update already inflight', status: -2 }, note);
46982                 }
46983
46984                 var action;
46985                 if (note.status !== 'closed' && newStatus === 'closed') {
46986                     action = 'close';
46987                 } else if (note.status !== 'open' && newStatus === 'open') {
46988                     action = 'reopen';
46989                 } else {
46990                     action = 'comment';
46991                     if (!note.newComment) return; // when commenting, comment required
46992                 }
46993
46994                 var path = '/api/0.6/notes/' + note.id + '/' + action;
46995                 if (note.newComment) {
46996                     path += '?' + utilQsString({ text: note.newComment });
46997                 }
46998
46999                 _noteCache.inflightPost[note.id] = oauth.xhr(
47000                     { method: 'POST', path: path },
47001                     wrapcb(this, done, _connectionID)
47002                 );
47003
47004
47005                 function done(err, xml) {
47006                     delete _noteCache.inflightPost[note.id];
47007                     if (err) { return callback(err); }
47008
47009                     // we get the updated note back, remove from caches and reparse..
47010                     this.removeNote(note);
47011
47012                     // update closed note cache - used to populate `closed:note` changeset tag
47013                     if (action === 'close') {
47014                         _noteCache.closed[note.id] = true;
47015                     } else if (action === 'reopen') {
47016                         delete _noteCache.closed[note.id];
47017                     }
47018
47019                     var options = { skipSeen: false };
47020                     return parseXML(xml, function(err, results) {
47021                         if (err) {
47022                             return callback(err);
47023                         } else {
47024                             return callback(undefined, results[0]);
47025                         }
47026                     }, options);
47027                 }
47028             },
47029
47030
47031             switch: function(options) {
47032                 urlroot = options.urlroot;
47033
47034                 oauth.options(Object.assign({
47035                     url: urlroot,
47036                     loading: authLoading,
47037                     done: authDone
47038                 }, options));
47039
47040                 this.reset();
47041                 this.userChangesets(function() {});  // eagerly load user details/changesets
47042                 dispatch$5.call('change');
47043                 return this;
47044             },
47045
47046
47047             toggle: function(val) {
47048                 _off = !val;
47049                 return this;
47050             },
47051
47052
47053             isChangesetInflight: function() {
47054                 return !!_changeset.inflight;
47055             },
47056
47057
47058             // get/set cached data
47059             // This is used to save/restore the state when entering/exiting the walkthrough
47060             // Also used for testing purposes.
47061             caches: function(obj) {
47062                 function cloneCache(source) {
47063                     var target = {};
47064                     Object.keys(source).forEach(function(k) {
47065                         if (k === 'rtree') {
47066                             target.rtree = rbush_1().fromJSON(source.rtree.toJSON());  // clone rbush
47067                         } else if (k === 'note') {
47068                             target.note = {};
47069                             Object.keys(source.note).forEach(function(id) {
47070                                 target.note[id] = osmNote(source.note[id]);   // copy notes
47071                             });
47072                         } else {
47073                             target[k] = JSON.parse(JSON.stringify(source[k]));   // clone deep
47074                         }
47075                     });
47076                     return target;
47077                 }
47078
47079                 if (!arguments.length) {
47080                     return {
47081                         tile: cloneCache(_tileCache),
47082                         note: cloneCache(_noteCache),
47083                         user: cloneCache(_userCache)
47084                     };
47085                 }
47086
47087                 // access caches directly for testing (e.g., loading notes rtree)
47088                 if (obj === 'get') {
47089                     return {
47090                         tile: _tileCache,
47091                         note: _noteCache,
47092                         user: _userCache
47093                     };
47094                 }
47095
47096                 if (obj.tile) {
47097                     _tileCache = obj.tile;
47098                     _tileCache.inflight = {};
47099                 }
47100                 if (obj.note) {
47101                     _noteCache = obj.note;
47102                     _noteCache.inflight = {};
47103                     _noteCache.inflightPost = {};
47104                 }
47105                 if (obj.user) {
47106                     _userCache = obj.user;
47107                 }
47108
47109                 return this;
47110             },
47111
47112
47113             logout: function() {
47114                 _userChangesets = undefined;
47115                 _userDetails = undefined;
47116                 oauth.logout();
47117                 dispatch$5.call('change');
47118                 return this;
47119             },
47120
47121
47122             authenticated: function() {
47123                 return oauth.authenticated();
47124             },
47125
47126
47127             authenticate: function(callback) {
47128                 var that = this;
47129                 var cid = _connectionID;
47130                 _userChangesets = undefined;
47131                 _userDetails = undefined;
47132
47133                 function done(err, res) {
47134                     if (err) {
47135                         if (callback) callback(err);
47136                         return;
47137                     }
47138                     if (that.getConnectionId() !== cid) {
47139                         if (callback) callback({ message: 'Connection Switched', status: -1 });
47140                         return;
47141                     }
47142                     _rateLimitError = undefined;
47143                     dispatch$5.call('change');
47144                     if (callback) callback(err, res);
47145                     that.userChangesets(function() {});  // eagerly load user details/changesets
47146                 }
47147
47148                 return oauth.authenticate(done);
47149             },
47150
47151
47152             imageryBlacklists: function() {
47153                 return _blacklists;
47154             },
47155
47156
47157             tileZoom: function(val) {
47158                 if (!arguments.length) return _tileZoom;
47159                 _tileZoom = val;
47160                 return this;
47161             },
47162
47163
47164             // get all cached notes covering the viewport
47165             notes: function(projection) {
47166                 var viewport = projection.clipExtent();
47167                 var min = [viewport[0][0], viewport[1][1]];
47168                 var max = [viewport[1][0], viewport[0][1]];
47169                 var bbox = geoExtent(projection.invert(min), projection.invert(max)).bbox();
47170
47171                 return _noteCache.rtree.search(bbox)
47172                     .map(function(d) { return d.data; });
47173             },
47174
47175
47176             // get a single note from the cache
47177             getNote: function(id) {
47178                 return _noteCache.note[id];
47179             },
47180
47181
47182             // remove a single note from the cache
47183             removeNote: function(note) {
47184                 if (!(note instanceof osmNote) || !note.id) return;
47185
47186                 delete _noteCache.note[note.id];
47187                 updateRtree$2(encodeNoteRtree(note), false);  // false = remove
47188             },
47189
47190
47191             // replace a single note in the cache
47192             replaceNote: function(note) {
47193                 if (!(note instanceof osmNote) || !note.id) return;
47194
47195                 _noteCache.note[note.id] = note;
47196                 updateRtree$2(encodeNoteRtree(note), true);  // true = replace
47197                 return note;
47198             },
47199
47200
47201             // Get an array of note IDs closed during this session.
47202             // Used to populate `closed:note` changeset tag
47203             getClosedIDs: function() {
47204                 return Object.keys(_noteCache.closed).sort();
47205             }
47206
47207         };
47208
47209         var apibase$3 = 'https://wiki.openstreetmap.org/w/api.php';
47210         var _inflight$1 = {};
47211         var _wikibaseCache = {};
47212         var _localeIDs = { en: false };
47213
47214
47215         var debouncedRequest = debounce(request, 500, { leading: false });
47216
47217         function request(url, callback) {
47218             if (_inflight$1[url]) return;
47219             var controller = new AbortController();
47220             _inflight$1[url] = controller;
47221
47222             d3_json(url, { signal: controller.signal })
47223                 .then(function(result) {
47224                     delete _inflight$1[url];
47225                     if (callback) callback(null, result);
47226                 })
47227                 .catch(function(err) {
47228                     delete _inflight$1[url];
47229                     if (err.name === 'AbortError') return;
47230                     if (callback) callback(err.message);
47231                 });
47232         }
47233
47234
47235         /**
47236          * Get the best string value from the descriptions/labels result
47237          * Note that if mediawiki doesn't recognize language code, it will return all values.
47238          * In that case, fallback to use English.
47239          * @param values object - either descriptions or labels
47240          * @param langCode String
47241          * @returns localized string
47242          */
47243         function localizedToString(values, langCode) {
47244             if (values) {
47245                 values = values[langCode] || values.en;
47246             }
47247             return values ? values.value : '';
47248         }
47249
47250
47251         var serviceOsmWikibase = {
47252
47253             init: function() {
47254                 _inflight$1 = {};
47255                 _wikibaseCache = {};
47256                 _localeIDs = {};
47257             },
47258
47259
47260             reset: function() {
47261                 Object.values(_inflight$1).forEach(function(controller) { controller.abort(); });
47262                 _inflight$1 = {};
47263             },
47264
47265
47266             /**
47267              * Get the best value for the property, or undefined if not found
47268              * @param entity object from wikibase
47269              * @param property string e.g. 'P4' for image
47270              * @param langCode string e.g. 'fr' for French
47271              */
47272             claimToValue: function(entity, property, langCode) {
47273                 if (!entity.claims[property]) return undefined;
47274                 var locale = _localeIDs[langCode];
47275                 var preferredPick, localePick;
47276
47277                 entity.claims[property].forEach(function(stmt) {
47278                     // If exists, use value limited to the needed language (has a qualifier P26 = locale)
47279                     // Or if not found, use the first value with the "preferred" rank
47280                     if (!preferredPick && stmt.rank === 'preferred') {
47281                         preferredPick = stmt;
47282                     }
47283                     if (locale && stmt.qualifiers && stmt.qualifiers.P26 &&
47284                         stmt.qualifiers.P26[0].datavalue.value.id === locale
47285                     ) {
47286                         localePick = stmt;
47287                     }
47288                 });
47289
47290                 var result = localePick || preferredPick;
47291                 if (result) {
47292                     var datavalue = result.mainsnak.datavalue;
47293                     return datavalue.type === 'wikibase-entityid' ? datavalue.value.id : datavalue.value;
47294                 } else {
47295                     return undefined;
47296                 }
47297             },
47298
47299
47300             /**
47301              * Convert monolingual property into a key-value object (language -> value)
47302              * @param entity object from wikibase
47303              * @param property string e.g. 'P31' for monolingual wiki page title
47304              */
47305             monolingualClaimToValueObj: function(entity, property) {
47306                 if (!entity || !entity.claims[property]) return undefined;
47307
47308                 return entity.claims[property].reduce(function(acc, obj) {
47309                     var value = obj.mainsnak.datavalue.value;
47310                     acc[value.language] = value.text;
47311                     return acc;
47312                 }, {});
47313             },
47314
47315
47316             toSitelink: function(key, value) {
47317                 var result = value ? ('Tag:' + key + '=' + value) : 'Key:' + key;
47318                 return result.replace(/_/g, ' ').trim();
47319             },
47320
47321
47322             //
47323             // Pass params object of the form:
47324             // {
47325             //   key: 'string',
47326             //   value: 'string',
47327             //   rtype: 'string',
47328             //   langCode: 'string'
47329             // }
47330             //
47331             getEntity: function(params, callback) {
47332                 var doRequest = params.debounce ? debouncedRequest : request;
47333                 var that = this;
47334                 var titles = [];
47335                 var result = {};
47336                 var rtypeSitelink = params.rtype ? ('Relation:' + params.rtype).replace(/_/g, ' ').trim() : false;
47337                 var keySitelink = params.key ? this.toSitelink(params.key) : false;
47338                 var tagSitelink = (params.key && params.value) ? this.toSitelink(params.key, params.value) : false;
47339                 var localeSitelink;
47340
47341                 if (params.langCode && _localeIDs[params.langCode] === undefined) {
47342                     // If this is the first time we are asking about this locale,
47343                     // fetch corresponding entity (if it exists), and cache it.
47344                     // If there is no such entry, cache `false` value to avoid re-requesting it.
47345                     localeSitelink = ('Locale:' + params.langCode).replace(/_/g, ' ').trim();
47346                     titles.push(localeSitelink);
47347                 }
47348
47349                 if (rtypeSitelink) {
47350                     if (_wikibaseCache[rtypeSitelink]) {
47351                         result.rtype = _wikibaseCache[rtypeSitelink];
47352                     } else {
47353                         titles.push(rtypeSitelink);
47354                     }
47355                 }
47356
47357                 if (keySitelink) {
47358                     if (_wikibaseCache[keySitelink]) {
47359                         result.key = _wikibaseCache[keySitelink];
47360                     } else {
47361                         titles.push(keySitelink);
47362                     }
47363                 }
47364
47365                 if (tagSitelink) {
47366                     if (_wikibaseCache[tagSitelink]) {
47367                         result.tag = _wikibaseCache[tagSitelink];
47368                     } else {
47369                         titles.push(tagSitelink);
47370                     }
47371                 }
47372
47373                 if (!titles.length) {
47374                     // Nothing to do, we already had everything in the cache
47375                     return callback(null, result);
47376                 }
47377
47378                 // Requesting just the user language code
47379                 // If backend recognizes the code, it will perform proper fallbacks,
47380                 // and the result will contain the requested code. If not, all values are returned:
47381                 // {"zh-tw":{"value":"...","language":"zh-tw","source-language":"zh-hant"}
47382                 // {"pt-br":{"value":"...","language":"pt","for-language":"pt-br"}}
47383                 var obj = {
47384                     action: 'wbgetentities',
47385                     sites: 'wiki',
47386                     titles: titles.join('|'),
47387                     languages: params.langCode,
47388                     languagefallback: 1,
47389                     origin: '*',
47390                     format: 'json',
47391                     // There is an MW Wikibase API bug https://phabricator.wikimedia.org/T212069
47392                     // We shouldn't use v1 until it gets fixed, but should switch to it afterwards
47393                     // formatversion: 2,
47394                 };
47395
47396                 var url = apibase$3 + '?' + utilQsString(obj);
47397                 doRequest(url, function(err, d) {
47398                     if (err) {
47399                         callback(err);
47400                     } else if (!d.success || d.error) {
47401                         callback(d.error.messages.map(function(v) { return v.html['*']; }).join('<br>'));
47402                     } else {
47403                         var localeID = false;
47404                         Object.values(d.entities).forEach(function(res) {
47405                             if (res.missing !== '') {
47406                                 // Simplify access to the localized values
47407                                 res.description = localizedToString(res.descriptions, params.langCode);
47408                                 res.label = localizedToString(res.labels, params.langCode);
47409
47410                                 var title = res.sitelinks.wiki.title;
47411                                 if (title === rtypeSitelink) {
47412                                     _wikibaseCache[rtypeSitelink] = res;
47413                                     result.rtype = res;
47414                                 } else if (title === keySitelink) {
47415                                     _wikibaseCache[keySitelink] = res;
47416                                     result.key = res;
47417                                 } else if (title === tagSitelink) {
47418                                     _wikibaseCache[tagSitelink] = res;
47419                                     result.tag = res;
47420                                 } else if (title === localeSitelink) {
47421                                     localeID = res.id;
47422                                 } else {
47423                                     console.log('Unexpected title ' + title);  // eslint-disable-line no-console
47424                                 }
47425                             }
47426                         });
47427
47428                         if (localeSitelink) {
47429                             // If locale ID is not found, store false to prevent repeated queries
47430                             that.addLocale(params.langCode, localeID);
47431                         }
47432
47433                         callback(null, result);
47434                     }
47435                 });
47436             },
47437
47438
47439             //
47440             // Pass params object of the form:
47441             // {
47442             //   key: 'string',     // required
47443             //   value: 'string'    // optional
47444             // }
47445             //   -or-
47446             // {
47447             //   rtype: 'rtype'     // relation type  (e.g. 'multipolygon')
47448             // }
47449             //
47450             // Get an result object used to display tag documentation
47451             // {
47452             //   title:        'string',
47453             //   description:  'string',
47454             //   editURL:      'string',
47455             //   imageURL:     'string',
47456             //   wiki:         { title: 'string', text: 'string', url: 'string' }
47457             // }
47458             //
47459             getDocs: function(params, callback) {
47460                 var that = this;
47461                 var langCode = utilDetect().locale.toLowerCase();
47462                 params.langCode = langCode;
47463
47464                 this.getEntity(params, function(err, data) {
47465                     if (err) {
47466                         callback(err);
47467                         return;
47468                     }
47469
47470                     var entity = data.rtype || data.tag || data.key;
47471                     if (!entity) {
47472                         callback('No entity');
47473                         return;
47474                     }
47475
47476                     // prepare result
47477                     var result = {
47478                         title: entity.title,
47479                         description: entity.description,
47480                         editURL: 'https://wiki.openstreetmap.org/wiki/' + entity.title
47481                     };
47482
47483                     // add image
47484                     if (entity.claims) {
47485                         var imageroot;
47486                         var image = that.claimToValue(entity, 'P4', langCode);
47487                         if (image) {
47488                             imageroot = 'https://commons.wikimedia.org/w/index.php';
47489                         } else {
47490                             image = that.claimToValue(entity, 'P28', langCode);
47491                             if (image) {
47492                                 imageroot = 'https://wiki.openstreetmap.org/w/index.php';
47493                             }
47494                         }
47495                         if (imageroot && image) {
47496                             result.imageURL = imageroot + '?' + utilQsString({
47497                                 title: 'Special:Redirect/file/' + image,
47498                                 width: 400
47499                             });
47500                         }
47501                     }
47502
47503                     // Try to get a wiki page from tag data item first, followed by the corresponding key data item.
47504                     // If neither tag nor key data item contain a wiki page in the needed language nor English,
47505                     // get the first found wiki page from either the tag or the key item.
47506                     var rtypeWiki = that.monolingualClaimToValueObj(data.rtype, 'P31');
47507                     var tagWiki = that.monolingualClaimToValueObj(data.tag, 'P31');
47508                     var keyWiki = that.monolingualClaimToValueObj(data.key, 'P31');
47509
47510                     // If exact language code does not exist, try to find the first part before the '-'
47511                     // BUG: in some cases, a more elaborate fallback logic might be needed
47512                     var langPrefix = langCode.split('-', 2)[0];
47513
47514                     // use the first acceptable wiki page
47515                     result.wiki =
47516                         getWikiInfo(rtypeWiki, langCode, 'inspector.wiki_reference') ||
47517                         getWikiInfo(rtypeWiki, langPrefix, 'inspector.wiki_reference') ||
47518                         getWikiInfo(rtypeWiki, 'en', 'inspector.wiki_en_reference') ||
47519                         getWikiInfo(tagWiki, langCode, 'inspector.wiki_reference') ||
47520                         getWikiInfo(tagWiki, langPrefix, 'inspector.wiki_reference') ||
47521                         getWikiInfo(tagWiki, 'en', 'inspector.wiki_en_reference') ||
47522                         getWikiInfo(keyWiki, langCode, 'inspector.wiki_reference') ||
47523                         getWikiInfo(keyWiki, langPrefix, 'inspector.wiki_reference') ||
47524                         getWikiInfo(keyWiki, 'en', 'inspector.wiki_en_reference');
47525
47526                     callback(null, result);
47527
47528
47529                     // Helper method to get wiki info if a given language exists
47530                     function getWikiInfo(wiki, langCode, tKey) {
47531                         if (wiki && wiki[langCode]) {
47532                             return {
47533                                 title: wiki[langCode],
47534                                 text: tKey,
47535                                 url: 'https://wiki.openstreetmap.org/wiki/' + wiki[langCode]
47536                             };
47537                         }
47538                     }
47539                 });
47540             },
47541
47542
47543             addLocale: function(langCode, qid) {
47544                 // Makes it easier to unit test
47545                 _localeIDs[langCode] = qid;
47546             },
47547
47548
47549             apibase: function(val) {
47550                 if (!arguments.length) return apibase$3;
47551                 apibase$3 = val;
47552                 return this;
47553             }
47554
47555         };
47556
47557         var jsonpCache = {};
47558         window.jsonpCache = jsonpCache;
47559
47560         function jsonpRequest(url, callback) {
47561             var request = {
47562                 abort: function() {}
47563             };
47564
47565             if (window.JSONP_FIX) {
47566                 if (window.JSONP_DELAY === 0) {
47567                     callback(window.JSONP_FIX);
47568                 } else {
47569                     var t = window.setTimeout(function() {
47570                         callback(window.JSONP_FIX);
47571                     }, window.JSONP_DELAY || 0);
47572
47573                     request.abort = function() { window.clearTimeout(t); };
47574                 }
47575
47576                 return request;
47577             }
47578
47579             function rand() {
47580                 var chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
47581                 var c = '';
47582                 var i = -1;
47583                 while (++i < 15) c += chars.charAt(Math.floor(Math.random() * 52));
47584                 return c;
47585             }
47586
47587             function create(url) {
47588                 var e = url.match(/callback=(\w+)/);
47589                 var c = e ? e[1] : rand();
47590
47591                 jsonpCache[c] = function(data) {
47592                     if (jsonpCache[c]) {
47593                         callback(data);
47594                     }
47595                     finalize();
47596                 };
47597
47598                 function finalize() {
47599                     delete jsonpCache[c];
47600                     script.remove();
47601                 }
47602
47603                 request.abort = finalize;
47604                 return 'jsonpCache.' + c;
47605             }
47606
47607             var cb = create(url);
47608
47609             var script = d3_select('head')
47610                 .append('script')
47611                 .attr('type', 'text/javascript')
47612                 .attr('src', url.replace(/(\{|%7B)callback(\}|%7D)/, cb));
47613
47614             return request;
47615         }
47616
47617         var q = createCommonjsModule(function (module, exports) {
47618         // vim:ts=4:sts=4:sw=4:
47619         /*!
47620          *
47621          * Copyright 2009-2017 Kris Kowal under the terms of the MIT
47622          * license found at https://github.com/kriskowal/q/blob/v1/LICENSE
47623          *
47624          * With parts by Tyler Close
47625          * Copyright 2007-2009 Tyler Close under the terms of the MIT X license found
47626          * at http://www.opensource.org/licenses/mit-license.html
47627          * Forked at ref_send.js version: 2009-05-11
47628          *
47629          * With parts by Mark Miller
47630          * Copyright (C) 2011 Google Inc.
47631          *
47632          * Licensed under the Apache License, Version 2.0 (the "License");
47633          * you may not use this file except in compliance with the License.
47634          * You may obtain a copy of the License at
47635          *
47636          * http://www.apache.org/licenses/LICENSE-2.0
47637          *
47638          * Unless required by applicable law or agreed to in writing, software
47639          * distributed under the License is distributed on an "AS IS" BASIS,
47640          * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
47641          * See the License for the specific language governing permissions and
47642          * limitations under the License.
47643          *
47644          */
47645
47646         (function (definition) {
47647
47648             // This file will function properly as a <script> tag, or a module
47649             // using CommonJS and NodeJS or RequireJS module formats.  In
47650             // Common/Node/RequireJS, the module exports the Q API and when
47651             // executed as a simple <script>, it creates a Q global instead.
47652
47653             // Montage Require
47654             if (typeof bootstrap === "function") {
47655                 bootstrap("promise", definition);
47656
47657             // CommonJS
47658             } else {
47659                 module.exports = definition();
47660
47661             // RequireJS
47662             }
47663
47664         })(function () {
47665
47666         var hasStacks = false;
47667         try {
47668             throw new Error();
47669         } catch (e) {
47670             hasStacks = !!e.stack;
47671         }
47672
47673         // All code after this point will be filtered from stack traces reported
47674         // by Q.
47675         var qStartingLine = captureLine();
47676         var qFileName;
47677
47678         // shims
47679
47680         // used for fallback in "allResolved"
47681         var noop = function () {};
47682
47683         // Use the fastest possible means to execute a task in a future turn
47684         // of the event loop.
47685         var nextTick =(function () {
47686             // linked list of tasks (single, with head node)
47687             var head = {task: void 0, next: null};
47688             var tail = head;
47689             var flushing = false;
47690             var requestTick = void 0;
47691             var isNodeJS = false;
47692             // queue for late tasks, used by unhandled rejection tracking
47693             var laterQueue = [];
47694
47695             function flush() {
47696                 /* jshint loopfunc: true */
47697                 var task, domain;
47698
47699                 while (head.next) {
47700                     head = head.next;
47701                     task = head.task;
47702                     head.task = void 0;
47703                     domain = head.domain;
47704
47705                     if (domain) {
47706                         head.domain = void 0;
47707                         domain.enter();
47708                     }
47709                     runSingle(task, domain);
47710
47711                 }
47712                 while (laterQueue.length) {
47713                     task = laterQueue.pop();
47714                     runSingle(task);
47715                 }
47716                 flushing = false;
47717             }
47718             // runs a single function in the async queue
47719             function runSingle(task, domain) {
47720                 try {
47721                     task();
47722
47723                 } catch (e) {
47724                     if (isNodeJS) {
47725                         // In node, uncaught exceptions are considered fatal errors.
47726                         // Re-throw them synchronously to interrupt flushing!
47727
47728                         // Ensure continuation if the uncaught exception is suppressed
47729                         // listening "uncaughtException" events (as domains does).
47730                         // Continue in next event to avoid tick recursion.
47731                         if (domain) {
47732                             domain.exit();
47733                         }
47734                         setTimeout(flush, 0);
47735                         if (domain) {
47736                             domain.enter();
47737                         }
47738
47739                         throw e;
47740
47741                     } else {
47742                         // In browsers, uncaught exceptions are not fatal.
47743                         // Re-throw them asynchronously to avoid slow-downs.
47744                         setTimeout(function () {
47745                             throw e;
47746                         }, 0);
47747                     }
47748                 }
47749
47750                 if (domain) {
47751                     domain.exit();
47752                 }
47753             }
47754
47755             nextTick = function (task) {
47756                 tail = tail.next = {
47757                     task: task,
47758                     domain: isNodeJS && process.domain,
47759                     next: null
47760                 };
47761
47762                 if (!flushing) {
47763                     flushing = true;
47764                     requestTick();
47765                 }
47766             };
47767
47768             if (typeof process === "object" &&
47769                 process.toString() === "[object process]" && process.nextTick) {
47770                 // Ensure Q is in a real Node environment, with a `process.nextTick`.
47771                 // To see through fake Node environments:
47772                 // * Mocha test runner - exposes a `process` global without a `nextTick`
47773                 // * Browserify - exposes a `process.nexTick` function that uses
47774                 //   `setTimeout`. In this case `setImmediate` is preferred because
47775                 //    it is faster. Browserify's `process.toString()` yields
47776                 //   "[object Object]", while in a real Node environment
47777                 //   `process.toString()` yields "[object process]".
47778                 isNodeJS = true;
47779
47780                 requestTick = function () {
47781                     process.nextTick(flush);
47782                 };
47783
47784             } else if (typeof setImmediate === "function") {
47785                 // In IE10, Node.js 0.9+, or https://github.com/NobleJS/setImmediate
47786                 if (typeof window !== "undefined") {
47787                     requestTick = setImmediate.bind(window, flush);
47788                 } else {
47789                     requestTick = function () {
47790                         setImmediate(flush);
47791                     };
47792                 }
47793
47794             } else if (typeof MessageChannel !== "undefined") {
47795                 // modern browsers
47796                 // http://www.nonblocking.io/2011/06/windownexttick.html
47797                 var channel = new MessageChannel();
47798                 // At least Safari Version 6.0.5 (8536.30.1) intermittently cannot create
47799                 // working message ports the first time a page loads.
47800                 channel.port1.onmessage = function () {
47801                     requestTick = requestPortTick;
47802                     channel.port1.onmessage = flush;
47803                     flush();
47804                 };
47805                 var requestPortTick = function () {
47806                     // Opera requires us to provide a message payload, regardless of
47807                     // whether we use it.
47808                     channel.port2.postMessage(0);
47809                 };
47810                 requestTick = function () {
47811                     setTimeout(flush, 0);
47812                     requestPortTick();
47813                 };
47814
47815             } else {
47816                 // old browsers
47817                 requestTick = function () {
47818                     setTimeout(flush, 0);
47819                 };
47820             }
47821             // runs a task after all other tasks have been run
47822             // this is useful for unhandled rejection tracking that needs to happen
47823             // after all `then`d tasks have been run.
47824             nextTick.runAfter = function (task) {
47825                 laterQueue.push(task);
47826                 if (!flushing) {
47827                     flushing = true;
47828                     requestTick();
47829                 }
47830             };
47831             return nextTick;
47832         })();
47833
47834         // Attempt to make generics safe in the face of downstream
47835         // modifications.
47836         // There is no situation where this is necessary.
47837         // If you need a security guarantee, these primordials need to be
47838         // deeply frozen anyway, and if you don’t need a security guarantee,
47839         // this is just plain paranoid.
47840         // However, this **might** have the nice side-effect of reducing the size of
47841         // the minified code by reducing x.call() to merely x()
47842         // See Mark Miller’s explanation of what this does.
47843         // http://wiki.ecmascript.org/doku.php?id=conventions:safe_meta_programming
47844         var call = Function.call;
47845         function uncurryThis(f) {
47846             return function () {
47847                 return call.apply(f, arguments);
47848             };
47849         }
47850         // This is equivalent, but slower:
47851         // uncurryThis = Function_bind.bind(Function_bind.call);
47852         // http://jsperf.com/uncurrythis
47853
47854         var array_slice = uncurryThis(Array.prototype.slice);
47855
47856         var array_reduce = uncurryThis(
47857             Array.prototype.reduce || function (callback, basis) {
47858                 var index = 0,
47859                     length = this.length;
47860                 // concerning the initial value, if one is not provided
47861                 if (arguments.length === 1) {
47862                     // seek to the first value in the array, accounting
47863                     // for the possibility that is is a sparse array
47864                     do {
47865                         if (index in this) {
47866                             basis = this[index++];
47867                             break;
47868                         }
47869                         if (++index >= length) {
47870                             throw new TypeError();
47871                         }
47872                     } while (1);
47873                 }
47874                 // reduce
47875                 for (; index < length; index++) {
47876                     // account for the possibility that the array is sparse
47877                     if (index in this) {
47878                         basis = callback(basis, this[index], index);
47879                     }
47880                 }
47881                 return basis;
47882             }
47883         );
47884
47885         var array_indexOf = uncurryThis(
47886             Array.prototype.indexOf || function (value) {
47887                 // not a very good shim, but good enough for our one use of it
47888                 for (var i = 0; i < this.length; i++) {
47889                     if (this[i] === value) {
47890                         return i;
47891                     }
47892                 }
47893                 return -1;
47894             }
47895         );
47896
47897         var array_map = uncurryThis(
47898             Array.prototype.map || function (callback, thisp) {
47899                 var self = this;
47900                 var collect = [];
47901                 array_reduce(self, function (undefined$1, value, index) {
47902                     collect.push(callback.call(thisp, value, index, self));
47903                 }, void 0);
47904                 return collect;
47905             }
47906         );
47907
47908         var object_create = Object.create || function (prototype) {
47909             function Type() { }
47910             Type.prototype = prototype;
47911             return new Type();
47912         };
47913
47914         var object_defineProperty = Object.defineProperty || function (obj, prop, descriptor) {
47915             obj[prop] = descriptor.value;
47916             return obj;
47917         };
47918
47919         var object_hasOwnProperty = uncurryThis(Object.prototype.hasOwnProperty);
47920
47921         var object_keys = Object.keys || function (object) {
47922             var keys = [];
47923             for (var key in object) {
47924                 if (object_hasOwnProperty(object, key)) {
47925                     keys.push(key);
47926                 }
47927             }
47928             return keys;
47929         };
47930
47931         var object_toString = uncurryThis(Object.prototype.toString);
47932
47933         function isObject(value) {
47934             return value === Object(value);
47935         }
47936
47937         // generator related shims
47938
47939         // FIXME: Remove this function once ES6 generators are in SpiderMonkey.
47940         function isStopIteration(exception) {
47941             return (
47942                 object_toString(exception) === "[object StopIteration]" ||
47943                 exception instanceof QReturnValue
47944             );
47945         }
47946
47947         // FIXME: Remove this helper and Q.return once ES6 generators are in
47948         // SpiderMonkey.
47949         var QReturnValue;
47950         if (typeof ReturnValue !== "undefined") {
47951             QReturnValue = ReturnValue;
47952         } else {
47953             QReturnValue = function (value) {
47954                 this.value = value;
47955             };
47956         }
47957
47958         // long stack traces
47959
47960         var STACK_JUMP_SEPARATOR = "From previous event:";
47961
47962         function makeStackTraceLong(error, promise) {
47963             // If possible, transform the error stack trace by removing Node and Q
47964             // cruft, then concatenating with the stack trace of `promise`. See #57.
47965             if (hasStacks &&
47966                 promise.stack &&
47967                 typeof error === "object" &&
47968                 error !== null &&
47969                 error.stack
47970             ) {
47971                 var stacks = [];
47972                 for (var p = promise; !!p; p = p.source) {
47973                     if (p.stack && (!error.__minimumStackCounter__ || error.__minimumStackCounter__ > p.stackCounter)) {
47974                         object_defineProperty(error, "__minimumStackCounter__", {value: p.stackCounter, configurable: true});
47975                         stacks.unshift(p.stack);
47976                     }
47977                 }
47978                 stacks.unshift(error.stack);
47979
47980                 var concatedStacks = stacks.join("\n" + STACK_JUMP_SEPARATOR + "\n");
47981                 var stack = filterStackString(concatedStacks);
47982                 object_defineProperty(error, "stack", {value: stack, configurable: true});
47983             }
47984         }
47985
47986         function filterStackString(stackString) {
47987             var lines = stackString.split("\n");
47988             var desiredLines = [];
47989             for (var i = 0; i < lines.length; ++i) {
47990                 var line = lines[i];
47991
47992                 if (!isInternalFrame(line) && !isNodeFrame(line) && line) {
47993                     desiredLines.push(line);
47994                 }
47995             }
47996             return desiredLines.join("\n");
47997         }
47998
47999         function isNodeFrame(stackLine) {
48000             return stackLine.indexOf("(module.js:") !== -1 ||
48001                    stackLine.indexOf("(node.js:") !== -1;
48002         }
48003
48004         function getFileNameAndLineNumber(stackLine) {
48005             // Named functions: "at functionName (filename:lineNumber:columnNumber)"
48006             // In IE10 function name can have spaces ("Anonymous function") O_o
48007             var attempt1 = /at .+ \((.+):(\d+):(?:\d+)\)$/.exec(stackLine);
48008             if (attempt1) {
48009                 return [attempt1[1], Number(attempt1[2])];
48010             }
48011
48012             // Anonymous functions: "at filename:lineNumber:columnNumber"
48013             var attempt2 = /at ([^ ]+):(\d+):(?:\d+)$/.exec(stackLine);
48014             if (attempt2) {
48015                 return [attempt2[1], Number(attempt2[2])];
48016             }
48017
48018             // Firefox style: "function@filename:lineNumber or @filename:lineNumber"
48019             var attempt3 = /.*@(.+):(\d+)$/.exec(stackLine);
48020             if (attempt3) {
48021                 return [attempt3[1], Number(attempt3[2])];
48022             }
48023         }
48024
48025         function isInternalFrame(stackLine) {
48026             var fileNameAndLineNumber = getFileNameAndLineNumber(stackLine);
48027
48028             if (!fileNameAndLineNumber) {
48029                 return false;
48030             }
48031
48032             var fileName = fileNameAndLineNumber[0];
48033             var lineNumber = fileNameAndLineNumber[1];
48034
48035             return fileName === qFileName &&
48036                 lineNumber >= qStartingLine &&
48037                 lineNumber <= qEndingLine;
48038         }
48039
48040         // discover own file name and line number range for filtering stack
48041         // traces
48042         function captureLine() {
48043             if (!hasStacks) {
48044                 return;
48045             }
48046
48047             try {
48048                 throw new Error();
48049             } catch (e) {
48050                 var lines = e.stack.split("\n");
48051                 var firstLine = lines[0].indexOf("@") > 0 ? lines[1] : lines[2];
48052                 var fileNameAndLineNumber = getFileNameAndLineNumber(firstLine);
48053                 if (!fileNameAndLineNumber) {
48054                     return;
48055                 }
48056
48057                 qFileName = fileNameAndLineNumber[0];
48058                 return fileNameAndLineNumber[1];
48059             }
48060         }
48061
48062         function deprecate(callback, name, alternative) {
48063             return function () {
48064                 if (typeof console !== "undefined" &&
48065                     typeof console.warn === "function") {
48066                     console.warn(name + " is deprecated, use " + alternative +
48067                                  " instead.", new Error("").stack);
48068                 }
48069                 return callback.apply(callback, arguments);
48070             };
48071         }
48072
48073         // end of shims
48074         // beginning of real work
48075
48076         /**
48077          * Constructs a promise for an immediate reference, passes promises through, or
48078          * coerces promises from different systems.
48079          * @param value immediate reference or promise
48080          */
48081         function Q(value) {
48082             // If the object is already a Promise, return it directly.  This enables
48083             // the resolve function to both be used to created references from objects,
48084             // but to tolerably coerce non-promises to promises.
48085             if (value instanceof Promise) {
48086                 return value;
48087             }
48088
48089             // assimilate thenables
48090             if (isPromiseAlike(value)) {
48091                 return coerce(value);
48092             } else {
48093                 return fulfill(value);
48094             }
48095         }
48096         Q.resolve = Q;
48097
48098         /**
48099          * Performs a task in a future turn of the event loop.
48100          * @param {Function} task
48101          */
48102         Q.nextTick = nextTick;
48103
48104         /**
48105          * Controls whether or not long stack traces will be on
48106          */
48107         Q.longStackSupport = false;
48108
48109         /**
48110          * The counter is used to determine the stopping point for building
48111          * long stack traces. In makeStackTraceLong we walk backwards through
48112          * the linked list of promises, only stacks which were created before
48113          * the rejection are concatenated.
48114          */
48115         var longStackCounter = 1;
48116
48117         // enable long stacks if Q_DEBUG is set
48118         if (typeof process === "object" && process && process.env && process.env.Q_DEBUG) {
48119             Q.longStackSupport = true;
48120         }
48121
48122         /**
48123          * Constructs a {promise, resolve, reject} object.
48124          *
48125          * `resolve` is a callback to invoke with a more resolved value for the
48126          * promise. To fulfill the promise, invoke `resolve` with any value that is
48127          * not a thenable. To reject the promise, invoke `resolve` with a rejected
48128          * thenable, or invoke `reject` with the reason directly. To resolve the
48129          * promise to another thenable, thus putting it in the same state, invoke
48130          * `resolve` with that other thenable.
48131          */
48132         Q.defer = defer;
48133         function defer() {
48134             // if "messages" is an "Array", that indicates that the promise has not yet
48135             // been resolved.  If it is "undefined", it has been resolved.  Each
48136             // element of the messages array is itself an array of complete arguments to
48137             // forward to the resolved promise.  We coerce the resolution value to a
48138             // promise using the `resolve` function because it handles both fully
48139             // non-thenable values and other thenables gracefully.
48140             var messages = [], progressListeners = [], resolvedPromise;
48141
48142             var deferred = object_create(defer.prototype);
48143             var promise = object_create(Promise.prototype);
48144
48145             promise.promiseDispatch = function (resolve, op, operands) {
48146                 var args = array_slice(arguments);
48147                 if (messages) {
48148                     messages.push(args);
48149                     if (op === "when" && operands[1]) { // progress operand
48150                         progressListeners.push(operands[1]);
48151                     }
48152                 } else {
48153                     Q.nextTick(function () {
48154                         resolvedPromise.promiseDispatch.apply(resolvedPromise, args);
48155                     });
48156                 }
48157             };
48158
48159             // XXX deprecated
48160             promise.valueOf = function () {
48161                 if (messages) {
48162                     return promise;
48163                 }
48164                 var nearerValue = nearer(resolvedPromise);
48165                 if (isPromise(nearerValue)) {
48166                     resolvedPromise = nearerValue; // shorten chain
48167                 }
48168                 return nearerValue;
48169             };
48170
48171             promise.inspect = function () {
48172                 if (!resolvedPromise) {
48173                     return { state: "pending" };
48174                 }
48175                 return resolvedPromise.inspect();
48176             };
48177
48178             if (Q.longStackSupport && hasStacks) {
48179                 try {
48180                     throw new Error();
48181                 } catch (e) {
48182                     // NOTE: don't try to use `Error.captureStackTrace` or transfer the
48183                     // accessor around; that causes memory leaks as per GH-111. Just
48184                     // reify the stack trace as a string ASAP.
48185                     //
48186                     // At the same time, cut off the first line; it's always just
48187                     // "[object Promise]\n", as per the `toString`.
48188                     promise.stack = e.stack.substring(e.stack.indexOf("\n") + 1);
48189                     promise.stackCounter = longStackCounter++;
48190                 }
48191             }
48192
48193             // NOTE: we do the checks for `resolvedPromise` in each method, instead of
48194             // consolidating them into `become`, since otherwise we'd create new
48195             // promises with the lines `become(whatever(value))`. See e.g. GH-252.
48196
48197             function become(newPromise) {
48198                 resolvedPromise = newPromise;
48199
48200                 if (Q.longStackSupport && hasStacks) {
48201                     // Only hold a reference to the new promise if long stacks
48202                     // are enabled to reduce memory usage
48203                     promise.source = newPromise;
48204                 }
48205
48206                 array_reduce(messages, function (undefined$1, message) {
48207                     Q.nextTick(function () {
48208                         newPromise.promiseDispatch.apply(newPromise, message);
48209                     });
48210                 }, void 0);
48211
48212                 messages = void 0;
48213                 progressListeners = void 0;
48214             }
48215
48216             deferred.promise = promise;
48217             deferred.resolve = function (value) {
48218                 if (resolvedPromise) {
48219                     return;
48220                 }
48221
48222                 become(Q(value));
48223             };
48224
48225             deferred.fulfill = function (value) {
48226                 if (resolvedPromise) {
48227                     return;
48228                 }
48229
48230                 become(fulfill(value));
48231             };
48232             deferred.reject = function (reason) {
48233                 if (resolvedPromise) {
48234                     return;
48235                 }
48236
48237                 become(reject(reason));
48238             };
48239             deferred.notify = function (progress) {
48240                 if (resolvedPromise) {
48241                     return;
48242                 }
48243
48244                 array_reduce(progressListeners, function (undefined$1, progressListener) {
48245                     Q.nextTick(function () {
48246                         progressListener(progress);
48247                     });
48248                 }, void 0);
48249             };
48250
48251             return deferred;
48252         }
48253
48254         /**
48255          * Creates a Node-style callback that will resolve or reject the deferred
48256          * promise.
48257          * @returns a nodeback
48258          */
48259         defer.prototype.makeNodeResolver = function () {
48260             var self = this;
48261             return function (error, value) {
48262                 if (error) {
48263                     self.reject(error);
48264                 } else if (arguments.length > 2) {
48265                     self.resolve(array_slice(arguments, 1));
48266                 } else {
48267                     self.resolve(value);
48268                 }
48269             };
48270         };
48271
48272         /**
48273          * @param resolver {Function} a function that returns nothing and accepts
48274          * the resolve, reject, and notify functions for a deferred.
48275          * @returns a promise that may be resolved with the given resolve and reject
48276          * functions, or rejected by a thrown exception in resolver
48277          */
48278         Q.Promise = promise; // ES6
48279         Q.promise = promise;
48280         function promise(resolver) {
48281             if (typeof resolver !== "function") {
48282                 throw new TypeError("resolver must be a function.");
48283             }
48284             var deferred = defer();
48285             try {
48286                 resolver(deferred.resolve, deferred.reject, deferred.notify);
48287             } catch (reason) {
48288                 deferred.reject(reason);
48289             }
48290             return deferred.promise;
48291         }
48292
48293         promise.race = race; // ES6
48294         promise.all = all; // ES6
48295         promise.reject = reject; // ES6
48296         promise.resolve = Q; // ES6
48297
48298         // XXX experimental.  This method is a way to denote that a local value is
48299         // serializable and should be immediately dispatched to a remote upon request,
48300         // instead of passing a reference.
48301         Q.passByCopy = function (object) {
48302             //freeze(object);
48303             //passByCopies.set(object, true);
48304             return object;
48305         };
48306
48307         Promise.prototype.passByCopy = function () {
48308             //freeze(object);
48309             //passByCopies.set(object, true);
48310             return this;
48311         };
48312
48313         /**
48314          * If two promises eventually fulfill to the same value, promises that value,
48315          * but otherwise rejects.
48316          * @param x {Any*}
48317          * @param y {Any*}
48318          * @returns {Any*} a promise for x and y if they are the same, but a rejection
48319          * otherwise.
48320          *
48321          */
48322         Q.join = function (x, y) {
48323             return Q(x).join(y);
48324         };
48325
48326         Promise.prototype.join = function (that) {
48327             return Q([this, that]).spread(function (x, y) {
48328                 if (x === y) {
48329                     // TODO: "===" should be Object.is or equiv
48330                     return x;
48331                 } else {
48332                     throw new Error("Q can't join: not the same: " + x + " " + y);
48333                 }
48334             });
48335         };
48336
48337         /**
48338          * Returns a promise for the first of an array of promises to become settled.
48339          * @param answers {Array[Any*]} promises to race
48340          * @returns {Any*} the first promise to be settled
48341          */
48342         Q.race = race;
48343         function race(answerPs) {
48344             return promise(function (resolve, reject) {
48345                 // Switch to this once we can assume at least ES5
48346                 // answerPs.forEach(function (answerP) {
48347                 //     Q(answerP).then(resolve, reject);
48348                 // });
48349                 // Use this in the meantime
48350                 for (var i = 0, len = answerPs.length; i < len; i++) {
48351                     Q(answerPs[i]).then(resolve, reject);
48352                 }
48353             });
48354         }
48355
48356         Promise.prototype.race = function () {
48357             return this.then(Q.race);
48358         };
48359
48360         /**
48361          * Constructs a Promise with a promise descriptor object and optional fallback
48362          * function.  The descriptor contains methods like when(rejected), get(name),
48363          * set(name, value), post(name, args), and delete(name), which all
48364          * return either a value, a promise for a value, or a rejection.  The fallback
48365          * accepts the operation name, a resolver, and any further arguments that would
48366          * have been forwarded to the appropriate method above had a method been
48367          * provided with the proper name.  The API makes no guarantees about the nature
48368          * of the returned object, apart from that it is usable whereever promises are
48369          * bought and sold.
48370          */
48371         Q.makePromise = Promise;
48372         function Promise(descriptor, fallback, inspect) {
48373             if (fallback === void 0) {
48374                 fallback = function (op) {
48375                     return reject(new Error(
48376                         "Promise does not support operation: " + op
48377                     ));
48378                 };
48379             }
48380             if (inspect === void 0) {
48381                 inspect = function () {
48382                     return {state: "unknown"};
48383                 };
48384             }
48385
48386             var promise = object_create(Promise.prototype);
48387
48388             promise.promiseDispatch = function (resolve, op, args) {
48389                 var result;
48390                 try {
48391                     if (descriptor[op]) {
48392                         result = descriptor[op].apply(promise, args);
48393                     } else {
48394                         result = fallback.call(promise, op, args);
48395                     }
48396                 } catch (exception) {
48397                     result = reject(exception);
48398                 }
48399                 if (resolve) {
48400                     resolve(result);
48401                 }
48402             };
48403
48404             promise.inspect = inspect;
48405
48406             // XXX deprecated `valueOf` and `exception` support
48407             if (inspect) {
48408                 var inspected = inspect();
48409                 if (inspected.state === "rejected") {
48410                     promise.exception = inspected.reason;
48411                 }
48412
48413                 promise.valueOf = function () {
48414                     var inspected = inspect();
48415                     if (inspected.state === "pending" ||
48416                         inspected.state === "rejected") {
48417                         return promise;
48418                     }
48419                     return inspected.value;
48420                 };
48421             }
48422
48423             return promise;
48424         }
48425
48426         Promise.prototype.toString = function () {
48427             return "[object Promise]";
48428         };
48429
48430         Promise.prototype.then = function (fulfilled, rejected, progressed) {
48431             var self = this;
48432             var deferred = defer();
48433             var done = false;   // ensure the untrusted promise makes at most a
48434                                 // single call to one of the callbacks
48435
48436             function _fulfilled(value) {
48437                 try {
48438                     return typeof fulfilled === "function" ? fulfilled(value) : value;
48439                 } catch (exception) {
48440                     return reject(exception);
48441                 }
48442             }
48443
48444             function _rejected(exception) {
48445                 if (typeof rejected === "function") {
48446                     makeStackTraceLong(exception, self);
48447                     try {
48448                         return rejected(exception);
48449                     } catch (newException) {
48450                         return reject(newException);
48451                     }
48452                 }
48453                 return reject(exception);
48454             }
48455
48456             function _progressed(value) {
48457                 return typeof progressed === "function" ? progressed(value) : value;
48458             }
48459
48460             Q.nextTick(function () {
48461                 self.promiseDispatch(function (value) {
48462                     if (done) {
48463                         return;
48464                     }
48465                     done = true;
48466
48467                     deferred.resolve(_fulfilled(value));
48468                 }, "when", [function (exception) {
48469                     if (done) {
48470                         return;
48471                     }
48472                     done = true;
48473
48474                     deferred.resolve(_rejected(exception));
48475                 }]);
48476             });
48477
48478             // Progress propagator need to be attached in the current tick.
48479             self.promiseDispatch(void 0, "when", [void 0, function (value) {
48480                 var newValue;
48481                 var threw = false;
48482                 try {
48483                     newValue = _progressed(value);
48484                 } catch (e) {
48485                     threw = true;
48486                     if (Q.onerror) {
48487                         Q.onerror(e);
48488                     } else {
48489                         throw e;
48490                     }
48491                 }
48492
48493                 if (!threw) {
48494                     deferred.notify(newValue);
48495                 }
48496             }]);
48497
48498             return deferred.promise;
48499         };
48500
48501         Q.tap = function (promise, callback) {
48502             return Q(promise).tap(callback);
48503         };
48504
48505         /**
48506          * Works almost like "finally", but not called for rejections.
48507          * Original resolution value is passed through callback unaffected.
48508          * Callback may return a promise that will be awaited for.
48509          * @param {Function} callback
48510          * @returns {Q.Promise}
48511          * @example
48512          * doSomething()
48513          *   .then(...)
48514          *   .tap(console.log)
48515          *   .then(...);
48516          */
48517         Promise.prototype.tap = function (callback) {
48518             callback = Q(callback);
48519
48520             return this.then(function (value) {
48521                 return callback.fcall(value).thenResolve(value);
48522             });
48523         };
48524
48525         /**
48526          * Registers an observer on a promise.
48527          *
48528          * Guarantees:
48529          *
48530          * 1. that fulfilled and rejected will be called only once.
48531          * 2. that either the fulfilled callback or the rejected callback will be
48532          *    called, but not both.
48533          * 3. that fulfilled and rejected will not be called in this turn.
48534          *
48535          * @param value      promise or immediate reference to observe
48536          * @param fulfilled  function to be called with the fulfilled value
48537          * @param rejected   function to be called with the rejection exception
48538          * @param progressed function to be called on any progress notifications
48539          * @return promise for the return value from the invoked callback
48540          */
48541         Q.when = when;
48542         function when(value, fulfilled, rejected, progressed) {
48543             return Q(value).then(fulfilled, rejected, progressed);
48544         }
48545
48546         Promise.prototype.thenResolve = function (value) {
48547             return this.then(function () { return value; });
48548         };
48549
48550         Q.thenResolve = function (promise, value) {
48551             return Q(promise).thenResolve(value);
48552         };
48553
48554         Promise.prototype.thenReject = function (reason) {
48555             return this.then(function () { throw reason; });
48556         };
48557
48558         Q.thenReject = function (promise, reason) {
48559             return Q(promise).thenReject(reason);
48560         };
48561
48562         /**
48563          * If an object is not a promise, it is as "near" as possible.
48564          * If a promise is rejected, it is as "near" as possible too.
48565          * If it’s a fulfilled promise, the fulfillment value is nearer.
48566          * If it’s a deferred promise and the deferred has been resolved, the
48567          * resolution is "nearer".
48568          * @param object
48569          * @returns most resolved (nearest) form of the object
48570          */
48571
48572         // XXX should we re-do this?
48573         Q.nearer = nearer;
48574         function nearer(value) {
48575             if (isPromise(value)) {
48576                 var inspected = value.inspect();
48577                 if (inspected.state === "fulfilled") {
48578                     return inspected.value;
48579                 }
48580             }
48581             return value;
48582         }
48583
48584         /**
48585          * @returns whether the given object is a promise.
48586          * Otherwise it is a fulfilled value.
48587          */
48588         Q.isPromise = isPromise;
48589         function isPromise(object) {
48590             return object instanceof Promise;
48591         }
48592
48593         Q.isPromiseAlike = isPromiseAlike;
48594         function isPromiseAlike(object) {
48595             return isObject(object) && typeof object.then === "function";
48596         }
48597
48598         /**
48599          * @returns whether the given object is a pending promise, meaning not
48600          * fulfilled or rejected.
48601          */
48602         Q.isPending = isPending;
48603         function isPending(object) {
48604             return isPromise(object) && object.inspect().state === "pending";
48605         }
48606
48607         Promise.prototype.isPending = function () {
48608             return this.inspect().state === "pending";
48609         };
48610
48611         /**
48612          * @returns whether the given object is a value or fulfilled
48613          * promise.
48614          */
48615         Q.isFulfilled = isFulfilled;
48616         function isFulfilled(object) {
48617             return !isPromise(object) || object.inspect().state === "fulfilled";
48618         }
48619
48620         Promise.prototype.isFulfilled = function () {
48621             return this.inspect().state === "fulfilled";
48622         };
48623
48624         /**
48625          * @returns whether the given object is a rejected promise.
48626          */
48627         Q.isRejected = isRejected;
48628         function isRejected(object) {
48629             return isPromise(object) && object.inspect().state === "rejected";
48630         }
48631
48632         Promise.prototype.isRejected = function () {
48633             return this.inspect().state === "rejected";
48634         };
48635
48636         //// BEGIN UNHANDLED REJECTION TRACKING
48637
48638         // This promise library consumes exceptions thrown in handlers so they can be
48639         // handled by a subsequent promise.  The exceptions get added to this array when
48640         // they are created, and removed when they are handled.  Note that in ES6 or
48641         // shimmed environments, this would naturally be a `Set`.
48642         var unhandledReasons = [];
48643         var unhandledRejections = [];
48644         var reportedUnhandledRejections = [];
48645         var trackUnhandledRejections = true;
48646
48647         function resetUnhandledRejections() {
48648             unhandledReasons.length = 0;
48649             unhandledRejections.length = 0;
48650
48651             if (!trackUnhandledRejections) {
48652                 trackUnhandledRejections = true;
48653             }
48654         }
48655
48656         function trackRejection(promise, reason) {
48657             if (!trackUnhandledRejections) {
48658                 return;
48659             }
48660             if (typeof process === "object" && typeof process.emit === "function") {
48661                 Q.nextTick.runAfter(function () {
48662                     if (array_indexOf(unhandledRejections, promise) !== -1) {
48663                         process.emit("unhandledRejection", reason, promise);
48664                         reportedUnhandledRejections.push(promise);
48665                     }
48666                 });
48667             }
48668
48669             unhandledRejections.push(promise);
48670             if (reason && typeof reason.stack !== "undefined") {
48671                 unhandledReasons.push(reason.stack);
48672             } else {
48673                 unhandledReasons.push("(no stack) " + reason);
48674             }
48675         }
48676
48677         function untrackRejection(promise) {
48678             if (!trackUnhandledRejections) {
48679                 return;
48680             }
48681
48682             var at = array_indexOf(unhandledRejections, promise);
48683             if (at !== -1) {
48684                 if (typeof process === "object" && typeof process.emit === "function") {
48685                     Q.nextTick.runAfter(function () {
48686                         var atReport = array_indexOf(reportedUnhandledRejections, promise);
48687                         if (atReport !== -1) {
48688                             process.emit("rejectionHandled", unhandledReasons[at], promise);
48689                             reportedUnhandledRejections.splice(atReport, 1);
48690                         }
48691                     });
48692                 }
48693                 unhandledRejections.splice(at, 1);
48694                 unhandledReasons.splice(at, 1);
48695             }
48696         }
48697
48698         Q.resetUnhandledRejections = resetUnhandledRejections;
48699
48700         Q.getUnhandledReasons = function () {
48701             // Make a copy so that consumers can't interfere with our internal state.
48702             return unhandledReasons.slice();
48703         };
48704
48705         Q.stopUnhandledRejectionTracking = function () {
48706             resetUnhandledRejections();
48707             trackUnhandledRejections = false;
48708         };
48709
48710         resetUnhandledRejections();
48711
48712         //// END UNHANDLED REJECTION TRACKING
48713
48714         /**
48715          * Constructs a rejected promise.
48716          * @param reason value describing the failure
48717          */
48718         Q.reject = reject;
48719         function reject(reason) {
48720             var rejection = Promise({
48721                 "when": function (rejected) {
48722                     // note that the error has been handled
48723                     if (rejected) {
48724                         untrackRejection(this);
48725                     }
48726                     return rejected ? rejected(reason) : this;
48727                 }
48728             }, function fallback() {
48729                 return this;
48730             }, function inspect() {
48731                 return { state: "rejected", reason: reason };
48732             });
48733
48734             // Note that the reason has not been handled.
48735             trackRejection(rejection, reason);
48736
48737             return rejection;
48738         }
48739
48740         /**
48741          * Constructs a fulfilled promise for an immediate reference.
48742          * @param value immediate reference
48743          */
48744         Q.fulfill = fulfill;
48745         function fulfill(value) {
48746             return Promise({
48747                 "when": function () {
48748                     return value;
48749                 },
48750                 "get": function (name) {
48751                     return value[name];
48752                 },
48753                 "set": function (name, rhs) {
48754                     value[name] = rhs;
48755                 },
48756                 "delete": function (name) {
48757                     delete value[name];
48758                 },
48759                 "post": function (name, args) {
48760                     // Mark Miller proposes that post with no name should apply a
48761                     // promised function.
48762                     if (name === null || name === void 0) {
48763                         return value.apply(void 0, args);
48764                     } else {
48765                         return value[name].apply(value, args);
48766                     }
48767                 },
48768                 "apply": function (thisp, args) {
48769                     return value.apply(thisp, args);
48770                 },
48771                 "keys": function () {
48772                     return object_keys(value);
48773                 }
48774             }, void 0, function inspect() {
48775                 return { state: "fulfilled", value: value };
48776             });
48777         }
48778
48779         /**
48780          * Converts thenables to Q promises.
48781          * @param promise thenable promise
48782          * @returns a Q promise
48783          */
48784         function coerce(promise) {
48785             var deferred = defer();
48786             Q.nextTick(function () {
48787                 try {
48788                     promise.then(deferred.resolve, deferred.reject, deferred.notify);
48789                 } catch (exception) {
48790                     deferred.reject(exception);
48791                 }
48792             });
48793             return deferred.promise;
48794         }
48795
48796         /**
48797          * Annotates an object such that it will never be
48798          * transferred away from this process over any promise
48799          * communication channel.
48800          * @param object
48801          * @returns promise a wrapping of that object that
48802          * additionally responds to the "isDef" message
48803          * without a rejection.
48804          */
48805         Q.master = master;
48806         function master(object) {
48807             return Promise({
48808                 "isDef": function () {}
48809             }, function fallback(op, args) {
48810                 return dispatch(object, op, args);
48811             }, function () {
48812                 return Q(object).inspect();
48813             });
48814         }
48815
48816         /**
48817          * Spreads the values of a promised array of arguments into the
48818          * fulfillment callback.
48819          * @param fulfilled callback that receives variadic arguments from the
48820          * promised array
48821          * @param rejected callback that receives the exception if the promise
48822          * is rejected.
48823          * @returns a promise for the return value or thrown exception of
48824          * either callback.
48825          */
48826         Q.spread = spread;
48827         function spread(value, fulfilled, rejected) {
48828             return Q(value).spread(fulfilled, rejected);
48829         }
48830
48831         Promise.prototype.spread = function (fulfilled, rejected) {
48832             return this.all().then(function (array) {
48833                 return fulfilled.apply(void 0, array);
48834             }, rejected);
48835         };
48836
48837         /**
48838          * The async function is a decorator for generator functions, turning
48839          * them into asynchronous generators.  Although generators are only part
48840          * of the newest ECMAScript 6 drafts, this code does not cause syntax
48841          * errors in older engines.  This code should continue to work and will
48842          * in fact improve over time as the language improves.
48843          *
48844          * ES6 generators are currently part of V8 version 3.19 with the
48845          * --harmony-generators runtime flag enabled.  SpiderMonkey has had them
48846          * for longer, but under an older Python-inspired form.  This function
48847          * works on both kinds of generators.
48848          *
48849          * Decorates a generator function such that:
48850          *  - it may yield promises
48851          *  - execution will continue when that promise is fulfilled
48852          *  - the value of the yield expression will be the fulfilled value
48853          *  - it returns a promise for the return value (when the generator
48854          *    stops iterating)
48855          *  - the decorated function returns a promise for the return value
48856          *    of the generator or the first rejected promise among those
48857          *    yielded.
48858          *  - if an error is thrown in the generator, it propagates through
48859          *    every following yield until it is caught, or until it escapes
48860          *    the generator function altogether, and is translated into a
48861          *    rejection for the promise returned by the decorated generator.
48862          */
48863         Q.async = async;
48864         function async(makeGenerator) {
48865             return function () {
48866                 // when verb is "send", arg is a value
48867                 // when verb is "throw", arg is an exception
48868                 function continuer(verb, arg) {
48869                     var result;
48870
48871                     // Until V8 3.19 / Chromium 29 is released, SpiderMonkey is the only
48872                     // engine that has a deployed base of browsers that support generators.
48873                     // However, SM's generators use the Python-inspired semantics of
48874                     // outdated ES6 drafts.  We would like to support ES6, but we'd also
48875                     // like to make it possible to use generators in deployed browsers, so
48876                     // we also support Python-style generators.  At some point we can remove
48877                     // this block.
48878
48879                     if (typeof StopIteration === "undefined") {
48880                         // ES6 Generators
48881                         try {
48882                             result = generator[verb](arg);
48883                         } catch (exception) {
48884                             return reject(exception);
48885                         }
48886                         if (result.done) {
48887                             return Q(result.value);
48888                         } else {
48889                             return when(result.value, callback, errback);
48890                         }
48891                     } else {
48892                         // SpiderMonkey Generators
48893                         // FIXME: Remove this case when SM does ES6 generators.
48894                         try {
48895                             result = generator[verb](arg);
48896                         } catch (exception) {
48897                             if (isStopIteration(exception)) {
48898                                 return Q(exception.value);
48899                             } else {
48900                                 return reject(exception);
48901                             }
48902                         }
48903                         return when(result, callback, errback);
48904                     }
48905                 }
48906                 var generator = makeGenerator.apply(this, arguments);
48907                 var callback = continuer.bind(continuer, "next");
48908                 var errback = continuer.bind(continuer, "throw");
48909                 return callback();
48910             };
48911         }
48912
48913         /**
48914          * The spawn function is a small wrapper around async that immediately
48915          * calls the generator and also ends the promise chain, so that any
48916          * unhandled errors are thrown instead of forwarded to the error
48917          * handler. This is useful because it's extremely common to run
48918          * generators at the top-level to work with libraries.
48919          */
48920         Q.spawn = spawn;
48921         function spawn(makeGenerator) {
48922             Q.done(Q.async(makeGenerator)());
48923         }
48924
48925         // FIXME: Remove this interface once ES6 generators are in SpiderMonkey.
48926         /**
48927          * Throws a ReturnValue exception to stop an asynchronous generator.
48928          *
48929          * This interface is a stop-gap measure to support generator return
48930          * values in older Firefox/SpiderMonkey.  In browsers that support ES6
48931          * generators like Chromium 29, just use "return" in your generator
48932          * functions.
48933          *
48934          * @param value the return value for the surrounding generator
48935          * @throws ReturnValue exception with the value.
48936          * @example
48937          * // ES6 style
48938          * Q.async(function* () {
48939          *      var foo = yield getFooPromise();
48940          *      var bar = yield getBarPromise();
48941          *      return foo + bar;
48942          * })
48943          * // Older SpiderMonkey style
48944          * Q.async(function () {
48945          *      var foo = yield getFooPromise();
48946          *      var bar = yield getBarPromise();
48947          *      Q.return(foo + bar);
48948          * })
48949          */
48950         Q["return"] = _return;
48951         function _return(value) {
48952             throw new QReturnValue(value);
48953         }
48954
48955         /**
48956          * The promised function decorator ensures that any promise arguments
48957          * are settled and passed as values (`this` is also settled and passed
48958          * as a value).  It will also ensure that the result of a function is
48959          * always a promise.
48960          *
48961          * @example
48962          * var add = Q.promised(function (a, b) {
48963          *     return a + b;
48964          * });
48965          * add(Q(a), Q(B));
48966          *
48967          * @param {function} callback The function to decorate
48968          * @returns {function} a function that has been decorated.
48969          */
48970         Q.promised = promised;
48971         function promised(callback) {
48972             return function () {
48973                 return spread([this, all(arguments)], function (self, args) {
48974                     return callback.apply(self, args);
48975                 });
48976             };
48977         }
48978
48979         /**
48980          * sends a message to a value in a future turn
48981          * @param object* the recipient
48982          * @param op the name of the message operation, e.g., "when",
48983          * @param args further arguments to be forwarded to the operation
48984          * @returns result {Promise} a promise for the result of the operation
48985          */
48986         Q.dispatch = dispatch;
48987         function dispatch(object, op, args) {
48988             return Q(object).dispatch(op, args);
48989         }
48990
48991         Promise.prototype.dispatch = function (op, args) {
48992             var self = this;
48993             var deferred = defer();
48994             Q.nextTick(function () {
48995                 self.promiseDispatch(deferred.resolve, op, args);
48996             });
48997             return deferred.promise;
48998         };
48999
49000         /**
49001          * Gets the value of a property in a future turn.
49002          * @param object    promise or immediate reference for target object
49003          * @param name      name of property to get
49004          * @return promise for the property value
49005          */
49006         Q.get = function (object, key) {
49007             return Q(object).dispatch("get", [key]);
49008         };
49009
49010         Promise.prototype.get = function (key) {
49011             return this.dispatch("get", [key]);
49012         };
49013
49014         /**
49015          * Sets the value of a property in a future turn.
49016          * @param object    promise or immediate reference for object object
49017          * @param name      name of property to set
49018          * @param value     new value of property
49019          * @return promise for the return value
49020          */
49021         Q.set = function (object, key, value) {
49022             return Q(object).dispatch("set", [key, value]);
49023         };
49024
49025         Promise.prototype.set = function (key, value) {
49026             return this.dispatch("set", [key, value]);
49027         };
49028
49029         /**
49030          * Deletes a property in a future turn.
49031          * @param object    promise or immediate reference for target object
49032          * @param name      name of property to delete
49033          * @return promise for the return value
49034          */
49035         Q.del = // XXX legacy
49036         Q["delete"] = function (object, key) {
49037             return Q(object).dispatch("delete", [key]);
49038         };
49039
49040         Promise.prototype.del = // XXX legacy
49041         Promise.prototype["delete"] = function (key) {
49042             return this.dispatch("delete", [key]);
49043         };
49044
49045         /**
49046          * Invokes a method in a future turn.
49047          * @param object    promise or immediate reference for target object
49048          * @param name      name of method to invoke
49049          * @param value     a value to post, typically an array of
49050          *                  invocation arguments for promises that
49051          *                  are ultimately backed with `resolve` values,
49052          *                  as opposed to those backed with URLs
49053          *                  wherein the posted value can be any
49054          *                  JSON serializable object.
49055          * @return promise for the return value
49056          */
49057         // bound locally because it is used by other methods
49058         Q.mapply = // XXX As proposed by "Redsandro"
49059         Q.post = function (object, name, args) {
49060             return Q(object).dispatch("post", [name, args]);
49061         };
49062
49063         Promise.prototype.mapply = // XXX As proposed by "Redsandro"
49064         Promise.prototype.post = function (name, args) {
49065             return this.dispatch("post", [name, args]);
49066         };
49067
49068         /**
49069          * Invokes a method in a future turn.
49070          * @param object    promise or immediate reference for target object
49071          * @param name      name of method to invoke
49072          * @param ...args   array of invocation arguments
49073          * @return promise for the return value
49074          */
49075         Q.send = // XXX Mark Miller's proposed parlance
49076         Q.mcall = // XXX As proposed by "Redsandro"
49077         Q.invoke = function (object, name /*...args*/) {
49078             return Q(object).dispatch("post", [name, array_slice(arguments, 2)]);
49079         };
49080
49081         Promise.prototype.send = // XXX Mark Miller's proposed parlance
49082         Promise.prototype.mcall = // XXX As proposed by "Redsandro"
49083         Promise.prototype.invoke = function (name /*...args*/) {
49084             return this.dispatch("post", [name, array_slice(arguments, 1)]);
49085         };
49086
49087         /**
49088          * Applies the promised function in a future turn.
49089          * @param object    promise or immediate reference for target function
49090          * @param args      array of application arguments
49091          */
49092         Q.fapply = function (object, args) {
49093             return Q(object).dispatch("apply", [void 0, args]);
49094         };
49095
49096         Promise.prototype.fapply = function (args) {
49097             return this.dispatch("apply", [void 0, args]);
49098         };
49099
49100         /**
49101          * Calls the promised function in a future turn.
49102          * @param object    promise or immediate reference for target function
49103          * @param ...args   array of application arguments
49104          */
49105         Q["try"] =
49106         Q.fcall = function (object /* ...args*/) {
49107             return Q(object).dispatch("apply", [void 0, array_slice(arguments, 1)]);
49108         };
49109
49110         Promise.prototype.fcall = function (/*...args*/) {
49111             return this.dispatch("apply", [void 0, array_slice(arguments)]);
49112         };
49113
49114         /**
49115          * Binds the promised function, transforming return values into a fulfilled
49116          * promise and thrown errors into a rejected one.
49117          * @param object    promise or immediate reference for target function
49118          * @param ...args   array of application arguments
49119          */
49120         Q.fbind = function (object /*...args*/) {
49121             var promise = Q(object);
49122             var args = array_slice(arguments, 1);
49123             return function fbound() {
49124                 return promise.dispatch("apply", [
49125                     this,
49126                     args.concat(array_slice(arguments))
49127                 ]);
49128             };
49129         };
49130         Promise.prototype.fbind = function (/*...args*/) {
49131             var promise = this;
49132             var args = array_slice(arguments);
49133             return function fbound() {
49134                 return promise.dispatch("apply", [
49135                     this,
49136                     args.concat(array_slice(arguments))
49137                 ]);
49138             };
49139         };
49140
49141         /**
49142          * Requests the names of the owned properties of a promised
49143          * object in a future turn.
49144          * @param object    promise or immediate reference for target object
49145          * @return promise for the keys of the eventually settled object
49146          */
49147         Q.keys = function (object) {
49148             return Q(object).dispatch("keys", []);
49149         };
49150
49151         Promise.prototype.keys = function () {
49152             return this.dispatch("keys", []);
49153         };
49154
49155         /**
49156          * Turns an array of promises into a promise for an array.  If any of
49157          * the promises gets rejected, the whole array is rejected immediately.
49158          * @param {Array*} an array (or promise for an array) of values (or
49159          * promises for values)
49160          * @returns a promise for an array of the corresponding values
49161          */
49162         // By Mark Miller
49163         // http://wiki.ecmascript.org/doku.php?id=strawman:concurrency&rev=1308776521#allfulfilled
49164         Q.all = all;
49165         function all(promises) {
49166             return when(promises, function (promises) {
49167                 var pendingCount = 0;
49168                 var deferred = defer();
49169                 array_reduce(promises, function (undefined$1, promise, index) {
49170                     var snapshot;
49171                     if (
49172                         isPromise(promise) &&
49173                         (snapshot = promise.inspect()).state === "fulfilled"
49174                     ) {
49175                         promises[index] = snapshot.value;
49176                     } else {
49177                         ++pendingCount;
49178                         when(
49179                             promise,
49180                             function (value) {
49181                                 promises[index] = value;
49182                                 if (--pendingCount === 0) {
49183                                     deferred.resolve(promises);
49184                                 }
49185                             },
49186                             deferred.reject,
49187                             function (progress) {
49188                                 deferred.notify({ index: index, value: progress });
49189                             }
49190                         );
49191                     }
49192                 }, void 0);
49193                 if (pendingCount === 0) {
49194                     deferred.resolve(promises);
49195                 }
49196                 return deferred.promise;
49197             });
49198         }
49199
49200         Promise.prototype.all = function () {
49201             return all(this);
49202         };
49203
49204         /**
49205          * Returns the first resolved promise of an array. Prior rejected promises are
49206          * ignored.  Rejects only if all promises are rejected.
49207          * @param {Array*} an array containing values or promises for values
49208          * @returns a promise fulfilled with the value of the first resolved promise,
49209          * or a rejected promise if all promises are rejected.
49210          */
49211         Q.any = any;
49212
49213         function any(promises) {
49214             if (promises.length === 0) {
49215                 return Q.resolve();
49216             }
49217
49218             var deferred = Q.defer();
49219             var pendingCount = 0;
49220             array_reduce(promises, function (prev, current, index) {
49221                 var promise = promises[index];
49222
49223                 pendingCount++;
49224
49225                 when(promise, onFulfilled, onRejected, onProgress);
49226                 function onFulfilled(result) {
49227                     deferred.resolve(result);
49228                 }
49229                 function onRejected(err) {
49230                     pendingCount--;
49231                     if (pendingCount === 0) {
49232                         var rejection = err || new Error("" + err);
49233
49234                         rejection.message = ("Q can't get fulfillment value from any promise, all " +
49235                             "promises were rejected. Last error message: " + rejection.message);
49236
49237                         deferred.reject(rejection);
49238                     }
49239                 }
49240                 function onProgress(progress) {
49241                     deferred.notify({
49242                         index: index,
49243                         value: progress
49244                     });
49245                 }
49246             }, undefined);
49247
49248             return deferred.promise;
49249         }
49250
49251         Promise.prototype.any = function () {
49252             return any(this);
49253         };
49254
49255         /**
49256          * Waits for all promises to be settled, either fulfilled or
49257          * rejected.  This is distinct from `all` since that would stop
49258          * waiting at the first rejection.  The promise returned by
49259          * `allResolved` will never be rejected.
49260          * @param promises a promise for an array (or an array) of promises
49261          * (or values)
49262          * @return a promise for an array of promises
49263          */
49264         Q.allResolved = deprecate(allResolved, "allResolved", "allSettled");
49265         function allResolved(promises) {
49266             return when(promises, function (promises) {
49267                 promises = array_map(promises, Q);
49268                 return when(all(array_map(promises, function (promise) {
49269                     return when(promise, noop, noop);
49270                 })), function () {
49271                     return promises;
49272                 });
49273             });
49274         }
49275
49276         Promise.prototype.allResolved = function () {
49277             return allResolved(this);
49278         };
49279
49280         /**
49281          * @see Promise#allSettled
49282          */
49283         Q.allSettled = allSettled;
49284         function allSettled(promises) {
49285             return Q(promises).allSettled();
49286         }
49287
49288         /**
49289          * Turns an array of promises into a promise for an array of their states (as
49290          * returned by `inspect`) when they have all settled.
49291          * @param {Array[Any*]} values an array (or promise for an array) of values (or
49292          * promises for values)
49293          * @returns {Array[State]} an array of states for the respective values.
49294          */
49295         Promise.prototype.allSettled = function () {
49296             return this.then(function (promises) {
49297                 return all(array_map(promises, function (promise) {
49298                     promise = Q(promise);
49299                     function regardless() {
49300                         return promise.inspect();
49301                     }
49302                     return promise.then(regardless, regardless);
49303                 }));
49304             });
49305         };
49306
49307         /**
49308          * Captures the failure of a promise, giving an oportunity to recover
49309          * with a callback.  If the given promise is fulfilled, the returned
49310          * promise is fulfilled.
49311          * @param {Any*} promise for something
49312          * @param {Function} callback to fulfill the returned promise if the
49313          * given promise is rejected
49314          * @returns a promise for the return value of the callback
49315          */
49316         Q.fail = // XXX legacy
49317         Q["catch"] = function (object, rejected) {
49318             return Q(object).then(void 0, rejected);
49319         };
49320
49321         Promise.prototype.fail = // XXX legacy
49322         Promise.prototype["catch"] = function (rejected) {
49323             return this.then(void 0, rejected);
49324         };
49325
49326         /**
49327          * Attaches a listener that can respond to progress notifications from a
49328          * promise's originating deferred. This listener receives the exact arguments
49329          * passed to ``deferred.notify``.
49330          * @param {Any*} promise for something
49331          * @param {Function} callback to receive any progress notifications
49332          * @returns the given promise, unchanged
49333          */
49334         Q.progress = progress;
49335         function progress(object, progressed) {
49336             return Q(object).then(void 0, void 0, progressed);
49337         }
49338
49339         Promise.prototype.progress = function (progressed) {
49340             return this.then(void 0, void 0, progressed);
49341         };
49342
49343         /**
49344          * Provides an opportunity to observe the settling of a promise,
49345          * regardless of whether the promise is fulfilled or rejected.  Forwards
49346          * the resolution to the returned promise when the callback is done.
49347          * The callback can return a promise to defer completion.
49348          * @param {Any*} promise
49349          * @param {Function} callback to observe the resolution of the given
49350          * promise, takes no arguments.
49351          * @returns a promise for the resolution of the given promise when
49352          * ``fin`` is done.
49353          */
49354         Q.fin = // XXX legacy
49355         Q["finally"] = function (object, callback) {
49356             return Q(object)["finally"](callback);
49357         };
49358
49359         Promise.prototype.fin = // XXX legacy
49360         Promise.prototype["finally"] = function (callback) {
49361             if (!callback || typeof callback.apply !== "function") {
49362                 throw new Error("Q can't apply finally callback");
49363             }
49364             callback = Q(callback);
49365             return this.then(function (value) {
49366                 return callback.fcall().then(function () {
49367                     return value;
49368                 });
49369             }, function (reason) {
49370                 // TODO attempt to recycle the rejection with "this".
49371                 return callback.fcall().then(function () {
49372                     throw reason;
49373                 });
49374             });
49375         };
49376
49377         /**
49378          * Terminates a chain of promises, forcing rejections to be
49379          * thrown as exceptions.
49380          * @param {Any*} promise at the end of a chain of promises
49381          * @returns nothing
49382          */
49383         Q.done = function (object, fulfilled, rejected, progress) {
49384             return Q(object).done(fulfilled, rejected, progress);
49385         };
49386
49387         Promise.prototype.done = function (fulfilled, rejected, progress) {
49388             var onUnhandledError = function (error) {
49389                 // forward to a future turn so that ``when``
49390                 // does not catch it and turn it into a rejection.
49391                 Q.nextTick(function () {
49392                     makeStackTraceLong(error, promise);
49393                     if (Q.onerror) {
49394                         Q.onerror(error);
49395                     } else {
49396                         throw error;
49397                     }
49398                 });
49399             };
49400
49401             // Avoid unnecessary `nextTick`ing via an unnecessary `when`.
49402             var promise = fulfilled || rejected || progress ?
49403                 this.then(fulfilled, rejected, progress) :
49404                 this;
49405
49406             if (typeof process === "object" && process && process.domain) {
49407                 onUnhandledError = process.domain.bind(onUnhandledError);
49408             }
49409
49410             promise.then(void 0, onUnhandledError);
49411         };
49412
49413         /**
49414          * Causes a promise to be rejected if it does not get fulfilled before
49415          * some milliseconds time out.
49416          * @param {Any*} promise
49417          * @param {Number} milliseconds timeout
49418          * @param {Any*} custom error message or Error object (optional)
49419          * @returns a promise for the resolution of the given promise if it is
49420          * fulfilled before the timeout, otherwise rejected.
49421          */
49422         Q.timeout = function (object, ms, error) {
49423             return Q(object).timeout(ms, error);
49424         };
49425
49426         Promise.prototype.timeout = function (ms, error) {
49427             var deferred = defer();
49428             var timeoutId = setTimeout(function () {
49429                 if (!error || "string" === typeof error) {
49430                     error = new Error(error || "Timed out after " + ms + " ms");
49431                     error.code = "ETIMEDOUT";
49432                 }
49433                 deferred.reject(error);
49434             }, ms);
49435
49436             this.then(function (value) {
49437                 clearTimeout(timeoutId);
49438                 deferred.resolve(value);
49439             }, function (exception) {
49440                 clearTimeout(timeoutId);
49441                 deferred.reject(exception);
49442             }, deferred.notify);
49443
49444             return deferred.promise;
49445         };
49446
49447         /**
49448          * Returns a promise for the given value (or promised value), some
49449          * milliseconds after it resolved. Passes rejections immediately.
49450          * @param {Any*} promise
49451          * @param {Number} milliseconds
49452          * @returns a promise for the resolution of the given promise after milliseconds
49453          * time has elapsed since the resolution of the given promise.
49454          * If the given promise rejects, that is passed immediately.
49455          */
49456         Q.delay = function (object, timeout) {
49457             if (timeout === void 0) {
49458                 timeout = object;
49459                 object = void 0;
49460             }
49461             return Q(object).delay(timeout);
49462         };
49463
49464         Promise.prototype.delay = function (timeout) {
49465             return this.then(function (value) {
49466                 var deferred = defer();
49467                 setTimeout(function () {
49468                     deferred.resolve(value);
49469                 }, timeout);
49470                 return deferred.promise;
49471             });
49472         };
49473
49474         /**
49475          * Passes a continuation to a Node function, which is called with the given
49476          * arguments provided as an array, and returns a promise.
49477          *
49478          *      Q.nfapply(FS.readFile, [__filename])
49479          *      .then(function (content) {
49480          *      })
49481          *
49482          */
49483         Q.nfapply = function (callback, args) {
49484             return Q(callback).nfapply(args);
49485         };
49486
49487         Promise.prototype.nfapply = function (args) {
49488             var deferred = defer();
49489             var nodeArgs = array_slice(args);
49490             nodeArgs.push(deferred.makeNodeResolver());
49491             this.fapply(nodeArgs).fail(deferred.reject);
49492             return deferred.promise;
49493         };
49494
49495         /**
49496          * Passes a continuation to a Node function, which is called with the given
49497          * arguments provided individually, and returns a promise.
49498          * @example
49499          * Q.nfcall(FS.readFile, __filename)
49500          * .then(function (content) {
49501          * })
49502          *
49503          */
49504         Q.nfcall = function (callback /*...args*/) {
49505             var args = array_slice(arguments, 1);
49506             return Q(callback).nfapply(args);
49507         };
49508
49509         Promise.prototype.nfcall = function (/*...args*/) {
49510             var nodeArgs = array_slice(arguments);
49511             var deferred = defer();
49512             nodeArgs.push(deferred.makeNodeResolver());
49513             this.fapply(nodeArgs).fail(deferred.reject);
49514             return deferred.promise;
49515         };
49516
49517         /**
49518          * Wraps a NodeJS continuation passing function and returns an equivalent
49519          * version that returns a promise.
49520          * @example
49521          * Q.nfbind(FS.readFile, __filename)("utf-8")
49522          * .then(console.log)
49523          * .done()
49524          */
49525         Q.nfbind =
49526         Q.denodeify = function (callback /*...args*/) {
49527             if (callback === undefined) {
49528                 throw new Error("Q can't wrap an undefined function");
49529             }
49530             var baseArgs = array_slice(arguments, 1);
49531             return function () {
49532                 var nodeArgs = baseArgs.concat(array_slice(arguments));
49533                 var deferred = defer();
49534                 nodeArgs.push(deferred.makeNodeResolver());
49535                 Q(callback).fapply(nodeArgs).fail(deferred.reject);
49536                 return deferred.promise;
49537             };
49538         };
49539
49540         Promise.prototype.nfbind =
49541         Promise.prototype.denodeify = function (/*...args*/) {
49542             var args = array_slice(arguments);
49543             args.unshift(this);
49544             return Q.denodeify.apply(void 0, args);
49545         };
49546
49547         Q.nbind = function (callback, thisp /*...args*/) {
49548             var baseArgs = array_slice(arguments, 2);
49549             return function () {
49550                 var nodeArgs = baseArgs.concat(array_slice(arguments));
49551                 var deferred = defer();
49552                 nodeArgs.push(deferred.makeNodeResolver());
49553                 function bound() {
49554                     return callback.apply(thisp, arguments);
49555                 }
49556                 Q(bound).fapply(nodeArgs).fail(deferred.reject);
49557                 return deferred.promise;
49558             };
49559         };
49560
49561         Promise.prototype.nbind = function (/*thisp, ...args*/) {
49562             var args = array_slice(arguments, 0);
49563             args.unshift(this);
49564             return Q.nbind.apply(void 0, args);
49565         };
49566
49567         /**
49568          * Calls a method of a Node-style object that accepts a Node-style
49569          * callback with a given array of arguments, plus a provided callback.
49570          * @param object an object that has the named method
49571          * @param {String} name name of the method of object
49572          * @param {Array} args arguments to pass to the method; the callback
49573          * will be provided by Q and appended to these arguments.
49574          * @returns a promise for the value or error
49575          */
49576         Q.nmapply = // XXX As proposed by "Redsandro"
49577         Q.npost = function (object, name, args) {
49578             return Q(object).npost(name, args);
49579         };
49580
49581         Promise.prototype.nmapply = // XXX As proposed by "Redsandro"
49582         Promise.prototype.npost = function (name, args) {
49583             var nodeArgs = array_slice(args || []);
49584             var deferred = defer();
49585             nodeArgs.push(deferred.makeNodeResolver());
49586             this.dispatch("post", [name, nodeArgs]).fail(deferred.reject);
49587             return deferred.promise;
49588         };
49589
49590         /**
49591          * Calls a method of a Node-style object that accepts a Node-style
49592          * callback, forwarding the given variadic arguments, plus a provided
49593          * callback argument.
49594          * @param object an object that has the named method
49595          * @param {String} name name of the method of object
49596          * @param ...args arguments to pass to the method; the callback will
49597          * be provided by Q and appended to these arguments.
49598          * @returns a promise for the value or error
49599          */
49600         Q.nsend = // XXX Based on Mark Miller's proposed "send"
49601         Q.nmcall = // XXX Based on "Redsandro's" proposal
49602         Q.ninvoke = function (object, name /*...args*/) {
49603             var nodeArgs = array_slice(arguments, 2);
49604             var deferred = defer();
49605             nodeArgs.push(deferred.makeNodeResolver());
49606             Q(object).dispatch("post", [name, nodeArgs]).fail(deferred.reject);
49607             return deferred.promise;
49608         };
49609
49610         Promise.prototype.nsend = // XXX Based on Mark Miller's proposed "send"
49611         Promise.prototype.nmcall = // XXX Based on "Redsandro's" proposal
49612         Promise.prototype.ninvoke = function (name /*...args*/) {
49613             var nodeArgs = array_slice(arguments, 1);
49614             var deferred = defer();
49615             nodeArgs.push(deferred.makeNodeResolver());
49616             this.dispatch("post", [name, nodeArgs]).fail(deferred.reject);
49617             return deferred.promise;
49618         };
49619
49620         /**
49621          * If a function would like to support both Node continuation-passing-style and
49622          * promise-returning-style, it can end its internal promise chain with
49623          * `nodeify(nodeback)`, forwarding the optional nodeback argument.  If the user
49624          * elects to use a nodeback, the result will be sent there.  If they do not
49625          * pass a nodeback, they will receive the result promise.
49626          * @param object a result (or a promise for a result)
49627          * @param {Function} nodeback a Node.js-style callback
49628          * @returns either the promise or nothing
49629          */
49630         Q.nodeify = nodeify;
49631         function nodeify(object, nodeback) {
49632             return Q(object).nodeify(nodeback);
49633         }
49634
49635         Promise.prototype.nodeify = function (nodeback) {
49636             if (nodeback) {
49637                 this.then(function (value) {
49638                     Q.nextTick(function () {
49639                         nodeback(null, value);
49640                     });
49641                 }, function (error) {
49642                     Q.nextTick(function () {
49643                         nodeback(error);
49644                     });
49645                 });
49646             } else {
49647                 return this;
49648             }
49649         };
49650
49651         Q.noConflict = function() {
49652             throw new Error("Q.noConflict only works when Q is used as a global");
49653         };
49654
49655         // All code before this point will be filtered from stack traces.
49656         var qEndingLine = captureLine();
49657
49658         return Q;
49659
49660         });
49661         });
49662
49663         var bubbleApi = 'https://dev.virtualearth.net/mapcontrol/HumanScaleServices/GetBubbles.ashx?';
49664         var streetsideImagesApi = 'https://t.ssl.ak.tiles.virtualearth.net/tiles/';
49665         var bubbleAppKey = 'AuftgJsO0Xs8Ts4M1xZUQJQXJNsvmh3IV8DkNieCiy3tCwCUMq76-WpkrBtNAuEm';
49666         var pannellumViewerCSS = 'pannellum-streetside/pannellum.css';
49667         var pannellumViewerJS = 'pannellum-streetside/pannellum.js';
49668         var maxResults$2 = 2000;
49669         var tileZoom$2 = 16.5;
49670         var tiler$5 = utilTiler().zoomExtent([tileZoom$2, tileZoom$2]).skipNullIsland(true);
49671         var dispatch$6 = dispatch('loadedBubbles', 'viewerChanged');
49672         var minHfov = 10;         // zoom in degrees:  20, 10, 5
49673         var maxHfov = 90;         // zoom out degrees
49674         var defaultHfov = 45;
49675
49676         var _hires = false;
49677         var _resolution = 512;    // higher numbers are slower - 512, 1024, 2048, 4096
49678         var _currScene = 0;
49679         var _ssCache;
49680         var _pannellumViewer;
49681         var _sceneOptions;
49682         var _dataUrlArray = [];
49683
49684
49685         /**
49686          * abortRequest().
49687          */
49688         function abortRequest$5(i) {
49689             i.abort();
49690         }
49691
49692
49693         /**
49694          * localeTimeStamp().
49695          */
49696         function localeTimestamp(s) {
49697             if (!s) return null;
49698             var detected = utilDetect();
49699             var options = { day: 'numeric', month: 'short', year: 'numeric' };
49700             var d = new Date(s);
49701             if (isNaN(d.getTime())) return null;
49702             return d.toLocaleString(detected.locale, options);
49703         }
49704
49705
49706         /**
49707          * loadTiles() wraps the process of generating tiles and then fetching image points for each tile.
49708          */
49709         function loadTiles$2(which, url, projection, margin) {
49710             var tiles = tiler$5.margin(margin).getTiles(projection);
49711
49712             // abort inflight requests that are no longer needed
49713             var cache = _ssCache[which];
49714             Object.keys(cache.inflight).forEach(function(k) {
49715                 var wanted = tiles.find(function(tile) { return k.indexOf(tile.id + ',') === 0; });
49716                 if (!wanted) {
49717                     abortRequest$5(cache.inflight[k]);
49718                     delete cache.inflight[k];
49719                 }
49720             });
49721
49722             tiles.forEach(function (tile) {
49723                loadNextTilePage$2(which, url, tile);
49724             });
49725         }
49726
49727         /**
49728          * loadNextTilePage() load data for the next tile page in line.
49729          */
49730         function loadNextTilePage$2(which, url, tile) {
49731             var cache = _ssCache[which];
49732             var nextPage = cache.nextPage[tile.id] || 0;
49733             var id = tile.id + ',' + String(nextPage);
49734             if (cache.loaded[id] || cache.inflight[id]) return;
49735
49736             cache.inflight[id] = getBubbles(url, tile, function(bubbles) {
49737                 cache.loaded[id] = true;
49738                 delete cache.inflight[id];
49739                 if (!bubbles) return;
49740
49741                 // [].shift() removes the first element, some statistics info, not a bubble point
49742                 bubbles.shift();
49743
49744                 var features = bubbles.map(function(bubble) {
49745                     if (cache.points[bubble.id]) return null;  // skip duplicates
49746
49747                     var loc = [bubble.lo, bubble.la];
49748                     var d = {
49749                         loc: loc,
49750                         key: bubble.id,
49751                         ca: bubble.he,
49752                         captured_at: bubble.cd,
49753                         captured_by: 'microsoft',
49754                         // nbn: bubble.nbn,
49755                         // pbn: bubble.pbn,
49756                         // ad: bubble.ad,
49757                         // rn: bubble.rn,
49758                         pr: bubble.pr,  // previous
49759                         ne: bubble.ne,  // next
49760                         pano: true,
49761                         sequenceKey: null
49762                     };
49763
49764                     cache.points[bubble.id] = d;
49765
49766                     // a sequence starts here
49767                     if (bubble.pr === undefined) {
49768                         cache.leaders.push(bubble.id);
49769                     }
49770
49771                     return {
49772                         minX: loc[0], minY: loc[1], maxX: loc[0], maxY: loc[1], data: d
49773                     };
49774
49775                 }).filter(Boolean);
49776
49777                 cache.rtree.load(features);
49778
49779                 connectSequences();
49780
49781                 if (which === 'bubbles') {
49782                     dispatch$6.call('loadedBubbles');
49783                 }
49784             });
49785         }
49786
49787
49788         // call this sometimes to connect the bubbles into sequences
49789         function connectSequences() {
49790             var cache = _ssCache.bubbles;
49791             var keepLeaders = [];
49792
49793             for (var i = 0; i < cache.leaders.length; i++) {
49794                 var bubble = cache.points[cache.leaders[i]];
49795                 var seen = {};
49796
49797                 // try to make a sequence.. use the key of the leader bubble.
49798                 var sequence = { key: bubble.key, bubbles: [] };
49799                 var complete = false;
49800
49801                 do {
49802                     sequence.bubbles.push(bubble);
49803                     seen[bubble.key] = true;
49804
49805                     if (bubble.ne === undefined) {
49806                         complete = true;
49807                     } else {
49808                         bubble = cache.points[bubble.ne];  // advance to next
49809                     }
49810                 } while (bubble && !seen[bubble.key] && !complete);
49811
49812
49813                 if (complete) {
49814                     _ssCache.sequences[sequence.key] = sequence;
49815
49816                     // assign bubbles to the sequence
49817                     for (var j = 0; j < sequence.bubbles.length; j++) {
49818                         sequence.bubbles[j].sequenceKey = sequence.key;
49819                     }
49820
49821                     // create a GeoJSON LineString
49822                     sequence.geojson = {
49823                         type: 'LineString',
49824                         properties: { key: sequence.key },
49825                         coordinates: sequence.bubbles.map(function (d) { return d.loc; })
49826                     };
49827
49828                 } else {
49829                     keepLeaders.push(cache.leaders[i]);
49830                 }
49831             }
49832
49833             // couldn't complete these, save for later
49834             cache.leaders = keepLeaders;
49835         }
49836
49837         /**
49838          * getBubbles() handles the request to the server for a tile extent of 'bubbles' (streetside image locations).
49839          */
49840         function getBubbles(url, tile, callback) {
49841             var rect = tile.extent.rectangle();
49842             var urlForRequest = url + utilQsString({
49843                 n: rect[3],
49844                 s: rect[1],
49845                 e: rect[2],
49846                 w: rect[0],
49847                 c: maxResults$2,
49848                 appkey: bubbleAppKey,
49849                 jsCallback: '{callback}'
49850             });
49851
49852             return jsonpRequest(urlForRequest, function (data) {
49853                 if (!data || data.error) {
49854                     callback(null);
49855                 } else {
49856                     callback(data);
49857                 }
49858             });
49859         }
49860
49861
49862         // partition viewport into higher zoom tiles
49863         function partitionViewport$2(projection) {
49864             var z = geoScaleToZoom(projection.scale());
49865             var z2 = (Math.ceil(z * 2) / 2) + 2.5;   // round to next 0.5 and add 2.5
49866             var tiler = utilTiler().zoomExtent([z2, z2]);
49867
49868             return tiler.getTiles(projection)
49869                 .map(function(tile) { return tile.extent; });
49870         }
49871
49872
49873         // no more than `limit` results per partition.
49874         function searchLimited$2(limit, projection, rtree) {
49875             limit = limit || 5;
49876
49877             return partitionViewport$2(projection)
49878                 .reduce(function(result, extent) {
49879                     var found = rtree.search(extent.bbox())
49880                         .slice(0, limit)
49881                         .map(function(d) { return d.data; });
49882
49883                     return (found.length ? result.concat(found) : result);
49884                 }, []);
49885         }
49886
49887
49888         /**
49889          * getImage()
49890          */
49891         function getImage(imgInfo) {
49892             var response = q.defer();
49893             var img = new Image();
49894
49895             img.onload = function() {
49896                 var canvas = document.getElementById('canvas' + imgInfo.face);
49897                 var ctx = canvas.getContext('2d');
49898                 ctx.drawImage(img, imgInfo.x, imgInfo.y);
49899                 response.resolve({imgInfo:imgInfo, status: 'ok'});
49900             };
49901             img.onerror = function() {
49902                 response.resolve({data: imgInfo, status: 'error'});
49903             };
49904             img.setAttribute('crossorigin', '');
49905             img.src = imgInfo.url;
49906
49907             return response.promise;
49908         }
49909
49910
49911         /**
49912          * loadCanvas()
49913          */
49914         function loadCanvas(imgInfoGroup) {
49915             var response = q.defer();
49916             var getImagePromises = imgInfoGroup.map(function(imgInfo) {
49917                 return getImage(imgInfo);
49918             });
49919
49920             q.all(getImagePromises).then(function(data) {
49921                 var canvas = document.getElementById('canvas' + data[0].imgInfo.face);
49922                 switch (data[0].imgInfo.face) {
49923                     case '01':
49924                         _dataUrlArray[0] = canvas.toDataURL('image/jpeg', 1.0);
49925                         break;
49926                     case '02':
49927                         _dataUrlArray[1] = canvas.toDataURL('image/jpeg', 1.0);
49928                         break;
49929                     case '03':
49930                         _dataUrlArray[2] = canvas.toDataURL('image/jpeg', 1.0);
49931                         break;
49932                     case '10':
49933                         _dataUrlArray[3] = canvas.toDataURL('image/jpeg', 1.0);
49934                         break;
49935                     case '11':
49936                         _dataUrlArray[4] = canvas.toDataURL('image/jpeg', 1.0);
49937                         break;
49938                     case '12':
49939                         _dataUrlArray[5] = canvas.toDataURL('image/jpeg', 1.0);
49940                         break;
49941                 }
49942                 response.resolve({status:'loadCanvas for face ' + data[0].imgInfo.face + 'ok'});
49943             });
49944
49945             return response.promise;
49946         }
49947
49948
49949         function setupCanvas(selection, reset) {
49950             if (reset) {
49951                 selection.selectAll('#divForCanvasWork')
49952                     .remove();
49953             }
49954
49955             // Add the Streetside working canvases. These are used for 'stitching', or combining,
49956             // multiple images for each of the six faces, before passing to the Pannellum control as DataUrls
49957             selection.selectAll('#divForCanvasWork')
49958                 .data([0])
49959                 .enter()
49960                 .append('div')
49961                 .attr('id', 'divForCanvasWork')
49962                 .attr('display', 'none')
49963                 .selectAll('canvas')
49964                 .data(['canvas01', 'canvas02', 'canvas03', 'canvas10', 'canvas11', 'canvas12'])
49965                 .enter()
49966                 .append('canvas')
49967                 .attr('id', function(d) { return d; })
49968                 .attr('width', _resolution)
49969                 .attr('height', _resolution);
49970         }
49971
49972
49973         /**
49974          * processFaces()
49975          */
49976         function processFaces(imgFaceInfoGroups) {
49977             var response = q.defer();
49978             var loadCanvasPromises = imgFaceInfoGroups.map(function(faceImgGroup) {
49979                 return loadCanvas(faceImgGroup);
49980             });
49981
49982             q.all(loadCanvasPromises).then(function() {
49983                 response.resolve({status: 'processFaces done'});
49984             });
49985
49986             return response.promise;
49987         }
49988
49989
49990
49991         function qkToXY(qk) {
49992             var x = 0;
49993             var y = 0;
49994             var scale = 256;
49995             for (var i = qk.length; i > 0; i--) {
49996                 var key = qk[i-1];
49997                 x += (+(key === '1' || key === '3')) * scale;
49998                 y += (+(key === '2' || key === '3')) * scale;
49999                 scale *= 2;
50000             }
50001             return [x, y];
50002         }
50003
50004
50005         function getQuadKeys() {
50006             var dim = _resolution / 256;
50007             var quadKeys;
50008
50009             if (dim === 16) {
50010                 quadKeys = [
50011                     '0000','0001','0010','0011','0100','0101','0110','0111',  '1000','1001','1010','1011','1100','1101','1110','1111',
50012                     '0002','0003','0012','0013','0102','0103','0112','0113',  '1002','1003','1012','1013','1102','1103','1112','1113',
50013                     '0020','0021','0030','0031','0120','0121','0130','0131',  '1020','1021','1030','1031','1120','1121','1130','1131',
50014                     '0022','0023','0032','0033','0122','0123','0132','0133',  '1022','1023','1032','1033','1122','1123','1132','1133',
50015                     '0200','0201','0210','0211','0300','0301','0310','0311',  '1200','1201','1210','1211','1300','1301','1310','1311',
50016                     '0202','0203','0212','0213','0302','0303','0312','0313',  '1202','1203','1212','1213','1302','1303','1312','1313',
50017                     '0220','0221','0230','0231','0320','0321','0330','0331',  '1220','1221','1230','1231','1320','1321','1330','1331',
50018                     '0222','0223','0232','0233','0322','0323','0332','0333',  '1222','1223','1232','1233','1322','1323','1332','1333',
50019
50020                     '2000','2001','2010','2011','2100','2101','2110','2111',  '3000','3001','3010','3011','3100','3101','3110','3111',
50021                     '2002','2003','2012','2013','2102','2103','2112','2113',  '3002','3003','3012','3013','3102','3103','3112','3113',
50022                     '2020','2021','2030','2031','2120','2121','2130','2131',  '3020','3021','3030','3031','3120','3121','3130','3131',
50023                     '2022','2023','2032','2033','2122','2123','2132','2133',  '3022','3023','3032','3033','3122','3123','3132','3133',
50024                     '2200','2201','2210','2211','2300','2301','2310','2311',  '3200','3201','3210','3211','3300','3301','3310','3311',
50025                     '2202','2203','2212','2213','2302','2303','2312','2313',  '3202','3203','3212','3213','3302','3303','3312','3313',
50026                     '2220','2221','2230','2231','2320','2321','2330','2331',  '3220','3221','3230','3231','3320','3321','3330','3331',
50027                     '2222','2223','2232','2233','2322','2323','2332','2333',  '3222','3223','3232','3233','3322','3323','3332','3333'
50028                 ];
50029
50030             } else if (dim === 8) {
50031                 quadKeys = [
50032                     '000','001','010','011',  '100','101','110','111',
50033                     '002','003','012','013',  '102','103','112','113',
50034                     '020','021','030','031',  '120','121','130','131',
50035                     '022','023','032','033',  '122','123','132','133',
50036
50037                     '200','201','210','211',  '300','301','310','311',
50038                     '202','203','212','213',  '302','303','312','313',
50039                     '220','221','230','231',  '320','321','330','331',
50040                     '222','223','232','233',  '322','323','332','333'
50041                 ];
50042
50043             } else if (dim === 4) {
50044                 quadKeys = [
50045                     '00','01',  '10','11',
50046                     '02','03',  '12','13',
50047
50048                     '20','21',  '30','31',
50049                     '22','23',  '32','33'
50050                 ];
50051
50052             } else {  // dim === 2
50053                 quadKeys = [
50054                     '0', '1',
50055                     '2', '3'
50056                 ];
50057             }
50058
50059             return quadKeys;
50060         }
50061
50062
50063
50064         var serviceStreetside = {
50065             /**
50066              * init() initialize streetside.
50067              */
50068             init: function () {
50069                 if (!_ssCache) {
50070                     this.reset();
50071                 }
50072
50073                 this.event = utilRebind(this, dispatch$6, 'on');
50074             },
50075
50076             /**
50077              * reset() reset the cache.
50078              */
50079             reset: function () {
50080                 if (_ssCache) {
50081                     Object.values(_ssCache.bubbles.inflight).forEach(abortRequest$5);
50082                 }
50083
50084                 _ssCache = {
50085                     bubbles: { inflight: {}, loaded: {}, nextPage: {}, rtree: rbush_1(), points: {}, leaders: [] },
50086                     sequences: {}
50087                 };
50088             },
50089
50090             /**
50091              * bubbles()
50092              */
50093             bubbles: function (projection) {
50094                 var limit = 5;
50095                 return searchLimited$2(limit, projection, _ssCache.bubbles.rtree);
50096             },
50097
50098
50099             sequences: function(projection) {
50100                 var viewport = projection.clipExtent();
50101                 var min = [viewport[0][0], viewport[1][1]];
50102                 var max = [viewport[1][0], viewport[0][1]];
50103                 var bbox = geoExtent(projection.invert(min), projection.invert(max)).bbox();
50104                 var seen = {};
50105                 var results = [];
50106
50107                 // all sequences for bubbles in viewport
50108                 _ssCache.bubbles.rtree.search(bbox)
50109                     .forEach(function(d) {
50110                         var key = d.data.sequenceKey;
50111                         if (key && !seen[key]) {
50112                             seen[key] = true;
50113                             results.push(_ssCache.sequences[key].geojson);
50114                         }
50115                     });
50116
50117                 return results;
50118             },
50119
50120
50121             /**
50122              * loadBubbles()
50123              */
50124             loadBubbles: function (projection, margin) {
50125                 // by default: request 2 nearby tiles so we can connect sequences.
50126                 if (margin === undefined) margin = 2;
50127
50128                 loadTiles$2('bubbles', bubbleApi, projection, margin);
50129             },
50130
50131
50132             viewer: function() {
50133                 return _pannellumViewer;
50134             },
50135
50136
50137             initViewer: function () {
50138                 if (!window.pannellum) return;
50139                 if (_pannellumViewer) return;
50140
50141                 var sceneID = ++_currScene + '';
50142                 var options = {
50143                     'default': { firstScene: sceneID },
50144                     scenes: {}
50145                 };
50146                 options.scenes[sceneID] = _sceneOptions;
50147
50148                 _pannellumViewer = window.pannellum.viewer('viewer-streetside', options);
50149
50150                 _pannellumViewer
50151                     .on('mousedown', function() {
50152                         d3_select(window).on('mousemove.pannellum', function() {
50153                             dispatch$6.call('viewerChanged');
50154                         });
50155                     })
50156                     .on('mouseup', function() {
50157                         d3_select(window).on('mousemove.pannellum', null);
50158                         // continue dispatching events for a few seconds, in case viewer has inertia.
50159                         var t = timer(function(elapsed) {
50160                             dispatch$6.call('viewerChanged');
50161                             if (elapsed > 2000) {
50162                                 t.stop();
50163                             }
50164                         });
50165                     });
50166             },
50167
50168
50169             /**
50170              * loadViewer() create the streeside viewer.
50171              */
50172             loadViewer: function (context) {
50173                 var that = this;
50174
50175                 // create ms-wrapper, a photo wrapper class
50176                 var wrap = d3_select('#photoviewer').selectAll('.ms-wrapper')
50177                     .data([0]);
50178
50179                 // inject ms-wrapper into the photoviewer div
50180                 // (used by all to house each custom photo viewer)
50181                 var wrapEnter = wrap.enter()
50182                     .append('div')
50183                     .attr('id', 'ms')
50184                     .attr('class', 'photo-wrapper ms-wrapper')
50185                     .classed('hide', true);
50186
50187                 // inject div to support streetside viewer (pannellum) and attribution line
50188                 wrapEnter
50189                     .append('div')
50190                     .attr('id', 'viewer-streetside')
50191                     .append('div')
50192                     .attr('class', 'photo-attribution fillD');
50193
50194                 var controlsEnter = wrapEnter
50195                     .append('div')
50196                     .attr('class', 'photo-controls-wrap')
50197                     .append('div')
50198                     .attr('class', 'photo-controls');
50199
50200                 controlsEnter
50201                     .append('button')
50202                     .on('click.back', step(-1))
50203                     .text('◄');
50204
50205                 controlsEnter
50206                     .append('button')
50207                     .on('click.forward', step(1))
50208                     .text('►');
50209
50210
50211                 // create working canvas for stitching together images
50212                 wrap = wrap
50213                     .merge(wrapEnter)
50214                     .call(setupCanvas, true);
50215
50216                 // load streetside pannellum viewer css
50217                 d3_select('head').selectAll('#streetside-viewercss')
50218                     .data([0])
50219                     .enter()
50220                     .append('link')
50221                     .attr('id', 'streetside-viewercss')
50222                     .attr('rel', 'stylesheet')
50223                     .attr('href', context.asset(pannellumViewerCSS));
50224
50225                 // load streetside pannellum viewer js
50226                 d3_select('head').selectAll('#streetside-viewerjs')
50227                     .data([0])
50228                     .enter()
50229                     .append('script')
50230                     .attr('id', 'streetside-viewerjs')
50231                     .attr('src', context.asset(pannellumViewerJS));
50232
50233
50234                 // Register viewer resize handler
50235                 context.ui().photoviewer.on('resize', function() {
50236                     if (_pannellumViewer) {
50237                         _pannellumViewer.resize();
50238                     }
50239                 });
50240
50241
50242                 function step(stepBy) {
50243                     return function() {
50244                         var viewer = d3_select('#photoviewer');
50245                         var selected = viewer.empty() ? undefined : viewer.datum();
50246                         if (!selected) return;
50247
50248                         var nextID = (stepBy === 1 ? selected.ne : selected.pr);
50249                         var yaw = _pannellumViewer.getYaw();
50250                         var ca = selected.ca + yaw;
50251                         var origin = selected.loc;
50252
50253                         // construct a search trapezoid pointing out from current bubble
50254                         var meters = 35;
50255                         var p1 = [
50256                             origin[0] + geoMetersToLon(meters / 5, origin[1]),
50257                             origin[1]
50258                         ];
50259                         var p2 = [
50260                             origin[0] + geoMetersToLon(meters / 2, origin[1]),
50261                             origin[1] + geoMetersToLat(meters)
50262                         ];
50263                         var p3 = [
50264                             origin[0] - geoMetersToLon(meters / 2, origin[1]),
50265                             origin[1] + geoMetersToLat(meters)
50266                         ];
50267                         var p4 = [
50268                             origin[0] - geoMetersToLon(meters / 5, origin[1]),
50269                             origin[1]
50270                         ];
50271
50272                         var poly = [p1, p2, p3, p4, p1];
50273
50274                         // rotate it to face forward/backward
50275                         var angle = (stepBy === 1 ? ca : ca + 180) * (Math.PI / 180);
50276                         poly = geoRotate(poly, -angle, origin);
50277
50278                         var extent = poly.reduce(function(extent, point) {
50279                             return extent.extend(geoExtent(point));
50280                         }, geoExtent());
50281
50282                         // find nearest other bubble in the search polygon
50283                         var minDist = Infinity;
50284                         _ssCache.bubbles.rtree.search(extent.bbox())
50285                             .forEach(function(d) {
50286                                 if (d.data.key === selected.key) return;
50287                                 if (!geoPointInPolygon(d.data.loc, poly)) return;
50288
50289                                 var dist = geoVecLength(d.data.loc, selected.loc);
50290                                 var theta = selected.ca - d.data.ca;
50291                                 var minTheta = Math.min(Math.abs(theta), 360 - Math.abs(theta));
50292                                 if (minTheta > 20) {
50293                                     dist += 5;  // penalize distance if camera angles don't match
50294                                 }
50295
50296                                 if (dist < minDist) {
50297                                     nextID = d.data.key;
50298                                     minDist = dist;
50299                                 }
50300                             });
50301
50302                         var nextBubble = nextID && _ssCache.bubbles.points[nextID];
50303                         if (!nextBubble) return;
50304
50305                         context.map().centerEase(nextBubble.loc);
50306
50307                         that.selectImage(nextBubble)
50308                             .then(function(r) {
50309                                 if (r.status === 'ok') {
50310                                     _sceneOptions.yaw = yaw;
50311                                     that.showViewer();
50312                                 }
50313                             });
50314                     };
50315                 }
50316             },
50317
50318             /**
50319              * showViewer()
50320              */
50321             showViewer: function (yaw) {
50322                 if (!_sceneOptions) return;
50323
50324                 if (yaw !== undefined) {
50325                     _sceneOptions.yaw = yaw;
50326                 }
50327
50328                 if (!_pannellumViewer) {
50329                     this.initViewer();
50330                 } else {
50331                     // make a new scene
50332                     var sceneID = ++_currScene + '';
50333                     _pannellumViewer
50334                         .addScene(sceneID, _sceneOptions)
50335                         .loadScene(sceneID);
50336
50337                     // remove previous scene
50338                     if (_currScene > 2) {
50339                         sceneID = (_currScene - 1) + '';
50340                         _pannellumViewer
50341                             .removeScene(sceneID);
50342                     }
50343                 }
50344
50345                 var wrap = d3_select('#photoviewer')
50346                     .classed('hide', false);
50347
50348                 var isHidden = wrap.selectAll('.photo-wrapper.ms-wrapper.hide').size();
50349
50350                 if (isHidden) {
50351                     wrap
50352                         .selectAll('.photo-wrapper:not(.ms-wrapper)')
50353                         .classed('hide', true);
50354
50355                     wrap
50356                         .selectAll('.photo-wrapper.ms-wrapper')
50357                         .classed('hide', false);
50358                 }
50359
50360                 return this;
50361             },
50362
50363             /**
50364              * hideViewer()
50365              */
50366             hideViewer: function () {
50367                 var viewer = d3_select('#photoviewer');
50368                 if (!viewer.empty()) viewer.datum(null);
50369
50370                 viewer
50371                     .classed('hide', true)
50372                     .selectAll('.photo-wrapper')
50373                     .classed('hide', true);
50374
50375                 d3_selectAll('.viewfield-group, .sequence, .icon-sign')
50376                     .classed('currentView', false);
50377
50378                 return this.setStyles(null, true);
50379             },
50380
50381             /**
50382              * selectImage().
50383              */
50384             selectImage: function (d) {
50385                 var response = q.defer();
50386                 var that = this;
50387
50388                 var viewer = d3_select('#photoviewer');
50389                 if (!viewer.empty()) viewer.datum(d);
50390
50391                 this.setStyles(null, true);
50392
50393                 var wrap = d3_select('#photoviewer .ms-wrapper');
50394                 var attribution = wrap.selectAll('.photo-attribution').html('');
50395
50396                 wrap.selectAll('.pnlm-load-box')   // display "loading.."
50397                     .style('display', 'block');
50398
50399                 if (!d) {
50400                     response.resolve({status: 'ok'});
50401                     return response.promise;
50402                 }
50403
50404                 var line1 = attribution
50405                     .append('div')
50406                     .attr('class', 'attribution-row');
50407
50408                 // Add hires checkbox
50409                 var label = line1
50410                     .append('label')
50411                     .attr('class', 'streetside-hires');
50412
50413                 label
50414                     .append('input')
50415                     .attr('type', 'checkbox')
50416                     .attr('id', 'streetside-hires-input')
50417                     .property('checked', _hires)
50418                     .on('click', function() {
50419                         event.stopPropagation();
50420
50421                         _hires = !_hires;
50422                         _resolution = _hires ? 1024 : 512;
50423                         wrap.call(setupCanvas, true);
50424
50425                         var viewstate = {
50426                             yaw: _pannellumViewer.getYaw(),
50427                             pitch: _pannellumViewer.getPitch(),
50428                             hfov: _pannellumViewer.getHfov()
50429                         };
50430
50431                         that.selectImage(d)
50432                             .then(function(r) {
50433                                 if (r.status === 'ok') {
50434                                     _sceneOptions = Object.assign(_sceneOptions, viewstate);
50435                                     that.showViewer();
50436                                 }
50437                             });
50438                     });
50439
50440                 label
50441                     .append('span')
50442                     .text(t('streetside.hires'));
50443
50444
50445                 var captureInfo = line1
50446                     .append('div')
50447                     .attr('class', 'attribution-capture-info');
50448
50449                 // Add capture date
50450                 if (d.captured_by) {
50451                     var yyyy = (new Date()).getFullYear();
50452
50453                     captureInfo
50454                         .append('a')
50455                         .attr('class', 'captured_by')
50456                         .attr('target', '_blank')
50457                         .attr('href', 'https://www.microsoft.com/en-us/maps/streetside')
50458                         .text('©' + yyyy + ' Microsoft');
50459
50460                     captureInfo
50461                         .append('span')
50462                         .text('|');
50463                 }
50464
50465                 if (d.captured_at) {
50466                     captureInfo
50467                         .append('span')
50468                         .attr('class', 'captured_at')
50469                         .text(localeTimestamp(d.captured_at));
50470                 }
50471
50472                 // Add image links
50473                 var line2 = attribution
50474                     .append('div')
50475                     .attr('class', 'attribution-row');
50476
50477                 line2
50478                     .append('a')
50479                     .attr('class', 'image-view-link')
50480                     .attr('target', '_blank')
50481                     .attr('href', 'https://www.bing.com/maps?cp=' + d.loc[1] + '~' + d.loc[0] +
50482                         '&lvl=17&dir=' + d.ca + '&style=x&v=2&sV=1')
50483                     .text(t('streetside.view_on_bing'));
50484
50485                 line2
50486                     .append('a')
50487                     .attr('class', 'image-report-link')
50488                     .attr('target', '_blank')
50489                     .attr('href', 'https://www.bing.com/maps/privacyreport/streetsideprivacyreport?bubbleid=' + encodeURIComponent(d.key) +
50490                         '&focus=photo&lat=' + d.loc[1] + '&lng=' + d.loc[0] + '&z=17')
50491                     .text(t('streetside.report'));
50492
50493
50494                 var bubbleIdQuadKey = d.key.toString(4);
50495                 var paddingNeeded = 16 - bubbleIdQuadKey.length;
50496                 for (var i = 0; i < paddingNeeded; i++) {
50497                     bubbleIdQuadKey = '0' + bubbleIdQuadKey;
50498                 }
50499                 var imgUrlPrefix = streetsideImagesApi + 'hs' + bubbleIdQuadKey;
50500                 var imgUrlSuffix = '.jpg?g=6338&n=z';
50501
50502                 // Cubemap face code order matters here: front=01, right=02, back=03, left=10, up=11, down=12
50503                 var faceKeys = ['01','02','03','10','11','12'];
50504
50505                 // Map images to cube faces
50506                 var quadKeys = getQuadKeys();
50507                 var faces = faceKeys.map(function(faceKey) {
50508                     return quadKeys.map(function(quadKey) {
50509                         var xy = qkToXY(quadKey);
50510                         return {
50511                             face: faceKey,
50512                             url: imgUrlPrefix + faceKey + quadKey + imgUrlSuffix,
50513                             x: xy[0],
50514                             y: xy[1]
50515                         };
50516                     });
50517                 });
50518
50519                 processFaces(faces).then(function() {
50520                     _sceneOptions = {
50521                         showFullscreenCtrl: false,
50522                         autoLoad: true,
50523                         compass: true,
50524                         northOffset: d.ca,
50525                         yaw: 0,
50526                         minHfov: minHfov,
50527                         maxHfov: maxHfov,
50528                         hfov: defaultHfov,
50529                         type: 'cubemap',
50530                         cubeMap: [
50531                             _dataUrlArray[0],
50532                             _dataUrlArray[1],
50533                             _dataUrlArray[2],
50534                             _dataUrlArray[3],
50535                             _dataUrlArray[4],
50536                             _dataUrlArray[5]
50537                         ]
50538                     };
50539                     response.resolve({status: 'ok'});
50540                 });
50541
50542                 return response.promise;
50543             },
50544
50545
50546             getSequenceKeyForBubble: function(d) {
50547                 return d && d.sequenceKey;
50548             },
50549
50550
50551             // Updates the currently highlighted sequence and selected bubble.
50552             // Reset is only necessary when interacting with the viewport because
50553             // this implicitly changes the currently selected bubble/sequence
50554             setStyles: function (hovered, reset) {
50555                 if (reset) {  // reset all layers
50556                     d3_selectAll('.viewfield-group')
50557                         .classed('highlighted', false)
50558                         .classed('hovered', false)
50559                         .classed('currentView', false);
50560
50561                     d3_selectAll('.sequence')
50562                         .classed('highlighted', false)
50563                         .classed('currentView', false);
50564                 }
50565
50566                 var hoveredBubbleKey = hovered && hovered.key;
50567                 var hoveredSequenceKey = this.getSequenceKeyForBubble(hovered);
50568                 var hoveredSequence = hoveredSequenceKey && _ssCache.sequences[hoveredSequenceKey];
50569                 var hoveredBubbleKeys =  (hoveredSequence && hoveredSequence.bubbles.map(function (d) { return d.key; })) || [];
50570
50571                 var viewer = d3_select('#photoviewer');
50572                 var selected = viewer.empty() ? undefined : viewer.datum();
50573                 var selectedBubbleKey = selected && selected.key;
50574                 var selectedSequenceKey = this.getSequenceKeyForBubble(selected);
50575                 var selectedSequence = selectedSequenceKey && _ssCache.sequences[selectedSequenceKey];
50576                 var selectedBubbleKeys = (selectedSequence && selectedSequence.bubbles.map(function (d) { return d.key; })) || [];
50577
50578                 // highlight sibling viewfields on either the selected or the hovered sequences
50579                 var highlightedBubbleKeys = utilArrayUnion(hoveredBubbleKeys, selectedBubbleKeys);
50580
50581                 d3_selectAll('.layer-streetside-images .viewfield-group')
50582                     .classed('highlighted', function (d) { return highlightedBubbleKeys.indexOf(d.key) !== -1; })
50583                     .classed('hovered', function (d) { return d.key === hoveredBubbleKey; })
50584                     .classed('currentView', function (d) { return d.key === selectedBubbleKey; });
50585
50586                 d3_selectAll('.layer-streetside-images .sequence')
50587                     .classed('highlighted', function (d) { return d.properties.key === hoveredSequenceKey; })
50588                     .classed('currentView', function (d) { return d.properties.key === selectedSequenceKey; });
50589
50590                 // update viewfields if needed
50591                 d3_selectAll('.viewfield-group .viewfield')
50592                     .attr('d', viewfieldPath);
50593
50594                 function viewfieldPath() {
50595                     var d = this.parentNode.__data__;
50596                     if (d.pano && d.key !== selectedBubbleKey) {
50597                         return 'M 8,13 m -10,0 a 10,10 0 1,0 20,0 a 10,10 0 1,0 -20,0';
50598                     } else {
50599                         return 'M 6,9 C 8,8.4 8,8.4 10,9 L 16,-2 C 12,-5 4,-5 0,-2 z';
50600                     }
50601                 }
50602
50603                 return this;
50604             },
50605
50606             /**
50607              * cache().
50608              */
50609             cache: function () {
50610                 return _ssCache;
50611             }
50612         };
50613
50614         var apibase$4 = 'https://taginfo.openstreetmap.org/api/4/';
50615         var _inflight$2 = {};
50616         var _popularKeys = {};
50617         var _taginfoCache = {};
50618
50619         var tag_sorts = {
50620             point: 'count_nodes',
50621             vertex: 'count_nodes',
50622             area: 'count_ways',
50623             line: 'count_ways'
50624         };
50625         var tag_sort_members = {
50626             point: 'count_node_members',
50627             vertex: 'count_node_members',
50628             area: 'count_way_members',
50629             line: 'count_way_members',
50630             relation: 'count_relation_members'
50631         };
50632         var tag_filters = {
50633             point: 'nodes',
50634             vertex: 'nodes',
50635             area: 'ways',
50636             line: 'ways'
50637         };
50638         var tag_members_fractions = {
50639             point: 'count_node_members_fraction',
50640             vertex: 'count_node_members_fraction',
50641             area: 'count_way_members_fraction',
50642             line: 'count_way_members_fraction',
50643             relation: 'count_relation_members_fraction'
50644         };
50645
50646
50647         function sets(params, n, o) {
50648             if (params.geometry && o[params.geometry]) {
50649                 params[n] = o[params.geometry];
50650             }
50651             return params;
50652         }
50653
50654
50655         function setFilter(params) {
50656             return sets(params, 'filter', tag_filters);
50657         }
50658
50659
50660         function setSort(params) {
50661             return sets(params, 'sortname', tag_sorts);
50662         }
50663
50664
50665         function setSortMembers(params) {
50666             return sets(params, 'sortname', tag_sort_members);
50667         }
50668
50669
50670         function clean(params) {
50671             return utilObjectOmit(params, ['geometry', 'debounce']);
50672         }
50673
50674
50675         function filterKeys(type) {
50676             var count_type = type ? 'count_' + type : 'count_all';
50677             return function(d) {
50678                 return parseFloat(d[count_type]) > 2500 || d.in_wiki;
50679             };
50680         }
50681
50682
50683         function filterMultikeys(prefix) {
50684             return function(d) {
50685                 // d.key begins with prefix, and d.key contains no additional ':'s
50686                 var re = new RegExp('^' + prefix + '(.*)$');
50687                 var matches = d.key.match(re) || [];
50688                 return (matches.length === 2 && matches[1].indexOf(':') === -1);
50689             };
50690         }
50691
50692
50693         function filterValues(allowUpperCase) {
50694             return function(d) {
50695                 if (d.value.match(/[;,]/) !== null) return false;  // exclude some punctuation
50696                 if (!allowUpperCase && d.value.match(/[A-Z*]/) !== null) return false;  // exclude uppercase letters
50697                 return parseFloat(d.fraction) > 0.0;
50698             };
50699         }
50700
50701
50702         function filterRoles(geometry) {
50703             return function(d) {
50704                 if (d.role === '') return false; // exclude empty role
50705                 if (d.role.match(/[A-Z*;,]/) !== null) return false;  // exclude uppercase letters and some punctuation
50706                 return parseFloat(d[tag_members_fractions[geometry]]) > 0.0;
50707             };
50708         }
50709
50710
50711         function valKey(d) {
50712             return {
50713                 value: d.key,
50714                 title: d.key
50715             };
50716         }
50717
50718
50719         function valKeyDescription(d) {
50720             return {
50721                 value: d.value,
50722                 title: d.description || d.value
50723             };
50724         }
50725
50726
50727         function roleKey(d) {
50728             return {
50729                 value: d.role,
50730                 title: d.role
50731             };
50732         }
50733
50734
50735         // sort keys with ':' lower than keys without ':'
50736         function sortKeys(a, b) {
50737             return (a.key.indexOf(':') === -1 && b.key.indexOf(':') !== -1) ? -1
50738                 : (a.key.indexOf(':') !== -1 && b.key.indexOf(':') === -1) ? 1
50739                 : 0;
50740         }
50741
50742
50743         var debouncedRequest$1 = debounce(request$1, 300, { leading: false });
50744
50745         function request$1(url, params, exactMatch, callback, loaded) {
50746             if (_inflight$2[url]) return;
50747
50748             if (checkCache(url, params, exactMatch, callback)) return;
50749
50750             var controller = new AbortController();
50751             _inflight$2[url] = controller;
50752
50753             d3_json(url, { signal: controller.signal })
50754                 .then(function(result) {
50755                     delete _inflight$2[url];
50756                     if (loaded) loaded(null, result);
50757                 })
50758                 .catch(function(err) {
50759                     delete _inflight$2[url];
50760                     if (err.name === 'AbortError') return;
50761                     if (loaded) loaded(err.message);
50762                 });
50763         }
50764
50765
50766         function checkCache(url, params, exactMatch, callback) {
50767             var rp = params.rp || 25;
50768             var testQuery = params.query || '';
50769             var testUrl = url;
50770
50771             do {
50772                 var hit = _taginfoCache[testUrl];
50773
50774                 // exact match, or shorter match yielding fewer than max results (rp)
50775                 if (hit && (url === testUrl || hit.length < rp)) {
50776                     callback(null, hit);
50777                     return true;
50778                 }
50779
50780                 // don't try to shorten the query
50781                 if (exactMatch || !testQuery.length) return false;
50782
50783                 // do shorten the query to see if we already have a cached result
50784                 // that has returned fewer than max results (rp)
50785                 testQuery = testQuery.slice(0, -1);
50786                 testUrl = url.replace(/&query=(.*?)&/, '&query=' + testQuery + '&');
50787             } while (testQuery.length >= 0);
50788
50789             return false;
50790         }
50791
50792
50793         var serviceTaginfo = {
50794
50795             init: function() {
50796                 _inflight$2 = {};
50797                 _taginfoCache = {};
50798                 _popularKeys = {
50799                     postal_code: true   // #5377
50800                 };
50801
50802                 // Fetch popular keys.  We'll exclude these from `values`
50803                 // lookups because they stress taginfo, and they aren't likely
50804                 // to yield meaningful autocomplete results.. see #3955
50805                 var params = {
50806                     rp: 100,
50807                     sortname: 'values_all',
50808                     sortorder: 'desc',
50809                     page: 1,
50810                     debounce: false,
50811                     lang: currentLocale
50812                 };
50813                 this.keys(params, function(err, data) {
50814                     if (err) return;
50815                     data.forEach(function(d) {
50816                         if (d.value === 'opening_hours') return;  // exception
50817                         _popularKeys[d.value] = true;
50818                     });
50819                 });
50820             },
50821
50822
50823             reset: function() {
50824                 Object.values(_inflight$2).forEach(function(controller) { controller.abort(); });
50825                 _inflight$2 = {};
50826             },
50827
50828
50829             keys: function(params, callback) {
50830                 var doRequest = params.debounce ? debouncedRequest$1 : request$1;
50831                 params = clean(setSort(params));
50832                 params = Object.assign({
50833                     rp: 10,
50834                     sortname: 'count_all',
50835                     sortorder: 'desc',
50836                     page: 1,
50837                     lang: currentLocale
50838                 }, params);
50839
50840                 var url = apibase$4 + 'keys/all?' + utilQsString(params);
50841                 doRequest(url, params, false, callback, function(err, d) {
50842                     if (err) {
50843                         callback(err);
50844                     } else {
50845                         var f = filterKeys(params.filter);
50846                         var result = d.data.filter(f).sort(sortKeys).map(valKey);
50847                         _taginfoCache[url] = result;
50848                         callback(null, result);
50849                     }
50850                 });
50851             },
50852
50853
50854             multikeys: function(params, callback) {
50855                 var doRequest = params.debounce ? debouncedRequest$1 : request$1;
50856                 params = clean(setSort(params));
50857                 params = Object.assign({
50858                     rp: 25,
50859                     sortname: 'count_all',
50860                     sortorder: 'desc',
50861                     page: 1,
50862                     lang: currentLocale
50863                 }, params);
50864
50865                 var prefix = params.query;
50866                 var url = apibase$4 + 'keys/all?' + utilQsString(params);
50867                 doRequest(url, params, true, callback, function(err, d) {
50868                     if (err) {
50869                         callback(err);
50870                     } else {
50871                         var f = filterMultikeys(prefix);
50872                         var result = d.data.filter(f).map(valKey);
50873                         _taginfoCache[url] = result;
50874                         callback(null, result);
50875                     }
50876                 });
50877             },
50878
50879
50880             values: function(params, callback) {
50881                 // Exclude popular keys from values lookups.. see #3955
50882                 var key = params.key;
50883                 if (key && _popularKeys[key]) {
50884                     callback(null, []);
50885                     return;
50886                 }
50887
50888                 var doRequest = params.debounce ? debouncedRequest$1 : request$1;
50889                 params = clean(setSort(setFilter(params)));
50890                 params = Object.assign({
50891                     rp: 25,
50892                     sortname: 'count_all',
50893                     sortorder: 'desc',
50894                     page: 1,
50895                     lang: currentLocale
50896                 }, params);
50897
50898                 var url = apibase$4 + 'key/values?' + utilQsString(params);
50899                 doRequest(url, params, false, callback, function(err, d) {
50900                     if (err) {
50901                         callback(err);
50902                     } else {
50903                         // In most cases we prefer taginfo value results with lowercase letters.
50904                         // A few OSM keys expect values to contain uppercase values (see #3377).
50905                         // This is not an exhaustive list (e.g. `name` also has uppercase values)
50906                         // but these are the fields where taginfo value lookup is most useful.
50907                         var re = /network|taxon|genus|species|brand|grape_variety|royal_cypher|listed_status|booth|rating|stars|:output|_hours|_times|_ref|manufacturer/;
50908                         var allowUpperCase = re.test(params.key);
50909                         var f = filterValues(allowUpperCase);
50910
50911                         var result = d.data.filter(f).map(valKeyDescription);
50912                         _taginfoCache[url] = result;
50913                         callback(null, result);
50914                     }
50915                 });
50916             },
50917
50918
50919             roles: function(params, callback) {
50920                 var doRequest = params.debounce ? debouncedRequest$1 : request$1;
50921                 var geometry = params.geometry;
50922                 params = clean(setSortMembers(params));
50923                 params = Object.assign({
50924                     rp: 25,
50925                     sortname: 'count_all_members',
50926                     sortorder: 'desc',
50927                     page: 1,
50928                     lang: currentLocale
50929                 }, params);
50930
50931                 var url = apibase$4 + 'relation/roles?' + utilQsString(params);
50932                 doRequest(url, params, true, callback, function(err, d) {
50933                     if (err) {
50934                         callback(err);
50935                     } else {
50936                         var f = filterRoles(geometry);
50937                         var result = d.data.filter(f).map(roleKey);
50938                         _taginfoCache[url] = result;
50939                         callback(null, result);
50940                     }
50941                 });
50942             },
50943
50944
50945             docs: function(params, callback) {
50946                 var doRequest = params.debounce ? debouncedRequest$1 : request$1;
50947                 params = clean(setSort(params));
50948
50949                 var path = 'key/wiki_pages?';
50950                 if (params.value) {
50951                     path = 'tag/wiki_pages?';
50952                 } else if (params.rtype) {
50953                     path = 'relation/wiki_pages?';
50954                 }
50955
50956                 var url = apibase$4 + path + utilQsString(params);
50957                 doRequest(url, params, true, callback, function(err, d) {
50958                     if (err) {
50959                         callback(err);
50960                     } else {
50961                         _taginfoCache[url] = d.data;
50962                         callback(null, d.data);
50963                     }
50964                 });
50965             },
50966
50967
50968             apibase: function(_) {
50969                 if (!arguments.length) return apibase$4;
50970                 apibase$4 = _;
50971                 return this;
50972             }
50973
50974         };
50975
50976         var helpers = createCommonjsModule(function (module, exports) {
50977         Object.defineProperty(exports, "__esModule", { value: true });
50978         /**
50979          * @module helpers
50980          */
50981         /**
50982          * Earth Radius used with the Harvesine formula and approximates using a spherical (non-ellipsoid) Earth.
50983          *
50984          * @memberof helpers
50985          * @type {number}
50986          */
50987         exports.earthRadius = 6371008.8;
50988         /**
50989          * Unit of measurement factors using a spherical (non-ellipsoid) earth radius.
50990          *
50991          * @memberof helpers
50992          * @type {Object}
50993          */
50994         exports.factors = {
50995             centimeters: exports.earthRadius * 100,
50996             centimetres: exports.earthRadius * 100,
50997             degrees: exports.earthRadius / 111325,
50998             feet: exports.earthRadius * 3.28084,
50999             inches: exports.earthRadius * 39.370,
51000             kilometers: exports.earthRadius / 1000,
51001             kilometres: exports.earthRadius / 1000,
51002             meters: exports.earthRadius,
51003             metres: exports.earthRadius,
51004             miles: exports.earthRadius / 1609.344,
51005             millimeters: exports.earthRadius * 1000,
51006             millimetres: exports.earthRadius * 1000,
51007             nauticalmiles: exports.earthRadius / 1852,
51008             radians: 1,
51009             yards: exports.earthRadius / 1.0936,
51010         };
51011         /**
51012          * Units of measurement factors based on 1 meter.
51013          *
51014          * @memberof helpers
51015          * @type {Object}
51016          */
51017         exports.unitsFactors = {
51018             centimeters: 100,
51019             centimetres: 100,
51020             degrees: 1 / 111325,
51021             feet: 3.28084,
51022             inches: 39.370,
51023             kilometers: 1 / 1000,
51024             kilometres: 1 / 1000,
51025             meters: 1,
51026             metres: 1,
51027             miles: 1 / 1609.344,
51028             millimeters: 1000,
51029             millimetres: 1000,
51030             nauticalmiles: 1 / 1852,
51031             radians: 1 / exports.earthRadius,
51032             yards: 1 / 1.0936,
51033         };
51034         /**
51035          * Area of measurement factors based on 1 square meter.
51036          *
51037          * @memberof helpers
51038          * @type {Object}
51039          */
51040         exports.areaFactors = {
51041             acres: 0.000247105,
51042             centimeters: 10000,
51043             centimetres: 10000,
51044             feet: 10.763910417,
51045             inches: 1550.003100006,
51046             kilometers: 0.000001,
51047             kilometres: 0.000001,
51048             meters: 1,
51049             metres: 1,
51050             miles: 3.86e-7,
51051             millimeters: 1000000,
51052             millimetres: 1000000,
51053             yards: 1.195990046,
51054         };
51055         /**
51056          * Wraps a GeoJSON {@link Geometry} in a GeoJSON {@link Feature}.
51057          *
51058          * @name feature
51059          * @param {Geometry} geometry input geometry
51060          * @param {Object} [properties={}] an Object of key-value pairs to add as properties
51061          * @param {Object} [options={}] Optional Parameters
51062          * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
51063          * @param {string|number} [options.id] Identifier associated with the Feature
51064          * @returns {Feature} a GeoJSON Feature
51065          * @example
51066          * var geometry = {
51067          *   "type": "Point",
51068          *   "coordinates": [110, 50]
51069          * };
51070          *
51071          * var feature = turf.feature(geometry);
51072          *
51073          * //=feature
51074          */
51075         function feature(geom, properties, options) {
51076             if (options === void 0) { options = {}; }
51077             var feat = { type: "Feature" };
51078             if (options.id === 0 || options.id) {
51079                 feat.id = options.id;
51080             }
51081             if (options.bbox) {
51082                 feat.bbox = options.bbox;
51083             }
51084             feat.properties = properties || {};
51085             feat.geometry = geom;
51086             return feat;
51087         }
51088         exports.feature = feature;
51089         /**
51090          * Creates a GeoJSON {@link Geometry} from a Geometry string type & coordinates.
51091          * For GeometryCollection type use `helpers.geometryCollection`
51092          *
51093          * @name geometry
51094          * @param {string} type Geometry Type
51095          * @param {Array<any>} coordinates Coordinates
51096          * @param {Object} [options={}] Optional Parameters
51097          * @returns {Geometry} a GeoJSON Geometry
51098          * @example
51099          * var type = "Point";
51100          * var coordinates = [110, 50];
51101          * var geometry = turf.geometry(type, coordinates);
51102          * // => geometry
51103          */
51104         function geometry(type, coordinates, options) {
51105             if (options === void 0) { options = {}; }
51106             switch (type) {
51107                 case "Point": return point(coordinates).geometry;
51108                 case "LineString": return lineString(coordinates).geometry;
51109                 case "Polygon": return polygon(coordinates).geometry;
51110                 case "MultiPoint": return multiPoint(coordinates).geometry;
51111                 case "MultiLineString": return multiLineString(coordinates).geometry;
51112                 case "MultiPolygon": return multiPolygon(coordinates).geometry;
51113                 default: throw new Error(type + " is invalid");
51114             }
51115         }
51116         exports.geometry = geometry;
51117         /**
51118          * Creates a {@link Point} {@link Feature} from a Position.
51119          *
51120          * @name point
51121          * @param {Array<number>} coordinates longitude, latitude position (each in decimal degrees)
51122          * @param {Object} [properties={}] an Object of key-value pairs to add as properties
51123          * @param {Object} [options={}] Optional Parameters
51124          * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
51125          * @param {string|number} [options.id] Identifier associated with the Feature
51126          * @returns {Feature<Point>} a Point feature
51127          * @example
51128          * var point = turf.point([-75.343, 39.984]);
51129          *
51130          * //=point
51131          */
51132         function point(coordinates, properties, options) {
51133             if (options === void 0) { options = {}; }
51134             var geom = {
51135                 type: "Point",
51136                 coordinates: coordinates,
51137             };
51138             return feature(geom, properties, options);
51139         }
51140         exports.point = point;
51141         /**
51142          * Creates a {@link Point} {@link FeatureCollection} from an Array of Point coordinates.
51143          *
51144          * @name points
51145          * @param {Array<Array<number>>} coordinates an array of Points
51146          * @param {Object} [properties={}] Translate these properties to each Feature
51147          * @param {Object} [options={}] Optional Parameters
51148          * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north]
51149          * associated with the FeatureCollection
51150          * @param {string|number} [options.id] Identifier associated with the FeatureCollection
51151          * @returns {FeatureCollection<Point>} Point Feature
51152          * @example
51153          * var points = turf.points([
51154          *   [-75, 39],
51155          *   [-80, 45],
51156          *   [-78, 50]
51157          * ]);
51158          *
51159          * //=points
51160          */
51161         function points(coordinates, properties, options) {
51162             if (options === void 0) { options = {}; }
51163             return featureCollection(coordinates.map(function (coords) {
51164                 return point(coords, properties);
51165             }), options);
51166         }
51167         exports.points = points;
51168         /**
51169          * Creates a {@link Polygon} {@link Feature} from an Array of LinearRings.
51170          *
51171          * @name polygon
51172          * @param {Array<Array<Array<number>>>} coordinates an array of LinearRings
51173          * @param {Object} [properties={}] an Object of key-value pairs to add as properties
51174          * @param {Object} [options={}] Optional Parameters
51175          * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
51176          * @param {string|number} [options.id] Identifier associated with the Feature
51177          * @returns {Feature<Polygon>} Polygon Feature
51178          * @example
51179          * var polygon = turf.polygon([[[-5, 52], [-4, 56], [-2, 51], [-7, 54], [-5, 52]]], { name: 'poly1' });
51180          *
51181          * //=polygon
51182          */
51183         function polygon(coordinates, properties, options) {
51184             if (options === void 0) { options = {}; }
51185             for (var _i = 0, coordinates_1 = coordinates; _i < coordinates_1.length; _i++) {
51186                 var ring = coordinates_1[_i];
51187                 if (ring.length < 4) {
51188                     throw new Error("Each LinearRing of a Polygon must have 4 or more Positions.");
51189                 }
51190                 for (var j = 0; j < ring[ring.length - 1].length; j++) {
51191                     // Check if first point of Polygon contains two numbers
51192                     if (ring[ring.length - 1][j] !== ring[0][j]) {
51193                         throw new Error("First and last Position are not equivalent.");
51194                     }
51195                 }
51196             }
51197             var geom = {
51198                 type: "Polygon",
51199                 coordinates: coordinates,
51200             };
51201             return feature(geom, properties, options);
51202         }
51203         exports.polygon = polygon;
51204         /**
51205          * Creates a {@link Polygon} {@link FeatureCollection} from an Array of Polygon coordinates.
51206          *
51207          * @name polygons
51208          * @param {Array<Array<Array<Array<number>>>>} coordinates an array of Polygon coordinates
51209          * @param {Object} [properties={}] an Object of key-value pairs to add as properties
51210          * @param {Object} [options={}] Optional Parameters
51211          * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
51212          * @param {string|number} [options.id] Identifier associated with the FeatureCollection
51213          * @returns {FeatureCollection<Polygon>} Polygon FeatureCollection
51214          * @example
51215          * var polygons = turf.polygons([
51216          *   [[[-5, 52], [-4, 56], [-2, 51], [-7, 54], [-5, 52]]],
51217          *   [[[-15, 42], [-14, 46], [-12, 41], [-17, 44], [-15, 42]]],
51218          * ]);
51219          *
51220          * //=polygons
51221          */
51222         function polygons(coordinates, properties, options) {
51223             if (options === void 0) { options = {}; }
51224             return featureCollection(coordinates.map(function (coords) {
51225                 return polygon(coords, properties);
51226             }), options);
51227         }
51228         exports.polygons = polygons;
51229         /**
51230          * Creates a {@link LineString} {@link Feature} from an Array of Positions.
51231          *
51232          * @name lineString
51233          * @param {Array<Array<number>>} coordinates an array of Positions
51234          * @param {Object} [properties={}] an Object of key-value pairs to add as properties
51235          * @param {Object} [options={}] Optional Parameters
51236          * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
51237          * @param {string|number} [options.id] Identifier associated with the Feature
51238          * @returns {Feature<LineString>} LineString Feature
51239          * @example
51240          * var linestring1 = turf.lineString([[-24, 63], [-23, 60], [-25, 65], [-20, 69]], {name: 'line 1'});
51241          * var linestring2 = turf.lineString([[-14, 43], [-13, 40], [-15, 45], [-10, 49]], {name: 'line 2'});
51242          *
51243          * //=linestring1
51244          * //=linestring2
51245          */
51246         function lineString(coordinates, properties, options) {
51247             if (options === void 0) { options = {}; }
51248             if (coordinates.length < 2) {
51249                 throw new Error("coordinates must be an array of two or more positions");
51250             }
51251             var geom = {
51252                 type: "LineString",
51253                 coordinates: coordinates,
51254             };
51255             return feature(geom, properties, options);
51256         }
51257         exports.lineString = lineString;
51258         /**
51259          * Creates a {@link LineString} {@link FeatureCollection} from an Array of LineString coordinates.
51260          *
51261          * @name lineStrings
51262          * @param {Array<Array<Array<number>>>} coordinates an array of LinearRings
51263          * @param {Object} [properties={}] an Object of key-value pairs to add as properties
51264          * @param {Object} [options={}] Optional Parameters
51265          * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north]
51266          * associated with the FeatureCollection
51267          * @param {string|number} [options.id] Identifier associated with the FeatureCollection
51268          * @returns {FeatureCollection<LineString>} LineString FeatureCollection
51269          * @example
51270          * var linestrings = turf.lineStrings([
51271          *   [[-24, 63], [-23, 60], [-25, 65], [-20, 69]],
51272          *   [[-14, 43], [-13, 40], [-15, 45], [-10, 49]]
51273          * ]);
51274          *
51275          * //=linestrings
51276          */
51277         function lineStrings(coordinates, properties, options) {
51278             if (options === void 0) { options = {}; }
51279             return featureCollection(coordinates.map(function (coords) {
51280                 return lineString(coords, properties);
51281             }), options);
51282         }
51283         exports.lineStrings = lineStrings;
51284         /**
51285          * Takes one or more {@link Feature|Features} and creates a {@link FeatureCollection}.
51286          *
51287          * @name featureCollection
51288          * @param {Feature[]} features input features
51289          * @param {Object} [options={}] Optional Parameters
51290          * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
51291          * @param {string|number} [options.id] Identifier associated with the Feature
51292          * @returns {FeatureCollection} FeatureCollection of Features
51293          * @example
51294          * var locationA = turf.point([-75.343, 39.984], {name: 'Location A'});
51295          * var locationB = turf.point([-75.833, 39.284], {name: 'Location B'});
51296          * var locationC = turf.point([-75.534, 39.123], {name: 'Location C'});
51297          *
51298          * var collection = turf.featureCollection([
51299          *   locationA,
51300          *   locationB,
51301          *   locationC
51302          * ]);
51303          *
51304          * //=collection
51305          */
51306         function featureCollection(features, options) {
51307             if (options === void 0) { options = {}; }
51308             var fc = { type: "FeatureCollection" };
51309             if (options.id) {
51310                 fc.id = options.id;
51311             }
51312             if (options.bbox) {
51313                 fc.bbox = options.bbox;
51314             }
51315             fc.features = features;
51316             return fc;
51317         }
51318         exports.featureCollection = featureCollection;
51319         /**
51320          * Creates a {@link Feature<MultiLineString>} based on a
51321          * coordinate array. Properties can be added optionally.
51322          *
51323          * @name multiLineString
51324          * @param {Array<Array<Array<number>>>} coordinates an array of LineStrings
51325          * @param {Object} [properties={}] an Object of key-value pairs to add as properties
51326          * @param {Object} [options={}] Optional Parameters
51327          * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
51328          * @param {string|number} [options.id] Identifier associated with the Feature
51329          * @returns {Feature<MultiLineString>} a MultiLineString feature
51330          * @throws {Error} if no coordinates are passed
51331          * @example
51332          * var multiLine = turf.multiLineString([[[0,0],[10,10]]]);
51333          *
51334          * //=multiLine
51335          */
51336         function multiLineString(coordinates, properties, options) {
51337             if (options === void 0) { options = {}; }
51338             var geom = {
51339                 type: "MultiLineString",
51340                 coordinates: coordinates,
51341             };
51342             return feature(geom, properties, options);
51343         }
51344         exports.multiLineString = multiLineString;
51345         /**
51346          * Creates a {@link Feature<MultiPoint>} based on a
51347          * coordinate array. Properties can be added optionally.
51348          *
51349          * @name multiPoint
51350          * @param {Array<Array<number>>} coordinates an array of Positions
51351          * @param {Object} [properties={}] an Object of key-value pairs to add as properties
51352          * @param {Object} [options={}] Optional Parameters
51353          * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
51354          * @param {string|number} [options.id] Identifier associated with the Feature
51355          * @returns {Feature<MultiPoint>} a MultiPoint feature
51356          * @throws {Error} if no coordinates are passed
51357          * @example
51358          * var multiPt = turf.multiPoint([[0,0],[10,10]]);
51359          *
51360          * //=multiPt
51361          */
51362         function multiPoint(coordinates, properties, options) {
51363             if (options === void 0) { options = {}; }
51364             var geom = {
51365                 type: "MultiPoint",
51366                 coordinates: coordinates,
51367             };
51368             return feature(geom, properties, options);
51369         }
51370         exports.multiPoint = multiPoint;
51371         /**
51372          * Creates a {@link Feature<MultiPolygon>} based on a
51373          * coordinate array. Properties can be added optionally.
51374          *
51375          * @name multiPolygon
51376          * @param {Array<Array<Array<Array<number>>>>} coordinates an array of Polygons
51377          * @param {Object} [properties={}] an Object of key-value pairs to add as properties
51378          * @param {Object} [options={}] Optional Parameters
51379          * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
51380          * @param {string|number} [options.id] Identifier associated with the Feature
51381          * @returns {Feature<MultiPolygon>} a multipolygon feature
51382          * @throws {Error} if no coordinates are passed
51383          * @example
51384          * var multiPoly = turf.multiPolygon([[[[0,0],[0,10],[10,10],[10,0],[0,0]]]]);
51385          *
51386          * //=multiPoly
51387          *
51388          */
51389         function multiPolygon(coordinates, properties, options) {
51390             if (options === void 0) { options = {}; }
51391             var geom = {
51392                 type: "MultiPolygon",
51393                 coordinates: coordinates,
51394             };
51395             return feature(geom, properties, options);
51396         }
51397         exports.multiPolygon = multiPolygon;
51398         /**
51399          * Creates a {@link Feature<GeometryCollection>} based on a
51400          * coordinate array. Properties can be added optionally.
51401          *
51402          * @name geometryCollection
51403          * @param {Array<Geometry>} geometries an array of GeoJSON Geometries
51404          * @param {Object} [properties={}] an Object of key-value pairs to add as properties
51405          * @param {Object} [options={}] Optional Parameters
51406          * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
51407          * @param {string|number} [options.id] Identifier associated with the Feature
51408          * @returns {Feature<GeometryCollection>} a GeoJSON GeometryCollection Feature
51409          * @example
51410          * var pt = turf.geometry("Point", [100, 0]);
51411          * var line = turf.geometry("LineString", [[101, 0], [102, 1]]);
51412          * var collection = turf.geometryCollection([pt, line]);
51413          *
51414          * // => collection
51415          */
51416         function geometryCollection(geometries, properties, options) {
51417             if (options === void 0) { options = {}; }
51418             var geom = {
51419                 type: "GeometryCollection",
51420                 geometries: geometries,
51421             };
51422             return feature(geom, properties, options);
51423         }
51424         exports.geometryCollection = geometryCollection;
51425         /**
51426          * Round number to precision
51427          *
51428          * @param {number} num Number
51429          * @param {number} [precision=0] Precision
51430          * @returns {number} rounded number
51431          * @example
51432          * turf.round(120.4321)
51433          * //=120
51434          *
51435          * turf.round(120.4321, 2)
51436          * //=120.43
51437          */
51438         function round(num, precision) {
51439             if (precision === void 0) { precision = 0; }
51440             if (precision && !(precision >= 0)) {
51441                 throw new Error("precision must be a positive number");
51442             }
51443             var multiplier = Math.pow(10, precision || 0);
51444             return Math.round(num * multiplier) / multiplier;
51445         }
51446         exports.round = round;
51447         /**
51448          * Convert a distance measurement (assuming a spherical Earth) from radians to a more friendly unit.
51449          * Valid units: miles, nauticalmiles, inches, yards, meters, metres, kilometers, centimeters, feet
51450          *
51451          * @name radiansToLength
51452          * @param {number} radians in radians across the sphere
51453          * @param {string} [units="kilometers"] can be degrees, radians, miles, or kilometers inches, yards, metres,
51454          * meters, kilometres, kilometers.
51455          * @returns {number} distance
51456          */
51457         function radiansToLength(radians, units) {
51458             if (units === void 0) { units = "kilometers"; }
51459             var factor = exports.factors[units];
51460             if (!factor) {
51461                 throw new Error(units + " units is invalid");
51462             }
51463             return radians * factor;
51464         }
51465         exports.radiansToLength = radiansToLength;
51466         /**
51467          * Convert a distance measurement (assuming a spherical Earth) from a real-world unit into radians
51468          * Valid units: miles, nauticalmiles, inches, yards, meters, metres, kilometers, centimeters, feet
51469          *
51470          * @name lengthToRadians
51471          * @param {number} distance in real units
51472          * @param {string} [units="kilometers"] can be degrees, radians, miles, or kilometers inches, yards, metres,
51473          * meters, kilometres, kilometers.
51474          * @returns {number} radians
51475          */
51476         function lengthToRadians(distance, units) {
51477             if (units === void 0) { units = "kilometers"; }
51478             var factor = exports.factors[units];
51479             if (!factor) {
51480                 throw new Error(units + " units is invalid");
51481             }
51482             return distance / factor;
51483         }
51484         exports.lengthToRadians = lengthToRadians;
51485         /**
51486          * Convert a distance measurement (assuming a spherical Earth) from a real-world unit into degrees
51487          * Valid units: miles, nauticalmiles, inches, yards, meters, metres, centimeters, kilometres, feet
51488          *
51489          * @name lengthToDegrees
51490          * @param {number} distance in real units
51491          * @param {string} [units="kilometers"] can be degrees, radians, miles, or kilometers inches, yards, metres,
51492          * meters, kilometres, kilometers.
51493          * @returns {number} degrees
51494          */
51495         function lengthToDegrees(distance, units) {
51496             return radiansToDegrees(lengthToRadians(distance, units));
51497         }
51498         exports.lengthToDegrees = lengthToDegrees;
51499         /**
51500          * Converts any bearing angle from the north line direction (positive clockwise)
51501          * and returns an angle between 0-360 degrees (positive clockwise), 0 being the north line
51502          *
51503          * @name bearingToAzimuth
51504          * @param {number} bearing angle, between -180 and +180 degrees
51505          * @returns {number} angle between 0 and 360 degrees
51506          */
51507         function bearingToAzimuth(bearing) {
51508             var angle = bearing % 360;
51509             if (angle < 0) {
51510                 angle += 360;
51511             }
51512             return angle;
51513         }
51514         exports.bearingToAzimuth = bearingToAzimuth;
51515         /**
51516          * Converts an angle in radians to degrees
51517          *
51518          * @name radiansToDegrees
51519          * @param {number} radians angle in radians
51520          * @returns {number} degrees between 0 and 360 degrees
51521          */
51522         function radiansToDegrees(radians) {
51523             var degrees = radians % (2 * Math.PI);
51524             return degrees * 180 / Math.PI;
51525         }
51526         exports.radiansToDegrees = radiansToDegrees;
51527         /**
51528          * Converts an angle in degrees to radians
51529          *
51530          * @name degreesToRadians
51531          * @param {number} degrees angle between 0 and 360 degrees
51532          * @returns {number} angle in radians
51533          */
51534         function degreesToRadians(degrees) {
51535             var radians = degrees % 360;
51536             return radians * Math.PI / 180;
51537         }
51538         exports.degreesToRadians = degreesToRadians;
51539         /**
51540          * Converts a length to the requested unit.
51541          * Valid units: miles, nauticalmiles, inches, yards, meters, metres, kilometers, centimeters, feet
51542          *
51543          * @param {number} length to be converted
51544          * @param {Units} [originalUnit="kilometers"] of the length
51545          * @param {Units} [finalUnit="kilometers"] returned unit
51546          * @returns {number} the converted length
51547          */
51548         function convertLength(length, originalUnit, finalUnit) {
51549             if (originalUnit === void 0) { originalUnit = "kilometers"; }
51550             if (finalUnit === void 0) { finalUnit = "kilometers"; }
51551             if (!(length >= 0)) {
51552                 throw new Error("length must be a positive number");
51553             }
51554             return radiansToLength(lengthToRadians(length, originalUnit), finalUnit);
51555         }
51556         exports.convertLength = convertLength;
51557         /**
51558          * Converts a area to the requested unit.
51559          * Valid units: kilometers, kilometres, meters, metres, centimetres, millimeters, acres, miles, yards, feet, inches
51560          * @param {number} area to be converted
51561          * @param {Units} [originalUnit="meters"] of the distance
51562          * @param {Units} [finalUnit="kilometers"] returned unit
51563          * @returns {number} the converted distance
51564          */
51565         function convertArea(area, originalUnit, finalUnit) {
51566             if (originalUnit === void 0) { originalUnit = "meters"; }
51567             if (finalUnit === void 0) { finalUnit = "kilometers"; }
51568             if (!(area >= 0)) {
51569                 throw new Error("area must be a positive number");
51570             }
51571             var startFactor = exports.areaFactors[originalUnit];
51572             if (!startFactor) {
51573                 throw new Error("invalid original units");
51574             }
51575             var finalFactor = exports.areaFactors[finalUnit];
51576             if (!finalFactor) {
51577                 throw new Error("invalid final units");
51578             }
51579             return (area / startFactor) * finalFactor;
51580         }
51581         exports.convertArea = convertArea;
51582         /**
51583          * isNumber
51584          *
51585          * @param {*} num Number to validate
51586          * @returns {boolean} true/false
51587          * @example
51588          * turf.isNumber(123)
51589          * //=true
51590          * turf.isNumber('foo')
51591          * //=false
51592          */
51593         function isNumber(num) {
51594             return !isNaN(num) && num !== null && !Array.isArray(num) && !/^\s*$/.test(num);
51595         }
51596         exports.isNumber = isNumber;
51597         /**
51598          * isObject
51599          *
51600          * @param {*} input variable to validate
51601          * @returns {boolean} true/false
51602          * @example
51603          * turf.isObject({elevation: 10})
51604          * //=true
51605          * turf.isObject('foo')
51606          * //=false
51607          */
51608         function isObject(input) {
51609             return (!!input) && (input.constructor === Object);
51610         }
51611         exports.isObject = isObject;
51612         /**
51613          * Validate BBox
51614          *
51615          * @private
51616          * @param {Array<number>} bbox BBox to validate
51617          * @returns {void}
51618          * @throws Error if BBox is not valid
51619          * @example
51620          * validateBBox([-180, -40, 110, 50])
51621          * //=OK
51622          * validateBBox([-180, -40])
51623          * //=Error
51624          * validateBBox('Foo')
51625          * //=Error
51626          * validateBBox(5)
51627          * //=Error
51628          * validateBBox(null)
51629          * //=Error
51630          * validateBBox(undefined)
51631          * //=Error
51632          */
51633         function validateBBox(bbox) {
51634             if (!bbox) {
51635                 throw new Error("bbox is required");
51636             }
51637             if (!Array.isArray(bbox)) {
51638                 throw new Error("bbox must be an Array");
51639             }
51640             if (bbox.length !== 4 && bbox.length !== 6) {
51641                 throw new Error("bbox must be an Array of 4 or 6 numbers");
51642             }
51643             bbox.forEach(function (num) {
51644                 if (!isNumber(num)) {
51645                     throw new Error("bbox must only contain numbers");
51646                 }
51647             });
51648         }
51649         exports.validateBBox = validateBBox;
51650         /**
51651          * Validate Id
51652          *
51653          * @private
51654          * @param {string|number} id Id to validate
51655          * @returns {void}
51656          * @throws Error if Id is not valid
51657          * @example
51658          * validateId([-180, -40, 110, 50])
51659          * //=Error
51660          * validateId([-180, -40])
51661          * //=Error
51662          * validateId('Foo')
51663          * //=OK
51664          * validateId(5)
51665          * //=OK
51666          * validateId(null)
51667          * //=Error
51668          * validateId(undefined)
51669          * //=Error
51670          */
51671         function validateId(id) {
51672             if (!id) {
51673                 throw new Error("id is required");
51674             }
51675             if (["string", "number"].indexOf(typeof id) === -1) {
51676                 throw new Error("id must be a number or a string");
51677             }
51678         }
51679         exports.validateId = validateId;
51680         // Deprecated methods
51681         function radians2degrees() {
51682             throw new Error("method has been renamed to `radiansToDegrees`");
51683         }
51684         exports.radians2degrees = radians2degrees;
51685         function degrees2radians() {
51686             throw new Error("method has been renamed to `degreesToRadians`");
51687         }
51688         exports.degrees2radians = degrees2radians;
51689         function distanceToDegrees() {
51690             throw new Error("method has been renamed to `lengthToDegrees`");
51691         }
51692         exports.distanceToDegrees = distanceToDegrees;
51693         function distanceToRadians() {
51694             throw new Error("method has been renamed to `lengthToRadians`");
51695         }
51696         exports.distanceToRadians = distanceToRadians;
51697         function radiansToDistance() {
51698             throw new Error("method has been renamed to `radiansToLength`");
51699         }
51700         exports.radiansToDistance = radiansToDistance;
51701         function bearingToAngle() {
51702             throw new Error("method has been renamed to `bearingToAzimuth`");
51703         }
51704         exports.bearingToAngle = bearingToAngle;
51705         function convertDistance() {
51706             throw new Error("method has been renamed to `convertLength`");
51707         }
51708         exports.convertDistance = convertDistance;
51709         });
51710
51711         unwrapExports(helpers);
51712         var helpers_1 = helpers.earthRadius;
51713         var helpers_2 = helpers.factors;
51714         var helpers_3 = helpers.unitsFactors;
51715         var helpers_4 = helpers.areaFactors;
51716         var helpers_5 = helpers.feature;
51717         var helpers_6 = helpers.geometry;
51718         var helpers_7 = helpers.point;
51719         var helpers_8 = helpers.points;
51720         var helpers_9 = helpers.polygon;
51721         var helpers_10 = helpers.polygons;
51722         var helpers_11 = helpers.lineString;
51723         var helpers_12 = helpers.lineStrings;
51724         var helpers_13 = helpers.featureCollection;
51725         var helpers_14 = helpers.multiLineString;
51726         var helpers_15 = helpers.multiPoint;
51727         var helpers_16 = helpers.multiPolygon;
51728         var helpers_17 = helpers.geometryCollection;
51729         var helpers_18 = helpers.round;
51730         var helpers_19 = helpers.radiansToLength;
51731         var helpers_20 = helpers.lengthToRadians;
51732         var helpers_21 = helpers.lengthToDegrees;
51733         var helpers_22 = helpers.bearingToAzimuth;
51734         var helpers_23 = helpers.radiansToDegrees;
51735         var helpers_24 = helpers.degreesToRadians;
51736         var helpers_25 = helpers.convertLength;
51737         var helpers_26 = helpers.convertArea;
51738         var helpers_27 = helpers.isNumber;
51739         var helpers_28 = helpers.isObject;
51740         var helpers_29 = helpers.validateBBox;
51741         var helpers_30 = helpers.validateId;
51742         var helpers_31 = helpers.radians2degrees;
51743         var helpers_32 = helpers.degrees2radians;
51744         var helpers_33 = helpers.distanceToDegrees;
51745         var helpers_34 = helpers.distanceToRadians;
51746         var helpers_35 = helpers.radiansToDistance;
51747         var helpers_36 = helpers.bearingToAngle;
51748         var helpers_37 = helpers.convertDistance;
51749
51750         var invariant = createCommonjsModule(function (module, exports) {
51751         Object.defineProperty(exports, "__esModule", { value: true });
51752
51753         /**
51754          * Unwrap a coordinate from a Point Feature, Geometry or a single coordinate.
51755          *
51756          * @name getCoord
51757          * @param {Array<number>|Geometry<Point>|Feature<Point>} coord GeoJSON Point or an Array of numbers
51758          * @returns {Array<number>} coordinates
51759          * @example
51760          * var pt = turf.point([10, 10]);
51761          *
51762          * var coord = turf.getCoord(pt);
51763          * //= [10, 10]
51764          */
51765         function getCoord(coord) {
51766             if (!coord) {
51767                 throw new Error("coord is required");
51768             }
51769             if (!Array.isArray(coord)) {
51770                 if (coord.type === "Feature" && coord.geometry !== null && coord.geometry.type === "Point") {
51771                     return coord.geometry.coordinates;
51772                 }
51773                 if (coord.type === "Point") {
51774                     return coord.coordinates;
51775                 }
51776             }
51777             if (Array.isArray(coord) && coord.length >= 2 && !Array.isArray(coord[0]) && !Array.isArray(coord[1])) {
51778                 return coord;
51779             }
51780             throw new Error("coord must be GeoJSON Point or an Array of numbers");
51781         }
51782         exports.getCoord = getCoord;
51783         /**
51784          * Unwrap coordinates from a Feature, Geometry Object or an Array
51785          *
51786          * @name getCoords
51787          * @param {Array<any>|Geometry|Feature} coords Feature, Geometry Object or an Array
51788          * @returns {Array<any>} coordinates
51789          * @example
51790          * var poly = turf.polygon([[[119.32, -8.7], [119.55, -8.69], [119.51, -8.54], [119.32, -8.7]]]);
51791          *
51792          * var coords = turf.getCoords(poly);
51793          * //= [[[119.32, -8.7], [119.55, -8.69], [119.51, -8.54], [119.32, -8.7]]]
51794          */
51795         function getCoords(coords) {
51796             if (Array.isArray(coords)) {
51797                 return coords;
51798             }
51799             // Feature
51800             if (coords.type === "Feature") {
51801                 if (coords.geometry !== null) {
51802                     return coords.geometry.coordinates;
51803                 }
51804             }
51805             else {
51806                 // Geometry
51807                 if (coords.coordinates) {
51808                     return coords.coordinates;
51809                 }
51810             }
51811             throw new Error("coords must be GeoJSON Feature, Geometry Object or an Array");
51812         }
51813         exports.getCoords = getCoords;
51814         /**
51815          * Checks if coordinates contains a number
51816          *
51817          * @name containsNumber
51818          * @param {Array<any>} coordinates GeoJSON Coordinates
51819          * @returns {boolean} true if Array contains a number
51820          */
51821         function containsNumber(coordinates) {
51822             if (coordinates.length > 1 && helpers.isNumber(coordinates[0]) && helpers.isNumber(coordinates[1])) {
51823                 return true;
51824             }
51825             if (Array.isArray(coordinates[0]) && coordinates[0].length) {
51826                 return containsNumber(coordinates[0]);
51827             }
51828             throw new Error("coordinates must only contain numbers");
51829         }
51830         exports.containsNumber = containsNumber;
51831         /**
51832          * Enforce expectations about types of GeoJSON objects for Turf.
51833          *
51834          * @name geojsonType
51835          * @param {GeoJSON} value any GeoJSON object
51836          * @param {string} type expected GeoJSON type
51837          * @param {string} name name of calling function
51838          * @throws {Error} if value is not the expected type.
51839          */
51840         function geojsonType(value, type, name) {
51841             if (!type || !name) {
51842                 throw new Error("type and name required");
51843             }
51844             if (!value || value.type !== type) {
51845                 throw new Error("Invalid input to " + name + ": must be a " + type + ", given " + value.type);
51846             }
51847         }
51848         exports.geojsonType = geojsonType;
51849         /**
51850          * Enforce expectations about types of {@link Feature} inputs for Turf.
51851          * Internally this uses {@link geojsonType} to judge geometry types.
51852          *
51853          * @name featureOf
51854          * @param {Feature} feature a feature with an expected geometry type
51855          * @param {string} type expected GeoJSON type
51856          * @param {string} name name of calling function
51857          * @throws {Error} error if value is not the expected type.
51858          */
51859         function featureOf(feature, type, name) {
51860             if (!feature) {
51861                 throw new Error("No feature passed");
51862             }
51863             if (!name) {
51864                 throw new Error(".featureOf() requires a name");
51865             }
51866             if (!feature || feature.type !== "Feature" || !feature.geometry) {
51867                 throw new Error("Invalid input to " + name + ", Feature with geometry required");
51868             }
51869             if (!feature.geometry || feature.geometry.type !== type) {
51870                 throw new Error("Invalid input to " + name + ": must be a " + type + ", given " + feature.geometry.type);
51871             }
51872         }
51873         exports.featureOf = featureOf;
51874         /**
51875          * Enforce expectations about types of {@link FeatureCollection} inputs for Turf.
51876          * Internally this uses {@link geojsonType} to judge geometry types.
51877          *
51878          * @name collectionOf
51879          * @param {FeatureCollection} featureCollection a FeatureCollection for which features will be judged
51880          * @param {string} type expected GeoJSON type
51881          * @param {string} name name of calling function
51882          * @throws {Error} if value is not the expected type.
51883          */
51884         function collectionOf(featureCollection, type, name) {
51885             if (!featureCollection) {
51886                 throw new Error("No featureCollection passed");
51887             }
51888             if (!name) {
51889                 throw new Error(".collectionOf() requires a name");
51890             }
51891             if (!featureCollection || featureCollection.type !== "FeatureCollection") {
51892                 throw new Error("Invalid input to " + name + ", FeatureCollection required");
51893             }
51894             for (var _i = 0, _a = featureCollection.features; _i < _a.length; _i++) {
51895                 var feature = _a[_i];
51896                 if (!feature || feature.type !== "Feature" || !feature.geometry) {
51897                     throw new Error("Invalid input to " + name + ", Feature with geometry required");
51898                 }
51899                 if (!feature.geometry || feature.geometry.type !== type) {
51900                     throw new Error("Invalid input to " + name + ": must be a " + type + ", given " + feature.geometry.type);
51901                 }
51902             }
51903         }
51904         exports.collectionOf = collectionOf;
51905         /**
51906          * Get Geometry from Feature or Geometry Object
51907          *
51908          * @param {Feature|Geometry} geojson GeoJSON Feature or Geometry Object
51909          * @returns {Geometry|null} GeoJSON Geometry Object
51910          * @throws {Error} if geojson is not a Feature or Geometry Object
51911          * @example
51912          * var point = {
51913          *   "type": "Feature",
51914          *   "properties": {},
51915          *   "geometry": {
51916          *     "type": "Point",
51917          *     "coordinates": [110, 40]
51918          *   }
51919          * }
51920          * var geom = turf.getGeom(point)
51921          * //={"type": "Point", "coordinates": [110, 40]}
51922          */
51923         function getGeom(geojson) {
51924             if (geojson.type === "Feature") {
51925                 return geojson.geometry;
51926             }
51927             return geojson;
51928         }
51929         exports.getGeom = getGeom;
51930         /**
51931          * Get GeoJSON object's type, Geometry type is prioritize.
51932          *
51933          * @param {GeoJSON} geojson GeoJSON object
51934          * @param {string} [name="geojson"] name of the variable to display in error message
51935          * @returns {string} GeoJSON type
51936          * @example
51937          * var point = {
51938          *   "type": "Feature",
51939          *   "properties": {},
51940          *   "geometry": {
51941          *     "type": "Point",
51942          *     "coordinates": [110, 40]
51943          *   }
51944          * }
51945          * var geom = turf.getType(point)
51946          * //="Point"
51947          */
51948         function getType(geojson, name) {
51949             if (geojson.type === "FeatureCollection") {
51950                 return "FeatureCollection";
51951             }
51952             if (geojson.type === "GeometryCollection") {
51953                 return "GeometryCollection";
51954             }
51955             if (geojson.type === "Feature" && geojson.geometry !== null) {
51956                 return geojson.geometry.type;
51957             }
51958             return geojson.type;
51959         }
51960         exports.getType = getType;
51961         });
51962
51963         unwrapExports(invariant);
51964         var invariant_1 = invariant.getCoord;
51965         var invariant_2 = invariant.getCoords;
51966         var invariant_3 = invariant.containsNumber;
51967         var invariant_4 = invariant.geojsonType;
51968         var invariant_5 = invariant.featureOf;
51969         var invariant_6 = invariant.collectionOf;
51970         var invariant_7 = invariant.getGeom;
51971         var invariant_8 = invariant.getType;
51972
51973         var lineclip_1$1 = lineclip$1;
51974         var default_1$1 = lineclip$1;
51975
51976         lineclip$1.polyline = lineclip$1;
51977         lineclip$1.polygon = polygonclip$1;
51978
51979
51980         // Cohen-Sutherland line clippign algorithm, adapted to efficiently
51981         // handle polylines rather than just segments
51982
51983         function lineclip$1(points, bbox, result) {
51984
51985             var len = points.length,
51986                 codeA = bitCode$1(points[0], bbox),
51987                 part = [],
51988                 i, a, b, codeB, lastCode;
51989
51990             if (!result) result = [];
51991
51992             for (i = 1; i < len; i++) {
51993                 a = points[i - 1];
51994                 b = points[i];
51995                 codeB = lastCode = bitCode$1(b, bbox);
51996
51997                 while (true) {
51998
51999                     if (!(codeA | codeB)) { // accept
52000                         part.push(a);
52001
52002                         if (codeB !== lastCode) { // segment went outside
52003                             part.push(b);
52004
52005                             if (i < len - 1) { // start a new line
52006                                 result.push(part);
52007                                 part = [];
52008                             }
52009                         } else if (i === len - 1) {
52010                             part.push(b);
52011                         }
52012                         break;
52013
52014                     } else if (codeA & codeB) { // trivial reject
52015                         break;
52016
52017                     } else if (codeA) { // a outside, intersect with clip edge
52018                         a = intersect$2(a, b, codeA, bbox);
52019                         codeA = bitCode$1(a, bbox);
52020
52021                     } else { // b outside
52022                         b = intersect$2(a, b, codeB, bbox);
52023                         codeB = bitCode$1(b, bbox);
52024                     }
52025                 }
52026
52027                 codeA = lastCode;
52028             }
52029
52030             if (part.length) result.push(part);
52031
52032             return result;
52033         }
52034
52035         // Sutherland-Hodgeman polygon clipping algorithm
52036
52037         function polygonclip$1(points, bbox) {
52038
52039             var result, edge, prev, prevInside, i, p, inside;
52040
52041             // clip against each side of the clip rectangle
52042             for (edge = 1; edge <= 8; edge *= 2) {
52043                 result = [];
52044                 prev = points[points.length - 1];
52045                 prevInside = !(bitCode$1(prev, bbox) & edge);
52046
52047                 for (i = 0; i < points.length; i++) {
52048                     p = points[i];
52049                     inside = !(bitCode$1(p, bbox) & edge);
52050
52051                     // if segment goes through the clip window, add an intersection
52052                     if (inside !== prevInside) result.push(intersect$2(prev, p, edge, bbox));
52053
52054                     if (inside) result.push(p); // add a point if it's inside
52055
52056                     prev = p;
52057                     prevInside = inside;
52058                 }
52059
52060                 points = result;
52061
52062                 if (!points.length) break;
52063             }
52064
52065             return result;
52066         }
52067
52068         // intersect a segment against one of the 4 lines that make up the bbox
52069
52070         function intersect$2(a, b, edge, bbox) {
52071             return edge & 8 ? [a[0] + (b[0] - a[0]) * (bbox[3] - a[1]) / (b[1] - a[1]), bbox[3]] : // top
52072                    edge & 4 ? [a[0] + (b[0] - a[0]) * (bbox[1] - a[1]) / (b[1] - a[1]), bbox[1]] : // bottom
52073                    edge & 2 ? [bbox[2], a[1] + (b[1] - a[1]) * (bbox[2] - a[0]) / (b[0] - a[0])] : // right
52074                    edge & 1 ? [bbox[0], a[1] + (b[1] - a[1]) * (bbox[0] - a[0]) / (b[0] - a[0])] : // left
52075                    null;
52076         }
52077
52078         // bit code reflects the point position relative to the bbox:
52079
52080         //         left  mid  right
52081         //    top  1001  1000  1010
52082         //    mid  0001  0000  0010
52083         // bottom  0101  0100  0110
52084
52085         function bitCode$1(p, bbox) {
52086             var code = 0;
52087
52088             if (p[0] < bbox[0]) code |= 1; // left
52089             else if (p[0] > bbox[2]) code |= 2; // right
52090
52091             if (p[1] < bbox[1]) code |= 4; // bottom
52092             else if (p[1] > bbox[3]) code |= 8; // top
52093
52094             return code;
52095         }
52096         lineclip_1$1.default = default_1$1;
52097
52098         var bboxClip_1 = createCommonjsModule(function (module, exports) {
52099         var __importStar = (commonjsGlobal && commonjsGlobal.__importStar) || function (mod) {
52100             if (mod && mod.__esModule) return mod;
52101             var result = {};
52102             if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
52103             result["default"] = mod;
52104             return result;
52105         };
52106         Object.defineProperty(exports, "__esModule", { value: true });
52107
52108
52109         var lineclip = __importStar(lineclip_1$1);
52110         /**
52111          * Takes a {@link Feature} and a bbox and clips the feature to the bbox using
52112          * [lineclip](https://github.com/mapbox/lineclip).
52113          * May result in degenerate edges when clipping Polygons.
52114          *
52115          * @name bboxClip
52116          * @param {Feature<LineString|MultiLineString|Polygon|MultiPolygon>} feature feature to clip to the bbox
52117          * @param {BBox} bbox extent in [minX, minY, maxX, maxY] order
52118          * @returns {Feature<LineString|MultiLineString|Polygon|MultiPolygon>} clipped Feature
52119          * @example
52120          * var bbox = [0, 0, 10, 10];
52121          * var poly = turf.polygon([[[2, 2], [8, 4], [12, 8], [3, 7], [2, 2]]]);
52122          *
52123          * var clipped = turf.bboxClip(poly, bbox);
52124          *
52125          * //addToMap
52126          * var addToMap = [bbox, poly, clipped]
52127          */
52128         function bboxClip(feature, bbox) {
52129             var geom = invariant.getGeom(feature);
52130             var type = geom.type;
52131             var properties = feature.type === "Feature" ? feature.properties : {};
52132             var coords = geom.coordinates;
52133             switch (type) {
52134                 case "LineString":
52135                 case "MultiLineString":
52136                     var lines_1 = [];
52137                     if (type === "LineString") {
52138                         coords = [coords];
52139                     }
52140                     coords.forEach(function (line) {
52141                         lineclip.polyline(line, bbox, lines_1);
52142                     });
52143                     if (lines_1.length === 1) {
52144                         return helpers.lineString(lines_1[0], properties);
52145                     }
52146                     return helpers.multiLineString(lines_1, properties);
52147                 case "Polygon":
52148                     return helpers.polygon(clipPolygon(coords, bbox), properties);
52149                 case "MultiPolygon":
52150                     return helpers.multiPolygon(coords.map(function (poly) {
52151                         return clipPolygon(poly, bbox);
52152                     }), properties);
52153                 default:
52154                     throw new Error("geometry " + type + " not supported");
52155             }
52156         }
52157         exports.default = bboxClip;
52158         function clipPolygon(rings, bbox) {
52159             var outRings = [];
52160             for (var _i = 0, rings_1 = rings; _i < rings_1.length; _i++) {
52161                 var ring = rings_1[_i];
52162                 var clipped = lineclip.polygon(ring, bbox);
52163                 if (clipped.length > 0) {
52164                     if (clipped[0][0] !== clipped[clipped.length - 1][0] || clipped[0][1] !== clipped[clipped.length - 1][1]) {
52165                         clipped.push(clipped[0]);
52166                     }
52167                     if (clipped.length >= 4) {
52168                         outRings.push(clipped);
52169                     }
52170                 }
52171             }
52172             return outRings;
52173         }
52174         });
52175
52176         var turf_bboxClip = unwrapExports(bboxClip_1);
52177
52178         var fastJsonStableStringify = function (data, opts) {
52179             if (!opts) opts = {};
52180             if (typeof opts === 'function') opts = { cmp: opts };
52181             var cycles = (typeof opts.cycles === 'boolean') ? opts.cycles : false;
52182
52183             var cmp = opts.cmp && (function (f) {
52184                 return function (node) {
52185                     return function (a, b) {
52186                         var aobj = { key: a, value: node[a] };
52187                         var bobj = { key: b, value: node[b] };
52188                         return f(aobj, bobj);
52189                     };
52190                 };
52191             })(opts.cmp);
52192
52193             var seen = [];
52194             return (function stringify (node) {
52195                 if (node && node.toJSON && typeof node.toJSON === 'function') {
52196                     node = node.toJSON();
52197                 }
52198
52199                 if (node === undefined) return;
52200                 if (typeof node == 'number') return isFinite(node) ? '' + node : 'null';
52201                 if (typeof node !== 'object') return JSON.stringify(node);
52202
52203                 var i, out;
52204                 if (Array.isArray(node)) {
52205                     out = '[';
52206                     for (i = 0; i < node.length; i++) {
52207                         if (i) out += ',';
52208                         out += stringify(node[i]) || 'null';
52209                     }
52210                     return out + ']';
52211                 }
52212
52213                 if (node === null) return 'null';
52214
52215                 if (seen.indexOf(node) !== -1) {
52216                     if (cycles) return JSON.stringify('__cycle__');
52217                     throw new TypeError('Converting circular structure to JSON');
52218                 }
52219
52220                 var seenIndex = seen.push(node) - 1;
52221                 var keys = Object.keys(node).sort(cmp && cmp(node));
52222                 out = '';
52223                 for (i = 0; i < keys.length; i++) {
52224                     var key = keys[i];
52225                     var value = stringify(node[key]);
52226
52227                     if (!value) continue;
52228                     if (out) out += ',';
52229                     out += JSON.stringify(key) + ':' + value;
52230                 }
52231                 seen.splice(seenIndex, 1);
52232                 return '{' + out + '}';
52233             })(data);
52234         };
52235
52236         var martinez_umd = createCommonjsModule(function (module, exports) {
52237         /**
52238          * martinez v0.5.0
52239          * Martinez polygon clipping algorithm, does boolean operation on polygons (multipolygons, polygons with holes etc): intersection, union, difference, xor
52240          *
52241          * @author Alex Milevski <info@w8r.name>
52242          * @license MIT
52243          * @preserve
52244          */
52245
52246         (function (global, factory) {
52247           factory(exports);
52248         }(commonjsGlobal, (function (exports) {
52249           function DEFAULT_COMPARE (a, b) { return a > b ? 1 : a < b ? -1 : 0; }
52250
52251           var SplayTree = function SplayTree(compare, noDuplicates) {
52252             if ( compare === void 0 ) compare = DEFAULT_COMPARE;
52253             if ( noDuplicates === void 0 ) noDuplicates = false;
52254
52255             this._compare = compare;
52256             this._root = null;
52257             this._size = 0;
52258             this._noDuplicates = !!noDuplicates;
52259           };
52260
52261           var prototypeAccessors = { size: { configurable: true } };
52262
52263
52264           SplayTree.prototype.rotateLeft = function rotateLeft (x) {
52265             var y = x.right;
52266             if (y) {
52267               x.right = y.left;
52268               if (y.left) { y.left.parent = x; }
52269               y.parent = x.parent;
52270             }
52271
52272             if (!x.parent)              { this._root = y; }
52273             else if (x === x.parent.left) { x.parent.left = y; }
52274             else                        { x.parent.right = y; }
52275             if (y) { y.left = x; }
52276             x.parent = y;
52277           };
52278
52279
52280           SplayTree.prototype.rotateRight = function rotateRight (x) {
52281             var y = x.left;
52282             if (y) {
52283               x.left = y.right;
52284               if (y.right) { y.right.parent = x; }
52285               y.parent = x.parent;
52286             }
52287
52288             if (!x.parent)             { this._root = y; }
52289             else if(x === x.parent.left) { x.parent.left = y; }
52290             else                       { x.parent.right = y; }
52291             if (y) { y.right = x; }
52292             x.parent = y;
52293           };
52294
52295
52296           SplayTree.prototype._splay = function _splay (x) {
52297               var this$1 = this;
52298
52299             while (x.parent) {
52300               var p = x.parent;
52301               if (!p.parent) {
52302                 if (p.left === x) { this$1.rotateRight(p); }
52303                 else            { this$1.rotateLeft(p); }
52304               } else if (p.left === x && p.parent.left === p) {
52305                 this$1.rotateRight(p.parent);
52306                 this$1.rotateRight(p);
52307               } else if (p.right === x && p.parent.right === p) {
52308                 this$1.rotateLeft(p.parent);
52309                 this$1.rotateLeft(p);
52310               } else if (p.left === x && p.parent.right === p) {
52311                 this$1.rotateRight(p);
52312                 this$1.rotateLeft(p);
52313               } else {
52314                 this$1.rotateLeft(p);
52315                 this$1.rotateRight(p);
52316               }
52317             }
52318           };
52319
52320
52321           SplayTree.prototype.splay = function splay (x) {
52322               var this$1 = this;
52323
52324             var p, gp, ggp, l, r;
52325
52326             while (x.parent) {
52327               p = x.parent;
52328               gp = p.parent;
52329
52330               if (gp && gp.parent) {
52331                 ggp = gp.parent;
52332                 if (ggp.left === gp) { ggp.left= x; }
52333                 else               { ggp.right = x; }
52334                 x.parent = ggp;
52335               } else {
52336                 x.parent = null;
52337                 this$1._root = x;
52338               }
52339
52340               l = x.left; r = x.right;
52341
52342               if (x === p.left) { // left
52343                 if (gp) {
52344                   if (gp.left === p) {
52345                     /* zig-zig */
52346                     if (p.right) {
52347                       gp.left = p.right;
52348                       gp.left.parent = gp;
52349                     } else { gp.left = null; }
52350
52351                     p.right = gp;
52352                     gp.parent = p;
52353                   } else {
52354                     /* zig-zag */
52355                     if (l) {
52356                       gp.right = l;
52357                       l.parent = gp;
52358                     } else { gp.right = null; }
52359
52360                     x.left  = gp;
52361                     gp.parent = x;
52362                   }
52363                 }
52364                 if (r) {
52365                   p.left = r;
52366                   r.parent = p;
52367                 } else { p.left = null; }
52368
52369                 x.right= p;
52370                 p.parent = x;
52371               } else { // right
52372                 if (gp) {
52373                   if (gp.right === p) {
52374                     /* zig-zig */
52375                     if (p.left) {
52376                       gp.right = p.left;
52377                       gp.right.parent = gp;
52378                     } else { gp.right = null; }
52379
52380                     p.left = gp;
52381                     gp.parent = p;
52382                   } else {
52383                     /* zig-zag */
52384                     if (r) {
52385                       gp.left = r;
52386                       r.parent = gp;
52387                     } else { gp.left = null; }
52388
52389                     x.right = gp;
52390                     gp.parent = x;
52391                   }
52392                 }
52393                 if (l) {
52394                   p.right = l;
52395                   l.parent = p;
52396                 } else { p.right = null; }
52397
52398                 x.left = p;
52399                 p.parent = x;
52400               }
52401             }
52402           };
52403
52404
52405           SplayTree.prototype.replace = function replace (u, v) {
52406             if (!u.parent) { this._root = v; }
52407             else if (u === u.parent.left) { u.parent.left = v; }
52408             else { u.parent.right = v; }
52409             if (v) { v.parent = u.parent; }
52410           };
52411
52412
52413           SplayTree.prototype.minNode = function minNode (u) {
52414               if ( u === void 0 ) u = this._root;
52415
52416             if (u) { while (u.left) { u = u.left; } }
52417             return u;
52418           };
52419
52420
52421           SplayTree.prototype.maxNode = function maxNode (u) {
52422               if ( u === void 0 ) u = this._root;
52423
52424             if (u) { while (u.right) { u = u.right; } }
52425             return u;
52426           };
52427
52428
52429           SplayTree.prototype.insert = function insert (key, data) {
52430             var z = this._root;
52431             var p = null;
52432             var comp = this._compare;
52433             var cmp;
52434
52435             if (this._noDuplicates) {
52436               while (z) {
52437                 p = z;
52438                 cmp = comp(z.key, key);
52439                 if (cmp === 0) { return; }
52440                 else if (comp(z.key, key) < 0) { z = z.right; }
52441                 else { z = z.left; }
52442               }
52443             } else {
52444               while (z) {
52445                 p = z;
52446                 if (comp(z.key, key) < 0) { z = z.right; }
52447                 else { z = z.left; }
52448               }
52449             }
52450
52451             z = { key: key, data: data, left: null, right: null, parent: p };
52452
52453             if (!p)                        { this._root = z; }
52454             else if (comp(p.key, z.key) < 0) { p.right = z; }
52455             else                           { p.left= z; }
52456
52457             this.splay(z);
52458             this._size++;
52459             return z;
52460           };
52461
52462
52463           SplayTree.prototype.find = function find (key) {
52464             var z  = this._root;
52465             var comp = this._compare;
52466             while (z) {
52467               var cmp = comp(z.key, key);
52468               if    (cmp < 0) { z = z.right; }
52469               else if (cmp > 0) { z = z.left; }
52470               else            { return z; }
52471             }
52472             return null;
52473           };
52474
52475           /**
52476            * Whether the tree contains a node with the given key
52477            * @param{Key} key
52478            * @return {boolean} true/false
52479            */
52480           SplayTree.prototype.contains = function contains (key) {
52481             var node     = this._root;
52482             var comparator = this._compare;
52483             while (node){
52484               var cmp = comparator(key, node.key);
52485               if    (cmp === 0) { return true; }
52486               else if (cmp < 0) { node = node.left; }
52487               else              { node = node.right; }
52488             }
52489
52490             return false;
52491           };
52492
52493
52494           SplayTree.prototype.remove = function remove (key) {
52495             var z = this.find(key);
52496
52497             if (!z) { return false; }
52498
52499             this.splay(z);
52500
52501             if (!z.left) { this.replace(z, z.right); }
52502             else if (!z.right) { this.replace(z, z.left); }
52503             else {
52504               var y = this.minNode(z.right);
52505               if (y.parent !== z) {
52506                 this.replace(y, y.right);
52507                 y.right = z.right;
52508                 y.right.parent = y;
52509               }
52510               this.replace(z, y);
52511               y.left = z.left;
52512               y.left.parent = y;
52513             }
52514
52515             this._size--;
52516             return true;
52517           };
52518
52519
52520           SplayTree.prototype.removeNode = function removeNode (z) {
52521             if (!z) { return false; }
52522
52523             this.splay(z);
52524
52525             if (!z.left) { this.replace(z, z.right); }
52526             else if (!z.right) { this.replace(z, z.left); }
52527             else {
52528               var y = this.minNode(z.right);
52529               if (y.parent !== z) {
52530                 this.replace(y, y.right);
52531                 y.right = z.right;
52532                 y.right.parent = y;
52533               }
52534               this.replace(z, y);
52535               y.left = z.left;
52536               y.left.parent = y;
52537             }
52538
52539             this._size--;
52540             return true;
52541           };
52542
52543
52544           SplayTree.prototype.erase = function erase (key) {
52545             var z = this.find(key);
52546             if (!z) { return; }
52547
52548             this.splay(z);
52549
52550             var s = z.left;
52551             var t = z.right;
52552
52553             var sMax = null;
52554             if (s) {
52555               s.parent = null;
52556               sMax = this.maxNode(s);
52557               this.splay(sMax);
52558               this._root = sMax;
52559             }
52560             if (t) {
52561               if (s) { sMax.right = t; }
52562               else { this._root = t; }
52563               t.parent = sMax;
52564             }
52565
52566             this._size--;
52567           };
52568
52569           /**
52570            * Removes and returns the node with smallest key
52571            * @return {?Node}
52572            */
52573           SplayTree.prototype.pop = function pop () {
52574             var node = this._root, returnValue = null;
52575             if (node) {
52576               while (node.left) { node = node.left; }
52577               returnValue = { key: node.key, data: node.data };
52578               this.remove(node.key);
52579             }
52580             return returnValue;
52581           };
52582
52583
52584           /* eslint-disable class-methods-use-this */
52585
52586           /**
52587            * Successor node
52588            * @param{Node} node
52589            * @return {?Node}
52590            */
52591           SplayTree.prototype.next = function next (node) {
52592             var successor = node;
52593             if (successor) {
52594               if (successor.right) {
52595                 successor = successor.right;
52596                 while (successor && successor.left) { successor = successor.left; }
52597               } else {
52598                 successor = node.parent;
52599                 while (successor && successor.right === node) {
52600                   node = successor; successor = successor.parent;
52601                 }
52602               }
52603             }
52604             return successor;
52605           };
52606
52607
52608           /**
52609            * Predecessor node
52610            * @param{Node} node
52611            * @return {?Node}
52612            */
52613           SplayTree.prototype.prev = function prev (node) {
52614             var predecessor = node;
52615             if (predecessor) {
52616               if (predecessor.left) {
52617                 predecessor = predecessor.left;
52618                 while (predecessor && predecessor.right) { predecessor = predecessor.right; }
52619               } else {
52620                 predecessor = node.parent;
52621                 while (predecessor && predecessor.left === node) {
52622                   node = predecessor;
52623                   predecessor = predecessor.parent;
52624                 }
52625               }
52626             }
52627             return predecessor;
52628           };
52629           /* eslint-enable class-methods-use-this */
52630
52631
52632           /**
52633            * @param{forEachCallback} callback
52634            * @return {SplayTree}
52635            */
52636           SplayTree.prototype.forEach = function forEach (callback) {
52637             var current = this._root;
52638             var s = [], done = false, i = 0;
52639
52640             while (!done) {
52641               // Reach the left most Node of the current Node
52642               if (current) {
52643                 // Place pointer to a tree node on the stack
52644                 // before traversing the node's left subtree
52645                 s.push(current);
52646                 current = current.left;
52647               } else {
52648                 // BackTrack from the empty subtree and visit the Node
52649                 // at the top of the stack; however, if the stack is
52650                 // empty you are done
52651                 if (s.length > 0) {
52652                   current = s.pop();
52653                   callback(current, i++);
52654
52655                   // We have visited the node and its left
52656                   // subtree. Now, it's right subtree's turn
52657                   current = current.right;
52658                 } else { done = true; }
52659               }
52660             }
52661             return this;
52662           };
52663
52664
52665           /**
52666            * Walk key range from `low` to `high`. Stops if `fn` returns a value.
52667            * @param{Key}    low
52668            * @param{Key}    high
52669            * @param{Function} fn
52670            * @param{*?}     ctx
52671            * @return {SplayTree}
52672            */
52673           SplayTree.prototype.range = function range (low, high, fn, ctx) {
52674               var this$1 = this;
52675
52676             var Q = [];
52677             var compare = this._compare;
52678             var node = this._root, cmp;
52679
52680             while (Q.length !== 0 || node) {
52681               if (node) {
52682                 Q.push(node);
52683                 node = node.left;
52684               } else {
52685                 node = Q.pop();
52686                 cmp = compare(node.key, high);
52687                 if (cmp > 0) {
52688                   break;
52689                 } else if (compare(node.key, low) >= 0) {
52690                   if (fn.call(ctx, node)) { return this$1; } // stop if smth is returned
52691                 }
52692                 node = node.right;
52693               }
52694             }
52695             return this;
52696           };
52697
52698           /**
52699            * Returns all keys in order
52700            * @return {Array<Key>}
52701            */
52702           SplayTree.prototype.keys = function keys () {
52703             var current = this._root;
52704             var s = [], r = [], done = false;
52705
52706             while (!done) {
52707               if (current) {
52708                 s.push(current);
52709                 current = current.left;
52710               } else {
52711                 if (s.length > 0) {
52712                   current = s.pop();
52713                   r.push(current.key);
52714                   current = current.right;
52715                 } else { done = true; }
52716               }
52717             }
52718             return r;
52719           };
52720
52721
52722           /**
52723            * Returns `data` fields of all nodes in order.
52724            * @return {Array<Value>}
52725            */
52726           SplayTree.prototype.values = function values () {
52727             var current = this._root;
52728             var s = [], r = [], done = false;
52729
52730             while (!done) {
52731               if (current) {
52732                 s.push(current);
52733                 current = current.left;
52734               } else {
52735                 if (s.length > 0) {
52736                   current = s.pop();
52737                   r.push(current.data);
52738                   current = current.right;
52739                 } else { done = true; }
52740               }
52741             }
52742             return r;
52743           };
52744
52745
52746           /**
52747            * Returns node at given index
52748            * @param{number} index
52749            * @return {?Node}
52750            */
52751           SplayTree.prototype.at = function at (index) {
52752             // removed after a consideration, more misleading than useful
52753             // index = index % this.size;
52754             // if (index < 0) index = this.size - index;
52755
52756             var current = this._root;
52757             var s = [], done = false, i = 0;
52758
52759             while (!done) {
52760               if (current) {
52761                 s.push(current);
52762                 current = current.left;
52763               } else {
52764                 if (s.length > 0) {
52765                   current = s.pop();
52766                   if (i === index) { return current; }
52767                   i++;
52768                   current = current.right;
52769                 } else { done = true; }
52770               }
52771             }
52772             return null;
52773           };
52774
52775           /**
52776            * Bulk-load items. Both array have to be same size
52777            * @param{Array<Key>}  keys
52778            * @param{Array<Value>}[values]
52779            * @param{Boolean}     [presort=false] Pre-sort keys and values, using
52780            *                                       tree's comparator. Sorting is done
52781            *                                       in-place
52782            * @return {AVLTree}
52783            */
52784           SplayTree.prototype.load = function load (keys, values, presort) {
52785               if ( keys === void 0 ) keys = [];
52786               if ( values === void 0 ) values = [];
52787               if ( presort === void 0 ) presort = false;
52788
52789             if (this._size !== 0) { throw new Error('bulk-load: tree is not empty'); }
52790             var size = keys.length;
52791             if (presort) { sort(keys, values, 0, size - 1, this._compare); }
52792             this._root = loadRecursive(null, keys, values, 0, size);
52793             this._size = size;
52794             return this;
52795           };
52796
52797
52798           SplayTree.prototype.min = function min () {
52799             var node = this.minNode(this._root);
52800             if (node) { return node.key; }
52801             else    { return null; }
52802           };
52803
52804
52805           SplayTree.prototype.max = function max () {
52806             var node = this.maxNode(this._root);
52807             if (node) { return node.key; }
52808             else    { return null; }
52809           };
52810
52811           SplayTree.prototype.isEmpty = function isEmpty () { return this._root === null; };
52812           prototypeAccessors.size.get = function () { return this._size; };
52813
52814
52815           /**
52816            * Create a tree and load it with items
52817            * @param{Array<Key>}        keys
52818            * @param{Array<Value>?}      [values]
52819
52820            * @param{Function?}          [comparator]
52821            * @param{Boolean?}           [presort=false] Pre-sort keys and values, using
52822            *                                             tree's comparator. Sorting is done
52823            *                                             in-place
52824            * @param{Boolean?}           [noDuplicates=false] Allow duplicates
52825            * @return {SplayTree}
52826            */
52827           SplayTree.createTree = function createTree (keys, values, comparator, presort, noDuplicates) {
52828             return new SplayTree(comparator, noDuplicates).load(keys, values, presort);
52829           };
52830
52831           Object.defineProperties( SplayTree.prototype, prototypeAccessors );
52832
52833
52834           function loadRecursive (parent, keys, values, start, end) {
52835             var size = end - start;
52836             if (size > 0) {
52837               var middle = start + Math.floor(size / 2);
52838               var key    = keys[middle];
52839               var data   = values[middle];
52840               var node   = { key: key, data: data, parent: parent };
52841               node.left    = loadRecursive(node, keys, values, start, middle);
52842               node.right   = loadRecursive(node, keys, values, middle + 1, end);
52843               return node;
52844             }
52845             return null;
52846           }
52847
52848
52849           function sort(keys, values, left, right, compare) {
52850             if (left >= right) { return; }
52851
52852             var pivot = keys[(left + right) >> 1];
52853             var i = left - 1;
52854             var j = right + 1;
52855
52856             while (true) {
52857               do { i++; } while (compare(keys[i], pivot) < 0);
52858               do { j--; } while (compare(keys[j], pivot) > 0);
52859               if (i >= j) { break; }
52860
52861               var tmp = keys[i];
52862               keys[i] = keys[j];
52863               keys[j] = tmp;
52864
52865               tmp = values[i];
52866               values[i] = values[j];
52867               values[j] = tmp;
52868             }
52869
52870             sort(keys, values,  left,     j, compare);
52871             sort(keys, values, j + 1, right, compare);
52872           }
52873
52874           var NORMAL               = 0;
52875           var NON_CONTRIBUTING     = 1;
52876           var SAME_TRANSITION      = 2;
52877           var DIFFERENT_TRANSITION = 3;
52878
52879           var INTERSECTION = 0;
52880           var UNION        = 1;
52881           var DIFFERENCE   = 2;
52882           var XOR          = 3;
52883
52884           /**
52885            * @param  {SweepEvent} event
52886            * @param  {SweepEvent} prev
52887            * @param  {Operation} operation
52888            */
52889           function computeFields (event, prev, operation) {
52890             // compute inOut and otherInOut fields
52891             if (prev === null) {
52892               event.inOut      = false;
52893               event.otherInOut = true;
52894
52895             // previous line segment in sweepline belongs to the same polygon
52896             } else {
52897               if (event.isSubject === prev.isSubject) {
52898                 event.inOut      = !prev.inOut;
52899                 event.otherInOut = prev.otherInOut;
52900
52901               // previous line segment in sweepline belongs to the clipping polygon
52902               } else {
52903                 event.inOut      = !prev.otherInOut;
52904                 event.otherInOut = prev.isVertical() ? !prev.inOut : prev.inOut;
52905               }
52906
52907               // compute prevInResult field
52908               if (prev) {
52909                 event.prevInResult = (!inResult(prev, operation) || prev.isVertical())
52910                   ? prev.prevInResult : prev;
52911               }
52912             }
52913
52914             // check if the line segment belongs to the Boolean operation
52915             event.inResult = inResult(event, operation);
52916           }
52917
52918
52919           /* eslint-disable indent */
52920           function inResult(event, operation) {
52921             switch (event.type) {
52922               case NORMAL:
52923                 switch (operation) {
52924                   case INTERSECTION:
52925                     return !event.otherInOut;
52926                   case UNION:
52927                     return event.otherInOut;
52928                   case DIFFERENCE:
52929                     // return (event.isSubject && !event.otherInOut) ||
52930                     //         (!event.isSubject && event.otherInOut);
52931                     return (event.isSubject && event.otherInOut) ||
52932                             (!event.isSubject && !event.otherInOut);
52933                   case XOR:
52934                     return true;
52935                 }
52936                 break;
52937               case SAME_TRANSITION:
52938                 return operation === INTERSECTION || operation === UNION;
52939               case DIFFERENT_TRANSITION:
52940                 return operation === DIFFERENCE;
52941               case NON_CONTRIBUTING:
52942                 return false;
52943             }
52944             return false;
52945           }
52946           /* eslint-enable indent */
52947
52948           var SweepEvent = function SweepEvent (point, left, otherEvent, isSubject, edgeType) {
52949
52950             /**
52951              * Is left endpoint?
52952              * @type {Boolean}
52953              */
52954             this.left = left;
52955
52956             /**
52957              * @type {Array.<Number>}
52958              */
52959             this.point = point;
52960
52961             /**
52962              * Other edge reference
52963              * @type {SweepEvent}
52964              */
52965             this.otherEvent = otherEvent;
52966
52967             /**
52968              * Belongs to source or clipping polygon
52969              * @type {Boolean}
52970              */
52971             this.isSubject = isSubject;
52972
52973             /**
52974              * Edge contribution type
52975              * @type {Number}
52976              */
52977             this.type = edgeType || NORMAL;
52978
52979
52980             /**
52981              * In-out transition for the sweepline crossing polygon
52982              * @type {Boolean}
52983              */
52984             this.inOut = false;
52985
52986
52987             /**
52988              * @type {Boolean}
52989              */
52990             this.otherInOut = false;
52991
52992             /**
52993              * Previous event in result?
52994              * @type {SweepEvent}
52995              */
52996             this.prevInResult = null;
52997
52998             /**
52999              * Does event belong to result?
53000              * @type {Boolean}
53001              */
53002             this.inResult = false;
53003
53004
53005             // connection step
53006
53007             /**
53008              * @type {Boolean}
53009              */
53010             this.resultInOut = false;
53011
53012             this.isExteriorRing = true;
53013           };
53014
53015
53016           /**
53017            * @param{Array.<Number>}p
53018            * @return {Boolean}
53019            */
53020           SweepEvent.prototype.isBelow = function isBelow (p) {
53021             var p0 = this.point, p1 = this.otherEvent.point;
53022             return this.left
53023               ? (p0[0] - p[0]) * (p1[1] - p[1]) - (p1[0] - p[0]) * (p0[1] - p[1]) > 0
53024               // signedArea(this.point, this.otherEvent.point, p) > 0 :
53025               : (p1[0] - p[0]) * (p0[1] - p[1]) - (p0[0] - p[0]) * (p1[1] - p[1]) > 0;
53026               //signedArea(this.otherEvent.point, this.point, p) > 0;
53027           };
53028
53029
53030           /**
53031            * @param{Array.<Number>}p
53032            * @return {Boolean}
53033            */
53034           SweepEvent.prototype.isAbove = function isAbove (p) {
53035             return !this.isBelow(p);
53036           };
53037
53038
53039           /**
53040            * @return {Boolean}
53041            */
53042           SweepEvent.prototype.isVertical = function isVertical () {
53043             return this.point[0] === this.otherEvent.point[0];
53044           };
53045
53046
53047           SweepEvent.prototype.clone = function clone () {
53048             var copy = new SweepEvent(
53049               this.point, this.left, this.otherEvent, this.isSubject, this.type);
53050
53051             copy.inResult     = this.inResult;
53052             copy.prevInResult = this.prevInResult;
53053             copy.isExteriorRing = this.isExteriorRing;
53054             copy.inOut        = this.inOut;
53055             copy.otherInOut   = this.otherInOut;
53056
53057             return copy;
53058           };
53059
53060           function equals(p1, p2) {
53061             if (p1[0] === p2[0]) {
53062               if (p1[1] === p2[1]) {
53063                 return true;
53064               } else {
53065                 return false;
53066               }
53067             }
53068             return false;
53069           }
53070
53071           // const EPSILON = 1e-9;
53072           // const abs = Math.abs;
53073           // TODO https://github.com/w8r/martinez/issues/6#issuecomment-262847164
53074           // Precision problem.
53075           //
53076           // module.exports = function equals(p1, p2) {
53077           //   return abs(p1[0] - p2[0]) <= EPSILON && abs(p1[1] - p2[1]) <= EPSILON;
53078           // };
53079
53080           /**
53081            * Signed area of the triangle (p0, p1, p2)
53082            * @param  {Array.<Number>} p0
53083            * @param  {Array.<Number>} p1
53084            * @param  {Array.<Number>} p2
53085            * @return {Number}
53086            */
53087           function signedArea(p0, p1, p2) {
53088             return (p0[0] - p2[0]) * (p1[1] - p2[1]) - (p1[0] - p2[0]) * (p0[1] - p2[1]);
53089           }
53090
53091           /**
53092            * @param  {SweepEvent} e1
53093            * @param  {SweepEvent} e2
53094            * @return {Number}
53095            */
53096           function compareEvents(e1, e2) {
53097             var p1 = e1.point;
53098             var p2 = e2.point;
53099
53100             // Different x-coordinate
53101             if (p1[0] > p2[0]) { return 1; }
53102             if (p1[0] < p2[0]) { return -1; }
53103
53104             // Different points, but same x-coordinate
53105             // Event with lower y-coordinate is processed first
53106             if (p1[1] !== p2[1]) { return p1[1] > p2[1] ? 1 : -1; }
53107
53108             return specialCases(e1, e2, p1, p2);
53109           }
53110
53111
53112           /* eslint-disable no-unused-vars */
53113           function specialCases(e1, e2, p1, p2) {
53114             // Same coordinates, but one is a left endpoint and the other is
53115             // a right endpoint. The right endpoint is processed first
53116             if (e1.left !== e2.left)
53117               { return e1.left ? 1 : -1; }
53118
53119             // const p2 = e1.otherEvent.point, p3 = e2.otherEvent.point;
53120             // const sa = (p1[0] - p3[0]) * (p2[1] - p3[1]) - (p2[0] - p3[0]) * (p1[1] - p3[1])
53121             // Same coordinates, both events
53122             // are left endpoints or right endpoints.
53123             // not collinear
53124             if (signedArea(p1, e1.otherEvent.point, e2.otherEvent.point) !== 0) {
53125               // the event associate to the bottom segment is processed first
53126               return (!e1.isBelow(e2.otherEvent.point)) ? 1 : -1;
53127             }
53128
53129             return (!e1.isSubject && e2.isSubject) ? 1 : -1;
53130           }
53131           /* eslint-enable no-unused-vars */
53132
53133           /**
53134            * @param  {SweepEvent} se
53135            * @param  {Array.<Number>} p
53136            * @param  {Queue} queue
53137            * @return {Queue}
53138            */
53139           function divideSegment(se, p, queue)  {
53140             var r = new SweepEvent(p, false, se,            se.isSubject);
53141             var l = new SweepEvent(p, true,  se.otherEvent, se.isSubject);
53142
53143             /* eslint-disable no-console */
53144             if (equals(se.point, se.otherEvent.point)) {
53145
53146               console.warn('what is that, a collapsed segment?', se);
53147             }
53148             /* eslint-enable no-console */
53149
53150             r.contourId = l.contourId = se.contourId;
53151
53152             // avoid a rounding error. The left event would be processed after the right event
53153             if (compareEvents(l, se.otherEvent) > 0) {
53154               se.otherEvent.left = true;
53155               l.left = false;
53156             }
53157
53158             // avoid a rounding error. The left event would be processed after the right event
53159             // if (compareEvents(se, r) > 0) {}
53160
53161             se.otherEvent.otherEvent = l;
53162             se.otherEvent = r;
53163
53164             queue.push(l);
53165             queue.push(r);
53166
53167             return queue;
53168           }
53169
53170           //const EPS = 1e-9;
53171
53172           /**
53173            * Finds the magnitude of the cross product of two vectors (if we pretend
53174            * they're in three dimensions)
53175            *
53176            * @param {Object} a First vector
53177            * @param {Object} b Second vector
53178            * @private
53179            * @returns {Number} The magnitude of the cross product
53180            */
53181           function crossProduct(a, b) {
53182             return (a[0] * b[1]) - (a[1] * b[0]);
53183           }
53184
53185           /**
53186            * Finds the dot product of two vectors.
53187            *
53188            * @param {Object} a First vector
53189            * @param {Object} b Second vector
53190            * @private
53191            * @returns {Number} The dot product
53192            */
53193           function dotProduct(a, b) {
53194             return (a[0] * b[0]) + (a[1] * b[1]);
53195           }
53196
53197           /**
53198            * Finds the intersection (if any) between two line segments a and b, given the
53199            * line segments' end points a1, a2 and b1, b2.
53200            *
53201            * This algorithm is based on Schneider and Eberly.
53202            * http://www.cimec.org.ar/~ncalvo/Schneider_Eberly.pdf
53203            * Page 244.
53204            *
53205            * @param {Array.<Number>} a1 point of first line
53206            * @param {Array.<Number>} a2 point of first line
53207            * @param {Array.<Number>} b1 point of second line
53208            * @param {Array.<Number>} b2 point of second line
53209            * @param {Boolean=}       noEndpointTouch whether to skip single touchpoints
53210            *                                         (meaning connected segments) as
53211            *                                         intersections
53212            * @returns {Array.<Array.<Number>>|Null} If the lines intersect, the point of
53213            * intersection. If they overlap, the two end points of the overlapping segment.
53214            * Otherwise, null.
53215            */
53216           function intersection (a1, a2, b1, b2, noEndpointTouch) {
53217             // The algorithm expects our lines in the form P + sd, where P is a point,
53218             // s is on the interval [0, 1], and d is a vector.
53219             // We are passed two points. P can be the first point of each pair. The
53220             // vector, then, could be thought of as the distance (in x and y components)
53221             // from the first point to the second point.
53222             // So first, let's make our vectors:
53223             var va = [a2[0] - a1[0], a2[1] - a1[1]];
53224             var vb = [b2[0] - b1[0], b2[1] - b1[1]];
53225             // We also define a function to convert back to regular point form:
53226
53227             /* eslint-disable arrow-body-style */
53228
53229             function toPoint(p, s, d) {
53230               return [
53231                 p[0] + s * d[0],
53232                 p[1] + s * d[1]
53233               ];
53234             }
53235
53236             /* eslint-enable arrow-body-style */
53237
53238             // The rest is pretty much a straight port of the algorithm.
53239             var e = [b1[0] - a1[0], b1[1] - a1[1]];
53240             var kross    = crossProduct(va, vb);
53241             var sqrKross = kross * kross;
53242             var sqrLenA  = dotProduct(va, va);
53243             //const sqrLenB  = dotProduct(vb, vb);
53244
53245             // Check for line intersection. This works because of the properties of the
53246             // cross product -- specifically, two vectors are parallel if and only if the
53247             // cross product is the 0 vector. The full calculation involves relative error
53248             // to account for possible very small line segments. See Schneider & Eberly
53249             // for details.
53250             if (sqrKross > 0/* EPS * sqrLenB * sqLenA */) {
53251               // If they're not parallel, then (because these are line segments) they
53252               // still might not actually intersect. This code checks that the
53253               // intersection point of the lines is actually on both line segments.
53254               var s = crossProduct(e, vb) / kross;
53255               if (s < 0 || s > 1) {
53256                 // not on line segment a
53257                 return null;
53258               }
53259               var t = crossProduct(e, va) / kross;
53260               if (t < 0 || t > 1) {
53261                 // not on line segment b
53262                 return null;
53263               }
53264               if (s === 0 || s === 1) {
53265                 // on an endpoint of line segment a
53266                 return noEndpointTouch ? null : [toPoint(a1, s, va)];
53267               }
53268               if (t === 0 || t === 1) {
53269                 // on an endpoint of line segment b
53270                 return noEndpointTouch ? null : [toPoint(b1, t, vb)];
53271               }
53272               return [toPoint(a1, s, va)];
53273             }
53274
53275             // If we've reached this point, then the lines are either parallel or the
53276             // same, but the segments could overlap partially or fully, or not at all.
53277             // So we need to find the overlap, if any. To do that, we can use e, which is
53278             // the (vector) difference between the two initial points. If this is parallel
53279             // with the line itself, then the two lines are the same line, and there will
53280             // be overlap.
53281             //const sqrLenE = dotProduct(e, e);
53282             kross = crossProduct(e, va);
53283             sqrKross = kross * kross;
53284
53285             if (sqrKross > 0 /* EPS * sqLenB * sqLenE */) {
53286             // Lines are just parallel, not the same. No overlap.
53287               return null;
53288             }
53289
53290             var sa = dotProduct(va, e) / sqrLenA;
53291             var sb = sa + dotProduct(va, vb) / sqrLenA;
53292             var smin = Math.min(sa, sb);
53293             var smax = Math.max(sa, sb);
53294
53295             // this is, essentially, the FindIntersection acting on floats from
53296             // Schneider & Eberly, just inlined into this function.
53297             if (smin <= 1 && smax >= 0) {
53298
53299               // overlap on an end point
53300               if (smin === 1) {
53301                 return noEndpointTouch ? null : [toPoint(a1, smin > 0 ? smin : 0, va)];
53302               }
53303
53304               if (smax === 0) {
53305                 return noEndpointTouch ? null : [toPoint(a1, smax < 1 ? smax : 1, va)];
53306               }
53307
53308               if (noEndpointTouch && smin === 0 && smax === 1) { return null; }
53309
53310               // There's overlap on a segment -- two points of intersection. Return both.
53311               return [
53312                 toPoint(a1, smin > 0 ? smin : 0, va),
53313                 toPoint(a1, smax < 1 ? smax : 1, va)
53314               ];
53315             }
53316
53317             return null;
53318           }
53319
53320           /**
53321            * @param  {SweepEvent} se1
53322            * @param  {SweepEvent} se2
53323            * @param  {Queue}      queue
53324            * @return {Number}
53325            */
53326           function possibleIntersection (se1, se2, queue) {
53327             // that disallows self-intersecting polygons,
53328             // did cost us half a day, so I'll leave it
53329             // out of respect
53330             // if (se1.isSubject === se2.isSubject) return;
53331             var inter = intersection(
53332               se1.point, se1.otherEvent.point,
53333               se2.point, se2.otherEvent.point
53334             );
53335
53336             var nintersections = inter ? inter.length : 0;
53337             if (nintersections === 0) { return 0; } // no intersection
53338
53339             // the line segments intersect at an endpoint of both line segments
53340             if ((nintersections === 1) &&
53341                 (equals(se1.point, se2.point) ||
53342                  equals(se1.otherEvent.point, se2.otherEvent.point))) {
53343               return 0;
53344             }
53345
53346             if (nintersections === 2 && se1.isSubject === se2.isSubject) {
53347               // if(se1.contourId === se2.contourId){
53348               // console.warn('Edges of the same polygon overlap',
53349               //   se1.point, se1.otherEvent.point, se2.point, se2.otherEvent.point);
53350               // }
53351               //throw new Error('Edges of the same polygon overlap');
53352               return 0;
53353             }
53354
53355             // The line segments associated to se1 and se2 intersect
53356             if (nintersections === 1) {
53357
53358               // if the intersection point is not an endpoint of se1
53359               if (!equals(se1.point, inter[0]) && !equals(se1.otherEvent.point, inter[0])) {
53360                 divideSegment(se1, inter[0], queue);
53361               }
53362
53363               // if the intersection point is not an endpoint of se2
53364               if (!equals(se2.point, inter[0]) && !equals(se2.otherEvent.point, inter[0])) {
53365                 divideSegment(se2, inter[0], queue);
53366               }
53367               return 1;
53368             }
53369
53370             // The line segments associated to se1 and se2 overlap
53371             var events        = [];
53372             var leftCoincide  = false;
53373             var rightCoincide = false;
53374
53375             if (equals(se1.point, se2.point)) {
53376               leftCoincide = true; // linked
53377             } else if (compareEvents(se1, se2) === 1) {
53378               events.push(se2, se1);
53379             } else {
53380               events.push(se1, se2);
53381             }
53382
53383             if (equals(se1.otherEvent.point, se2.otherEvent.point)) {
53384               rightCoincide = true;
53385             } else if (compareEvents(se1.otherEvent, se2.otherEvent) === 1) {
53386               events.push(se2.otherEvent, se1.otherEvent);
53387             } else {
53388               events.push(se1.otherEvent, se2.otherEvent);
53389             }
53390
53391             if ((leftCoincide && rightCoincide) || leftCoincide) {
53392               // both line segments are equal or share the left endpoint
53393               se2.type = NON_CONTRIBUTING;
53394               se1.type = (se2.inOut === se1.inOut)
53395                 ? SAME_TRANSITION : DIFFERENT_TRANSITION;
53396
53397               if (leftCoincide && !rightCoincide) {
53398                 // honestly no idea, but changing events selection from [2, 1]
53399                 // to [0, 1] fixes the overlapping self-intersecting polygons issue
53400                 divideSegment(events[1].otherEvent, events[0].point, queue);
53401               }
53402               return 2;
53403             }
53404
53405             // the line segments share the right endpoint
53406             if (rightCoincide) {
53407               divideSegment(events[0], events[1].point, queue);
53408               return 3;
53409             }
53410
53411             // no line segment includes totally the other one
53412             if (events[0] !== events[3].otherEvent) {
53413               divideSegment(events[0], events[1].point, queue);
53414               divideSegment(events[1], events[2].point, queue);
53415               return 3;
53416             }
53417
53418             // one line segment includes the other one
53419             divideSegment(events[0], events[1].point, queue);
53420             divideSegment(events[3].otherEvent, events[2].point, queue);
53421
53422             return 3;
53423           }
53424
53425           /**
53426            * @param  {SweepEvent} le1
53427            * @param  {SweepEvent} le2
53428            * @return {Number}
53429            */
53430           function compareSegments(le1, le2) {
53431             if (le1 === le2) { return 0; }
53432
53433             // Segments are not collinear
53434             if (signedArea(le1.point, le1.otherEvent.point, le2.point) !== 0 ||
53435               signedArea(le1.point, le1.otherEvent.point, le2.otherEvent.point) !== 0) {
53436
53437               // If they share their left endpoint use the right endpoint to sort
53438               if (equals(le1.point, le2.point)) { return le1.isBelow(le2.otherEvent.point) ? -1 : 1; }
53439
53440               // Different left endpoint: use the left endpoint to sort
53441               if (le1.point[0] === le2.point[0]) { return le1.point[1] < le2.point[1] ? -1 : 1; }
53442
53443               // has the line segment associated to e1 been inserted
53444               // into S after the line segment associated to e2 ?
53445               if (compareEvents(le1, le2) === 1) { return le2.isAbove(le1.point) ? -1 : 1; }
53446
53447               // The line segment associated to e2 has been inserted
53448               // into S after the line segment associated to e1
53449               return le1.isBelow(le2.point) ? -1 : 1;
53450             }
53451
53452             if (le1.isSubject === le2.isSubject) { // same polygon
53453               var p1 = le1.point, p2 = le2.point;
53454               if (p1[0] === p2[0] && p1[1] === p2[1]/*equals(le1.point, le2.point)*/) {
53455                 p1 = le1.otherEvent.point; p2 = le2.otherEvent.point;
53456                 if (p1[0] === p2[0] && p1[1] === p2[1]) { return 0; }
53457                 else { return le1.contourId > le2.contourId ? 1 : -1; }
53458               }
53459             } else { // Segments are collinear, but belong to separate polygons
53460               return le1.isSubject ? -1 : 1;
53461             }
53462
53463             return compareEvents(le1, le2) === 1 ? 1 : -1;
53464           }
53465
53466           function subdivide(eventQueue, subject, clipping, sbbox, cbbox, operation) {
53467             var sweepLine = new SplayTree(compareSegments);
53468             var sortedEvents = [];
53469
53470             var rightbound = Math.min(sbbox[2], cbbox[2]);
53471
53472             var prev, next, begin;
53473
53474             while (eventQueue.length !== 0) {
53475               var event = eventQueue.pop();
53476               sortedEvents.push(event);
53477
53478               // optimization by bboxes for intersection and difference goes here
53479               if ((operation === INTERSECTION && event.point[0] > rightbound) ||
53480                   (operation === DIFFERENCE   && event.point[0] > sbbox[2])) {
53481                 break;
53482               }
53483
53484               if (event.left) {
53485                 next  = prev = sweepLine.insert(event);
53486                 begin = sweepLine.minNode();
53487
53488                 if (prev !== begin) { prev = sweepLine.prev(prev); }
53489                 else                { prev = null; }
53490
53491                 next = sweepLine.next(next);
53492
53493                 var prevEvent = prev ? prev.key : null;
53494                 var prevprevEvent = (void 0);
53495                 computeFields(event, prevEvent, operation);
53496                 if (next) {
53497                   if (possibleIntersection(event, next.key, eventQueue) === 2) {
53498                     computeFields(event, prevEvent, operation);
53499                     computeFields(event, next.key, operation);
53500                   }
53501                 }
53502
53503                 if (prev) {
53504                   if (possibleIntersection(prev.key, event, eventQueue) === 2) {
53505                     var prevprev = prev;
53506                     if (prevprev !== begin) { prevprev = sweepLine.prev(prevprev); }
53507                     else                    { prevprev = null; }
53508
53509                     prevprevEvent = prevprev ? prevprev.key : null;
53510                     computeFields(prevEvent, prevprevEvent, operation);
53511                     computeFields(event,     prevEvent,     operation);
53512                   }
53513                 }
53514               } else {
53515                 event = event.otherEvent;
53516                 next = prev = sweepLine.find(event);
53517
53518                 if (prev && next) {
53519
53520                   if (prev !== begin) { prev = sweepLine.prev(prev); }
53521                   else                { prev = null; }
53522
53523                   next = sweepLine.next(next);
53524                   sweepLine.remove(event);
53525
53526                   if (next && prev) {
53527                     possibleIntersection(prev.key, next.key, eventQueue);
53528                   }
53529                 }
53530               }
53531             }
53532             return sortedEvents;
53533           }
53534
53535           /**
53536            * @param  {Array.<SweepEvent>} sortedEvents
53537            * @return {Array.<SweepEvent>}
53538            */
53539           function orderEvents(sortedEvents) {
53540             var event, i, len, tmp;
53541             var resultEvents = [];
53542             for (i = 0, len = sortedEvents.length; i < len; i++) {
53543               event = sortedEvents[i];
53544               if ((event.left && event.inResult) ||
53545                 (!event.left && event.otherEvent.inResult)) {
53546                 resultEvents.push(event);
53547               }
53548             }
53549             // Due to overlapping edges the resultEvents array can be not wholly sorted
53550             var sorted = false;
53551             while (!sorted) {
53552               sorted = true;
53553               for (i = 0, len = resultEvents.length; i < len; i++) {
53554                 if ((i + 1) < len &&
53555                   compareEvents(resultEvents[i], resultEvents[i + 1]) === 1) {
53556                   tmp = resultEvents[i];
53557                   resultEvents[i] = resultEvents[i + 1];
53558                   resultEvents[i + 1] = tmp;
53559                   sorted = false;
53560                 }
53561               }
53562             }
53563
53564
53565             for (i = 0, len = resultEvents.length; i < len; i++) {
53566               event = resultEvents[i];
53567               event.pos = i;
53568             }
53569
53570             // imagine, the right event is found in the beginning of the queue,
53571             // when his left counterpart is not marked yet
53572             for (i = 0, len = resultEvents.length; i < len; i++) {
53573               event = resultEvents[i];
53574               if (!event.left) {
53575                 tmp = event.pos;
53576                 event.pos = event.otherEvent.pos;
53577                 event.otherEvent.pos = tmp;
53578               }
53579             }
53580
53581             return resultEvents;
53582           }
53583
53584
53585           /**
53586            * @param  {Number} pos
53587            * @param  {Array.<SweepEvent>} resultEvents
53588            * @param  {Object>}    processed
53589            * @return {Number}
53590            */
53591           function nextPos(pos, resultEvents, processed, origIndex) {
53592             var p, p1;
53593             var newPos = pos + 1;
53594             var length = resultEvents.length;
53595
53596             p  = resultEvents[pos].point;
53597
53598             if (newPos < length)
53599               { p1 = resultEvents[newPos].point; }
53600
53601
53602             // while in range and not the current one by value
53603             while (newPos < length && p1[0] === p[0] && p1[1] === p[1]) {
53604               if (!processed[newPos]) {
53605                 return newPos;
53606               } else   {
53607                 newPos++;
53608               }
53609               p1 = resultEvents[newPos].point;
53610             }
53611
53612             newPos = pos - 1;
53613
53614             while (processed[newPos] && newPos >= origIndex) {
53615               newPos--;
53616             }
53617             return newPos;
53618           }
53619
53620
53621           /**
53622            * @param  {Array.<SweepEvent>} sortedEvents
53623            * @return {Array.<*>} polygons
53624            */
53625           function connectEdges(sortedEvents, operation) {
53626             var i, len;
53627             var resultEvents = orderEvents(sortedEvents);
53628
53629             // "false"-filled array
53630             var processed = {};
53631             var result = [];
53632             var event;
53633
53634             for (i = 0, len = resultEvents.length; i < len; i++) {
53635               if (processed[i]) { continue; }
53636               var contour = [[]];
53637
53638               if (!resultEvents[i].isExteriorRing) {
53639                 if (operation === DIFFERENCE && !resultEvents[i].isSubject && result.length === 0) {
53640                   result.push(contour);
53641                 } else if (result.length === 0) {
53642                   result.push([[contour]]);
53643                 } else {
53644                   result[result.length - 1].push(contour[0]);
53645                 }
53646               } else if (operation === DIFFERENCE && !resultEvents[i].isSubject && result.length > 1) {
53647                 result[result.length - 1].push(contour[0]);
53648               } else {
53649                 result.push(contour);
53650               }
53651
53652               var ringId = result.length - 1;
53653               var pos = i;
53654
53655               var initial = resultEvents[i].point;
53656               contour[0].push(initial);
53657
53658               while (pos >= i) {
53659                 event = resultEvents[pos];
53660                 processed[pos] = true;
53661
53662                 if (event.left) {
53663                   event.resultInOut = false;
53664                   event.contourId   = ringId;
53665                 } else {
53666                   event.otherEvent.resultInOut = true;
53667                   event.otherEvent.contourId   = ringId;
53668                 }
53669
53670                 pos = event.pos;
53671                 processed[pos] = true;
53672                 contour[0].push(resultEvents[pos].point);
53673                 pos = nextPos(pos, resultEvents, processed, i);
53674               }
53675
53676               pos = pos === -1 ? i : pos;
53677
53678               event = resultEvents[pos];
53679               processed[pos] = processed[event.pos] = true;
53680               event.otherEvent.resultInOut = true;
53681               event.otherEvent.contourId   = ringId;
53682             }
53683
53684             // Handle if the result is a polygon (eg not multipoly)
53685             // Commented it again, let's see what do we mean by that
53686             // if (result.length === 1) result = result[0];
53687             return result;
53688           }
53689
53690           var tinyqueue = TinyQueue;
53691           var default_1 = TinyQueue;
53692
53693           function TinyQueue(data, compare) {
53694               var this$1 = this;
53695
53696               if (!(this instanceof TinyQueue)) { return new TinyQueue(data, compare); }
53697
53698               this.data = data || [];
53699               this.length = this.data.length;
53700               this.compare = compare || defaultCompare;
53701
53702               if (this.length > 0) {
53703                   for (var i = (this.length >> 1) - 1; i >= 0; i--) { this$1._down(i); }
53704               }
53705           }
53706
53707           function defaultCompare(a, b) {
53708               return a < b ? -1 : a > b ? 1 : 0;
53709           }
53710
53711           TinyQueue.prototype = {
53712
53713               push: function (item) {
53714                   this.data.push(item);
53715                   this.length++;
53716                   this._up(this.length - 1);
53717               },
53718
53719               pop: function () {
53720                   if (this.length === 0) { return undefined; }
53721
53722                   var top = this.data[0];
53723                   this.length--;
53724
53725                   if (this.length > 0) {
53726                       this.data[0] = this.data[this.length];
53727                       this._down(0);
53728                   }
53729                   this.data.pop();
53730
53731                   return top;
53732               },
53733
53734               peek: function () {
53735                   return this.data[0];
53736               },
53737
53738               _up: function (pos) {
53739                   var data = this.data;
53740                   var compare = this.compare;
53741                   var item = data[pos];
53742
53743                   while (pos > 0) {
53744                       var parent = (pos - 1) >> 1;
53745                       var current = data[parent];
53746                       if (compare(item, current) >= 0) { break; }
53747                       data[pos] = current;
53748                       pos = parent;
53749                   }
53750
53751                   data[pos] = item;
53752               },
53753
53754               _down: function (pos) {
53755                   var this$1 = this;
53756
53757                   var data = this.data;
53758                   var compare = this.compare;
53759                   var halfLength = this.length >> 1;
53760                   var item = data[pos];
53761
53762                   while (pos < halfLength) {
53763                       var left = (pos << 1) + 1;
53764                       var right = left + 1;
53765                       var best = data[left];
53766
53767                       if (right < this$1.length && compare(data[right], best) < 0) {
53768                           left = right;
53769                           best = data[right];
53770                       }
53771                       if (compare(best, item) >= 0) { break; }
53772
53773                       data[pos] = best;
53774                       pos = left;
53775                   }
53776
53777                   data[pos] = item;
53778               }
53779           };
53780           tinyqueue.default = default_1;
53781
53782           var max = Math.max;
53783           var min = Math.min;
53784
53785           var contourId = 0;
53786
53787
53788           function processPolygon(contourOrHole, isSubject, depth, Q, bbox, isExteriorRing) {
53789             var i, len, s1, s2, e1, e2;
53790             for (i = 0, len = contourOrHole.length - 1; i < len; i++) {
53791               s1 = contourOrHole[i];
53792               s2 = contourOrHole[i + 1];
53793               e1 = new SweepEvent(s1, false, undefined, isSubject);
53794               e2 = new SweepEvent(s2, false, e1,        isSubject);
53795               e1.otherEvent = e2;
53796
53797               if (s1[0] === s2[0] && s1[1] === s2[1]) {
53798                 continue; // skip collapsed edges, or it breaks
53799               }
53800
53801               e1.contourId = e2.contourId = depth;
53802               if (!isExteriorRing) {
53803                 e1.isExteriorRing = false;
53804                 e2.isExteriorRing = false;
53805               }
53806               if (compareEvents(e1, e2) > 0) {
53807                 e2.left = true;
53808               } else {
53809                 e1.left = true;
53810               }
53811
53812               var x = s1[0], y = s1[1];
53813               bbox[0] = min(bbox[0], x);
53814               bbox[1] = min(bbox[1], y);
53815               bbox[2] = max(bbox[2], x);
53816               bbox[3] = max(bbox[3], y);
53817
53818               // Pushing it so the queue is sorted from left to right,
53819               // with object on the left having the highest priority.
53820               Q.push(e1);
53821               Q.push(e2);
53822             }
53823           }
53824
53825
53826           function fillQueue(subject, clipping, sbbox, cbbox, operation) {
53827             var eventQueue = new tinyqueue(null, compareEvents);
53828             var polygonSet, isExteriorRing, i, ii, j, jj; //, k, kk;
53829
53830             for (i = 0, ii = subject.length; i < ii; i++) {
53831               polygonSet = subject[i];
53832               for (j = 0, jj = polygonSet.length; j < jj; j++) {
53833                 isExteriorRing = j === 0;
53834                 if (isExteriorRing) { contourId++; }
53835                 processPolygon(polygonSet[j], true, contourId, eventQueue, sbbox, isExteriorRing);
53836               }
53837             }
53838
53839             for (i = 0, ii = clipping.length; i < ii; i++) {
53840               polygonSet = clipping[i];
53841               for (j = 0, jj = polygonSet.length; j < jj; j++) {
53842                 isExteriorRing = j === 0;
53843                 if (operation === DIFFERENCE) { isExteriorRing = false; }
53844                 if (isExteriorRing) { contourId++; }
53845                 processPolygon(polygonSet[j], false, contourId, eventQueue, cbbox, isExteriorRing);
53846               }
53847             }
53848
53849             return eventQueue;
53850           }
53851
53852           var EMPTY = [];
53853
53854
53855           function trivialOperation(subject, clipping, operation) {
53856             var result = null;
53857             if (subject.length * clipping.length === 0) {
53858               if        (operation === INTERSECTION) {
53859                 result = EMPTY;
53860               } else if (operation === DIFFERENCE) {
53861                 result = subject;
53862               } else if (operation === UNION ||
53863                          operation === XOR) {
53864                 result = (subject.length === 0) ? clipping : subject;
53865               }
53866             }
53867             return result;
53868           }
53869
53870
53871           function compareBBoxes(subject, clipping, sbbox, cbbox, operation) {
53872             var result = null;
53873             if (sbbox[0] > cbbox[2] ||
53874                 cbbox[0] > sbbox[2] ||
53875                 sbbox[1] > cbbox[3] ||
53876                 cbbox[1] > sbbox[3]) {
53877               if        (operation === INTERSECTION) {
53878                 result = EMPTY;
53879               } else if (operation === DIFFERENCE) {
53880                 result = subject;
53881               } else if (operation === UNION ||
53882                          operation === XOR) {
53883                 result = subject.concat(clipping);
53884               }
53885             }
53886             return result;
53887           }
53888
53889
53890           function boolean(subject, clipping, operation) {
53891             if (typeof subject[0][0][0] === 'number') {
53892               subject = [subject];
53893             }
53894             if (typeof clipping[0][0][0] === 'number') {
53895               clipping = [clipping];
53896             }
53897             var trivial = trivialOperation(subject, clipping, operation);
53898             if (trivial) {
53899               return trivial === EMPTY ? null : trivial;
53900             }
53901             var sbbox = [Infinity, Infinity, -Infinity, -Infinity];
53902             var cbbox = [Infinity, Infinity, -Infinity, -Infinity];
53903
53904             //console.time('fill queue');
53905             var eventQueue = fillQueue(subject, clipping, sbbox, cbbox, operation);
53906             //console.timeEnd('fill queue');
53907
53908             trivial = compareBBoxes(subject, clipping, sbbox, cbbox, operation);
53909             if (trivial) {
53910               return trivial === EMPTY ? null : trivial;
53911             }
53912             //console.time('subdivide edges');
53913             var sortedEvents = subdivide(eventQueue, subject, clipping, sbbox, cbbox, operation);
53914             //console.timeEnd('subdivide edges');
53915
53916             //console.time('connect vertices');
53917             var result = connectEdges(sortedEvents, operation);
53918             //console.timeEnd('connect vertices');
53919             return result;
53920           }
53921
53922           function union (subject, clipping) {
53923             return boolean(subject, clipping, UNION);
53924           }
53925
53926           function diff (subject, clipping) {
53927             return boolean(subject, clipping, DIFFERENCE);
53928           }
53929
53930           function xor (subject, clipping){
53931             return boolean(subject, clipping, XOR);
53932           }
53933
53934           function intersection$1 (subject, clipping) {
53935             return boolean(subject, clipping, INTERSECTION);
53936           }
53937
53938           /**
53939            * @enum {Number}
53940            */
53941           var operations = { UNION: UNION, DIFFERENCE: DIFFERENCE, INTERSECTION: INTERSECTION, XOR: XOR };
53942
53943           exports.union = union;
53944           exports.diff = diff;
53945           exports.xor = xor;
53946           exports.intersection = intersection$1;
53947           exports.operations = operations;
53948
53949           Object.defineProperty(exports, '__esModule', { value: true });
53950
53951         })));
53952
53953         });
53954
53955         var martinez = unwrapExports(martinez_umd);
53956
53957         var read$6 = function (buffer, offset, isLE, mLen, nBytes) {
53958           var e, m;
53959           var eLen = (nBytes * 8) - mLen - 1;
53960           var eMax = (1 << eLen) - 1;
53961           var eBias = eMax >> 1;
53962           var nBits = -7;
53963           var i = isLE ? (nBytes - 1) : 0;
53964           var d = isLE ? -1 : 1;
53965           var s = buffer[offset + i];
53966
53967           i += d;
53968
53969           e = s & ((1 << (-nBits)) - 1);
53970           s >>= (-nBits);
53971           nBits += eLen;
53972           for (; nBits > 0; e = (e * 256) + buffer[offset + i], i += d, nBits -= 8) {}
53973
53974           m = e & ((1 << (-nBits)) - 1);
53975           e >>= (-nBits);
53976           nBits += mLen;
53977           for (; nBits > 0; m = (m * 256) + buffer[offset + i], i += d, nBits -= 8) {}
53978
53979           if (e === 0) {
53980             e = 1 - eBias;
53981           } else if (e === eMax) {
53982             return m ? NaN : ((s ? -1 : 1) * Infinity)
53983           } else {
53984             m = m + Math.pow(2, mLen);
53985             e = e - eBias;
53986           }
53987           return (s ? -1 : 1) * m * Math.pow(2, e - mLen)
53988         };
53989
53990         var write$6 = function (buffer, value, offset, isLE, mLen, nBytes) {
53991           var e, m, c;
53992           var eLen = (nBytes * 8) - mLen - 1;
53993           var eMax = (1 << eLen) - 1;
53994           var eBias = eMax >> 1;
53995           var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0);
53996           var i = isLE ? 0 : (nBytes - 1);
53997           var d = isLE ? 1 : -1;
53998           var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0;
53999
54000           value = Math.abs(value);
54001
54002           if (isNaN(value) || value === Infinity) {
54003             m = isNaN(value) ? 1 : 0;
54004             e = eMax;
54005           } else {
54006             e = Math.floor(Math.log(value) / Math.LN2);
54007             if (value * (c = Math.pow(2, -e)) < 1) {
54008               e--;
54009               c *= 2;
54010             }
54011             if (e + eBias >= 1) {
54012               value += rt / c;
54013             } else {
54014               value += rt * Math.pow(2, 1 - eBias);
54015             }
54016             if (value * c >= 2) {
54017               e++;
54018               c /= 2;
54019             }
54020
54021             if (e + eBias >= eMax) {
54022               m = 0;
54023               e = eMax;
54024             } else if (e + eBias >= 1) {
54025               m = ((value * c) - 1) * Math.pow(2, mLen);
54026               e = e + eBias;
54027             } else {
54028               m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen);
54029               e = 0;
54030             }
54031           }
54032
54033           for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {}
54034
54035           e = (e << mLen) | m;
54036           eLen += mLen;
54037           for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {}
54038
54039           buffer[offset + i - d] |= s * 128;
54040         };
54041
54042         var ieee754 = {
54043                 read: read$6,
54044                 write: write$6
54045         };
54046
54047         var pbf = Pbf;
54048
54049
54050
54051         function Pbf(buf) {
54052             this.buf = ArrayBuffer.isView && ArrayBuffer.isView(buf) ? buf : new Uint8Array(buf || 0);
54053             this.pos = 0;
54054             this.type = 0;
54055             this.length = this.buf.length;
54056         }
54057
54058         Pbf.Varint  = 0; // varint: int32, int64, uint32, uint64, sint32, sint64, bool, enum
54059         Pbf.Fixed64 = 1; // 64-bit: double, fixed64, sfixed64
54060         Pbf.Bytes   = 2; // length-delimited: string, bytes, embedded messages, packed repeated fields
54061         Pbf.Fixed32 = 5; // 32-bit: float, fixed32, sfixed32
54062
54063         var SHIFT_LEFT_32 = (1 << 16) * (1 << 16),
54064             SHIFT_RIGHT_32 = 1 / SHIFT_LEFT_32;
54065
54066         Pbf.prototype = {
54067
54068             destroy: function() {
54069                 this.buf = null;
54070             },
54071
54072             // === READING =================================================================
54073
54074             readFields: function(readField, result, end) {
54075                 end = end || this.length;
54076
54077                 while (this.pos < end) {
54078                     var val = this.readVarint(),
54079                         tag = val >> 3,
54080                         startPos = this.pos;
54081
54082                     this.type = val & 0x7;
54083                     readField(tag, result, this);
54084
54085                     if (this.pos === startPos) this.skip(val);
54086                 }
54087                 return result;
54088             },
54089
54090             readMessage: function(readField, result) {
54091                 return this.readFields(readField, result, this.readVarint() + this.pos);
54092             },
54093
54094             readFixed32: function() {
54095                 var val = readUInt32(this.buf, this.pos);
54096                 this.pos += 4;
54097                 return val;
54098             },
54099
54100             readSFixed32: function() {
54101                 var val = readInt32(this.buf, this.pos);
54102                 this.pos += 4;
54103                 return val;
54104             },
54105
54106             // 64-bit int handling is based on github.com/dpw/node-buffer-more-ints (MIT-licensed)
54107
54108             readFixed64: function() {
54109                 var val = readUInt32(this.buf, this.pos) + readUInt32(this.buf, this.pos + 4) * SHIFT_LEFT_32;
54110                 this.pos += 8;
54111                 return val;
54112             },
54113
54114             readSFixed64: function() {
54115                 var val = readUInt32(this.buf, this.pos) + readInt32(this.buf, this.pos + 4) * SHIFT_LEFT_32;
54116                 this.pos += 8;
54117                 return val;
54118             },
54119
54120             readFloat: function() {
54121                 var val = ieee754.read(this.buf, this.pos, true, 23, 4);
54122                 this.pos += 4;
54123                 return val;
54124             },
54125
54126             readDouble: function() {
54127                 var val = ieee754.read(this.buf, this.pos, true, 52, 8);
54128                 this.pos += 8;
54129                 return val;
54130             },
54131
54132             readVarint: function(isSigned) {
54133                 var buf = this.buf,
54134                     val, b;
54135
54136                 b = buf[this.pos++]; val  =  b & 0x7f;        if (b < 0x80) return val;
54137                 b = buf[this.pos++]; val |= (b & 0x7f) << 7;  if (b < 0x80) return val;
54138                 b = buf[this.pos++]; val |= (b & 0x7f) << 14; if (b < 0x80) return val;
54139                 b = buf[this.pos++]; val |= (b & 0x7f) << 21; if (b < 0x80) return val;
54140                 b = buf[this.pos];   val |= (b & 0x0f) << 28;
54141
54142                 return readVarintRemainder(val, isSigned, this);
54143             },
54144
54145             readVarint64: function() { // for compatibility with v2.0.1
54146                 return this.readVarint(true);
54147             },
54148
54149             readSVarint: function() {
54150                 var num = this.readVarint();
54151                 return num % 2 === 1 ? (num + 1) / -2 : num / 2; // zigzag encoding
54152             },
54153
54154             readBoolean: function() {
54155                 return Boolean(this.readVarint());
54156             },
54157
54158             readString: function() {
54159                 var end = this.readVarint() + this.pos,
54160                     str = readUtf8(this.buf, this.pos, end);
54161                 this.pos = end;
54162                 return str;
54163             },
54164
54165             readBytes: function() {
54166                 var end = this.readVarint() + this.pos,
54167                     buffer = this.buf.subarray(this.pos, end);
54168                 this.pos = end;
54169                 return buffer;
54170             },
54171
54172             // verbose for performance reasons; doesn't affect gzipped size
54173
54174             readPackedVarint: function(arr, isSigned) {
54175                 if (this.type !== Pbf.Bytes) return arr.push(this.readVarint(isSigned));
54176                 var end = readPackedEnd(this);
54177                 arr = arr || [];
54178                 while (this.pos < end) arr.push(this.readVarint(isSigned));
54179                 return arr;
54180             },
54181             readPackedSVarint: function(arr) {
54182                 if (this.type !== Pbf.Bytes) return arr.push(this.readSVarint());
54183                 var end = readPackedEnd(this);
54184                 arr = arr || [];
54185                 while (this.pos < end) arr.push(this.readSVarint());
54186                 return arr;
54187             },
54188             readPackedBoolean: function(arr) {
54189                 if (this.type !== Pbf.Bytes) return arr.push(this.readBoolean());
54190                 var end = readPackedEnd(this);
54191                 arr = arr || [];
54192                 while (this.pos < end) arr.push(this.readBoolean());
54193                 return arr;
54194             },
54195             readPackedFloat: function(arr) {
54196                 if (this.type !== Pbf.Bytes) return arr.push(this.readFloat());
54197                 var end = readPackedEnd(this);
54198                 arr = arr || [];
54199                 while (this.pos < end) arr.push(this.readFloat());
54200                 return arr;
54201             },
54202             readPackedDouble: function(arr) {
54203                 if (this.type !== Pbf.Bytes) return arr.push(this.readDouble());
54204                 var end = readPackedEnd(this);
54205                 arr = arr || [];
54206                 while (this.pos < end) arr.push(this.readDouble());
54207                 return arr;
54208             },
54209             readPackedFixed32: function(arr) {
54210                 if (this.type !== Pbf.Bytes) return arr.push(this.readFixed32());
54211                 var end = readPackedEnd(this);
54212                 arr = arr || [];
54213                 while (this.pos < end) arr.push(this.readFixed32());
54214                 return arr;
54215             },
54216             readPackedSFixed32: function(arr) {
54217                 if (this.type !== Pbf.Bytes) return arr.push(this.readSFixed32());
54218                 var end = readPackedEnd(this);
54219                 arr = arr || [];
54220                 while (this.pos < end) arr.push(this.readSFixed32());
54221                 return arr;
54222             },
54223             readPackedFixed64: function(arr) {
54224                 if (this.type !== Pbf.Bytes) return arr.push(this.readFixed64());
54225                 var end = readPackedEnd(this);
54226                 arr = arr || [];
54227                 while (this.pos < end) arr.push(this.readFixed64());
54228                 return arr;
54229             },
54230             readPackedSFixed64: function(arr) {
54231                 if (this.type !== Pbf.Bytes) return arr.push(this.readSFixed64());
54232                 var end = readPackedEnd(this);
54233                 arr = arr || [];
54234                 while (this.pos < end) arr.push(this.readSFixed64());
54235                 return arr;
54236             },
54237
54238             skip: function(val) {
54239                 var type = val & 0x7;
54240                 if (type === Pbf.Varint) while (this.buf[this.pos++] > 0x7f) {}
54241                 else if (type === Pbf.Bytes) this.pos = this.readVarint() + this.pos;
54242                 else if (type === Pbf.Fixed32) this.pos += 4;
54243                 else if (type === Pbf.Fixed64) this.pos += 8;
54244                 else throw new Error('Unimplemented type: ' + type);
54245             },
54246
54247             // === WRITING =================================================================
54248
54249             writeTag: function(tag, type) {
54250                 this.writeVarint((tag << 3) | type);
54251             },
54252
54253             realloc: function(min) {
54254                 var length = this.length || 16;
54255
54256                 while (length < this.pos + min) length *= 2;
54257
54258                 if (length !== this.length) {
54259                     var buf = new Uint8Array(length);
54260                     buf.set(this.buf);
54261                     this.buf = buf;
54262                     this.length = length;
54263                 }
54264             },
54265
54266             finish: function() {
54267                 this.length = this.pos;
54268                 this.pos = 0;
54269                 return this.buf.subarray(0, this.length);
54270             },
54271
54272             writeFixed32: function(val) {
54273                 this.realloc(4);
54274                 writeInt32(this.buf, val, this.pos);
54275                 this.pos += 4;
54276             },
54277
54278             writeSFixed32: function(val) {
54279                 this.realloc(4);
54280                 writeInt32(this.buf, val, this.pos);
54281                 this.pos += 4;
54282             },
54283
54284             writeFixed64: function(val) {
54285                 this.realloc(8);
54286                 writeInt32(this.buf, val & -1, this.pos);
54287                 writeInt32(this.buf, Math.floor(val * SHIFT_RIGHT_32), this.pos + 4);
54288                 this.pos += 8;
54289             },
54290
54291             writeSFixed64: function(val) {
54292                 this.realloc(8);
54293                 writeInt32(this.buf, val & -1, this.pos);
54294                 writeInt32(this.buf, Math.floor(val * SHIFT_RIGHT_32), this.pos + 4);
54295                 this.pos += 8;
54296             },
54297
54298             writeVarint: function(val) {
54299                 val = +val || 0;
54300
54301                 if (val > 0xfffffff || val < 0) {
54302                     writeBigVarint(val, this);
54303                     return;
54304                 }
54305
54306                 this.realloc(4);
54307
54308                 this.buf[this.pos++] =           val & 0x7f  | (val > 0x7f ? 0x80 : 0); if (val <= 0x7f) return;
54309                 this.buf[this.pos++] = ((val >>>= 7) & 0x7f) | (val > 0x7f ? 0x80 : 0); if (val <= 0x7f) return;
54310                 this.buf[this.pos++] = ((val >>>= 7) & 0x7f) | (val > 0x7f ? 0x80 : 0); if (val <= 0x7f) return;
54311                 this.buf[this.pos++] =   (val >>> 7) & 0x7f;
54312             },
54313
54314             writeSVarint: function(val) {
54315                 this.writeVarint(val < 0 ? -val * 2 - 1 : val * 2);
54316             },
54317
54318             writeBoolean: function(val) {
54319                 this.writeVarint(Boolean(val));
54320             },
54321
54322             writeString: function(str) {
54323                 str = String(str);
54324                 this.realloc(str.length * 4);
54325
54326                 this.pos++; // reserve 1 byte for short string length
54327
54328                 var startPos = this.pos;
54329                 // write the string directly to the buffer and see how much was written
54330                 this.pos = writeUtf8(this.buf, str, this.pos);
54331                 var len = this.pos - startPos;
54332
54333                 if (len >= 0x80) makeRoomForExtraLength(startPos, len, this);
54334
54335                 // finally, write the message length in the reserved place and restore the position
54336                 this.pos = startPos - 1;
54337                 this.writeVarint(len);
54338                 this.pos += len;
54339             },
54340
54341             writeFloat: function(val) {
54342                 this.realloc(4);
54343                 ieee754.write(this.buf, val, this.pos, true, 23, 4);
54344                 this.pos += 4;
54345             },
54346
54347             writeDouble: function(val) {
54348                 this.realloc(8);
54349                 ieee754.write(this.buf, val, this.pos, true, 52, 8);
54350                 this.pos += 8;
54351             },
54352
54353             writeBytes: function(buffer) {
54354                 var len = buffer.length;
54355                 this.writeVarint(len);
54356                 this.realloc(len);
54357                 for (var i = 0; i < len; i++) this.buf[this.pos++] = buffer[i];
54358             },
54359
54360             writeRawMessage: function(fn, obj) {
54361                 this.pos++; // reserve 1 byte for short message length
54362
54363                 // write the message directly to the buffer and see how much was written
54364                 var startPos = this.pos;
54365                 fn(obj, this);
54366                 var len = this.pos - startPos;
54367
54368                 if (len >= 0x80) makeRoomForExtraLength(startPos, len, this);
54369
54370                 // finally, write the message length in the reserved place and restore the position
54371                 this.pos = startPos - 1;
54372                 this.writeVarint(len);
54373                 this.pos += len;
54374             },
54375
54376             writeMessage: function(tag, fn, obj) {
54377                 this.writeTag(tag, Pbf.Bytes);
54378                 this.writeRawMessage(fn, obj);
54379             },
54380
54381             writePackedVarint:   function(tag, arr) { if (arr.length) this.writeMessage(tag, writePackedVarint, arr);   },
54382             writePackedSVarint:  function(tag, arr) { if (arr.length) this.writeMessage(tag, writePackedSVarint, arr);  },
54383             writePackedBoolean:  function(tag, arr) { if (arr.length) this.writeMessage(tag, writePackedBoolean, arr);  },
54384             writePackedFloat:    function(tag, arr) { if (arr.length) this.writeMessage(tag, writePackedFloat, arr);    },
54385             writePackedDouble:   function(tag, arr) { if (arr.length) this.writeMessage(tag, writePackedDouble, arr);   },
54386             writePackedFixed32:  function(tag, arr) { if (arr.length) this.writeMessage(tag, writePackedFixed32, arr);  },
54387             writePackedSFixed32: function(tag, arr) { if (arr.length) this.writeMessage(tag, writePackedSFixed32, arr); },
54388             writePackedFixed64:  function(tag, arr) { if (arr.length) this.writeMessage(tag, writePackedFixed64, arr);  },
54389             writePackedSFixed64: function(tag, arr) { if (arr.length) this.writeMessage(tag, writePackedSFixed64, arr); },
54390
54391             writeBytesField: function(tag, buffer) {
54392                 this.writeTag(tag, Pbf.Bytes);
54393                 this.writeBytes(buffer);
54394             },
54395             writeFixed32Field: function(tag, val) {
54396                 this.writeTag(tag, Pbf.Fixed32);
54397                 this.writeFixed32(val);
54398             },
54399             writeSFixed32Field: function(tag, val) {
54400                 this.writeTag(tag, Pbf.Fixed32);
54401                 this.writeSFixed32(val);
54402             },
54403             writeFixed64Field: function(tag, val) {
54404                 this.writeTag(tag, Pbf.Fixed64);
54405                 this.writeFixed64(val);
54406             },
54407             writeSFixed64Field: function(tag, val) {
54408                 this.writeTag(tag, Pbf.Fixed64);
54409                 this.writeSFixed64(val);
54410             },
54411             writeVarintField: function(tag, val) {
54412                 this.writeTag(tag, Pbf.Varint);
54413                 this.writeVarint(val);
54414             },
54415             writeSVarintField: function(tag, val) {
54416                 this.writeTag(tag, Pbf.Varint);
54417                 this.writeSVarint(val);
54418             },
54419             writeStringField: function(tag, str) {
54420                 this.writeTag(tag, Pbf.Bytes);
54421                 this.writeString(str);
54422             },
54423             writeFloatField: function(tag, val) {
54424                 this.writeTag(tag, Pbf.Fixed32);
54425                 this.writeFloat(val);
54426             },
54427             writeDoubleField: function(tag, val) {
54428                 this.writeTag(tag, Pbf.Fixed64);
54429                 this.writeDouble(val);
54430             },
54431             writeBooleanField: function(tag, val) {
54432                 this.writeVarintField(tag, Boolean(val));
54433             }
54434         };
54435
54436         function readVarintRemainder(l, s, p) {
54437             var buf = p.buf,
54438                 h, b;
54439
54440             b = buf[p.pos++]; h  = (b & 0x70) >> 4;  if (b < 0x80) return toNum(l, h, s);
54441             b = buf[p.pos++]; h |= (b & 0x7f) << 3;  if (b < 0x80) return toNum(l, h, s);
54442             b = buf[p.pos++]; h |= (b & 0x7f) << 10; if (b < 0x80) return toNum(l, h, s);
54443             b = buf[p.pos++]; h |= (b & 0x7f) << 17; if (b < 0x80) return toNum(l, h, s);
54444             b = buf[p.pos++]; h |= (b & 0x7f) << 24; if (b < 0x80) return toNum(l, h, s);
54445             b = buf[p.pos++]; h |= (b & 0x01) << 31; if (b < 0x80) return toNum(l, h, s);
54446
54447             throw new Error('Expected varint not more than 10 bytes');
54448         }
54449
54450         function readPackedEnd(pbf) {
54451             return pbf.type === Pbf.Bytes ?
54452                 pbf.readVarint() + pbf.pos : pbf.pos + 1;
54453         }
54454
54455         function toNum(low, high, isSigned) {
54456             if (isSigned) {
54457                 return high * 0x100000000 + (low >>> 0);
54458             }
54459
54460             return ((high >>> 0) * 0x100000000) + (low >>> 0);
54461         }
54462
54463         function writeBigVarint(val, pbf) {
54464             var low, high;
54465
54466             if (val >= 0) {
54467                 low  = (val % 0x100000000) | 0;
54468                 high = (val / 0x100000000) | 0;
54469             } else {
54470                 low  = ~(-val % 0x100000000);
54471                 high = ~(-val / 0x100000000);
54472
54473                 if (low ^ 0xffffffff) {
54474                     low = (low + 1) | 0;
54475                 } else {
54476                     low = 0;
54477                     high = (high + 1) | 0;
54478                 }
54479             }
54480
54481             if (val >= 0x10000000000000000 || val < -0x10000000000000000) {
54482                 throw new Error('Given varint doesn\'t fit into 10 bytes');
54483             }
54484
54485             pbf.realloc(10);
54486
54487             writeBigVarintLow(low, high, pbf);
54488             writeBigVarintHigh(high, pbf);
54489         }
54490
54491         function writeBigVarintLow(low, high, pbf) {
54492             pbf.buf[pbf.pos++] = low & 0x7f | 0x80; low >>>= 7;
54493             pbf.buf[pbf.pos++] = low & 0x7f | 0x80; low >>>= 7;
54494             pbf.buf[pbf.pos++] = low & 0x7f | 0x80; low >>>= 7;
54495             pbf.buf[pbf.pos++] = low & 0x7f | 0x80; low >>>= 7;
54496             pbf.buf[pbf.pos]   = low & 0x7f;
54497         }
54498
54499         function writeBigVarintHigh(high, pbf) {
54500             var lsb = (high & 0x07) << 4;
54501
54502             pbf.buf[pbf.pos++] |= lsb         | ((high >>>= 3) ? 0x80 : 0); if (!high) return;
54503             pbf.buf[pbf.pos++]  = high & 0x7f | ((high >>>= 7) ? 0x80 : 0); if (!high) return;
54504             pbf.buf[pbf.pos++]  = high & 0x7f | ((high >>>= 7) ? 0x80 : 0); if (!high) return;
54505             pbf.buf[pbf.pos++]  = high & 0x7f | ((high >>>= 7) ? 0x80 : 0); if (!high) return;
54506             pbf.buf[pbf.pos++]  = high & 0x7f | ((high >>>= 7) ? 0x80 : 0); if (!high) return;
54507             pbf.buf[pbf.pos++]  = high & 0x7f;
54508         }
54509
54510         function makeRoomForExtraLength(startPos, len, pbf) {
54511             var extraLen =
54512                 len <= 0x3fff ? 1 :
54513                 len <= 0x1fffff ? 2 :
54514                 len <= 0xfffffff ? 3 : Math.floor(Math.log(len) / (Math.LN2 * 7));
54515
54516             // if 1 byte isn't enough for encoding message length, shift the data to the right
54517             pbf.realloc(extraLen);
54518             for (var i = pbf.pos - 1; i >= startPos; i--) pbf.buf[i + extraLen] = pbf.buf[i];
54519         }
54520
54521         function writePackedVarint(arr, pbf)   { for (var i = 0; i < arr.length; i++) pbf.writeVarint(arr[i]);   }
54522         function writePackedSVarint(arr, pbf)  { for (var i = 0; i < arr.length; i++) pbf.writeSVarint(arr[i]);  }
54523         function writePackedFloat(arr, pbf)    { for (var i = 0; i < arr.length; i++) pbf.writeFloat(arr[i]);    }
54524         function writePackedDouble(arr, pbf)   { for (var i = 0; i < arr.length; i++) pbf.writeDouble(arr[i]);   }
54525         function writePackedBoolean(arr, pbf)  { for (var i = 0; i < arr.length; i++) pbf.writeBoolean(arr[i]);  }
54526         function writePackedFixed32(arr, pbf)  { for (var i = 0; i < arr.length; i++) pbf.writeFixed32(arr[i]);  }
54527         function writePackedSFixed32(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeSFixed32(arr[i]); }
54528         function writePackedFixed64(arr, pbf)  { for (var i = 0; i < arr.length; i++) pbf.writeFixed64(arr[i]);  }
54529         function writePackedSFixed64(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeSFixed64(arr[i]); }
54530
54531         // Buffer code below from https://github.com/feross/buffer, MIT-licensed
54532
54533         function readUInt32(buf, pos) {
54534             return ((buf[pos]) |
54535                 (buf[pos + 1] << 8) |
54536                 (buf[pos + 2] << 16)) +
54537                 (buf[pos + 3] * 0x1000000);
54538         }
54539
54540         function writeInt32(buf, val, pos) {
54541             buf[pos] = val;
54542             buf[pos + 1] = (val >>> 8);
54543             buf[pos + 2] = (val >>> 16);
54544             buf[pos + 3] = (val >>> 24);
54545         }
54546
54547         function readInt32(buf, pos) {
54548             return ((buf[pos]) |
54549                 (buf[pos + 1] << 8) |
54550                 (buf[pos + 2] << 16)) +
54551                 (buf[pos + 3] << 24);
54552         }
54553
54554         function readUtf8(buf, pos, end) {
54555             var str = '';
54556             var i = pos;
54557
54558             while (i < end) {
54559                 var b0 = buf[i];
54560                 var c = null; // codepoint
54561                 var bytesPerSequence =
54562                     b0 > 0xEF ? 4 :
54563                     b0 > 0xDF ? 3 :
54564                     b0 > 0xBF ? 2 : 1;
54565
54566                 if (i + bytesPerSequence > end) break;
54567
54568                 var b1, b2, b3;
54569
54570                 if (bytesPerSequence === 1) {
54571                     if (b0 < 0x80) {
54572                         c = b0;
54573                     }
54574                 } else if (bytesPerSequence === 2) {
54575                     b1 = buf[i + 1];
54576                     if ((b1 & 0xC0) === 0x80) {
54577                         c = (b0 & 0x1F) << 0x6 | (b1 & 0x3F);
54578                         if (c <= 0x7F) {
54579                             c = null;
54580                         }
54581                     }
54582                 } else if (bytesPerSequence === 3) {
54583                     b1 = buf[i + 1];
54584                     b2 = buf[i + 2];
54585                     if ((b1 & 0xC0) === 0x80 && (b2 & 0xC0) === 0x80) {
54586                         c = (b0 & 0xF) << 0xC | (b1 & 0x3F) << 0x6 | (b2 & 0x3F);
54587                         if (c <= 0x7FF || (c >= 0xD800 && c <= 0xDFFF)) {
54588                             c = null;
54589                         }
54590                     }
54591                 } else if (bytesPerSequence === 4) {
54592                     b1 = buf[i + 1];
54593                     b2 = buf[i + 2];
54594                     b3 = buf[i + 3];
54595                     if ((b1 & 0xC0) === 0x80 && (b2 & 0xC0) === 0x80 && (b3 & 0xC0) === 0x80) {
54596                         c = (b0 & 0xF) << 0x12 | (b1 & 0x3F) << 0xC | (b2 & 0x3F) << 0x6 | (b3 & 0x3F);
54597                         if (c <= 0xFFFF || c >= 0x110000) {
54598                             c = null;
54599                         }
54600                     }
54601                 }
54602
54603                 if (c === null) {
54604                     c = 0xFFFD;
54605                     bytesPerSequence = 1;
54606
54607                 } else if (c > 0xFFFF) {
54608                     c -= 0x10000;
54609                     str += String.fromCharCode(c >>> 10 & 0x3FF | 0xD800);
54610                     c = 0xDC00 | c & 0x3FF;
54611                 }
54612
54613                 str += String.fromCharCode(c);
54614                 i += bytesPerSequence;
54615             }
54616
54617             return str;
54618         }
54619
54620         function writeUtf8(buf, str, pos) {
54621             for (var i = 0, c, lead; i < str.length; i++) {
54622                 c = str.charCodeAt(i); // code point
54623
54624                 if (c > 0xD7FF && c < 0xE000) {
54625                     if (lead) {
54626                         if (c < 0xDC00) {
54627                             buf[pos++] = 0xEF;
54628                             buf[pos++] = 0xBF;
54629                             buf[pos++] = 0xBD;
54630                             lead = c;
54631                             continue;
54632                         } else {
54633                             c = lead - 0xD800 << 10 | c - 0xDC00 | 0x10000;
54634                             lead = null;
54635                         }
54636                     } else {
54637                         if (c > 0xDBFF || (i + 1 === str.length)) {
54638                             buf[pos++] = 0xEF;
54639                             buf[pos++] = 0xBF;
54640                             buf[pos++] = 0xBD;
54641                         } else {
54642                             lead = c;
54643                         }
54644                         continue;
54645                     }
54646                 } else if (lead) {
54647                     buf[pos++] = 0xEF;
54648                     buf[pos++] = 0xBF;
54649                     buf[pos++] = 0xBD;
54650                     lead = null;
54651                 }
54652
54653                 if (c < 0x80) {
54654                     buf[pos++] = c;
54655                 } else {
54656                     if (c < 0x800) {
54657                         buf[pos++] = c >> 0x6 | 0xC0;
54658                     } else {
54659                         if (c < 0x10000) {
54660                             buf[pos++] = c >> 0xC | 0xE0;
54661                         } else {
54662                             buf[pos++] = c >> 0x12 | 0xF0;
54663                             buf[pos++] = c >> 0xC & 0x3F | 0x80;
54664                         }
54665                         buf[pos++] = c >> 0x6 & 0x3F | 0x80;
54666                     }
54667                     buf[pos++] = c & 0x3F | 0x80;
54668                 }
54669             }
54670             return pos;
54671         }
54672
54673         var pointGeometry = Point;
54674
54675         /**
54676          * A standalone point geometry with useful accessor, comparison, and
54677          * modification methods.
54678          *
54679          * @class Point
54680          * @param {Number} x the x-coordinate. this could be longitude or screen
54681          * pixels, or any other sort of unit.
54682          * @param {Number} y the y-coordinate. this could be latitude or screen
54683          * pixels, or any other sort of unit.
54684          * @example
54685          * var point = new Point(-77, 38);
54686          */
54687         function Point(x, y) {
54688             this.x = x;
54689             this.y = y;
54690         }
54691
54692         Point.prototype = {
54693
54694             /**
54695              * Clone this point, returning a new point that can be modified
54696              * without affecting the old one.
54697              * @return {Point} the clone
54698              */
54699             clone: function() { return new Point(this.x, this.y); },
54700
54701             /**
54702              * Add this point's x & y coordinates to another point,
54703              * yielding a new point.
54704              * @param {Point} p the other point
54705              * @return {Point} output point
54706              */
54707             add:     function(p) { return this.clone()._add(p); },
54708
54709             /**
54710              * Subtract this point's x & y coordinates to from point,
54711              * yielding a new point.
54712              * @param {Point} p the other point
54713              * @return {Point} output point
54714              */
54715             sub:     function(p) { return this.clone()._sub(p); },
54716
54717             /**
54718              * Multiply this point's x & y coordinates by point,
54719              * yielding a new point.
54720              * @param {Point} p the other point
54721              * @return {Point} output point
54722              */
54723             multByPoint:    function(p) { return this.clone()._multByPoint(p); },
54724
54725             /**
54726              * Divide this point's x & y coordinates by point,
54727              * yielding a new point.
54728              * @param {Point} p the other point
54729              * @return {Point} output point
54730              */
54731             divByPoint:     function(p) { return this.clone()._divByPoint(p); },
54732
54733             /**
54734              * Multiply this point's x & y coordinates by a factor,
54735              * yielding a new point.
54736              * @param {Point} k factor
54737              * @return {Point} output point
54738              */
54739             mult:    function(k) { return this.clone()._mult(k); },
54740
54741             /**
54742              * Divide this point's x & y coordinates by a factor,
54743              * yielding a new point.
54744              * @param {Point} k factor
54745              * @return {Point} output point
54746              */
54747             div:     function(k) { return this.clone()._div(k); },
54748
54749             /**
54750              * Rotate this point around the 0, 0 origin by an angle a,
54751              * given in radians
54752              * @param {Number} a angle to rotate around, in radians
54753              * @return {Point} output point
54754              */
54755             rotate:  function(a) { return this.clone()._rotate(a); },
54756
54757             /**
54758              * Rotate this point around p point by an angle a,
54759              * given in radians
54760              * @param {Number} a angle to rotate around, in radians
54761              * @param {Point} p Point to rotate around
54762              * @return {Point} output point
54763              */
54764             rotateAround:  function(a,p) { return this.clone()._rotateAround(a,p); },
54765
54766             /**
54767              * Multiply this point by a 4x1 transformation matrix
54768              * @param {Array<Number>} m transformation matrix
54769              * @return {Point} output point
54770              */
54771             matMult: function(m) { return this.clone()._matMult(m); },
54772
54773             /**
54774              * Calculate this point but as a unit vector from 0, 0, meaning
54775              * that the distance from the resulting point to the 0, 0
54776              * coordinate will be equal to 1 and the angle from the resulting
54777              * point to the 0, 0 coordinate will be the same as before.
54778              * @return {Point} unit vector point
54779              */
54780             unit:    function() { return this.clone()._unit(); },
54781
54782             /**
54783              * Compute a perpendicular point, where the new y coordinate
54784              * is the old x coordinate and the new x coordinate is the old y
54785              * coordinate multiplied by -1
54786              * @return {Point} perpendicular point
54787              */
54788             perp:    function() { return this.clone()._perp(); },
54789
54790             /**
54791              * Return a version of this point with the x & y coordinates
54792              * rounded to integers.
54793              * @return {Point} rounded point
54794              */
54795             round:   function() { return this.clone()._round(); },
54796
54797             /**
54798              * Return the magitude of this point: this is the Euclidean
54799              * distance from the 0, 0 coordinate to this point's x and y
54800              * coordinates.
54801              * @return {Number} magnitude
54802              */
54803             mag: function() {
54804                 return Math.sqrt(this.x * this.x + this.y * this.y);
54805             },
54806
54807             /**
54808              * Judge whether this point is equal to another point, returning
54809              * true or false.
54810              * @param {Point} other the other point
54811              * @return {boolean} whether the points are equal
54812              */
54813             equals: function(other) {
54814                 return this.x === other.x &&
54815                        this.y === other.y;
54816             },
54817
54818             /**
54819              * Calculate the distance from this point to another point
54820              * @param {Point} p the other point
54821              * @return {Number} distance
54822              */
54823             dist: function(p) {
54824                 return Math.sqrt(this.distSqr(p));
54825             },
54826
54827             /**
54828              * Calculate the distance from this point to another point,
54829              * without the square root step. Useful if you're comparing
54830              * relative distances.
54831              * @param {Point} p the other point
54832              * @return {Number} distance
54833              */
54834             distSqr: function(p) {
54835                 var dx = p.x - this.x,
54836                     dy = p.y - this.y;
54837                 return dx * dx + dy * dy;
54838             },
54839
54840             /**
54841              * Get the angle from the 0, 0 coordinate to this point, in radians
54842              * coordinates.
54843              * @return {Number} angle
54844              */
54845             angle: function() {
54846                 return Math.atan2(this.y, this.x);
54847             },
54848
54849             /**
54850              * Get the angle from this point to another point, in radians
54851              * @param {Point} b the other point
54852              * @return {Number} angle
54853              */
54854             angleTo: function(b) {
54855                 return Math.atan2(this.y - b.y, this.x - b.x);
54856             },
54857
54858             /**
54859              * Get the angle between this point and another point, in radians
54860              * @param {Point} b the other point
54861              * @return {Number} angle
54862              */
54863             angleWith: function(b) {
54864                 return this.angleWithSep(b.x, b.y);
54865             },
54866
54867             /*
54868              * Find the angle of the two vectors, solving the formula for
54869              * the cross product a x b = |a||b|sin(θ) for θ.
54870              * @param {Number} x the x-coordinate
54871              * @param {Number} y the y-coordinate
54872              * @return {Number} the angle in radians
54873              */
54874             angleWithSep: function(x, y) {
54875                 return Math.atan2(
54876                     this.x * y - this.y * x,
54877                     this.x * x + this.y * y);
54878             },
54879
54880             _matMult: function(m) {
54881                 var x = m[0] * this.x + m[1] * this.y,
54882                     y = m[2] * this.x + m[3] * this.y;
54883                 this.x = x;
54884                 this.y = y;
54885                 return this;
54886             },
54887
54888             _add: function(p) {
54889                 this.x += p.x;
54890                 this.y += p.y;
54891                 return this;
54892             },
54893
54894             _sub: function(p) {
54895                 this.x -= p.x;
54896                 this.y -= p.y;
54897                 return this;
54898             },
54899
54900             _mult: function(k) {
54901                 this.x *= k;
54902                 this.y *= k;
54903                 return this;
54904             },
54905
54906             _div: function(k) {
54907                 this.x /= k;
54908                 this.y /= k;
54909                 return this;
54910             },
54911
54912             _multByPoint: function(p) {
54913                 this.x *= p.x;
54914                 this.y *= p.y;
54915                 return this;
54916             },
54917
54918             _divByPoint: function(p) {
54919                 this.x /= p.x;
54920                 this.y /= p.y;
54921                 return this;
54922             },
54923
54924             _unit: function() {
54925                 this._div(this.mag());
54926                 return this;
54927             },
54928
54929             _perp: function() {
54930                 var y = this.y;
54931                 this.y = this.x;
54932                 this.x = -y;
54933                 return this;
54934             },
54935
54936             _rotate: function(angle) {
54937                 var cos = Math.cos(angle),
54938                     sin = Math.sin(angle),
54939                     x = cos * this.x - sin * this.y,
54940                     y = sin * this.x + cos * this.y;
54941                 this.x = x;
54942                 this.y = y;
54943                 return this;
54944             },
54945
54946             _rotateAround: function(angle, p) {
54947                 var cos = Math.cos(angle),
54948                     sin = Math.sin(angle),
54949                     x = p.x + cos * (this.x - p.x) - sin * (this.y - p.y),
54950                     y = p.y + sin * (this.x - p.x) + cos * (this.y - p.y);
54951                 this.x = x;
54952                 this.y = y;
54953                 return this;
54954             },
54955
54956             _round: function() {
54957                 this.x = Math.round(this.x);
54958                 this.y = Math.round(this.y);
54959                 return this;
54960             }
54961         };
54962
54963         /**
54964          * Construct a point from an array if necessary, otherwise if the input
54965          * is already a Point, or an unknown type, return it unchanged
54966          * @param {Array<Number>|Point|*} a any kind of input value
54967          * @return {Point} constructed point, or passed-through value.
54968          * @example
54969          * // this
54970          * var point = Point.convert([0, 1]);
54971          * // is equivalent to
54972          * var point = new Point(0, 1);
54973          */
54974         Point.convert = function (a) {
54975             if (a instanceof Point) {
54976                 return a;
54977             }
54978             if (Array.isArray(a)) {
54979                 return new Point(a[0], a[1]);
54980             }
54981             return a;
54982         };
54983
54984         var vectortilefeature = VectorTileFeature;
54985
54986         function VectorTileFeature(pbf, end, extent, keys, values) {
54987             // Public
54988             this.properties = {};
54989             this.extent = extent;
54990             this.type = 0;
54991
54992             // Private
54993             this._pbf = pbf;
54994             this._geometry = -1;
54995             this._keys = keys;
54996             this._values = values;
54997
54998             pbf.readFields(readFeature, this, end);
54999         }
55000
55001         function readFeature(tag, feature, pbf) {
55002             if (tag == 1) feature.id = pbf.readVarint();
55003             else if (tag == 2) readTag(pbf, feature);
55004             else if (tag == 3) feature.type = pbf.readVarint();
55005             else if (tag == 4) feature._geometry = pbf.pos;
55006         }
55007
55008         function readTag(pbf, feature) {
55009             var end = pbf.readVarint() + pbf.pos;
55010
55011             while (pbf.pos < end) {
55012                 var key = feature._keys[pbf.readVarint()],
55013                     value = feature._values[pbf.readVarint()];
55014                 feature.properties[key] = value;
55015             }
55016         }
55017
55018         VectorTileFeature.types = ['Unknown', 'Point', 'LineString', 'Polygon'];
55019
55020         VectorTileFeature.prototype.loadGeometry = function() {
55021             var pbf = this._pbf;
55022             pbf.pos = this._geometry;
55023
55024             var end = pbf.readVarint() + pbf.pos,
55025                 cmd = 1,
55026                 length = 0,
55027                 x = 0,
55028                 y = 0,
55029                 lines = [],
55030                 line;
55031
55032             while (pbf.pos < end) {
55033                 if (length <= 0) {
55034                     var cmdLen = pbf.readVarint();
55035                     cmd = cmdLen & 0x7;
55036                     length = cmdLen >> 3;
55037                 }
55038
55039                 length--;
55040
55041                 if (cmd === 1 || cmd === 2) {
55042                     x += pbf.readSVarint();
55043                     y += pbf.readSVarint();
55044
55045                     if (cmd === 1) { // moveTo
55046                         if (line) lines.push(line);
55047                         line = [];
55048                     }
55049
55050                     line.push(new pointGeometry(x, y));
55051
55052                 } else if (cmd === 7) {
55053
55054                     // Workaround for https://github.com/mapbox/mapnik-vector-tile/issues/90
55055                     if (line) {
55056                         line.push(line[0].clone()); // closePolygon
55057                     }
55058
55059                 } else {
55060                     throw new Error('unknown command ' + cmd);
55061                 }
55062             }
55063
55064             if (line) lines.push(line);
55065
55066             return lines;
55067         };
55068
55069         VectorTileFeature.prototype.bbox = function() {
55070             var pbf = this._pbf;
55071             pbf.pos = this._geometry;
55072
55073             var end = pbf.readVarint() + pbf.pos,
55074                 cmd = 1,
55075                 length = 0,
55076                 x = 0,
55077                 y = 0,
55078                 x1 = Infinity,
55079                 x2 = -Infinity,
55080                 y1 = Infinity,
55081                 y2 = -Infinity;
55082
55083             while (pbf.pos < end) {
55084                 if (length <= 0) {
55085                     var cmdLen = pbf.readVarint();
55086                     cmd = cmdLen & 0x7;
55087                     length = cmdLen >> 3;
55088                 }
55089
55090                 length--;
55091
55092                 if (cmd === 1 || cmd === 2) {
55093                     x += pbf.readSVarint();
55094                     y += pbf.readSVarint();
55095                     if (x < x1) x1 = x;
55096                     if (x > x2) x2 = x;
55097                     if (y < y1) y1 = y;
55098                     if (y > y2) y2 = y;
55099
55100                 } else if (cmd !== 7) {
55101                     throw new Error('unknown command ' + cmd);
55102                 }
55103             }
55104
55105             return [x1, y1, x2, y2];
55106         };
55107
55108         VectorTileFeature.prototype.toGeoJSON = function(x, y, z) {
55109             var size = this.extent * Math.pow(2, z),
55110                 x0 = this.extent * x,
55111                 y0 = this.extent * y,
55112                 coords = this.loadGeometry(),
55113                 type = VectorTileFeature.types[this.type],
55114                 i, j;
55115
55116             function project(line) {
55117                 for (var j = 0; j < line.length; j++) {
55118                     var p = line[j], y2 = 180 - (p.y + y0) * 360 / size;
55119                     line[j] = [
55120                         (p.x + x0) * 360 / size - 180,
55121                         360 / Math.PI * Math.atan(Math.exp(y2 * Math.PI / 180)) - 90
55122                     ];
55123                 }
55124             }
55125
55126             switch (this.type) {
55127             case 1:
55128                 var points = [];
55129                 for (i = 0; i < coords.length; i++) {
55130                     points[i] = coords[i][0];
55131                 }
55132                 coords = points;
55133                 project(coords);
55134                 break;
55135
55136             case 2:
55137                 for (i = 0; i < coords.length; i++) {
55138                     project(coords[i]);
55139                 }
55140                 break;
55141
55142             case 3:
55143                 coords = classifyRings(coords);
55144                 for (i = 0; i < coords.length; i++) {
55145                     for (j = 0; j < coords[i].length; j++) {
55146                         project(coords[i][j]);
55147                     }
55148                 }
55149                 break;
55150             }
55151
55152             if (coords.length === 1) {
55153                 coords = coords[0];
55154             } else {
55155                 type = 'Multi' + type;
55156             }
55157
55158             var result = {
55159                 type: "Feature",
55160                 geometry: {
55161                     type: type,
55162                     coordinates: coords
55163                 },
55164                 properties: this.properties
55165             };
55166
55167             if ('id' in this) {
55168                 result.id = this.id;
55169             }
55170
55171             return result;
55172         };
55173
55174         // classifies an array of rings into polygons with outer rings and holes
55175
55176         function classifyRings(rings) {
55177             var len = rings.length;
55178
55179             if (len <= 1) return [rings];
55180
55181             var polygons = [],
55182                 polygon,
55183                 ccw;
55184
55185             for (var i = 0; i < len; i++) {
55186                 var area = signedArea(rings[i]);
55187                 if (area === 0) continue;
55188
55189                 if (ccw === undefined) ccw = area < 0;
55190
55191                 if (ccw === area < 0) {
55192                     if (polygon) polygons.push(polygon);
55193                     polygon = [rings[i]];
55194
55195                 } else {
55196                     polygon.push(rings[i]);
55197                 }
55198             }
55199             if (polygon) polygons.push(polygon);
55200
55201             return polygons;
55202         }
55203
55204         function signedArea(ring) {
55205             var sum = 0;
55206             for (var i = 0, len = ring.length, j = len - 1, p1, p2; i < len; j = i++) {
55207                 p1 = ring[i];
55208                 p2 = ring[j];
55209                 sum += (p2.x - p1.x) * (p1.y + p2.y);
55210             }
55211             return sum;
55212         }
55213
55214         var vectortilelayer = VectorTileLayer;
55215
55216         function VectorTileLayer(pbf, end) {
55217             // Public
55218             this.version = 1;
55219             this.name = null;
55220             this.extent = 4096;
55221             this.length = 0;
55222
55223             // Private
55224             this._pbf = pbf;
55225             this._keys = [];
55226             this._values = [];
55227             this._features = [];
55228
55229             pbf.readFields(readLayer, this, end);
55230
55231             this.length = this._features.length;
55232         }
55233
55234         function readLayer(tag, layer, pbf) {
55235             if (tag === 15) layer.version = pbf.readVarint();
55236             else if (tag === 1) layer.name = pbf.readString();
55237             else if (tag === 5) layer.extent = pbf.readVarint();
55238             else if (tag === 2) layer._features.push(pbf.pos);
55239             else if (tag === 3) layer._keys.push(pbf.readString());
55240             else if (tag === 4) layer._values.push(readValueMessage(pbf));
55241         }
55242
55243         function readValueMessage(pbf) {
55244             var value = null,
55245                 end = pbf.readVarint() + pbf.pos;
55246
55247             while (pbf.pos < end) {
55248                 var tag = pbf.readVarint() >> 3;
55249
55250                 value = tag === 1 ? pbf.readString() :
55251                     tag === 2 ? pbf.readFloat() :
55252                     tag === 3 ? pbf.readDouble() :
55253                     tag === 4 ? pbf.readVarint64() :
55254                     tag === 5 ? pbf.readVarint() :
55255                     tag === 6 ? pbf.readSVarint() :
55256                     tag === 7 ? pbf.readBoolean() : null;
55257             }
55258
55259             return value;
55260         }
55261
55262         // return feature `i` from this layer as a `VectorTileFeature`
55263         VectorTileLayer.prototype.feature = function(i) {
55264             if (i < 0 || i >= this._features.length) throw new Error('feature index out of bounds');
55265
55266             this._pbf.pos = this._features[i];
55267
55268             var end = this._pbf.readVarint() + this._pbf.pos;
55269             return new vectortilefeature(this._pbf, end, this.extent, this._keys, this._values);
55270         };
55271
55272         var vectortile = VectorTile;
55273
55274         function VectorTile(pbf, end) {
55275             this.layers = pbf.readFields(readTile, {}, end);
55276         }
55277
55278         function readTile(tag, layers, pbf) {
55279             if (tag === 3) {
55280                 var layer = new vectortilelayer(pbf, pbf.readVarint() + pbf.pos);
55281                 if (layer.length) layers[layer.name] = layer;
55282             }
55283         }
55284
55285         var VectorTile$1 = vectortile;
55286         var VectorTileFeature$1 = vectortilefeature;
55287         var VectorTileLayer$1 = vectortilelayer;
55288
55289         var vectorTile = {
55290                 VectorTile: VectorTile$1,
55291                 VectorTileFeature: VectorTileFeature$1,
55292                 VectorTileLayer: VectorTileLayer$1
55293         };
55294
55295         var tiler$6 = utilTiler().tileSize(512).margin(1);
55296         var dispatch$7 = dispatch('loadedData');
55297         var _vtCache;
55298
55299
55300         function abortRequest$6(controller) {
55301             controller.abort();
55302         }
55303
55304
55305         function vtToGeoJSON(data, tile, mergeCache) {
55306             var vectorTile$1 = new vectorTile.VectorTile(new pbf(data.response));
55307             var layers = Object.keys(vectorTile$1.layers);
55308             if (!Array.isArray(layers)) { layers = [layers]; }
55309
55310             var features = [];
55311             layers.forEach(function(layerID) {
55312                 var layer = vectorTile$1.layers[layerID];
55313                 if (layer) {
55314                     for (var i = 0; i < layer.length; i++) {
55315                         var feature = layer.feature(i).toGeoJSON(tile.xyz[0], tile.xyz[1], tile.xyz[2]);
55316                         var geometry = feature.geometry;
55317
55318                         // Treat all Polygons as MultiPolygons
55319                         if (geometry.type === 'Polygon') {
55320                             geometry.type = 'MultiPolygon';
55321                             geometry.coordinates = [geometry.coordinates];
55322                         }
55323
55324                         // Clip to tile bounds
55325                         if (geometry.type === 'MultiPolygon') {
55326                             var isClipped = false;
55327                             var featureClip = turf_bboxClip(feature, tile.extent.rectangle());
55328                             if (!fastDeepEqual(feature.geometry, featureClip.geometry)) {
55329                                 // feature = featureClip;
55330                                 isClipped = true;
55331                             }
55332                             if (!feature.geometry.coordinates.length) continue;   // not actually on this tile
55333                             if (!feature.geometry.coordinates[0].length) continue;   // not actually on this tile
55334                         }
55335
55336                         // Generate some unique IDs and add some metadata
55337                         var featurehash = utilHashcode(fastJsonStableStringify(feature));
55338                         var propertyhash = utilHashcode(fastJsonStableStringify(feature.properties || {}));
55339                         feature.__layerID__ = layerID.replace(/[^_a-zA-Z0-9\-]/g, '_');
55340                         feature.__featurehash__ = featurehash;
55341                         feature.__propertyhash__ = propertyhash;
55342                         features.push(feature);
55343
55344                         // Clipped Polygons at same zoom with identical properties can get merged
55345                         if (isClipped && geometry.type === 'MultiPolygon') {
55346                             var merged = mergeCache[propertyhash];
55347                             if (merged && merged.length) {
55348                                 var other = merged[0];
55349                                 var coords = martinez.union(
55350                                     feature.geometry.coordinates, other.geometry.coordinates
55351                                 );
55352
55353                                 if (!coords || !coords.length) {
55354                                     continue;  // something failed in martinez union
55355                                 }
55356
55357                                 merged.push(feature);
55358                                 for (var j = 0; j < merged.length; j++) {      // all these features get...
55359                                     merged[j].geometry.coordinates = coords;   // same coords
55360                                     merged[j].__featurehash__ = featurehash;   // same hash, so deduplication works
55361                                 }
55362                             } else {
55363                                 mergeCache[propertyhash] = [feature];
55364                             }
55365                         }
55366                     }
55367                 }
55368             });
55369
55370             return features;
55371         }
55372
55373
55374         function loadTile(source, tile) {
55375             if (source.loaded[tile.id] || source.inflight[tile.id]) return;
55376
55377             var url = source.template
55378                 .replace('{x}', tile.xyz[0])
55379                 .replace('{y}', tile.xyz[1])
55380                 // TMS-flipped y coordinate
55381                 .replace(/\{[t-]y\}/, Math.pow(2, tile.xyz[2]) - tile.xyz[1] - 1)
55382                 .replace(/\{z(oom)?\}/, tile.xyz[2])
55383                 .replace(/\{switch:([^}]+)\}/, function(s, r) {
55384                     var subdomains = r.split(',');
55385                     return subdomains[(tile.xyz[0] + tile.xyz[1]) % subdomains.length];
55386                 });
55387
55388
55389             var controller = new AbortController();
55390             source.inflight[tile.id] = controller;
55391
55392             fetch(url, { signal: controller.signal })
55393                 .then(function(response) {
55394                     if (!response.ok) {
55395                         throw new Error(response.status + ' ' + response.statusText);
55396                     }
55397                     source.loaded[tile.id] = [];
55398                     delete source.inflight[tile.id];
55399                     return response.arrayBuffer();
55400                 })
55401                 .then(function(data) {
55402                     if (!data) {
55403                         throw new Error('No Data');
55404                     }
55405
55406                     var z = tile.xyz[2];
55407                     if (!source.canMerge[z]) {
55408                         source.canMerge[z] = {};  // initialize mergeCache
55409                     }
55410
55411                     source.loaded[tile.id] = vtToGeoJSON(data, tile, source.canMerge[z]);
55412                     dispatch$7.call('loadedData');
55413                 })
55414                 .catch(function() {
55415                     source.loaded[tile.id] = [];
55416                     delete source.inflight[tile.id];
55417                 });
55418         }
55419
55420
55421         var serviceVectorTile = {
55422
55423             init: function() {
55424                 if (!_vtCache) {
55425                     this.reset();
55426                 }
55427
55428                 this.event = utilRebind(this, dispatch$7, 'on');
55429             },
55430
55431
55432             reset: function() {
55433                 for (var sourceID in _vtCache) {
55434                     var source = _vtCache[sourceID];
55435                     if (source && source.inflight) {
55436                         Object.values(source.inflight).forEach(abortRequest$6);
55437                     }
55438                 }
55439
55440                 _vtCache = {};
55441             },
55442
55443
55444             addSource: function(sourceID, template) {
55445                 _vtCache[sourceID] = { template: template, inflight: {}, loaded: {}, canMerge: {} };
55446                 return _vtCache[sourceID];
55447             },
55448
55449
55450             data: function(sourceID, projection) {
55451                 var source = _vtCache[sourceID];
55452                 if (!source) return [];
55453
55454                 var tiles = tiler$6.getTiles(projection);
55455                 var seen = {};
55456                 var results = [];
55457
55458                 for (var i = 0; i < tiles.length; i++) {
55459                     var features = source.loaded[tiles[i].id];
55460                     if (!features || !features.length) continue;
55461
55462                     for (var j = 0; j < features.length; j++) {
55463                         var feature = features[j];
55464                         var hash = feature.__featurehash__;
55465                         if (seen[hash]) continue;
55466                         seen[hash] = true;
55467
55468                         // return a shallow copy, because the hash may change
55469                         // later if this feature gets merged with another
55470                         results.push(Object.assign({}, feature));  // shallow copy
55471                     }
55472                 }
55473
55474                 return results;
55475             },
55476
55477
55478             loadTiles: function(sourceID, template, projection) {
55479                 var source = _vtCache[sourceID];
55480                 if (!source) {
55481                     source = this.addSource(sourceID, template);
55482                 }
55483
55484                 var tiles = tiler$6.getTiles(projection);
55485
55486                 // abort inflight requests that are no longer needed
55487                 Object.keys(source.inflight).forEach(function(k) {
55488                     var wanted = tiles.find(function(tile) { return k === tile.id; });
55489                     if (!wanted) {
55490                         abortRequest$6(source.inflight[k]);
55491                         delete source.inflight[k];
55492                     }
55493                 });
55494
55495                 tiles.forEach(function(tile) {
55496                     loadTile(source, tile);
55497                 });
55498             },
55499
55500
55501             cache: function() {
55502                 return _vtCache;
55503             }
55504
55505         };
55506
55507         var apibase$5 = 'https://www.wikidata.org/w/api.php?';
55508         var _wikidataCache = {};
55509
55510
55511         var serviceWikidata = {
55512
55513             init: function() {},
55514
55515             reset: function() {
55516                 _wikidataCache = {};
55517             },
55518
55519
55520             // Search for Wikidata items matching the query
55521             itemsForSearchQuery: function(query, callback) {
55522                 if (!query) {
55523                     if (callback) callback('No query', {});
55524                     return;
55525                 }
55526
55527                 var url = apibase$5 + utilQsString({
55528                     action: 'wbsearchentities',
55529                     format: 'json',
55530                     formatversion: 2,
55531                     search: query,
55532                     type: 'item',
55533                     language: this.languagesToQuery()[0],
55534                     limit: 10,
55535                     origin: '*'
55536                 });
55537
55538                 d3_json(url)
55539                     .then(function(result) {
55540                         if (result && result.error) {
55541                             throw new Error(result.error);
55542                         }
55543                         if (callback) callback(null, result.search || {});
55544                     })
55545                     .catch(function(err) {
55546                         if (callback) callback(err.message, {});
55547                     });
55548             },
55549
55550
55551             // Given a Wikipedia language and article title,
55552             // return an array of corresponding Wikidata entities.
55553             itemsByTitle: function(lang, title, callback) {
55554                 if (!title) {
55555                     if (callback) callback('No title', {});
55556                     return;
55557                 }
55558
55559                 lang = lang || 'en';
55560                 var url = apibase$5 + utilQsString({
55561                     action: 'wbgetentities',
55562                     format: 'json',
55563                     formatversion: 2,
55564                     sites: lang.replace(/-/g, '_') + 'wiki',
55565                     titles: title,
55566                     languages: 'en', // shrink response by filtering to one language
55567                     origin: '*'
55568                 });
55569
55570                 d3_json(url)
55571                     .then(function(result) {
55572                         if (result && result.error) {
55573                             throw new Error(result.error);
55574                         }
55575                         if (callback) callback(null, result.entities || {});
55576                     })
55577                     .catch(function(err) {
55578                         if (callback) callback(err.message, {});
55579                     });
55580             },
55581
55582
55583             languagesToQuery: function() {
55584                 return utilArrayUniq([
55585                     currentLocale.toLowerCase(),
55586                     currentLocale.split('-', 2)[0].toLowerCase(),
55587                     'en'
55588                 ]);
55589             },
55590
55591
55592             entityByQID: function(qid, callback) {
55593                 if (!qid) {
55594                     callback('No qid', {});
55595                     return;
55596                 }
55597                 if (_wikidataCache[qid]) {
55598                     if (callback) callback(null, _wikidataCache[qid]);
55599                     return;
55600                 }
55601
55602                 var langs = this.languagesToQuery();
55603                 var url = apibase$5 + utilQsString({
55604                     action: 'wbgetentities',
55605                     format: 'json',
55606                     formatversion: 2,
55607                     ids: qid,
55608                     props: 'labels|descriptions|claims|sitelinks',
55609                     sitefilter: langs.map(function(d) { return d + 'wiki'; }).join('|'),
55610                     languages: langs.join('|'),
55611                     languagefallback: 1,
55612                     origin: '*'
55613                 });
55614
55615                 d3_json(url)
55616                     .then(function(result) {
55617                         if (result && result.error) {
55618                             throw new Error(result.error);
55619                         }
55620                         if (callback) callback(null, result.entities[qid] || {});
55621                     })
55622                     .catch(function(err) {
55623                         if (callback) callback(err.message, {});
55624                     });
55625             },
55626
55627
55628             // Pass `params` object of the form:
55629             // {
55630             //   qid: 'string'      // brand wikidata  (e.g. 'Q37158')
55631             // }
55632             //
55633             // Get an result object used to display tag documentation
55634             // {
55635             //   title:        'string',
55636             //   description:  'string',
55637             //   editURL:      'string',
55638             //   imageURL:     'string',
55639             //   wiki:         { title: 'string', text: 'string', url: 'string' }
55640             // }
55641             //
55642             getDocs: function(params, callback) {
55643                 var langs = this.languagesToQuery();
55644                 this.entityByQID(params.qid, function(err, entity) {
55645                     if (err || !entity) {
55646                         callback(err || 'No entity');
55647                         return;
55648                     }
55649
55650                     var i;
55651                     var description;
55652                     if (entity.descriptions && Object.keys(entity.descriptions).length > 0) {
55653                         description = entity.descriptions[Object.keys(entity.descriptions)[0]].value;
55654                     }
55655
55656                     // prepare result
55657                     var result = {
55658                         title: entity.id,
55659                         description: description,
55660                         editURL: 'https://www.wikidata.org/wiki/' + entity.id
55661                     };
55662
55663                     // add image
55664                     if (entity.claims) {
55665                         var imageroot = 'https://commons.wikimedia.org/w/index.php';
55666                         var props = ['P154','P18'];  // logo image, image
55667                         var prop, image;
55668                         for (i = 0; i < props.length; i++) {
55669                             prop = entity.claims[props[i]];
55670                             if (prop && Object.keys(prop).length > 0) {
55671                                 image = prop[Object.keys(prop)[0]].mainsnak.datavalue.value;
55672                                 if (image) {
55673                                     result.imageURL = imageroot + '?' + utilQsString({
55674                                         title: 'Special:Redirect/file/' + image,
55675                                         width: 400
55676                                     });
55677                                     break;
55678                                 }
55679                             }
55680                         }
55681                     }
55682
55683                     if (entity.sitelinks) {
55684                         var englishLocale = (currentLocale.split('-', 2)[0].toLowerCase() === 'en');
55685
55686                         // must be one of these that we requested..
55687                         for (i = 0; i < langs.length; i++) {   // check each, in order of preference
55688                             var w = langs[i] + 'wiki';
55689                             if (entity.sitelinks[w]) {
55690                                 var title = entity.sitelinks[w].title;
55691                                 var tKey = 'inspector.wiki_reference';
55692                                 if (!englishLocale && langs[i] === 'en') {   // user's currentLocale isn't English but
55693                                     tKey = 'inspector.wiki_en_reference';    // we are sending them to enwiki anyway..
55694                                 }
55695
55696                                 result.wiki = {
55697                                     title: title,
55698                                     text: tKey,
55699                                     url: 'https://' + langs[i] + '.wikipedia.org/wiki/' + title.replace(/ /g, '_')
55700                                 };
55701                                 break;
55702                             }
55703                         }
55704                     }
55705
55706                     callback(null, result);
55707                 });
55708             }
55709
55710         };
55711
55712         var endpoint = 'https://en.wikipedia.org/w/api.php?';
55713
55714         var serviceWikipedia = {
55715
55716             init: function() {},
55717             reset: function() {},
55718
55719
55720             search: function(lang, query, callback) {
55721                 if (!query) {
55722                     if (callback) callback('No Query', []);
55723                     return;
55724                 }
55725
55726                 lang = lang || 'en';
55727                 var url = endpoint.replace('en', lang) +
55728                     utilQsString({
55729                         action: 'query',
55730                         list: 'search',
55731                         srlimit: '10',
55732                         srinfo: 'suggestion',
55733                         format: 'json',
55734                         origin: '*',
55735                         srsearch: query
55736                     });
55737
55738                 d3_json(url)
55739                     .then(function(result) {
55740                         if (result && result.error) {
55741                             throw new Error(result.error);
55742                         } else if (!result || !result.query || !result.query.search) {
55743                             throw new Error('No Results');
55744                         }
55745                         if (callback) {
55746                             var titles = result.query.search.map(function(d) { return d.title; });
55747                             callback(null, titles);
55748                         }
55749                     })
55750                     .catch(function(err) {
55751                         if (callback) callback(err, []);
55752                     });
55753             },
55754
55755
55756             suggestions: function(lang, query, callback) {
55757                 if (!query) {
55758                     if (callback) callback('', []);
55759                     return;
55760                 }
55761
55762                 lang = lang || 'en';
55763                 var url = endpoint.replace('en', lang) +
55764                     utilQsString({
55765                         action: 'opensearch',
55766                         namespace: 0,
55767                         suggest: '',
55768                         format: 'json',
55769                         origin: '*',
55770                         search: query
55771                     });
55772
55773                 d3_json(url)
55774                     .then(function(result) {
55775                         if (result && result.error) {
55776                             throw new Error(result.error);
55777                         } else if (!result || result.length < 2) {
55778                             throw new Error('No Results');
55779                         }
55780                         if (callback) callback(null, result[1] || []);
55781                     })
55782                     .catch(function(err) {
55783                         if (callback) callback(err.message, []);
55784                     });
55785             },
55786
55787
55788             translations: function(lang, title, callback) {
55789                 if (!title) {
55790                     if (callback) callback('No Title');
55791                     return;
55792                 }
55793
55794                 var url = endpoint.replace('en', lang) +
55795                     utilQsString({
55796                         action: 'query',
55797                         prop: 'langlinks',
55798                         format: 'json',
55799                         origin: '*',
55800                         lllimit: 500,
55801                         titles: title
55802                     });
55803
55804                 d3_json(url)
55805                     .then(function(result) {
55806                         if (result && result.error) {
55807                             throw new Error(result.error);
55808                         } else if (!result || !result.query || !result.query.pages) {
55809                             throw new Error('No Results');
55810                         }
55811                         if (callback) {
55812                             var list = result.query.pages[Object.keys(result.query.pages)[0]];
55813                             var translations = {};
55814                             if (list && list.langlinks) {
55815                                 list.langlinks.forEach(function(d) { translations[d.lang] = d['*']; });
55816                             }
55817                             callback(null, translations);
55818                         }
55819                     })
55820                     .catch(function(err) {
55821                         if (callback) callback(err.message);
55822                     });
55823             }
55824
55825         };
55826
55827         var services$1 = {
55828             geocoder: serviceNominatim,
55829             keepRight: serviceKeepRight,
55830             improveOSM: serviceImproveOSM,
55831             mapillary: serviceMapillary,
55832             openstreetcam: serviceOpenstreetcam,
55833             osm: serviceOsm,
55834             osmWikibase: serviceOsmWikibase,
55835             maprules: serviceMapRules,
55836             streetside: serviceStreetside,
55837             taginfo: serviceTaginfo,
55838             vectorTile: serviceVectorTile,
55839             wikidata: serviceWikidata,
55840             wikipedia: serviceWikipedia
55841         };
55842
55843         function svgIcon(name, svgklass, useklass) {
55844             return function drawIcon(selection) {
55845                 selection.selectAll('svg.icon')
55846                     .data([0])
55847                     .enter()
55848                     .append('svg')
55849                     .attr('class', 'icon ' + (svgklass || ''))
55850                     .append('use')
55851                     .attr('xlink:href', name)
55852                     .attr('class', useklass);
55853             };
55854         }
55855
55856         function uiNoteComments() {
55857             var _note;
55858
55859
55860             function noteComments(selection) {
55861                 if (_note.isNew()) return; // don't draw .comments-container
55862
55863                 var comments = selection.selectAll('.comments-container')
55864                     .data([0]);
55865
55866                 comments = comments.enter()
55867                     .append('div')
55868                     .attr('class', 'comments-container')
55869                     .merge(comments);
55870
55871                 var commentEnter = comments.selectAll('.comment')
55872                     .data(_note.comments)
55873                     .enter()
55874                     .append('div')
55875                     .attr('class', 'comment');
55876
55877                 commentEnter
55878                     .append('div')
55879                     .attr('class', function(d) { return 'comment-avatar user-' + d.uid; })
55880                     .call(svgIcon('#iD-icon-avatar', 'comment-avatar-icon'));
55881
55882                 var mainEnter = commentEnter
55883                     .append('div')
55884                     .attr('class', 'comment-main');
55885
55886                 var metadataEnter = mainEnter
55887                     .append('div')
55888                     .attr('class', 'comment-metadata');
55889
55890                 metadataEnter
55891                     .append('div')
55892                     .attr('class', 'comment-author')
55893                     .each(function(d) {
55894                         var selection = d3_select(this);
55895                         var osm = services$1.osm;
55896                         if (osm && d.user) {
55897                             selection = selection
55898                                 .append('a')
55899                                 .attr('class', 'comment-author-link')
55900                                 .attr('href', osm.userURL(d.user))
55901                                 .attr('tabindex', -1)
55902                                 .attr('target', '_blank');
55903                         }
55904                         selection
55905                             .text(function(d) { return d.user || t('note.anonymous'); });
55906                     });
55907
55908                 metadataEnter
55909                     .append('div')
55910                     .attr('class', 'comment-date')
55911                     .text(function(d) {
55912                         return t('note.status.' + d.action, { when: localeDateString(d.date) });
55913                     });
55914
55915                 mainEnter
55916                     .append('div')
55917                     .attr('class', 'comment-text')
55918                     .html(function(d) { return d.html; });
55919
55920                 comments
55921                     .call(replaceAvatars);
55922             }
55923
55924
55925             function replaceAvatars(selection) {
55926                 var osm = services$1.osm;
55927                 if (!osm) return;
55928
55929                 var uids = {};  // gather uids in the comment thread
55930                 _note.comments.forEach(function(d) {
55931                     if (d.uid) uids[d.uid] = true;
55932                 });
55933
55934                 Object.keys(uids).forEach(function(uid) {
55935                     osm.loadUser(uid, function(err, user) {
55936                         if (!user || !user.image_url) return;
55937
55938                         selection.selectAll('.comment-avatar.user-' + uid)
55939                             .html('')
55940                             .append('img')
55941                             .attr('class', 'icon comment-avatar-icon')
55942                             .attr('src', user.image_url)
55943                             .attr('alt', user.display_name);
55944                     });
55945                 });
55946             }
55947
55948
55949             function localeDateString(s) {
55950                 if (!s) return null;
55951                 var detected = utilDetect();
55952                 var options = { day: 'numeric', month: 'short', year: 'numeric' };
55953                 s = s.replace(/-/g, '/'); // fix browser-specific Date() issues
55954                 var d = new Date(s);
55955                 if (isNaN(d.getTime())) return null;
55956                 return d.toLocaleDateString(detected.locale, options);
55957             }
55958
55959
55960             noteComments.note = function(val) {
55961                 if (!arguments.length) return _note;
55962                 _note = val;
55963                 return noteComments;
55964             };
55965
55966
55967             return noteComments;
55968         }
55969
55970         function uiNoteHeader() {
55971             var _note;
55972
55973
55974             function noteHeader(selection) {
55975                 var header = selection.selectAll('.note-header')
55976                     .data(
55977                         (_note ? [_note] : []),
55978                         function(d) { return d.status + d.id; }
55979                     );
55980
55981                 header.exit()
55982                     .remove();
55983
55984                 var headerEnter = header.enter()
55985                     .append('div')
55986                     .attr('class', 'note-header');
55987
55988                 var iconEnter = headerEnter
55989                     .append('div')
55990                     .attr('class', function(d) { return 'note-header-icon ' + d.status; })
55991                     .classed('new', function(d) { return d.id < 0; });
55992
55993                 iconEnter
55994                     .append('div')
55995                     .attr('class', 'preset-icon-28')
55996                     .call(svgIcon('#iD-icon-note', 'note-fill'));
55997
55998                 iconEnter.each(function(d) {
55999                     var statusIcon = '#iD-icon-' + (d.id < 0 ? 'plus' : (d.status === 'open' ? 'close' : 'apply'));
56000                     iconEnter
56001                         .append('div')
56002                         .attr('class', 'note-icon-annotation')
56003                         .call(svgIcon(statusIcon, 'icon-annotation'));
56004                 });
56005
56006                 headerEnter
56007                     .append('div')
56008                     .attr('class', 'note-header-label')
56009                     .text(function(d) {
56010                         if (_note.isNew()) { return t('note.new'); }
56011                         return t('note.note') + ' ' + d.id + ' ' +
56012                             (d.status === 'closed' ? t('note.closed') : '');
56013                     });
56014             }
56015
56016
56017             noteHeader.note = function(val) {
56018                 if (!arguments.length) return _note;
56019                 _note = val;
56020                 return noteHeader;
56021             };
56022
56023
56024             return noteHeader;
56025         }
56026
56027         function uiNoteReport() {
56028             var _note;
56029
56030             function noteReport(selection) {
56031                 var url;
56032                 if (services$1.osm && (_note instanceof osmNote) && (!_note.isNew())) {
56033                     url = services$1.osm.noteReportURL(_note);
56034                 }
56035
56036                 var link = selection.selectAll('.note-report')
56037                     .data(url ? [url] : []);
56038
56039                 // exit
56040                 link.exit()
56041                     .remove();
56042
56043                 // enter
56044                 var linkEnter = link.enter()
56045                     .append('a')
56046                     .attr('class', 'note-report')
56047                     .attr('target', '_blank')
56048                     .attr('href', function(d) { return d; })
56049                     .call(svgIcon('#iD-icon-out-link', 'inline'));
56050
56051                 linkEnter
56052                     .append('span')
56053                     .text(t('note.report'));
56054             }
56055
56056
56057             noteReport.note = function(val) {
56058                 if (!arguments.length) return _note;
56059                 _note = val;
56060                 return noteReport;
56061             };
56062
56063             return noteReport;
56064         }
56065
56066         var _tooltipID = 0;
56067
56068         function tooltip(klass) {
56069             var _id = _tooltipID++;
56070             var tooltip = function(selection) {
56071                 selection.each(setup);
56072             };
56073             var _animation = utilFunctor(false);
56074             var _title = function() {
56075                 var title = this.getAttribute('data-original-title');
56076                 if (title) {
56077                     return title;
56078                 } else {
56079                     title = this.getAttribute('title');
56080                     this.removeAttribute('title');
56081                     this.setAttribute('data-original-title', title);
56082                 }
56083                 return title;
56084             };
56085             var _html = utilFunctor(false);
56086             var _placement = utilFunctor('top');
56087
56088
56089             tooltip.title = function(val) {
56090                 if (arguments.length) {
56091                     _title = utilFunctor(val);
56092                     return tooltip;
56093                 } else {
56094                     return _title;
56095                 }
56096             };
56097
56098
56099             tooltip.html = function(val) {
56100                 if (arguments.length) {
56101                     _html = utilFunctor(val);
56102                     return tooltip;
56103                 } else {
56104                     return _html;
56105                 }
56106             };
56107
56108
56109             tooltip.placement = function(val) {
56110                 if (arguments.length) {
56111                     _placement = utilFunctor(val);
56112                     return tooltip;
56113                 } else {
56114                     return _placement;
56115                 }
56116             };
56117
56118
56119             tooltip.show = function(selection) {
56120                 selection.each(show);
56121             };
56122
56123
56124             tooltip.hide = function(selection) {
56125                 selection.each(hide);
56126             };
56127
56128
56129             tooltip.toggle = function(selection) {
56130                 selection.each(toggle);
56131             };
56132
56133
56134             tooltip.destroy = function(selection, selector) {
56135                 // by default, just destroy the current tooltip
56136                 selector = selector || '.tooltip-' + _id;
56137
56138                 selection
56139                     .on('mouseenter.tooltip', null)
56140                     .on('mouseleave.tooltip', null)
56141                     .attr('title', function() {
56142                         return this.getAttribute('data-original-title') || this.getAttribute('title');
56143                     })
56144                     .attr('data-original-title', null)
56145                     .selectAll(selector)
56146                     .remove();
56147             };
56148
56149
56150             tooltip.destroyAny = function(selection) {
56151                 selection.call(tooltip.destroy, '.tooltip');
56152             };
56153
56154             var isTouchEvent = false;
56155
56156             function setup() {
56157                 var root = d3_select(this);
56158                 var animate = _animation.apply(this, arguments);
56159                 var tip = root.selectAll('.tooltip-' + _id)
56160                     .data([0]);
56161
56162                 var enter = tip.enter()
56163                     .append('div')
56164                     .attr('class', 'tooltip tooltip-' + _id + ' ' + (klass ? klass : ''));
56165
56166                 enter
56167                     .append('div')
56168                     .attr('class', 'tooltip-arrow');
56169
56170                 enter
56171                     .append('div')
56172                     .attr('class', 'tooltip-inner');
56173
56174                 tip = enter
56175                     .merge(tip);
56176
56177                 if (animate) {
56178                     tip.classed('fade', true);
56179                 }
56180
56181                 var place = _placement.apply(this, arguments);
56182                 tip.classed(place, true);
56183
56184                 root.on('touchstart.tooltip', function() {
56185                     // hack to avoid showing tooltips upon touch input
56186                     isTouchEvent = true;
56187                 });
56188                 root.on('mouseenter.tooltip', show);
56189                 root.on('mouseleave.tooltip', hide);
56190             }
56191
56192
56193             function show() {
56194                 if (isTouchEvent) {
56195                     isTouchEvent = false;
56196                     return;
56197                 }
56198                 var root = d3_select(this);
56199                 var content = _title.apply(this, arguments);
56200                 var tip = root.selectAll('.tooltip-' + _id);
56201
56202                 if (tip.empty()) {   // tooltip was removed somehow, put it back
56203                     root.call(tooltip.destroy);
56204                     root.each(setup);
56205                     tip = root.selectAll('.tooltip-' + _id);
56206                 }
56207
56208                 tip.classed('in', true);
56209                 var markup = _html.apply(this, arguments);
56210
56211                 tip.selectAll('.tooltip-inner')[markup ? 'html' : 'text'](content);
56212                 var place = _placement.apply(this, arguments);
56213                 var outer = getPosition(root.node());
56214                 var inner = getPosition(tip.node());
56215                 var pos;
56216
56217                 switch (place) {
56218                     case 'top':
56219                     pos = { x: outer.x + (outer.w - inner.w) / 2, y: outer.y - inner.h };
56220                     break;
56221                     case 'right':
56222                     pos = { x: outer.x + outer.w, y: outer.y + (outer.h - inner.h) / 2 };
56223                     break;
56224                     case 'left':
56225                     pos = { x: outer.x - inner.w, y: outer.y + (outer.h - inner.h) / 2 };
56226                     break;
56227                     case 'bottom':
56228                     pos = { x: outer.x + (outer.w - inner.w) / 2, y: outer.y + outer.h };
56229                     break;
56230                 }
56231
56232                 if (pos) {
56233                     tip.style('left', ~~pos.x + 'px').style('top', ~~pos.y + 'px');
56234                 } else {
56235                     tip.style('left', null).style('top', null);
56236                 }
56237
56238                 this.tooltipVisible = true;
56239
56240
56241                 function getPosition(node) {
56242                     var mode = d3_select(node).style('position');
56243                     if (mode === 'absolute' || mode === 'static') {
56244                         return {
56245                             x: node.offsetLeft,
56246                             y: node.offsetTop,
56247                             w: node.offsetWidth,
56248                             h: node.offsetHeight
56249                         };
56250                     } else {
56251                         return {
56252                             x: 0,
56253                             y: 0,
56254                             w: node.offsetWidth,
56255                             h: node.offsetHeight
56256                         };
56257                     }
56258                 }
56259             }
56260
56261
56262             function hide() {
56263                 d3_select(this).selectAll('.tooltip-' + _id).classed('in', false);
56264                 this.tooltipVisible = false;
56265             }
56266
56267
56268             function toggle() {
56269                 if (this.tooltipVisible) {
56270                     hide.apply(this, arguments);
56271                 } else {
56272                     show.apply(this, arguments);
56273                 }
56274             }
56275
56276
56277             return tooltip;
56278         }
56279
56280         function uiQuickLinks() {
56281             var _choices = [];
56282
56283
56284             function quickLinks(selection) {
56285                 var container = selection.selectAll('.quick-links')
56286                     .data([0]);
56287
56288                 container = container.enter()
56289                     .append('div')
56290                     .attr('class', 'quick-links')
56291                     .merge(container);
56292
56293                 var items = container.selectAll('.quick-link')
56294                     .data(_choices, function(d) { return d.id; });
56295
56296                 items.exit()
56297                     .remove();
56298
56299                 items.enter()
56300                     .append('a')
56301                     .attr('class', function(d) { return 'quick-link quick-link-' + d.id; })
56302                     .attr('href', '#')
56303                     .text(function(d) { return t(d.label); })
56304                     .each(function(d) {
56305                         if (typeof d.tooltip !== 'function') return;
56306                         d3_select(this)
56307                             .call(tooltip().html(true).title(d.tooltip).placement('bottom'));
56308                     })
56309                     .on('click', function(d) {
56310                         if (typeof d.click !== 'function') return;
56311                         event.preventDefault();
56312                         d.click(d);
56313                     });
56314             }
56315
56316
56317             //  val should be an array of choices like:
56318             //    [{
56319             //       id: 'link-id',
56320             //       label: 'translation.key',
56321             //       tooltip: function(d),
56322             //       click: function(d)
56323             //    }, ..]
56324             quickLinks.choices = function(val) {
56325                 if (!arguments.length) return _choices;
56326                 _choices = val;
56327                 return quickLinks;
56328             };
56329
56330
56331             return quickLinks;
56332         }
56333
56334         function uiTooltipHtml(text, key, heading) {
56335             var s = '';
56336
56337             if (heading) {
56338                 s += '<div class="tooltip-heading"><span>' + heading + '</span></div>';
56339             }
56340             if (text) {
56341                 s += '<div class="tooltip-text"><span>' + text + '</span></div>';
56342             }
56343             if (key) {
56344                 s += '<div class="keyhint-wrap"><span>' + t('tooltip_keyhint') + '</span>' +
56345                     '<span class="keyhint">' + key + '</span></div>';
56346             }
56347
56348             return s;
56349         }
56350
56351         function uiViewOnOSM(context) {
56352             var _what;   // an osmEntity or osmNote
56353
56354
56355             function viewOnOSM(selection) {
56356                 var url;
56357                 if (_what instanceof osmEntity) {
56358                     url = context.connection().entityURL(_what);
56359                 } else if (_what instanceof osmNote) {
56360                     url = context.connection().noteURL(_what);
56361                 }
56362
56363                 var data = ((!_what || _what.isNew()) ? [] : [_what]);
56364                 var link = selection.selectAll('.view-on-osm')
56365                     .data(data, function(d) { return d.id; });
56366
56367                 // exit
56368                 link.exit()
56369                     .remove();
56370
56371                 // enter
56372                 var linkEnter = link.enter()
56373                     .append('a')
56374                     .attr('class', 'view-on-osm')
56375                     .attr('target', '_blank')
56376                     .attr('href', url)
56377                     .call(svgIcon('#iD-icon-out-link', 'inline'));
56378
56379                 linkEnter
56380                     .append('span')
56381                     .text(t('inspector.view_on_osm'));
56382             }
56383
56384
56385             viewOnOSM.what = function(_) {
56386                 if (!arguments.length) return _what;
56387                 _what = _;
56388                 return viewOnOSM;
56389             };
56390
56391             return viewOnOSM;
56392         }
56393
56394         function uiNoteEditor(context) {
56395             var dispatch$1 = dispatch('change');
56396             var quickLinks = uiQuickLinks();
56397             var noteComments = uiNoteComments();
56398             var noteHeader = uiNoteHeader();
56399
56400             // var formFields = uiFormFields(context);
56401
56402             var _note;
56403             // var _fieldsArr;
56404
56405
56406             function noteEditor(selection) {
56407                 // quick links
56408                 var choices = [{
56409                     id: 'zoom_to',
56410                     label: 'inspector.zoom_to.title',
56411                     tooltip: function() {
56412                         return uiTooltipHtml(t('inspector.zoom_to.tooltip_note'), t('inspector.zoom_to.key'));
56413                     },
56414                     click: function zoomTo() {
56415                         context.mode().zoomToSelected();
56416                     }
56417                 }];
56418
56419
56420                 var header = selection.selectAll('.header')
56421                     .data([0]);
56422
56423                 var headerEnter = header.enter()
56424                     .append('div')
56425                     .attr('class', 'header fillL');
56426
56427                 headerEnter
56428                     .append('button')
56429                     .attr('class', 'fr note-editor-close')
56430                     .on('click', function() {
56431                         context.enter(modeBrowse(context));
56432                     })
56433                     .call(svgIcon('#iD-icon-close'));
56434
56435                 headerEnter
56436                     .append('h3')
56437                     .text(t('note.title'));
56438
56439
56440                 var body = selection.selectAll('.body')
56441                     .data([0]);
56442
56443                 body = body.enter()
56444                     .append('div')
56445                     .attr('class', 'body')
56446                     .merge(body);
56447
56448                 var editor = body.selectAll('.note-editor')
56449                     .data([0]);
56450
56451                 editor.enter()
56452                     .append('div')
56453                     .attr('class', 'modal-section note-editor')
56454                     .merge(editor)
56455                     .call(noteHeader.note(_note))
56456                     .call(quickLinks.choices(choices))
56457                     .call(noteComments.note(_note))
56458                     .call(noteSaveSection);
56459
56460
56461                 var footer = selection.selectAll('.footer')
56462                     .data([0]);
56463
56464                 footer.enter()
56465                     .append('div')
56466                     .attr('class', 'footer')
56467                     .merge(footer)
56468                     .call(uiViewOnOSM(context).what(_note))
56469                     .call(uiNoteReport(context).note(_note));
56470
56471
56472                 // rerender the note editor on any auth change
56473                 var osm = services$1.osm;
56474                 if (osm) {
56475                     osm.on('change.note-save', function() {
56476                         selection.call(noteEditor);
56477                     });
56478                 }
56479             }
56480
56481
56482             function noteSaveSection(selection) {
56483                 var isSelected = (_note && _note.id === context.selectedNoteID());
56484                 var noteSave = selection.selectAll('.note-save')
56485                     .data((isSelected ? [_note] : []), function(d) { return d.status + d.id; });
56486
56487                 // exit
56488                 noteSave.exit()
56489                     .remove();
56490
56491                 // enter
56492                 var noteSaveEnter = noteSave.enter()
56493                     .append('div')
56494                     .attr('class', 'note-save save-section cf');
56495
56496                 // // if new note, show categories to pick from
56497                 // if (_note.isNew()) {
56498                 //     var presets = context.presets();
56499
56500                 //     // NOTE: this key isn't a age and therefore there is no documentation (yet)
56501                 //     _fieldsArr = [
56502                 //         uiField(context, presets.field('category'), null, { show: true, revert: false }),
56503                 //     ];
56504
56505                 //     _fieldsArr.forEach(function(field) {
56506                 //         field
56507                 //             .on('change', changeCategory);
56508                 //     });
56509
56510                 //     noteSaveEnter
56511                 //         .append('div')
56512                 //         .attr('class', 'note-category')
56513                 //         .call(formFields.fieldsArr(_fieldsArr));
56514                 // }
56515
56516                 // function changeCategory() {
56517                 //     // NOTE: perhaps there is a better way to get value
56518                 //     var val = d3_select('input[name=\'category\']:checked').property('__data__') || undefined;
56519
56520                 //     // store the unsaved category with the note itself
56521                 //     _note = _note.update({ newCategory: val });
56522                 //     var osm = services.osm;
56523                 //     if (osm) {
56524                 //         osm.replaceNote(_note);  // update note cache
56525                 //     }
56526                 //     noteSave
56527                 //         .call(noteSaveButtons);
56528                 // }
56529
56530                 noteSaveEnter
56531                     .append('h4')
56532                     .attr('class', '.note-save-header')
56533                     .text(function() {
56534                         return _note.isNew() ? t('note.newDescription') : t('note.newComment');
56535                     });
56536
56537                 noteSaveEnter
56538                     .append('textarea')
56539                     .attr('class', 'new-comment-input')
56540                     .attr('placeholder', t('note.inputPlaceholder'))
56541                     .attr('maxlength', 1000)
56542                     .property('value', function(d) { return d.newComment; })
56543                     .call(utilNoAuto)
56544                     .on('keydown.note-input', keydown)
56545                     .on('input.note-input', changeInput)
56546                     .on('blur.note-input', changeInput);
56547
56548                 // update
56549                 noteSave = noteSaveEnter
56550                     .merge(noteSave)
56551                     .call(userDetails)
56552                     .call(noteSaveButtons);
56553
56554
56555                 // fast submit if user presses cmd+enter
56556                 function keydown() {
56557                     if (!(event.keyCode === 13 && event.metaKey)) return;
56558
56559                     var osm = services$1.osm;
56560                     if (!osm) return;
56561
56562                     var hasAuth = osm.authenticated();
56563                     if (!hasAuth) return;
56564
56565                     if (!_note.newComment) return;
56566
56567                     event.preventDefault();
56568
56569                     d3_select(this)
56570                         .on('keydown.note-input', null);
56571
56572                     // focus on button and submit
56573                     window.setTimeout(function() {
56574                         if (_note.isNew()) {
56575                             noteSave.selectAll('.save-button').node().focus();
56576                             clickSave(_note);
56577                         } else  {
56578                             noteSave.selectAll('.comment-button').node().focus();
56579                             clickComment(_note);
56580                         }
56581                     }, 10);
56582                 }
56583
56584
56585                 function changeInput() {
56586                     var input = d3_select(this);
56587                     var val = input.property('value').trim() || undefined;
56588
56589                     // store the unsaved comment with the note itself
56590                     _note = _note.update({ newComment: val });
56591
56592                     var osm = services$1.osm;
56593                     if (osm) {
56594                         osm.replaceNote(_note);  // update note cache
56595                     }
56596
56597                     noteSave
56598                         .call(noteSaveButtons);
56599                 }
56600             }
56601
56602
56603             function userDetails(selection) {
56604                 var detailSection = selection.selectAll('.detail-section')
56605                     .data([0]);
56606
56607                 detailSection = detailSection.enter()
56608                     .append('div')
56609                     .attr('class', 'detail-section')
56610                     .merge(detailSection);
56611
56612                 var osm = services$1.osm;
56613                 if (!osm) return;
56614
56615                 // Add warning if user is not logged in
56616                 var hasAuth = osm.authenticated();
56617                 var authWarning = detailSection.selectAll('.auth-warning')
56618                     .data(hasAuth ? [] : [0]);
56619
56620                 authWarning.exit()
56621                     .transition()
56622                     .duration(200)
56623                     .style('opacity', 0)
56624                     .remove();
56625
56626                 var authEnter = authWarning.enter()
56627                     .insert('div', '.tag-reference-body')
56628                     .attr('class', 'field-warning auth-warning')
56629                     .style('opacity', 0);
56630
56631                 authEnter
56632                     .call(svgIcon('#iD-icon-alert', 'inline'));
56633
56634                 authEnter
56635                     .append('span')
56636                     .text(t('note.login'));
56637
56638                 authEnter
56639                     .append('a')
56640                     .attr('target', '_blank')
56641                     .call(svgIcon('#iD-icon-out-link', 'inline'))
56642                     .append('span')
56643                     .text(t('login'))
56644                     .on('click.note-login', function() {
56645                         event.preventDefault();
56646                         osm.authenticate();
56647                     });
56648
56649                 authEnter
56650                     .transition()
56651                     .duration(200)
56652                     .style('opacity', 1);
56653
56654
56655                 var prose = detailSection.selectAll('.note-save-prose')
56656                     .data(hasAuth ? [0] : []);
56657
56658                 prose.exit()
56659                     .remove();
56660
56661                 prose = prose.enter()
56662                     .append('p')
56663                     .attr('class', 'note-save-prose')
56664                     .text(t('note.upload_explanation'))
56665                     .merge(prose);
56666
56667                 osm.userDetails(function(err, user) {
56668                     if (err) return;
56669
56670                     var userLink = d3_select(document.createElement('div'));
56671
56672                     if (user.image_url) {
56673                         userLink
56674                             .append('img')
56675                             .attr('src', user.image_url)
56676                             .attr('class', 'icon pre-text user-icon');
56677                     }
56678
56679                     userLink
56680                         .append('a')
56681                         .attr('class', 'user-info')
56682                         .text(user.display_name)
56683                         .attr('href', osm.userURL(user.display_name))
56684                         .attr('tabindex', -1)
56685                         .attr('target', '_blank');
56686
56687                     prose
56688                         .html(t('note.upload_explanation_with_user', { user: userLink.html() }));
56689                 });
56690             }
56691
56692
56693             function noteSaveButtons(selection) {
56694                 var osm = services$1.osm;
56695                 var hasAuth = osm && osm.authenticated();
56696
56697                 var isSelected = (_note && _note.id === context.selectedNoteID());
56698                 var buttonSection = selection.selectAll('.buttons')
56699                     .data((isSelected ? [_note] : []), function(d) { return d.status + d.id; });
56700
56701                 // exit
56702                 buttonSection.exit()
56703                     .remove();
56704
56705                 // enter
56706                 var buttonEnter = buttonSection.enter()
56707                     .append('div')
56708                     .attr('class', 'buttons');
56709
56710                 if (_note.isNew()) {
56711                     buttonEnter
56712                         .append('button')
56713                         .attr('class', 'button cancel-button secondary-action')
56714                         .text(t('confirm.cancel'));
56715
56716                     buttonEnter
56717                         .append('button')
56718                         .attr('class', 'button save-button action')
56719                         .text(t('note.save'));
56720
56721                 } else {
56722                     buttonEnter
56723                         .append('button')
56724                         .attr('class', 'button status-button action');
56725
56726                     buttonEnter
56727                         .append('button')
56728                         .attr('class', 'button comment-button action')
56729                         .text(t('note.comment'));
56730                 }
56731
56732
56733                 // update
56734                 buttonSection = buttonSection
56735                     .merge(buttonEnter);
56736
56737                 buttonSection.select('.cancel-button')   // select and propagate data
56738                     .on('click.cancel', clickCancel);
56739
56740                 buttonSection.select('.save-button')     // select and propagate data
56741                     .attr('disabled', isSaveDisabled)
56742                     .on('click.save', clickSave);
56743
56744                 buttonSection.select('.status-button')   // select and propagate data
56745                     .attr('disabled', (hasAuth ? null : true))
56746                     .text(function(d) {
56747                         var action = (d.status === 'open' ? 'close' : 'open');
56748                         var andComment = (d.newComment ? '_comment' : '');
56749                         return t('note.' + action + andComment);
56750                     })
56751                     .on('click.status', clickStatus);
56752
56753                 buttonSection.select('.comment-button')   // select and propagate data
56754                     .attr('disabled', isSaveDisabled)
56755                     .on('click.comment', clickComment);
56756
56757
56758                 function isSaveDisabled(d) {
56759                     return (hasAuth && d.status === 'open' && d.newComment) ? null : true;
56760                 }
56761             }
56762
56763
56764
56765             function clickCancel(d) {
56766                 this.blur();    // avoid keeping focus on the button - #4641
56767                 var osm = services$1.osm;
56768                 if (osm) {
56769                     osm.removeNote(d);
56770                 }
56771                 context.enter(modeBrowse(context));
56772                 dispatch$1.call('change');
56773             }
56774
56775
56776             function clickSave(d) {
56777                 this.blur();    // avoid keeping focus on the button - #4641
56778                 var osm = services$1.osm;
56779                 if (osm) {
56780                     osm.postNoteCreate(d, function(err, note) {
56781                         dispatch$1.call('change', note);
56782                     });
56783                 }
56784             }
56785
56786
56787             function clickStatus(d) {
56788                 this.blur();    // avoid keeping focus on the button - #4641
56789                 var osm = services$1.osm;
56790                 if (osm) {
56791                     var setStatus = (d.status === 'open' ? 'closed' : 'open');
56792                     osm.postNoteUpdate(d, setStatus, function(err, note) {
56793                         dispatch$1.call('change', note);
56794                     });
56795                 }
56796             }
56797
56798             function clickComment(d) {
56799                 this.blur();    // avoid keeping focus on the button - #4641
56800                 var osm = services$1.osm;
56801                 if (osm) {
56802                     osm.postNoteUpdate(d, d.status, function(err, note) {
56803                         dispatch$1.call('change', note);
56804                     });
56805                 }
56806             }
56807
56808
56809             noteEditor.note = function(val) {
56810                 if (!arguments.length) return _note;
56811                 _note = val;
56812                 return noteEditor;
56813             };
56814
56815
56816             return utilRebind(noteEditor, dispatch$1, 'on');
56817         }
56818
56819         function modeSelectNote(context, selectedNoteID) {
56820             var mode = {
56821                 id: 'select-note',
56822                 button: 'browse'
56823             };
56824
56825             var osm = services$1.osm;
56826             var keybinding = utilKeybinding('select-note');
56827             var noteEditor = uiNoteEditor(context)
56828                 .on('change', function() {
56829                     context.map().pan([0,0]);  // trigger a redraw
56830                     var note = checkSelectedID();
56831                     if (!note) return;
56832                     context.ui().sidebar
56833                         .show(noteEditor.note(note));
56834                 });
56835
56836             var behaviors = [
56837                 behaviorBreathe(context),
56838                 behaviorHover(context),
56839                 behaviorSelect(context),
56840                 behaviorLasso(context),
56841                 modeDragNode(context).behavior,
56842                 modeDragNote(context).behavior
56843             ];
56844
56845             var newFeature = false;
56846
56847
56848             function checkSelectedID() {
56849                 if (!osm) return;
56850                 var note = osm.getNote(selectedNoteID);
56851                 if (!note) {
56852                     context.enter(modeBrowse(context));
56853                 }
56854                 return note;
56855             }
56856
56857
56858             // class the note as selected, or return to browse mode if the note is gone
56859             function selectNote(drawn) {
56860                 if (!checkSelectedID()) return;
56861
56862                 var selection = context.surface().selectAll('.layer-notes .note-' + selectedNoteID);
56863
56864                 if (selection.empty()) {
56865                     // Return to browse mode if selected DOM elements have
56866                     // disappeared because the user moved them out of view..
56867                     var source = event && event.type === 'zoom' && event.sourceEvent;
56868                     if (drawn && source && (source.type === 'mousemove' || source.type === 'touchmove')) {
56869                         context.enter(modeBrowse(context));
56870                     }
56871
56872                 } else {
56873                     selection
56874                         .classed('selected', true);
56875
56876                     context.selectedNoteID(selectedNoteID);
56877                 }
56878             }
56879
56880
56881             function esc() {
56882                 if (d3_select('.combobox').size()) return;
56883                 context.enter(modeBrowse(context));
56884             }
56885
56886
56887             mode.zoomToSelected = function() {
56888                 if (!osm) return;
56889                 var note = osm.getNote(selectedNoteID);
56890                 if (note) {
56891                     context.map().centerZoomEase(note.loc, 20);
56892                 }
56893             };
56894
56895
56896             mode.newFeature = function(val) {
56897                 if (!arguments.length) return newFeature;
56898                 newFeature = val;
56899                 return mode;
56900             };
56901
56902
56903             mode.enter = function() {
56904                 var note = checkSelectedID();
56905                 if (!note) return;
56906
56907                 behaviors.forEach(context.install);
56908
56909                 keybinding
56910                     .on(t('inspector.zoom_to.key'), mode.zoomToSelected)
56911                     .on('⎋', esc, true);
56912
56913                 d3_select(document)
56914                     .call(keybinding);
56915
56916                 selectNote();
56917
56918                 var sidebar = context.ui().sidebar;
56919                 sidebar.show(noteEditor.note(note));
56920
56921                 // expand the sidebar, avoid obscuring the note if needed
56922                 sidebar.expand(sidebar.intersects(note.extent()));
56923
56924                 context.map()
56925                     .on('drawn.select', selectNote);
56926             };
56927
56928
56929             mode.exit = function() {
56930                 behaviors.forEach(context.uninstall);
56931
56932                 d3_select(document)
56933                     .call(keybinding.unbind);
56934
56935                 context.surface()
56936                     .selectAll('.layer-notes .selected')
56937                     .classed('selected hover', false);
56938
56939                 context.map()
56940                     .on('drawn.select', null);
56941
56942                 context.ui().sidebar
56943                     .hide();
56944
56945                 context.selectedNoteID(null);
56946             };
56947
56948
56949             return mode;
56950         }
56951
56952         function modeDragNote(context) {
56953             var mode = {
56954                 id: 'drag-note',
56955                 button: 'browse'
56956             };
56957
56958             var edit = behaviorEdit(context);
56959
56960             var _nudgeInterval;
56961             var _lastLoc;
56962             var _note;    // most current note.. dragged note may have stale datum.
56963
56964
56965             function startNudge(nudge) {
56966                 if (_nudgeInterval) window.clearInterval(_nudgeInterval);
56967                 _nudgeInterval = window.setInterval(function() {
56968                     context.pan(nudge);
56969                     doMove(nudge);
56970                 }, 50);
56971             }
56972
56973
56974             function stopNudge() {
56975                 if (_nudgeInterval) {
56976                     window.clearInterval(_nudgeInterval);
56977                     _nudgeInterval = null;
56978                 }
56979             }
56980
56981
56982             function origin(note) {
56983                 return context.projection(note.loc);
56984             }
56985
56986
56987             function start(note) {
56988                 _note = note;
56989                 var osm = services$1.osm;
56990                 if (osm) {
56991                     // Get latest note from cache.. The marker may have a stale datum bound to it
56992                     // and dragging it around can sometimes delete the users note comment.
56993                     _note = osm.getNote(_note.id);
56994                 }
56995
56996                 context.surface().selectAll('.note-' + _note.id)
56997                     .classed('active', true);
56998
56999                 context.perform(actionNoop());
57000                 context.enter(mode);
57001                 context.selectedNoteID(_note.id);
57002             }
57003
57004
57005             function move() {
57006                 event.sourceEvent.stopPropagation();
57007                 _lastLoc = context.projection.invert(event.point);
57008
57009                 doMove();
57010                 var nudge = geoViewportEdge(event.point, context.map().dimensions());
57011                 if (nudge) {
57012                     startNudge(nudge);
57013                 } else {
57014                     stopNudge();
57015                 }
57016             }
57017
57018
57019             function doMove(nudge) {
57020                 nudge = nudge || [0, 0];
57021
57022                 var currPoint = (event && event.point) || context.projection(_lastLoc);
57023                 var currMouse = geoVecSubtract(currPoint, nudge);
57024                 var loc = context.projection.invert(currMouse);
57025
57026                 _note = _note.move(loc);
57027
57028                 var osm = services$1.osm;
57029                 if (osm) {
57030                     osm.replaceNote(_note);  // update note cache
57031                 }
57032
57033                 context.replace(actionNoop());   // trigger redraw
57034             }
57035
57036
57037             function end() {
57038                 context.replace(actionNoop());   // trigger redraw
57039
57040                 context
57041                     .selectedNoteID(_note.id)
57042                     .enter(modeSelectNote(context, _note.id));
57043             }
57044
57045
57046             var drag = behaviorDrag()
57047                 .selector('.layer-touch.markers .target.note.new')
57048                 .surface(d3_select('#map').node())
57049                 .origin(origin)
57050                 .on('start', start)
57051                 .on('move', move)
57052                 .on('end', end);
57053
57054
57055             mode.enter = function() {
57056                 context.install(edit);
57057             };
57058
57059
57060             mode.exit = function() {
57061                 context.ui().sidebar.hover.cancel();
57062                 context.uninstall(edit);
57063
57064                 context.surface()
57065                     .selectAll('.active')
57066                     .classed('active', false);
57067
57068                 stopNudge();
57069             };
57070
57071             mode.behavior = drag;
57072
57073             return mode;
57074         }
57075
57076         function uiDataHeader() {
57077             var _datum;
57078
57079
57080             function dataHeader(selection) {
57081                 var header = selection.selectAll('.data-header')
57082                     .data(
57083                         (_datum ? [_datum] : []),
57084                         function(d) { return d.__featurehash__; }
57085                     );
57086
57087                 header.exit()
57088                     .remove();
57089
57090                 var headerEnter = header.enter()
57091                     .append('div')
57092                     .attr('class', 'data-header');
57093
57094                 var iconEnter = headerEnter
57095                     .append('div')
57096                     .attr('class', 'data-header-icon');
57097
57098                 iconEnter
57099                     .append('div')
57100                     .attr('class', 'preset-icon-28')
57101                     .call(svgIcon('#iD-icon-data', 'note-fill'));
57102
57103                 headerEnter
57104                     .append('div')
57105                     .attr('class', 'data-header-label')
57106                     .text(t('map_data.layers.custom.title'));
57107             }
57108
57109
57110             dataHeader.datum = function(val) {
57111                 if (!arguments.length) return _datum;
57112                 _datum = val;
57113                 return this;
57114             };
57115
57116
57117             return dataHeader;
57118         }
57119
57120         // This code assumes that the combobox values will not have duplicate entries.
57121         // It is keyed on the `value` of the entry. Data should be an array of objects like:
57122         //   [{
57123         //       value:  'display text',  // required
57124         //       title:  'hover text'     // optional
57125         //   }, ...]
57126
57127         var _comboHideTimerID;
57128
57129         function uiCombobox(context, klass) {
57130             var dispatch$1 = dispatch('accept', 'cancel');
57131             var container = context.container();
57132
57133             var _suggestions = [];
57134             var _data = [];
57135             var _fetched = {};
57136             var _selected = null;
57137             var _canAutocomplete = true;
57138             var _caseSensitive = false;
57139             var _cancelFetch = false;
57140             var _minItems = 2;
57141             var _tDown = 0;
57142
57143             var _fetcher = function(val, cb) {
57144                 cb(_data.filter(function(d) {
57145                     return d.value
57146                         .toString()
57147                         .toLowerCase()
57148                         .indexOf(val.toLowerCase()) !== -1;
57149                 }));
57150             };
57151
57152             var combobox = function(input, attachTo) {
57153                 if (!input || input.empty()) return;
57154
57155                 input
57156                     .classed('combobox-input', true)
57157                     .on('focus.combo-input', focus)
57158                     .on('blur.combo-input', blur)
57159                     .on('keydown.combo-input', keydown)
57160                     .on('keyup.combo-input', keyup)
57161                     .on('input.combo-input', change)
57162                     .on('mousedown.combo-input', mousedown)
57163                     .each(function() {
57164                         var parent = this.parentNode;
57165                         var sibling = this.nextSibling;
57166
57167                         d3_select(parent).selectAll('.combobox-caret')
57168                             .filter(function(d) { return d === input.node(); })
57169                             .data([input.node()])
57170                             .enter()
57171                             .insert('div', function() { return sibling; })
57172                             .attr('class', 'combobox-caret')
57173                             .on('mousedown.combo-caret', function() {
57174                                 event.preventDefault(); // don't steal focus from input
57175                                 input.node().focus(); // focus the input as if it was clicked
57176                                 mousedown();
57177                             })
57178                             .on('mouseup.combo-caret', function() {
57179                                 event.preventDefault(); // don't steal focus from input
57180                                 mouseup();
57181                             });
57182                     });
57183
57184
57185                 function mousedown() {
57186                     if (event.button !== 0) return;    // left click only
57187                     _tDown = +new Date();
57188
57189                     // clear selection
57190                     var start = input.property('selectionStart');
57191                     var end = input.property('selectionEnd');
57192                     if (start !== end) {
57193                         var val = utilGetSetValue(input);
57194                         input.node().setSelectionRange(val.length, val.length);
57195                         return;
57196                     }
57197
57198                     input.on('mouseup.combo-input', mouseup);
57199                 }
57200
57201
57202                 function mouseup() {
57203                     input.on('mouseup.combo-input', null);
57204                     if (event.button !== 0) return;    // left click only
57205                     if (input.node() !== document.activeElement) return;   // exit if this input is not focused
57206
57207                     var start = input.property('selectionStart');
57208                     var end = input.property('selectionEnd');
57209                     if (start !== end) return;  // exit if user is selecting
57210
57211                     // not showing or showing for a different field - try to show it.
57212                     var combo = container.selectAll('.combobox');
57213                     if (combo.empty() || combo.datum() !== input.node()) {
57214                         var tOrig = _tDown;
57215                         window.setTimeout(function() {
57216                             if (tOrig !== _tDown) return;   // exit if user double clicked
57217                             fetchComboData('', function() {
57218                                 show();
57219                                 render();
57220                             });
57221                         }, 250);
57222
57223                     } else {
57224                         hide();
57225                     }
57226                 }
57227
57228
57229                 function focus() {
57230                     fetchComboData('');   // prefetch values (may warm taginfo cache)
57231                 }
57232
57233
57234                 function blur() {
57235                     _comboHideTimerID = window.setTimeout(hide, 75);
57236                 }
57237
57238
57239                 function show() {
57240                     hide();   // remove any existing
57241
57242                     container
57243                         .insert('div', ':first-child')
57244                         .datum(input.node())
57245                         .attr('class', 'combobox' + (klass ? ' combobox-' + klass : ''))
57246                         .style('position', 'absolute')
57247                         .style('display', 'block')
57248                         .style('left', '0px')
57249                         .on('mousedown.combo-container', function () {
57250                             // prevent moving focus out of the input field
57251                             event.preventDefault();
57252                         });
57253
57254                     d3_select('body')
57255                         .on('scroll.combo-scroll', render, true);
57256                 }
57257
57258
57259                 function hide() {
57260                     if (_comboHideTimerID) {
57261                         window.clearTimeout(_comboHideTimerID);
57262                         _comboHideTimerID = undefined;
57263                     }
57264
57265                     container.selectAll('.combobox')
57266                         .remove();
57267
57268                     d3_select('body')
57269                         .on('scroll.combo-scroll', null);
57270                 }
57271
57272
57273                 function keydown() {
57274                     var shown = !container.selectAll('.combobox').empty();
57275                     var tagName = input.node() ? input.node().tagName.toLowerCase() : '';
57276
57277                     switch (event.keyCode) {
57278                         case 8:   // ⌫ Backspace
57279                         case 46:  // ⌦ Delete
57280                             event.stopPropagation();
57281                             _selected = null;
57282                             render();
57283                             input.on('input.combo-input', function() {
57284                                 var start = input.property('selectionStart');
57285                                 input.node().setSelectionRange(start, start);
57286                                 input.on('input.combo-input', change);
57287                             });
57288                             break;
57289
57290                         case 9:   // ⇥ Tab
57291                             accept();
57292                             break;
57293
57294                         case 13:  // ↩ Return
57295                             event.preventDefault();
57296                             event.stopPropagation();
57297                             break;
57298
57299                         case 38:  // ↑ Up arrow
57300                             if (tagName === 'textarea' && !shown) return;
57301                             event.preventDefault();
57302                             if (tagName === 'input' && !shown) {
57303                                 show();
57304                             }
57305                             nav(-1);
57306                             break;
57307
57308                         case 40:  // ↓ Down arrow
57309                             if (tagName === 'textarea' && !shown) return;
57310                             event.preventDefault();
57311                             if (tagName === 'input' && !shown) {
57312                                 show();
57313                             }
57314                             nav(+1);
57315                             break;
57316                     }
57317                 }
57318
57319
57320                 function keyup() {
57321                     switch (event.keyCode) {
57322                         case 27:  // ⎋ Escape
57323                             cancel();
57324                             break;
57325
57326                         case 13:  // ↩ Return
57327                             accept();
57328                             break;
57329                     }
57330                 }
57331
57332
57333                 // Called whenever the input value is changed (e.g. on typing)
57334                 function change() {
57335                     fetchComboData(value(), function() {
57336                         _selected = null;
57337                         var val = input.property('value');
57338
57339                         if (_suggestions.length) {
57340                             if (input.property('selectionEnd') === val.length) {
57341                                 _selected = tryAutocomplete();
57342                             }
57343
57344                             if (!_selected) {
57345                                 _selected = val;
57346                             }
57347                         }
57348
57349                         if (val.length) {
57350                             var combo = container.selectAll('.combobox');
57351                             if (combo.empty()) {
57352                                 show();
57353                             }
57354                         } else {
57355                             hide();
57356                         }
57357
57358                         render();
57359                     });
57360                 }
57361
57362
57363                 // Called when the user presses up/down arrows to navigate the list
57364                 function nav(dir) {
57365                     if (_suggestions.length) {
57366                         // try to determine previously selected index..
57367                         var index = -1;
57368                         for (var i = 0; i < _suggestions.length; i++) {
57369                             if (_selected && _suggestions[i].value === _selected) {
57370                                 index = i;
57371                                 break;
57372                             }
57373                         }
57374
57375                         // pick new _selected
57376                         index = Math.max(Math.min(index + dir, _suggestions.length - 1), 0);
57377                         _selected = _suggestions[index].value;
57378                         input.property('value', _selected);
57379                     }
57380
57381                     render();
57382                     ensureVisible();
57383                 }
57384
57385
57386                 function ensureVisible() {
57387                     var combo = container.selectAll('.combobox');
57388                     if (combo.empty()) return;
57389
57390                     var containerRect = container.node().getBoundingClientRect();
57391                     var comboRect = combo.node().getBoundingClientRect();
57392
57393                     if (comboRect.bottom > containerRect.bottom) {
57394                         var node = attachTo ? attachTo.node() : input.node();
57395                         node.scrollIntoView({ behavior: 'instant', block: 'center' });
57396                         render();
57397                     }
57398
57399                     // https://stackoverflow.com/questions/11039885/scrollintoview-causing-the-whole-page-to-move
57400                     var selected = combo.selectAll('.combobox-option.selected').node();
57401                     if (selected) {
57402                         selected.scrollIntoView({ behavior: 'smooth', block: 'nearest' });
57403                     }
57404                 }
57405
57406
57407                 function value() {
57408                     var value = input.property('value');
57409                     var start = input.property('selectionStart');
57410                     var end = input.property('selectionEnd');
57411
57412                     if (start && end) {
57413                         value = value.substring(0, start);
57414                     }
57415
57416                     return value;
57417                 }
57418
57419
57420                 function fetchComboData(v, cb) {
57421                     _cancelFetch = false;
57422
57423                     _fetcher.call(input, v, function(results) {
57424                         // already chose a value, don't overwrite or autocomplete it
57425                         if (_cancelFetch) return;
57426
57427                         _suggestions = results;
57428                         results.forEach(function(d) { _fetched[d.value] = d; });
57429
57430                         if (cb) {
57431                             cb();
57432                         }
57433                     });
57434                 }
57435
57436
57437                 function tryAutocomplete() {
57438                     if (!_canAutocomplete) return;
57439
57440                     var val = _caseSensitive ? value() : value().toLowerCase();
57441                     if (!val) return;
57442
57443                     // Don't autocomplete if user is typing a number - #4935
57444                     if (!isNaN(parseFloat(val)) && isFinite(val)) return;
57445
57446                     var bestIndex = -1;
57447                     for (var i = 0; i < _suggestions.length; i++) {
57448                         var suggestion = _suggestions[i].value;
57449                         var compare = _caseSensitive ? suggestion : suggestion.toLowerCase();
57450
57451                         // if search string matches suggestion exactly, pick it..
57452                         if (compare === val) {
57453                             bestIndex = i;
57454                             break;
57455
57456                         // otherwise lock in the first result that starts with the search string..
57457                         } else if (bestIndex === -1 && compare.indexOf(val) === 0) {
57458                             bestIndex = i;
57459                         }
57460                     }
57461
57462                     if (bestIndex !== -1) {
57463                         var bestVal = _suggestions[bestIndex].value;
57464                         input.property('value', bestVal);
57465                         input.node().setSelectionRange(val.length, bestVal.length);
57466                         return bestVal;
57467                     }
57468                 }
57469
57470
57471                 function render() {
57472                     if (_suggestions.length < _minItems || document.activeElement !== input.node()) {
57473                         hide();
57474                         return;
57475                     }
57476
57477                     var shown = !container.selectAll('.combobox').empty();
57478                     if (!shown) return;
57479
57480                     var combo = container.selectAll('.combobox');
57481                     var options = combo.selectAll('.combobox-option')
57482                         .data(_suggestions, function(d) { return d.value; });
57483
57484                     options.exit()
57485                         .remove();
57486
57487                     // enter/update
57488                     options.enter()
57489                         .append('a')
57490                         .attr('class', 'combobox-option')
57491                         .attr('title', function(d) { return d.title; })
57492                         .text(function(d) { return d.display || d.value; })
57493                         .merge(options)
57494                         .classed('selected', function(d) { return d.value === _selected; })
57495                         .on('click.combo-option', accept)
57496                         .order();
57497
57498                     var node = attachTo ? attachTo.node() : input.node();
57499                     var rect = node.getBoundingClientRect();
57500
57501                     combo
57502                         .style('left', (rect.left + 5) + 'px')
57503                         .style('width', (rect.width - 10) + 'px')
57504                         .style('top', rect.height + rect.top + 'px');
57505                 }
57506
57507
57508                 // Dispatches an 'accept' event
57509                 // Then hides the combobox.
57510                 function accept(d) {
57511                     _cancelFetch = true;
57512                     var thiz = input.node();
57513
57514                     if (d) {   // user clicked on a suggestion
57515                         utilGetSetValue(input, d.value);    // replace field contents
57516                         utilTriggerEvent(input, 'change');
57517                     }
57518
57519                     // clear (and keep) selection
57520                     var val = utilGetSetValue(input);
57521                     thiz.setSelectionRange(val.length, val.length);
57522
57523                     d = _fetched[val];
57524                     dispatch$1.call('accept', thiz, d, val);
57525                     hide();
57526                 }
57527
57528
57529                 // Dispatches an 'cancel' event
57530                 // Then hides the combobox.
57531                 function cancel() {
57532                     _cancelFetch = true;
57533                     var thiz = input.node();
57534
57535                     // clear (and remove) selection, and replace field contents
57536                     var val = utilGetSetValue(input);
57537                     var start = input.property('selectionStart');
57538                     var end = input.property('selectionEnd');
57539                     val = val.slice(0, start) + val.slice(end);
57540                     utilGetSetValue(input, val);
57541                     thiz.setSelectionRange(val.length, val.length);
57542
57543                     dispatch$1.call('cancel', thiz);
57544                     hide();
57545                 }
57546
57547             };
57548
57549
57550             combobox.canAutocomplete = function(val) {
57551                 if (!arguments.length) return _canAutocomplete;
57552                 _canAutocomplete = val;
57553                 return combobox;
57554             };
57555
57556             combobox.caseSensitive = function(val) {
57557                 if (!arguments.length) return _caseSensitive;
57558                 _caseSensitive = val;
57559                 return combobox;
57560             };
57561
57562             combobox.data = function(val) {
57563                 if (!arguments.length) return _data;
57564                 _data = val;
57565                 return combobox;
57566             };
57567
57568             combobox.fetcher = function(val) {
57569                 if (!arguments.length) return _fetcher;
57570                 _fetcher = val;
57571                 return combobox;
57572             };
57573
57574             combobox.minItems = function(val) {
57575                 if (!arguments.length) return _minItems;
57576                 _minItems = val;
57577                 return combobox;
57578             };
57579
57580
57581             return utilRebind(combobox, dispatch$1, 'on');
57582         }
57583
57584
57585         uiCombobox.off = function(input) {
57586             input
57587                 .on('focus.combo-input', null)
57588                 .on('blur.combo-input', null)
57589                 .on('keydown.combo-input', null)
57590                 .on('keyup.combo-input', null)
57591                 .on('input.combo-input', null)
57592                 .on('mousedown.combo-input', null)
57593                 .on('mouseup.combo-input', null);
57594
57595
57596             d3_select('body')
57597                 .on('scroll.combo-scroll', null);
57598         };
57599
57600         // toggles the visibility of ui elements, using a combination of the
57601         // hide class, which sets display=none, and a d3 transition for opacity.
57602         // this will cause blinking when called repeatedly, so check that the
57603         // value actually changes between calls.
57604         function uiToggle(show, callback) {
57605             return function(selection) {
57606                 selection
57607                     .style('opacity', show ? 0 : 1)
57608                     .classed('hide', false)
57609                     .transition()
57610                     .style('opacity', show ? 1 : 0)
57611                     .on('end', function() {
57612                         d3_select(this)
57613                             .classed('hide', !show)
57614                             .style('opacity', null);
57615                         if (callback) callback.apply(this);
57616                     });
57617             };
57618         }
57619
57620         function uiDisclosure(context, key, expandedDefault) {
57621             var dispatch$1 = dispatch('toggled');
57622             var _preference = (context.storage('disclosure.' + key + '.expanded'));
57623             var _expanded = (_preference === null ? !!expandedDefault : (_preference === 'true'));
57624             var _title;
57625             var _updatePreference = true;
57626             var _content = function () {};
57627
57628
57629             var disclosure = function(selection) {
57630                 var hideToggle = selection.selectAll('.hide-toggle-' + key)
57631                     .data([0]);
57632
57633                 // enter
57634                 var hideToggleEnter = hideToggle.enter()
57635                     .append('a')
57636                     .attr('href', '#')
57637                     .attr('class', 'hide-toggle hide-toggle-' + key)
57638                     .call(svgIcon('', 'pre-text', 'hide-toggle-icon'));
57639
57640                 hideToggleEnter
57641                     .append('span')
57642                     .attr('class', 'hide-toggle-text');
57643
57644                 // update
57645                 hideToggle = hideToggleEnter
57646                     .merge(hideToggle);
57647
57648                 hideToggle
57649                     .on('click', toggle)
57650                     .classed('expanded', _expanded);
57651
57652                 hideToggle.selectAll('.hide-toggle-text')
57653                     .text(_title);
57654
57655                 hideToggle.selectAll('.hide-toggle-icon')
57656                     .attr('xlink:href', _expanded ? '#iD-icon-down'
57657                         : (textDirection === 'rtl') ? '#iD-icon-backward' : '#iD-icon-forward'
57658                     );
57659
57660
57661                 var wrap = selection.selectAll('.disclosure-wrap')
57662                     .data([0]);
57663
57664                 // enter/update
57665                 wrap = wrap.enter()
57666                     .append('div')
57667                     .attr('class', 'disclosure-wrap disclosure-wrap-' + key)
57668                     .merge(wrap)
57669                     .classed('hide', !_expanded);
57670
57671                 if (_expanded) {
57672                     wrap
57673                         .call(_content);
57674                 }
57675
57676
57677                 function toggle() {
57678                     event.preventDefault();
57679
57680                     _expanded = !_expanded;
57681
57682                     if (_updatePreference) {
57683                         context.storage('disclosure.' + key + '.expanded', _expanded);
57684                     }
57685
57686                     hideToggle
57687                         .classed('expanded', _expanded);
57688
57689                     hideToggle.selectAll('.hide-toggle-icon')
57690                         .attr('xlink:href', _expanded ? '#iD-icon-down'
57691                             : (textDirection === 'rtl') ? '#iD-icon-backward' : '#iD-icon-forward'
57692                         );
57693
57694                     wrap
57695                         .call(uiToggle(_expanded));
57696
57697                     if (_expanded) {
57698                         wrap
57699                             .call(_content);
57700                     }
57701
57702                     dispatch$1.call('toggled', this, _expanded);
57703                 }
57704             };
57705
57706
57707             disclosure.title = function(val) {
57708                 if (!arguments.length) return _title;
57709                 _title = val;
57710                 return disclosure;
57711             };
57712
57713
57714             disclosure.expanded = function(val) {
57715                 if (!arguments.length) return _expanded;
57716                 _expanded = val;
57717                 return disclosure;
57718             };
57719
57720
57721             disclosure.updatePreference = function(val) {
57722                 if (!arguments.length) return _updatePreference;
57723                 _updatePreference = val;
57724                 return disclosure;
57725             };
57726
57727
57728             disclosure.content = function(val) {
57729                 if (!arguments.length) return _content;
57730                 _content = val;
57731                 return disclosure;
57732             };
57733
57734
57735             return utilRebind(disclosure, dispatch$1, 'on');
57736         }
57737
57738         // Pass `which` object of the form:
57739         // {
57740         //   key: 'string',     // required
57741         //   value: 'string'    // optional
57742         // }
57743         //   -or-
57744         // {
57745         //   rtype: 'string'    // relation type  (e.g. 'multipolygon')
57746         // }
57747         //   -or-
57748         // {
57749         //   qid: 'string'      // brand wikidata  (e.g. 'Q37158')
57750         // }
57751         //
57752         function uiTagReference(what) {
57753             var wikibase = what.qid ? services$1.wikidata : services$1.osmWikibase;
57754             var tagReference = {};
57755
57756             var _button = d3_select(null);
57757             var _body = d3_select(null);
57758             var _loaded;
57759             var _showing;
57760
57761
57762             function load() {
57763                 if (!wikibase) return;
57764
57765                 _button
57766                     .classed('tag-reference-loading', true);
57767
57768                 wikibase.getDocs(what, gotDocs);
57769             }
57770
57771
57772             function gotDocs(err, docs) {
57773                 _body.html('');
57774
57775                 if (!docs || !docs.title) {
57776                     _body
57777                         .append('p')
57778                         .attr('class', 'tag-reference-description')
57779                         .text(t('inspector.no_documentation_key'));
57780                     done();
57781                     return;
57782                 }
57783
57784                 if (docs.imageURL) {
57785                     _body
57786                         .append('img')
57787                         .attr('class', 'tag-reference-wiki-image')
57788                         .attr('src', docs.imageURL)
57789                         .on('load', function() { done(); })
57790                         .on('error', function() { d3_select(this).remove(); done(); });
57791                 } else {
57792                     done();
57793                 }
57794
57795                 _body
57796                     .append('p')
57797                     .attr('class', 'tag-reference-description')
57798                     .text(docs.description || t('inspector.no_documentation_key'))
57799                     .append('a')
57800                     .attr('class', 'tag-reference-edit')
57801                     .attr('target', '_blank')
57802                     .attr('tabindex', -1)
57803                     .attr('title', t('inspector.edit_reference'))
57804                     .attr('href', docs.editURL)
57805                     .call(svgIcon('#iD-icon-edit', 'inline'));
57806
57807                 if (docs.wiki) {
57808                     _body
57809                       .append('a')
57810                       .attr('class', 'tag-reference-link')
57811                       .attr('target', '_blank')
57812                       .attr('tabindex', -1)
57813                       .attr('href', docs.wiki.url)
57814                       .call(svgIcon('#iD-icon-out-link', 'inline'))
57815                       .append('span')
57816                       .text(t(docs.wiki.text));
57817                 }
57818
57819                 // Add link to info about "good changeset comments" - #2923
57820                 if (what.key === 'comment') {
57821                     _body
57822                         .append('a')
57823                         .attr('class', 'tag-reference-comment-link')
57824                         .attr('target', '_blank')
57825                         .attr('tabindex', -1)
57826                         .call(svgIcon('#iD-icon-out-link', 'inline'))
57827                         .attr('href', t('commit.about_changeset_comments_link'))
57828                         .append('span')
57829                         .text(t('commit.about_changeset_comments'));
57830                 }
57831             }
57832
57833
57834             function done() {
57835                 _loaded = true;
57836
57837                 _button
57838                     .classed('tag-reference-loading', false);
57839
57840                 _body
57841                     .classed('expanded', true)
57842                     .transition()
57843                     .duration(200)
57844                     .style('max-height', '200px')
57845                     .style('opacity', '1');
57846
57847                 _showing = true;
57848
57849                 _button.selectAll('svg.icon use').each(function() {
57850                     var iconUse = d3_select(this);
57851                     if (iconUse.attr('href') === '#iD-icon-info') {
57852                         iconUse.attr('href', '#iD-icon-info-filled');
57853                     }
57854                 });
57855             }
57856
57857
57858             function hide() {
57859                 _body
57860                     .transition()
57861                     .duration(200)
57862                     .style('max-height', '0px')
57863                     .style('opacity', '0')
57864                     .on('end', function () {
57865                         _body.classed('expanded', false);
57866                     });
57867
57868                 _showing = false;
57869
57870                 _button.selectAll('svg.icon use').each(function() {
57871                     var iconUse = d3_select(this);
57872                     if (iconUse.attr('href') === '#iD-icon-info-filled') {
57873                         iconUse.attr('href', '#iD-icon-info');
57874                     }
57875                 });
57876
57877             }
57878
57879
57880             tagReference.button = function(selection, klass, iconName) {
57881                 _button = selection.selectAll('.tag-reference-button')
57882                     .data([0]);
57883
57884                 _button = _button.enter()
57885                     .append('button')
57886                     .attr('class', 'tag-reference-button ' + klass)
57887                     .attr('title', t('icons.information'))
57888                     .attr('tabindex', -1)
57889                     .call(svgIcon('#iD-icon-' + (iconName || 'inspect')))
57890                     .merge(_button);
57891
57892                 _button
57893                     .on('click', function () {
57894                         event.stopPropagation();
57895                         event.preventDefault();
57896                         this.blur();    // avoid keeping focus on the button - #4641
57897                         if (_showing) {
57898                             hide();
57899                         } else if (_loaded) {
57900                             done();
57901                         } else {
57902                             load();
57903                         }
57904                     });
57905             };
57906
57907
57908             tagReference.body = function(selection) {
57909                 var itemID = what.qid || what.rtype || (what.key + '-' + what.value);
57910                 _body = selection.selectAll('.tag-reference-body')
57911                     .data([itemID], function(d) { return d; });
57912
57913                 _body.exit()
57914                     .remove();
57915
57916                 _body = _body.enter()
57917                     .append('div')
57918                     .attr('class', 'tag-reference-body')
57919                     .style('max-height', '0')
57920                     .style('opacity', '0')
57921                     .merge(_body);
57922
57923                 if (_showing === false) {
57924                     hide();
57925                 }
57926             };
57927
57928
57929             tagReference.showing = function(val) {
57930                 if (!arguments.length) return _showing;
57931                 _showing = val;
57932                 return tagReference;
57933             };
57934
57935
57936             return tagReference;
57937         }
57938
57939         function uiRawTagEditor(context) {
57940             var taginfo = services$1.taginfo;
57941             var dispatch$1 = dispatch('change');
57942             var availableViews = [
57943                 { id: 'text', icon: '#fas-i-cursor' },
57944                 { id: 'list', icon: '#fas-th-list' }
57945             ];
57946
57947             var _tagView = (context.storage('raw-tag-editor-view') || 'list');   // 'list, 'text'
57948             var _readOnlyTags = [];
57949             var _indexedKeys = [];
57950             var _showBlank = false;
57951             var _updatePreference = true;
57952             var _expanded = false;
57953             var _pendingChange = null;
57954             var _state;
57955             var _preset;
57956             var _tags;
57957             var _entityID;
57958
57959
57960             function rawTagEditor(selection) {
57961                 var count = Object.keys(_tags).filter(function(d) { return d; }).length;
57962
57963                 var disclosure = uiDisclosure(context, 'raw_tag_editor', false)
57964                     .title(t('inspector.all_tags') + ' (' + count + ')')
57965                     .on('toggled', toggled)
57966                     .updatePreference(_updatePreference)
57967                     .content(content);
57968
57969                 // Sometimes we want to force the raw_tag_editor to be opened/closed..
57970                 // When undefined, uiDisclosure will use the user's stored preference.
57971                 if (_expanded !== undefined) {
57972                     disclosure.expanded(_expanded);
57973                 }
57974
57975                 selection.call(disclosure);
57976
57977                 function toggled(expanded) {
57978                     _expanded = expanded;
57979                     if (expanded) {
57980                         selection.node().parentNode.scrollTop += 200;
57981                     }
57982                 }
57983             }
57984
57985
57986             function content(wrap) {
57987                 // When switching to a different entity or changing the state (hover/select)
57988                 // reorder the keys alphabetically.
57989                 // We trigger this by emptying the `_indexedKeys` array, then it will be rebuilt here.
57990                 // Otherwise leave their order alone - #5857, #5927
57991                 var all = Object.keys(_tags).sort();
57992                 var known = _indexedKeys.map(function(t) { return t.key; });
57993                 var missing = utilArrayDifference(all, known);
57994                 for (var i = 0; i < missing.length; i++) {
57995                     _indexedKeys.push({ index: _indexedKeys.length, key: missing[i] });
57996                 }
57997
57998                 // assemble row data, excluding any deleted tags
57999                 var rowData = _indexedKeys.map(function(row) {
58000                     var v = _tags[row.key];
58001                     return (v === undefined) ? null : Object.assign(row, { value: v });
58002                 }).filter(Boolean);
58003
58004                 // append blank row last, if necessary
58005                 if (!_indexedKeys.length || _showBlank) {
58006                     _showBlank = false;
58007                     rowData.push({ index: _indexedKeys.length, key: '', value: '' });
58008                 }
58009
58010
58011                 // View Options
58012                 var options = wrap.selectAll('.raw-tag-options')
58013                     .data([0]);
58014
58015                 var optionsEnter = options.enter()
58016                     .append('div')
58017                     .attr('class', 'raw-tag-options');
58018
58019                 var optionEnter = optionsEnter.selectAll('.raw-tag-option')
58020                     .data(availableViews, function(d) { return d.id; })
58021                     .enter();
58022
58023                 optionEnter
58024                     .append('button')
58025                     .attr('class', function(d) {
58026                         return 'raw-tag-option raw-tag-option-' + d.id + (_tagView === d.id ? ' selected' : '');
58027                     })
58028                     .attr('title', function(d) { return d.id; })
58029                     .on('click', function(d) {
58030                         _tagView = d.id;
58031                         context.storage('raw-tag-editor-view', d.id);
58032
58033                         wrap.selectAll('.raw-tag-option')
58034                             .classed('selected', function(datum) { return datum === d; });
58035
58036                         wrap.selectAll('.tag-text')
58037                             .classed('hide', (d.id !== 'text'))
58038                             .each(setTextareaHeight);
58039
58040                         wrap.selectAll('.tag-list, .add-row')
58041                             .classed('hide', (d.id !== 'list'));
58042                     })
58043                     .each(function(d) {
58044                         d3_select(this)
58045                             .call(svgIcon(d.icon));
58046                     });
58047
58048
58049                 // View as Text
58050                 var textData = rowsToText(rowData);
58051                 var textarea = wrap.selectAll('.tag-text')
58052                     .data([0]);
58053
58054                 textarea = textarea.enter()
58055                     .append('textarea')
58056                     .attr('class', 'tag-text' + (_tagView !== 'text' ? ' hide' : ''))
58057                     .call(utilNoAuto)
58058                     .attr('spellcheck', 'false')
58059                     .merge(textarea);
58060
58061                 textarea
58062                     .call(utilGetSetValue, textData)
58063                     .each(setTextareaHeight)
58064                     .on('input', setTextareaHeight)
58065                     .on('blur', textChanged)
58066                     .on('change', textChanged);
58067
58068                 // If All Fields section is hidden, focus textarea and put cursor at end..
58069                 var fieldsExpanded = d3_select('.hide-toggle-preset_fields.expanded').size();
58070                 if (_state !== 'hover' && _tagView === 'text' && !fieldsExpanded) {
58071                     var element = textarea.node();
58072                     element.focus();
58073                     element.setSelectionRange(textData.length, textData.length);
58074                 }
58075
58076
58077                 // View as List
58078                 var list = wrap.selectAll('.tag-list')
58079                     .data([0]);
58080
58081                 list = list.enter()
58082                     .append('ul')
58083                     .attr('class', 'tag-list' + (_tagView !== 'list' ? ' hide' : ''))
58084                     .merge(list);
58085
58086
58087                 // Container for the Add button
58088                 var addRowEnter = wrap.selectAll('.add-row')
58089                     .data([0])
58090                     .enter()
58091                     .append('div')
58092                     .attr('class', 'add-row' + (_tagView !== 'list' ? ' hide' : ''));
58093
58094                 addRowEnter
58095                     .append('button')
58096                     .attr('class', 'add-tag')
58097                     .call(svgIcon('#iD-icon-plus', 'light'))
58098                     .on('click', addTag);
58099
58100                 addRowEnter
58101                     .append('div')
58102                     .attr('class', 'space-value');   // preserve space
58103
58104                 addRowEnter
58105                     .append('div')
58106                     .attr('class', 'space-buttons');  // preserve space
58107
58108
58109                 // Tag list items
58110                 var items = list.selectAll('.tag-row')
58111                     .data(rowData, function(d) { return d.key; });
58112
58113                 items.exit()
58114                     .each(unbind)
58115                     .remove();
58116
58117
58118                 // Enter
58119                 var itemsEnter = items.enter()
58120                     .append('li')
58121                     .attr('class', 'tag-row')
58122                     .classed('readonly', isReadOnly);
58123
58124                 var innerWrap = itemsEnter.append('div')
58125                     .attr('class', 'inner-wrap');
58126
58127                 innerWrap
58128                     .append('div')
58129                     .attr('class', 'key-wrap')
58130                     .append('input')
58131                     .property('type', 'text')
58132                     .attr('class', 'key')
58133                     .attr('maxlength', 255)
58134                     .call(utilNoAuto)
58135                     .on('blur', keyChange)
58136                     .on('change', keyChange);
58137
58138                 innerWrap
58139                     .append('div')
58140                     .attr('class', 'value-wrap')
58141                     .append('input')
58142                     .property('type', 'text')
58143                     .attr('class', 'value')
58144                     .attr('maxlength', 255)
58145                     .call(utilNoAuto)
58146                     .on('blur', valueChange)
58147                     .on('change', valueChange)
58148                     .on('keydown.push-more', pushMore);
58149
58150                 innerWrap
58151                     .append('button')
58152                     .attr('tabindex', -1)
58153                     .attr('class', 'form-field-button remove')
58154                     .attr('title', t('icons.remove'))
58155                     .call(svgIcon('#iD-operation-delete'));
58156
58157
58158                 // Update
58159                 items = items
58160                     .merge(itemsEnter)
58161                     .sort(function(a, b) { return a.index - b.index; });
58162
58163                 items
58164                     .each(function(d) {
58165                         var row = d3_select(this);
58166                         var key = row.select('input.key');      // propagate bound data
58167                         var value = row.select('input.value');  // propagate bound data
58168
58169                         if (_entityID && taginfo && _state !== 'hover') {
58170                             bindTypeahead(key, value);
58171                         }
58172
58173                         var isRelation = (_entityID && context.entity(_entityID).type === 'relation');
58174                         var reference;
58175
58176                         if (isRelation && d.key === 'type') {
58177                             reference = uiTagReference({ rtype: d.value }, context);
58178                         } else {
58179                             reference = uiTagReference({ key: d.key, value: d.value }, context);
58180                         }
58181
58182                         if (_state === 'hover') {
58183                             reference.showing(false);
58184                         }
58185
58186                         row.select('.inner-wrap')      // propagate bound data
58187                             .call(reference.button);
58188
58189                         row.call(reference.body);
58190
58191                         row.select('button.remove');   // propagate bound data
58192                     });
58193
58194                 items.selectAll('input.key')
58195                     .attr('title', function(d) { return d.key; })
58196                     .call(utilGetSetValue, function(d) { return d.key; })
58197                     .property('disabled', isReadOnly);
58198
58199                 items.selectAll('input.value')
58200                     .attr('title', function(d) { return d.value; })
58201                     .call(utilGetSetValue, function(d) { return d.value; })
58202                     .property('disabled', isReadOnly);
58203
58204                 items.selectAll('button.remove')
58205                     .on('mousedown', removeTag);  // 'click' fires too late - #5878
58206
58207
58208
58209                 function isReadOnly(d) {
58210                     for (var i = 0; i < _readOnlyTags.length; i++) {
58211                         if (d.key.match(_readOnlyTags[i]) !== null) {
58212                             return true;
58213                         }
58214                     }
58215                     return false;
58216                 }
58217
58218
58219                 function setTextareaHeight() {
58220                     if (_tagView !== 'text') return;
58221
58222                     var selection = d3_select(this);
58223                     selection.style('height', null);
58224                     selection.style('height', selection.node().scrollHeight + 5 + 'px');
58225                 }
58226
58227
58228                 function stringify(s) {
58229                     return JSON.stringify(s).slice(1, -1);   // without leading/trailing "
58230                 }
58231
58232                 function unstringify(s) {
58233                     var leading = '';
58234                     var trailing = '';
58235                     if (s.length < 1 || s.charAt(0) !== '"') {
58236                         leading = '"';
58237                     }
58238                     if (s.length < 2 || s.charAt(s.length - 1) !== '"' ||
58239                         (s.charAt(s.length - 1) === '"' && s.charAt(s.length - 2) === '\\')
58240                     ) {
58241                         trailing = '"';
58242                     }
58243                     return JSON.parse(leading + s + trailing);
58244                 }
58245
58246
58247                 function rowsToText(rows) {
58248                     var str = rows
58249                         .filter(function(row) { return row.key && row.key.trim() !== ''; })
58250                         .map(function(row) { return stringify(row.key) + '=' + stringify(row.value); })
58251                         .join('\n');
58252
58253                     return _state === 'hover' ? str : str + '\n';
58254                 }
58255
58256
58257                 function textChanged() {
58258                     var newText = this.value.trim();
58259                     var newTags = {};
58260                     newText.split('\n').forEach(function(row) {
58261                         var m = row.match(/^\s*([^=]+)=(.*)$/);
58262                         if (m !== null) {
58263                             var k = unstringify(m[1].trim());
58264                             var v = unstringify(m[2].trim());
58265                             newTags[k] = v;
58266                         }
58267                     });
58268
58269                     var tagDiff = utilTagDiff(_tags, newTags);
58270                     if (!tagDiff.length) return;
58271
58272                     _pendingChange  = _pendingChange || {};
58273
58274                     tagDiff.forEach(function(change) {
58275                         if (isReadOnly({ key: change.key })) return;
58276
58277                         if (change.type === '-') {
58278                             _pendingChange[change.key] = undefined;
58279                         } else if (change.type === '+') {
58280                             _pendingChange[change.key] = change.newVal || '';
58281                         }
58282                     });
58283
58284                     scheduleChange();
58285                 }
58286
58287
58288                 function pushMore() {
58289                     if (event.keyCode === 9 && !event.shiftKey &&
58290                         list.selectAll('li:last-child input.value').node() === this) {
58291                         addTag();
58292                     }
58293                 }
58294
58295
58296                 function bindTypeahead(key, value) {
58297                     if (isReadOnly(key.datum())) return;
58298
58299                     var geometry = context.geometry(_entityID);
58300
58301                     key.call(uiCombobox(context, 'tag-key')
58302                         .fetcher(function(value, callback) {
58303                             taginfo.keys({
58304                                 debounce: true,
58305                                 geometry: geometry,
58306                                 query: value
58307                             }, function(err, data) {
58308                                 if (!err) {
58309                                     var filtered = data.filter(function(d) { return _tags[d.value] === undefined; });
58310                                     callback(sort(value, filtered));
58311                                 }
58312                             });
58313                         }));
58314
58315                     value.call(uiCombobox(context, 'tag-value')
58316                         .fetcher(function(value, callback) {
58317                             taginfo.values({
58318                                 debounce: true,
58319                                 key: utilGetSetValue(key),
58320                                 geometry: geometry,
58321                                 query: value
58322                             }, function(err, data) {
58323                                 if (!err) callback(sort(value, data));
58324                             });
58325                         }));
58326
58327
58328                     function sort(value, data) {
58329                         var sameletter = [];
58330                         var other = [];
58331                         for (var i = 0; i < data.length; i++) {
58332                             if (data[i].value.substring(0, value.length) === value) {
58333                                 sameletter.push(data[i]);
58334                             } else {
58335                                 other.push(data[i]);
58336                             }
58337                         }
58338                         return sameletter.concat(other);
58339                     }
58340                 }
58341
58342
58343                 function unbind() {
58344                     var row = d3_select(this);
58345
58346                     row.selectAll('input.key')
58347                         .call(uiCombobox.off);
58348
58349                     row.selectAll('input.value')
58350                         .call(uiCombobox.off);
58351                 }
58352
58353
58354                 function keyChange(d) {
58355                     var kOld = d.key;
58356                     var kNew = this.value.trim();
58357                     var row = this.parentNode.parentNode;
58358                     var inputVal = d3_select(row).selectAll('input.value');
58359                     var vNew = utilGetSetValue(inputVal);
58360
58361                     // allow no change if the key should be readonly
58362                     if (isReadOnly({ key: kNew })) {
58363                         this.value = kOld;
58364                         return;
58365                     }
58366
58367                     // switch focus if key is already in use
58368                     if (kNew && kNew !== kOld) {
58369                         if (_tags[kNew] !== undefined) {      // new key is already in use
58370                             this.value = kOld;                // reset the key
58371                             list.selectAll('input.value')
58372                                 .each(function(d) {
58373                                     if (d.key === kNew) {     // send focus to that other value combo instead
58374                                         var input = d3_select(this).node();
58375                                         input.focus();
58376                                         input.select();
58377                                     }
58378                                 });
58379                             return;
58380                         }
58381                     }
58382
58383                     _pendingChange  = _pendingChange || {};
58384
58385                     // exit if we are currently about to delete this row anyway - #6366
58386                     if (_pendingChange.hasOwnProperty(d.key) && _pendingChange[d.key] === undefined) return;
58387
58388                     if (kOld) {
58389                         _pendingChange[kOld] = undefined;
58390                     }
58391
58392                     _pendingChange[kNew] = vNew;
58393
58394                     d.key = kNew;    // update datum to avoid exit/enter on tag update
58395                     d.value = vNew;
58396
58397                     this.value = kNew;
58398                     utilGetSetValue(inputVal, vNew);
58399                     scheduleChange();
58400                 }
58401
58402
58403                 function valueChange(d) {
58404                     if (isReadOnly(d)) return;
58405
58406                     _pendingChange  = _pendingChange || {};
58407
58408                     // exit if we are currently about to delete this row anyway - #6366
58409                     if (_pendingChange.hasOwnProperty(d.key) && _pendingChange[d.key] === undefined) return;
58410
58411                     _pendingChange[d.key] = this.value;
58412                     scheduleChange();
58413                 }
58414
58415
58416                 function removeTag(d) {
58417                     if (isReadOnly(d)) return;
58418
58419                     if (d.key === '') {    // removing the blank row
58420                         _showBlank = false;
58421                         content(wrap);
58422
58423                     } else {
58424                         // remove from indexedKeys too, so that if the user puts it back,
58425                         // it will be sorted to the end and not back to its original position
58426                         _indexedKeys = _indexedKeys.filter(function(row) { return row.key !== d.key; });
58427
58428                         _pendingChange  = _pendingChange || {};
58429                         _pendingChange[d.key] = undefined;
58430                         scheduleChange();
58431                     }
58432                 }
58433
58434
58435                 function addTag() {
58436                     // Delay render in case this click is blurring an edited combo.
58437                     // Without the setTimeout, the `content` render would wipe out the pending tag change.
58438                     window.setTimeout(function() {
58439                         _showBlank = true;
58440                         content(wrap);
58441                         list.selectAll('li:last-child input.key').node().focus();
58442                     }, 20);
58443                 }
58444
58445
58446                 function scheduleChange() {
58447                     // Delay change in case this change is blurring an edited combo. - #5878
58448                     window.setTimeout(function() {
58449                         dispatch$1.call('change', this, _pendingChange);
58450                         _pendingChange = null;
58451                     }, 10);
58452                 }
58453
58454             }
58455
58456
58457             rawTagEditor.state = function(val) {
58458                 if (!arguments.length) return _state;
58459                 if (_state !== val) {
58460                     _indexedKeys = [];
58461                     _state = val;
58462                 }
58463                 return rawTagEditor;
58464             };
58465
58466
58467             rawTagEditor.preset = function(val) {
58468                 if (!arguments.length) return _preset;
58469                 _preset = val;
58470                 if (_preset.isFallback()) {
58471                     _expanded = true;
58472                     _updatePreference = false;
58473                 } else {
58474                     _expanded = undefined;
58475                     _updatePreference = true;
58476                 }
58477                 return rawTagEditor;
58478             };
58479
58480
58481             rawTagEditor.tags = function(val) {
58482                 if (!arguments.length) return _tags;
58483                 _tags = val;
58484                 return rawTagEditor;
58485             };
58486
58487
58488             rawTagEditor.entityID = function(val) {
58489                 if (!arguments.length) return _entityID;
58490                 if (_entityID !== val) {
58491                     _indexedKeys = [];
58492                     _entityID = val;
58493                 }
58494                 return rawTagEditor;
58495             };
58496
58497
58498             rawTagEditor.expanded = function(val) {
58499                 if (!arguments.length) return _expanded;
58500                 _expanded = val;
58501                 _updatePreference = false;
58502                 return rawTagEditor;
58503             };
58504
58505
58506             // pass an array of regular expressions to test against the tag key
58507             rawTagEditor.readOnlyTags = function(val) {
58508                 if (!arguments.length) return _readOnlyTags;
58509                 _readOnlyTags = val;
58510                 return rawTagEditor;
58511             };
58512
58513
58514             return utilRebind(rawTagEditor, dispatch$1, 'on');
58515         }
58516
58517         function uiDataEditor(context) {
58518             var dataHeader = uiDataHeader();
58519             var quickLinks = uiQuickLinks();
58520             var rawTagEditor = uiRawTagEditor(context);
58521             var _datum;
58522
58523
58524             function dataEditor(selection) {
58525                 // quick links
58526                 var choices = [{
58527                     id: 'zoom_to',
58528                     label: 'inspector.zoom_to.title',
58529                     tooltip: function() {
58530                         return uiTooltipHtml(t('inspector.zoom_to.tooltip_data'), t('inspector.zoom_to.key'));
58531                     },
58532                     click: function zoomTo() {
58533                         context.mode().zoomToSelected();
58534                     }
58535                 }];
58536
58537
58538                 var header = selection.selectAll('.header')
58539                     .data([0]);
58540
58541                 var headerEnter = header.enter()
58542                     .append('div')
58543                     .attr('class', 'header fillL');
58544
58545                 headerEnter
58546                     .append('button')
58547                     .attr('class', 'fr data-editor-close')
58548                     .on('click', function() {
58549                         context.enter(modeBrowse(context));
58550                     })
58551                     .call(svgIcon('#iD-icon-close'));
58552
58553                 headerEnter
58554                     .append('h3')
58555                     .text(t('map_data.title'));
58556
58557
58558                 var body = selection.selectAll('.body')
58559                     .data([0]);
58560
58561                 body = body.enter()
58562                     .append('div')
58563                     .attr('class', 'body')
58564                     .merge(body);
58565
58566                 var editor = body.selectAll('.data-editor')
58567                     .data([0]);
58568
58569                 editor.enter()
58570                     .append('div')
58571                     .attr('class', 'modal-section data-editor')
58572                     .merge(editor)
58573                     .call(dataHeader.datum(_datum))
58574                     .call(quickLinks.choices(choices));
58575
58576                 var rte = body.selectAll('.raw-tag-editor')
58577                     .data([0]);
58578
58579                 rte.enter()
58580                     .append('div')
58581                     .attr('class', 'raw-tag-editor inspector-inner data-editor')
58582                     .merge(rte)
58583                     .call(rawTagEditor
58584                         .expanded(true)
58585                         .readOnlyTags([/./])
58586                         .tags((_datum && _datum.properties) || {})
58587                         .state('hover')
58588                     );
58589             }
58590
58591
58592             dataEditor.datum = function(val) {
58593                 if (!arguments.length) return _datum;
58594                 _datum = val;
58595                 return this;
58596             };
58597
58598
58599             return dataEditor;
58600         }
58601
58602         function modeSelectData(context, selectedDatum) {
58603             var mode = {
58604                 id: 'select-data',
58605                 button: 'browse'
58606             };
58607
58608             var keybinding = utilKeybinding('select-data');
58609             var dataEditor = uiDataEditor(context);
58610
58611             var behaviors = [
58612                 behaviorBreathe(context),
58613                 behaviorHover(context),
58614                 behaviorSelect(context),
58615                 behaviorLasso(context),
58616                 modeDragNode(context).behavior,
58617                 modeDragNote(context).behavior
58618             ];
58619
58620
58621             // class the data as selected, or return to browse mode if the data is gone
58622             function selectData(drawn) {
58623                 var selection = context.surface().selectAll('.layer-mapdata .data' + selectedDatum.__featurehash__);
58624
58625                 if (selection.empty()) {
58626                     // Return to browse mode if selected DOM elements have
58627                     // disappeared because the user moved them out of view..
58628                     var source = event && event.type === 'zoom' && event.sourceEvent;
58629                     if (drawn && source && (source.type === 'mousemove' || source.type === 'touchmove')) {
58630                         context.enter(modeBrowse(context));
58631                     }
58632                 } else {
58633                     selection.classed('selected', true);
58634                 }
58635             }
58636
58637
58638             function esc() {
58639                 if (d3_select('.combobox').size()) return;
58640                 context.enter(modeBrowse(context));
58641             }
58642
58643
58644             mode.zoomToSelected = function() {
58645                 var extent = geoExtent(d3_geoBounds(selectedDatum));
58646                 context.map().centerZoomEase(extent.center(), context.map().trimmedExtentZoom(extent));
58647             };
58648
58649
58650             mode.enter = function() {
58651                 behaviors.forEach(context.install);
58652
58653                 keybinding
58654                     .on(t('inspector.zoom_to.key'), mode.zoomToSelected)
58655                     .on('⎋', esc, true);
58656
58657                 d3_select(document)
58658                     .call(keybinding);
58659
58660                 selectData();
58661
58662                 var sidebar = context.ui().sidebar;
58663                 sidebar.show(dataEditor.datum(selectedDatum));
58664
58665                 // expand the sidebar, avoid obscuring the data if needed
58666                 var extent = geoExtent(d3_geoBounds(selectedDatum));
58667                 sidebar.expand(sidebar.intersects(extent));
58668
58669                 context.map()
58670                     .on('drawn.select-data', selectData);
58671             };
58672
58673
58674             mode.exit = function() {
58675                 behaviors.forEach(context.uninstall);
58676
58677                 d3_select(document)
58678                     .call(keybinding.unbind);
58679
58680                 context.surface()
58681                     .selectAll('.layer-mapdata .selected')
58682                     .classed('selected hover', false);
58683
58684                 context.map()
58685                     .on('drawn.select-data', null);
58686
58687                 context.ui().sidebar
58688                     .hide();
58689             };
58690
58691
58692             return mode;
58693         }
58694
58695         function uiImproveOsmComments() {
58696             var _error;
58697
58698
58699             function errorComments(selection) {
58700                 // make the div immediately so it appears above the buttons
58701                 var comments = selection.selectAll('.comments-container')
58702                     .data([0]);
58703
58704                 comments = comments.enter()
58705                     .append('div')
58706                     .attr('class', 'comments-container')
58707                     .merge(comments);
58708
58709                 // must retrieve comments from API before they can be displayed
58710                 services$1.improveOSM.getComments(_error, function(err, d) {
58711                     if (!d.comments) { return; } // nothing to do here
58712
58713                     var commentEnter = comments.selectAll('.comment')
58714                         .data(d.comments)
58715                         .enter()
58716                         .append('div')
58717                         .attr('class', 'comment');
58718
58719                     commentEnter
58720                         .append('div')
58721                         .attr('class', 'comment-avatar')
58722                         .call(svgIcon('#iD-icon-avatar', 'comment-avatar-icon'));
58723
58724                     var mainEnter = commentEnter
58725                         .append('div')
58726                         .attr('class', 'comment-main');
58727
58728                     var metadataEnter = mainEnter
58729                         .append('div')
58730                         .attr('class', 'comment-metadata');
58731
58732                     metadataEnter
58733                         .append('div')
58734                         .attr('class', 'comment-author')
58735                         .each(function(d) {
58736                             var selection = d3_select(this);
58737                             var osm = services$1.osm;
58738                             if (osm && d.username) {
58739                                 selection = selection
58740                                     .append('a')
58741                                     .attr('class', 'comment-author-link')
58742                                     .attr('href', osm.userURL(d.username))
58743                                     .attr('tabindex', -1)
58744                                     .attr('target', '_blank');
58745                             }
58746                             selection
58747                                 .text(function(d) { return d.username; });
58748                         });
58749
58750                     metadataEnter
58751                         .append('div')
58752                         .attr('class', 'comment-date')
58753                         .text(function(d) {
58754                             return t('note.status.commented', { when: localeDateString(d.timestamp) });
58755                         });
58756
58757                     mainEnter
58758                         .append('div')
58759                         .attr('class', 'comment-text')
58760                         .append('p')
58761                         .text(function(d) { return d.text; });
58762                 });
58763             }
58764
58765             function localeDateString(s) {
58766                 if (!s) return null;
58767                 var detected = utilDetect();
58768                 var options = { day: 'numeric', month: 'short', year: 'numeric' };
58769                 var d = new Date(s * 1000); // timestamp is served in seconds, date takes ms
58770                 if (isNaN(d.getTime())) return null;
58771                 return d.toLocaleDateString(detected.locale, options);
58772             }
58773
58774             errorComments.error = function(val) {
58775                 if (!arguments.length) return _error;
58776                 _error = val;
58777                 return errorComments;
58778             };
58779
58780             return errorComments;
58781         }
58782
58783         function uiImproveOsmDetails(context) {
58784             var _error;
58785
58786
58787             function errorDetail(d) {
58788                 var unknown = t('inspector.unknown');
58789
58790                 if (!d) return unknown;
58791
58792                 if (d.desc) return d.desc;
58793
58794                 var errorType = d.error_key;
58795                 var et = en.QA.improveOSM.error_types[errorType];
58796
58797                 var detail;
58798                 if (et && et.description) {
58799                     detail = t('QA.improveOSM.error_types.' + errorType + '.description', d.replacements);
58800                 } else {
58801                     detail = unknown;
58802                 }
58803
58804                 return detail;
58805             }
58806
58807
58808             function improveOsmDetails(selection) {
58809                 var details = selection.selectAll('.error-details')
58810                     .data(
58811                         (_error ? [_error] : []),
58812                         function(d) { return d.id + '-' + (d.status || 0); }
58813                     );
58814
58815                 details.exit()
58816                     .remove();
58817
58818                 var detailsEnter = details.enter()
58819                     .append('div')
58820                     .attr('class', 'error-details error-details-container');
58821
58822
58823                 // description
58824                 var descriptionEnter = detailsEnter
58825                     .append('div')
58826                     .attr('class', 'error-details-description');
58827
58828                 descriptionEnter
58829                     .append('h4')
58830                     .text(function() { return t('QA.keepRight.detail_description'); });
58831
58832                 descriptionEnter
58833                     .append('div')
58834                     .attr('class', 'error-details-description-text')
58835                     .html(errorDetail);
58836
58837                 // If there are entity links in the error message..
58838                 var relatedEntities = [];
58839                 descriptionEnter.selectAll('.error_entity_link, .error_object_link')
58840                     .each(function() {
58841                         var link = d3_select(this);
58842                         var isObjectLink = link.classed('error_object_link');
58843                         var entityID = isObjectLink ?
58844                             (utilEntityRoot(_error.object_type) + _error.object_id)
58845                             : this.textContent;
58846                         var entity = context.hasEntity(entityID);
58847
58848                         relatedEntities.push(entityID);
58849
58850                         // Add click handler
58851                         link
58852                             .on('mouseover', function() {
58853                                 context.surface().selectAll(utilEntityOrMemberSelector([entityID], context.graph()))
58854                                     .classed('hover', true);
58855                             })
58856                             .on('mouseout', function() {
58857                                 context.surface().selectAll('.hover')
58858                                     .classed('hover', false);
58859                             })
58860                             .on('click', function() {
58861                                 event.preventDefault();
58862                                 var osmlayer = context.layers().layer('osm');
58863                                 if (!osmlayer.enabled()) {
58864                                     osmlayer.enabled(true);
58865                                 }
58866
58867                                 context.map().centerZoom(_error.loc, 20);
58868
58869                                 if (entity) {
58870                                     context.enter(modeSelect(context, [entityID]));
58871                                 } else {
58872                                     context.loadEntity(entityID, function() {
58873                                         context.enter(modeSelect(context, [entityID]));
58874                                     });
58875                                 }
58876                             });
58877
58878                         // Replace with friendly name if possible
58879                         // (The entity may not yet be loaded into the graph)
58880                         if (entity) {
58881                             var name = utilDisplayName(entity);  // try to use common name
58882
58883                             if (!name && !isObjectLink) {
58884                                 var preset = context.presets().match(entity, context.graph());
58885                                 name = preset && !preset.isFallback() && preset.name();  // fallback to preset name
58886                             }
58887
58888                             if (name) {
58889                                 this.innerText = name;
58890                             }
58891                         }
58892                     });
58893
58894                 // Don't hide entities related to this error - #5880
58895                 context.features().forceVisible(relatedEntities);
58896             }
58897
58898
58899             improveOsmDetails.error = function(val) {
58900                 if (!arguments.length) return _error;
58901                 _error = val;
58902                 return improveOsmDetails;
58903             };
58904
58905
58906             return improveOsmDetails;
58907         }
58908
58909         function uiImproveOsmHeader() {
58910             var _error;
58911
58912
58913             function errorTitle(d) {
58914                 var unknown = t('inspector.unknown');
58915
58916                 if (!d) return unknown;
58917                 var errorType = d.error_key;
58918                 var et = en.QA.improveOSM.error_types[errorType];
58919
58920                 if (et && et.title) {
58921                     return t('QA.improveOSM.error_types.' + errorType + '.title');
58922                 } else {
58923                     return unknown;
58924                 }
58925             }
58926
58927
58928             function improveOsmHeader(selection) {
58929                 var header = selection.selectAll('.error-header')
58930                     .data(
58931                         (_error ? [_error] : []),
58932                         function(d) { return d.id + '-' + (d.status || 0); }
58933                     );
58934
58935                 header.exit()
58936                     .remove();
58937
58938                 var headerEnter = header.enter()
58939                     .append('div')
58940                     .attr('class', 'error-header');
58941
58942                 var iconEnter = headerEnter
58943                     .append('div')
58944                     .attr('class', 'error-header-icon')
58945                     .classed('new', function(d) { return d.id < 0; });
58946
58947                 var svgEnter = iconEnter
58948                     .append('svg')
58949                     .attr('width', '20px')
58950                     .attr('height', '30px')
58951                     .attr('viewbox', '0 0 20 30')
58952                     .attr('class', function(d) {
58953                         return [
58954                             'preset-icon-28',
58955                             'qa_error',
58956                             d.service,
58957                             'error_id-' + d.id,
58958                             'error_type-' + d.error_type,
58959                             'category-' + d.category
58960                         ].join(' ');
58961                     });
58962
58963                 svgEnter
58964                     .append('polygon')
58965                     .attr('fill', 'currentColor')
58966                     .attr('class', 'qa_error-fill')
58967                     .attr('points', '16,3 4,3 1,6 1,17 4,20 7,20 10,27 13,20 16,20 19,17.033 19,6');
58968
58969                 svgEnter
58970                     .append('use')
58971                     .attr('class', 'icon-annotation')
58972                     .attr('width', '11px')
58973                     .attr('height', '11px')
58974                     .attr('transform', 'translate(4.5, 7)')
58975                     .attr('xlink:href', function(d) {
58976                         var picon = d.icon;
58977
58978                         if (!picon) {
58979                             return '';
58980                         } else {
58981                             var isMaki = /^maki-/.test(picon);
58982                             return '#' + picon + (isMaki ? '-11' : '');
58983                         }
58984                     });
58985
58986                 headerEnter
58987                     .append('div')
58988                     .attr('class', 'error-header-label')
58989                     .text(errorTitle);
58990             }
58991
58992
58993             improveOsmHeader.error = function(val) {
58994                 if (!arguments.length) return _error;
58995                 _error = val;
58996                 return improveOsmHeader;
58997             };
58998
58999
59000             return improveOsmHeader;
59001         }
59002
59003         function uiImproveOsmEditor(context) {
59004             var dispatch$1 = dispatch('change');
59005             var errorDetails = uiImproveOsmDetails(context);
59006             var errorComments = uiImproveOsmComments(context);
59007             var errorHeader = uiImproveOsmHeader(context);
59008             var quickLinks = uiQuickLinks();
59009
59010             var _error;
59011
59012
59013             function improveOsmEditor(selection) {
59014                 // quick links
59015                 var choices = [{
59016                     id: 'zoom_to',
59017                     label: 'inspector.zoom_to.title',
59018                     tooltip: function() {
59019                         return uiTooltipHtml(t('inspector.zoom_to.tooltip_issue'), t('inspector.zoom_to.key'));
59020                     },
59021                     click: function zoomTo() {
59022                         context.mode().zoomToSelected();
59023                     }
59024                 }];
59025
59026
59027                 var header = selection.selectAll('.header')
59028                     .data([0]);
59029
59030                 var headerEnter = header.enter()
59031                     .append('div')
59032                     .attr('class', 'header fillL');
59033
59034                 headerEnter
59035                     .append('button')
59036                     .attr('class', 'fr error-editor-close')
59037                     .on('click', function() {
59038                         context.enter(modeBrowse(context));
59039                     })
59040                     .call(svgIcon('#iD-icon-close'));
59041
59042                 headerEnter
59043                     .append('h3')
59044                     .text(t('QA.improveOSM.title'));
59045
59046
59047                 var body = selection.selectAll('.body')
59048                     .data([0]);
59049
59050                 body = body.enter()
59051                     .append('div')
59052                     .attr('class', 'body')
59053                     .merge(body);
59054
59055                 var editor = body.selectAll('.error-editor')
59056                     .data([0]);
59057
59058                 editor.enter()
59059                     .append('div')
59060                     .attr('class', 'modal-section error-editor')
59061                     .merge(editor)
59062                     .call(errorHeader.error(_error))
59063                     .call(quickLinks.choices(choices))
59064                     .call(errorDetails.error(_error))
59065                     .call(errorComments.error(_error))
59066                     .call(improveOsmSaveSection);
59067             }
59068
59069             function improveOsmSaveSection(selection) {
59070                 var isSelected = (_error && _error.id === context.selectedErrorID());
59071                 var isShown = (_error && (isSelected || _error.newComment || _error.comment));
59072                 var saveSection = selection.selectAll('.error-save')
59073                     .data(
59074                         (isShown ? [_error] : []),
59075                         function(d) { return d.id + '-' + (d.status || 0); }
59076                     );
59077
59078                 // exit
59079                 saveSection.exit()
59080                     .remove();
59081
59082                 // enter
59083                 var saveSectionEnter = saveSection.enter()
59084                     .append('div')
59085                     .attr('class', 'error-save save-section cf');
59086
59087                 saveSectionEnter
59088                     .append('h4')
59089                     .attr('class', '.error-save-header')
59090                     .text(t('note.newComment'));
59091
59092                 saveSectionEnter
59093                     .append('textarea')
59094                     .attr('class', 'new-comment-input')
59095                     .attr('placeholder', t('QA.keepRight.comment_placeholder'))
59096                     .attr('maxlength', 1000)
59097                     .property('value', function(d) { return d.newComment; })
59098                     .call(utilNoAuto)
59099                     .on('input', changeInput)
59100                     .on('blur', changeInput);
59101
59102                 // update
59103                 saveSection = saveSectionEnter
59104                     .merge(saveSection)
59105                     .call(errorSaveButtons);
59106
59107                 function changeInput() {
59108                     var input = d3_select(this);
59109                     var val = input.property('value').trim();
59110
59111                     if (val === '') {
59112                         val = undefined;
59113                     }
59114
59115                     // store the unsaved comment with the error itself
59116                     _error = _error.update({ newComment: val });
59117
59118                     var errorService = services$1.improveOSM;
59119                     if (errorService) {
59120                         errorService.replaceError(_error);
59121                     }
59122
59123                     saveSection
59124                         .call(errorSaveButtons);
59125                 }
59126             }
59127
59128             function errorSaveButtons(selection) {
59129                 var isSelected = (_error && _error.id === context.selectedErrorID());
59130                 var buttonSection = selection.selectAll('.buttons')
59131                     .data((isSelected ? [_error] : []), function(d) { return d.status + d.id; });
59132
59133                 // exit
59134                 buttonSection.exit()
59135                     .remove();
59136
59137                 // enter
59138                 var buttonEnter = buttonSection.enter()
59139                     .append('div')
59140                     .attr('class', 'buttons');
59141
59142                 buttonEnter
59143                     .append('button')
59144                     .attr('class', 'button comment-button action')
59145                     .text(t('QA.keepRight.save_comment'));
59146
59147                 buttonEnter
59148                     .append('button')
59149                     .attr('class', 'button close-button action');
59150
59151                 buttonEnter
59152                     .append('button')
59153                     .attr('class', 'button ignore-button action');
59154
59155
59156                 // update
59157                 buttonSection = buttonSection
59158                     .merge(buttonEnter);
59159
59160                 buttonSection.select('.comment-button')
59161                     .attr('disabled', function(d) {
59162                         return d.newComment === undefined ? true : null;
59163                     })
59164                     .on('click.comment', function(d) {
59165                         this.blur();    // avoid keeping focus on the button - #4641
59166                         var errorService = services$1.improveOSM;
59167                         if (errorService) {
59168                             errorService.postUpdate(d, function(err, error) {
59169                                 dispatch$1.call('change', error);
59170                             });
59171                         }
59172                     });
59173
59174                 buttonSection.select('.close-button')
59175                     .text(function(d) {
59176                         var andComment = (d.newComment !== undefined ? '_comment' : '');
59177                         return t('QA.keepRight.close' + andComment);
59178                     })
59179                     .on('click.close', function(d) {
59180                         this.blur();    // avoid keeping focus on the button - #4641
59181                         var errorService = services$1.improveOSM;
59182                         if (errorService) {
59183                             d.newStatus = 'SOLVED';
59184                             errorService.postUpdate(d, function(err, error) {
59185                                 dispatch$1.call('change', error);
59186                             });
59187                         }
59188                     });
59189
59190                 buttonSection.select('.ignore-button')
59191                     .text(function(d) {
59192                         var andComment = (d.newComment !== undefined ? '_comment' : '');
59193                         return t('QA.keepRight.ignore' + andComment);
59194                     })
59195                     .on('click.ignore', function(d) {
59196                         this.blur();    // avoid keeping focus on the button - #4641
59197                         var errorService = services$1.improveOSM;
59198                         if (errorService) {
59199                             d.newStatus = 'INVALID';
59200                             errorService.postUpdate(d, function(err, error) {
59201                                 dispatch$1.call('change', error);
59202                             });
59203                         }
59204                     });
59205             }
59206
59207             improveOsmEditor.error = function(val) {
59208                 if (!arguments.length) return _error;
59209                 _error = val;
59210                 return improveOsmEditor;
59211             };
59212
59213
59214             return utilRebind(improveOsmEditor, dispatch$1, 'on');
59215         }
59216
59217         function uiKeepRightDetails(context) {
59218             var _error;
59219
59220
59221             function errorDetail(d) {
59222                 var unknown = t('inspector.unknown');
59223
59224                 if (!d) return unknown;
59225                 var errorType = d.error_type;
59226                 var parentErrorType = d.parent_error_type;
59227
59228                 var et = en.QA.keepRight.errorTypes[errorType];
59229                 var pt = en.QA.keepRight.errorTypes[parentErrorType];
59230
59231                 var detail;
59232                 if (et && et.description) {
59233                     detail = t('QA.keepRight.errorTypes.' + errorType + '.description', d.replacements);
59234                 } else if (pt && pt.description) {
59235                     detail = t('QA.keepRight.errorTypes.' + parentErrorType + '.description', d.replacements);
59236                 } else {
59237                     detail = unknown;
59238                 }
59239
59240                 return detail;
59241             }
59242
59243
59244             function keepRightDetails(selection) {
59245                 var details = selection.selectAll('.error-details')
59246                     .data(
59247                         (_error ? [_error] : []),
59248                         function(d) { return d.id + '-' + (d.status || 0); }
59249                     );
59250
59251                 details.exit()
59252                     .remove();
59253
59254                 var detailsEnter = details.enter()
59255                     .append('div')
59256                     .attr('class', 'error-details error-details-container');
59257
59258
59259                 // description
59260                 var descriptionEnter = detailsEnter
59261                     .append('div')
59262                     .attr('class', 'error-details-description');
59263
59264                 descriptionEnter
59265                     .append('h4')
59266                     .text(function() { return t('QA.keepRight.detail_description'); });
59267
59268                 descriptionEnter
59269                     .append('div')
59270                     .attr('class', 'error-details-description-text')
59271                     .html(errorDetail);
59272
59273                 // If there are entity links in the error message..
59274                 var relatedEntities = [];
59275                 descriptionEnter.selectAll('.error_entity_link, .error_object_link')
59276                     .each(function() {
59277                         var link = d3_select(this);
59278                         var isObjectLink = link.classed('error_object_link');
59279                         var entityID = isObjectLink ?
59280                             (utilEntityRoot(_error.object_type) + _error.object_id)
59281                             : this.textContent;
59282                         var entity = context.hasEntity(entityID);
59283
59284                         relatedEntities.push(entityID);
59285
59286                         // Add click handler
59287                         link
59288                             .on('mouseover', function() {
59289                                 context.surface().selectAll(utilEntityOrMemberSelector([entityID], context.graph()))
59290                                     .classed('hover', true);
59291                             })
59292                             .on('mouseout', function() {
59293                                 context.surface().selectAll('.hover')
59294                                     .classed('hover', false);
59295                             })
59296                             .on('click', function() {
59297                                 event.preventDefault();
59298                                 var osmlayer = context.layers().layer('osm');
59299                                 if (!osmlayer.enabled()) {
59300                                     osmlayer.enabled(true);
59301                                 }
59302
59303                                 context.map().centerZoomEase(_error.loc, 20);
59304
59305                                 if (entity) {
59306                                     context.enter(modeSelect(context, [entityID]));
59307                                 } else {
59308                                     context.loadEntity(entityID, function() {
59309                                         context.enter(modeSelect(context, [entityID]));
59310                                     });
59311                                 }
59312                             });
59313
59314                         // Replace with friendly name if possible
59315                         // (The entity may not yet be loaded into the graph)
59316                         if (entity) {
59317                             var name = utilDisplayName(entity);  // try to use common name
59318
59319                             if (!name && !isObjectLink) {
59320                                 var preset = context.presets().match(entity, context.graph());
59321                                 name = preset && !preset.isFallback() && preset.name();  // fallback to preset name
59322                             }
59323
59324                             if (name) {
59325                                 this.innerText = name;
59326                             }
59327                         }
59328                     });
59329
59330                 // Don't hide entities related to this error - #5880
59331                 context.features().forceVisible(relatedEntities);
59332             }
59333
59334
59335             keepRightDetails.error = function(val) {
59336                 if (!arguments.length) return _error;
59337                 _error = val;
59338                 return keepRightDetails;
59339             };
59340
59341
59342             return keepRightDetails;
59343         }
59344
59345         function uiKeepRightHeader() {
59346             var _error;
59347
59348
59349             function errorTitle(d) {
59350                 var unknown = t('inspector.unknown');
59351
59352                 if (!d) return unknown;
59353                 var errorType = d.error_type;
59354                 var parentErrorType = d.parent_error_type;
59355
59356                 var et = en.QA.keepRight.errorTypes[errorType];
59357                 var pt = en.QA.keepRight.errorTypes[parentErrorType];
59358
59359                 if (et && et.title) {
59360                     return t('QA.keepRight.errorTypes.' + errorType + '.title');
59361                 } else if (pt && pt.title) {
59362                     return t('QA.keepRight.errorTypes.' + parentErrorType + '.title');
59363                 } else {
59364                     return unknown;
59365                 }
59366             }
59367
59368
59369             function keepRightHeader(selection) {
59370                 var header = selection.selectAll('.error-header')
59371                     .data(
59372                         (_error ? [_error] : []),
59373                         function(d) { return d.id + '-' + (d.status || 0); }
59374                     );
59375
59376                 header.exit()
59377                     .remove();
59378
59379                 var headerEnter = header.enter()
59380                     .append('div')
59381                     .attr('class', 'error-header');
59382
59383                 var iconEnter = headerEnter
59384                     .append('div')
59385                     .attr('class', 'error-header-icon')
59386                     .classed('new', function(d) { return d.id < 0; });
59387
59388                 iconEnter
59389                     .append('div')
59390                     .attr('class', function(d) {
59391                         return 'preset-icon-28 qa_error ' + d.service + ' error_id-' + d.id + ' error_type-' + d.parent_error_type;
59392                     })
59393                     .call(svgIcon('#iD-icon-bolt', 'qa_error-fill'));
59394
59395                 headerEnter
59396                     .append('div')
59397                     .attr('class', 'error-header-label')
59398                     .text(errorTitle);
59399             }
59400
59401
59402             keepRightHeader.error = function(val) {
59403                 if (!arguments.length) return _error;
59404                 _error = val;
59405                 return keepRightHeader;
59406             };
59407
59408
59409             return keepRightHeader;
59410         }
59411
59412         function uiViewOnKeepRight() {
59413             var _error;   // a keepright error
59414
59415
59416             function viewOnKeepRight(selection) {
59417                 var url;
59418                 if (services$1.keepRight && (_error instanceof qaError)) {
59419                     url = services$1.keepRight.errorURL(_error);
59420                 }
59421
59422                 var link = selection.selectAll('.view-on-keepRight')
59423                     .data(url ? [url] : []);
59424
59425                 // exit
59426                 link.exit()
59427                     .remove();
59428
59429                 // enter
59430                 var linkEnter = link.enter()
59431                     .append('a')
59432                     .attr('class', 'view-on-keepRight')
59433                     .attr('target', '_blank')
59434                     .attr('href', function(d) { return d; })
59435                     .call(svgIcon('#iD-icon-out-link', 'inline'));
59436
59437                 linkEnter
59438                     .append('span')
59439                     .text(t('inspector.view_on_keepRight'));
59440             }
59441
59442
59443             viewOnKeepRight.what = function(val) {
59444                 if (!arguments.length) return _error;
59445                 _error = val;
59446                 return viewOnKeepRight;
59447             };
59448
59449             return viewOnKeepRight;
59450         }
59451
59452         function uiKeepRightEditor(context) {
59453             var dispatch$1 = dispatch('change');
59454             var keepRightDetails = uiKeepRightDetails(context);
59455             var keepRightHeader = uiKeepRightHeader(context);
59456             var quickLinks = uiQuickLinks();
59457
59458             var _error;
59459
59460
59461             function keepRightEditor(selection) {
59462                 // quick links
59463                 var choices = [{
59464                     id: 'zoom_to',
59465                     label: 'inspector.zoom_to.title',
59466                     tooltip: function() {
59467                         return uiTooltipHtml(t('inspector.zoom_to.tooltip_issue'), t('inspector.zoom_to.key'));
59468                     },
59469                     click: function zoomTo() {
59470                         context.mode().zoomToSelected();
59471                     }
59472                 }];
59473
59474
59475                 var header = selection.selectAll('.header')
59476                     .data([0]);
59477
59478                 var headerEnter = header.enter()
59479                     .append('div')
59480                     .attr('class', 'header fillL');
59481
59482                 headerEnter
59483                     .append('button')
59484                     .attr('class', 'fr error-editor-close')
59485                     .on('click', function() {
59486                         context.enter(modeBrowse(context));
59487                     })
59488                     .call(svgIcon('#iD-icon-close'));
59489
59490                 headerEnter
59491                     .append('h3')
59492                     .text(t('QA.keepRight.title'));
59493
59494
59495                 var body = selection.selectAll('.body')
59496                     .data([0]);
59497
59498                 body = body.enter()
59499                     .append('div')
59500                     .attr('class', 'body')
59501                     .merge(body);
59502
59503                 var editor = body.selectAll('.error-editor')
59504                     .data([0]);
59505
59506                 editor.enter()
59507                     .append('div')
59508                     .attr('class', 'modal-section error-editor')
59509                     .merge(editor)
59510                     .call(keepRightHeader.error(_error))
59511                     .call(quickLinks.choices(choices))
59512                     .call(keepRightDetails.error(_error))
59513                     .call(keepRightSaveSection);
59514
59515
59516                 var footer = selection.selectAll('.footer')
59517                     .data([0]);
59518
59519                 footer.enter()
59520                     .append('div')
59521                     .attr('class', 'footer')
59522                     .merge(footer)
59523                     .call(uiViewOnKeepRight(context).what(_error));
59524             }
59525
59526
59527             function keepRightSaveSection(selection) {
59528                 var isSelected = (_error && _error.id === context.selectedErrorID());
59529                 var isShown = (_error && (isSelected || _error.newComment || _error.comment));
59530                 var saveSection = selection.selectAll('.error-save')
59531                     .data(
59532                         (isShown ? [_error] : []),
59533                         function(d) { return d.id + '-' + (d.status || 0); }
59534                     );
59535
59536                 // exit
59537                 saveSection.exit()
59538                     .remove();
59539
59540                 // enter
59541                 var saveSectionEnter = saveSection.enter()
59542                     .append('div')
59543                     .attr('class', 'error-save save-section cf');
59544
59545                 saveSectionEnter
59546                     .append('h4')
59547                     .attr('class', '.error-save-header')
59548                     .text(t('QA.keepRight.comment'));
59549
59550                 saveSectionEnter
59551                     .append('textarea')
59552                     .attr('class', 'new-comment-input')
59553                     .attr('placeholder', t('QA.keepRight.comment_placeholder'))
59554                     .attr('maxlength', 1000)
59555                     .property('value', function(d) { return d.newComment || d.comment; })
59556                     .call(utilNoAuto)
59557                     .on('input', changeInput)
59558                     .on('blur', changeInput);
59559
59560                 // update
59561                 saveSection = saveSectionEnter
59562                     .merge(saveSection)
59563                     .call(keepRightSaveButtons);
59564
59565
59566                 function changeInput() {
59567                     var input = d3_select(this);
59568                     var val = input.property('value').trim();
59569
59570                     if (val === _error.comment) {
59571                         val = undefined;
59572                     }
59573
59574                     // store the unsaved comment with the error itself
59575                     _error = _error.update({ newComment: val });
59576
59577                     var keepRight = services$1.keepRight;
59578                     if (keepRight) {
59579                         keepRight.replaceError(_error);  // update keepright cache
59580                     }
59581
59582                     saveSection
59583                         .call(keepRightSaveButtons);
59584                 }
59585             }
59586
59587
59588             function keepRightSaveButtons(selection) {
59589                 var isSelected = (_error && _error.id === context.selectedErrorID());
59590                 var buttonSection = selection.selectAll('.buttons')
59591                     .data((isSelected ? [_error] : []), function(d) { return d.status + d.id; });
59592
59593                 // exit
59594                 buttonSection.exit()
59595                     .remove();
59596
59597                 // enter
59598                 var buttonEnter = buttonSection.enter()
59599                     .append('div')
59600                     .attr('class', 'buttons');
59601
59602                 buttonEnter
59603                     .append('button')
59604                     .attr('class', 'button comment-button action')
59605                     .text(t('QA.keepRight.save_comment'));
59606
59607                 buttonEnter
59608                     .append('button')
59609                     .attr('class', 'button close-button action');
59610
59611                 buttonEnter
59612                     .append('button')
59613                     .attr('class', 'button ignore-button action');
59614
59615
59616                 // update
59617                 buttonSection = buttonSection
59618                     .merge(buttonEnter);
59619
59620                 buttonSection.select('.comment-button')   // select and propagate data
59621                     .attr('disabled', function(d) {
59622                         return d.newComment === undefined ? true : null;
59623                     })
59624                     .on('click.comment', function(d) {
59625                         this.blur();    // avoid keeping focus on the button - #4641
59626                         var keepRight = services$1.keepRight;
59627                         if (keepRight) {
59628                             keepRight.postKeepRightUpdate(d, function(err, error) {
59629                                 dispatch$1.call('change', error);
59630                             });
59631                         }
59632                     });
59633
59634                 buttonSection.select('.close-button')   // select and propagate data
59635                     .text(function(d) {
59636                         var andComment = (d.newComment !== undefined ? '_comment' : '');
59637                         return t('QA.keepRight.close' + andComment);
59638                     })
59639                     .on('click.close', function(d) {
59640                         this.blur();    // avoid keeping focus on the button - #4641
59641                         var keepRight = services$1.keepRight;
59642                         if (keepRight) {
59643                             d.state = 'ignore_t';   // ignore temporarily (error fixed)
59644                             keepRight.postKeepRightUpdate(d, function(err, error) {
59645                                 dispatch$1.call('change', error);
59646                             });
59647                         }
59648                     });
59649
59650                 buttonSection.select('.ignore-button')   // select and propagate data
59651                     .text(function(d) {
59652                         var andComment = (d.newComment !== undefined ? '_comment' : '');
59653                         return t('QA.keepRight.ignore' + andComment);
59654                     })
59655                     .on('click.ignore', function(d) {
59656                         this.blur();    // avoid keeping focus on the button - #4641
59657                         var keepRight = services$1.keepRight;
59658                         if (keepRight) {
59659                             d.state = 'ignore';   // ignore permanently (false positive)
59660                             keepRight.postKeepRightUpdate(d, function(err, error) {
59661                                 dispatch$1.call('change', error);
59662                             });
59663                         }
59664                     });
59665             }
59666
59667
59668             keepRightEditor.error = function(val) {
59669                 if (!arguments.length) return _error;
59670                 _error = val;
59671                 return keepRightEditor;
59672             };
59673
59674
59675             return utilRebind(keepRightEditor, dispatch$1, 'on');
59676         }
59677
59678         function modeSelectError(context, selectedErrorID, selectedErrorService) {
59679             var mode = {
59680                 id: 'select-error',
59681                 button: 'browse'
59682             };
59683
59684             var keybinding = utilKeybinding('select-error');
59685
59686             var errorService = services$1[selectedErrorService];
59687             var errorEditor;
59688             switch (selectedErrorService) {
59689                 case 'improveOSM':
59690                     errorEditor = uiImproveOsmEditor(context)
59691                     .on('change', function() {
59692                         context.map().pan([0,0]);  // trigger a redraw
59693                         var error = checkSelectedID();
59694                         if (!error) return;
59695                         context.ui().sidebar
59696                             .show(errorEditor.error(error));
59697                     });
59698                     break;
59699                 case 'keepRight':
59700                     errorEditor = uiKeepRightEditor(context)
59701                     .on('change', function() {
59702                         context.map().pan([0,0]);  // trigger a redraw
59703                         var error = checkSelectedID();
59704                         if (!error) return;
59705                         context.ui().sidebar
59706                             .show(errorEditor.error(error));
59707                     });
59708                     break;
59709             }
59710
59711
59712             var behaviors = [
59713                 behaviorBreathe(context),
59714                 behaviorHover(context),
59715                 behaviorSelect(context),
59716                 behaviorLasso(context),
59717                 modeDragNode(context).behavior,
59718                 modeDragNote(context).behavior
59719             ];
59720
59721
59722             function checkSelectedID() {
59723                 if (!errorService) return;
59724                 var error = errorService.getError(selectedErrorID);
59725                 if (!error) {
59726                     context.enter(modeBrowse(context));
59727                 }
59728                 return error;
59729             }
59730
59731
59732             mode.zoomToSelected = function() {
59733                 if (!errorService) return;
59734                 var error = errorService.getError(selectedErrorID);
59735                 if (error) {
59736                     context.map().centerZoomEase(error.loc, 20);
59737                 }
59738             };
59739
59740
59741             mode.enter = function() {
59742                 var error = checkSelectedID();
59743                 if (!error) return;
59744
59745                 behaviors.forEach(context.install);
59746                 keybinding
59747                     .on(t('inspector.zoom_to.key'), mode.zoomToSelected)
59748                     .on('⎋', esc, true);
59749
59750                 d3_select(document)
59751                     .call(keybinding);
59752
59753                 selectError();
59754
59755                 var sidebar = context.ui().sidebar;
59756                 sidebar.show(errorEditor.error(error));
59757
59758                 context.map()
59759                     .on('drawn.select-error', selectError);
59760
59761
59762                 // class the error as selected, or return to browse mode if the error is gone
59763                 function selectError(drawn) {
59764                     if (!checkSelectedID()) return;
59765
59766                     var selection = context.surface()
59767                         .selectAll('.error_id-' + selectedErrorID + '.' + selectedErrorService);
59768
59769                     if (selection.empty()) {
59770                         // Return to browse mode if selected DOM elements have
59771                         // disappeared because the user moved them out of view..
59772                         var source = event && event.type === 'zoom' && event.sourceEvent;
59773                         if (drawn && source && (source.type === 'mousemove' || source.type === 'touchmove')) {
59774                             context.enter(modeBrowse(context));
59775                         }
59776
59777                     } else {
59778                         selection
59779                             .classed('selected', true);
59780
59781                         context.selectedErrorID(selectedErrorID);
59782                     }
59783                 }
59784
59785                 function esc() {
59786                     if (d3_select('.combobox').size()) return;
59787                     context.enter(modeBrowse(context));
59788                 }
59789             };
59790
59791
59792             mode.exit = function() {
59793                 behaviors.forEach(context.uninstall);
59794
59795                 d3_select(document)
59796                     .call(keybinding.unbind);
59797
59798                 context.surface()
59799                     .selectAll('.qa_error.selected')
59800                     .classed('selected hover', false);
59801
59802                 context.map()
59803                     .on('drawn.select-error', null);
59804
59805                 context.ui().sidebar
59806                     .hide();
59807
59808                 context.selectedErrorID(null);
59809                 context.features().forceVisible([]);
59810             };
59811
59812
59813             return mode;
59814         }
59815
59816         function behaviorSelect(context) {
59817             // legacy option to show menu on every click
59818             var isShowAlways = +context.storage('edit-menu-show-always') === 1;
59819             var tolerance = 4;
59820             var _lastMouse = null;
59821             var _suppressMenu = true;
59822             var _p1 = null;
59823
59824
59825             function point() {
59826                 return d3_mouse(context.container().node());
59827             }
59828
59829
59830             function keydown() {
59831                 var e = event;
59832                 if (e && e.shiftKey) {
59833                     context.surface()
59834                         .classed('behavior-multiselect', true);
59835                 }
59836
59837                 if (e && e.keyCode === 93) {  // context menu
59838                     e.preventDefault();
59839                     e.stopPropagation();
59840                 }
59841             }
59842
59843
59844             function keyup() {
59845                 var e = event;
59846                 if (!e || !e.shiftKey) {
59847                     context.surface()
59848                         .classed('behavior-multiselect', false);
59849                 }
59850
59851
59852                 if (e && e.keyCode === 93) {  // context menu
59853                     e.preventDefault();
59854                     e.stopPropagation();
59855                     contextmenu();
59856                 }
59857             }
59858
59859
59860             function mousedown() {
59861                 if (!_p1) {
59862                     _p1 = point();
59863                 }
59864                 d3_select(window)
59865                     .on('mouseup.select', mouseup, true);
59866
59867                 _suppressMenu = !isShowAlways;
59868             }
59869
59870
59871             function mousemove() {
59872                 if (event) {
59873                     _lastMouse = event;
59874                 }
59875             }
59876
59877
59878             function mouseup() {
59879                 click();
59880             }
59881
59882
59883             function contextmenu() {
59884                 var e = event;
59885                 e.preventDefault();
59886                 e.stopPropagation();
59887
59888                 if (!+e.clientX && !+e.clientY) {
59889                     if (_lastMouse) {
59890                         e.sourceEvent = _lastMouse;
59891                     } else {
59892                         return;
59893                     }
59894                 }
59895
59896                 if (!_p1) {
59897                     _p1 = point();
59898                 }
59899                 _suppressMenu = false;
59900                 click();
59901             }
59902
59903
59904             function click() {
59905                 d3_select(window)
59906                     .on('mouseup.select', null, true);
59907
59908                 if (!_p1) return;
59909                 var p2 = point();
59910                 var dist = geoVecLength(_p1, p2);
59911                 _p1 = null;
59912                 if (dist > tolerance) return;
59913
59914                 // Defer processing the click,
59915                 // because this click may trigger a blur event,
59916                 // and the blur event may trigger a tag change,
59917                 // and we really want that tag change to go to the already selected entity
59918                 // and not the one that we are about to select with the click  #6028, #5878
59919                 // (Be very careful entering modeSelect anywhere that might also blur a field!)
59920                 var datum = event.target.__data__ || (_lastMouse && _lastMouse.target.__data__);
59921                 var isMultiselect = event.shiftKey || d3_select('#surface .lasso').node();
59922                 window.setTimeout(function() {
59923                     processClick(datum, isMultiselect);
59924                 }, 20);  // delay > whatever raw_tag_editor.js `scheduleChange` does (10ms).
59925             }
59926
59927
59928             function processClick(datum, isMultiselect) {
59929                 var mode = context.mode();
59930
59931                 var entity = datum && datum.properties && datum.properties.entity;
59932                 if (entity) datum = entity;
59933
59934                 if (datum && datum.type === 'midpoint') {
59935                     datum = datum.parents[0];
59936                 }
59937
59938                 if (datum instanceof osmEntity) {    // clicked an entity..
59939                     var selectedIDs = context.selectedIDs();
59940                     context.selectedNoteID(null);
59941                     context.selectedErrorID(null);
59942
59943                     if (!isMultiselect) {
59944                         if (selectedIDs.length > 1 && (!_suppressMenu && !isShowAlways)) {
59945                             // multiple things already selected, just show the menu...
59946                             mode.suppressMenu(false).reselect();
59947                         } else {
59948                             // select a single thing..
59949                             context.enter(modeSelect(context, [datum.id]).suppressMenu(_suppressMenu));
59950                         }
59951
59952                     } else {
59953                         if (selectedIDs.indexOf(datum.id) !== -1) {
59954                             // clicked entity is already in the selectedIDs list..
59955                             if (!_suppressMenu && !isShowAlways) {
59956                                 // don't deselect clicked entity, just show the menu.
59957                                 mode.suppressMenu(false).reselect();
59958                             } else {
59959                                 // deselect clicked entity, then reenter select mode or return to browse mode..
59960                                 selectedIDs = selectedIDs.filter(function(id) { return id !== datum.id; });
59961                                 context.enter(selectedIDs.length ? modeSelect(context, selectedIDs) : modeBrowse(context));
59962                             }
59963                         } else {
59964                             // clicked entity is not in the selected list, add it..
59965                             selectedIDs = selectedIDs.concat([datum.id]);
59966                             context.enter(modeSelect(context, selectedIDs).suppressMenu(_suppressMenu));
59967                         }
59968                     }
59969
59970                 } else if (datum && datum.__featurehash__ && !isMultiselect) {    // clicked Data..
59971                     context
59972                         .selectedNoteID(null)
59973                         .enter(modeSelectData(context, datum));
59974
59975                 } else if (datum instanceof osmNote && !isMultiselect) {    // clicked a Note..
59976                     context
59977                         .selectedNoteID(datum.id)
59978                         .enter(modeSelectNote(context, datum.id));
59979
59980                 } else if (datum instanceof qaError & !isMultiselect) {  // clicked an external QA error
59981                     context
59982                         .selectedErrorID(datum.id)
59983                         .enter(modeSelectError(context, datum.id, datum.service));
59984
59985                 } else {    // clicked nothing..
59986                     context.selectedNoteID(null);
59987                     context.selectedErrorID(null);
59988                     if (!isMultiselect && mode.id !== 'browse') {
59989                         context.enter(modeBrowse(context));
59990                     }
59991                 }
59992
59993                 // reset for next time..
59994                 _suppressMenu = true;
59995             }
59996
59997
59998             function behavior(selection) {
59999                 _lastMouse = null;
60000                 _suppressMenu = true;
60001                 _p1 = null;
60002
60003                 d3_select(window)
60004                     .on('keydown.select', keydown)
60005                     .on('keyup.select', keyup)
60006                     .on('contextmenu.select-window', function() {
60007                         // Edge and IE really like to show the contextmenu on the
60008                         // menubar when user presses a keyboard menu button
60009                         // even after we've already preventdefaulted the key event.
60010                         var e = event;
60011                         if (+e.clientX === 0 && +e.clientY === 0) {
60012                             event.preventDefault();
60013                             event.stopPropagation();
60014                         }
60015                     });
60016
60017                 selection
60018                     .on('mousedown.select', mousedown)
60019                     .on('mousemove.select', mousemove)
60020                     .on('contextmenu.select', contextmenu);
60021
60022                 if (event && event.shiftKey) {
60023                     context.surface()
60024                         .classed('behavior-multiselect', true);
60025                 }
60026             }
60027
60028
60029             behavior.off = function(selection) {
60030                 d3_select(window)
60031                     .on('keydown.select', null)
60032                     .on('keyup.select', null)
60033                     .on('contextmenu.select-window', null)
60034                     .on('mouseup.select', null, true);
60035
60036                 selection
60037                     .on('mousedown.select', null)
60038                     .on('mousemove.select', null)
60039                     .on('contextmenu.select', null);
60040
60041                 context.surface()
60042                     .classed('behavior-multiselect', false);
60043             };
60044
60045
60046             return behavior;
60047         }
60048
60049         function behaviorDrawWay(context, wayID, index, mode, startGraph, baselineGraph) {
60050
60051             var origWay = context.entity(wayID);
60052
60053             var annotation = t((origWay.isDegenerate() ?
60054                 'operations.start.annotation.' :
60055                 'operations.continue.annotation.') + context.geometry(wayID)
60056             );
60057
60058             var behavior = behaviorDraw(context);
60059             behavior.hover().initialNodeID(index ? origWay.nodes[index] :
60060                 (origWay.isClosed() ? origWay.nodes[origWay.nodes.length - 2] : origWay.nodes[origWay.nodes.length - 1]));
60061
60062             var _tempEdits = 0;
60063
60064             var end = osmNode({ loc: context.map().mouseCoordinates() });
60065
60066             // Push an annotated state for undo to return back to.
60067             // We must make sure to remove this edit later.
60068             context.pauseChangeDispatch();
60069             context.perform(actionNoop(), annotation);
60070             _tempEdits++;
60071
60072             // Add the drawing node to the graph.
60073             // We must make sure to remove this edit later.
60074             context.perform(_actionAddDrawNode());
60075             _tempEdits++;
60076             context.resumeChangeDispatch();
60077
60078
60079             function keydown() {
60080                 if (event.keyCode === utilKeybinding.modifierCodes.alt) {
60081                     if (context.surface().classed('nope')) {
60082                         context.surface()
60083                             .classed('nope-suppressed', true);
60084                     }
60085                     context.surface()
60086                         .classed('nope', false)
60087                         .classed('nope-disabled', true);
60088                 }
60089             }
60090
60091
60092             function keyup() {
60093                 if (event.keyCode === utilKeybinding.modifierCodes.alt) {
60094                     if (context.surface().classed('nope-suppressed')) {
60095                         context.surface()
60096                             .classed('nope', true);
60097                     }
60098                     context.surface()
60099                         .classed('nope-suppressed', false)
60100                         .classed('nope-disabled', false);
60101                 }
60102             }
60103
60104
60105             function allowsVertex(d) {
60106                 return d.geometry(context.graph()) === 'vertex' || context.presets().allowsVertex(d, context.graph());
60107             }
60108
60109
60110             // related code
60111             // - `mode/drag_node.js`     `doMode()`
60112             // - `behavior/draw.js`      `click()`
60113             // - `behavior/draw_way.js`  `move()`
60114             function move(datum) {
60115                 context.surface().classed('nope-disabled', event.altKey);
60116
60117                 var targetLoc = datum && datum.properties && datum.properties.entity && allowsVertex(datum.properties.entity) && datum.properties.entity.loc;
60118                 var targetNodes = datum && datum.properties && datum.properties.nodes;
60119                 var loc = context.map().mouseCoordinates();
60120
60121                 if (targetLoc) {   // snap to node/vertex - a point target with `.loc`
60122                     loc = targetLoc;
60123
60124                 } else if (targetNodes) {   // snap to way - a line target with `.nodes`
60125                     var choice = geoChooseEdge(targetNodes, context.mouse(), context.projection, end.id);
60126                     if (choice) {
60127                         loc = choice.loc;
60128                     }
60129                 }
60130
60131                 context.replace(actionMoveNode(end.id, loc));
60132                 end = context.entity(end.id);
60133                 checkGeometry(false);
60134             }
60135
60136
60137             // Check whether this edit causes the geometry to break.
60138             // If so, class the surface with a nope cursor.
60139             // `finishDraw` - Only checks the relevant line segments if finishing drawing
60140             function checkGeometry(finishDraw) {
60141                 var nopeDisabled = context.surface().classed('nope-disabled');
60142                 var isInvalid = isInvalidGeometry(end, context.graph(), finishDraw);
60143
60144                 if (nopeDisabled) {
60145                     context.surface()
60146                         .classed('nope', false)
60147                         .classed('nope-suppressed', isInvalid);
60148                 } else {
60149                     context.surface()
60150                         .classed('nope', isInvalid)
60151                         .classed('nope-suppressed', false);
60152                 }
60153             }
60154
60155
60156             function isInvalidGeometry(entity, graph, finishDraw) {
60157                 var parents = graph.parentWays(entity);
60158
60159                 for (var i = 0; i < parents.length; i++) {
60160                     var parent = parents[i];
60161                     var nodes = graph.childNodes(parent).slice();  // shallow copy
60162
60163                     if (origWay.isClosed()) { // Check if Area
60164                         if (finishDraw) {
60165                             if (nodes.length < 3) return false;
60166                             nodes.splice(-2, 1);
60167                             entity = nodes[nodes.length-2];
60168                         } else {
60169                             nodes.pop();
60170                         }
60171                     } else { // Line
60172                         if (finishDraw) {
60173                             nodes.pop();
60174                         }
60175                     }
60176
60177                     if (geoHasSelfIntersections(nodes, entity.id)) {
60178                         return true;
60179                     }
60180                 }
60181
60182                 return false;
60183             }
60184
60185
60186             function undone() {
60187                 context.pauseChangeDispatch();
60188                 // Undo popped the history back to the initial annotated no-op edit.
60189                 _tempEdits = 0;     // We will deal with the temp edits here
60190                 context.pop(1);     // Remove initial no-op edit
60191
60192                 if (context.graph() === baselineGraph) {    // We've undone back to the beginning
60193                     // baselineGraph may be behind startGraph if this way was added rather than continued
60194                     resetToStartGraph();
60195                     context.resumeChangeDispatch();
60196                     context.enter(modeSelect(context, [wayID]));
60197                 } else {
60198                     // Remove whatever segment was drawn previously and continue drawing
60199                     context.pop(1);
60200                     context.resumeChangeDispatch();
60201                     context.enter(mode);
60202                 }
60203             }
60204
60205
60206             function setActiveElements() {
60207                 context.surface().selectAll('.' + end.id)
60208                     .classed('active', true);
60209             }
60210
60211
60212             function resetToStartGraph() {
60213                 while (context.graph() !== startGraph) {
60214                     context.pop();
60215                 }
60216             }
60217
60218
60219             var drawWay = function(surface) {
60220                 behavior
60221                     .on('move', move)
60222                     .on('click', drawWay.add)
60223                     .on('clickWay', drawWay.addWay)
60224                     .on('clickNode', drawWay.addNode)
60225                     .on('undo', context.undo)
60226                     .on('cancel', drawWay.cancel)
60227                     .on('finish', drawWay.finish);
60228
60229                 d3_select(window)
60230                     .on('keydown.drawWay', keydown)
60231                     .on('keyup.drawWay', keyup);
60232
60233                 context.map()
60234                     .dblclickEnable(false)
60235                     .on('drawn.draw', setActiveElements);
60236
60237                 setActiveElements();
60238
60239                 surface.call(behavior);
60240
60241                 context.history()
60242                     .on('undone.draw', undone);
60243             };
60244
60245
60246             drawWay.off = function(surface) {
60247                 // Drawing was interrupted unexpectedly.
60248                 // This can happen if the user changes modes,
60249                 // clicks geolocate button, a hashchange event occurs, etc.
60250                 if (_tempEdits) {
60251                     context.pauseChangeDispatch();
60252                     context.pop(_tempEdits);
60253                     resetToStartGraph();
60254                     context.resumeChangeDispatch();
60255                 }
60256
60257                 context.map()
60258                     .on('drawn.draw', null);
60259
60260                 surface.call(behavior.off)
60261                     .selectAll('.active')
60262                     .classed('active', false);
60263
60264                 surface
60265                     .classed('nope', false)
60266                     .classed('nope-suppressed', false)
60267                     .classed('nope-disabled', false);
60268
60269                 d3_select(window)
60270                     .on('keydown.hover', null)
60271                     .on('keyup.hover', null);
60272
60273                 context.history()
60274                     .on('undone.draw', null);
60275             };
60276
60277
60278             function _actionAddDrawNode() {
60279                 return function(graph) {
60280                     return graph
60281                         .replace(end)
60282                         .replace(origWay.addNode(end.id, index));
60283                 };
60284             }
60285
60286
60287             function _actionReplaceDrawNode(newNode) {
60288                 return function(graph) {
60289                     return graph
60290                         .replace(origWay.addNode(newNode.id, index))
60291                         .remove(end);
60292                 };
60293             }
60294
60295
60296             // Accept the current position of the drawing node and continue drawing.
60297             drawWay.add = function(loc, d) {
60298                 if ((d && d.properties && d.properties.nope) || context.surface().classed('nope')) {
60299                     return;   // can't click here
60300                 }
60301
60302                 context.pauseChangeDispatch();
60303                 context.pop(_tempEdits);
60304                 _tempEdits = 0;
60305
60306                 context.perform(
60307                     _actionAddDrawNode(),
60308                     annotation
60309                 );
60310
60311                 context.resumeChangeDispatch();
60312                 checkGeometry(false);   // finishDraw = false
60313                 context.enter(mode);
60314             };
60315
60316
60317             // Connect the way to an existing way.
60318             drawWay.addWay = function(loc, edge, d) {
60319                 if ((d && d.properties && d.properties.nope) || context.surface().classed('nope')) {
60320                     return;   // can't click here
60321                 }
60322
60323                 context.pauseChangeDispatch();
60324                 context.pop(_tempEdits);
60325                 _tempEdits = 0;
60326
60327                 context.perform(
60328                     _actionAddDrawNode(),
60329                     actionAddMidpoint({ loc: loc, edge: edge }, end),
60330                     annotation
60331                 );
60332
60333                 context.resumeChangeDispatch();
60334                 checkGeometry(false);   // finishDraw = false
60335                 context.enter(mode);
60336             };
60337
60338
60339             // Connect the way to an existing node and continue drawing.
60340             drawWay.addNode = function(node, d) {
60341                 if ((d && d.properties && d.properties.nope) || context.surface().classed('nope')) {
60342                     return;   // can't click here
60343                 }
60344
60345                 context.pauseChangeDispatch();
60346                 context.pop(_tempEdits);
60347                 _tempEdits = 0;
60348
60349                 context.perform(
60350                     _actionReplaceDrawNode(node),
60351                     annotation
60352                 );
60353
60354                 context.resumeChangeDispatch();
60355                 checkGeometry(false);   // finishDraw = false
60356                 context.enter(mode);
60357             };
60358
60359
60360             // Finish the draw operation, removing the temporary edits.
60361             // If the way has enough nodes to be valid, it's selected.
60362             // Otherwise, delete everything and return to browse mode.
60363             drawWay.finish = function() {
60364                 checkGeometry(true);   // finishDraw = true
60365                 if (context.surface().classed('nope')) {
60366                     return;   // can't click here
60367                 }
60368
60369                 context.pauseChangeDispatch();
60370                 context.pop(_tempEdits);
60371                 _tempEdits = 0;
60372
60373                 var way = context.hasEntity(wayID);
60374                 if (!way || way.isDegenerate()) {
60375                     drawWay.cancel();
60376                     return;
60377                 }
60378
60379                 context.resumeChangeDispatch();
60380
60381                 window.setTimeout(function() {
60382                     context.map().dblclickEnable(true);
60383                 }, 1000);
60384
60385                 var isNewFeature = !mode.isContinuing;
60386                 context.enter(modeSelect(context, [wayID]).newFeature(isNewFeature));
60387             };
60388
60389
60390             // Cancel the draw operation, delete everything, and return to browse mode.
60391             drawWay.cancel = function() {
60392                 context.pauseChangeDispatch();
60393                 context.pop(_tempEdits);
60394                 _tempEdits = 0;
60395
60396                 resetToStartGraph();
60397                 context.resumeChangeDispatch();
60398
60399                 window.setTimeout(function() {
60400                     context.map().dblclickEnable(true);
60401                 }, 1000);
60402
60403                 context.surface()
60404                     .classed('nope', false)
60405                     .classed('nope-disabled', false)
60406                     .classed('nope-suppressed', false);
60407
60408                 context.enter(modeBrowse(context));
60409             };
60410
60411
60412             drawWay.activeID = function() {
60413                 if (!arguments.length) return end.id;
60414                 // no assign
60415                 return drawWay;
60416             };
60417
60418
60419             drawWay.tail = function(text) {
60420                 behavior.tail(text);
60421                 return drawWay;
60422             };
60423
60424
60425             return drawWay;
60426         }
60427
60428         function modeDrawLine(context, wayID, startGraph, baselineGraph, button, affix, continuing) {
60429             var mode = {
60430                 button: button,
60431                 id: 'draw-line'
60432             };
60433
60434             var behavior;
60435
60436             mode.wayID = wayID;
60437
60438             mode.isContinuing = continuing;
60439
60440             mode.enter = function() {
60441                 var way = context.entity(wayID);
60442                 var index = (affix === 'prefix') ? 0 : undefined;
60443                 var headID = (affix === 'prefix') ? way.first() : way.last();
60444
60445                 behavior = behaviorDrawWay(context, wayID, index, mode, startGraph, baselineGraph)
60446                     .tail(t('modes.draw_line.tail'));
60447
60448                 var addNode = behavior.addNode;
60449                 behavior.addNode = function(node, d) {
60450                     if (node.id === headID) {
60451                         behavior.finish();
60452                     } else {
60453                         addNode(node, d);
60454                     }
60455                 };
60456
60457                 context.install(behavior);
60458             };
60459
60460
60461             mode.exit = function() {
60462                 context.uninstall(behavior);
60463             };
60464
60465
60466             mode.selectedIDs = function() {
60467                 return [wayID];
60468             };
60469
60470
60471             mode.activeID = function() {
60472                 return (behavior && behavior.activeID()) || [];
60473             };
60474
60475             return mode;
60476         }
60477
60478         function operationContinue(selectedIDs, context) {
60479             var graph = context.graph();
60480             var entities = selectedIDs.map(function(id) { return graph.entity(id); });
60481             var geometries = Object.assign(
60482                 { line: [], vertex: [] },
60483                 utilArrayGroupBy(entities, function(entity) { return entity.geometry(graph); })
60484             );
60485             var vertex = geometries.vertex[0];
60486
60487
60488             function candidateWays() {
60489                 return graph.parentWays(vertex).filter(function(parent) {
60490                     return parent.geometry(graph) === 'line' &&
60491                         !parent.isClosed() &&
60492                         parent.affix(vertex.id) &&
60493                         (geometries.line.length === 0 || geometries.line[0] === parent);
60494                 });
60495             }
60496
60497
60498             var operation = function() {
60499                 var candidate = candidateWays()[0];
60500                 context.enter(
60501                     modeDrawLine(context, candidate.id, context.graph(), context.graph(), 'line', candidate.affix(vertex.id), true)
60502                 );
60503             };
60504
60505
60506             operation.available = function() {
60507                 return geometries.vertex.length === 1 &&
60508                     geometries.line.length <= 1 &&
60509                     !context.features().hasHiddenConnections(vertex, context.graph());
60510             };
60511
60512
60513             operation.disabled = function() {
60514                 var candidates = candidateWays();
60515                 if (candidates.length === 0) {
60516                     return 'not_eligible';
60517                 } else if (candidates.length > 1) {
60518                     return 'multiple';
60519                 }
60520
60521                 return false;
60522             };
60523
60524
60525             operation.tooltip = function() {
60526                 var disable = operation.disabled();
60527                 return disable ?
60528                     t('operations.continue.' + disable) :
60529                     t('operations.continue.description');
60530             };
60531
60532
60533             operation.annotation = function() {
60534                 return t('operations.continue.annotation.line');
60535             };
60536
60537
60538             operation.id = 'continue';
60539             operation.keys = [t('operations.continue.key')];
60540             operation.title = t('operations.continue.title');
60541             operation.behavior = behaviorOperation(context).which(operation);
60542
60543             return operation;
60544         }
60545
60546         function operationDisconnect(selectedIDs, context) {
60547             var vertexIDs = [];
60548             var wayIDs = [];
60549             var otherIDs = [];
60550             var actions = [];
60551
60552             selectedIDs.forEach(function(id) {
60553                 if (context.geometry(id) === 'vertex') {
60554                     vertexIDs.push(id);
60555                 } else if (context.entity(id).type === 'way'){
60556                     wayIDs.push(id);
60557                 } else {
60558                     otherIDs.push(id);
60559                 }
60560             });
60561
60562             var disconnectingWayID = (vertexIDs.length === 0 && wayIDs.length === 1 && wayIDs[0]);
60563             var extent, nodes, coords;
60564
60565             if (disconnectingWayID) {   // disconnecting a way
60566                 var way = context.entity(disconnectingWayID);
60567                 extent = way.extent(context.graph());
60568                 nodes = utilGetAllNodes([disconnectingWayID], context.graph());
60569                 coords = nodes.map(function(n) { return n.loc; });
60570
60571                 way.nodes.forEach(function(vertexID) {
60572                     var action = actionDisconnect(vertexID).limitWays(wayIDs);
60573                     if (action.disabled(context.graph()) !== 'not_connected') {
60574                         actions.push(action);
60575                     }
60576                 });
60577
60578             } else {    // disconnecting a vertex
60579                 vertexIDs.forEach(function(vertexID) {
60580                     var action = actionDisconnect(vertexID);
60581
60582                     if (wayIDs.length > 0) {
60583                         var waysIDsForVertex = wayIDs.filter(function(wayID) {
60584                             var way = context.entity(wayID);
60585                             return way.nodes.indexOf(vertexID) !== -1;
60586                         });
60587                         action.limitWays(waysIDsForVertex);
60588                     }
60589                     actions.push(action);
60590                 });
60591             }
60592
60593
60594             var operation = function() {
60595                 context.perform(function(graph) {
60596                     return actions.reduce(function(graph, action) { return action(graph); }, graph);
60597                 }, operation.annotation());
60598
60599                 context.validator().validate();
60600             };
60601
60602
60603             operation.available = function() {
60604                 if (actions.length === 0) return false;
60605                 if (otherIDs.length !== 0) return false;
60606
60607                 if (vertexIDs.length !== 0 && wayIDs.length !== 0 && !wayIDs.every(function(wayID) {
60608                     return vertexIDs.some(function(vertexID) {
60609                         var way = context.entity(wayID);
60610                         return way.nodes.indexOf(vertexID) !== -1;
60611                     });
60612                 })) return false;
60613
60614                 return true;
60615             };
60616
60617
60618             operation.disabled = function() {
60619                 var reason;
60620                 for (var actionIndex in actions) {
60621                     reason = actions[actionIndex].disabled(context.graph());
60622                     if (reason) return reason;
60623                 }
60624
60625                 if (disconnectingWayID && extent.percentContainedIn(context.extent()) < 0.8) {
60626                     return 'too_large.single';
60627                 } else if (disconnectingWayID && someMissing()) {
60628                     return 'not_downloaded';
60629                 } else if (selectedIDs.some(context.hasHiddenConnections)) {
60630                     return 'connected_to_hidden';
60631                 }
60632
60633                 return false;
60634
60635
60636                 function someMissing() {
60637                     if (context.inIntro()) return false;
60638                     var osm = context.connection();
60639                     if (osm) {
60640                         var missing = coords.filter(function(loc) { return !osm.isDataLoaded(loc); });
60641                         if (missing.length) {
60642                             missing.forEach(function(loc) { context.loadTileAtLoc(loc); });
60643                             return true;
60644                         }
60645                     }
60646                     return false;
60647                 }
60648             };
60649
60650
60651             operation.tooltip = function() {
60652                 var disable = operation.disabled();
60653                 if (disable) {
60654                     return t('operations.disconnect.' + disable);
60655                 }
60656                 if (disconnectingWayID) {
60657                     return t('operations.disconnect.' + context.geometry(disconnectingWayID) + '.description');
60658                 }
60659                 return t('operations.disconnect.description');
60660             };
60661
60662
60663             operation.annotation = function() {
60664                 return t('operations.disconnect.annotation');
60665             };
60666
60667
60668             operation.id = 'disconnect';
60669             operation.keys = [t('operations.disconnect.key')];
60670             operation.title = t('operations.disconnect.title');
60671             operation.behavior = behaviorOperation(context).which(operation);
60672
60673             return operation;
60674         }
60675
60676         function operationDowngrade(selectedIDs, context) {
60677             var affectedFeatureCount = 0;
60678             var downgradeType;
60679
60680             setDowngradeTypeForEntityIDs();
60681
60682             var multi = affectedFeatureCount === 1 ? 'single' : 'multiple';
60683
60684             function setDowngradeTypeForEntityIDs() {
60685                 for (var i in selectedIDs) {
60686                     var entityID = selectedIDs[i];
60687                     var type = downgradeTypeForEntityID(entityID);
60688                     if (type) {
60689                         affectedFeatureCount += 1;
60690                         if (downgradeType && type !== downgradeType) {
60691                             downgradeType = 'building_address';
60692                         } else {
60693                             downgradeType = type;
60694                         }
60695                     }
60696                 }
60697             }
60698
60699             function downgradeTypeForEntityID(entityID) {
60700                 var graph = context.graph();
60701                 var entity = graph.entity(entityID);
60702                 var preset = context.presets().match(entity, graph);
60703
60704                 if (preset.isFallback()) return null;
60705
60706                 if (entity.type === 'node' &&
60707                     preset.id !== 'address' &&
60708                     Object.keys(entity.tags).some(function(key) {
60709                         return key.match(/^addr:.{1,}/);
60710                     })) {
60711
60712                     return 'address';
60713                 }
60714                 if (entity.geometry(graph) === 'area' &&
60715                     entity.tags.building &&
60716                     !preset.tags.building) {
60717
60718                     return 'building';
60719                 }
60720
60721                 return null;
60722             }
60723
60724             var buildingKeysToKeep = ['architect', 'building', 'height', 'layer', 'source', 'type', 'wheelchair'];
60725             var addressKeysToKeep = ['source'];
60726
60727             var operation = function () {
60728                 context.perform(function(graph) {
60729
60730                     for (var i in selectedIDs) {
60731                         var entityID = selectedIDs[i];
60732                         var type = downgradeTypeForEntityID(entityID);
60733                         if (!type) continue;
60734
60735                         var tags = Object.assign({}, graph.entity(entityID).tags);  // shallow copy
60736                         for (var key in tags) {
60737                             if (type === 'address' && addressKeysToKeep.indexOf(key) !== -1) continue;
60738                             if (type === 'building') {
60739                                 if (buildingKeysToKeep.indexOf(key) !== -1 ||
60740                                     key.match(/^building:.{1,}/) ||
60741                                     key.match(/^roof:.{1,}/)) continue;
60742                             }
60743                             // keep address tags for buildings too
60744                             if (key.match(/^addr:.{1,}/)) continue;
60745
60746                             delete tags[key];
60747                         }
60748                         graph = actionChangeTags(entityID, tags)(graph);
60749                     }
60750                     return graph;
60751                 }, operation.annotation());
60752
60753                 context.validator().validate();
60754
60755                 // refresh the select mode to enable the delete operation
60756                 context.enter(modeSelect(context, selectedIDs));
60757             };
60758
60759
60760             operation.available = function () {
60761                 return downgradeType;
60762             };
60763
60764
60765             operation.disabled = function () {
60766                 if (selectedIDs.some(hasWikidataTag)) {
60767                     return 'has_wikidata_tag';
60768                 }
60769                 return false;
60770
60771                 function hasWikidataTag(id) {
60772                     var entity = context.entity(id);
60773                     return entity.tags.wikidata && entity.tags.wikidata.trim().length > 0;
60774                 }
60775             };
60776
60777
60778             operation.tooltip = function () {
60779                 var disable = operation.disabled();
60780                 return disable ?
60781                     t('operations.downgrade.' + disable + '.' + multi) :
60782                     t('operations.downgrade.description.' + downgradeType);
60783             };
60784
60785
60786             operation.annotation = function () {
60787                 var suffix;
60788                 if (downgradeType === 'building_address') {
60789                     suffix = 'multiple';
60790                 } else {
60791                     suffix = downgradeType + '.' + multi;
60792                 }
60793                 return t('operations.downgrade.annotation.' + suffix, { n: affectedFeatureCount});
60794             };
60795
60796
60797             operation.id = 'downgrade';
60798             operation.keys = [uiCmd('⌘⌫'), uiCmd('⌘⌦'), uiCmd('⌦')];
60799             operation.title = t('operations.downgrade.title');
60800             operation.behavior = behaviorOperation(context).which(operation);
60801
60802
60803             return operation;
60804         }
60805
60806         function operationExtract(selectedIDs, context) {
60807             var entityID = selectedIDs.length && selectedIDs[0];
60808             var action = actionExtract(entityID, context.projection);
60809
60810             var geometry = entityID && context.geometry(entityID);
60811             var extent = geometry === 'area' && context.entity(entityID).extent(context.graph());
60812
60813
60814             var operation = function () {
60815                 context.perform(action);  // do the extract
60816                 context.validator().validate();
60817
60818                 var extractedNodeID = action.getExtractedNodeID();
60819
60820                 var mouse = context.map().mouseCoordinates();
60821                 if (mouse.some(isNaN)) {
60822                     enterMoveMode();
60823
60824                 } else {
60825                     // move detached node to the mouse location (transitioned)
60826                     context.perform(actionMoveNode(extractedNodeID, mouse));
60827
60828                     // after transition completes, put at final mouse location and enter move mode.
60829                     window.setTimeout(function() {
60830                         mouse = context.map().mouseCoordinates();
60831                         context.replace(actionMoveNode(extractedNodeID, mouse));
60832                         enterMoveMode();
60833                     }, 150);
60834                 }
60835
60836                 function enterMoveMode() {
60837                     var baseGraph = context.graph();
60838                     context.enter(modeMove(context, [extractedNodeID], baseGraph));
60839                 }
60840             };
60841
60842
60843             operation.available = function () {
60844                 if (selectedIDs.length !== 1) return false;
60845
60846                 var graph = context.graph();
60847                 var entity = graph.hasEntity(entityID);
60848                 if (!entity) return false;
60849
60850                 if (!entity.hasInterestingTags()) return false;
60851
60852                 if (geometry === 'area') {
60853                     var preset = context.presets().match(entity, graph);
60854                     return preset.geometry.indexOf('point') !== -1;
60855                 }
60856
60857                 return entity.type === 'node' && graph.parentWays(entity).length > 0;
60858             };
60859
60860
60861             operation.disabled = function () {
60862                 var reason = action.disabled(context.graph());
60863                 if (reason) {
60864                     return reason;
60865                 } else if (geometry === 'vertex' && selectedIDs.some(context.hasHiddenConnections)) {
60866                     return 'connected_to_hidden';
60867                 } else if (extent && extent.area() && extent.percentContainedIn(context.extent()) < 0.8) {
60868                     return 'too_large';
60869                 }
60870
60871                 return false;
60872             };
60873
60874
60875             operation.tooltip = function () {
60876                 var disableReason = operation.disabled();
60877                 if (disableReason) {
60878                     return t('operations.extract.' + disableReason + '.' + geometry + '.single',
60879                         { relation: context.presets().item('type/restriction').name() });
60880                 } else {
60881                     return t('operations.extract.description.' + geometry + '.single');
60882                 }
60883             };
60884
60885
60886             operation.annotation = function () {
60887                 return t('operations.extract.annotation.single');
60888             };
60889
60890
60891             operation.id = 'extract';
60892             operation.keys = [t('operations.extract.key')];
60893             operation.title = t('operations.extract.title');
60894             operation.behavior = behaviorOperation(context).which(operation);
60895
60896
60897             return operation;
60898         }
60899
60900         function operationMerge(selectedIDs, context) {
60901
60902             function updatePresetTags(newGraph, ids) {
60903                 var id = ids[0];
60904                 var newEntity = newGraph.hasEntity(id);
60905
60906                 if (!newEntity) return;
60907                 var newPreset = context.presets().match(newEntity, newGraph);
60908                 context.replace(actionChangePreset(id, null, newPreset), operation.annotation());
60909             }
60910
60911
60912             var join = actionJoin(selectedIDs);
60913             var merge = actionMerge(selectedIDs);
60914             var mergePolygon = actionMergePolygon(selectedIDs);
60915             var mergeNodes = actionMergeNodes(selectedIDs);
60916
60917
60918             var operation = function() {
60919                 var doUpdateTags;
60920                 var action;
60921
60922                 if (!join.disabled(context.graph())) {
60923                     doUpdateTags = false;
60924                     action = join;
60925                 } else if (!merge.disabled(context.graph())) {
60926                     doUpdateTags = true;
60927                     action = merge;
60928                 } else if (!mergePolygon.disabled(context.graph())) {
60929                     doUpdateTags = false;
60930                     action = mergePolygon;
60931                 } else {
60932                     doUpdateTags = true;
60933                     action = mergeNodes;
60934                 }
60935
60936                 context.perform(action, operation.annotation());
60937
60938                 var ids = selectedIDs.filter(function(id) {
60939                     var entity = context.hasEntity(id);
60940                     return entity && entity.type !== 'node';
60941                 });
60942
60943                 // if we merged tags, rematch preset to update tags if necessary (#3851)
60944                 if (doUpdateTags) {
60945                     updatePresetTags(context.graph(), ids);
60946                 }
60947
60948                 context.validator().validate();
60949                 context.enter(modeSelect(context, ids));
60950             };
60951
60952
60953             operation.available = function() {
60954                 return selectedIDs.length >= 2;
60955             };
60956
60957
60958             operation.disabled = function() {
60959                 return join.disabled(context.graph()) &&
60960                     merge.disabled(context.graph()) &&
60961                     mergePolygon.disabled(context.graph()) &&
60962                     mergeNodes.disabled(context.graph());
60963             };
60964
60965
60966             operation.tooltip = function() {
60967                 var j = join.disabled(context.graph());          // 'not_eligible', 'not_adjacent', 'restriction', 'conflicting_tags'
60968                 var m = merge.disabled(context.graph());         // 'not_eligible'
60969                 var p = mergePolygon.disabled(context.graph());  // 'not_eligible', 'incomplete_relation'
60970                 var n = mergeNodes.disabled(context.graph());    // 'not_eligible', 'relation', 'restriction'
60971
60972                 // disabled for one of various reasons
60973                 if (j && m && p && n) {
60974                     if (j === 'restriction' || n === 'restriction') {
60975                         return t('operations.merge.restriction',
60976                             { relation: context.presets().item('type/restriction').name() });
60977
60978                     } else if (p === 'incomplete_relation') {
60979                         return t('operations.merge.incomplete_relation');
60980
60981                     } else if (n === 'relation') {
60982                         return t('operations.merge.relation');
60983
60984                     } else {
60985                         return t('operations.merge.' + j);
60986                     }
60987
60988                 } else {
60989                     return t('operations.merge.description');
60990                 }
60991             };
60992
60993
60994             operation.annotation = function() {
60995                 return t('operations.merge.annotation', { n: selectedIDs.length });
60996             };
60997
60998
60999             operation.id = 'merge';
61000             operation.keys = [t('operations.merge.key')];
61001             operation.title = t('operations.merge.title');
61002             operation.behavior = behaviorOperation(context).which(operation);
61003
61004             return operation;
61005         }
61006
61007         function operationReverse(selectedIDs, context) {
61008             var entityID = selectedIDs[0];
61009
61010             var operation = function() {
61011                 context.perform(actionReverse(entityID), operation.annotation());
61012                 context.validator().validate();
61013             };
61014
61015
61016             operation.available = function() {
61017                 return selectedIDs.length === 1 && context.geometry(entityID) === 'line';
61018             };
61019
61020
61021             operation.disabled = function() {
61022                 return false;
61023             };
61024
61025
61026             operation.tooltip = function() {
61027                 return t('operations.reverse.description');
61028             };
61029
61030
61031             operation.annotation = function() {
61032                 return t('operations.reverse.annotation');
61033             };
61034
61035
61036             operation.id = 'reverse';
61037             operation.keys = [t('operations.reverse.key')];
61038             operation.title = t('operations.reverse.title');
61039             operation.behavior = behaviorOperation(context).which(operation);
61040
61041             return operation;
61042         }
61043
61044         function operationSplit(selectedIDs, context) {
61045             var vertices = selectedIDs
61046                 .filter(function(id) { return context.geometry(id) === 'vertex'; });
61047             var entityID = vertices[0];
61048             var action = actionSplit(entityID);
61049             var ways = [];
61050
61051             if (vertices.length === 1) {
61052                 if (entityID && selectedIDs.length > 1) {
61053                     var ids = selectedIDs.filter(function(id) { return id !== entityID; });
61054                     action.limitWays(ids);
61055                 }
61056                 ways = action.ways(context.graph());
61057             }
61058
61059
61060             var operation = function() {
61061                 var difference = context.perform(action, operation.annotation());
61062                 context.enter(modeSelect(context, difference.extantIDs()));
61063             };
61064
61065
61066             operation.available = function() {
61067                 return vertices.length === 1;
61068             };
61069
61070
61071             operation.disabled = function() {
61072                 var reason = action.disabled(context.graph());
61073                 if (reason) {
61074                     return reason;
61075                 } else if (selectedIDs.some(context.hasHiddenConnections)) {
61076                     return 'connected_to_hidden';
61077                 }
61078
61079                 return false;
61080             };
61081
61082
61083             operation.tooltip = function() {
61084                 var disable = operation.disabled();
61085                 if (disable) {
61086                     return t('operations.split.' + disable);
61087                 } else if (ways.length === 1) {
61088                     return t('operations.split.description.' + context.geometry(ways[0].id));
61089                 } else {
61090                     return t('operations.split.description.multiple');
61091                 }
61092             };
61093
61094
61095             operation.annotation = function() {
61096                 return ways.length === 1 ?
61097                     t('operations.split.annotation.' + context.geometry(ways[0].id)) :
61098                     t('operations.split.annotation.multiple', { n: ways.length });
61099             };
61100
61101
61102             operation.id = 'split';
61103             operation.keys = [t('operations.split.key')];
61104             operation.title = t('operations.split.title');
61105             operation.behavior = behaviorOperation(context).which(operation);
61106
61107             return operation;
61108         }
61109
61110         function operationStraighten(selectedIDs, context) {
61111             var wayIDs = selectedIDs.filter(function(id) { return id.charAt(0) === 'w'; });
61112             var nodeIDs = selectedIDs.filter(function(id) { return id.charAt(0) === 'n'; });
61113
61114             var nodes = utilGetAllNodes(selectedIDs, context.graph());
61115             var coords = nodes.map(function(n) { return n.loc; });
61116             var action = chooseAction();
61117             var geometry;
61118
61119
61120             function chooseAction() {
61121                 // straighten selected nodes
61122                 if (wayIDs.length === 0 && nodeIDs.length > 2) {
61123                     geometry = 'points';
61124                     return actionStraightenNodes(nodeIDs, context.projection);
61125
61126                 // straighten selected ways (possibly between range of 2 selected nodes)
61127                 } else if (wayIDs.length > 0 && (nodeIDs.length === 0 || nodeIDs.length === 2)) {
61128                     var startNodeIDs = [];
61129                     var endNodeIDs = [];
61130
61131                     for (var i = 0; i < selectedIDs.length; i++) {
61132                         var entity = context.entity(selectedIDs[i]);
61133                         if (entity.type === 'node') {
61134                             continue;
61135                         } else if (entity.type !== 'way' || entity.isClosed()) {
61136                             return false;  // exit early, can't straighten these
61137                         }
61138
61139                         startNodeIDs.push(entity.first());
61140                         endNodeIDs.push(entity.last());
61141                     }
61142
61143                     // Remove duplicate end/startNodeIDs (duplicate nodes cannot be at the line end)
61144                     startNodeIDs = startNodeIDs.filter(function(n) {
61145                         return startNodeIDs.indexOf(n) === startNodeIDs.lastIndexOf(n);
61146                     });
61147                     endNodeIDs = endNodeIDs.filter(function(n) {
61148                         return endNodeIDs.indexOf(n) === endNodeIDs.lastIndexOf(n);
61149                     });
61150
61151                     // Ensure all ways are connected (i.e. only 2 unique endpoints/startpoints)
61152                     if (utilArrayDifference(startNodeIDs, endNodeIDs).length +
61153                         utilArrayDifference(endNodeIDs, startNodeIDs).length !== 2) return false;
61154
61155                     // Ensure path contains at least 3 unique nodes
61156                     var wayNodeIDs = utilGetAllNodes(wayIDs, context.graph())
61157                         .map(function(node) { return node.id; });
61158                     if (wayNodeIDs.length <= 2) return false;
61159
61160                     // If range of 2 selected nodes is supplied, ensure nodes lie on the selected path
61161                     if (nodeIDs.length === 2 && (
61162                         wayNodeIDs.indexOf(nodeIDs[0]) === -1 || wayNodeIDs.indexOf(nodeIDs[1]) === -1
61163                     )) return false;
61164
61165                     geometry = 'line';
61166                     return actionStraightenWay(selectedIDs, context.projection);
61167                 }
61168
61169                 return false;
61170             }
61171
61172
61173             function operation() {
61174                 if (!action) return;
61175
61176                 context.perform(action, operation.annotation());
61177
61178                 window.setTimeout(function() {
61179                     context.validator().validate();
61180                 }, 300);  // after any transition
61181             }
61182
61183
61184             operation.available = function() {
61185                 return Boolean(action);
61186             };
61187
61188
61189             operation.disabled = function() {
61190                 var reason = action.disabled(context.graph());
61191                 if (reason) {
61192                     return reason;
61193                 } else if (someMissing()) {
61194                     return 'not_downloaded';
61195                 } else if (selectedIDs.some(context.hasHiddenConnections)) {
61196                     return 'connected_to_hidden';
61197                 }
61198
61199                 return false;
61200
61201
61202                 function someMissing() {
61203                     if (context.inIntro()) return false;
61204                     var osm = context.connection();
61205                     if (osm) {
61206                         var missing = coords.filter(function(loc) { return !osm.isDataLoaded(loc); });
61207                         if (missing.length) {
61208                             missing.forEach(function(loc) { context.loadTileAtLoc(loc); });
61209                             return true;
61210                         }
61211                     }
61212                     return false;
61213                 }
61214             };
61215
61216
61217             operation.tooltip = function() {
61218                 var disable = operation.disabled();
61219                 return disable ?
61220                     t('operations.straighten.' + disable) :
61221                     t('operations.straighten.description.' + geometry);
61222             };
61223
61224
61225             operation.annotation = function() {
61226                 return t('operations.straighten.annotation.' + geometry);
61227             };
61228
61229
61230             operation.id = 'straighten';
61231             operation.keys = [t('operations.straighten.key')];
61232             operation.title = t('operations.straighten.title');
61233             operation.behavior = behaviorOperation(context).which(operation);
61234
61235             return operation;
61236         }
61237
61238
61239
61240         var Operations = /*#__PURE__*/Object.freeze({
61241                 operationCircularize: operationCircularize,
61242                 operationContinue: operationContinue,
61243                 operationDelete: operationDelete,
61244                 operationDisconnect: operationDisconnect,
61245                 operationDowngrade: operationDowngrade,
61246                 operationExtract: operationExtract,
61247                 operationMerge: operationMerge,
61248                 operationMove: operationMove,
61249                 operationOrthogonalize: operationOrthogonalize,
61250                 operationReflectShort: operationReflectShort,
61251                 operationReflectLong: operationReflectLong,
61252                 operationReverse: operationReverse,
61253                 operationRotate: operationRotate,
61254                 operationSplit: operationSplit,
61255                 operationStraighten: operationStraighten
61256         });
61257
61258         function uiEditMenu(context, operations) {
61259             var menu;
61260             var center = [0, 0];
61261             var offset = [0, 0];
61262             var tooltip;
61263
61264             var p = 8;               // top padding
61265             var m = 4;               // top margin
61266             var h = 15;              // height of icon
61267             var vpBottomMargin = 45; // viewport bottom margin
61268             var vpSideMargin = 35;   // viewport side margin
61269             var buttonWidth = 44;
61270             var buttonHeight = (2 * p + h);
61271             var menuWidth = buttonWidth;
61272             var menuHeight = (2 * m) + operations.length * buttonHeight;
61273             var menuSideMargin = 10;
61274             var tooltipWidth = 200;
61275             var tooltipHeight = 200;  // a reasonable guess, real height depends on tooltip contents
61276
61277
61278             var editMenu = function (selection) {
61279                 if (!operations.length) return;
61280
61281                 selection.node().parentNode.focus();
61282
61283                 var isRTL = textDirection === 'rtl';
61284                 var viewport = context.surfaceRect();
61285
61286                 if (!isRTL && (center[0] + menuSideMargin + menuWidth) > (viewport.width - vpSideMargin)) {
61287                     // menu is going left-to-right and near right viewport edge, go left instead
61288                     isRTL = true;
61289                 } else if (isRTL && (center[0] - menuSideMargin - menuWidth) < vpSideMargin) {
61290                     // menu is going right-to-left and near left viewport edge, go right instead
61291                     isRTL = false;
61292                 }
61293
61294                 offset[0] = (isRTL ? -1 * (menuSideMargin + menuWidth) : menuSideMargin);
61295
61296                 if (center[1] + menuHeight > (viewport.height - vpBottomMargin)) {
61297                     // menu is near bottom viewport edge, shift upwards
61298                     offset[1] = -1 * (center[1] + menuHeight - viewport.height + vpBottomMargin);
61299                 }
61300
61301                 var origin = geoVecAdd(center, offset);
61302
61303                 menu = selection
61304                     .append('g')
61305                     .attr('class', 'edit-menu')
61306                     .attr('transform', 'translate(' + origin + ')')
61307                     .attr('opacity', 0);
61308
61309                 menu
61310                     .transition()
61311                     .attr('opacity', 1);
61312
61313                 menu
61314                     .append('rect')
61315                     .attr('class', 'edit-menu-background')
61316                     .attr('x', 4)
61317                     .attr('rx', 4)
61318                     .attr('ry', 4)
61319                     .attr('width', menuWidth)
61320                     .attr('height', menuHeight)
61321                     .attr('stroke-linecap', 'round');
61322
61323
61324                 var buttons = menu.selectAll('.edit-menu-item')
61325                     .data(operations);
61326
61327                 // enter
61328                 var buttonsEnter = buttons.enter()
61329                     .append('g')
61330                     .attr('class', function (d) { return 'edit-menu-item edit-menu-item-' + d.id; })
61331                     .attr('transform', function(d, i) {
61332                         return 'translate(' + geoVecFloor([0, m + i * buttonHeight]).join(',') + ')';
61333                     });
61334
61335                 buttonsEnter
61336                     .append('rect')
61337                     .attr('x', 4)
61338                     .attr('width', buttonWidth)
61339                     .attr('height', buttonHeight)
61340                     .on('click', click)
61341                     .on('mousedown', mousedown)
61342                     .on('mouseover', mouseover)
61343                     .on('mouseout', mouseout);
61344
61345                 buttonsEnter
61346                     .append('use')
61347                     .attr('width', '20')
61348                     .attr('height', '20')
61349                     .attr('transform', function () { return 'translate(' + [2 * p, 5] + ')'; })
61350                     .attr('xlink:href', function (d) { return '#iD-operation-' + d.id; });
61351
61352                 // update
61353                 buttons = buttonsEnter
61354                     .merge(buttons)
61355                     .classed('disabled', function(d) { return d.disabled(); });
61356
61357
61358                 tooltip = d3_select('#id-container')
61359                     .append('div')
61360                     .attr('class', 'tooltip-inner edit-menu-tooltip');
61361
61362
61363                 function click(operation) {
61364                     event.stopPropagation();
61365                     if (operation.disabled()) return;
61366                     operation();
61367                     editMenu.close();
61368                 }
61369
61370                 function mousedown() {
61371                     event.stopPropagation();  // https://github.com/openstreetmap/iD/issues/1869
61372                 }
61373
61374                 function mouseover(d, i) {
61375                     var tipX, tipY;
61376
61377                     if (!isRTL) {
61378                         tipX = viewport.left + origin[0] + menuSideMargin + menuWidth;
61379                     } else {
61380                         tipX = viewport.left + origin[0] - 4 - tooltipWidth;
61381                     }
61382
61383                     if (tipX + tooltipWidth > viewport.right) {
61384                         // tip is going left-to-right and near right viewport edge, go left instead
61385                         tipX = viewport.left + origin[0] - 4 - tooltipWidth;
61386                     } else if (tipX < viewport.left) {
61387                         // tip is going right-to-left and near left viewport edge, go right instead
61388                         tipX = viewport.left + origin[0] + menuSideMargin + menuWidth;
61389                     }
61390
61391                     tipY = viewport.top + origin[1] + (i * buttonHeight);
61392                     if (tipY + tooltipHeight > viewport.bottom) {
61393                         // tip is near bottom viewport edge, shift upwards
61394                         tipY -= tipY + tooltipHeight - viewport.bottom;
61395                     }
61396
61397                     tooltip
61398                         .style('left', tipX + 'px')
61399                         .style('top', tipY + 'px')
61400                         .style('display', 'block')
61401                         .html(uiTooltipHtml(d.tooltip(), d.keys[0], d.title));
61402
61403                     // update disabled again, just in case tooltip and disabled state disagree
61404                     // https://github.com/openstreetmap/iD/issues/6296#issuecomment-489259027
61405                     d3_select(this.parentNode)
61406                         .classed('disabled', d.disabled());
61407
61408                 }
61409
61410                 function mouseout() {
61411                     tooltip.style('display', 'none');
61412                 }
61413             };
61414
61415
61416             editMenu.close = function () {
61417                 if (menu) {
61418                     menu
61419                         .style('pointer-events', 'none')
61420                         .transition()
61421                         .attr('opacity', 0)
61422                         .remove();
61423                 }
61424
61425                 if (tooltip) {
61426                     tooltip.remove();
61427                 }
61428             };
61429
61430
61431             editMenu.center = function(val) {
61432                 if (!arguments.length) return center;
61433                 center = val;
61434                 return editMenu;
61435             };
61436
61437
61438             return editMenu;
61439         }
61440
61441         function uiSelectionList(context, selectedIDs) {
61442
61443             function selectEntity(entity) {
61444                 context.enter(modeSelect(context, [entity.id]));
61445             }
61446
61447
61448             function deselectEntity(entity) {
61449                 event.stopPropagation();
61450                 var index = selectedIDs.indexOf(entity.id);
61451                 if (index > -1) {
61452                     selectedIDs.splice(index, 1);
61453                 }
61454                 context.enter(modeSelect(context, selectedIDs));
61455             }
61456
61457
61458             function selectionList(selection) {
61459                 selection.classed('selection-list-pane', true);
61460
61461                 var header = selection
61462                     .append('div')
61463                     .attr('class', 'header fillL cf');
61464
61465                 header
61466                     .append('h3')
61467                     .text(t('inspector.multiselect'));
61468
61469                 var listWrap = selection
61470                     .append('div')
61471                     .attr('class', 'inspector-body');
61472
61473                 var list = listWrap
61474                     .append('div')
61475                     .attr('class', 'feature-list cf');
61476
61477
61478                 context.history()
61479                     .on('change.selectionList', function(difference) {
61480                         if (difference) drawList();
61481                     });
61482
61483                 drawList();
61484
61485
61486                 function drawList() {
61487                     var entities = selectedIDs
61488                         .map(function(id) { return context.hasEntity(id); })
61489                         .filter(function(entity) { return entity; });
61490
61491                     var items = list.selectAll('.feature-list-item')
61492                         .data(entities, osmEntity.key);
61493
61494                     items.exit()
61495                         .remove();
61496
61497                     // Enter
61498                     var enter = items.enter()
61499                         .append('div')
61500                         .attr('class', 'feature-list-item')
61501                         .on('click', selectEntity);
61502
61503                     enter
61504                         .each(function(d) {
61505                             d3_select(this).on('mouseover', function() {
61506                                 utilHighlightEntities([d.id], true, context);
61507                             });
61508                             d3_select(this).on('mouseout', function() {
61509                                 utilHighlightEntities([d.id], false, context);
61510                             });
61511                         });
61512
61513                     var label = enter
61514                         .append('button')
61515                         .attr('class', 'label');
61516
61517                     enter
61518                         .append('button')
61519                         .attr('class', 'close')
61520                         .on('click', deselectEntity)
61521                         .call(svgIcon('#iD-icon-close'));
61522
61523                     label
61524                         .append('span')
61525                         .attr('class', 'entity-geom-icon')
61526                         .call(svgIcon('', 'pre-text'));
61527
61528                     label
61529                         .append('span')
61530                         .attr('class', 'entity-type');
61531
61532                     label
61533                         .append('span')
61534                         .attr('class', 'entity-name');
61535
61536                     // Update
61537                     items = items.merge(enter);
61538
61539                     items.selectAll('.entity-geom-icon use')
61540                         .attr('href', function() {
61541                             var entity = this.parentNode.parentNode.__data__;
61542                             return '#iD-icon-' + context.geometry(entity.id);
61543                         });
61544
61545                     items.selectAll('.entity-type')
61546                         .text(function(entity) { return context.presets().match(entity, context.graph()).name(); });
61547
61548                     items.selectAll('.entity-name')
61549                         .text(function(entity) { return utilDisplayName(entity); });
61550                 }
61551             }
61552
61553             return selectionList;
61554         }
61555
61556         function uiRadialMenu(context, operations) {
61557             var menu;
61558             var center = [0, 0];
61559             var tooltip;
61560
61561
61562             var radialMenu = function(selection) {
61563                 if (!operations.length) return;
61564
61565                 selection.node().parentNode.focus();
61566
61567                 function click(operation) {
61568                     event.stopPropagation();
61569                     if (operation.disabled()) return;
61570                     operation();
61571                     radialMenu.close();
61572                 }
61573
61574                 menu = selection
61575                     .append('g')
61576                     .attr('class', 'radial-menu')
61577                     .attr('transform', 'translate(' + center + ')')
61578                     .attr('opacity', 0);
61579
61580                 menu
61581                     .transition()
61582                     .attr('opacity', 1);
61583
61584                 var r = 50;
61585                 var a = Math.PI / 4;
61586                 var a0 = -Math.PI / 4;
61587                 var a1 = a0 + (operations.length - 1) * a;
61588
61589                 menu
61590                     .append('path')
61591                     .attr('class', 'radial-menu-background')
61592                     .attr('d', 'M' + r * Math.sin(a0) + ',' +
61593                                      r * Math.cos(a0) +
61594                               ' A' + r + ',' + r + ' 0 ' + (operations.length > 5 ? '1' : '0') + ',0 ' +
61595                                      (r * Math.sin(a1) + 1e-3) + ',' +
61596                                      (r * Math.cos(a1) + 1e-3)) // Force positive-length path (#1305)
61597                     .attr('stroke-width', 50)
61598                     .attr('stroke-linecap', 'round');
61599
61600                 var button = menu.selectAll()
61601                     .data(operations)
61602                     .enter()
61603                     .append('g')
61604                     .attr('class', function(d) { return 'radial-menu-item radial-menu-item-' + d.id; })
61605                     .classed('disabled', function(d) { return d.disabled(); })
61606                     .attr('transform', function(d, i) {
61607                         return 'translate(' + geoVecFloor([
61608                                 r * Math.sin(a0 + i * a),
61609                                 r * Math.cos(a0 + i * a)]).join(',') + ')';
61610                     });
61611
61612                 button
61613                     .append('circle')
61614                     .attr('r', 15)
61615                     .on('click', click)
61616                     .on('mousedown', mousedown)
61617                     .on('mouseover', mouseover)
61618                     .on('mouseout', mouseout);
61619
61620                 button
61621                     .append('use')
61622                     .attr('transform', 'translate(-10,-10)')
61623                     .attr('width', '20')
61624                     .attr('height', '20')
61625                     .attr('xlink:href', function(d) { return '#iD-operation-' + d.id; });
61626
61627                 tooltip = d3_select(document.body)
61628                     .append('div')
61629                     .attr('class', 'tooltip-inner radial-menu-tooltip');
61630
61631                 function mousedown() {
61632                     event.stopPropagation(); // https://github.com/openstreetmap/iD/issues/1869
61633                 }
61634
61635                 function mouseover(d, i) {
61636                     var rect = context.surfaceRect();
61637                     var angle = a0 + i * a;
61638                     var top = rect.top + (r + 25) * Math.cos(angle) + center[1] + 'px';
61639                     var left = rect.left + (r + 25) * Math.sin(angle) + center[0] + 'px';
61640                     var bottom = rect.height - (r + 25) * Math.cos(angle) - center[1] + 'px';
61641                     var right = rect.width - (r + 25) * Math.sin(angle) - center[0] + 'px';
61642
61643                     tooltip
61644                         .style('top', null)
61645                         .style('left', null)
61646                         .style('bottom', null)
61647                         .style('right', null)
61648                         .style('display', 'block')
61649                         .html(uiTooltipHtml(d.tooltip(), d.keys[0]));
61650
61651                     if (i === 0) {
61652                         tooltip
61653                             .style('right', right)
61654                             .style('top', top);
61655                     } else if (i >= 4) {
61656                         tooltip
61657                             .style('left', left)
61658                             .style('bottom', bottom);
61659                     } else {
61660                         tooltip
61661                             .style('left', left)
61662                             .style('top', top);
61663                     }
61664                 }
61665
61666                 function mouseout() {
61667                     tooltip.style('display', 'none');
61668                 }
61669             };
61670
61671
61672             radialMenu.close = function() {
61673                 if (menu) {
61674                     menu
61675                         .style('pointer-events', 'none')
61676                         .transition()
61677                         .attr('opacity', 0)
61678                         .remove();
61679                 }
61680
61681                 if (tooltip) {
61682                     tooltip.remove();
61683                 }
61684             };
61685
61686
61687             radialMenu.center = function(_) {
61688                 if (!arguments.length) return center;
61689                 center = _;
61690                 return radialMenu;
61691             };
61692
61693
61694             return radialMenu;
61695         }
61696
61697         var _relatedParent;
61698
61699
61700         function modeSelect(context, selectedIDs) {
61701             var mode = {
61702                 id: 'select',
61703                 button: 'browse'
61704             };
61705
61706             var keybinding = utilKeybinding('select');
61707             var behaviors = [
61708                 behaviorCopy(context),
61709                 behaviorPaste(context),
61710                 behaviorBreathe(context),
61711                 behaviorHover(context),
61712                 behaviorSelect(context),
61713                 behaviorLasso(context),
61714                 modeDragNode(context).restoreSelectedIDs(selectedIDs).behavior,
61715                 modeDragNote(context).behavior
61716             ];
61717             var editMenu;
61718             var _timeout = null;
61719             var _newFeature = false;
61720             var _suppressMenu = true;
61721             var _follow = false;
61722
61723
61724             var wrap = context.container()
61725                 .select('.inspector-wrap');
61726
61727
61728             function singular() {
61729                 if (selectedIDs && selectedIDs.length === 1) {
61730                     return context.hasEntity(selectedIDs[0]);
61731                 }
61732             }
61733
61734
61735             function checkSelectedIDs() {
61736                 var ids = [];
61737                 if (Array.isArray(selectedIDs)) {
61738                     ids = selectedIDs.filter(function(id) {
61739                         return context.hasEntity(id);
61740                     });
61741                 }
61742
61743                 if (ids.length) {
61744                     selectedIDs = ids;
61745                 } else {
61746                     context.enter(modeBrowse(context));
61747                 }
61748                 return !!ids.length;
61749             }
61750
61751
61752             // find the common parent ways for nextVertex, previousVertex
61753             function commonParents() {
61754                 var graph = context.graph();
61755                 var commonParents = [];
61756
61757                 for (var i = 0; i < selectedIDs.length; i++) {
61758                     var entity = context.hasEntity(selectedIDs[i]);
61759                     if (!entity || entity.geometry(graph) !== 'vertex') {
61760                         return [];  // selection includes some not vertexes
61761                     }
61762
61763                     var currParents = graph.parentWays(entity).map(function(w) { return w.id; });
61764                     if (!commonParents.length) {
61765                         commonParents = currParents;
61766                         continue;
61767                     }
61768
61769                     commonParents = utilArrayIntersection(commonParents, currParents);
61770                     if (!commonParents.length) {
61771                         return [];
61772                     }
61773                 }
61774
61775                 return commonParents;
61776             }
61777
61778
61779             function singularParent() {
61780                 var parents = commonParents();
61781                 if (!parents || parents.length === 0) {
61782                     _relatedParent = null;
61783                     return null;
61784                 }
61785
61786                 // relatedParent is used when we visit a vertex with multiple
61787                 // parents, and we want to remember which parent line we started on.
61788
61789                 if (parents.length === 1) {
61790                     _relatedParent = parents[0];  // remember this parent for later
61791                     return _relatedParent;
61792                 }
61793
61794                 if (parents.indexOf(_relatedParent) !== -1) {
61795                     return _relatedParent;   // prefer the previously seen parent
61796                 }
61797
61798                 return parents[0];
61799             }
61800
61801
61802             function closeMenu() {
61803                 if (editMenu) {
61804                     context.surface().call(editMenu.close);
61805                 }
61806             }
61807
61808
61809             function positionMenu() {
61810                 if (!editMenu) return;
61811
61812                 var entity = singular();
61813                 if (entity && context.geometry(entity.id) === 'relation') {
61814                     _suppressMenu = true;
61815                 } else {
61816                     var point = context.mouse();
61817                     var viewport = geoExtent(context.projection.clipExtent()).polygon();
61818
61819                     if (point && geoPointInPolygon(point, viewport)) {
61820                         editMenu.center(point);
61821                     } else {
61822                         _suppressMenu = true;
61823                     }
61824                 }
61825             }
61826
61827
61828             function showMenu() {
61829                 closeMenu();
61830                 if (editMenu) {
61831                     context.surface().call(editMenu);
61832                 }
61833             }
61834
61835
61836             function toggleMenu() {
61837                 // deprecation warning - Radial Menu to be removed in iD v3
61838                 if (d3_select('.edit-menu, .radial-menu').empty()) {
61839                     positionMenu();
61840                     showMenu();
61841                 } else {
61842                     closeMenu();
61843                 }
61844             }
61845
61846
61847             mode.selectedIDs = function() {
61848                 return selectedIDs;
61849             };
61850
61851
61852             mode.zoomToSelected = function() {
61853                 var entity = singular();
61854                 if (entity) {
61855                     context.map().zoomToEase(entity);
61856                 }
61857             };
61858
61859
61860             mode.reselect = function() {
61861                 if (!checkSelectedIDs()) return;
61862
61863                 var surfaceNode = context.surface().node();
61864                 if (surfaceNode.focus) {   // FF doesn't support it
61865                     surfaceNode.focus();
61866                 }
61867
61868                 positionMenu();
61869                 if (!_suppressMenu) {
61870                     showMenu();
61871                 }
61872             };
61873
61874
61875             mode.newFeature = function(val) {
61876                 if (!arguments.length) return _newFeature;
61877                 _newFeature = val;
61878                 return mode;
61879             };
61880
61881
61882             mode.suppressMenu = function(val) {
61883                 if (!arguments.length) return _suppressMenu;
61884                 _suppressMenu = val;
61885                 return mode;
61886             };
61887
61888
61889             mode.follow = function(val) {
61890                 if (!arguments.length) return _follow;
61891                 _follow = val;
61892                 return mode;
61893             };
61894
61895
61896             mode.enter = function() {
61897                 if (!checkSelectedIDs()) return;
61898
61899                 context.features().forceVisible(selectedIDs);
61900
61901                 var operations = Object.values(Operations)
61902                     .map(function(o) { return o(selectedIDs, context); })
61903                     .filter(function(o) { return o.available() && o.id !== 'delete' && o.id !== 'downgrade'; });
61904
61905                 var downgradeOperation = operationDowngrade(selectedIDs, context);
61906                 // don't allow delete if downgrade is available
61907                 var lastOperation = !context.inIntro() && downgradeOperation.available() ? downgradeOperation : operationDelete(selectedIDs, context);
61908
61909                 // deprecation warning - Radial Menu to be removed in iD v3
61910                 var isRadialMenu = context.storage('edit-menu-style') === 'radial';
61911                 if (isRadialMenu) {
61912                     operations = operations.slice(0,7);
61913                     operations.unshift(lastOperation);
61914                 } else {
61915                     operations.push(lastOperation);
61916                 }
61917
61918                 operations.forEach(function(operation) {
61919                     if (operation.behavior) {
61920                         behaviors.push(operation.behavior);
61921                     }
61922                 });
61923
61924                 behaviors.forEach(context.install);
61925
61926                 keybinding
61927                     .on(t('inspector.zoom_to.key'), mode.zoomToSelected)
61928                     .on(['[', 'pgup'], previousVertex)
61929                     .on([']', 'pgdown'], nextVertex)
61930                     .on(['{', uiCmd('⌘['), 'home'], firstVertex)
61931                     .on(['}', uiCmd('⌘]'), 'end'], lastVertex)
61932                     .on(['\\', 'pause'], nextParent)
61933                     .on('⎋', esc, true)
61934                     .on('space', toggleMenu);
61935
61936                 d3_select(document)
61937                     .call(keybinding);
61938
61939
61940                 // deprecation warning - Radial Menu to be removed in iD v3
61941                 editMenu = isRadialMenu
61942                     ? uiRadialMenu(context, operations)
61943                     : uiEditMenu(context, operations);
61944
61945                 context.ui().sidebar
61946                     .select(singular() ? singular().id : null, _newFeature);
61947
61948                 context.history()
61949                     .on('undone.select', update)
61950                     .on('redone.select', update);
61951
61952                 context.map()
61953                     .on('move.select', closeMenu)
61954                     .on('drawn.select', selectElements);
61955
61956                 context.surface()
61957                     .on('dblclick.select', dblclick);
61958
61959
61960                 selectElements();
61961
61962                 if (selectedIDs.length > 1) {
61963                     var entities = uiSelectionList(context, selectedIDs);
61964                     context.ui().sidebar.show(entities);
61965                 }
61966
61967                 if (_follow) {
61968                     var extent = geoExtent();
61969                     var graph = context.graph();
61970                     selectedIDs.forEach(function(id) {
61971                         var entity = context.entity(id);
61972                         extent._extend(entity.extent(graph));
61973                     });
61974
61975                     var loc = extent.center();
61976                     context.map().centerEase(loc);
61977                 } else if (singular() && singular().type === 'way') {
61978                     context.map().pan([0,0]);  // full redraw, to adjust z-sorting #2914
61979                 }
61980
61981                 _timeout = window.setTimeout(function() {
61982                     positionMenu();
61983                     if (!_suppressMenu) {
61984                         showMenu();
61985                     }
61986                 }, 270);  /* after any centerEase completes */
61987
61988
61989                 function update() {
61990                     closeMenu();
61991                     checkSelectedIDs();
61992                 }
61993
61994
61995                 function dblclick() {
61996                     var target = d3_select(event.target);
61997
61998                     var datum = target.datum();
61999                     var entity = datum && datum.properties && datum.properties.entity;
62000                     if (!entity) return;
62001
62002                     if (entity instanceof osmWay && target.classed('target')) {
62003                         var choice = geoChooseEdge(context.childNodes(entity), context.mouse(), context.projection);
62004                         var prev = entity.nodes[choice.index - 1];
62005                         var next = entity.nodes[choice.index];
62006
62007                         context.perform(
62008                             actionAddMidpoint({ loc: choice.loc, edge: [prev, next] }, osmNode()),
62009                             t('operations.add.annotation.vertex')
62010                         );
62011
62012                         event.preventDefault();
62013                         event.stopPropagation();
62014
62015                     } else if (entity.type === 'midpoint') {
62016                         context.perform(
62017                             actionAddMidpoint({ loc: entity.loc, edge: entity.edge }, osmNode()),
62018                             t('operations.add.annotation.vertex'));
62019
62020                         event.preventDefault();
62021                         event.stopPropagation();
62022                     }
62023                 }
62024
62025
62026                 function selectElements(drawn) {
62027                     if (!checkSelectedIDs()) return;
62028
62029                     var surface = context.surface();
62030                     var entity = singular();
62031
62032                     if (entity && context.geometry(entity.id) === 'relation') {
62033                         _suppressMenu = true;
62034                         return;
62035                     }
62036
62037                     surface.selectAll('.related')
62038                         .classed('related', false);
62039
62040                     singularParent();
62041                     if (_relatedParent) {
62042                         surface.selectAll(utilEntitySelector([_relatedParent]))
62043                             .classed('related', true);
62044                     }
62045
62046                     var selection = context.surface()
62047                         .selectAll(utilEntityOrMemberSelector(selectedIDs, context.graph()));
62048
62049                     if (selection.empty()) {
62050                         // Return to browse mode if selected DOM elements have
62051                         // disappeared because the user moved them out of view..
62052                         var source = event && event.type === 'zoom' && event.sourceEvent;
62053                         if (drawn && source && (source.type === 'mousemove' || source.type === 'touchmove')) {
62054                             context.enter(modeBrowse(context));
62055                         }
62056                     } else {
62057                         selection
62058                             .classed('selected', true);
62059                     }
62060                 }
62061
62062
62063                 function esc() {
62064                     if (d3_select('.combobox').size()) return;
62065                     context.enter(modeBrowse(context));
62066                 }
62067
62068
62069                 function firstVertex() {
62070                     event.preventDefault();
62071                     var entity = singular();
62072                     var parent = singularParent();
62073                     var way;
62074
62075                     if (entity && entity.type === 'way') {
62076                         way = entity;
62077                     } else if (parent) {
62078                         way = context.entity(parent);
62079                     }
62080
62081                     if (way) {
62082                         context.enter(
62083                             modeSelect(context, [way.first()]).follow(true)
62084                         );
62085                     }
62086                 }
62087
62088
62089                 function lastVertex() {
62090                     event.preventDefault();
62091                     var entity = singular();
62092                     var parent = singularParent();
62093                     var way;
62094
62095                     if (entity && entity.type === 'way') {
62096                         way = entity;
62097                     } else if (parent) {
62098                         way = context.entity(parent);
62099                     }
62100
62101                     if (way) {
62102                         context.enter(
62103                             modeSelect(context, [way.last()]).follow(true)
62104                         );
62105                     }
62106                 }
62107
62108
62109                 function previousVertex() {
62110                     event.preventDefault();
62111                     var parent = singularParent();
62112                     if (!parent) return;
62113
62114                     var way = context.entity(parent);
62115                     var length = way.nodes.length;
62116                     var curr = way.nodes.indexOf(selectedIDs[0]);
62117                     var index = -1;
62118
62119                     if (curr > 0) {
62120                         index = curr - 1;
62121                     } else if (way.isClosed()) {
62122                         index = length - 2;
62123                     }
62124
62125                     if (index !== -1) {
62126                         context.enter(
62127                             modeSelect(context, [way.nodes[index]]).follow(true)
62128                         );
62129                     }
62130                 }
62131
62132
62133                 function nextVertex() {
62134                     event.preventDefault();
62135                     var parent = singularParent();
62136                     if (!parent) return;
62137
62138                     var way = context.entity(parent);
62139                     var length = way.nodes.length;
62140                     var curr = way.nodes.indexOf(selectedIDs[0]);
62141                     var index = -1;
62142
62143                     if (curr < length - 1) {
62144                         index = curr + 1;
62145                     } else if (way.isClosed()) {
62146                         index = 0;
62147                     }
62148
62149                     if (index !== -1) {
62150                         context.enter(
62151                             modeSelect(context, [way.nodes[index]]).follow(true)
62152                         );
62153                     }
62154                 }
62155
62156
62157                 function nextParent() {
62158                     event.preventDefault();
62159                     var parents = commonParents();
62160                     if (!parents || parents.length < 2) return;
62161
62162                     var index = parents.indexOf(_relatedParent);
62163                     if (index < 0 || index > parents.length - 2) {
62164                         _relatedParent = parents[0];
62165                     } else {
62166                         _relatedParent = parents[index + 1];
62167                     }
62168
62169                     var surface = context.surface();
62170                     surface.selectAll('.related')
62171                         .classed('related', false);
62172
62173                     if (_relatedParent) {
62174                         surface.selectAll(utilEntitySelector([_relatedParent]))
62175                             .classed('related', true);
62176                     }
62177                 }
62178             };
62179
62180
62181             mode.exit = function() {
62182                 if (_timeout) window.clearTimeout(_timeout);
62183
62184                 behaviors.forEach(context.uninstall);
62185
62186                 d3_select(document)
62187                     .call(keybinding.unbind);
62188
62189                 closeMenu();
62190                 editMenu = undefined;
62191
62192                 context.history()
62193                     .on('undone.select', null)
62194                     .on('redone.select', null);
62195
62196                 var surface = context.surface();
62197
62198                 surface
62199                     .on('dblclick.select', null);
62200
62201                 surface
62202                     .selectAll('.selected')
62203                     .classed('selected', false);
62204
62205                 surface
62206                     .selectAll('.related')
62207                     .classed('related', false);
62208
62209                 context.map().on('drawn.select', null);
62210                 context.ui().sidebar.hide();
62211                 context.features().forceVisible([]);
62212
62213                 var entity = singular();
62214                 if (_newFeature && entity && entity.type === 'relation' &&
62215                     // no tags
62216                     Object.keys(entity.tags).length === 0 &&
62217                     // no parent relations
62218                     context.graph().parentRelations(entity).length === 0 &&
62219                     // no members or one member with no role
62220                     (entity.members.length === 0 || (entity.members.length === 1 && !entity.members[0].role))
62221                 ) {
62222                     // the user added this relation but didn't edit it at all, so just delete it
62223                     var deleteAction = actionDeleteRelation(entity.id, true /* don't delete untagged members */);
62224                     context.perform(deleteAction, t('operations.delete.annotation.relation'));
62225                 }
62226             };
62227
62228
62229             return mode;
62230         }
62231
62232         function uiLasso(context) {
62233             var group, polygon;
62234
62235             lasso.coordinates = [];
62236
62237             function lasso(selection) {
62238                 context.container()
62239                     .classed('lasso', true);
62240
62241                 group = selection
62242                     .append('g')
62243                     .attr('class', 'lasso hide');
62244
62245                 polygon = group
62246                     .append('path')
62247                     .attr('class', 'lasso-path');
62248
62249                 group
62250                     .call(uiToggle(true));
62251             }
62252
62253
62254             function draw() {
62255                 if (polygon) {
62256                     polygon.data([lasso.coordinates])
62257                         .attr('d', function(d) { return 'M' + d.join(' L') + ' Z'; });
62258                 }
62259             }
62260
62261
62262             lasso.extent = function () {
62263                 return lasso.coordinates.reduce(function(extent, point) {
62264                     return extent.extend(geoExtent(point));
62265                 }, geoExtent());
62266             };
62267
62268
62269             lasso.p = function(_) {
62270                 if (!arguments.length) return lasso;
62271                 lasso.coordinates.push(_);
62272                 draw();
62273                 return lasso;
62274             };
62275
62276
62277             lasso.close = function() {
62278                 if (group) {
62279                     group.call(uiToggle(false, function() {
62280                         d3_select(this).remove();
62281                     }));
62282                 }
62283                 context.container().classed('lasso', false);
62284             };
62285
62286
62287             return lasso;
62288         }
62289
62290         function behaviorLasso(context) {
62291
62292             var behavior = function(selection) {
62293                 var lasso;
62294
62295
62296                 function mousedown() {
62297                     var button = 0;  // left
62298                     if (event.button === button && event.shiftKey === true) {
62299                         lasso = null;
62300
62301                         d3_select(window)
62302                             .on('mousemove.lasso', mousemove)
62303                             .on('mouseup.lasso', mouseup);
62304
62305                         event.stopPropagation();
62306                     }
62307                 }
62308
62309
62310                 function mousemove() {
62311                     if (!lasso) {
62312                         lasso = uiLasso(context);
62313                         context.surface().call(lasso);
62314                     }
62315
62316                     lasso.p(context.mouse());
62317                 }
62318
62319
62320                 function normalize(a, b) {
62321                     return [
62322                         [Math.min(a[0], b[0]), Math.min(a[1], b[1])],
62323                         [Math.max(a[0], b[0]), Math.max(a[1], b[1])]
62324                     ];
62325                 }
62326
62327
62328                 function lassoed() {
62329                     if (!lasso) return [];
62330
62331                     var graph = context.graph();
62332                     var bounds = lasso.extent().map(context.projection.invert);
62333                     var extent = geoExtent(normalize(bounds[0], bounds[1]));
62334
62335                     var intersects = context.intersects(extent).filter(function(entity) {
62336                         return entity.type === 'node' &&
62337                             geoPointInPolygon(context.projection(entity.loc), lasso.coordinates) &&
62338                             !context.features().isHidden(entity, graph, entity.geometry(graph));
62339                     });
62340
62341                     return intersects.map(function(entity) { return entity.id; });
62342                 }
62343
62344
62345                 function mouseup() {
62346                     d3_select(window)
62347                         .on('mousemove.lasso', null)
62348                         .on('mouseup.lasso', null);
62349
62350                     if (!lasso) return;
62351
62352                     var ids = lassoed();
62353                     lasso.close();
62354
62355                     if (ids.length) {
62356                         context.enter(modeSelect(context, ids));
62357                     }
62358                 }
62359
62360                 selection
62361                     .on('mousedown.lasso', mousedown);
62362             };
62363
62364
62365             behavior.off = function(selection) {
62366                 selection.on('mousedown.lasso', null);
62367             };
62368
62369
62370             return behavior;
62371         }
62372
62373         function modeBrowse(context) {
62374             var mode = {
62375                 button: 'browse',
62376                 id: 'browse',
62377                 title: t('modes.browse.title'),
62378                 description: t('modes.browse.description')
62379             }, sidebar;
62380
62381             var behaviors = [
62382                 behaviorPaste(context),
62383                 behaviorHover(context).on('hover', context.ui().sidebar.hover),
62384                 behaviorSelect(context),
62385                 behaviorLasso(context),
62386                 modeDragNode(context).behavior,
62387                 modeDragNote(context).behavior
62388             ];
62389
62390
62391             mode.enter = function() {
62392                 behaviors.forEach(context.install);
62393
62394                 // Get focus on the body.
62395                 if (document.activeElement && document.activeElement.blur) {
62396                     document.activeElement.blur();
62397                 }
62398
62399                 if (sidebar) {
62400                     context.ui().sidebar.show(sidebar);
62401                 } else {
62402                     context.ui().sidebar.select(null);
62403                 }
62404             };
62405
62406
62407             mode.exit = function() {
62408                 context.ui().sidebar.hover.cancel();
62409                 behaviors.forEach(context.uninstall);
62410
62411                 if (sidebar) {
62412                     context.ui().sidebar.hide();
62413                 }
62414             };
62415
62416
62417             mode.sidebar = function(_) {
62418                 if (!arguments.length) return sidebar;
62419                 sidebar = _;
62420                 return mode;
62421             };
62422
62423
62424             return mode;
62425         }
62426
62427         function behaviorAddWay(context) {
62428             var dispatch$1 = dispatch('start', 'startFromWay', 'startFromNode');
62429             var draw = behaviorDraw(context);
62430
62431             function behavior(surface) {
62432                 draw.on('click', function() { dispatch$1.apply('start', this, arguments); })
62433                     .on('clickWay', function() { dispatch$1.apply('startFromWay', this, arguments); })
62434                     .on('clickNode', function() { dispatch$1.apply('startFromNode', this, arguments); })
62435                     .on('cancel', behavior.cancel)
62436                     .on('finish', behavior.cancel);
62437
62438                 context.map()
62439                     .dblclickEnable(false);
62440
62441                 surface.call(draw);
62442             }
62443
62444
62445             behavior.off = function(surface) {
62446                 surface.call(draw.off);
62447             };
62448
62449
62450             behavior.cancel = function() {
62451                 window.setTimeout(function() {
62452                     context.map().dblclickEnable(true);
62453                 }, 1000);
62454
62455                 context.enter(modeBrowse(context));
62456             };
62457
62458
62459             behavior.tail = function(text) {
62460                 draw.tail(text);
62461                 return behavior;
62462             };
62463
62464
62465             return utilRebind(behavior, dispatch$1, 'on');
62466         }
62467
62468         function behaviorHash(context) {
62469             var s0 = null; // cached window.location.hash
62470             var lat = 90 - 1e-8; // allowable latitude range
62471
62472
62473             var parser = function(map, s) {
62474                 var q = utilStringQs(s);
62475                 var args = (q.map || '').split('/').map(Number);
62476
62477                 if (args.length < 3 || args.some(isNaN)) {
62478                     return true; // replace bogus hash
62479
62480                 } else if (s !== formatter(map).slice(1)) {   // hash has changed
62481                     var mode = context.mode();
62482                     var dist = geoSphericalDistance(map.center(), [args[2], args[1]]);
62483                     var maxdist = 500;
62484
62485                     // Don't allow the hash location to change too much while drawing
62486                     // This can happen if the user accidently hit the back button.  #3996
62487                     if (mode && mode.id.match(/^draw/) !== null && dist > maxdist) {
62488                         context.enter(modeBrowse(context));
62489                     }
62490
62491                     map.centerZoom([args[2], Math.min(lat, Math.max(-lat, args[1]))], args[0]);
62492                 }
62493             };
62494
62495
62496             var formatter = function(map) {
62497                 var center = map.center();
62498                 var zoom = map.zoom();
62499                 var precision = Math.max(0, Math.ceil(Math.log(zoom) / Math.LN2));
62500                 var q = utilObjectOmit(utilStringQs(window.location.hash.substring(1)),
62501                     ['comment', 'source', 'hashtags', 'walkthrough']
62502                 );
62503                 var newParams = {};
62504
62505                 delete q.id;
62506                 var selected = context.selectedIDs().filter(function(id) {
62507                     return !context.entity(id).isNew();
62508                 });
62509                 if (selected.length) {
62510                     newParams.id = selected.join(',');
62511                 }
62512
62513                 newParams.map = zoom.toFixed(2) +
62514                     '/' + center[1].toFixed(precision) +
62515                     '/' + center[0].toFixed(precision);
62516
62517                 return '#' + utilQsString(Object.assign(q, newParams), true);
62518             };
62519
62520
62521             function update() {
62522                 if (context.inIntro()) return;
62523                 var s1 = formatter(context.map());
62524                 if (s0 !== s1) {
62525                     window.location.replace(s0 = s1);  // don't recenter the map!
62526                 }
62527             }
62528
62529
62530             var throttledUpdate = throttle(update, 500);
62531
62532
62533             function hashchange() {
62534                 if (window.location.hash === s0) return;  // ignore spurious hashchange events
62535                 if (parser(context.map(), (s0 = window.location.hash).substring(1))) {
62536                     update(); // replace bogus hash
62537                 }
62538             }
62539
62540
62541             function behavior() {
62542                 context.map()
62543                     .on('move.hash', throttledUpdate);
62544
62545                 context
62546                     .on('enter.hash', throttledUpdate);
62547
62548                 d3_select(window)
62549                     .on('hashchange.hash', hashchange);
62550
62551                 if (window.location.hash) {
62552                     var q = utilStringQs(window.location.hash.substring(1));
62553
62554                     if (q.id) {
62555                         context.zoomToEntity(q.id.split(',')[0], !q.map);
62556                     }
62557
62558                     if (q.comment) {
62559                         context.storage('comment', q.comment);
62560                         context.storage('commentDate', Date.now());
62561                     }
62562
62563                     if (q.source) {
62564                         context.storage('source', q.source);
62565                         context.storage('commentDate', Date.now());
62566                     }
62567
62568                     if (q.hashtags) {
62569                         context.storage('hashtags', q.hashtags);
62570                     }
62571
62572                     if (q.walkthrough === 'true') {
62573                         behavior.startWalkthrough = true;
62574                     }
62575
62576                     hashchange();
62577
62578                     if (q.map) {
62579                         behavior.hadHash = true;
62580                     }
62581                 }
62582             }
62583
62584
62585             behavior.off = function() {
62586                 throttledUpdate.cancel();
62587
62588                 context.map()
62589                     .on('move.hash', null);
62590
62591                 context
62592                     .on('enter.hash', null);
62593
62594                 d3_select(window)
62595                     .on('hashchange.hash', null);
62596
62597                 window.location.hash = '';
62598             };
62599
62600
62601             return behavior;
62602         }
62603
62604         /*
62605             iD.coreDifference represents the difference between two graphs.
62606             It knows how to calculate the set of entities that were
62607             created, modified, or deleted, and also contains the logic
62608             for recursively extending a difference to the complete set
62609             of entities that will require a redraw, taking into account
62610             child and parent relationships.
62611          */
62612         function coreDifference(base, head) {
62613             var _changes = {};
62614             var _didChange = {};  // 'addition', 'deletion', 'geometry', 'properties'
62615             var _diff = {};
62616
62617             function checkEntityID(id) {
62618                 var h = head.entities[id];
62619                 var b = base.entities[id];
62620
62621                 if (h === b) return;
62622                 if (_changes[id]) return;
62623
62624                 if (!h && b) {
62625                     _changes[id] = { base: b, head: h };
62626                     _didChange.deletion = true;
62627                     return;
62628                 }
62629                 if (h && !b) {
62630                     _changes[id] = { base: b, head: h };
62631                     _didChange.addition = true;
62632                     return;
62633                 }
62634
62635                 if (h && b) {
62636                     if (h.members && b.members && !fastDeepEqual(h.members, b.members)) {
62637                         _changes[id] = { base: b, head: h };
62638                         _didChange.geometry = true;
62639                         _didChange.properties = true;
62640                         return;
62641                     }
62642                     if (h.loc && b.loc && !geoVecEqual(h.loc, b.loc)) {
62643                         _changes[id] = { base: b, head: h };
62644                         _didChange.geometry = true;
62645                     }
62646                     if (h.nodes && b.nodes && !fastDeepEqual(h.nodes, b.nodes)) {
62647                         _changes[id] = { base: b, head: h };
62648                         _didChange.geometry = true;
62649                     }
62650                     if (h.tags && b.tags && !fastDeepEqual(h.tags, b.tags)) {
62651                         _changes[id] = { base: b, head: h };
62652                         _didChange.properties = true;
62653                     }
62654                 }
62655             }
62656
62657             Object.keys(head.entities).forEach(checkEntityID);
62658             Object.keys(base.entities).forEach(checkEntityID);
62659
62660
62661             _diff.length = function length() {
62662                 return Object.keys(_changes).length;
62663             };
62664
62665
62666             _diff.changes = function changes() {
62667                 return _changes;
62668             };
62669
62670             _diff.didChange = _didChange;
62671
62672
62673             // pass true to include affected relation members
62674             _diff.extantIDs = function extantIDs(includeRelMembers) {
62675                 var result = new Set();
62676                 Object.keys(_changes).forEach(function(id) {
62677                     if (_changes[id].head) {
62678                         result.add(id);
62679                     }
62680
62681                     var h = _changes[id].head;
62682                     var b = _changes[id].base;
62683                     var entity = h || b;
62684
62685                     if (includeRelMembers && entity.type === 'relation') {
62686                         var mh = h ? h.members.map(function(m) { return m.id; }) : [];
62687                         var mb = b ? b.members.map(function(m) { return m.id; }) : [];
62688                         utilArrayUnion(mh, mb).forEach(function(memberID) {
62689                             if (head.hasEntity(memberID)) {
62690                                 result.add(memberID);
62691                             }
62692                         });
62693                     }
62694                 });
62695
62696                 return Array.from(result);
62697             };
62698
62699
62700             _diff.modified = function modified() {
62701                 var result = [];
62702                 Object.values(_changes).forEach(function(change) {
62703                     if (change.base && change.head) {
62704                         result.push(change.head);
62705                     }
62706                 });
62707                 return result;
62708             };
62709
62710
62711             _diff.created = function created() {
62712                 var result = [];
62713                 Object.values(_changes).forEach(function(change) {
62714                     if (!change.base && change.head) {
62715                         result.push(change.head);
62716                     }
62717                 });
62718                 return result;
62719             };
62720
62721
62722             _diff.deleted = function deleted() {
62723                 var result = [];
62724                 Object.values(_changes).forEach(function(change) {
62725                     if (change.base && !change.head) {
62726                         result.push(change.base);
62727                     }
62728                 });
62729                 return result;
62730             };
62731
62732
62733             _diff.summary = function summary() {
62734                 var relevant = {};
62735
62736                 var keys = Object.keys(_changes);
62737                 for (var i = 0; i < keys.length; i++) {
62738                     var change = _changes[keys[i]];
62739
62740                     if (change.head && change.head.geometry(head) !== 'vertex') {
62741                         addEntity(change.head, head, change.base ? 'modified' : 'created');
62742
62743                     } else if (change.base && change.base.geometry(base) !== 'vertex') {
62744                         addEntity(change.base, base, 'deleted');
62745
62746                     } else if (change.base && change.head) { // modified vertex
62747                         var moved    = !fastDeepEqual(change.base.loc,  change.head.loc);
62748                         var retagged = !fastDeepEqual(change.base.tags, change.head.tags);
62749
62750                         if (moved) {
62751                             addParents(change.head);
62752                         }
62753
62754                         if (retagged || (moved && change.head.hasInterestingTags())) {
62755                             addEntity(change.head, head, 'modified');
62756                         }
62757
62758                     } else if (change.head && change.head.hasInterestingTags()) { // created vertex
62759                         addEntity(change.head, head, 'created');
62760
62761                     } else if (change.base && change.base.hasInterestingTags()) { // deleted vertex
62762                         addEntity(change.base, base, 'deleted');
62763                     }
62764                 }
62765
62766                 return Object.values(relevant);
62767
62768
62769                 function addEntity(entity, graph, changeType) {
62770                     relevant[entity.id] = {
62771                         entity: entity,
62772                         graph: graph,
62773                         changeType: changeType
62774                     };
62775                 }
62776
62777                 function addParents(entity) {
62778                     var parents = head.parentWays(entity);
62779                     for (var j = parents.length - 1; j >= 0; j--) {
62780                         var parent = parents[j];
62781                         if (!(parent.id in relevant)) {
62782                             addEntity(parent, head, 'modified');
62783                         }
62784                     }
62785                 }
62786             };
62787
62788
62789             // returns complete set of entities that require a redraw
62790             //  (optionally within given `extent`)
62791             _diff.complete = function complete(extent) {
62792                 var result = {};
62793                 var id, change;
62794
62795                 for (id in _changes) {
62796                     change = _changes[id];
62797
62798                     var h = change.head;
62799                     var b = change.base;
62800                     var entity = h || b;
62801                     var i;
62802
62803                     if (extent &&
62804                         (!h || !h.intersects(extent, head)) &&
62805                         (!b || !b.intersects(extent, base)))
62806                         continue;
62807
62808                     result[id] = h;
62809
62810                     if (entity.type === 'way') {
62811                         var nh = h ? h.nodes : [];
62812                         var nb = b ? b.nodes : [];
62813                         var diff;
62814
62815                         diff = utilArrayDifference(nh, nb);
62816                         for (i = 0; i < diff.length; i++) {
62817                             result[diff[i]] = head.hasEntity(diff[i]);
62818                         }
62819
62820                         diff = utilArrayDifference(nb, nh);
62821                         for (i = 0; i < diff.length; i++) {
62822                             result[diff[i]] = head.hasEntity(diff[i]);
62823                         }
62824                     }
62825
62826                     if (entity.type === 'relation' && entity.isMultipolygon()) {
62827                         var mh = h ? h.members.map(function(m) { return m.id; }) : [];
62828                         var mb = b ? b.members.map(function(m) { return m.id; }) : [];
62829                         var ids = utilArrayUnion(mh, mb);
62830                         for (i = 0; i < ids.length; i++) {
62831                             var member = head.hasEntity(ids[i]);
62832                             if (!member) continue;   // not downloaded
62833                             if (extent && !member.intersects(extent, head)) continue;   // not visible
62834                             result[ids[i]] = member;
62835                         }
62836                     }
62837
62838                     addParents(head.parentWays(entity), result);
62839                     addParents(head.parentRelations(entity), result);
62840                 }
62841
62842                 return result;
62843
62844
62845                 function addParents(parents, result) {
62846                     for (var i = 0; i < parents.length; i++) {
62847                         var parent = parents[i];
62848                         if (parent.id in result) continue;
62849
62850                         result[parent.id] = parent;
62851                         addParents(head.parentRelations(parent), result);
62852                     }
62853                 }
62854             };
62855
62856
62857             return _diff;
62858         }
62859
62860         function coreTree(head) {
62861             var rtree = rbush_1();
62862             var bboxes = {};
62863             var tree = {};
62864
62865
62866             function entityBBox(entity) {
62867                 var bbox = entity.extent(head).bbox();
62868                 bbox.id = entity.id;
62869                 bboxes[entity.id] = bbox;
62870                 return bbox;
62871             }
62872
62873
62874             function updateParents(entity, insertions, memo) {
62875                 head.parentWays(entity).forEach(function(way) {
62876                     if (bboxes[way.id]) {
62877                         rtree.remove(bboxes[way.id]);
62878                         insertions[way.id] = way;
62879                     }
62880                     updateParents(way, insertions, memo);
62881                 });
62882
62883                 head.parentRelations(entity).forEach(function(relation) {
62884                     if (memo[entity.id]) return;
62885                     memo[entity.id] = true;
62886                     if (bboxes[relation.id]) {
62887                         rtree.remove(bboxes[relation.id]);
62888                         insertions[relation.id] = relation;
62889                     }
62890                     updateParents(relation, insertions, memo);
62891                 });
62892             }
62893
62894
62895             tree.rebase = function(entities, force) {
62896                 var insertions = {};
62897
62898                 for (var i = 0; i < entities.length; i++) {
62899                     var entity = entities[i];
62900                     if (!entity.visible) continue;
62901
62902                     if (head.entities.hasOwnProperty(entity.id) || bboxes[entity.id]) {
62903                         if (!force) {
62904                             continue;
62905                         } else if (bboxes[entity.id]) {
62906                             rtree.remove(bboxes[entity.id]);
62907                         }
62908                     }
62909
62910                     insertions[entity.id] = entity;
62911                     updateParents(entity, insertions, {});
62912                 }
62913
62914                 rtree.load(Object.values(insertions).map(entityBBox));
62915
62916                 return tree;
62917             };
62918
62919
62920             tree.intersects = function(extent, graph) {
62921                 if (graph !== head) {
62922                     var diff = coreDifference(head, graph);
62923                     var changed = diff.didChange;
62924
62925                     if (changed.addition || changed.deletion || changed.geometry) {
62926                         var insertions = {};
62927                         head = graph;
62928
62929                         if (changed.deletion) {
62930                             diff.deleted().forEach(function(entity) {
62931                                 rtree.remove(bboxes[entity.id]);
62932                                 delete bboxes[entity.id];
62933                             });
62934                         }
62935
62936                         if (changed.geometry) {
62937                             diff.modified().forEach(function(entity) {
62938                                 rtree.remove(bboxes[entity.id]);
62939                                 insertions[entity.id] = entity;
62940                                 updateParents(entity, insertions, {});
62941                             });
62942                         }
62943
62944                         if (changed.addition) {
62945                             diff.created().forEach(function(entity) {
62946                                 insertions[entity.id] = entity;
62947                             });
62948                         }
62949
62950                         rtree.load(Object.values(insertions).map(entityBBox));
62951                     }
62952                 }
62953
62954                 return rtree.search(extent.bbox())
62955                     .map(function(bbox) { return graph.entity(bbox.id); });
62956             };
62957
62958
62959             return tree;
62960         }
62961
62962         function uiModal(selection, blocking) {
62963             var keybinding = utilKeybinding('modal');
62964             var previous = selection.select('div.modal');
62965             var animate = previous.empty();
62966
62967             previous.transition()
62968                 .duration(200)
62969                 .style('opacity', 0)
62970                 .remove();
62971
62972             var shaded = selection
62973                 .append('div')
62974                 .attr('class', 'shaded')
62975                 .style('opacity', 0);
62976
62977             shaded.close = function() {
62978                 shaded
62979                     .transition()
62980                     .duration(200)
62981                     .style('opacity',0)
62982                     .remove();
62983
62984                 modal
62985                     .transition()
62986                     .duration(200)
62987                     .style('top','0px');
62988
62989                 d3_select(document)
62990                     .call(keybinding.unbind);
62991             };
62992
62993
62994             var modal = shaded
62995                 .append('div')
62996                 .attr('class', 'modal fillL');
62997
62998             if (!blocking) {
62999                 shaded.on('click.remove-modal', function() {
63000                     if (event.target === this) {
63001                         shaded.close();
63002                     }
63003                 });
63004
63005                 modal.append('button')
63006                     .attr('class', 'close')
63007                     .on('click', shaded.close)
63008                     .call(svgIcon('#iD-icon-close'));
63009
63010                 keybinding
63011                     .on('⌫', shaded.close)
63012                     .on('⎋', shaded.close);
63013
63014                 d3_select(document)
63015                     .call(keybinding);
63016             }
63017
63018             modal
63019                 .append('div')
63020                 .attr('class', 'content');
63021
63022             if (animate) {
63023                 shaded.transition().style('opacity', 1);
63024             } else {
63025                 shaded.style('opacity', 1);
63026             }
63027
63028
63029             return shaded;
63030         }
63031
63032         function uiLoading(context) {
63033             var _modalSelection = d3_select(null);
63034             var _message = '';
63035             var _blocking = false;
63036
63037
63038             var loading = function(selection) {
63039                 _modalSelection = uiModal(selection, _blocking);
63040
63041                 var loadertext = _modalSelection.select('.content')
63042                     .classed('loading-modal', true)
63043                     .append('div')
63044                     .attr('class', 'modal-section fillL');
63045
63046                 loadertext
63047                     .append('img')
63048                     .attr('class', 'loader')
63049                     .attr('src', context.imagePath('loader-white.gif'));
63050
63051                 loadertext
63052                     .append('h3')
63053                     .text(_message);
63054
63055                 _modalSelection.select('button.close')
63056                     .attr('class', 'hide');
63057
63058                 return loading;
63059             };
63060
63061
63062             loading.message = function(_) {
63063                 if (!arguments.length) return _message;
63064                 _message = _;
63065                 return loading;
63066             };
63067
63068
63069             loading.blocking = function(_) {
63070                 if (!arguments.length) return _blocking;
63071                 _blocking = _;
63072                 return loading;
63073             };
63074
63075
63076             loading.close = function() {
63077                 _modalSelection.remove();
63078             };
63079
63080
63081             return loading;
63082         }
63083
63084         function coreHistory(context) {
63085             var dispatch$1 = dispatch('change', 'merge', 'restore', 'undone', 'redone');
63086             var lock = utilSessionMutex('lock');
63087             var duration = 150;
63088             var _imageryUsed = [];
63089             var _photoOverlaysUsed = [];
63090             var _checkpoints = {};
63091             var _pausedGraph;
63092             var _stack;
63093             var _index;
63094             var _tree;
63095
63096
63097             // internal _act, accepts list of actions and eased time
63098             function _act(actions, t) {
63099                 actions = Array.prototype.slice.call(actions);
63100
63101                 var annotation;
63102                 if (typeof actions[actions.length - 1] !== 'function') {
63103                     annotation = actions.pop();
63104                 }
63105
63106                 var graph = _stack[_index].graph;
63107                 for (var i = 0; i < actions.length; i++) {
63108                     graph = actions[i](graph, t);
63109                 }
63110
63111                 return {
63112                     graph: graph,
63113                     annotation: annotation,
63114                     imageryUsed: _imageryUsed,
63115                     photoOverlaysUsed: _photoOverlaysUsed,
63116                     transform: context.projection.transform(),
63117                     selectedIDs: context.selectedIDs()
63118                 };
63119             }
63120
63121
63122             // internal _perform with eased time
63123             function _perform(args, t) {
63124                 var previous = _stack[_index].graph;
63125                 _stack = _stack.slice(0, _index + 1);
63126                 var actionResult = _act(args, t);
63127                 _stack.push(actionResult);
63128                 _index++;
63129                 return change(previous);
63130             }
63131
63132
63133             // internal _replace with eased time
63134             function _replace(args, t) {
63135                 var previous = _stack[_index].graph;
63136                 // assert(_index == _stack.length - 1)
63137                 var actionResult = _act(args, t);
63138                 _stack[_index] = actionResult;
63139                 return change(previous);
63140             }
63141
63142
63143             // internal _overwrite with eased time
63144             function _overwrite(args, t) {
63145                 var previous = _stack[_index].graph;
63146                 if (_index > 0) {
63147                     _index--;
63148                     _stack.pop();
63149                 }
63150                 _stack = _stack.slice(0, _index + 1);
63151                 var actionResult = _act(args, t);
63152                 _stack.push(actionResult);
63153                 _index++;
63154                 return change(previous);
63155             }
63156
63157
63158             // determine difference and dispatch a change event
63159             function change(previous) {
63160                 var difference = coreDifference(previous, history.graph());
63161                 if (!_pausedGraph) {
63162                     dispatch$1.call('change', this, difference);
63163                 }
63164                 return difference;
63165             }
63166
63167
63168             // iD uses namespaced keys so multiple installations do not conflict
63169             function getKey(n) {
63170                 return 'iD_' + window.location.origin + '_' + n;
63171             }
63172
63173
63174             var history = {
63175
63176                 graph: function() {
63177                     return _stack[_index].graph;
63178                 },
63179
63180
63181                 tree: function() {
63182                     return _tree;
63183                 },
63184
63185
63186                 base: function() {
63187                     return _stack[0].graph;
63188                 },
63189
63190
63191                 merge: function(entities, extent) {
63192                     var stack = _stack.map(function(state) { return state.graph; });
63193                     _stack[0].graph.rebase(entities, stack, false);
63194                     _tree.rebase(entities, false);
63195
63196                     dispatch$1.call('merge', this, entities);
63197                 },
63198
63199
63200                 perform: function() {
63201                     // complete any transition already in progress
63202                     d3_select(document).interrupt('history.perform');
63203
63204                     var transitionable = false;
63205                     var action0 = arguments[0];
63206
63207                     if (arguments.length === 1 ||
63208                         (arguments.length === 2 && (typeof arguments[1] !== 'function'))) {
63209                         transitionable = !!action0.transitionable;
63210                     }
63211
63212                     if (transitionable) {
63213                         var origArguments = arguments;
63214                         d3_select(document)
63215                             .transition('history.perform')
63216                             .duration(duration)
63217                             .ease(linear$1)
63218                             .tween('history.tween', function() {
63219                                 return function(t) {
63220                                     if (t < 1) _overwrite([action0], t);
63221                                 };
63222                             })
63223                             .on('start', function() {
63224                                 _perform([action0], 0);
63225                             })
63226                             .on('end interrupt', function() {
63227                                 _overwrite(origArguments, 1);
63228                             });
63229
63230                     } else {
63231                         return _perform(arguments);
63232                     }
63233                 },
63234
63235
63236                 replace: function() {
63237                     d3_select(document).interrupt('history.perform');
63238                     return _replace(arguments, 1);
63239                 },
63240
63241
63242                 // Same as calling pop and then perform
63243                 overwrite: function() {
63244                     d3_select(document).interrupt('history.perform');
63245                     return _overwrite(arguments, 1);
63246                 },
63247
63248
63249                 pop: function(n) {
63250                     d3_select(document).interrupt('history.perform');
63251
63252                     var previous = _stack[_index].graph;
63253                     if (isNaN(+n) || +n < 0) {
63254                         n = 1;
63255                     }
63256                     while (n-- > 0 && _index > 0) {
63257                         _index--;
63258                         _stack.pop();
63259                     }
63260                     return change(previous);
63261                 },
63262
63263
63264                 // Back to the previous annotated state or _index = 0.
63265                 undo: function() {
63266                     d3_select(document).interrupt('history.perform');
63267
63268                     var previousStack = _stack[_index];
63269                     var previous = previousStack.graph;
63270                     while (_index > 0) {
63271                         _index--;
63272                         if (_stack[_index].annotation) break;
63273                     }
63274
63275                     dispatch$1.call('undone', this, _stack[_index], previousStack);
63276                     return change(previous);
63277                 },
63278
63279
63280                 // Forward to the next annotated state.
63281                 redo: function() {
63282                     d3_select(document).interrupt('history.perform');
63283
63284                     var previousStack = _stack[_index];
63285                     var previous = previousStack.graph;
63286                     var tryIndex = _index;
63287                     while (tryIndex < _stack.length - 1) {
63288                         tryIndex++;
63289                         if (_stack[tryIndex].annotation) {
63290                             _index = tryIndex;
63291                             dispatch$1.call('redone', this, _stack[_index], previousStack);
63292                             break;
63293                         }
63294                     }
63295
63296                     return change(previous);
63297                 },
63298
63299
63300                 pauseChangeDispatch: function() {
63301                     if (!_pausedGraph) {
63302                         _pausedGraph = _stack[_index].graph;
63303                     }
63304                 },
63305
63306
63307                 resumeChangeDispatch: function() {
63308                     if (_pausedGraph) {
63309                         var previous = _pausedGraph;
63310                         _pausedGraph = null;
63311                         return change(previous);
63312                     }
63313                 },
63314
63315
63316                 undoAnnotation: function() {
63317                     var i = _index;
63318                     while (i >= 0) {
63319                         if (_stack[i].annotation) return _stack[i].annotation;
63320                         i--;
63321                     }
63322                 },
63323
63324
63325                 redoAnnotation: function() {
63326                     var i = _index + 1;
63327                     while (i <= _stack.length - 1) {
63328                         if (_stack[i].annotation) return _stack[i].annotation;
63329                         i++;
63330                     }
63331                 },
63332
63333
63334                 intersects: function(extent) {
63335                     return _tree.intersects(extent, _stack[_index].graph);
63336                 },
63337
63338
63339                 difference: function() {
63340                     var base = _stack[0].graph;
63341                     var head = _stack[_index].graph;
63342                     return coreDifference(base, head);
63343                 },
63344
63345
63346                 changes: function(action) {
63347                     var base = _stack[0].graph;
63348                     var head = _stack[_index].graph;
63349
63350                     if (action) {
63351                         head = action(head);
63352                     }
63353
63354                     var difference = coreDifference(base, head);
63355
63356                     return {
63357                         modified: difference.modified(),
63358                         created: difference.created(),
63359                         deleted: difference.deleted()
63360                     };
63361                 },
63362
63363
63364                 hasChanges: function() {
63365                     return this.difference().length() > 0;
63366                 },
63367
63368
63369                 imageryUsed: function(sources) {
63370                     if (sources) {
63371                         _imageryUsed = sources;
63372                         return history;
63373                     } else {
63374                         var s = new Set();
63375                         _stack.slice(1, _index + 1).forEach(function(state) {
63376                             state.imageryUsed.forEach(function(source) {
63377                                 if (source !== 'Custom') {
63378                                     s.add(source);
63379                                 }
63380                             });
63381                         });
63382                         return Array.from(s);
63383                     }
63384                 },
63385
63386
63387                 photoOverlaysUsed: function(sources) {
63388                     if (sources) {
63389                         _photoOverlaysUsed = sources;
63390                         return history;
63391                     } else {
63392                         var s = new Set();
63393                         _stack.slice(1, _index + 1).forEach(function(state) {
63394                             state.photoOverlaysUsed.forEach(function(photoOverlay) {
63395                                 s.add(photoOverlay);
63396                             });
63397                         });
63398                         return Array.from(s);
63399                     }
63400                 },
63401
63402
63403                 // save the current history state
63404                 checkpoint: function(key) {
63405                     _checkpoints[key] = {
63406                         stack: _stack,
63407                         index: _index
63408                     };
63409                     return history;
63410                 },
63411
63412
63413                 // restore history state to a given checkpoint or reset completely
63414                 reset: function(key) {
63415                     if (key !== undefined && _checkpoints.hasOwnProperty(key)) {
63416                         _stack = _checkpoints[key].stack;
63417                         _index = _checkpoints[key].index;
63418                     } else {
63419                         _stack = [{graph: coreGraph()}];
63420                         _index = 0;
63421                         _tree = coreTree(_stack[0].graph);
63422                         _checkpoints = {};
63423                     }
63424                     dispatch$1.call('change');
63425                     return history;
63426                 },
63427
63428
63429                 // `toIntroGraph()` is used to export the intro graph used by the walkthrough.
63430                 //
63431                 // To use it:
63432                 //  1. Start the walkthrough.
63433                 //  2. Get to a "free editing" tutorial step
63434                 //  3. Make your edits to the walkthrough map
63435                 //  4. In your browser dev console run:
63436                 //        `id.history().toIntroGraph()`
63437                 //  5. This outputs stringified JSON to the browser console
63438                 //  6. Copy it to `data/intro_graph.json` and prettify it in your code editor
63439                 toIntroGraph: function() {
63440                     var nextID = { n: 0, r: 0, w: 0 };
63441                     var permIDs = {};
63442                     var graph = this.graph();
63443                     var baseEntities = {};
63444
63445                     // clone base entities..
63446                     Object.values(graph.base().entities).forEach(function(entity) {
63447                         var copy = copyIntroEntity(entity);
63448                         baseEntities[copy.id] = copy;
63449                     });
63450
63451                     // replace base entities with head entities..
63452                     Object.keys(graph.entities).forEach(function(id) {
63453                         var entity = graph.entities[id];
63454                         if (entity) {
63455                             var copy = copyIntroEntity(entity);
63456                             baseEntities[copy.id] = copy;
63457                         } else {
63458                             delete baseEntities[id];
63459                         }
63460                     });
63461
63462                     // swap temporary for permanent ids..
63463                     Object.values(baseEntities).forEach(function(entity) {
63464                         if (Array.isArray(entity.nodes)) {
63465                             entity.nodes = entity.nodes.map(function(node) {
63466                                 return permIDs[node] || node;
63467                             });
63468                         }
63469                         if (Array.isArray(entity.members)) {
63470                             entity.members = entity.members.map(function(member) {
63471                                 member.id = permIDs[member.id] || member.id;
63472                                 return member;
63473                             });
63474                         }
63475                     });
63476
63477                     return JSON.stringify({ dataIntroGraph: baseEntities });
63478
63479
63480                     function copyIntroEntity(source) {
63481                         var copy = utilObjectOmit(source, ['type', 'user', 'v', 'version', 'visible']);
63482
63483                         // Note: the copy is no longer an osmEntity, so it might not have `tags`
63484                         if (copy.tags && !Object.keys(copy.tags)) {
63485                             delete copy.tags;
63486                         }
63487
63488                         if (Array.isArray(copy.loc)) {
63489                             copy.loc[0] = +copy.loc[0].toFixed(6);
63490                             copy.loc[1] = +copy.loc[1].toFixed(6);
63491                         }
63492
63493                         var match = source.id.match(/([nrw])-\d*/);  // temporary id
63494                         if (match !== null) {
63495                             var nrw = match[1];
63496                             var permID;
63497                             do { permID = nrw + (++nextID[nrw]); }
63498                             while (baseEntities.hasOwnProperty(permID));
63499
63500                             copy.id = permIDs[source.id] = permID;
63501                         }
63502                         return copy;
63503                     }
63504                 },
63505
63506
63507                 toJSON: function() {
63508                     if (!this.hasChanges()) return;
63509
63510                     var allEntities = {};
63511                     var baseEntities = {};
63512                     var base = _stack[0];
63513
63514                     var s = _stack.map(function(i) {
63515                         var modified = [];
63516                         var deleted = [];
63517
63518                         Object.keys(i.graph.entities).forEach(function(id) {
63519                             var entity = i.graph.entities[id];
63520                             if (entity) {
63521                                 var key = osmEntity.key(entity);
63522                                 allEntities[key] = entity;
63523                                 modified.push(key);
63524                             } else {
63525                                 deleted.push(id);
63526                             }
63527
63528                             // make sure that the originals of changed or deleted entities get merged
63529                             // into the base of the _stack after restoring the data from JSON.
63530                             if (id in base.graph.entities) {
63531                                 baseEntities[id] = base.graph.entities[id];
63532                             }
63533                             if (entity && entity.nodes) {
63534                                 // get originals of pre-existing child nodes
63535                                 entity.nodes.forEach(function(nodeID) {
63536                                     if (nodeID in base.graph.entities) {
63537                                         baseEntities[nodeID] = base.graph.entities[nodeID];
63538                                     }
63539                                 });
63540                             }
63541                             // get originals of parent entities too
63542                             var baseParents = base.graph._parentWays[id];
63543                             if (baseParents) {
63544                                 baseParents.forEach(function(parentID) {
63545                                     if (parentID in base.graph.entities) {
63546                                         baseEntities[parentID] = base.graph.entities[parentID];
63547                                     }
63548                                 });
63549                             }
63550                         });
63551
63552                         var x = {};
63553
63554                         if (modified.length) x.modified = modified;
63555                         if (deleted.length) x.deleted = deleted;
63556                         if (i.imageryUsed) x.imageryUsed = i.imageryUsed;
63557                         if (i.photoOverlaysUsed) x.photoOverlaysUsed = i.photoOverlaysUsed;
63558                         if (i.annotation) x.annotation = i.annotation;
63559                         if (i.transform) x.transform = i.transform;
63560                         if (i.selectedIDs) x.selectedIDs = i.selectedIDs;
63561
63562                         return x;
63563                     });
63564
63565                     return JSON.stringify({
63566                         version: 3,
63567                         entities: Object.values(allEntities),
63568                         baseEntities: Object.values(baseEntities),
63569                         stack: s,
63570                         nextIDs: osmEntity.id.next,
63571                         index: _index
63572                     });
63573                 },
63574
63575
63576                 fromJSON: function(json, loadChildNodes) {
63577                     var h = JSON.parse(json);
63578                     var loadComplete = true;
63579
63580                     osmEntity.id.next = h.nextIDs;
63581                     _index = h.index;
63582
63583                     if (h.version === 2 || h.version === 3) {
63584                         var allEntities = {};
63585
63586                         h.entities.forEach(function(entity) {
63587                             allEntities[osmEntity.key(entity)] = osmEntity(entity);
63588                         });
63589
63590                         if (h.version === 3) {
63591                             // This merges originals for changed entities into the base of
63592                             // the _stack even if the current _stack doesn't have them (for
63593                             // example when iD has been restarted in a different region)
63594                             var baseEntities = h.baseEntities.map(function(d) { return osmEntity(d); });
63595                             var stack = _stack.map(function(state) { return state.graph; });
63596                             _stack[0].graph.rebase(baseEntities, stack, true);
63597                             _tree.rebase(baseEntities, true);
63598
63599                             // When we restore a modified way, we also need to fetch any missing
63600                             // childnodes that would normally have been downloaded with it.. #2142
63601                             if (loadChildNodes) {
63602                                 var osm = context.connection();
63603                                 var baseWays = baseEntities
63604                                     .filter(function(e) { return e.type === 'way'; });
63605                                 var nodeIDs = baseWays
63606                                     .reduce(function(acc, way) { return utilArrayUnion(acc, way.nodes); }, []);
63607                                 var missing = nodeIDs
63608                                     .filter(function(n) { return !_stack[0].graph.hasEntity(n); });
63609
63610                                 if (missing.length && osm) {
63611                                     loadComplete = false;
63612                                     context.redrawEnable(false);
63613
63614                                     var loading = uiLoading(context).blocking(true);
63615                                     context.container().call(loading);
63616
63617                                     var childNodesLoaded = function(err, result) {
63618                                         if (!err) {
63619                                             var visibleGroups = utilArrayGroupBy(result.data, 'visible');
63620                                             var visibles = visibleGroups.true || [];      // alive nodes
63621                                             var invisibles = visibleGroups.false || [];   // deleted nodes
63622
63623                                             if (visibles.length) {
63624                                                 var visibleIDs = visibles.map(function(entity) { return entity.id; });
63625                                                 var stack = _stack.map(function(state) { return state.graph; });
63626                                                 missing = utilArrayDifference(missing, visibleIDs);
63627                                                 _stack[0].graph.rebase(visibles, stack, true);
63628                                                 _tree.rebase(visibles, true);
63629                                             }
63630
63631                                             // fetch older versions of nodes that were deleted..
63632                                             invisibles.forEach(function(entity) {
63633                                                 osm.loadEntityVersion(entity.id, +entity.version - 1, childNodesLoaded);
63634                                             });
63635                                         }
63636
63637                                         if (err || !missing.length) {
63638                                             loading.close();
63639                                             context.redrawEnable(true);
63640                                             dispatch$1.call('change');
63641                                             dispatch$1.call('restore', this);
63642                                         }
63643                                     };
63644
63645                                     osm.loadMultiple(missing, childNodesLoaded);
63646                                 }
63647                             }
63648                         }
63649
63650                         _stack = h.stack.map(function(d) {
63651                             var entities = {}, entity;
63652
63653                             if (d.modified) {
63654                                 d.modified.forEach(function(key) {
63655                                     entity = allEntities[key];
63656                                     entities[entity.id] = entity;
63657                                 });
63658                             }
63659
63660                             if (d.deleted) {
63661                                 d.deleted.forEach(function(id) {
63662                                     entities[id] = undefined;
63663                                 });
63664                             }
63665
63666                             return {
63667                                 graph: coreGraph(_stack[0].graph).load(entities),
63668                                 annotation: d.annotation,
63669                                 imageryUsed: d.imageryUsed,
63670                                 photoOverlaysUsed: d.photoOverlaysUsed,
63671                                 transform: d.transform,
63672                                 selectedIDs: d.selectedIDs
63673                             };
63674                         });
63675
63676                     } else { // original version
63677                         _stack = h.stack.map(function(d) {
63678                             var entities = {};
63679
63680                             for (var i in d.entities) {
63681                                 var entity = d.entities[i];
63682                                 entities[i] = entity === 'undefined' ? undefined : osmEntity(entity);
63683                             }
63684
63685                             d.graph = coreGraph(_stack[0].graph).load(entities);
63686                             return d;
63687                         });
63688                     }
63689
63690                     var transform = _stack[_index].transform;
63691                     if (transform) {
63692                         context.map().transformEase(transform, 0);   // 0 = immediate, no easing
63693                     }
63694
63695                     if (loadComplete) {
63696                         dispatch$1.call('change');
63697                         dispatch$1.call('restore', this);
63698                     }
63699
63700                     return history;
63701                 },
63702
63703
63704                 save: function() {
63705                     if (lock.locked()) context.storage(getKey('saved_history'), history.toJSON() || null);
63706                     return history;
63707                 },
63708
63709
63710                 clearSaved: function() {
63711                     context.debouncedSave.cancel();
63712                     if (lock.locked()) context.storage(getKey('saved_history'), null);
63713                     return history;
63714                 },
63715
63716
63717                 lock: function() {
63718                     return lock.lock();
63719                 },
63720
63721
63722                 unlock: function() {
63723                     lock.unlock();
63724                 },
63725
63726
63727                 // is iD not open in another window and it detects that
63728                 // there's a history stored in localStorage that's recoverable?
63729                 restorableChanges: function() {
63730                     return lock.locked() && !!context.storage(getKey('saved_history'));
63731                 },
63732
63733
63734                 // load history from a version stored in localStorage
63735                 restore: function() {
63736                     if (!lock.locked()) return;
63737
63738                     var json = context.storage(getKey('saved_history'));
63739                     if (json) history.fromJSON(json, true);
63740                 },
63741
63742
63743                 _getKey: getKey
63744
63745             };
63746
63747
63748             history.reset();
63749
63750             return utilRebind(history, dispatch$1, 'on');
63751         }
63752
63753         /**
63754          * Look for roads that can be connected to other roads with a short extension
63755          */
63756         function validationAlmostJunction() {
63757             var type = 'almost_junction';
63758
63759
63760             function isHighway(entity) {
63761                 return entity.type === 'way' &&
63762                     osmRoutableHighwayTagValues[entity.tags.highway];
63763             }
63764
63765             function isTaggedAsNotContinuing(node) {
63766                 return node.tags.noexit === 'yes' ||
63767                     node.tags.amenity === 'parking_entrance' ||
63768                     (node.tags.entrance && node.tags.entrance !== 'no');
63769             }
63770
63771
63772             var validation = function checkAlmostJunction(entity, context) {
63773                 if (!isHighway(entity)) return [];
63774                 if (entity.isDegenerate()) return [];
63775
63776                 var graph = context.graph();
63777                 var tree = context.history().tree();
63778                 var issues = [];
63779
63780                 var extendableNodeInfos = findConnectableEndNodesByExtension(entity);
63781                 extendableNodeInfos.forEach(function(extendableNodeInfo) {
63782                     var node = extendableNodeInfo.node;
63783                     var edgeHighway = graph.entity(extendableNodeInfo.wid);
63784
63785                     var fixes = [new validationIssueFix({
63786                         icon: 'iD-icon-abutment',
63787                         title: t('issues.fix.connect_features.title'),
63788                         onClick: function() {
63789                             var endNodeId = this.issue.entityIds[1];
63790                             var endNode = context.entity(endNodeId);
63791                             var targetEdge = this.issue.data.edge;
63792                             var crossLoc = this.issue.data.cross_loc;
63793                             var edgeNodes = [context.entity(targetEdge[0]), context.entity(targetEdge[1])];
63794                             var closestNodeInfo = geoSphericalClosestNode(edgeNodes, crossLoc);
63795
63796                             var annotation = t('issues.fix.connect_almost_junction.annotation');
63797                             // already a point nearby, just connect to that
63798                             if (closestNodeInfo.distance < 0.75) {
63799                                 context.perform(
63800                                     actionMergeNodes([closestNodeInfo.node.id, endNode.id], closestNodeInfo.node.loc),
63801                                     annotation
63802                                 );
63803                             // else add the end node to the edge way
63804                             } else {
63805                                 context.perform(
63806                                     actionAddMidpoint({loc: crossLoc, edge: targetEdge}, endNode),
63807                                     annotation
63808                                 );
63809                             }
63810                         }
63811                     })];
63812
63813                     if (Object.keys(node.tags).length === 0) {
63814                         // node has no tags, suggest noexit fix
63815                         fixes.push(new validationIssueFix({
63816                             icon: 'maki-barrier',
63817                             title: t('issues.fix.tag_as_disconnected.title'),
63818                             onClick: function() {
63819                                 var nodeID = this.issue.entityIds[1];
63820                                 context.perform(
63821                                     actionChangeTags(nodeID, { noexit: 'yes' }),
63822                                     t('issues.fix.tag_as_disconnected.annotation')
63823                                 );
63824                             }
63825                         }));
63826                     }
63827
63828                     issues.push(new validationIssue({
63829                         type: type,
63830                         severity: 'warning',
63831                         message: function() {
63832                             var entity1 = context.hasEntity(this.entityIds[0]),
63833                                 entity2 = context.hasEntity(this.entityIds[2]);
63834                             return (entity && entity2) ? t('issues.almost_junction.message', {
63835                                 feature: utilDisplayLabel(entity1, context),
63836                                 feature2: utilDisplayLabel(entity2, context)
63837                             }) : '';
63838                         },
63839                         reference: showReference,
63840                         entityIds: [entity.id, node.id, edgeHighway.id],
63841                         loc: extendableNodeInfo.node.loc,
63842                         data: {
63843                             edge: extendableNodeInfo.edge,
63844                             cross_loc: extendableNodeInfo.cross_loc
63845                         },
63846                         fixes: fixes
63847                     }));
63848                 });
63849
63850                 return issues;
63851
63852
63853                 function showReference(selection) {
63854                     selection.selectAll('.issue-reference')
63855                         .data([0])
63856                         .enter()
63857                         .append('div')
63858                         .attr('class', 'issue-reference')
63859                         .text(t('issues.almost_junction.highway-highway.reference'));
63860                 }
63861
63862
63863                 function isExtendableCandidate(node, way) {
63864                     // can not accurately test vertices on tiles not downloaded from osm - #5938
63865                     var osm = context.connection();
63866                     if (osm && !osm.isDataLoaded(node.loc)) {
63867                         return false;
63868                     }
63869                     if (isTaggedAsNotContinuing(node) || graph.parentWays(node).length !== 1) {
63870                         return false;
63871                     }
63872
63873                     var occurences = 0;
63874                     for (var index in way.nodes) {
63875                         if (way.nodes[index] === node.id) {
63876                             occurences += 1;
63877                             if (occurences > 1) {
63878                                 return false;
63879                             }
63880                         }
63881                     }
63882                     return true;
63883                 }
63884
63885
63886                 function findConnectableEndNodesByExtension(way) {
63887                     var results = [];
63888                     if (way.isClosed()) return results;
63889
63890                     var testNodes;
63891                     var indices = [0, way.nodes.length - 1];
63892                     indices.forEach(function(nodeIndex) {
63893                         var nodeID = way.nodes[nodeIndex];
63894                         var node = graph.entity(nodeID);
63895
63896                         if (!isExtendableCandidate(node, way)) return;
63897
63898                         var connectionInfo = canConnectByExtend(way, nodeIndex);
63899                         if (!connectionInfo) return;
63900
63901                         testNodes = graph.childNodes(way).slice();   // shallow copy
63902                         testNodes[nodeIndex] = testNodes[nodeIndex].move(connectionInfo.cross_loc);
63903
63904                         // don't flag issue if connecting the ways would cause self-intersection
63905                         if (geoHasSelfIntersections(testNodes, nodeID)) return;
63906
63907                         results.push(connectionInfo);
63908                     });
63909
63910                     return results;
63911                 }
63912
63913                 function hasTag(tags, key) {
63914                     return tags[key] !== undefined && tags[key] !== 'no';
63915                 }
63916
63917                 function canConnectWays(way, way2) {
63918
63919                     // don't flag almost self-connections for now
63920                     if (way.id === way2.id) return false;
63921
63922                     // if one is bridge or tunnel, both must be bridge or tunnel
63923                     if ((hasTag(way.tags, 'bridge') || hasTag(way2.tags, 'bridge')) &&
63924                         !(hasTag(way.tags, 'bridge') && hasTag(way2.tags, 'bridge'))) return false;
63925                     if ((hasTag(way.tags, 'tunnel') || hasTag(way2.tags, 'tunnel')) &&
63926                         !(hasTag(way.tags, 'tunnel') && hasTag(way2.tags, 'tunnel'))) return false;
63927
63928                     // must have equivalent layers and levels
63929                     var layer1 = way.tags.layer || '0',
63930                         layer2 = way2.tags.layer || '0';
63931                     if (layer1 !== layer2) return false;
63932
63933                     var level1 = way.tags.level || '0',
63934                         level2 = way2.tags.level || '0';
63935                     if (level1 !== level2) return false;
63936
63937                     return true;
63938                 }
63939
63940
63941                 function canConnectByExtend(way, endNodeIdx) {
63942                     var EXTEND_TH_METERS = 5;
63943                     var tipNid = way.nodes[endNodeIdx];  // the 'tip' node for extension point
63944                     var midNid = endNodeIdx === 0 ? way.nodes[1] : way.nodes[way.nodes.length - 2];  // the other node of the edge
63945                     var tipNode = graph.entity(tipNid);
63946                     var midNode = graph.entity(midNid);
63947                     var lon = tipNode.loc[0];
63948                     var lat = tipNode.loc[1];
63949                     var lon_range = geoMetersToLon(EXTEND_TH_METERS, lat) / 2;
63950                     var lat_range = geoMetersToLat(EXTEND_TH_METERS) / 2;
63951                     var queryExtent = geoExtent([
63952                         [lon - lon_range, lat - lat_range],
63953                         [lon + lon_range, lat + lat_range]
63954                     ]);
63955
63956                     // first, extend the edge of [midNode -> tipNode] by EXTEND_TH_METERS and find the "extended tip" location
63957                     var edgeLen = geoSphericalDistance(midNode.loc, tipNode.loc);
63958                     var t = EXTEND_TH_METERS / edgeLen + 1.0;
63959                     var extTipLoc = geoVecInterp(midNode.loc, tipNode.loc, t);
63960
63961                     // then, check if the extension part [tipNode.loc -> extTipLoc] intersects any other ways
63962                     var intersected = tree.intersects(queryExtent, graph);
63963                     for (var i = 0; i < intersected.length; i++) {
63964                         var way2 = intersected[i];
63965
63966                         if (!isHighway(way2)) continue;
63967
63968                         if (!canConnectWays(way, way2)) continue;
63969
63970                         for (var j = 0; j < way2.nodes.length - 1; j++) {
63971                             var nA = graph.entity(way2.nodes[j]);
63972                             var nB = graph.entity(way2.nodes[j + 1]);
63973                             var crossLoc = geoLineIntersection([tipNode.loc, extTipLoc], [nA.loc, nB.loc]);
63974                             if (crossLoc) {
63975                                 return {
63976                                     node: tipNode,
63977                                     wid: way2.id,
63978                                     edge: [nA.id, nB.id],
63979                                     cross_loc: crossLoc
63980                                 };
63981                             }
63982                         }
63983                     }
63984                     return null;
63985                 }
63986             };
63987
63988             validation.type = type;
63989
63990             return validation;
63991         }
63992
63993         function validationCloseNodes() {
63994             var type = 'close_nodes';
63995
63996             // expect some features to be mapped with higher levels of detail
63997             var indoorThresholdMeters = 0.01;
63998             var buildingThresholdMeters = 0.05;
63999             var pathThresholdMeters = 0.1;
64000             var defaultThresholdMeters = 0.2;
64001
64002             function featureTypeForWay(way, graph) {
64003
64004                 if (osmPathHighwayTagValues[way.tags.highway]) return 'path';
64005
64006                 if (way.tags.indoor && way.tags.indoor !== 'no') return 'indoor';
64007                 if ((way.tags.building && way.tags.building !== 'no') ||
64008                     (way.tags['building:part'] && way.tags['building:part'] !== 'no')) return 'building';
64009                 if (way.tags.boundary && way.tags.boundary !== 'no') return 'boundary';
64010
64011                 var parentRelations = graph.parentRelations(way);
64012                 for (var i in parentRelations) {
64013                     var relation = parentRelations[i];
64014                     if (relation.isMultipolygon()) {
64015                         if (relation.tags.indoor && relation.tags.indoor !== 'no') return 'indoor';
64016                         if ((relation.tags.building && relation.tags.building !== 'no') ||
64017                             (relation.tags['building:part'] && relation.tags['building:part'] !== 'no')) return 'building';
64018                     } else {
64019                         if (relation.tags.type === 'boundary') return 'boundary';
64020                     }
64021                 }
64022
64023                 return 'other';
64024             }
64025
64026             function shouldCheckWay(way, context) {
64027
64028                 // don't flag issues where merging would create degenerate ways
64029                 if (way.nodes.length <= 2 ||
64030                     (way.isClosed() && way.nodes.length <= 4)) return false;
64031
64032                 var featureType = featureTypeForWay(way, context.graph());
64033                 if (featureType === 'boundary') return false;
64034
64035                 var bbox = way.extent(context.graph()).bbox();
64036                 var hypotenuseMeters = geoSphericalDistance([bbox.minX, bbox.minY], [bbox.maxX, bbox.maxY]);
64037                 // don't flag close nodes in very small ways
64038                 if (hypotenuseMeters < 1.5) return false;
64039
64040                 return true;
64041             }
64042
64043             function getIssuesForWay(way, context) {
64044                 if (!shouldCheckWay(way, context)) return [];
64045
64046                 var issues = [],
64047                     nodes = context.graph().childNodes(way);
64048                 for (var i = 0; i < nodes.length - 1; i++) {
64049                     var node1 = nodes[i];
64050                     var node2 = nodes[i+1];
64051
64052                     var issue = getIssueIfAny(node1, node2, way, context);
64053                     if (issue) issues.push(issue);
64054                 }
64055                 return issues;
64056             }
64057
64058             function getIssuesForNode(node, context) {
64059                 var issues = [];
64060
64061                 function checkForCloseness(node1, node2, way) {
64062                     var issue = getIssueIfAny(node1, node2, way, context);
64063                     if (issue) issues.push(issue);
64064                 }
64065
64066                 var parentWays = context.graph().parentWays(node);
64067
64068                 for (var i = 0; i < parentWays.length; i++) {
64069                     var parentWay = parentWays[i];
64070
64071                     if (!shouldCheckWay(parentWay, context)) continue;
64072
64073                     var lastIndex = parentWay.nodes.length - 1;
64074                     for (var j = 0; j < parentWay.nodes.length; j++) {
64075                         if (j !== 0) {
64076                             if (parentWay.nodes[j-1] === node.id) {
64077                                 checkForCloseness(node, context.entity(parentWay.nodes[j]), parentWay);
64078                             }
64079                         }
64080                         if (j !== lastIndex) {
64081                             if (parentWay.nodes[j+1] === node.id) {
64082                                 checkForCloseness(context.entity(parentWay.nodes[j]), node, parentWay);
64083                             }
64084                         }
64085                     }
64086                 }
64087
64088                 return issues;
64089             }
64090
64091             function getIssueIfAny(node1, node2, way, context) {
64092                 if (node1.id === node2.id ||
64093                     (node1.hasInterestingTags() && node2.hasInterestingTags())) {
64094                     return null;
64095                 }
64096
64097                 if (node1.loc !== node2.loc) {
64098
64099                     var featureType = featureTypeForWay(way, context.graph());
64100                     var threshold = defaultThresholdMeters;
64101                     if (featureType === 'indoor') threshold = indoorThresholdMeters;
64102                     else if (featureType === 'building') threshold = buildingThresholdMeters;
64103                     else if (featureType === 'path') threshold = pathThresholdMeters;
64104
64105                     var distance = geoSphericalDistance(node1.loc, node2.loc);
64106                     if (distance > threshold) return null;
64107                 }
64108
64109                 return new validationIssue({
64110                     type: type,
64111                     severity: 'warning',
64112                     message: function() {
64113                         var entity = context.hasEntity(this.entityIds[0]);
64114                         return entity ? t('issues.close_nodes.message', { way: utilDisplayLabel(entity, context) }) : '';
64115                     },
64116                     reference: showReference,
64117                     entityIds: [way.id, node1.id, node2.id],
64118                     loc: node1.loc,
64119                     fixes: [
64120                         new validationIssueFix({
64121                             icon: 'iD-icon-plus',
64122                             title: t('issues.fix.merge_points.title'),
64123                             onClick: function() {
64124                                 var entityIds = this.issue.entityIds;
64125                                 var action = actionMergeNodes([entityIds[1], entityIds[2]]);
64126                                 context.perform(action, t('issues.fix.merge_close_vertices.annotation'));
64127                             }
64128                         }),
64129                         new validationIssueFix({
64130                             icon: 'iD-operation-disconnect',
64131                             title: t('issues.fix.move_points_apart.title')
64132                         })
64133                     ]
64134                 });
64135
64136                 function showReference(selection) {
64137                     var referenceText = t('issues.close_nodes.reference');
64138                     selection.selectAll('.issue-reference')
64139                         .data([0])
64140                         .enter()
64141                         .append('div')
64142                         .attr('class', 'issue-reference')
64143                         .text(referenceText);
64144                 }
64145             }
64146
64147
64148             var validation = function(entity, context) {
64149                 if (entity.type === 'node') {
64150                     return getIssuesForNode(entity, context);
64151                 } else if (entity.type === 'way') {
64152                     return getIssuesForWay(entity, context);
64153                 }
64154                 return [];
64155             };
64156
64157
64158             validation.type = type;
64159
64160             return validation;
64161         }
64162
64163         function validationCrossingWays() {
64164             var type = 'crossing_ways';
64165
64166             /*
64167             Avoid duplicate work by cacheing issues. The same issues live under two paths.
64168             {
64169                 w-123: {
64170                     w-456: [{issue1}, {issue2}…]
64171                 },
64172                 w-456: {
64173                     w-123: [{issue1}, {issue2}…]
64174                 }
64175             }
64176             */
64177             var _issueCache = {};
64178
64179             // returns the way or its parent relation, whichever has a useful feature type
64180             function getFeatureWithFeatureTypeTagsForWay(way, graph) {
64181                 if (getFeatureTypeForTags(way.tags) === null) {
64182                     // if the way doesn't match a feature type, check its parent relations
64183                     var parentRels = graph.parentRelations(way);
64184                     for (var i = 0; i < parentRels.length; i++) {
64185                         var rel = parentRels[i];
64186                         if (getFeatureTypeForTags(rel.tags) !== null) {
64187                             return rel;
64188                         }
64189                     }
64190                 }
64191                 return way;
64192             }
64193
64194
64195             function hasTag(tags, key) {
64196                 return tags[key] !== undefined && tags[key] !== 'no';
64197             }
64198
64199             function tagsImplyIndoors(tags) {
64200                 return hasTag(tags, 'level') || tags.highway === 'corridor';
64201             }
64202
64203             function allowsStructures(featureType) {
64204                 return allowsBridge(featureType) || allowsTunnel(featureType);
64205             }
64206             function allowsBridge(featureType) {
64207                 return featureType === 'highway' || featureType === 'railway' || featureType === 'waterway';
64208             }
64209             function allowsTunnel(featureType) {
64210                 return featureType === 'highway' || featureType === 'railway' || featureType === 'waterway';
64211             }
64212             function canCover(featureType) {
64213                 return featureType === 'building';
64214             }
64215
64216
64217             function getFeatureTypeForCrossingCheck(way, graph) {
64218                 var tags = getFeatureWithFeatureTypeTagsForWay(way, graph).tags;
64219                 return getFeatureTypeForTags(tags);
64220             }
64221
64222             // blacklist
64223             var ignoredBuildings = {
64224                 demolished: true, dismantled: true, proposed: true, razed: true
64225             };
64226
64227
64228             function getFeatureTypeForTags(tags) {
64229                 if (hasTag(tags, 'building') && !ignoredBuildings[tags.building]) return 'building';
64230
64231                 // don't check non-building areas
64232                 if (hasTag(tags, 'area')) return null;
64233
64234                 if (hasTag(tags, 'highway') && osmRoutableHighwayTagValues[tags.highway]) return 'highway';
64235                 if (hasTag(tags, 'railway') && osmRailwayTrackTagValues[tags.railway]) return 'railway';
64236                 if (hasTag(tags, 'waterway') && osmFlowingWaterwayTagValues[tags.waterway]) return 'waterway';
64237
64238                 return null;
64239             }
64240
64241
64242             function isLegitCrossing(way1, featureType1, way2, featureType2) {
64243                 var tags1 = way1.tags;
64244                 var tags2 = way2.tags;
64245
64246                 // assume 0 by default
64247                 var level1 = tags1.level || '0';
64248                 var level2 = tags2.level || '0';
64249
64250                 if (tagsImplyIndoors(tags1) && tagsImplyIndoors(tags2) && level1 !== level2) {
64251                     // assume features don't interact if they're indoor on different levels
64252                     return true;
64253                 }
64254
64255                 // assume 0 by default; don't use way.layer() since we account for structures here
64256                 var layer1 = tags1.layer || '0';
64257                 var layer2 = tags2.layer || '0';
64258
64259                 if (allowsBridge(featureType1) && allowsBridge(featureType2)) {
64260                     if (hasTag(tags1, 'bridge') && !hasTag(tags2, 'bridge')) return true;
64261                     if (!hasTag(tags1, 'bridge') && hasTag(tags2, 'bridge')) return true;
64262                     // crossing bridges must use different layers
64263                     if (hasTag(tags1, 'bridge') && hasTag(tags2, 'bridge') && layer1 !== layer2) return true;
64264                 } else if (allowsBridge(featureType1) && hasTag(tags1, 'bridge')) return true;
64265                 else if (allowsBridge(featureType2) && hasTag(tags2, 'bridge')) return true;
64266
64267                 if (allowsTunnel(featureType1) && allowsTunnel(featureType2)) {
64268                     if (hasTag(tags1, 'tunnel') && !hasTag(tags2, 'tunnel')) return true;
64269                     if (!hasTag(tags1, 'tunnel') && hasTag(tags2, 'tunnel')) return true;
64270                     // crossing tunnels must use different layers
64271                     if (hasTag(tags1, 'tunnel') && hasTag(tags2, 'tunnel') && layer1 !== layer2) return true;
64272                 } else if (allowsTunnel(featureType1) && hasTag(tags1, 'tunnel')) return true;
64273                 else if (allowsTunnel(featureType2) && hasTag(tags2, 'tunnel')) return true;
64274
64275                 if (canCover(featureType1) && canCover(featureType2)) {
64276                     if (hasTag(tags1, 'covered') && !hasTag(tags2, 'covered')) return true;
64277                     if (!hasTag(tags1, 'covered') && hasTag(tags2, 'covered')) return true;
64278                     // crossing covered features that can themselves cover must use different layers
64279                     if (hasTag(tags1, 'covered') && hasTag(tags2, 'covered') && layer1 !== layer2) return true;
64280                 } else if (canCover(featureType1) && hasTag(tags2, 'covered')) return true;
64281                 else if (canCover(featureType2) && hasTag(tags1, 'covered')) return true;
64282
64283                 // don't flag crossing waterways and pier/highways
64284                 if (featureType1 === 'waterway' && featureType2 === 'highway' && tags2.man_made === 'pier') return true;
64285                 if (featureType2 === 'waterway' && featureType1 === 'highway' && tags1.man_made === 'pier') return true;
64286
64287                 if (!allowsStructures(featureType1) && !allowsStructures(featureType2)) {
64288                     // if no structures are applicable, the layers must be different
64289                     if (layer1 !== layer2) return true;
64290                 }
64291                 return false;
64292             }
64293
64294
64295             // highway values for which we shouldn't recommend connecting to waterways
64296             var highwaysDisallowingFords = {
64297                 motorway: true, motorway_link: true, trunk: true, trunk_link: true,
64298                 primary: true, primary_link: true, secondary: true, secondary_link: true
64299             };
64300             var nonCrossingHighways = { track: true };
64301
64302             function tagsForConnectionNodeIfAllowed(entity1, entity2) {
64303                 var featureType1 = getFeatureTypeForTags(entity1.tags);
64304                 var featureType2 = getFeatureTypeForTags(entity2.tags);
64305                 if (featureType1 === featureType2) {
64306                     if (featureType1 === 'highway') {
64307                         var entity1IsPath = osmPathHighwayTagValues[entity1.tags.highway];
64308                         var entity2IsPath = osmPathHighwayTagValues[entity2.tags.highway];
64309                         if ((entity1IsPath || entity2IsPath) && entity1IsPath !== entity2IsPath) {
64310                             // one feature is a path but not both
64311
64312                             var roadFeature = entity1IsPath ? entity2 : entity1;
64313                             if (nonCrossingHighways[roadFeature.tags.highway]) {
64314                                 // don't mark path connections with certain roads as crossings
64315                                 return {};
64316                             }
64317                             var pathFeature = entity1IsPath ? entity1 : entity2;
64318                             if (['marked', 'unmarked'].indexOf(pathFeature.tags.crossing) !== -1) {
64319                                 // if the path is a crossing, match the crossing type
64320                                 return { highway: 'crossing', crossing: pathFeature.tags.crossing };
64321                             }
64322                             // don't add a `crossing` subtag to ambiguous crossings
64323                             return { highway: 'crossing' };
64324                         }
64325                         return {};
64326                     }
64327                     if (featureType1 === 'waterway') return {};
64328                     if (featureType1 === 'railway') return {};
64329
64330                 } else {
64331                     var featureTypes = [featureType1, featureType2];
64332                     if (featureTypes.indexOf('highway') !== -1) {
64333                         if (featureTypes.indexOf('railway') !== -1) {
64334                             if (osmPathHighwayTagValues[entity1.tags.highway] ||
64335                                 osmPathHighwayTagValues[entity2.tags.highway]) {
64336                                 // path-rail connections use this tag
64337                                 return { railway: 'crossing' };
64338                             } else {
64339                                 // road-rail connections use this tag
64340                                 return { railway: 'level_crossing' };
64341                             }
64342                         }
64343
64344                         if (featureTypes.indexOf('waterway') !== -1) {
64345                             // do not allow fords on structures
64346                             if (hasTag(entity1.tags, 'tunnel') && hasTag(entity2.tags, 'tunnel')) return null;
64347                             if (hasTag(entity1.tags, 'bridge') && hasTag(entity2.tags, 'bridge')) return null;
64348
64349                             if (highwaysDisallowingFords[entity1.tags.highway] ||
64350                                 highwaysDisallowingFords[entity2.tags.highway]) {
64351                                 // do not allow fords on major highways
64352                                 return null;
64353                             }
64354                             return { ford: 'yes' };
64355                         }
64356                     }
64357                 }
64358                 return null;
64359             }
64360
64361
64362             function findCrossingsByWay(way1, graph, tree) {
64363                 var edgeCrossInfos = [];
64364                 if (way1.type !== 'way') return edgeCrossInfos;
64365
64366                 var way1FeatureType = getFeatureTypeForCrossingCheck(way1, graph);
64367                 if (way1FeatureType === null) return edgeCrossInfos;
64368
64369                 var checkedSingleCrossingWays = {};
64370
64371                 // declare vars ahead of time to reduce garbage collection
64372                 var i, j, nodeIndex;
64373                 var extent;
64374                 var n1, n2, nA, nB;
64375                 var segment1, segment2;
64376                 var oneOnly;
64377                 var intersected, way2, way2FeatureType, way2Nodes;
64378                 var way1Nodes = graph.childNodes(way1);
64379                 var comparedWays = {};
64380                 for (i = 0; i < way1Nodes.length - 1; i++) {
64381                     n1 = way1Nodes[i];
64382                     n2 = way1Nodes[i + 1];
64383                     extent = geoExtent([
64384                         [
64385                             Math.min(n1.loc[0], n2.loc[0]),
64386                             Math.min(n1.loc[1], n2.loc[1])
64387                         ],
64388                         [
64389                             Math.max(n1.loc[0], n2.loc[0]),
64390                             Math.max(n1.loc[1], n2.loc[1])
64391                         ]
64392                     ]);
64393
64394                     intersected = tree.intersects(extent, graph);
64395                     for (j = 0; j < intersected.length; j++) {
64396                         way2 = intersected[j];
64397
64398                         if (way2.type !== 'way') continue;
64399
64400                         // don't check for self-intersection in this validation
64401                         if (way2.id === way1.id) continue;
64402
64403                         // skip if this way was already checked and only one issue is needed
64404                         if (checkedSingleCrossingWays[way2.id]) continue;
64405
64406                         // don't re-check previously checked features
64407                         if (_issueCache[way1.id] && _issueCache[way1.id][way2.id]) continue;
64408
64409                         // mark this way as checked even if there are no crossings
64410                         comparedWays[way2.id] = true;
64411
64412                         // only check crossing highway, waterway, building, and railway
64413                         way2FeatureType = getFeatureTypeForCrossingCheck(way2, graph);
64414                         if (way2FeatureType === null ||
64415                             isLegitCrossing(way1, way1FeatureType, way2, way2FeatureType)) {
64416                             continue;
64417                         }
64418
64419                         // create only one issue for building crossings
64420                         oneOnly = way1FeatureType === 'building' || way2FeatureType === 'building';
64421                         segment1 = [n1.loc, n2.loc];
64422
64423                         way2Nodes = graph.childNodes(way2);
64424                         for (nodeIndex = 0; nodeIndex < way2Nodes.length - 1; nodeIndex++) {
64425                             nA = way2Nodes[nodeIndex];
64426                             nB = way2Nodes[nodeIndex + 1];
64427                             if (nA.id === n1.id || nA.id === n2.id ||
64428                                 nB.id === n1.id || nB.id === n2.id) {
64429                                 // n1 or n2 is a connection node; skip
64430                                 continue;
64431                             }
64432                             segment2 = [nA.loc, nB.loc];
64433                             var point = geoLineIntersection(segment1, segment2);
64434                             if (point) {
64435                                 edgeCrossInfos.push({
64436                                     ways: [way1, way2],
64437                                     featureTypes: [way1FeatureType, way2FeatureType],
64438                                     edges: [[n1.id, n2.id], [nA.id, nB.id]],
64439                                     crossPoint: point
64440                                 });
64441                                 if (oneOnly) {
64442                                     checkedSingleCrossingWays[way2.id] = true;
64443                                     break;
64444                                 }
64445                             }
64446                         }
64447                     }
64448                 }
64449                 for (var way2ID in comparedWays) {
64450                     if (!_issueCache[way1.id]) _issueCache[way1.id] = {};
64451                     if (!_issueCache[way1.id][way2ID]) _issueCache[way1.id][way2ID] = [];
64452                     if (!_issueCache[way2ID]) _issueCache[way2ID] = {};
64453                     if (!_issueCache[way2ID][way1.id]) _issueCache[way2ID][way1.id] = [];
64454                 }
64455                 return edgeCrossInfos;
64456             }
64457
64458
64459             function waysToCheck(entity, context) {
64460                 if (!getFeatureTypeForTags(entity.tags)) {
64461                     return [];
64462                 }
64463                 if (entity.type === 'way') {
64464                     return [entity];
64465                 } else if (entity.type === 'relation' &&
64466                     entity.isMultipolygon() &&
64467                     // only check multipolygons if they are buildings
64468                     hasTag(entity.tags, 'building')) {
64469                     return entity.members.reduce(function(array, member) {
64470                         if (member.type === 'way' &&
64471                             //(member.role === 'outer' || member.role === 'inner') &&
64472                             context.hasEntity(member.id)) {
64473                             var entity = context.entity(member.id);
64474                             array.push(entity);
64475                         }
64476                         return array;
64477                     }, []);
64478                 }
64479                 return [];
64480             }
64481
64482
64483             var validation = function checkCrossingWays(entity, context) {
64484                 var graph = context.graph();
64485                 var tree = context.history().tree();
64486
64487                 var ways = waysToCheck(entity, context);
64488
64489                 var issues = [];
64490                 // declare these here to reduce garbage collection
64491                 var wayIndex, crossingIndex, key, crossings, crossing, issue;
64492                 for (wayIndex in ways) {
64493                     var way = ways[wayIndex];
64494                     crossings = findCrossingsByWay(way, graph, tree);
64495                     for (crossingIndex in crossings) {
64496                         crossing = crossings[crossingIndex];
64497                         var way2 = crossing.ways[1];
64498                         issue = createIssue(crossing, context);
64499                         // cache the issues for each way
64500                         _issueCache[way.id][way2.id].push(issue);
64501                         _issueCache[way2.id][way.id].push(issue);
64502                     }
64503                     for (key in _issueCache[way.id]) {
64504                         issues = issues.concat(_issueCache[way.id][key]);
64505                     }
64506                 }
64507                 return issues;
64508             };
64509
64510
64511             function createIssue(crossing, context) {
64512                 var graph = context.graph();
64513
64514                 // use the entities with the tags that define the feature type
64515                 var entities = crossing.ways.sort(function(entity1, entity2) {
64516                     var type1 = getFeatureTypeForCrossingCheck(entity1, graph);
64517                     var type2 = getFeatureTypeForCrossingCheck(entity2, graph);
64518                     if (type1 === type2) {
64519                         return utilDisplayLabel(entity1, context) > utilDisplayLabel(entity2, context);
64520                     } else if (type1 === 'waterway') {
64521                         return true;
64522                     } else if (type2 === 'waterway') {
64523                         return false;
64524                     }
64525                     return type1 < type2;
64526                 });
64527                 entities = entities.map(function(way) {
64528                     return getFeatureWithFeatureTypeTagsForWay(way, graph);
64529                 });
64530
64531                 var connectionTags = tagsForConnectionNodeIfAllowed(entities[0], entities[1]);
64532
64533                 var featureType1 = crossing.featureTypes[0];
64534                 var featureType2 = crossing.featureTypes[1];
64535
64536                 var isCrossingIndoors = tagsImplyIndoors(entities[0].tags) && tagsImplyIndoors(entities[1].tags);
64537                 var isCrossingTunnels = allowsTunnel(featureType1) && hasTag(entities[0].tags, 'tunnel') &&
64538                                         allowsTunnel(featureType2) && hasTag(entities[1].tags, 'tunnel');
64539                 var isCrossingBridges = allowsBridge(featureType1) && hasTag(entities[0].tags, 'bridge') &&
64540                                         allowsBridge(featureType2) && hasTag(entities[1].tags, 'bridge');
64541
64542                 var crossingTypeID;
64543
64544                 if (isCrossingIndoors) {
64545                     crossingTypeID = 'indoor-indoor';
64546                 } else if (isCrossingTunnels) {
64547                     crossingTypeID = 'tunnel-tunnel';
64548                 } else if (isCrossingBridges) {
64549                     crossingTypeID = 'bridge-bridge';
64550                 } else {
64551                     crossingTypeID = crossing.featureTypes.sort().join('-');
64552                 }
64553                 if (connectionTags && (isCrossingIndoors || isCrossingTunnels || isCrossingBridges)) {
64554                     crossingTypeID += '_connectable';
64555                 }
64556
64557                 var fixes = [];
64558                 if (connectionTags) {
64559                     fixes.push(makeConnectWaysFix(context));
64560                 }
64561
64562                 var useFixIcon = 'iD-icon-layers';
64563                 var useFixID;
64564                 if (isCrossingIndoors) {
64565                     useFixID = 'use_different_levels';
64566                 } else if (isCrossingTunnels || isCrossingBridges) {
64567                     useFixID = 'use_different_layers';
64568                 // don't recommend bridges for waterways even though they're okay
64569                 } else if ((allowsBridge(featureType1) && featureType1 !== 'waterway') ||
64570                         (allowsBridge(featureType2) && featureType2 !== 'waterway')) {
64571                     useFixID = 'use_bridge_or_tunnel';
64572                     useFixIcon = 'maki-bridge';
64573                 } else if (allowsTunnel(featureType1) || allowsTunnel(featureType2)) {
64574                     useFixID = 'use_tunnel';
64575                 } else {
64576                     useFixID = 'use_different_layers';
64577                 }
64578                 if (useFixID === 'use_different_layers') {
64579                     fixes.push(makeChangeLayerFix('higher', context));
64580                     fixes.push(makeChangeLayerFix('lower', context));
64581                 } else {
64582                     fixes.push(new validationIssueFix({
64583                         icon: useFixIcon,
64584                         title: t('issues.fix.' + useFixID + '.title')
64585                     }));
64586                 }
64587                 fixes.push(new validationIssueFix({
64588                     icon: 'iD-operation-move',
64589                     title: t('issues.fix.reposition_features.title')
64590                 }));
64591
64592                 return new validationIssue({
64593                     type: type,
64594                     severity: 'warning',
64595                     message: function() {
64596                         var entity1 = context.hasEntity(this.entityIds[0]),
64597                             entity2 = context.hasEntity(this.entityIds[1]);
64598                         return (entity1 && entity2) ? t('issues.crossing_ways.message', {
64599                             feature: utilDisplayLabel(entity1, context),
64600                             feature2: utilDisplayLabel(entity2, context)
64601                         }) : '';
64602                     },
64603                     reference: showReference,
64604                     entityIds: entities.map(function(entity) {
64605                         return entity.id;
64606                     }),
64607                     data: {
64608                         edges: crossing.edges,
64609                         connectionTags: connectionTags
64610                     },
64611                     // differentiate based on the loc since two ways can cross multiple times
64612                     hash: JSON.stringify(crossing.crossPoint) +
64613                         // if the edges change then so does the fix
64614                         JSON.stringify(crossing.edges) +
64615                         // ensure the correct connection tags are added in the fix
64616                         JSON.stringify(connectionTags),
64617                     loc: crossing.crossPoint,
64618                     fixes: fixes
64619                 });
64620
64621                 function showReference(selection) {
64622                     selection.selectAll('.issue-reference')
64623                         .data([0])
64624                         .enter()
64625                         .append('div')
64626                         .attr('class', 'issue-reference')
64627                         .text(t('issues.crossing_ways.' + crossingTypeID + '.reference'));
64628                 }
64629             }
64630
64631             function makeConnectWaysFix(context) {
64632                 return new validationIssueFix({
64633                     icon: 'iD-icon-crossing',
64634                     title: t('issues.fix.connect_features.title'),
64635                     onClick: function() {
64636                         var loc = this.issue.loc;
64637                         var connectionTags = this.issue.data.connectionTags;
64638                         var edges = this.issue.data.edges;
64639
64640                         context.perform(
64641                             function actionConnectCrossingWays(graph) {
64642                                 // create the new node for the points
64643                                 var node = osmNode({ loc: loc, tags: connectionTags });
64644                                 graph = graph.replace(node);
64645
64646                                 var nodesToMerge = [node.id];
64647                                 var mergeThresholdInMeters = 0.75;
64648
64649                                 edges.forEach(function(edge) {
64650                                     var edgeNodes = [graph.entity(edge[0]), graph.entity(edge[1])];
64651                                     var closestNodeInfo = geoSphericalClosestNode(edgeNodes, loc);
64652                                     // if there is already a point nearby, use that
64653                                     if (closestNodeInfo.distance < mergeThresholdInMeters) {
64654                                         nodesToMerge.push(closestNodeInfo.node.id);
64655                                     // else add the new node to the way
64656                                     } else {
64657                                         graph = actionAddMidpoint({loc: loc, edge: edge}, node)(graph);
64658                                     }
64659                                 });
64660
64661                                 if (nodesToMerge.length > 1) {
64662                                     // if we're using nearby nodes, merge them with the new node
64663                                     graph = actionMergeNodes(nodesToMerge, loc)(graph);
64664                                 }
64665
64666                                 return graph;
64667                             },
64668                             t('issues.fix.connect_crossing_features.annotation')
64669                         );
64670                     }
64671                 });
64672             }
64673
64674             function makeChangeLayerFix(higherOrLower, context) {
64675                 return new validationIssueFix({
64676                     icon: 'iD-icon-' + (higherOrLower === 'higher' ? 'up' : 'down'),
64677                     title: t('issues.fix.tag_this_as_' + higherOrLower + '.title'),
64678                     onClick: function() {
64679
64680                         var mode = context.mode();
64681                         if (!mode || mode.id !== 'select') return;
64682
64683                         var selectedIDs = mode.selectedIDs();
64684                         if (selectedIDs.length !== 1) return;
64685
64686                         var selectedID = selectedIDs[0];
64687                         if (!this.issue.entityIds.some(function(entityId) {
64688                             return entityId === selectedID;
64689                         })) return;
64690
64691                         var entity = context.hasEntity(selectedID);
64692                         if (!entity) return;
64693
64694                         var tags = Object.assign({}, entity.tags);   // shallow copy
64695                         var layer = tags.layer && Number(tags.layer);
64696                         if (layer && !isNaN(layer)) {
64697                             if (higherOrLower === 'higher') {
64698                                 layer += 1;
64699                             } else {
64700                                 layer -= 1;
64701                             }
64702                         } else {
64703                             if (higherOrLower === 'higher') {
64704                                 layer = 1;
64705                             } else {
64706                                 layer = -1;
64707                             }
64708                         }
64709                         tags.layer = layer;
64710                         context.perform(
64711                             actionChangeTags(entity.id, tags),
64712                             t('operations.change_tags.annotation')
64713                         );
64714                     }
64715                 });
64716             }
64717
64718             validation.reset = function() {
64719                 _issueCache = {};
64720             };
64721
64722             validation.type = type;
64723
64724             return validation;
64725         }
64726
64727         function validationDisconnectedWay() {
64728             var type = 'disconnected_way';
64729
64730             function isTaggedAsHighway(entity) {
64731                 return osmRoutableHighwayTagValues[entity.tags.highway];
64732             }
64733
64734             var validation = function checkDisconnectedWay(entity, context) {
64735                 var graph = context.graph();
64736
64737                 var routingIslandWays = routingIslandForEntity(entity);
64738                 if (!routingIslandWays) return [];
64739
64740                 var fixes = [];
64741
64742                 var isSingle = routingIslandWays.size === 1;
64743
64744                 if (isSingle) {
64745
64746                     if (entity.type === 'way' && !entity.isClosed()) {
64747                         var firstID = entity.first();
64748                         var lastID = entity.last();
64749
64750                         var first = context.entity(firstID);
64751                         if (first.tags.noexit !== 'yes') {
64752                             fixes.push(new validationIssueFix({
64753                                 icon: 'iD-operation-continue-left',
64754                                 title: t('issues.fix.continue_from_start.title'),
64755                                 entityIds: [firstID],
64756                                 onClick: function() {
64757                                     var wayId = this.issue.entityIds[0];
64758                                     var way = context.entity(wayId);
64759                                     var vertexId = this.entityIds[0];
64760                                     var vertex = context.entity(vertexId);
64761                                     continueDrawing(way, vertex, context);
64762                                 }
64763                             }));
64764                         }
64765                         var last = context.entity(lastID);
64766                         if (last.tags.noexit !== 'yes') {
64767                             fixes.push(new validationIssueFix({
64768                                 icon: 'iD-operation-continue',
64769                                 title: t('issues.fix.continue_from_end.title'),
64770                                 entityIds: [lastID],
64771                                 onClick: function() {
64772                                     var wayId = this.issue.entityIds[0];
64773                                     var way = context.entity(wayId);
64774                                     var vertexId = this.entityIds[0];
64775                                     var vertex = context.entity(vertexId);
64776                                     continueDrawing(way, vertex, context);
64777                                 }
64778                             }));
64779                         }
64780
64781                     } else {
64782                         fixes.push(new validationIssueFix({
64783                             title: t('issues.fix.connect_feature.title')
64784                         }));
64785                     }
64786
64787                     if (!operationDelete([entity.id], context).disabled()) {
64788                         fixes.push(new validationIssueFix({
64789                             icon: 'iD-operation-delete',
64790                             title: t('issues.fix.delete_feature.title'),
64791                             entityIds: [entity.id],
64792                             onClick: function() {
64793                                 var id = this.issue.entityIds[0];
64794                                 var operation = operationDelete([id], context);
64795                                 if (!operation.disabled()) {
64796                                     operation();
64797                                 }
64798                             }
64799                         }));
64800                     }
64801                 } else {
64802                     fixes.push(new validationIssueFix({
64803                         title: t('issues.fix.connect_features.title')
64804                     }));
64805                 }
64806
64807                 return [new validationIssue({
64808                     type: type,
64809                     severity: 'warning',
64810                     message: function() {
64811                         if (this.entityIds.length === 1) {
64812                             var entity = context.hasEntity(this.entityIds[0]);
64813                             return entity ? t('issues.disconnected_way.highway.message', { highway: utilDisplayLabel(entity, context) }) : '';
64814                         }
64815                         return t('issues.disconnected_way.routable.message.multiple', { count: this.entityIds.length.toString() });
64816                     },
64817                     reference: showReference,
64818                     entityIds: Array.from(routingIslandWays).map(function(way) { return way.id; }),
64819                     fixes: fixes
64820                 })];
64821
64822
64823                 function showReference(selection) {
64824                     selection.selectAll('.issue-reference')
64825                         .data([0])
64826                         .enter()
64827                         .append('div')
64828                         .attr('class', 'issue-reference')
64829                         .text(t('issues.disconnected_way.routable.reference'));
64830                 }
64831
64832                 function routingIslandForEntity(entity) {
64833
64834                     if (entity.type !== 'way') return null;
64835
64836                     if (!isRoutableWay(entity, true)) return null;
64837
64838                     var waysToCheck = [entity];
64839                     var routingIsland = new Set([entity]);
64840
64841                     while (waysToCheck.length) {
64842                         var wayToCheck = waysToCheck.pop();
64843                         var childNodes = graph.childNodes(wayToCheck);
64844                         for (var i in childNodes) {
64845                             var vertex = childNodes[i];
64846                             var result = isConnectedVertex(vertex, routingIsland);
64847                             if (result === true) {
64848                                 return null;
64849                             } else if (result === false) {
64850                                 continue;
64851                             }
64852                             result.forEach(function(connectedWay) {
64853                                 if (!routingIsland.has(connectedWay)) {
64854                                     routingIsland.add(connectedWay);
64855                                     waysToCheck.push(connectedWay);
64856                                 }
64857                             });
64858                         }
64859                     }
64860
64861                     return routingIsland;
64862                 }
64863
64864                 function isConnectedVertex(vertex, routingIslandWays) {
64865                     // assume ways overlapping unloaded tiles are connected to the wider road network  - #5938
64866                     var osm = context.connection();
64867                     if (osm && !osm.isDataLoaded(vertex.loc)) return true;
64868
64869                     // entrances are considered connected
64870                     if (vertex.tags.entrance &&
64871                         vertex.tags.entrance !== 'no') return true;
64872                     if (vertex.tags.amenity === 'parking_entrance') return true;
64873
64874                     var parentsWays = graph.parentWays(vertex);
64875
64876                     // standalone vertex
64877                     if (parentsWays.length === 1) return false;
64878
64879                     var connectedWays = new Set();
64880
64881                     for (var i in parentsWays) {
64882                         var parentWay = parentsWays[i];
64883
64884                         // ignore any way we've already accounted for
64885                         if (routingIslandWays.has(parentWay)) continue;
64886
64887                         if (isRoutableWay(parentWay, false)) connectedWays.add(parentWay);
64888                     }
64889
64890                     if (connectedWays.size) return connectedWays;
64891
64892                     return false;
64893                 }
64894
64895                 function isRoutableWay(way, ignoreInnerWays) {
64896                     if (isTaggedAsHighway(way) || way.tags.route === 'ferry') return true;
64897
64898                     return graph.parentRelations(way).some(function(parentRelation) {
64899                         if (parentRelation.tags.type === 'route' &&
64900                             parentRelation.tags.route === 'ferry') return true;
64901
64902                         if (parentRelation.isMultipolygon() &&
64903                             isTaggedAsHighway(parentRelation) &&
64904                             (!ignoreInnerWays || parentRelation.memberById(way.id).role !== 'inner')) return true;
64905                     });
64906                 }
64907
64908                 function continueDrawing(way, vertex) {
64909                     // make sure the vertex is actually visible and editable
64910                     var map = context.map();
64911                     if (!map.editable() || !map.trimmedExtent().contains(vertex.loc)) {
64912                         map.zoomToEase(vertex);
64913                     }
64914
64915                     context.enter(
64916                         modeDrawLine(context, way.id, context.graph(), context.graph(), 'line', way.affix(vertex.id), true)
64917                     );
64918                 }
64919             };
64920
64921
64922             validation.type = type;
64923
64924             return validation;
64925         }
64926
64927         function validationFixmeTag() {
64928             var type = 'fixme_tag';
64929
64930
64931             var validation = function checkFixmeTag(entity, context) {
64932
64933                 if (!entity.tags.fixme) return [];
64934
64935                 // don't flag fixmes on features added by the user
64936                 if (entity.version === undefined) return [];
64937
64938                 if (entity.v !== undefined) {
64939                     var baseEntity = context.history().base().hasEntity(entity.id);
64940                     // don't flag fixmes added by the user on existing features
64941                     if (!baseEntity || !baseEntity.tags.fixme) return [];
64942                 }
64943
64944                 return [new validationIssue({
64945                     type: type,
64946                     severity: 'warning',
64947                     message: function() {
64948                         var entity = context.hasEntity(this.entityIds[0]);
64949                         return entity ? t('issues.fixme_tag.message', { feature: utilDisplayLabel(entity, context) }) : '';
64950                     },
64951                     reference: showReference,
64952                     entityIds: [entity.id]
64953                 })];
64954
64955                 function showReference(selection) {
64956                     selection.selectAll('.issue-reference')
64957                         .data([0])
64958                         .enter()
64959                         .append('div')
64960                         .attr('class', 'issue-reference')
64961                         .text(t('issues.fixme_tag.reference'));
64962                 }
64963             };
64964
64965             validation.type = type;
64966
64967             return validation;
64968         }
64969
64970         var brands = {"amenity/bank|ABANCA":{countryCodes:["es"],tags:{amenity:"bank",brand:"ABANCA","brand:wikidata":"Q9598744","brand:wikipedia":"es:Abanca",name:"ABANCA",official_name:"ABANCA Corporación Bancaria"}},"amenity/bank|ABN AMRO":{countryCodes:["nl"],tags:{amenity:"bank",brand:"ABN AMRO","brand:wikidata":"Q287471","brand:wikipedia":"en:ABN AMRO",name:"ABN AMRO",official_name:"ABN AMRO Bank N.V.",operator:"ABN AMRO Group","operator:wikidata":"Q17061287","operator:wikipedia":"en:ABN AMRO Group"}},"amenity/bank|ABSA":{countryCodes:["za"],tags:{amenity:"bank",brand:"ABSA","brand:wikidata":"Q331688","brand:wikipedia":"en:ABSA Group Limited",name:"ABSA"}},"amenity/bank|AIB":{countryCodes:["gb","ie"],tags:{amenity:"bank",brand:"AIB","brand:wikidata":"Q1642179","brand:wikipedia":"en:Allied Irish Banks",name:"AIB",official_name:"Allied Irish Banks"}},"amenity/bank|ANZ":{countryCodes:["au","nz"],matchNames:["anz bank"],tags:{amenity:"bank",brand:"ANZ","brand:wikidata":"Q714641","brand:wikipedia":"en:Australia and New Zealand Banking Group",name:"ANZ",official_name:"Australia and New Zealand Banking Group Limited"}},"amenity/bank|ASB Bank":{countryCodes:["nz"],tags:{amenity:"bank",brand:"ASB Bank","brand:wikidata":"Q297214","brand:wikipedia":"en:ASB Bank",name:"ASB Bank",operator:"Commonwealth Bank of Australia","operator:wikidata":"Q285328","operator:wikipedia":"en:Commonwealth Bank"}},"amenity/bank|ATB Financial":{countryCodes:["ca"],tags:{amenity:"bank",brand:"ATB Financial","brand:wikidata":"Q298762","brand:wikipedia":"en:ATB Financial",name:"ATB Financial",official_name:"Alberta Treasury Branches"}},"amenity/bank|AXA":{tags:{amenity:"bank",brand:"AXA","brand:wikidata":"Q160054","brand:wikipedia":"en:AXA",name:"AXA"}},"amenity/bank|Access Bank":{tags:{amenity:"bank",brand:"Access Bank","brand:wikidata":"Q4672418","brand:wikipedia":"en:Access Bank plc",name:"Access Bank",operator:"Access Bank Group","operator:wikidata":"Q4672420","operator:wikipedia":"en:Access Bank Group"}},"amenity/bank|Addiko Bank":{countryCodes:["ba","hr","me","rs","si"],tags:{amenity:"bank",brand:"Addiko Bank","brand:wikidata":"Q27926559","brand:wikipedia":"en:Addiko Bank",name:"Addiko Bank"}},"amenity/bank|Agrani Bank Limited অগ্রণী ব্যাংক লিমিটেড":{countryCodes:["bd"],tags:{amenity:"bank",brand:"Agrani Bank Limited অগ্রণী ব্যাংক লিমিটেড","brand:wikidata":"Q517050","brand:wikipedia":"en:Agrani Bank",name:"Agrani Bank Limited অগ্রণী ব্যাংক লিমিটেড","name:en":"Agrani Bank Limited"}},"amenity/bank|Agribank~(USA)":{countryCodes:["us"],tags:{amenity:"bank",brand:"Agribank","brand:wikidata":"Q4693829","brand:wikipedia":"en:AgriBank",name:"Agribank"}},"amenity/bank|Agribank~(Vietnam)":{countryCodes:["vn"],tags:{amenity:"bank",brand:"Agribank","brand:wikidata":"Q1924723","brand:wikipedia":"vn:Ngân hàng Nông nghiệp và Phát triển Nông thôn Việt Nam",name:"Agribank",official_name:"Ngân hàng Nông nghiệp và Phát triển Nông thôn Việt Nam","official_name:en":"Vietnam Bank for Agriculture and Rural Development"}},"amenity/bank|Agribank~(Zimbabwe)":{countryCodes:["zw"],tags:{amenity:"bank",brand:"Agribank","brand:wikidata":"Q4693887","brand:wikipedia":"en:Agricultural Development Bank of Zimbabwe",name:"Agribank"}},"amenity/bank|Akbank":{countryCodes:["tr"],tags:{amenity:"bank",brand:"Akbank","brand:wikidata":"Q416624","brand:wikipedia":"en:Akbank",name:"Akbank"}},"amenity/bank|Alior Bank":{countryCodes:["pl"],tags:{amenity:"bank",brand:"Alior Bank","brand:wikidata":"Q9148395","brand:wikipedia":"pl:Alior Bank",name:"Alior Bank"}},"amenity/bank|Allahabad Bank":{countryCodes:["in"],tags:{amenity:"bank",brand:"Allahabad Bank","brand:wikidata":"Q2018840","brand:wikipedia":"en:Allahabad Bank",name:"Allahabad Bank"}},"amenity/bank|Allied Bank":{tags:{amenity:"bank",brand:"Allied Bank","brand:wikidata":"Q4732555","brand:wikipedia":"en:Allied Banking Corporation",name:"Allied Bank"}},"amenity/bank|Alpha Bank":{tags:{amenity:"bank",brand:"Alpha Bank","brand:wikidata":"Q747394","brand:wikipedia":"en:Alpha Bank",name:"Alpha Bank",operator:"Hellenic Financial Stability Fund","operator:wikidata":"Q19903317","operator:wikipedia":"en:Hellenic Financial Stability Fund"}},"amenity/bank|Andhra Bank":{countryCodes:["in"],tags:{amenity:"bank",brand:"Andhra Bank","brand:wikidata":"Q2003476","brand:wikipedia":"en:Andhra Bank",name:"Andhra Bank"}},"amenity/bank|Antonveneta":{countryCodes:["it"],tags:{amenity:"bank",brand:"Antonveneta","brand:wikidata":"Q3633689","brand:wikipedia":"en:Banca Antonveneta",name:"Antonveneta"}},"amenity/bank|Apple Bank":{countryCodes:["us"],nomatch:["shop/electronics|Apple Store"],tags:{amenity:"bank",brand:"Apple Bank","brand:wikidata":"Q4781125","brand:wikipedia":"en:Apple Bank for Savings",name:"Apple Bank"}},"amenity/bank|Argenta":{countryCodes:["be","lu","nl"],tags:{amenity:"bank",brand:"Argenta","brand:wikidata":"Q932856","brand:wikipedia":"en:Argenta (bank)",name:"Argenta",operator:"Argenta Group","operator:wikidata":"Q19604341"}},"amenity/bank|Arvest Bank":{countryCodes:["us"],tags:{amenity:"bank",brand:"Arvest Bank","brand:wikidata":"Q4802393","brand:wikipedia":"en:Arvest Bank",name:"Arvest Bank"}},"amenity/bank|Asia United Bank":{countryCodes:["ph"],tags:{amenity:"bank",brand:"Asia United Bank","brand:wikidata":"Q4806482","brand:wikipedia":"en:Asia United Bank",name:"Asia United Bank"}},"amenity/bank|Askari Bank":{countryCodes:["pk"],tags:{amenity:"bank",brand:"Askari Bank","brand:wikidata":"Q4807137","brand:wikipedia":"en:Askari Bank",name:"Askari Bank"}},"amenity/bank|Associated Bank":{countryCodes:["us"],tags:{amenity:"bank",brand:"Associated Bank","brand:wikidata":"Q4809155","brand:wikipedia":"en:Associated Banc-Corp",name:"Associated Bank",operator:"Associated Banc-Corp"}},"amenity/bank|Attijariwafa Bank":{tags:{amenity:"bank",brand:"Attijariwafa Bank","brand:wikidata":"Q758052","brand:wikipedia":"en:Attijariwafa Bank",name:"Attijariwafa Bank",operator:"Société Nationale d'Investissement","operator:en":"National Investment Company","operator:wikidata":"Q3488506","operator:wikipedia":"en:Société Nationale d'Investissement"}},"amenity/bank|Axis Bank":{countryCodes:["in"],tags:{amenity:"bank",brand:"Axis Bank","brand:wikidata":"Q2003549","brand:wikipedia":"en:Axis Bank",name:"Axis Bank"}},"amenity/bank|BAC":{tags:{amenity:"bank",brand:"BAC","brand:wikidata":"Q5715556","brand:wikipedia":"en:Banco de América Central",name:"BAC",official_name:"Banco de America Central",operator:"Grupo Aval","operator:en":"Aval Group","operator:wikidata":"Q2053387","operator:wikipedia":"en:Grupo Aval"}},"amenity/bank|BAWAG PSK":{countryCodes:["at"],tags:{amenity:"bank",brand:"BAWAG PSK","brand:wikidata":"Q379938","brand:wikipedia":"en:BAWAG P.S.K.",name:"BAWAG PSK"}},"amenity/bank|BB&T":{countryCodes:["us"],tags:{amenity:"bank",brand:"BB&T","brand:wikidata":"Q795486","brand:wikipedia":"en:BB&T",name:"BB&T",official_name:"Branch Banking and Trust Company"}},"amenity/bank|BBBank":{countryCodes:["de"],tags:{amenity:"bank",brand:"BBBank","brand:wikidata":"Q795504","brand:wikipedia":"en:BBBank",name:"BBBank",operator:"Baden-Württembergischer Genossenschaftsverband","operator:en":"Baden-Württemberg Cooperative Association","operator:wikidata":"Q798896","operator:wikipedia":"de:Baden-Württembergischer Genossenschaftsverband"}},"amenity/bank|BBVA":{tags:{amenity:"bank",brand:"BBVA","brand:wikidata":"Q806189","brand:wikipedia":"en:Banco Bilbao Vizcaya Argentaria",name:"BBVA",official_name:"Banco Bilbao Vizcaya Argentaria"}},"amenity/bank|BBVA Bancomer":{countryCodes:["mx"],tags:{amenity:"bank",brand:"BBVA Bancomer","brand:wikidata":"Q2876794","brand:wikipedia":"en:BBVA Bancomer",name:"BBVA Bancomer",operator:"BBVA","operator:wikidata":"Q806189","operator:wikipedia":"de:Banco Bilbao Vizcaya Argentaria"}},"amenity/bank|BBVA Compass":{countryCodes:["us"],tags:{amenity:"bank",brand:"BBVA Compass","brand:wikidata":"Q4835088","brand:wikipedia":"en:BBVA Compass",name:"BBVA Compass",official_name:"BBVA Compass Bancshares",operator:"BBVA","operator:wikidata":"Q806189","operator:wikipedia":"de:Banco Bilbao Vizcaya Argentaria"}},"amenity/bank|BBVA Continental":{countryCodes:["pe"],tags:{amenity:"bank",brand:"BBVA Continental","brand:wikidata":"Q4835089","brand:wikipedia":"en:BBVA Continental",name:"BBVA Continental",operator:"BBVA","operator:wikidata":"Q806189","operator:wikipedia":"de:Banco Bilbao Vizcaya Argentaria"}},"amenity/bank|BBVA Francés":{countryCodes:["ar"],tags:{amenity:"bank",brand:"BBVA Francés","brand:en":"BBVA France","brand:fr":"BBVA France","brand:wikidata":"Q2876788","brand:wikipedia":"en:BBVA Francés",name:"BBVA Francés","name:en":"BBVA France","name:fr":"BBVA Francés",operator:"BBVA","operator:wikidata":"Q806189","operator:wikipedia":"de:Banco Bilbao Vizcaya Argentaria"}},"amenity/bank|BCA":{matchNames:["bank bca"],tags:{amenity:"bank",brand:"BCA","brand:wikidata":"Q806626","brand:wikipedia":"id:Bank Central Asia",name:"BCA",official_name:"Bank Central Asia"}},"amenity/bank|BCI":{matchNames:["banco bci"],tags:{amenity:"bank",brand:"BCI","brand:wikidata":"Q2882083","brand:wikipedia":"es:Banco de Crédito e Inversiones",name:"BCI",official_name:"Banco de Crédito e Inversiones","official_name:en":"Bank of Credit and Investments","official_name:es":"Banco de Crédito e Inversiones"}},"amenity/bank|BCP~(Bolivia)":{countryCodes:["bo"],nomatch:["amenity/bank|BCP~(France)","amenity/bank|BCP~(Luxembourg)","amenity/bank|BCP~(Peru)"],tags:{amenity:"bank",brand:"BCP","brand:wikidata":"Q16826675","brand:wikipedia":"es:Banco de Crédito de Bolivia",name:"BCP",official_name:"Banco de Crédito de Bolivia","official_name:en":"Credit Bank of Bolivia","official_name:es":"Banco de Crédito de Bolivia",operator:"Banco de Crédito del Perú","operator:en":"Credit Bank of Peru","operator:es":"Banco de Crédito del Perú","operator:wikidata":"Q4854124","operator:wikipedia":"es:Banco de Crédito del Perú"}},"amenity/bank|BCP~(France)":{countryCodes:["fr"],matchNames:["banque bcp","bcp"],nomatch:["amenity/bank|BCP~(Bolivia)","amenity/bank|BCP~(Luxembourg)","amenity/bank|BCP~(Peru)"],tags:{amenity:"bank",brand:"BCP","brand:wikidata":"Q118581","brand:wikipedia":"pt:Banco Comercial Português",name:"BCP"}},"amenity/bank|BCP~(Luxembourg)":{countryCodes:["lu"],matchNames:["banque bcp","bcp"],nomatch:["amenity/bank|BCP~(Bolivia)","amenity/bank|BCP~(France)","amenity/bank|BCP~(Peru)"],tags:{amenity:"bank",brand:"BCP","brand:wikidata":"Q118581","brand:wikipedia":"pt:Banco Comercial Português",name:"BCP"}},"amenity/bank|BCP~(Peru)":{countryCodes:["pe"],matchNames:["banco de crédito del perú"],nomatch:["amenity/bank|BCP~(Bolivia)","amenity/bank|BCP~(France)","amenity/bank|BCP~(Luxembourg)"],tags:{amenity:"bank",brand:"BCP","brand:wikidata":"Q4854124","brand:wikipedia":"es:Banco de Crédito del Perú",name:"BCP"}},"amenity/bank|BCR~(Banca Comercială Română)":{countryCodes:["ro"],matchNames:["banca comercială română"],tags:{amenity:"bank",brand:"BCR","brand:wikidata":"Q806149","brand:wikipedia":"en:Banca Comercială Română",name:"BCR",official_name:"Banca Comercială Română","official_name:en":"Romanian Commercial Bank","official_name:ro":"Banca Comercială Română"}},"amenity/bank|BCR~(Costa Rica)":{countryCodes:["cr"],matchNames:["banco de costa rica"],tags:{amenity:"bank",brand:"BCR","brand:wikidata":"Q6951632","brand:wikipedia":"es:Banco de Costa Rica",name:"BCR",official_name:"Banco de Costa Rica","official_name:en":"Bank of Costa Rica","official_name:es":"Banco de Costa Rica"}},"amenity/bank|BDO":{countryCodes:["ph"],tags:{amenity:"bank",brand:"BDO","brand:wikidata":"Q4854129","brand:wikipedia":"en:Banco de Oro",name:"BDO",official_name:"Banco de Oro","official_name:en":"Gold Bank","official_name:es":"Banco de Oro"}},"amenity/bank|BGŻ BNP Paribas":{countryCodes:["pl"],tags:{amenity:"bank",brand:"BGŻ BNP Paribas","brand:wikidata":"Q20744004","brand:wikipedia":"pl:BNP Paribas Bank Polska",name:"BGŻ BNP Paribas",operator:"BNP Paribas","operator:wikidata":"Q499707","operator:wikipedia":"pl:BNP Paribas"}},"amenity/bank|BIAT":{tags:{amenity:"bank",brand:"BIAT","brand:wikidata":"Q690739","brand:wikipedia":"en:Banque Internationale Arabe de Tunisie",name:"BIAT"}},"amenity/bank|BMCE Bank":{matchNames:["bmce"],tags:{amenity:"bank",brand:"BMCE Bank","brand:wikidata":"Q2300433","brand:wikipedia":"ar:البنك المغربي للتجارة الخارجية",name:"BMCE Bank"}},"amenity/bank|BMCI":{countryCodes:["ma"],matchNames:["bmci bank"],tags:{amenity:"bank",brand:"BMCI","brand:wikidata":"Q2883409","brand:wikipedia":"ar:البنك المغربي للتجارة والصناعة",name:"BMCI",operator:"BNP Paribas","operator:wikidata":"Q499707","operator:wikipedia":"pl:BNP Paribas"}},"amenity/bank|BMN":{countryCodes:["es"],tags:{amenity:"bank",brand:"BMN","brand:wikidata":"Q3754900","brand:wikipedia":"es:Banco Mare Nostrum",name:"BMN",official_name:"Banco Mare Nostrum"}},"amenity/bank|BMO":{matchNames:["bmo bank of montreal"],tags:{amenity:"bank",brand:"BMO","brand:wikidata":"Q806693","brand:wikipedia":"en:Bank of Montreal",name:"BMO",official_name:"Bank of Montreal"}},"amenity/bank|BMO Harris Bank":{countryCodes:["us"],tags:{amenity:"bank",brand:"BMO Harris Bank","brand:wikidata":"Q4835981","brand:wikipedia":"en:BMO Harris Bank",name:"BMO Harris Bank",operator:"Bank of Montreal","operator:wikidata":"Q806693","operator:wikipedia":"en:Bank of Montreal"}},"amenity/bank|BNA~(Algeria)":{countryCodes:["dz"],tags:{amenity:"bank",brand:"BNA","brand:wikidata":"Q2883410","brand:wikipedia":"fr:Banque nationale d'Algérie",name:"BNA",official_name:"Banque nationale d'Algérie","official_name:en":"National Bank of Algeria","official_name:fr":"Banque nationale d'Algérie"}},"amenity/bank|BNA~(Tunisia)":{countryCodes:["tn"],tags:{amenity:"bank",brand:"BNA","brand:wikidata":"Q2883413","brand:wikipedia":"fr:Banque nationale agricole",name:"BNA"}},"amenity/bank|BNI":{matchNames:["bank bni"],tags:{amenity:"bank",brand:"BNI","brand:wikidata":"Q2882611","brand:wikipedia":"id:Bank Negara Indonesia",name:"BNI",official_name:"Bank Negara Indonesia","official_name:en":"State Bank of Indonesia","official_name:id":"Bank Negara Indonesia"}},"amenity/bank|BNL":{countryCodes:["it"],tags:{amenity:"bank",brand:"BNL","brand:wikidata":"Q2201225","brand:wikipedia":"en:Banca Nazionale del Lavoro",name:"BNL",official_name:"Banca Nazionale del Lavoro","official_name:en":"National Labor Bank","official_name:it":"Banca Nazionale del Lavoro",operator:"BNP Paribas","operator:wikidata":"Q499707","operator:wikipedia":"en:BNP Paribas"}},"amenity/bank|BNP Paribas":{tags:{amenity:"bank",brand:"BNP Paribas","brand:wikidata":"Q499707","brand:wikipedia":"en:BNP Paribas",name:"BNP Paribas"}},"amenity/bank|BNP Paribas Fortis":{tags:{amenity:"bank",brand:"BNP Paribas Fortis","brand:wikidata":"Q796827","brand:wikipedia":"en:BNP Paribas Fortis",name:"BNP Paribas Fortis"}},"amenity/bank|BOC":{tags:{amenity:"bank",brand:"BOC","brand:wikidata":"Q790068","brand:wikipedia":"en:Bank of China",name:"BOC",official_name:"Bank of China"}},"amenity/bank|BPI":{matchNames:["bank of the philippine islands","bpi family savings bank"],tags:{amenity:"bank",brand:"BPI","brand:wikidata":"Q2501256","brand:wikipedia":"en:Bank of the Philippine Islands",name:"BPI",official_name:"Bank of the Philippine Islands"}},"amenity/bank|BRD":{countryCodes:["ro"],tags:{amenity:"bank",brand:"BRD","brand:wikidata":"Q796927","brand:wikipedia":"ro:BRD - Groupe Société Générale",name:"BRD"}},"amenity/bank|BRED":{tags:{amenity:"bank",brand:"BRED","brand:wikidata":"Q2877455","brand:wikipedia":"fr:BRED Banque populaire",name:"BRED",official_name:"Banque régionale d'escompte et de dépôts","official_name:en":"Regional Discount and Deposit Bank","official_name:fr":"Banque régionale d'escompte et de dépôts",operator:"Groupe BPCE","operator:en":"BPCE Group","operator:fr":"Groupe BPCE","operator:wikidata":"Q806941","operator:wikipedia":"en:Groupe BPCE"}},"amenity/bank|BRI":{countryCodes:["id"],matchNames:["bank bri"],tags:{amenity:"bank",brand:"BRI","brand:wikidata":"Q623042","brand:wikipedia":"id:Bank Rakyat Indonesia",name:"BRI",official_name:"Bank Rakyat Indonesia","official_name:en":"People's Bank of Indonesia","official_name:id":"Bank Rakyat Indonesia"}},"amenity/bank|BTN":{countryCodes:["id"],tags:{amenity:"bank",brand:"BTN","brand:en":"BTN","brand:id":"BTN","brand:wikidata":"Q12474534","brand:wikipedia":"id:Bank Tabungan Negara",name:"BTN","name:en":"BTN","name:id":"BTN",official_name:"Bank Tabungan Negara","official_name:en":"State Savings Bank","official_name:id":"Bank Tabungan Negara"}},"amenity/bank|BW-Bank":{countryCodes:["de"],matchNames:["baden-württembergische bank"],tags:{amenity:"bank",brand:"BW-Bank","brand:ed":"BW-Bank","brand:en":"BW-Bank","brand:wikidata":"Q798891","brand:wikipedia":"de:Baden-Württembergische Bank",name:"BW-Bank","name:de":"BW-Bank","name:en":"BW-Bank",operator:"Landesbank Baden-Württemberg","operator:de":"Landesbank Baden-Württemberg","operator:en":"Baden-Württemberg Regional Bank","operator:wikidata":"Q451814","operator:wikipedia":"en:Landesbank Baden-Württemberg"}},"amenity/bank|Banamex":{countryCodes:["mx"],tags:{amenity:"bank",brand:"Banamex","brand:wikidata":"Q749474","brand:wikipedia":"en:Grupo Financiero Banamex",name:"Banamex",official_name:"Grupo Financiero Banamex","official_name:en":"Banamex Financial Group","official_name:es":"Grupo Financiero Banamex",operator:"Citigroup","operator:wikidata":"Q219508","operator:wikipedia":"en:Citigroup"}},"amenity/bank|Banca Intesa":{countryCodes:["it","rs"],tags:{amenity:"bank",brand:"Banca Intesa","brand:wikidata":"Q647092","brand:wikipedia":"en:Banca Intesa",name:"Banca Intesa","name:en":"Intesa Bank","name:it":"Banca Intesa",operator:"Intesa Sanpaolo","operator:en":"Intesa St. Paul","operator:it":"Intesa Sanpaolo","operator:wikidata":"Q1343118","operator:wikipedia":"en:Intesa Sanpaolo"}},"amenity/bank|Banca March":{countryCodes:["es"],tags:{amenity:"bank",brand:"Banca March","brand:wikidata":"Q578252","brand:wikipedia":"en:Banca March",name:"Banca March"}},"amenity/bank|Banca Popolare di Milano":{countryCodes:["it"],matchNames:["bpm"],tags:{amenity:"bank",brand:"Banca Popolare di Milano","brand:en":"Popular Bank of Milan","brand:it":"Banca Popolare di Milano","brand:wikidata":"Q806154","brand:wikipedia":"en:Banca Popolare di Milano",name:"Banca Popolare di Milano","name:en":"Popular Bank of Milan","name:it":"Banca Popolare di Milano",operator:"Banco BPM","operator:en":"BPM Bank","operator:it":"Banco BPM","operator:wikidata":"Q27331643","operator:wikipedia":"en:Banco BPM"}},"amenity/bank|Banca Popolare di Novara":{countryCodes:["it"],tags:{amenity:"bank",brand:"Banca Popolare di Novara","brand:en":"Popular Bank of Novara","brand:it":"Banca Popolare di Novara","brand:wikidata":"Q3633742","brand:wikipedia":"en:Banca Popolare di Novara",name:"Banca Popolare di Novara","name:en":"Popular Bank of Novara","name:it":"Banca Popolare di Novara",operator:"Banco BPM","operator:en":"BPM Bank","operator:it":"Banco BPM","operator:wikidata":"Q27331643","operator:wikipedia":"en:Banco BPM"}},"amenity/bank|Banca Popolare di Sondrio":{countryCodes:["it"],tags:{amenity:"bank",brand:"Banca Popolare di Sondrio","brand:en":"Popular Bank of Sandrio","brand:it":"Banca Popolare di Sondrio","brand:wikidata":"Q686176","brand:wikipedia":"en:Banca Popolare di Sondrio",name:"Banca Popolare di Sondrio","name:en":"Popular Bank of Sandrio","name:it":"Banca Popolare di Sondrio"}},"amenity/bank|Banca Popolare di Verona":{countryCodes:["it"],tags:{amenity:"bank",brand:"Banca Popolare di Verona","brand:en":"Popular Bank of Verona","brand:it":"Banca Popolare di Verona","brand:wikidata":"Q3167468","brand:wikipedia":"en:Banca Popolare di Verona",name:"Banca Popolare di Verona","name:en":"Popular Bank of Verona","name:it":"Banca Popolare di Verona",operator:"Banco Popolare","operator:en":"Popular Bank","operator:it":"Banco Popolare","operator:wikidata":"Q806194","operator:wikipedia":"en:Banco Popolare"}},"amenity/bank|Banca Popolare di Vicenza":{countryCodes:["it"],tags:{amenity:"bank",brand:"Banca Popolare di Vicenza","brand:en":"Popular Bank of Vicenza","brand:it":"Banca Popolare di Vicenza","brand:wikidata":"Q3127200","brand:wikipedia":"en:Banca Popolare di Vicenza",name:"Banca Popolare di Vicenza","name:en":"Popular Bank of Vicena","name:it":"Banca Popolare di Vicenza",operator:"Atlante","operator:en":"Atlas","operator:it":"Atlante","operator:wikidata":"Q25206459","operator:wikipedia":"en:Atlante (private equity fund)"}},"amenity/bank|Banca Românească":{countryCodes:["ro"],tags:{amenity:"bank",brand:"Banca Românească","brand:en":"Romanian Bank","brand:ro":"Banca Românească","brand:wikidata":"Q4854052","brand:wikipedia":"ro:Banca Românească",name:"Banca Românească","name:en":"Popular Bank of Vicena","name:ro":"Banca Românească",operator:"National Bank of Greece","operator:wikidata":"Q1816028","operator:wikipedia":"en:National Bank of Greece"}},"amenity/bank|Banca Sella":{countryCodes:["it"],tags:{amenity:"bank",brand:"Banca Sella","brand:en":"Sella Bank","brand:it":"Banca Sella","brand:wikidata":"Q3633749","brand:wikipedia":"en:Banca Sella Group",name:"Banca Sella","name:en":"Sella Bank","name:it":"Banca Sella"}},"amenity/bank|Banca Transilvania":{countryCodes:["ro"],tags:{amenity:"bank",brand:"Banca Transilvania","brand:en":"Transilvania Bank","brand:ro":"Banca Transilvania","brand:wikidata":"Q806161","brand:wikipedia":"en:Banca Transilvania",name:"Banca Transilvania","name:en":"Transilvania Bank","name:ro":"Banca Transilvania"}},"amenity/bank|Bancaribe":{countryCodes:["ve"],tags:{amenity:"bank",brand:"Bancaribe","brand:wikidata":"Q5717827","brand:wikipedia":"en:Bancaribe",name:"Bancaribe"}},"amenity/bank|Banco AV Villas":{countryCodes:["co"],tags:{amenity:"bank",brand:"Banco AV Villas","brand:en":"Bank of Villas","brand:es":"Banco AV Villas","brand:wikidata":"Q4854068","brand:wikipedia":"en:Banco AV Villas",name:"Banco AV Villas","name:en":"Bank of Villas","name:es":"Banco AV Villas",operator:"Grupo Aval","operator:en":"Aval Group","operator:pt":"Grupo Aval","operator:wikidata":"Q2053387","operator:wikipedia":"en:Grupo Aval"}},"amenity/bank|Banco Agrario":{countryCodes:["co"],tags:{amenity:"bank",brand:"Banco Agrario","brand:en":"Agrarian Bank","brand:wikidata":"Q20013358","brand:wikipedia":"es:Banco Agrario de Colombia",name:"Banco Agrario","name:en":"Agrarian Bank","name:es":"Banco Agrario",official_name:"Banco Agrario de Colombia","official_name:en":"Agrarian Bank of Colombia","official_name:es":"Banco Agrario de Colombia"}},"amenity/bank|Banco Agrario de Colombia":{countryCodes:["co"],tags:{amenity:"bank",brand:"Banco Agrario de Colombia","brand:wikidata":"Q20013358","brand:wikipedia":"en:Banco Agrario de Colombia",name:"Banco Agrario de Colombia"}},"amenity/bank|Banco Azteca":{tags:{amenity:"bank",brand:"Banco Azteca","brand:en":"Aztec Bank","brand:es":"Banco Azteca","brand:wikidata":"Q4854076","brand:wikipedia":"en:Banco Azteca",name:"Banco Azteca","name:en":"Aztec Bank","name:es":"Banco Azteca",operator:"Grupo Elektra","operator:en":"Elektra Group","operator:es":"Grupo Elektra","operator:wikidata":"Q1142753","operator:wikipedia":"en:Grupo Elektra"}},"amenity/bank|Banco BPM":{countryCodes:["it"],tags:{amenity:"bank",brand:"Banco BPM","brand:wikidata":"Q27331643","brand:wikipedia":"en:Banco BPM",name:"Banco BPM"}},"amenity/bank|Banco Caja Social":{countryCodes:["co"],tags:{amenity:"bank",brand:"Banco Caja Social","brand:en":"Social Housing Bank","brand:es":"Banco Caja Social","brand:wikidata":"Q5717869","brand:wikipedia":"es:Banco Caja Social",name:"Banco Caja Social","name:en":"Social Housing Bank","name:es":"Banco Caja Social"}},"amenity/bank|Banco Ciudad":{countryCodes:["ar"],tags:{amenity:"bank",brand:"Banco Ciudad","brand:en":"City Bank","brand:es":"Banco Ciudad","brand:wikidata":"Q4856204","brand:wikipedia":"en:Bank of the City of Buenos Aires",name:"Banco Ciudad","name:en":"City Bank","name:es":"Banco Ciudad",official_name:"Banco Ciudad de Buenos Aires","official_name:en":"Bank of the City of Buenos Aires","official_name:es":"Banco Ciudad de Buenos Aires"}},"amenity/bank|Banco Continental~(Paraguay)":{countryCodes:["py"],tags:{amenity:"bank",brand:"Banco Continental","brand:wikidata":"Q62054564",name:"Banco Continental"}},"amenity/bank|Banco Continental~(Peru)":{countryCodes:["pe"],tags:{amenity:"bank",brand:"Banco Continental","brand:en":"Continental Bank","brand:es":"Banco Continental","brand:wikidata":"Q4835089","brand:wikipedia":"en:BBVA Continental",name:"Banco Continental","name:en":"Continental Bank","name:es":"Banco Continental"}},"amenity/bank|Banco Estado":{countryCodes:["cl"],tags:{amenity:"bank",brand:"Banco Estado","brand:en":"State Bank","brand:es":"Banco Estado","brand:wikidata":"Q5718188","brand:wikipedia":"es:Banco del Estado de Chile",name:"Banco Estado","name:en":"State Bank","name:es":"Banco Estado",official_name:"Banco del Estado de Chile","official_name:en":"Bank of the State of Chile","official_name:es":"Banco del Estado de Chile"}},"amenity/bank|Banco Falabella":{countryCodes:["cl","co","pe"],nomatch:["shop/department_store|Falabella"],tags:{amenity:"bank",brand:"Banco Falabella","brand:en":"Falabella Bank","brand:es":"Banco Falabella","brand:wikidata":"Q4854088","brand:wikipedia":"en:Banco Falabella",name:"Banco Falabella","name:en":"Falabella Bank","name:es":"Banco Falabella",operator:"Falabella","operator:es":"Falabella","operator:wikidata":"Q1374824","operator:wikipedia":"en:S.A.C.I. Falabella"}},"amenity/bank|Banco Fassil":{countryCodes:["bo"],tags:{amenity:"bank",brand:"Banco Fassil","brand:en":"Fassil Bank","brand:es":"Banco Fassil","brand:wikidata":"Q62118592",name:"Banco Fassil","name:en":"Fassil Bank","name:es":"Banco Fassil"}},"amenity/bank|Banco G&T Continental":{tags:{amenity:"bank",brand:"Banco G&T Continental","brand:en":"G&T Continental Bank","brand:es":"Banco G&T Continental","brand:wikidata":"Q5717949","brand:wikipedia":"es:Banco GYT Continental, S.A.",name:"Banco G&T Continental","name:en":"G&T Continental Bank"}},"amenity/bank|Banco General":{countryCodes:["cr","pa"],tags:{amenity:"bank",brand:"BW-Bank","brand:en":"BW-Bank","brand:es":"BW-Bank","brand:wikidata":"Q27618271","brand:wikipedia":"es:Banco General (Panamá)",name:"Banco General","name:en":"General Bank","name:es":"Banco General"}},"amenity/bank|Banco Industrial":{tags:{amenity:"bank",brand:"Banco Industrial","brand:en":"Industrial Bank","brand:es":"Banco Industrial","brand:wikidata":"Q16489444","brand:wikipedia":"es:Banco Industrial",name:"Banco Industrial","name:en":"Industrial Bank","name:es":"Banco Industrial",operator:"BIND Group"}},"amenity/bank|Banco Internacional~(Chile)":{countryCodes:["cl"],tags:{amenity:"bank",brand:"Banco Internacional","brand:en":"International Bank","brand:es":"Banco Internacional","brand:wikidata":"Q56605586","brand:wikipedia":"es:Banco Internacional (Chile)",name:"Banco Internacional","name:en":"International Bank","name:es":"Banco Internacional"}},"amenity/bank|Banco Internacional~(Ecuador)":{countryCodes:["ec"],tags:{amenity:"bank",brand:"Banco Internacional","brand:en":"International Bank","brand:es":"Banco Internacional","brand:wikidata":"Q806187","brand:wikipedia":"es:Banco Internacional",name:"Banco Internacional","name:en":"International Bank","name:es":"Banco Internacional"}},"amenity/bank|Banco Metropolitano":{countryCodes:["cu"],tags:{amenity:"bank",brand:"Banco Metropolitano","brand:en":"Metroplitan Bank","brand:es":"Banco Metropolitano","brand:wikidata":"Q62118612",name:"Banco Metropolitano","name:en":"Metropolitan Bank","name:es":"Banco Metropolitano"}},"amenity/bank|Banco Nacional":{countryCodes:["br"],tags:{amenity:"bank",brand:"Banco Nacional","brand:en":"National Bank","brand:es":"Banco Nacional","brand:wikidata":"Q4854104","brand:wikipedia":"en:Banco Nacional",name:"Banco Nacional","name:en":"National Bank","name:es":"Banco Nacional"}},"amenity/bank|Banco Nación":{tags:{amenity:"bank",brand:"Banco Nación","brand:en":"Nation Bank","brand:es":"Nation Bank","brand:wikidata":"Q2883376","brand:wikipedia":"en:Banco de la Nación Argentina",name:"Banco Nación","name:en":"Nation Bank","name:es":"Banco Nación",official_name:"Banco de la Nación Argentina","official_name:en":"Bank of the Argentine Nation","official_name:es":"Banco de la Nación Argentina"}},"amenity/bank|Banco Pastor":{countryCodes:["es"],tags:{amenity:"bank",brand:"Banco Pastor","brand:en":"Shepherd Bank","brand:es":"Banco Pastor","brand:wikidata":"Q806193","brand:wikipedia":"en:Banco Pastor",name:"Banco Pastor","name:en":"Shepherd Bank","name:es":"Banco Pastor",official_name:"Banco Popular Pastor","official_name:en":"Popular Shepherd Bank","official_name:es":"Banco Popular Pastor",operator:"Popular, Inc.","operator:wikidata":"Q7229656","operator:wikipedia":"en:Popular, Inc."}},"amenity/bank|Banco Pichincha":{tags:{amenity:"bank",brand:"Banco Pichincha","brand:en":"Pichincha Bank","brand:es":"Banco Pichincha","brand:wikidata":"Q4854135","brand:wikipedia":"en:Banco Pichincha",name:"Banco Pichincha","name:en":"Pichincha Bank","name:es":"Banco Pichincha",operator:"Grupo Pichincha","operator:wikidata":"Q6440687","operator:wikipedia":"es:Grupo Pichincha"}},"amenity/bank|Banco Popular":{countryCodes:["pr","us","vi"],matchNames:["popular"],tags:{amenity:"bank",brand:"Banco Popular","brand:en":"Popular Bank","brand:es":"Banco Popular","brand:wikidata":"Q537259","brand:wikipedia":"es:Banco Popular Español",name:"Banco Popular","name:en":"Popular Bank","name:es":"Banco Popular",official_name:"Banco Popular Español","official_name:en":"Spanish Popular Bank","official_name:es":"Banco Popular Español",operator:"Banco Santander","operator:wikidata":"Q806215","operator:wikipedia":"en:Banco Santander"}},"amenity/bank|Banco Popular de Ahorro":{countryCodes:["cu"],matchNames:["bpa"],tags:{amenity:"bank",brand:"Banco Popular de Ahorro","brand:en":"Popular Saving Bank","brand:es":"Banco Popular de Ahorro","brand:wikidata":"Q62118626",name:"Banco Popular de Ahorro","name:en":"Popular Saving Bank","name:es":"Banco Popular de Ahorro"}},"amenity/bank|Banco Provincia":{countryCodes:["ar"],tags:{amenity:"bank",brand:"Banco Provincia","brand:en":"Province Bank","brand:es":"Banco Provincia","brand:wikidata":"Q4856209","brand:wikipedia":"es:Banco de la Provincia de Buenos Aires",name:"Banco Provincia","name:en":"Province Bank","name:es":"Banco Provincia",official_name:"Banco de la Provincia de Buenos Aires","official_name:en":"Bank of the Province of Buenos Aires","official_name:es":"Banco de la Provincia de Buenos Aires"}},"amenity/bank|Banco Sabadell":{countryCodes:["es"],matchNames:["banc sabadell","sabadell"],tags:{amenity:"bank",brand:"Banco Sabadell","brand:en":"Sabadell Bank","brand:es":"Banco Sabadell","brand:wikidata":"Q762330","brand:wikipedia":"es:Banco Sabadell",name:"Banco Sabadell","name:en":"Sabadell Bank","name:es":"Banco Sabadell"}},"amenity/bank|Banco Santa Fe":{countryCodes:["ar"],tags:{amenity:"bank",brand:"Banco Santa Fe","brand:en":"Santa Fe Bank","brand:es":"Banco Santa Fe","brand:wikidata":"Q6046871","brand:wikipedia":"es:Nuevo Banco de Santa Fe",name:"Banco Santa Fe","name:en":"Santa Fe Bank","name:es":"Banco Santa Fe",official_name:"Nuevo Banco de Santa Fe","official_name:en":"New Bank of Santa Fe","official_name:es":"Nuevo Banco de Santa Fe"}},"amenity/bank|Banco Santander":{nomatch:["amenity/bank|Santander"],tags:{amenity:"bank",brand:"Banco Santander","brand:en":"Santander Bank","brand:es":"Banco Santander","brand:wikidata":"Q6496310","brand:wikipedia":"es:Banco Santander",name:"Banco Santander","name:en":"Santander Bank","name:es":"Banco Santander"}},"amenity/bank|Banco Sol~(Angola)":{countryCodes:["ao"],tags:{amenity:"bank",brand:"Banco Sol","brand:pt":"Banco Sol","brand:wikidata":"Q62118744",name:"Banco Sol","name:pt":"Banco Sol"}},"amenity/bank|Banco Sol~(Bolivia)":{countryCodes:["bo"],tags:{amenity:"bank",brand:"Banco Sol","brand:pt":"Banco Sol","brand:wikidata":"Q62118746",name:"Banco Sol","name:pt":"Banco Sol"}},"amenity/bank|Banco Unión":{countryCodes:["bo"],nomatch:["amenity/bank|UnionBank","amenity/money_transfer|Express Union"],tags:{amenity:"bank",brand:"Banco Unión",name:"Banco Unión"}},"amenity/bank|Banco de Bogotá":{tags:{amenity:"bank",brand:"Banco de Bogotá","brand:wikidata":"Q4854122","brand:wikipedia":"es:Banco de Bogotá",name:"Banco de Bogotá"}},"amenity/bank|Banco de Chile":{countryCodes:["cl"],tags:{amenity:"bank",brand:"Banco de Chile","brand:wikidata":"Q2882085","brand:wikipedia":"es:Banco de Chile",name:"Banco de Chile"}},"amenity/bank|Banco de Desarrollo Banrural":{tags:{amenity:"bank",brand:"Banco de Desarrollo Banrural","brand:wikidata":"Q5719130","brand:wikipedia":"es:Banrural",name:"Banco de Desarrollo Banrural"}},"amenity/bank|Banco de Fomento Angola (BFA)":{tags:{amenity:"bank",brand:"Banco de Fomento Angola (BFA)","brand:wikidata":"Q806197","brand:wikipedia":"de:Banco de Fomento Angola",name:"Banco de Fomento Angola (BFA)"}},"amenity/bank|Banco de Occidente":{tags:{amenity:"bank",brand:"Banco de Occidente","brand:wikidata":"Q4854127","brand:wikipedia":"es:Banco de Occidente (Colombia)",name:"Banco de Occidente"}},"amenity/bank|Banco de Venezuela":{matchNames:["de venezuela"],tags:{amenity:"bank",brand:"Banco de Venezuela","brand:wikidata":"Q517093","brand:wikipedia":"es:Banco de Venezuela",name:"Banco de Venezuela"}},"amenity/bank|Banco de la Nación~(Argentina)":{countryCodes:["ar"],tags:{amenity:"bank",brand:"Banco de la Nación","brand:wikidata":"Q2883376","brand:wikipedia":"en:Banco de la Nación Argentina",name:"Banco de la Nación"}},"amenity/bank|Banco de la Nación~(Peru)":{countryCodes:["pe"],tags:{amenity:"bank",brand:"Banco de la Nación","brand:wikidata":"Q4856206","brand:wikipedia":"en:Bank of the Nation (Peru)",name:"Banco de la Nación"}},"amenity/bank|Banco del Austro":{countryCodes:["ec"],tags:{amenity:"bank",brand:"Banco del Austro","brand:wikidata":"Q62122344",name:"Banco del Austro"}},"amenity/bank|Banco di Napoli":{countryCodes:["it"],tags:{amenity:"bank",brand:"Banco di Napoli","brand:wikidata":"Q3633835","brand:wikipedia":"en:Banco di Napoli",name:"Banco di Napoli"}},"amenity/bank|Banco di Sardegna":{countryCodes:["it"],tags:{amenity:"bank",brand:"Banco di Sardegna","brand:wikidata":"Q806205","brand:wikipedia":"en:Banco di Sardegna",name:"Banco di Sardegna"}},"amenity/bank|Banco do Brasil":{tags:{amenity:"bank",brand:"Banco do Brasil","brand:wikidata":"Q610817","brand:wikipedia":"en:Banco do Brasil",name:"Banco do Brasil"}},"amenity/bank|Banco do Nordeste":{countryCodes:["br"],tags:{amenity:"bank",brand:"Banco do Nordeste","brand:wikidata":"Q4854137","brand:wikipedia":"en:Banco do Nordeste",name:"Banco do Nordeste"}},"amenity/bank|Bancolombia":{tags:{amenity:"bank",brand:"Bancolombia","brand:wikidata":"Q806206","brand:wikipedia":"en:Bancolombia",name:"Bancolombia"}},"amenity/bank|Bancomer":{countryCodes:["mx"],tags:{amenity:"bank",brand:"Bancomer","brand:wikidata":"Q2876794","brand:wikipedia":"en:BBVA Bancomer",name:"Bancomer"}},"amenity/bank|Bancpost":{countryCodes:["ro"],nomatch:["amenity/bank|Postbank"],tags:{amenity:"bank",brand:"Bancpost","brand:wikidata":"Q4854143","brand:wikipedia":"ro:Bancpost",name:"Bancpost"}},"amenity/bank|Banesco":{tags:{amenity:"bank",brand:"Banesco","brand:wikidata":"Q4854841","brand:wikipedia":"en:Banesco",name:"Banesco"}},"amenity/bank|Bangkok Bank":{tags:{amenity:"bank",brand:"Bangkok Bank","brand:wikidata":"Q806483","brand:wikipedia":"en:Bangkok Bank",name:"Bangkok Bank"}},"amenity/bank|Bank Al Habib":{countryCodes:["pk"],tags:{amenity:"bank",brand:"Bank Al Habib","brand:wikidata":"Q4034833","brand:wikipedia":"ur:بينک الحبيب لمیٹڈ",name:"Bank Al Habib"}},"amenity/bank|Bank Alfalah":{tags:{amenity:"bank",brand:"Bank Alfalah","brand:wikidata":"Q4855895","brand:wikipedia":"en:Bank Alfalah",name:"Bank Alfalah"}},"amenity/bank|Bank Austria":{tags:{amenity:"bank",brand:"Bank Austria","brand:wikidata":"Q697619","brand:wikipedia":"en:Bank Austria",name:"Bank Austria"}},"amenity/bank|Bank Danamon":{countryCodes:["id"],tags:{amenity:"bank",brand:"Bank Danamon","brand:wikidata":"Q4855913","brand:wikipedia":"en:Bank Danamon",name:"Bank Danamon"}},"amenity/bank|Bank Mandiri":{countryCodes:["id"],tags:{amenity:"bank",brand:"Bank Mandiri","brand:wikidata":"Q806639","brand:wikipedia":"en:Bank Mandiri",name:"Bank Mandiri"}},"amenity/bank|Bank Mandiri Syariah":{countryCodes:["id"],tags:{amenity:"bank",brand:"Bank Mandiri Syariah","brand:wikidata":"Q12474533","brand:wikipedia":"id:Bank Syariah Mandiri",name:"Bank Mandiri Syariah"}},"amenity/bank|Bank Mega":{countryCodes:["id"],tags:{amenity:"bank",brand:"Bank Mega","brand:wikidata":"Q12474504","brand:wikipedia":"id:Bank Mega",name:"Bank Mega"}},"amenity/bank|Bank Muamalat":{tags:{amenity:"bank",brand:"Bank Muamalat","brand:wikidata":"Q4855949","brand:wikipedia":"en:Bank Muamalat",name:"Bank Muamalat"}},"amenity/bank|Bank Pekao":{countryCodes:["pl"],tags:{amenity:"bank",brand:"Bank Pekao","brand:wikidata":"Q806642","brand:wikipedia":"pl:Bank Polska Kasa Opieki",name:"Bank Pekao"}},"amenity/bank|Bank Rakyat":{countryCodes:["my"],tags:{amenity:"bank",brand:"Bank Rakyat","brand:wikidata":"Q4855964","brand:wikipedia":"ms:Bank Rakyat",name:"Bank Rakyat"}},"amenity/bank|Bank of Africa":{tags:{amenity:"bank",brand:"Bank of Africa","brand:wikidata":"Q2882627","brand:wikipedia":"en:Bank of Africa Group",name:"Bank of Africa",short_name:"BOA"}},"amenity/bank|Bank of America":{tags:{amenity:"bank",brand:"Bank of America","brand:wikidata":"Q487907","brand:wikipedia":"en:Bank of America",name:"Bank of America"}},"amenity/bank|Bank of Baroda":{tags:{amenity:"bank",brand:"Bank of Baroda","brand:wikidata":"Q2003797","brand:wikipedia":"en:Bank of Baroda",name:"Bank of Baroda"}},"amenity/bank|Bank of Ceylon":{tags:{amenity:"bank",brand:"Bank of Ceylon","brand:wikidata":"Q2882652","brand:wikipedia":"en:Bank of Ceylon",name:"Bank of Ceylon"}},"amenity/bank|Bank of China":{tags:{amenity:"bank",brand:"Bank of China","brand:wikidata":"Q790068","brand:wikipedia":"en:Bank of China",name:"Bank of China"}},"amenity/bank|Bank of Commerce":{tags:{amenity:"bank",brand:"Bank of Commerce","brand:wikidata":"Q4856092","brand:wikipedia":"en:Bank of Commerce",name:"Bank of Commerce"}},"amenity/bank|Bank of Cyprus":{tags:{amenity:"bank",brand:"Bank of Cyprus","brand:wikidata":"Q806678","brand:wikipedia":"en:Bank of Cyprus",name:"Bank of Cyprus"}},"amenity/bank|Bank of India":{tags:{amenity:"bank",brand:"Bank of India","brand:wikidata":"Q2004439","brand:wikipedia":"en:Bank of India",name:"Bank of India"}},"amenity/bank|Bank of Ireland":{tags:{amenity:"bank",brand:"Bank of Ireland","brand:wikidata":"Q806689","brand:wikipedia":"en:Bank of Ireland",name:"Bank of Ireland"}},"amenity/bank|Bank of Maharashtra":{countryCodes:["in"],tags:{amenity:"bank",brand:"Bank of Maharashtra","brand:wikidata":"Q2004304","brand:wikipedia":"en:Bank of Maharashtra",name:"Bank of Maharashtra"}},"amenity/bank|Bank of Montreal":{tags:{amenity:"bank",brand:"Bank of Montreal","brand:wikidata":"Q806693","brand:wikipedia":"en:Bank of Montreal",name:"Bank of Montreal"}},"amenity/bank|Bank of New Zealand":{countryCodes:["nz"],tags:{amenity:"bank",brand:"Bank of New Zealand","brand:wikidata":"Q806687","brand:wikipedia":"en:Bank of New Zealand",name:"Bank of New Zealand"}},"amenity/bank|Bank of Scotland":{countryCodes:["gb"],tags:{amenity:"bank",brand:"Bank of Scotland","brand:wikidata":"Q627381","brand:wikipedia":"en:Bank of Scotland",name:"Bank of Scotland"}},"amenity/bank|Bank of the West":{countryCodes:["us"],tags:{amenity:"bank",brand:"Bank of the West","brand:wikidata":"Q2881919","brand:wikipedia":"en:Bank of the West",name:"Bank of the West"}},"amenity/bank|Bankia":{countryCodes:["es"],tags:{amenity:"bank",brand:"Bankia","brand:wikidata":"Q806807","brand:wikipedia":"en:Bankia",name:"Bankia"}},"amenity/bank|Bankinter":{nomatch:["amenity/bank|Interbank"],tags:{amenity:"bank",brand:"Bankinter","brand:wikidata":"Q806808","brand:wikipedia":"es:Bankinter",name:"Bankinter"}},"amenity/bank|Banner Bank":{countryCodes:["us"],tags:{amenity:"bank",brand:"Banner Bank","brand:wikidata":"Q4856910","brand:wikipedia":"en:Banner Bank",name:"Banner Bank"}},"amenity/bank|Banorte":{countryCodes:["mx"],tags:{amenity:"bank",brand:"Banorte","brand:wikidata":"Q806914","brand:wikipedia":"en:Banorte",name:"Banorte"}},"amenity/bank|Banque Atlantique":{tags:{amenity:"bank",brand:"Banque Atlantique","brand:wikidata":"Q2882890","brand:wikipedia":"en:Atlantic Bank Group",name:"Banque Atlantique"}},"amenity/bank|Banque Laurentienne":{countryCodes:["ca"],tags:{amenity:"bank",brand:"Banque Laurentienne","brand:wikidata":"Q1360087","brand:wikipedia":"en:Laurentian Bank of Canada",name:"Banque Laurentienne"}},"amenity/bank|Banque Nationale~(Canada)":{countryCodes:["ca"],matchNames:["banque nationale du canada","national bank of canada"],tags:{amenity:"bank",brand:"Banque Nationale","brand:wikidata":"Q634298","brand:wikipedia":"en:National Bank of Canada",name:"Banque Nationale"}},"amenity/bank|Banque Populaire":{tags:{amenity:"bank",brand:"Banque Populaire","brand:wikidata":"Q2883441","brand:wikipedia":"en:Banque Populaire du Maroc",name:"Banque Populaire"}},"amenity/bank|Banrisul":{countryCodes:["br"],tags:{amenity:"bank",brand:"Banrisul","brand:wikidata":"Q4857098","brand:wikipedia":"en:Banrisul",name:"Banrisul"}},"amenity/bank|Banrural":{countryCodes:["gt","hn"],tags:{amenity:"bank",brand:"Banrural","brand:wikidata":"Q5719130","brand:wikipedia":"es:Banrural",name:"Banrural"}},"amenity/bank|Barclays":{matchNames:["barclays bank"],tags:{amenity:"bank",brand:"Barclays","brand:wikidata":"Q245343","brand:wikipedia":"en:Barclays",name:"Barclays"}},"amenity/bank|Bcc":{tags:{amenity:"bank",brand:"Bcc",name:"Bcc"}},"amenity/bank|Belfius":{countryCodes:["be"],tags:{amenity:"bank",brand:"Belfius","brand:wikidata":"Q1956014","brand:wikipedia":"en:Belfius",name:"Belfius"}},"amenity/bank|Bendigo Bank":{countryCodes:["au"],tags:{amenity:"bank",brand:"Bendigo Bank","brand:wikidata":"Q4887077","brand:wikipedia":"en:Bendigo and Adelaide Bank",name:"Bendigo Bank"}},"amenity/bank|Berliner Volksbank":{countryCodes:["de"],tags:{amenity:"bank",brand:"Berliner Volksbank","brand:wikidata":"Q821855","brand:wikipedia":"de:Berliner Volksbank",name:"Berliner Volksbank"}},"amenity/bank|Bicentenario":{countryCodes:["ve"],tags:{amenity:"bank",brand:"Bicentenario","brand:wikidata":"Q5728123","brand:wikipedia":"es:Bicentenario Banco Universal",name:"Bicentenario"}},"amenity/bank|Bicici":{countryCodes:["ci"],matchNames:["agence bicici"],tags:{amenity:"bank",brand:"Bicici","brand:wikidata":"Q1667302","brand:wikipedia":"fr:Banque internationale pour le commerce et l'industrie de la Côte d'Ivoire",name:"Bicici"}},"amenity/bank|Bradesco":{countryCodes:["br"],matchNames:["banco bradesco"],tags:{amenity:"bank",brand:"Bradesco","brand:wikidata":"Q806181","brand:wikipedia":"en:Banco Bradesco",name:"Bradesco"}},"amenity/bank|Budapest Bank":{countryCodes:["hu"],tags:{amenity:"bank",brand:"Budapest Bank","brand:wikidata":"Q27493463","brand:wikipedia":"en:Budapest Bank",name:"Budapest Bank"}},"amenity/bank|CBAO":{tags:{amenity:"bank",brand:"CBAO","brand:wikidata":"Q532104","brand:wikipedia":"fr:CBAO Groupe Attijariwafa bank",name:"CBAO"}},"amenity/bank|CEC Bank":{countryCodes:["ro"],tags:{amenity:"bank",brand:"CEC Bank","brand:wikidata":"Q1023306","brand:wikipedia":"en:CEC Bank",name:"CEC Bank"}},"amenity/bank|CIB Bank":{tags:{amenity:"bank",brand:"CIB Bank","brand:wikidata":"Q839566","brand:wikipedia":"en:CIB Bank",name:"CIB Bank"}},"amenity/bank|CIBC":{countryCodes:["ca"],matchNames:["cibc banking centre"],tags:{amenity:"bank",brand:"CIBC","brand:wikidata":"Q666694","brand:wikipedia":"en:Canadian Imperial Bank of Commerce",name:"CIBC"}},"amenity/bank|CIC":{tags:{amenity:"bank",brand:"CIC","brand:wikidata":"Q746525","brand:wikipedia":"en:Crédit Industriel et Commercial",name:"CIC"}},"amenity/bank|CIH Bank":{countryCodes:["ma"],tags:{amenity:"bank",brand:"CIH Bank","brand:wikidata":"Q3006220","brand:wikipedia":"en:CIH Bank",name:"CIH Bank"}},"amenity/bank|CIMB Bank":{tags:{amenity:"bank",brand:"CIMB Bank","brand:wikidata":"Q3045976","brand:wikipedia":"en:CIMB",name:"CIMB Bank"}},"amenity/bank|CIMB Niaga":{countryCodes:["id"],tags:{amenity:"bank",brand:"CIMB Niaga","brand:wikidata":"Q5011747","brand:wikipedia":"en:CIMB Niaga",name:"CIMB Niaga"}},"amenity/bank|CNEP":{countryCodes:["dz"],tags:{amenity:"bank",brand:"CNEP","brand:wikidata":"Q2931752","brand:wikipedia":"fr:CNEP-Banque",name:"CNEP"}},"amenity/bank|Caisse Desjardins":{countryCodes:["ca"],tags:{amenity:"bank",brand:"Caisse Desjardins","brand:wikidata":"Q2933350","brand:wikipedia":"en:Desjardins Group",name:"Caisse Desjardins"}},"amenity/bank|Caisse d'Épargne":{tags:{amenity:"bank",brand:"Caisse d'Épargne","brand:wikidata":"Q1547738","brand:wikipedia":"en:Groupe Caisse d'Épargne",name:"Caisse d'Épargne"}},"amenity/bank|Caixa Econômica Federal~(Brazil)":{countryCodes:["br"],matchNames:["caixa","caixabank"],nomatch:["amenity/bank|Caixabank~(Spain)"],tags:{amenity:"bank",brand:"Caixa Econômica Federal","brand:wikidata":"Q835283","brand:wikipedia":"pt:Caixa Econômica Federal",name:"Caixa Econômica Federal"}},"amenity/bank|Caixa Geral de Depósitos":{tags:{amenity:"bank",brand:"Caixa Geral de Depósitos","brand:wikidata":"Q1026044","brand:wikipedia":"pt:Caixa Geral de Depósitos",name:"Caixa Geral de Depósitos"}},"amenity/bank|Caixabank~(Spain)":{countryCodes:["es"],nomatch:["amenity/bank|Caixa Econômica Federal~(Brazil)"],tags:{amenity:"bank",brand:"Caixabank","brand:wikidata":"Q847225","brand:wikipedia":"en:CaixaBank",name:"Caixabank"}},"amenity/bank|Caja Duero":{countryCodes:["es"],tags:{amenity:"bank",brand:"Caja Duero","brand:wikidata":"Q3821055","brand:wikipedia":"es:Caja Duero",name:"Caja Duero"}},"amenity/bank|Caja España":{countryCodes:["es"],tags:{amenity:"bank",brand:"Caja España","brand:wikidata":"Q966985","brand:wikipedia":"es:Caja España",name:"Caja España"}},"amenity/bank|Caja Rural":{tags:{amenity:"bank",brand:"Caja Rural","brand:wikidata":"Q3649971","brand:wikipedia":"es:Caja Rural",name:"Caja Rural"}},"amenity/bank|Caja Rural de Jaén":{countryCodes:["es"],tags:{amenity:"bank",brand:"Caja Rural de Jaén","brand:wikidata":"Q18720350","brand:wikipedia":"es:Caja Rural de Jaén",name:"Caja Rural de Jaén"}},"amenity/bank|CajaSur":{countryCodes:["es"],tags:{amenity:"bank",brand:"CajaSur","brand:wikidata":"Q3751637","brand:wikipedia":"en:CajaSur",name:"CajaSur"}},"amenity/bank|Cajamar":{countryCodes:["es"],tags:{amenity:"bank",brand:"Cajamar","brand:wikidata":"Q8254971","brand:wikipedia":"es:Cajamar",name:"Cajamar"}},"amenity/bank|Canara Bank":{tags:{amenity:"bank",brand:"Canara Bank","brand:wikidata":"Q2003777","brand:wikipedia":"en:Canara Bank",name:"Canara Bank"}},"amenity/bank|Capital Bank":{tags:{amenity:"bank",brand:"Capital Bank","brand:wikidata":"Q5035481","brand:wikipedia":"en:Capital Bank Financial",name:"Capital Bank"}},"amenity/bank|Capital One":{countryCodes:["us"],matchNames:["capital one bank"],tags:{amenity:"bank",brand:"Capital One","brand:wikidata":"Q1034654","brand:wikipedia":"en:Capital One",name:"Capital One"}},"amenity/bank|Carige":{countryCodes:["it"],tags:{amenity:"bank",brand:"Carige","brand:wikidata":"Q3633695","brand:wikipedia":"en:Banca Carige",name:"Carige"}},"amenity/bank|Cariparma":{countryCodes:["it"],tags:{amenity:"bank",brand:"Cariparma","brand:wikidata":"Q2938832","brand:wikipedia":"en:Crédit Agricole Italia",name:"Cariparma"}},"amenity/bank|Carisbo":{countryCodes:["it"],tags:{amenity:"bank",brand:"Carisbo","brand:wikidata":"Q3661937","brand:wikipedia":"en:Cassa di Risparmio in Bologna",name:"Carisbo"}},"amenity/bank|Cassa di Risparmio del Veneto":{countryCodes:["it"],tags:{amenity:"bank",brand:"Cassa di Risparmio del Veneto","brand:wikidata":"Q3661909","brand:wikipedia":"en:Cassa di Risparmio del Veneto",name:"Cassa di Risparmio del Veneto"}},"amenity/bank|CatalunyaCaixa":{countryCodes:["es"],tags:{amenity:"bank",brand:"CatalunyaCaixa","brand:wikidata":"Q3750952","brand:wikipedia":"en:CatalunyaCaixa",name:"CatalunyaCaixa"}},"amenity/bank|Cathay Bank":{countryCodes:["cn","tw","us"],tags:{amenity:"bank",brand:"Cathay Bank","brand:wikidata":"Q4189507","brand:wikipedia":"en:Cathay Bank",name:"Cathay Bank"}},"amenity/bank|Central Bank":{tags:{amenity:"bank",brand:"Central Bank",name:"Central Bank"}},"amenity/bank|Central Bank of India":{countryCodes:["in"],tags:{amenity:"bank",brand:"Central Bank of India","brand:wikidata":"Q2007090","brand:wikipedia":"en:Central Bank of India",name:"Central Bank of India"}},"amenity/bank|Chase":{matchNames:["chase bank"],tags:{amenity:"bank",brand:"Chase","brand:wikidata":"Q524629","brand:wikipedia":"en:Chase Bank",name:"Chase"}},"amenity/bank|China Bank":{tags:{amenity:"bank",brand:"China Bank","brand:wikidata":"Q5100080","brand:wikipedia":"en:Chinabank",name:"China Bank"}},"amenity/bank|China Bank Savings":{countryCodes:["ph"],tags:{amenity:"bank",brand:"China Bank Savings","brand:wikidata":"Q18387359","brand:wikipedia":"en:China Bank Savings",name:"China Bank Savings"}},"amenity/bank|China Construction Bank":{tags:{amenity:"bank",brand:"China Construction Bank","brand:wikidata":"Q26299","brand:wikipedia":"en:China Construction Bank",name:"China Construction Bank"}},"amenity/bank|Citibank":{tags:{amenity:"bank",brand:"Citibank","brand:wikidata":"Q857063","brand:wikipedia":"en:Citibank",name:"Citibank"}},"amenity/bank|Citizens Bank":{tags:{amenity:"bank",brand:"Citizens Bank","brand:wikidata":"Q25209674","brand:wikipedia":"en:Citizens Bank (South Bend, Indiana)",name:"Citizens Bank"}},"amenity/bank|City National Bank~(California)":{countryCodes:["us"],tags:{amenity:"bank",brand:"City National Bank","brand:wikidata":"Q5123314","brand:wikipedia":"en:City National Bank (California)",name:"City National Bank"}},"amenity/bank|City National Bank~(Florida)":{countryCodes:["us"],tags:{amenity:"bank",brand:"City National Bank","brand:wikidata":"Q16958644","brand:wikipedia":"en:City National Bank (Florida)",name:"City National Bank",official_name:"City National Bank of Florida"}},"amenity/bank|Clydesdale Bank":{countryCodes:["gb"],tags:{amenity:"bank",brand:"Clydesdale Bank","brand:wikidata":"Q971680","brand:wikipedia":"en:Clydesdale Bank",name:"Clydesdale Bank"}},"amenity/bank|Columbia Bank~(New Jersey)":{countryCodes:["us"],nomatch:["amenity/bank|Columbia Bank~(Washington)","shop/clothes|Columbia"],tags:{amenity:"bank",brand:"Columbia Bank","brand:wikidata":"Q62084096",name:"Columbia Bank"}},"amenity/bank|Columbia Bank~(Washington)":{countryCodes:["us"],nomatch:["amenity/bank|Columbia Bank~(New Jersey)","shop/clothes|Columbia"],tags:{amenity:"bank",brand:"Columbia Bank","brand:wikidata":"Q62084089",name:"Columbia Bank"}},"amenity/bank|Comerica Bank":{countryCodes:["us"],tags:{amenity:"bank",brand:"Comerica Bank","brand:wikidata":"Q1114148","brand:wikipedia":"en:Comerica",name:"Comerica Bank"}},"amenity/bank|Commerce Bank":{tags:{amenity:"bank",brand:"Commerce Bank",name:"Commerce Bank"}},"amenity/bank|Commercial Bank":{tags:{amenity:"bank",brand:"Commercial Bank",name:"Commercial Bank"}},"amenity/bank|Commercial Bank of Ceylon PLC":{countryCodes:["lk"],tags:{amenity:"bank",brand:"Commercial Bank of Ceylon PLC","brand:wikidata":"Q5152468","brand:wikipedia":"en:Commercial Bank of Ceylon",name:"Commercial Bank of Ceylon PLC"}},"amenity/bank|Commerzbank":{tags:{amenity:"bank",brand:"Commerzbank","brand:wikidata":"Q157617","brand:wikipedia":"en:Commerzbank",name:"Commerzbank"}},"amenity/bank|Commonwealth Bank":{tags:{amenity:"bank",brand:"Commonwealth Bank","brand:wikidata":"Q285328","brand:wikipedia":"en:Commonwealth Bank",name:"Commonwealth Bank"}},"amenity/bank|Community Bank":{tags:{amenity:"bank",brand:"Community Bank","brand:wikidata":"Q5154635","brand:wikipedia":"en:Community Bank, N.A.",name:"Community Bank"}},"amenity/bank|Corporation Bank":{countryCodes:["in"],tags:{amenity:"bank",brand:"Corporation Bank","brand:wikidata":"Q2003387","brand:wikipedia":"en:Corporation Bank",name:"Corporation Bank"}},"amenity/bank|Credem":{countryCodes:["it"],tags:{amenity:"bank",brand:"Credem","brand:wikidata":"Q3696881","brand:wikipedia":"en:Credito Emiliano",name:"Credem"}},"amenity/bank|Credicoop":{tags:{amenity:"bank",brand:"Credicoop","brand:wikidata":"Q4854086","brand:wikipedia":"en:Banco Credicoop",name:"Credicoop"}},"amenity/bank|Credit Suisse":{tags:{amenity:"bank",brand:"Credit Suisse","brand:wikidata":"Q372657","brand:wikipedia":"en:Credit Suisse",name:"Credit Suisse"}},"amenity/bank|Credito Valtellinese":{countryCodes:["it"],tags:{amenity:"bank",brand:"Credito Valtellinese","brand:wikidata":"Q3696888","brand:wikipedia":"en:Credito Valtellinese",name:"Credito Valtellinese"}},"amenity/bank|Crelan":{countryCodes:["be"],tags:{amenity:"bank",brand:"Crelan","brand:wikidata":"Q389872","brand:wikipedia":"en:Crelan",name:"Crelan"}},"amenity/bank|Crédit Agricole":{tags:{amenity:"bank",brand:"Crédit Agricole","brand:wikidata":"Q590952","brand:wikipedia":"fr:Crédit agricole",name:"Crédit Agricole"}},"amenity/bank|Crédit Maritime":{countryCodes:["fr"],tags:{amenity:"bank",brand:"Crédit Maritime","brand:wikidata":"Q17176866","brand:wikipedia":"fr:Crédit maritime",name:"Crédit Maritime"}},"amenity/bank|Crédit Mutuel":{tags:{amenity:"bank",brand:"Crédit Mutuel","brand:wikidata":"Q642627","brand:wikipedia":"en:Crédit Mutuel",name:"Crédit Mutuel"}},"amenity/bank|Crédit Mutuel de Bretagne":{countryCodes:["fr"],tags:{amenity:"bank",brand:"Crédit Mutuel de Bretagne","brand:wikidata":"Q3006236","brand:wikipedia":"fr:Crédit mutuel Arkéa",name:"Crédit Mutuel de Bretagne"}},"amenity/bank|Crédit du Nord":{tags:{amenity:"bank",brand:"Crédit du Nord","brand:wikidata":"Q3006209","brand:wikipedia":"en:Crédit du Nord",name:"Crédit du Nord"}},"amenity/bank|Crédito Agrícola":{tags:{amenity:"bank",brand:"Crédito Agrícola","brand:wikidata":"Q10262017","brand:wikipedia":"pt:Crédito Agrícola",name:"Crédito Agrícola"}},"amenity/bank|Cбербанк":{tags:{amenity:"bank",brand:"Cбербанк","brand:wikidata":"Q205012","brand:wikipedia":"en:Sberbank of Russia",name:"Cбербанк"}},"amenity/bank|Danske Bank":{tags:{amenity:"bank",brand:"Danske Bank","brand:wikidata":"Q1636974","brand:wikipedia":"en:Danske Bank",name:"Danske Bank"}},"amenity/bank|Davivienda":{tags:{amenity:"bank",brand:"Davivienda","brand:wikidata":"Q5242054","brand:wikipedia":"en:Davivienda",name:"Davivienda"}},"amenity/bank|Denizbank":{tags:{amenity:"bank",brand:"Denizbank","brand:wikidata":"Q1115064","brand:wikipedia":"en:DenizBank",name:"Denizbank"}},"amenity/bank|Desjardins":{countryCodes:["ca"],tags:{amenity:"bank",brand:"Desjardins","brand:wikidata":"Q2933350","brand:wikipedia":"en:Desjardins Group",name:"Desjardins"}},"amenity/bank|Deutsche Bank":{tags:{amenity:"bank",brand:"Deutsche Bank","brand:wikidata":"Q66048","brand:wikipedia":"en:Deutsche Bank",name:"Deutsche Bank"}},"amenity/bank|Dubai Islamic Bank":{tags:{amenity:"bank",brand:"Dubai Islamic Bank","brand:wikidata":"Q5310570","brand:wikipedia":"en:Dubai Islamic Bank",name:"Dubai Islamic Bank"}},"amenity/bank|EastWest Bank":{tags:{amenity:"bank",brand:"EastWest Bank","brand:wikidata":"Q5327595","brand:wikipedia":"en:EastWest Bank",name:"EastWest Bank"}},"amenity/bank|EastWest Unibank":{countryCodes:["ph"],tags:{amenity:"bank",brand:"EastWest Unibank","brand:wikidata":"Q5327595","brand:wikipedia":"en:EastWest Bank",name:"EastWest Unibank"}},"amenity/bank|Ecobank":{matchNames:["agence ecobank"],tags:{amenity:"bank",brand:"Ecobank","brand:wikidata":"Q930225","brand:wikipedia":"en:Ecobank",name:"Ecobank"}},"amenity/bank|Emigrant Savings Bank":{countryCodes:["us"],tags:{amenity:"bank",brand:"Emigrant Savings Bank","brand:wikidata":"Q5371104","brand:wikipedia":"en:Emigrant Savings Bank",name:"Emigrant Savings Bank"}},"amenity/bank|Emirates NBD":{tags:{amenity:"bank",brand:"Emirates NBD","brand:wikidata":"Q5372575","brand:wikipedia":"en:Emirates NBD",name:"Emirates NBD"}},"amenity/bank|Equity Bank~(Congo)":{countryCodes:["cd"],tags:{amenity:"bank",brand:"Equity Bank","brand:wikidata":"Q21178738","brand:wikipedia":"en:Equity Bank Congo",name:"Equity Bank"}},"amenity/bank|Equity Bank~(Kenya)":{countryCodes:["ke"],tags:{amenity:"bank",brand:"Equity Bank","brand:wikidata":"Q5384664","brand:wikipedia":"en:Equity Bank Kenya Limited",name:"Equity Bank"}},"amenity/bank|Equity Bank~(Rwanda)":{countryCodes:["rw"],tags:{amenity:"bank",brand:"Equity Bank","brand:wikidata":"Q5384665","brand:wikipedia":"en:Equity Bank Rwanda Limited",name:"Equity Bank"}},"amenity/bank|Equity Bank~(South Sudan)":{countryCodes:["ss"],tags:{amenity:"bank",brand:"Equity Bank","brand:wikidata":"Q5384666","brand:wikipedia":"en:Equity Bank South Sudan Limited",name:"Equity Bank"}},"amenity/bank|Equity Bank~(Tanzania)":{countryCodes:["tz"],tags:{amenity:"bank",brand:"Equity Bank","brand:wikidata":"Q5384667","brand:wikipedia":"en:Equity Bank Tanzania Limited",name:"Equity Bank"}},"amenity/bank|Equity Bank~(USA)":{countryCodes:["us"],tags:{amenity:"bank",brand:"Equity Bank","brand:wikidata":"Q62260414",name:"Equity Bank"}},"amenity/bank|Equity Bank~(Uganda)":{countryCodes:["ug"],tags:{amenity:"bank",brand:"Equity Bank","brand:wikidata":"Q5384668","brand:wikipedia":"en:Equity Bank Uganda Limited",name:"Equity Bank"}},"amenity/bank|Erste Bank":{countryCodes:["at","hr","hu"],tags:{amenity:"bank",brand:"Erste Bank","brand:wikidata":"Q696867","brand:wikipedia":"de:Erste Bank",name:"Erste Bank"}},"amenity/bank|Eurobank~(Greece)":{countryCodes:["gr"],matchNames:["eurobank ergasias"],tags:{amenity:"bank",brand:"Eurobank","brand:wikidata":"Q951850","brand:wikipedia":"el:Eurobank",name:"Eurobank"}},"amenity/bank|Eurobank~(Poland)":{countryCodes:["pl"],tags:{amenity:"bank",brand:"Eurobank","brand:wikidata":"Q9256201","brand:wikipedia":"pl:Euro Bank",name:"Eurobank"}},"amenity/bank|Eurobank~(Serbia)":{countryCodes:["rs"],tags:{amenity:"bank",brand:"Eurobank","brand:wikidata":"Q5411684","brand:wikipedia":"sr:Eurobanka",name:"Eurobank"}},"amenity/bank|FNB":{tags:{amenity:"bank",brand:"FNB","brand:wikidata":"Q3072956","brand:wikipedia":"en:First National Bank (South Africa)",name:"FNB",official_name:"First National Bank"}},"amenity/bank|Faysal Bank":{countryCodes:["pk"],tags:{amenity:"bank",brand:"Faysal Bank","brand:wikidata":"Q5439099","brand:wikipedia":"en:Faysal Bank",name:"Faysal Bank"}},"amenity/bank|Federal Bank":{countryCodes:["in"],tags:{amenity:"bank",brand:"Federal Bank","brand:wikidata":"Q2044983","brand:wikipedia":"en:Federal Bank",name:"Federal Bank"}},"amenity/bank|Fidelity Bank~(Ghana)":{countryCodes:["gh"],tags:{amenity:"bank",brand:"Fidelity Bank","brand:wikidata":"Q5446778","brand:wikipedia":"en:Fidelity Bank Ghana",name:"Fidelity Bank"}},"amenity/bank|Fidelity Bank~(Nigeria)":{countryCodes:["ng"],tags:{amenity:"bank",brand:"Fidelity Bank","brand:wikidata":"Q5446777","brand:wikipedia":"en:Fidelity Bank Nigeria",name:"Fidelity Bank"}},"amenity/bank|Fidelity Bank~(USA)":{countryCodes:["us"],tags:{amenity:"bank",brand:"Fidelity Bank","brand:wikidata":"Q1411292","brand:wikipedia":"en:Fidelity Investments",name:"Fidelity Bank"}},"amenity/bank|Fifth Third Bank":{countryCodes:["us"],matchNames:["5/3","5/3 bank"],tags:{amenity:"bank",brand:"Fifth Third Bank","brand:wikidata":"Q1411810","brand:wikipedia":"en:Fifth Third Bank",name:"Fifth Third Bank",short_name:"5/3 Bank"}},"amenity/bank|Finansbank":{tags:{amenity:"bank",brand:"Finansbank","brand:wikidata":"Q1416237","brand:wikipedia":"en:Finansbank",name:"Finansbank"}},"amenity/bank|First Bank~(Western USA)":{countryCodes:["us"],matchNames:["1stbank"],tags:{amenity:"bank",brand:"First Bank","brand:wikidata":"Q5452217","brand:wikipedia":"en:FirstBank Holding Co",name:"First Bank",short_name:"1STBank"}},"amenity/bank|First Citizens Bank":{tags:{amenity:"bank",brand:"First Citizens Bank","brand:wikidata":"Q5452734","brand:wikipedia":"en:First Citizens Bank (Trinidad and Tobago)",name:"First Citizens Bank"}},"amenity/bank|First Financial Bank":{countryCodes:["us"],matchNames:["1st financial bank"],tags:{amenity:"bank",brand:"First Financial Bank","brand:wikidata":"Q5453009","brand:wikipedia":"en:First Financial Bank (Ohio)",name:"First Financial Bank"}},"amenity/bank|First Midwest Bank":{countryCodes:["us"],tags:{amenity:"bank",brand:"First Midwest Bank","brand:wikidata":"Q5453331","brand:wikipedia":"en:First Midwest Bank",name:"First Midwest Bank"}},"amenity/bank|First National Bank":{countryCodes:["us"],tags:{amenity:"bank",brand:"First National Bank","brand:wikidata":"Q5426765","brand:wikipedia":"en:F.N.B. Corporation",name:"First National Bank"}},"amenity/bank|First State Bank":{tags:{amenity:"bank",brand:"First State Bank",name:"First State Bank"}},"amenity/bank|Frost Bank":{countryCodes:["us"],tags:{amenity:"bank",brand:"Frost Bank","brand:wikidata":"Q5506152","brand:wikipedia":"en:Frost Bank",name:"Frost Bank"}},"amenity/bank|Fulton Bank":{tags:{amenity:"bank",brand:"Fulton Bank",name:"Fulton Bank"}},"amenity/bank|GCB Bank":{tags:{amenity:"bank",brand:"GCB Bank","brand:wikidata":"Q1521346","brand:wikipedia":"en:GCB Bank",name:"GCB Bank"}},"amenity/bank|Galicia":{countryCodes:["ar"],tags:{amenity:"bank",brand:"Galicia","brand:wikidata":"Q5717952","brand:wikipedia":"es:Banco Galicia",name:"Galicia"}},"amenity/bank|Garanti":{tags:{amenity:"bank",brand:"Garanti","brand:wikidata":"Q322962","brand:wikipedia":"en:Garanti Bank",name:"Garanti"}},"amenity/bank|Garanti Bankası":{tags:{amenity:"bank",brand:"Garanti Bankası","brand:wikidata":"Q322962","brand:wikipedia":"en:Garanti Bank",name:"Garanti Bankası"}},"amenity/bank|Getin Bank":{countryCodes:["pl"],tags:{amenity:"bank",brand:"Getin Bank","brand:wikidata":"Q9267646","brand:wikipedia":"pl:Getin Bank",name:"Getin Bank"}},"amenity/bank|Great Western Bank":{countryCodes:["us"],tags:{amenity:"bank",brand:"Great Western Bank","brand:wikidata":"Q5600185","brand:wikipedia":"en:Great Western Bank (1907–present)",name:"Great Western Bank"}},"amenity/bank|Groupama":{tags:{amenity:"bank",brand:"Groupama","brand:wikidata":"Q3083531","brand:wikipedia":"en:Groupama",name:"Groupama"}},"amenity/bank|HBL Bank":{matchNames:["hbl"],tags:{amenity:"bank",brand:"HBL Bank","brand:wikidata":"Q1566843","brand:wikipedia":"ur:ایچ بی ایل پاکستان",name:"HBL Bank"}},"amenity/bank|HDFC Bank":{tags:{amenity:"bank",brand:"HDFC Bank","brand:wikidata":"Q631047","brand:wikipedia":"en:HDFC Bank",name:"HDFC Bank"}},"amenity/bank|HNB":{tags:{amenity:"bank",brand:"HNB","brand:wikidata":"Q3532080","brand:wikipedia":"en:Hatton National Bank",name:"HNB"}},"amenity/bank|HSBC":{tags:{amenity:"bank",brand:"HSBC","brand:wikidata":"Q190464","brand:wikipedia":"en:HSBC",name:"HSBC"}},"amenity/bank|Halifax":{tags:{amenity:"bank",brand:"Halifax","brand:wikidata":"Q3310164","brand:wikipedia":"en:Halifax (bank)",name:"Halifax"}},"amenity/bank|Halkbank":{tags:{amenity:"bank",brand:"Halkbank","brand:wikidata":"Q3593818","brand:wikipedia":"en:Halkbank a.d.",name:"Halkbank"}},"amenity/bank|Handelsbanken":{tags:{amenity:"bank",brand:"Handelsbanken","brand:wikidata":"Q1421630","brand:wikipedia":"en:Handelsbanken",name:"Handelsbanken"}},"amenity/bank|Heritage Bank":{tags:{amenity:"bank",brand:"Heritage Bank","brand:wikidata":"Q5738690","brand:wikipedia":"en:Heritage Bank",name:"Heritage Bank"}},"amenity/bank|Hong Leong Bank":{tags:{amenity:"bank",brand:"Hong Leong Bank","brand:wikidata":"Q4383943","brand:wikipedia":"en:Hong Leong Bank",name:"Hong Leong Bank"}},"amenity/bank|Hrvatska poštanska banka":{countryCodes:["hr"],tags:{amenity:"bank",brand:"Hrvatska poštanska banka","brand:wikidata":"Q5923981","brand:wikipedia":"en:Hrvatska poštanska banka",name:"Hrvatska poštanska banka"}},"amenity/bank|Huntington Bank":{tags:{amenity:"bank",brand:"Huntington Bank","brand:wikidata":"Q798819","brand:wikipedia":"en:Huntington Bancshares",name:"Huntington Bank"}},"amenity/bank|HypoVereinsbank":{tags:{amenity:"bank",brand:"HypoVereinsbank","brand:wikidata":"Q220189","brand:wikipedia":"en:HypoVereinsbank",name:"HypoVereinsbank"}},"amenity/bank|ICBC":{tags:{amenity:"bank",brand:"ICBC","brand:wikidata":"Q26463","brand:wikipedia":"en:Industrial and Commercial Bank of China",name:"ICBC"}},"amenity/bank|ICICI Bank":{tags:{amenity:"bank",brand:"ICICI Bank","brand:wikidata":"Q1653258","brand:wikipedia":"en:ICICI Bank",name:"ICICI Bank"}},"amenity/bank|IDBI Bank":{countryCodes:["in"],tags:{amenity:"bank",brand:"IDBI Bank","brand:wikidata":"Q3633485","brand:wikipedia":"en:IDBI Bank",name:"IDBI Bank"}},"amenity/bank|ING":{matchNames:["ing bank"],tags:{amenity:"bank",brand:"ING","brand:wikidata":"Q645708","brand:wikipedia":"en:ING Group",name:"ING"}},"amenity/bank|ING Bank Śląski":{countryCodes:["pl"],tags:{amenity:"bank",brand:"ING Bank Śląski","brand:wikidata":"Q1410383","brand:wikipedia":"pl:ING Bank Śląski",name:"ING Bank Śląski"}},"amenity/bank|Ibercaja":{countryCodes:["es"],tags:{amenity:"bank",brand:"Ibercaja","brand:wikidata":"Q5907815","brand:wikipedia":"es:Ibercaja",name:"Ibercaja"}},"amenity/bank|Indian Bank":{tags:{amenity:"bank",brand:"Indian Bank","brand:wikidata":"Q2003789","brand:wikipedia":"en:Indian Bank",name:"Indian Bank"}},"amenity/bank|Indian Overseas Bank":{tags:{amenity:"bank",brand:"Indian Overseas Bank","brand:wikidata":"Q2003611","brand:wikipedia":"en:Indian Overseas Bank",name:"Indian Overseas Bank"}},"amenity/bank|Interbank":{nomatch:["amenity/bank|Bankinter"],tags:{amenity:"bank",brand:"Interbank","brand:wikidata":"Q2835558","brand:wikipedia":"es:Banco Interbank",name:"Interbank"}},"amenity/bank|Intesa Sanpaolo":{tags:{amenity:"bank",brand:"Intesa Sanpaolo","brand:wikidata":"Q1343118","brand:wikipedia":"it:Intesa Sanpaolo",name:"Intesa Sanpaolo"}},"amenity/bank|Itaú":{matchNames:["banco itaú"],tags:{amenity:"bank",brand:"Itaú","brand:wikidata":"Q2423252","brand:wikipedia":"en:Itaú Corpbanca",name:"Itaú"}},"amenity/bank|JS Bank":{countryCodes:["pk"],tags:{amenity:"bank",brand:"JS Bank","brand:wikidata":"Q6108986","brand:wikipedia":"en:JS Bank",name:"JS Bank"}},"amenity/bank|Janata Bank Limited জনতা ব্যাংক লিমিটেড":{tags:{amenity:"bank",brand:"Janata Bank Limited জনতা ব্যাংক লিমিটেড","brand:wikidata":"Q3347028","brand:wikipedia":"en:Janata Bank",name:"Janata Bank Limited জনতা ব্যাংক লিমিটেড"}},"amenity/bank|Jyske Bank":{countryCodes:["dk"],tags:{amenity:"bank",brand:"Jyske Bank","brand:wikidata":"Q136672","brand:wikipedia":"en:Jyske Bank",name:"Jyske Bank"}},"amenity/bank|K&H Bank":{countryCodes:["hu"],tags:{amenity:"bank",brand:"K&H Bank","brand:wikidata":"Q6393834","brand:wikipedia":"en:K&H Bank",name:"K&H Bank"}},"amenity/bank|KBC":{tags:{amenity:"bank",brand:"KBC","brand:wikidata":"Q941020","brand:wikipedia":"en:KBC Bank",name:"KBC"}},"amenity/bank|KBZ Bank":{tags:{amenity:"bank",brand:"KBZ Bank","brand:wikidata":"Q6360949","brand:wikipedia":"en:Kanbawza Bank",name:"KBZ Bank"}},"amenity/bank|Karnataka Bank":{countryCodes:["in"],tags:{amenity:"bank",brand:"Karnataka Bank","brand:wikidata":"Q2042632","brand:wikipedia":"en:Karnataka Bank",name:"Karnataka Bank"}},"amenity/bank|Kasa Stefczyka":{countryCodes:["pl"],tags:{amenity:"bank",brand:"Kasa Stefczyka","brand:wikidata":"Q57624461",name:"Kasa Stefczyka"}},"amenity/bank|KeyBank":{countryCodes:["us"],tags:{amenity:"bank",brand:"KeyBank","brand:wikidata":"Q1740314","brand:wikipedia":"en:KeyBank",name:"KeyBank"}},"amenity/bank|Komerční banka":{countryCodes:["cz"],tags:{amenity:"bank",brand:"Komerční banka","brand:wikidata":"Q1541079","brand:wikipedia":"en:Komerční banka",name:"Komerční banka"}},"amenity/bank|Kotak Mahindra Bank":{countryCodes:["in"],tags:{amenity:"bank",brand:"Kotak Mahindra Bank","brand:wikidata":"Q2040404","brand:wikipedia":"en:Kotak Mahindra Bank",name:"Kotak Mahindra Bank"}},"amenity/bank|Kutxabank":{countryCodes:["es"],tags:{amenity:"bank",brand:"Kutxabank","brand:wikidata":"Q5139377","brand:wikipedia":"en:Kutxabank",name:"Kutxabank"}},"amenity/bank|Kuveyt Türk":{tags:{amenity:"bank",brand:"Kuveyt Türk",name:"Kuveyt Türk"}},"amenity/bank|LCL":{tags:{amenity:"bank",brand:"LCL","brand:wikidata":"Q779722","brand:wikipedia":"en:Crédit Lyonnais",name:"LCL"}},"amenity/bank|La Banque Postale":{tags:{amenity:"bank",brand:"La Banque Postale","brand:wikidata":"Q3206431","brand:wikipedia":"en:La Banque postale",name:"La Banque Postale"}},"amenity/bank|La Caixa":{countryCodes:["es"],tags:{amenity:"bank",brand:"La Caixa","brand:wikidata":"Q287753","brand:wikipedia":"en:La Caixa",name:"La Caixa"}},"amenity/bank|Laboral Kutxa":{countryCodes:["es"],tags:{amenity:"bank",brand:"Laboral Kutxa","brand:wikidata":"Q12052386","brand:wikipedia":"en:Laboral Kutxa",name:"Laboral Kutxa"}},"amenity/bank|Landbank":{countryCodes:["ph"],matchNames:["bangko sa lupa ng pilipinas","land bank of the philippines","lbp"],tags:{amenity:"bank",brand:"Landbank","brand:wikidata":"Q6483872","brand:wikipedia":"en:Land Bank of the Philippines",name:"Landbank"}},"amenity/bank|Leeds Building Society":{countryCodes:["gb"],tags:{amenity:"bank",brand:"Leeds Building Society","brand:wikidata":"Q6515848","brand:wikipedia":"en:Leeds Building Society",name:"Leeds Building Society"}},"amenity/bank|Liberbank":{countryCodes:["es"],tags:{amenity:"bank",brand:"Liberbank","brand:wikidata":"Q2891018","brand:wikipedia":"en:Liberbank",name:"Liberbank"}},"amenity/bank|Liberty Bank":{nomatch:["amenity/fuel|Liberty"],tags:{amenity:"bank",brand:"Liberty Bank",name:"Liberty Bank"}},"amenity/bank|Lloyds Bank":{matchNames:["lloyds","lloyds tsb"],tags:{amenity:"bank",brand:"Lloyds Bank","brand:wikidata":"Q1152847","brand:wikipedia":"en:Lloyds Bank",name:"Lloyds Bank"}},"amenity/bank|M&T Bank":{tags:{amenity:"bank",brand:"M&T Bank","brand:wikidata":"Q3272257","brand:wikipedia":"en:M&T Bank",name:"M&T Bank"}},"amenity/bank|MCB":{matchNames:["mcb bank"],tags:{amenity:"bank",brand:"MCB","brand:wikidata":"Q15982510","brand:wikipedia":"ur:ایم سی بی بینک لمیٹڈ",name:"MCB"}},"amenity/bank|MONETA Money Bank":{countryCodes:["cz"],tags:{amenity:"bank",brand:"MONETA Money Bank","brand:wikidata":"Q24282966","brand:wikipedia":"cs:Moneta Money Bank",name:"MONETA Money Bank"}},"amenity/bank|Macro":{tags:{amenity:"bank",brand:"Macro","brand:wikidata":"Q2335199","brand:wikipedia":"en:Banco Macro",name:"Macro"}},"amenity/bank|Maybank":{tags:{amenity:"bank",brand:"Maybank","brand:wikidata":"Q1364018","brand:wikipedia":"en:Maybank",name:"Maybank"}},"amenity/bank|Meezan Bank":{countryCodes:["pk"],tags:{amenity:"bank",brand:"Meezan Bank","brand:wikidata":"Q6807934","brand:wikipedia":"en:Meezan Bank",name:"Meezan Bank"}},"amenity/bank|Mercantil":{tags:{amenity:"bank",brand:"Mercantil","brand:wikidata":"Q6818004","brand:wikipedia":"en:Mercantil Servicios Financieros",name:"Mercantil"}},"amenity/bank|Metrobank":{tags:{amenity:"bank",brand:"Metrobank",name:"Metrobank"}},"amenity/bank|Mibanco":{countryCodes:["pe"],tags:{amenity:"bank",brand:"Mibanco","brand:wikidata":"Q5558589","brand:wikipedia":"es:MiBanco",name:"Mibanco"}},"amenity/bank|MidFirst Bank":{tags:{amenity:"bank",brand:"MidFirst Bank","brand:wikidata":"Q17081131","brand:wikipedia":"en:MidFirst Bank",name:"MidFirst Bank"}},"amenity/bank|Millennium Bank":{countryCodes:["pl"],matchNames:["bank millennium"],tags:{amenity:"bank",brand:"Millennium Bank","brand:wikidata":"Q4855947","brand:wikipedia":"pl:Bank Millennium",name:"Millennium Bank"}},"amenity/bank|Millennium bcp":{countryCodes:["pt"],tags:{amenity:"bank",brand:"Millennium bcp","brand:wikidata":"Q118581","brand:wikipedia":"pt:Banco Comercial Português",name:"Millennium bcp",official_name:"Banco Comercial Português","official_name:en":"Portuguese Commercial Bank","official_name:es":"Banco Comercial Português"}},"amenity/bank|Monte dei Paschi di Siena":{tags:{amenity:"bank",brand:"Monte dei Paschi di Siena","brand:wikidata":"Q46730","brand:wikipedia":"en:Banca Monte dei Paschi di Siena",name:"Monte dei Paschi di Siena"}},"amenity/bank|Montepio":{tags:{amenity:"bank",brand:"Montepio","brand:wikidata":"Q1946091","brand:wikipedia":"en:Montepio (bank)",name:"Montepio"}},"amenity/bank|NAB":{tags:{amenity:"bank",brand:"NAB","brand:wikidata":"Q1430985","brand:wikipedia":"en:National Australia Bank",name:"NAB"}},"amenity/bank|NSB":{countryCodes:["lk"],matchNames:["national savings bank"],tags:{amenity:"bank",brand:"NSB","brand:wikidata":"Q12500189","brand:wikipedia":"en:National Savings Bank (Sri Lanka)",name:"NSB"}},"amenity/bank|NatWest":{tags:{amenity:"bank",brand:"NatWest","brand:wikidata":"Q2740021","brand:wikipedia":"en:NatWest",name:"NatWest"}},"amenity/bank|National Bank":{countryCodes:["ca"],tags:{amenity:"bank",brand:"National Bank","brand:wikidata":"Q634298","brand:wikipedia":"en:National Bank of Canada",name:"National Bank",official_name:"National Bank of Canada"}},"amenity/bank|Nationwide":{nomatch:["office/insurance|Nationwide"],tags:{amenity:"bank",brand:"Nationwide","brand:wikidata":"Q846735","brand:wikipedia":"en:Nationwide Building Society",name:"Nationwide"}},"amenity/bank|Navy Federal Credit Union":{tags:{amenity:"bank",brand:"Navy Federal Credit Union","brand:wikidata":"Q6982632","brand:wikipedia":"en:Navy Federal Credit Union",name:"Navy Federal Credit Union"}},"amenity/bank|Nedbank":{tags:{amenity:"bank",brand:"Nedbank","brand:wikidata":"Q2751701","brand:wikipedia":"en:Nedbank",name:"Nedbank"}},"amenity/bank|Nordea":{tags:{amenity:"bank",brand:"Nordea","brand:wikidata":"Q1123823","brand:wikipedia":"en:Nordea",name:"Nordea"}},"amenity/bank|Novo Banco":{tags:{amenity:"bank",brand:"Novo Banco","brand:wikidata":"Q17488861","brand:wikipedia":"en:Novo Banco",name:"Novo Banco"}},"amenity/bank|OLB":{countryCodes:["de"],tags:{amenity:"bank",brand:"OLB","brand:wikidata":"Q879591","brand:wikipedia":"en:Oldenburgische Landesbank",name:"OLB"}},"amenity/bank|OTP":{matchNames:["otp bank"],tags:{amenity:"bank",brand:"OTP","brand:wikidata":"Q912778","brand:wikipedia":"en:OTP Bank",name:"OTP"}},"amenity/bank|Oberbank":{tags:{amenity:"bank",brand:"Oberbank","brand:wikidata":"Q2009139","brand:wikipedia":"de:Oberbank",name:"Oberbank"}},"amenity/bank|Occidental de Descuento":{tags:{amenity:"bank",brand:"Occidental de Descuento","brand:wikidata":"Q4854108","brand:wikipedia":"en:Banco Occidental de Descuento",name:"Occidental de Descuento"}},"amenity/bank|Oldenburgische Landesbank":{countryCodes:["de"],tags:{amenity:"bank",brand:"Oldenburgische Landesbank","brand:wikidata":"Q879591","brand:wikipedia":"en:Oldenburgische Landesbank",name:"Oldenburgische Landesbank"}},"amenity/bank|One Network Bank":{countryCodes:["ph"],tags:{amenity:"bank",brand:"One Network Bank","brand:wikidata":"Q7093019","brand:wikipedia":"en:One Network Bank",name:"One Network Bank",operator:"Banco de Oro","operator:wikidata":"Q4854129","operator:wikipedia":"en:Banco de Oro"}},"amenity/bank|Oriental Bank of Commerce":{countryCodes:["in"],tags:{amenity:"bank",brand:"Oriental Bank of Commerce","brand:wikidata":"Q367008","brand:wikipedia":"en:Oriental Bank of Commerce",name:"Oriental Bank of Commerce"}},"amenity/bank|Osuuspankki":{countryCodes:["fi"],tags:{amenity:"bank",brand:"Osuuspankki","brand:wikidata":"Q4045597","brand:wikipedia":"fi:OP (finanssiryhmä)",name:"Osuuspankki"}},"amenity/bank|PBZ":{tags:{amenity:"bank",brand:"PBZ","brand:wikidata":"Q7246343","brand:wikipedia":"en:Privredna banka Zagreb",name:"PBZ"}},"amenity/bank|PKO BP":{countryCodes:["pl"],matchNames:["pko bank polski"],tags:{amenity:"bank",brand:"PKO BP","brand:wikidata":"Q578832","brand:wikipedia":"pl:Powszechna Kasa Oszczędności Bank Polski",name:"PKO BP"}},"amenity/bank|PNB":{countryCodes:["ph"],matchNames:["philippine national bank"],tags:{amenity:"bank",brand:"PNB","brand:wikidata":"Q1657971","brand:wikipedia":"en:Philippine National Bank",name:"PNB",official_name:"Philippine National Bank"}},"amenity/bank|PNC Bank":{matchNames:["pnc"],tags:{amenity:"bank",brand:"PNC Bank","brand:wikidata":"Q38928","brand:wikipedia":"en:PNC Financial Services",name:"PNC Bank"}},"amenity/bank|PSBank":{tags:{amenity:"bank",brand:"PSBank","brand:wikidata":"Q7185203","brand:wikipedia":"en:Philippine Savings Bank",name:"PSBank"}},"amenity/bank|Panin Bank":{tags:{amenity:"bank",brand:"Panin Bank","brand:wikidata":"Q12502751","brand:wikipedia":"id:Panin Bank",name:"Panin Bank"}},"amenity/bank|Patagonia":{countryCodes:["ar"],tags:{amenity:"bank",brand:"Patagonia","brand:wikidata":"Q2882078","brand:wikipedia":"en:Banco Patagonia",name:"Patagonia"}},"amenity/bank|Pekao SA":{countryCodes:["pl"],tags:{amenity:"bank",brand:"Pekao SA","brand:wikidata":"Q806642","brand:wikipedia":"pl:Bank Polska Kasa Opieki",name:"Pekao SA"}},"amenity/bank|People's United Bank":{countryCodes:["us"],tags:{amenity:"bank",brand:"People's United Bank","brand:wikidata":"Q7165802","brand:wikipedia":"en:People's United Financial",name:"People's United Bank"}},"amenity/bank|Peoples Bank":{tags:{amenity:"bank",brand:"Peoples Bank","brand:wikidata":"Q7166050","brand:wikipedia":"en:Peoples Bank",name:"Peoples Bank"}},"amenity/bank|Piraeus Bank":{tags:{amenity:"bank",brand:"Piraeus Bank","brand:wikidata":"Q3312","brand:wikipedia":"en:Piraeus Bank",name:"Piraeus Bank"}},"amenity/bank|Postbank~(Bulgaria)":{countryCodes:["bg"],nomatch:["amenity/bank|Bancpost"],tags:{amenity:"bank",brand:"Postbank","brand:wikidata":"Q7234083","brand:wikipedia":"en:Bulgarian Postbank",name:"Postbank"}},"amenity/bank|Postbank~(Germany)":{countryCodes:["de"],matchNames:["postbank finanzcenter"],nomatch:["amenity/bank|Bancpost"],tags:{amenity:"bank",brand:"Postbank","brand:wikidata":"Q708835","brand:wikipedia":"en:Deutsche Postbank",name:"Postbank"}},"amenity/bank|Prima banka":{countryCodes:["sk"],tags:{amenity:"bank",brand:"Prima banka","brand:wikidata":"Q13538661","brand:wikipedia":"sk:Prima banka Slovensko",name:"Prima banka"}},"amenity/bank|Provincial":{countryCodes:["ve"],matchNames:["bbva provincial"],tags:{amenity:"bank",brand:"Provincial","brand:wikidata":"Q4835087","brand:wikipedia":"es:BBVA Provincial",name:"Provincial"}},"amenity/bank|Public Bank~(Malaysia)":{matchNames:["public bank berhad"],tags:{amenity:"bank",brand:"Public Bank","brand:wikidata":"Q3046561","brand:wikipedia":"en:Public Bank Berhad",name:"Public Bank"}},"amenity/bank|Punjab National Bank":{countryCodes:["in"],tags:{amenity:"bank",brand:"Punjab National Bank","brand:wikidata":"Q2743499","brand:wikipedia":"en:Punjab National Bank",name:"Punjab National Bank"}},"amenity/bank|RBC":{matchNames:["rbc financial group","rbc royal bank","royal bank","royal bank of canada"],tags:{amenity:"bank",brand:"RBC","brand:wikidata":"Q735261","brand:wikipedia":"en:Royal Bank of Canada",name:"RBC",official_name:"Royal Bank of Canada"}},"amenity/bank|RBS":{matchNames:["royal bank of scotland"],tags:{amenity:"bank",brand:"RBS","brand:wikidata":"Q160126","brand:wikipedia":"en:Royal Bank of Scotland",name:"RBS",official_name:"Royal Bank of Scotland"}},"amenity/bank|RCBC":{countryCodes:["ph"],matchNames:["rcbc savings bank"],tags:{amenity:"bank",brand:"RCBC","brand:wikidata":"Q7339070","brand:wikipedia":"en:Rizal Commercial Banking Corporation",name:"RCBC",official_name:"Rizal Commercial Banking Corporation"}},"amenity/bank|Rabobank":{tags:{amenity:"bank",brand:"Rabobank","brand:wikidata":"Q252004","brand:wikipedia":"en:Rabobank",name:"Rabobank"}},"amenity/bank|Raiffeisen Polbank":{tags:{amenity:"bank",brand:"Raiffeisen Polbank","brand:wikidata":"Q9303218","brand:wikipedia":"pl:Raiffeisen Bank Polska",name:"Raiffeisen Polbank"}},"amenity/bank|Raiffeisenbank":{matchNames:["raiffeisen","raiffeisenkasse"],nomatch:["amenity/fuel|Raiffeisen"],tags:{amenity:"bank",brand:"Raiffeisenbank",name:"Raiffeisenbank"}},"amenity/bank|Regions Bank":{countryCodes:["us"],tags:{amenity:"bank",brand:"Regions Bank","brand:wikidata":"Q917131","brand:wikipedia":"en:Regions Financial Corporation",name:"Regions Bank"}},"amenity/bank|Republic Bank":{tags:{amenity:"bank",brand:"Republic Bank","brand:wikidata":"Q7314386","brand:wikipedia":"en:Republic Bank",name:"Republic Bank"}},"amenity/bank|República":{tags:{amenity:"bank",brand:"República",name:"República"}},"amenity/bank|SC제일은행":{countryCodes:["kr"],tags:{amenity:"bank",brand:"SC제일은행","brand:ko":"SC제일은행",name:"SC제일은행","name:ko":"SC제일은행"}},"amenity/bank|SEB":{tags:{amenity:"bank",brand:"SEB","brand:wikidata":"Q975655","brand:wikipedia":"en:SEB Group",name:"SEB"}},"amenity/bank|SGBCI":{countryCodes:["ci"],matchNames:["agence sgbci"],tags:{amenity:"bank",brand:"SGBCI","brand:wikidata":"Q3488360","brand:wikipedia":"fr:Société générale de banques en Côte d'Ivoire",name:"SGBCI"}},"amenity/bank|SNS Bank":{countryCodes:["nl"],tags:{amenity:"bank",brand:"SNS Bank","brand:wikidata":"Q1857899","brand:wikipedia":"en:De Volksbank",name:"SNS Bank"}},"amenity/bank|Sampath Bank":{countryCodes:["lk"],tags:{amenity:"bank",brand:"Sampath Bank","brand:wikidata":"Q7410095","brand:wikipedia":"en:Sampath Bank",name:"Sampath Bank"}},"amenity/bank|Santander":{matchNames:["santander consumer bank"],nomatch:["amenity/bank|Banco Santander"],tags:{amenity:"bank",brand:"Santander","brand:wikidata":"Q5835668","brand:wikipedia":"en:Santander Bank",name:"Santander"}},"amenity/bank|Santander Río":{countryCodes:["ar"],tags:{amenity:"bank",brand:"Santander Río","brand:wikidata":"Q3385268","brand:wikipedia":"es:Banco Santander Río",name:"Santander Río"}},"amenity/bank|Santander Totta":{tags:{amenity:"bank",brand:"Santander Totta","brand:wikidata":"Q4854116","brand:wikipedia":"pt:Banco Santander Portugal",name:"Santander Totta"}},"amenity/bank|Sberbank":{tags:{amenity:"bank",brand:"Sberbank","brand:wikidata":"Q205012","brand:wikipedia":"en:Sberbank of Russia",name:"Sberbank"}},"amenity/bank|Scotiabank":{tags:{amenity:"bank",brand:"Scotiabank","brand:wikidata":"Q451476","brand:wikipedia":"en:Scotiabank",name:"Scotiabank"}},"amenity/bank|Security Bank":{tags:{amenity:"bank",brand:"Security Bank","brand:wikidata":"Q7444945","brand:wikipedia":"en:Security Bank",name:"Security Bank"}},"amenity/bank|Seylan Bank":{countryCodes:["lk"],tags:{amenity:"bank",brand:"Seylan Bank","brand:wikidata":"Q3532083","brand:wikipedia":"en:Seylan Bank",name:"Seylan Bank"}},"amenity/bank|Siam Commercial Bank":{tags:{amenity:"bank",brand:"Siam Commercial Bank","brand:wikidata":"Q2038986","brand:wikipedia":"en:Siam Commercial Bank",name:"Siam Commercial Bank"}},"amenity/bank|Sicoob":{tags:{amenity:"bank",brand:"Sicoob","brand:wikidata":"Q28679754","brand:wikipedia":"pt:Sistema de Cooperativas de Crédito do Brasil",name:"Sicoob"}},"amenity/bank|Sicredi":{tags:{amenity:"bank",brand:"Sicredi","brand:wikidata":"Q3483060","brand:wikipedia":"pt:Sistema de Crédito Cooperativo",name:"Sicredi"}},"amenity/bank|Simmons Bank":{countryCodes:["us"],tags:{amenity:"bank",brand:"Simmons Bank","brand:wikidata":"Q28402389","brand:wikipedia":"en:Simmons Bank",name:"Simmons Bank"}},"amenity/bank|Slovenská sporiteľňa":{tags:{amenity:"bank",brand:"Slovenská sporiteľňa","brand:wikidata":"Q7541907","brand:wikipedia":"en:Slovenská sporiteľňa",name:"Slovenská sporiteľňa"}},"amenity/bank|Société Générale":{tags:{amenity:"bank",brand:"Société Générale","brand:wikidata":"Q270363","brand:wikipedia":"en:Société Générale",name:"Société Générale"}},"amenity/bank|Sonali Bank":{matchNames:["sonali bank limited","sonali bank limited সোনালী ব্যাংক লিমিটেড"],tags:{amenity:"bank",brand:"Sonali Bank","brand:wikidata":"Q3350382","brand:wikipedia":"en:Sonali Bank",name:"Sonali Bank"}},"amenity/bank|South Indian Bank":{countryCodes:["in"],tags:{amenity:"bank",brand:"South Indian Bank","brand:wikidata":"Q2044973","brand:wikipedia":"en:South Indian Bank",name:"South Indian Bank"}},"amenity/bank|South State Bank":{countryCodes:["us"],tags:{amenity:"bank",brand:"South State Bank","brand:wikidata":"Q55633597","brand:wikipedia":"en:South State Bank",name:"South State Bank"}},"amenity/bank|Sparda-Bank":{tags:{amenity:"bank",brand:"Sparda-Bank","brand:wikidata":"Q2307136","brand:wikipedia":"en:Sparda-Bank",name:"Sparda-Bank"}},"amenity/bank|Stanbic Bank":{tags:{amenity:"bank",brand:"Stanbic Bank","brand:wikidata":"Q7597999","brand:wikipedia":"en:Stanbic Bank",name:"Stanbic Bank"}},"amenity/bank|Standard Bank":{tags:{amenity:"bank",brand:"Standard Bank","brand:wikidata":"Q1576610","brand:wikipedia":"en:Standard Bank",name:"Standard Bank"}},"amenity/bank|Standard Chartered":{matchNames:["standard chartered bank"],tags:{amenity:"bank",brand:"Standard Chartered","brand:wikidata":"Q548278","brand:wikipedia":"en:Standard Chartered",name:"Standard Chartered"}},"amenity/bank|State Bank of India":{tags:{amenity:"bank",brand:"State Bank of India","brand:wikidata":"Q1340361","brand:wikipedia":"en:State Bank of India",name:"State Bank of India"}},"amenity/bank|Summit Bank":{tags:{amenity:"bank",brand:"Summit Bank","brand:wikidata":"Q7637775","brand:wikipedia":"en:Summit Bank",name:"Summit Bank"}},"amenity/bank|SunTrust":{countryCodes:["us"],matchNames:["suntrust bank"],tags:{amenity:"bank",brand:"SunTrust","brand:wikidata":"Q181507","brand:wikipedia":"en:SunTrust Banks",name:"SunTrust"}},"amenity/bank|Supervielle":{countryCodes:["ar"],tags:{amenity:"bank",brand:"Supervielle","brand:wikidata":"Q5718035","brand:wikipedia":"es:Banco Supervielle",name:"Supervielle"}},"amenity/bank|Swedbank":{tags:{amenity:"bank",brand:"Swedbank","brand:wikidata":"Q1145493","brand:wikipedia":"en:Swedbank",name:"Swedbank"}},"amenity/bank|Syndicate Bank":{tags:{amenity:"bank",brand:"Syndicate Bank","brand:wikidata":"Q2004088","brand:wikipedia":"en:Syndicate Bank",name:"Syndicate Bank"}},"amenity/bank|TCF Bank":{tags:{amenity:"bank",brand:"TCF Bank","brand:wikidata":"Q7669687","brand:wikipedia":"en:TCF Bank",name:"TCF Bank"}},"amenity/bank|TD Bank":{tags:{amenity:"bank",brand:"TD Bank","brand:wikidata":"Q7669891","brand:wikipedia":"en:TD Bank, N.A.",name:"TD Bank"}},"amenity/bank|TD Canada Trust":{countryCodes:["ca"],tags:{amenity:"bank",brand:"TD Canada Trust","brand:wikidata":"Q1080670","brand:wikipedia":"en:TD Canada Trust",name:"TD Canada Trust"}},"amenity/bank|TEB":{tags:{amenity:"bank",brand:"TEB","brand:wikidata":"Q7862447","brand:wikipedia":"en:Türk Ekonomi Bankası",name:"TEB"}},"amenity/bank|TSB":{tags:{amenity:"bank",brand:"TSB","brand:wikidata":"Q7671560","brand:wikipedia":"en:TSB Bank (United Kingdom)",name:"TSB"}},"amenity/bank|Takarékszövetkezet":{tags:{amenity:"bank",brand:"Takarékszövetkezet","brand:wikidata":"Q30324674","brand:wikipedia":"en:TakarékBank",name:"Takarékszövetkezet"}},"amenity/bank|Targobank":{tags:{amenity:"bank",brand:"Targobank","brand:wikidata":"Q1455437","brand:wikipedia":"en:Targobank",name:"Targobank"}},"amenity/bank|Tatra banka":{tags:{amenity:"bank",brand:"Tatra banka","brand:wikidata":"Q1718069","brand:wikipedia":"en:Tatra banka",name:"Tatra banka"}},"amenity/bank|Türkiye İş Bankası":{tags:{amenity:"bank",brand:"Türkiye İş Bankası","brand:wikidata":"Q909613","brand:wikipedia":"en:Türkiye İş Bankası",name:"Türkiye İş Bankası"}},"amenity/bank|UBA":{tags:{amenity:"bank",brand:"UBA","brand:wikidata":"Q513457","brand:wikipedia":"en:United Bank for Africa",name:"UBA"}},"amenity/bank|UBI Banca":{tags:{amenity:"bank",brand:"UBI Banca","brand:wikidata":"Q1476162","brand:wikipedia":"en:UBI Banca",name:"UBI Banca"}},"amenity/bank|UBL":{countryCodes:["pk"],matchNames:["ubl bank"],tags:{amenity:"bank",brand:"UBL","brand:en":"United Bank Limited Pakistan","brand:wikidata":"Q7887504","brand:wikipedia":"ur:یونائیٹڈ بینک (پاکستان)",name:"UBL","name:en":"United Bank Limited Pakistan"}},"amenity/bank|UBS":{tags:{amenity:"bank",brand:"UBS","brand:wikidata":"Q193199","brand:wikipedia":"en:UBS",name:"UBS"}},"amenity/bank|UCO Bank":{tags:{amenity:"bank",brand:"UCO Bank","brand:wikidata":"Q2005310","brand:wikipedia":"en:UCO Bank",name:"UCO Bank"}},"amenity/bank|UCPB":{countryCodes:["ph"],tags:{amenity:"bank",brand:"UCPB","brand:wikidata":"Q7887615","brand:wikipedia":"en:United Coconut Planters Bank",name:"UCPB"}},"amenity/bank|UOB":{tags:{amenity:"bank",brand:"UOB","brand:wikidata":"Q2064074","brand:wikipedia":"en:United Overseas Bank",name:"UOB"}},"amenity/bank|US Bank":{countryCodes:["us"],tags:{amenity:"bank",brand:"US Bank","brand:wikidata":"Q739084","brand:wikipedia":"en:U.S. Bancorp",name:"US Bank"}},"amenity/bank|Ulster Bank":{tags:{amenity:"bank",brand:"Ulster Bank","brand:wikidata":"Q2613366","brand:wikipedia":"en:Ulster Bank",name:"Ulster Bank"}},"amenity/bank|Umpqua Bank":{countryCodes:["us"],tags:{amenity:"bank",brand:"Umpqua Bank","brand:wikidata":"Q7881772","brand:wikipedia":"en:Umpqua Holdings Corporation",name:"Umpqua Bank"}},"amenity/bank|UniCredit Bank":{matchNames:["unicredit","unicredit banca"],tags:{amenity:"bank",brand:"UniCredit Bank","brand:wikidata":"Q45568","brand:wikipedia":"en:UniCredit",name:"UniCredit Bank"}},"amenity/bank|Unicaja Banco":{countryCodes:["es"],tags:{amenity:"bank",brand:"Unicaja Banco","brand:wikidata":"Q2543704","brand:wikipedia":"en:Unicaja",name:"Unicaja Banco"}},"amenity/bank|Union Bank of India":{countryCodes:["in"],tags:{amenity:"bank",brand:"Union Bank of India","brand:wikidata":"Q2004078","brand:wikipedia":"en:Union Bank of India",name:"Union Bank of India"}},"amenity/bank|Union Bank~(USA)":{countryCodes:["us"],matchNames:["mufg union bank","union bank of california"],nomatch:["amenity/bank|Banco Unión","amenity/money_transfer|Express Union"],tags:{alt_name:"UnionBank",amenity:"bank",brand:"Union Bank","brand:wikidata":"Q1442804","brand:wikipedia":"en:MUFG Union Bank",name:"Union Bank"}},"amenity/bank|UnionBank~(Philippines)":{countryCodes:["ph"],matchNames:["union bank of the philippines"],nomatch:["amenity/bank|Banco Unión","amenity/money_transfer|Express Union"],tags:{amenity:"bank",brand:"UnionBank","brand:wikidata":"Q7885403","brand:wikipedia":"en:Union Bank of the Philippines",name:"UnionBank"}},"amenity/bank|United Bank":{nomatch:["amenity/fuel|United"],tags:{amenity:"bank",brand:"United Bank",name:"United Bank"}},"amenity/bank|Vakıfbank":{countryCodes:["tr"],tags:{amenity:"bank",brand:"Vakıfbank","brand:wikidata":"Q1148521","brand:wikipedia":"en:VakıfBank",name:"Vakıfbank"}},"amenity/bank|Veneto Banca":{tags:{amenity:"bank",brand:"Veneto Banca","brand:wikidata":"Q3127221","brand:wikipedia":"en:Veneto Banca",name:"Veneto Banca"}},"amenity/bank|Vijaya Bank":{countryCodes:["in"],tags:{amenity:"bank",brand:"Vijaya Bank","brand:wikidata":"Q2003171","brand:wikipedia":"en:Vijaya Bank",name:"Vijaya Bank"}},"amenity/bank|Volksbank":{tags:{amenity:"bank",brand:"Volksbank","brand:wikidata":"Q695110","brand:wikipedia":"en:Volksbank",name:"Volksbank"}},"amenity/bank|Volksbank Köln Bonn eG":{tags:{amenity:"bank",brand:"Volksbank Köln Bonn eG","brand:wikidata":"Q41680844","brand:wikipedia":"de:Volksbank Köln Bonn",name:"Volksbank",official_name:"Volksbank Köln Bonn eG"}},"amenity/bank|VÚB":{tags:{amenity:"bank",brand:"VÚB","brand:wikidata":"Q12778981","brand:wikipedia":"en:Všeobecná úverová banka",name:"VÚB"}},"amenity/bank|Washington Federal":{countryCodes:["us"],tags:{amenity:"bank",brand:"Washington Federal","brand:wikidata":"Q7971859","brand:wikipedia":"en:Washington Federal",name:"Washington Federal"}},"amenity/bank|Wells Fargo":{matchNames:["wells fargo bank"],tags:{amenity:"bank",brand:"Wells Fargo","brand:wikidata":"Q744149","brand:wikipedia":"en:Wells Fargo",name:"Wells Fargo"}},"amenity/bank|Western Union":{nomatch:["amenity/money_transfer|Western Union"],tags:{amenity:"bank",brand:"Western Union","brand:wikidata":"Q861042","brand:wikipedia":"en:Western Union",name:"Western Union"}},"amenity/bank|Westpac":{tags:{amenity:"bank",brand:"Westpac","brand:wikidata":"Q2031726","brand:wikipedia":"en:Westpac",name:"Westpac"}},"amenity/bank|Yapı Kredi":{countryCodes:["tr"],tags:{amenity:"bank",brand:"Yapı Kredi","brand:wikidata":"Q8049138","brand:wikipedia":"en:Yapı ve Kredi Bankası",name:"Yapı Kredi"}},"amenity/bank|Yorkshire Bank":{countryCodes:["gb"],tags:{amenity:"bank",brand:"Yorkshire Bank","brand:wikidata":"Q8055678","brand:wikipedia":"en:Yorkshire Bank",name:"Yorkshire Bank"}},"amenity/bank|Yorkshire Building Society":{tags:{amenity:"bank",brand:"Yorkshire Building Society","brand:wikidata":"Q12073381","brand:wikipedia":"en:Yorkshire Building Society",name:"Yorkshire Building Society"}},"amenity/bank|Zagrebačka banka":{tags:{amenity:"bank",brand:"Zagrebačka banka","brand:wikidata":"Q140381","brand:wikipedia":"en:Zagrebačka banka",name:"Zagrebačka banka"}},"amenity/bank|Zenith Bank":{tags:{amenity:"bank",brand:"Zenith Bank","brand:wikidata":"Q5978240","brand:wikipedia":"en:Zenith Bank",name:"Zenith Bank"}},"amenity/bank|Ziraat Bankası":{tags:{amenity:"bank",brand:"Ziraat Bankası","brand:wikidata":"Q696003","brand:wikipedia":"en:Ziraat Bankası",name:"Ziraat Bankası"}},"amenity/bank|mBank":{tags:{amenity:"bank",brand:"mBank","brand:wikidata":"Q1160928","brand:wikipedia":"en:MBank",name:"mBank"}},"amenity/bank|ČSOB":{tags:{amenity:"bank",brand:"ČSOB","brand:wikidata":"Q340135","brand:wikipedia":"en:Československá obchodní banka",name:"ČSOB"}},"amenity/bank|Česká spořitelna":{countryCodes:["cz"],tags:{amenity:"bank",brand:"Česká spořitelna","brand:wikidata":"Q341100","brand:wikipedia":"en:Česká spořitelna",name:"Česká spořitelna"}},"amenity/bank|İş Bankası":{countryCodes:["tr"],tags:{amenity:"bank",brand:"İş Bankası","brand:wikidata":"Q909613","brand:wikipedia":"en:Türkiye İş Bankası",name:"İş Bankası"}},"amenity/bank|Εθνική Τράπεζα":{countryCodes:["gr"],tags:{amenity:"bank",brand:"Εθνική Τράπεζα","brand:el":"Εθνική Τράπεζα","brand:en":"National Bank of Greece","brand:wikidata":"Q1816028","brand:wikipedia":"en:National Bank of Greece",name:"Εθνική Τράπεζα","name:el":"Εθνική Τράπεζα","name:en":"National Bank of Greece"}},"amenity/bank|Πειραιώς":{tags:{amenity:"bank",brand:"Πειραιώς",name:"Πειραιώς"}},"amenity/bank|Τράπεζα Πειραιώς":{countryCodes:["gr"],tags:{amenity:"bank",brand:"Τράπεζα Πειραιώς","brand:el":"Τράπεζα Πειραιώς","brand:en":"Piraeus Bank","brand:wikidata":"Q3312","brand:wikipedia":"en:Piraeus Bank",name:"Τράπεζα Πειραιώς","name:el":"Τράπεζα Πειραιώς","name:en":"Piraeus Bank"}},"amenity/bank|А-Банк":{tags:{amenity:"bank",brand:"А-Банк",name:"А-Банк"}},"amenity/bank|Авангард":{countryCodes:["ru"],tags:{amenity:"bank",brand:"Авангард","brand:wikidata":"Q62122617",name:"Авангард"}},"amenity/bank|Альфа-Банк":{tags:{amenity:"bank",brand:"Альфа-Банк","brand:en":"Alfa-Bank","brand:ru":"Альфа-Банк","brand:wikidata":"Q1377835","brand:wikipedia":"ru:Альфа-банк",name:"Альфа-Банк","name:en":"Alfa-Bank","name:ru":"Альфа-Банк"}},"amenity/bank|БПС-Сбербанк":{tags:{amenity:"bank",brand:"БПС-Сбербанк",name:"БПС-Сбербанк"}},"amenity/bank|Банк Дабрабыт":{tags:{amenity:"bank",brand:"Банк Дабрабыт",name:"Банк Дабрабыт"}},"amenity/bank|Банка ДСК":{countryCodes:["bg"],tags:{amenity:"bank",brand:"Банка ДСК","brand:bg":"Банка ДСК","brand:en":"DSK Bank","brand:wikidata":"Q5206146","brand:wikipedia":"en:DSK Bank",name:"Банка ДСК","name:bg":"Банка ДСК","name:en":"DSK Bank"}},"amenity/bank|Белагропромбанк":{countryCodes:["by"],tags:{amenity:"bank",brand:"Белагропромбанк","brand:en":"Belagroprom Bank","brand:wikidata":"Q1991373","brand:wikipedia":"be:Белаграпрамбанк",name:"Белагропромбанк","name:en":"Belagroprom Bank"}},"amenity/bank|Беларусбанк":{tags:{amenity:"bank",brand:"Беларусбанк","brand:en":"Belarusbank","brand:wikidata":"Q1997334","brand:wikipedia":"en:Belarusbank",name:"Беларусбанк","name:en":"Belarusbank"}},"amenity/bank|Белинвестбанк":{countryCodes:["by"],tags:{amenity:"bank",brand:"Белинвестбанк","brand:wikidata":"Q4081940","brand:wikipedia":"ru:Белинвестбанк",name:"Белинвестбанк"}},"amenity/bank|Бинбанк":{countryCodes:["ru"],tags:{amenity:"bank",brand:"Бинбанк","brand:en":"B&N Bank","brand:wikidata":"Q4086829","brand:wikipedia":"en:B&N Bank",name:"Бинбанк","name:en":"B&N Bank"}},"amenity/bank|ВТБ":{matchNames:["втб банк москвы"],tags:{amenity:"bank",brand:"ВТБ","brand:en":"VTB Bank","brand:wikidata":"Q1549389","brand:wikipedia":"en:VTB Bank",name:"ВТБ","name:en":"VTB Bank"}},"amenity/bank|Возрождение":{countryCodes:["ru"],tags:{amenity:"bank",brand:"Возрождение","brand:wikidata":"Q4114952","brand:wikipedia":"ru:Возрождение (банк)",name:"Возрождение"}},"amenity/bank|Газпромбанк":{countryCodes:["ru"],tags:{amenity:"bank",brand:"Газпромбанк","brand:en":"Gazprombank","brand:wikidata":"Q1924338","brand:wikipedia":"en:Gazprombank",name:"Газпромбанк","name:en":"Gazprombank"}},"amenity/bank|Генбанк":{countryCodes:["ru"],tags:{amenity:"bank",brand:"Генбанк","brand:wikidata":"Q62122630",name:"Генбанк"}},"amenity/bank|Казкоммерцбанк":{countryCodes:["kz"],tags:{amenity:"bank",brand:"Казкоммерцбанк","brand:en":"Kazkommertsbank","brand:wikidata":"Q1168179","brand:wikipedia":"en:Kazkommertsbank",name:"Казкоммерцбанк","name:en":"Kazkommertsbank"}},"amenity/bank|Московский индустриальный банк":{countryCodes:["ru"],tags:{amenity:"bank",brand:"Московский индустриальный банк","brand:en":"Moscow Industrial Bank","brand:wikidata":"Q4304145","brand:wikipedia":"ru:Московский индустриальный банк",name:"Московский индустриальный банк","name:en":"Moscow Industrial Bank"}},"amenity/bank|Мособлбанк":{countryCodes:["ru"],tags:{amenity:"bank",brand:"Мособлбанк","brand:en":"Mosobl Bank","brand:wikidata":"Q4304446","brand:wikipedia":"ru:Мособлбанк",name:"Мособлбанк","name:en":"Mosobl Bank"}},"amenity/bank|Народный банк":{countryCodes:["kg","kz","uz"],tags:{amenity:"bank",brand:"Народный банк","brand:wikidata":"Q1046186","brand:wikipedia":"kk:Қазақстан Халық банкі",name:"Народный банк"}},"amenity/bank|ОТП Банк":{tags:{amenity:"bank",brand:"ОТП Банк","brand:en":"OTP Bank","brand:wikidata":"Q912778","brand:wikipedia":"en:OTP Bank",name:"ОТП Банк","name:en":"OTP Bank"}},"amenity/bank|Обединена Българска Банка":{countryCodes:["bg"],tags:{amenity:"bank",brand:"Обединена Българска Банка","brand:en":"United Bulgarian Bank","brand:wikidata":"Q7887555","brand:wikipedia":"en:United Bulgarian Bank",name:"Обединена Българска Банка","name:en":"United Bulgarian Bank"}},"amenity/bank|Открытие":{countryCodes:["ru"],matchNames:["банк открытие"],tags:{amenity:"bank",brand:"Открытие","brand:wikidata":"Q4327204","brand:wikipedia":"ru:Банк «Финансовая корпорация Открытие»",name:"Открытие"}},"amenity/bank|Ощадбанк":{countryCodes:["ua"],tags:{amenity:"bank",brand:"Ощадбанк","brand:en":"State Savings Bank of Ukraine","brand:wikidata":"Q4340839","brand:wikipedia":"uk:Ощадбанк",name:"Ощадбанк","name:en":"State Savings Bank of Ukraine"}},"amenity/bank|ПУМБ":{countryCodes:["ua"],tags:{amenity:"bank",brand:"ПУМБ","brand:en":"First Ukrainian International Bank","brand:wikidata":"Q4341156","brand:wikipedia":"en:First Ukrainian International Bank",name:"ПУМБ","name:en":"First Ukrainian International Bank"}},"amenity/bank|Почта Банк":{tags:{amenity:"bank",brand:"Почта Банк","brand:en":"Post Bank","brand:wikidata":"Q24930461","brand:wikipedia":"en:Post Bank (Russia)",name:"Почта Банк","name:en":"Post Bank"}},"amenity/bank|Пощенска банка":{tags:{amenity:"bank",brand:"Пощенска банка",name:"Пощенска банка"}},"amenity/bank|ПриватБанк":{tags:{amenity:"bank",brand:"ПриватБанк","brand:en":"PrivatBank","brand:wikidata":"Q1515015","brand:wikipedia":"uk:ПриватБанк",name:"ПриватБанк","name:en":"PrivatBank"}},"amenity/bank|Приорбанк":{countryCodes:["by"],tags:{amenity:"bank",brand:"Приорбанк","brand:en":"PriorBank","brand:wikidata":"Q3919658","brand:wikipedia":"be:Пріорбанк",name:"Приорбанк","name:en":"PriorBank"}},"amenity/bank|Промсвязьбанк":{tags:{amenity:"bank",brand:"Промсвязьбанк","brand:en":"Promsvyazbank","brand:wikidata":"Q649100","brand:wikipedia":"en:Promsvyazbank",name:"Промсвязьбанк","name:en":"Promsvyazbank"}},"amenity/bank|РНКБ":{tags:{amenity:"bank",brand:"РНКБ","brand:wikidata":"Q16912944","brand:wikipedia":"en:Russian National Commercial Bank",name:"РНКБ"}},"amenity/bank|Райффайзен":{tags:{amenity:"bank",brand:"Райффайзен","brand:en":"Raiffeisenbank","brand:wikidata":"Q4389244","brand:wikipedia":"en:Raiffeisenbank (Russia)",name:"Райффайзен","name:en":"Raiffeisenbank"}},"amenity/bank|Райффайзен Банк Аваль":{countryCodes:["ua"],tags:{amenity:"bank",brand:"Райффайзен Банк Аваль","brand:en":"Raiffeisen Bank Aval","brand:wikidata":"Q4389243","brand:wikipedia":"en:Raiffeisen Bank Aval",name:"Райффайзен Банк Аваль","name:en":"Raiffeisen Bank Aval"}},"amenity/bank|Росбанк":{tags:{amenity:"bank",brand:"Росбанк","brand:en":"Rosbank","brand:wikidata":"Q1119857","brand:wikipedia":"en:Rosbank",name:"Росбанк","name:en":"Rosbank"}},"amenity/bank|Россельхозбанк":{tags:{amenity:"bank",brand:"Россельхозбанк","brand:en":"Rosselkhozbank","brand:wikidata":"Q3920226","brand:wikipedia":"en:Russian Agricultural Bank",name:"Россельхозбанк","name:en":"Rosselkhozbank"}},"amenity/bank|Русский Стандарт":{countryCodes:["ru"],tags:{amenity:"bank",brand:"Русский Стандарт","brand:en":"Russian Standard Bank","brand:wikidata":"Q4400854","brand:wikipedia":"en:Russian Standard Bank",name:"Русский Стандарт","name:en":"Russian Standard Bank"}},"amenity/bank|Сбербанк":{matchNames:["приднестровский сбербанк","сбербанк россии"],tags:{amenity:"bank",brand:"Сбербанк","brand:en":"Prisbank","brand:wikidata":"Q4378147","brand:wikipedia":"ru:Приднестровский Сбербанк",name:"Сбербанк","name:en":"Prisbank"}},"amenity/bank|Совкомбанк":{countryCodes:["ru"],tags:{amenity:"bank",brand:"Совкомбанк","brand:en":"Sovcom Bank","brand:wikidata":"Q4426566","brand:wikipedia":"ru:Совкомбанк",name:"Совкомбанк","name:en":"Sovcom Bank"}},"amenity/bank|УкрСиббанк":{countryCodes:["ua"],tags:{amenity:"bank",brand:"УкрСиббанк","brand:en":"UkrSibbank","brand:wikidata":"Q1976290","brand:wikipedia":"en:UkrSibbank",name:"УкрСиббанк","name:en":"UkrSibbank"}},"amenity/bank|Укргазбанк":{tags:{amenity:"bank",brand:"Укргазбанк","brand:en":"Ukrgasbank","brand:wikidata":"Q4470692","brand:wikipedia":"ru:Укргазбанк",name:"Укргазбанк","name:en":"Ukrgasbank"}},"amenity/bank|Укрсоцбанк":{countryCodes:["ua"],tags:{amenity:"bank",brand:"Укрсоцбанк","brand:en":"Ukrsotsbank","brand:wikidata":"Q3547885","brand:wikipedia":"en:Ukrsotsbank",name:"Укрсоцбанк","name:en":"Ukrsotsbank"}},"amenity/bank|Уралсиб":{countryCodes:["ru"],tags:{amenity:"bank",brand:"Уралсиб","brand:en":"Uralsib bank","brand:wikidata":"Q4476693","brand:wikipedia":"ru:Уралсиб (банк)",name:"Уралсиб","name:en":"Uralsib bank"}},"amenity/bank|Хаан банк":{countryCodes:["mn"],tags:{amenity:"bank",brand:"Хаан банк","brand:wikidata":"Q25632240","brand:wikipedia":"mn:ХААН банк",name:"Хаан банк"}},"amenity/bank|Хоум Кредит":{tags:{amenity:"bank",brand:"Хоум Кредит","brand:en":"Home Credit & Finance Bank","brand:wikidata":"Q4500466","brand:wikipedia":"en:Home Credit & Finance Bank",name:"Хоум Кредит","name:en":"Home Credit & Finance Bank"}},"amenity/bank|בנק הפועלים":{countryCodes:["il"],tags:{amenity:"bank",brand:"בנק הפועלים","brand:en":"Bank Hapoalim","brand:he":"בנק הפועלים","brand:wikidata":"Q2666775","brand:wikipedia":"en:Bank Hapoalim",name:"בנק הפועלים","name:en":"Bank Hapoalim","name:he":"בנק הפועלים"}},"amenity/bank|בנק לאומי":{countryCodes:["il"],tags:{amenity:"bank",brand:"בנק לאומי","brand:en":"Bank Leumi","brand:he":"בנק לאומי","brand:wikidata":"Q806641","brand:wikipedia":"en:Bank Leumi",name:"בנק לאומי","name:en":"Bank Leumi","name:he":"בנק לאומי"}},"amenity/bank|بانک آینده":{countryCodes:["ir"],tags:{amenity:"bank",brand:"بانک آینده","brand:en":"Ayandeh Bank","brand:wikidata":"Q5938144","brand:wikipedia":"en:Ayandeh Bank",name:"بانک آینده","name:en":"Ayandeh Bank"}},"amenity/bank|بانک اقتصاد نوین":{countryCodes:["ir"],tags:{amenity:"bank",brand:"بانک اقتصاد نوین","brand:en":"EN Bank","brand:wikidata":"Q5323768","brand:wikipedia":"en:EN Bank",name:"بانک اقتصاد نوین","name:en":"EN Bank"}},"amenity/bank|بانک انصار":{countryCodes:["ir"],tags:{amenity:"bank",brand:"بانک انصار","brand:wikidata":"Q5862675","brand:wikipedia":"fa:بانک انصار",name:"بانک انصار"}},"amenity/bank|بانک ایران زمین":{countryCodes:["ir"],tags:{amenity:"bank",brand:"بانک ایران زمین","brand:wikidata":"Q5934423","brand:wikipedia":"en:Iran Zamin Bank",name:"بانک ایران زمین"}},"amenity/bank|بانک تجارت":{countryCodes:["ir"],tags:{amenity:"bank",brand:"بانک تجارت","brand:wikidata":"Q7695198","brand:wikipedia":"en:Tejarat Bank",name:"بانک تجارت"}},"amenity/bank|بانک توسعه تعاون":{countryCodes:["ir"],tags:{amenity:"bank",brand:"بانک توسعه تعاون","brand:wikidata":"Q5684450","brand:wikipedia":"fa:بانک توسعه تعاون",name:"بانک توسعه تعاون"}},"amenity/bank|بانک رفاه":{countryCodes:["ir"],matchNames:["بانک رفاه کارگران"],tags:{amenity:"bank",brand:"بانک رفاه","brand:en":"Refah Bank","brand:wikidata":"Q7307083","brand:wikipedia":"en:Refah Bank",name:"بانک رفاه","name:en":"Refah Bank"}},"amenity/bank|بانک سامان":{countryCodes:["ir"],tags:{amenity:"bank",brand:"بانک سامان","brand:en":"Saman Bank","brand:wikidata":"Q4117676","brand:wikipedia":"en:Saman Bank",name:"بانک سامان","name:en":"Saman Bank"}},"amenity/bank|بانک سرمایه":{countryCodes:["ir"],tags:{amenity:"bank",brand:"بانک سرمایه","brand:en":"Sarmayeh Bank","brand:wikidata":"Q7424291","brand:wikipedia":"en:Sarmayeh Bank",name:"بانک سرمایه","name:en":"Sarmayeh Bank"}},"amenity/bank|بانک سپه":{countryCodes:["ir"],tags:{amenity:"bank",brand:"بانک سپه","brand:en":"Bank Sepah","brand:wikidata":"Q2882624","brand:wikipedia":"en:Bank Sepah",name:"بانک سپه","name:en":"Bank Sepah"}},"amenity/bank|بانک سینا":{countryCodes:["ir"],tags:{amenity:"bank",brand:"بانک سینا","brand:en":"Sina Bank","brand:wikidata":"Q10860246","brand:wikipedia":"en:Sina Bank",name:"بانک سینا","name:en":"Sina Bank"}},"amenity/bank|بانک شهر":{countryCodes:["ir"],tags:{amenity:"bank",brand:"بانک شهر","brand:en":"Shahr Bank","brand:wikidata":"Q5941033","brand:wikipedia":"fa:بانک شهر",name:"بانک شهر","name:en":"Shahr Bank"}},"amenity/bank|بانک صادرات":{matchNames:["بانک صادرات ایران","صادرات"],tags:{amenity:"bank",brand:"بانک صادرات","brand:en":"Bank Saderat Iran","brand:wikidata":"Q2882608","brand:wikipedia":"en:Bank Saderat Iran",name:"بانک صادرات","name:en":"Bank Saderat Iran"}},"amenity/bank|بانک قوامین":{countryCodes:["ir"],tags:{amenity:"bank",brand:"بانک قوامین","brand:en":"Ghavamin Bank","brand:wikidata":"Q10860253","brand:wikipedia":"en:Ghavamin Bank",name:"بانک قوامین","name:en":"Ghavamin Bank"}},"amenity/bank|بانک مسکن":{countryCodes:["ir"],tags:{amenity:"bank",brand:"بانک مسکن","brand:en":"Bank Maskan","brand:wikidata":"Q4855942","brand:wikipedia":"en:Bank Maskan",name:"بانک مسکن","name:en":"Bank Maskan"}},"amenity/bank|بانک ملت":{tags:{amenity:"bank",brand:"بانک ملت","brand:en":"Bank Mellat","brand:wikidata":"Q4855944","brand:wikipedia":"en:Bank Mellat",name:"بانک ملت","name:en":"Bank Mellat"}},"amenity/bank|بانک ملی":{countryCodes:["ir"],matchNames:["بانک ملی ایران","ملی"],tags:{amenity:"bank",brand:"بانک ملی","brand:en":"Bank Melli Iran","brand:wikidata":"Q806640","brand:wikipedia":"en:Bank Melli Iran",name:"بانک ملی","name:en":"Bank Melli Iran"}},"amenity/bank|بانک مهر اقتصاد":{countryCodes:["ir"],tags:{amenity:"bank",brand:"بانک مهر اقتصاد","brand:wikidata":"Q5942921","brand:wikipedia":"fa:بانک مهر اقتصاد",name:"بانک مهر اقتصاد","name:en":"Mehr Eqtesad Bank"}},"amenity/bank|بانک پارسیان":{countryCodes:["ir"],tags:{amenity:"bank",brand:"بانک پارسیان","brand:en":"Parsian Bank","brand:wikidata":"Q2410404","brand:wikipedia":"en:Parsian Bank",name:"بانک پارسیان","name:en":"Parsian Bank"}},"amenity/bank|بانک پاسارگاد":{countryCodes:["ir"],tags:{amenity:"bank",brand:"بانک پاسارگاد","brand:en":"Bank Pasargad","brand:wikidata":"Q4855962","brand:wikipedia":"en:Bank Pasargad",name:"بانک پاسارگاد","name:en":"Bank Pasargad"}},"amenity/bank|بانک کشاورزی":{tags:{amenity:"bank",brand:"بانک کشاورزی","brand:en":"Bank Keshavarzi Iran","brand:wikidata":"Q6395007","brand:wikipedia":"en:Bank Keshavarzi Iran",name:"بانک کشاورزی","name:en":"Bank Keshavarzi Iran"}},"amenity/bank|پست بانک":{countryCodes:["ir"],tags:{amenity:"bank",brand:"پست بانک","brand:en":"Post Bank of Iran","brand:wikidata":"Q7233625","brand:wikipedia":"en:Post Bank of Iran",name:"پست بانک","name:en":"Post Bank of Iran"}},"amenity/bank|ธนาคารกรุงเทพ":{countryCodes:["th"],tags:{amenity:"bank",brand:"ธนาคารกรุงเทพ","brand:en":"Bangkok Bank","brand:th":"ธนาคารกรุงเทพ","brand:wikidata":"Q806483","brand:wikipedia":"en:Bangkok Bank",name:"ธนาคารกรุงเทพ","name:en":"Bangkok Bank","name:th":"ธนาคารกรุงเทพ"}},"amenity/bank|ธนาคารกรุงไทย":{countryCodes:["th"],tags:{amenity:"bank",brand:"ธนาคารกรุงไทย","brand:en":"Krung Thai Bank","brand:th":"ธนาคารกรุงไทย","brand:wikidata":"Q962865","brand:wikipedia":"en:Krung Thai Bank",name:"ธนาคารกรุงไทย","name:en":"Krung Thai Bank","name:th":"ธนาคารกรุงไทย"}},"amenity/bank|ธนาคารกสิกรไทย":{countryCodes:["th"],tags:{amenity:"bank",brand:"ธนาคารกสิกรไทย","brand:en":"en:Kasikornbank","brand:th":"ธนาคารกสิกรไทย","brand:wikidata":"Q276557","brand:wikipedia":"en:Kasikornbank",name:"ธนาคารกสิกรไทย","name:en":"en:Kasikornbank","name:th":"ธนาคารกสิกรไทย"}},"amenity/bank|ธนาคารออมสิน":{countryCodes:["th"],tags:{amenity:"bank",brand:"ธนาคารออมสิน","brand:en":"Government Savings Bank","brand:th":"ธนาคารออมสิน","brand:wikidata":"Q6579041","brand:wikipedia":"en:Government Savings Bank (Thailand)",name:"ธนาคารออมสิน","name:en":"Government Savings Bank","name:th":"ธนาคารออมสิน"}},"amenity/bank|ธนาคารไทยพาณิชย์":{countryCodes:["th"],tags:{amenity:"bank",brand:"ธนาคารไทยพาณิชย์","brand:en":"Siam Commercial Bank","brand:th":"ธนาคารไทยพาณิชย์","brand:wikidata":"Q2038986","brand:wikipedia":"en:Siam Commercial Bank",name:"ธนาคารไทยพาณิชย์","name:en":"Siam Commercial Bank","name:th":"ธนาคารไทยพาณิชย์"}},"amenity/bank|みずほ銀行":{countryCodes:["jp"],tags:{amenity:"bank",brand:"みずほ銀行","brand:en":"Mizuho Bank","brand:ja":"みずほ銀行","brand:wikidata":"Q2882956","brand:wikipedia":"en:Mizuho Bank",name:"みずほ銀行","name:en":"Mizuho Bank","name:ja":"みずほ銀行"}},"amenity/bank|ゆうちょ銀行":{countryCodes:["jp"],tags:{amenity:"bank",brand:"ゆうちょ銀行","brand:en":"Japan Post Bank","brand:ja":"ゆうちょ銀行","brand:wikidata":"Q907103","brand:wikipedia":"ja:ゆうちょ銀行",name:"ゆうちょ銀行","name:en":"Japan Post Bank","name:ja":"ゆうちょ銀行"}},"amenity/bank|りそな銀行":{countryCodes:["jp"],tags:{amenity:"bank",brand:"りそな銀行","brand:en":"Resona Bank","brand:ja":"りそな銀行","brand:wikidata":"Q11281447","brand:wikipedia":"ja:りそな銀行",name:"りそな銀行","name:en":"Resona Bank","name:ja":"りそな銀行"}},"amenity/bank|三井住友銀行":{countryCodes:["jp"],tags:{amenity:"bank",brand:"三井住友銀行","brand:en":"Sumitomo Mitsui Banking Corporation","brand:wikidata":"Q2660418","brand:wikipedia":"en:Sumitomo Mitsui Banking Corporation",name:"三井住友銀行","name:en":"Sumitomo Mitsui Banking Corporation"}},"amenity/bank|三菱東京UFJ銀行":{countryCodes:["jp"],tags:{amenity:"bank",brand:"三菱東京UFJ銀行","brand:en":"MUFG Bank","brand:wikidata":"Q988284","brand:wikipedia":"en:MUFG Bank",name:"三菱東京UFJ銀行","name:en":"MUFG Bank"}},"amenity/bank|上海商業儲蓄銀行":{countryCodes:["tw"],tags:{amenity:"bank",brand:"上海商業儲蓄銀行","brand:en":"Shanghai Commercial and Savings Bank","brand:wikidata":"Q4207208","brand:wikipedia":"en:Shanghai Commercial and Savings Bank",name:"上海商業儲蓄銀行","name:en":"Shanghai Commercial and Savings Bank"}},"amenity/bank|中信银行":{countryCodes:["cn"],tags:{amenity:"bank",brand:"中信银行","brand:en":"China CITIC Bank","brand:wikidata":"Q38960","brand:wikipedia":"en:China CITIC Bank",name:"中信银行"}},"amenity/bank|中国农业银行":{tags:{amenity:"bank",brand:"中国农业银行","brand:en":"Agricultural Bank of China","brand:wikidata":"Q26298","brand:wikipedia":"en:Agricultural Bank of China",name:"中国农业银行","name:en":"Agricultural Bank of China"}},"amenity/bank|中国工商银行":{tags:{amenity:"bank",brand:"中国工商银行","brand:en":"Industrial and Commercial Bank of China","brand:wikidata":"Q26463","brand:wikipedia":"en:Industrial and Commercial Bank of China",name:"中国工商银行","name:en":"Industrial and Commercial Bank of China"}},"amenity/bank|中国建设银行":{countryCodes:["cn"],tags:{amenity:"bank",brand:"中国建设银行","brand:en":"China Construction Bank","brand:wikidata":"Q26299","brand:wikipedia":"en:China Construction Bank",name:"中国建设银行","name:en":"China Construction Bank"}},"amenity/bank|中国邮政储蓄银行":{tags:{amenity:"bank",brand:"中国邮政储蓄银行","brand:en":"Postal Savings Bank of China","brand:wikidata":"Q986744","brand:wikipedia":"en:Postal Savings Bank of China",name:"中国邮政储蓄银行","name:en":"Postal Savings Bank of China"}},"amenity/bank|中国银行":{tags:{amenity:"bank",brand:"中国银行","brand:en":"Bank of China","brand:wikidata":"Q790068","brand:wikipedia":"en:Bank of China",name:"中国银行","name:en":"Bank of China"}},"amenity/bank|中國信託商業銀行":{countryCodes:["tw"],tags:{amenity:"bank",brand:"中國信託商業銀行","brand:en":"CTBC Bank","brand:wikidata":"Q5100191","brand:wikipedia":"en:CTBC Bank",name:"中國信託商業銀行","name:en":"CTBC Bank"}},"amenity/bank|交通银行":{countryCodes:["cn"],tags:{amenity:"bank",brand:"交通银行","brand:en":"Bank of Communications","brand:wikidata":"Q806680","brand:wikipedia":"en:Bank of Communications",name:"交通银行","name:en":"Bank of Communications"}},"amenity/bank|京城商業銀行":{countryCodes:["tw"],tags:{amenity:"bank",brand:"京城商業銀行","brand:wikidata":"Q10883132","brand:wikipedia":"zh:京城商業銀行",name:"京城商業銀行"}},"amenity/bank|京都中央信用金庫":{countryCodes:["jp"],tags:{amenity:"bank",brand:"京都中央信用金庫","brand:en":"Kyoto Chuo Shinkin Bank","brand:wikidata":"Q11374844","brand:wikipedia":"jp:京都中央信用金庫",name:"京都中央信用金庫","name:en":"Kyoto Chuo Shinkin Bank"}},"amenity/bank|京都銀行":{countryCodes:["jp"],tags:{amenity:"bank",brand:"京都銀行","brand:en":"Bank of Kyoto","brand:wikidata":"Q11375713","brand:wikipedia":"en:Bank of Kyoto",name:"京都銀行","name:en":"Bank of Kyoto"}},"amenity/bank|元大商業銀行":{countryCodes:["tw"],tags:{amenity:"bank",brand:"元大商業銀行","brand:en":"Yuanta Commercial Bank","brand:wikidata":"Q10889602","brand:wikipedia":"zh:元大商業銀行",name:"元大商業銀行","name:en":"Yuanta Commercial Bank"}},"amenity/bank|兆豐國際商業銀行":{countryCodes:["tw"],tags:{amenity:"bank",brand:"兆豐國際商業銀行","brand:en":"Mega International Commercial Bank","brand:wikidata":"Q709757","brand:wikipedia":"en:Mega International Commercial Bank",name:"兆豐國際商業銀行","name:en":"Mega International Commercial Bank"}},"amenity/bank|农业银行":{tags:{amenity:"bank",brand:"农业银行","brand:wikidata":"Q26298","brand:wikipedia":"zh:中国农业银行",name:"农业银行"}},"amenity/bank|北洋銀行":{countryCodes:["jp"],tags:{amenity:"bank",brand:"北洋銀行","brand:en":"North Pacific Bank","brand:wikidata":"Q11402354","brand:wikipedia":"ja:北洋銀行",name:"北洋銀行","name:en":"North Pacific Bank"}},"amenity/bank|北海道銀行":{countryCodes:["jp"],tags:{amenity:"bank",brand:"北海道銀行","brand:en":"Hokkaido Bank","brand:wikidata":"Q5878076","brand:wikipedia":"en:Hokkaido Bank",name:"北海道銀行","name:en":"Hokkaido Bank"}},"amenity/bank|台中商業銀行":{countryCodes:["tw"],tags:{amenity:"bank",brand:"台中商業銀行","brand:en":"Taichung Bank","brand:wikidata":"Q6136958","brand:wikipedia":"en:Taichung Bank",name:"台中商業銀行","name:en":"Taichung Bank"}},"amenity/bank|台北富邦商業銀行":{countryCodes:["tw"],tags:{amenity:"bank",brand:"台北富邦商業銀行","brand:en":"Taipei Fubon Bank","brand:wikidata":"Q697293","brand:wikipedia":"en:Taipei Fubon Bank",name:"台北富邦商業銀行","name:en":"Taipei Fubon Bank"}},"amenity/bank|台新國際商業銀行":{countryCodes:["tw"],tags:{amenity:"bank",brand:"台新國際商業銀行","brand:en":"Taishin International Bank","brand:wikidata":"Q7676420","brand:wikipedia":"en:Taishin International Bank",name:"台新國際商業銀行","name:en":"Taishin International Bank"}},"amenity/bank|合作金庫商業銀行":{countryCodes:["tw"],tags:{amenity:"bank",brand:"合作金庫商業銀行","brand:en":"Taiwan Cooperative Bank","brand:wikidata":"Q701540","brand:wikipedia":"en:Taiwan Cooperative Bank",name:"合作金庫商業銀行","name:en":"Taiwan Cooperative Bank"}},"amenity/bank|國泰世華商業銀行":{countryCodes:["tw"],tags:{amenity:"bank",brand:"國泰世華商業銀行","brand:en":"Cathay United Bank","brand:wikidata":"Q702656","brand:wikipedia":"en:Cathay United Bank",name:"國泰世華商業銀行","name:en":"Cathay United Bank"}},"amenity/bank|大眾商業銀行":{countryCodes:["tw"],tags:{amenity:"bank",brand:"大眾商業銀行","brand:en":"Ta Chong Commercial Bank","brand:wikidata":"Q10937047","brand:wikipedia":"zh:大眾商業銀行",name:"大眾商業銀行","name:en":"Ta Chong Commercial Bank"}},"amenity/bank|安泰商業銀行":{countryCodes:["tw"],tags:{amenity:"bank",brand:"安泰商業銀行","brand:en":"Entie Commercial Bank","brand:wikidata":"Q10946952","brand:wikipedia":"zh:安泰商業銀行",name:"安泰商業銀行","name:en":"Entie Commercial Bank"}},"amenity/bank|工商银行":{countryCodes:["cn"],tags:{amenity:"bank",brand:"工商银行","brand:en":"Industrial and Commercial Bank of China","brand:wikidata":"Q26463","brand:wikipedia":"en:Industrial and Commercial Bank of China",name:"工商银行","name:en":"Industrial and Commercial Bank of China"}},"amenity/bank|常陽銀行":{tags:{amenity:"bank",brand:"常陽銀行",name:"常陽銀行"}},"amenity/bank|建设银行":{countryCodes:["cn"],tags:{amenity:"bank",brand:"建设银行","brand:wikidata":"Q26299","brand:wikipedia":"zh:中国建设银行",name:"建设银行"}},"amenity/bank|彰化商業銀行":{countryCodes:["tw"],tags:{amenity:"bank",brand:"彰化商業銀行","brand:en":"Chang Hwa Bank","brand:wikidata":"Q5071627","brand:wikipedia":"en:Chang Hwa Bank",name:"彰化商業銀行","name:en":"Chang Hwa Bank"}},"amenity/bank|招商银行":{countryCodes:["cn"],tags:{amenity:"bank",brand:"招商银行","brand:en":"China Merchants Bank","brand:wikidata":"Q1073327","brand:wikipedia":"en:China Merchants Bank",name:"招商银行","name:en":"China Merchants Bank"}},"amenity/bank|日本銀行":{countryCodes:["jp"],tags:{amenity:"bank",brand:"日本銀行","brand:en":"Bank of Japan","brand:wikidata":"Q333101","brand:wikipedia":"ja:日本銀行",name:"日本銀行","name:en":"Bank of Japan"}},"amenity/bank|板信商業銀行":{countryCodes:["tw"],tags:{amenity:"bank",brand:"板信商業銀行","brand:en":"Bank of Panshin","brand:wikidata":"Q11104946","brand:wikipedia":"zh:板信商業銀行",name:"板信商業銀行","name:en":"Bank of Panshin"}},"amenity/bank|横浜銀行":{countryCodes:["jp"],tags:{amenity:"bank",brand:"横浜銀行","brand:en":"Bank of Yokohama","brand:wikidata":"Q2744340","brand:wikipedia":"en:Bank of Yokohama",name:"横浜銀行","name:en":"Bank of Yokohama"}},"amenity/bank|永豐商業銀行":{countryCodes:["tw"],tags:{amenity:"bank",brand:"永豐商業銀行","brand:en":"Bank SinoPac","brand:wikidata":"Q4855976","brand:wikipedia":"en:Bank SinoPac",name:"永豐商業銀行","name:en":"Bank SinoPac"}},"amenity/bank|渣打國際商業銀行":{countryCodes:["tw"],tags:{amenity:"bank",brand:"渣打國際商業銀行","brand:wikidata":"Q62267023",name:"渣打國際商業銀行"}},"amenity/bank|玉山商業銀行":{countryCodes:["tw"],tags:{amenity:"bank",brand:"玉山商業銀行","brand:en":"E.SUN Commercial Bank","brand:wikidata":"Q5321663","brand:wikipedia":"en:E.SUN Commercial Bank",name:"玉山商業銀行","name:en":"E.SUN Commercial Bank"}},"amenity/bank|第一商業銀行":{countryCodes:["tw"],tags:{amenity:"bank",brand:"第一商業銀行","brand:en":"First Commercial Bank","brand:wikidata":"Q11602128","brand:wikipedia":"zh:第一商業銀行",name:"第一商業銀行","name:en":"First Commercial Bank"}},"amenity/bank|聯邦商業銀行":{countryCodes:["tw"],tags:{amenity:"bank",brand:"聯邦商業銀行","brand:en":"Union Bank of Taiwan","brand:wikidata":"Q15927195","brand:wikipedia":"zh:聯邦商業銀行",name:"聯邦商業銀行","name:en":"Union Bank of Taiwan"}},"amenity/bank|臺灣中小企業銀行":{countryCodes:["tw"],tags:{amenity:"bank",brand:"臺灣中小企業銀行","brand:en":"Taiwan Business Bank","brand:wikidata":"Q15913812","brand:wikipedia":"zh:臺灣中小企業銀行",name:"臺灣中小企業銀行","name:en":"Taiwan Business Bank"}},"amenity/bank|臺灣土地銀行":{countryCodes:["tw"],tags:{amenity:"bank",brand:"臺灣土地銀行","brand:en":"Land Bank of Taiwan","brand:wikidata":"Q717592","brand:wikipedia":"en:Land Bank of Taiwan",name:"臺灣土地銀行","name:en":"Land Bank of Taiwan"}},"amenity/bank|臺灣新光商業銀行":{countryCodes:["tw"],tags:{amenity:"bank",brand:"臺灣新光商業銀行","brand:en":"Shin Kong Commercial Bank","brand:wikidata":"Q15909616","brand:wikipedia":"zh:臺灣新光商業銀行",name:"臺灣新光商業銀行","name:en":"Shin Kong Commercial Bank"}},"amenity/bank|臺灣銀行":{countryCodes:["tw"],tags:{amenity:"bank",brand:"臺灣銀行","brand:en":"Bank of Taiwan","brand:wikidata":"Q706533","brand:wikipedia":"en:Bank of Taiwan",name:"臺灣銀行","name:en":"Bank of Taiwan"}},"amenity/bank|華南商業銀行":{countryCodes:["tw"],tags:{amenity:"bank",brand:"華南商業銀行","brand:en":"Hua Nan Commercial Bank","brand:wikidata":"Q11620043","brand:wikipedia":"zh:華南銀行",name:"華南商業銀行","name:en":"Hua Nan Commercial Bank"}},"amenity/bank|遠東國際商業銀行":{countryCodes:["tw"],tags:{amenity:"bank",brand:"遠東國際商業銀行","brand:en":"Far Eastern International Bank","brand:wikidata":"Q15911143","brand:wikipedia":"zh:遠東國際商業銀行",name:"遠東國際商業銀行","name:en":"Far Eastern International Bank"}},"amenity/bank|陽信商業銀行":{countryCodes:["tw"],tags:{amenity:"bank",brand:"陽信商業銀行","brand:en":"Sunny Commercial Bank","brand:wikidata":"Q11658759","brand:wikipedia":"zh:陽信商業銀行",name:"陽信商業銀行","name:en":"Sunny Commercial Bank"}},"amenity/bank|静岡銀行":{countryCodes:["jp"],tags:{amenity:"bank",brand:"静岡銀行","brand:en":"Shizuoka Bank","brand:wikidata":"Q7499501","brand:wikipedia":"en:Shizuoka Bank",name:"静岡銀行","name:en":"Shizuoka Bank"}},"amenity/bank|국민은행":{countryCodes:["kr"],matchNames:["국민은행 (gungmin bank)"],tags:{amenity:"bank",brand:"국민은행","brand:en":"KB Kookmin Bank","brand:ko":"국민은행","brand:wikidata":"Q496606","brand:wikipedia":"en:KB Financial Group Inc",name:"국민은행","name:en":"KB Kookmin Bank","name:ko":"국민은행"}},"amenity/bank|기업은행":{countryCodes:["kr"],tags:{amenity:"bank",brand:"기업은행","brand:en":"Industrial Bank of Korea","brand:ko":"기업은행","brand:wikidata":"Q483855","brand:wikipedia":"en:Industrial Bank of Korea",name:"기업은행","name:en":"Industrial Bank of Korea","name:ko":"기업은행"}},"amenity/bank|농협":{countryCodes:["kr"],matchNames:["nh농협은행"],tags:{amenity:"bank",brand:"농협","brand:en":"NH","brand:ko":"농협","brand:wikidata":"Q15283673","brand:wikipedia":"ko:NH농협은행",name:"농협","name:en":"NH","name:ko":"농협"}},"amenity/bank|새마을금고":{countryCodes:["kr"],tags:{amenity:"bank",brand:"새마을금고","brand:ko":"새마을금고","brand:wikidata":"Q12600614","brand:wikipedia":"ko:새마을금고",name:"새마을금고","name:ko":"새마을금고"}},"amenity/bank|신한은행":{countryCodes:["kr"],matchNames:["신한은행 (sinhan bank)"],tags:{amenity:"bank",brand:"신한은행","brand:en":"Sinhan Bank","brand:ko":"신한은행","brand:wikidata":"Q487230","brand:wikipedia":"en:Shinhan Bank",name:"신한은행","name:en":"Sinhan Bank","name:ko":"신한은행"}},"amenity/bank|우리은행":{countryCodes:["kr"],matchNames:["우리은행 (uri bank)"],tags:{amenity:"bank",brand:"우리은행","brand:en":"Woori Bank","brand:ko":"우리은행","brand:wikidata":"Q494369","brand:wikipedia":"en:Woori Bank",name:"우리은행","name:en":"Woori Bank","name:ko":"우리은행"}},"amenity/bank|하나은행":{countryCodes:["kr"],tags:{amenity:"bank",brand:"하나은행","brand:en":"Korea Exchange Bank","brand:ko":"하나은행","brand:wikidata":"Q484047","brand:wikipedia":"en:Korea Exchange Bank",name:"하나은행","name:en":"Korea Exchange Bank","name:ko":"하나은행"}},"amenity/bicycle_rental|Call a Bike":{countryCodes:["de"],tags:{amenity:"bicycle_rental",brand:"Call a Bike","brand:wikidata":"Q1060525","brand:wikipedia":"en:Call a Bike",name:"Call a Bike"}},"amenity/bicycle_rental|Grid":{countryCodes:["us"],tags:{amenity:"bicycle_rental",brand:"Grid","brand:wikidata":"Q62104168",name:"Grid"}},"amenity/bicycle_rental|MiBici":{countryCodes:["mx"],tags:{amenity:"bicycle_rental",brand:"MiBici","brand:wikidata":"Q60966987","brand:wikipedia":"es:MiBici",name:"MiBici"}},"amenity/bicycle_rental|NextBike":{tags:{amenity:"bicycle_rental",brand:"NextBike",name:"NextBike"}},"amenity/bicycle_rental|Swapfiets":{countryCodes:["be","de","dk","nl"],tags:{amenity:"bicycle_rental",brand:"Swapfiets","brand:wikidata":"Q62104374",name:"Swapfiets"}},"amenity/bicycle_rental|metropolradruhr":{countryCodes:["de"],tags:{amenity:"bicycle_rental",brand:"metropolradruhr","brand:wikidata":"Q62104274",name:"metropolradruhr",operator:"nextbike","operator:wikidata":"Q2351279","operator:wikipedia":"en:Nextbike"}},"amenity/bureau_de_change|Abitab":{countryCodes:["uy"],tags:{amenity:"bureau_de_change",brand:"Abitab","brand:wikidata":"Q16488129","brand:wikipedia":"es:Abitab",name:"Abitab"}},"amenity/bureau_de_change|CADECA":{countryCodes:["cu"],tags:{amenity:"bureau_de_change",brand:"CADECA","brand:wikidata":"Q62122716",name:"CADECA"}},"amenity/bureau_de_change|Money Exchange":{tags:{amenity:"bureau_de_change",brand:"Money Exchange",name:"Money Exchange"}},"amenity/bureau_de_change|Travelex":{tags:{amenity:"bureau_de_change",brand:"Travelex","brand:wikidata":"Q2337964","brand:wikipedia":"en:Travelex",name:"Travelex"}},"amenity/cafe|85度C":{tags:{amenity:"cafe",brand:"85度C","brand:en":"85C Bakery Cafe","brand:wikidata":"Q4644852","brand:wikipedia":"en:85C Bakery Cafe",cuisine:"coffee_shop",name:"85度C","name:en":"85C Bakery Cafe",takeaway:"yes"}},"amenity/cafe|Barista":{countryCodes:["in","lk","mv","np"],tags:{amenity:"cafe",brand:"Barista","brand:wikidata":"Q644735","brand:wikipedia":"en:Barista (company)",cuisine:"coffee_shop",name:"Barista",takeaway:"yes"}},"amenity/cafe|Bonafide":{countryCodes:["ar","cl"],tags:{amenity:"cafe",brand:"Bonafide","brand:wikidata":"Q62122746",cuisine:"coffee_shop",name:"Bonafide",takeaway:"yes"}},"amenity/cafe|Cafe Coffee Day":{tags:{amenity:"cafe",brand:"Cafe Coffee Day","brand:wikidata":"Q5017235","brand:wikipedia":"en:Café Coffee Day",cuisine:"coffee_shop",name:"Cafe Coffee Day",takeaway:"yes"}},"amenity/cafe|Caffè Nero":{matchNames:["cafe nero"],tags:{amenity:"cafe",brand:"Caffè Nero","brand:wikidata":"Q675808","brand:wikipedia":"en:Caffè Nero",cuisine:"coffee_shop",name:"Caffè Nero",takeaway:"yes"}},"amenity/cafe|Café Amazon":{tags:{amenity:"cafe",brand:"Café Amazon","brand:wikidata":"Q43247503","brand:wikipedia":"en:Café Amazon",cuisine:"coffee_shop",name:"Café Amazon",takeaway:"yes"}},"amenity/cafe|Café Martínez":{countryCodes:["ar"],tags:{amenity:"cafe",brand:"Café Martínez","brand:wikidata":"Q16540032","brand:wikipedia":"es:Café Martínez",cuisine:"coffee_shop",name:"Café Martínez",takeaway:"yes"}},"amenity/cafe|Café de Paris":{tags:{amenity:"cafe",brand:"Café de Paris",cuisine:"coffee_shop",name:"Café de Paris",takeaway:"yes"}},"amenity/cafe|Cappuccino":{tags:{amenity:"cafe",brand:"Cappuccino",cuisine:"coffee_shop",name:"Cappuccino",takeaway:"yes"}},"amenity/cafe|Caribou Coffee":{tags:{amenity:"cafe",brand:"Caribou Coffee","brand:wikidata":"Q5039494","brand:wikipedia":"en:Caribou Coffee",cuisine:"coffee_shop",name:"Caribou Coffee",takeaway:"yes"}},"amenity/cafe|Chatime":{tags:{amenity:"cafe",brand:"Chatime","brand:wikidata":"Q16829306","brand:wikipedia":"en:Chatime",cuisine:"coffee_shop",name:"Chatime",takeaway:"yes"}},"amenity/cafe|Coffee Bean":{tags:{amenity:"cafe",brand:"Coffee Bean",cuisine:"coffee_shop",name:"Coffee Bean",takeaway:"yes"}},"amenity/cafe|Coffee Culture":{tags:{amenity:"cafe",brand:"Coffee Culture",cuisine:"coffee_shop",name:"Coffee Culture",takeaway:"yes"}},"amenity/cafe|Coffee Fellows":{tags:{amenity:"cafe",brand:"Coffee Fellows","brand:wikidata":"Q23461429","brand:wikipedia":"en:Coffee Fellows",cuisine:"coffee_shop",name:"Coffee Fellows",takeaway:"yes"}},"amenity/cafe|Coffee House~(Finland)":{countryCodes:["fi"],nomatch:["amenity/cafe|The Coffee House~(Vietnam)"],tags:{amenity:"cafe",brand:"Coffee House","brand:wikidata":"Q11855430","brand:wikipedia":"fi:Coffee House",cuisine:"coffee_shop",name:"Coffee House",takeaway:"yes"}},"amenity/cafe|Coffee Island":{tags:{amenity:"cafe",brand:"Coffee Island","brand:wikidata":"Q60867333","brand:wikipedia":"en:Coffee Island",cuisine:"coffee_shop",name:"Coffee Island",takeaway:"yes"}},"amenity/cafe|Coffee Time":{tags:{amenity:"cafe",brand:"Coffee Time","brand:wikidata":"Q5140932","brand:wikipedia":"en:Coffee Time",cuisine:"coffee_shop",name:"Coffee Time",takeaway:"yes"}},"amenity/cafe|Costa":{matchNames:["costa coffee"],tags:{amenity:"cafe",brand:"Costa","brand:wikidata":"Q608845","brand:wikipedia":"en:Costa Coffee",cuisine:"coffee_shop",name:"Costa",takeaway:"yes"}},"amenity/cafe|Country Style":{tags:{amenity:"cafe",brand:"Country Style","brand:wikidata":"Q5177435","brand:wikipedia":"en:Country Style",cuisine:"coffee_shop",name:"Country Style",takeaway:"yes"}},"amenity/cafe|Cộng Cà Phê":{countryCodes:["kr","vn"],matchNames:["cong"],tags:{amenity:"cafe",brand:"Cộng Cà Phê","brand:wikidata":"Q63864181",cuisine:"coffee_shop;vietnamese",name:"Cộng Cà Phê","name:vi":"Cộng Cà Phê",takeaway:"yes"}},"amenity/cafe|Dolce Vita":{tags:{amenity:"cafe",brand:"Dolce Vita",cuisine:"coffee_shop",name:"Dolce Vita",takeaway:"yes"}},"amenity/cafe|Dutch Bros. Coffee":{countryCodes:["us"],matchNames:["dutch bros","dutch brothers"],tags:{amenity:"cafe",brand:"Dutch Bros. Coffee","brand:wikidata":"Q5317253","brand:wikipedia":"en:Dutch Bros. Coffee",cuisine:"coffee_shop",name:"Dutch Bros. Coffee",takeaway:"only"}},"amenity/cafe|Espresso House":{countryCodes:["dk","fi","no","se"],tags:{amenity:"cafe",brand:"Espresso House","brand:wikidata":"Q10489162","brand:wikipedia":"en:Espresso House",cuisine:"coffee_shop",name:"Espresso House",takeaway:"yes"}},"amenity/cafe|Fran's Café":{countryCodes:["br"],tags:{amenity:"cafe",brand:"Fran's Café","brand:website":"http://www.franscafe.com.br","brand:wikidata":"Q62075645",cuisine:"coffee_shop",name:"Fran's Café",takeaway:"yes"}},"amenity/cafe|Havanna":{tags:{amenity:"cafe",brand:"Havanna","brand:wikidata":"Q2900869","brand:wikipedia":"es:Havanna",cuisine:"coffee_shop",name:"Havanna",takeaway:"yes"}},"amenity/cafe|Highlands Coffee":{countryCodes:["vn"],matchNames:["highlands"],tags:{amenity:"cafe",brand:"Highlands Coffee","brand:wikidata":"Q5759361","brand:wikipedia":"vi:Highlands Coffee",cuisine:"coffee_shop;vietnamese",name:"Highlands Coffee","name:en":"Highlands Coffee",takeaway:"yes"}},"amenity/cafe|Insomnia":{tags:{amenity:"cafe",brand:"Insomnia","brand:wikidata":"Q6038271","brand:wikipedia":"en:Insomnia Coffee Company",cuisine:"coffee_shop",name:"Insomnia",takeaway:"yes"}},"amenity/cafe|Joe & The Juice":{tags:{amenity:"cafe",brand:"Joe & The Juice","brand:wikidata":"Q26221514","brand:wikipedia":"en:Joe & The Juice",cuisine:"coffee_shop",name:"Joe & The Juice",takeaway:"yes"}},"amenity/cafe|Le Pain Quotidien":{tags:{amenity:"cafe",brand:"Le Pain Quotidien","brand:wikidata":"Q2046903","brand:wikipedia":"en:Le Pain Quotidien",cuisine:"coffee_shop",name:"Le Pain Quotidien",takeaway:"yes"}},"amenity/cafe|Mado":{tags:{amenity:"cafe",brand:"Mado","brand:wikidata":"Q17116336","brand:wikipedia":"en:Mado (food company)",cuisine:"coffee_shop",name:"Mado",takeaway:"yes"}},"amenity/cafe|McCafé":{tags:{amenity:"cafe",brand:"McCafé","brand:wikidata":"Q3114287","brand:wikipedia":"en:McCafé",cuisine:"coffee_shop",name:"McCafé","operator:wikidata":"Q38076","operator:wikipedia":"en:McDonald's",takeaway:"yes"}},"amenity/cafe|Mikel":{tags:{amenity:"cafe",brand:"Mikel",cuisine:"coffee_shop",name:"Mikel",takeaway:"yes"}},"amenity/cafe|Patisserie Valerie":{countryCodes:["gb"],tags:{amenity:"cafe",brand:"Patisserie Valerie","brand:wikidata":"Q22101966","brand:wikipedia":"en:Patisserie Valerie",cuisine:"coffee_shop",name:"Patisserie Valerie",takeaway:"yes"}},"amenity/cafe|Peet's Coffee":{countryCodes:["us"],matchNames:["peets","peets coffee & tea","peets coffee and tea"],tags:{amenity:"cafe",brand:"Peet's Coffee","brand:wikidata":"Q1094101","brand:wikipedia":"en:Peet's Coffee",cuisine:"coffee_shop",name:"Peet's Coffee",takeaway:"yes"}},"amenity/cafe|Prime":{countryCodes:["ru"],tags:{amenity:"cafe",brand:"Prime","brand:wikidata":"Q62122839",cuisine:"coffee_shop",name:"Prime",takeaway:"yes"}},"amenity/cafe|Pronto":{countryCodes:["jp"],matchNames:["プロント"],nomatch:["shop/convenience|Coop Pronto"],tags:{amenity:"cafe",brand:"Pronto","brand:wikidata":"Q11336224","brand:wikipedia":"ja:プロントコーポレーション",cuisine:"coffee_shop",name:"Pronto","name:ja":"プロント",takeaway:"yes"}},"amenity/cafe|Pumpkin":{countryCodes:["gb"],matchNames:["pumpkin cafe","pumpkin cafe shop"],tags:{amenity:"cafe",brand:"Pumpkin","brand:wikidata":"Q27825961","brand:wikipedia":"en:Pumpkin Café Shop",cuisine:"coffee_shop",name:"Pumpkin",takeaway:"yes"}},"amenity/cafe|Second Cup":{tags:{amenity:"cafe",brand:"Second Cup","brand:wikidata":"Q862180","brand:wikipedia":"en:Second Cup",cuisine:"coffee_shop",name:"Second Cup",takeaway:"yes"}},"amenity/cafe|Segafredo":{tags:{amenity:"cafe",brand:"Segafredo","brand:wikidata":"Q21282762","brand:wikipedia":"it:Segafredo Zanetti",cuisine:"coffee_shop",name:"Segafredo",takeaway:"yes"}},"amenity/cafe|Starbucks":{matchNames:["starbucks coffee"],tags:{amenity:"cafe",brand:"Starbucks","brand:wikidata":"Q37158","brand:wikipedia":"en:Starbucks",cuisine:"coffee_shop",name:"Starbucks",takeaway:"yes"}},"amenity/cafe|The Coffee Bean & Tea Leaf":{tags:{amenity:"cafe",brand:"The Coffee Bean & Tea Leaf","brand:wikidata":"Q1141384","brand:wikipedia":"en:The Coffee Bean & Tea Leaf",cuisine:"coffee_shop",name:"The Coffee Bean & Tea Leaf",takeaway:"yes"}},"amenity/cafe|The Coffee Club":{tags:{amenity:"cafe",brand:"The Coffee Club","brand:wikidata":"Q7726599","brand:wikipedia":"en:The Coffee Club",cuisine:"coffee_shop",name:"The Coffee Club",takeaway:"yes"}},"amenity/cafe|The Coffee House~(Vietnam)":{countryCodes:["vn"],matchNames:["coffee house"],nomatch:["amenity/cafe|Coffee House~(Finland)"],tags:{amenity:"cafe",brand:"The Coffee House","brand:wikidata":"Q60775742","brand:wikipedia":"en:The Coffee House (coffeehouse chain)",cuisine:"coffee_shop;vietnamese",name:"The Coffee House","name:en":"The Coffee House",takeaway:"yes"}},"amenity/cafe|Tim Hortons":{tags:{amenity:"cafe",brand:"Tim Hortons","brand:wikidata":"Q175106","brand:wikipedia":"en:Tim Hortons",cuisine:"coffee_shop",name:"Tim Hortons",takeaway:"yes"}},"amenity/cafe|Traveler's Coffee":{tags:{amenity:"cafe",brand:"Traveler's Coffee","brand:wikidata":"Q4051716","brand:wikipedia":"ru:Traveler’s Coffee",cuisine:"coffee_shop",name:"Traveler's Coffee",takeaway:"yes"}},"amenity/cafe|Trung Nguyên Coffee":{countryCodes:["vn"],matchNames:["trung nguyen"],tags:{amenity:"cafe",brand:"Trung Nguyên","brand:wikidata":"Q3541154","brand:wikipedia":"vi:Trung Nguyên (công ty)",cuisine:"coffee_shop;vietnamese",name:"Trung Nguyên Coffee","name:en":"Trung Nguyen Coffee","name:vi":"Cà phê Trung Nguyên",takeaway:"yes"}},"amenity/cafe|Wayne's Coffee":{tags:{amenity:"cafe",brand:"Wayne's Coffee","brand:wikidata":"Q2637272","brand:wikipedia":"en:Wayne's Coffee",cuisine:"coffee_shop",name:"Wayne's Coffee",takeaway:"yes"}},"amenity/cafe|Wild Bean Cafe":{tags:{amenity:"cafe",brand:"Wild Bean Cafe","brand:wikidata":"Q61804826",cuisine:"coffee_shop",name:"Wild Bean Cafe",takeaway:"yes"}},"amenity/cafe|Берёзка":{tags:{amenity:"cafe",brand:"Берёзка",cuisine:"coffee_shop",name:"Берёзка",takeaway:"yes"}},"amenity/cafe|Виктория":{tags:{amenity:"cafe",brand:"Виктория",cuisine:"coffee_shop",name:"Виктория",takeaway:"yes"}},"amenity/cafe|Гурман":{tags:{amenity:"cafe",brand:"Гурман",cuisine:"coffee_shop",name:"Гурман",takeaway:"yes"}},"amenity/cafe|Даблби":{countryCodes:["ru"],tags:{amenity:"cafe",brand:"Даблби","brand:en":"Double B","brand:wikidata":"Q62501686",cuisine:"coffee_shop",name:"Даблби","name:en":"Double B",takeaway:"yes"}},"amenity/cafe|Лакомка":{tags:{amenity:"cafe",brand:"Лакомка",cuisine:"coffee_shop",name:"Лакомка",takeaway:"yes"}},"amenity/cafe|Оазис":{tags:{amenity:"cafe",brand:"Оазис","brand:en":"Oasis",cuisine:"coffee_shop",name:"Оазис","name:en":"Oasis",takeaway:"yes"}},"amenity/cafe|Сказка":{tags:{amenity:"cafe",brand:"Сказка",cuisine:"coffee_shop",name:"Сказка",takeaway:"yes"}},"amenity/cafe|Смак":{tags:{amenity:"cafe",brand:"Смак","brand:en":"Taste",cuisine:"coffee_shop",name:"Смак","name:en":"Taste",takeaway:"yes"}},"amenity/cafe|Старбакс":{tags:{amenity:"cafe",brand:"Старбакс","brand:en":"Starbucks","brand:wikidata":"Q37158","brand:wikipedia":"en:Starbucks",cuisine:"coffee_shop",name:"Старбакс","name:en":"Starbucks",takeaway:"yes"}},"amenity/cafe|Транзит":{tags:{amenity:"cafe",brand:"Транзит",cuisine:"coffee_shop",name:"Транзит",takeaway:"yes"}},"amenity/cafe|Фортуна":{tags:{amenity:"cafe",brand:"Фортуна",cuisine:"coffee_shop",name:"Фортуна",takeaway:"yes"}},"amenity/cafe|Хуторок":{tags:{amenity:"cafe",brand:"Хуторок",cuisine:"coffee_shop",name:"Хуторок",takeaway:"yes"}},"amenity/cafe|Шоколадница":{countryCodes:["ru"],matchNames:["шоколад"],tags:{amenity:"cafe",brand:"Шоколадница","brand:en":"Chocolate","brand:wikidata":"Q30891188","brand:wikipedia":"ru:Шоколадница (сеть кофеен)",cuisine:"coffee_shop",name:"Шоколадница","name:en":"Chocolate",takeaway:"yes"}},"amenity/cafe|Штолле":{countryCodes:["by","ru","ua"],tags:{amenity:"cafe",brand:"Штолле","brand:en":"Stolle","brand:wikidata":"Q62502236",cuisine:"coffee_shop",name:"Штолле","name:en":"Stolle",takeaway:"yes"}},"amenity/cafe|ארומה":{countryCodes:["il"],tags:{amenity:"cafe",brand:"ארומה","brand:en":"Aroma Espresso Bar","brand:he":"ארומה","brand:wikidata":"Q2909872","brand:wikipedia":"en:Aroma Espresso Bar",cuisine:"coffee_shop",name:"ארומה","name:en":"Aroma Espresso Bar","name:he":"ארומה",takeaway:"yes"}},"amenity/cafe|คาเฟ่ อเมซอน":{countryCodes:["th"],tags:{amenity:"cafe",brand:"คาเฟ่ อเมซอน","brand:en":"Café Amazon","brand:th":"คาเฟ่ อเมซอน","brand:wikidata":"Q43247503","brand:wikipedia":"en:Café Amazon",cuisine:"coffee_shop",name:"คาเฟ่ อเมซอน","name:en":"Café Amazon","name:th":"คาเฟ่ อเมซอน",takeaway:"yes"}},"amenity/cafe|エクセルシオール カフェ":{countryCodes:["jp"],tags:{amenity:"cafe",brand:"エクセルシオール カフェ","brand:en":"EXCELSIOR CAFFÉ","brand:ja":"エクセルシオール カフェ","brand:wikidata":"Q11289828","brand:wikipedia":"ja:エクセルシオール カフェ",cuisine:"coffee_shop",name:"エクセルシオール カフェ","name:ja":"エクセルシオール カフェ",takeaway:"yes"}},"amenity/cafe|カフェ・ド・クリエ":{countryCodes:["jp"],tags:{amenity:"cafe",brand:"カフェ・ド・クリエ","brand:en":"Cafe de CRIE","brand:ja":"カフェ・ド・クリエ","brand:wikidata":"Q17219077","brand:wikipedia":"ja:ポッカクリエイト",cuisine:"coffee_shop",name:"カフェ・ド・クリエ","name:en":"Cafe de CRIE","name:ja":"カフェ・ド・クリエ",takeaway:"yes"}},"amenity/cafe|カフェ・ベローチェ":{countryCodes:["jp"],tags:{amenity:"cafe",brand:"カフェ・ベローチェ","brand:en":"CAFFÈ VELOCE","brand:ja":"カフェ・ベローチェ","brand:wikidata":"Q11294597","brand:wikipedia":"ja:カフェ・ベローチェ",cuisine:"coffee_shop",name:"カフェ・ベローチェ","name:en":"CAFFÈ VELOCE","name:ja":"カフェ・ベローチェ",takeaway:"yes"}},"amenity/cafe|コメダ珈琲店":{countryCodes:["jp"],tags:{amenity:"cafe",brand:"コメダ珈琲店","brand:en":"Komeda Coffee Shop","brand:ja":"コメダ珈琲店","brand:wikidata":"Q11302679","brand:wikipedia":"ja:コメダ",cuisine:"coffee_shop",name:"コメダ珈琲店","name:en":"Komeda Coffee Shop","name:ja":"コメダ珈琲店",takeaway:"yes"}},"amenity/cafe|サンマルクカフェ":{countryCodes:["jp"],tags:{amenity:"cafe",brand:"サンマルクカフェ","brand:en":"ST.MARC CAFÉ","brand:ja":"サンマルクカフェ","brand:wikidata":"Q11305989","brand:wikipedia":"ja:サンマルクホールディングス",cuisine:"coffee_shop",name:"サンマルクカフェ","name:en":"ST.MARC CAFÉ","name:ja":"サンマルクカフェ",takeaway:"yes"}},"amenity/cafe|スターバックス":{countryCodes:["jp"],tags:{amenity:"cafe",brand:"スターバックス","brand:en":"Starbucks","brand:ja":"スターバックス","brand:wikidata":"Q37158","brand:wikipedia":"ja:スターバックス",cuisine:"coffee_shop",name:"スターバックス","name:en":"Starbucks","name:ja":"スターバックス",takeaway:"yes"}},"amenity/cafe|スターバックスコーヒー":{countryCodes:["jp"],tags:{amenity:"cafe",brand:"スターバックスコーヒー","brand:ja":"スターバックスコーヒー",cuisine:"coffee_shop",name:"スターバックスコーヒー","name:ja":"スターバックスコーヒー",takeaway:"yes"}},"amenity/cafe|タリーズコーヒー":{countryCodes:["jp"],tags:{amenity:"cafe",brand:"タリーズコーヒー","brand:en":"Tully's Coffee","brand:ja":"タリーズコーヒー","brand:wikidata":"Q3541983","brand:wikipedia":"en:Tully's Coffee",cuisine:"coffee_shop",name:"タリーズコーヒー","name:en":"Tully's Coffee","name:ja":"タリーズコーヒー",takeaway:"yes"}},"amenity/cafe|ドトールコーヒーショップ":{countryCodes:["jp"],tags:{amenity:"cafe",brand:"ドトールコーヒーショップ","brand:en":"Doutor","brand:ja":"ドトールコーヒーショップ","brand:wikidata":"Q11322732","brand:wikipedia":"ja:ドトールコーヒーショップ",cuisine:"coffee_shop",name:"ドトールコーヒーショップ","name:en":"Doutor Coffee Shop","name:ja":"ドトールコーヒーショップ",takeaway:"yes"}},"amenity/cafe|星巴克":{countryCodes:["cn","tw"],tags:{amenity:"cafe",brand:"星巴克","brand:en":"Starbucks","brand:wikidata":"Q37158","brand:wikipedia":"zh:星巴克","brand:zh":"星巴克",cuisine:"coffee_shop",name:"星巴克","name:en":"Starbucks","name:zh":"星巴克",takeaway:"yes"}},"amenity/cafe|珈琲館":{countryCodes:["jp"],tags:{amenity:"cafe",brand:"珈琲館","brand:en":"Kohikan","brand:ja":"珈琲館","brand:wikidata":"Q11573290","brand:wikipedia":"ja:珈琲館",cuisine:"coffee_shop",name:"珈琲館","name:en":"Kohikan","name:ja":"珈琲館",takeaway:"yes"}},"amenity/cafe|스타벅스":{countryCodes:["kr"],tags:{amenity:"cafe",brand:"스타벅스","brand:en":"Starbucks","brand:ko":"스타벅스","brand:wikidata":"Q37158","brand:wikipedia":"ko:스타벅스",cuisine:"coffee_shop",name:"스타벅스","name:en":"Starbucks","name:ko":"스타벅스",takeaway:"yes"}},"amenity/car_rental|Alamo":{tags:{amenity:"car_rental",brand:"Alamo","brand:wikidata":"Q1429287","brand:wikipedia":"en:Alamo Rent a Car",name:"Alamo"}},"amenity/car_rental|Avis":{tags:{amenity:"car_rental",brand:"Avis","brand:wikidata":"Q791136","brand:wikipedia":"en:Avis Car Rental",name:"Avis"}},"amenity/car_rental|Budget":{tags:{amenity:"car_rental",brand:"Budget","brand:wikidata":"Q1001437","brand:wikipedia":"en:Budget Rent a Car",name:"Budget"}},"amenity/car_rental|Dollar":{tags:{amenity:"car_rental",brand:"Dollar","brand:wikidata":"Q1235661","brand:wikipedia":"en:Dollar Rent A Car",name:"Dollar"}},"amenity/car_rental|Enterprise":{matchNames:["enterprise rent-a-car"],tags:{amenity:"car_rental",brand:"Enterprise","brand:wikidata":"Q17085454","brand:wikipedia":"en:Enterprise Rent-A-Car",name:"Enterprise"}},"amenity/car_rental|Europcar":{tags:{amenity:"car_rental",brand:"Europcar","brand:wikidata":"Q1376256","brand:wikipedia":"en:Europcar",name:"Europcar"}},"amenity/car_rental|Hertz":{tags:{amenity:"car_rental",brand:"Hertz","brand:wikidata":"Q1543874","brand:wikipedia":"en:The Hertz Corporation",name:"Hertz"}},"amenity/car_rental|Localiza":{tags:{amenity:"car_rental",brand:"Localiza","brand:wikidata":"Q10319490","brand:wikipedia":"en:Localiza",name:"Localiza"}},"amenity/car_rental|National":{nomatch:["amenity/bank|National Bank"],tags:{amenity:"car_rental",brand:"National",name:"National"}},"amenity/car_rental|Sixt":{tags:{amenity:"car_rental",brand:"Sixt","brand:wikidata":"Q705664","brand:wikipedia":"en:Sixt",name:"Sixt"}},"amenity/car_rental|Thrifty":{tags:{amenity:"car_rental",brand:"Thrifty","brand:wikidata":"Q2429546","brand:wikipedia":"en:Thrifty Car Rental",name:"Thrifty"}},"amenity/car_rental|U-Haul":{tags:{amenity:"car_rental",brand:"U-Haul","brand:wikidata":"Q7862902","brand:wikipedia":"en:U-Haul",name:"U-Haul"}},"amenity/car_rental|オリックスレンタカー":{countryCodes:["jp"],tags:{amenity:"car_rental",brand:"オリックスレンタカー","brand:en":"ORIX Car Rental","brand:ja":"オリックスレンタカー","brand:wikidata":"Q11123021","brand:wikipedia":"ja:オリックスレンタカー",name:"オリックスレンタカー","name:en":"ORIX Car Rental","name:ja":"オリックスレンタカー"}},"amenity/car_rental|トヨタレンタカー":{countryCodes:["jp"],matchNames:["トヨタレンタリース"],tags:{amenity:"car_rental",brand:"トヨタレンタカー","brand:en":"Toyota Rental Car","brand:ja":"トヨタレンタカー","brand:wikidata":"Q11321580","brand:wikipedia":"ja:トヨタレンタリース",name:"トヨタレンタカー","name:en":"Toyota Rental Car","name:ja":"トヨタレンタカー"}},"amenity/car_rental|ニッポンレンタカー":{countryCodes:["jp"],tags:{amenity:"car_rental",brand:"ニッポンレンタカー","brand:en":"Nippon Car Rental","brand:ja":"ニッポンレンタカー","brand:wikidata":"Q11086533","brand:wikipedia":"ja:ニッポンレンタカー",name:"ニッポンレンタカー","name:en":"Nippon Car Rental","name:ja":"ニッポンレンタカー"}},"amenity/car_rental|日産レンタカー":{countryCodes:["jp"],tags:{amenity:"car_rental",brand:"日産レンタカー","brand:en":"Nissan Car Rental","brand:ja":"日産レンタカー","brand:wikidata":"Q11086838","brand:wikipedia":"ja:日産レンタカー",name:"日産レンタカー","name:en":"Nissan Car Rental","name:ja":"日産レンタカー"}},"amenity/car_sharing|Bluely":{countryCodes:["fr"],matchNames:["station bluely"],tags:{amenity:"car_sharing",brand:"Bluely","brand:wikidata":"Q16039715","brand:wikipedia":"fr:Bluely",name:"Bluely"}},"amenity/car_sharing|Enterprise Car Club":{countryCodes:["gb"],matchNames:["city car club"],tags:{amenity:"car_sharing",brand:"Enterprise Car Club","brand:wikidata":"Q5123055","brand:wikipedia":"en:Enterprise Car Club",name:"Enterprise Car Club"}},"amenity/car_sharing|Zipcar":{tags:{amenity:"car_sharing",brand:"Zipcar","brand:wikidata":"Q1069924","brand:wikipedia":"en:Zipcar",name:"Zipcar"}},"amenity/car_sharing|stadtmobil":{countryCodes:["de"],matchNames:["stadtmobil carsharing-station"],tags:{amenity:"car_sharing",brand:"stadtmobil","brand:wikidata":"Q2327629","brand:wikipedia":"en:Stadtmobil",name:"stadtmobil"}},"amenity/charging_station|Blink":{tags:{amenity:"charging_station",brand:"Blink","brand:wikidata":"Q62065645",name:"Blink"}},"amenity/charging_station|ChargePoint":{tags:{amenity:"charging_station",brand:"ChargePoint","brand:wikidata":"Q5176149","brand:wikipedia":"en:ChargePoint",name:"ChargePoint"}},"amenity/charging_station|E-WALD":{matchNames:["e-wald ladestation"],tags:{amenity:"charging_station",brand:"E-WALD","brand:wikidata":"Q61804335",name:"E-WALD"}},"amenity/charging_station|Enel":{countryCodes:["it"],matchNames:["enel - stazione di ricarica"],tags:{amenity:"charging_station",brand:"Enel","brand:wikidata":"Q651222","brand:wikipedia":"en:Enel",name:"Enel"}},"amenity/charging_station|Tesla Supercharger":{tags:{amenity:"charging_station",brand:"Tesla Supercharger","brand:wikidata":"Q17089620","brand:wikipedia":"en:Tesla Supercharger",name:"Tesla Supercharger"}},"amenity/charging_station|bike-energy Ladestation":{tags:{amenity:"charging_station",brand:"bike-energy Ladestation",name:"bike-energy Ladestation"}},"amenity/charging_station|eVgo":{tags:{amenity:"charging_station",brand:"eVgo","brand:wikidata":"Q61803820",name:"eVgo","operator:wikidata":"Q6955139","operator:wikipedia":"en:NRG Energy"}},"amenity/cinema|109シネマズ":{countryCodes:["jp"],tags:{amenity:"cinema",brand:"109シネマズ","brand:en":"109 Cinemas","brand:ja":"109シネマズ","brand:wikidata":"Q10854269","brand:wikipedia":"ja:109シネマズ",name:"109シネマズ","name:en":"109 Cinemas","name:ja":"109シネマズ",operator:"株式会社 東急レクリエーション","operator:en":"Tokyu Recreation Co., Ltd.","operator:wikidata":"Q11527011","operator:wikipedia":"ja:東急レクリエーション"}},"amenity/cinema|AMC":{tags:{amenity:"cinema",brand:"AMC","brand:wikidata":"Q294721","brand:wikipedia":"en:AMC Theatres",name:"AMC"}},"amenity/cinema|CineStar":{countryCodes:["de"],tags:{amenity:"cinema",brand:"CineStar","brand:wikidata":"Q321889","brand:wikipedia":"de:Cinestar",name:"CineStar"}},"amenity/cinema|Cinema City":{tags:{amenity:"cinema",brand:"Cinema City","brand:wikidata":"Q543651","brand:wikipedia":"en:Cinema City International",name:"Cinema City"}},"amenity/cinema|Cinemark":{tags:{amenity:"cinema",brand:"Cinemark","brand:wikidata":"Q707530","brand:wikipedia":"en:Cinemark Theatres",name:"Cinemark"}},"amenity/cinema|Cinemex":{tags:{amenity:"cinema",brand:"Cinemex","brand:wikidata":"Q3333072","brand:wikipedia":"en:Cinemex",name:"Cinemex"}},"amenity/cinema|Cineplanet":{tags:{amenity:"cinema",brand:"Cineplanet","brand:wikidata":"Q5769680","brand:wikipedia":"es:Cineplanet",name:"Cineplanet",operator:"Grupo Intercorp","operator:wikidata":"Q23008916","operator:wikipedia":"es:Intercorp"}},"amenity/cinema|Cineplexx":{tags:{amenity:"cinema",brand:"Cineplexx","brand:wikidata":"Q873340","brand:wikipedia":"en:Cineplexx Cinemas",name:"Cineplexx"}},"amenity/cinema|Cinepolis":{tags:{amenity:"cinema",brand:"Cinepolis","brand:wikidata":"Q5686673","brand:wikipedia":"en:Cinépolis",name:"Cinepolis"}},"amenity/cinema|Cineworld":{tags:{amenity:"cinema",brand:"Cineworld","brand:wikidata":"Q5120901","brand:wikipedia":"en:Cineworld",name:"Cineworld"}},"amenity/cinema|MOVIX":{countryCodes:["jp"],tags:{amenity:"cinema",brand:"MOVIX","brand:wikidata":"Q11532184","brand:wikipedia":"ja:松竹マルチプレックスシアターズ",name:"MOVIX",official_name:"松竹マルチプレックスシアターズ","official_name:en":"Shochiku Multiplex Theatres",operator:"株式会社松竹マルチプレックスシアターズ","operator:en":"Shochiku Multiplex Theatres, Ltd."}},"amenity/cinema|Multikino":{countryCodes:["pl"],tags:{amenity:"cinema",brand:"Multikino","brand:wikidata":"Q1144802","brand:wikipedia":"pl:Multikino",name:"Multikino"}},"amenity/cinema|Odeon":{tags:{amenity:"cinema",brand:"Odeon","brand:wikidata":"Q6127470","brand:wikipedia":"en:Odeon Cinemas",name:"Odeon"}},"amenity/cinema|TOHOシネマズ":{countryCodes:["jp"],tags:{amenity:"cinema",brand:"TOHOシネマズ","brand:en":"TOHO CINEMAS","brand:ja":"TOHOシネマズ","brand:wikidata":"Q11235261","brand:wikipedia":"ja:TOHOシネマズ",name:"TOHOシネマズ","name:en":"Toho Cinemas","name:ja":"TOHOシネマズ",operator:"TOHOシネマズ株式会社","operator:en":"TOHO CINEMAS LTD."}},"amenity/cinema|Vue":{countryCodes:["de","dk","gb","ie","it","lt","lv","nl","tw"],matchNames:["vue cinema"],tags:{amenity:"cinema",brand:"Vue International","brand:wikidata":"Q2535134","brand:wikipedia":"en:Vue Cinemas",name:"Vue"}},"amenity/cinema|イオンシネマ":{countryCodes:["jp"],tags:{amenity:"cinema",brand:"イオンシネマ","brand:en":"AEON Cinema","brand:ja":"イオンシネマ","brand:wikidata":"Q17192792","brand:wikipedia":"ja:イオンエンターテイメント",name:"イオンシネマ","name:en":"AEON Cinema","name:ja":"イオンシネマ",operator:"イオンエンターテイメント株式会社","operator:en":"Aeon Entertainment Co., Ltd."}},"amenity/cinema|ユナイテッド・シネマ":{countryCodes:["jp"],tags:{amenity:"cinema",brand:"ユナイテッド・シネマ","brand:en":"United Cinemas","brand:ja":"ユナイテッド・シネマ","brand:wikidata":"Q11345629","brand:wikipedia":"ja:ユナイテッド・シネマ",name:"ユナイテッド・シネマ","name:en":"United Cinemas","name:ja":"ユナイテッド・シネマ",operator:"ユナイテッド・シネマ株式会社","operator:en":"UNITED CINEMAS CO., LTD."}},"amenity/clinic|DaVita Dialysis":{countryCodes:["us"],matchNames:["davita","davita kidney care"],tags:{amenity:"clinic",brand:"DaVita Dialysis","brand:wikidata":"Q5207184",healthcare:"dialysis","healthcare:speciality":"dialysis",name:"DaVita Dialysis"}},"amenity/clinic|Dialysis Clinic":{countryCodes:["us"],matchNames:["dci","dialysis clinic inc"],tags:{amenity:"clinic",brand:"Dialysis Clinic","brand:wikidata":"Q5207184","brand:wikipedia":"en:Dialysis Clinic, Inc.",healthcare:"dialysis","healthcare:speciality":"dialysis",name:"Dialysis Clinic",short_name:"DCI"}},"amenity/clinic|Fresenius Kidney Care":{tags:{amenity:"clinic",brand:"Fresenius Kidney Care","brand:wikidata":"Q650259","brand:wikipedia":"en:Fresenius Medical Care",healthcare:"dialysis","healthcare:speciality":"dialysis",name:"Fresenius Kidney Care"}},"amenity/clinic|Fresenius Medical Care":{countryCodes:["us"],tags:{amenity:"clinic",brand:"Fresenius Medical Care","brand:wikidata":"Q650259","brand:wikipedia":"en:Fresenius Medical Care",healthcare:"dialysis","healthcare:speciality":"dialysis",name:"Fresenius Medical Care"}},"amenity/clinic|Satellite Healthcare":{countryCodes:["us"],matchNames:["satellite","satellite dialysis"],tags:{amenity:"clinic",brand:"Satellite Healthcare","brand:wikidata":"Q50039787",healthcare:"dialysis","healthcare:speciality":"dialysis",name:"Satellite Healthcare"}},"amenity/dentist|Aspen Dental":{countryCodes:["us"],matchTags:["healthcare/dentist"],tags:{amenity:"dentist",brand:"Aspen Dental","brand:wikidata":"Q4807808","brand:wikipedia":"en:Aspen Dental",healthcare:"dentist",name:"Aspen Dental"}},"amenity/dentist|Dentix":{tags:{amenity:"dentist",brand:"Dentix",name:"Dentix"}},"amenity/dentist|Gentle Dental":{tags:{amenity:"dentist",brand:"Gentle Dental",name:"Gentle Dental"}},"amenity/dentist|Vitaldent":{tags:{amenity:"dentist",brand:"Vitaldent",name:"Vitaldent"}},"amenity/fast_food|A&W~(Canada)":{countryCodes:["ca"],nomatch:["amenity/fast_food|A&W~(USA)"],tags:{amenity:"fast_food",brand:"A&W","brand:wikidata":"Q2818848","brand:wikipedia":"en:A&W (Canada)",cuisine:"burger",name:"A&W",takeaway:"yes"}},"amenity/fast_food|A&W~(USA)":{countryCodes:["us"],nomatch:["amenity/fast_food|A&W~(Canada)"],tags:{amenity:"fast_food",brand:"A&W","brand:wikidata":"Q277641","brand:wikipedia":"en:A&W Restaurants",cuisine:"burger",name:"A&W",takeaway:"yes"}},"amenity/fast_food|Andok's":{countryCodes:["ph"],tags:{amenity:"fast_food",brand:"Andok's","brand:wikidata":"Q62267166",cuisine:"chicken",name:"Andok's",takeaway:"yes"}},"amenity/fast_food|Angel's Burger":{countryCodes:["ph"],tags:{amenity:"fast_food",brand:"Angel's Burger","brand:wikidata":"Q62267228",cuisine:"burger",name:"Angel's Burger",takeaway:"yes"}},"amenity/fast_food|Arby's":{tags:{amenity:"fast_food",brand:"Arby's","brand:wikidata":"Q630866","brand:wikipedia":"en:Arby's",cuisine:"sandwich",name:"Arby's",takeaway:"yes"}},"amenity/fast_food|Au Bon Pain":{countryCodes:["in","th","us"],tags:{amenity:"fast_food",brand:"Au Bon Pain","brand:wikidata":"Q4818942","brand:wikipedia":"en:Au Bon Pain",cuisine:"sandwich",name:"Au Bon Pain",takeaway:"yes"}},"amenity/fast_food|Auntie Anne's":{matchTags:["shop/bakery"],tags:{amenity:"fast_food",brand:"Auntie Anne's","brand:wikidata":"Q4822010","brand:wikipedia":"en:Auntie Anne's",cuisine:"pretzel",name:"Auntie Anne's",takeaway:"yes"}},"amenity/fast_food|Baja Fresh":{tags:{amenity:"fast_food",brand:"Baja Fresh","brand:wikidata":"Q2880019","brand:wikipedia":"en:Baja Fresh",cuisine:"mexican",name:"Baja Fresh",takeaway:"yes"}},"amenity/fast_food|Bembos":{countryCodes:["pe"],tags:{amenity:"fast_food",brand:"Bembos","brand:wikidata":"Q466971","brand:wikipedia":"en:Bembos",cuisine:"burger",name:"Bembos",takeaway:"yes"}},"amenity/fast_food|Bob's":{countryCodes:["ao","br","cl","pt"],tags:{amenity:"fast_food",brand:"Bob's","brand:wikidata":"Q1392113","brand:wikipedia":"en:Bob's",cuisine:"burger",name:"Bob's",takeaway:"yes"}},"amenity/fast_food|Bojangles'":{countryCodes:["us"],tags:{amenity:"fast_food",brand:"Bojangles'","brand:wikidata":"Q891163","brand:wikipedia":"en:Bojangles' Famous Chicken 'n Biscuits",cuisine:"chicken",name:"Bojangles'",official_name:"Bojangles' Famous Chicken 'n Biscuits",takeaway:"yes"}},"amenity/fast_food|Booster Juice":{tags:{amenity:"fast_food",brand:"Booster Juice","brand:wikidata":"Q4943796","brand:wikipedia":"en:Booster Juice",cuisine:"juice",name:"Booster Juice",takeaway:"yes"}},"amenity/fast_food|Boston Market":{tags:{amenity:"fast_food",brand:"Boston Market","brand:wikidata":"Q603617","brand:wikipedia":"en:Boston Market",cuisine:"american",name:"Boston Market",takeaway:"yes"}},"amenity/fast_food|Braum's":{countryCodes:["us"],matchTags:["shop/dairy"],tags:{amenity:"fast_food",brand:"Braum's","brand:wikidata":"Q4958263","brand:wikipedia":"en:Braum's",cuisine:"ice_cream",name:"Braum's",shop:"dairy",takeaway:"yes"}},"amenity/fast_food|Bruegger's Bagels":{countryCodes:["us"],matchNames:["breuger's","breugger's","bruegger's","bruger's","brugger's"],tags:{amenity:"fast_food",brand:"Bruegger's Bagels","brand:wikidata":"Q4978656","brand:wikipedia":"en:Bruegger's",cuisine:"bagel",name:"Bruegger's Bagels",takeaway:"yes"}},"amenity/fast_food|Burger King":{matchNames:["burguer king"],tags:{amenity:"fast_food",brand:"Burger King","brand:wikidata":"Q177054","brand:wikipedia":"en:Burger King",cuisine:"burger",name:"Burger King",takeaway:"yes"}},"amenity/fast_food|Burger Machine":{countryCodes:["ph"],tags:{amenity:"fast_food",brand:"Burger Machine","brand:wikidata":"Q4998549","brand:wikipedia":"en:Burger Machine",cuisine:"burger",name:"Burger Machine",takeaway:"yes"}},"amenity/fast_food|BurgerFi":{countryCodes:["us"],tags:{amenity:"fast_food",brand:"BurgerFi","brand:wikidata":"Q39045496","brand:wikipedia":"en:BurgerFi",cuisine:"burger",name:"BurgerFi",takeaway:"yes"}},"amenity/fast_food|Captain D's":{countryCodes:["us"],tags:{amenity:"fast_food",brand:"Captain D's","brand:wikidata":"Q5036616","brand:wikipedia":"en:Captain D's",cuisine:"seafood",name:"Captain D's",takeaway:"yes"}},"amenity/fast_food|Carl's Jr.":{tags:{amenity:"fast_food",brand:"Carl's Jr.","brand:wikidata":"Q1043486","brand:wikipedia":"en:Carl's Jr.",cuisine:"burger",name:"Carl's Jr.",takeaway:"yes"}},"amenity/fast_food|Charleys Philly Steaks":{countryCodes:["us"],matchNames:["charleys"],tags:{amenity:"fast_food",brand:"Charleys Philly Steaks","brand:wikidata":"Q1066777","brand:wikipedia":"en:Charleys Philly Steaks",cuisine:"sandwich",name:"Charleys Philly Steaks",takeaway:"yes"}},"amenity/fast_food|Checkers":{nomatch:["shop/supermarket|Checkers"],tags:{amenity:"fast_food",brand:"Checkers","brand:wikidata":"Q63919315",cuisine:"burger",name:"Checkers",takeaway:"yes"}},"amenity/fast_food|Chick-fil-A":{tags:{amenity:"fast_food",brand:"Chick-fil-A","brand:wikidata":"Q491516","brand:wikipedia":"en:Chick-fil-A",cuisine:"chicken",name:"Chick-fil-A",takeaway:"yes"}},"amenity/fast_food|Chicken Express":{tags:{amenity:"fast_food",brand:"Chicken Express","brand:wikidata":"Q5096235","brand:wikipedia":"en:Chicken Express",cuisine:"chicken",name:"Chicken Express",takeaway:"yes"}},"amenity/fast_food|China Wok":{tags:{amenity:"fast_food",brand:"China Wok","brand:wikidata":"Q5766542","brand:wikipedia":"es:China Wok",cuisine:"chinese",name:"China Wok",takeaway:"yes"}},"amenity/fast_food|Chipotle":{matchNames:["chipotle mexican grill"],tags:{amenity:"fast_food",brand:"Chipotle","brand:wikidata":"Q465751","brand:wikipedia":"en:Chipotle Mexican Grill",cuisine:"mexican",name:"Chipotle",official_name:"Chipotle Mexican Grill",takeaway:"yes"}},"amenity/fast_food|Chopt":{countryCodes:["us"],tags:{amenity:"fast_food",brand:"Chopt","brand:wikidata":"Q17509305","brand:wikipedia":"en:Chopt",cuisine:"salad",name:"Chopt",takeaway:"yes"}},"amenity/fast_food|Chowking":{tags:{amenity:"fast_food",brand:"Chowking","brand:wikidata":"Q1076816","brand:wikipedia":"en:Chowking",cuisine:"asian",name:"Chowking",takeaway:"yes"}},"amenity/fast_food|Church's Chicken":{tags:{amenity:"fast_food",brand:"Church's Chicken","brand:wikidata":"Q1089932","brand:wikipedia":"en:Church's Chicken",cuisine:"chicken",name:"Church's Chicken",takeaway:"yes"}},"amenity/fast_food|Cinnabon":{matchTags:["shop/bakery","shop/confectionery","shop/pastry"],tags:{amenity:"fast_food",brand:"Cinnabon","brand:website":"https://www.cinnabon.com/","brand:wikidata":"Q1092539","brand:wikipedia":"en:Cinnabon",cuisine:"dessert",name:"Cinnabon",takeaway:"yes"}},"amenity/fast_food|CoCo壱番屋":{countryCodes:["cn","jp"],tags:{amenity:"fast_food",brand:"CoCo壱番屋","brand:en":"Ichibanya","brand:wikidata":"Q5986105","brand:wikipedia":"en:Ichibanya",cuisine:"japanese",name:"CoCo壱番屋","name:en":"Ichibanya",takeaway:"yes"}},"amenity/fast_food|Cofix":{tags:{amenity:"fast_food",brand:"Cofix",name:"Cofix",takeaway:"yes"}},"amenity/fast_food|Cook Out":{countryCodes:["us"],tags:{amenity:"fast_food",brand:"Cook Out","brand:wikidata":"Q5166992","brand:wikipedia":"en:Cook Out (restaurant)",cuisine:"american",name:"Cook Out",takeaway:"yes"}},"amenity/fast_food|Culver's":{tags:{amenity:"fast_food",brand:"Culver's","brand:wikidata":"Q1143589","brand:wikipedia":"en:Culver's",cuisine:"burger",name:"Culver's",takeaway:"yes"}},"amenity/fast_food|DQ Grill & Chill":{nomatch:["amenity/fast_food|Dairy Queen"],tags:{amenity:"fast_food",brand:"DQ Grill & Chill","brand:wikidata":"Q1141226","brand:wikipedia":"en:Dairy Queen",cuisine:"ice_cream;burger",name:"DQ Grill & Chill",takeaway:"yes"}},"amenity/fast_food|Dairy Queen":{matchNames:["dq"],nomatch:["amenity/fast_food|DQ Grill & Chill"],tags:{amenity:"fast_food",brand:"Dairy Queen","brand:wikidata":"Q1141226","brand:wikipedia":"en:Dairy Queen",cuisine:"ice_cream;burger",name:"Dairy Queen",takeaway:"yes"}},"amenity/fast_food|Daylight Donuts":{countryCodes:["us"],tags:{amenity:"fast_food",brand:"Daylight Donuts","brand:wikidata":"Q48970508","brand:wikipedia":"en:Daylight Donuts",cuisine:"donut",name:"Daylight Donuts",takeaway:"yes"}},"amenity/fast_food|Del Taco":{tags:{amenity:"fast_food",brand:"Del Taco","brand:wikidata":"Q1183818","brand:wikipedia":"en:Del Taco",cuisine:"mexican",name:"Del Taco",takeaway:"yes"}},"amenity/fast_food|Dig Inn":{countryCodes:["us"],tags:{amenity:"fast_food",brand:"Dig Inn","brand:wikidata":"Q28226241","brand:wikipedia":"en:Dig Inn",cuisine:"regional",name:"Dig Inn",takeaway:"yes"}},"amenity/fast_food|Domino's Pizza":{matchNames:["dominos"],tags:{amenity:"fast_food",brand:"Domino's Pizza","brand:wikidata":"Q839466","brand:wikipedia":"en:Domino's Pizza",cuisine:"pizza",name:"Domino's Pizza",takeaway:"yes"}},"amenity/fast_food|Dunkin' Donuts":{matchNames:["dunkin doughnuts"],matchTags:["shop/bakery"],tags:{amenity:"fast_food",brand:"Dunkin' Donuts","brand:wikidata":"Q847743","brand:wikipedia":"en:Dunkin' Donuts",cuisine:"donut;coffee",name:"Dunkin' Donuts",takeaway:"yes"}},"amenity/fast_food|Einstein Bros. Bagels":{countryCodes:["us"],matchNames:["einstein bros","einstein brothers","einstein brothers bagels"],tags:{amenity:"fast_food",brand:"Einstein Bros. Bagels","brand:wikidata":"Q5349788","brand:wikipedia":"en:Einstein Bros. Bagels",cuisine:"bagel",name:"Einstein Bros. Bagels",takeaway:"yes"}},"amenity/fast_food|El Pollo Loco":{tags:{amenity:"fast_food",brand:"El Pollo Loco","brand:wikidata":"Q2353849","brand:wikipedia":"en:El Pollo Loco",cuisine:"mexican",name:"El Pollo Loco",takeaway:"yes"}},"amenity/fast_food|Everest":{countryCodes:["gr"],tags:{amenity:"fast_food",brand:"Everest","brand:wikidata":"Q62273299",cuisine:"burger",name:"Everest",takeaway:"yes"}},"amenity/fast_food|Extreme Pita":{tags:{amenity:"fast_food",brand:"Extreme Pita","brand:wikidata":"Q5422367","brand:wikipedia":"en:Extreme Pita",cuisine:"pita",name:"Extreme Pita",takeaway:"yes"}},"amenity/fast_food|Fazoli's":{tags:{amenity:"fast_food",brand:"Fazoli's","brand:wikidata":"Q1399195","brand:wikipedia":"en:Fazoli's",cuisine:"italian",name:"Fazoli's",takeaway:"yes"}},"amenity/fast_food|Firehouse Subs":{tags:{amenity:"fast_food",brand:"Firehouse Subs","brand:wikidata":"Q5451873","brand:wikipedia":"en:Firehouse Subs",cuisine:"sandwich",name:"Firehouse Subs",takeaway:"yes"}},"amenity/fast_food|Five Guys":{matchNames:["five guys burgers and fries"],tags:{amenity:"fast_food",brand:"Five Guys","brand:wikidata":"Q1131810","brand:wikipedia":"en:Five Guys",cuisine:"burger",name:"Five Guys",official_name:"Five Guys Burgers and Fries",takeaway:"yes"}},"amenity/fast_food|Freddy's":{matchNames:["freddy's frozen custard & steakburgers"],tags:{amenity:"fast_food",brand:"Freddy's","brand:wikidata":"Q5496837","brand:wikipedia":"en:Freddy's Frozen Custard & Steakburgers",cuisine:"ice_cream;burger",name:"Freddy's",takeaway:"yes"}},"amenity/fast_food|Freebirds":{countryCodes:["us"],tags:{amenity:"fast_food",brand:"Freebirds","brand:wikidata":"Q5500367","brand:wikipedia":"en:Freebirds World Burrito",cuisine:"mexican",name:"Freebirds",takeaway:"yes"}},"amenity/fast_food|Gabriel Pizza":{countryCodes:["ca"],tags:{amenity:"fast_food",brand:"Gabriel Pizza","brand:wikidata":"Q5515791","brand:wikipedia":"en:Gabriel Pizza",cuisine:"pizza",name:"Gabriel Pizza",takeaway:"yes"}},"amenity/fast_food|Gino's Pizza":{tags:{amenity:"fast_food",brand:"Gino's Pizza",cuisine:"pizza",name:"Gino's Pizza",takeaway:"yes"}},"amenity/fast_food|Gold Star Chili":{countryCodes:["us"],matchNames:["gold star"],tags:{alt_name:"Gold Star",amenity:"fast_food",brand:"Gold Star Chili","brand:wikidata":"Q16994254","brand:wikipedia":"en:Gold Star Chili",cuisine:"chili",name:"Gold Star Chili",takeaway:"yes"}},"amenity/fast_food|Golden Krust Caribbean Bakery & Grill":{countryCodes:["ca","us"],tags:{amenity:"fast_food",brand:"Golden Krust Caribbean Bakery & Grill","brand:wikidata":"Q5579615","brand:wikipedia":"en:Golden Krust Caribbean Bakery & Grill",cuisine:"caribbean",name:"Golden Krust",takeaway:"yes"}},"amenity/fast_food|Greenwich":{tags:{amenity:"fast_food",brand:"Greenwich","brand:wikidata":"Q2691308","brand:wikipedia":"en:Greenwich Pizza",cuisine:"pizza",name:"Greenwich",takeaway:"yes"}},"amenity/fast_food|Habib's":{countryCodes:["br","mx"],tags:{amenity:"fast_food",brand:"Habib's","brand:wikidata":"Q2504930","brand:wikipedia":"en:Habib's",cuisine:"middle_eastern",name:"Habib's",takeaway:"yes"}},"amenity/fast_food|Hallo Pizza":{countryCodes:["de"],tags:{amenity:"fast_food",brand:"Hallo Pizza","brand:wikidata":"Q1571798","brand:wikipedia":"de:Hallo Pizza",cuisine:"pizza",name:"Hallo Pizza",takeaway:"yes"}},"amenity/fast_food|Hardee's":{tags:{amenity:"fast_food",brand:"Hardee's","brand:wikidata":"Q1585088","brand:wikipedia":"en:Hardee's",cuisine:"burger",name:"Hardee's",takeaway:"yes"}},"amenity/fast_food|Harvey's":{countryCodes:["ca"],nomatch:["shop/furniture|Harveys"],tags:{amenity:"fast_food",brand:"Harvey's","brand:wikidata":"Q1466184","brand:wikipedia":"en:Harvey's",cuisine:"burger",name:"Harvey's",takeaway:"yes"}},"amenity/fast_food|Hesburger":{tags:{amenity:"fast_food",brand:"Hesburger","brand:wikidata":"Q1276832","brand:wikipedia":"en:Hesburger",cuisine:"burger",name:"Hesburger",takeaway:"yes"}},"amenity/fast_food|Hot Dog on a Stick":{countryCodes:["us"],tags:{amenity:"fast_food",brand:"Hot Dog on a Stick","brand:wikidata":"Q5909922","brand:wikipedia":"en:Hot Dog on a Stick",cuisine:"hot_dog",name:"Hot Dog on a Stick",takeaway:"yes"}},"amenity/fast_food|Hot Head Burritos":{countryCodes:["us"],matchNames:["hot head"],tags:{amenity:"fast_food",brand:"Hot Head Burritos","brand:wikidata":"Q5910008","brand:wikipedia":"en:Hot Head Burritos",cuisine:"mexican",name:"Hot Head Burritos",takeaway:"yes"}},"amenity/fast_food|Hungry Howie's":{countryCodes:["us"],matchNames:["hungry howies pizza"],tags:{amenity:"fast_food",brand:"Hungry Howie's","brand:wikidata":"Q16985303","brand:wikipedia":"en:Hungry Howie's Pizza",cuisine:"pizza",name:"Hungry Howie's",takeaway:"yes"}},"amenity/fast_food|Hungry Jacks":{countryCodes:["au"],tags:{amenity:"fast_food",brand:"Hungry Jacks","brand:wikidata":"Q3036373","brand:wikipedia":"en:Hungry Jack's",cuisine:"burger",name:"Hungry Jacks",takeaway:"yes"}},"amenity/fast_food|In-N-Out Burger":{tags:{amenity:"fast_food",brand:"In-N-Out Burger","brand:wikidata":"Q1205312","brand:wikipedia":"en:In-N-Out Burger",cuisine:"burger",name:"In-N-Out Burger",takeaway:"yes"}},"amenity/fast_food|Jack in the Box":{tags:{amenity:"fast_food",brand:"Jack in the Box","brand:wikidata":"Q1538507","brand:wikipedia":"en:Jack in the Box",cuisine:"burger",name:"Jack in the Box",takeaway:"yes"}},"amenity/fast_food|Jamba Juice":{tags:{amenity:"fast_food",brand:"Jamba Juice","brand:wikidata":"Q3088784","brand:wikipedia":"en:Jamba Juice",cuisine:"juice",name:"Jamba Juice",takeaway:"yes"}},"amenity/fast_food|Jersey Mike's Subs":{matchNames:["jersey mikes"],tags:{amenity:"fast_food",brand:"Jersey Mike's Subs","brand:wikidata":"Q6184897","brand:wikipedia":"en:Jersey Mike's Subs",cuisine:"sandwich",name:"Jersey Mike's Subs",takeaway:"yes"}},"amenity/fast_food|Jimmy John's":{tags:{amenity:"fast_food",brand:"Jimmy John's","brand:wikidata":"Q1689380","brand:wikipedia":"en:Jimmy John's",cuisine:"sandwich",name:"Jimmy John's",takeaway:"yes"}},"amenity/fast_food|Jollibee":{tags:{amenity:"fast_food",brand:"Jollibee","brand:wikidata":"Q37614","brand:wikipedia":"en:Jollibee",cuisine:"burger",name:"Jollibee",takeaway:"yes"}},"amenity/fast_food|Just Salad":{countryCodes:["us"],tags:{amenity:"fast_food",brand:"Just Salad","brand:wikidata":"Q23091823","brand:wikipedia":"en:Just Salad",cuisine:"salad",name:"Just Salad",takeaway:"yes"}},"amenity/fast_food|KFC":{matchNames:["kentucky fried chicken"],tags:{amenity:"fast_food",brand:"KFC","brand:wikidata":"Q524757","brand:wikipedia":"en:KFC",cuisine:"chicken",name:"KFC",takeaway:"yes"}},"amenity/fast_food|Kochlöffel":{countryCodes:["de","pl","tr"],tags:{amenity:"fast_food",brand:"Kochlöffel","brand:wikidata":"Q315539","brand:wikipedia":"en:Kochlöffel",cuisine:"burger",name:"Kochlöffel",takeaway:"yes"}},"amenity/fast_food|Kotipizza":{tags:{amenity:"fast_food",brand:"Kotipizza","brand:wikidata":"Q1628625","brand:wikipedia":"en:Kotipizza",cuisine:"pizza",name:"Kotipizza",takeaway:"yes"}},"amenity/fast_food|Krispy Kreme":{tags:{amenity:"fast_food",brand:"Krispy Kreme","brand:wikidata":"Q1192805","brand:wikipedia":"en:Krispy Kreme",cuisine:"donut",name:"Krispy Kreme",takeaway:"yes"}},"amenity/fast_food|Krystal":{countryCodes:["us"],tags:{amenity:"fast_food",brand:"Krystal","brand:wikidata":"Q472195","brand:wikipedia":"en:Krystal (restaurant)",cuisine:"burger",name:"Krystal",takeaway:"yes"}},"amenity/fast_food|L&L Drive-Inn~(Hawaii)":{countryCodes:["us"],matchNames:["l&l","l&l drive-in"],tags:{amenity:"fast_food",brand:"L&L Drive-Inn","brand:wikidata":"Q6455441","brand:wikipedia":"en:L&L Hawaiian Barbecue",cuisine:"hawaiian",name:"L&L Drive-Inn",takeaway:"yes"}},"amenity/fast_food|L&L Hawaiian Barbecue":{matchNames:["l&l","l&l hawaiian bbq"],tags:{amenity:"fast_food",brand:"L&L Hawaiian Barbecue","brand:wikidata":"Q6455441","brand:wikipedia":"en:L&L Hawaiian Barbecue",cuisine:"hawaiian",name:"L&L Hawaiian Barbecue",takeaway:"yes"}},"amenity/fast_food|Lee's Sandwiches":{countryCodes:["us"],tags:{amenity:"fast_food",brand:"Lee's Sandwiches","brand:wikidata":"Q6512823","brand:wikipedia":"en:Lee's Sandwiches",cuisine:"vietnamese;sandwich",name:"Lee's Sandwiches",takeaway:"yes"}},"amenity/fast_food|Little Caesars":{matchNames:["little caesars pizza"],tags:{amenity:"fast_food",brand:"Little Caesars","brand:wikidata":"Q1393809","brand:wikipedia":"en:Little Caesars",cuisine:"pizza",name:"Little Caesars",takeaway:"yes"}},"amenity/fast_food|Long John Silver's":{tags:{amenity:"fast_food",brand:"Long John Silver's","brand:wikidata":"Q1535221","brand:wikipedia":"en:Long John Silver's",cuisine:"seafood",name:"Long John Silver's",takeaway:"yes"}},"amenity/fast_food|Lotteria":{tags:{amenity:"fast_food",brand:"Lotteria","brand:wikidata":"Q249525","brand:wikipedia":"en:Lotteria",cuisine:"burger",name:"Lotteria",takeaway:"yes"}},"amenity/fast_food|Manchu Wok":{countryCodes:["ca","us"],tags:{amenity:"fast_food",brand:"Manchu Wok","brand:wikidata":"Q6747622","brand:wikipedia":"en:Manchu Wok",cuisine:"chinese",name:"Manchu Wok",takeaway:"yes"}},"amenity/fast_food|Mang Inasal":{countryCodes:["ph"],tags:{amenity:"fast_food",brand:"Mang Inasal","brand:wikidata":"Q6748573","brand:wikipedia":"en:Mang Inasal",cuisine:"barbecue",name:"Mang Inasal",takeaway:"yes"}},"amenity/fast_food|Marmaris":{tags:{amenity:"fast_food",brand:"Marmaris",name:"Marmaris",takeaway:"yes"}},"amenity/fast_food|Max":{tags:{amenity:"fast_food",brand:"Max","brand:wikidata":"Q1912172","brand:wikipedia":"en:Max Hamburgers",cuisine:"burger",name:"Max",takeaway:"yes"}},"amenity/fast_food|McDonald's":{tags:{amenity:"fast_food",brand:"McDonald's","brand:wikidata":"Q38076","brand:wikipedia":"en:McDonald's",cuisine:"burger",name:"McDonald's",takeaway:"yes"}},"amenity/fast_food|Mighty Taco":{countryCodes:["us"],tags:{amenity:"fast_food",brand:"Mighty Taco","brand:wikidata":"Q6844210","brand:wikipedia":"en:Mighty Taco",cuisine:"mexican",name:"Mighty Taco",takeaway:"yes"}},"amenity/fast_food|Minute Burger":{countryCodes:["ph"],tags:{amenity:"fast_food",brand:"Minute Burger","brand:wikidata":"Q62273503",cuisine:"burger",name:"Minute Burger",takeaway:"yes"}},"amenity/fast_food|Moe's Southwest Grill":{tags:{amenity:"fast_food",brand:"Moe's Southwest Grill","brand:wikidata":"Q6889938","brand:wikipedia":"en:Moe's Southwest Grill",cuisine:"mexican",name:"Moe's Southwest Grill",takeaway:"yes"}},"amenity/fast_food|Mr. Sub":{tags:{amenity:"fast_food",brand:"Mr. Sub","brand:wikidata":"Q6929225","brand:wikipedia":"en:Mr. Sub",cuisine:"sandwich",name:"Mr. Sub",takeaway:"yes"}},"amenity/fast_food|New York Pizza":{countryCodes:["nl"],tags:{amenity:"fast_food",brand:"New York Pizza","brand:wikidata":"Q2639128","brand:wikipedia":"nl:New York Pizza",cuisine:"pizza",name:"New York Pizza",takeaway:"yes"}},"amenity/fast_food|Nordsee":{tags:{amenity:"fast_food",brand:"Nordsee","brand:wikidata":"Q74866","brand:wikipedia":"en:Nordsee",cuisine:"seafood",name:"Nordsee",takeaway:"yes"}},"amenity/fast_food|Num Pang":{countryCodes:["us"],tags:{amenity:"fast_food",brand:"Num Pang","brand:wikidata":"Q62079702","brand:wikipedia":"en:Num Pang",cuisine:"cambodian, sandwich",name:"Num Pang",takeaway:"yes"}},"amenity/fast_food|O'Tacos":{tags:{amenity:"fast_food",brand:"O'Tacos","brand:wikidata":"Q28494040","brand:wikipedia":"en:O'Tacos",cuisine:"mexican",name:"O'Tacos",takeaway:"yes"}},"amenity/fast_food|Oporto":{tags:{amenity:"fast_food",brand:"Oporto","brand:wikidata":"Q4412342","brand:wikipedia":"en:Oporto (restaurant)",name:"Oporto",takeaway:"yes"}},"amenity/fast_food|Pal's":{countryCodes:["us"],matchNames:["pals sudden service"],tags:{amenity:"fast_food",brand:"Pal's","brand:wikidata":"Q7126094","brand:wikipedia":"en:Pal's",cuisine:"burger",name:"Pal's",takeaway:"yes"}},"amenity/fast_food|Panago":{countryCodes:["ca"],tags:{amenity:"fast_food",brand:"Panago","brand:wikidata":"Q17111672","brand:wikipedia":"en:Panago",cuisine:"pizza",name:"Panago",takeaway:"yes"}},"amenity/fast_food|Panda Express":{matchNames:["panda"],tags:{amenity:"fast_food",brand:"Panda Express","brand:wikidata":"Q1358690","brand:wikipedia":"en:Panda Express",cuisine:"chinese",name:"Panda Express",takeaway:"yes"}},"amenity/fast_food|Panera Bread":{tags:{amenity:"fast_food",brand:"Panera Bread","brand:wikidata":"Q7130852","brand:wikipedia":"en:Panera Bread",cuisine:"sandwich",name:"Panera Bread",takeaway:"yes"}},"amenity/fast_food|Papa John's":{matchNames:["papa john","papa john pizza","papa johns pizza"],tags:{amenity:"fast_food",brand:"Papa John's","brand:wikidata":"Q2759586","brand:wikipedia":"en:Papa John's Pizza",cuisine:"pizza",name:"Papa John's",takeaway:"yes"}},"amenity/fast_food|Papa Murphy's":{matchNames:["papa murphy","papa murphy pizza","papa murphys pizza"],tags:{amenity:"fast_food",brand:"Papa Murphy's","brand:wikidata":"Q7132349","brand:wikipedia":"en:Papa Murphy's",cuisine:"pizza",name:"Papa Murphy's",official_name:"Papa Murphy's Take 'N' Bake Pizza",takeaway:"only"}},"amenity/fast_food|Penn Station":{countryCodes:["us"],tags:{amenity:"fast_food",brand:"Penn Station","brand:wikidata":"Q7163311","brand:wikipedia":"en:Penn Station (restaurant)",cuisine:"sandwich",name:"Penn Station",takeaway:"yes"}},"amenity/fast_food|Philly Pretzel Factory":{countryCodes:["us"],matchNames:["philadelphia pretzel factory","philadelphia soft pretzel factory","philly soft pretzel factory"],matchTags:["shop/bakery"],tags:{amenity:"fast_food",brand:"Philly Pretzel Factory","brand:wikidata":"Q60097339",cuisine:"pretzel",name:"Philly Pretzel Factory",takeaway:"yes"}},"amenity/fast_food|Pinulito":{countryCodes:["gt"],tags:{amenity:"fast_food",brand:"Pinulito","brand:wikidata":"Q62273613",cuisine:"chicken",name:"Pinulito",takeaway:"yes"}},"amenity/fast_food|Pita Pit":{tags:{amenity:"fast_food",brand:"Pita Pit","brand:wikidata":"Q7757289","brand:wikipedia":"en:Pita Pit",cuisine:"pita",name:"Pita Pit",takeaway:"yes"}},"amenity/fast_food|Pizza Hut Delivery":{tags:{amenity:"fast_food",brand:"Pizza Hut","brand:wikidata":"Q191615","brand:wikipedia":"en:Pizza Hut",cuisine:"pizza",name:"Pizza Hut Delivery",takeaway:"yes"}},"amenity/fast_food|Pizza Hut Express":{nomatch:["amenity/restaurant|Pizza Hut"],tags:{amenity:"fast_food",brand:"Pizza Hut","brand:wikidata":"Q191615","brand:wikipedia":"en:Pizza Hut",cuisine:"pizza",name:"Pizza Hut Express",takeaway:"yes"}},"amenity/fast_food|Pizza King":{tags:{amenity:"fast_food",brand:"Pizza King",cuisine:"pizza",name:"Pizza King",takeaway:"yes"}},"amenity/fast_food|Pizza Nova":{tags:{amenity:"fast_food",brand:"Pizza Nova","brand:wikidata":"Q7199971","brand:wikipedia":"en:Pizza Nova",cuisine:"pizza",name:"Pizza Nova",takeaway:"yes"}},"amenity/fast_food|Pizza Pizza":{tags:{amenity:"fast_food",brand:"Pizza Pizza","brand:wikidata":"Q1194143","brand:wikipedia":"en:Pizza Pizza",cuisine:"pizza",name:"Pizza Pizza",takeaway:"yes"}},"amenity/fast_food|Pollo Campero":{tags:{amenity:"fast_food",brand:"Pollo Campero","brand:wikidata":"Q942741","brand:wikipedia":"en:Pollo Campero",cuisine:"chicken",name:"Pollo Campero",takeaway:"yes"}},"amenity/fast_food|Pollo Granjero~(Costa Rica)":{countryCodes:["cr"],tags:{amenity:"fast_food",brand:"Pollo Granjero","brand:wikidata":"Q62273665",cuisine:"chicken",name:"Pollo Granjero",takeaway:"yes"}},"amenity/fast_food|Pollo Granjero~(Guatemala)":{countryCodes:["gt"],tags:{amenity:"fast_food",brand:"Pollo Granjero","brand:wikidata":"Q62273652",cuisine:"chicken",name:"Pollo Granjero",takeaway:"yes"}},"amenity/fast_food|Pollo Tropical":{tags:{amenity:"fast_food",brand:"Pollo Tropical","brand:wikidata":"Q3395356","brand:wikipedia":"en:Pollo Tropical",cuisine:"chicken",name:"Pollo Tropical",takeaway:"yes"}},"amenity/fast_food|Popeyes":{matchNames:["popeyes louisiana kitchen"],tags:{amenity:"fast_food",brand:"Popeyes","brand:wikidata":"Q1330910","brand:wikipedia":"en:Popeyes",cuisine:"chicken",name:"Popeyes",official_name:"Popeyes Louisiana Kitchen",takeaway:"yes"}},"amenity/fast_food|Potbelly":{tags:{amenity:"fast_food",brand:"Potbelly","brand:wikidata":"Q7234777","brand:wikipedia":"en:Potbelly Sandwich Shop",cuisine:"sandwich",name:"Potbelly",takeaway:"yes"}},"amenity/fast_food|Pret A Manger":{tags:{amenity:"fast_food",brand:"Pret A Manger","brand:wikidata":"Q2109109","brand:wikipedia":"en:Pret a Manger",cuisine:"sandwich",name:"Pret A Manger",takeaway:"yes"}},"amenity/fast_food|Qdoba":{matchNames:["qdoba mexican grill"],tags:{amenity:"fast_food",brand:"Qdoba","brand:wikidata":"Q1363885","brand:wikipedia":"en:Qdoba",cuisine:"mexican",name:"Qdoba",official_name:"Qdoba Mexican Grill",takeaway:"yes"}},"amenity/fast_food|Quick":{tags:{amenity:"fast_food",brand:"Quick","brand:wikidata":"Q286494","brand:wikipedia":"en:Quick (restaurant)",cuisine:"burger",name:"Quick",takeaway:"yes"}},"amenity/fast_food|Quiznos":{matchNames:["quiznos sub","quiznos subs"],tags:{amenity:"fast_food",brand:"Quiznos","brand:wikidata":"Q1936229","brand:wikipedia":"en:Quiznos",cuisine:"sandwich",name:"Quiznos",takeaway:"yes"}},"amenity/fast_food|Raising Cane's":{countryCodes:["us"],matchNames:["raising canes chicken fingers"],tags:{amenity:"fast_food",brand:"Raising Cane's","brand:wikidata":"Q7285144","brand:wikipedia":"en:Raising Cane's Chicken Fingers",cuisine:"chicken",name:"Raising Cane's",official_name:"Raising Cane's Chicken Fingers",takeaway:"yes"}},"amenity/fast_food|Rally's":{tags:{amenity:"fast_food",brand:"Rally's","brand:wikidata":"Q63919323",cuisine:"burger",name:"Rally's",takeaway:"yes"}},"amenity/fast_food|Red Rooster":{countryCodes:["au"],tags:{amenity:"fast_food",brand:"Red Rooster","brand:wikidata":"Q376466","brand:wikipedia":"en:Red Rooster",cuisine:"chicken",name:"Red Rooster",takeaway:"yes"}},"amenity/fast_food|Roy Rogers":{countryCodes:["us"],tags:{amenity:"fast_food",brand:"Roy Rogers","brand:wikidata":"Q7373311","brand:wikipedia":"en:Roy Rogers Restaurants",cuisine:"burger;sandwich;chicken",name:"Roy Rogers",takeaway:"yes"}},"amenity/fast_food|Sbarro":{tags:{amenity:"fast_food",brand:"Sbarro","brand:wikidata":"Q2589409","brand:wikipedia":"en:Sbarro",cuisine:"pizza",name:"Sbarro",takeaway:"yes"}},"amenity/fast_food|Schlotzsky's":{countryCodes:["us"],matchNames:["schlotzskys deli"],tags:{amenity:"fast_food",brand:"Schlotzsky's","brand:wikidata":"Q2244796","brand:wikipedia":"en:Schlotzsky's",cuisine:"sandwich",name:"Schlotzsky's",takeaway:"yes"}},"amenity/fast_food|Shake Shack":{tags:{amenity:"fast_food",brand:"Shake Shack","brand:wikidata":"Q1058722","brand:wikipedia":"en:Shake Shack",cuisine:"burger",name:"Shake Shack",takeaway:"yes"}},"amenity/fast_food|Sibylla":{countryCodes:["fi","se"],tags:{amenity:"fast_food",brand:"Sibylla","brand:wikidata":"Q488643","brand:wikipedia":"en:Sibylla (fast food)",cuisine:"burger",name:"Sibylla",takeaway:"yes"}},"amenity/fast_food|Smashburger":{tags:{amenity:"fast_food",brand:"Smashburger","brand:wikidata":"Q17061332","brand:wikipedia":"en:Smashburger",cuisine:"burger",name:"Smashburger",takeaway:"yes"}},"amenity/fast_food|Smoothie King":{tags:{amenity:"fast_food",brand:"Smoothie King","brand:wikidata":"Q5491421","brand:wikipedia":"en:Smoothie King",cuisine:"juice",name:"Smoothie King",takeaway:"yes"}},"amenity/fast_food|Sonic":{matchNames:["sonic drive in"],nomatch:["amenity/fuel|Sonic"],tags:{amenity:"fast_food",brand:"Sonic","brand:wikidata":"Q7561808","brand:wikipedia":"en:Sonic Drive-In",cuisine:"burger",name:"Sonic",takeaway:"yes"}},"amenity/fast_food|Steak Escape":{tags:{amenity:"fast_food",brand:"Steak Escape","brand:wikidata":"Q7605235","brand:wikipedia":"en:Steak Escape",cuisine:"sandwich",name:"Steak Escape",takeaway:"yes"}},"amenity/fast_food|Steers":{tags:{amenity:"fast_food",brand:"Steers","brand:wikidata":"Q56599145","brand:wikipedia":"en:Steers",cuisine:"burger",name:"Steers",takeaway:"yes"}},"amenity/fast_food|Subway":{matchNames:["subway sandwiches"],tags:{amenity:"fast_food",brand:"Subway","brand:wikidata":"Q244457","brand:wikipedia":"en:Subway (restaurant)",cuisine:"sandwich",name:"Subway",takeaway:"yes"}},"amenity/fast_food|Supermac's":{countryCodes:["gb","ie"],tags:{amenity:"fast_food",brand:"Supermac's","brand:wikidata":"Q7643750","brand:wikipedia":"en:Supermac's",cuisine:"burger",name:"Supermac's",takeaway:"yes"}},"amenity/fast_food|TCBY":{tags:{amenity:"fast_food",brand:"TCBY","brand:wikidata":"Q7669631","brand:wikipedia":"en:TCBY",cuisine:"frozen_yogurt",name:"TCBY",takeaway:"yes"}},"amenity/fast_food|Taco Bell":{tags:{amenity:"fast_food",brand:"Taco Bell","brand:wikidata":"Q752941","brand:wikipedia":"en:Taco Bell",cuisine:"tex-mex",name:"Taco Bell",takeaway:"yes"}},"amenity/fast_food|Taco Bueno":{tags:{amenity:"fast_food",brand:"Taco Bueno","brand:wikidata":"Q7673958","brand:wikipedia":"en:Taco Bueno",cuisine:"mexican",name:"Taco Bueno",takeaway:"yes"}},"amenity/fast_food|Taco Cabana":{countryCodes:["us"],tags:{amenity:"fast_food",brand:"Taco Cabana","brand:wikidata":"Q12070488","brand:wikipedia":"en:Taco Cabana",cuisine:"mexican",name:"Taco Cabana",takeaway:"yes"}},"amenity/fast_food|Taco Del Mar":{tags:{amenity:"fast_food",brand:"Taco Del Mar","brand:wikidata":"Q7673972","brand:wikipedia":"en:Taco del Mar",cuisine:"mexican",name:"Taco Del Mar",takeaway:"yes"}},"amenity/fast_food|Taco John's":{tags:{amenity:"fast_food",brand:"Taco John's","brand:wikidata":"Q7673962","brand:wikipedia":"en:Taco John's",cuisine:"mexican",name:"Taco John's",takeaway:"yes"}},"amenity/fast_food|Taco Time":{tags:{amenity:"fast_food",brand:"Taco Time","brand:wikidata":"Q7673969","brand:wikipedia":"en:Taco Time",cuisine:"mexican",name:"Taco Time",takeaway:"yes"}},"amenity/fast_food|Ted’s Hot Dogs":{countryCodes:["us"],tags:{amenity:"fast_food",brand:"Ted’s Hot Dogs","brand:wikidata":"Q7692930","brand:wikipedia":"en:Ted's Hot Dogs",cuisine:"sausage",name:"Ted’s Hot Dogs",takeaway:"yes"}},"amenity/fast_food|Telepizza":{tags:{amenity:"fast_food",brand:"Telepizza","brand:wikidata":"Q2699863","brand:wikipedia":"en:Telepizza",cuisine:"pizza",name:"Telepizza",takeaway:"yes"}},"amenity/fast_food|Texas Chicken":{tags:{amenity:"fast_food",brand:"Texas Chicken",cuisine:"chicken",name:"Texas Chicken",takeaway:"yes"}},"amenity/fast_food|Thai Express~(Singapore)":{countryCodes:["sg"],nomatch:["amenity/fast_food|Thaï Express~(North America)"],tags:{amenity:"fast_food",brand:"Thai Express","brand:wikidata":"Q7709119","brand:wikipedia":"en:Thai Express",cuisine:"thai",name:"Thai Express",takeaway:"yes"}},"amenity/fast_food|Thaï Express~(North America)":{countryCodes:["ca","us"],matchNames:["thai express"],nomatch:["amenity/fast_food|Thai Express~(Singapore)"],tags:{amenity:"fast_food",brand:"Thaï Express","brand:wikidata":"Q7711610","brand:wikipedia":"en:Thaï Express",cuisine:"thai",name:"Thaï Express",takeaway:"yes"}},"amenity/fast_food|The Habit Burger Grill":{countryCodes:["us"],matchNames:["habit burger","the habit burger"],tags:{amenity:"fast_food",brand:"The Habit Burger Grill","brand:wikidata":"Q18158741","brand:wikipedia":"en:The Habit Burger Grill",cuisine:"burger",name:"The Habit Burger Grill",takeaway:"yes"}},"amenity/fast_food|The Pizza Company":{tags:{amenity:"fast_food",brand:"The Pizza Company","brand:wikidata":"Q2413520","brand:wikipedia":"en:The Pizza Company",cuisine:"pizza",name:"The Pizza Company",takeaway:"yes"}},"amenity/fast_food|Togo's":{countryCodes:["us"],tags:{amenity:"fast_food",brand:"Togo's","brand:wikidata":"Q3530375","brand:wikipedia":"en:Togo's",cuisine:"sandwich",name:"Togo's",takeaway:"yes"}},"amenity/fast_food|Veggie Grill":{countryCodes:["us"],tags:{amenity:"fast_food",brand:"Veggie Grill","brand:wikidata":"Q18636427","brand:wikipedia":"en:Veggie Grill",cuisine:"american","diet:vegan":"only",name:"Veggie Grill",takeaway:"yes"}},"amenity/fast_food|Wahoo's Fish Taco":{countryCodes:["us"],matchNames:["wahoo's"],tags:{amenity:"fast_food",brand:"Wahoo's Fish Taco","brand:wikidata":"Q7959827","brand:wikipedia":"en:Wahoo's Fish Taco",cuisine:"seafood",name:"Wahoo's Fish Taco",takeaway:"yes"}},"amenity/fast_food|Wendy's":{tags:{amenity:"fast_food",brand:"Wendy's","brand:wikidata":"Q550258","brand:wikipedia":"en:Wendy's",cuisine:"burger",name:"Wendy's",takeaway:"yes"}},"amenity/fast_food|Whataburger":{tags:{amenity:"fast_food",brand:"Whataburger","brand:wikidata":"Q376627","brand:wikipedia":"en:Whataburger",cuisine:"burger",name:"Whataburger",takeaway:"yes"}},"amenity/fast_food|Which Wich?":{tags:{amenity:"fast_food",brand:"Which Wich?","brand:wikidata":"Q7993556","brand:wikipedia":"en:Which Wich?",cuisine:"sandwich",name:"Which Wich?",takeaway:"yes"}},"amenity/fast_food|White Castle":{tags:{amenity:"fast_food",brand:"White Castle","brand:wikidata":"Q1244034","brand:wikipedia":"en:White Castle (restaurant)",cuisine:"burger",name:"White Castle",takeaway:"yes"}},"amenity/fast_food|Wienerschnitzel":{countryCodes:["us"],tags:{amenity:"fast_food",brand:"Wienerschnitzel","brand:wikidata":"Q324679","brand:wikipedia":"en:Wienerschnitzel",cuisine:"hot_dog",name:"Wienerschnitzel",takeaway:"yes"}},"amenity/fast_food|Wimpy":{tags:{amenity:"fast_food",brand:"Wimpy","brand:wikidata":"Q2811992","brand:wikipedia":"en:Wimpy (restaurant)",cuisine:"burger",name:"Wimpy",takeaway:"yes"}},"amenity/fast_food|Xi'an Famous Foods":{countryCodes:["us"],tags:{amenity:"fast_food",brand:"Xi'an Famous Foods","brand:wikidata":"Q8044020","brand:wikipedia":"en:Xi'an Famous Foods",cuisine:"chinese",name:"Xi'an Famous Foods",takeaway:"yes"}},"amenity/fast_food|Zaxby's":{countryCodes:["us"],tags:{amenity:"fast_food",brand:"Zaxby's","brand:wikidata":"Q8067525","brand:wikipedia":"en:Zaxby's",cuisine:"chicken",name:"Zaxby's",takeaway:"yes"}},"amenity/fast_food|immergrün":{countryCodes:["de"],matchNames:["immergün"],tags:{amenity:"fast_food",brand:"immergrün","brand:wikidata":"Q62589254",cuisine:"sandwich;salad;juice",name:"immergün",takeaway:"yes"}},"amenity/fast_food|Γρηγόρης":{countryCodes:["gr"],tags:{amenity:"fast_food",brand:"Γρηγόρης","brand:wikidata":"Q62273834",cuisine:"sandwich",name:"Γρηγόρης",takeaway:"yes"}},"amenity/fast_food|Бургер Кинг":{tags:{amenity:"fast_food",brand:"Бургер Кинг","brand:en":"Burger King","brand:wikidata":"Q177054","brand:wikipedia":"en:Burger King",cuisine:"burger",name:"Бургер Кинг","name:en":"Burger King",takeaway:"yes"}},"amenity/fast_food|Домино’c Пицца":{tags:{amenity:"fast_food",brand:"Домино’c Пицца",name:"Домино’c Пицца",takeaway:"yes"}},"amenity/fast_food|Крошка Картошка":{countryCodes:["ru"],tags:{amenity:"fast_food",brand:"Крошка Картошка","brand:wikidata":"Q4241838","brand:wikipedia":"ru:Крошка Картошка",cuisine:"potato",name:"Крошка Картошка",takeaway:"yes"}},"amenity/fast_food|Макдоналдс":{tags:{amenity:"fast_food",brand:"Макдоналдс","brand:en":"McDonald's","brand:wikidata":"Q38076","brand:wikipedia":"en:McDonald's",cuisine:"burger",name:"Макдоналдс","name:en":"McDonald's",takeaway:"yes"}},"amenity/fast_food|Папа Джонс":{tags:{amenity:"fast_food",brand:"Папа Джонс","brand:en":"Papa John's","brand:wikidata":"Q2759586","brand:wikipedia":"ru:Papa John’s",cuisine:"pizza",name:"Папа Джонс","name:en":"Papa John's",takeaway:"yes"}},"amenity/fast_food|Робин Сдобин":{countryCodes:["ru"],tags:{amenity:"fast_food",brand:"Робин Сдобин","brand:wikidata":"Q62273880",cuisine:"burger",name:"Робин Сдобин",takeaway:"yes"}},"amenity/fast_food|Русский Аппетит":{countryCodes:["ru"],tags:{amenity:"fast_food",brand:"Русский Аппетит","brand:wikidata":"Q62086063",cuisine:"sandwich;salad;regional",name:"Русский Аппетит",takeaway:"yes"}},"amenity/fast_food|Стардог!s":{countryCodes:["ru"],tags:{amenity:"fast_food",brand:"Стардог!s","brand:en":"Stardog!s","brand:wikidata":"Q4439856","brand:wikipedia":"ru:Стардогс",cuisine:"sausage",name:"Стардог!s","name:en":"Stardog!s",takeaway:"yes"}},"amenity/fast_food|Суши Wok":{countryCodes:["ru","ua"],tags:{amenity:"fast_food",brand:"Суши Wok","brand:en":"Sushi Wok","brand:wikidata":"Q25444754","brand:wikipedia":"uk:Суши Wok (мережа магазинів)",cuisine:"asian",name:"Суши Wok","name:en":"Sushi Wok",takeaway:"yes"}},"amenity/fast_food|Теремок":{matchTags:["shop/convenience"],tags:{amenity:"fast_food",brand:"Теремок","brand:en":"Teremok","brand:wikidata":"Q4455593","brand:wikipedia":"ru:Теремок (сеть быстрого питания)",cuisine:"crepe;russian",name:"Теремок","name:en":"Teremok",takeaway:"yes"}},"amenity/fast_food|מקדונלד'ס":{countryCodes:["il"],tags:{amenity:"fast_food",brand:"מקדונלד'ס","brand:en":"McDonald's","brand:he":"מקדונלד'ס","brand:wikidata":"Q12061542","brand:wikipedia":"en:McDonald's Israel",cuisine:"burger",name:"מקדונלד'ס","name:en":"McDonald's","name:he":"מקדונלד'ס",takeaway:"yes"}},"amenity/fast_food|دجاج كنتاكي":{tags:{amenity:"fast_food",brand:"دجاج كنتاكي","brand:ar":"دجاج كنتاكي","brand:en":"KFC","brand:wikidata":"Q524757","brand:wikipedia":"ar:دجاج كنتاكي",cuisine:"chicken",name:"دجاج كنتاكي","name:ar":"دجاج كنتاكي","name:en":"KFC",takeaway:"yes"}},"amenity/fast_food|ماكدونالدز":{tags:{amenity:"fast_food",brand:"ماكدونالدز","brand:ar":"ماكدونالدز","brand:en":"McDonald's","brand:wikidata":"Q38076","brand:wikipedia":"ar:ماكدونالدز",cuisine:"burger",name:"ماكدونالدز","name:ar":"ماكدونالدز","name:en":"McDonald's",takeaway:"yes"}},"amenity/fast_food|かっぱ寿司":{countryCodes:["jp"],tags:{amenity:"fast_food",brand:"かっぱ寿司","brand:en":"Kappazushi","brand:ja":"かっぱ寿司","brand:wikidata":"Q11263916","brand:wikipedia":"ja:かっぱ寿司",cuisine:"sushi",name:"かっぱ寿司","name:en":"Kappazushi","name:ja":"かっぱ寿司",takeaway:"yes"}},"amenity/fast_food|かつや":{countryCodes:["jp"],tags:{amenity:"fast_food",brand:"かつや","brand:en":"Katsuya","brand:ja":"かつや","brand:wikidata":"Q2855257","brand:wikipedia":"ja:かつや",cuisine:"fried_food",name:"かつや","name:en":"Katsuya","name:ja":"かつや","name:ko":"카쯔야","name:zh":"吉豚屋",takeaway:"yes"}},"amenity/fast_food|くら寿司":{countryCodes:["jp"],tags:{amenity:"fast_food",brand:"くら寿司","brand:en":"Kurazushi","brand:ja":"くら寿司","brand:wikidata":"Q6445491","brand:wikipedia":"ja:くら寿司",cuisine:"sushi",name:"くら寿司","name:en":"Kurazushi","name:ja":"くら寿司",takeaway:"yes"}},"amenity/fast_food|すき家":{countryCodes:["jp"],tags:{amenity:"fast_food",brand:"すき家","brand:en":"Sukiya","brand:ja":"すき家","brand:wikidata":"Q6137375","brand:wikipedia":"ja:すき家",cuisine:"beef_bowl",name:"すき家","name:en":"Sukiya","name:ja":"すき家",takeaway:"yes"}},"amenity/fast_food|なか卯":{countryCodes:["jp"],tags:{amenity:"fast_food",brand:"なか卯","brand:en":"Nakau","brand:ja":"なか卯","brand:wikidata":"Q11274132","brand:wikipedia":"ja:なか卯",cuisine:"udon",name:"なか卯","name:en":"Nakau","name:ja":"なか卯",takeaway:"yes"}},"amenity/fast_food|はま寿司":{countryCodes:["jp"],tags:{amenity:"fast_food",brand:"はま寿司","brand:en":"Hamazushi","brand:ja":"はま寿司","brand:wikidata":"Q17220385","brand:wikipedia":"ja:はま寿司",cuisine:"sushi",name:"はま寿司","name:en":"Hamazushi","name:ja":"はま寿司",takeaway:"yes"}},"amenity/fast_food|ほっかほっか亭":{countryCodes:["jp"],tags:{amenity:"fast_food",brand:"ほっかほっか亭","brand:en":"Hokka Hokka Tei","brand:ja":"ほっかほっか亭","brand:wikidata":"Q5878035","brand:wikipedia":"ja:ほっかほっか亭",cuisine:"japanese",name:"ほっかほっか亭","name:en":"Hokka Hokka Tei","name:ja":"ほっかほっか亭",takeaway:"yes"}},"amenity/fast_food|ほっともっと":{countryCodes:["jp"],nomatch:["shop/deli|ほっともっと"],tags:{amenity:"fast_food",brand:"ほっともっと","brand:en":"Hotto Motto","brand:ja":"ほっともっと","brand:wikidata":"Q10850949","brand:wikipedia":"ja:ほっともっと",cuisine:"japanese",name:"ほっともっと","name:en":"Hotto Motto","name:ja":"ほっともっと",takeaway:"yes"}},"amenity/fast_food|ゆで太郎":{countryCodes:["jp"],tags:{amenity:"fast_food",brand:"ゆで太郎","brand:en":"Yudetaro","brand:ja":"ゆで太郎","brand:wikidata":"Q11280824","brand:wikipedia":"ja:ゆで太郎",cuisine:"noodle",name:"ゆで太郎","name:en":"Yudetaro","name:ja":"ゆで太郎",takeaway:"yes"}},"amenity/fast_food|オリジン弁当":{countryCodes:["jp"],tags:{amenity:"fast_food",brand:"オリジン弁当","brand:en":"Origin Bentō","brand:ja":"オリジン弁当","brand:wikidata":"Q11292632","brand:wikipedia":"ja:オリジン東秀",cuisine:"japanese",name:"オリジン弁当","name:en":"Origin Bentō","name:ja":"オリジン弁当",takeaway:"yes"}},"amenity/fast_food|ケンタッキーフライドチキン":{countryCodes:["jp"],tags:{amenity:"fast_food",brand:"ケンタッキーフライドチキン","brand:en":"KFC","brand:ja":"ケンタッキーフライドチキン","brand:wikidata":"Q524757","brand:wikipedia":"ja:KFCコーポレーション",cuisine:"chicken",name:"ケンタッキーフライドチキン","name:en":"KFC","name:ja":"ケンタッキーフライドチキン",takeaway:"yes"}},"amenity/fast_food|サブウェイ":{countryCodes:["jp"],tags:{amenity:"fast_food",brand:"サブウェイ","brand:en":"Subway","brand:ja":"サブウェイ","brand:wikidata":"Q244457","brand:wikipedia":"ja:サブウェイ",cuisine:"sandwich",name:"サブウェイ","name:en":"Subway","name:ja":"サブウェイ",takeaway:"yes"}},"amenity/fast_food|スシロー":{countryCodes:["jp"],tags:{amenity:"fast_food",brand:"スシロー","brand:en":"Sushiro","brand:ja":"スシロー","brand:wikidata":"Q11257037","brand:wikipedia":"ja:あきんどスシロー",cuisine:"sushi",name:"スシロー","name:en":"Sushiro","name:ja":"スシロー","name:zh":"壽司郎",takeaway:"yes"}},"amenity/fast_food|ドミノ・ピザ":{countryCodes:["jp"],tags:{amenity:"fast_food",brand:"ドミノ・ピザ","brand:en":"Domino's Pizza","brand:ja":"ドミノ・ピザ","brand:wikidata":"Q839466","brand:wikipedia":"ja:ドミノ・ピザ",cuisine:"pizza",name:"ドミノ・ピザ","name:en":"Domino's Pizza","name:ja":"ドミノ・ピザ",takeaway:"yes"}},"amenity/fast_food|ピザハット":{countryCodes:["jp"],tags:{amenity:"fast_food",brand:"ピザハット","brand:en":"Pizza Hut","brand:ja":"ピザハット","brand:wikidata":"Q191615","brand:wikipedia":"ja:ピザハット",cuisine:"pizza",name:"ピザハット","name:en":"Pizza Hut","name:ja":"ピザハット",takeaway:"yes"}},"amenity/fast_food|ピザ・カリフォルニア":{countryCodes:["jp"],tags:{amenity:"fast_food",brand:"ピザ・カリフォルニア","brand:en":"Pizza California","brand:ja":"ピザ・カリフォルニア","brand:wikidata":"Q75324","brand:wikipedia":"ja:ピザ・カリフォルニア",cuisine:"pizza",name:"ピザ・カリフォルニア","name:en":"Pizza California","name:ja":"ピザ・カリフォルニア",takeaway:"yes"}},"amenity/fast_food|ピザーラ":{countryCodes:["jp"],tags:{amenity:"fast_food",brand:"ピザーラ","brand:en":"Pizza-La","brand:ja":"ピザーラ","brand:wikidata":"Q7199948","brand:wikipedia":"ja:ピザーラ",cuisine:"pizza",name:"ピザーラ","name:en":"Pizza-La","name:ja":"ピザーラ",takeaway:"yes"}},"amenity/fast_food|フレッシュネスバーガー":{countryCodes:["jp"],tags:{amenity:"fast_food",brand:"フレッシュネスバーガー","brand:en":"Freshness Burger","brand:ja":"フレッシュネスバーガー","brand:wikidata":"Q5503087","brand:wikipedia":"ja:フレッシュネスバーガー",cuisine:"burger",name:"フレッシュネスバーガー","name:en":"Freshness Burger","name:ja":"フレッシュネスバーガー",takeaway:"yes"}},"amenity/fast_food|マクドナルド":{countryCodes:["jp"],tags:{amenity:"fast_food",brand:"マクドナルド","brand:en":"McDonald's","brand:ja":"マクドナルド","brand:wikidata":"Q38076","brand:wikipedia":"ja:マクドナルド",cuisine:"burger",name:"マクドナルド","name:en":"McDonald's","name:ja":"マクドナルド",takeaway:"yes"}},"amenity/fast_food|ミスタードーナツ":{countryCodes:["jp"],tags:{amenity:"fast_food",brand:"ミスタードーナツ","brand:en":"Mister Donut","brand:ja":"ミスタードーナツ","brand:wikidata":"Q1065819","brand:wikipedia":"en:Mister Donut",cuisine:"donut",name:"ミスタードーナツ","name:en":"Mister Donut","name:ja":"ミスタードーナツ",takeaway:"yes"}},"amenity/fast_food|モスバーガー":{countryCodes:["jp"],tags:{amenity:"fast_food",brand:"モスバーガー","brand:en":"MOS Burger","brand:ja":"モスバーガー","brand:wikidata":"Q1204169","brand:wikipedia":"ja:モスバーガー",cuisine:"burger",name:"モスバーガー","name:en":"MOS Burger","name:ja":"モスバーガー",takeaway:"yes"}},"amenity/fast_food|ラーメン二郎":{countryCodes:["jp"],tags:{amenity:"fast_food",brand:"ラーメン二郎","brand:en":"Ramen Jiro","brand:ja":"ラーメン二郎","brand:wikidata":"Q11347765","brand:wikipedia":"ja:ラーメン二郎",cuisine:"ramen",name:"ラーメン二郎","name:en":"Ramen Jiro","name:ja":"ラーメン二郎",takeaway:"yes"}},"amenity/fast_food|ロッテリア":{countryCodes:["jp"],tags:{amenity:"fast_food",brand:"ロッテリア","brand:en":"Lotteria","brand:ja":"ロッテリア","brand:wikidata":"Q249525","brand:wikipedia":"ja:ロッテリア",cuisine:"burger",name:"ロッテリア","name:en":"Lotteria","name:ja":"ロッテリア",takeaway:"yes"}},"amenity/fast_food|吉野家":{countryCodes:["jp"],tags:{amenity:"fast_food",brand:"吉野家","brand:en":"Yoshinoya","brand:ja":"吉野家","brand:wikidata":"Q776272","brand:wikipedia":"ja:吉野家",cuisine:"beef_bowl",name:"吉野家","name:en":"Yoshinoya","name:ja":"吉野家",takeaway:"yes"}},"amenity/fast_food|富士そば":{countryCodes:["jp"],tags:{amenity:"fast_food",brand:"富士そば","brand:en":"Fuji Soba","brand:ja":"富士そば","brand:wikidata":"Q11414722","brand:wikipedia":"ja:名代富士そば",cuisine:"soba",name:"富士そば","name:en":"Fuji Soba","name:ja":"富士そば",takeaway:"yes"}},"amenity/fast_food|幸楽苑":{countryCodes:["jp"],tags:{amenity:"fast_food",brand:"幸楽苑","brand:en":"Kourakuen","brand:ja":"幸楽苑","brand:wikidata":"Q11484003","brand:wikipedia":"ja:幸楽苑",cuisine:"ramen",name:"幸楽苑","name:en":"Kourakuen","name:ja":"幸楽苑",takeaway:"yes"}},"amenity/fast_food|摩斯漢堡":{countryCodes:["cn","hk","mo","sg","tw"],tags:{amenity:"fast_food",brand:"摩斯漢堡","brand:en":"MOS Burger","brand:wikidata":"Q1204169","brand:wikipedia":"zh:摩斯漢堡","brand:zh":"摩斯漢堡",cuisine:"burger",name:"摩斯漢堡","name:en":"MOS Burger","name:zh":"摩斯漢堡",takeaway:"yes"}},"amenity/fast_food|日高屋":{tags:{amenity:"fast_food",brand:"日高屋","brand:en":"Hidakaya","brand:wikidata":"Q11326050","brand:wikipedia":"ja:ハイデイ日高",cuisine:"noodle",name:"日高屋",takeaway:"yes"}},"amenity/fast_food|松屋":{countryCodes:["cn","hk","jp","mo","sg","tw"],tags:{amenity:"fast_food",brand:"松屋","brand:en":"Matsuya Foods","brand:wikidata":"Q848773","brand:wikipedia":"ja:松屋フーズ",cuisine:"japanese",name:"松屋","name:en":"Matsuya Foods",takeaway:"yes"}},"amenity/fast_food|箱根そば":{countryCodes:["jp"],tags:{amenity:"fast_food",brand:"箱根そば","brand:en":"Hakone Soba","brand:ja":"箱根そば","brand:wikidata":"Q11603345","brand:wikipedia":"ja:箱根そば",cuisine:"soba",name:"箱根そば","name:en":"Hakone Soba","name:ja":"箱根そば",takeaway:"yes"}},"amenity/fast_food|肯德基":{countryCodes:["cn","hk","mo","sg","tw"],tags:{amenity:"fast_food",brand:"肯德基","brand:en":"KFC","brand:wikidata":"Q524757","brand:wikipedia":"zh:肯德基",cuisine:"chicken",name:"肯德基","name:en":"KFC",takeaway:"yes"}},"amenity/fast_food|麥當勞":{countryCodes:["hk","mo","tw"],tags:{amenity:"fast_food",brand:"麥當勞","brand:en":"McDonald's","brand:wikidata":"Q38076","brand:wikipedia":"zh_classical:麥當勞",cuisine:"burger",name:"麥當勞","name:en":"McDonald's",takeaway:"yes"}},"amenity/fast_food|麦当劳":{countryCodes:["cn","sg"],tags:{amenity:"fast_food",brand:"麦当劳","brand:en":"McDonald's","brand:wikidata":"Q38076","brand:wikipedia":"zh:麦当劳",cuisine:"burger",name:"麦当劳","name:en":"McDonald's",takeaway:"yes"}},"amenity/fast_food|롯데리아":{countryCodes:["kr"],tags:{amenity:"fast_food",brand:"롯데리아","brand:en":"Lotteria","brand:ko":"롯데리아","brand:wikidata":"Q249525","brand:wikipedia":"ko:롯데리아",cuisine:"burger",name:"롯데리아","name:en":"Lotteria","name:ko":"롯데리아",takeaway:"yes"}},"amenity/fast_food|맘스터치":{countryCodes:["kr"],tags:{amenity:"fast_food",brand:"맘스터치","brand:ko":"맘스터치",cuisine:"burger",name:"맘스터치","name:ko":"맘스터치",takeaway:"yes"}},"amenity/fast_food|맥도날드":{countryCodes:["kr"],tags:{amenity:"fast_food",brand:"맥도날드","brand:ko":"맥도날드",name:"맥도날드","name:ko":"맥도날드",takeaway:"yes"}},"amenity/fuel|1-2-3":{tags:{amenity:"fuel",brand:"1-2-3","brand:wikidata":"Q4545742","brand:wikipedia":"en:1-2-3 (fuel station)",name:"1-2-3"}},"amenity/fuel|7-Eleven":{matchNames:["7-11","seven eleven"],nomatch:["shop/convenience|7-Eleven"],tags:{amenity:"fuel",brand:"7-Eleven","brand:wikidata":"Q259340","brand:wikipedia":"en:7-Eleven",name:"7-Eleven"}},"amenity/fuel|76":{nomatch:["shop/convenience|76"],tags:{amenity:"fuel",brand:"76","brand:wikidata":"Q1658320","brand:wikipedia":"en:76 (gas station)",name:"76"}},"amenity/fuel|ABC":{countryCodes:["fi"],nomatch:["shop/convenience|ABC"],tags:{amenity:"fuel",brand:"ABC","brand:wikidata":"Q10397504","brand:wikipedia":"fi:ABC-ketju",name:"ABC"}},"amenity/fuel|ADNOC":{countryCodes:["ae"],tags:{amenity:"fuel",brand:"ADNOC","brand:wikidata":"Q166729","brand:wikipedia":"en:Abu Dhabi National Oil Company",name:"ADNOC"}},"amenity/fuel|ANP":{tags:{amenity:"fuel",brand:"ANP",name:"ANP"}},"amenity/fuel|Aegean":{countryCodes:["gr"],tags:{amenity:"fuel",brand:"Aegean","brand:wikidata":"Q28146598","brand:wikipedia":"el:Aegean Oil",name:"Aegean"}},"amenity/fuel|Afriquia":{tags:{amenity:"fuel",brand:"Afriquia","brand:wikidata":"Q2829178","brand:wikipedia":"en:Akwa Group",name:"Afriquia"}},"amenity/fuel|Agil":{tags:{amenity:"fuel",brand:"Agil",name:"Agil"}},"amenity/fuel|Agip":{tags:{amenity:"fuel",brand:"Agip","brand:wikidata":"Q377915","brand:wikipedia":"en:Agip",name:"Agip"}},"amenity/fuel|Agrola":{tags:{amenity:"fuel",brand:"Agrola","brand:wikidata":"Q397351","brand:wikipedia":"de:Agrola",name:"Agrola"}},"amenity/fuel|Alon":{countryCodes:["us"],tags:{amenity:"fuel",brand:"Alon","brand:wikidata":"Q62274304",name:"Alon"}},"amenity/fuel|Alpet":{countryCodes:["al","tr"],tags:{amenity:"fuel",brand:"Alpet","brand:wikidata":"Q62131561",name:"Alpet"}},"amenity/fuel|Api":{tags:{amenity:"fuel",brand:"Api","brand:wikidata":"Q466043","brand:wikipedia":"en:American Petroleum Institute",name:"Api"}},"amenity/fuel|Aral":{countryCodes:["de"],matchNames:["aral tankstelle"],nomatch:["shop/convenience|Aral"],tags:{amenity:"fuel",brand:"Aral","brand:wikidata":"Q565734","brand:wikipedia":"en:Aral AG",name:"Aral"}},"amenity/fuel|Arco":{tags:{amenity:"fuel",brand:"Arco","brand:wikidata":"Q304769","brand:wikipedia":"en:ARCO",name:"Arco"}},"amenity/fuel|Asda":{countryCodes:["gb"],nomatch:["shop/supermarket|ASDA","shop/supermarket|Asda"],tags:{amenity:"fuel",brand:"Asda","brand:wikidata":"Q297410","brand:wikipedia":"en:Asda",name:"Asda"}},"amenity/fuel|Atem":{countryCodes:["br"],matchNames:["posto atem"],tags:{amenity:"fuel",brand:"Atem","brand:wikidata":"Q62332255",name:"Atem"}},"amenity/fuel|Auchan":{nomatch:["shop/supermarket|Auchan"],tags:{amenity:"fuel",brand:"Auchan","brand:wikidata":"Q758603","brand:wikipedia":"en:Auchan",name:"Auchan"}},"amenity/fuel|Avanti":{countryCodes:["at"],tags:{amenity:"fuel",brand:"Avanti","brand:wikidata":"Q168238","brand:wikipedia":"en:OMV",name:"Avanti"}},"amenity/fuel|Avia":{matchNames:["station avia"],tags:{amenity:"fuel",brand:"Avia","brand:wikidata":"Q300147","brand:wikipedia":"de:Avia International",name:"Avia"}},"amenity/fuel|Avin":{countryCodes:["gr"],tags:{amenity:"fuel",brand:"Avin","brand:wikidata":"Q19903165","brand:wikipedia":"en:Avin International",name:"Avin"}},"amenity/fuel|Axion":{countryCodes:["ar","py","uy"],tags:{amenity:"fuel",brand:"Axion","brand:wikidata":"Q62131749",name:"Axion"}},"amenity/fuel|Aytemiz":{countryCodes:["tr"],tags:{amenity:"fuel",brand:"Aytemiz","brand:wikidata":"Q62274352",name:"Aytemiz"}},"amenity/fuel|BEBECO":{countryCodes:["ch"],tags:{amenity:"fuel",brand:"BEBECO","brand:wikidata":"Q62274373",name:"BEBECO"}},"amenity/fuel|BHPetrol":{countryCodes:["my"],tags:{amenity:"fuel",brand:"BHPetrol","brand:wikidata":"Q62274381",name:"BHPetrol"}},"amenity/fuel|BP":{nomatch:["shop/convenience|BP Shop"],tags:{amenity:"fuel",brand:"BP","brand:wikidata":"Q152057","brand:wikipedia":"en:BP",name:"BP"}},"amenity/fuel|BR":{countryCodes:["br"],matchNames:["br petrobras","petrobras","posto br"],tags:{amenity:"fuel",brand:"BR","brand:wikidata":"Q4836468","brand:wikipedia":"pt:Petrobras Distribuidora",name:"BR"}},"amenity/fuel|Bangchak":{tags:{amenity:"fuel",brand:"Bangchak","brand:wikidata":"Q6579719","brand:wikipedia":"zh:曼差石油股份",name:"Bangchak"}},"amenity/fuel|Bharat Petroleum":{countryCodes:["in"],tags:{amenity:"fuel",brand:"Bharat Petroleum","brand:wikidata":"Q854826","brand:wikipedia":"en:Bharat Petroleum",name:"Bharat Petroleum"}},"amenity/fuel|Biomax":{countryCodes:["co"],tags:{amenity:"fuel",brand:"Biomax","brand:wikidata":"Q62274413",name:"Biomax"}},"amenity/fuel|Bliska":{countryCodes:["pl"],tags:{amenity:"fuel",brand:"Bliska","brand:wikidata":"Q4016378","brand:wikipedia":"pl:Bliska",name:"Bliska"}},"amenity/fuel|CAMPSA":{countryCodes:["es"],tags:{amenity:"fuel",brand:"CAMPSA","brand:wikidata":"Q1031623","brand:wikipedia":"en:Campsa",name:"CAMPSA"}},"amenity/fuel|CEPSA":{tags:{amenity:"fuel",brand:"CEPSA","brand:wikidata":"Q608819","brand:wikipedia":"en:Cepsa",name:"CEPSA"}},"amenity/fuel|Caltex":{tags:{amenity:"fuel",brand:"Caltex","brand:wikidata":"Q277470","brand:wikipedia":"en:Caltex",name:"Caltex"}},"amenity/fuel|Canadian Tire Gas+":{matchNames:["canadian tire","canadian tire gas bar"],nomatch:["shop/department_store|Canadian Tire"],tags:{amenity:"fuel",brand:"Canadian Tire","brand:wikidata":"Q1032400","brand:wikipedia":"en:Canadian Tire",name:"Canadian Tire"}},"amenity/fuel|Carrefour":{tags:{amenity:"fuel",brand:"Carrefour",name:"Carrefour"}},"amenity/fuel|Carrefour Market":{nomatch:["shop/supermarket|Carrefour Market"],tags:{amenity:"fuel",brand:"Carrefour Market","brand:wikidata":"Q217599","brand:wikipedia":"en:Carrefour",name:"Carrefour Market"}},"amenity/fuel|Casey's General Store":{matchNames:["caseys"],nomatch:["shop/convenience|Casey's General Store"],tags:{amenity:"fuel",brand:"Casey's General Store","brand:wikidata":"Q2940968","brand:wikipedia":"en:Casey's General Stores",name:"Casey's General Store"}},"amenity/fuel|Casino":{tags:{amenity:"fuel",brand:"Casino",name:"Casino"}},"amenity/fuel|Cenex":{tags:{amenity:"fuel",brand:"Cenex","brand:wikidata":"Q5011381","brand:wikipedia":"en:CHS Inc.",name:"Cenex"}},"amenity/fuel|Ceypetco":{countryCodes:["lk"],matchNames:["lanka filling station"],tags:{amenity:"fuel",brand:"Ceypetco","brand:wikidata":"Q5065795","brand:wikipedia":"en:Ceylon Petroleum Corporation",name:"Ceypetco"}},"amenity/fuel|Chevron":{nomatch:["shop/convenience|Chevron"],tags:{amenity:"fuel",brand:"Chevron","brand:wikidata":"Q319642","brand:wikipedia":"en:Chevron Corporation",name:"Chevron"}},"amenity/fuel|Circle K":{nomatch:["shop/convenience|Circle K"],tags:{amenity:"fuel",brand:"Circle K","brand:wikidata":"Q3268010","brand:wikipedia":"en:Circle K",name:"Circle K"}},"amenity/fuel|Citgo":{nomatch:["shop/convenience|Citgo"],tags:{amenity:"fuel",brand:"Citgo","brand:wikidata":"Q2974437","brand:wikipedia":"en:Citgo",name:"Citgo"}},"amenity/fuel|Clark":{tags:{amenity:"fuel",brand:"Clark","brand:wikidata":"Q5127157","brand:wikipedia":"en:Clark Brands",name:"Clark"}},"amenity/fuel|Classic":{tags:{amenity:"fuel",brand:"Classic",name:"Classic"}},"amenity/fuel|Co-op~(Canada)":{countryCodes:["ca"],matchNames:["coop"],nomatch:["shop/convenience|Co-op~(Canada)","shop/convenience|Coop~(Schweiz)","shop/convenience|The Co-operative Food~(UK)","shop/supermarket|Co-op~(Canada)","shop/supermarket|Coop~(Schweiz)","shop/supermarket|The Co-operative Food~(UK)"],tags:{amenity:"fuel",brand:"Federated Co-operatives","brand:wikidata":"Q5440676","brand:wikipedia":"en:Federated Co-operatives",name:"Co-op"}},"amenity/fuel|Coles Express":{countryCodes:["au"],nomatch:["shop/convenience|Coles Express"],tags:{amenity:"fuel",brand:"Coles Express","brand:wikidata":"Q5144653","brand:wikipedia":"en:Coles Express",name:"Coles Express"}},"amenity/fuel|Conoco":{tags:{amenity:"fuel",brand:"Conoco","brand:wikidata":"Q1126518","brand:wikipedia":"en:Conoco",name:"Conoco"}},"amenity/fuel|Copec":{countryCodes:["cl"],tags:{amenity:"fuel",brand:"Copec","brand:wikidata":"Q11681461","brand:wikipedia":"en:Empresas Copec",name:"Copec"}},"amenity/fuel|Copetrol":{countryCodes:["py"],tags:{amenity:"fuel",brand:"Copetrol","brand:wikidata":"Q62274431",name:"Copetrol"}},"amenity/fuel|Cosmo":{countryCodes:["jp"],tags:{amenity:"fuel",brand:"Cosmo","brand:wikidata":"Q2498318","brand:wikipedia":"en:Cosmo Oil Company",name:"Cosmo"}},"amenity/fuel|Costco Gasoline":{matchNames:["costco","costco gas","costco wholesale"],nomatch:["amenity/pharmacy|Costco Pharmacy","shop/wholesale|Costco"],tags:{amenity:"fuel",brand:"Costco Gasoline","brand:wikidata":"Q715583","brand:wikipedia":"en:Costco",name:"Costco Gasoline"}},"amenity/fuel|Couche-Tard":{countryCodes:["ca"],nomatch:["shop/convenience|Couche-Tard"],tags:{amenity:"fuel",brand:"Couche-Tard","brand:wikidata":"Q2836957","brand:wikipedia":"en:Alimentation Couche-Tard",name:"Couche-Tard"}},"amenity/fuel|Crevier":{countryCodes:["ca"],tags:{amenity:"fuel",brand:"Crevier","brand:wikidata":"Q61743451",name:"Crevier"}},"amenity/fuel|Crodux":{countryCodes:["hr"],tags:{amenity:"fuel",brand:"Crodux","brand:wikidata":"Q62274622",name:"Crodux"}},"amenity/fuel|Cumberland Farms":{countryCodes:["us"],nomatch:["shop/convenience|Cumberland Farms"],tags:{amenity:"fuel",brand:"Cumberland Farms","brand:wikidata":"Q1143685","brand:wikipedia":"en:Cumberland Farms",name:"Cumberland Farms"}},"amenity/fuel|Delta~(Panama & Costa Rica)":{countryCodes:["cr","pr"],tags:{amenity:"fuel",brand:"Delta","brand:wikidata":"Q62274638",name:"Delta"}},"amenity/fuel|Delta~(USA)":{countryCodes:["us"],tags:{amenity:"fuel",brand:"Delta","brand:wikidata":"Q62274661",name:"Delta"}},"amenity/fuel|Depot Tela":{tags:{amenity:"fuel",brand:"Depot Tela",name:"Depot Tela"}},"amenity/fuel|Diamond Shamrock":{countryCodes:["us"],tags:{amenity:"fuel",brand:"Diamond Shamrock","brand:wikidata":"Q16973722","brand:wikipedia":"en:Diamond Shamrock",name:"Diamond Shamrock"}},"amenity/fuel|Domo":{countryCodes:["ca"],tags:{amenity:"fuel",brand:"Domo","brand:wikidata":"Q5291326","brand:wikipedia":"en:Domo Gasoline",name:"Domo"}},"amenity/fuel|EKO~(Canada)":{countryCodes:["ca"],nomatch:["amenity/fuel|EKO~(Greece)","shop/supermarket|Eko"],tags:{amenity:"fuel",brand:"EKO","brand:wikidata":"Q3045934","brand:wikipedia":"fr:EKO",name:"EKO"}},"amenity/fuel|EKO~(Greece)":{countryCodes:["bg","cy","gr","me","mk","rs"],matchNames:["εκο"],nomatch:["amenity/fuel|EKO~(Canada)","shop/supermarket|Eko"],tags:{amenity:"fuel",brand:"EKO","brand:wikidata":"Q903198","brand:wikipedia":"el:Ελληνικά Πετρέλαια",name:"EKO"}},"amenity/fuel|ENEOS":{countryCodes:["jp"],tags:{amenity:"fuel",brand:"ENEOS","brand:wikidata":"Q1640290","brand:wikipedia":"en:JXTG Nippon Oil & Energy",name:"ENEOS"}},"amenity/fuel|Elan":{countryCodes:["de","fr","nl"],tags:{amenity:"fuel",brand:"Elan","brand:wikidata":"Q57980752",name:"Elan"}},"amenity/fuel|Engen":{tags:{amenity:"fuel",brand:"Engen","brand:wikidata":"Q3054251","brand:wikipedia":"en:Engen Petroleum",name:"Engen"}},"amenity/fuel|Eni":{tags:{amenity:"fuel",brand:"Eni","brand:wikidata":"Q565594","brand:wikipedia":"en:Eni",name:"Eni"}},"amenity/fuel|Erg":{tags:{amenity:"fuel",brand:"Erg","brand:wikidata":"Q739503","brand:wikipedia":"it:ERG (azienda)",name:"Erg"}},"amenity/fuel|Esso":{matchNames:["station esso"],nomatch:["amenity/fuel|Esso Express","shop/convenience|Esso"],tags:{amenity:"fuel",brand:"Esso","brand:wikidata":"Q867662","brand:wikipedia":"en:Esso",name:"Esso"}},"amenity/fuel|Esso Express":{nomatch:["amenity/fuel|Esso"],tags:{amenity:"fuel",brand:"Esso Express","brand:wikidata":"Q2350336","brand:wikipedia":"nl:Esso Express",name:"Esso Express"}},"amenity/fuel|Exxon":{tags:{amenity:"fuel",brand:"Exxon","brand:wikidata":"Q4781944","brand:wikipedia":"en:Exxon",name:"Exxon"}},"amenity/fuel|F24":{countryCodes:["dk"],tags:{amenity:"fuel",brand:"F24","brand:wikidata":"Q12310853","brand:wikipedia":"da:F24",name:"F24"}},"amenity/fuel|Fas Gas":{matchNames:["fas gas plus"],tags:{amenity:"fuel",brand:"Fas Gas","brand:wikidata":"Q61743505","brand:wikipedia":"en:Parkland Fuel",name:"Fas Gas"}},"amenity/fuel|Firezone":{countryCodes:["nl"],tags:{amenity:"fuel",brand:"Firezone","brand:wikidata":"Q14628080","brand:wikipedia":"nl:Firezone",name:"Firezone"}},"amenity/fuel|Flying V":{countryCodes:["ph"],tags:{amenity:"fuel",brand:"Flying V","brand:wikidata":"Q62275048",name:"Flying V"}},"amenity/fuel|Freie Tankstelle":{countryCodes:["de"],tags:{amenity:"fuel",brand:"Freie Tankstelle","brand:wikidata":"Q1009104","brand:wikipedia":"de:Bundesverband freier Tankstellen",name:"Freie Tankstelle"}},"amenity/fuel|GALP":{tags:{amenity:"fuel",brand:"GALP","brand:wikidata":"Q1492739","brand:wikipedia":"en:Galp Energia",name:"GALP"}},"amenity/fuel|Gazel":{countryCodes:["co","mx","pe"],tags:{amenity:"fuel",brand:"Gazel","brand:wikidata":"Q62529885",name:"Gazel"}},"amenity/fuel|Gazprom":{tags:{amenity:"fuel",brand:"Gazprom","brand:wikidata":"Q102673","brand:wikipedia":"en:Gazprom",name:"Gazprom"}},"amenity/fuel|GetGo":{countryCodes:["us"],tags:{amenity:"fuel",brand:"GetGo","brand:wikidata":"Q5553766","brand:wikipedia":"en:GetGo",name:"GetGo"}},"amenity/fuel|Giant":{nomatch:["shop/bicycle|Giant"],tags:{amenity:"fuel",brand:"Giant",name:"Giant"}},"amenity/fuel|Glusco":{countryCodes:["ua"],tags:{amenity:"fuel",brand:"Glusco","brand:wikidata":"Q62284719",name:"Glusco"}},"amenity/fuel|Goil":{tags:{amenity:"fuel",brand:"Goil","brand:wikidata":"Q5555383","brand:wikipedia":"en:Ghana Oil Company",name:"Goil"}},"amenity/fuel|Gulf":{tags:{amenity:"fuel",brand:"Gulf","brand:wikidata":"Q1296860","brand:wikipedia":"en:Gulf Oil",name:"Gulf"}},"amenity/fuel|Gull":{tags:{amenity:"fuel",brand:"Gull","brand:wikidata":"Q5617739","brand:wikipedia":"en:Gull Petroleum",name:"Gull"}},"amenity/fuel|H-E-B Fuel":{matchNames:["h-e-b gas"],nomatch:["shop/supermarket|H-E-B"],tags:{amenity:"fuel",brand:"H-E-B Fuel","brand:wikidata":"Q830621","brand:wikipedia":"en:H-E-B",name:"H-E-B Fuel"}},"amenity/fuel|HEM":{countryCodes:["de"],tags:{amenity:"fuel",brand:"HEM","brand:wikidata":"Q1563517","brand:wikipedia":"de:Deutsche Tamoil",name:"HEM"}},"amenity/fuel|HP":{matchNames:["hindustan petroleum","hp petrol pump"],tags:{amenity:"fuel",brand:"Hindustan Petroleum","brand:wikidata":"Q1619375","brand:wikipedia":"en:Hindustan Petroleum",name:"HP",official_name:"Hindustan Petroleum"}},"amenity/fuel|Harnois":{countryCodes:["ca"],tags:{amenity:"fuel",brand:"Harnois","brand:wikidata":"Q61743558",name:"Harnois"}},"amenity/fuel|Hess":{tags:{amenity:"fuel",brand:"Hess","brand:wikidata":"Q1615684","brand:wikipedia":"en:Hess Corporation",name:"Hess"}},"amenity/fuel|Hofer":{countryCodes:["at","si"],nomatch:["shop/supermarket|Hofer"],tags:{amenity:"fuel",brand:"Hofer","brand:wikidata":"Q15815751","brand:wikipedia":"de:Hofer KG",name:"Hofer"}},"amenity/fuel|Holiday":{countryCodes:["us"],nomatch:["shop/convenience|Holiday"],tags:{amenity:"fuel",brand:"Holiday","brand:wikidata":"Q5880490","brand:wikipedia":"en:Holiday Stationstores",name:"Holiday"}},"amenity/fuel|Husky":{countryCodes:["ca"],nomatch:["shop/convenience|Husky"],tags:{amenity:"fuel",brand:"Husky",name:"Husky"}},"amenity/fuel|IES":{countryCodes:["it"],tags:{amenity:"fuel",brand:"IES","brand:wikidata":"Q62287387",name:"IES"}},"amenity/fuel|IP":{tags:{amenity:"fuel",brand:"IP","brand:wikidata":"Q646807","brand:wikipedia":"en:Anonima Petroli Italiana",name:"IP"}},"amenity/fuel|Indian Oil":{tags:{amenity:"fuel",brand:"Indian Oil","brand:wikidata":"Q1289348","brand:wikipedia":"en:Indian Oil Corporation",name:"Indian Oil"}},"amenity/fuel|Indian Oil Petrol Pump":{tags:{amenity:"fuel",brand:"Indian Oil Petrol Pump",name:"Indian Oil Petrol Pump"}},"amenity/fuel|Ingo":{tags:{amenity:"fuel",brand:"Ingo","brand:wikidata":"Q17048617","brand:wikipedia":"en:Ingo (brand)",name:"Ingo"}},"amenity/fuel|Intermarché":{matchNames:["intermarché super"],nomatch:["shop/supermarket|Intermarché"],tags:{amenity:"fuel",brand:"Intermarché","brand:wikidata":"Q3153200","brand:wikipedia":"fr:Intermarché",name:"Intermarché"}},"amenity/fuel|Ipiranga":{countryCodes:["br"],matchNames:["posto ipiranga"],tags:{amenity:"fuel",brand:"Ipiranga","brand:wikidata":"Q2081136","brand:wikipedia":"pt:Ipiranga (empresa)",name:"Ipiranga"}},"amenity/fuel|Irving":{nomatch:["shop/convenience|Irving"],tags:{amenity:"fuel",brand:"Irving","brand:wikidata":"Q1673286","brand:wikipedia":"en:Irving Oil",name:"Irving"}},"amenity/fuel|JA-SS":{countryCodes:["jp"],matchNames:["ja"],tags:{amenity:"fuel",brand:"JA-SS","brand:wikidata":"Q11225213","brand:wikipedia":"ja:JA-SS",name:"JA-SS"}},"amenity/fuel|Jet":{nomatch:["shop/clothes|Jet"],tags:{amenity:"fuel",brand:"Jet","brand:wikidata":"Q568940","brand:wikipedia":"en:Jet (brand)",name:"Jet"}},"amenity/fuel|Jetti":{countryCodes:["ph"],tags:{amenity:"fuel",brand:"Jetti","brand:wikidata":"Q62288720",name:"Jetti"}},"amenity/fuel|Kangaroo":{nomatch:["shop/convenience|Kangaroo"],tags:{amenity:"fuel",brand:"Kangaroo",name:"Kangaroo"}},"amenity/fuel|Kobil":{tags:{amenity:"fuel",brand:"Kobil","brand:wikidata":"Q22906119","brand:wikipedia":"en:KenolKobil",name:"Kobil"}},"amenity/fuel|Kroger":{matchNames:["kroger fuel"],nomatch:["shop/supermarket|Kroger"],tags:{amenity:"fuel",brand:"Kroger","brand:wikidata":"Q153417","brand:wikipedia":"en:Kroger",name:"Kroger"}},"amenity/fuel|Kum & Go":{countryCodes:["us"],nomatch:["shop/convenience|Kum & Go"],tags:{amenity:"fuel",brand:"Kum & Go","brand:wikidata":"Q6443340","brand:wikipedia":"en:Kum & Go",name:"Kum & Go"}},"amenity/fuel|Kwik Fill":{tags:{amenity:"fuel",brand:"Kwik Fill",name:"Kwik Fill"}},"amenity/fuel|Kwik Trip":{nomatch:["shop/convenience|Kwik Trip"],tags:{amenity:"fuel",brand:"Kwik Trip","brand:wikidata":"Q6450420","brand:wikipedia":"en:Kwik Trip",name:"Kwik Trip"}},"amenity/fuel|Liberty":{nomatch:["amenity/bank|Liberty Bank"],tags:{amenity:"fuel",brand:"Liberty",name:"Liberty"}},"amenity/fuel|Lotos":{nomatch:["amenity/fuel|Lotos Optima"],tags:{amenity:"fuel",brand:"Lotos","brand:wikidata":"Q1256909","brand:wikipedia":"en:Grupa Lotos",name:"Lotos"}},"amenity/fuel|Lotos Optima":{nomatch:["amenity/fuel|Lotos"],tags:{amenity:"fuel",brand:"Lotos Optima","brand:wikidata":"Q1256909","brand:wikipedia":"en:Grupa Lotos",name:"Lotos Optima"}},"amenity/fuel|Love's":{countryCodes:["us"],tags:{amenity:"fuel",brand:"Love's","brand:wikidata":"Q1872496","brand:wikipedia":"en:Love's Travel Stops & Country Stores",name:"Love's"}},"amenity/fuel|Lukoil":{tags:{amenity:"fuel",brand:"Lukoil","brand:wikidata":"Q329347","brand:wikipedia":"en:Lukoil",name:"Lukoil"}},"amenity/fuel|MEROIL":{countryCodes:["es"],tags:{amenity:"fuel",brand:"MEROIL","brand:wikidata":"Q62292559",name:"MEROIL"}},"amenity/fuel|MOL":{tags:{amenity:"fuel",brand:"MOL","brand:wikidata":"Q549181","brand:wikipedia":"en:MOL (company)",name:"MOL"}},"amenity/fuel|MRS":{countryCodes:["ng"],tags:{amenity:"fuel",brand:"MRS","brand:wikidata":"Q56274919","brand:wikipedia":"en:MRS Oil Nigeria Plc",name:"MRS"}},"amenity/fuel|Mac's":{countryCodes:["ca"],nomatch:["shop/convenience|Mac's"],tags:{amenity:"fuel",brand:"Mac's","brand:wikidata":"Q4043527","brand:wikipedia":"en:Mac's Convenience Stores",name:"Mac's"}},"amenity/fuel|MacEwen":{countryCodes:["ca"],tags:{amenity:"fuel",brand:"MacEwen","brand:wikidata":"Q61740335",name:"MacEwen"}},"amenity/fuel|Marathon":{nomatch:["shop/convenience|Marathon"],tags:{amenity:"fuel",brand:"Marathon","brand:wikidata":"Q458363","brand:wikipedia":"en:Marathon Petroleum",name:"Marathon"}},"amenity/fuel|Maverik":{countryCodes:["us"],nomatch:["shop/convenience|Maverik"],tags:{amenity:"fuel",brand:"Maverik","brand:wikidata":"Q16974822","brand:wikipedia":"en:FJ Management",name:"Maverik"}},"amenity/fuel|Maxol":{tags:{amenity:"fuel",brand:"Maxol","brand:wikidata":"Q3302837","brand:wikipedia":"en:Maxol",name:"Maxol"}},"amenity/fuel|Metano":{countryCodes:["it"],tags:{amenity:"fuel",brand:"Metano","brand:wikidata":"Q62294765",name:"Metano"}},"amenity/fuel|Migrol":{countryCodes:["ch"],tags:{amenity:"fuel",brand:"Migrol","brand:wikidata":"Q1747771","brand:wikipedia":"de:Migrol",name:"Migrol"}},"amenity/fuel|Mobil":{matchNames:["mobile"],nomatch:["shop/convenience|Mobil Mart"],tags:{amenity:"fuel",brand:"Mobil","brand:wikidata":"Q3088656","brand:wikipedia":"en:Mobil",name:"Mobil"}},"amenity/fuel|Moil":{countryCodes:["tr"],tags:{amenity:"fuel",brand:"Moil","brand:wikidata":"Q62296914",name:"Moil"}},"amenity/fuel|Morrisons":{countryCodes:["gb"],nomatch:["shop/supermarket|Morrisons"],tags:{amenity:"fuel",brand:"Morrisons","brand:wikidata":"Q922344","brand:wikipedia":"en:Morrisons",name:"Morrisons"}},"amenity/fuel|Moya":{countryCodes:["pl"],tags:{amenity:"fuel",brand:"Moya","brand:wikidata":"Q62297700",name:"Moya"}},"amenity/fuel|Murphy USA":{tags:{amenity:"fuel",brand:"Murphy USA","brand:wikidata":"Q19604459","brand:wikipedia":"en:Murphy USA",name:"Murphy USA"}},"amenity/fuel|N1":{tags:{amenity:"fuel",brand:"N1",name:"N1"}},"amenity/fuel|NP":{countryCodes:["tt"],tags:{amenity:"fuel",brand:"NP","brand:wikidata":"Q7842382","brand:wikipedia":"en:Trinidad & Tobago National Petroleum Marketing Company Limited",name:"NP"}},"amenity/fuel|Neste":{tags:{amenity:"fuel",brand:"Neste","brand:wikidata":"Q616376","brand:wikipedia":"en:Neste",name:"Neste"}},"amenity/fuel|OIL!":{tags:{amenity:"fuel",brand:"OIL!","brand:wikidata":"Q2007561","brand:wikipedia":"de:OIL! Tankstellen",name:"OIL!"}},"amenity/fuel|OK":{countryCodes:["dk"],tags:{amenity:"fuel",brand:"OK","brand:wikidata":"Q12329785","brand:wikipedia":"da:OK a.m.b.a.",name:"OK"}},"amenity/fuel|OKQ8":{tags:{amenity:"fuel",brand:"OKQ8","brand:wikidata":"Q1634762","brand:wikipedia":"en:Kuwait Petroleum Corporation",name:"OKQ8"}},"amenity/fuel|OMV":{tags:{amenity:"fuel",brand:"OMV","brand:wikidata":"Q168238","brand:wikipedia":"en:OMV",name:"OMV"}},"amenity/fuel|Oilibya":{matchNames:["oilibia","oilibiya","oillibia","oilliby","oillibya","oillybia","oilybia","olibya","olybia"],tags:{amenity:"fuel",brand:"Oilibya","brand:wikidata":"Q7081491","brand:wikipedia":"en:Oilibya",name:"Oilibya","name:ar":"أويليبيا"}},"amenity/fuel|Olerex":{tags:{amenity:"fuel",brand:"Olerex",name:"Olerex"}},"amenity/fuel|Opet":{countryCodes:["tr"],tags:{amenity:"fuel",brand:"Opet","brand:wikidata":"Q7072824","brand:wikipedia":"en:Opet",name:"Opet"}},"amenity/fuel|Orlen":{nomatch:["shop/convenience|Orlen"],tags:{amenity:"fuel",brand:"Orlen","brand:wikidata":"Q971649","brand:wikipedia":"en:PKN Orlen",name:"Orlen"}},"amenity/fuel|Oxxo":{nomatch:["shop/convenience|Oxxo"],tags:{amenity:"fuel",brand:"Oxxo","brand:wikidata":"Q1342538","brand:wikipedia":"es:Oxxo",name:"Oxxo"}},"amenity/fuel|PSO":{matchNames:["pso petrol pump"],tags:{amenity:"fuel",brand:"PSO","brand:wikidata":"Q2741455","brand:wikipedia":"en:Pakistan State Oil",name:"PSO"}},"amenity/fuel|PT":{countryCodes:["th"],tags:{amenity:"fuel",brand:"PT","brand:wikidata":"Q62298612",name:"PT"}},"amenity/fuel|PTT":{tags:{amenity:"fuel",brand:"PTT","brand:wikidata":"Q1810389","brand:wikipedia":"en:PTT Public Company Limited",name:"PTT"}},"amenity/fuel|PV Oil":{tags:{amenity:"fuel",brand:"PV Oil","brand:wikidata":"Q2089536","brand:wikipedia":"en:Petrovietnam",name:"PV Oil"}},"amenity/fuel|Pacific Pride":{countryCodes:["us"],tags:{amenity:"fuel",brand:"Pacific Pride","brand:wikidata":"Q7122637","brand:wikipedia":"en:Pacific Pride",name:"Pacific Pride"}},"amenity/fuel|Pecsa":{countryCodes:["pe"],tags:{amenity:"fuel",brand:"Pecsa","brand:wikidata":"Q62299262",name:"Pecsa"}},"amenity/fuel|Pemex":{tags:{amenity:"fuel",brand:"Pemex","brand:wikidata":"Q871308","brand:wikipedia":"en:Pemex",name:"Pemex"}},"amenity/fuel|Pertamina":{tags:{amenity:"fuel",brand:"Pertamina","brand:wikidata":"Q1641044","brand:wikipedia":"en:Pertamina",name:"Pertamina"}},"amenity/fuel|Petro":{tags:{amenity:"fuel",brand:"Petro",name:"Petro"}},"amenity/fuel|Petro-Canada":{countryCodes:["ca"],nomatch:["shop/convenience|Petro-Canada"],tags:{amenity:"fuel",brand:"Petro-Canada","brand:wikidata":"Q1208279","brand:wikipedia":"en:Petro-Canada",name:"Petro-Canada"}},"amenity/fuel|Petro-T":{tags:{amenity:"fuel",brand:"Petro-T","brand:wikidata":"Q61743540",name:"Petro-T"}},"amenity/fuel|PetroPerú":{countryCodes:["pe"],tags:{amenity:"fuel",brand:"PetroPerú","brand:wikidata":"Q2506390","brand:wikipedia":"es:Petroperú",name:"PetroPerú"}},"amenity/fuel|Petrochina":{countryCodes:["cn"],tags:{amenity:"fuel",brand:"Petrochina","brand:wikidata":"Q503182","brand:wikipedia":"en:PetroChina",name:"Petrochina"}},"amenity/fuel|Petroecuador":{tags:{amenity:"fuel",brand:"Petroecuador","brand:wikidata":"Q1812822","brand:wikipedia":"en:Petroecuador",name:"Petroecuador"}},"amenity/fuel|Petrol Ofisi":{tags:{amenity:"fuel",brand:"Petrol Ofisi","brand:wikidata":"Q1278087","brand:wikipedia":"en:Petrol Ofisi",name:"Petrol Ofisi"}},"amenity/fuel|Petrolimex":{tags:{amenity:"fuel",brand:"Petrolimex","brand:wikidata":"Q10831598","brand:wikipedia":"en:Petrolimex",name:"Petrolimex"}},"amenity/fuel|Petrolina":{countryCodes:["cy"],tags:{amenity:"fuel",brand:"Petrolina","brand:wikidata":"Q17013948","brand:wikipedia":"en:Petrolina (company)",name:"Petrolina"}},"amenity/fuel|Petrom":{tags:{amenity:"fuel",brand:"Petrom","brand:wikidata":"Q1755034","brand:wikipedia":"en:Petrom",name:"Petrom"}},"amenity/fuel|Petron":{countryCodes:["ph"],tags:{amenity:"fuel",brand:"Petron","brand:wikidata":"Q7179011","brand:wikipedia":"en:Petron Corporation",name:"Petron"}},"amenity/fuel|Petronas":{tags:{amenity:"fuel",brand:"Petronas","brand:wikidata":"Q221692","brand:wikipedia":"en:Petronas",name:"Petronas"}},"amenity/fuel|Petronor":{tags:{amenity:"fuel",brand:"Petronor","brand:wikidata":"Q1726547","brand:wikipedia":"es:Petronor",name:"Petronor"}},"amenity/fuel|Phillips 66":{tags:{amenity:"fuel",brand:"Phillips 66","brand:wikidata":"Q1656230","brand:wikipedia":"en:Phillips 66",name:"Phillips 66"}},"amenity/fuel|Phoenix":{countryCodes:["ph"],tags:{amenity:"fuel",brand:"Phoenix","brand:wikidata":"Q7186949","brand:wikipedia":"en:Phoenix Petroleum",name:"Phoenix"}},"amenity/fuel|Pilot":{countryCodes:["ca","us"],matchNames:["flying j","pilot flying j"],tags:{amenity:"fuel",brand:"Pilot","brand:wikidata":"Q1434601","brand:wikipedia":"en:Pilot Flying J",name:"Pilot"}},"amenity/fuel|Pioneer":{countryCodes:["ca"],tags:{amenity:"fuel",brand:"Pioneer","brand:wikidata":"Q7196684","brand:wikipedia":"en:Pioneer Energy",name:"Pioneer"}},"amenity/fuel|Preem":{tags:{amenity:"fuel",brand:"Preem","brand:wikidata":"Q598835","brand:wikipedia":"en:Preem",name:"Preem"}},"amenity/fuel|Primax~(Ecuador)":{countryCodes:["ec"],tags:{amenity:"fuel",brand:"Primax","brand:wikidata":"Q62332857",name:"Primax"}},"amenity/fuel|Primax~(Peru)":{countryCodes:["pe"],tags:{amenity:"fuel",brand:"Primax","brand:wikidata":"Q62332638",name:"Primax"}},"amenity/fuel|Prio":{countryCodes:["pt"],tags:{amenity:"fuel",brand:"Prio","brand:wikidata":"Q62530421",name:"Prio"}},"amenity/fuel|Puma":{nomatch:["shop/clothes|Puma"],tags:{amenity:"fuel",brand:"Puma","brand:wikidata":"Q7259769","brand:wikipedia":"en:Puma Energy",name:"Puma"}},"amenity/fuel|Q1":{countryCodes:["de"],tags:{amenity:"fuel",brand:"Q1","brand:wikidata":"Q62086498",name:"Q1",operator:"Q1 Energie AG","operator:wikidata":"Q2121146","operator:wikipedia":"de:Q1 Energie"}},"amenity/fuel|Q8":{tags:{amenity:"fuel",brand:"Q8","brand:wikidata":"Q1634762","brand:wikipedia":"en:Kuwait Petroleum Corporation",name:"Q8"}},"amenity/fuel|Q8 Easy":{tags:{amenity:"fuel",brand:"Q8 Easy","brand:wikidata":"Q1806948","brand:wikipedia":"nl:Q8 Easy",name:"Q8 Easy"}},"amenity/fuel|Qstar":{countryCodes:["se"],tags:{amenity:"fuel",brand:"Qstar","brand:wikidata":"Q10647961","brand:wikipedia":"sv:Qstar",name:"Qstar"}},"amenity/fuel|QuikTrip":{matchNames:["qt"],nomatch:["shop/convenience|QuikTrip"],tags:{amenity:"fuel",brand:"QuikTrip","brand:wikidata":"Q7271953","brand:wikipedia":"en:QuikTrip",name:"QuikTrip"}},"amenity/fuel|RaceTrac":{nomatch:["shop/convenience|RaceTrac"],tags:{amenity:"fuel",brand:"RaceTrac","brand:wikidata":"Q735942","brand:wikipedia":"en:RaceTrac",name:"RaceTrac"}},"amenity/fuel|Raiffeisen":{nomatch:["amenity/bank|Raiffeisenbank"],tags:{amenity:"fuel",brand:"Raiffeisen",name:"Raiffeisen"}},"amenity/fuel|Repsol":{tags:{amenity:"fuel",brand:"Repsol","brand:wikidata":"Q174747","brand:wikipedia":"es:Repsol",name:"Repsol"}},"amenity/fuel|Revoil":{countryCodes:["gr"],tags:{amenity:"fuel",brand:"Revoil","brand:wikidata":"Q62530755",name:"Revoil"}},"amenity/fuel|Rompetrol":{tags:{amenity:"fuel",brand:"Rompetrol","brand:wikidata":"Q1788862","brand:wikipedia":"en:Rompetrol",name:"Rompetrol"}},"amenity/fuel|Royal Farms":{countryCodes:["us"],nomatch:["shop/convenience|Royal Farms"],tags:{amenity:"fuel",brand:"Royal Farms","brand:wikidata":"Q7374169","brand:wikipedia":"en:Royal Farms",name:"Royal Farms"}},"amenity/fuel|Rubis":{tags:{amenity:"fuel",brand:"Rubis","brand:wikidata":"Q3446514","brand:wikipedia":"en:Rubis (company)",name:"Rubis"}},"amenity/fuel|SK주유소":{countryCodes:["kr"],tags:{amenity:"fuel",brand:"SK주유소","brand:ko":"SK주유소",name:"SK주유소","name:ko":"SK주유소"}},"amenity/fuel|SP":{tags:{amenity:"fuel",brand:"SP",name:"SP"}},"amenity/fuel|Safeway":{nomatch:["shop/supermarket|Safeway"],tags:{amenity:"fuel",brand:"Safeway","brand:wikidata":"Q1508234","brand:wikipedia":"en:Safeway Inc.",name:"Safeway"}},"amenity/fuel|Sainsbury's":{countryCodes:["gb"],nomatch:["shop/supermarket|Sainsbury's"],tags:{amenity:"fuel",brand:"Sainsbury's","brand:wikidata":"Q152096","brand:wikipedia":"en:Sainsbury's",name:"Sainsbury's"}},"amenity/fuel|Sam's Club":{nomatch:["shop/wholesale|Sam's Club"],tags:{amenity:"fuel",brand:"Sam's Club","brand:wikidata":"Q1972120","brand:wikipedia":"en:Sam's Club",name:"Sam's Club",operator:"Walmart","operator:wikidata":"Q483551","operator:wikipedia":"en:Walmart"}},"amenity/fuel|Sasol":{tags:{amenity:"fuel",brand:"Sasol","brand:wikidata":"Q905998","brand:wikipedia":"en:Sasol",name:"Sasol"}},"amenity/fuel|Sea Oil":{countryCodes:["ph"],tags:{amenity:"fuel",brand:"Sea Oil","brand:wikidata":"Q7389549","brand:wikipedia":"en:Seaoil Philippines",name:"Sea Oil"}},"amenity/fuel|Sheetz":{nomatch:["shop/convenience|Sheetz"],tags:{amenity:"fuel",brand:"Sheetz","brand:wikidata":"Q7492551","brand:wikipedia":"en:Sheetz",name:"Sheetz"}},"amenity/fuel|Shell":{matchNames:["posto shell","shell gas station","shell petrol station","shell station","station shell"],nomatch:["amenity/fuel|Shell Express","shop/convenience|Shell Select"],tags:{amenity:"fuel",brand:"Shell","brand:wikidata":"Q154950","brand:wikipedia":"en:Royal Dutch Shell",name:"Shell"}},"amenity/fuel|Shell Express":{nomatch:["amenity/fuel|Shell","shop/convenience|Shell Select"],tags:{amenity:"fuel",brand:"Shell Express","brand:wikidata":"Q2289188","brand:wikipedia":"nl:Shell Express",name:"Shell Express"}},"amenity/fuel|Sinclair":{countryCodes:["us"],tags:{amenity:"fuel",brand:"Sinclair","brand:wikidata":"Q1290900","brand:wikipedia":"en:Sinclair Oil Corporation",name:"Sinclair"}},"amenity/fuel|Sinopec":{countryCodes:["cn"],matchNames:["sinopec fuel"],tags:{amenity:"fuel",brand:"Sinopec","brand:wikidata":"Q831445","brand:wikipedia":"en:Sinopec","brand:zh":"中国石化",name:"Sinopec","name:zh":"中国石化"}},"amenity/fuel|Slovnaft":{tags:{amenity:"fuel",brand:"Slovnaft","brand:wikidata":"Q1587563","brand:wikipedia":"en:Slovnaft",name:"Slovnaft"}},"amenity/fuel|Socar":{tags:{amenity:"fuel",brand:"Socar","brand:wikidata":"Q1622293","brand:wikipedia":"en:SOCAR",name:"Socar"}},"amenity/fuel|Sokimex":{tags:{amenity:"fuel",brand:"Sokimex","brand:wikidata":"Q1149575","brand:wikipedia":"en:Sokimex",name:"Sokimex"}},"amenity/fuel|Sonic":{nomatch:["amenity/fast_food|Sonic"],tags:{amenity:"fuel",brand:"Sonic",name:"Sonic"}},"amenity/fuel|Speedway":{nomatch:["shop/convenience|Speedway"],tags:{amenity:"fuel",brand:"Speedway","brand:wikidata":"Q7575683","brand:wikipedia":"en:Speedway LLC",name:"Speedway"}},"amenity/fuel|Sprint":{countryCodes:["de"],nomatch:["shop/mobile_phone|Sprint"],tags:{amenity:"fuel",brand:"Sprint","brand:wikidata":"Q57588452",name:"Sprint"}},"amenity/fuel|St1":{tags:{amenity:"fuel",brand:"St1","brand:wikidata":"Q7592214","brand:wikipedia":"en:St1",name:"St1"}},"amenity/fuel|Star":{countryCodes:["de"],tags:{amenity:"fuel",brand:"Star","brand:wikidata":"Q2031095","brand:wikipedia":"de:Orlen Deutschland",name:"Star"}},"amenity/fuel|Star Oil":{tags:{amenity:"fuel",brand:"Star Oil",name:"Star Oil"}},"amenity/fuel|Station Service E. Leclerc":{matchNames:["e. leclerc"],tags:{amenity:"fuel",brand:"E.Leclerc","brand:wikidata":"Q1273376","brand:wikipedia":"fr:E.Leclerc",name:"Station Service E. Leclerc"}},"amenity/fuel|Statoil":{tags:{amenity:"fuel",brand:"Statoil","brand:wikidata":"Q1776022","brand:wikipedia":"en:Equinor",name:"Statoil"}},"amenity/fuel|Stewart's":{countryCodes:["us"],nomatch:["shop/convenience|Stewart's"],tags:{amenity:"fuel",brand:"Stewart's","brand:wikidata":"Q7615690","brand:wikipedia":"en:Stewart's Shops",name:"Stewart's"}},"amenity/fuel|Sunoco":{nomatch:["shop/convenience|Sunoco"],tags:{amenity:"fuel",brand:"Sunoco","brand:wikidata":"Q1423218","brand:wikipedia":"en:Sunoco",name:"Sunoco"}},"amenity/fuel|Super U":{countryCodes:["fr"],nomatch:["shop/convenience|Utile","shop/supermarket|Hyper U","shop/supermarket|Super U","shop/supermarket|U Express"],tags:{amenity:"fuel",brand:"Super U","brand:wikidata":"Q2529029","brand:wikipedia":"en:Système U",name:"Super U"}},"amenity/fuel|Susco":{tags:{amenity:"fuel",brand:"Susco",name:"Susco"}},"amenity/fuel|TA":{countryCodes:["us"],tags:{amenity:"fuel",brand:"TA","brand:wikidata":"Q7835892","brand:wikipedia":"en:TravelCenters of America",name:"TA"}},"amenity/fuel|Tamoil":{tags:{amenity:"fuel",brand:"Tamoil","brand:wikidata":"Q706793","brand:wikipedia":"en:Tamoil",name:"Tamoil"}},"amenity/fuel|Tango":{tags:{amenity:"fuel",brand:"Tango","brand:wikidata":"Q2423920","brand:wikipedia":"nl:Tango CV",name:"Tango"}},"amenity/fuel|Tanka":{countryCodes:["se"],tags:{amenity:"fuel",brand:"Tanka","brand:wikidata":"Q10690640","brand:wikipedia":"sv:Tanka (bensinstationskedja)",name:"Tanka"}},"amenity/fuel|Teboil":{tags:{amenity:"fuel",brand:"Teboil","brand:wikidata":"Q7692079","brand:wikipedia":"en:Teboil",name:"Teboil"}},"amenity/fuel|Tela":{countryCodes:["kh"],tags:{amenity:"fuel",brand:"Tela","brand:wikidata":"Q62534875",name:"Tela"}},"amenity/fuel|Tempo":{countryCodes:["ca"],tags:{amenity:"fuel",brand:"Tempo","brand:wikidata":"Q62535175",name:"Tempo"}},"amenity/fuel|Terpel":{tags:{amenity:"fuel",brand:"Terpel","brand:wikidata":"Q7703003","brand:wikipedia":"en:Terpel",name:"Terpel"}},"amenity/fuel|Tesco":{nomatch:["shop/convenience|Tesco"],tags:{amenity:"fuel",brand:"Tesco","brand:wikidata":"Q17145596","brand:wikipedia":"en:Tesco Corporation",name:"Tesco"}},"amenity/fuel|Texaco":{nomatch:["shop/convenience|Texaco"],tags:{amenity:"fuel",brand:"Texaco","brand:wikidata":"Q775060","brand:wikipedia":"en:Texaco",name:"Texaco"}},"amenity/fuel|Tinq":{countryCodes:["nl"],tags:{amenity:"fuel",brand:"Tinq","brand:wikidata":"Q2132028","brand:wikipedia":"nl:Tinq",name:"Tinq"}},"amenity/fuel|Topaz":{countryCodes:["ie"],tags:{amenity:"fuel",brand:"Topaz","brand:wikidata":"Q7824764","brand:wikipedia":"en:Topaz Energy",name:"Topaz"}},"amenity/fuel|Total":{matchNames:["station total"],nomatch:["shop/convenience|Total"],tags:{amenity:"fuel",brand:"Total","brand:wikidata":"Q154037","brand:wikipedia":"fr:Total (entreprise)",name:"Total"}},"amenity/fuel|Total Access":{tags:{amenity:"fuel",brand:"Total Access","brand:wikidata":"Q154037","brand:wikipedia":"fr:Total (entreprise)",name:"Total Access"}},"amenity/fuel|TotalErg":{tags:{amenity:"fuel",brand:"TotalErg","brand:wikidata":"Q3995933","brand:wikipedia":"it:TotalErg",name:"TotalErg"}},"amenity/fuel|Turkey Hill":{countryCodes:["us"],nomatch:["shop/convenience|Turkey Hill"],tags:{amenity:"fuel",brand:"Turkey Hill","brand:wikidata":"Q42376970","brand:wikipedia":"en:Turkey Hill Minit Markets",name:"Turkey Hill"}},"amenity/fuel|Turmöl":{tags:{amenity:"fuel",brand:"Turmöl","brand:wikidata":"Q1473279","brand:wikipedia":"de:Turmöl",name:"Turmöl"}},"amenity/fuel|UDF Fuel":{countryCodes:["us"],matchNames:["udf","udf fuels","united dairy farmers"],nomatch:["shop/convenience|United Dairy Farmers"],tags:{amenity:"fuel",brand:"United Dairy Farmers","brand:wikidata":"Q7887677","brand:wikipedia":"en:United Dairy Farmers",name:"UDF Fuel",short_name:"UDF"}},"amenity/fuel|Ultramar":{nomatch:["shop/convenience|Ultramar"],tags:{amenity:"fuel",brand:"Ultramar","brand:wikidata":"Q3548078","brand:wikipedia":"en:Ultramar",name:"Ultramar"}},"amenity/fuel|United":{matchNames:["united petroleum"],nomatch:["amenity/bank|United Bank"],tags:{amenity:"fuel",brand:"United","brand:wikidata":"Q28224393","brand:wikipedia":"en:United Petroleum",name:"United"}},"amenity/fuel|Uno":{countryCodes:["bz","cr","gt","hn","ni","sv"],tags:{amenity:"fuel",brand:"Uno","brand:wikidata":"Q62535574",name:"Uno"}},"amenity/fuel|Uno-X":{countryCodes:["dk"],tags:{amenity:"fuel",brand:"Uno-X","brand:wikidata":"Q3362746","brand:wikipedia":"en:Uno-X",name:"Uno-X"}},"amenity/fuel|Valero":{nomatch:["shop/convenience|Valero"],tags:{amenity:"fuel",brand:"Valero","brand:wikidata":"Q1283291","brand:wikipedia":"en:Valero Energy",name:"Valero"}},"amenity/fuel|Viada":{tags:{amenity:"fuel",brand:"Viada","brand:wikidata":"Q12663942","brand:wikipedia":"en:Lukoil Baltija",name:"Viada"}},"amenity/fuel|Vito":{countryCodes:["fr"],tags:{amenity:"fuel",brand:"Vito","brand:wikidata":"Q62536473",name:"Vito"}},"amenity/fuel|WOG":{tags:{amenity:"fuel",brand:"WOG","brand:wikidata":"Q12072939","brand:wikipedia":"en:WOG (gas stations)",name:"WOG"}},"amenity/fuel|Walmart":{nomatch:["shop/department_store|Walmart","shop/supermarket|Walmart Neighborhood Market","shop/supermarket|Walmart Supercenter"],tags:{amenity:"fuel",brand:"Walmart","brand:wikidata":"Q62606411","brand:wikipedia":"en:Walmart",name:"Walmart"}},"amenity/fuel|Wawa":{nomatch:["shop/convenience|Wawa"],tags:{amenity:"fuel",brand:"Wawa","brand:wikidata":"Q5936320","brand:wikipedia":"en:Wawa (company)",name:"Wawa"}},"amenity/fuel|Westfalen":{countryCodes:["de"],tags:{amenity:"fuel",brand:"Westfalen","brand:wikidata":"Q1411209","brand:wikipedia":"en:Westfalen AG",name:"Westfalen"}},"amenity/fuel|Woolworths Petrol":{countryCodes:["au"],nomatch:["shop/convenience|Woolworths Petrol"],tags:{amenity:"fuel",brand:"Caltex","brand:wikidata":"Q5023980","brand:wikipedia":"en:Caltex Woolworths",name:"Woolworths Petrol"}},"amenity/fuel|XTR":{countryCodes:["ca"],tags:{amenity:"fuel",brand:"XTR","brand:wikidata":"Q62537250",name:"XTR"}},"amenity/fuel|YPF":{tags:{amenity:"fuel",brand:"YPF","brand:wikidata":"Q2006989","brand:wikipedia":"en:YPF",name:"YPF"}},"amenity/fuel|Z":{countryCodes:["nz"],nomatch:["shop/clothes|Z"],tags:{amenity:"fuel",brand:"Z","brand:wikidata":"Q8063337","brand:wikipedia":"en:Z Energy",name:"Z"}},"amenity/fuel|bft":{countryCodes:["de"],tags:{amenity:"fuel",brand:"bft","brand:wikidata":"Q1009104","brand:wikipedia":"de:Bundesverband freier Tankstellen",name:"bft"}},"amenity/fuel|din-X":{countryCodes:["se"],tags:{amenity:"fuel",brand:"din-X","brand:wikidata":"Q10472858","brand:wikipedia":"sv:Din-X",name:"din-X"}},"amenity/fuel|Авіас":{countryCodes:["ua"],tags:{amenity:"fuel",brand:"Авіас","brand:wikidata":"Q12122687","brand:wikipedia":"uk:Мережа АЗС Приват",name:"Авіас"}},"amenity/fuel|БРСМ-Нафта":{countryCodes:["ua"],tags:{amenity:"fuel",brand:"БРСМ-Нафта","brand:wikidata":"Q56356523","brand:wikipedia":"uk:БРСМ-Нафта",name:"БРСМ-Нафта"}},"amenity/fuel|Башнефть":{countryCodes:["ru"],tags:{amenity:"fuel",brand:"Башнефть","brand:en":"Bashneft","brand:wikidata":"Q809985","brand:wikipedia":"en:Bashneft",name:"Башнефть","name:en":"Bashneft"}},"amenity/fuel|Белоруснефть":{tags:{amenity:"fuel",brand:"Белоруснефть","brand:wikidata":"Q4082693","brand:wikipedia":"ru:Белоруснефть",name:"Белоруснефть"}},"amenity/fuel|Газпромнефть":{matchNames:["газпром"],tags:{amenity:"fuel",brand:"Газпромнефть","brand:wikidata":"Q1461799","brand:wikipedia":"en:Gazprom Neft",name:"Газпромнефть"}},"amenity/fuel|Гелиос":{countryCodes:["kz"],matchNames:["helios"],tags:{amenity:"fuel",brand:"Гелиос","brand:en":"Helios","brand:wikidata":"Q62286471",name:"Гелиос","name:en":"Helios"}},"amenity/fuel|ЕКА":{countryCodes:["ru"],tags:{amenity:"fuel",brand:"ЕКА","brand:wikidata":"Q62543029",name:"ЕКА"}},"amenity/fuel|КЛО":{countryCodes:["ua"],tags:{amenity:"fuel",brand:"КЛО","brand:en":"Klo","brand:wikidata":"Q60966526","brand:wikipedia":"ru:КЛО (сеть АЗС)",name:"КЛО","name:en":"Klo"}},"amenity/fuel|КазМунайГаз":{countryCodes:["kz"],nomatch:["shop/convenience|КазМунайГаз"],tags:{amenity:"fuel",brand:"КазМунайГаз","brand:wikidata":"Q1417227","brand:wikipedia":"en:KazMunayGas",name:"КазМунайГаз"}},"amenity/fuel|Лукойл":{matchNames:["лукоил"],nomatch:["shop/convenience|Лукойл"],tags:{amenity:"fuel",brand:"Лукойл","brand:wikidata":"Q329347","brand:wikipedia":"ru:Лукойл",name:"Лукойл"}},"amenity/fuel|Макпетрол":{countryCodes:["mk"],tags:{amenity:"fuel",brand:"Макпетрол","brand:wikidata":"Q1886438","brand:wikipedia":"en:Makpetrol",name:"Макпетрол"}},"amenity/fuel|НК Альянс":{countryCodes:["ru"],tags:{amenity:"fuel",brand:"НК Альянс","brand:wikidata":"Q4063700","brand:wikipedia":"ru:Альянс (компания)",name:"НК Альянс"}},"amenity/fuel|Нефтьмагистраль":{countryCodes:["ru"],tags:{amenity:"fuel",brand:"Нефтьмагистраль","brand:en":"Neftmagistral","brand:wikidata":"Q62544323",name:"Нефтьмагистраль","name:en":"Neftmagistral"}},"amenity/fuel|ОККО":{tags:{amenity:"fuel",brand:"ОККО","brand:en":"OKKO","brand:wikidata":"Q7072617","brand:wikipedia":"en:OKKO",name:"ОККО","name:en":"OKKO"}},"amenity/fuel|ОМВ":{countryCodes:["bg","rs"],tags:{amenity:"fuel",brand:"ОМВ","brand:wikidata":"Q168238","brand:wikipedia":"en:OMV",name:"ОМВ"}},"amenity/fuel|ПТК":{tags:{amenity:"fuel",brand:"ПТК","brand:en":"The Petersburg Fuel Company","brand:wikidata":"Q4360193","brand:wikipedia":"en:Petersburg Fuel Company",name:"ПТК","name:en":"The Petersburg Fuel Company"}},"amenity/fuel|Петрол":{countryCodes:["bg"],tags:{amenity:"fuel",brand:"Петрол","brand:en":"Petrol AD","brand:wikidata":"Q24315","brand:wikipedia":"en:Petrol AD",name:"Петрол","name:en":"Petrol AD"}},"amenity/fuel|Роснефть":{tags:{amenity:"fuel",brand:"Роснефть","brand:en":"Rosneft","brand:wikidata":"Q1141123","brand:wikipedia":"en:Rosneft",name:"Роснефть","name:en":"Rosneft"}},"amenity/fuel|Сургутнефтегаз":{tags:{amenity:"fuel",brand:"Сургутнефтегаз","brand:en":"Surgutneftegas","brand:wikidata":"Q680776","brand:wikipedia":"en:Surgutneftegas",name:"Сургутнефтегаз","name:en":"Surgutneftegas"}},"amenity/fuel|ТНК":{tags:{amenity:"fuel",brand:"ТНК","brand:wikidata":"Q2298901","brand:wikipedia":"en:TNK-BP",name:"ТНК"}},"amenity/fuel|Татнефтепродукт":{countryCodes:["ru"],tags:{amenity:"fuel",brand:"Татнефтепродукт",name:"Татнефтепродукт",operator:"ТАИФ","operator:wikidata":"Q4448860","operator:wikipedia":"en:ТАИФ"}},"amenity/fuel|Татнефть":{tags:{amenity:"fuel",brand:"Татнефть","brand:en":"Tatneft","brand:wikidata":"Q1616858","brand:wikipedia":"en:Tatneft",name:"Татнефть","name:en":"Tatneft"}},"amenity/fuel|Укрнафта":{tags:{amenity:"fuel",brand:"Укрнафта","brand:en":"Ukrnafta","brand:wikidata":"Q2447961","brand:wikipedia":"en:Ukrnafta",name:"Укрнафта","name:en":"Ukrnafta"}},"amenity/fuel|דור אלון":{countryCodes:["il"],tags:{amenity:"fuel",brand:"דור אלון","brand:en":"Dor Alon","brand:he":"דור אלון","brand:wikidata":"Q16130352","brand:wikipedia":"he:דור אלון אנרגיה בישראל (1988)",name:"דור אלון","name:en":"Dor Alon","name:he":"דור אלון"}},"amenity/fuel|סונול":{countryCodes:["il"],tags:{amenity:"fuel",brand:"סונול","brand:en":"Sonol","brand:he":"סונול","brand:wikidata":"Q3701622","brand:wikipedia":"en:Sonol",name:"סונול","name:en":"Sonol","name:he":"סונול"}},"amenity/fuel|פז":{countryCodes:["il"],tags:{amenity:"fuel",brand:"פז","brand:en":"Paz","brand:he":"פז","brand:wikidata":"Q2211731","brand:wikipedia":"en:Paz Oil Company",name:"פז","name:en":"Paz","name:he":"פז"}},"amenity/fuel|ادنوك":{tags:{amenity:"fuel",brand:"ادنوك","brand:ar":"ادنوك","brand:en":"ADNOC","brand:wikidata":"Q166729","brand:wikipedia":"en:Abu Dhabi National Oil Company",name:"ادنوك","name:ar":"ادنوك","name:en":"ADNOC"}},"amenity/fuel|บางจาก":{countryCodes:["th"],tags:{amenity:"fuel",brand:"บางจาก","brand:en":"Bangchak","brand:th":"บางจาก","brand:wikidata":"Q6579719","brand:wikipedia":"th:บางจาก คอร์ปอเรชัน",name:"บางจาก","name:en":"Bangchak","name:th":"บางจาก"}},"amenity/fuel|ป.ต.ท.":{countryCodes:["th"],tags:{amenity:"fuel",brand:"ป.ต.ท.","brand:en":"PTT","brand:th":"ป.ต.ท.","brand:wikidata":"Q1810389","brand:wikipedia":"th:ปตท.",name:"ป.ต.ท.","name:en":"PTT","name:th":"ป.ต.ท."}},"amenity/fuel|เชลล์":{countryCodes:["th"],tags:{amenity:"fuel",brand:"เชลล์","brand:en":"Shell","brand:th":"เชลล์","brand:wikidata":"Q154950","brand:wikipedia":"en:Royal Dutch Shell",name:"เชลล์","name:en":"Shell","name:th":"เชลล์"}},"amenity/fuel|เอสโซ่":{countryCodes:["th"],tags:{amenity:"fuel",brand:"เอสโซ่","brand:en":"Esso","brand:th":"เอสโซ่","brand:wikidata":"Q867662","brand:wikipedia":"en:Esso",name:"เอสโซ่","name:en":"Esso","name:th":"เอสโซ่"}},"amenity/fuel|エッソ":{countryCodes:["jp"],matchNames:["エッソ石油"],tags:{amenity:"fuel",brand:"エッソ","brand:en":"Esso","brand:ja":"エッソ","brand:wikidata":"Q867662","brand:wikipedia":"en:Esso",name:"エッソ","name:en":"Esso","name:ja":"エッソ"}},"amenity/fuel|エネオス":{countryCodes:["jp"],tags:{amenity:"fuel",brand:"エネオス","brand:en":"JXTG Nippon Oil & Energy","brand:ja":"エネオス","brand:wikidata":"Q1640290","brand:wikipedia":"en:JXTG Nippon Oil & Energy",name:"エネオス","name:en":"JXTG Nippon Oil & Energy","name:ja":"エネオス"}},"amenity/fuel|コスモ石油":{countryCodes:["jp"],tags:{amenity:"fuel",brand:"コスモ石油","brand:en":"Cosmo Oil Company","brand:ja":"コスモ石油","brand:wikidata":"Q2498318","brand:wikipedia":"en:Cosmo Oil Company",name:"コスモ石油","name:en":"Cosmo Oil Company","name:ja":"コスモ石油"}},"amenity/fuel|ゼネラル":{countryCodes:["jp"],tags:{amenity:"fuel",brand:"ゼネラル","brand:en":"Tonen General","brand:ja":"ゼネラル","brand:wikidata":"Q11528048","brand:wikipedia":"ja:東燃ゼネラル石油",name:"ゼネラル","name:en":"Tonen General","name:ja":"ゼネラル"}},"amenity/fuel|中国石化":{countryCodes:["cn"],matchNames:["中国石化 Sinopec"],tags:{amenity:"fuel",brand:"中国石化","brand:en":"Sinopec","brand:wikidata":"Q831445","brand:wikipedia":"en:Sinopec",name:"中国石化","name:en":"Sinopec"}},"amenity/fuel|中国石油":{tags:{amenity:"fuel",brand:"中国石油","brand:en":"PetroChina","brand:wikidata":"Q503182","brand:wikipedia":"en:PetroChina",name:"中国石油","name:en":"PetroChina"}},"amenity/fuel|出光":{countryCodes:["jp"],tags:{amenity:"fuel",brand:"出光","brand:en":"Idemitsu Kosan","brand:wikidata":"Q2216770","brand:wikipedia":"en:Idemitsu Kosan",name:"出光","name:en":"Idemitsu Kosan"}},"amenity/fuel|台灣中油":{countryCodes:["tw"],matchNames:["中油"],tags:{amenity:"fuel",brand:"台灣中油","brand:en":"CPC Corporation, Taiwan","brand:wikidata":"Q21527177","brand:wikipedia":"en:CPC Corporation, Taiwan",name:"台灣中油","name:en":"CPC Corporation, Taiwan"}},"amenity/fuel|昭和シェル":{countryCodes:["jp"],matchNames:["昭和シェル石油"],tags:{amenity:"fuel",brand:"昭和シェル","brand:en":"Showa Shell Sekiyu","brand:ja":"昭和シェル","brand:wikidata":"Q277115","brand:wikipedia":"en:Showa Shell Sekiyu",name:"昭和シェル","name:en":"Showa Shell Sekiyu","name:ja":"昭和シェル"}},"amenity/ice_cream|Baskin-Robbins":{tags:{amenity:"ice_cream",brand:"Baskin-Robbins","brand:wikidata":"Q584601","brand:wikipedia":"en:Baskin-Robbins",cuisine:"ice_cream",name:"Baskin-Robbins"}},"amenity/ice_cream|Ben & Jerry's":{matchNames:["ben and jerrys"],tags:{amenity:"ice_cream",brand:"Ben & Jerry's","brand:wikidata":"Q816412","brand:wikipedia":"en:Ben & Jerry's",cuisine:"ice_cream",name:"Ben & Jerry's"}},"amenity/ice_cream|Cold Stone Creamery":{matchNames:["cold stone"],tags:{amenity:"ice_cream",brand:"Cold Stone Creamery","brand:wikidata":"Q1094923","brand:wikipedia":"en:Cold Stone Creamery",cuisine:"ice_cream",name:"Cold Stone Creamery"}},"amenity/ice_cream|D'Onofrio":{countryCodes:["pe"],tags:{amenity:"ice_cream",brand:"D'Onofrio","brand:wikidata":"Q5203166","brand:wikipedia":"es:D'Onofrio",cuisine:"ice_cream",name:"D'Onofrio"}},"amenity/ice_cream|Freddo":{tags:{amenity:"ice_cream",brand:"Freddo","brand:wikidata":"Q28823999","brand:wikipedia":"es:Freddo",cuisine:"ice_cream",name:"Freddo"}},"amenity/ice_cream|Graeter's":{countryCodes:["us"],matchNames:["greaters"],tags:{amenity:"ice_cream",brand:"Graeter's","brand:wikidata":"Q5592430","brand:wikipedia":"en:Graeter's",cuisine:"ice_cream",name:"Graeter's",takeaway:"yes"}},"amenity/ice_cream|Grido":{countryCodes:["ar"],matchNames:["grido helado"],tags:{amenity:"ice_cream",brand:"Grido","brand:wikidata":"Q5885724","brand:wikipedia":"es:Grido Helado",cuisine:"ice_cream",name:"Grido"}},"amenity/ice_cream|La Michoacana":{tags:{amenity:"ice_cream",brand:"La Michoacana",name:"La Michoacana"}},"amenity/ice_cream|Ralph's Italian Ices":{countryCodes:["us"],matchNames:["ralphs famous italian ices","ralphs famous italian ices & ice cream","ralphs famous italian ices and ice cream","ralphs italian ice","ralphs italian ices & ice cream","ralphs italian ices and ice cream"],tags:{amenity:"ice_cream",brand:"Ralph's Italian Ices","brand:wikidata":"Q62576909",cuisine:"ice_cream",name:"Ralph's Italian Ices",official_name:"Ralph's Famous Italian Ices"}},"amenity/ice_cream|Rita's Italian Ice":{countryCodes:["us"],matchNames:["rita's water ice"],tags:{amenity:"ice_cream",brand:"Rita's Italian Ice","brand:wikidata":"Q7336456","brand:wikipedia":"en:Rita's Italian Ice",cuisine:"ice_cream",name:"Rita's Italian Ice"}},"amenity/ice_cream|sweetFrog":{countryCodes:["us"],matchNames:["sweetfrog frozen yogurt","sweetfrog premium frozen yogurt"],tags:{amenity:"ice_cream",brand:"sweetFrog","brand:wikidata":"Q16952110","brand:wikipedia":"en:Sweet Frog",cuisine:"frozen_yogurt",name:"sweetFrog"}},"amenity/ice_cream|サーティワンアイスクリーム":{countryCodes:["jp"],tags:{amenity:"ice_cream",brand:"バスキン・ロビンス","brand:en":"Baskin-Robbins","brand:ja":"バスキン・ロビンス","brand:wikidata":"Q584601","brand:wikipedia":"ja:バスキン・ロビンス",cuisine:"ice_cream",name:"サーティワンアイスクリーム","name:en":"Baskin-Robbins","name:ja":"サーティワンアイスクリーム"}},"amenity/kindergarten|KinderCare":{countryCodes:["us"],matchNames:["kindercare learning center"],tags:{after_school:"yes",alt_name:"KinderCare Learning Center",amenity:"kindergarten",brand:"KinderCare","brand:wikidata":"Q6410551","brand:wikipedia":"en:KinderCare Learning Centers",fee:"yes","isced:level":"0",max_age:"12",min_age:"6 weeks",name:"KinderCare",nursery:"yes",preschool:"yes"}},"amenity/money_transfer|Express Union":{countryCodes:["td"],matchTags:["amenity/bank"],nomatch:["amenity/bank|Banco Unión","amenity/bank|UnionBank"],tags:{amenity:"money_transfer",brand:"Express Union","brand:wikidata":"Q3062276","brand:wikipedia":"fr:Express Union",name:"Express Union"}},"amenity/money_transfer|Orange Money":{tags:{amenity:"money_transfer",brand:"Orange Money","brand:wikidata":"Q16668220","brand:wikipedia":"en:Orange Money",name:"Orange Money"}},"amenity/money_transfer|Western Union":{matchTags:["amenity/bureau_de_change"],nomatch:["amenity/bank|Western Union"],tags:{amenity:"money_transfer",brand:"Western Union","brand:wikidata":"Q861042","brand:wikipedia":"en:Western Union",name:"Western Union"}},"amenity/payment_centre|Abitab":{countryCodes:["uy"],tags:{amenity:"payment_centre",brand:"Abitab","brand:wikidata":"Q16488129","brand:wikipedia":"es:Abitab",name:"Abitab"}},"amenity/payment_centre|Rapipago":{countryCodes:["ar"],tags:{amenity:"payment_centre",brand:"Rapipago","brand:wikidata":"Q6100413","brand:wikipedia":"es:Rapipago",name:"Rapipago"}},"amenity/payment_terminal|Qiwi":{tags:{amenity:"payment_terminal",brand:"Qiwi","brand:wikidata":"Q4047736","brand:wikipedia":"en:Qiwi",name:"Qiwi"}},"amenity/payment_terminal|ПриватБанк":{countryCodes:["ua"],tags:{amenity:"payment_terminal",brand:"ПриватБанк","brand:wikidata":"Q1515015","brand:wikipedia":"en:PrivatBank",name:"ПриватБанк"}},"amenity/payment_terminal|Сбербанк":{tags:{amenity:"payment_terminal",brand:"Сбербанк",name:"Сбербанк"}},"amenity/payment_terminal|Элекснет":{countryCodes:["ru"],tags:{amenity:"payment_terminal",brand:"Элекснет","brand:wikidata":"Q4530795","brand:wikipedia":"ru:Элекснет",name:"Элекснет"}},"amenity/pharmacy|36,6":{countryCodes:["ru"],matchNames:["аптека 36,6"],tags:{amenity:"pharmacy",brand:"36,6","brand:wikidata":"Q226889","brand:wikipedia":"ru:36,6 (аптечная сеть)",healthcare:"pharmacy",name:"36,6"}},"amenity/pharmacy|Amavita":{tags:{amenity:"pharmacy",brand:"Amavita",healthcare:"pharmacy",name:"Amavita"}},"amenity/pharmacy|Amcal":{countryCodes:["au"],matchNames:["amcal pharmacy"],tags:{amenity:"pharmacy",brand:"Amcal","brand:wikidata":"Q63367373",healthcare:"pharmacy",name:"Amcal"}},"amenity/pharmacy|Apollo Pharmacy":{countryCodes:["in"],tags:{amenity:"pharmacy",brand:"Apollo Pharmacy","brand:wikidata":"Q62562612",healthcare:"pharmacy",name:"Apollo Pharmacy",operator:"Apollo Hospitals","operator:wikidata":"Q4780321","operator:wikipedia":"en:Apollo Hospitals"}},"amenity/pharmacy|Apotek Hjärtat":{countryCodes:["se"],tags:{amenity:"pharmacy",brand:"Apotek Hjärtat","brand:wikidata":"Q10416114","brand:wikipedia":"sv:Apotek Hjärtat",healthcare:"pharmacy",name:"Apotek Hjärtat"}},"amenity/pharmacy|Bartell Drugs":{countryCodes:["us"],tags:{amenity:"pharmacy",brand:"Bartell Drugs","brand:wikidata":"Q4865152","brand:wikipedia":"en:Bartell Drugs",healthcare:"pharmacy",name:"Bartell Drugs"}},"amenity/pharmacy|Benavides":{countryCodes:["mx"],tags:{amenity:"pharmacy",brand:"Benavides","brand:wikidata":"Q5435613","brand:wikipedia":"en:Farmacias Benavides",healthcare:"pharmacy",name:"Benavides"}},"amenity/pharmacy|Benu":{tags:{amenity:"pharmacy",brand:"Benu","brand:wikidata":"Q62562792",healthcare:"pharmacy",name:"Benu"}},"amenity/pharmacy|Blooms The Chemist":{countryCodes:["au"],tags:{amenity:"pharmacy",brand:"Blooms The Chemist","brand:wikidata":"Q63367543",healthcare:"pharmacy",name:"Blooms The Chemist",shop:"chemist"}},"amenity/pharmacy|Boots":{countryCodes:["gb"],matchNames:["boots pharmacy"],nomatch:["shop/chemist|Boots"],tags:{amenity:"pharmacy",brand:"Boots","brand:wikidata":"Q6123139","brand:wikipedia":"en:Boots UK",healthcare:"pharmacy",name:"Boots"}},"amenity/pharmacy|Boticas y Salud":{countryCodes:["pe"],tags:{amenity:"pharmacy",brand:"Boticas y Salud","brand:wikidata":"Q62563126",healthcare:"pharmacy",name:"Boticas y Salud"}},"amenity/pharmacy|Brookshire Brothers Pharmacy":{countryCodes:["us"],tags:{amenity:"pharmacy",brand:"Brookshire Brothers Pharmacy","brand:wikidata":"Q4975084","brand:wikipedia":"en:Brookshire Brothers",healthcare:"pharmacy",name:"Brookshire Brothers Pharmacy"}},"amenity/pharmacy|Brookshire's Pharmacy":{tags:{amenity:"pharmacy",brand:"Brookshire's Pharmacy",healthcare:"pharmacy",name:"Brookshire's Pharmacy"}},"amenity/pharmacy|CVS":{matchNames:["cvs pharmacy"],nomatch:["shop/chemist|CVS"],tags:{amenity:"pharmacy",brand:"CVS","brand:wikidata":"Q2078880","brand:wikipedia":"en:CVS Pharmacy",healthcare:"pharmacy",name:"CVS"}},"amenity/pharmacy|Camelia":{countryCodes:["lt"],tags:{amenity:"pharmacy",brand:"Camelia","brand:wikidata":"Q15867413","brand:wikipedia":"lt:Nemuno vaistinė",healthcare:"pharmacy",name:"Camelia"}},"amenity/pharmacy|Catena":{countryCodes:["ro"],tags:{amenity:"pharmacy",brand:"Catena","brand:wikidata":"Q24035728","brand:wikipedia":"ro:Farmacia Catena",healthcare:"pharmacy",name:"Catena"}},"amenity/pharmacy|Chemist King Discount Pharmacy":{countryCodes:["au"],matchNames:["chemist king","chemist king discount pharmacies"],tags:{amenity:"pharmacy",brand:"Chemist King Discount Pharmacy","brand:wikidata":"Q63367667",healthcare:"pharmacy",name:"Chemist King Discount Pharmacy"}},"amenity/pharmacy|Chemist Warehouse":{countryCodes:["au","nz"],tags:{amenity:"pharmacy",brand:"Chemist Warehouse","brand:wikidata":"Q48782120","brand:wikipedia":"en:Chemist Warehouse",healthcare:"pharmacy",name:"Chemist Warehouse"}},"amenity/pharmacy|Clicks":{countryCodes:["za"],tags:{amenity:"pharmacy",brand:"Clicks","brand:wikidata":"Q62563622",healthcare:"pharmacy",name:"Clicks"}},"amenity/pharmacy|Costco Pharmacy":{nomatch:["amenity/fuel|Costco Gasoline","shop/wholesale|Costco"],tags:{amenity:"pharmacy",brand:"Costco Pharmacy","brand:wikidata":"Q715583","brand:wikipedia":"en:Costco",healthcare:"pharmacy",name:"Costco Pharmacy"}},"amenity/pharmacy|Cruz Azul":{countryCodes:["ec"],matchNames:["farmacias cruz azul"],tags:{amenity:"pharmacy",brand:"Cruz Azul","brand:wikidata":"Q62108219",healthcare:"pharmacy",name:"Cruz Azul"}},"amenity/pharmacy|Cruz Verde":{countryCodes:["cl"],matchNames:["farmacias cruz verde"],tags:{amenity:"pharmacy",brand:"Cruz Verde","brand:wikidata":"Q5856071","brand:wikipedia":"es:Farmacias Cruz Verde",healthcare:"pharmacy",name:"Cruz Verde"}},"amenity/pharmacy|Day Lewis Pharmacy":{countryCodes:["gb"],tags:{amenity:"pharmacy",brand:"Day Lewis Pharmacy","brand:wikidata":"Q62563772",healthcare:"pharmacy",name:"Day Lewis Pharmacy"}},"amenity/pharmacy|Dbam o Zdrowie":{countryCodes:["pl"],tags:{amenity:"pharmacy",brand:"Dbam o Zdrowie","brand:wikidata":"Q62563833",healthcare:"pharmacy",name:"Dbam o Zdrowie"}},"amenity/pharmacy|Dr. Max":{tags:{amenity:"pharmacy",brand:"Dr. Max","brand:wikidata":"Q56317371","brand:wikipedia":"fr:Dr.Max",healthcare:"pharmacy",name:"Dr. Max"}},"amenity/pharmacy|Droga Raia":{countryCodes:["br"],tags:{amenity:"pharmacy",brand:"Droga Raia","brand:wikidata":"Q10357101","brand:wikipedia":"pt:RaiaDrogasil",healthcare:"pharmacy",name:"Droga Raia"}},"amenity/pharmacy|Drogaria São Paulo":{countryCodes:["br"],tags:{amenity:"pharmacy",brand:"Drogaria São Paulo","brand:wikidata":"Q5308184","brand:wikipedia":"en:Grupo DPSP",healthcare:"pharmacy",name:"Drogaria São Paulo"}},"amenity/pharmacy|Drogasil":{countryCodes:["br"],tags:{amenity:"pharmacy",brand:"Drogasil","brand:wikidata":"Q5308185","brand:wikipedia":"pt:Drogasil",healthcare:"pharmacy",name:"Drogasil",wheelchair:"yes"}},"amenity/pharmacy|Duane Reade":{countryCodes:["us"],tags:{amenity:"pharmacy",brand:"Duane Reade","brand:wikidata":"Q5310380","brand:wikipedia":"en:Duane Reade",healthcare:"pharmacy",name:"Duane Reade"}},"amenity/pharmacy|Eurovaistinė":{countryCodes:["lt"],tags:{amenity:"pharmacy",brand:"Eurovaistinė","brand:wikidata":"Q267205","brand:wikipedia":"en:Euroapotheca",healthcare:"pharmacy",name:"Eurovaistinė"}},"amenity/pharmacy|Extrafarma":{countryCodes:["br"],tags:{amenity:"pharmacy",brand:"Extrafarma","brand:wikidata":"Q20055480","brand:wikipedia":"pt:Extrafarma",healthcare:"pharmacy",name:"Extrafarma"}},"amenity/pharmacy|Familiprix":{countryCodes:["ca"],tags:{amenity:"pharmacy",brand:"Familiprix","brand:wikidata":"Q3064881","brand:wikipedia":"en:Familiprix",healthcare:"pharmacy",name:"Familiprix"}},"amenity/pharmacy|Farmacenter~(Colombia)":{countryCodes:["co"],tags:{amenity:"pharmacy",brand:"Farmacenter","brand:wikidata":"Q62563928",healthcare:"pharmacy",name:"Farmacenter"}},"amenity/pharmacy|Farmacenter~(Paraguay)":{countryCodes:["py"],tags:{amenity:"pharmacy",brand:"Farmacenter","brand:wikidata":"",healthcare:"pharmacy",name:"Farmacenter"}},"amenity/pharmacy|Farmacia Benavides":{tags:{amenity:"pharmacy",brand:"Farmacia Benavides","brand:wikidata":"Q5435613","brand:wikipedia":"en:Farmacias Benavides",healthcare:"pharmacy",name:"Farmacia Benavides"}},"amenity/pharmacy|Farmacia Familiei":{tags:{amenity:"pharmacy",brand:"Farmacia Familiei",healthcare:"pharmacy",name:"Farmacia Familiei"}},"amenity/pharmacy|Farmacia Guadalajara":{countryCodes:["mx"],matchNames:["farmacias guadalajara"],tags:{amenity:"pharmacy",brand:"Farmacia Guadalajara","brand:wikidata":"Q5435609","brand:wikipedia":"en:Farmacias Guadalajara",healthcare:"pharmacy",name:"Farmacia Guadalajara"}},"amenity/pharmacy|Farmacias Ahumada":{tags:{amenity:"pharmacy",brand:"Farmacias Ahumada","brand:wikidata":"Q5856069","brand:wikipedia":"es:Farmacias Ahumada",healthcare:"pharmacy",name:"Farmacias Ahumada"}},"amenity/pharmacy|Farmacias Económicas~(Ecuador)":{countryCodes:["ec"],tags:{amenity:"pharmacy",brand:"Farmacias Económicas","brand:wikidata":"Q62108380",healthcare:"pharmacy",name:"Farmacias Económicas"}},"amenity/pharmacy|Farmacias Económicas~(El Salvador)":{countryCodes:["sv"],tags:{amenity:"pharmacy",brand:"Farmacias Económicas","brand:wikidata":"Q62108397",healthcare:"pharmacy",name:"Farmacias Económicas"}},"amenity/pharmacy|Farmacias SalcoBrand":{countryCodes:["cl"],tags:{amenity:"pharmacy",brand:"Farmacias SalcoBrand","brand:wikidata":"Q2877054","brand:wikipedia":"es:Farmacias Salcobrand",healthcare:"pharmacy",name:"Farmacias SalcoBrand"}},"amenity/pharmacy|Farmacias Similares":{countryCodes:["cl","gt","mx"],matchNames:["similares"],tags:{amenity:"pharmacy",brand:"Farmacias Similares","brand:wikidata":"Q62564610",healthcare:"pharmacy",name:"Farmacias Similares"}},"amenity/pharmacy|Farmacias del Ahorro":{countryCodes:["mx"],matchNames:["farmacia del ahorro"],tags:{amenity:"pharmacy",brand:"Farmacias del Ahorro","brand:wikidata":"Q62086647",healthcare:"pharmacy",name:"Farmacias del Ahorro"}},"amenity/pharmacy|Farmacias del Dr. Simi":{countryCodes:["cl","gt","mx"],tags:{amenity:"pharmacy",brand:"Farmacias del Dr. Simi","brand:wikidata":"Q62564610",healthcare:"pharmacy",name:"Farmacias del Dr. Simi"}},"amenity/pharmacy|Farmacity":{countryCodes:["ra"],tags:{amenity:"pharmacy",brand:"Farmacity","brand:wikidata":"Q5856076","brand:wikipedia":"es:Farmacity",healthcare:"pharmacy",name:"Farmacity"}},"amenity/pharmacy|Farmacorp":{tags:{amenity:"pharmacy",brand:"Farmacorp",healthcare:"pharmacy",name:"Farmacorp"}},"amenity/pharmacy|Farmahorro":{tags:{amenity:"pharmacy",brand:"Farmahorro","brand:wikidata":"Q20015002","brand:wikipedia":"es:Farmahorro",healthcare:"pharmacy",name:"Farmahorro"}},"amenity/pharmacy|Farmatodo":{tags:{amenity:"pharmacy",brand:"Farmatodo","brand:wikidata":"Q5856092","brand:wikipedia":"es:Farmatodo",healthcare:"pharmacy",name:"Farmatodo"}},"amenity/pharmacy|Felicia":{countryCodes:["md"],tags:{amenity:"pharmacy",brand:"Felicia","brand:wikidata":"Q62564805",healthcare:"pharmacy",name:"Felicia"}},"amenity/pharmacy|Fybeca":{countryCodes:["ec"],tags:{amenity:"pharmacy",brand:"Fybeca","brand:wikidata":"Q62564822",healthcare:"pharmacy",name:"Fybeca"}},"amenity/pharmacy|Generika":{countryCodes:["ph"],matchNames:["generika drugstore"],tags:{amenity:"pharmacy",brand:"Generika","brand:wikidata":"Q62564876",healthcare:"pharmacy",name:"Generika"}},"amenity/pharmacy|Gintarinė vaistinė":{countryCodes:["lt"],tags:{amenity:"pharmacy",brand:"Gintarinė vaistinė","brand:wikidata":"Q15857801","brand:wikipedia":"lt:Gintarinė vaistinė",healthcare:"pharmacy",name:"Gintarinė vaistinė"}},"amenity/pharmacy|Guardian~(Asia)":{countryCodes:["bn","id","kh","my","sg","vn"],tags:{amenity:"pharmacy",brand:"Guardian","brand:wikidata":"Q63371124",healthcare:"pharmacy",name:"Guardian"}},"amenity/pharmacy|Guardian~(Australia)":{countryCodes:["au"],matchNames:["guardian pharmacies","guardian pharmacy"],tags:{brand:"Guardian","brand:wikidata":"Q63367814",healthcare:"pharmacy",name:"Guardian"}},"amenity/pharmacy|H-E-B Pharmacy":{countryCodes:["us"],tags:{amenity:"pharmacy",brand:"H-E-B Pharmacy","brand:wikidata":"Q830621","brand:wikipedia":"en:H-E-B",healthcare:"pharmacy",name:"H-E-B Pharmacy"}},"amenity/pharmacy|Hy-Vee Pharmacy":{countryCodes:["us"],tags:{amenity:"pharmacy",brand:"Hy-Vee Pharmacy","brand:wikidata":"Q1639719","brand:wikipedia":"en:Hy-Vee",healthcare:"pharmacy",name:"Hy-Vee Pharmacy"}},"amenity/pharmacy|Inkafarma":{tags:{amenity:"pharmacy",brand:"Inkafarma","brand:wikidata":"Q10997748","brand:wikipedia":"es:Inkafarma",healthcare:"pharmacy",name:"Inkafarma"}},"amenity/pharmacy|Jean Coutu":{countryCodes:["ca"],tags:{amenity:"pharmacy",brand:"Jean Coutu","brand:wikidata":"Q3117457","brand:wikipedia":"en:Jean Coutu Group",healthcare:"pharmacy",name:"Jean Coutu"}},"amenity/pharmacy|Kimia Farma":{tags:{amenity:"pharmacy",brand:"Kimia Farma","brand:wikidata":"Q11264892","brand:wikipedia":"en:Kimia Farma",healthcare:"pharmacy",name:"Kimia Farma"}},"amenity/pharmacy|Kinney Drugs":{tags:{amenity:"pharmacy",brand:"Kinney Drugs","brand:wikidata":"Q6414090","brand:wikipedia":"en:Kinney Drugs",healthcare:"pharmacy",name:"Kinney Drugs"}},"amenity/pharmacy|Kroger Pharmacy":{tags:{amenity:"pharmacy",brand:"Kroger Pharmacy",healthcare:"pharmacy",name:"Kroger Pharmacy"}},"amenity/pharmacy|Kronans Apotek":{tags:{amenity:"pharmacy",brand:"Kronans Apotek",healthcare:"pharmacy",name:"Kronans Apotek"}},"amenity/pharmacy|Lloyds Pharmacy":{matchNames:["lloyds"],tags:{amenity:"pharmacy",brand:"Lloyds Pharmacy","brand:wikidata":"Q6662870","brand:wikipedia":"en:LloydsPharmacy",healthcare:"pharmacy",name:"Lloyds Pharmacy"}},"amenity/pharmacy|London Drugs":{countryCodes:["ca"],tags:{amenity:"pharmacy",brand:"London Drugs","brand:wikidata":"Q3258955","brand:wikipedia":"en:London Drugs",healthcare:"pharmacy",name:"London Drugs"}},"amenity/pharmacy|Mannings":{countryCodes:["cn","hk","mo"],tags:{amenity:"pharmacy",brand:"Mannings","brand:wikidata":"Q13646560","brand:wikipedia":"en:Mannings",healthcare:"pharmacy",name:"Mannings"}},"amenity/pharmacy|Marc's Pharmacy":{countryCodes:["us"],nomatch:["shop/supermarket|Marc's"],tags:{amenity:"pharmacy",brand:"Marc's","brand:wikidata":"Q17080259","brand:wikipedia":"en:Marc's",healthcare:"pharmacy",name:"Marc's Pharmacy"}},"amenity/pharmacy|Mercury Drug":{countryCodes:["ph"],tags:{amenity:"pharmacy",brand:"Mercury Drug","brand:wikidata":"Q6818610","brand:wikipedia":"en:Mercury Drug",healthcare:"pharmacy",name:"Mercury Drug"}},"amenity/pharmacy|Mifarma":{countryCodes:["pe"],tags:{amenity:"pharmacy",brand:"Mifarma","brand:wikidata":"Q62564998",healthcare:"pharmacy",name:"Mifarma"}},"amenity/pharmacy|Multipharma":{countryCodes:["be"],tags:{amenity:"pharmacy",brand:"Multipharma","brand:wikidata":"Q62565018",healthcare:"pharmacy",name:"Multipharma"}},"amenity/pharmacy|Mēness aptieka":{countryCodes:["lv"],tags:{amenity:"pharmacy",brand:"Mēness aptieka","brand:wikidata":"Q57583051",healthcare:"pharmacy",name:"Mēness aptieka"}},"amenity/pharmacy|Pague Menos":{countryCodes:["br"],matchNames:["farmácia pague menos"],tags:{amenity:"pharmacy",brand:"Pague Menos","brand:wikidata":"Q7124466","brand:wikipedia":"pt:Pague Menos",healthcare:"pharmacy",name:"Pague Menos"}},"amenity/pharmacy|Panvel":{countryCodes:["br"],tags:{amenity:"pharmacy",brand:"Panvel","brand:wikipedia":"pt:Panvel","branf:wikidata":"Q10344254",healthcare:"pharmacy",name:"Panvel"}},"amenity/pharmacy|PharmaSave~(Australia)":{countryCodes:["au"],nomatch:["amenity/pharmacy|Pharmasave~(Canada)"],tags:{amenity:"pharmacy",brand:"PharmaSave","brand:wikidata":"Q63367906",healthcare:"pharmacy",name:"PharmaSave"}},"amenity/pharmacy|Pharmacie Principale":{tags:{amenity:"pharmacy",brand:"Pharmacie Principale","brand:wikidata":"Q1547749","brand:wikipedia":"fr:Groupe PP Holding",healthcare:"pharmacy",name:"Pharmacie Principale"}},"amenity/pharmacy|Pharmacy 4 Less":{countryCodes:["au"],tags:{amenity:"pharmacy",brand:"Pharmacy 4 Less","brand:wikidata":"Q63367608",healthcare:"pharmacy",name:"Pharmacy 4 Less"}},"amenity/pharmacy|Pharmaprix":{tags:{amenity:"pharmacy",brand:"Pharmaprix","brand:wikidata":"Q1820137","brand:wikipedia":"en:Shoppers Drug Mart",healthcare:"pharmacy",name:"Pharmaprix"}},"amenity/pharmacy|Pharmasave~(Canada)":{countryCodes:["ca"],nomatch:["amenity/pharmacy|Pharmasave~(Australia)"],tags:{amenity:"pharmacy",brand:"Pharmasave","brand:wikidata":"Q17093822","brand:wikipedia":"en:Pharmasave",healthcare:"pharmacy",name:"Pharmasave"}},"amenity/pharmacy|Priceline Pharmacy":{countryCodes:["au"],matchNames:["priceline"],tags:{amenity:"pharmacy",brand:"Priceline Pharmacy","brand:wikidata":"Q7242652","brand:wikipedia":"en:Priceline (Australia)",healthcare:"pharmacy",name:"Priceline Pharmacy"}},"amenity/pharmacy|Punto Farma~(Colombia)":{countryCodes:["co"],tags:{amenity:"pharmacy",brand:"Punto Farma","brand:wikidata":"Q62595271",healthcare:"pharmacy",name:"Punto Farma"}},"amenity/pharmacy|Punto Farma~(Honduras)":{countryCodes:["hn"],tags:{amenity:"pharmacy",brand:"Punto Farma","brand:wikidata":"Q62595229",healthcare:"pharmacy",name:"Punto Farma"}},"amenity/pharmacy|Punto Farma~(Paraguay)":{countryCodes:["py"],tags:{amenity:"pharmacy",brand:"Punto Farma","brand:wikidata":"Q62595220",healthcare:"pharmacy",name:"Punto Farma"}},"amenity/pharmacy|Rexall":{tags:{amenity:"pharmacy",brand:"Rexall","brand:wikidata":"Q7319360","brand:wikipedia":"en:Rexall",healthcare:"pharmacy",name:"Rexall"}},"amenity/pharmacy|Rite Aid":{countryCodes:["us"],matchNames:["rite aid pharmacy"],nomatch:["shop/chemist|Rite Aid"],tags:{amenity:"pharmacy",brand:"Rite Aid","brand:wikidata":"Q3433273","brand:wikipedia":"en:Rite Aid",healthcare:"pharmacy",name:"Rite Aid"}},"amenity/pharmacy|Rose Pharmacy":{countryCodes:["ph"],tags:{amenity:"pharmacy",brand:"Rose Pharmacy","brand:wikidata":"Q62663208",healthcare:"pharmacy",name:"Rose Pharmacy"}},"amenity/pharmacy|Rowlands Pharmacy":{countryCodes:["gb"],tags:{amenity:"pharmacy",brand:"Rowlands Pharmacy","brand:wikidata":"Q62663235",healthcare:"pharmacy",name:"Rowlands Pharmacy"}},"amenity/pharmacy|SalcoBrand":{countryCodes:["cl"],tags:{amenity:"pharmacy",brand:"SalcoBrand","brand:wikidata":"Q2877054","brand:wikipedia":"es:Farmacias Salcobrand",healthcare:"pharmacy",name:"SalcoBrand"}},"amenity/pharmacy|Sana Sana":{countryCodes:["ec"],matchNames:["farmacias sana sana"],tags:{amenity:"pharmacy",brand:"Sana Sana","brand:wikidata":"Q62564499",healthcare:"pharmacy",name:"Sana Sana"}},"amenity/pharmacy|Sensiblu":{countryCodes:["ro"],tags:{amenity:"pharmacy",brand:"Sensiblu","brand:wikidata":"Q12740640","brand:wikipedia":"ro:Sensiblu",healthcare:"pharmacy",name:"Sensiblu"}},"amenity/pharmacy|Shoppers Drug Mart":{countryCodes:["ca"],tags:{amenity:"pharmacy",brand:"Shoppers Drug Mart","brand:wikidata":"Q1820137","brand:wikipedia":"en:Shoppers Drug Mart",healthcare:"pharmacy",name:"Shoppers Drug Mart"}},"amenity/pharmacy|South Star Drug":{countryCodes:["ph"],tags:{amenity:"pharmacy",brand:"South Star Drug","brand:wikidata":"Q7568544","brand:wikipedia":"en:South Star Drug",healthcare:"pharmacy",name:"South Star Drug"}},"amenity/pharmacy|Superdrug":{countryCodes:["gb"],nomatch:["shop/chemist|Superdrug"],tags:{amenity:"pharmacy",brand:"Superdrug","brand:wikidata":"Q7643261","brand:wikipedia":"en:Superdrug",healthcare:"pharmacy",name:"Superdrug"}},"amenity/pharmacy|São João":{countryCodes:["br"],tags:{amenity:"pharmacy",brand:"São João","brand:wikidata":"Q62663306",healthcare:"pharmacy",name:"São João"}},"amenity/pharmacy|TGP":{countryCodes:["ph"],matchNames:["the generics pharmacy"],tags:{amenity:"pharmacy",brand:"The Generics Pharmacy","brand:wikidata":"Q61948677",healthcare:"pharmacy",name:"TGP",official_name:"The Generics Pharmacy"}},"amenity/pharmacy|TerryWhite Chemmart":{countryCodes:["au"],matchNames:["terrywhite","terrywhite chemist","terrywhite chemists"],tags:{amenity:"pharmacy",brand:"TerryWhite Chemmart","brand:wikidata":"Q24089773","brand:wikipedia":"en:Terry White Chemmart",healthcare:"pharmacy",name:"TerryWhite Chemmart"}},"amenity/pharmacy|UFS":{countryCodes:["au"],matchNames:["ufs dispensaries"],tags:{amenity:"pharmacy",brand:"UFS","brand:wikidata":"Q63367573",healthcare:"pharmacy",name:"UFS"}},"amenity/pharmacy|Unichem Pharmacy":{countryCodes:["nz"],tags:{amenity:"pharmacy",brand:"Unichem Pharmacy","brand:wikidata":"Q62663379",healthcare:"pharmacy",name:"Unichem Pharmacy"}},"amenity/pharmacy|Uniprix":{countryCodes:["ca"],tags:{amenity:"pharmacy",brand:"Uniprix","brand:wikidata":"Q683265","brand:wikipedia":"en:Uniprix",healthcare:"pharmacy",name:"Uniprix"}},"amenity/pharmacy|Walgreens":{countryCodes:["us"],matchNames:["walgreens pharmacy"],nomatch:["shop/chemist|Walgreens"],tags:{amenity:"pharmacy",brand:"Walgreens","brand:wikidata":"Q1591889","brand:wikipedia":"en:Walgreens",healthcare:"pharmacy",name:"Walgreens"}},"amenity/pharmacy|Walmart Pharmacy":{tags:{amenity:"pharmacy",brand:"Walmart","brand:wikidata":"Q483551","brand:wikipedia":"en:Walmart",healthcare:"pharmacy",name:"Walmart Pharmacy",operator:"Walmart","operator:wikidata":"Q483551","operator:wikipedia":"en:Walmart"}},"amenity/pharmacy|Watsons":{nomatch:["shop/chemist|Watsons"],tags:{amenity:"pharmacy",brand:"Watsons","brand:wikidata":"Q7974785","brand:wikipedia":"en:Watsons",healthcare:"pharmacy",name:"Watsons",operator:"A.S. Watson Group","operator:wikidata":"Q4647401","operator:wikipedia":"en:A.S. Watson Group"}},"amenity/pharmacy|Well Pharmacy":{countryCodes:["gb"],matchNames:["well"],tags:{amenity:"pharmacy",brand:"Well Pharmacy","brand:wikidata":"Q7726524","brand:wikipedia":"en:Well Pharmacy",healthcare:"pharmacy",name:"Well Pharmacy"}},"amenity/pharmacy|Ziko Apteka":{matchNames:["ziko"],tags:{amenity:"pharmacy",brand:"Ziko Apteka","brand:wikidata":"Q63432892",healthcare:"pharmacy",name:"Ziko Apteka",short_name:"Ziko"}},"amenity/pharmacy|Φαρμακειο":{tags:{amenity:"pharmacy",brand:"Φαρμακειο",healthcare:"pharmacy",name:"Φαρμακειο"}},"amenity/pharmacy|А5":{countryCodes:["ru"],tags:{amenity:"pharmacy",brand:"А5","brand:wikidata":"Q62663476",healthcare:"pharmacy",name:"А5"}},"amenity/pharmacy|Бережная аптека":{countryCodes:["ru"],tags:{amenity:"pharmacy",brand:"Бережная аптека","brand:wikidata":"Q62664194",healthcare:"pharmacy",name:"Бережная аптека"}},"amenity/pharmacy|Будь здоров":{tags:{amenity:"pharmacy",brand:"Будь здоров",healthcare:"pharmacy",name:"Будь здоров"}},"amenity/pharmacy|Вита":{tags:{amenity:"pharmacy",brand:"Вита",healthcare:"pharmacy",name:"Вита"}},"amenity/pharmacy|Горздрав":{tags:{amenity:"pharmacy",brand:"Горздрав",healthcare:"pharmacy",name:"Горздрав"}},"amenity/pharmacy|Добрая аптека":{tags:{amenity:"pharmacy",brand:"Добрая аптека",healthcare:"pharmacy",name:"Добрая аптека"}},"amenity/pharmacy|Живика":{tags:{amenity:"pharmacy",brand:"Живика",healthcare:"pharmacy",name:"Живика"}},"amenity/pharmacy|Здоровье":{tags:{amenity:"pharmacy",brand:"Здоровье",healthcare:"pharmacy",name:"Здоровье"}},"amenity/pharmacy|Зеленая аптека":{tags:{amenity:"pharmacy",brand:"Зеленая аптека",healthcare:"pharmacy",name:"Зеленая аптека"}},"amenity/pharmacy|Имплозия":{tags:{amenity:"pharmacy",brand:"Имплозия",healthcare:"pharmacy",name:"Имплозия"}},"amenity/pharmacy|Классика":{tags:{amenity:"pharmacy",brand:"Классика",healthcare:"pharmacy",name:"Классика"}},"amenity/pharmacy|Ладушка":{tags:{amenity:"pharmacy",brand:"Ладушка",healthcare:"pharmacy",name:"Ладушка"}},"amenity/pharmacy|Максавит":{tags:{amenity:"pharmacy",brand:"Максавит",healthcare:"pharmacy",name:"Максавит"}},"amenity/pharmacy|Марешки":{tags:{amenity:"pharmacy",brand:"Марешки",healthcare:"pharmacy",name:"Марешки"}},"amenity/pharmacy|Мед-сервіс":{tags:{amenity:"pharmacy",brand:"Мед-сервіс",healthcare:"pharmacy",name:"Мед-сервіс"}},"amenity/pharmacy|Мелодия здоровья":{tags:{amenity:"pharmacy",brand:"Мелодия здоровья",healthcare:"pharmacy",name:"Мелодия здоровья"}},"amenity/pharmacy|Невис":{tags:{amenity:"pharmacy",brand:"Невис",healthcare:"pharmacy",name:"Невис"}},"amenity/pharmacy|Норма":{tags:{amenity:"pharmacy",brand:"Норма",healthcare:"pharmacy",name:"Норма"}},"amenity/pharmacy|Озерки":{tags:{amenity:"pharmacy",brand:"Озерки",healthcare:"pharmacy",name:"Озерки"}},"amenity/pharmacy|Панацея":{tags:{amenity:"pharmacy",brand:"Панацея",healthcare:"pharmacy",name:"Панацея"}},"amenity/pharmacy|Первая помощь":{tags:{amenity:"pharmacy",brand:"Первая помощь",healthcare:"pharmacy",name:"Первая помощь"}},"amenity/pharmacy|Планета здоровья":{tags:{amenity:"pharmacy",brand:"Планета здоровья",healthcare:"pharmacy",name:"Планета здоровья"}},"amenity/pharmacy|Подорожник":{tags:{amenity:"pharmacy",brand:"Подорожник",healthcare:"pharmacy",name:"Подорожник"}},"amenity/pharmacy|Радуга":{tags:{amenity:"pharmacy",brand:"Радуга",healthcare:"pharmacy",name:"Радуга"}},"amenity/pharmacy|Ригла":{tags:{amenity:"pharmacy",brand:"Ригла","brand:wikidata":"Q4394431","brand:wikipedia":"ru:Ригла",healthcare:"pharmacy",name:"Ригла"}},"amenity/pharmacy|Семейная":{tags:{amenity:"pharmacy",brand:"Семейная",healthcare:"pharmacy",name:"Семейная"}},"amenity/pharmacy|Семейная аптека":{tags:{amenity:"pharmacy",brand:"Семейная аптека",healthcare:"pharmacy",name:"Семейная аптека"}},"amenity/pharmacy|Социальная аптека":{tags:{amenity:"pharmacy",brand:"Социальная аптека",healthcare:"pharmacy",name:"Социальная аптека"}},"amenity/pharmacy|Столички":{tags:{amenity:"pharmacy",brand:"Столички",healthcare:"pharmacy",name:"Столички"}},"amenity/pharmacy|Фармакопейка":{tags:{amenity:"pharmacy",brand:"Фармакопейка",healthcare:"pharmacy",name:"Фармакопейка"}},"amenity/pharmacy|Фармакор":{tags:{amenity:"pharmacy",brand:"Фармакор",healthcare:"pharmacy",name:"Фармакор"}},"amenity/pharmacy|Фармація":{tags:{amenity:"pharmacy",brand:"Фармація",healthcare:"pharmacy",name:"Фармація"}},"amenity/pharmacy|Фармленд":{tags:{amenity:"pharmacy",brand:"Фармленд",healthcare:"pharmacy",name:"Фармленд"}},"amenity/pharmacy|Центральная аптека":{tags:{amenity:"pharmacy",brand:"Центральная аптека",healthcare:"pharmacy",name:"Центральная аптека"}},"amenity/pharmacy|סופר-פארם":{countryCodes:["il"],tags:{amenity:"pharmacy",brand:"סופר-פארם","brand:he":"סופר-פארם","brand:wikidata":"Q13220217","brand:wikipedia":"en:Super-Pharm",healthcare:"pharmacy",name:"סופר-פארם","name:he":"סופר-פארם"}},"amenity/pharmacy|くすりの福太郎":{countryCodes:["jp"],tags:{amenity:"pharmacy",brand:"くすりの福太郎","brand:en":"Kusurino FUKUTARO","brand:ja":"くすりの福太郎","brand:wikidata":"Q17214460","brand:wikipedia":"ja:くすりの福太郎",healthcare:"pharmacy",name:"くすりの福太郎","name:en":"Kusurino Fukutaro","name:ja":"くすりの福太郎"}},"amenity/pharmacy|さくら薬局":{countryCodes:["jp"],tags:{amenity:"pharmacy",brand:"さくら薬局","brand:ja":"さくら薬局",healthcare:"pharmacy",name:"さくら薬局","name:ja":"さくら薬局"}},"amenity/pharmacy|ウェルパーク":{countryCodes:["jp"],tags:{amenity:"pharmacy",brand:"ウェルパーク","brand:ja":"ウェルパーク","brand:wikidata":"Q11288610","brand:wikipedia":"ja:ウェルパーク",healthcare:"pharmacy",name:"ウェルパーク","name:en":"Welpark","name:ja":"ウェルパーク"}},"amenity/pharmacy|ウエルシア":{countryCodes:["jp"],tags:{amenity:"pharmacy",brand:"ウエルシア","brand:en":"Welcia","brand:ja":"ウエルシア","brand:wikidata":"Q11288684","brand:wikipedia":"ja:ウエルシアホールディングス",healthcare:"pharmacy",name:"ウエルシア","name:en":"Welcia","name:ja":"ウエルシア"}},"amenity/pharmacy|ウエルシア薬局":{countryCodes:["jp"],tags:{amenity:"pharmacy",brand:"ウエルシア薬局","brand:en":"Welcia Yakkyoku","brand:ja":"ウエルシア薬局","brand:wikidata":"Q11288687","brand:wikipedia":"ja:ウエルシア薬局",healthcare:"pharmacy",name:"ウエルシア薬局","name:en":"Welcia Yakkyoku","name:ja":"ウエルシア薬局"}},"amenity/pharmacy|カワチ薬品":{countryCodes:["jp"],tags:{amenity:"pharmacy",brand:"カワチ薬品","brand:en":"Cawachi","brand:ja":"カワチ薬品","brand:wikidata":"Q11295397","brand:wikipedia":"ja:カワチ薬品",healthcare:"pharmacy",name:"カワチ薬品","name:en":"Cawachi","name:ja":"カワチ薬品"}},"amenity/pharmacy|キリン堂":{countryCodes:["jp"],tags:{amenity:"pharmacy",brand:"キリン堂","brand:en":"Kirindo","brand:ja":"キリン堂","brand:wikidata":"Q11297751","brand:wikipedia":"ja:キリン堂",healthcare:"pharmacy",name:"キリン堂","name:en":"Kirindo","name:ja":"キリン堂"}},"amenity/pharmacy|クリエイト":{countryCodes:["jp"],tags:{amenity:"pharmacy",brand:"クリエイト","brand:en":"Create","brand:ja":"クリエイト","brand:wikidata":"Q11299163","brand:wikipedia":"ja:クリエイトSDホールディングス",healthcare:"pharmacy",name:"クリエイト","name:en":"Create","name:ja":"クリエイト"}},"amenity/pharmacy|クリエイトSD":{countryCodes:["jp"],tags:{amenity:"pharmacy",brand:"クリエイトSD","brand:ja":"クリエイトSD",healthcare:"pharmacy",name:"クリエイトSD","name:ja":"クリエイトSD"}},"amenity/pharmacy|ココカラファイン":{countryCodes:["jp"],tags:{amenity:"pharmacy",brand:"ココカラファイン","brand:ja":"ココカラファイン","brand:wikidata":"Q11301948","brand:wikipedia":"ja:ココカラファイン",healthcare:"pharmacy",name:"ココカラファイン","name:en":"Cocokara Fine","name:ja":"ココカラファイン"}},"amenity/pharmacy|サツドラ":{countryCodes:["jp"],tags:{amenity:"pharmacy",brand:"サツドラ","brand:ja":"サツドラ",healthcare:"pharmacy",name:"サツドラ","name:ja":"サツドラ"}},"amenity/pharmacy|サンドラッグ":{countryCodes:["jp"],tags:{amenity:"pharmacy",brand:"サンドラッグ","brand:ja":"サンドラッグ","brand:wikidata":"Q11305867","brand:wikipedia":"ja:サンドラッグ",healthcare:"pharmacy",name:"サンドラッグ","name:en":"Sundrug","name:ja":"サンドラッグ"}},"amenity/pharmacy|スギ薬局":{countryCodes:["jp"],nomatch:["shop/chemist|スギ薬局"],tags:{amenity:"pharmacy",brand:"スギ薬局","brand:en":"Sugi Pharmacy","brand:ja":"スギ薬局","brand:wikidata":"Q11311460","brand:wikipedia":"ja:スギ薬局",healthcare:"pharmacy",name:"スギ薬局","name:en":"Sugi Pharmacy","name:ja":"スギ薬局"}},"amenity/pharmacy|セイジョー":{countryCodes:["jp"],tags:{amenity:"pharmacy",brand:"セイジョー","brand:en":"Seijo","brand:ja":"セイジョー","brand:wikidata":"Q11314133","brand:wikipedia":"ja:セイジョー",healthcare:"pharmacy",name:"セイジョー","name:en":"Seijo","name:ja":"セイジョー"}},"amenity/pharmacy|ダイコクドラッグ":{countryCodes:["jp"],tags:{amenity:"pharmacy",brand:"ダイコクドラッグ","brand:en":"Daikoku Drug","brand:ja":"ダイコクドラッグ","brand:wikidata":"Q11316754","brand:wikipedia":"ja:ダイコク",healthcare:"pharmacy",name:"ダイコクドラッグ","name:en":"Daikoku Drug","name:ja":"ダイコクドラッグ"}},"amenity/pharmacy|ツルハドラッグ":{countryCodes:["jp"],tags:{amenity:"pharmacy",brand:"ツルハドラッグ","brand:en":"Tsuruha","brand:ja":"ツルハドラッグ","brand:wikidata":"Q11318826","brand:wikipedia":"ja:ツルハ",healthcare:"pharmacy",name:"ツルハドラッグ","name:en":"Tsuruha","name:ja":"ツルハドラッグ"}},"amenity/pharmacy|トモズ":{countryCodes:["jp"],matchNames:["トモズエキスプレス"],tags:{amenity:"pharmacy",brand:"トモズ","brand:en":"Tomod's","brand:ja":"トモズ","brand:wikidata":"Q7820097","brand:wikipedia":"ja:トモズ",healthcare:"pharmacy",name:"トモズ","name:en":"Tomod's","name:ja":"トモズ"}},"amenity/pharmacy|ドラッグセイムス":{countryCodes:["jp"],tags:{amenity:"pharmacy",brand:"ドラッグセイムス","brand:ja":"ドラッグセイムス",healthcare:"pharmacy",name:"ドラッグセイムス","name:ja":"ドラッグセイムス"}},"amenity/pharmacy|マツモトキヨシ":{countryCodes:["jp"],tags:{amenity:"pharmacy",brand:"マツモトキヨシ","brand:en":"Matsukiyo","brand:ja":"マツモトキヨシ","brand:wikidata":"Q8014776","brand:wikipedia":"ja:マツモトキヨシ",healthcare:"pharmacy",name:"マツモトキヨシ","name:en":"Matsukiyo","name:ja":"マツモトキヨシ"}},"amenity/pharmacy|丁丁藥局":{nomatch:["shop/chemist|丁丁藥局"],tags:{amenity:"pharmacy",brand:"丁丁藥局",healthcare:"pharmacy",name:"丁丁藥局"}},"amenity/pharmacy|屈臣氏":{nomatch:["shop/chemist|屈臣氏"],tags:{amenity:"pharmacy",brand:"屈臣氏",healthcare:"pharmacy",name:"屈臣氏"}},"amenity/post_box|Deutsche Post":{countryCodes:["de"],matchNames:["deutsche post ag"],nomatch:["amenity/post_office|Deutsche Post"],tags:{amenity:"post_box",brand:"Deutsche Post","brand:wikidata":"Q157645","brand:wikipedia":"en:Deutsche Post",name:"Deutsche Post"}},"amenity/post_box|USPS":{countryCodes:["us"],nomatch:["amenity/post_office|USPS"],tags:{amenity:"post_box",brand:"USPS","brand:wikidata":"Q668687","brand:wikipedia":"en:United States Postal Service",name:"USPS",operator:"USPS"}},"amenity/post_box|差出箱13号":{tags:{amenity:"post_box",brand:"差出箱13号",name:"差出箱13号"}},"amenity/post_box|郵便ポスト":{countryCodes:["jp"],tags:{amenity:"post_box",brand:"郵便ポスト","brand:ja":"郵便ポスト",name:"郵便ポスト","name:ja":"郵便ポスト"}},"amenity/post_office|Australia Post":{countryCodes:["au"],tags:{amenity:"post_office",brand:"Australia Post","brand:wikidata":"Q1142936","brand:wikipedia":"en:Australia Post",name:"Australia Post"}},"amenity/post_office|CTT":{countryCodes:["mo"],tags:{amenity:"post_office",brand:"CTT","brand:wikidata":"Q909429","brand:wikipedia":"en:CTT (Macau)",name:"CTT"}},"amenity/post_office|Canada Post":{countryCodes:["ca"],tags:{amenity:"post_office",brand:"Canada Post","brand:wikidata":"Q1032001","brand:wikipedia":"en:Canada Post",name:"Canada Post"}},"amenity/post_office|Chilexpress":{tags:{amenity:"post_office",brand:"Chilexpress",name:"Chilexpress"}},"amenity/post_office|Correios":{countryCodes:["br"],tags:{amenity:"post_office",brand:"Correios","brand:wikidata":"Q3375004","brand:wikipedia":"en:Correios",name:"Correios"}},"amenity/post_office|Correo Argentino":{countryCodes:["ar"],tags:{amenity:"post_office",brand:"Correo Argentino","brand:wikidata":"Q4036566","brand:wikipedia":"en:Correo Argentino",name:"Correo Argentino"}},"amenity/post_office|Correos de Chile":{countryCodes:["cl"],tags:{amenity:"post_office",brand:"Correos de Chile","brand:wikidata":"Q5172893","brand:wikipedia":"en:Correos de Chile",name:"Correos de Chile"}},"amenity/post_office|Correos de Costa Rica":{countryCodes:["cr"],tags:{amenity:"post_office",brand:"Correos de Costa Rica","brand:wikidata":"Q5172894","brand:wikipedia":"en:Correos de Costa Rica",name:"Correos de Costa Rica"}},"amenity/post_office|Correos de México":{tags:{amenity:"post_office",brand:"Correos de México",name:"Correos de México"}},"amenity/post_office|DHL":{matchNames:["dhl paketshop"],tags:{amenity:"post_office",brand:"DHL","brand:wikidata":"Q489815","brand:wikipedia":"en:DHL Express",name:"DHL",operator:"DHL"}},"amenity/post_office|DPD Paketshop":{tags:{amenity:"post_office",brand:"DPD Paketshop","brand:wikidata":"Q541030","brand:wikipedia":"en:DPDgroup",name:"DPD Paketshop"}},"amenity/post_office|Deutsche Post":{countryCodes:["de"],matchNames:["deutsche post ag","deutsche post filiale"],tags:{amenity:"post_office",brand:"Deutsche Post","brand:wikidata":"Q157645","brand:wikipedia":"en:Deutsche Post",name:"Deutsche Post"}},"amenity/post_office|Fancourier":{countryCodes:["ro"],tags:{amenity:"post_office",brand:"Fancourier","brand:wikidata":"Q12727984","brand:wikipedia":"ro:FAN Courier Express",name:"Fancourier"}},"amenity/post_office|FedEx":{tags:{amenity:"post_office",brand:"FedEx","brand:wikidata":"Q459477","brand:wikipedia":"en:FedEx",name:"FedEx"}},"amenity/post_office|Hermes Paketshop":{matchNames:["hermes"],tags:{amenity:"post_office",brand:"Hermes Paketshop","brand:wikidata":"Q1613532","brand:wikipedia":"en:Hermes Group",name:"Hermes Paketshop"}},"amenity/post_office|LBC":{countryCodes:["ph"],matchNames:["lbc express"],tags:{amenity:"post_office",brand:"LBC","brand:wikidata":"Q17075584","brand:wikipedia":"en:LBC Express",name:"LBC"}},"amenity/post_office|La Poste":{tags:{amenity:"post_office",brand:"La Poste","brand:wikidata":"Q373724","brand:wikipedia":"fr:La Poste (entreprise française)",name:"La Poste"}},"amenity/post_office|MRW":{tags:{amenity:"post_office",brand:"MRW","brand:wikidata":"Q23767821","brand:wikipedia":"es:MRW",name:"MRW"}},"amenity/post_office|OCA":{tags:{amenity:"post_office",brand:"OCA",name:"OCA"}},"amenity/post_office|Oficina de Correos":{matchNames:["correos"],tags:{amenity:"post_office",brand:"Oficina de Correos","brand:wikidata":"Q776605","brand:wikipedia":"es:Correos (España)",name:"Oficina de Correos"}},"amenity/post_office|PTT":{tags:{amenity:"post_office",brand:"PTT",name:"PTT"}},"amenity/post_office|Poczta Polska":{countryCodes:["pl"],tags:{amenity:"post_office",brand:"Poczta Polska","brand:wikidata":"Q168833","brand:wikipedia":"pl:Poczta Polska",name:"Poczta Polska"}},"amenity/post_office|PostalAnnex":{countryCodes:["us"],matchTags:["shop/post_office"],tags:{amenity:"post_office",brand:"PostalAnnex","brand:wikidata":"Q61960357",name:"PostalAnnex"}},"amenity/post_office|Poste Italiane":{countryCodes:["it"],tags:{amenity:"post_office",brand:"Poste Italiane","brand:wikidata":"Q495026","brand:wikipedia":"en:Poste italiane",name:"Poste Italiane"}},"amenity/post_office|Serpost":{countryCodes:["pe"],matchNames:["servicios postales del perú"],matchTags:["shop/post_office"],tags:{amenity:"post_office",brand:"Serpost","brand:wikidata":"Q19521863","brand:wikipedia":"es:Servicios Postales del Perú",name:"Serpost"}},"amenity/post_office|Servientrega":{tags:{amenity:"post_office",brand:"Servientrega",name:"Servientrega"}},"amenity/post_office|Slovenská pošta":{countryCodes:["sk"],tags:{amenity:"post_office",brand:"Slovenská pošta","brand:wikidata":"Q1191849","brand:wikipedia":"en:Slovenská pošta",name:"Slovenská pošta"}},"amenity/post_office|The UPS Store":{matchNames:["ups","ups store"],matchTags:["shop/copyshop"],tags:{amenity:"post_office",brand:"The UPS Store","brand:wikidata":"Q7771029","brand:wikipedia":"en:The UPS Store",name:"The UPS Store"}},"amenity/post_office|US Post Office":{countryCodes:["us"],matchNames:["united states post office","united states postal service","usps"],tags:{amenity:"post_office",brand:"US Post Office","brand:wikidata":"Q668687","brand:wikipedia":"en:United States Postal Service",name:"US Post Office",operator:"USPS"}},"amenity/post_office|ΕΛΤΑ":{countryCodes:["gr"],tags:{amenity:"post_office",brand:"ΕΛΤΑ","brand:wikidata":"Q1275135","brand:wikipedia":"el:Ελληνικά Ταχυδρομεία",name:"ΕΛΤΑ"}},"amenity/post_office|Белпошта":{countryCodes:["by"],matchNames:["белпочта"],tags:{amenity:"post_office",brand:"Белпошта","brand:be":"Белпошта","brand:en":"Belposhta","brand:ru":"Белпочта","brand:wikidata":"Q2662336","brand:wikipedia":"be:Белпошта",name:"Белпошта","name:be":"Белпошта","name:en":"Belposhta","name:ru":"Белпочта"}},"amenity/post_office|Казпочта":{countryCodes:["kz"],tags:{amenity:"post_office",brand:"Казпочта","brand:wikidata":"Q746263","brand:wikipedia":"ru:Казпочта",name:"Казпочта"}},"amenity/post_office|Нова Пошта №1":{countryCodes:["ua"],tags:{amenity:"post_office",brand:"Нова Пошта №1","brand:wikidata":"Q12133863","brand:wikipedia":"uk:Нова пошта",name:"Нова Пошта №1"}},"amenity/post_office|Нова Пошта №2":{tags:{amenity:"post_office",brand:"Нова Пошта №2",name:"Нова Пошта №2"}},"amenity/post_office|Нова Пошта №3":{tags:{amenity:"post_office",brand:"Нова Пошта №3",name:"Нова Пошта №3"}},"amenity/post_office|Нова Пошта №4":{tags:{amenity:"post_office",brand:"Нова Пошта №4",name:"Нова Пошта №4"}},"amenity/post_office|Почта России":{countryCodes:["ru"],tags:{amenity:"post_office",brand:"Почта России","brand:wikidata":"Q1502763","brand:wikipedia":"ru:Почта России",name:"Почта России"}},"amenity/post_office|СДЭК":{tags:{amenity:"post_office",brand:"СДЭК","brand:wikidata":"Q28665980","brand:wikipedia":"ru:СДЭК",name:"СДЭК"}},"amenity/post_office|Укрпошта":{countryCodes:["ua"],tags:{amenity:"post_office",brand:"Укрпошта","brand:wikidata":"Q2470783","brand:wikipedia":"en:Ukrposhta",name:"Укрпошта"}},"amenity/post_office|中国邮政":{countryCodes:["cn"],tags:{amenity:"post_office",brand:"中国邮政","brand:en":"China Post","brand:wikidata":"Q1066476","brand:wikipedia":"en:China Post",name:"中国邮政","name:en":"China Post"}},"amenity/prep_school|Huntington Learning Center":{countryCodes:["us"],matchNames:["huntington"],tags:{amenity:"prep_school",brand:"Huntington Learning Center","brand:wikidata":"Q5945399","brand:wikipedia":"en:Huntington Learning Center",name:"Huntington Learning Center"}},"amenity/prep_school|KUMON~(Japan)":{countryCodes:["jp"],matchNames:["くもん","公文"],tags:{amenity:"prep_school",brand:"KUMON","brand:wikidata":"Q142054","brand:wikipedia":"ja:日本公文教育研究会",name:"KUMON","name:ja":"公文","name:ja-Hira":"くもん","name:ja-Latn":"KUMON"}},"amenity/prep_school|Kumon~(International)":{matchNames:["kumon learning center"],tags:{amenity:"prep_school",brand:"Kumon","brand:wikidata":"Q142054","brand:wikipedia":"en:Kumon",name:"Kumon"}},"amenity/prep_school|Russian School of Mathematics":{countryCodes:["us"],matchNames:["rsm","russian school of math"],tags:{amenity:"prep_school",brand:"Russian School of Mathematics","brand:wikidata":"Q7382122","brand:wikipedia":"en:Russian School of Mathematics",name:"Russian School of Mathematics"}},"amenity/prep_school|Sylvan":{countryCodes:["us"],matchNames:["sylvan learning","sylvan learning center"],tags:{alt_name:"Sylvan Learning Center",amenity:"prep_school",brand:"Sylvan","brand:wikidata":"Q7660663","brand:wikipedia":"en:Sylvan Learning",name:"Sylvan"}},"amenity/public_bookcase|Little Free Library":{tags:{amenity:"public_bookcase",brand:"Little Free Library","brand:wikidata":"Q6650101","brand:wikipedia":"en:Little Free Library",name:"Little Free Library"}},"amenity/public_bookcase|Offener Bücherschrank":{tags:{amenity:"public_bookcase",brand:"Offener Bücherschrank",name:"Offener Bücherschrank"}},"amenity/restaurant|100 Montaditos":{tags:{amenity:"restaurant",brand:"100 Montaditos","brand:wikidata":"Q8355805","brand:wikipedia":"en:Cervecería 100 Montaditos",cuisine:"sandwich",name:"100 Montaditos"}},"amenity/restaurant|ASK Italian":{countryCodes:["gb"],tags:{amenity:"restaurant",brand:"ASK Italian","brand:wikidata":"Q4807056","brand:wikipedia":"en:ASK Italian",cuisine:"italian",name:"ASK Italian"}},"amenity/restaurant|Applebee's":{matchNames:["applebees bar & grill","applebees bar and grill","applebees grill & bar","applebees grill and bar","applebees neighborhood bar & grill","applebees neighborhood bar and grill","applebees neighborhood grill & bar","applebees neighborhood grill and bar"],tags:{amenity:"restaurant",brand:"Applebee's Neighborhood Grill & Bar","brand:wikidata":"Q621532","brand:wikipedia":"en:Applebee's",cuisine:"american",name:"Applebee's",official_name:"Applebee's Neighborhood Grill & Bar"}},"amenity/restaurant|Autogrill":{tags:{amenity:"restaurant",brand:"Autogrill","brand:wikidata":"Q786790","brand:wikipedia":"en:Autogrill",name:"Autogrill"}},"amenity/restaurant|BJ's":{countryCodes:["us"],tags:{amenity:"restaurant",brand:"BJ's","brand:wikidata":"Q4835755","brand:wikipedia":"en:BJ's Restaurants",cuisine:"american",name:"BJ's",official_name:"BJ's Restaurant & Brewhouse"}},"amenity/restaurant|Bella Italia":{countryCodes:["gb"],tags:{amenity:"restaurant",brand:"Bella Italia","brand:wikidata":"Q4883362","brand:wikipedia":"en:Bella Italia",cuisine:"italian",name:"Bella Italia"}},"amenity/restaurant|Big Boy":{tags:{amenity:"restaurant",brand:"Big Boy","brand:wikidata":"Q4386779","brand:wikipedia":"en:Big Boy Restaurants",cuisine:"burger",name:"Big Boy",official_name:"Big Boy Restaurant & Bakery"}},"amenity/restaurant|Black Bear Diner":{countryCodes:["us"],tags:{amenity:"restaurant",brand:"Black Bear Diner","brand:wikidata":"Q4920343","brand:wikipedia":"en:Black Bear Diner",cuisine:"american",name:"Black Bear Diner"}},"amenity/restaurant|Blaze Pizza":{countryCodes:["bh","ca","kw","sa","us"],tags:{amenity:"restaurant",brand:"Blaze Pizza","brand:wikidata":"Q23016666","brand:wikipedia":"en:Blaze Pizza",cuisine:"pizza",name:"Blaze Pizza"}},"amenity/restaurant|Bob Evans":{countryCodes:["us"],tags:{amenity:"restaurant",brand:"Bob Evans","brand:wikidata":"Q4932386","brand:wikipedia":"en:Bob Evans Restaurants",cuisine:"american",name:"Bob Evans"}},"amenity/restaurant|Bonefish Grill":{countryCodes:["us"],tags:{amenity:"restaurant",brand:"Bonefish Grill","brand:wikidata":"Q4941599","brand:wikipedia":"en:Bonefish Grill",cuisine:"seafood",name:"Bonefish Grill"}},"amenity/restaurant|Boston Pizza":{tags:{amenity:"restaurant",brand:"Boston Pizza","brand:wikidata":"Q894578","brand:wikipedia":"en:Boston Pizza",cuisine:"pizza",name:"Boston Pizza"}},"amenity/restaurant|Buca di Beppo":{countryCodes:["us"],tags:{amenity:"restaurant",brand:"Buca di Beppo","brand:wikidata":"Q4982340","brand:wikipedia":"en:Buca di Beppo",cuisine:"italian",name:"Buca di Beppo"}},"amenity/restaurant|Buffalo Grill":{tags:{amenity:"restaurant",brand:"Buffalo Grill","brand:wikidata":"Q944655","brand:wikipedia":"en:Buffalo Grill",cuisine:"steak_house",name:"Buffalo Grill"}},"amenity/restaurant|Buffalo Wild Wings":{tags:{amenity:"restaurant",brand:"Buffalo Wild Wings","brand:wikidata":"Q509255","brand:wikipedia":"en:Buffalo Wild Wings",cuisine:"wings",name:"Buffalo Wild Wings"}},"amenity/restaurant|Buffalo Wings & Rings":{countryCodes:["us"],matchNames:["buffalo wings and rings"],tags:{amenity:"restaurant",brand:"Buffalo Wings & Rings","brand:wikidata":"Q4985900","brand:wikipedia":"en:Buffalo Wings & Rings",cuisine:"wings",name:"Buffalo Wings & Rings",takeaway:"yes"}},"amenity/restaurant|Cafe Rio":{countryCodes:["us"],tags:{amenity:"restaurant",brand:"Cafe Rio","brand:wikidata":"Q5017108","brand:wikipedia":"en:Cafe Rio",cuisine:"mexican",name:"Cafe Rio"}},"amenity/restaurant|California Pizza Kitchen":{tags:{amenity:"restaurant",brand:"California Pizza Kitchen","brand:wikidata":"Q15109854","brand:wikipedia":"en:California Pizza Kitchen",cuisine:"pizza",name:"California Pizza Kitchen"}},"amenity/restaurant|Campanile":{tags:{amenity:"restaurant",brand:"Campanile",name:"Campanile"}},"amenity/restaurant|Carluccio's":{tags:{amenity:"restaurant",brand:"Carluccio's","brand:wikidata":"Q25111797","brand:wikipedia":"en:Carluccio's Ltd",cuisine:"italian",name:"Carluccio's"}},"amenity/restaurant|Carrabba's Italian Grill":{countryCodes:["us"],tags:{amenity:"restaurant",brand:"Carrabba's Italian Grill","brand:wikidata":"Q5045999","brand:wikipedia":"en:Carrabba's Italian Grill",cuisine:"italian",name:"Carrabba's Italian Grill"}},"amenity/restaurant|Cheddar's":{countryCodes:["us"],tags:{amenity:"restaurant",brand:"Cheddar's","brand:wikidata":"Q5089187","brand:wikipedia":"en:Cheddar's Scratch Kitchen",cuisine:"american",name:"Cheddar's",official_name:"Cheddar's Scratch Kitchen"}},"amenity/restaurant|Chevys":{countryCodes:["us"],tags:{amenity:"restaurant",brand:"Chevys Fresh Mex","brand:wikidata":"Q5094466","brand:wikipedia":"en:Chevys Fresh Mex",cuisine:"mexican",name:"Chevys",official_name:"Chevys Fresh Mex"}},"amenity/restaurant|Chili's":{matchNames:["chili's grill & bar","chili's grill and bar"],tags:{amenity:"restaurant",brand:"Chili's","brand:wikidata":"Q1072948","brand:wikipedia":"en:Chili's",cuisine:"tex-mex",name:"Chili's",official_name:"Chili's Grill & Bar"}},"amenity/restaurant|Chiquito":{countryCodes:["gb"],tags:{amenity:"restaurant",brand:"Chiquito","brand:wikidata":"Q5101775","brand:wikipedia":"en:Chiquito (restaurant)",cuisine:"tex-mex",name:"Chiquito"}},"amenity/restaurant|Chuck E. Cheese's":{tags:{amenity:"restaurant",brand:"Chuck E. Cheese's","brand:wikidata":"Q2438391","brand:wikipedia":"en:Chuck E. Cheese's",cuisine:"pizza",name:"Chuck E. Cheese's"}},"amenity/restaurant|Cici's Pizza":{countryCodes:["us"],tags:{amenity:"restaurant",brand:"Cici's Pizza","brand:wikidata":"Q2972189","brand:wikipedia":"en:Cicis",cuisine:"pizza",name:"Cici's Pizza"}},"amenity/restaurant|Claim Jumper":{countryCodes:["us"],tags:{amenity:"restaurant",brand:"Claim Jumper","brand:wikidata":"Q5125081","brand:wikipedia":"en:Claim Jumper",cuisine:"american",name:"Claim Jumper",operator:"Landry's","operator:wikidata":"Q3217105","operator:wikipedia":"en:Landry's, Inc."}},"amenity/restaurant|Cosmo":{countryCodes:["gb","ie"],tags:{amenity:"restaurant",brand:"Cosmo","brand:wikidata":"Q5174239","brand:wikipedia":"en:Cosmo (restaurant)",name:"Cosmo"}},"amenity/restaurant|Courtepaille":{tags:{amenity:"restaurant",brand:"Courtepaille","brand:wikidata":"Q3116688","brand:wikipedia":"fr:Grill Courtepaille",cuisine:"french",name:"Courtepaille"}},"amenity/restaurant|Cracker Barrel":{countryCodes:["us"],tags:{amenity:"restaurant",brand:"Cracker Barrel","brand:wikidata":"Q4492609","brand:wikipedia":"en:Cracker Barrel",cuisine:"american",name:"Cracker Barrel",official_name:"Cracker Barrel Old Country Store",shop:"gift"}},"amenity/restaurant|Denny's":{tags:{amenity:"restaurant",brand:"Denny's","brand:wikidata":"Q1189695","brand:wikipedia":"en:Denny's",cuisine:"american",name:"Denny's"}},"amenity/restaurant|Dickey's Barbecue Pit":{countryCodes:["us"],tags:{amenity:"restaurant",brand:"Dickey's Barbecue Pit","brand:wikidata":"Q19880747","brand:wikipedia":"en:Dickey's Barbecue Pit",cuisine:"barbecue",name:"Dickey's Barbecue Pit"}},"amenity/restaurant|Dolce Vita":{tags:{amenity:"restaurant",brand:"Dolce Vita",name:"Dolce Vita"}},"amenity/restaurant|Donatos Pizza":{countryCodes:["us"],matchNames:["donatos"],tags:{amenity:"restaurant",brand:"Donatos Pizza","brand:wikidata":"Q1240741","brand:wikipedia":"en:Donatos Pizza",cuisine:"pizza",name:"Donatos Pizza",takeaway:"yes"}},"amenity/restaurant|East Side Mario's":{countryCodes:["ca"],tags:{amenity:"restaurant",brand:"East Side Mario's","brand:wikidata":"Q5329375","brand:wikipedia":"en:East Side Mario's",cuisine:"italian",name:"East Side Mario's"}},"amenity/restaurant|Famous Dave's":{countryCodes:["us"],tags:{amenity:"restaurant",brand:"Famous Dave's","brand:wikidata":"Q5433448","brand:wikipedia":"en:Famous Dave's",cuisine:"barbecue",name:"Famous Dave's"}},"amenity/restaurant|First Watch":{tags:{amenity:"restaurant",brand:"First Watch","brand:wikidata":"Q5454064","brand:wikipedia":"en:First Watch (restaurant chain)",cuisine:"american",name:"First Watch"}},"amenity/restaurant|Flunch":{countryCodes:["fr"],tags:{amenity:"restaurant",brand:"Flunch","brand:wikidata":"Q629326","brand:wikipedia":"en:Flunch",cuisine:"french",name:"Flunch"}},"amenity/restaurant|Foster's Hollywood":{countryCodes:["es"],tags:{amenity:"restaurant",brand:"Foster's Hollywood","brand:wikidata":"Q5864366","brand:wikipedia":"en:Foster's Hollywood",cuisine:"american",name:"Foster's Hollywood"}},"amenity/restaurant|Frankie & Benny's":{countryCodes:["gb"],tags:{amenity:"restaurant",brand:"Frankie & Benny's","brand:wikidata":"Q5490892","brand:wikipedia":"en:Frankie & Benny's",cuisine:"italian",name:"Frankie & Benny's"}},"amenity/restaurant|Freshii":{tags:{amenity:"restaurant",brand:"Freshii","brand:wikidata":"Q5503051","brand:wikipedia":"en:Freshii",cuisine:"salad",name:"Freshii"}},"amenity/restaurant|Friendly's":{countryCodes:["us"],tags:{amenity:"restaurant",brand:"Friendly's","brand:wikidata":"Q1464513","brand:wikipedia":"en:Friendly's",cuisine:"american",name:"Friendly's"}},"amenity/restaurant|Frisch's Big Boy":{countryCodes:["us"],tags:{amenity:"restaurant",brand:"Frisch's Big Boy","brand:wikidata":"Q5504660","brand:wikipedia":"en:Frisch's",cuisine:"burger",name:"Frisch's Big Boy",takeaway:"yes"}},"amenity/restaurant|Fuddruckers":{tags:{amenity:"restaurant",brand:"Fuddruckers","brand:wikidata":"Q5507056","brand:wikipedia":"en:Fuddruckers",cuisine:"burger",name:"Fuddruckers"}},"amenity/restaurant|Garba":{tags:{amenity:"restaurant",brand:"Garba",name:"Garba"}},"amenity/restaurant|Garbadrome":{tags:{amenity:"restaurant",brand:"Garbadrome",name:"Garbadrome"}},"amenity/restaurant|Godfather's Pizza":{tags:{amenity:"restaurant",brand:"Godfather's Pizza","brand:wikidata":"Q5576353","brand:wikipedia":"en:Godfather's Pizza",cuisine:"pizza",name:"Godfather's Pizza"}},"amenity/restaurant|Golden Corral":{countryCodes:["us"],tags:{amenity:"restaurant",brand:"Golden Corral","brand:wikidata":"Q4039560","brand:wikipedia":"en:Golden Corral",cuisine:"american",name:"Golden Corral"}},"amenity/restaurant|Gourmet Burger Kitchen":{tags:{amenity:"restaurant",brand:"Gourmet Burger Kitchen","brand:wikidata":"Q5588445","brand:wikipedia":"en:Gourmet Burger Kitchen",cuisine:"burger",name:"Gourmet Burger Kitchen"}},"amenity/restaurant|Gusto":{tags:{amenity:"restaurant",brand:"Gusto",name:"Gusto"}},"amenity/restaurant|Hans im Glück":{countryCodes:["at","ch","de","sg"],tags:{amenity:"restaurant",brand:"Hans im Glück","brand:wikidata":"Q22569868","brand:wikipedia":"de:Hans im Glück (Restaurantkette)",cuisine:"burger",name:"Hans im Glück"}},"amenity/restaurant|Hard Rock Cafe":{tags:{amenity:"restaurant",brand:"Hard Rock Cafe","brand:wikidata":"Q918151","brand:wikipedia":"en:Hard Rock Cafe",cuisine:"american",name:"Hard Rock Cafe"}},"amenity/restaurant|Harvester":{countryCodes:["gb"],tags:{amenity:"restaurant",brand:"Harvester","brand:wikidata":"Q5676915","brand:wikipedia":"en:Harvester (restaurant)",cuisine:"american",name:"Harvester"}},"amenity/restaurant|Hippopotamus":{countryCodes:["fr"],tags:{amenity:"restaurant",brand:"Hippopotamus","brand:wikidata":"Q3136174","brand:wikipedia":"fr:Hippopotamus (restaurant)",cuisine:"steak_house",name:"Hippopotamus"}},"amenity/restaurant|Hooters":{tags:{amenity:"restaurant",brand:"Hooters","brand:wikidata":"Q1025921","brand:wikipedia":"en:Hooters",cuisine:"burger",name:"Hooters"}},"amenity/restaurant|Huddle House":{countryCodes:["us"],tags:{amenity:"restaurant",brand:"Huddle House","brand:wikidata":"Q5928324","brand:wikipedia":"en:Huddle House",cuisine:"american",name:"Huddle House"}},"amenity/restaurant|IHOP":{tags:{amenity:"restaurant",brand:"IHOP","brand:wikidata":"Q1185675","brand:wikipedia":"en:IHOP",cuisine:"breakfast;pancake",name:"IHOP"}},"amenity/restaurant|IL Патио":{tags:{amenity:"restaurant",brand:"IL Патио","brand:wikidata":"Q4397763","brand:wikipedia":"en:Росинтер",cuisine:"american",name:"IL Патио"}},"amenity/restaurant|Il Giardino":{tags:{amenity:"restaurant",brand:"Il Giardino",name:"Il Giardino"}},"amenity/restaurant|Jason's Deli":{countryCodes:["us"],tags:{amenity:"restaurant",brand:"Jason's Deli","brand:wikidata":"Q16997641","brand:wikipedia":"en:Jason's Deli",cuisine:"sandwich",name:"Jason's Deli"}},"amenity/restaurant|Jet's Pizza":{countryCodes:["us"],tags:{amenity:"restaurant",brand:"Jet's Pizza","brand:wikidata":"Q16997713","brand:wikipedia":"en:Jet's Pizza",cuisine:"pizza",name:"Jet's Pizza"}},"amenity/restaurant|Joe's Crab Shack":{countryCodes:["us"],tags:{amenity:"restaurant",brand:"Joe's Crab Shack","brand:wikidata":"Q6208210","brand:wikipedia":"en:Joe's Crab Shack",cuisine:"seafood",name:"Joe's Crab Shack"}},"amenity/restaurant|Johnny Carino’s":{countryCodes:["us"],matchNames:["carinios"],tags:{amenity:"restaurant",brand:"Johnny Carino’s","brand:wikidata":"Q5039637","brand:wikipedia":"en:Carino's Italian",cuisine:"italian",name:"Johnny Carino’s"}},"amenity/restaurant|Johnny Rockets":{tags:{amenity:"restaurant",brand:"Johnny Rockets","brand:wikidata":"Q1051593","brand:wikipedia":"en:Johnny Rockets",cuisine:"burger",name:"Johnny Rockets"}},"amenity/restaurant|Kelsey's":{countryCodes:["ca"],tags:{amenity:"restaurant",brand:"Kelsey's","brand:wikidata":"Q6386459","brand:wikipedia":"en:Kelseys Original Roadhouse",cuisine:"american",name:"Kelsey's"}},"amenity/restaurant|Koliba":{tags:{amenity:"restaurant",brand:"Koliba",name:"Koliba"}},"amenity/restaurant|Kudu":{countryCodes:["sa"],tags:{amenity:"restaurant",brand:"Kudu","brand:wikidata":"Q6441777","brand:wikipedia":"en:Kudu (restaurant)",cuisine:"sandwich",name:"Kudu"}},"amenity/restaurant|La Boucherie":{countryCodes:["fr"],tags:{amenity:"restaurant",brand:"La Boucherie","brand:wikidata":"Q21427479","brand:wikipedia":"fr:La Boucherie (restaurant)",cuisine:"steak_house",name:"La Boucherie"}},"amenity/restaurant|LaRosa's Pizzeria":{countryCodes:["us"],tags:{amenity:"restaurant",brand:"LaRosa's Pizzeria","brand:wikidata":"Q6460833","brand:wikipedia":"en:LaRosa's Pizzeria",cuisine:"pizza",name:"LaRosa's Pizzeria",takeaway:"yes"}},"amenity/restaurant|Lemongrass":{tags:{amenity:"restaurant",brand:"Lemongrass",name:"Lemongrass"}},"amenity/restaurant|Logan's Roadhouse":{countryCodes:["us"],tags:{amenity:"restaurant",brand:"Logan's Roadhouse","brand:wikidata":"Q6666872","brand:wikipedia":"en:Logan's Roadhouse",cuisine:"american",name:"Logan's Roadhouse"}},"amenity/restaurant|LongHorn Steakhouse":{tags:{amenity:"restaurant",brand:"LongHorn Steakhouse","brand:wikidata":"Q3259007","brand:wikipedia":"en:LongHorn Steakhouse",cuisine:"steak_house",name:"LongHorn Steakhouse"}},"amenity/restaurant|Los Arcos":{tags:{amenity:"restaurant",brand:"Los Arcos",name:"Los Arcos"}},"amenity/restaurant|Loving Hut":{tags:{amenity:"restaurant",brand:"Loving Hut","brand:wikidata":"Q3491655","brand:wikipedia":"en:Loving Hut",cuisine:"international","diet:vegan":"only","diet:vegetarian":"only",name:"Loving Hut"}},"amenity/restaurant|Léon de Bruxelles":{countryCodes:["fr"],tags:{amenity:"restaurant",brand:"Léon de Bruxelles","brand:wikidata":"Q21041507","brand:wikipedia":"en:Léon de Bruxelles",cuisine:"friture",name:"Léon de Bruxelles"}},"amenity/restaurant|MK Restaurants":{tags:{amenity:"restaurant",brand:"MK Restaurants","brand:wikidata":"Q62075359",cuisine:"thai",name:"MK Restaurants"}},"amenity/restaurant|MOD Pizza":{tags:{amenity:"restaurant",brand:"MOD Pizza","brand:wikidata":"Q19903469","brand:wikipedia":"en:MOD Pizza",cuisine:"pizza",name:"MOD Pizza"}},"amenity/restaurant|Marco's Pizza":{tags:{amenity:"restaurant",brand:"Marco's Pizza","brand:wikidata":"Q6757382","brand:wikipedia":"en:Marco's Pizza",cuisine:"pizza",name:"Marco's Pizza"}},"amenity/restaurant|Max's Restaurant":{countryCodes:["ph"],matchNames:["maxs of manila"],tags:{amenity:"restaurant",brand:"Max's Restaurant","brand:wikidata":"Q6794477","brand:wikipedia":"en:Max's of Manila",cuisine:"asian",name:"Max's Restaurant"}},"amenity/restaurant|McAlister's Deli":{countryCodes:["us"],tags:{amenity:"restaurant",brand:"McAlister's Deli","brand:wikidata":"Q17020829","brand:wikipedia":"en:McAlister's Deli",cuisine:"sandwich",name:"McAlister's Deli"}},"amenity/restaurant|Mellow Mushroom":{countryCodes:["us"],tags:{amenity:"restaurant",brand:"Mellow Mushroom","brand:wikidata":"Q17021360","brand:wikipedia":"en:Mellow Mushroom",cuisine:"pizza",name:"Mellow Mushroom"}},"amenity/restaurant|Mimi's Cafe":{countryCodes:["us"],tags:{amenity:"restaurant",brand:"Mimi's Cafe","brand:wikidata":"Q17022081","brand:wikipedia":"en:Mimi's Cafe",cuisine:"french",name:"Mimi's Cafe"}},"amenity/restaurant|Mountain Mike's":{countryCodes:["us"],matchNames:["mountain mike's pizza"],tags:{alt_name:"Mountain Mike's Pizza",amenity:"restaurant",brand:"Mountain Mike's","brand:wikidata":"Q6925120","brand:wikipedia":"en:Mountain Mike's Pizza",cuisine:"pizza",name:"Mountain Mike's",takeaway:"yes"}},"amenity/restaurant|Nando's":{tags:{amenity:"restaurant",brand:"Nando's","brand:wikidata":"Q3472954","brand:wikipedia":"en:Nando's",cuisine:"chicken;portuguese",name:"Nando's"}},"amenity/restaurant|Noodles & Company":{countryCodes:["us"],tags:{amenity:"restaurant",brand:"Noodles & Company","brand:wikidata":"Q7049673","brand:wikipedia":"en:Noodles & Company",cuisine:"pasta",name:"Noodles & Company"}},"amenity/restaurant|Norky's":{tags:{amenity:"restaurant",brand:"Norky's",cuisine:"peruvian",name:"Norky's"}},"amenity/restaurant|O'Charley's":{countryCodes:["us"],tags:{amenity:"restaurant",brand:"O'Charley's","brand:wikidata":"Q7071703","brand:wikipedia":"en:O'Charley's",cuisine:"american",name:"O'Charley's"}},"amenity/restaurant|Ocean Basket":{countryCodes:["za"],tags:{amenity:"restaurant",brand:"Ocean Basket","brand:wikidata":"Q62075311",cuisine:"seafood",name:"Ocean Basket"}},"amenity/restaurant|Old Chicago":{countryCodes:["us"],tags:{amenity:"restaurant",brand:"Old Chicago",cuisine:"pizza",name:"Old Chicago"}},"amenity/restaurant|Old Wild West":{countryCodes:["it"],tags:{amenity:"restaurant",brand:"Old Wild West","brand:wikidata":"Q25402475","brand:wikipedia":"it:Old Wild West",cuisine:"american",name:"Old Wild West"}},"amenity/restaurant|Olive Garden":{tags:{amenity:"restaurant",brand:"Olive Garden","brand:wikidata":"Q3045312","brand:wikipedia":"en:Olive Garden",cuisine:"italian",name:"Olive Garden"}},"amenity/restaurant|On The Border":{countryCodes:["us"],tags:{amenity:"restaurant",brand:"On The Border","brand:wikidata":"Q7091305","brand:wikipedia":"en:On the Border Mexican Grill & Cantina",cuisine:"burger",name:"On The Border",official_name:"On The Border Mexican Grill & Cantina"}},"amenity/restaurant|Outback Steakhouse":{tags:{amenity:"restaurant",brand:"Outback Steakhouse","brand:wikidata":"Q1064893","brand:wikipedia":"en:Outback Steakhouse",cuisine:"american",name:"Outback Steakhouse"}},"amenity/restaurant|P.F. Chang's":{tags:{amenity:"restaurant",brand:"P.F. Chang's","brand:wikidata":"Q5360181","brand:wikipedia":"en:P. F. Chang's China Bistro",cuisine:"asian",name:"P.F. Chang's"}},"amenity/restaurant|Pardos Chicken":{countryCodes:["pe"],tags:{amenity:"restaurant",brand:"Pardos Chicken","brand:wikidata":"Q17624435","brand:wikipedia":"en:Pardos chicken",cuisine:"peruvian",name:"Pardos Chicken"}},"amenity/restaurant|Pei Wei":{matchNames:["pei wei asian diner"],tags:{amenity:"restaurant",brand:"Pei Wei","brand:wikidata":"Q7160898","brand:wikipedia":"en:Pei Wei Asian Diner",cuisine:"asian",name:"Pei Wei"}},"amenity/restaurant|Perkins":{countryCodes:["us"],tags:{amenity:"restaurant",brand:"Perkins","brand:wikidata":"Q7169056","brand:wikipedia":"en:Perkins Restaurant and Bakery",cuisine:"american",name:"Perkins",official_name:"Perkins Restaurant and Bakery"}},"amenity/restaurant|Phở 24":{tags:{amenity:"restaurant",brand:"Phở Hòa","brand:wikidata":"Q63863118",cuisine:"vietnamese;noodle",name:"Phở 24","name:en":"Pho 24","name:vi":"Phở 24"}},"amenity/restaurant|Phở Hòa":{tags:{alt_name:"Phở Hoà","alt_name:en":"Pho Hoa","alt_name:vi":"Phở Hoà",amenity:"restaurant",brand:"Phở Hòa","brand:wikidata":"Q55629932","brand:wikipedia":"en:Phở Hòa",cuisine:"vietnamese;noodle",name:"Phở Hòa","name:vi":"Phở Hòa"}},"amenity/restaurant|Pieology Pizzeria":{countryCodes:["us"],matchNames:["pieology"],tags:{amenity:"restaurant",brand:"Pieology Pizzeria","brand:wikidata":"Q60746053","brand:wikipedia":"en:Pieology",cuisine:"pizza",name:"Pieology Pizzeria"}},"amenity/restaurant|Pizza Factory":{countryCodes:["us"],tags:{amenity:"restaurant",brand:"Pizza Factory","brand:wikidata":"Q39054369","brand:wikipedia":"en:Pizza Factory",cuisine:"pizza",name:"Pizza Factory"}},"amenity/restaurant|Pizza Hut":{nomatch:["amenity/fast_food|Pizza Hut Express"],tags:{amenity:"restaurant",brand:"Pizza Hut","brand:wikidata":"Q191615","brand:wikipedia":"en:Pizza Hut",cuisine:"pizza",name:"Pizza Hut"}},"amenity/restaurant|Pizza Ranch":{countryCodes:["us"],tags:{amenity:"restaurant",brand:"Pizza Ranch","brand:wikidata":"Q7199978","brand:wikipedia":"en:Pizza Ranch",cuisine:"pizza",name:"Pizza Ranch"}},"amenity/restaurant|PizzaExpress":{tags:{amenity:"restaurant",brand:"PizzaExpress","brand:wikidata":"Q662845","brand:wikipedia":"en:PizzaExpress",cuisine:"pizza",name:"PizzaExpress"}},"amenity/restaurant|Poivre Rouge":{countryCodes:["fr"],tags:{amenity:"restaurant",brand:"Poivre Rouge","brand:wikidata":"Q7316076","brand:wikipedia":"fr:Poivre Rouge (restauration)",cuisine:"french",name:"Poivre Rouge"}},"amenity/restaurant|Prezzo":{countryCodes:["gb"],tags:{amenity:"restaurant",brand:"Prezzo","brand:wikidata":"Q7242489","brand:wikipedia":"en:Prezzo (restaurant)",cuisine:"italian",name:"Prezzo"}},"amenity/restaurant|Red Lobster":{tags:{amenity:"restaurant",brand:"Red Lobster","brand:wikidata":"Q846301","brand:wikipedia":"en:Red Lobster",cuisine:"seafood",name:"Red Lobster"}},"amenity/restaurant|Red Robin":{tags:{amenity:"restaurant",brand:"Red Robin","brand:wikidata":"Q7304886","brand:wikipedia":"en:Red Robin",cuisine:"burger",name:"Red Robin",official_name:"Red Robin Gourmet Burgers and Brews"}},"amenity/restaurant|Romano's Macaroni Grill":{countryCodes:["us"],tags:{amenity:"restaurant",brand:"Romano's Macaroni Grill","brand:wikidata":"Q7362714","brand:wikipedia":"en:Romano's Macaroni Grill",cuisine:"italian",name:"Romano's Macaroni Grill"}},"amenity/restaurant|Round Table Pizza":{countryCodes:["us"],tags:{amenity:"restaurant",brand:"Round Table Pizza","brand:wikidata":"Q7371139","brand:wikipedia":"en:Round Table Pizza",cuisine:"pizza",name:"Round Table Pizza"}},"amenity/restaurant|Ruby Tuesday":{tags:{amenity:"restaurant",brand:"Ruby Tuesday","brand:wikidata":"Q7376400","brand:wikipedia":"en:Ruby Tuesday (restaurant)",cuisine:"american",name:"Ruby Tuesday"}},"amenity/restaurant|Ruth's Chris Steak House":{countryCodes:["ca","mx","us"],tags:{amenity:"restaurant",brand:"Ruth's Chris Steak House","brand:wikidata":"Q7382829","brand:wikipedia":"en:Ruth's Chris Steak House",cuisine:"american",name:"Ruth's Chris Steak House"}},"amenity/restaurant|Shakey's":{tags:{amenity:"restaurant",brand:"Shakey's","brand:wikidata":"Q6134929","brand:wikipedia":"en:Shakey's Pizza",cuisine:"pizza",name:"Shakey's"}},"amenity/restaurant|Shari's":{countryCodes:["us"],tags:{amenity:"restaurant",brand:"Shari's","brand:wikidata":"Q7489612","brand:wikipedia":"en:Shari's Cafe & Pies",cuisine:"american",name:"Shari's"}},"amenity/restaurant|Shoney's":{countryCodes:["us"],tags:{amenity:"restaurant",brand:"Shoney's","brand:wikidata":"Q7500392","brand:wikipedia":"en:Shoney's",cuisine:"american",name:"Shoney's"}},"amenity/restaurant|Sizzler":{tags:{amenity:"restaurant",brand:"Sizzler","brand:wikidata":"Q1848822","brand:wikipedia":"en:Sizzler",cuisine:"steak_house",name:"Sizzler"}},"amenity/restaurant|Skyline Chili":{countryCodes:["us"],tags:{amenity:"restaurant",brand:"Skyline Chili","brand:wikidata":"Q151224","brand:wikipedia":"en:Skyline Chili",cuisine:"chili",name:"Skyline Chili",takeaway:"yes"}},"amenity/restaurant|Smitty's":{tags:{amenity:"restaurant",brand:"Smitty's","brand:wikidata":"Q7545728","brand:wikipedia":"en:Smitty's",cuisine:"pancake",name:"Smitty's"}},"amenity/restaurant|Snappy Tomato Pizza":{countryCodes:["gb","us"],tags:{amenity:"restaurant",brand:"Snappy Tomato Pizza","brand:wikidata":"Q7547352","brand:wikipedia":"en:Snappy Tomato Pizza",cuisine:"pizza",name:"Snappy Tomato Pizza",takeaway:"yes"}},"amenity/restaurant|Spur":{matchNames:["spur steak ranches"],tags:{amenity:"restaurant",brand:"Spur","brand:wikidata":"Q7581546","brand:wikipedia":"en:Spur Steak Ranches",cuisine:"steak_house",name:"Spur"}},"amenity/restaurant|Steak 'n Shake":{tags:{amenity:"restaurant",brand:"Steak 'n Shake","brand:wikidata":"Q7605233","brand:wikipedia":"en:Steak 'n Shake",cuisine:"burger",name:"Steak 'n Shake"}},"amenity/restaurant|Sunset Grill":{countryCodes:["ca","us"],tags:{amenity:"restaurant",brand:"Sunset Grill","brand:wikidata":"Q62112489","brand:wikipedia":"en:Sunset Grill (Canadian restaurant chain)",cuisine:"american",name:"Sunset Grill"}},"amenity/restaurant|Swiss Chalet":{countryCodes:["ca"],tags:{amenity:"restaurant",brand:"Swiss Chalet","brand:wikidata":"Q2372909","brand:wikipedia":"en:Swiss Chalet",cuisine:"chicken",name:"Swiss Chalet"}},"amenity/restaurant|TGI Friday's":{tags:{amenity:"restaurant",brand:"TGI Friday's","brand:wikidata":"Q1524184","brand:wikipedia":"en:TGI Fridays",cuisine:"american",name:"TGI Friday's"}},"amenity/restaurant|Texas Roadhouse":{tags:{amenity:"restaurant",brand:"Texas Roadhouse","brand:wikidata":"Q7707945","brand:wikipedia":"en:Texas Roadhouse",cuisine:"steak_house",name:"Texas Roadhouse"}},"amenity/restaurant|The Cheesecake Factory":{matchNames:["cheesecake factory"],tags:{amenity:"restaurant",brand:"The Cheesecake Factory","brand:wikidata":"Q1045842","brand:wikipedia":"en:The Cheesecake Factory",cuisine:"american",name:"The Cheesecake Factory"}},"amenity/restaurant|The Keg":{matchNames:["keg"],tags:{amenity:"restaurant",brand:"The Keg","brand:wikidata":"Q7744066","brand:wikipedia":"en:The Keg",cuisine:"steak_house",name:"The Keg"}},"amenity/restaurant|The Melting Pot":{matchNames:["melting pot"],tags:{amenity:"restaurant",brand:"The Melting Pot","brand:wikidata":"Q7750948","brand:wikipedia":"en:The Melting Pot (restaurant)",cuisine:"fondue",name:"The Melting Pot"}},"amenity/restaurant|Toby Carvery":{countryCodes:["gb"],tags:{amenity:"restaurant",brand:"Toby Carvery","brand:wikidata":"Q7811777","brand:wikipedia":"en:Toby Carvery",cuisine:"british",name:"Toby Carvery"}},"amenity/restaurant|Toks":{countryCodes:["mx"],tags:{amenity:"restaurant",brand:"Toks","brand:wikidata":"Q48835586","brand:wikipedia":"en:Toks",cuisine:"mexican",name:"Toks"}},"amenity/restaurant|Tony Roma's":{matchNames:["tony roma"],tags:{amenity:"restaurant",brand:"Tony Roma's","brand:wikidata":"Q2213883","brand:wikipedia":"en:Tony Roma's",cuisine:"barbecue",name:"Tony Roma's"}},"amenity/restaurant|Vapiano":{tags:{amenity:"restaurant",brand:"Vapiano","brand:wikidata":"Q506252","brand:wikipedia":"en:Vapiano",cuisine:"italian",name:"Vapiano"}},"amenity/restaurant|Village Inn":{countryCodes:["us"],tags:{amenity:"restaurant",brand:"Village Inn","brand:wikidata":"Q7930659","brand:wikipedia":"en:Village Inn",cuisine:"american",name:"Village Inn"}},"amenity/restaurant|Vips":{countryCodes:["es","mx"],tags:{amenity:"restaurant",brand:"Vips","brand:wikidata":"Q48783378","brand:wikipedia":"es:Vips",name:"Vips"}},"amenity/restaurant|Waffle House":{countryCodes:["us"],tags:{amenity:"restaurant",brand:"Waffle House","brand:wikidata":"Q1701206","brand:wikipedia":"en:Waffle House",cuisine:"american",name:"Waffle House",opening_hours:"24/7"}},"amenity/restaurant|Wagamama":{tags:{amenity:"restaurant",brand:"Wagamama","brand:wikidata":"Q503715","brand:wikipedia":"en:Wagamama",cuisine:"asian",name:"Wagamama"}},"amenity/restaurant|Wasabi":{tags:{amenity:"restaurant",brand:"Wasabi","brand:wikidata":"Q23891278","brand:wikipedia":"en:Wasabi (restaurant)",cuisine:"japanese",name:"Wasabi"}},"amenity/restaurant|White Spot":{tags:{amenity:"restaurant",brand:"White Spot","brand:wikidata":"Q7995414","brand:wikipedia":"en:White Spot",cuisine:"burger",name:"White Spot"}},"amenity/restaurant|Wingstop":{tags:{amenity:"restaurant",brand:"Wingstop","brand:wikidata":"Q8025339","brand:wikipedia":"en:Wingstop",cuisine:"wings",name:"Wingstop"}},"amenity/restaurant|YO! Sushi":{tags:{amenity:"restaurant",brand:"YO! Sushi","brand:wikidata":"Q3105441","brand:wikipedia":"en:YO! Sushi",cuisine:"sushi",name:"YO! Sushi"}},"amenity/restaurant|Zizzi":{tags:{amenity:"restaurant",brand:"Zizzi","brand:wikidata":"Q8072944","brand:wikipedia":"en:Zizzi",cuisine:"italian",name:"Zizzi"}},"amenity/restaurant|Евразия":{tags:{amenity:"restaurant",brand:"Евразия",name:"Евразия"}},"amenity/restaurant|Планета Суши":{tags:{amenity:"restaurant",brand:"Планета Суши","brand:wikidata":"Q62739250",cuisine:"sushi",name:"Планета Суши","name:en":"Planet Sushi"}},"amenity/restaurant|Тануки":{countryCodes:["kz","ru","ua"],tags:{amenity:"restaurant",brand:"Тануки","brand:wikidata":"Q62758690",cuisine:"japanese",name:"Тануки","name:en":"Tanuki","name:ru":"Тануки"}},"amenity/restaurant|Якитория":{tags:{amenity:"restaurant",brand:"Якитория",name:"Якитория"}},"amenity/restaurant|いきなり!ステーキ":{countryCodes:["jp"],tags:{amenity:"restaurant",brand:"いきなり!ステーキ","brand:en":"Ikinari Steak","brand:ja":"いきなり!ステーキ","brand:wikidata":"Q21652405","brand:wikipedia":"ja:いきなり!ステーキ",cuisine:"steak_house",name:"いきなり!ステーキ","name:en":"Ikinari Steak","name:ja":"いきなり!ステーキ"}},"amenity/restaurant|はなまるうどん":{countryCodes:["jp"],tags:{amenity:"restaurant",brand:"はなまるうどん","brand:en":"Hanamarūdon","brand:ja":"はなまるうどん","brand:wikidata":"Q11275674","brand:wikipedia":"ja:はなまるうどん",cuisine:"japanese;udon",name:"はなまるうどん","name:en":"Hanamarūdon","name:ja":"はなまるうどん"}},"amenity/restaurant|びっくりドンキー":{countryCodes:["jp"],tags:{amenity:"restaurant",brand:"びっくりドンキー","brand:en":"Bikkuri Donkey","brand:ja":"びっくりドンキー","brand:wikidata":"Q11276815","brand:wikipedia":"ja:びっくりドンキー",cuisine:"burger",name:"びっくりドンキー","name:en":"Bikkuri Donkey","name:ja":"びっくりドンキー"}},"amenity/restaurant|やよい軒":{countryCodes:["jp"],tags:{amenity:"restaurant",brand:"やよい軒","brand:en":"Yayoiken","brand:ja":"やよい軒","brand:wikidata":"Q11280577","brand:wikipedia":"ja:やよい軒",cuisine:"japanese",name:"やよい軒","name:en":"Yayoiken","name:ja":"やよい軒"}},"amenity/restaurant|カプリチョーザ":{countryCodes:["jp"],tags:{amenity:"restaurant",brand:"カプリチョーザ","brand:en":"Capricciosa","brand:ja":"カプリチョーザ","brand:wikidata":"Q11294660","brand:wikipedia":"ja:カプリチョーザ",cuisine:"italian",name:"カプリチョーザ","name:en":"Capricciosa","name:ja":"カプリチョーザ"}},"amenity/restaurant|ガスト":{countryCodes:["jp"],tags:{amenity:"restaurant",brand:"ガスト","brand:en":"Gusto","brand:ja":"ガスト",cuisine:"western;japanese",name:"ガスト","name:en":"Gusto","name:ja":"ガスト"}},"amenity/restaurant|ココス":{countryCodes:["jp"],tags:{amenity:"restaurant",brand:"ココス","brand:en":"Coco's","brand:ja":"ココス","brand:wikidata":"Q11301951","brand:wikipedia":"ja:ココスジャパン",cuisine:"western;japanese",name:"ココス","name:en":"Coco's","name:ja":"ココス"}},"amenity/restaurant|サイゼリヤ":{countryCodes:["jp"],tags:{amenity:"restaurant",brand:"サイゼリヤ","brand:en":"Saizeriya","brand:ja":"サイゼリヤ","brand:wikidata":"Q886564","brand:wikipedia":"en:Saizeriya",cuisine:"italian",name:"サイゼリヤ","name:en":"Saizeriya","name:ja":"サイゼリヤ"}},"amenity/restaurant|ジョイフル":{countryCodes:["jp"],tags:{amenity:"restaurant",brand:"ジョイフル","brand:en":"Joyfull","brand:ja":"ジョイフル","brand:wikidata":"Q11310517","brand:wikipedia":"ja:ジョイフル",cuisine:"western",name:"ジョイフル","name:en":"Joyfull","name:ja":"ジョイフル"}},"amenity/restaurant|ジョナサン":{countryCodes:["jp"],tags:{amenity:"restaurant",brand:"ジョナサン","brand:en":"Jonathan's","brand:ja":"ジョナサン","brand:wikidata":"Q11310628","brand:wikipedia":"ja:ジョナサン (ファミリーレストラン)",cuisine:"italian;japanese",name:"ジョナサン","name:en":"Jonathan's","name:ja":"ジョナサン"}},"amenity/restaurant|ジョリーパスタ":{countryCodes:["jp"],tags:{amenity:"restaurant",brand:"ジョリーパスタ","brand:en":"Jolly-Pasta","brand:ja":"ジョリーパスタ","brand:wikidata":"Q10852718","brand:wikipedia":"ja:ジョリーパスタ",cuisine:"pasta",name:"ジョリーパスタ","name:en":"Jolly-Pasta","name:ja":"ジョリーパスタ"}},"amenity/restaurant|ステーキガスト":{countryCodes:["jp"],tags:{amenity:"restaurant",brand:"ステーキガスト","brand:ja":"ステーキガスト","brand:wikidata":"Q11253593","brand:wikipedia":"ja:すかいらーく",cuisine:"steak",name:"ステーキガスト","name:ja":"ステーキガスト"}},"amenity/restaurant|デニーズ":{countryCodes:["jp"],tags:{amenity:"restaurant",brand:"デニーズ","brand:en":"Denny's","brand:ja":"デニーズ","brand:wikidata":"Q11320661","brand:wikipedia":"ja:デニーズ (日本)",name:"デニーズ","name:en":"Denny's","name:ja":"デニーズ"}},"amenity/restaurant|バーミヤン":{countryCodes:["jp"],tags:{amenity:"restaurant",brand:"バーミヤン","brand:en":"Bamiyan","brand:ja":"バーミヤン","brand:wikidata":"Q11328598","brand:wikipedia":"ja:バーミヤン (レストランチェーン)",name:"バーミヤン","name:en":"Bamiyan","name:ja":"バーミヤン"}},"amenity/restaurant|ビッグボーイ":{countryCodes:["jp"],tags:{amenity:"restaurant",brand:"ビッグボーイ","brand:en":"Big Boy Restaurants","brand:ja":"ビッグボーイ","brand:wikidata":"Q4386779","brand:wikipedia":"en:Big Boy Restaurants",cuisine:"burger",name:"ビッグボーイ","name:en":"Big Boy Restaurants","name:ja":"ビッグボーイ"}},"amenity/restaurant|リンガーハット":{countryCodes:["jp"],tags:{amenity:"restaurant",brand:"リンガーハット","brand:en":"Ringer Hut","brand:ja":"リンガーハット","brand:wikidata":"Q7334856","brand:wikipedia":"en:Ringer Hut",cuisine:"japanese",name:"リンガーハット","name:en":"Ringer Hut","name:ja":"リンガーハット"}},"amenity/restaurant|ロイヤルホスト":{countryCodes:["jp"],tags:{amenity:"restaurant",brand:"ロイヤルホスト","brand:en":"Royal Host","brand:ja":"ロイヤルホスト","brand:wikidata":"Q11120884","brand:wikipedia":"ja:ロイヤルホスト",cuisine:"japanese;italian;french",name:"ロイヤルホスト","name:en":"Royal Host","name:ja":"ロイヤルホスト"}},"amenity/restaurant|丸亀製麺":{countryCodes:["jp"],tags:{amenity:"restaurant",brand:"丸亀製麺","brand:en":"Marugame Seimen","brand:ja":"丸亀製麺","brand:wikidata":"Q10877253","brand:wikipedia":"ja:丸亀製麺",cuisine:"noodle",name:"丸亀製麺","name:en":"Marugame Seimen","name:ja":"丸亀製麺"}},"amenity/restaurant|八方雲集":{tags:{amenity:"restaurant",brand:"八方雲集","brand:en":"Eight Way","brand:wikidata":"Q28417381","brand:wikipedia":"zh:八方雲集","brand:zh":"八方雲集",name:"八方雲集","name:en":"Eight Way","name:zh":"八方雲集"}},"amenity/restaurant|和食さと":{countryCodes:["jp"],matchNames:["さと"],tags:{amenity:"restaurant",brand:"和食さと","brand:en":"Washoku Sato","brand:ja":"和食さと","brand:wikidata":"Q11304897","brand:wikipedia":"ja:SRSホールディングス",cuisine:"japanese",name:"和食さと","name:en":"Washoku Sato","name:ja":"和食さと"}},"amenity/restaurant|夢庵":{countryCodes:["jp"],tags:{amenity:"restaurant",brand:"夢庵","brand:en":"Yumean","brand:ja":"夢庵","brand:wikidata":"Q11253593","brand:wikipedia":"ja:すかいらーく",cuisine:"japanese",name:"夢庵","name:en":"Yumean","name:ja":"夢庵"}},"amenity/restaurant|大戸屋":{countryCodes:["jp"],tags:{amenity:"restaurant",brand:"大戸屋","brand:en":"Ootoya","brand:ja":"大戸屋","brand:wikidata":"Q11435522","brand:wikipedia":"ja:大戸屋ホールディングス",cuisine:"japanese",name:"大戸屋","name:en":"Ootoya","name:ja":"大戸屋"}},"amenity/restaurant|大阪王将":{countryCodes:["jp"],tags:{amenity:"restaurant",brand:"大阪王将","brand:en":"Osaka Ohsho","brand:ja":"大阪王将","brand:wikidata":"Q48743717","brand:wikipedia":"ja:大阪王将",cuisine:"japanese;chinese",name:"大阪王将","name:en":"Osaka Ohsho","name:ja":"大阪王将"}},"amenity/restaurant|天下一品":{countryCodes:["jp"],tags:{amenity:"restaurant",brand:"天下一品","brand:en":"Tenkaippin","brand:wikidata":"Q11442172","brand:wikipedia":"en:Tenkaippin",cuisine:"ramen",name:"天下一品","name:en":"Tenkaippin"}},"amenity/restaurant|安楽亭":{countryCodes:["jp"],tags:{amenity:"restaurant",brand:"安楽亭","brand:en":"Anrakutei","brand:wikidata":"Q11450866","brand:wikipedia":"ja:安楽亭",cuisine:"barbecue",name:"安楽亭","name:en":"Anrakutei"}},"amenity/restaurant|木曽路":{tags:{amenity:"restaurant",brand:"木曽路","brand:wikidata":"Q11518589","brand:wikipedia":"ja:木曽路 (企業)",cuisine:"japanese",name:"木曽路"}},"amenity/restaurant|永和豆漿":{countryCodes:["tw"],tags:{amenity:"restaurant",brand:"永和豆漿","brand:en":"Yonghe Soy Milk","brand:wikidata":"Q11131335","brand:wikipedia":"zh:永和豆漿",name:"永和豆漿","name:en":"Yonghe Soy Milk"}},"amenity/restaurant|牛角":{tags:{amenity:"restaurant",brand:"牛角","brand:en":"Gyū-Kaku","brand:wikidata":"Q11349387","brand:wikipedia":"en:Gyu-Kaku",cuisine:"barbecue",name:"牛角","name:en":"Gyū-Kaku"}},"amenity/restaurant|華屋与兵衛":{countryCodes:["jp"],tags:{amenity:"restaurant",brand:"華屋与兵衛","brand:en":"Hanaya Yohei","brand:ja":"華屋与兵衛","brand:wikidata":"Q11620063","brand:wikipedia":"ja:華屋与兵衛 (レストラン)",cuisine:"japanese",name:"華屋与兵衛","name:en":"Hanaya Yohei","name:ja":"華屋与兵衛",operator:"株式会社ゼンショーホールディングス","operator:en":"Zensho Holdings Co., Ltd.","operator:ja":"株式会社ゼンショーホールディングス","operator:wikidata":"Q8069229","operator:wikipedia":"ja:ゼンショー"}},"amenity/restaurant|餃子の王将":{countryCodes:["jp"],tags:{amenity:"restaurant",brand:"餃子の王将","brand:en":"Gyoza no Ohsho","brand:ja":"餃子の王将","brand:wikidata":"Q11666805","brand:wikipedia":"en:Gyoza no Ohsho",cuisine:"chinese;gyoza",name:"餃子の王将","name:en":"Gyoza no Ohsho","name:ja":"餃子の王将"}},"amenity/restaurant|바다횟집":{countryCodes:["kr"],tags:{amenity:"restaurant",brand:"바다횟집","brand:ko":"바다횟집",name:"바다횟집","name:ko":"바다횟집"}},"amenity/restaurant|빕스":{countryCodes:["kr"],tags:{amenity:"restaurant",brand:"빕스","brand:en":"VIPS","brand:ko":"빕스","brand:wikidata":"Q12599540","brand:wikipedia":"en:VIPS (restaurant)",name:"빕스","name:en":"VIPS","name:ko":"빕스"}},"amenity/social_centre|American Legion Hall":{countryCodes:["us"],matchNames:["american legion"],tags:{alt_name:"American Legion Hall",amenity:"social_centre",brand:"American Legion","brand:wikidata":"Q468865","brand:wikipedia":"en:American Legion",name:"American Legion Hall","social_centre:for":"veterans"}},"amenity/social_centre|Eagles Lodge":{countryCodes:["us"],matchNames:["aeries lodge","foe","fraternal order of eagles"],tags:{alt_name:"Aeries Lodge",amenity:"social_centre",brand:"Fraternal Order of Eagles","brand:wikidata":"Q5493810","brand:wikipedia":"en:Fraternal Order of Eagles",name:"Eagles Lodge",official_name:"Fraternal Order of Eagles"}},"amenity/social_centre|Elks Lodge":{countryCodes:["us"],matchNames:["benevolent and protective order of elks","bpoe","elks"],tags:{amenity:"social_centre",brand:"Benevolent and Protective Order of Elks","brand:wikidata":"Q2895789","brand:wikipedia":"en:Benevolent and Protective Order of Elks",name:"Elks Lodge",official_name:"Benevolent and Protective Order of Elks"}},"amenity/social_centre|Moose Lodge":{countryCodes:["bm","ca","us"],matchNames:["loyal order of moose"],tags:{alt_name:"Moose Lodge",amenity:"social_centre",brand:"Loyal Order of Moose","brand:wikidata":"Q6908585","brand:wikipedia":"en:Loyal Order of Moose",name:"Moose Lodge",official_name:"Loyal Order of Moose"}},"amenity/social_centre|Odd Fellows Hall":{matchNames:["independent order of odd fellows","ioof","odd fellow","odd fellows"],tags:{amenity:"social_centre",brand:"Independent Order of Odd Fellows","brand:wikidata":"Q1425508","brand:wikipedia":"en:Independent Order of Odd Fellows",name:"Odd Fellows Hall",official_name:"Independent Order of Odd Fellows"}},"amenity/vending_machine|Amazon Locker":{tags:{amenity:"vending_machine",brand:"Amazon Locker","brand:wikidata":"Q16974764","brand:wikipedia":"en:Amazon Locker",name:"Amazon Locker",vending:"parcel_pickup"}},"amenity/vending_machine|Automat na jizdenky MHD":{tags:{amenity:"vending_machine",brand:"Automat na jizdenky MHD",name:"Automat na jizdenky MHD"}},"amenity/vending_machine|Automat ŚKUP":{tags:{amenity:"vending_machine",brand:"Automat ŚKUP","brand:wikidata":"Q24945427","brand:wikipedia":"pl:Śląska Karta Usług Publicznych",name:"Automat ŚKUP",vending:"public_transport_tickets"}},"amenity/vending_machine|BKK-automata":{tags:{amenity:"vending_machine",brand:"BKK-automata",name:"BKK-automata"}},"amenity/vending_machine|DHL Packstation":{matchTags:["amenity/post_box"],tags:{amenity:"vending_machine",brand:"Packstation","brand:wikidata":"Q1766703","brand:wikipedia":"en:Packstation",name:"DHL Packstation",operator:"DHL","operator:wikidata":"Q489815","operator:wikipedia":"en:DHL Express",vending:"parcel_pickup;parcel_mail_in"}},"amenity/vending_machine|DHL Paketbox":{countryCodes:["de"],tags:{amenity:"vending_machine",brand:"Paketbox","brand:wikidata":"Q2046604","brand:wikipedia":"de:Paketbox",name:"DHL Paketbox",operator:"DHL","operator:wikidata":"Q489815","operator:wikipedia":"de:DHL",vending:"parcel_mail_in"}},"amenity/vending_machine|Dog-Station":{tags:{amenity:"vending_machine",brand:"Dog-Station","brand:wikidata":"Q63720061",name:"Dog-Station",vending:"excrement_bags"}},"amenity/vending_machine|KKM":{countryCodes:["pl"],tags:{amenity:"vending_machine",brand:"KKM","brand:wikidata":"Q57515549",name:"KKM",vending:"public_transport_tickets"}},"amenity/vending_machine|Paczkomat InPost":{countryCodes:["pl"],tags:{amenity:"vending_machine",brand:"InPost","brand:wikidata":"Q3182097","brand:wikipedia":"pl:InPost",name:"Paczkomat InPost",vending:"parcel_pickup;parcel_mail_in"}},"amenity/vending_machine|ParkPlus~(Calgary)":{tags:{amenity:"vending_machine",brand:"ParkPlus","brand:wikidata":"Q63719595",name:"ParkPlus",vending:"parking_tickets"}},"amenity/vending_machine|Redbox":{tags:{amenity:"vending_machine",brand:"Redbox","brand:wikidata":"Q7305489","brand:wikipedia":"en:Redbox",name:"Redbox",vending:"dvd"}},"amenity/vending_machine|Robidog":{countryCodes:["ch"],tags:{amenity:"vending_machine",brand:"Robidog","brand:wikidata":"Q2159689","brand:wikipedia":"de:Robidog",name:"Robidog",vending:"excrement_bags"}},"amenity/vending_machine|Tobaccoland":{countryCodes:["de"],tags:{amenity:"vending_machine",brand:"Tobaccoland","brand:wikidata":"Q1439872","brand:wikipedia":"de:Tobaccoland Automatengesellschaft",name:"Tobaccoland",vending:"cigarettes"}},"amenity/vending_machine|VVO Fahrausweise":{countryCodes:["de"],tags:{amenity:"vending_machine",brand:"VVO Fahrausweise",name:"VVO Fahrausweise",operator:"Verkehrsverbund Oberelbe","operator:wikidata":"Q1426445","operator:wikipedia":"en:Verkehrsverbund Oberelbe",vending:"public_transport_tickets"}},"amenity/vending_machine|Ключ здоровья":{countryCodes:["ru"],matchTags:["shop/water"],tags:{amenity:"vending_machine",brand:"Ключ здоровья",name:"Ключ здоровья",vending:"water"}},"amenity/vending_machine|コカ・コーラ":{countryCodes:["jp"],tags:{amenity:"vending_machine",brand:"コカ・コーラ","brand:en":"Coca-Cola","brand:ja":"コカ・コーラ","brand:wikidata":"Q2813","brand:wikipedia":"ja:コカ・コーラ",drink:"cola",name:"コカ・コーラ","name:en":"Coca-Cola","name:ja":"コカ・コーラ",operator:"Coca Cola Japan Co., Ltd.","operator:wikidata":"Q11506438","operator:wikipedia":"ja:日本コカ・コーラ",vending:"drinks"}},"amenity/vending_machine|ポッカサッポロ":{countryCodes:["jp"],matchNames:["pokka sapporo"],tags:{amenity:"vending_machine",brand:"ポッカサッポロ","brand:en":"Pokka Sapporo","brand:ja":"ポッカサッポロ","brand:wikidata":"Q7208665","brand:wikipedia":"ja:ポッカサッポロフード&ビバレッジ",name:"ポッカサッポロ","name:en":"Pokka Sapporo","name:ja":"ポッカサッポロ",vending:"water;food"}},"amenity/veterinary|Banfield Pet Hospital":{countryCodes:["us"],tags:{amenity:"veterinary",brand:"Banfield Pet Hospital","brand:wikidata":"Q2882416","brand:wikipedia":"en:Banfield Pet Hospital",name:"Banfield Pet Hospital"}},"amenity/veterinary|VCA Animal Hospital":{countryCodes:["ca","us"],tags:{amenity:"veterinary",brand:"VCA Animal Hospital","brand:wikidata":"Q7906620","brand:wikipedia":"en:VCA Animal Hospitals",name:"VCA Animal Hospital"}},"leisure/fitness_centre|24 Hour Fitness":{countryCodes:["us"],tags:{brand:"24 Hour Fitness","brand:wikidata":"Q4631849","brand:wikipedia":"en:24 Hour Fitness",leisure:"fitness_centre",name:"24 Hour Fitness"}},"leisure/fitness_centre|Anytime Fitness":{tags:{brand:"Anytime Fitness","brand:wikidata":"Q4778364","brand:wikipedia":"en:Anytime Fitness",leisure:"fitness_centre",name:"Anytime Fitness"}},"leisure/fitness_centre|Basic-Fit":{countryCodes:["be","es","fr","lu","nl"],tags:{brand:"Basic-Fit","brand:wikidata":"Q40165577","brand:wikipedia":"nl:Basic-Fit",leisure:"fitness_centre",name:"Basic-Fit"}},"leisure/fitness_centre|Curves":{tags:{brand:"Curves","brand:wikidata":"Q5196080","brand:wikipedia":"en:Curves International",leisure:"fitness_centre",name:"Curves"}},"leisure/fitness_centre|Fitness First":{tags:{brand:"Fitness First","brand:wikidata":"Q127120","brand:wikipedia":"en:Fitness First",leisure:"fitness_centre",name:"Fitness First"}},"leisure/fitness_centre|Gold's Gym":{tags:{brand:"Gold's Gym","brand:wikidata":"Q1536234","brand:wikipedia":"en:Gold's Gym",leisure:"fitness_centre",name:"Gold's Gym"}},"leisure/fitness_centre|LA Fitness":{countryCodes:["ca","gb","us"],tags:{brand:"LA Fitness","brand:wikidata":"Q6457180","brand:wikipedia":"en:LA Fitness",leisure:"fitness_centre",name:"LA Fitness"}},"leisure/fitness_centre|McFit":{countryCodes:["at","de","es","it","pl"],tags:{brand:"McFit","brand:wikidata":"Q871302","brand:wikipedia":"en:McFit",leisure:"fitness_centre",name:"McFit"}},"leisure/fitness_centre|Orangetheory Fitness":{countryCodes:["ca","es","us"],matchNames:["orangetheory"],tags:{brand:"Orangetheory Fitness","brand:wikidata":"Q25005163","brand:wikipedia":"en:Orangetheory Fitness",leisure:"fitness_centre",name:"Orangetheory Fitness"}},"leisure/fitness_centre|Planet Fitness":{countryCodes:["ae","au","ca","cl","cn","co","cr","de","do","es","gb","gt","il","jp","kw","mx","nz","pa","pe","pl","pr","sa","sg","us"],tags:{brand:"Planet Fitness","brand:wikidata":"Q7201095","brand:wikipedia":"en:Planet Fitness",leisure:"fitness_centre",name:"Planet Fitness"}},"leisure/fitness_centre|PureGym":{countryCodes:["gb"],tags:{brand:"PureGym","brand:wikidata":"Q18345898","brand:wikipedia":"en:PureGym",leisure:"fitness_centre",name:"PureGym"}},"leisure/fitness_centre|Retro Fitness":{countryCodes:["us"],tags:{brand:"Retro Fitness","brand:wikidata":"Q61994955",leisure:"fitness_centre",name:"Retro Fitness"}},"leisure/fitness_centre|Snap Fitness":{tags:{brand:"Snap Fitness","brand:wikidata":"Q7547254","brand:wikipedia":"en:Snap Fitness",leisure:"fitness_centre",name:"Snap Fitness"}},"leisure/fitness_centre|clever fit":{countryCodes:["at","ch","de"],tags:{brand:"clever fit",leisure:"fitness_centre",name:"clever fit"}},"leisure/sports_centre|YMCA":{tags:{brand:"YMCA","brand:wikidata":"Q157169","brand:wikipedia":"en:YMCA",leisure:"sports_centre",name:"YMCA"}},"office/financial_advisor|Edward Jones":{countryCodes:["ca","us"],matchTags:["office/financial"],tags:{alt_name:"Edward Jones Investments",brand:"Edward Jones","brand:wikidata":"Q5343830","brand:wikipedia":"en:Edward Jones Investments",name:"Edward Jones",office:"financial_advisor"}},"office/insurance|Allstate":{countryCodes:["us"],matchNames:["allstate insurance"],tags:{brand:"Allstate","brand:wikidata":"Q2645636","brand:wikipedia":"en:Allstate",name:"Allstate",office:"insurance"}},"office/insurance|American Family Insurance":{countryCodes:["us"],matchNames:["american family","amfam"],tags:{brand:"American Family Insurance","brand:wikidata":"Q4743730","brand:wikipedia":"en:American Family Insurance",name:"American Family Insurance",office:"insurance"}},"office/insurance|Erie Insurance":{countryCodes:["us"],matchNames:["erie"],tags:{brand:"Erie Insurance","brand:wikidata":"Q5388314","brand:wikipedia":"en:Erie Insurance Group",name:"Erie Insurance",office:"insurance"}},"office/insurance|Farmers Insurance":{countryCodes:["us"],matchNames:["farmers"],tags:{brand:"Farmers Insurance","brand:wikidata":"Q1396863","brand:wikipedia":"en:Farmers Insurance Group",name:"Farmers Insurance",office:"insurance"}},"office/insurance|GEICO":{countryCodes:["us"],tags:{brand:"GEICO","brand:wikidata":"Q1498689","brand:wikipedia":"en:GEICO",name:"GEICO",office:"insurance"}},"office/insurance|Grange Insurance":{countryCodes:["us"],matchNames:["grange"],tags:{brand:"Grange Insurance","brand:wikidata":"Q17183481","brand:wikipedia":"en:Grange Insurance",name:"Grange Insurance",office:"insurance"}},"office/insurance|Nationwide":{countryCodes:["us"],matchNames:["nationwide insurance"],nomatch:["amenity/bank|Nationwide"],tags:{brand:"Nationwide","brand:wikidata":"Q6979886","brand:wikipedia":"en:Nationwide Mutual Insurance Company",name:"Nationwide",office:"insurance"}},"office/insurance|Progressive":{countryCodes:["us"],matchNames:["progressive insurance"],tags:{brand:"Progressive","brand:wikidata":"Q7248721","brand:wikipedia":"en:Progressive Corporation",name:"Progressive",office:"insurance"}},"office/insurance|State Farm":{countryCodes:["us"],matchNames:["state farm insurance"],tags:{brand:"State Farm","brand:wikidata":"Q2007336","brand:wikipedia":"en:State Farm",name:"State Farm",office:"insurance"}},"office/tax_advisor|H&R Block":{countryCodes:["us"],tags:{brand:"H&R Block","brand:wikidata":"Q5627799","brand:wikipedia":"en:H&R Block",name:"H&R Block",office:"tax_advisor"}},"office/tax_advisor|Jackson Hewitt":{countryCodes:["us"],matchNames:["jackson hewitt tax service"],tags:{alt_name:"Jackson Hewitt Tax Service",brand:"Jackson Hewitt","brand:wikidata":"Q6117132","brand:wikipedia":"en:Jackson Hewitt",name:"Jackson Hewitt",office:"tax_advisor"}},"office/tax_advisor|Liberty Tax":{countryCodes:["us"],matchNames:["liberty tax service"],tags:{alt_name:"Liberty Tax Service",brand:"Liberty Tax","brand:wikidata":"Q6541978","brand:wikipedia":"en:Liberty Tax Service",name:"Liberty Tax",office:"tax_advisor"}},"shop/alcohol|Alko":{countryCodes:["fi"],tags:{brand:"Alko","brand:wikidata":"Q1849187","brand:wikipedia":"en:Alko",name:"Alko",shop:"alcohol"}},"shop/alcohol|BC Liquor Store":{countryCodes:["ca"],tags:{brand:"BC Liquor Store","brand:wikidata":"Q43079557","brand:wikipedia":"en:BC Liquor Stores",name:"BC Liquor Store",shop:"alcohol"}},"shop/alcohol|BWS":{countryCodes:["au"],tags:{brand:"BWS","brand:wikidata":"Q4836848","brand:wikipedia":"en:BWS (liquor retailer)",name:"BWS",shop:"alcohol"}},"shop/alcohol|Bargain Booze":{countryCodes:["gb"],tags:{brand:"Bargain Booze","brand:wikidata":"Q16971315","brand:wikipedia":"en:Bargain Booze",name:"Bargain Booze",shop:"alcohol"}},"shop/alcohol|BevMo!":{countryCodes:["us"],tags:{brand:"BevMo!","brand:wikidata":"Q4899308","brand:wikipedia":"en:BevMo!",name:"BevMo!",shop:"alcohol"}},"shop/alcohol|Cellarbrations":{countryCodes:["au"],tags:{brand:"Cellarbrations",name:"Cellarbrations",operator:"Metcash","operator:wikidata":"Q23073728","operator:wikipedia":"en:Metcash",shop:"alcohol"}},"shop/alcohol|Dan Murphy's":{countryCodes:["au"],tags:{brand:"Dan Murphy's","brand:wikidata":"Q5214075","brand:wikipedia":"en:Dan Murphy's",name:"Dan Murphy's",shop:"alcohol"}},"shop/alcohol|Gall & Gall":{countryCodes:["nl"],tags:{brand:"Gall & Gall","brand:wikidata":"Q13639185","brand:wikipedia":"nl:Gall & Gall",name:"Gall & Gall",shop:"alcohol"}},"shop/alcohol|LCBO":{countryCodes:["ca"],tags:{brand:"LCBO","brand:wikidata":"Q845263","brand:wikipedia":"en:Liquor Control Board of Ontario",name:"LCBO",shop:"alcohol"}},"shop/alcohol|Liquor Depot":{countryCodes:["ca"],tags:{brand:"Liquor Depot",name:"Liquor Depot",shop:"alcohol"}},"shop/alcohol|Liquorland":{countryCodes:["au"],tags:{brand:"Liquorland","brand:wikidata":"Q2283837","brand:wikipedia":"en:Liquorland",name:"Liquorland",operator:"Coles Group","operator:wikidata":"Q1339055","operator:wikipedia":"en:Coles Group",shop:"alcohol"}},"shop/alcohol|Mitra":{countryCodes:["nl"],tags:{brand:"Mitra",name:"Mitra",shop:"alcohol"}},"shop/alcohol|Nicolas":{countryCodes:["be","de","fr","gb","pl"],tags:{brand:"Nicolas","brand:wikidata":"Q3340012","brand:wikipedia":"en:Nicolas (wine retailer)",name:"Nicolas",shop:"alcohol"}},"shop/alcohol|SAQ":{countryCodes:["ca"],tags:{brand:"SAQ","brand:wikidata":"Q3488077","brand:wikipedia":"en:Société des alcools du Québec",name:"SAQ",shop:"alcohol"}},"shop/alcohol|Spec's":{countryCodes:["us"],tags:{brand:"Spec's","brand:wikidata":"Q7574415","brand:wikipedia":"en:Spec's Wine, Spirits & Finer Foods",name:"Spec's",shop:"alcohol"}},"shop/alcohol|Super Liquor":{countryCodes:["nz"],tags:{brand:"Super Liquor",name:"Super Liquor",shop:"alcohol"}},"shop/alcohol|Systembolaget":{countryCodes:["se"],tags:{brand:"Systembolaget","brand:wikidata":"Q1476113","brand:wikipedia":"en:Systembolaget",name:"Systembolaget",shop:"alcohol"}},"shop/alcohol|The Beer Store":{countryCodes:["ca"],tags:{brand:"The Beer Store","brand:wikidata":"Q16243674","brand:wikipedia":"en:The Beer Store",name:"The Beer Store",shop:"alcohol"}},"shop/alcohol|Thirsty Camel":{countryCodes:["au"],tags:{brand:"Thirsty Camel",name:"Thirsty Camel",shop:"alcohol"}},"shop/alcohol|Total Wine":{countryCodes:["us"],tags:{brand:"Total Wine","brand:wikidata":"Q7828084","brand:wikipedia":"en:Total Wine & More",name:"Total Wine",shop:"alcohol"}},"shop/alcohol|Virginia ABC":{countryCodes:["us"],tags:{brand:"Virginia ABC","brand:wikidata":"Q7934236","brand:wikipedia":"en:Virginia Alcoholic Beverage Control Authority",name:"Virginia ABC",shop:"alcohol"}},"shop/alcohol|Алкомаркет":{countryCodes:["kz"],tags:{brand:"Алкомаркет",name:"Алкомаркет",shop:"alcohol"}},"shop/alcohol|Ароматный мир":{countryCodes:["ru"],tags:{brand:"Ароматный мир",name:"Ароматный мир",shop:"alcohol"}},"shop/alcohol|Бристоль":{countryCodes:["ru"],matchTags:["shop/convenience"],tags:{brand:"Бристоль","brand:wikidata":"Q59155583","brand:wikipedia":"ru:Бристоль (сеть магазинов)",name:"Бристоль",shop:"alcohol"}},"shop/alcohol|Винлаб":{countryCodes:["ru"],tags:{brand:"Винлаб",name:"Винлаб",operator:"Белуга Групп","operator:wikidata":"Q4420254","operator:wikipedia":"ru:Белуга Групп",shop:"alcohol"}},"shop/alcohol|Горилка":{countryCodes:["kz","ru"],tags:{brand:"Горилка",name:"Горилка",shop:"alcohol"}},"shop/alcohol|Градус":{countryCodes:["ru","ua"],tags:{brand:"Градус",name:"Градус",shop:"alcohol"}},"shop/alcohol|Градусы":{countryCodes:["ru"],tags:{brand:"Градусы",name:"Градусы",shop:"alcohol"}},"shop/alcohol|Красное & Белое":{countryCodes:["ru"],matchNames:["красное и белое"],tags:{brand:"Красное & Белое","brand:en":"Red&White","brand:wikidata":"Q24933790","brand:wikipedia":"en:Krasnoe & Beloe",name:"Красное & Белое","name:en":"Red&White",shop:"alcohol"}},"shop/alcohol|Кристалл":{countryCodes:["by","ru"],matchTags:["shop/convenience"],tags:{brand:"Кристалл",name:"Кристалл",shop:"alcohol"}},"shop/alcohol|Лион":{countryCodes:["ru"],tags:{brand:"Лион",name:"Лион",shop:"alcohol"}},"shop/alcohol|Норман":{countryCodes:["ru"],tags:{brand:"Норман",name:"Норман",shop:"alcohol"}},"shop/alcohol|Отдохни":{countryCodes:["ru"],tags:{brand:"Отдохни",name:"Отдохни",shop:"alcohol"}},"shop/alcohol|カクヤス":{countryCodes:["jp"],tags:{brand:"カクヤス","brand:ja":"カクヤス",name:"カクヤス","name:ja":"カクヤス",shop:"alcohol"}},"shop/baby_goods|Aubert":{countryCodes:["fr"],tags:{brand:"Aubert","brand:wikidata":"Q62964657",name:"Aubert",shop:"baby_goods"}},"shop/baby_goods|Babies R Us":{tags:{brand:"Babies R Us","brand:wikidata":"Q17232036",name:"Babies R Us",shop:"baby_goods"}},"shop/baby_goods|BabyOne":{countryCodes:["de"],tags:{brand:"BabyOne","brand:wikidata":"Q57540408",name:"BabyOne",shop:"baby_goods"}},"shop/baby_goods|Buy Buy Baby":{tags:{brand:"Buy Buy Baby","brand:wikidata":"Q5003352","brand:wikipedia":"en:Buy Buy Baby",name:"Buy Buy Baby",shop:"baby_goods"}},"shop/baby_goods|Mothercare":{tags:{brand:"Mothercare","brand:wikidata":"Q136738","brand:wikipedia":"en:Mothercare",name:"Mothercare",shop:"baby_goods"}},"shop/baby_goods|西松屋":{countryCodes:["jp"],matchTags:["shop/clothes"],tags:{brand:"西松屋","brand:en":"Nishimatsuya Chain","brand:ja":"西松屋","brand:wikidata":"Q11628761","brand:wikipedia":"ja:西松屋",name:"西松屋","name:en":"Nishimatsuya Chain","name:ja":"西松屋",shop:"baby_goods"}},"shop/bag|Carpisa":{countryCodes:["it"],tags:{brand:"Carpisa","brand:wikidata":"Q28035409","brand:wikipedia":"en:Carpisa",name:"Carpisa",shop:"bag"}},"shop/bag|Coach":{countryCodes:["ca","us"],matchNames:["coach new york","coach ny"],tags:{brand:"Coach","brand:wikidata":"Q727697","brand:wikipedia":"en:Coach New York",name:"Coach",shop:"bag"}},"shop/bag|Kipling":{tags:{brand:"Kipling","brand:wikidata":"Q6414641","brand:wikipedia":"en:Kipling (brand)",name:"Kipling",shop:"bag"}},"shop/bag|Samsonite":{tags:{brand:"Samsonite","brand:wikidata":"Q1203426","brand:wikipedia":"en:Samsonite",name:"Samsonite",shop:"bag"}},"shop/bag|Tumi":{tags:{brand:"Tumi","brand:wikidata":"Q4465402","brand:wikipedia":"en:Tumi Inc.",name:"Tumi",shop:"bag"}},"shop/bag|Vera Bradley":{countryCodes:["us"],tags:{brand:"Vera Bradley","brand:wikidata":"Q7920749","brand:wikipedia":"en:Vera Bradley",name:"Vera Bradley",shop:"bag"}},"shop/bakery|AILI":{countryCodes:["cn"],tags:{brand:"AILI",name:"AILI",shop:"bakery"}},"shop/bakery|Anker":{countryCodes:["at","sk"],tags:{brand:"Anker","brand:wikidata":"Q557116","brand:wikipedia":"de:Ankerbrot",name:"Anker",shop:"bakery"}},"shop/bakery|Awiteks":{countryCodes:["pl"],tags:{brand:"Awiteks","brand:wikidata":"Q62054190",name:"Awiteks",shop:"bakery"}},"shop/bakery|Backwerk":{countryCodes:["at","ch","de","gb","nl"],tags:{brand:"BackWerk","brand:wikidata":"Q798298","brand:wikipedia":"de:BackWerk",name:"Backwerk",shop:"bakery"}},"shop/bakery|Bakers Delight":{countryCodes:["au","ca","nz","us"],tags:{brand:"Bakers Delight","brand:wikidata":"Q4849261","brand:wikipedia":"en:Bakers Delight",name:"Bakers Delight",shop:"bakery"}},"shop/bakery|Bakker Bart":{countryCodes:["be","nl"],tags:{brand:"Bakker Bart","brand:wikidata":"Q2177445","brand:wikipedia":"nl:Bakker Bart",name:"Bakker Bart",shop:"bakery"}},"shop/bakery|Banette":{tags:{brand:"Banette","brand:wikidata":"Q2882405","brand:wikipedia":"fr:Banette (entreprise)",name:"Banette",shop:"bakery"}},"shop/bakery|Birds":{countryCodes:["gb"],tags:{brand:"Birds","brand:wikidata":"Q63001935","brand:wikipedia":"en:Birds Bakery",name:"Birds",official_name:"Birds Bakery",shop:"bakery"}},"shop/bakery|Bäckerei Fuchs":{countryCodes:["de"],tags:{brand:"Bäckerei Fuchs","brand:wikidata":"Q42825993","brand:wikipedia":"de:Harald Fuchs Bäckerei – Konditorei",name:"Bäckerei Fuchs",shop:"bakery"}},"shop/bakery|Bäckerei Schmidt":{countryCodes:["de"],tags:{brand:"Bäckerei Schmidt",name:"Bäckerei Schmidt",shop:"bakery"}},"shop/bakery|Bäckerei Schneider":{countryCodes:["de"],tags:{brand:"Bäckerei Schneider",name:"Bäckerei Schneider",shop:"bakery"}},"shop/bakery|Büsch":{countryCodes:["de"],tags:{brand:"Büsch",name:"Büsch",shop:"bakery"}},"shop/bakery|Cadera":{countryCodes:["de"],tags:{brand:"Cadera","brand:wikidata":"Q62086410",name:"Cadera",shop:"bakery"}},"shop/bakery|Cooplands":{countryCodes:["gb"],tags:{brand:"Cooplands","brand:wikidata":"Q5167971","brand:wikipedia":"en:Cooplands",name:"Cooplands",shop:"bakery"}},"shop/bakery|Dat Backhus":{countryCodes:["de"],tags:{brand:"Dat Backhus","brand:wikidata":"Q62093175",name:"Dat Backhus",shop:"bakery"}},"shop/bakery|Der Beck":{countryCodes:["de"],tags:{brand:"Der Beck","brand:wikidata":"Q1192443","brand:wikipedia":"en:Der Beck",name:"Der Beck",shop:"bakery"}},"shop/bakery|Der Mann":{countryCodes:["at"],tags:{brand:"Der Mann",name:"Der Mann",shop:"bakery"}},"shop/bakery|Ditsch":{countryCodes:["de"],matchTags:["amenity/fast_food"],tags:{brand:"Ditsch","brand:wikidata":"Q911573","brand:wikipedia":"en:Ditsch",name:"Ditsch",shop:"bakery"}},"shop/bakery|Fischer":{countryCodes:["be","fr"],tags:{brand:"Fischer",name:"Fischer",shop:"bakery"}},"shop/bakery|Fornetti":{tags:{brand:"Fornetti","brand:wikidata":"Q1003020","brand:wikipedia":"en:Fornetti",name:"Fornetti",shop:"bakery"}},"shop/bakery|Goeken backen":{countryCodes:["de"],tags:{brand:"Goeken backen",name:"Goeken backen",shop:"bakery"}},"shop/bakery|Goldilocks":{countryCodes:["ca","ph","th","us"],tags:{brand:"Goldilocks","brand:wikidata":"Q5580198","brand:wikipedia":"en:Goldilocks Bakeshop",name:"Goldilocks",shop:"bakery"}},"shop/bakery|Granier":{countryCodes:["es"],tags:{brand:"Granier",name:"Granier",shop:"bakery"}},"shop/bakery|Greggs":{countryCodes:["gb"],matchTags:["amenity/fast_food"],tags:{brand:"Greggs","brand:wikidata":"Q3403981","brand:wikipedia":"en:Greggs",name:"Greggs",shop:"bakery"}},"shop/bakery|Hert":{countryCodes:["pl"],tags:{brand:"Hert",name:"Hert",shop:"bakery"}},"shop/bakery|Hinnerbäcker":{countryCodes:["de"],tags:{brand:"Hinnerbäcker",name:"Hinnerbäcker",shop:"bakery"}},"shop/bakery|Hofpfisterei":{countryCodes:["de"],tags:{brand:"Hofpfisterei","brand:wikidata":"Q1623217","brand:wikipedia":"en:Hofpfisterei",name:"Hofpfisterei",shop:"bakery"}},"shop/bakery|Ihle":{countryCodes:["de"],matchNames:["landbäckerei ihle"],tags:{brand:"Ihle","brand:wikidata":"Q1626371","brand:wikipedia":"de:Landbäckerei Ihle",name:"Ihle",shop:"bakery"}},"shop/bakery|Julie's Bakeshop":{countryCodes:["ph"],tags:{brand:"Julie's Bakeshop",name:"Julie's Bakeshop",shop:"bakery"}},"shop/bakery|K&U Bäckerei":{countryCodes:["de"],matchNames:["k&u"],tags:{brand:"K&U Bäckerei","brand:wikidata":"Q1719433","brand:wikipedia":"de:K & U Bäckerei",name:"K&U Bäckerei",shop:"bakery"}},"shop/bakery|Kamps":{countryCodes:["de"],tags:{brand:"Kamps","brand:wikidata":"Q1723381","brand:wikipedia":"de:Kamps (Unternehmen)",name:"Kamps",shop:"bakery"}},"shop/bakery|La Mie Câline":{countryCodes:["fr"],tags:{brand:"La Mie Câline","brand:wikidata":"Q3210704","brand:wikipedia":"fr:La Mie câline",name:"La Mie Câline",shop:"bakery"}},"shop/bakery|Le Crobag":{countryCodes:["at","de","pl","ru"],tags:{brand:"Le Crobag","brand:wikidata":"Q1558025","brand:wikipedia":"de:Le Crobag",name:"Le Crobag",shop:"bakery"}},"shop/bakery|Le Fournil":{tags:{brand:"Le Fournil",name:"Le Fournil",shop:"bakery"}},"shop/bakery|Lila Bäcker":{countryCodes:["de"],tags:{brand:"Lila Bäcker","brand:wikidata":"Q57516591",name:"Lila Bäcker",shop:"bakery"}},"shop/bakery|Lipóti Pékség":{countryCodes:["hu"],tags:{brand:"Lipóti Pékség",name:"Lipóti Pékség",shop:"bakery"}},"shop/bakery|Löwenbäcker Schaper":{countryCodes:["de"],matchNames:["schaper"],tags:{brand:"Löwenbäcker Schaper","brand:wikidata":"Q62075965",name:"Löwenbäcker Schaper",shop:"bakery"}},"shop/bakery|Marie Blachère":{countryCodes:["fr"],tags:{brand:"Marie Blachère","brand:wikidata":"Q62082410",name:"Marie Blachère",shop:"bakery"}},"shop/bakery|Mlinar":{countryCodes:["ba","hr","sl"],tags:{brand:"Mlinar","brand:wikidata":"Q62082464",name:"Mlinar",shop:"bakery"}},"shop/bakery|Musmanni":{countryCodes:["cr"],tags:{brand:"Musmanni","brand:wikidata":"Q19382082","brand:wikipedia":"no:Musmanni",name:"Musmanni",shop:"bakery"}},"shop/bakery|Nothing Bundt Cakes":{countryCodes:["ca","us"],tags:{brand:"Nothing Bundt Cakes","brand:wikidata":"Q62082526",name:"Nothing Bundt Cakes",shop:"bakery"}},"shop/bakery|Nur Hier":{countryCodes:["de"],tags:{brand:"Nur Hier",name:"Nur Hier",shop:"bakery"}},"shop/bakery|Oebel":{countryCodes:["de"],tags:{brand:"Oebel",name:"Oebel",shop:"bakery"}},"shop/bakery|Pan de Manila":{countryCodes:["ph"],tags:{brand:"Pan de Manila",name:"Pan de Manila",shop:"bakery"}},"shop/bakery|Paul":{tags:{brand:"Paul","brand:wikidata":"Q3370417","brand:wikipedia":"en:Paul (bakery)",name:"Paul",shop:"bakery"}},"shop/bakery|Red Ribbon":{countryCodes:["ph","us"],tags:{brand:"Red Ribbon","brand:wikidata":"Q7304789","brand:wikipedia":"en:Red Ribbon Bakeshop",name:"Red Ribbon",shop:"bakery"}},"shop/bakery|Ronde des Pains":{countryCodes:["be","fr"],tags:{brand:"Ronde des Pains","brand:wikidata":"Q3441707","brand:wikipedia":"fr:Ronde des Pains",name:"Ronde des Pains",shop:"bakery"}},"shop/bakery|Schäfer's":{countryCodes:["de"],matchNames:["schäfer"],tags:{brand:"Schäfer's","brand:wikidata":"Q1464562","brand:wikipedia":"de:Schäfers Brot",name:"Schäfer's",shop:"bakery"}},"shop/bakery|Sehne":{countryCodes:["de"],tags:{brand:"Sehne","brand:wikidata":"Q1314761","brand:wikipedia":"de:Sehne Backwaren",name:"Sehne",shop:"bakery"}},"shop/bakery|Steinecke":{countryCodes:["de"],tags:{brand:"Steinecke","brand:wikidata":"Q57516278","brand:wikipedia":"de:Meisterbäckerei Steinecke",name:"Steinecke",shop:"bakery"}},"shop/bakery|Sternenbäck":{countryCodes:["de"],tags:{brand:"Sternenbäck","brand:wikidata":"Q62595021",name:"Sternenbäck",shop:"bakery"}},"shop/bakery|Ströck":{countryCodes:["at"],tags:{brand:"Ströck","brand:wikidata":"Q2357607","brand:wikipedia":"de:Ströck-Brot",name:"Ströck",shop:"bakery"}},"shop/bakery|Wiener Feinbäcker":{countryCodes:["de"],tags:{brand:"Wiener Feinbäcker","brand:wikidata":"Q15854357","brand:wikipedia":"de:Wiener Feinbäckerei Heberer",name:"Wiener Feinbäcker",shop:"bakery"}},"shop/bakery|von Allwörden":{countryCodes:["de"],tags:{brand:"von Allwörden","brand:wikidata":"Q60411349","brand:wikipedia":"nds:Heinrich von Allwörden GmbH",name:"von Allwörden",shop:"bakery"}},"shop/bakery|Булочная Ф. Вольчека":{countryCodes:["ru"],tags:{brand:"Булочная Ф. Вольчека",name:"Булочная Ф. Вольчека",shop:"bakery"}},"shop/bakery|Кулиничи":{countryCodes:["ua"],tags:{brand:"Кулиничи",name:"Кулиничи",shop:"bakery"}},"shop/bakery|Кулиничі":{countryCodes:["ua"],tags:{brand:"Кулиничі",name:"Кулиничі",shop:"bakery"}},"shop/bakery|뚜레쥬르":{countryCodes:["kr"],matchNames:["뚜레주르"],tags:{brand:"뚜레쥬르","brand:en":"Tous Les Jours","brand:ko":"뚜레쥬르","brand:wikidata":"Q3535609","brand:wikipedia":"ko:뚜레쥬르",name:"뚜레쥬르","name:en":"Tous Les Jours","name:ko":"뚜레쥬르",shop:"bakery"}},"shop/bakery|파리바게뜨":{countryCodes:["kr"],tags:{brand:"파리바게뜨","brand:ko":"파리바게뜨",name:"파리바게뜨","name:ko":"파리바게뜨",shop:"bakery"}},"shop/bakery|파리바게트":{countryCodes:["kr"],tags:{brand:"파리바게트","brand:ko":"파리바게트",name:"파리바게트","name:ko":"파리바게트",shop:"bakery"}},"shop/beauty|Bath & Body Works":{tags:{brand:"Bath & Body Works","brand:wikidata":"Q810773","brand:wikipedia":"en:Bath & Body Works",name:"Bath & Body Works",shop:"beauty"}},"shop/beauty|Coiffure Dame":{tags:{brand:"Coiffure Dame",name:"Coiffure Dame",shop:"beauty"}},"shop/beauty|European Wax Center":{countryCodes:["us"],tags:{beauty:"waxing",brand:"European Wax Center","brand:wikidata":"Q5413426","brand:wikipedia":"en:European Wax Center",name:"European Wax Center",shop:"beauty"}},"shop/beauty|Hollywood Nails":{tags:{beauty:"nails",brand:"Hollywood Nails",name:"Hollywood Nails",shop:"beauty"}},"shop/beauty|Indigo Sun":{countryCodes:["gb"],tags:{beauty:"tanning",brand:"Indigo Sun","brand:wikidata":"Q63436906",name:"Indigo Sun",shop:"beauty"}},"shop/beauty|Ulta Beauty":{countryCodes:["us"],matchNames:["ulta"],tags:{brand:"Ulta Beauty","brand:wikidata":"Q7880076","brand:wikipedia":"en:Ulta Beauty",name:"Ulta Beauty",shop:"beauty"}},"shop/beauty|Yves Rocher":{matchTags:["shop/chemist","shop/cosmetics"],tags:{brand:"Yves Rocher","brand:wikidata":"Q28496595","brand:wikipedia":"en:Yves Rocher (company)",name:"Yves Rocher",shop:"beauty"}},"shop/bed|Dreams":{countryCodes:["gb"],tags:{brand:"Dreams","brand:wikidata":"Q5306688","brand:wikipedia":"en:Dreams (bed retailer)",name:"Dreams",shop:"bed"}},"shop/bed|Matratzen Concord":{countryCodes:["at","ch","de"],tags:{brand:"Matratzen Concord","brand:wikidata":"Q18629057","brand:wikipedia":"de:Matratzen Concord",name:"Matratzen Concord",shop:"bed"}},"shop/bed|Mattress Firm":{countryCodes:["us"],matchNames:["sleepys"],tags:{brand:"Mattress Firm","brand:wikidata":"Q6791878","brand:wikipedia":"en:Mattress Firm",name:"Mattress Firm",shop:"bed"}},"shop/bed|Mattress Warehouse":{countryCodes:["us"],tags:{brand:"Mattress Warehouse","brand:wikidata":"Q61995079",name:"Mattress Warehouse",shop:"bed"}},"shop/bed|Sleep Country":{countryCodes:["ca"],tags:{brand:"Sleep Country","brand:wikidata":"Q7539684","brand:wikipedia":"en:Sleep Country Canada",name:"Sleep Country",shop:"bed"}},"shop/bed|Sleep Number":{countryCodes:["us"],tags:{brand:"Sleep Number","brand:wikidata":"Q7447640","brand:wikipedia":"en:Sleep Number",name:"Sleep Number",shop:"bed"}},"shop/beverages|50嵐":{countryCodes:["cn","tw"],tags:{brand:"50嵐",name:"50嵐",shop:"beverages"}},"shop/beverages|Dursty":{countryCodes:["de"],tags:{brand:"Dursty","brand:wikidata":"Q1267518","brand:wikipedia":"de:Dursty Getränkemärkte",name:"Dursty",shop:"beverages"}},"shop/beverages|Edeka Getränkemarkt":{countryCodes:["de"],tags:{brand:"Edeka Getränkemarkt","brand:wikidata":"Q57450576",name:"Edeka Getränkemarkt",shop:"beverages"}},"shop/beverages|Fristo":{countryCodes:["at","de"],matchNames:["fristo getränkemarkt"],tags:{brand:"Fristo","brand:wikidata":"Q1465151","brand:wikipedia":"de:Fristo",name:"Fristo",shop:"beverages"}},"shop/beverages|Getränke Hoffmann":{countryCodes:["de"],tags:{brand:"Getränke Hoffmann","brand:wikidata":"Q19284021","brand:wikipedia":"de:Getränke Hoffmann",name:"Getränke Hoffmann",shop:"beverages"}},"shop/beverages|Getränkeland":{countryCodes:["de"],tags:{brand:"Getränkeland","brand:wikidata":"Q62594849",name:"Getränkeland",shop:"beverages"}},"shop/beverages|Hol'ab":{countryCodes:["de"],tags:{brand:"Hol'ab","brand:wikidata":"Q57557270",name:"Hol'ab",shop:"beverages"}},"shop/beverages|Orterer Getränkemarkt":{countryCodes:["de"],tags:{brand:"Orterer Getränkemarkt","brand:wikidata":"Q23787118","brand:wikipedia":"de:Orterer Gruppe",name:"Orterer Getränkemarkt",shop:"beverages"}},"shop/beverages|Rewe Getränkemarkt":{countryCodes:["de"],tags:{brand:"Rewe Getränkemarkt","brand:wikidata":"Q57519344",name:"Rewe Getränkemarkt",shop:"beverages"}},"shop/beverages|Trinkgut":{countryCodes:["de"],tags:{brand:"Trinkgut","brand:wikidata":"Q2453627","brand:wikipedia":"de:Trinkgut",name:"Trinkgut",shop:"beverages"}},"shop/beverages|清心福全":{countryCodes:["tw"],tags:{brand:"清心福全","brand:wikidata":"Q10391229","brand:wikipedia":"zh:清心福全冷飲站",name:"清心福全",shop:"beverages"}},"shop/beverages|茶湯會":{countryCodes:["tw"],tags:{brand:"茶湯會",name:"茶湯會",shop:"beverages"}},"shop/bicycle|Evans Cycles":{countryCodes:["gb"],tags:{brand:"Evans Cycles","brand:wikidata":"Q5415901","brand:wikipedia":"en:Evans Cycles",name:"Evans Cycles",shop:"bicycle"}},"shop/bicycle|Fri BikeShop":{countryCodes:["dk"],tags:{brand:"Fri BikeShop","brand:wikidata":"Q26721030",name:"Fri BikeShop",shop:"bicycle"}},"shop/bicycle|Giant":{nomatch:["amenity/fuel|Giant","shop/supermarket|Giant"],tags:{brand:"Giant","brand:wikidata":"Q703557","brand:wikipedia":"en:Giant Bicycles",name:"Giant",shop:"bicycle"}},"shop/bicycle|サイクルベースあさひ":{countryCodes:["jp"],tags:{brand:"サイクルベースあさひ","brand:en":"Cycle Base Asahi","brand:ja":"サイクルベースあさひ","brand:wikidata":"Q11257202","brand:wikipedia":"ja:あさひ (企業)",name:"サイクルベースあさひ","name:en":"Cycle Base Asahi","name:ja":"サイクルベースあさひ",shop:"bicycle"}},"shop/bookmaker|Betfred":{countryCodes:["gb"],tags:{brand:"Betfred","brand:wikidata":"Q4897425","brand:wikipedia":"en:Betfred",name:"Betfred",shop:"bookmaker"}},"shop/bookmaker|Coral":{countryCodes:["gb"],tags:{brand:"Coral","brand:wikidata":"Q54621344","brand:wikipedia":"en:Coral (bookmaker)",name:"Coral",shop:"bookmaker"}},"shop/bookmaker|Fortuna":{countryCodes:["cz","hr","pl","ro","sk"],tags:{brand:"Fortuna","brand:wikidata":"Q25857973","brand:wikipedia":"en:Fortuna Entertainment Group",name:"Fortuna",shop:"bookmaker"}},"shop/bookmaker|Ladbrokes":{countryCodes:["gb"],tags:{brand:"Ladbrokes","brand:wikidata":"Q1799875","brand:wikipedia":"en:Ladbrokes Coral",name:"Ladbrokes",shop:"bookmaker"}},"shop/bookmaker|Paddy Power":{countryCodes:["gb","ie"],tags:{brand:"Paddy Power","brand:wikidata":"Q3888718","brand:wikipedia":"en:Paddy Power",name:"Paddy Power",shop:"bookmaker"}},"shop/bookmaker|Tipico":{countryCodes:["at","co","de","gi","hr","mt"],tags:{brand:"Tipico","brand:wikidata":"Q15851003","brand:wikipedia":"en:Tipico",name:"Tipico",shop:"bookmaker"}},"shop/bookmaker|William Hill":{countryCodes:["gb"],tags:{brand:"William Hill","brand:wikidata":"Q4053147","brand:wikipedia":"en:William Hill (bookmaker)",name:"William Hill",shop:"bookmaker"}},"shop/bookmaker|ΟΠΑΠ":{countryCodes:["gr"],tags:{brand:"ΟΠΑΠ","brand:el":"ΟΠΑΠ","brand:en":"OPAP","brand:wikidata":"Q2007823","brand:wikipedia":"en:OPAP",name:"ΟΠΑΠ","name:el":"ΟΠΑΠ","name:en":"OPAP",shop:"bookmaker"}},"shop/bookmaker|Лига ставок":{countryCodes:["ru"],tags:{brand:"Лига ставок","brand:en":"Liga Stavok","brand:ru":"Лига ставок","brand:wikidata":"Q6545804","brand:wikipedia":"ru:Лига Ставок",name:"Лига ставок","name:en":"Liga Stavok","name:ru":"Лига ставок",shop:"bookmaker"}},"shop/bookmaker|Фонбет":{countryCodes:["ru"],tags:{brand:"Фонбет","brand:en":"Fonbet","brand:ru":"Фонбет","brand:wikidata":"Q49137910","brand:wikipedia":"ru:Фонбет",name:"Фонбет","name:en":"Fonbet","name:ru":"Фонбет",shop:"bookmaker"}},"shop/books|Akademibokhandeln":{countryCodes:["se"],tags:{brand:"Akademibokhandeln","brand:wikidata":"Q10403918","brand:wikipedia":"sv:Akademibokhandeln",name:"Akademibokhandeln",shop:"books"}},"shop/books|Barnes & Noble":{countryCodes:["us"],tags:{brand:"Barnes & Noble","brand:wikidata":"Q795454","brand:wikipedia":"en:Barnes & Noble",name:"Barnes & Noble",shop:"books"}},"shop/books|Bruna":{countryCodes:["nl"],tags:{brand:"Bruna","brand:wikidata":"Q3317555","brand:wikipedia":"en:Bruna (company)",name:"Bruna",shop:"books"}},"shop/books|Chapters":{countryCodes:["ca","us"],tags:{brand:"Chapters","brand:wikidata":"Q5073540","brand:wikipedia":"en:Chapters (bookstore)",name:"Chapters",shop:"books"}},"shop/books|Cultura":{countryCodes:["fr"],tags:{brand:"Cultura","brand:wikidata":"Q3007154","brand:wikipedia":"fr:Cultura",name:"Cultura",shop:"books"}},"shop/books|Empik":{countryCodes:["pl"],tags:{brand:"Empik","brand:wikidata":"Q3045978","brand:wikipedia":"pl:Empik",name:"Empik",shop:"books"}},"shop/books|Fnac":{countryCodes:["be","ch","es","fr","nl","pt"],tags:{brand:"Fnac","brand:wikidata":"Q676585","brand:wikipedia":"en:Fnac",name:"Fnac",shop:"books"}},"shop/books|Half Price Books":{countryCodes:["us"],tags:{brand:"Half Price Books","brand:wikidata":"Q5641744","brand:wikipedia":"en:Half Price Books",name:"Half Price Books",shop:"books"}},"shop/books|Hugendubel":{countryCodes:["de"],tags:{brand:"Hugendubel","brand:wikidata":"Q1634142","brand:wikipedia":"en:Hugendubel",name:"Hugendubel",shop:"books"}},"shop/books|Mondadori":{countryCodes:["it"],tags:{brand:"Mondadori","brand:wikidata":"Q85355","brand:wikipedia":"en:Arnoldo Mondadori Editore",name:"Mondadori",shop:"books"}},"shop/books|National Book Store":{countryCodes:["ph"],tags:{brand:"National Book Store","brand:wikidata":"Q6971094","brand:wikipedia":"en:National Book Store",name:"National Book Store",shop:"books"}},"shop/books|Standaard Boekhandel":{countryCodes:["be"],tags:{brand:"Standaard Boekhandel","brand:wikidata":"Q3496554","brand:wikipedia":"nl:Standaard Boekhandel",name:"Standaard Boekhandel",shop:"books"}},"shop/books|TSUTAYA":{countryCodes:["jp"],nomatch:["shop/music|TSUTAYA","shop/video|TSUTAYA"],tags:{brand:"TSUTAYA","brand:wikidata":"Q5193457","brand:wikipedia":"ja:カルチュア・コンビニエンス・クラブ",name:"TSUTAYA",shop:"books"}},"shop/books|Thalia":{countryCodes:["at","ch","de"],tags:{brand:"Thalia","brand:wikidata":"Q2408854","brand:wikipedia":"de:Thalia Bücher",name:"Thalia",shop:"books"}},"shop/books|The Works":{countryCodes:["gb","ie"],tags:{brand:"The Works","brand:wikidata":"Q7775853","brand:wikipedia":"en:The Works (retailer)",name:"The Works",shop:"books"}},"shop/books|Waterstones":{countryCodes:["be","gb","ie","je","nl"],tags:{brand:"Waterstones","brand:wikidata":"Q151779","brand:wikipedia":"en:Waterstones",name:"Waterstones",shop:"books"}},"shop/books|Weltbild":{countryCodes:["de"],tags:{brand:"Weltbild","brand:wikidata":"Q883522","brand:wikipedia":"en:Weltbild Publishing Group",name:"Weltbild",shop:"books"}},"shop/books|Буквоед":{countryCodes:["ru"],tags:{brand:"Буквоед","brand:wikidata":"Q4098549","brand:wikipedia":"ru:Буквоед",name:"Буквоед",shop:"books"}},"shop/books|Дом книги":{countryCodes:["ru"],tags:{brand:"Дом книги","brand:wikidata":"Q48950742","brand:wikipedia":"ru:Московский дом книги",name:"Дом книги",shop:"books"}},"shop/books|Читай-город":{countryCodes:["ru"],tags:{brand:"Читай-город","brand:wikidata":"Q4516645","brand:wikipedia":"ru:Читай-город",name:"Читай-город",shop:"books"}},"shop/books|あおい書店":{countryCodes:["jp"],tags:{brand:"あおい書店","brand:en":"AOI","brand:ja":"あおい書店","brand:wikidata":"Q11256783","brand:wikipedia":"ja:あおい書店",name:"あおい書店","name:en":"AOI","name:ja":"あおい書店",shop:"books"}},"shop/books|ブックオフ":{countryCodes:["jp"],tags:{brand:"ブックオフ","brand:en":"Book Off","brand:ja":"ブックオフ","brand:wikidata":"Q893011","brand:wikipedia":"en:Book Off",name:"ブックオフ","name:en":"Book Off","name:ja":"ブックオフ",shop:"books"}},"shop/books|メロンブックス":{countryCodes:["jp"],tags:{brand:"メロンブックス","brand:en":"Melonbooks","brand:ja":"メロンブックス","brand:wikidata":"Q10851653","brand:wikipedia":"ja:メロンブックス",name:"メロンブックス","name:en":"Melonbooks","name:ja":"メロンブックス",shop:"books"}},"shop/books|リブロ":{countryCodes:["jp"],tags:{brand:"リブロ","brand:en":"LIBRO","brand:ja":"リブロ","brand:wikidata":"Q6542768","brand:wikipedia":"ja:リブロ",name:"リブロ","name:en":"Libro","name:ja":"リブロ",shop:"books"}},"shop/books|三省堂書店":{countryCodes:["jp"],tags:{brand:"三省堂書店","brand:en":"Books Sanseido","brand:ja":"三省堂書店","brand:wikidata":"Q10866539","brand:wikipedia":"ja:三省堂書店",name:"三省堂書店","name:en":"Books Sanseido","name:ja":"三省堂書店",shop:"books"}},"shop/books|文教堂":{countryCodes:["jp"],tags:{brand:"文教堂","brand:en":"Bunkyodo","brand:ja":"文教堂","brand:wikidata":"Q11499974","brand:wikipedia":"ja:文教堂",name:"文教堂","name:en":"Bunkyodo","name:ja":"文教堂",shop:"books"}},"shop/books|新华书店":{countryCodes:["cn"],tags:{brand:"新华书店","brand:en":"Xinhua Bookstore","brand:wikidata":"Q6124193","brand:wikipedia":"en:Xinhua Bookstore","brand:zh":"新华书店",name:"新华书店","name:en":"Xinhua Bookstore","name:zh":"新华书店",shop:"books"}},"shop/books|未来屋書店":{countryCodes:["jp"],tags:{brand:"未来屋書店","brand:en":"Miraiya Shoten","brand:ja":"未来屋書店","brand:wikidata":"Q11519563","brand:wikipedia":"ja:未来屋書店",name:"未来屋書店","name:en":"Miraiya Shoten","name:ja":"未来屋書店",shop:"books"}},"shop/butcher|Coqivoire":{countryCodes:["ci"],tags:{brand:"Coqivoire","brand:wikidata":"Q60183284",butcher:"poultry",name:"Coqivoire",shop:"butcher"}},"shop/butcher|Fleischerei Richter":{countryCodes:["de"],tags:{brand:"Fleischerei Richter",name:"Fleischerei Richter",shop:"butcher"}},"shop/butcher|Foani":{countryCodes:["ci"],tags:{brand:"Foani","brand:wikidata":"Q60183335",butcher:"poultry",name:"Foani",shop:"butcher"}},"shop/butcher|Gzella":{countryCodes:["pl"],tags:{brand:"Gzella",name:"Gzella",shop:"butcher"}},"shop/butcher|Vinzenzmurr":{countryCodes:["de"],tags:{brand:"Vinzenzmurr","brand:wikidata":"Q2527361","brand:wikipedia":"de:Vinzenzmurr",name:"Vinzenzmurr",shop:"butcher"}},"shop/butcher|Ариант":{countryCodes:["ru"],tags:{brand:"Ариант",name:"Ариант",shop:"butcher"}},"shop/butcher|Великолукский мясокомбинат":{countryCodes:["ru"],tags:{brand:"Великолукский мясокомбинат","brand:wikidata":"Q18401767","brand:wikipedia":"ru:Великолукский мясокомбинат",name:"Великолукский мясокомбинат",shop:"butcher"}},"shop/butcher|Мясницкий ряд":{countryCodes:["ru"],tags:{brand:"Мясницкий ряд",name:"Мясницкий ряд",shop:"butcher"}},"shop/butcher|Наша Ряба":{countryCodes:["ua"],tags:{brand:"Наша Ряба",name:"Наша Ряба",shop:"butcher"}},"shop/butcher|Родинна ковбаска":{countryCodes:["ua"],tags:{brand:"Родинна ковбаска","brand:en":"Rodynna-kovbaska","brand:wikidata":"Q30969660","brand:wikipedia":"uk:ТзОВ «Барком»",name:"Родинна ковбаска","name:en":"Rodynna-kovbaska",shop:"butcher"}},"shop/butcher|肉のハナマサ":{countryCodes:["jp"],matchNames:["ハナマサ"],tags:{brand:"ハナマサ","brand:en":"Hanamasa","brand:ja":"ハナマサ","brand:wikidata":"Q11326564","brand:wikipedia":"ja:ハナマサ",butcher:"beef",name:"肉のハナマサ","name:en":"Hanamasa Meat","name:ja":"肉のハナマサ",shop:"butcher"}},"shop/candles|Yankee Candle":{tags:{brand:"Yankee Candle","brand:wikidata":"Q8048733","brand:wikipedia":"en:Yankee Candle",name:"Yankee Candle",shop:"candles"}},"shop/car_parts|Advance Auto Parts":{countryCodes:["ca","pr","us","vi"],tags:{brand:"Advance Auto Parts","brand:wikidata":"Q4686051","brand:wikipedia":"en:Advance Auto Parts",name:"Advance Auto Parts",shop:"car_parts"}},"shop/car_parts|AutoZone":{countryCodes:["br","mx","us"],tags:{brand:"AutoZone","brand:wikidata":"Q4826087","brand:wikipedia":"en:AutoZone",name:"AutoZone",shop:"car_parts"}},"shop/car_parts|Brezan":{countryCodes:["be","nl"],tags:{brand:"Brezan",name:"Brezan",shop:"car_parts"}},"shop/car_parts|Halfords":{countryCodes:["gb","ie"],matchTags:["shop/bicycle"],nomatch:["shop/car_repair|Halfords Autocentre"],tags:{brand:"Halfords","brand:wikidata":"Q3398786","brand:wikipedia":"en:Halfords",name:"Halfords","service:bicycle:retail":"yes",shop:"car_parts"}},"shop/car_parts|Lubrificantes":{tags:{brand:"Lubrificantes",name:"Lubrificantes",shop:"car_parts"}},"shop/car_parts|NAPA Auto Parts":{countryCodes:["ca","mx","us"],matchNames:["napa"],tags:{brand:"NAPA Auto Parts","brand:wikidata":"Q6970842","brand:wikipedia":"en:National Automotive Parts Association",name:"NAPA Auto Parts",operator:"Genuine Parts Company","operator:wikidata":"Q5533818","operator:wikipedia":"en:Genuine Parts Company",shop:"car_parts"}},"shop/car_parts|Norauto":{tags:{brand:"Norauto",name:"Norauto",shop:"car_parts"}},"shop/car_parts|O'Reilly Auto Parts":{countryCodes:["us"],tags:{brand:"O'Reilly Auto Parts","brand:wikidata":"Q7071951","brand:wikipedia":"en:O'Reilly Auto Parts",name:"O'Reilly Auto Parts",shop:"car_parts"}},"shop/car_parts|Repco":{countryCodes:["au","nz"],tags:{brand:"Repco","brand:wikidata":"Q173425","brand:wikipedia":"en:Repco",name:"Repco",shop:"car_parts"}},"shop/car_parts|Supercheap Auto":{countryCodes:["au","nz"],tags:{brand:"Supercheap Auto","brand:wikidata":"Q7643119","brand:wikipedia":"en:Supercheap Auto",name:"Supercheap Auto",shop:"car_parts"}},"shop/car_parts|Tokić":{countryCodes:["ba","hr"],tags:{brand:"Tokić",name:"Tokić",shop:"car_parts"}},"shop/car_parts|Автомир":{countryCodes:["ru"],tags:{brand:"Автомир","brand:wikidata":"Q4056321","brand:wikipedia":"ru:Автомир (автодилер)",name:"Автомир",shop:"car_parts"}},"shop/car_parts|Армтек":{countryCodes:["ru"],tags:{brand:"Армтек",name:"Армтек",shop:"car_parts"}},"shop/car_parts|イエローハット":{countryCodes:["jp"],tags:{brand:"イエローハット","brand:en":"Yellow Hat","brand:ja":"イエローハット","brand:wikidata":"Q11285915","brand:wikipedia":"ja:イエローハット",name:"イエローハット","name:en":"Yellow Hat","name:ja":"イエローハット",shop:"car_parts"}},"shop/car_parts|オートバックス":{countryCodes:["jp"],tags:{brand:"オートバックス","brand:en":"Autobacs","brand:ja":"オートバックス","brand:wikidata":"Q7886426","brand:wikipedia":"ja:オートバックスセブン",name:"オートバックス","name:en":"Autobacs","name:ja":"オートバックス",shop:"car_parts"}},"shop/car_parts|タイヤ館":{countryCodes:["jp"],tags:{brand:"タイヤ館","brand:en":"Taiyakan","brand:ja":"タイヤ館","brand:wikidata":"Q11315808","brand:wikipedia":"ja:タイヤ館",name:"タイヤ館","name:en":"Taiyakan","name:ja":"タイヤ館",shop:"car_parts"}},"shop/car_repair|A.T.U":{countryCodes:["at","de"],matchNames:["auto-teile-unger"],tags:{brand:"A.T.U","brand:wikidata":"Q784721","brand:wikipedia":"de:Auto-Teile-Unger",name:"A.T.U",shop:"car_repair"}},"shop/car_repair|ATS Euromaster":{countryCodes:["gb"],tags:{brand:"ATS Euromaster","brand:wikidata":"Q4654920","brand:wikipedia":"en:ATS Euromaster",name:"ATS Euromaster",shop:"car_repair"}},"shop/car_repair|BestDrive":{countryCodes:["cz","fr","sk"],tags:{brand:"BestDrive","brand:wikidata":"Q63057183",name:"BestDrive",shop:"car_repair"}},"shop/car_repair|Bosch Car Service":{matchNames:["bosch service"],tags:{brand:"Bosch Car Service","brand:wikidata":"Q234021","brand:wikipedia":"en:Robert Bosch GmbH",name:"Bosch Car Service",shop:"car_repair"}},"shop/car_repair|Brakes Plus":{countryCodes:["us"],tags:{brand:"Brakes Plus","brand:wikidata":"Q62075246",name:"Brakes Plus",shop:"car_repair"}},"shop/car_repair|Car-X":{countryCodes:["us"],tags:{brand:"Car-X","brand:wikidata":"Q63859189",name:"Car-X",shop:"car_repair"}},"shop/car_repair|Carglass":{tags:{brand:"Carglass","brand:wikidata":"Q1035997","brand:wikipedia":"de:Carglass",name:"Carglass",shop:"car_repair"}},"shop/car_repair|Citroën":{nomatch:["shop/car|Citroën"],tags:{brand:"Citroën","brand:wikidata":"Q6746","brand:wikipedia":"fr:Citroën",name:"Citroën",shop:"car_repair"}},"shop/car_repair|Dekra":{countryCodes:["de","fr"],tags:{brand:"Dekra","brand:wikidata":"Q383711","brand:wikipedia":"en:Dekra",name:"Dekra",shop:"car_repair"}},"shop/car_repair|Euromaster":{tags:{brand:"Euromaster","brand:wikidata":"Q3060668","brand:wikipedia":"de:Euromaster",name:"Euromaster",shop:"car_repair"}},"shop/car_repair|Feu Vert":{countryCodes:["fr"],tags:{brand:"Feu Vert","brand:wikidata":"Q3070922","brand:wikipedia":"fr:Feu vert (entreprise)",name:"Feu Vert",shop:"car_repair"}},"shop/car_repair|Firestone":{matchNames:["firestone complete auto care"],tags:{brand:"Firestone","brand:wikidata":"Q420837","brand:wikipedia":"en:Firestone Tire and Rubber Company",name:"Firestone",official_name:"Firestone Complete Auto Care",shop:"car_repair"}},"shop/car_repair|Ford":{nomatch:["shop/car|Ford"],tags:{brand:"Ford","brand:wikidata":"Q44294","brand:wikipedia":"en:Ford Motor Company",name:"Ford",shop:"car_repair"}},"shop/car_repair|Goodyear":{tags:{brand:"Goodyear","brand:wikidata":"Q620875","brand:wikipedia":"en:Goodyear Tire and Rubber Company",name:"Goodyear",shop:"car_repair"}},"shop/car_repair|Grease Monkey":{countryCodes:["cn","us"],tags:{brand:"Grease Monkey","brand:wikidata":"Q5598563","brand:wikipedia":"en:Grease Monkey (business)",name:"Grease Monkey",shop:"car_repair"}},"shop/car_repair|Halfords Autocentre":{countryCodes:["gb"],matchNames:["halfords"],nomatch:["shop/car_parts|Halfords"],tags:{brand:"Halfords Auocentre","brand:wikidata":"Q5641894","brand:wikipedia":"en:Halfords Autocentre",name:"Halfords Autocentre",shop:"car_repair"}},"shop/car_repair|Jiffy Lube":{countryCodes:["ca","us"],tags:{brand:"Jiffy Lube","brand:wikidata":"Q6192247","brand:wikipedia":"en:Jiffy Lube",name:"Jiffy Lube",shop:"car_repair"}},"shop/car_repair|Kwik Fit":{countryCodes:["gb","ie"],tags:{brand:"Kwik Fit","brand:wikidata":"Q958053","brand:wikipedia":"en:Kwik Fit",name:"Kwik Fit",shop:"car_repair"}},"shop/car_repair|Meineke":{countryCodes:["us"],tags:{brand:"Meineke","brand:wikidata":"Q6810159","brand:wikipedia":"en:Meineke Car Care Centers",name:"Meineke",shop:"car_repair"}},"shop/car_repair|Mekonomen":{countryCodes:["dk","no","se"],tags:{brand:"Mekonomen","brand:wikidata":"Q10580079","brand:wikipedia":"sv:Mekonomen",name:"Mekonomen",shop:"car_repair"}},"shop/car_repair|Midas":{tags:{brand:"Midas","brand:wikidata":"Q3312613","brand:wikipedia":"en:Midas (automotive service)",name:"Midas",shop:"car_repair"}},"shop/car_repair|Monro Muffler Brake":{countryCodes:["us"],matchNames:["monro"],tags:{brand:"Monro Muffler Brake","brand:wikidata":"Q6902090","brand:wikipedia":"en:Monro Muffler Brake",name:"Monro Muffler Brake",shop:"car_repair"}},"shop/car_repair|Mr. Lube":{countryCodes:["ca"],tags:{brand:"Mr. Lube","brand:wikidata":"Q17104067","brand:wikipedia":"en:Mr. Lube",name:"Mr. Lube",shop:"car_repair"}},"shop/car_repair|Norauto":{countryCodes:["ar","es","fr","hu","it","pl","pt","ro"],tags:{brand:"Norauto","brand:wikidata":"Q3317698","brand:wikipedia":"en:Mobivia Groupe",name:"Norauto",shop:"car_repair"}},"shop/car_repair|Pep Boys":{countryCodes:["pr","us"],tags:{brand:"Pep Boys","brand:wikidata":"Q3375007","brand:wikipedia":"en:Pep Boys",name:"Pep Boys",shop:"car_repair"}},"shop/car_repair|Peugeot":{nomatch:["shop/car|Peugeot"],tags:{brand:"Peugeot","brand:wikidata":"Q6742","brand:wikipedia":"en:Peugeot",name:"Peugeot",shop:"car_repair"}},"shop/car_repair|Pit Stop":{tags:{brand:"Pit Stop",name:"Pit Stop",shop:"car_repair"}},"shop/car_repair|Point S":{tags:{brand:"Point S","brand:wikidata":"Q3393358","brand:wikipedia":"fr:Point S",name:"Point S",shop:"car_repair"}},"shop/car_repair|Renault":{matchNames:["garage renault"],nomatch:["shop/car|Renault"],tags:{brand:"Renault","brand:wikidata":"Q6686","brand:wikipedia":"en:Renault",name:"Renault",shop:"car_repair"}},"shop/car_repair|Roady":{countryCodes:["fr"],tags:{brand:"Roady","brand:wikidata":"Q3434112","brand:wikipedia":"en:Roady (Mousquetaires)",name:"Roady",shop:"car_repair"}},"shop/car_repair|Safelite AutoGlass":{countryCodes:["us"],tags:{brand:"Safelite AutoGlass","brand:wikidata":"Q28797369","brand:wikipedia":"en:Safelite",name:"Safelite AutoGlass",operator:"Belron","operator:wikidata":"Q785614","operator:wikipedia":"en:Belron",shop:"car_repair"}},"shop/car_repair|Sears Auto Center":{countryCodes:["mx","us"],tags:{brand:"Sears Auto Center",name:"Sears Auto Center",shop:"car_repair"}},"shop/car_repair|Speedy":{countryCodes:["fr"],nomatch:["shop/car_repair|Speedy Auto Service"],tags:{brand:"Speedy","brand:wikidata":"Q3492969","brand:wikipedia":"fr:Speedy (entreprise)",name:"Speedy",shop:"car_repair"}},"shop/car_repair|Speedy Auto Service":{countryCodes:["ca"],nomatch:["shop/car_repair|Speedy"],tags:{brand:"Speedy Auto Service","brand:wikidata":"Q22318193",name:"Speedy Auto Service",shop:"car_repair"}},"shop/car_repair|Taller Mecanico":{tags:{brand:"Taller Mecanico",name:"Taller Mecanico",shop:"car_repair"}},"shop/car_repair|Toyota":{nomatch:["shop/car|Toyota"],tags:{brand:"Toyota","brand:wikidata":"Q53268","brand:wikipedia":"en:Toyota",name:"Toyota",shop:"car_repair"}},"shop/car_repair|Tuffy Tire & Auto Service":{countryCodes:["us"],matchNames:["tuffy tire and auto service"],tags:{brand:"Tuffy Tire & Auto Service","brand:wikidata":"Q17125314","brand:wikipedia":"en:Tuffy Auto Service Centers",name:"Tuffy Tire & Auto Service",shop:"car_repair"}},"shop/car_repair|Valvoline":{countryCodes:["us"],matchNames:["valvoline instant oil change"],tags:{brand:"Valvoline","brand:wikidata":"Q7912852","brand:wikipedia":"en:Valvoline Instant Oil Change",name:"Valvoline",shop:"car_repair"}},"shop/car_repair|ÖAMTC":{countryCodes:["at"],tags:{brand:"ÖAMTC","brand:wikidata":"Q306057","brand:wikipedia":"de:Österreichischer Automobil-, Motorrad- und Touring Club",name:"ÖAMTC",shop:"car_repair"}},"shop/car_repair|СТО":{tags:{brand:"СТО",name:"СТО",shop:"car_repair"}},"shop/car|Audi":{tags:{brand:"Audi","brand:wikidata":"Q23317","brand:wikipedia":"en:Audi",name:"Audi",shop:"car"}},"shop/car|BMW":{tags:{brand:"BMW","brand:wikidata":"Q26678","brand:wikipedia":"en:BMW",name:"BMW",shop:"car"}},"shop/car|Chevrolet":{tags:{brand:"Chevrolet","brand:wikidata":"Q29570","brand:wikipedia":"en:Chevrolet",name:"Chevrolet",shop:"car"}},"shop/car|Citroën":{nomatch:["shop/car_repair|Citroën"],tags:{brand:"Citroën","brand:wikidata":"Q6746","brand:wikipedia":"fr:Citroën",name:"Citroën",shop:"car"}},"shop/car|Dacia":{tags:{brand:"Dacia","brand:wikidata":"Q27460","brand:wikipedia":"en:Automobile Dacia",name:"Dacia",shop:"car"}},"shop/car|Fiat":{tags:{brand:"Fiat","brand:wikidata":"Q27597","brand:wikipedia":"en:Fiat Automobiles",name:"Fiat",shop:"car"}},"shop/car|Ford":{nomatch:["shop/car_repair|Ford"],tags:{brand:"Ford","brand:wikidata":"Q44294","brand:wikipedia":"en:Ford Motor Company",name:"Ford",shop:"car"}},"shop/car|Honda":{matchNames:["honda cars"],nomatch:["shop/motorcycle|Honda"],tags:{brand:"Honda","brand:wikidata":"Q9584","brand:wikipedia":"en:Honda",name:"Honda",shop:"car"}},"shop/car|Hyundai":{tags:{brand:"Hyundai","brand:wikidata":"Q55931","brand:wikipedia":"en:Hyundai Motor Company",name:"Hyundai",shop:"car"}},"shop/car|Isuzu":{tags:{brand:"Isuzu","brand:wikidata":"Q29803","brand:wikipedia":"en:Isuzu Motors",name:"Isuzu",shop:"car"}},"shop/car|Kia":{matchNames:["kia motors"],tags:{brand:"Kia","brand:wikidata":"Q35349","brand:wikipedia":"en:Kia Motors",name:"Kia",shop:"car"}},"shop/car|Land Rover":{tags:{brand:"Land Rover","brand:wikidata":"Q35907","brand:wikipedia":"en:Land Rover",name:"Land Rover",shop:"car"}},"shop/car|Lexus":{tags:{brand:"Lexus","brand:wikidata":"Q35919","brand:wikipedia":"en:Lexus",name:"Lexus",shop:"car"}},"shop/car|Mazda":{tags:{brand:"Mazda","brand:wikidata":"Q35996","brand:wikipedia":"en:Mazda",name:"Mazda",shop:"car"}},"shop/car|Mercedes-Benz":{matchNames:["mercedes"],tags:{brand:"Mercedes-Benz","brand:wikidata":"Q36008","brand:wikipedia":"en:Mercedes-Benz",name:"Mercedes-Benz",shop:"car"}},"shop/car|Mitsubishi":{matchNames:["mitsubishi motors"],tags:{brand:"Mitsubishi","brand:wikidata":"Q36033","brand:wikipedia":"en:Mitsubishi Motors",name:"Mitsubishi",shop:"car"}},"shop/car|Netz":{countryCodes:["jp"],tags:{brand:"Netz","brand:wikidata":"Q11325416","brand:wikipedia":"ja:ネッツ店",name:"Netz",shop:"car"}},"shop/car|Nissan":{tags:{brand:"Nissan","brand:wikidata":"Q20165","brand:wikipedia":"ja:日産自動車",name:"Nissan",shop:"car"}},"shop/car|Opel":{tags:{brand:"Opel","brand:wikidata":"Q40966","brand:wikipedia":"en:Opel",name:"Opel",shop:"car"}},"shop/car|Peugeot":{nomatch:["shop/car_repair|Peugeot"],tags:{brand:"Peugeot","brand:wikidata":"Q6742","brand:wikipedia":"en:Peugeot",name:"Peugeot",shop:"car"}},"shop/car|Porsche":{tags:{brand:"Porsche","brand:wikidata":"Q40993","brand:wikipedia":"en:Porsche",name:"Porsche",shop:"car"}},"shop/car|Renault":{nomatch:["shop/car_repair|Renault"],tags:{brand:"Renault","brand:wikidata":"Q6686","brand:wikipedia":"en:Renault",name:"Renault",shop:"car"}},"shop/car|Seat":{tags:{brand:"Seat","brand:wikidata":"Q188217","brand:wikipedia":"en:SEAT",name:"Seat",shop:"car"}},"shop/car|Skoda":{tags:{brand:"Skoda","brand:wikidata":"Q29637","brand:wikipedia":"en:Škoda Auto",name:"Skoda",shop:"car"}},"shop/car|Subaru":{tags:{brand:"Subaru","brand:wikidata":"Q172741","brand:wikipedia":"en:Subaru",name:"Subaru",shop:"car"}},"shop/car|Suzuki":{nomatch:["shop/motorcycle|Suzuki"],tags:{brand:"Suzuki","brand:wikidata":"Q181642","brand:wikipedia":"en:Suzuki",name:"Suzuki",shop:"car"}},"shop/car|Tesla":{tags:{brand:"Tesla","brand:wikidata":"Q478214","brand:wikipedia":"en:Tesla, Inc.",name:"Tesla",shop:"car"}},"shop/car|Toyota":{nomatch:["shop/car_repair|Toyota"],tags:{brand:"Toyota","brand:wikidata":"Q53268","brand:wikipedia":"en:Toyota",name:"Toyota",shop:"car"}},"shop/car|Volkswagen":{matchNames:["vw"],tags:{brand:"Volkswagen","brand:wikidata":"Q246","brand:wikipedia":"en:Volkswagen",name:"Volkswagen",shop:"car"}},"shop/car|Volvo":{tags:{brand:"Volvo","brand:wikidata":"Q215293","brand:wikipedia":"en:Volvo Cars",name:"Volvo",shop:"car"}},"shop/car|ダイハツ":{countryCodes:["jp"],tags:{brand:"ダイハツ","brand:ja":"ダイハツ",name:"ダイハツ","name:ja":"ダイハツ",shop:"car"}},"shop/car|ホンダ":{countryCodes:["jp"],tags:{brand:"ホンダ","brand:en":"Honda","brand:ja":"ホンダ","brand:wikidata":"Q9584","brand:wikipedia":"ja:本田技研工業",name:"ホンダ","name:en":"Honda","name:ja":"ホンダ",shop:"car"}},"shop/carpet|Carpetright":{countryCodes:["be","gb","ie","nl"],tags:{brand:"Carpetright","brand:wikidata":"Q5045782","brand:wikipedia":"en:Carpetright",name:"Carpetright",shop:"carpet"}},"shop/catalogue|Argos":{countryCodes:["gb","ie"],matchTags:["shop/department_store"],tags:{brand:"Argos","brand:wikidata":"Q4789707","brand:wikipedia":"en:Argos (retailer)",name:"Argos",shop:"catalogue"}},"shop/charity|Age UK":{countryCodes:["gb"],tags:{brand:"Age UK","brand:wikidata":"Q4691850","brand:wikipedia":"en:Age UK",name:"Age UK",shop:"charity"}},"shop/charity|Barnardo's":{countryCodes:["gb","ie"],tags:{brand:"Barnardo's","brand:wikidata":"Q2884670","brand:wikipedia":"en:Barnardo's",name:"Barnardo's",shop:"charity"}},"shop/charity|British Heart Foundation":{countryCodes:["gb"],tags:{brand:"British Heart Foundation","brand:wikidata":"Q4970039","brand:wikipedia":"en:British Heart Foundation",name:"British Heart Foundation",shop:"charity"}},"shop/charity|British Red Cross":{countryCodes:["gb","gg","im"],tags:{brand:"British Red Cross","brand:wikidata":"Q4970966","brand:wikipedia":"en:British Red Cross",name:"British Red Cross",shop:"charity"}},"shop/charity|Cancer Research UK":{countryCodes:["gb","gg"],tags:{brand:"Cancer Research UK","brand:wikidata":"Q326079","brand:wikipedia":"en:Cancer Research UK",name:"Cancer Research UK",shop:"charity"}},"shop/charity|Goodwill":{countryCodes:["ca","us"],matchTags:["shop/clothes","shop/second_hand"],tags:{brand:"Goodwill","brand:wikidata":"Q5583655","brand:wikipedia":"en:Goodwill Industries",name:"Goodwill",shop:"charity"}},"shop/charity|Mind":{countryCodes:["gb"],tags:{brand:"Mind","brand:wikidata":"Q3314763","brand:wikipedia":"en:Mind (charity)",name:"Mind",shop:"charity"}},"shop/charity|Myrorna":{countryCodes:["se"],matchTags:["shop/clothes","shop/second_hand"],tags:{brand:"Myrorna","brand:wikidata":"Q10592609","brand:wikipedia":"sv:Myrorna",name:"Myrorna",shop:"charity"}},"shop/charity|Oxfam":{countryCodes:["be","de","gb","ie","im"],tags:{brand:"Oxfam","brand:wikidata":"Q267941","brand:wikipedia":"en:Oxfam",name:"Oxfam",shop:"charity"}},"shop/charity|RSPCA":{countryCodes:["au","gb"],tags:{brand:"RSPCA","brand:wikidata":"Q584819","brand:wikipedia":"en:Royal Society for the Prevention of Cruelty to Animals",name:"RSPCA",shop:"charity"}},"shop/charity|Scope":{countryCodes:["gb"],tags:{brand:"Scope","brand:wikidata":"Q7434435","brand:wikipedia":"en:Scope (charity)",name:"Scope",shop:"charity"}},"shop/charity|Sue Ryder":{countryCodes:["gb","ie"],tags:{brand:"Sue Ryder","brand:wikidata":"Q7634271","brand:wikipedia":"en:Sue Ryder (charity)",name:"Sue Ryder",shop:"charity"}},"shop/charity|The Salvation Army":{countryCodes:["au","ca","gb","us"],matchNames:["salvation army"],tags:{brand:"The Salvation Army","brand:wikidata":"Q188307","brand:wikipedia":"en:The Salvation Army",name:"The Salvation Army",shop:"charity"}},"shop/chemist|101 Drogerie":{tags:{brand:"101 Drogerie",name:"101 Drogerie",shop:"chemist"}},"shop/chemist|7 Дней":{tags:{brand:"7 Дней",name:"7 Дней",shop:"chemist"}},"shop/chemist|Acqua & Sapone":{tags:{brand:"Acqua & Sapone",name:"Acqua & Sapone",shop:"chemist"}},"shop/chemist|Bipa":{countryCodes:["at","hr"],tags:{brand:"Bipa","brand:wikidata":"Q864933","brand:wikipedia":"de:Bipa",name:"Bipa",shop:"chemist"}},"shop/chemist|Boots":{nomatch:["amenity/pharmacy|Boots"],tags:{brand:"Boots",name:"Boots",shop:"chemist"}},"shop/chemist|Budnikowsky":{countryCodes:["de"],tags:{brand:"Budnikowsky","brand:wikidata":"Q1001516","brand:wikipedia":"de:Budnikowsky",name:"Budnikowsky",shop:"chemist"}},"shop/chemist|CVS":{nomatch:["amenity/pharmacy|CVS"],tags:{brand:"CVS",name:"CVS",shop:"chemist"}},"shop/chemist|Drogeria Natura":{countryCodes:["pl"],tags:{brand:"Drogeria Natura","brand:wikidata":"Q9212032","brand:wikipedia":"pl:Drogerie Natura",name:"Drogeria Natura",shop:"chemist"}},"shop/chemist|Etos":{tags:{brand:"Etos","brand:wikidata":"Q2609459","brand:wikipedia":"en:Etos",name:"Etos",shop:"chemist"}},"shop/chemist|Hebe":{tags:{brand:"Hebe",name:"Hebe",shop:"chemist"}},"shop/chemist|Holland & Barrett":{tags:{brand:"Holland & Barrett",name:"Holland & Barrett",shop:"chemist"}},"shop/chemist|Kruidvat":{tags:{brand:"Kruidvat","brand:wikidata":"Q2226366","brand:wikipedia":"en:Kruidvat",name:"Kruidvat",shop:"chemist"}},"shop/chemist|Matas":{countryCodes:["dk"],tags:{brand:"Matas","brand:wikidata":"Q6786143","brand:wikipedia":"en:Matas (drug store)",name:"Matas",shop:"chemist"}},"shop/chemist|Müller":{tags:{brand:"Müller","brand:wikidata":"Q1958759","brand:wikipedia":"en:Müller (German trade company)",name:"Müller",shop:"chemist"}},"shop/chemist|Rite Aid":{nomatch:["amenity/pharmacy|Rite Aid"],tags:{brand:"Rite Aid",name:"Rite Aid",shop:"chemist"}},"shop/chemist|Rossmann":{tags:{brand:"Rossmann","brand:wikidata":"Q316004","brand:wikipedia":"de:Dirk Rossmann GmbH",name:"Rossmann",shop:"chemist"}},"shop/chemist|Superdrug":{nomatch:["amenity/pharmacy|Superdrug"],tags:{brand:"Superdrug",name:"Superdrug",shop:"chemist"}},"shop/chemist|Teta":{tags:{brand:"Teta","brand:wikidata":"Q20860823","brand:wikipedia":"cs:Teta drogerie",name:"Teta",shop:"chemist"}},"shop/chemist|Tigotà":{tags:{brand:"Tigotà",name:"Tigotà",shop:"chemist"}},"shop/chemist|Trekpleister":{countryCodes:["nl"],tags:{brand:"Trekpleister","brand:wikidata":"Q2551576","brand:wikipedia":"nl:Trekpleister (drogisterij)",name:"Trekpleister",shop:"chemist"}},"shop/chemist|Walgreens":{countryCodes:["us"],matchNames:["walgreens pharmacy"],tags:{brand:"Walgreens","brand:wikidata":"Q1591889","brand:wikipedia":"en:Walgreens",name:"Walgreens",shop:"chemist"}},"shop/chemist|Watsons":{matchTags:["shop/cosmetics"],nomatch:["amenity/pharmacy|Watsons"],tags:{brand:"Watsons","brand:wikidata":"Q7974785","brand:wikipedia":"en:Watsons",name:"Watsons",operator:"A.S. Watson Group","operator:wikidata":"Q4647401","operator:wikipedia":"en:A.S. Watson Group",shop:"chemist"}},"shop/chemist|dm":{countryCodes:["at","ba","bg","cz","de","hr","hu","it","mk","ro","rs","si","sk"],matchNames:["dm drogerie markt"],tags:{brand:"dm","brand:wikidata":"Q266572","brand:wikipedia":"en:Dm-drogerie markt",name:"dm",shop:"chemist"}},"shop/chemist|Бытовая химия":{tags:{brand:"Бытовая химия",name:"Бытовая химия",shop:"chemist"}},"shop/chemist|Мила":{tags:{brand:"Мила",name:"Мила",shop:"chemist"}},"shop/chemist|Новэкс":{tags:{brand:"Новэкс",name:"Новэкс",shop:"chemist"}},"shop/chemist|Остров чистоты":{tags:{brand:"Остров чистоты",name:"Остров чистоты",shop:"chemist"}},"shop/chemist|Рубль Бум":{tags:{brand:"Рубль Бум",name:"Рубль Бум",shop:"chemist"}},"shop/chemist|Улыбка радуги":{tags:{brand:"Улыбка радуги",name:"Улыбка радуги",shop:"chemist"}},"shop/chemist|スギ薬局":{countryCodes:["jp"],nomatch:["amenity/pharmacy|スギ薬局"],tags:{brand:"スギ薬局","brand:ja":"スギ薬局",name:"スギ薬局","name:ja":"スギ薬局",shop:"chemist"}},"shop/chemist|丁丁藥局":{nomatch:["amenity/pharmacy|丁丁藥局"],tags:{brand:"丁丁藥局",name:"丁丁藥局",shop:"chemist"}},"shop/chemist|屈臣氏":{nomatch:["amenity/pharmacy|屈臣氏"],tags:{brand:"屈臣氏",name:"屈臣氏",shop:"chemist"}},"shop/chemist|康是美":{countryCodes:["tw"],tags:{brand:"康是美","brand:wikidata":"Q11063876","brand:wikipedia":"zh:康是美藥妝店",name:"康是美",shop:"chemist"}},"shop/chocolate|Cacau Show":{countryCodes:["br"],tags:{brand:"Cacau Show","brand:wikidata":"Q9671713","brand:wikipedia":"en:Cacau Show",name:"Cacau Show",shop:"chocolate"}},"shop/chocolate|Jeff de Bruges":{countryCodes:["cz","fr","gb"],tags:{brand:"Jeff de Bruges",name:"Jeff de Bruges",shop:"chocolate"}},"shop/chocolate|Leonidas":{countryCodes:["be","cz","fr","gb","gr","nl"],tags:{brand:"Leonidas","brand:wikidata":"Q80335","brand:wikipedia":"en:Leonidas (chocolate maker)",name:"Leonidas",shop:"chocolate"}},"shop/clothes|AOKI":{countryCodes:["jp"],tags:{brand:"AOKI","brand:wikidata":"Q11189480","brand:wikipedia":"ja:AOKIホールディングス",clothes:"men",name:"AOKI","name:ja":"アオキ",operator:"株式会社AOKIホールディングス","operator:en":"AOKI Holdings Inc.",shop:"clothes"}},"shop/clothes|AWG":{countryCodes:["bg","de"],tags:{brand:"AWG",name:"AWG",shop:"clothes"}},"shop/clothes|Abercrombie & Fitch":{tags:{brand:"Abercrombie & Fitch","brand:wikidata":"Q319344","brand:wikipedia":"en:Abercrombie & Fitch",clothes:"men;women",name:"Abercrombie & Fitch",shop:"clothes"}},"shop/clothes|Accessorize":{tags:{brand:"Accessorize","brand:wikidata":"Q3069980","brand:wikipedia":"en:Monsoon Accessorize",name:"Accessorize",shop:"clothes"}},"shop/clothes|Ackermans":{tags:{brand:"Ackermans","brand:wikidata":"Q4674255","brand:wikipedia":"en:Ackermans",name:"Ackermans",shop:"clothes"}},"shop/clothes|Adler":{countryCodes:["at","de","lu"],tags:{brand:"Adler",name:"Adler",shop:"clothes"}},"shop/clothes|Aeropostale":{tags:{brand:"Aeropostale","brand:wikidata":"Q794565","brand:wikipedia":"en:Aéropostale (clothing)",clothes:"men;women",name:"Aeropostale",shop:"clothes"}},"shop/clothes|American Eagle Outfitters":{countryCodes:["ca","us"],tags:{brand:"American Eagle Outfitters","brand:wikidata":"Q2842931","brand:wikipedia":"en:American Eagle Outfitters",clothes:"men;women",name:"American Eagle Outfitters",shop:"clothes"}},"shop/clothes|Ann Taylor":{countryCodes:["ca","us"],tags:{brand:"Ann Taylor","brand:wikidata":"Q4766699","brand:wikipedia":"en:Ann Inc.",clothes:"women",name:"Ann Taylor",shop:"clothes"}},"shop/clothes|Anthropologie":{countryCodes:["ca","gb","us"],tags:{brand:"Anthropologie","brand:wikidata":"Q4773903","brand:wikipedia":"en:Anthropologie",clothes:"women",name:"Anthropologie",shop:"clothes"}},"shop/clothes|Ardene":{countryCodes:["ca","sn"],tags:{brand:"Ardene","brand:wikidata":"Q2860764","brand:wikipedia":"en:Ardene",name:"Ardene",shop:"clothes"}},"shop/clothes|Armand Thiery":{countryCodes:["be","fr"],tags:{brand:"Armand Thiery","brand:wikidata":"Q2861975","brand:wikipedia":"fr:Armand Thiery",name:"Armand Thiery",shop:"clothes"}},"shop/clothes|Armani Exchange":{tags:{brand:"Armani Exchange","brand:wikidata":"Q56045740",clothes:"men;women",name:"Armani Exchange","operator:wikidata":"Q2861975","operator:wikipedia":"en:Armani",shop:"clothes"}},"shop/clothes|Banana Republic":{countryCodes:["ca","gb","us"],tags:{brand:"Banana Republic","brand:wikidata":"Q806085","brand:wikipedia":"en:Banana Republic",clothes:"men;women",name:"Banana Republic",shop:"clothes"}},"shop/clothes|Bench":{tags:{brand:"Bench",name:"Bench",shop:"clothes"}},"shop/clothes|Bershka":{tags:{brand:"Bershka","brand:wikidata":"Q827258","brand:wikipedia":"en:Bershka",name:"Bershka",shop:"clothes"}},"shop/clothes|Betty Barclay":{tags:{brand:"Betty Barclay","brand:wikidata":"Q850250","brand:wikipedia":"de:Betty Barclay",name:"Betty Barclay",shop:"clothes"}},"shop/clothes|Big Star":{tags:{brand:"Big Star","brand:wikidata":"Q9171569","brand:wikipedia":"pl:Big Star Limited",name:"Big Star",shop:"clothes"}},"shop/clothes|Bonita":{tags:{brand:"Bonita","brand:wikidata":"Q945463","brand:wikipedia":"en:Bonia (fashion)",name:"Bonita",shop:"clothes"}},"shop/clothes|Bonobo":{countryCodes:["fr"],nomatch:["shop/clothes|Bonobos"],tags:{brand:"Bonobo","brand:wikidata":"Q63682093",clothes:"men;women",name:"Bonobo",shop:"clothes"}},"shop/clothes|Bonobos":{countryCodes:["us"],nomatch:["shop/clothes|Bonobo"],tags:{brand:"Bonobos","brand:wikidata":"Q4942546","brand:wikipedia":"en:Bonobos (apparel)",clothes:"men",name:"Bonobos",shop:"clothes"}},"shop/clothes|Brice":{countryCodes:["be","fr"],tags:{brand:"Brice","brand:wikidata":"Q2925067","brand:wikipedia":"fr:Brice (enseigne)",name:"Brice",shop:"clothes"}},"shop/clothes|Bristol":{countryCodes:["nl"],tags:{brand:"Bristol",name:"Bristol",shop:"clothes"}},"shop/clothes|Brooks Brothers":{tags:{brand:"Brooks Brothers","brand:wikidata":"Q929722","brand:wikipedia":"en:Brooks Brothers",name:"Brooks Brothers",shop:"clothes"}},"shop/clothes|Buckle":{countryCodes:["np","us"],tags:{brand:"Buckle",name:"Buckle",shop:"clothes"}},"shop/clothes|Buffalo Exchange":{countryCodes:["us"],matchTags:["shop/second_hand"],tags:{brand:"Buffalo Exchange","brand:wikidata":"Q4985721","brand:wikipedia":"en:Buffalo Exchange",name:"Buffalo Exchange",second_hand:"only",shop:"clothes"}},"shop/clothes|Burberry":{tags:{brand:"Burberry","brand:wikidata":"Q390107","brand:wikipedia":"en:Burberry",name:"Burberry",shop:"clothes"}},"shop/clothes|Burlington Coat Factory":{countryCodes:["us"],tags:{brand:"Burlington Coat Factory","brand:wikidata":"Q4999220","brand:wikipedia":"en:Burlington (department store)",name:"Burlington Coat Factory",shop:"clothes"}},"shop/clothes|Burton":{countryCodes:["fr","gb"],tags:{brand:"Burton","brand:wikidata":"Q5000795","brand:wikipedia":"en:Burton (retailer)",name:"Burton",shop:"clothes"}},"shop/clothes|C&A":{tags:{brand:"C&A","brand:wikidata":"Q701338","brand:wikipedia":"en:C&A",name:"C&A",shop:"clothes"}},"shop/clothes|COS":{tags:{brand:"COS","brand:wikidata":"Q60772401","brand:wikipedia":"en:COS (clothing)",name:"COS",shop:"clothes"}},"shop/clothes|Cache Cache":{countryCodes:["fr","it","lu"],tags:{brand:"Cache Cache","brand:wikidata":"Q63064086",name:"Cache Cache",shop:"clothes"}},"shop/clothes|Calvin Klein":{tags:{brand:"Calvin Klein","brand:wikidata":"Q1068628","brand:wikipedia":"en:Calvin Klein (company)",name:"Calvin Klein",shop:"clothes"}},"shop/clothes|Calzedonia":{tags:{brand:"Calzedonia","brand:wikidata":"Q1027874","brand:wikipedia":"en:Calzedonia",name:"Calzedonia",shop:"clothes"}},"shop/clothes|Camaïeu":{countryCodes:["be","cz","fr","it","pl"],tags:{brand:"Camaïeu","brand:wikidata":"Q2934647","brand:wikipedia":"en:Camaïeu (company)",name:"Camaïeu",shop:"clothes"}},"shop/clothes|Camp David":{countryCodes:["at","de","ee","sk"],tags:{brand:"Camp David","brand:wikidata":"Q50540636","brand:wikipedia":"en:Camp David (fashion)",name:"Camp David",shop:"clothes"}},"shop/clothes|Carhartt":{tags:{brand:"Carhartt","brand:wikidata":"Q527877","brand:wikipedia":"en:Carhartt",name:"Carhartt",shop:"clothes"}},"shop/clothes|Carlings":{countryCodes:["fi","no","se"],tags:{brand:"Carlings",name:"Carlings",shop:"clothes"}},"shop/clothes|Caroll":{countryCodes:["ch","fr"],tags:{brand:"Caroll","brand:wikidata":"Q63063871",name:"Caroll",shop:"clothes"}},"shop/clothes|Carter's":{tags:{brand:"Carter's","brand:wikidata":"Q5047083","brand:wikipedia":"en:Carter's",name:"Carter's",shop:"clothes"}},"shop/clothes|Cato":{countryCodes:["us"],tags:{brand:"Cato","brand:wikidata":"Q16956136","brand:wikipedia":"en:Cato Corporation",name:"Cato",shop:"clothes"}},"shop/clothes|Cecil":{countryCodes:["at","de","nl"],tags:{brand:"Cecil",name:"Cecil",shop:"clothes"}},"shop/clothes|Celio":{tags:{brand:"Celio","brand:wikidata":"Q2672003","brand:wikipedia":"en:Celio (retailer)",name:"Celio",shop:"clothes"}},"shop/clothes|Charles Vögele":{countryCodes:["at","be","ch","de","hu","nl"],matchNames:["vögele"],tags:{brand:"Charles Vögele","brand:wikidata":"Q1066326","brand:wikipedia":"de:Charles Vögele Holding",name:"Charles Vögele",shop:"clothes"}},"shop/clothes|Charlotte Russe":{countryCodes:["us"],tags:{brand:"Charlotte Russe","brand:wikidata":"Q5086126","brand:wikipedia":"en:Charlotte Russe (clothing retailer)",name:"Charlotte Russe",shop:"clothes"}},"shop/clothes|Chico's":{countryCodes:["ar","us"],tags:{brand:"Chico's","brand:wikidata":"Q5096393","brand:wikipedia":"en:Chico's (clothing retailer)",name:"Chico's",shop:"clothes"}},"shop/clothes|Christopher & Banks":{countryCodes:["us"],tags:{brand:"Christopher & Banks","brand:wikidata":"Q5111816","brand:wikipedia":"en:Christopher & Banks",name:"Christopher & Banks",shop:"clothes"}},"shop/clothes|Club Monaco":{countryCodes:["ca","gb","us"],tags:{brand:"Club Monaco","brand:wikidata":"Q2979949","brand:wikipedia":"en:Club Monaco",name:"Club Monaco",shop:"clothes"}},"shop/clothes|Colin's":{tags:{brand:"Colin's","brand:wikidata":"Q28729658",name:"Colin's",shop:"clothes"}},"shop/clothes|Colloseum":{countryCodes:["at","de"],tags:{brand:"Colloseum",name:"Colloseum",shop:"clothes"}},"shop/clothes|Columbia":{nomatch:["amenity/bank|Columbia Bank"],tags:{brand:"Columbia","brand:wikidata":"Q1112588","brand:wikipedia":"en:Columbia Sportswear",name:"Columbia",shop:"clothes"}},"shop/clothes|Cropp":{tags:{brand:"Cropp","brand:wikidata":"Q9196793","brand:wikipedia":"pl:Cropp",name:"Cropp",shop:"clothes"}},"shop/clothes|Cubus":{countryCodes:["de","fi","lv","no","pl","se"],tags:{brand:"Cubus","brand:wikidata":"Q3439593","brand:wikipedia":"no:Cubus",name:"Cubus",shop:"clothes"}},"shop/clothes|DXL Men's Apparel":{countryCodes:["us"],tags:{brand:"DXL Men's Apparel","brand:wikidata":"Q61981830",clothes:"oversize;men",name:"DXL Men's Apparel","operator:wikidata":"Q5050852","operator:wikipedia":"en:Destination XL Group",shop:"clothes"}},"shop/clothes|Damart":{countryCodes:["be","fr","lu"],tags:{brand:"Damart","brand:wikidata":"Q3012602","brand:wikipedia":"en:Damart",name:"Damart",shop:"clothes"}},"shop/clothes|David's Bridal":{countryCodes:["ca","us"],tags:{brand:"David's Bridal","brand:wikidata":"Q5230388","brand:wikipedia":"en:David's Bridal",name:"David's Bridal",shop:"clothes"}},"shop/clothes|Desigual":{tags:{brand:"Desigual","brand:wikidata":"Q83750","brand:wikipedia":"en:Desigual",name:"Desigual",shop:"clothes"}},"shop/clothes|Devred":{countryCodes:["be","fr","ma"],tags:{brand:"Devred","brand:wikidata":"Q3025542","brand:wikipedia":"fr:Devred 1902",name:"Devred",shop:"clothes"}},"shop/clothes|Didi":{countryCodes:["be","nl"],tags:{brand:"Didi",name:"Didi",shop:"clothes"}},"shop/clothes|Diesel":{tags:{brand:"Diesel","brand:wikidata":"Q158285","brand:wikipedia":"en:Diesel (brand)",name:"Diesel",shop:"clothes"}},"shop/clothes|Diverse":{countryCodes:["pl"],tags:{brand:"Diverse","brand:wikidata":"Q11694298","brand:wikipedia":"pl:Diverse",name:"Diverse",shop:"clothes"}},"shop/clothes|Dorothy Perkins":{countryCodes:["gb","gg","ie","im"],tags:{brand:"Dorothy Perkins","brand:wikidata":"Q5298588","brand:wikipedia":"en:Dorothy Perkins",name:"Dorothy Perkins",shop:"clothes"}},"shop/clothes|Dress Barn":{tags:{brand:"Dress Barn","brand:wikidata":"Q5307031","brand:wikipedia":"en:Ascena Retail Group",name:"Dress Barn",shop:"clothes"}},"shop/clothes|Dressmann":{countryCodes:["at","fi","no","se"],tags:{brand:"Dressmann","brand:wikidata":"Q3357081","brand:wikipedia":"en:Dressmann",name:"Dressmann",shop:"clothes"}},"shop/clothes|Eddie Bauer":{countryCodes:["ca","jp","us"],tags:{brand:"Eddie Bauer","brand:wikidata":"Q842174","brand:wikipedia":"en:Eddie Bauer",name:"Eddie Bauer",shop:"clothes"}},"shop/clothes|Edgars":{tags:{brand:"Edgars",name:"Edgars",operator:"Edcon","operator:wikidata":"Q5335743","operator:wikipedia":"en:Edcon",shop:"clothes"}},"shop/clothes|Engbers":{countryCodes:["at","de"],tags:{brand:"Engbers","brand:wikidata":"Q1290088","brand:wikipedia":"de:Engbers",name:"Engbers",shop:"clothes"}},"shop/clothes|Ernsting's family":{countryCodes:["at","de"],tags:{brand:"Ernsting's family","brand:wikidata":"Q1361016","brand:wikipedia":"de:Ernsting’s family",name:"Ernsting's family",shop:"clothes"}},"shop/clothes|Esprit":{tags:{brand:"Esprit","brand:wikidata":"Q532746","brand:wikipedia":"en:Esprit Holdings",name:"Esprit",shop:"clothes"}},"shop/clothes|Etam":{tags:{brand:"Etam","brand:wikidata":"Q3059202","brand:wikipedia":"en:Etam Développement",name:"Etam",shop:"clothes"}},"shop/clothes|Express":{nomatch:["shop/convenience|Express"],tags:{brand:"Express","brand:wikidata":"Q1384784","brand:wikipedia":"en:Express, Inc.",name:"Express",shop:"clothes"}},"shop/clothes|Fat Face":{countryCodes:["gb","gg","ie"],tags:{brand:"Fat Face","brand:wikidata":"Q5437186","brand:wikipedia":"en:Fat Face",name:"Fat Face",shop:"clothes"}},"shop/clothes|Forever 21":{tags:{brand:"Forever 21","brand:wikidata":"Q1060537","brand:wikipedia":"en:Forever 21",name:"Forever 21",shop:"clothes"}},"shop/clothes|Free People":{countryCodes:["ca","us"],tags:{brand:"Free People","brand:wikidata":"Q5499945","brand:wikipedia":"en:Free People",name:"Free People",shop:"clothes"}},"shop/clothes|Fussl":{countryCodes:["at","de"],tags:{brand:"Fussl",name:"Fussl",shop:"clothes"}},"shop/clothes|GU":{countryCodes:["cl","jp","tw"],tags:{brand:"GU","brand:wikidata":"Q5512642","brand:wikipedia":"en:GU (retailer)",name:"GU",shop:"clothes"}},"shop/clothes|Gant":{tags:{brand:"Gant","brand:wikidata":"Q1493667","brand:wikipedia":"en:Gant (retailer)",name:"Gant",shop:"clothes"}},"shop/clothes|Gap":{tags:{brand:"Gap","brand:wikidata":"Q420822","brand:wikipedia":"en:Gap Inc.",name:"Gap",shop:"clothes"}},"shop/clothes|Gerry Weber":{tags:{brand:"Gerry Weber","brand:wikidata":"Q873447","brand:wikipedia":"en:Gerry Weber",name:"Gerry Weber",shop:"clothes"}},"shop/clothes|Gina Laura":{countryCodes:["at","de"],tags:{brand:"Gina Laura","brand:wikidata":"Q2700576","brand:wikipedia":"de:Gina Laura",name:"Gina Laura",shop:"clothes"}},"shop/clothes|Gloria Jeans":{countryCodes:["ru","ua"],tags:{brand:"Gloria Jeans","brand:wikidata":"Q4139985","brand:wikipedia":"ru:Глория Джинс",name:"Gloria Jeans",shop:"clothes"}},"shop/clothes|Gucci":{tags:{brand:"Gucci","brand:wikidata":"Q178516","brand:wikipedia":"en:Gucci",name:"Gucci",shop:"clothes"}},"shop/clothes|Guess":{tags:{brand:"Guess","brand:wikidata":"Q2470307","brand:wikipedia":"en:Guess (clothing)",name:"Guess",shop:"clothes"}},"shop/clothes|Gymboree":{countryCodes:["ca","us"],tags:{brand:"Gymboree","brand:wikidata":"Q4039771","brand:wikipedia":"en:Gymboree",name:"Gymboree",shop:"clothes"}},"shop/clothes|Gémo":{countryCodes:["be","ch","fr"],tags:{brand:"Gémo","brand:wikidata":"Q3122954","brand:wikipedia":"fr:Gémo",name:"Gémo",shop:"clothes"}},"shop/clothes|H&M":{tags:{brand:"H&M","brand:wikidata":"Q188326","brand:wikipedia":"en:H&M",name:"H&M",shop:"clothes"}},"shop/clothes|Hallhuber":{countryCodes:["at","ch","de","lu","nl"],tags:{brand:"Hallhuber","brand:wikidata":"Q1571714","brand:wikipedia":"de:Hallhuber (Bekleidungshaus)",name:"Hallhuber",shop:"clothes"}},"shop/clothes|Hanna Andersson":{countryCodes:["us"],tags:{brand:"Hanna Andersson","brand:wikidata":"Q17460802","brand:wikipedia":"en:Hanna Andersson",clothes:"baby;children;women",name:"Hanna Andersson",shop:"clothes"}},"shop/clothes|Hollister":{tags:{brand:"Hollister","brand:wikidata":"Q1257477","brand:wikipedia":"en:Hollister Co.",name:"Hollister",shop:"clothes"}},"shop/clothes|Hot Topic":{countryCodes:["ca","us"],tags:{brand:"Hot Topic","brand:wikidata":"Q9294032","brand:wikipedia":"en:Hot Topic",name:"Hot Topic",shop:"clothes"}},"shop/clothes|House":{tags:{brand:"House",name:"House",shop:"clothes"}},"shop/clothes|Hugo Boss":{matchNames:["boss"],tags:{brand:"Hugo Boss","brand:wikidata":"Q491627","brand:wikipedia":"en:Hugo Boss",name:"Hugo Boss",shop:"clothes"}},"shop/clothes|Humana":{tags:{brand:"Humana",name:"Humana",shop:"clothes"}},"shop/clothes|Hunkemöller":{tags:{brand:"Hunkemöller","brand:wikidata":"Q2604175","brand:wikipedia":"en:Hunkemöller",name:"Hunkemöller",shop:"clothes"}},"shop/clothes|Intimissimi":{tags:{brand:"Intimissimi","brand:wikidata":"Q305404","brand:wikipedia":"en:Intimissimi",clothes:"underwear",name:"Intimissimi",shop:"clothes"}},"shop/clothes|J. Crew":{countryCodes:["ca","gb","us"],tags:{brand:"J. Crew",name:"J. Crew",shop:"clothes"}},"shop/clothes|JBC":{countryCodes:["be","lu"],tags:{brand:"JBC","brand:wikidata":"Q2671470","brand:wikipedia":"nl:JBC",name:"JBC",shop:"clothes"}},"shop/clothes|Jack & Jones":{tags:{brand:"Jack & Jones","brand:wikidata":"Q6077665","brand:wikipedia":"en:Jack & Jones",name:"Jack & Jones",shop:"clothes"}},"shop/clothes|Jack Wills":{countryCodes:["ae","gb","hk","ie","kw","lb","mo","sg","us"],tags:{brand:"Jack Wills","brand:wikidata":"Q6115814","brand:wikipedia":"en:Jack Wills",name:"Jack Wills",shop:"clothes"}},"shop/clothes|Jeans Centre":{countryCodes:["nl"],tags:{brand:"Jeans Centre",name:"Jeans Centre",shop:"clothes"}},"shop/clothes|Jeans Fritz":{countryCodes:["de"],tags:{brand:"Jeans Fritz","brand:wikidata":"Q1686071","brand:wikipedia":"de:Jeans Fritz",name:"Jeans Fritz",shop:"clothes"}},"shop/clothes|Jennyfer":{countryCodes:["fr","it","lu"],tags:{brand:"Jennyfer","brand:wikidata":"Q3177174","brand:wikipedia":"fr:Jennyfer",name:"Jennyfer",shop:"clothes"}},"shop/clothes|Jet":{countryCodes:["za"],nomatch:["amenity/fuel|Jet"],tags:{brand:"Jet","brand:wikidata":"Q61995123",name:"Jet",shop:"clothes"}},"shop/clothes|Jigsaw":{countryCodes:["au","gb","us"],tags:{brand:"Jigsaw","brand:wikidata":"Q6192383","brand:wikipedia":"en:Jigsaw (clothing retailer)",name:"Jigsaw",shop:"clothes"}},"shop/clothes|Jos. A. Bank":{countryCodes:["us"],tags:{brand:"Jos. A. Bank","brand:wikidata":"Q6204078","brand:wikipedia":"en:JoS. A. Bank Clothiers",name:"Jos. A. Bank",shop:"clothes"}},"shop/clothes|Joules":{countryCodes:["gb","gg","ie"],tags:{brand:"Joules","brand:wikidata":"Q25351738","brand:wikipedia":"en:Joules (clothing)",name:"Joules",shop:"clothes"}},"shop/clothes|Jules":{countryCodes:["be","fr","it"],tags:{brand:"Jules",name:"Jules",shop:"clothes"}},"shop/clothes|Justice":{tags:{brand:"Justice","brand:wikidata":"Q7857512","brand:wikipedia":"en:Tween Brands",name:"Justice",shop:"clothes"}},"shop/clothes|KappAhl":{countryCodes:["fi","no","pl","se"],tags:{brand:"KappAhl","brand:wikidata":"Q4349016","brand:wikipedia":"sv:Kappahl",name:"KappAhl",shop:"clothes"}},"shop/clothes|Kate Spade New York":{countryCodes:["ca","us"],matchNames:["kate spade","kate spade ny"],tags:{brand:"Kate Spade New York","brand:wikidata":"Q6375797","brand:wikipedia":"en:Kate Spade New York",name:"Kate Spade New York",shop:"clothes"}},"shop/clothes|KiK":{tags:{brand:"KiK","brand:wikidata":"Q883965","brand:wikipedia":"en:KiK",name:"KiK",shop:"clothes"}},"shop/clothes|Kiabi":{tags:{brand:"Kiabi","brand:wikidata":"Q3196299","brand:wikipedia":"fr:Kiabi",name:"Kiabi",shop:"clothes"}},"shop/clothes|LC Waikiki":{tags:{brand:"LC Waikiki","brand:wikidata":"Q3205965","brand:wikipedia":"fr:LC Waikiki",name:"LC Waikiki",shop:"clothes"}},"shop/clothes|La Halle":{countryCodes:["ch","fr"],tags:{brand:"La Halle",name:"La Halle",shop:"clothes"}},"shop/clothes|La Senza":{tags:{brand:"La Senza","brand:wikidata":"Q3212802","brand:wikipedia":"en:La Senza",name:"La Senza",shop:"clothes"}},"shop/clothes|Lacoste":{tags:{brand:"Lacoste","brand:wikidata":"Q309031","brand:wikipedia":"en:Lacoste",name:"Lacoste",shop:"clothes"}},"shop/clothes|Lane Bryant":{countryCodes:["us"],tags:{brand:"Lane Bryant","brand:wikidata":"Q6485350","brand:wikipedia":"en:Lane Bryant",clothes:"oversize;women",name:"Lane Bryant",shop:"clothes"}},"shop/clothes|Levi's":{tags:{brand:"Levi's","brand:wikidata":"Q127962","brand:wikipedia":"en:Levi Strauss & Co.",clothes:"denim;men;women",name:"Levi's",shop:"clothes"}},"shop/clothes|Lids":{countryCodes:["ca","us"],tags:{brand:"Lids","brand:wikidata":"Q19841609","brand:wikipedia":"en:Lids (store)",clothes:"hats",name:"Lids",shop:"clothes"}},"shop/clothes|Lindex":{countryCodes:["cz","ee","fi","no","se","sk"],tags:{brand:"Lindex","brand:wikidata":"Q1786717","brand:wikipedia":"en:Lindex",name:"Lindex",shop:"clothes"}},"shop/clothes|Loft":{tags:{brand:"Loft","brand:wikidata":"Q62075137",clothes:"women",name:"Loft",operator:"Ann Inc.","operator:wikidata":"Q4766699","operator:wikipedia":"en:Ann Inc.",shop:"clothes"}},"shop/clothes|Louis Vuitton":{tags:{brand:"Louis Vuitton","brand:wikidata":"Q191485","brand:wikipedia":"en:Louis Vuitton",name:"Louis Vuitton",shop:"clothes"}},"shop/clothes|Lululemon":{countryCodes:["au","ca","us"],tags:{brand:"Lululemon",name:"Lululemon",shop:"clothes"}},"shop/clothes|M&Co":{countryCodes:["gb"],tags:{brand:"M&Co","brand:wikidata":"Q6711808","brand:wikipedia":"en:M&Co.",name:"M&Co",shop:"clothes"}},"shop/clothes|MS Mode":{countryCodes:["be","de","fr","lu","nl"],tags:{brand:"MS Mode",name:"MS Mode",shop:"clothes"}},"shop/clothes|Mango":{tags:{brand:"Mango","brand:wikidata":"Q136503","brand:wikipedia":"en:Mango (retailer)",name:"Mango",shop:"clothes"}},"shop/clothes|Marc O'Polo":{tags:{brand:"Marc O'Polo","brand:wikidata":"Q1892752","brand:wikipedia":"en:Marc O'Polo",name:"Marc O'Polo",shop:"clothes"}},"shop/clothes|Mark Formelle":{countryCodes:["by","kz","ru"],tags:{brand:"Mark Formelle",name:"Mark Formelle",shop:"clothes"}},"shop/clothes|Mark's":{countryCodes:["ca"],tags:{brand:"Mark's","brand:wikidata":"Q6766373","brand:wikipedia":"en:Mark's",name:"Mark's",shop:"clothes"}},"shop/clothes|Marks & Spencer":{tags:{brand:"Marks & Spencer","brand:wikidata":"Q714491","brand:wikipedia":"en:Marks & Spencer",name:"Marks & Spencer",shop:"clothes"}},"shop/clothes|Massimo Dutti":{tags:{brand:"Massimo Dutti","brand:wikidata":"Q788231","brand:wikipedia":"en:Massimo Dutti",name:"Massimo Dutti",shop:"clothes"}},"shop/clothes|Matalan":{countryCodes:["ae","gb"],tags:{brand:"Matalan","brand:wikidata":"Q12061509","brand:wikipedia":"en:Matalan",name:"Matalan",shop:"clothes"}},"shop/clothes|Maurices":{countryCodes:["ca","fr","us"],tags:{brand:"Maurices","brand:wikidata":"Q6793571","brand:wikipedia":"en:Maurices",name:"Maurices",shop:"clothes"}},"shop/clothes|Max Mara":{tags:{brand:"Max Mara","brand:wikidata":"Q1151774","brand:wikipedia":"en:Max Mara",name:"Max Mara",shop:"clothes"}},"shop/clothes|Men's Wearhouse":{matchNames:["mens warehouse"],tags:{brand:"Men's Wearhouse","brand:wikidata":"Q57405513",clothes:"suits",name:"Men's Wearhouse",shop:"clothes"}},"shop/clothes|Mexx":{tags:{brand:"Mexx","brand:wikidata":"Q1837290","brand:wikipedia":"en:Mexx",name:"Mexx",shop:"clothes"}},"shop/clothes|Michael Kors":{tags:{brand:"Michael Kors","brand:wikidata":"Q19572998","brand:wikipedia":"en:Capri Holdings",name:"Michael Kors",shop:"clothes"}},"shop/clothes|Miller & Monroe":{countryCodes:["at","de","nl"],tags:{brand:"Miller & Monroe",name:"Miller & Monroe",shop:"clothes"}},"shop/clothes|Mim":{countryCodes:["fr","it"],tags:{brand:"Mim",name:"Mim",shop:"clothes"}},"shop/clothes|Miss Etam":{countryCodes:["nl"],tags:{brand:"Miss Etam",name:"Miss Etam",shop:"clothes"}},"shop/clothes|Mohito":{tags:{brand:"Mohito",name:"Mohito",shop:"clothes"}},"shop/clothes|Monsoon":{countryCodes:["gb","gg","ie"],tags:{brand:"Monsoon","brand:wikidata":"Q3069980","brand:wikipedia":"en:Monsoon Accessorize",name:"Monsoon",shop:"clothes"}},"shop/clothes|Motherhood Maternity":{countryCodes:["ca","us"],tags:{brand:"Motherhood Maternity",name:"Motherhood Maternity",shop:"clothes"}},"shop/clothes|Motivi":{tags:{brand:"Motivi",name:"Motivi",shop:"clothes"}},"shop/clothes|Mr Price":{tags:{brand:"Mr Price","brand:wikidata":"Q6929120","brand:wikipedia":"en:Mr. Price",name:"Mr Price",shop:"clothes"}},"shop/clothes|NKD":{countryCodes:["at","de","it","si"],tags:{brand:"NKD","brand:wikidata":"Q927272","brand:wikipedia":"de:NKD",name:"NKD",shop:"clothes"}},"shop/clothes|Naf Naf":{tags:{brand:"Naf Naf","brand:wikidata":"Q3334188","brand:wikipedia":"fr:Naf Naf",name:"Naf Naf",shop:"clothes"}},"shop/clothes|New Look":{tags:{brand:"New Look","brand:wikidata":"Q12063852","brand:wikipedia":"en:New Look (company)",name:"New Look",shop:"clothes"}},"shop/clothes|New Yorker":{tags:{brand:"New Yorker","brand:wikidata":"Q706421","brand:wikipedia":"en:New Yorker (clothing)",name:"New Yorker",shop:"clothes"}},"shop/clothes|Next":{tags:{brand:"Next","brand:wikidata":"Q246655","brand:wikipedia":"en:Next plc",name:"Next",shop:"clothes"}},"shop/clothes|Nike":{matchTags:["shop/shoes","shop/sports"],tags:{brand:"Nike","brand:wikidata":"Q483915","brand:wikipedia":"en:Nike, Inc.",name:"Nike",shop:"clothes"}},"shop/clothes|Nordstrom Rack":{countryCodes:["ca","us"],tags:{brand:"Nordstrom Rack","brand:wikidata":"Q21463374","brand:wikipedia":"en:Nordstrom Rack",name:"Nordstrom Rack",shop:"clothes"}},"shop/clothes|OVS":{countryCodes:["at","ch","fr","it","si"],tags:{brand:"OVS","brand:wikidata":"Q2042514","brand:wikipedia":"en:OVS (company)",name:"OVS",shop:"clothes"}},"shop/clothes|Oasis":{tags:{brand:"Oasis",name:"Oasis",shop:"clothes"}},"shop/clothes|Okaïdi":{tags:{brand:"Okaïdi","brand:wikidata":"Q3350027","brand:wikipedia":"fr:Okaïdi",name:"Okaïdi",shop:"clothes"}},"shop/clothes|Old Navy":{tags:{brand:"Old Navy","brand:wikidata":"Q2735242","brand:wikipedia":"en:Old Navy",name:"Old Navy",shop:"clothes"}},"shop/clothes|Only":{tags:{brand:"Only","brand:wikidata":"Q61799370",name:"Only","operator:wikidata":"Q28172489","operator:wikipedia":"en:Bestseller (company)",shop:"clothes"}},"shop/clothes|Orchestra":{tags:{brand:"Orchestra","brand:wikidata":"Q28042940","brand:wikipedia":"fr:Orchestra Prémaman",name:"Orchestra",shop:"clothes"}},"shop/clothes|Original Marines":{countryCodes:["it"],tags:{brand:"Original Marines",name:"Original Marines",shop:"clothes"}},"shop/clothes|Orsay":{tags:{brand:"Orsay","brand:wikidata":"Q883245","brand:wikipedia":"de:Orsay (Modeunternehmen)",name:"Orsay",shop:"clothes"}},"shop/clothes|Outfit":{countryCodes:["de","gb"],tags:{brand:"Outfit","brand:wikidata":"Q7112061","brand:wikipedia":"en:Outfit (retailer)",name:"Outfit",shop:"clothes"}},"shop/clothes|Oysho":{tags:{brand:"Oysho","brand:wikidata":"Q3327046","brand:wikipedia":"en:Oysho",name:"Oysho",shop:"clothes"}},"shop/clothes|PacSun":{countryCodes:["us"],tags:{brand:"PacSun","brand:wikidata":"Q7121857","brand:wikipedia":"en:PacSun",name:"PacSun",shop:"clothes"}},"shop/clothes|Palmers":{countryCodes:["at","de"],tags:{brand:"Palmers","brand:wikidata":"Q1509985","brand:wikipedia":"de:Palmers",name:"Palmers",shop:"clothes"}},"shop/clothes|Peacocks":{countryCodes:["cy","gb"],tags:{brand:"Peacocks","brand:wikidata":"Q7157762","brand:wikipedia":"en:Peacocks (clothing)",name:"Peacocks",shop:"clothes"}},"shop/clothes|Peek & Cloppenburg":{countryCodes:["at","be","de","nl","pl"],tags:{brand:"Peek & Cloppenburg","brand:wikidata":"Q2066959","brand:wikipedia":"en:Peek & Cloppenburg",name:"Peek & Cloppenburg",shop:"clothes"}},"shop/clothes|Pep":{tags:{brand:"Pep","brand:wikidata":"Q7166182","brand:wikipedia":"en:Pep (store)",name:"Pep",shop:"clothes"}},"shop/clothes|Pepco":{countryCodes:["cz","hu","pl","ro","sk"],matchTags:["shop/variety_store"],tags:{brand:"Pepco","brand:wikidata":"Q11815580","brand:wikipedia":"pl:Pepco",name:"Pepco",shop:"clothes"}},"shop/clothes|Petit Bateau":{countryCodes:["be","de","fr","gb","it","lu"],tags:{brand:"Petit Bateau","brand:wikidata":"Q3377090","brand:wikipedia":"en:Petit Bateau",name:"Petit Bateau",shop:"clothes"}},"shop/clothes|Phase Eight":{countryCodes:["ch","de","gb"],tags:{brand:"Phase Eight","brand:wikidata":"Q17020730","brand:wikipedia":"en:Phase Eight",name:"Phase Eight",shop:"clothes"}},"shop/clothes|Pierre Cardin":{tags:{brand:"Pierre Cardin",name:"Pierre Cardin",shop:"clothes"}},"shop/clothes|Pimkie":{countryCodes:["at","be","de","es","fr","it"],tags:{brand:"Pimkie","brand:wikidata":"Q1758066","brand:wikipedia":"en:Pimkie",name:"Pimkie",shop:"clothes"}},"shop/clothes|Plato's Closet":{countryCodes:["ca","us"],tags:{brand:"Plato's Closet","brand:wikidata":"Q61779112",name:"Plato's Closet",operator:"Winmark","operator:wikidata":"Q28048853","operator:wikipedia":"en:Winmark",second_hand:"only",shop:"clothes"}},"shop/clothes|Polo Ralph Lauren":{tags:{brand:"Polo Ralph Lauren",name:"Polo Ralph Lauren",shop:"clothes"}},"shop/clothes|Primark":{tags:{brand:"Primark","brand:wikidata":"Q137023","brand:wikipedia":"en:Primark",name:"Primark",shop:"clothes"}},"shop/clothes|Promod":{tags:{brand:"Promod","brand:wikidata":"Q3407429","brand:wikipedia":"en:Promod",name:"Promod",shop:"clothes"}},"shop/clothes|Pull & Bear":{tags:{brand:"Pull & Bear","brand:wikidata":"Q691029","brand:wikipedia":"en:Pull&Bear",name:"Pull & Bear",shop:"clothes"}},"shop/clothes|Puma":{matchTags:["shop/sports"],nomatch:["amenity/fuel|Puma"],tags:{brand:"Puma","brand:wikidata":"Q7203029","brand:wikipedia":"en:Puma (brand)",name:"Puma",shop:"clothes"}},"shop/clothes|Quicksilver":{tags:{brand:"Quicksilver",name:"Quicksilver",shop:"clothes"}},"shop/clothes|Rainbow":{tags:{brand:"Rainbow","brand:wikidata":"Q7284708","brand:wikipedia":"en:Rainbow Shops",name:"Rainbow",shop:"clothes"}},"shop/clothes|Reebok":{matchTags:["shop/shoes","shop/sports"],tags:{brand:"Reebok","brand:wikidata":"Q466183","brand:wikipedia":"en:Reebok",name:"Reebok",shop:"clothes"}},"shop/clothes|Reitmans":{countryCodes:["ca"],tags:{brand:"Reitmans","brand:wikidata":"Q7310506","brand:wikipedia":"en:Reitmans",name:"Reitmans",shop:"clothes"}},"shop/clothes|Reserved":{tags:{brand:"Reserved","brand:wikidata":"Q21809354","brand:wikipedia":"en:Reserved",name:"Reserved",shop:"clothes"}},"shop/clothes|River Island":{countryCodes:["gb","ie","im","nl","pl"],tags:{brand:"River Island","brand:wikidata":"Q2670328","brand:wikipedia":"en:River Island",name:"River Island",shop:"clothes"}},"shop/clothes|Ross":{countryCodes:["us"],matchNames:["ross dress for less"],tags:{brand:"Ross","brand:wikidata":"Q3442791","brand:wikipedia":"en:Ross Stores",name:"Ross",official_name:"Ross Dress for Less",shop:"clothes"}},"shop/clothes|Sandro":{tags:{brand:"Sandro",name:"Sandro",shop:"clothes"}},"shop/clothes|Scotch & Soda":{tags:{brand:"Scotch & Soda",name:"Scotch & Soda",shop:"clothes"}},"shop/clothes|Sela":{tags:{brand:"Sela","brand:wikidata":"Q62075111",name:"Sela",shop:"clothes"}},"shop/clothes|Select":{tags:{brand:"Select",name:"Select",shop:"clothes"}},"shop/clothes|Sergent Major":{countryCodes:["be","de","es","fr","gb","it"],tags:{brand:"Sergent Major","brand:wikidata":"Q62521738","brand:wikipedia":"fr:Sergent Major (entreprise)",clothes:"babies;children",name:"Sergent Major",shop:"clothes"}},"shop/clothes|Shoeby":{countryCodes:["nl"],tags:{brand:"Shoeby",name:"Shoeby",shop:"clothes"}},"shop/clothes|Sinsay":{tags:{brand:"Sinsay",name:"Sinsay",shop:"clothes"}},"shop/clothes|Sisley":{tags:{brand:"Sisley","brand:wikidata":"Q12054325","brand:wikipedia":"cs:Sisley",name:"Sisley",operator:"Benetton Group","operator:wikidata":"Q817139","operator:wikipedia":"en:Benetton Group",shop:"clothes"}},"shop/clothes|Springfield":{tags:{brand:"Springfield","brand:wikidata":"Q958209","brand:wikipedia":"es:Springfield (cadena de tiendas)",name:"Springfield",shop:"clothes"}},"shop/clothes|Stefanel":{tags:{brand:"Stefanel","brand:wikidata":"Q2338087","brand:wikipedia":"ro:Stefanel (companie)",name:"Stefanel",shop:"clothes"}},"shop/clothes|Steps":{tags:{brand:"Steps",name:"Steps",operator:"FNG Group","operator:wikidata":"Q15875120","operator:wikipedia":"nl:FNG Group",shop:"clothes"}},"shop/clothes|Stradivarius":{tags:{brand:"Stradivarius","brand:wikidata":"Q3322945","brand:wikipedia":"en:Stradivarius (clothing brand)",name:"Stradivarius",shop:"clothes"}},"shop/clothes|Street One":{countryCodes:["at","be","bg","ch","cz","de","dk","es","fi","fr","hr","hu","ie","it","lt","lu","lv","nl","no","pl","ro","se","si","sk"],tags:{brand:"Street One","brand:wikidata":"Q61997265",name:"Street One",operator:"CBR Fashion Holding","operator:wikidata":"Q1022989","operator:wikipedia":"de:CBR Fashion Holding",shop:"clothes"}},"shop/clothes|Suburbia":{countryCodes:["mx"],tags:{brand:"Suburbia","brand:wikidata":"Q6134992","brand:wikipedia":"en:Suburbia (department store)",name:"Suburbia",shop:"clothes"}},"shop/clothes|Superdry":{tags:{brand:"Superdry","brand:wikidata":"Q1684445","brand:wikipedia":"en:Superdry",name:"Superdry",shop:"clothes"}},"shop/clothes|TJ Maxx":{countryCodes:["us"],tags:{brand:"TJ Maxx","brand:wikidata":"Q10860683","brand:wikipedia":"en:TJ Maxx",name:"TJ Maxx",shop:"clothes"}},"shop/clothes|TK Maxx":{tags:{brand:"TK Maxx","brand:wikidata":"Q23823668","brand:wikipedia":"en:TK Maxx",name:"TK Maxx",shop:"clothes"}},"shop/clothes|Takko":{countryCodes:["at","cz","de","hu","nl"],matchNames:["takko fashion"],tags:{brand:"Takko","brand:wikidata":"Q1371302","brand:wikipedia":"de:Takko",name:"Takko",shop:"clothes"}},"shop/clothes|Talbots":{countryCodes:["ca","us"],tags:{brand:"Talbots","brand:wikidata":"Q7679064","brand:wikipedia":"en:Talbots",name:"Talbots",shop:"clothes"}},"shop/clothes|Tally Weijl":{tags:{brand:"Tally Weijl","brand:wikidata":"Q689695","brand:wikipedia":"en:Tally Weijl",name:"Tally Weijl",shop:"clothes"}},"shop/clothes|Tati":{countryCodes:["dz","fr"],tags:{brand:"Tati","brand:wikidata":"Q3516026","brand:wikipedia":"fr:Tati (entreprise)",name:"Tati",shop:"clothes"}},"shop/clothes|Terranova":{tags:{brand:"Terranova",name:"Terranova",shop:"clothes"}},"shop/clothes|Tezenis":{tags:{brand:"Tezenis","brand:wikidata":"Q28056374",name:"Tezenis",shop:"clothes"}},"shop/clothes|The Children's Place":{tags:{brand:"The Children's Place","brand:wikidata":"Q3520257","brand:wikipedia":"en:The Children's Place",name:"The Children's Place",shop:"clothes"}},"shop/clothes|The North Face":{tags:{brand:"The North Face","brand:wikidata":"Q152784","brand:wikipedia":"en:The North Face",name:"The North Face",shop:"clothes"}},"shop/clothes|The Sting":{countryCodes:["be","de","gb","nl"],tags:{brand:"The Sting","brand:wikidata":"Q2518794","brand:wikipedia":"nl:The Sting Companies",name:"The Sting",shop:"clothes"}},"shop/clothes|Timberland":{matchTags:["shop/shoes"],tags:{brand:"Timberland","brand:wikidata":"Q1539185","brand:wikipedia":"en:The Timberland Company",name:"Timberland",shop:"clothes"}},"shop/clothes|Tom Tailor":{tags:{brand:"Tom Tailor","brand:wikidata":"Q571206","brand:wikipedia":"en:Tom Tailor",name:"Tom Tailor",shop:"clothes"}},"shop/clothes|Tommy Bahama":{countryCodes:["ca","us"],tags:{brand:"Tommy Bahama","brand:wikidata":"Q3531299","brand:wikipedia":"en:Tommy Bahama",name:"Tommy Bahama",shop:"clothes"}},"shop/clothes|Tommy Hilfiger":{tags:{brand:"Tommy Hilfiger","brand:wikidata":"Q634881","brand:wikipedia":"en:Tommy Hilfiger (company)",name:"Tommy Hilfiger",shop:"clothes"}},"shop/clothes|Top Secret":{countryCodes:["fr","pl","ru"],tags:{brand:"Top Secret",name:"Top Secret",shop:"clothes"}},"shop/clothes|Topshop":{tags:{brand:"Topshop","brand:wikidata":"Q1893576","brand:wikipedia":"en:Topshop",name:"Topshop",shop:"clothes"}},"shop/clothes|Torrid":{countryCodes:["us"],tags:{brand:"Torrid","brand:wikidata":"Q7827120","brand:wikipedia":"en:Torrid (clothing retailer)",name:"Torrid",shop:"clothes"}},"shop/clothes|Triumph":{tags:{brand:"Triumph","brand:wikidata":"Q671216","brand:wikipedia":"en:Triumph International",name:"Triumph",shop:"clothes"}},"shop/clothes|Truworths":{countryCodes:["za"],tags:{brand:"Truworths","brand:wikidata":"Q24233998","brand:wikipedia":"en:Truworths",name:"Truworths",shop:"clothes"}},"shop/clothes|Ulla Popken":{tags:{brand:"Ulla Popken","brand:wikidata":"Q2475146","brand:wikipedia":"en:Ulla Popken",name:"Ulla Popken",shop:"clothes"}},"shop/clothes|Uniqlo":{tags:{brand:"Uniqlo","brand:wikidata":"Q26070","brand:wikipedia":"en:Uniqlo",name:"Uniqlo",shop:"clothes"}},"shop/clothes|United Colors of Benetton":{matchNames:["benetton"],tags:{brand:"United Colors of Benetton","brand:wikidata":"Q817139","brand:wikipedia":"en:Benetton Group",name:"United Colors of Benetton",shop:"clothes"}},"shop/clothes|Urban Outfitters":{tags:{brand:"Urban Outfitters","brand:wikidata":"Q3552193","brand:wikipedia":"en:Urban Outfitters",name:"Urban Outfitters",shop:"clothes"}},"shop/clothes|Vero Moda":{tags:{brand:"Vero Moda","brand:wikidata":"Q594721","brand:wikipedia":"en:Bestseller (company)",name:"Vero Moda",shop:"clothes"}},"shop/clothes|Victoria's Secret":{tags:{brand:"Victoria's Secret","brand:wikidata":"Q332477","brand:wikipedia":"en:Victoria's Secret",clothes:"underwear;women",name:"Victoria's Secret",shop:"clothes"}},"shop/clothes|Volcom":{tags:{brand:"Volcom","brand:wikidata":"Q2021416","brand:wikipedia":"en:Volcom",name:"Volcom",shop:"clothes"}},"shop/clothes|WE":{countryCodes:["be","ch","de","nl"],tags:{brand:"WE","brand:wikidata":"Q1987861","brand:wikipedia":"en:WE (clothing)",name:"WE",shop:"clothes"}},"shop/clothes|White House Black Market":{countryCodes:["ca","us"],tags:{brand:"White House Black Market","brand:wikidata":"Q7994858","brand:wikipedia":"en:White House Black Market",name:"White House Black Market",shop:"clothes"}},"shop/clothes|White Stuff":{countryCodes:["de","dk","gb","gg"],tags:{brand:"White Stuff","brand:wikidata":"Q7995442","brand:wikipedia":"en:White Stuff Clothing",name:"White Stuff",shop:"clothes"}},"shop/clothes|Wibra":{countryCodes:["be","nl"],tags:{brand:"Wibra","brand:wikidata":"Q943405","brand:wikipedia":"en:Wibra",name:"Wibra",shop:"clothes"}},"shop/clothes|Winners":{countryCodes:["ca","es"],tags:{brand:"Winners","brand:wikidata":"Q845257","brand:wikipedia":"en:Winners",name:"Winners",shop:"clothes"}},"shop/clothes|Wolford":{tags:{brand:"Wolford",name:"Wolford",shop:"clothes"}},"shop/clothes|Woolworths":{countryCodes:["za"],nomatch:["shop/supermarket|Woolworths"],tags:{brand:"Woolworths","brand:wikidata":"Q8033997","brand:wikipedia":"en:Woolworths Holdings Limited",name:"Woolworths",shop:"clothes"}},"shop/clothes|Yamamay":{tags:{brand:"Yamamay","brand:wikidata":"Q2599214","brand:wikipedia":"it:Yamamay",name:"Yamamay",shop:"clothes"}},"shop/clothes|Z":{nomatch:["amenity/fuel|Z"],tags:{brand:"Z",clothes:"babies;children",name:"Z",shop:"clothes"}},"shop/clothes|Zara":{tags:{brand:"Zara","brand:wikidata":"Q147662","brand:wikipedia":"en:Zara (retailer)",name:"Zara",shop:"clothes"}},"shop/clothes|Zeeman":{countryCodes:["be","de","fr","lu","nl"],tags:{brand:"Zeeman","brand:wikidata":"Q184399","brand:wikipedia":"en:Zeeman (store)",name:"Zeeman",shop:"clothes"}},"shop/clothes|Zumiez":{countryCodes:["ca","us"],tags:{brand:"Zumiez","brand:wikidata":"Q8075252","brand:wikipedia":"en:Zumiez",name:"Zumiez",shop:"clothes"}},"shop/clothes|mister*lady":{countryCodes:["at","de"],tags:{brand:"mister*lady","brand:wikidata":"Q18640136","brand:wikipedia":"de:Mister*lady",name:"mister*lady",shop:"clothes"}},"shop/clothes|rue21":{countryCodes:["us"],tags:{brand:"rue21","brand:wikidata":"Q7377762","brand:wikipedia":"en:Rue21",name:"rue21",shop:"clothes"}},"shop/clothes|s.Oliver":{countryCodes:["at","be","de","fr","hr"],tags:{brand:"s.Oliver","brand:wikidata":"Q265056","brand:wikipedia":"en:S.Oliver",name:"s.Oliver",shop:"clothes"}},"shop/clothes|Липненски":{countryCodes:["bg"],tags:{brand:"Липненски",name:"Липненски",shop:"clothes"}},"shop/clothes|Московская ярмарка":{countryCodes:["ru","ua"],tags:{brand:"Московская ярмарка",name:"Московская ярмарка",shop:"clothes"}},"shop/clothes|Смешные цены":{countryCodes:["kz","ru"],tags:{brand:"Смешные цены",name:"Смешные цены",shop:"clothes"}},"shop/clothes|Трикотаж":{countryCodes:["by","ru"],tags:{brand:"Трикотаж",name:"Трикотаж",shop:"clothes"}},"shop/clothes|しまむら":{countryCodes:["jp"],tags:{brand:"しまむら","brand:en":"Shimamura","brand:ja":"しまむら","brand:wikidata":"Q7758173","brand:wikipedia":"ja:しまむら",name:"しまむら","name:en":"Shimamura","name:ja":"しまむら",shop:"clothes"}},"shop/clothes|はるやま":{countryCodes:["jp"],tags:{brand:"はるやま","brand:en":"Haruyama","brand:ja":"はるやま","brand:wikidata":"Q11275918","brand:wikipedia":"ja:はるやま商事",name:"はるやま","name:en":"Haruyama","name:ja":"はるやま",shop:"clothes"}},"shop/clothes|コナカ":{countryCodes:["jp"],tags:{brand:"コナカ","brand:ja":"コナカ",name:"コナカ","name:ja":"コナカ",shop:"clothes"}},"shop/clothes|ユニクロ":{countryCodes:["jp"],tags:{brand:"ユニクロ","brand:en":"UNIQLO","brand:ja":"ユニクロ","brand:wikidata":"Q26070","brand:wikipedia":"en:Uniqlo",name:"ユニクロ","name:en":"UNIQLO","name:ja":"ユニクロ",shop:"clothes"}},"shop/clothes|ライトオン":{countryCodes:["jp"],tags:{brand:"ライトオン","brand:en":"Right-on","brand:ja":"ライトオン","brand:wikidata":"Q11346416","brand:wikipedia":"ja:ライトオン",name:"ライトオン","name:en":"Right-on","name:ja":"ライトオン",shop:"clothes"}},"shop/clothes|ワークマン":{countryCodes:["jp"],tags:{brand:"ワークマン","brand:en":"Workman","brand:ja":"ワークマン","brand:wikidata":"Q11351660","brand:wikipedia":"ja:ワークマン",name:"ワークマン","name:en":"Workman","name:ja":"ワークマン",shop:"clothes"}},"shop/clothes|洋服の青山":{countryCodes:["jp"],tags:{brand:"洋服の青山","brand:en":"Aoyama Tailor","brand:ja":"洋服の青山","brand:wikidata":"Q11661241","brand:wikipedia":"ja:青山商事",name:"洋服の青山","name:en":"Aoyama Tailor","name:ja":"洋服の青山",shop:"clothes"}},"shop/coffee|Nespresso":{tags:{brand:"Nespresso","brand:wikidata":"Q301301","brand:wikipedia":"en:Nespresso",name:"Nespresso",shop:"coffee"}},"shop/coffee|Tchibo":{matchTags:["shop/convenience"],tags:{brand:"Tchibo","brand:wikidata":"Q564213","brand:wikipedia":"de:Tchibo",name:"Tchibo",shop:"coffee"}},"shop/computer|DNS":{tags:{brand:"DNS",name:"DNS",shop:"computer"}},"shop/computer|PC World":{tags:{brand:"PC World","brand:wikidata":"Q7118727","brand:wikipedia":"en:PC World (retailer)",name:"PC World",shop:"computer"}},"shop/computer|ДНС":{tags:{brand:"ДНС",name:"ДНС",shop:"computer"}},"shop/confectionery|Adyar Ananda Bhavan":{countryCodes:["in"],matchTags:["amenity/restaurant"],tags:{brand:"Adyar Ananda Bhavan","brand:wikidata":"Q15178238","brand:wikipedia":"en:Adyar Ananda Bhavan",name:"Adyar Ananda Bhavan",shop:"confectionery"}},"shop/confectionery|Hemmakvall":{countryCodes:["se"],tags:{"brand:wikidata":"Q10521791","brand:wikipedia":"sv:Hemmakväll",name:"Hemmakväll",shop:"confectionery"}},"shop/confectionery|Hussel":{tags:{brand:"Hussel","brand:wikidata":"Q17123688","brand:wikipedia":"de:Hussel",name:"Hussel",shop:"confectionery"}},"shop/confectionery|Jamin":{countryCodes:["nl"],tags:{brand:"Jamin","brand:wikidata":"Q2291848","brand:wikipedia":"nl:Jamin",name:"Jamin",shop:"confectionery"}},"shop/confectionery|See's Candies":{tags:{brand:"See's Candies",name:"See's Candies",shop:"confectionery"}},"shop/confectionery|T. SN":{tags:{brand:"T. SN",name:"T. SN",shop:"confectionery"}},"shop/confectionery|Thorntons":{tags:{brand:"Thorntons","brand:wikidata":"Q683102","brand:wikipedia":"en:Thorntons",name:"Thorntons",shop:"confectionery"}},"shop/confectionery|Вацак":{countryCodes:["ua"],tags:{brand:"Вацак","brand:wikidata":"Q30966576","brand:wikipedia":"uk:Кондитерський Дім «Вацак»",name:"Вацак",shop:"confectionery"}},"shop/confectionery|シャトレーゼ":{countryCodes:["jp"],tags:{brand:"シャトレーゼ","brand:en":"Chateraise","brand:ja":"シャトレーゼ","brand:wikidata":"Q11307696","brand:wikipedia":"ja:シャトレーゼ",name:"シャトレーゼ","name:en":"Chateraise","name:ja":"シャトレーゼ",shop:"confectionery"}},"shop/confectionery|不二家":{tags:{brand:"不二家",name:"不二家",shop:"confectionery"}},"shop/convenience|24 часа":{tags:{brand:"24 часа",name:"24 часа",shop:"convenience"}},"shop/convenience|7-Eleven":{matchNames:["7-11","seven eleven"],matchTags:["shop/supermarket"],nomatch:["amenity/fuel|7-Eleven"],tags:{brand:"7-Eleven","brand:wikidata":"Q259340","brand:wikipedia":"en:7-Eleven",name:"7-Eleven",shop:"convenience"}},"shop/convenience|76":{nomatch:["amenity/fuel|76"],tags:{brand:"76","brand:wikidata":"Q1658320","brand:wikipedia":"en:76 (gas station)",name:"76",shop:"convenience"}},"shop/convenience|8 à Huit":{countryCodes:["fr"],nomatch:["shop/supermarket|8 à Huit"],tags:{brand:"8 à Huit","brand:wikidata":"Q2818601","brand:wikipedia":"fr:8 à Huit",name:"8 à Huit",shop:"convenience"}},"shop/convenience|99 Speedmart":{countryCodes:["br","my","us"],tags:{brand:"99 Speedmart","brand:wikidata":"Q62075061",name:"99 Speedmart",shop:"convenience"}},"shop/convenience|ABC~(Hawaii)":{countryCodes:["us"],matchNames:["abc stores"],nomatch:["amenity/fuel|ABC"],tags:{brand:"ABC","brand:wikidata":"Q4650251","brand:wikipedia":"en:ABC Stores (Hawaii)",name:"ABC",shop:"convenience"}},"shop/convenience|Aibė":{countryCodes:["lt","lv"],tags:{brand:"Aibė","brand:wikidata":"Q1022952","brand:wikipedia":"de:Aibė",name:"Aibė",shop:"convenience"}},"shop/convenience|Albert Heijn to go":{countryCodes:["nl"],tags:{brand:"Albert Heijn to go","brand:wikidata":"Q1653985","brand:wikipedia":"en:Albert Heijn",name:"Albert Heijn to go",shop:"convenience"}},"shop/convenience|Alfamart":{tags:{brand:"Alfamart",name:"Alfamart",shop:"convenience"}},"shop/convenience|Alfamidi":{countryCodes:["id"],tags:{brand:"Alfamidi","brand:wikidata":"Q12471462","brand:wikipedia":"id:Alfamidi",name:"Alfamidi",shop:"convenience"}},"shop/convenience|Almacén":{tags:{brand:"Almacén",name:"Almacén",shop:"convenience"}},"shop/convenience|Aral":{countryCodes:["de"],matchNames:["aral tankstelle"],matchTags:["shop/kiosk"],nomatch:["amenity/fuel|Aral"],tags:{brand:"Aral","brand:wikidata":"Q565734","brand:wikipedia":"en:Aral AG",name:"Aral",shop:"convenience"}},"shop/convenience|BP Shop":{nomatch:["amenity/fuel|BP"],tags:{brand:"BP Shop","brand:wikidata":"Q152057","brand:wikipedia":"en:BP",name:"BP Shop",shop:"convenience"}},"shop/convenience|Best-one":{countryCodes:["gb"],tags:{brand:"Best-one","brand:wikidata":"Q4896532","brand:wikipedia":"en:Best-one",name:"Best-one",shop:"convenience"}},"shop/convenience|Bonjour":{tags:{brand:"Bonjour",name:"Bonjour",shop:"convenience"}},"shop/convenience|Buc-ee's":{countryCodes:["us"],tags:{brand:"Buc-ee's","brand:wikidata":"Q4982335","brand:wikipedia":"en:Buc-ee's",name:"Buc-ee's",shop:"convenience"}},"shop/convenience|Budgens":{nomatch:["shop/supermarket|Budgens"],tags:{brand:"Budgens","brand:wikidata":"Q4985016","brand:wikipedia":"en:Budgens",name:"Budgens",shop:"convenience"}},"shop/convenience|CBA":{tags:{brand:"CBA","brand:wikidata":"Q779845","brand:wikipedia":"en:CBA (food retail)",name:"CBA",shop:"convenience"}},"shop/convenience|COOP Jednota":{countryCodes:["cz","sk"],matchNames:["jednota"],nomatch:["shop/supermarket|COOP Jednota"],tags:{brand:"COOP Jednota","brand:wikidata":"Q41629254","brand:wikipedia":"sk:COOP Jednota Slovensko",name:"COOP Jednota",shop:"convenience"}},"shop/convenience|CU":{countryCodes:["kr"],tags:{brand:"CU",name:"CU",shop:"convenience"}},"shop/convenience|Carrefour Express":{nomatch:["amenity/fuel|Carrefour","shop/supermarket|Carrefour"],tags:{brand:"Carrefour Express",name:"Carrefour Express",shop:"convenience"}},"shop/convenience|Casey's General Store":{nomatch:["amenity/fuel|Casey's General Store"],tags:{brand:"Casey's General Store",name:"Casey's General Store",shop:"convenience"}},"shop/convenience|Casino":{tags:{brand:"Casino",name:"Casino",shop:"convenience"}},"shop/convenience|Casino Shop":{countryCodes:["fr"],tags:{brand:"Casino Shop",name:"Casino Shop",shop:"convenience"}},"shop/convenience|Centra":{tags:{brand:"Centra",name:"Centra",shop:"convenience"}},"shop/convenience|Central Convenience Store":{tags:{brand:"Central Convenience Store",name:"Central Convenience Store",shop:"convenience"}},"shop/convenience|Chata Polska":{nomatch:["shop/supermarket|Chata Polska"],tags:{brand:"Chata Polska","brand:wikidata":"Q61994406",name:"Chata Polska",shop:"convenience"}},"shop/convenience|Cheers":{tags:{brand:"Cheers",name:"Cheers",shop:"convenience"}},"shop/convenience|Chevron":{nomatch:["amenity/fuel|Chevron"],tags:{brand:"Chevron",name:"Chevron",shop:"convenience"}},"shop/convenience|Circle K":{matchNames:["ok","ok-mart"],nomatch:["amenity/fuel|Circle K"],tags:{brand:"Circle K","brand:wikidata":"Q3268010","brand:wikipedia":"en:Circle K",name:"Circle K",shop:"convenience"}},"shop/convenience|Citgo":{nomatch:["amenity/fuel|Citgo"],tags:{brand:"Citgo",name:"Citgo",shop:"convenience"}},"shop/convenience|Co-op~(Canada)":{countryCodes:["ca"],nomatch:["amenity/fuel|Co-op~(Canada)","shop/convenience|Coop~(Schweiz)","shop/convenience|The Co-operative Food~(UK)","shop/supermarket|Co-op~(Canada)","shop/supermarket|Coop~(Schweiz)","shop/supermarket|The Co-operative Food~(UK)"],tags:{brand:"Federated Co-operatives","brand:wikidata":"Q5440676","brand:wikipedia":"en:Federated Co-operatives",name:"Co-op",shop:"convenience"}},"shop/convenience|CocciMarket":{countryCodes:["fr"],tags:{brand:"CocciMarket",name:"CocciMarket",operator:"Codifrance","operator:wikidata":"Q2981692","operator:wikipedia":"fr:Codifrance",shop:"convenience"}},"shop/convenience|Coles Express":{nomatch:["amenity/fuel|Coles Express"],tags:{brand:"Coles Express",name:"Coles Express",shop:"convenience"}},"shop/convenience|Coop Pronto":{countryCodes:["ch","li"],nomatch:["amenity/cafe|Pronto"],tags:{brand:"Coop Pronto","brand:wikidata":"Q1129777","brand:wikipedia":"de:Coop Mineraloel",name:"Coop Pronto",shop:"convenience"}},"shop/convenience|Coop~(Schweiz)":{countryCodes:["ch"],nomatch:["amenity/fuel|Co-op~(Canada)","shop/convenience|Co-op~(Canada)","shop/convenience|The Co-operative Food~(UK)","shop/supermarket|Co-op~(Canada)","shop/supermarket|Coop~(Schweiz)","shop/supermarket|The Co-operative Food~(UK)"],tags:{brand:"Coop","brand:wikidata":"Q432564","brand:wikipedia":"de:Coop (Schweiz)",name:"Coop",shop:"convenience"}},"shop/convenience|Costcutter":{nomatch:["shop/supermarket|Costcutter"],tags:{brand:"Costcutter","brand:wikidata":"Q5175072","brand:wikipedia":"en:Costcutter",name:"Costcutter",shop:"convenience"}},"shop/convenience|Couche-Tard":{nomatch:["amenity/fuel|Couche-Tard"],tags:{brand:"Couche-Tard",name:"Couche-Tard",shop:"convenience"}},"shop/convenience|Cumberland Farms":{nomatch:["amenity/fuel|Cumberland Farms"],tags:{brand:"Cumberland Farms",name:"Cumberland Farms",shop:"convenience"}},"shop/convenience|Daisy Mart":{countryCodes:["ca"],tags:{brand:"Daisy Mart","brand:wikidata":"Q61994934",name:"Daisy Mart",shop:"convenience"}},"shop/convenience|Delikatesy Centrum":{countryCodes:["pl"],nomatch:["shop/supermarket|Delikatesy Centrum"],tags:{brand:"Delikatesy Centrum","brand:wikidata":"Q11693824","brand:wikipedia":"pl:Delikatesy Centrum",name:"Delikatesy Centrum",shop:"convenience"}},"shop/convenience|Express":{nomatch:["shop/clothes|Express"],tags:{brand:"Express",name:"Express",shop:"convenience"}},"shop/convenience|ExtraMile":{countryCodes:["us"],tags:{brand:"ExtraMile",name:"ExtraMile",operator:"Chevron","operator:wikidata":"Q319642","operator:wikipedia":"en:Chevron Corporation",shop:"convenience"}},"shop/convenience|FamilyMart":{tags:{brand:"FamilyMart","brand:wikidata":"Q1191685","brand:wikipedia":"en:FamilyMart",name:"FamilyMart",shop:"convenience"}},"shop/convenience|Food Mart":{tags:{brand:"Food Mart",name:"Food Mart",shop:"convenience"}},"shop/convenience|Four Square":{tags:{brand:"Four Square","brand:wikidata":"Q5475558","brand:wikipedia":"en:Four Square (supermarket)",name:"Four Square",shop:"convenience"}},"shop/convenience|Franprix":{tags:{brand:"Franprix","brand:wikidata":"Q2420096","brand:wikipedia":"fr:Franprix",name:"Franprix",shop:"convenience"}},"shop/convenience|Fresh":{tags:{brand:"Fresh",name:"Fresh",shop:"convenience"}},"shop/convenience|Freshmarket":{countryCodes:["pl"],tags:{brand:"Freshmarket","brand:wikidata":"Q16546326","brand:wikipedia":"pl:Freshmarket",name:"Freshmarket",shop:"convenience"}},"shop/convenience|GS25":{tags:{brand:"GS25",name:"GS25",shop:"convenience"}},"shop/convenience|Groszek":{countryCodes:["pl"],nomatch:["shop/supermarket|Groszek"],tags:{brand:"Groszek","brand:wikidata":"Q9280965","brand:wikipedia":"pl:Groszek (sieć sklepów)",name:"Groszek",shop:"convenience"}},"shop/convenience|Hasty Market":{countryCodes:["ca"],tags:{brand:"Hasty Market","brand:wikidata":"Q58022603",name:"Hasty Market",shop:"convenience"}},"shop/convenience|Holiday":{nomatch:["amenity/fuel|Holiday"],tags:{brand:"Holiday",name:"Holiday",shop:"convenience"}},"shop/convenience|Hruška":{nomatch:["shop/supermarket|Hruška"],tags:{brand:"Hruška",name:"Hruška",shop:"convenience"}},"shop/convenience|Husky":{nomatch:["amenity/fuel|Husky"],tags:{brand:"Husky",name:"Husky",shop:"convenience"}},"shop/convenience|Indomaret":{tags:{brand:"Indomaret",name:"Indomaret",shop:"convenience"}},"shop/convenience|Indomart":{countryCodes:["id"],tags:{brand:"Indomart",name:"Indomart",shop:"convenience"}},"shop/convenience|Intermarché Contact":{countryCodes:["fr"],matchTags:["shop/supermarket"],tags:{brand:"Intermarché Contact","brand:wikidata":"Q3153200","brand:wikipedia":"fr:Intermarché",name:"Intermarché Contact",shop:"convenience"}},"shop/convenience|Irving":{nomatch:["amenity/fuel|Irving"],tags:{brand:"Irving",name:"Irving",shop:"convenience"}},"shop/convenience|Jacksons":{countryCodes:["us"],tags:{brand:"Jacksons","brand:wikidata":"Q6117880","brand:wikipedia":"en:Jacksons Stores",name:"Jacksons",shop:"convenience"}},"shop/convenience|Jiffy":{tags:{brand:"Jiffy",name:"Jiffy",shop:"convenience"}},"shop/convenience|Joker":{tags:{brand:"Joker",name:"Joker",shop:"convenience"}},"shop/convenience|K-Market":{countryCodes:["fi"],matchTags:["shop/supermarket"],tags:{brand:"K-Market","brand:wikidata":"Q11868562","brand:wikipedia":"fi:K-Market",name:"K-Market",shop:"convenience"}},"shop/convenience|Kangaroo":{nomatch:["amenity/fuel|Kangaroo"],tags:{brand:"Kangaroo",name:"Kangaroo",shop:"convenience"}},"shop/convenience|Kangaroo Express":{countryCodes:["us"],tags:{brand:"Kangaroo Express",name:"Kangaroo Express",shop:"convenience"}},"shop/convenience|Konzum":{tags:{brand:"Konzum",name:"Konzum",shop:"convenience"}},"shop/convenience|Kum & Go":{nomatch:["amenity/fuel|Kum & Go"],tags:{brand:"Kum & Go",name:"Kum & Go",shop:"convenience"}},"shop/convenience|Kwik Trip":{nomatch:["amenity/fuel|Kwik Trip"],tags:{brand:"Kwik Trip","brand:wikidata":"Q6450420","brand:wikipedia":"en:Kwik Trip",name:"Kwik Trip",shop:"convenience"}},"shop/convenience|Lawson":{tags:{brand:"Lawson","brand:wikidata":"Q1557223","brand:wikipedia":"en:Lawson (store)",name:"Lawson",shop:"convenience"}},"shop/convenience|Lewiatan":{countryCodes:["pl"],nomatch:["shop/supermarket|Lewiatan"],tags:{brand:"Lewiatan","brand:wikidata":"Q11755396","brand:wikipedia":"pl:Lewiatan (sieć handlowa)",name:"Lewiatan",shop:"convenience"}},"shop/convenience|Lifestyle Express":{countryCodes:["gb"],tags:{brand:"Lifestyle Express","brand:wikidata":"Q61994869",name:"Lifestyle Express",shop:"convenience"}},"shop/convenience|Londis":{tags:{brand:"Londis",name:"Londis",shop:"convenience"}},"shop/convenience|M&S Simply Food":{tags:{brand:"M&S Simply Food",name:"M&S Simply Food",shop:"convenience"}},"shop/convenience|Mac's":{nomatch:["amenity/fuel|Mac's"],tags:{brand:"Mac's",name:"Mac's",shop:"convenience"}},"shop/convenience|Mace":{tags:{brand:"Mace","brand:wikidata":"Q17089386","brand:wikipedia":"en:Mace (shop)",name:"Mace",shop:"convenience"}},"shop/convenience|Marathon":{nomatch:["amenity/fuel|Marathon"],tags:{brand:"Marathon","brand:wikidata":"Q458363","brand:wikipedia":"en:Marathon Petroleum",name:"Marathon",shop:"convenience"}},"shop/convenience|Maverik":{nomatch:["amenity/fuel|Maverik"],tags:{brand:"Maverik",name:"Maverik",shop:"convenience"}},"shop/convenience|Maxikiosco":{countryCodes:["ar","uy"],tags:{brand:"Maxikiosco",name:"Maxikiosco",shop:"convenience"}},"shop/convenience|Małpka Express":{countryCodes:["pl"],tags:{brand:"Małpka Express","brand:wikidata":"Q18431946","brand:wikipedia":"pl:Małpka Express",name:"Małpka Express",shop:"convenience"}},"shop/convenience|McColl's":{countryCodes:["gb"],matchTags:["shop/newsagent"],tags:{brand:"McColl's","brand:wikidata":"Q16997477","brand:wikipedia":"en:McColl's",name:"McColl's",shop:"convenience"}},"shop/convenience|Mercator":{tags:{brand:"Mercator",name:"Mercator",shop:"convenience"}},"shop/convenience|Migrolino":{countryCodes:["ch"],tags:{brand:"Migrolino","brand:wikidata":"Q56745088","brand:wikipedia":"de:Migrolino",name:"Migrolino",shop:"convenience"}},"shop/convenience|Ministop":{tags:{brand:"Ministop","brand:wikidata":"Q1038929","brand:wikipedia":"en:Ministop",name:"Ministop",shop:"convenience"}},"shop/convenience|Mlin i pekare":{countryCodes:["hr"],tags:{brand:"Mlin i pekare",name:"Mlin i pekare",shop:"convenience"}},"shop/convenience|Mobil Mart":{nomatch:["amenity/fuel|Mobil"],tags:{brand:"Mobil Mart","brand:wikidata":"Q3088656","brand:wikipedia":"en:Mobil",name:"Mobil Mart",shop:"convenience"}},"shop/convenience|Nasz Sklep":{countryCodes:["pl"],tags:{brand:"Nasz Sklep","brand:wikidata":"Q62070369",name:"Nasz Sklep",shop:"convenience"}},"shop/convenience|NewDays":{countryCodes:["jp"],matchNames:["newdays ミニ","ニューデイズ"],tags:{alt_name:"ニューデイズ",brand:"NewDays","brand:wikidata":"Q11234763","brand:wikipedia":"ja:NewDays",name:"NewDays",shop:"convenience"}},"shop/convenience|Nisa":{countryCodes:["gb"],tags:{brand:"Nisa","brand:wikidata":"Q16999069","brand:wikipedia":"en:Nisa (retailer)",name:"Nisa",shop:"convenience"}},"shop/convenience|Nisa Local":{countryCodes:["gb"],tags:{brand:"Nisa Local","brand:wikidata":"Q16999069","brand:wikipedia":"en:Nisa (retailer)",name:"Nisa Local",shop:"convenience"}},"shop/convenience|OK Market":{countryCodes:["cl"],tags:{brand:"OK Market",name:"OK Market",shop:"convenience"}},"shop/convenience|OK便利商店":{countryCodes:["cn","tw"],matchNames:["ok便利店 circle k"],tags:{brand:"OK便利商店","brand:en":"Circle K","brand:wikidata":"Q3268010","brand:wikipedia":"zh:OK便利店",name:"OK便利商店","name:en":"Circle K",shop:"convenience"}},"shop/convenience|Odido":{countryCodes:["pl"],tags:{brand:"Odido",name:"Odido",shop:"convenience"}},"shop/convenience|On the Run":{tags:{brand:"On the Run","brand:wikidata":"Q16931259","brand:wikipedia":"en:On the Run (convenience store)",name:"On the Run",shop:"convenience"}},"shop/convenience|One Stop":{tags:{brand:"One Stop",name:"One Stop",shop:"convenience"}},"shop/convenience|Orlen":{nomatch:["amenity/fuel|Orlen"],tags:{brand:"Orlen",name:"Orlen",shop:"convenience"}},"shop/convenience|Oxxo":{matchTags:["shop/supermarket"],nomatch:["amenity/fuel|Oxxo"],tags:{brand:"Oxxo","brand:wikidata":"Q1342538","brand:wikipedia":"es:Oxxo",name:"Oxxo",shop:"convenience"}},"shop/convenience|Petit Casino":{tags:{brand:"Petit Casino",name:"Petit Casino",shop:"convenience"}},"shop/convenience|Petro-Canada":{nomatch:["amenity/fuel|Petro-Canada"],tags:{brand:"Petro-Canada","brand:wikidata":"Q1208279","brand:wikipedia":"en:Petro-Canada",name:"Petro-Canada",shop:"convenience"}},"shop/convenience|Plaid Pantry":{countryCodes:["us"],tags:{brand:"Plaid Pantry","brand:wikidata":"Q7200591","brand:wikipedia":"en:Plaid Pantry",name:"Plaid Pantry",shop:"convenience"}},"shop/convenience|Premier":{countryCodes:["gb"],tags:{brand:"Premier","brand:wikidata":"Q7240340","brand:wikipedia":"en:Premier Stores",name:"Premier",shop:"convenience"}},"shop/convenience|Proxi":{matchTags:["shop/supermarket"],tags:{brand:"Proxi","brand:wikidata":"Q3408522","brand:wikipedia":"fr:Proxi",name:"Proxi",shop:"convenience"}},"shop/convenience|Proxy":{countryCodes:["fr"],tags:{brand:"Proxy",name:"Proxy",shop:"convenience"}},"shop/convenience|Quick Stop":{tags:{brand:"Quick Stop",name:"Quick Stop",shop:"convenience"}},"shop/convenience|QuickChek":{countryCodes:["us"],tags:{brand:"QuickChek",name:"QuickChek",shop:"convenience"}},"shop/convenience|QuikTrip":{nomatch:["amenity/fuel|QuikTrip"],tags:{brand:"QuikTrip",name:"QuikTrip",shop:"convenience"}},"shop/convenience|RaceTrac":{countryCodes:["us"],nomatch:["amenity/fuel|RaceTrac"],tags:{brand:"RaceTrac","brand:wikidata":"Q735942","brand:wikipedia":"en:RaceTrac",name:"RaceTrac",shop:"convenience"}},"shop/convenience|Royal Farms":{nomatch:["amenity/fuel|Royal Farms"],tags:{brand:"Royal Farms",name:"Royal Farms",shop:"convenience"}},"shop/convenience|Sainsbury's Local":{countryCodes:["gb"],matchTags:["shop/supermarket"],tags:{brand:"Sainsbury's Local","brand:wikidata":"Q13218434","brand:wikipedia":"en:Sainsbury's Local",name:"Sainsbury's Local",shop:"convenience"}},"shop/convenience|Select":{tags:{brand:"Select",name:"Select",shop:"convenience"}},"shop/convenience|Sheetz":{nomatch:["amenity/fuel|Sheetz"],tags:{brand:"Sheetz","brand:wikidata":"Q7492551","brand:wikipedia":"en:Sheetz",name:"Sheetz",shop:"convenience"}},"shop/convenience|Shell Select":{nomatch:["amenity/fuel|Shell","amenity/fuel|Shell Express"],tags:{brand:"Shell Select","brand:wikidata":"Q154950","brand:wikipedia":"en:Royal Dutch Shell",name:"Shell Select",shop:"convenience"}},"shop/convenience|Shop & Go":{tags:{brand:"Shop & Go",name:"Shop & Go",shop:"convenience"}},"shop/convenience|Siwa":{countryCodes:["fi"],tags:{brand:"Siwa","brand:wikidata":"Q11893827","brand:wikipedia":"fi:Siwa",name:"Siwa",shop:"convenience"}},"shop/convenience|Spar":{nomatch:["shop/convenience|Spar Express","shop/supermarket|Spar"],tags:{brand:"Spar","brand:wikidata":"Q610492","brand:wikipedia":"en:Spar (retailer)",name:"Spar",shop:"convenience"}},"shop/convenience|Spar Express":{matchTags:["shop/supermarket"],nomatch:["shop/convenience|Spar","shop/supermarket|Spar"],tags:{brand:"Spar","brand:wikidata":"Q610492","brand:wikipedia":"en:Spar (retailer)",name:"Spar Express",shop:"convenience"}},"shop/convenience|Speedway":{nomatch:["amenity/fuel|Speedway"],tags:{brand:"Speedway","brand:wikidata":"Q7575683","brand:wikipedia":"en:Speedway LLC",name:"Speedway",shop:"convenience"}},"shop/convenience|Społem":{nomatch:["shop/supermarket|Społem"],tags:{brand:"Społem","brand:wikidata":"Q11826043","brand:wikipedia":"pl:Powszechna Spółdzielnia Spożywców „Społem”",name:"Społem",shop:"convenience"}},"shop/convenience|Star Mart":{tags:{brand:"Star Mart","brand:wikidata":"Q61994857",name:"Star Mart",shop:"convenience"}},"shop/convenience|Stewart's":{nomatch:["amenity/fuel|Stewart's"],tags:{brand:"Stewart's",name:"Stewart's",shop:"convenience"}},"shop/convenience|Stripes":{countryCodes:["cl","us"],tags:{brand:"Stripes","brand:wikidata":"Q7624135","brand:wikipedia":"en:Stripes Convenience Stores",name:"Stripes",shop:"convenience"}},"shop/convenience|Studenac":{tags:{brand:"Studenac",name:"Studenac",shop:"convenience"}},"shop/convenience|Sunoco":{nomatch:["amenity/fuel|Sunoco"],tags:{brand:"Sunoco",name:"Sunoco",shop:"convenience"}},"shop/convenience|Supérette":{tags:{brand:"Supérette",name:"Supérette",shop:"convenience"}},"shop/convenience|Słoneczko":{countryCodes:["pl"],tags:{brand:"Słoneczko",name:"Słoneczko",shop:"convenience"}},"shop/convenience|Tesco":{nomatch:["amenity/fuel|Tesco","shop/convenience|Tesco Express"],tags:{brand:"Tesco","brand:wikidata":"Q487494","brand:wikipedia":"en:Tesco",name:"Tesco",shop:"convenience"}},"shop/convenience|Tesco Express":{nomatch:["amenity/fuel|Tesco"],tags:{brand:"Tesco Express","brand:wikidata":"Q487494","brand:wikipedia":"en:Tesco",name:"Tesco Express",shop:"convenience"}},"shop/convenience|Tesco Lotus Express":{countryCodes:["th"],tags:{brand:"Tesco Lotus Express",name:"Tesco Lotus Express",shop:"convenience"}},"shop/convenience|Texaco":{nomatch:["amenity/fuel|Texaco"],tags:{brand:"Texaco",name:"Texaco",shop:"convenience"}},"shop/convenience|The Co-operative Food~(UK)":{countryCodes:["gb"],matchNames:["coop","coop food","cooperative food","the cooperative"],nomatch:["amenity/fuel|Co-op~(Canada)","shop/convenience|Co-op~(Canada)","shop/convenience|Coop~(Schweiz)","shop/supermarket|Co-op~(Canada)","shop/supermarket|Coop~(Schweiz)","shop/supermarket|The Co-operative Food~(UK)"],tags:{brand:"The Co-operative Food","brand:wikidata":"Q3277439","brand:wikipedia":"en:Co-op Food",name:"The Co-operative Food",shop:"convenience"}},"shop/convenience|Tiendita":{tags:{brand:"Tiendita",name:"Tiendita",shop:"convenience"}},"shop/convenience|Tiger Mart":{tags:{brand:"Tiger Mart","brand:wikidata":"Q57643977",name:"Tiger Mart",shop:"convenience"}},"shop/convenience|Total":{nomatch:["amenity/fuel|Total"],tags:{brand:"Total",name:"Total",shop:"convenience"}},"shop/convenience|Turkey Hill":{nomatch:["amenity/fuel|Turkey Hill"],tags:{brand:"Turkey Hill",name:"Turkey Hill",shop:"convenience"}},"shop/convenience|Ultramar":{nomatch:["amenity/fuel|Ultramar"],tags:{brand:"Ultramar",name:"Ultramar",shop:"convenience"}},"shop/convenience|United Dairy Farmers":{countryCodes:["us"],matchNames:["udf"],matchTags:["amenity/ice_cream","shop/ice_cream"],nomatch:["amenity/fuel|United Dairy Farmers"],tags:{amenity:"ice_cream",brand:"United Dairy Farmers","brand:wikidata":"Q7887677","brand:wikipedia":"en:United Dairy Farmers",name:"United Dairy Farmers",shop:"convenience",short_name:"UDF"}},"shop/convenience|Utile":{countryCodes:["fr"],matchTags:["shop/supermarket"],nomatch:["amenity/fuel|Super U","shop/supermarket|Hyper U","shop/supermarket|Super U","shop/supermarket|U Express"],tags:{brand:"Utile","brand:wikidata":"Q2529029","brand:wikipedia":"en:Système U",name:"Utile",shop:"convenience"}},"shop/convenience|Valero":{nomatch:["amenity/fuel|Valero"],tags:{brand:"Valero",name:"Valero",shop:"convenience"}},"shop/convenience|VinMart+":{countryCodes:["vn"],tags:{brand:"VinMart","brand:wikidata":"Q60245505","brand:wikipedia":"vi:VinMart",name:"VinMart+",shop:"convenience"}},"shop/convenience|Vival":{countryCodes:["fr","pe"],matchTags:["shop/supermarket"],tags:{brand:"Vival","brand:wikidata":"Q7937525","brand:wikipedia":"en:Vival (shop)",name:"Vival",shop:"convenience"}},"shop/convenience|Volg":{tags:{brand:"Volg",name:"Volg",shop:"convenience"}},"shop/convenience|Wawa":{nomatch:["amenity/fuel|Wawa"],tags:{brand:"Wawa","brand:wikidata":"Q5936320","brand:wikipedia":"en:Wawa (company)",name:"Wawa",shop:"convenience"}},"shop/convenience|Weltladen":{countryCodes:["at","ch","de"],tags:{brand:"Weltladen","brand:wikidata":"Q1640782","brand:wikipedia":"de:Weltladen",name:"Weltladen",shop:"convenience"}},"shop/convenience|Woolworths Petrol":{countryCodes:["au"],nomatch:["amenity/fuel|Woolworths Petrol"],tags:{brand:"Caltex","brand:wikidata":"Q5023980","brand:wikipedia":"en:Caltex Woolworths",name:"Woolworths Petrol",shop:"convenience"}},"shop/convenience|abc~(Poland)":{countryCodes:["pl"],matchTags:["shop/supermarket"],nomatch:["amenity/fuel|ABC"],tags:{brand:"abc","brand:wikidata":"Q11683985","brand:wikipedia":"pl:Abc (sieć handlowa)",name:"abc",shop:"convenience"}},"shop/convenience|ampm":{tags:{brand:"ampm","brand:wikidata":"Q306960","brand:wikipedia":"en:Ampm",name:"ampm",shop:"convenience"}},"shop/convenience|miniピアゴ":{countryCodes:["jp"],matchNames:["ミニピアゴ"],tags:{brand:"miniピアゴ","brand:en":"mini Piago","brand:ja":"miniピアゴ","brand:wikidata":"Q11188499","brand:wikipedia":"ja:Miniピアゴ",name:"miniピアゴ","name:en":"mini Piago","name:ja":"miniピアゴ",shop:"convenience"}},"shop/convenience|Żabka":{countryCodes:["pl"],tags:{brand:"Żabka","brand:wikidata":"Q2589061","brand:wikipedia":"pl:Żabka (sieć sklepów)",name:"Żabka",shop:"convenience"}},"shop/convenience|АВ Daily":{countryCodes:["ru"],tags:{brand:"АВ Daily",name:"АВ Daily",shop:"convenience"}},"shop/convenience|АТБ":{tags:{brand:"АТБ",name:"АТБ",shop:"convenience"}},"shop/convenience|Абсолют":{tags:{brand:"Абсолют",name:"Абсолют",shop:"convenience"}},"shop/convenience|Августина":{countryCodes:["ru"],tags:{brand:"Августина",name:"Августина",shop:"convenience"}},"shop/convenience|Авоська":{tags:{brand:"Авоська",name:"Авоська",shop:"convenience"}},"shop/convenience|Агрокомплекс":{countryCodes:["ru"],tags:{brand:"Агрокомплекс",name:"Агрокомплекс",shop:"convenience"}},"shop/convenience|Альянс":{tags:{brand:"Альянс",name:"Альянс",shop:"convenience"}},"shop/convenience|Апельсин":{tags:{brand:"Апельсин",name:"Апельсин",shop:"convenience"}},"shop/convenience|Ассорти":{tags:{brand:"Ассорти",name:"Ассорти",shop:"convenience"}},"shop/convenience|Белорусские продукты":{countryCodes:["ru"],tags:{brand:"Белорусские продукты",name:"Белорусские продукты",shop:"convenience"}},"shop/convenience|Березка":{countryCodes:["by","kz","ru","ua"],tags:{brand:"Березка",name:"Березка",shop:"convenience"}},"shop/convenience|Береке":{countryCodes:["kg","kz"],tags:{brand:"Береке",name:"Береке",shop:"convenience"}},"shop/convenience|Берёзка":{tags:{brand:"Берёзка",name:"Берёзка",shop:"convenience"}},"shop/convenience|Бриз":{countryCodes:["by","kz","ru","ua"],tags:{brand:"Бриз",name:"Бриз",shop:"convenience"}},"shop/convenience|Валентина":{countryCodes:["by","kz","ru","ua"],tags:{brand:"Валентина",name:"Валентина",shop:"convenience"}},"shop/convenience|Везунчик":{countryCodes:["ru","ua"],tags:{brand:"Везунчик",name:"Везунчик",shop:"convenience"}},"shop/convenience|Верный":{tags:{brand:"Верный",name:"Верный",shop:"convenience"}},"shop/convenience|Весна":{countryCodes:["kz","ru","ua"],tags:{brand:"Весна",name:"Весна",shop:"convenience"}},"shop/convenience|Ветеран":{tags:{brand:"Ветеран",name:"Ветеран",shop:"convenience"}},"shop/convenience|Визит":{countryCodes:["by","kz","ru","ua"],tags:{brand:"Визит",name:"Визит",shop:"convenience"}},"shop/convenience|ВкусВилл":{countryCodes:["ru"],tags:{brand:"ВкусВилл","brand:wikidata":"Q57271676","brand:wikipedia":"ru:Вкусвилл",name:"ВкусВилл",shop:"convenience"}},"shop/convenience|Гастроном":{tags:{brand:"Гастроном",name:"Гастроном",shop:"convenience"}},"shop/convenience|Гермес":{tags:{brand:"Гермес",name:"Гермес",shop:"convenience"}},"shop/convenience|Гроздь":{nomatch:["shop/supermarketk|Гроздь"],tags:{brand:"Гроздь","brand:wikidata":"Q21638412","brand:wikipedia":"ru:Гроздь (сеть магазинов)",name:"Гроздь",shop:"convenience"}},"shop/convenience|Гурман":{tags:{brand:"Гурман",name:"Гурман",shop:"convenience"}},"shop/convenience|Доброном":{countryCodes:["by","ru"],tags:{brand:"Доброном","brand:wikidata":"Q2565040","brand:wikipedia":"be:Eurotorg",name:"Доброном",shop:"convenience"}},"shop/convenience|Добрый":{countryCodes:["by","ru"],tags:{brand:"Добрый",name:"Добрый",shop:"convenience"}},"shop/convenience|Домашний":{countryCodes:["by","ru","ua"],tags:{brand:"Домашний",name:"Домашний",shop:"convenience"}},"shop/convenience|Дружба":{countryCodes:["by","ru","ua"],tags:{brand:"Дружба",name:"Дружба",shop:"convenience"}},"shop/convenience|Елена":{tags:{brand:"Елена",name:"Елена",shop:"convenience"}},"shop/convenience|Ермолино":{countryCodes:["ru","ua"],tags:{brand:"Ермолино",name:"Ермолино",shop:"convenience"}},"shop/convenience|Ивушка":{countryCodes:["by","ru"],tags:{brand:"Ивушка",name:"Ивушка",shop:"convenience"}},"shop/convenience|КазМунайГаз":{nomatch:["amenity/fuel|КазМунайГаз"],tags:{brand:"КазМунайГаз",name:"КазМунайГаз",shop:"convenience"}},"shop/convenience|Калинка":{tags:{brand:"Калинка",name:"Калинка",shop:"convenience"}},"shop/convenience|Каштан":{countryCodes:["by","ru","ua"],tags:{brand:"Каштан",name:"Каштан",shop:"convenience"}},"shop/convenience|Квартал":{tags:{brand:"Квартал",name:"Квартал",shop:"convenience"}},"shop/convenience|Колобок":{tags:{brand:"Колобок",name:"Колобок",shop:"convenience"}},"shop/convenience|Колос":{countryCodes:["by","kz","ru","ua"],tags:{brand:"Колос",name:"Колос",shop:"convenience"}},"shop/convenience|Колосок":{countryCodes:["by","ru","ua"],tags:{brand:"Колосок",name:"Колосок",shop:"convenience"}},"shop/convenience|Кооператор":{countryCodes:["by","kz","ru","ua"],tags:{brand:"Кооператор",name:"Кооператор",shop:"convenience"}},"shop/convenience|Копеечка":{countryCodes:["by","ru","ua"],tags:{brand:"Копеечка",name:"Копеечка",shop:"convenience"}},"shop/convenience|Копейка":{countryCodes:["by","ru","ua"],tags:{brand:"Копейка","brand:en":"Kopeyka","brand:wikidata":"Q1783878","brand:wikipedia":"en:Kopeyka (supermarket)",name:"Копейка","name:en":"Kopeyka",shop:"convenience"}},"shop/convenience|Корзинка":{countryCodes:["by","kz","ru","ua"],tags:{brand:"Корзинка",name:"Корзинка",shop:"convenience"}},"shop/convenience|Кулинария":{tags:{brand:"Кулинария",name:"Кулинария",shop:"convenience"}},"shop/convenience|Лакомка":{tags:{brand:"Лакомка",name:"Лакомка",shop:"convenience"}},"shop/convenience|Ласточка":{countryCodes:["by","kz","ru","ua"],tags:{brand:"Ласточка",name:"Ласточка",shop:"convenience"}},"shop/convenience|Лидер":{tags:{brand:"Лидер",name:"Лидер",shop:"convenience"}},"shop/convenience|Лукойл":{nomatch:["amenity/fuel|Лукойл"],tags:{brand:"Лукойл",name:"Лукойл",shop:"convenience"}},"shop/convenience|Луч":{countryCodes:["by","kz","ru","ua"],tags:{brand:"Луч",name:"Луч",shop:"convenience"}},"shop/convenience|Любава":{countryCodes:["by","kz","ru","ua"],tags:{brand:"Любава",name:"Любава",shop:"convenience"}},"shop/convenience|Любимый":{countryCodes:["by","kz","ru","ua"],tags:{brand:"Любимый",name:"Любимый",shop:"convenience"}},"shop/convenience|Людмила":{countryCodes:["by","kz","ru","ua"],tags:{brand:"Людмила",name:"Людмила",shop:"convenience"}},"shop/convenience|Люкс":{tags:{brand:"Люкс",name:"Люкс",shop:"convenience"}},"shop/convenience|Магазин":{tags:{brand:"Магазин",name:"Магазин",shop:"convenience"}},"shop/convenience|Магнит":{matchNames:["магнит у дома"],nomatch:["shop/cosmetics|Магнит Косметик","shop/supermarket|Магнит"],tags:{brand:"Магнит","brand:en":"Magnit","brand:wikidata":"Q940518","brand:wikipedia":"ru:Магнит (сеть магазинов)",name:"Магнит","name:en":"Magnit",shop:"convenience"}},"shop/convenience|Мария-Ра":{tags:{brand:"Мария-Ра",name:"Мария-Ра",shop:"convenience"}},"shop/convenience|Маркет":{countryCodes:["ru","ua","uz"],tags:{brand:"Маркет",name:"Маркет",shop:"convenience"}},"shop/convenience|Маяк":{tags:{brand:"Маяк",name:"Маяк",shop:"convenience"}},"shop/convenience|Меркурий":{tags:{brand:"Меркурий",name:"Меркурий",shop:"convenience"}},"shop/convenience|Мечта":{countryCodes:["by","kz","ru"],tags:{brand:"Мечта",name:"Мечта",shop:"convenience"}},"shop/convenience|Мираж":{countryCodes:["by","kz","ru","ua"],tags:{brand:"Мираж",name:"Мираж",shop:"convenience"}},"shop/convenience|Монетка":{tags:{brand:"Монетка",name:"Монетка",shop:"convenience"}},"shop/convenience|Мрія":{countryCodes:["ua"],tags:{brand:"Мрія",name:"Мрія",shop:"convenience"}},"shop/convenience|Надежда":{countryCodes:["by","kz","ru","ua"],tags:{brand:"Надежда",name:"Надежда",shop:"convenience"}},"shop/convenience|Натали":{tags:{brand:"Натали",name:"Натали",shop:"convenience"}},"shop/convenience|Ника":{countryCodes:["by","kz","ru","ua"],tags:{brand:"Ника",name:"Ника",shop:"convenience"}},"shop/convenience|Оазис":{tags:{brand:"Оазис",name:"Оазис",shop:"convenience"}},"shop/convenience|Околица":{countryCodes:["by","kz","ru","ua"],tags:{brand:"Околица",name:"Околица",shop:"convenience"}},"shop/convenience|Олимп":{countryCodes:["by","kz","ru","ua"],tags:{brand:"Олимп",name:"Олимп",shop:"convenience"}},"shop/convenience|Парус":{countryCodes:["by","kz","ru","ua"],tags:{brand:"Парус",name:"Парус",shop:"convenience"}},"shop/convenience|Пеликан":{countryCodes:["by","ru"],tags:{brand:"Пеликан",name:"Пеликан",shop:"convenience"}},"shop/convenience|Подсолнух":{countryCodes:["by","ru"],tags:{brand:"Подсолнух",name:"Подсолнух",shop:"convenience"}},"shop/convenience|Престиж":{countryCodes:["by","kz","ru","ua"],tags:{brand:"Престиж",name:"Престиж",shop:"convenience"}},"shop/convenience|Радуга":{tags:{brand:"Радуга",name:"Радуга",shop:"convenience"}},"shop/convenience|Рассвет":{countryCodes:["by","kz","ru","ua","uz"],tags:{brand:"Рассвет",name:"Рассвет",shop:"convenience"}},"shop/convenience|Родник":{countryCodes:["by","kz","ru"],tags:{brand:"Родник",name:"Родник",shop:"convenience"}},"shop/convenience|Родны кут":{countryCodes:["by"],tags:{brand:"Родны кут",name:"Родны кут",shop:"convenience"}},"shop/convenience|Ромашка":{tags:{brand:"Ромашка",name:"Ромашка",shop:"convenience"}},"shop/convenience|Росинка":{countryCodes:["by","kz","ru","ua"],tags:{brand:"Росинка",name:"Росинка",shop:"convenience"}},"shop/convenience|Русь":{countryCodes:["kz","ru","ua"],tags:{brand:"Русь",name:"Русь",shop:"convenience"}},"shop/convenience|Светлана":{countryCodes:["by","kz","ru","ua"],tags:{brand:"Светлана",name:"Светлана",shop:"convenience"}},"shop/convenience|Сельпо":{countryCodes:["kz","ru"],tags:{brand:"Сельпо","brand:wikidata":"Q4419434","brand:wikipedia":"ru:Сильпо",name:"Сельпо",shop:"convenience"}},"shop/convenience|Сказка":{tags:{brand:"Сказка",name:"Сказка",shop:"convenience"}},"shop/convenience|Смак":{tags:{brand:"Смак",name:"Смак",shop:"convenience"}},"shop/convenience|Солнечный":{countryCodes:["by","ru","ua"],tags:{brand:"Солнечный",name:"Солнечный",shop:"convenience"}},"shop/convenience|Солнышко":{countryCodes:["kz","ru","ua"],tags:{brand:"Солнышко",name:"Солнышко",shop:"convenience"}},"shop/convenience|Спутник":{countryCodes:["by","ru","ua"],tags:{brand:"Спутник",name:"Спутник",shop:"convenience"}},"shop/convenience|Суши Wok":{tags:{brand:"Суши Wok",name:"Суши Wok",shop:"convenience"}},"shop/convenience|Татьяна":{countryCodes:["by","kz","ru","ua"],tags:{brand:"Татьяна",name:"Татьяна",shop:"convenience"}},"shop/convenience|Тройка":{countryCodes:["kz","ru","ua"],tags:{brand:"Тройка",name:"Тройка",shop:"convenience"}},"shop/convenience|У Палыча":{countryCodes:["ru"],tags:{brand:"У Палыча",name:"У Палыча",shop:"convenience"}},"shop/convenience|Фаворит":{tags:{brand:"Фаворит",name:"Фаворит",shop:"convenience"}},"shop/convenience|Фасоль":{countryCodes:["ru","ua"],tags:{brand:"Фасоль",name:"Фасоль",shop:"convenience"}},"shop/convenience|Фортуна":{tags:{brand:"Фортуна",name:"Фортуна",shop:"convenience"}},"shop/convenience|Хороший":{countryCodes:["by","kz","ru","ua"],tags:{brand:"Хороший",name:"Хороший",shop:"convenience"}},"shop/convenience|Хуторок":{tags:{brand:"Хуторок",name:"Хуторок",shop:"convenience"}},"shop/convenience|Центральный":{countryCodes:["by","kz","ru","ua"],tags:{brand:"Центральный",name:"Центральный",shop:"convenience"}},"shop/convenience|Чайка":{countryCodes:["by","kz","ru","ua"],tags:{brand:"Чайка",name:"Чайка",shop:"convenience"}},"shop/convenience|Шанс":{countryCodes:["by","kz","ru","ua"],tags:{brand:"Шанс",name:"Шанс",shop:"convenience"}},"shop/convenience|Эдем":{countryCodes:["by","ru","ua"],tags:{brand:"Эдем",name:"Эдем",shop:"convenience"}},"shop/convenience|Эконом":{countryCodes:["by","kz","ru","ua"],tags:{brand:"Эконом",name:"Эконом",shop:"convenience"}},"shop/convenience|Юбилейный":{countryCodes:["by","kz","ru"],tags:{brand:"Юбилейный",name:"Юбилейный",shop:"convenience"}},"shop/convenience|Южный":{countryCodes:["by","kz","ru","ua"],tags:{brand:"Южный",name:"Южный",shop:"convenience"}},"shop/convenience|Ярче":{countryCodes:["ru"],tags:{brand:"Ярче",name:"Ярче",shop:"convenience"}},"shop/convenience|アンスリー":{countryCodes:["jp"],tags:{brand:"アンスリー","brand:en":"Ansuri","brand:ja":"アンスリー","brand:wikidata":"Q17192555","brand:wikipedia":"ja:アンスリー",name:"アンスリー","name:en":"Ansuri","name:ja":"アンスリー",shop:"convenience"}},"shop/convenience|サンクス":{countryCodes:["jp"],tags:{brand:"サンクス","brand:en":"Sunkus","brand:ja":"サンクス","brand:wikidata":"Q16141064","brand:wikipedia":"ja:サークルKサンクス",name:"サンクス","name:en":"Sunkus","name:ja":"サンクス",shop:"convenience"}},"shop/convenience|サークルK":{countryCodes:["jp"],tags:{brand:"サークルK","brand:en":"Circle K","brand:ja":"サークルK","brand:wikidata":"Q3268010","brand:wikipedia":"en:Circle K",name:"サークルK","name:en":"Circle K","name:ja":"サークルK",shop:"convenience"}},"shop/convenience|スリーエフ":{countryCodes:["jp"],tags:{brand:"スリーエフ","brand:en":"Three F","brand:ja":"スリーエフ","brand:wikidata":"Q11313419","brand:wikipedia":"ja:スリーエフ",name:"スリーエフ","name:en":"Three F","name:ja":"スリーエフ",shop:"convenience"}},"shop/convenience|セイコーマート":{countryCodes:["jp"],tags:{brand:"セイコーマート","brand:en":"Seicomart","brand:ja":"セイコーマート","brand:wikidata":"Q11314123","brand:wikipedia":"ja:セイコーマート",name:"セイコーマート","name:en":"Seicomart","name:ja":"セイコーマート",shop:"convenience"}},"shop/convenience|セブン-イレブン":{countryCodes:["jp"],matchNames:["セブンイレブン(7-11)","セブンイレブン(seven-eleven)"],tags:{brand:"セブン-イレブン","brand:en":"7-Eleven","brand:ja":"セブン-イレブン","brand:wikidata":"Q259340","brand:wikipedia":"en:7-Eleven",name:"セブン-イレブン","name:en":"7-Eleven","name:ja":"セブン-イレブン","official_name:en":"Seven-Eleven",operator:"株式会社セブン&アイ・ホールディングス","operator:en":"Seven & I Holdings Co., Ltd.","operator:wikidata":"Q639447","operator:wikipedia":"en:Seven & I Holdings Co.",shop:"convenience"}},"shop/convenience|セーブオン":{countryCodes:["jp"],tags:{brand:"セーブオン","brand:en":"Save On","brand:ja":"セーブオン","brand:wikidata":"Q11314868","brand:wikipedia":"ja:セーブオン",name:"セーブオン","name:en":"Save On","name:ja":"セーブオン",shop:"convenience"}},"shop/convenience|デイリーヤマザキ":{countryCodes:["jp"],tags:{brand:"デイリーヤマザキ","brand:en":"Daily Yamazaki","brand:ja":"デイリーヤマザキ","brand:wikidata":"Q5209392","brand:wikipedia":"en:Daily Yamazaki",name:"デイリーヤマザキ","name:en":"Daily Yamazaki","name:ja":"デイリーヤマザキ",shop:"convenience"}},"shop/convenience|ナチュラルローソン":{countryCodes:["jp"],tags:{brand:"ナチュラルローソン","brand:en":"NATURAL LAWSON","brand:ja":"ナチュラルローソン","brand:wikidata":"Q11323850","brand:wikipedia":"ja:ナチュラルローソン",name:"ナチュラルローソン","name:en":"Natural Lawson","name:ja":"ナチュラルローソン",shop:"convenience"}},"shop/convenience|ファミリーマート":{countryCodes:["jp"],tags:{brand:"ファミリーマート","brand:en":"FamilyMart","brand:ja":"ファミリーマート","brand:wikidata":"Q1191685","brand:wikipedia":"en:FamilyMart",name:"ファミリーマート","name:en":"FamilyMart","name:ja":"ファミリーマート",shop:"convenience"}},"shop/convenience|ポプラ":{countryCodes:["jp"],tags:{brand:"ポプラ","brand:en":"Poplar","brand:ja":"ポプラ","brand:wikidata":"Q7229380","brand:wikipedia":"ja:ポプラ (コンビニエンスストア)",name:"ポプラ","name:en":"Poplar","name:ja":"ポプラ",shop:"convenience"}},"shop/convenience|ミニストップ":{countryCodes:["jp"],tags:{brand:"ミニストップ","brand:en":"Ministop","brand:ja":"ミニストップ","brand:wikidata":"Q1038929","brand:wikipedia":"ja:ミニストップ",name:"ミニストップ","name:en":"Ministop","name:ja":"ミニストップ",shop:"convenience"}},"shop/convenience|ヤマザキショップ":{countryCodes:["jp"],tags:{brand:"ヤマザキショップ","brand:ja":"ヤマザキショップ","brand:wikidata":"Q11345131","brand:wikipedia":"ja:ヤマザキショップ",name:"ヤマザキショップ","name:en":"Yamazaki Shop","name:ja":"ヤマザキショップ",shop:"convenience"}},"shop/convenience|ローソン":{countryCodes:["jp"],matchNames:["ローソン"],tags:{brand:"ローソン","brand:en":"LAWSON","brand:ja":"ローソン","brand:wikidata":"Q1557223","brand:wikipedia":"ja:ローソン",name:"ローソン","name:en":"Lawson","name:ja":"ローソン",shop:"convenience"}},"shop/convenience|ローソンストア100":{countryCodes:["jp"],tags:{brand:"ローソンストア100","brand:en":"LAWSON STORE 100","brand:ja":"ローソンストア100","brand:wikidata":"Q11350960","brand:wikipedia":"ja:ローソンストア100",name:"ローソンストア100","name:en":"Lawson Store 100","name:ja":"ローソンストア100",shop:"convenience"}},"shop/convenience|ローソン・スリーエフ":{countryCodes:["jp"],matchNames:["lawson+スリーエフ","ローソン・スリーエフ"],tags:{brand:"ローソン・スリーエフ","brand:en":"LAWSON・Three F","brand:ja":"ローソン・スリーエフ","brand:wikidata":"Q24866804","brand:wikipedia":"ja:ローソン・スリーエフ",name:"ローソン・スリーエフ","name:en":"Lawson・Three F","name:ja":"ローソン・スリーエフ",operator:"株式会社エル・ティーエフ","operator:en":"L・TF Co., Ltd.",shop:"convenience"}},"shop/convenience|全家":{countryCodes:["cn","tw"],tags:{brand:"全家","brand:en":"FamilyMart","brand:wikidata":"Q1191685","brand:wikipedia":"en:FamilyMart",name:"全家","name:en":"FamilyMart",shop:"convenience"}},"shop/convenience|全家便利商店":{countryCodes:["tw"],tags:{brand:"全家便利商店","brand:wikidata":"Q10891564","brand:wikipedia":"zh:全家便利商店",name:"全家便利商店",shop:"convenience"}},"shop/convenience|萊爾富":{countryCodes:["tw"],tags:{brand:"萊爾富","brand:wikidata":"Q11326216","brand:wikipedia":"zh:萊爾富",name:"萊爾富",shop:"convenience"}},"shop/convenience|미니스톱":{countryCodes:["kr"],tags:{brand:"미니스톱","brand:ko":"미니스톱",name:"미니스톱","name:ko":"미니스톱",shop:"convenience"}},"shop/convenience|세븐일레븐":{countryCodes:["kr"],tags:{brand:"세븐일레븐","brand:en":"7-Eleven","brand:ko":"세븐일레븐","brand:wikidata":"Q259340","brand:wikipedia":"en:7-Eleven",name:"세븐일레븐","name:en":"7-Eleven","name:ko":"세븐일레븐",shop:"convenience"}},"shop/copyshop|Epicier":{tags:{brand:"Epicier",name:"Epicier",shop:"copyshop"}},"shop/copyshop|FedEx Office":{countryCodes:["us"],matchNames:["fedex office print and ship center"],matchTags:["amenity/post_office"],tags:{brand:"FedEx Office","brand:wikidata":"Q474379","brand:wikipedia":"en:FedEx Office",name:"FedEx Office",shop:"copyshop"}},"shop/copyshop|Photocopie":{tags:{brand:"Photocopie",name:"Photocopie",shop:"copyshop"}},"shop/cosmetics|Eva":{countryCodes:["ru","ua"],tags:{brand:"Eva",name:"Eva",shop:"cosmetics"}},"shop/cosmetics|KIKO Milano":{countryCodes:["be","fr","gb","nl"],matchNames:["kiko"],tags:{brand:"KIKO Milano","brand:wikidata":"Q3812045","brand:wikipedia":"it:KIKO",name:"KIKO Milano",shop:"cosmetics"}},"shop/cosmetics|Kiehl's":{countryCodes:["ca","us"],matchNames:["kiehl's since 1851"],tags:{brand:"Kiehl's","brand:wikidata":"Q3196447","brand:wikipedia":"en:Kiehl's",name:"Kiehl's",shop:"cosmetics"}},"shop/cosmetics|L'Occitane":{matchNames:["l'occitane en provence"],tags:{brand:"L'Occitane","brand:wikidata":"Q1880676","brand:wikipedia":"en:L'Occitane en Provence",name:"L'Occitane",shop:"cosmetics"}},"shop/cosmetics|Lush":{tags:{brand:"Lush","brand:wikidata":"Q1585448","brand:wikipedia":"en:Lush (company)",name:"Lush",shop:"cosmetics"}},"shop/cosmetics|MAC Cosmetics":{countryCodes:["ca","de","us"],matchNames:["mac"],tags:{brand:"MAC Cosmetics","brand:wikidata":"Q2624442","brand:wikipedia":"en:MAC Cosmetics",name:"MAC Cosmetics",shop:"cosmetics",short_name:"M·A·C"}},"shop/cosmetics|Mixit":{countryCodes:["by","kz","ru"],tags:{brand:"Mixit",name:"Mixit",shop:"cosmetics"}},"shop/cosmetics|Nocibé":{countryCodes:["fr"],tags:{brand:"Nocibé","brand:wikidata":"Q3342592","brand:wikipedia":"fr:Nocibé",name:"Nocibé",shop:"cosmetics"}},"shop/cosmetics|Origins":{countryCodes:["us"],tags:{brand:"Origins","brand:wikidata":"Q6643229","brand:wikipedia":"en:Origins (cosmetics)",name:"Origins",shop:"cosmetics"}},"shop/cosmetics|Rituals":{tags:{brand:"Rituals",name:"Rituals",shop:"cosmetics"}},"shop/cosmetics|Sephora":{tags:{brand:"Sephora","brand:wikidata":"Q2408041","brand:wikipedia":"en:Sephora",name:"Sephora",shop:"cosmetics"}},"shop/cosmetics|The Body Shop":{matchTags:["shop/beauty","shop/chemist"],tags:{brand:"The Body Shop","brand:wikidata":"Q837851","brand:wikipedia":"en:The Body Shop",name:"The Body Shop",shop:"cosmetics"}},"shop/cosmetics|Vente de Cosmétique":{countryCodes:["ci"],tags:{brand:"Vente de Cosmétique",name:"Vente de Cosmétique",shop:"cosmetics"}},"shop/cosmetics|Л'Этуаль":{countryCodes:["ru"],tags:{brand:"Л'Этуаль","brand:wikidata":"Q18400706","brand:wikipedia":"ru:Л’Этуаль",name:"Л'Этуаль",shop:"cosmetics"}},"shop/cosmetics|Магнит Косметик":{countryCodes:["ru"],matchTags:["shop/chemist"],nomatch:["shop/convenience|Магнит","shop/supermarket|Магнит"],tags:{brand:"Магнит Косметик","brand:en":"Magnit Cosmetics","brand:wikidata":"Q940518","brand:wikipedia":"ru:Магнит (сеть магазинов)",name:"Магнит Косметик","name:en":"Magnit Cosmetics",shop:"cosmetics"}},"shop/cosmetics|Подружка":{countryCodes:["ru","ua"],tags:{brand:"Подружка",name:"Подружка",shop:"cosmetics"}},"shop/cosmetics|Чистый дом":{countryCodes:["ru","ua"],tags:{brand:"Чистый дом",name:"Чистый дом",shop:"cosmetics"}},"shop/country_store|Atwoods":{countryCodes:["us"],tags:{brand:"Atwoods","brand:wikidata":"Q4818874","brand:wikipedia":"en:Atwoods",name:"Atwoods",shop:"country_store"}},"shop/country_store|Blain's Farm & Fleet":{countryCodes:["us"],matchTags:["shop/department_store"],tags:{brand:"Blain's Farm & Fleet","brand:wikidata":"Q4923906","brand:wikipedia":"en:Blain's Farm & Fleet",name:"Blain's Farm & Fleet",shop:"country_store"}},"shop/country_store|Bomgaars":{countryCodes:["us"],tags:{brand:"Bomgaars","brand:wikidata":"Q22059070","brand:wikipedia":"en:Bomgaars",name:"Bomgaars",shop:"country_store"}},"shop/country_store|Fleet Farm":{countryCodes:["us"],matchNames:["mills fleet farm"],tags:{brand:"Fleet Farm","brand:wikidata":"Q6859973","brand:wikipedia":"en:Fleet Farm",name:"Fleet Farm",shop:"country_store"}},"shop/country_store|Grange Co-op":{countryCodes:["us"],tags:{brand:"Grange Co-op","brand:wikidata":"Q5595639","brand:wikipedia":"en:Grange Cooperative",name:"Grange Co-op",shop:"country_store"}},"shop/country_store|Home of Economy":{countryCodes:["us"],tags:{brand:"Home of Economy","brand:wikidata":"Q5889100","brand:wikipedia":"en:Home of Economy",name:"Home of Economy",shop:"country_store"}},"shop/country_store|Norbys Farm Fleet":{countryCodes:["us"],tags:{brand:"Norbys Farm Fleet","brand:wikidata":"Q7050461","brand:wikipedia":"en:Norby's Farm Fleet",name:"Norbys Farm Fleet",shop:"country_store"}},"shop/country_store|Orscheln Farm & Home":{countryCodes:["us"],tags:{brand:"Orscheln Farm & Home","brand:wikidata":"Q22060331","brand:wikipedia":"en:Orscheln Farm & Home",name:"Orscheln Farm & Home",shop:"country_store"}},"shop/country_store|Peavey Mart":{countryCodes:["ca"],tags:{brand:"Peavey Mart","brand:wikidata":"Q7158483","brand:wikipedia":"en:Peavey Mart",name:"Peavey Mart",shop:"country_store"}},"shop/country_store|Rural King":{countryCodes:["us"],tags:{brand:"Rural King","brand:wikidata":"Q7380525","brand:wikipedia":"en:Rural King",name:"Rural King",shop:"country_store"}},"shop/country_store|TSC Stores":{countryCodes:["ca"],tags:{brand:"TSC Stores","brand:wikidata":"Q62720230",name:"TSC Stores",shop:"country_store"}},"shop/country_store|Theisen's":{countryCodes:["us"],tags:{brand:"Theisen's","brand:wikidata":"Q7777850","brand:wikipedia":"en:Theisen's",name:"Theisen's",shop:"country_store"}},"shop/country_store|Tractor Supply Company":{countryCodes:["us"],tags:{brand:"Tractor Supply Company","brand:wikidata":"Q15109925","brand:wikipedia":"en:Tractor Supply Company",name:"Tractor Supply Company",shop:"country_store"}},"shop/country_store|Wynnstay":{countryCodes:["gb"],tags:{brand:"Wynnstay","brand:wikidata":"Q63016351",name:"Wynnstay",shop:"country_store"}},"shop/craft|Hobby Lobby":{countryCodes:["in","us"],tags:{brand:"Hobby Lobby","brand:wikidata":"Q5874938","brand:wikipedia":"en:Hobby Lobby",name:"Hobby Lobby",shop:"craft"}},"shop/craft|Hobbycraft":{countryCodes:["gb"],matchTags:["shop/art"],tags:{brand:"Hobbycraft","brand:wikidata":"Q16984508","brand:wikipedia":"en:Hobbycraft",name:"Hobbycraft",shop:"craft"}},"shop/craft|Jo-Ann":{countryCodes:["us"],tags:{brand:"Jo-Ann","brand:wikidata":"Q6203968","brand:wikipedia":"en:Jo-Ann Stores",name:"Jo-Ann",shop:"craft"}},"shop/craft|Michaels":{countryCodes:["ca","us"],tags:{brand:"Michaels","brand:wikidata":"Q6835667","brand:wikipedia":"en:Michaels",name:"Michaels",shop:"craft"}},"shop/deli|ほっともっと":{countryCodes:["jp"],nomatch:["amenity/fast_food|ほっともっと"],tags:{brand:"ほっともっと","brand:en":"Hotto Motto","brand:ja":"ほっともっと","brand:wikidata":"Q10850949","brand:wikipedia":"ja:ほっともっと",name:"ほっともっと","name:en":"Hotto Motto","name:ja":"ほっともっと",shop:"deli"}},"shop/deli|京樽":{countryCodes:["jp"],matchTags:["amenity/fast_food"],tags:{brand:"京樽","brand:en":"Kyotaru","brand:ja":"京樽","brand:wikidata":"Q11374503","brand:wikipedia":"ja:京樽",name:"京樽","name:en":"Kyotaru","name:ja":"京樽",shop:"deli"}},"shop/department_store|Barneys New York":{countryCodes:["us"],matchNames:["barneys"],tags:{brand:"Barneys New York","brand:wikidata":"Q59465","brand:wikipedia":"en:Barneys New York",name:"Barneys New York",shop:"department_store"}},"shop/department_store|Belk":{countryCodes:["us"],tags:{brand:"Belk","brand:wikidata":"Q127428","brand:wikipedia":"en:Belk",name:"Belk",shop:"department_store"}},"shop/department_store|Bi-Mart":{countryCodes:["us"],tags:{brand:"Bi-Mart","brand:wikidata":"Q4902331","brand:wikipedia":"en:Bi-Mart",name:"Bi-Mart",shop:"department_store"}},"shop/department_store|Big Lots":{countryCodes:["us"],matchTags:["shop/variety_store"],tags:{brand:"Big Lots","brand:wikidata":"Q4905973","brand:wikipedia":"en:Big Lots",name:"Big Lots",shop:"department_store"}},"shop/department_store|Big W":{countryCodes:["au"],tags:{brand:"Big W","brand:wikidata":"Q4906646","brand:wikipedia":"en:Big W",name:"Big W",shop:"department_store"}},"shop/department_store|Canadian Tire":{countryCodes:["ca"],matchTags:["shop/doityourself"],nomatch:["amenity/fuel|Canadian Tire"],tags:{brand:"Canadian Tire","brand:wikidata":"Q1032400","brand:wikipedia":"en:Canadian Tire",name:"Canadian Tire",shop:"department_store"}},"shop/department_store|Casas Bahia":{countryCodes:["br"],tags:{brand:"Casas Bahia","brand:wikidata":"Q5048048","brand:wikipedia":"en:Casas Bahia",name:"Casas Bahia",shop:"department_store"}},"shop/department_store|Century 21":{countryCodes:["us"],matchNames:["c21"],tags:{brand:"Century 21","brand:wikidata":"Q5063125","brand:wikipedia":"en:Century 21 (department store)",name:"Century 21",shop:"department_store"}},"shop/department_store|Coppel":{tags:{brand:"Coppel","brand:wikidata":"Q2497795","brand:wikipedia":"en:Coppel",name:"Coppel",shop:"department_store"}},"shop/department_store|Debenhams":{tags:{brand:"Debenhams","brand:wikidata":"Q1181484","brand:wikipedia":"en:Debenhams",name:"Debenhams",shop:"department_store"}},"shop/department_store|Dillard's":{countryCodes:["us"],tags:{brand:"Dillard's","brand:wikidata":"Q844805","brand:wikipedia":"en:Dillard's",name:"Dillard's",shop:"department_store"}},"shop/department_store|El Corte Inglés":{countryCodes:["es"],tags:{brand:"El Corte Inglés","brand:wikidata":"Q623133","brand:wikipedia":"en:El Corte Inglés",name:"El Corte Inglés",shop:"department_store"}},"shop/department_store|Falabella":{matchNames:["saga falabella"],nomatch:["amenity/bank|Banco Falabella"],tags:{brand:"Falabella","brand:wikidata":"Q5135229","brand:wikipedia":"en:Falabella (retail store)",name:"Falabella",shop:"department_store"}},"shop/department_store|Galeria Kaufhof":{countryCodes:["de"],tags:{brand:"Galeria Kaufhof","brand:wikidata":"Q322598","brand:wikipedia":"en:Galeria Kaufhof",name:"Galeria Kaufhof",shop:"department_store"}},"shop/department_store|Giant Tiger":{countryCodes:["ca"],tags:{brand:"Giant Tiger","brand:wikidata":"Q5558429","brand:wikipedia":"en:Giant Tiger",name:"Giant Tiger",shop:"department_store"}},"shop/department_store|Gordmans":{tags:{brand:"Gordmans","brand:wikidata":"Q5584725","brand:wikipedia":"en:Gordmans",name:"Gordmans",shop:"department_store"}},"shop/department_store|HEMA":{tags:{brand:"HEMA","brand:wikidata":"Q903805","brand:wikipedia":"en:HEMA (store)",name:"HEMA",shop:"department_store"}},"shop/department_store|Harvey Norman":{tags:{brand:"Harvey Norman","brand:wikidata":"Q4040441","brand:wikipedia":"en:Harvey Norman",name:"Harvey Norman",shop:"department_store"}},"shop/department_store|Havan":{countryCodes:["br"],tags:{brand:"Havan","brand:wikidata":"Q61968827",name:"Havan",shop:"department_store"}},"shop/department_store|JCPenney":{countryCodes:["us"],tags:{brand:"JCPenney","brand:wikidata":"Q920037","brand:wikipedia":"en:J. C. Penney",name:"JCPenney",shop:"department_store"}},"shop/department_store|John Lewis":{countryCodes:["gb"],tags:{brand:"John Lewis","brand:wikidata":"Q1918981","brand:wikipedia":"en:John Lewis & Partners",name:"John Lewis",shop:"department_store"}},"shop/department_store|Karstadt":{countryCodes:["de"],tags:{brand:"Karstadt","brand:wikidata":"Q182910","brand:wikipedia":"en:Karstadt",name:"Karstadt",shop:"department_store"}},"shop/department_store|Kmart~(Australia)":{countryCodes:["au"],matchTags:["shop/supermarket"],nomatch:["shop/department_store|Kmart~(USA)"],tags:{brand:"Kmart","brand:wikidata":"Q6421682","brand:wikipedia":"en:Kmart Australia",name:"Kmart",shop:"department_store"}},"shop/department_store|Kmart~(USA)":{countryCodes:["us"],matchTags:["shop/supermarket"],nomatch:["shop/department_store|Kmart~(Australia)"],tags:{brand:"Kmart","brand:wikidata":"Q1753080","brand:wikipedia":"en:Kmart",name:"Kmart",shop:"department_store"}},"shop/department_store|Kohl's":{countryCodes:["us"],matchTags:["shop/clothes"],tags:{brand:"Kohl's","brand:wikidata":"Q967265","brand:wikipedia":"en:Kohl's",name:"Kohl's",shop:"department_store"}},"shop/department_store|Lojas Americanas":{countryCodes:["br"],tags:{brand:"Lojas Americanas","brand:wikidata":"Q3064093","brand:wikipedia":"en:Lojas Americanas",name:"Lojas Americanas",shop:"department_store"}},"shop/department_store|Lord & Taylor":{countryCodes:["us"],matchNames:["lord and taylor"],tags:{brand:"Lord & Taylor","brand:wikidata":"Q2749082","brand:wikipedia":"en:Lord & Taylor",name:"Lord & Taylor",shop:"department_store"}},"shop/department_store|Lotte Department Store":{matchNames:["lotte"],tags:{brand:"Lotte Department Store","brand:wikidata":"Q489905","brand:wikipedia":"en:Lotte Department Store",name:"Lotte Department Store",shop:"department_store"}},"shop/department_store|Macy's":{tags:{brand:"Macy's","brand:wikidata":"Q629269","brand:wikipedia":"en:Macy's",name:"Macy's",shop:"department_store"}},"shop/department_store|Marks & Spencer":{tags:{brand:"Marks & Spencer","brand:wikidata":"Q714491","brand:wikipedia":"en:Marks & Spencer",name:"Marks & Spencer",shop:"department_store"}},"shop/department_store|Marshalls":{matchTags:["shop/clothes"],tags:{brand:"Marshalls","brand:wikidata":"Q15903261","brand:wikipedia":"en:Marshalls",name:"Marshalls",shop:"department_store"}},"shop/department_store|Myer":{countryCodes:["au"],tags:{brand:"Myer","brand:wikidata":"Q1110323","brand:wikipedia":"en:Myer",name:"Myer",shop:"department_store"}},"shop/department_store|Neiman Marcus":{countryCodes:["us"],tags:{brand:"Neiman Marcus","brand:wikidata":"Q743497","brand:wikipedia":"en:Neiman Marcus",name:"Neiman Marcus",shop:"department_store"}},"shop/department_store|Nordstrom":{tags:{brand:"Nordstrom","brand:wikidata":"Q174310","brand:wikipedia":"en:Nordstrom",name:"Nordstrom",shop:"department_store"}},"shop/department_store|Oechsle":{countryCodes:["pe"],tags:{brand:"Oechsle","brand:wikidata":"Q6049096","brand:wikipedia":"es:Oechsle",name:"Oechsle",shop:"department_store"}},"shop/department_store|París":{countryCodes:["cl","pe"],matchTags:["shop/clothes"],tags:{brand:"París","brand:wikidata":"Q20812805","brand:wikipedia":"en:París (retail store)",name:"París",operator:"Cencosud","operator:wikidata":"Q1053372","operator:wikipedia":"en:Cencosud",shop:"department_store"}},"shop/department_store|Ripley":{tags:{brand:"Ripley","brand:wikidata":"Q3433040","brand:wikipedia":"en:Ripley S.A.",name:"Ripley",shop:"department_store"}},"shop/department_store|Saks Fifth Avenue":{tags:{brand:"Saks Fifth Avenue","brand:wikidata":"Q2723882","brand:wikipedia":"en:Saks Fifth Avenue",name:"Saks Fifth Avenue",shop:"department_store"}},"shop/department_store|Saks Off 5th":{tags:{brand:"Saks Off 5th","brand:wikidata":"Q2723882","brand:wikipedia":"en:Saks Fifth Avenue",name:"Saks Off 5th",shop:"department_store"}},"shop/department_store|Sears":{tags:{brand:"Sears","brand:wikidata":"Q6499202","brand:wikipedia":"en:Sears",name:"Sears",shop:"department_store"}},"shop/department_store|Shopko":{tags:{brand:"Shopko","brand:wikidata":"Q7501155","brand:wikipedia":"en:Shopko",name:"Shopko",shop:"department_store"}},"shop/department_store|Stein Mart":{matchTags:["shop/clothes"],tags:{brand:"Stein Mart","brand:wikidata":"Q7606770","brand:wikipedia":"en:Stein Mart",name:"Stein Mart",shop:"department_store"}},"shop/department_store|Target~(Australia)":{countryCodes:["au"],matchTags:["shop/supermarket"],nomatch:["shop/department_store|Target~(USA)"],tags:{brand:"Target","brand:wikidata":"Q7685854","brand:wikipedia":"en:Target Australia",name:"Target",shop:"department_store"}},"shop/department_store|Target~(USA)":{countryCodes:["us"],matchTags:["shop/supermarket"],nomatch:["shop/department_store|Target~(Australia)"],tags:{brand:"Target","brand:wikidata":"Q1046951","brand:wikipedia":"en:Target Corporation",name:"Target",shop:"department_store"}},"shop/department_store|The Warehouse":{countryCodes:["nz"],tags:{brand:"The Warehouse","brand:wikidata":"Q3566291","brand:wikipedia":"en:The Warehouse Group",name:"The Warehouse",shop:"department_store"}},"shop/department_store|Walmart":{matchTags:["shop/supermarket"],tags:{brand:"Walmart","brand:wikidata":"Q483551","brand:wikipedia":"en:Walmart",name:"Walmart",operator:"Walmart","operator:wikidata":"Q483551","operator:wikipedia":"en:Walmart",shop:"department_store"}},"shop/department_store|Woolworth":{countryCodes:["de"],tags:{brand:"Woolworth","brand:wikidata":"Q183538","brand:wikipedia":"de:Woolworth Deutschland",name:"Woolworth",shop:"department_store"}},"shop/department_store|Åhléns":{countryCodes:["se"],tags:{brand:"Åhléns","brand:wikidata":"Q270851","brand:wikipedia":"sv:Åhléns",name:"Åhléns",shop:"department_store"}},"shop/department_store|Épicerie":{tags:{brand:"Épicerie",name:"Épicerie",shop:"department_store"}},"shop/department_store|Евроопт Market":{tags:{brand:"Евроопт Market",name:"Евроопт Market",shop:"department_store"}},"shop/department_store|Евроопт Минимаркет":{tags:{brand:"Евроопт Минимаркет",name:"Евроопт Минимаркет",shop:"department_store"}},"shop/department_store|東急ハンズ":{countryCodes:["jp"],tags:{brand:"東急ハンズ","brand:en":"Tokyu Hands","brand:ja":"東急ハンズ","brand:wikidata":"Q859212","brand:wikipedia":"ja:東急ハンズ",name:"東急ハンズ","name:en":"Tokyu Hands","name:ja":"東急ハンズ",shop:"department_store"}},"shop/department_store|롯데백화점":{countryCodes:["kr"],tags:{brand:"롯데백화점","brand:ko":"롯데백화점","brand:wikidata":"Q489905","brand:wikipedia":"ko:롯데백화점",name:"롯데백화점","name:en":"Lotte Department Store","name:ko":"롯데백화점",shop:"department_store"}},"shop/doityourself|Ace Hardware":{tags:{brand:"Ace Hardware","brand:wikidata":"Q4672981","brand:wikipedia":"en:Ace Hardware",name:"Ace Hardware",shop:"doityourself"}},"shop/doityourself|B&Q":{tags:{brand:"B&Q","brand:wikidata":"Q707602","brand:wikipedia":"en:B&Q",name:"B&Q",shop:"doityourself"}},"shop/doityourself|Bauhaus":{tags:{brand:"Bauhaus","brand:wikidata":"Q672043","brand:wikipedia":"en:Bauhaus (company)",name:"Bauhaus",shop:"doityourself"}},"shop/doityourself|Biltema":{countryCodes:["dk","fi","no","se"],tags:{brand:"Biltema","brand:wikidata":"Q3355552","brand:wikipedia":"en:Biltema",name:"Biltema",shop:"doityourself"}},"shop/doityourself|Brico":{tags:{brand:"Brico","brand:wikidata":"Q2510786","brand:wikipedia":"en:Brico",name:"Brico",shop:"doityourself"}},"shop/doityourself|Brico Dépôt":{tags:{brand:"Brico Dépôt","brand:wikidata":"Q2889702","brand:wikipedia":"en:Brico Dépôt",name:"Brico Dépôt",shop:"doityourself"}},"shop/doityourself|Bricoman":{tags:{brand:"Bricoman","brand:wikidata":"Q2925142","brand:wikipedia":"it:Bricoman",name:"Bricoman",shop:"doityourself"}},"shop/doityourself|Bricomarché":{tags:{brand:"Bricomarché","brand:wikidata":"Q2925147","brand:wikipedia":"en:Bricomarché",name:"Bricomarché",shop:"doityourself"}},"shop/doityourself|Bricorama":{tags:{brand:"Bricorama","brand:wikidata":"Q2925146","brand:wikipedia":"en:Bricorama",name:"Bricorama",shop:"doityourself"}},"shop/doityourself|Bunnings Warehouse":{countryCodes:["au","nz"],tags:{brand:"Bunnings Warehouse","brand:wikidata":"Q4997829","brand:wikipedia":"en:Bunnings Warehouse",name:"Bunnings Warehouse",shop:"doityourself"}},"shop/doityourself|Castorama":{tags:{brand:"Castorama","brand:wikidata":"Q966971","brand:wikipedia":"en:Castorama",name:"Castorama",shop:"doityourself"}},"shop/doityourself|Chausson Matériaux":{tags:{brand:"Chausson Matériaux",name:"Chausson Matériaux",shop:"doityourself"}},"shop/doityourself|Clas Ohlson":{tags:{brand:"Clas Ohlson","brand:wikidata":"Q3356220","brand:wikipedia":"en:Clas Ohlson",name:"Clas Ohlson",shop:"doityourself"}},"shop/doityourself|Easy":{tags:{brand:"Easy","brand:wikidata":"Q5331091","brand:wikipedia":"en:Easy (store)",name:"Easy",shop:"doityourself"}},"shop/doityourself|Gamma":{tags:{brand:"Gamma","brand:wikidata":"Q2294120","brand:wikipedia":"en:Gamma (store)",name:"Gamma",shop:"doityourself"}},"shop/doityourself|Gedimat":{tags:{brand:"Gedimat",name:"Gedimat",shop:"doityourself"}},"shop/doityourself|Globus Baumarkt":{countryCodes:["de","lu"],tags:{brand:"Globus Baumarkt","brand:wikidata":"Q457503","brand:wikipedia":"de:Globus Holding",name:"Globus Baumarkt",shop:"doityourself"}},"shop/doityourself|Hagebaumarkt":{countryCodes:["at","be","ch","de","es","fr","lu","nl"],matchNames:["hagebau"],tags:{brand:"Hagebaumarkt","brand:wikidata":"Q1568279","brand:wikipedia":"de:Hagebau",name:"Hagebaumarkt",shop:"doityourself"}},"shop/doityourself|Hammer":{countryCodes:["de"],tags:{brand:"Hammer","brand:wikidata":"Q52159668","brand:wikipedia":"de:Hammer (Fachmarktkette)",name:"Hammer",shop:"doityourself"}},"shop/doityourself|Hellweg":{countryCodes:["at","de"],tags:{brand:"Hellweg","brand:wikidata":"Q1603084","brand:wikipedia":"de:Hellweg (Baumarkt)",name:"Hellweg",shop:"doityourself"}},"shop/doityourself|Home Building Centre":{countryCodes:["ca"],nomatch:["shop/hardware|Home Hardware Building Centre"],tags:{brand:"Home Hardware","brand:wikidata":"Q3139611","brand:wikipedia":"en:Home Hardware",name:"Home Building Centre",shop:"doityourself"}},"shop/doityourself|Home Depot":{matchNames:["the home depot"],tags:{brand:"Home Depot","brand:wikidata":"Q864407","brand:wikipedia":"en:The Home Depot",name:"Home Depot",shop:"doityourself"}},"shop/doityourself|Home Hardware Building Centre":{countryCodes:["ca"],matchNames:["home hardware"],nomatch:["shop/hardware|Home Hardware"],tags:{brand:"Home Hardware","brand:wikidata":"Q3139611","brand:wikipedia":"en:Home Hardware",name:"Home Hardware Building Centre",shop:"doityourself"}},"shop/doityourself|Homebase":{tags:{brand:"Homebase","brand:wikidata":"Q9293447","brand:wikipedia":"en:Homebase",name:"Homebase",shop:"doityourself"}},"shop/doityourself|Hornbach":{tags:{brand:"Hornbach","brand:wikidata":"Q685926","brand:wikipedia":"en:Hornbach (retailer)",name:"Hornbach",shop:"doityourself"}},"shop/doityourself|Hubo":{tags:{brand:"Hubo","brand:wikidata":"Q3142153","brand:wikipedia":"en:Hubo Belgium",name:"Hubo",shop:"doityourself"}},"shop/doityourself|Jewson":{countryCodes:["gb"],tags:{brand:"Jewson","brand:wikidata":"Q6190226","brand:wikipedia":"en:Jewson",name:"Jewson",shop:"doityourself"}},"shop/doityourself|Karwei":{countryCodes:["nl"],tags:{brand:"Karwei","brand:wikidata":"Q2097480","brand:wikipedia":"en:Karwei",name:"Karwei",shop:"doityourself"}},"shop/doityourself|Leroy Merlin":{tags:{brand:"Leroy Merlin","brand:wikidata":"Q889624","brand:wikipedia":"en:Leroy Merlin",name:"Leroy Merlin",shop:"doityourself"}},"shop/doityourself|Lowe's":{tags:{brand:"Lowe's","brand:wikidata":"Q1373493","brand:wikipedia":"en:Lowe's",name:"Lowe's",shop:"doityourself"}},"shop/doityourself|Menards":{tags:{brand:"Menards","brand:wikidata":"Q1639897","brand:wikipedia":"en:Menards",name:"Menards",shop:"doityourself"}},"shop/doityourself|Mr.Bricolage":{tags:{brand:"Mr.Bricolage","brand:wikidata":"Q3141657","brand:wikipedia":"fr:Mr Bricolage",name:"Mr.Bricolage",shop:"doityourself"}},"shop/doityourself|OBI":{tags:{brand:"OBI","brand:wikidata":"Q300518","brand:wikipedia":"en:Obi (store)",name:"OBI",shop:"doityourself"}},"shop/doityourself|Point P":{tags:{brand:"Point P",name:"Point P",shop:"doityourself"}},"shop/doityourself|Praktiker":{tags:{brand:"Praktiker","brand:wikidata":"Q680214","brand:wikipedia":"en:Praktiker",name:"Praktiker",shop:"doityourself"}},"shop/doityourself|Praxis":{countryCodes:["nl"],tags:{brand:"Praxis","brand:wikidata":"Q2741995","brand:wikipedia":"nl:Praxis (winkel)",name:"Praxis",shop:"doityourself"}},"shop/doityourself|Promart":{countryCodes:["pe"],tags:{brand:"Promart","brand:wikidata":"Q17626095","brand:wikipedia":"en:Promart",name:"Promart",shop:"doityourself"}},"shop/doityourself|Rona":{countryCodes:["ca"],tags:{brand:"Rona","brand:wikidata":"Q3415283","brand:wikipedia":"en:Rona, Inc.",name:"Rona",shop:"doityourself"}},"shop/doityourself|Screwfix":{tags:{brand:"Screwfix","brand:wikidata":"Q7439115","brand:wikipedia":"en:Screwfix",name:"Screwfix",shop:"doityourself"}},"shop/doityourself|Sodimac":{matchNames:["sodimac constructor"],tags:{brand:"Sodimac","brand:wikidata":"Q7553274","brand:wikipedia":"es:Sodimac",name:"Sodimac",shop:"doityourself"}},"shop/doityourself|Sonderpreis Baumarkt":{countryCodes:["de"],tags:{brand:"Sonderpreis Baumarkt",name:"Sonderpreis Baumarkt",shop:"doityourself"}},"shop/doityourself|Tekzen":{countryCodes:["tr"],tags:{brand:"Tekzen","brand:wikidata":"Q25475379","brand:wikipedia":"tr:Tekzen",name:"Tekzen",shop:"doityourself"}},"shop/doityourself|Toom Baumarkt":{countryCodes:["de"],matchNames:["toom"],tags:{brand:"Toom Baumarkt","brand:wikidata":"Q2442970","brand:wikipedia":"de:Toom Baumarkt",name:"Toom Baumarkt",shop:"doityourself"}},"shop/doityourself|Travis Perkins":{countryCodes:["gb"],tags:{brand:"Travis Perkins","brand:wikidata":"Q2450664","brand:wikipedia":"en:Travis Perkins",name:"Travis Perkins",shop:"doityourself"}},"shop/doityourself|Weldom":{tags:{brand:"Weldom","brand:wikidata":"Q16683226","brand:wikipedia":"fr:Weldom",name:"Weldom",shop:"doityourself"}},"shop/doityourself|Wickes":{countryCodes:["gb"],tags:{brand:"Wickes","brand:wikidata":"Q7998350","brand:wikipedia":"en:Wickes",name:"Wickes",shop:"doityourself"}},"shop/doityourself|jem & fix":{countryCodes:["dk"],tags:{brand:"jem & fix","brand:wikidata":"Q12319200","brand:wikipedia":"da:Jem & fix",name:"jem & fix",shop:"doityourself"}},"shop/doityourself|Леруа Мерлен":{tags:{brand:"Леруа Мерлен","brand:en":"Leroy Merlin","brand:wikidata":"Q889624","brand:wikipedia":"en:Leroy Merlin",name:"Леруа Мерлен","name:en":"Leroy Merlin",shop:"doityourself"}},"shop/doityourself|Мастер":{tags:{brand:"Мастер",name:"Мастер",shop:"doityourself"}},"shop/doityourself|Строитель":{tags:{brand:"Строитель",name:"Строитель",shop:"doityourself"}},"shop/doityourself|カインズホーム":{countryCodes:["jp"],tags:{brand:"カインズホーム","brand:en":"Cainz Home","brand:ja":"カインズホーム","brand:wikidata":"Q11293852","brand:wikipedia":"ja:カインズ",name:"カインズホーム","name:en":"Cainz Home","name:ja":"カインズホーム",shop:"doityourself"}},"shop/doityourself|コメリ":{countryCodes:["jp"],tags:{brand:"コメリ","brand:ja":"コメリ","brand:wikidata":"Q11302690","brand:wikipedia":"ja:コメリ",name:"コメリ","name:en":"Komeri","name:ja":"コメリ",shop:"doityourself"}},"shop/doityourself|コーナン":{countryCodes:["jp"],tags:{brand:"コーナン","brand:ja":"コーナン","brand:wikidata":"Q11303403","brand:wikipedia":"ja:コーナン",name:"コーナン","name:en":"Kohnan","name:ja":"コーナン",shop:"doityourself"}},"shop/doityourself|ナフコ":{countryCodes:["jp"],tags:{brand:"ナフコ","brand:ja":"ナフコ",name:"ナフコ","name:ja":"ナフコ",shop:"doityourself"}},"shop/doors|Юркас":{tags:{brand:"Юркас",name:"Юркас",shop:"doors"}},"shop/dry_cleaning|5àsec":{tags:{brand:"5àsec","brand:wikidata":"Q2817899","brand:wikipedia":"fr:5àsec",name:"5àsec",shop:"dry_cleaning"}},"shop/dry_cleaning|Martinizing Dry Cleaning":{tags:{brand:"Martinizing Dry Cleaning","brand:wikidata":"Q6777169","brand:wikipedia":"en:Martinizing Dry Cleaning",name:"Martinizing Dry Cleaning",shop:"dry_cleaning"}},"shop/dry_cleaning|Диана":{tags:{brand:"Диана","brand:wikidata":"Q62105088",name:"Диана",shop:"dry_cleaning"}},"shop/dry_cleaning|タカケンサンシャイン":{countryCodes:["jp"],matchNames:["タカケンクリーング"],tags:{brand:"タカケンサンシャイン","brand:en":"Takaken Sunshine","brand:ja":"タカケンサンシャイン","brand:wikidata":"Q11315914","brand:wikipedia":"ja:タカケンサンシャイン",name:"タカケンサンシャイン","name:en":"Takaken Sunshine","name:ja":"タカケンサンシャイン",shop:"dry_cleaning"}},"shop/dry_cleaning|ホワイト急便":{countryCodes:["jp"],tags:{brand:"ホワイト急便","brand:en":"White Kyuubin","brand:ja":"ホワイト急便","brand:wikidata":"Q11505557","brand:wikipedia":"ja:日本さわやかグループ",name:"ホワイト急便","name:en":"White Kyuubin","name:ja":"ホワイト急便",shop:"dry_cleaning"}},"shop/dry_cleaning|白洋舎":{countryCodes:["jp"],tags:{brand:"白洋舎","brand:en":"Hakuyosha","brand:wikidata":"Q11579995","brand:wikipedia":"ja:白洋舎",name:"白洋舎","name:en":"Hakuyosha",shop:"dry_cleaning"}},"shop/electronics|Apple Store":{nomatch:["amenity/bank|Apple Bank"],tags:{brand:"Apple Store","brand:wikidata":"Q421253","brand:wikipedia":"en:Apple Store",name:"Apple Store",shop:"electronics"}},"shop/electronics|BCC":{nomatch:["amenity/bank|Bcc"],tags:{brand:"BCC",name:"BCC",shop:"electronics"}},"shop/electronics|Batteries Plus Bulbs":{matchNames:["batteries plus"],tags:{brand:"Batteries Plus Bulbs","brand:wikidata":"Q17005157","brand:wikipedia":"en:Batteries Plus Bulbs",name:"Batteries Plus Bulbs",shop:"electronics"}},"shop/electronics|Best Buy":{tags:{brand:"Best Buy","brand:wikidata":"Q533415","brand:wikipedia":"en:Best Buy",name:"Best Buy",shop:"electronics"}},"shop/electronics|Boulanger":{countryCodes:["fr"],tags:{brand:"Boulanger","brand:wikidata":"Q2921695","brand:wikipedia":"fr:Boulanger (entreprise)",name:"Boulanger",shop:"electronics"}},"shop/electronics|CeX":{countryCodes:["au","es","gb","ie","in","it","mx","nl","pl","pt"],tags:{brand:"CeX","brand:wikidata":"Q5055676","brand:wikipedia":"en:CeX (company)",name:"CeX",shop:"electronics"}},"shop/electronics|Currys":{countryCodes:["gb","ie"],tags:{brand:"Currys","brand:wikidata":"Q3246464","brand:wikipedia":"en:Currys",name:"Currys",shop:"electronics"}},"shop/electronics|Currys PC World":{countryCodes:["gb","ie"],tags:{brand:"Currys PC World","brand:wikidata":"Q7118727","brand:wikipedia":"en:PC World (retailer)",name:"Currys PC World",shop:"electronics"}},"shop/electronics|DNS":{tags:{brand:"DNS",name:"DNS",shop:"electronics"}},"shop/electronics|Darty":{tags:{brand:"Darty","brand:wikidata":"Q3117381","brand:wikipedia":"en:Groupe Fnac Darty",name:"Darty",shop:"electronics"}},"shop/electronics|Elektra":{countryCodes:["gt","hn","pa","pe","sv"],tags:{brand:"Elektra","brand:wikidata":"Q1142753","brand:wikipedia":"es:Grupo Elektra",name:"Elektra",shop:"electronics"}},"shop/electronics|Elgiganten":{tags:{brand:"Elgiganten","brand:wikidata":"Q17050121","brand:wikipedia":"en:Elgiganten",name:"Elgiganten",shop:"electronics"}},"shop/electronics|Euronics":{tags:{brand:"Euronics","brand:wikidata":"Q184860","brand:wikipedia":"en:Euronics",name:"Euronics",shop:"electronics"}},"shop/electronics|Expert":{tags:{brand:"Expert","brand:wikidata":"Q680990","brand:wikipedia":"en:Expert (company)",name:"Expert",shop:"electronics"}},"shop/electronics|Hartlauer":{countryCodes:["at"],tags:{brand:"Hartlauer","brand:wikidata":"Q1587223","brand:wikipedia":"de:Hartlauer",name:"Hartlauer",shop:"electronics"}},"shop/electronics|Interdiscount":{countryCodes:["ch"],tags:{brand:"Interdiscount","brand:wikidata":"Q1665980","brand:wikipedia":"de:Interdiscount",name:"Interdiscount",shop:"electronics"}},"shop/electronics|JB Hi-Fi":{countryCodes:["au","nz"],tags:{brand:"JB Hi-Fi","brand:wikidata":"Q3310113","brand:wikipedia":"en:JB Hi-Fi",name:"JB Hi-Fi",shop:"electronics"}},"shop/electronics|Kjell & Company":{countryCodes:["no","se"],matchNames:["kjell och company"],tags:{brand:"Kjell & Company","brand:wikidata":"Q6419332","brand:wikipedia":"en:Kjell & Company",name:"Kjell & Company",shop:"electronics"}},"shop/electronics|Komputronik":{countryCodes:["pl"],tags:{brand:"Komputronik","brand:wikidata":"Q11742085","brand:wikipedia":"pl:Komputronik",name:"Komputronik",shop:"electronics"}},"shop/electronics|La Curacao":{tags:{brand:"La Curacao","brand:wikidata":"Q5194599","brand:wikipedia":"en:Curacao (retail store)",name:"La Curacao",shop:"electronics"}},"shop/electronics|Maplin":{tags:{brand:"Maplin","brand:wikidata":"Q6754124","brand:wikipedia":"en:Maplin (retailer)",name:"Maplin",shop:"electronics"}},"shop/electronics|Media Expert":{countryCodes:["pl"],tags:{brand:"Media Expert","brand:wikidata":"Q11776794","brand:wikipedia":"pl:Media Expert",name:"Media Expert",shop:"electronics"}},"shop/electronics|Media Markt":{tags:{brand:"Media Markt","brand:wikidata":"Q2381223","brand:wikipedia":"en:Media Markt",name:"Media Markt",shop:"electronics"}},"shop/electronics|Medimax":{tags:{brand:"Medimax",name:"Medimax",operator:"ElectronicPartner","operator:wikidata":"Q1326008","operator:wikipedia":"de:ElectronicPartner",shop:"electronics"}},"shop/electronics|Musimundo":{countryCodes:["ar"],tags:{brand:"Musimundo","brand:wikidata":"Q6034719","brand:wikipedia":"es:Musimundo",name:"Musimundo",shop:"electronics"}},"shop/electronics|Neonet":{countryCodes:["pl"],tags:{brand:"Neonet","brand:wikidata":"Q11790622","brand:wikipedia":"pl:Neonet",name:"Neonet",shop:"electronics"}},"shop/electronics|Power":{tags:{brand:"Power",name:"Power",shop:"electronics"}},"shop/electronics|RTV Euro AGD":{countryCodes:["pl"],tags:{brand:"RTV Euro AGD","brand:wikidata":"Q7277895","brand:wikipedia":"pl:RTV Euro AGD",name:"RTV Euro AGD",shop:"electronics"}},"shop/electronics|RadioShack":{tags:{brand:"RadioShack","brand:wikidata":"Q1195490","brand:wikipedia":"en:RadioShack",name:"RadioShack",shop:"electronics"}},"shop/electronics|Samsung":{tags:{brand:"Samsung","brand:wikidata":"Q20718","brand:wikipedia":"en:Samsung Electronics",name:"Samsung",shop:"electronics"}},"shop/electronics|Saturn":{countryCodes:["at","de","lu","pl"],tags:{brand:"Saturn","brand:wikidata":"Q2543504","brand:wikipedia":"en:Saturn (retailer)",name:"Saturn",shop:"electronics"}},"shop/electronics|Sony":{tags:{brand:"Sony","brand:wikidata":"Q41187","brand:wikipedia":"en:Sony",name:"Sony",shop:"electronics"}},"shop/electronics|Teknikmagasinet":{countryCodes:["fi","no","se"],tags:{brand:"Teknikmagasinet","brand:wikidata":"Q3357520","brand:wikipedia":"en:Teknikmagasinet",name:"Teknikmagasinet",shop:"electronics"}},"shop/electronics|The Source":{countryCodes:["ca"],tags:{brand:"The Source","brand:wikidata":"Q3212934","brand:wikipedia":"en:The Source (retailer)",name:"The Source",shop:"electronics"}},"shop/electronics|Trony":{tags:{brand:"Trony",name:"Trony",shop:"electronics"}},"shop/electronics|Unieuro":{tags:{brand:"Unieuro","brand:wikidata":"Q4004687","brand:wikipedia":"en:Unieuro",name:"Unieuro",shop:"electronics"}},"shop/electronics|Worten":{countryCodes:["es","pt"],tags:{brand:"Worten","brand:wikidata":"Q10394039","brand:wikipedia":"pt:Worten",name:"Worten",shop:"electronics"}},"shop/electronics|М.Видео":{countryCodes:["ru"],tags:{brand:"М.Видео","brand:en":"M.video","brand:wikidata":"Q6558800","brand:wikipedia":"en:M.video",name:"М.Видео","name:en":"M.video",shop:"electronics"}},"shop/electronics|Фокстрот":{countryCodes:["ua"],tags:{brand:"Фокстрот","brand:wikidata":"Q16721578","brand:wikipedia":"uk:Фокстрот (торгова мережа)",name:"Фокстрот",shop:"electronics"}},"shop/electronics|Эксперт":{tags:{brand:"Эксперт",name:"Эксперт",shop:"electronics"}},"shop/electronics|Эльдорадо":{tags:{brand:"Эльдорадо","brand:wikidata":"Q4531492","brand:wikipedia":"ru:Эльдорадо (сеть магазинов)",name:"Эльдорадо",shop:"electronics"}},"shop/electronics|エディオン":{countryCodes:["jp"],tags:{brand:"エディオン","brand:en":"EDION","brand:ja":"エディオン","brand:wikidata":"Q11290252","brand:wikipedia":"ja:エディオン",name:"エディオン","name:en":"EDION","name:ja":"エディオン",shop:"electronics"}},"shop/electronics|ケーズデンキ":{countryCodes:["jp"],matchTags:["shop/appliance"],tags:{brand:"ケーズデンキ","brand:en":"K's Denki","brand:ja":"ケーズデンキ","brand:wikidata":"Q6322472","brand:wikipedia":"ja:ケーズホールディングス",name:"ケーズデンキ","name:en":"K's Denki","name:ja":"ケーズデンキ",shop:"electronics"}},"shop/electronics|コジマ":{countryCodes:["jp"],tags:{brand:"コジマ","brand:en":"Kojima","brand:ja":"コジマ","brand:wikidata":"Q11302052","brand:wikipedia":"ja:コジマ",name:"コジマ","name:en":"Kojima","name:ja":"コジマ",shop:"electronics"}},"shop/electronics|ソフマップ":{countryCodes:["jp"],tags:{brand:"ソフマップ","brand:en":"Sofmap","brand:ja":"ソフマップ","brand:wikidata":"Q7553789","brand:wikipedia":"ja:ソフマップ",name:"ソフマップ","name:en":"Sofmap","name:ja":"ソフマップ",shop:"electronics"}},"shop/electronics|ビックカメラ":{countryCodes:["jp"],tags:{brand:"ビックカメラ","brand:en":"Bic Camera","brand:ja":"ビックカメラ","brand:wikidata":"Q4903531","brand:wikipedia":"ja:ビックカメラ",name:"ビックカメラ","name:en":"Bic Camera","name:ja":"ビックカメラ",shop:"electronics"}},"shop/electronics|ヤマダ電機":{countryCodes:["jp"],tags:{brand:"ヤマダ電機","brand:en":"Yamada Denki","brand:ja":"ヤマダ電機","brand:wikidata":"Q1096390","brand:wikipedia":"en:Yamada Denki",name:"ヤマダ電機","name:en":"Yamada Denki","name:ja":"ヤマダ電機",shop:"electronics"}},"shop/electronics|全國電子":{countryCodes:["tw"],tags:{brand:"全國電子","brand:en":"E-life Mall","brand:wikidata":"Q10891540","brand:wikipedia":"zh:全國電子",name:"全國電子","name:en":"E-life Mall",shop:"electronics"}},"shop/electronics|燦坤3C":{countryCodes:["tw"],tags:{brand:"燦坤3C","brand:en":"Tsannkuen 3C","brand:wikidata":"Q11569285","brand:wikipedia":"zh:燦坤",name:"燦坤3C","name:en":"Tsannkuen 3C",shop:"electronics"}},"shop/erotic|Ann Summers":{countryCodes:["gb","ie"],tags:{brand:"Ann Summers","brand:wikidata":"Q579524","brand:wikipedia":"en:Ann Summers",name:"Ann Summers",shop:"erotic"}},"shop/erotic|Orion":{countryCodes:["at","de"],tags:{brand:"Orion","brand:wikidata":"Q1609577","brand:wikipedia":"de:Orion (Erotik)",name:"Orion",shop:"erotic"}},"shop/fabric|Mondial Tissus":{countryCodes:["fr"],matchTags:["shop/curtain","shop/department_store"],tags:{brand:"Mondial Tissus","brand:wikidata":"Q17635288","brand:wikipedia":"fr:Mondial Tissus",name:"Mondial Tissus",shop:"fabric"}},"shop/florist|Blume 2000":{countryCodes:["de"],tags:{brand:"Blume 2000","brand:wikidata":"Q886166","brand:wikipedia":"de:Blume 2000",name:"Blume 2000",shop:"florist"}},"shop/florist|Blumen Risse":{countryCodes:["de"],tags:{brand:"Blumen Risse","brand:wikidata":"Q886177","brand:wikipedia":"de:Blumen Risse",name:"Blumen Risse",shop:"florist"}},"shop/florist|Interflora":{countryCodes:["fr","gb","no","se"],tags:{brand:"Interflora","brand:wikidata":"Q692179","brand:wikipedia":"en:Interflora",name:"Interflora",shop:"florist"}},"shop/florist|Monceau Fleurs":{countryCodes:["be","fr"],tags:{brand:"Monceau Fleurs","brand:wikidata":"Q17629431","brand:wikipedia":"fr:Emova Group",name:"Monceau Fleurs",shop:"florist"}},"shop/florist|Мир цветов":{countryCodes:["kz","ru"],tags:{brand:"Мир цветов",name:"Мир цветов",shop:"florist"}},"shop/florist|Мосцветторг":{countryCodes:["ru"],tags:{brand:"Мосцветторг",name:"Мосцветторг",shop:"florist"}},"shop/frozen_food|Picard":{tags:{brand:"Picard","brand:wikidata":"Q3382454","brand:wikipedia":"en:Picard Surgelés",name:"Picard",shop:"frozen_food"}},"shop/funeral_directors|PFG":{countryCodes:["fr"],matchNames:["pompes funèbres générales"],tags:{brand:"PFG","brand:wikidata":"Q3396087","brand:wikipedia":"fr:Pompes funèbres générales",name:"PFG",official_name:"Pompes Funèbres Générales",shop:"funeral_directors"}},"shop/funeral_directors|Roblot":{countryCodes:["fr"],tags:{brand:"Roblot","brand:wikidata":"Q63247414",name:"Roblot",shop:"funeral_directors"}},"shop/funeral_directors|Roc-Eclerc":{tags:{brand:"Roc-Eclerc","brand:wikidata":"Q62558102",name:"Roc-Eclerc",shop:"funeral_directors"}},"shop/funeral_directors|The Co-operative Funeralcare":{countryCodes:["gb"],tags:{brand:"The Co-operative Funeralcare","brand:wikidata":"Q7726521","brand:wikipedia":"en:Co-op Funeralcare",name:"The Co-operative Funeralcare",shop:"funeral_directors"}},"shop/furniture|Aaron's":{countryCodes:["ca","us"],tags:{brand:"Aaron's","brand:wikidata":"Q10397787","brand:wikipedia":"en:Aaron's, Inc.",name:"Aaron's",shop:"furniture"}},"shop/furniture|American Signature Furniture":{countryCodes:["us"],tags:{brand:"American Signature Furniture","brand:wikidata":"Q63859411",name:"American Signature Furniture",shop:"furniture"}},"shop/furniture|Arhaus":{countryCodes:["us"],tags:{brand:"Arhaus","brand:wikidata":"Q35689887",name:"Arhaus",shop:"furniture"}},"shop/furniture|Ashley HomeStore":{countryCodes:["ca","us"],matchNames:["ashley furniture","ashley furniture homestore"],tags:{brand:"Ashley HomeStore","brand:wikidata":"Q4805437","brand:wikipedia":"en:Ashley HomeStore",name:"Ashley Furniture",shop:"furniture"}},"shop/furniture|Black Red White":{tags:{brand:"Black Red White","brand:wikidata":"Q4921546","brand:wikipedia":"en:Black Red White",name:"Black Red White",shop:"furniture"}},"shop/furniture|BoConcept":{tags:{brand:"BoConcept","brand:wikidata":"Q11338915","brand:wikipedia":"en:BoConcept",name:"BoConcept",shop:"furniture"}},"shop/furniture|Bob’s Discount Furniture":{countryCodes:["us"],tags:{brand:"Bob’s Discount Furniture","brand:wikidata":"Q4931582","brand:wikipedia":"en:Bob's Discount Furniture",name:"Bob’s Discount Furniture",shop:"furniture"}},"shop/furniture|Bodzio":{countryCodes:["pl"],tags:{brand:"Bodzio","brand:wikidata":"Q20034845","brand:wikipedia":"pl:Fabryka Mebli Bodzio",name:"Bodzio",shop:"furniture"}},"shop/furniture|But":{tags:{brand:"But","brand:wikidata":"Q18720442","brand:wikipedia":"en:BUT (retailer)",name:"But",shop:"furniture"}},"shop/furniture|Cabinets To Go":{countryCodes:["us"],tags:{brand:"Cabinets To Go","brand:wikidata":"Q25245346","brand:wikipedia":"en:Cabinets To Go",name:"Cabinets To Go",shop:"furniture"}},"shop/furniture|Casa":{matchTags:["shop/interior_decoration"],tags:{brand:"Casa",name:"Casa",shop:"furniture"}},"shop/furniture|Conforama":{tags:{brand:"Conforama","brand:wikidata":"Q541134","brand:wikipedia":"en:Conforama",name:"Conforama",shop:"furniture"}},"shop/furniture|Crate & Barrel":{matchNames:["crate and barrel"],tags:{brand:"Crate & Barrel","brand:wikidata":"Q5182604","brand:wikipedia":"en:Crate & Barrel",name:"Crate & Barrel",shop:"furniture"}},"shop/furniture|DFS":{tags:{brand:"DFS","brand:wikidata":"Q5204927","brand:wikipedia":"en:DFS Furniture",name:"DFS",shop:"furniture"}},"shop/furniture|Dänisches Bettenlager":{countryCodes:["at","de"],matchTags:["shop/bed"],tags:{brand:"Dänisches Bettenlager","brand:wikidata":"Q138913","brand:wikipedia":"en:Jysk (store)",name:"Dänisches Bettenlager",shop:"furniture"}},"shop/furniture|Ethan Allen":{tags:{brand:"Ethan Allen","brand:wikidata":"Q5402870","brand:wikipedia":"en:Ethan Allen (furniture company)",name:"Ethan Allen",shop:"furniture"}},"shop/furniture|Fly":{tags:{brand:"Fly","brand:wikidata":"Q1389184","brand:wikipedia":"fr:Fly (entreprise)",name:"Fly",shop:"furniture"}},"shop/furniture|Harveys":{countryCodes:["gb"],nomatch:["amenity/fast_food|Harvey's"],tags:{brand:"Harveys","brand:wikidata":"Q5677754","brand:wikipedia":"en:Harveys Furniture",name:"Harveys",shop:"furniture"}},"shop/furniture|Havertys":{countryCodes:["us"],tags:{brand:"Havertys","brand:wikidata":"Q5683881","brand:wikipedia":"en:Havertys",name:"Havertys",shop:"furniture"}},"shop/furniture|IKEA":{tags:{brand:"IKEA","brand:wikidata":"Q54078","brand:wikipedia":"en:IKEA",name:"IKEA",shop:"furniture"}},"shop/furniture|JYSK":{tags:{brand:"JYSK","brand:wikidata":"Q138913","brand:wikipedia":"en:Jysk (store)",name:"JYSK",shop:"furniture"}},"shop/furniture|Kwantum":{tags:{brand:"Kwantum",name:"Kwantum",shop:"furniture"}},"shop/furniture|La-Z-Boy":{tags:{brand:"La-Z-Boy","brand:wikidata":"Q6391583","brand:wikipedia":"en:La-Z-Boy",name:"La-Z-Boy",shop:"furniture"}},"shop/furniture|Leen Bakker":{tags:{brand:"Leen Bakker",name:"Leen Bakker",shop:"furniture"}},"shop/furniture|Maisons du Monde":{tags:{brand:"Maisons du Monde",name:"Maisons du Monde",shop:"furniture"}},"shop/furniture|Möbelix":{tags:{brand:"Möbelix",name:"Möbelix",shop:"furniture"}},"shop/furniture|Pottery Barn":{countryCodes:["au","ca","mx","ph","us"],tags:{brand:"Pottery Barn","brand:wikidata":"Q3400126","brand:wikipedia":"en:Pottery Barn",name:"Pottery Barn",shop:"furniture"}},"shop/furniture|Raymour & Flanigan":{countryCodes:["us"],tags:{brand:"Raymour & Flanigan","brand:wikidata":"Q7299290","brand:wikipedia":"en:Raymour & Flanigan",name:"Raymour & Flanigan",shop:"furniture"}},"shop/furniture|Rent-A-Center":{tags:{brand:"Rent-A-Center","brand:wikidata":"Q7313497","brand:wikipedia":"en:Rent-A-Center",name:"Rent-A-Center",shop:"furniture"}},"shop/furniture|Restoration Hardware":{tags:{brand:"Restoration Hardware","brand:wikidata":"Q7316207","brand:wikipedia":"en:Restoration Hardware",name:"Restoration Hardware",shop:"furniture"}},"shop/furniture|Roche Bobois":{tags:{brand:"Roche Bobois",name:"Roche Bobois",shop:"furniture"}},"shop/furniture|Roller":{tags:{brand:"Roller","brand:wikidata":"Q1621286","brand:wikipedia":"de:Roller (Möbelhaus)",name:"Roller",shop:"furniture"}},"shop/furniture|Rooms To Go":{countryCodes:["us"],tags:{brand:"Rooms To Go","brand:wikidata":"Q7366329","brand:wikipedia":"en:Rooms To Go",name:"Rooms To Go",shop:"furniture"}},"shop/furniture|ScS":{countryCodes:["gb"],tags:{brand:"ScS","brand:wikidata":"Q19654399","brand:wikipedia":"en:ScS",name:"ScS",shop:"furniture"}},"shop/furniture|The Brick":{tags:{brand:"The Brick","brand:wikidata":"Q7720000","brand:wikipedia":"en:The Brick",name:"The Brick",shop:"furniture"}},"shop/furniture|Urban Barn":{countryCodes:["ca"],tags:{brand:"Urban Barn","brand:wikidata":"Q62515207",name:"Urban Barn",shop:"furniture"}},"shop/furniture|Value City Furniture":{countryCodes:["us"],tags:{brand:"Value City Furniture","brand:wikidata":"Q63859417",name:"Value City Furniture",shop:"furniture"}},"shop/furniture|Williams-Sonoma":{countryCodes:["ca","us"],matchNames:["william sonoma"],tags:{brand:"Williams-Sonoma","brand:wikidata":"Q2581220","brand:wikipedia":"en:Williams-Sonoma",name:"Williams-Sonoma",shop:"furniture"}},"shop/furniture|İstikbal":{tags:{brand:"İstikbal",name:"İstikbal",shop:"furniture"}},"shop/furniture|Много мебели":{tags:{brand:"Много мебели",name:"Много мебели",shop:"furniture"}},"shop/furniture|ニトリ":{countryCodes:["jp"],tags:{brand:"ニトリ","brand:en":"Nitori","brand:ja":"ニトリ","brand:wikidata":"Q10801453","brand:wikipedia":"en:Nitori",name:"ニトリ","name:en":"Nitori","name:ja":"ニトリ",shop:"furniture"}},"shop/games|Games Workshop":{tags:{brand:"Games Workshop","brand:wikidata":"Q587270","brand:wikipedia":"en:Games Workshop",name:"Games Workshop",shop:"games"}},"shop/garden_centre|Dehner":{countryCodes:["at","de"],tags:{brand:"Dehner","brand:wikidata":"Q1183029","brand:wikipedia":"de:Dehner",name:"Dehner",shop:"garden_centre"}},"shop/garden_centre|Gamm Vert":{countryCodes:["fr"],tags:{brand:"Gamm Vert","brand:wikidata":"Q3095006","brand:wikipedia":"fr:Gamm Vert",name:"Gamm Vert",shop:"garden_centre"}},"shop/garden_centre|Jardiland":{countryCodes:["fr"],tags:{brand:"Jardiland","brand:wikidata":"Q3162276","brand:wikipedia":"fr:Jardiland",name:"Jardiland",shop:"garden_centre"}},"shop/garden_centre|Point Vert":{countryCodes:["fr"],tags:{brand:"Point Vert","brand:wikidata":"Q16661975","brand:wikipedia":"fr:Magasin vert",name:"Point Vert",shop:"garden_centre"}},"shop/garden_centre|Truffaut":{countryCodes:["fr"],tags:{brand:"Truffaut","brand:wikidata":"Q3162640","brand:wikipedia":"fr:Jardineries Truffaut",name:"Truffaut",shop:"garden_centre"}},"shop/garden_centre|Welkoop":{countryCodes:["nl"],tags:{brand:"Welkoop",name:"Welkoop",shop:"garden_centre"}},"shop/gift|Card Factory":{countryCodes:["gb","im"],tags:{brand:"Card Factory","brand:wikidata":"Q5038192","brand:wikipedia":"en:Card Factory",name:"Card Factory",shop:"gift"}},"shop/gift|Clintons":{countryCodes:["gb"],tags:{brand:"Clintons","brand:wikidata":"Q5134299","brand:wikipedia":"en:Clintons",name:"Clintons",shop:"gift"}},"shop/gift|Disney Store":{countryCodes:["ca","fr","us"],tags:{brand:"Disney Store","brand:wikidata":"Q1047009","brand:wikipedia":"en:Disney Store",name:"Disney Store",operator:"Disney Consumer Products","operator:wikidata":"Q3030410","operator:wikipedia":"en:Disney Consumer Products and Interactive Media",shop:"gift"}},"shop/gift|Hallmark":{tags:{brand:"Hallmark","brand:wikidata":"Q1521910","brand:wikipedia":"en:Hallmark Cards",name:"Hallmark",shop:"gift"}},"shop/gift|Nanu-Nana":{countryCodes:["at","de"],tags:{brand:"Nanu-Nana","brand:wikidata":"Q1720245","brand:wikipedia":"de:Nanu-Nana",name:"Nanu-Nana",shop:"gift"}},"shop/gift|Wereldwinkel":{countryCodes:["be","nl"],tags:{brand:"Wereldwinkel",name:"Wereldwinkel",shop:"gift"}},"shop/greengrocer|Produce Junction":{countryCodes:["us"],tags:{brand:"Produce Junction","brand:wikidata":"Q60583541",name:"Produce Junction",shop:"greengrocer"}},"shop/hairdresser_supply|Sally Beauty Supply":{countryCodes:["ca","mx","us"],tags:{brand:"Sally Beauty Supply","brand:wikidata":"Q7405065","brand:wikipedia":"en:Sally Beauty Holdings",name:"Sally Beauty Supply",shop:"hairdresser_supply"}},"shop/hairdresser|Camille Albane":{tags:{brand:"Camille Albane","brand:wikidata":"Q62965183",name:"Camille Albane",shop:"hairdresser"}},"shop/hairdresser|Coiff&Co":{tags:{brand:"Coiff&Co",name:"Coiff&Co",shop:"hairdresser"}},"shop/hairdresser|Cost Cutters":{countryCodes:["us"],tags:{brand:"Cost Cutters","brand:wikidata":"Q62029366",name:"Cost Cutters",shop:"hairdresser"}},"shop/hairdresser|Dessange":{tags:{brand:"Dessange","brand:wikidata":"Q62979914",name:"Dessange",shop:"hairdresser"}},"shop/hairdresser|Fantastic Sams":{countryCodes:["us"],tags:{brand:"Fantastic Sams","brand:wikidata":"Q5434222","brand:wikipedia":"en:Fantastic Sams",name:"Fantastic Sams",shop:"hairdresser"}},"shop/hairdresser|First Choice Haircutters":{tags:{brand:"First Choice Haircutters","brand:wikidata":"Q5452622","brand:wikipedia":"en:First Choice Haircutters",name:"First Choice Haircutters",shop:"hairdresser"}},"shop/hairdresser|Franck Provost":{tags:{brand:"Franck Provost","brand:wikidata":"Q62805922","brand:wikipedia":"fr:Franck Provost (Salons de coiffure)",name:"Franck Provost",shop:"hairdresser"}},"shop/hairdresser|Great Clips":{countryCodes:["ca","us"],tags:{brand:"Great Clips","brand:wikidata":"Q5598967","brand:wikipedia":"en:Great Clips",name:"Great Clips",shop:"hairdresser"}},"shop/hairdresser|Hair Cuttery":{countryCodes:["us"],tags:{brand:"Hair Cuttery","brand:wikidata":"Q5639484","brand:wikipedia":"en:Hair Cuttery",name:"Hair Cuttery",shop:"hairdresser"}},"shop/hairdresser|Hair Express":{tags:{brand:"Hair Express","brand:wikidata":"Q57550814",name:"Hair Express",shop:"hairdresser"}},"shop/hairdresser|Hair Studio":{tags:{brand:"Hair Studio",name:"Hair Studio",shop:"hairdresser"}},"shop/hairdresser|Hairkiller":{countryCodes:["at","de","lu"],tags:{brand:"Hairkiller","brand:wikidata":"Q58305998",name:"Hairkiller",shop:"hairdresser"}},"shop/hairdresser|Jean Louis David":{tags:{brand:"Jean Louis David",name:"Jean Louis David",shop:"hairdresser"}},"shop/hairdresser|Kirpykla":{tags:{brand:"Kirpykla",name:"Kirpykla",shop:"hairdresser"}},"shop/hairdresser|Klier":{tags:{brand:"Klier","brand:wikidata":"Q1465159","brand:wikipedia":"de:Frisör Klier",name:"Klier",shop:"hairdresser"}},"shop/hairdresser|Klipp":{tags:{brand:"Klipp","brand:wikidata":"Q1737304","brand:wikipedia":"de:Klipp Frisör",name:"Klipp",shop:"hairdresser"}},"shop/hairdresser|Marco Aldany":{tags:{brand:"Marco Aldany",name:"Marco Aldany",shop:"hairdresser"}},"shop/hairdresser|Sport Clips":{tags:{brand:"Sport Clips","brand:wikidata":"Q7579310",name:"Sport Clips",shop:"hairdresser"}},"shop/hairdresser|Super Cut":{tags:{brand:"Super Cut",name:"Super Cut",shop:"hairdresser"}},"shop/hairdresser|Supercuts":{tags:{brand:"Supercuts","brand:wikidata":"Q7643239","brand:wikipedia":"en:Supercuts",name:"Supercuts",shop:"hairdresser"}},"shop/hairdresser|Tchip":{tags:{brand:"Tchip","brand:wikidata":"Q62871250",name:"Tchip",shop:"hairdresser"}},"shop/hairdresser|Toni & Guy":{tags:{brand:"Toni & Guy","brand:wikidata":"Q324784","brand:wikipedia":"en:Toni & Guy",name:"Toni & Guy",shop:"hairdresser"}},"shop/hairdresser|Top Hair":{countryCodes:["de"],tags:{brand:"Top Hair","brand:wikidata":"Q62523343",name:"Top Hair",shop:"hairdresser"}},"shop/hairdresser|Виктория":{tags:{brand:"Виктория",name:"Виктория",shop:"hairdresser"}},"shop/hairdresser|Елена":{tags:{brand:"Елена",name:"Елена",shop:"hairdresser"}},"shop/hairdresser|Каприз":{tags:{brand:"Каприз",name:"Каприз",shop:"hairdresser"}},"shop/hairdresser|Фея":{tags:{brand:"Фея",name:"Фея",shop:"hairdresser"}},"shop/hairdresser|Шарм":{tags:{brand:"Шарм",name:"Шарм",shop:"hairdresser"}},"shop/hardware|220 вольт":{countryCodes:["by","ru","ua"],tags:{brand:"220 вольт",name:"220 вольт",shop:"hardware"}},"shop/hardware|Harbor Freight Tools":{countryCodes:["us"],tags:{brand:"Harbor Freight Tools","brand:wikidata":"Q5654601","brand:wikipedia":"en:Harbor Freight Tools",name:"Harbor Freight Tools",shop:"hardware"}},"shop/hardware|Home Hardware":{countryCodes:["ca"],nomatch:["shop/doityourself|Home Hardware Building Centre"],tags:{brand:"Home Hardware","brand:wikidata":"Q3139611","brand:wikipedia":"en:Home Hardware",name:"Home Hardware",shop:"hardware"}},"shop/hardware|True Value":{tags:{brand:"True Value","brand:wikidata":"Q7847545","brand:wikipedia":"en:True Value",name:"True Value",shop:"hardware"}},"shop/hardware|Würth":{tags:{brand:"Würth","brand:wikidata":"Q679750","brand:wikipedia":"de:Würth-Gruppe",name:"Würth",shop:"hardware"}},"shop/hardware|Мосхозторг":{countryCodes:["ru"],tags:{brand:"Мосхозторг","brand:wikidata":"Q62499092",name:"Мосхозторг",shop:"hardware"}},"shop/hardware|Хозяин":{countryCodes:["by","ru","ua"],tags:{brand:"Хозяин",name:"Хозяин",shop:"hardware"}},"shop/health_food|Holland & Barrett":{tags:{brand:"Holland & Barrett","brand:wikidata":"Q5880870","brand:wikipedia":"en:Holland & Barrett",name:"Holland & Barrett",shop:"health_food"}},"shop/hearing_aids|Amplifon":{tags:{brand:"Amplifon","brand:wikidata":"Q477222","brand:wikipedia":"en:Amplifon",name:"Amplifon",shop:"hearing_aids"}},"shop/hearing_aids|Audika":{tags:{brand:"Audika","brand:wikidata":"Q2870745","brand:wikipedia":"fr:Audika",name:"Audika",shop:"hearing_aids"}},"shop/hearing_aids|Beter Horen":{tags:{brand:"Beter Horen",name:"Beter Horen",shop:"hearing_aids"}},"shop/hearing_aids|Geers":{tags:{brand:"Geers","brand:wikidata":"Q1497707","brand:wikipedia":"de:Geers Hörakustik",name:"Geers",shop:"hearing_aids"}},"shop/hearing_aids|Kind Hörgeräte":{countryCodes:["de"],matchNames:["kind"],tags:{brand:"Kind Hörgeräte","brand:wikidata":"Q43598590","brand:wikipedia":"de:Kind Hörgeräte",name:"Kind Hörgeräte",shop:"hearing_aids"}},"shop/hearing_aids|Neuroth":{countryCodes:["at","de"],tags:{brand:"Neuroth","brand:wikidata":"Q15836645","brand:wikipedia":"de:Neuroth AG",name:"Neuroth",shop:"hearing_aids"}},"shop/hifi|Bang & Olufsen":{tags:{brand:"Bang & Olufsen","brand:wikidata":"Q790020","brand:wikipedia":"en:Bang & Olufsen",name:"Bang & Olufsen",shop:"hifi"}},"shop/hobby|アニメイト":{countryCodes:["jp"],tags:{brand:"アニメイト","brand:ja":"アニメイト",name:"アニメイト","name:ja":"アニメイト",shop:"hobby"}},"shop/houseware|Bed Bath & Beyond":{matchNames:["bed bath and beyond"],matchTags:["shop/department_store"],tags:{brand:"Bed Bath & Beyond","brand:wikidata":"Q813782","brand:wikipedia":"en:Bed Bath & Beyond",name:"Bed Bath & Beyond",shop:"houseware"}},"shop/houseware|Blokker":{tags:{brand:"Blokker","brand:wikidata":"Q884934","brand:wikipedia":"en:Blokker Holding",name:"Blokker",shop:"houseware"}},"shop/houseware|Cervera":{countryCodes:["se"],tags:{brand:"Cervera","brand:wikidata":"Q10447179","brand:wikipedia":"sv:Cervera (företag)",name:"Cervera",shop:"houseware"}},"shop/houseware|HomeGoods":{tags:{brand:"HomeGoods","brand:wikidata":"Q5887941","brand:wikipedia":"en:HomeGoods",name:"HomeGoods",shop:"houseware"}},"shop/houseware|Lagerhaus":{matchTags:["shop/doityourself"],tags:{brand:"Lagerhaus","brand:wikidata":"Q10553211","brand:wikipedia":"sv:Lagerhaus",name:"Lagerhaus",shop:"houseware"}},"shop/houseware|Marskramer":{countryCodes:["nl"],tags:{brand:"Marskramer","brand:wikidata":"Q2305917","brand:wikipedia":"nl:Marskramer (warenhuis)",name:"Marskramer",shop:"houseware"}},"shop/houseware|Old Time Pottery":{countryCodes:["us"],tags:{brand:"Old Time Pottery","brand:website":"http://www.oldtimepottery.com","brand:wikidata":"Q7085222","brand:wikipedia":"en:Old Time Pottery",name:"Old Time Pottery",shop:"houseware"}},"shop/houseware|Sur La Table":{countryCodes:["us"],tags:{brand:"Sur La Table","brand:wikidata":"Q7645220","brand:wikipedia":"en:Sur La Table",name:"Sur La Table",shop:"houseware"}},"shop/houseware|The Container Store":{countryCodes:["us"],tags:{brand:"The Container Store","brand:wikidata":"Q7727445","brand:wikipedia":"en:The Container Store",name:"The Container Store",shop:"houseware"}},"shop/houseware|Tuesday Morning":{countryCodes:["us"],matchTags:["shop/convenience","shop/department_store","shop/gift","shop/variety_store"],tags:{brand:"Tuesday Morning","brand:wikidata":"Q7851426","brand:wikipedia":"en:Tuesday Morning",name:"Tuesday Morning",shop:"houseware"}},"shop/houseware|WMF":{countryCodes:["at","de"],tags:{brand:"WMF","brand:wikidata":"Q451423","brand:wikipedia":"en:WMF Group",name:"WMF",shop:"houseware"}},"shop/houseware|World Market":{countryCodes:["us"],matchNames:["cost plus"],matchTags:["shop/department_store","shop/furniture","shop/supermarket"],tags:{brand:"World Market","brand:wikidata":"Q5174750","brand:wikipedia":"en:Cost Plus World Market",name:"World Market",official_name:"Cost Plus World Market",shop:"interior_decoration"}},"shop/houseware|Xenos":{tags:{brand:"Xenos","brand:wikidata":"Q16547960","brand:wikipedia":"nl:Xenos",name:"Xenos",shop:"houseware"}},"shop/houseware|Еврочехол":{tags:{brand:"Еврочехол",name:"Еврочехол",shop:"houseware"}},"shop/interior_decoration|Depot":{countryCodes:["at","ch","de"],tags:{brand:"Depot","brand:wikidata":"Q1191740","brand:wikipedia":"de:Gries Deco Holding",name:"Depot",shop:"interior_decoration"}},"shop/interior_decoration|Hemtex":{countryCodes:["ee","fi","se"],tags:{brand:"Hemtex","brand:wikidata":"Q10521868","brand:wikipedia":"sv:Hemtex",name:"Hemtex",shop:"interior_decoration"}},"shop/interior_decoration|Kirkland's":{countryCodes:["us"],matchTags:["shop/department_store"],tags:{brand:"Kirkland's","brand:wikidata":"Q6415714","brand:wikipedia":"en:Kirkland's",name:"Kirkland's",shop:"interior_decoration"}},"shop/interior_decoration|Pier 1 Imports":{countryCodes:["ca","us"],matchTags:["shop/furniture"],tags:{brand:"Pier 1 Imports","brand:wikidata":"Q7191691","brand:wikipedia":"en:Pier 1 Imports",name:"Pier 1 Imports",shop:"interior_decoration"}},"shop/jewelry|585":{tags:{brand:"585",name:"585",shop:"jewelry"}},"shop/jewelry|Alex and Ani":{tags:{brand:"Alex and Ani","brand:wikidata":"Q16198810","brand:wikipedia":"en:Alex and Ani",name:"Alex and Ani",shop:"jewelry"}},"shop/jewelry|Apart":{countryCodes:["pl"],tags:{brand:"Apart","brand:wikidata":"Q11686561","brand:wikipedia":"pl:Apart",name:"Apart",shop:"jewelry"}},"shop/jewelry|Bijou Brigitte":{tags:{brand:"Bijou Brigitte","brand:wikidata":"Q599545","brand:wikipedia":"de:Bijou Brigitte",name:"Bijou Brigitte",shop:"jewelry"}},"shop/jewelry|Bijouterie":{tags:{brand:"Bijouterie",name:"Bijouterie",shop:"jewelry"}},"shop/jewelry|Cartier":{tags:{brand:"Cartier","brand:wikidata":"Q538587","brand:wikipedia":"en:Cartier (jeweler)",name:"Cartier",shop:"jewelry"}},"shop/jewelry|Christ":{countryCodes:["ch","de","nl"],tags:{brand:"Christ","brand:wikidata":"Q1077957","brand:wikipedia":"de:Christ (Juwelier)",name:"Christ",shop:"jewelry"}},"shop/jewelry|Claire's":{matchTags:["shop/clothes"],tags:{brand:"Claire's","brand:wikidata":"Q2974996","brand:wikipedia":"en:Claire's",name:"Claire's",shop:"jewelry"}},"shop/jewelry|Ernest Jones":{tags:{brand:"Ernest Jones","brand:wikidata":"Q5393358","brand:wikipedia":"en:Ernest Jones (retailer)",name:"Ernest Jones",shop:"jewelry"}},"shop/jewelry|Guldfynd":{countryCodes:["se"],tags:{brand:"Guldfynd","brand:wikidata":"Q49099223","brand:wikipedia":"sv:Guldfynd",name:"Guldfynd",shop:"jewelry"}},"shop/jewelry|H Samuel":{tags:{brand:"H Samuel","brand:wikidata":"Q5628558","brand:wikipedia":"en:H. Samuel",name:"H Samuel",shop:"jewelry"}},"shop/jewelry|Histoire d'Or":{countryCodes:["be","fr","it","nl"],tags:{brand:"Histoire d'Or","brand:wikidata":"Q62529245",name:"Histoire d'Or",shop:"jewelry"}},"shop/jewelry|James Avery Jewelry":{tags:{brand:"James Avery Jewelry","brand:wikidata":"Q6129024","brand:wikipedia":"en:James Avery Artisan Jewelry",name:"James Avery Jewelry",shop:"jewelry"}},"shop/jewelry|Jared":{countryCodes:["us"],tags:{brand:"Jared","brand:wikidata":"Q62029282",name:"Jared",operator:"Sterling Jewelers","operator:wikidata":"Q7611434","operator:wikipedia":"en:Sterling Jewelers",shop:"jewelry"}},"shop/jewelry|Julien d'Orcel":{countryCodes:["fr"],tags:{brand:"Julien d'Orcel","brand:wikidata":"Q62497463",name:"Julien d'Orcel",shop:"jewelry"}},"shop/jewelry|Kay Jewelers":{countryCodes:["us"],tags:{brand:"Kay Jewelers","brand:wikidata":"Q62029290",name:"Kay Jewelers",operator:"Sterling Jewelers","operator:wikidata":"Q7611434","operator:wikipedia":"en:Sterling Jewelers",shop:"jewelry"}},"shop/jewelry|PNJ":{tags:{brand:"PNJ","brand:wikidata":"Q61129183","brand:wikipedia":"vi:PNJ",name:"PNJ",shop:"jewelry"}},"shop/jewelry|Pandora":{tags:{brand:"Pandora","brand:wikidata":"Q2241604","brand:wikipedia":"en:Pandora (jewelry)",name:"Pandora",shop:"jewelry"}},"shop/jewelry|Swarovski":{tags:{brand:"Swarovski","brand:wikidata":"Q611115","brand:wikipedia":"en:Swarovski",name:"Swarovski",shop:"jewelry"}},"shop/jewelry|Адамас":{countryCodes:["ru"],tags:{brand:"Адамас","brand:wikidata":"Q62393709",name:"Адамас",shop:"jewelry"}},"shop/jewelry|Золотая мечта":{tags:{brand:"Золотая мечта",name:"Золотая мечта",shop:"jewelry"}},"shop/kiosk|Lietuvos spauda":{countryCodes:["lt"],tags:{brand:"Lietuvos spauda","brand:wikidata":"Q6514414","brand:wikipedia":"lt:Lietuvos spauda",name:"Lietuvos spauda",shop:"kiosk"}},"shop/kiosk|Narvesen":{tags:{brand:"Narvesen","brand:wikidata":"Q6514414","brand:wikipedia":"en:Narvesen",name:"Narvesen",shop:"kiosk"}},"shop/kiosk|Pressbyrån":{countryCodes:["se"],tags:{brand:"Pressbyrån","brand:wikidata":"Q2489072","brand:wikipedia":"en:Pressbyrån",name:"Pressbyrån",shop:"kiosk"}},"shop/kiosk|R-Kioski":{tags:{brand:"R-Kioski","brand:wikidata":"Q1571400","brand:wikipedia":"en:R-kioski",name:"R-Kioski",shop:"kiosk"}},"shop/kiosk|Ruch":{countryCodes:["pl"],tags:{brand:"Ruch","brand:wikidata":"Q1260314","brand:wikipedia":"pl:Ruch (przedsiębiorstwo)",name:"Ruch",shop:"kiosk"}},"shop/kiosk|Tisak":{tags:{brand:"Tisak","brand:wikidata":"Q12643627","brand:wikipedia":"hr:Tisak (tvrtka)",name:"Tisak",shop:"kiosk"}},"shop/kiosk|k kiosk":{countryCodes:["ch"],nomatch:["shop/newsagent|k kiosk"],tags:{brand:"k kiosk","brand:wikidata":"Q60381703","brand:wikipedia":"it:K Kiosk",name:"k kiosk",shop:"kiosk"}},"shop/kiosk|Роспечать":{tags:{brand:"Роспечать",name:"Роспечать",shop:"kiosk"}},"shop/kitchen|Cuisinella":{countryCodes:["fr","tn"],tags:{brand:"Cuisinella","brand:wikidata":"Q3007012","brand:wikipedia":"fr:Cuisinella",name:"Cuisinella",shop:"kitchen"}},"shop/kitchen|Ixina":{tags:{brand:"Ixina",name:"Ixina",shop:"kitchen"}},"shop/kitchen|Mobalpa":{countryCodes:["be","fr","gb"],tags:{brand:"Mobalpa","brand:wikidata":"Q3317571","brand:wikipedia":"fr:Mobalpa",name:"Mobalpa",shop:"kitchen"}},"shop/kitchen|Schmidt":{countryCodes:["be","es","fr","gb"],tags:{brand:"Schmidt","brand:wikidata":"Q3487620","brand:wikipedia":"de:Schmidt Groupe",name:"Schmidt",shop:"kitchen"}},"shop/kitchen|SoCoo'c":{countryCodes:["fr"],tags:{brand:"SoCoo'c","brand:wikidata":"Q62783840","brand:wikipedia":"fr:SoCoo'c",name:"SoCoo'c",shop:"kitchen"}},"shop/massage|Massage Envy":{countryCodes:["us"],tags:{brand:"Massage Envy","brand:wikidata":"Q22922899","brand:wikipedia":"en:Massage Envy",name:"Massage Envy",shop:"massage"}},"shop/medical_supply|Pofam-Poznań":{countryCodes:["pl"],tags:{brand:"Pofam-Poznań","brand:wikidata":"Q62057457",name:"Pofam-Poznań",shop:"medical_supply"}},"shop/medical_supply|Ортека":{countryCodes:["ru"],tags:{brand:"Ортека","brand:wikidata":"Q62393660",name:"Ортека",shop:"medical_supply"}},"shop/mobile_phone|3 Store":{matchNames:["3","three","three store"],tags:{brand:"3 Store","brand:wikidata":"Q407009","brand:wikipedia":"en:3 (telecommunications)",name:"3 Store",shop:"mobile_phone"}},"shop/mobile_phone|AT&T":{countryCodes:["mx","us"],tags:{brand:"AT&T","brand:wikidata":"Q298594","brand:wikipedia":"en:AT&T Mobility",name:"AT&T",shop:"mobile_phone"}},"shop/mobile_phone|Bell":{countryCodes:["ca"],tags:{brand:"Bell","brand:wikidata":"Q2894594","brand:wikipedia":"en:Bell Mobility",name:"Bell",shop:"mobile_phone"}},"shop/mobile_phone|Bitė":{countryCodes:["lt"],tags:{brand:"Bitė","brand:wikidata":"Q796010","brand:wikipedia":"lt:Bitės grupė",name:"Bitė",shop:"mobile_phone"}},"shop/mobile_phone|Boost Mobile":{countryCodes:["us"],tags:{brand:"Boost Mobile","brand:wikidata":"Q4943790","brand:wikipedia":"en:Boost Mobile",name:"Boost Mobile",shop:"mobile_phone"}},"shop/mobile_phone|Bouygues Telecom":{countryCodes:["fr"],tags:{brand:"Bouygues Telecom",name:"Bouygues Telecom",shop:"mobile_phone"}},"shop/mobile_phone|Carphone Warehouse":{countryCodes:["by","gb","ie"],tags:{brand:"Carphone Warehouse","brand:wikidata":"Q118046","brand:wikipedia":"en:Carphone Warehouse",name:"Carphone Warehouse",shop:"mobile_phone"}},"shop/mobile_phone|Claro":{tags:{brand:"Claro","brand:wikidata":"Q1770208","brand:wikipedia":"en:Claro (company)",name:"Claro",shop:"mobile_phone"}},"shop/mobile_phone|Cricket Wireless":{countryCodes:["us"],matchNames:["cricket"],tags:{brand:"Cricket Wireless","brand:wikidata":"Q5184987","brand:wikipedia":"en:Cricket Wireless",name:"Cricket Wireless",shop:"mobile_phone"}},"shop/mobile_phone|Digicel":{tags:{brand:"Digicel","brand:wikidata":"Q2117506","brand:wikipedia":"en:Digicel",name:"Digicel",shop:"mobile_phone"}},"shop/mobile_phone|EE":{countryCodes:["gb"],tags:{brand:"EE","brand:wikidata":"Q5322942","brand:wikipedia":"en:EE Limited",name:"EE",shop:"mobile_phone"}},"shop/mobile_phone|Entel":{tags:{brand:"Entel","brand:wikidata":"Q450420","brand:wikipedia":"en:Entel (Chile)",name:"Entel",shop:"mobile_phone"}},"shop/mobile_phone|Fido":{countryCodes:["ca"],tags:{brand:"Fido",name:"Fido",shop:"mobile_phone"}},"shop/mobile_phone|Freedom Mobile":{countryCodes:["ca"],matchNames:["wind mobile"],tags:{brand:"Freedom Mobile","brand:wikidata":"Q8023931","brand:wikipedia":"en:Freedom Mobile",name:"Freedom Mobile",shop:"mobile_phone"}},"shop/mobile_phone|MTN":{matchNames:["agence mtn"],matchTags:["office/telecommunication"],tags:{brand:"MTN","brand:wikidata":"Q1813361","brand:wikipedia":"en:MTN Group",name:"MTN",shop:"mobile_phone"}},"shop/mobile_phone|MetroPCS":{countryCodes:["us"],tags:{brand:"MetroPCS","brand:wikidata":"Q1925685","brand:wikipedia":"en:Metro by T-Mobile",name:"MetroPCS",shop:"mobile_phone"}},"shop/mobile_phone|Mobilcom Debitel":{countryCodes:["de","ir"],matchNames:["debitel"],tags:{brand:"Mobilcom Debitel","brand:wikidata":"Q344744","brand:wikipedia":"en:Debitel",name:"Mobilcom Debitel",shop:"mobile_phone"}},"shop/mobile_phone|Moov":{countryCodes:["ci","tg"],matchNames:["agence moov"],matchTags:["office/telecommunication"],tags:{brand:"Moov","brand:wikidata":"Q3323637","brand:wikipedia":"fr:Moov Côte d'Ivoire",name:"Moov",shop:"mobile_phone"}},"shop/mobile_phone|Movistar":{tags:{brand:"Movistar","brand:wikidata":"Q967735","brand:wikipedia":"en:Movistar",name:"Movistar",shop:"mobile_phone"}},"shop/mobile_phone|O2":{countryCodes:["cz","de","gb","ie","sk"],tags:{brand:"O2","brand:wikidata":"Q7072246","brand:wikipedia":"en:O2 (Ireland)",name:"O2",shop:"mobile_phone"}},"shop/mobile_phone|Optie1":{countryCodes:["nl"],tags:{brand:"Optie1","brand:wikidata":"Q62393564",name:"Optie1",shop:"mobile_phone"}},"shop/mobile_phone|Orange":{matchNames:["agence orange"],matchTags:["office/telecommunication"],tags:{brand:"Orange","brand:wikidata":"Q1431486","brand:wikipedia":"fr:Orange (entreprise)",name:"Orange",shop:"mobile_phone"}},"shop/mobile_phone|Personal":{countryCodes:["ar","py"],tags:{brand:"Personal","brand:wikidata":"Q10933021","brand:wikipedia":"es:Personal (Argentina)",name:"Personal",shop:"mobile_phone"}},"shop/mobile_phone|Phone House":{matchNames:["the phone house"],tags:{brand:"Phone House","brand:wikidata":"Q118046","brand:wikipedia":"en:Carphone Warehouse",name:"Phone House",shop:"mobile_phone"}},"shop/mobile_phone|Play":{countryCodes:["pl"],tags:{brand:"Play","brand:wikidata":"Q7202998","brand:wikipedia":"pl:Play (sieć telefonii komórkowej)",name:"Play",shop:"mobile_phone"}},"shop/mobile_phone|Plus":{countryCodes:["pl"],nomatch:["shop/supermarket|PLUS"],tags:{brand:"Plus","brand:wikidata":"Q7205598","brand:wikipedia":"pl:Plus (sieć telefonii komórkowej)",name:"Plus",shop:"mobile_phone"}},"shop/mobile_phone|Rogers":{countryCodes:["ca"],tags:{brand:"Rogers","brand:wikidata":"Q3439663","brand:wikipedia":"en:Rogers Wireless",name:"Rogers",shop:"mobile_phone"}},"shop/mobile_phone|SFR":{countryCodes:["fr","lu"],matchNames:["espace sfr"],tags:{brand:"SFR","brand:wikidata":"Q218765","brand:wikipedia":"en:SFR",name:"SFR",shop:"mobile_phone"}},"shop/mobile_phone|Sprint":{nomatch:["amenity/fuel|Sprint"],tags:{brand:"Sprint","brand:wikidata":"Q301965","brand:wikipedia":"en:Sprint Corporation",name:"Sprint",shop:"mobile_phone"}},"shop/mobile_phone|T-Mobile":{tags:{brand:"T-Mobile","brand:wikidata":"Q327634","brand:wikipedia":"en:T-Mobile",name:"T-Mobile",shop:"mobile_phone"}},"shop/mobile_phone|TIM":{countryCodes:["br","it"],tags:{brand:"TIM","brand:wikidata":"Q144617","brand:wikipedia":"en:Telecom Italia",name:"TIM",shop:"mobile_phone"}},"shop/mobile_phone|Telcel":{countryCodes:["cu","mx"],tags:{brand:"Telcel","brand:wikidata":"Q3517255","brand:wikipedia":"en:Telcel",name:"Telcel",shop:"mobile_phone"}},"shop/mobile_phone|Tele2":{tags:{brand:"Tele2","brand:wikidata":"Q309865","brand:wikipedia":"en:Tele2",name:"Tele2",shop:"mobile_phone"}},"shop/mobile_phone|Telekom":{countryCodes:["de","hu","ro","si","sk"],matchNames:["telekom shop"],tags:{brand:"Telekom","brand:wikidata":"Q9396","brand:wikipedia":"en:Deutsche Telekom",name:"Telekom",shop:"mobile_phone"}},"shop/mobile_phone|Telenor":{tags:{brand:"Telenor","brand:wikidata":"Q845632","brand:wikipedia":"en:Telenor",name:"Telenor",shop:"mobile_phone"}},"shop/mobile_phone|Telia":{countryCodes:["dk","fi","lt","no","se"],tags:{brand:"Telia",name:"Telia",shop:"mobile_phone"}},"shop/mobile_phone|Telstra":{countryCodes:["au"],tags:{brand:"Telstra","brand:wikidata":"Q721162","brand:wikipedia":"en:Telstra",name:"Telstra",shop:"mobile_phone"}},"shop/mobile_phone|Telus":{countryCodes:["ca"],tags:{brand:"Telus","brand:wikidata":"Q165858","brand:wikipedia":"en:Telus",name:"Telus",shop:"mobile_phone"}},"shop/mobile_phone|Turkcell":{countryCodes:["cy","tr"],tags:{brand:"Turkcell","brand:wikidata":"Q283852","brand:wikipedia":"en:Turkcell",name:"Turkcell",shop:"mobile_phone"}},"shop/mobile_phone|U.S. Cellular":{countryCodes:["us"],tags:{brand:"U.S. Cellular","brand:wikidata":"Q2466256","brand:wikipedia":"en:U.S. Cellular",name:"U.S. Cellular",shop:"mobile_phone"}},"shop/mobile_phone|Verizon Wireless":{countryCodes:["us"],matchNames:["verizon"],tags:{brand:"Verizon Wireless","brand:wikidata":"Q919641","brand:wikipedia":"en:Verizon Wireless",name:"Verizon Wireless",shop:"mobile_phone"}},"shop/mobile_phone|Vivo":{tags:{brand:"Vivo",name:"Vivo",shop:"mobile_phone"}},"shop/mobile_phone|Vodafone":{matchNames:["vodafone shop"],tags:{brand:"Vodafone","brand:wikidata":"Q122141","brand:wikipedia":"en:Vodafone",name:"Vodafone",shop:"mobile_phone"}},"shop/mobile_phone|WIFI_ETECSA":{countryCodes:["cu"],tags:{brand:"WIFI_ETECSA","brand:wikidata":"Q490323","brand:wikipedia":"es:Empresa de Telecomunicaciones de Cuba",name:"WIFI_ETECSA",shop:"mobile_phone"}},"shop/mobile_phone|Wind":{countryCodes:["it"],tags:{brand:"Wind","brand:wikidata":"Q650467","brand:wikipedia":"en:WIND (Italy)",name:"Wind",shop:"mobile_phone"}},"shop/mobile_phone|Yoigo":{countryCodes:["es"],tags:{brand:"Yoigo","brand:wikidata":"Q2630989","brand:wikipedia":"en:Yoigo",name:"Yoigo",shop:"mobile_phone"}},"shop/mobile_phone|auショップ":{countryCodes:["jp"],matchNames:["au"],tags:{brand:"au","brand:ja":"au","brand:wikidata":"Q307110","brand:wikipedia":"ja:Au (携帯電話)",name:"auショップ","name:en":"au","name:ja":"auショップ",shop:"mobile_phone"}},"shop/mobile_phone|Алло":{countryCodes:["md","ua"],tags:{brand:"Алло","brand:wikidata":"Q18683057","brand:wikipedia":"uk:Алло (торгова мережа)",name:"Алло",shop:"mobile_phone"}},"shop/mobile_phone|Билайн":{tags:{brand:"Билайн","brand:en":"Beeline","brand:wikidata":"Q402880","brand:wikipedia":"en:Beeline (brand)",name:"Билайн","name:en":"Beeline",shop:"mobile_phone"}},"shop/mobile_phone|Евросеть":{countryCodes:["by","kz","ru","ua"],tags:{brand:"Евросеть","brand:en":"Euroset","brand:wikidata":"Q65310","brand:wikipedia":"en:Euroset",name:"Евросеть","name:en":"Euroset",shop:"mobile_phone"}},"shop/mobile_phone|Київстар":{countryCodes:["ua"],tags:{brand:"Київстар","brand:en":"Kyivstar","brand:wikidata":"Q2288463","brand:wikipedia":"en:Kyivstar",name:"Київстар","name:en":"Kyivstar",shop:"mobile_phone"}},"shop/mobile_phone|МТС":{countryCodes:["by","ru","ua"],tags:{brand:"МТС","brand:en":"MTS","brand:wikidata":"Q1368919","brand:wikipedia":"en:MTS (network provider)",name:"МТС","name:en":"MTS",shop:"mobile_phone"}},"shop/mobile_phone|Мегафон":{countryCodes:["ru","tj"],tags:{brand:"Мегафон","brand:en":"MegaFon","brand:wikidata":"Q1720713","brand:wikipedia":"en:MegaFon",name:"Мегафон","name:en":"MegaFon",shop:"mobile_phone"}},"shop/mobile_phone|Связной":{countryCodes:["by","ru","uz"],tags:{brand:"Связной","brand:en":"Svyaznoy","brand:wikidata":"Q65371","brand:wikipedia":"en:Svyaznoy",name:"Связной","name:en":"Svyaznoy",shop:"mobile_phone"}},"shop/mobile_phone|Теле2":{countryCodes:["ru"],tags:{brand:"Теле2","brand:en":"Tele2","brand:wikidata":"Q309865","brand:wikipedia":"en:Tele2",name:"Теле2","name:en":"Tele2",shop:"mobile_phone"}},"shop/mobile_phone|ソフトバンク":{countryCodes:["jp"],tags:{brand:"ソフトバンク","brand:en":"SoftBank Telecom","brand:ja":"ソフトバンク","brand:wikidata":"Q7553832","brand:wikipedia":"en:SoftBank Telecom",name:"ソフトバンク","name:en":"SoftBank Telecom","name:ja":"ソフトバンク",shop:"mobile_phone"}},"shop/mobile_phone|ソフトバンクショップ":{countryCodes:["jp"],tags:{brand:"ソフトバンクショップ","brand:en":"SoftBankShop","brand:ja":"ソフトバンクショップ","brand:wikidata":"Q11315281","brand:wikipedia":"ja:ソフトバンクショップ",name:"ソフトバンクショップ","name:en":"SoftBankShop","name:ja":"ソフトバンクショップ",shop:"mobile_phone"}},"shop/mobile_phone|ドコモショップ":{countryCodes:["jp"],tags:{brand:"ドコモショップ","brand:en":"DoCoMo Shop","brand:ja":"ドコモショップ","brand:wikidata":"Q853958","brand:wikipedia":"ja:NTTドコモ",name:"ドコモショップ","name:en":"DoCoMo Shop","name:ja":"ドコモショップ",shop:"mobile_phone"}},"shop/mobile_phone|ワイモバイル":{countryCodes:["jp"],tags:{brand:"ワイモバイル","brand:ja":"ワイモバイル",name:"ワイモバイル","name:ja":"ワイモバイル",shop:"mobile_phone"}},"shop/money_lender|Cash Store":{countryCodes:["us"],tags:{brand:"Cash Store","brand:wikidata":"Q61943411",name:"Cash Store",shop:"money_lender"}},"shop/money_lender|Check Into Cash":{countryCodes:["us"],tags:{brand:"Check Into Cash","brand:wikidata":"Q16961246","brand:wikipedia":"en:Check Into Cash",name:"Check Into Cash",shop:"money_lender"}},"shop/money_lender|Money Mart":{tags:{brand:"Money Mart","brand:wikidata":"Q6899166","brand:wikipedia":"en:Money Mart",name:"Money Mart",shop:"money_lender"}},"shop/motorcycle|Harley-Davidson":{tags:{brand:"Harley-Davidson","brand:wikidata":"Q192814","brand:wikipedia":"en:Harley-Davidson",name:"Harley-Davidson",shop:"motorcycle"}},"shop/motorcycle|Honda":{nomatch:["shop/car|Honda"],tags:{brand:"Honda","brand:wikidata":"Q9584","brand:wikipedia":"en:Honda",name:"Honda",shop:"motorcycle"}},"shop/motorcycle|Kawasaki":{tags:{brand:"Kawasaki","brand:wikidata":"Q6379855","brand:wikipedia":"en:Kawasaki motorcycles",name:"Kawasaki",shop:"motorcycle"}},"shop/motorcycle|Motortrade":{countryCodes:["ph"],tags:{brand:"Motortrade","brand:wikidata":"Q48803162","brand:wikipedia":"en:Motortrade",name:"Motortrade",shop:"motorcycle"}},"shop/motorcycle|Suzuki":{nomatch:["shop/car|Suzuki"],tags:{brand:"Suzuki","brand:wikidata":"Q181642","brand:wikipedia":"en:Suzuki",name:"Suzuki",shop:"motorcycle"}},"shop/motorcycle|Yamaha":{tags:{brand:"Yamaha","brand:wikidata":"Q158888","brand:wikipedia":"en:Yamaha Motor Company",name:"Yamaha",shop:"motorcycle"}},"shop/motorcycle|レッドバロン":{countryCodes:["jp"],tags:{brand:"レッドバロン","brand:ja":"レッドバロン",name:"レッドバロン","name:ja":"レッドバロン",shop:"motorcycle"}},"shop/music|HMV":{tags:{brand:"HMV","brand:wikidata":"Q10854572","brand:wikipedia":"en:HMV",name:"HMV",shop:"music"}},"shop/music|TSUTAYA":{nomatch:["shop/books|TSUTAYA","shop/video|TSUTAYA"],tags:{brand:"TSUTAYA","brand:wikidata":"Q5193457","brand:wikipedia":"ja:カルチュア・コンビニエンス・クラブ",name:"TSUTAYA",shop:"music"}},"shop/musical_instrument|Guitar Center":{tags:{brand:"Guitar Center","brand:wikidata":"Q3622794","brand:wikipedia":"en:Guitar Center",name:"Guitar Center",shop:"musical_instrument"}},"shop/newsagent|Cigo":{countryCodes:["de","nl"],tags:{brand:"Cigo","brand:wikidata":"Q62391977",name:"Cigo",shop:"newsagent"}},"shop/newsagent|Hudson News":{tags:{brand:"Hudson News",name:"Hudson News",shop:"newsagent"}},"shop/newsagent|Kolporter":{countryCodes:["pl"],matchTags:["shop/kiosk"],tags:{brand:"Kolporter","brand:wikidata":"Q6427874","brand:wikipedia":"pl:Kolporter (przedsiębiorstwo)",name:"Kolporter",shop:"kiosk"}},"shop/newsagent|Maison de la Presse":{countryCodes:["fr"],matchTags:["shop/books"],tags:{brand:"Maison de la Presse","brand:wikidata":"Q62085960",name:"Maison de la Presse",shop:"newsagent"}},"shop/newsagent|Martin's":{countryCodes:["gb"],matchTags:["shop/convenience"],tags:{brand:"Martin's","brand:wikidata":"Q16997477","brand:wikipedia":"en:McColl's",name:"Martin's",shop:"newsagent"}},"shop/newsagent|Primera":{countryCodes:["nl"],tags:{brand:"Primera","brand:wikidata":"Q2176149","brand:wikipedia":"nl:Primera (winkelketen)",name:"Primera",shop:"newsagent"}},"shop/newsagent|Relay":{matchTags:["shop/kiosk"],tags:{brand:"Relay","brand:wikidata":"Q3424298","brand:wikipedia":"en:Relay (shop)",name:"Relay",shop:"newsagent"}},"shop/newsagent|WHSmith":{matchTags:["shop/books","shop/kiosk"],tags:{brand:"WHSmith","brand:wikidata":"Q1548712","brand:wikipedia":"en:WHSmith",name:"WHSmith",shop:"newsagent"}},"shop/newsagent|k kiosk":{countryCodes:["ch"],nomatch:["shop/kiosk|k kiosk"],tags:{brand:"k kiosk","brand:wikidata":"Q60381703","brand:wikipedia":"it:K Kiosk",name:"k kiosk",shop:"newsagent"}},"shop/newsagent|Белсоюзпечать":{countryCodes:["by"],matchTags:["shop/kiosk"],nomatch:["shop/newsagent|Витебскоблсоюзпечать","shop/newsagent|Союзпечать"],tags:{brand:"Белсоюзпечать","brand:wikidata":"Q4430611","brand:wikipedia":"ru:Союзпечать",name:"Белсоюзпечать",shop:"newsagent"}},"shop/newsagent|Витебскоблсоюзпечать":{countryCodes:["by"],matchTags:["shop/kiosk"],nomatch:["shop/newsagent|Белсоюзпечать","shop/newsagent|Союзпечать"],tags:{brand:"Витебскоблсоюзпечать","brand:wikidata":"Q4430611","brand:wikipedia":"ru:Союзпечать",name:"Витебскоблсоюзпечать",shop:"newsagent"}},"shop/newsagent|Первая полоса":{tags:{brand:"Первая полоса","brand:wikidata":"Q62736412",name:"Первая полоса",shop:"newsagent"}},"shop/newsagent|Роспечать":{tags:{brand:"Роспечать",name:"Роспечать",shop:"newsagent"}},"shop/newsagent|Союзпечать":{countryCodes:["by","kz","ru","ua"],matchTags:["shop/kiosk"],nomatch:["shop/newsagent|Белсоюзпечать","shop/newsagent|Витебскоблсоюзпечать"],tags:{brand:"Союзпечать","brand:wikidata":"Q4430611","brand:wikipedia":"ru:Союзпечать",name:"Союзпечать",shop:"newsagent"}},"shop/newsagent|読売新聞":{countryCodes:["jp"],tags:{brand:"読売新聞","brand:en":"Yomiuri Shimbun","brand:wikidata":"Q645218","brand:wikipedia":"en:Yomiuri Shimbun",name:"読売新聞","name:en":"Yomiuri Shimbun",shop:"newsagent"}},"shop/nutrition_supplements|GNC":{tags:{brand:"GNC","brand:wikidata":"Q4808595","brand:wikipedia":"en:GNC (store)",name:"GNC",shop:"nutrition_supplements"}},"shop/nutrition_supplements|The Vitamin Shoppe":{countryCodes:["us"],tags:{brand:"The Vitamin Shoppe","brand:wikidata":"Q7772938","brand:wikipedia":"en:The Vitamin Shoppe",name:"The Vitamin Shoppe",shop:"nutrition_supplements"}},"shop/optician|Alain Afflelou":{tags:{brand:"Alain Afflelou","brand:wikidata":"Q2829511","brand:wikipedia":"fr:Alain Afflelou (entreprise)",name:"Alain Afflelou",shop:"optician"}},"shop/optician|America's Best Contacts & Eyeglasses":{countryCodes:["us"],tags:{brand:"America's Best Contacts & Eyeglasses","brand:wikidata":"Q4742504","brand:wikipedia":"en:America's Best Contacts & Eyeglasses",name:"America's Best Contacts & Eyeglasses",shop:"optician"}},"shop/optician|Apollo":{countryCodes:["de"],matchNames:["apollo optik"],tags:{brand:"Apollo","brand:wikidata":"Q618940","brand:wikipedia":"de:Apollo-Optik",name:"Apollo",shop:"optician"}},"shop/optician|Atol":{countryCodes:["fr"],tags:{brand:"Atol","brand:wikidata":"Q2869542","brand:wikipedia":"fr:Atol (opticien)",name:"Atol",shop:"optician"}},"shop/optician|Boots Opticians":{tags:{brand:"Boots Opticians","brand:wikidata":"Q4944037","brand:wikipedia":"en:Boots Opticians",name:"Boots Opticians",shop:"optician"}},"shop/optician|Die Brille":{tags:{brand:"Die Brille",name:"Die Brille",shop:"optician"}},"shop/optician|Eye Wish":{countryCodes:["nl"],tags:{brand:"Eye Wish","brand:wikidata":"Q62391641",name:"Eye Wish",operator:"GrandVision","operator:wikidata":"Q15812731","operator:wikipedia":"nl:GrandVision",shop:"optician"}},"shop/optician|Fielmann":{tags:{brand:"Fielmann","brand:wikidata":"Q457822","brand:wikipedia":"en:Fielmann",name:"Fielmann",shop:"optician"}},"shop/optician|GMO":{countryCodes:["cl","co","ec","pe"],tags:{brand:"GMO",name:"GMO",shop:"optician"}},"shop/optician|General Óptica":{countryCodes:["es"],tags:{brand:"General Óptica","brand:wikidata":"Q62391672",name:"General Óptica",shop:"optician"}},"shop/optician|Grand Optical":{countryCodes:["fr"],tags:{brand:"Grand Optical","brand:wikidata":"Q3113677","brand:wikipedia":"fr:Grand Optical",name:"Grand Optical",shop:"optician"}},"shop/optician|Générale d'Optique":{countryCodes:["fr"],tags:{brand:"Générale d'Optique","brand:wikidata":"Q62391701",name:"Générale d'Optique",shop:"optician"}},"shop/optician|Hakim Optical":{countryCodes:["ca"],tags:{brand:"Hakim Optical","brand:wikidata":"Q28232761","brand:wikipedia":"en:Hakim Optical",name:"Hakim Optical",shop:"optician"}},"shop/optician|Hans Anders":{tags:{brand:"Hans Anders","brand:wikidata":"Q1884976","brand:wikipedia":"nl:Hans Anders",name:"Hans Anders",shop:"optician"}},"shop/optician|Instrumentarium":{countryCodes:["fi"],tags:{brand:"Instrumentarium","brand:wikidata":"Q11864937","brand:wikipedia":"fi:Instrumentarium",name:"Instrumentarium",shop:"optician"}},"shop/optician|Krys":{countryCodes:["fr"],tags:{brand:"Krys","brand:wikidata":"Q3119538","brand:wikipedia":"fr:Krys Group",name:"Krys",shop:"optician"}},"shop/optician|LensCrafters":{tags:{brand:"LensCrafters","brand:wikidata":"Q6523209","brand:wikipedia":"en:LensCrafters",name:"LensCrafters",shop:"optician"}},"shop/optician|Les Opticiens Mutualistes":{countryCodes:["fr"],tags:{brand:"Les Opticiens Mutualistes","brand:wikidata":"Q18414551","brand:wikipedia":"fr:Les Opticiens Mutualistes",name:"Les Opticiens Mutualistes",shop:"optician"}},"shop/optician|Lissac":{tags:{brand:"Lissac","brand:wikidata":"Q63102559",name:"Lissac",shop:"optician"}},"shop/optician|Multiópticas~(Portugal)":{countryCodes:["pt"],tags:{brand:"Multiópticas","brand:wikidata":"Q62391722",name:"Multiópticas",shop:"optician"}},"shop/optician|Multiópticas~(Spain)":{countryCodes:["es"],tags:{brand:"Multiópticas","brand:wikidata":"Q62391719",name:"Multiópticas",shop:"optician"}},"shop/optician|Oakley":{matchTags:["shop/sports"],tags:{brand:"Oakley","brand:wikidata":"Q161906","brand:wikipedia":"en:Oakley, Inc.",name:"Oakley",shop:"optician"}},"shop/optician|Optic 2000":{tags:{brand:"Optic 2000","brand:wikidata":"Q3354445","brand:wikipedia":"fr:Optic 2000",name:"Optic 2000",shop:"optician"}},"shop/optician|Opticalia":{tags:{brand:"Opticalia","brand:wikidata":"Q62082114",name:"Opticalia",shop:"optician"}},"shop/optician|Pearle":{matchNames:["pearle vision"],tags:{brand:"Pearle","brand:wikidata":"Q2231148","brand:wikipedia":"en:Pearle Vision",name:"Pearle",shop:"optician"}},"shop/optician|Specsavers":{tags:{brand:"Specsavers","brand:wikidata":"Q2000610","brand:wikipedia":"en:Specsavers",name:"Specsavers",shop:"optician"}},"shop/optician|Sunglass Hut":{tags:{brand:"Sunglass Hut","brand:wikidata":"Q136311","brand:wikipedia":"en:Sunglass Hut",name:"Sunglass Hut",shop:"optician"}},"shop/optician|Synoptik":{countryCodes:["se"],tags:{brand:"Synoptik","brand:wikidata":"Q10687541","brand:wikipedia":"sv:Synoptik",name:"Synoptik",shop:"optician"}},"shop/optician|Synsam":{countryCodes:["fi","no","se"],tags:{brand:"Synsam","brand:wikidata":"Q12004589","brand:wikipedia":"sv:Synsam",name:"Synsam",shop:"optician"}},"shop/optician|Target Optical":{countryCodes:["us"],tags:{brand:"Target Optical","brand:wikidata":"Q19903688","brand:wikipedia":"en:Target Optical",name:"Target Optical",shop:"optician"}},"shop/optician|Vision Express":{tags:{brand:"Vision Express","brand:wikidata":"Q7936150","brand:wikipedia":"en:Vision Express",name:"Vision Express",shop:"optician"}},"shop/optician|Visionworks":{tags:{brand:"Visionworks","brand:wikidata":"Q5422607","brand:wikipedia":"en:Visionworks",name:"Visionworks",shop:"optician"}},"shop/optician|Оптимист Оптика":{countryCodes:["ru"],tags:{brand:"Оптимист Оптика",name:"Оптимист Оптика",shop:"optician"}},"shop/optician|แว่นท็อปเจริญ":{countryCodes:["th"],tags:{brand:"แว่นท็อปเจริญ","brand:th":"แว่นท็อปเจริญ","brand:wikidata":"Q62391732",name:"แว่นท็อปเจริญ","name:th":"แว่นท็อปเจริญ",shop:"optician"}},"shop/optician|メガネストアー":{countryCodes:["jp"],tags:{brand:"メガネストアー","brand:ja":"メガネストアー",name:"メガネストアー","name:ja":"メガネストアー",shop:"optician"}},"shop/optician|メガネスーパー":{countryCodes:["jp"],tags:{brand:"メガネスーパー","brand:ja":"メガネスーパー","brand:wikidata":"Q11343504","brand:wikipedia":"ja:メガネスーパー",name:"メガネスーパー","name:en":"Meganesuper","name:ja":"メガネスーパー",shop:"optician"}},"shop/optician|寶島眼鏡":{countryCodes:["zh"],tags:{brand:"寶島眼鏡","brand:wikidata":"Q62391741",name:"寶島眼鏡",shop:"optician"}},"shop/optician|眼鏡市場":{countryCodes:["jp"],tags:{brand:"眼鏡市場","brand:en":"Megane Ichiba","brand:wikidata":"Q11343506","brand:wikipedia":"ja:メガネトップ",name:"眼鏡市場","name:en":"Megane Ichiba",shop:"optician"}},"shop/outdoor|Bass Pro Shops":{countryCodes:["ca","us"],tags:{brand:"Bass Pro Shops","brand:wikidata":"Q4867953","brand:wikipedia":"en:Bass Pro Shops",name:"Bass Pro Shops",shop:"outdoor"}},"shop/outdoor|Cabela's":{countryCodes:["ca","us"],tags:{brand:"Cabela's","brand:wikidata":"Q2793714","brand:wikipedia":"en:Cabela's",name:"Cabela's",shop:"outdoor"}},"shop/outdoor|Jack Wolfskin":{countryCodes:["ch","de","fr"],matchTags:["shop/clothes"],tags:{brand:"Jack Wolfskin","brand:wikidata":"Q536133","brand:wikipedia":"en:Jack Wolfskin",name:"Jack Wolfskin",shop:"outdoor"}},"shop/outdoor|Kathmandu":{countryCodes:["au","nz"],tags:{brand:"Kathmandu","brand:wikidata":"Q1736294","brand:wikipedia":"en:Kathmandu (company)",name:"Kathmandu",shop:"outdoor"}},"shop/outdoor|Mountain Warehouse":{tags:{brand:"Mountain Warehouse","brand:wikidata":"Q6925414","brand:wikipedia":"en:Mountain Warehouse",name:"Mountain Warehouse",shop:"outdoor"}},"shop/outdoor|REI":{countryCodes:["id","us"],tags:{brand:"REI","brand:wikidata":"Q3414933","brand:wikipedia":"en:Recreational Equipment, Inc.",name:"REI",shop:"outdoor"}},"shop/outdoor|Sportsman's Warehouse":{countryCodes:["us"],tags:{brand:"Sportsman's Warehouse","brand:wikidata":"Q7579979","brand:wikipedia":"en:Sportsman's Warehouse",name:"Sportsman's Warehouse",shop:"outdoor"}},"shop/outdoor|Trespass":{countryCodes:["fr","gb","ie"],tags:{brand:"Trespass","brand:wikidata":"Q17035733","brand:wikipedia":"en:Trespass (clothing)",name:"Trespass",shop:"outdoor"}},"shop/outpost|Wildberries":{countryCodes:["by","ru"],matchTags:["shop/clothes"],tags:{brand:"Wildberries","brand:wikidata":"Q24933714","brand:wikipedia":"ru:Wildberries",name:"Wildberries",shop:"outpost"}},"shop/paint|Benjamin Moore":{tags:{brand:"Benjamin Moore","brand:wikidata":"Q4889038","brand:wikipedia":"en:Benjamin Moore & Co.",name:"Benjamin Moore",shop:"paint"}},"shop/paint|Comex":{tags:{brand:"Comex","brand:wikidata":"Q5151654","brand:wikipedia":"en:Comex Group",name:"Comex",shop:"paint"}},"shop/paint|Jotun":{tags:{brand:"Jotun","brand:wikidata":"Q1778870","brand:wikipedia":"en:Jotun (company)",name:"Jotun",shop:"paint"}},"shop/paint|National Paints":{tags:{brand:"National Paints","brand:wikidata":"Q62073521",name:"National Paints",shop:"paint"}},"shop/paint|Sherwin Williams":{matchNames:["sherwin williams paints"],tags:{brand:"Sherwin Williams","brand:wikidata":"Q48881","brand:wikipedia":"en:Sherwin-Williams",name:"Sherwin Williams",shop:"paint"}},"shop/party|Party City":{tags:{brand:"Party City","brand:wikidata":"Q7140896","brand:wikipedia":"en:Party City",name:"Party City",shop:"party"}},"shop/pastry|Smallcakes":{countryCodes:["us"],matchTags:["shop/bakery"],tags:{brand:"Smallcakes","brand:wikidata":"Q62384749",name:"Smallcakes",shop:"pastry"}},"shop/pawnbroker|Cash Converters":{tags:{brand:"Cash Converters","brand:wikidata":"Q5048645","brand:wikipedia":"en:Cash Converters",name:"Cash Converters",shop:"pawnbroker"}},"shop/pawnbroker|Cebuana Lhuillier":{countryCodes:["ph"],tags:{brand:"Cebuana Lhuillier","brand:wikidata":"Q17064661","brand:wikipedia":"en:Cebuana Lhuillier",name:"Cebuana Lhuillier",shop:"pawnbroker"}},"shop/pawnbroker|Loombard":{tags:{brand:"Loombard",name:"Loombard",shop:"pawnbroker"}},"shop/pawnbroker|M Lhuillier":{tags:{brand:"M Lhuillier",name:"M Lhuillier",shop:"pawnbroker"}},"shop/pawnbroker|Palawan Pawnshop":{countryCodes:["ph"],tags:{brand:"Palawan Pawnshop","brand:wikidata":"Q62391488",name:"Palawan Pawnshop",shop:"pawnbroker"}},"shop/pawnbroker|RD Pawnshop":{tags:{brand:"RD Pawnshop",name:"RD Pawnshop",shop:"pawnbroker"}},"shop/pawnbroker|Villarica Pawnshop":{countryCodes:["ph"],tags:{brand:"Villarica Pawnshop","brand:wikidata":"Q62391438",name:"Villarica Pawnshop",shop:"pawnbroker"}},"shop/pawnbroker|Скарбниця":{tags:{brand:"Скарбниця",name:"Скарбниця",shop:"pawnbroker"}},"shop/perfumery|Douglas":{matchTags:["shop/beauty","shop/chemist","shop/cosmetics"],tags:{brand:"Douglas","brand:wikidata":"Q2052213","brand:wikipedia":"de:Parfümerie Douglas",name:"Douglas",shop:"perfumery"}},"shop/perfumery|FAnn":{countryCodes:["cz","sk"],tags:{brand:"FAnn","brand:wikidata":"Q62391353",name:"FAnn",shop:"perfumery"}},"shop/perfumery|ICI PARIS XL":{countryCodes:["be","lu","nl"],tags:{brand:"ICI PARIS XL","brand:wikidata":"Q769749","brand:wikipedia":"en:ICI Paris XL",name:"ICI PARIS XL",shop:"perfumery"}},"shop/perfumery|Marionnaud":{countryCodes:["at","ch","es","fr","it","sk"],matchTags:["shop/beauty","shop/cosmetics"],tags:{brand:"Marionnaud","brand:wikidata":"Q1129073","brand:wikipedia":"fr:Marionnaud",name:"Marionnaud",shop:"perfumery"}},"shop/perfumery|O Boticário":{countryCodes:["br"],tags:{brand:"O Boticário","brand:wikidata":"Q7073219","brand:wikipedia":"en:O Boticário",name:"O Boticário",shop:"perfumery"}},"shop/pet|Das Futterhaus":{countryCodes:["at","de"],tags:{brand:"Das Futterhaus","brand:wikidata":"Q1167914","brand:wikipedia":"de:Das Futterhaus",name:"Das Futterhaus",shop:"pet"}},"shop/pet|Fressnapf":{tags:{brand:"Fressnapf","brand:wikidata":"Q875796","brand:wikipedia":"en:Fressnapf",name:"Fressnapf",shop:"pet"}},"shop/pet|Global Pet Foods":{countryCodes:["ca"],tags:{brand:"Global Pet Foods","brand:wikidata":"Q57985699",name:"Global Pet Foods",shop:"pet"}},"shop/pet|Maxi Zoo":{tags:{brand:"Maxi Zoo","brand:wikidata":"Q875796","brand:wikipedia":"en:Fressnapf",name:"Maxi Zoo",shop:"pet"}},"shop/pet|Mud Bay":{countryCodes:["us"],tags:{brand:"Mud Bay","brand:wikidata":"Q30324179","brand:wikipedia":"en:Mud Bay pet store",name:"Mud Bay",shop:"pet"}},"shop/pet|Pet Food Express":{countryCodes:["us"],tags:{brand:"Pet Food Express","brand:wikidata":"Q7171541","brand:wikipedia":"en:Pet Food Express",name:"Pet Food Express",shop:"pet"}},"shop/pet|Pet Supermarket":{countryCodes:["us"],tags:{brand:"Pet Supermarket","brand:wikidata":"Q61968363",name:"Pet Supermarket",shop:"pet"}},"shop/pet|Pet Supplies Plus":{countryCodes:["us"],tags:{brand:"Pet Supplies Plus","brand:wikidata":"Q7171563","brand:wikipedia":"en:Pet Supplies Plus",name:"Pet Supplies Plus",shop:"pet"}},"shop/pet|Pet Valu":{countryCodes:["ca","us"],tags:{brand:"Pet Valu","brand:wikidata":"Q58009635",name:"Pet Valu",shop:"pet"}},"shop/pet|PetSmart":{countryCodes:["ca","us"],tags:{brand:"PetSmart","brand:wikidata":"Q3307147","brand:wikipedia":"en:PetSmart",name:"PetSmart",shop:"pet"}},"shop/pet|Petco":{countryCodes:["us"],tags:{brand:"Petco","brand:wikidata":"Q7171798","brand:wikipedia":"en:Petco",name:"Petco",shop:"pet"}},"shop/pet|Petland":{countryCodes:["us"],tags:{brand:"Petland","brand:wikidata":"Q17111474","brand:wikipedia":"en:Petland",name:"Petland",shop:"pet"}},"shop/pet|Petland Discounts":{countryCodes:["us"],tags:{brand:"Petland Discounts","brand:wikidata":"Q7178463","brand:wikipedia":"en:Petland Discounts",name:"Petland Discounts",shop:"pet"}},"shop/pet|Pets at Home":{tags:{brand:"Pets at Home","brand:wikidata":"Q7179258","brand:wikipedia":"en:Pets at Home",name:"Pets at Home",shop:"pet"}},"shop/pet|Unleashed":{countryCodes:["us"],tags:{alt_name:"Unleashed by Petco",brand:"Unleashed","brand:wikidata":"Q62122874",name:"Unleashed",operator:"Petco","operator:wikidata":"Q7171798","operator:wikipedia":"en:Petco",shop:"pet"}},"shop/pet|Бетховен":{countryCodes:["ru"],tags:{brand:"Бетховен","brand:wikidata":"Q62390798",name:"Бетховен",shop:"pet"}},"shop/pet|Четыре лапы":{countryCodes:["kz","ru"],tags:{brand:"Четыре лапы","brand:wikidata":"Q62390783",name:"Четыре лапы",shop:"pet"}},"shop/photo|Kodak Express":{matchNames:["kodak"],tags:{brand:"Kodak Express","brand:wikidata":"Q6425126","brand:wikipedia":"en:Kodak Express",name:"Kodak Express",shop:"photo"}},"shop/photo|Max Spielmann":{countryCodes:["gb"],tags:{brand:"Max Spielmann",name:"Max Spielmann",shop:"photo"}},"shop/photo|カメラのキタムラ":{countryCodes:["jp"],tags:{brand:"カメラのキタムラ","brand:ja":"カメラのキタムラ",name:"カメラのキタムラ","name:ja":"カメラのキタムラ",shop:"photo"}},"shop/second_hand|Value Village":{countryCodes:["ca","us"],tags:{brand:"Value Village","brand:wikidata":"Q7428188","brand:wikipedia":"en:Savers",name:"Value Village",shop:"second_hand"}},"shop/shoes|ABCマート":{countryCodes:["jp"],tags:{brand:"ABCマート","brand:ja":"ABCマート","brand:wikidata":"Q11188787","brand:wikipedia":"en:ABC-Mart",name:"ABCマート","name:ja":"ABCマート",shop:"shoes"}},"shop/shoes|Aldo":{tags:{brand:"Aldo","brand:wikidata":"Q2832297","brand:wikipedia":"en:Aldo Group",name:"Aldo",shop:"shoes"}},"shop/shoes|André":{countryCodes:["fr"],tags:{brand:"André","brand:wikidata":"Q2847114","brand:wikipedia":"fr:André (chaussure)",name:"André",shop:"shoes"}},"shop/shoes|Bata":{tags:{brand:"Bata","brand:wikidata":"Q688082","brand:wikipedia":"en:Bata (company)",name:"Bata",shop:"shoes"}},"shop/shoes|Belwest":{countryCodes:["by","ru"],tags:{brand:"Belwest",name:"Belwest",shop:"shoes"}},"shop/shoes|Besson Chaussures":{countryCodes:["fr"],tags:{brand:"Besson Chaussures","brand:wikidata":"Q2899930","brand:wikipedia":"fr:Besson Chaussures",name:"Besson Chaussures",operator:"Vivarte","operator:wikidata":"Q3561446","operator:wikipedia":"fr:Vivarte",shop:"shoes"}},"shop/shoes|Birkenstock":{tags:{brand:"Birkenstock","brand:wikidata":"Q648458","brand:wikipedia":"en:Birkenstock",name:"Birkenstock",shop:"shoes"}},"shop/shoes|Brantano":{countryCodes:["be","gb","lu"],tags:{brand:"Brantano","brand:wikidata":"Q4957616","brand:wikipedia":"en:Brantano Footwear",name:"Brantano",shop:"shoes"}},"shop/shoes|CCC":{tags:{brand:"CCC","brand:wikidata":"Q11788344","brand:wikipedia":"de:CCC (Unternehmen)",name:"CCC",shop:"shoes"}},"shop/shoes|Camper":{tags:{brand:"Camper","brand:wikidata":"Q1030922","brand:wikipedia":"en:Camper (company)",name:"Camper",shop:"shoes"}},"shop/shoes|Chaussea":{countryCodes:["be","es","fr","lu"],tags:{brand:"Chaussea","brand:wikidata":"Q62082044",name:"Chaussea",shop:"shoes"}},"shop/shoes|Clarks":{tags:{brand:"Clarks","brand:wikidata":"Q1095857","brand:wikipedia":"en:C. & J. Clark",name:"Clarks",shop:"shoes"}},"shop/shoes|Converse":{tags:{brand:"Converse","brand:wikidata":"Q319515","brand:wikipedia":"en:Converse (shoe company)",name:"Converse",shop:"shoes"}},"shop/shoes|Crocs":{tags:{brand:"Crocs","brand:wikidata":"Q926699","brand:wikipedia":"en:Crocs",name:"Crocs",shop:"shoes"}},"shop/shoes|DSW":{countryCodes:["ca","us"],tags:{brand:"DSW","brand:wikidata":"Q5206207","brand:wikipedia":"en:Designer Brands",name:"DSW",shop:"shoes"}},"shop/shoes|Deichmann":{tags:{brand:"Deichmann","brand:wikidata":"Q664543","brand:wikipedia":"en:Deichmann SE",name:"Deichmann",shop:"shoes"}},"shop/shoes|Din sko":{countryCodes:["no","se"],tags:{brand:"Din sko","brand:wikidata":"Q10472869","brand:wikipedia":"sv:Din sko",name:"Din sko",shop:"shoes"}},"shop/shoes|Dosenbach":{countryCodes:["ch"],tags:{brand:"Dosenbach","brand:wikidata":"Q2677329","brand:wikipedia":"de:Dosenbach-Ochsner",name:"Dosenbach",shop:"shoes"}},"shop/shoes|Ecco":{tags:{brand:"Ecco","brand:wikidata":"Q1280255","brand:wikipedia":"en:ECCO",name:"Ecco",shop:"shoes"}},"shop/shoes|FLO":{countryCodes:["al","tr"],tags:{brand:"FLO","brand:wikidata":"Q61994802",name:"FLO",shop:"shoes"}},"shop/shoes|Famous Footwear":{countryCodes:["us"],tags:{brand:"Famous Footwear","brand:wikidata":"Q5433457","brand:wikipedia":"en:Famous Footwear",name:"Famous Footwear",shop:"shoes"}},"shop/shoes|Foot Locker":{tags:{brand:"Foot Locker","brand:wikidata":"Q63335","brand:wikipedia":"en:Foot Locker",name:"Foot Locker",shop:"shoes"}},"shop/shoes|Gabor":{countryCodes:["de","it"],tags:{brand:"Gabor","brand:wikidata":"Q1488760","brand:wikipedia":"de:Gabor Shoes",name:"Gabor",shop:"shoes"}},"shop/shoes|Geox":{tags:{brand:"Geox","brand:wikidata":"Q588001","brand:wikipedia":"en:Geox",name:"Geox",shop:"shoes"}},"shop/shoes|Görtz":{countryCodes:["de"],tags:{brand:"Görtz","brand:wikidata":"Q1559593","brand:wikipedia":"de:Ludwig Görtz",name:"Görtz",shop:"shoes"}},"shop/shoes|Humanic":{tags:{brand:"Humanic","brand:wikidata":"Q1636668","brand:wikipedia":"en:Humanic",name:"Humanic",shop:"shoes"}},"shop/shoes|Hush Puppies":{tags:{brand:"Hush Puppies","brand:wikidata":"Q1828588","brand:wikipedia":"en:Hush Puppies",name:"Hush Puppies",shop:"shoes"}},"shop/shoes|Johnston & Murphy":{countryCodes:["ca","us"],tags:{brand:"Johnston & Murphy","brand:wikidata":"Q6268615","brand:wikipedia":"en:Johnston & Murphy",name:"Johnston & Murphy",shop:"shoes"}},"shop/shoes|Journeys":{countryCodes:["ca","us"],tags:{brand:"Journeys","brand:wikidata":"Q61994838",name:"Journeys",operator:"Genesco","operator:wikidata":"Q5532704","operator:wikipedia":"en:Genesco",shop:"shoes"}},"shop/shoes|Kari":{tags:{brand:"Kari","brand:wikidata":"Q47155680","brand:wikipedia":"ru:Kari (компания)",name:"Kari",shop:"shoes"}},"shop/shoes|La Halle aux Chaussures":{countryCodes:["fr"],tags:{brand:"La Halle aux Chaussures","brand:wikidata":"Q62390731",name:"La Halle aux Chaussures",operator:"Vivarte","operator:wikidata":"Q3561446","operator:wikipedia":"fr:Vivarte",shop:"shoes"}},"shop/shoes|Mephisto":{tags:{brand:"Mephisto","brand:wikidata":"Q822975","brand:wikipedia":"fr:Mephisto (chaussure)",name:"Mephisto",shop:"shoes"}},"shop/shoes|Merrell":{tags:{brand:"Merrell","brand:wikidata":"Q1921997","brand:wikipedia":"en:Merrell (company)",name:"Merrell",shop:"shoes"}},"shop/shoes|Minelli":{tags:{brand:"Minelli","brand:wikidata":"Q61994831",name:"Minelli",operator:"Vivarte","operator:wikidata":"Q3561446","operator:wikipedia":"fr:Vivarte",shop:"shoes"}},"shop/shoes|New Balance":{tags:{brand:"New Balance","brand:wikidata":"Q742988","brand:wikipedia":"en:New Balance",name:"New Balance",shop:"shoes"}},"shop/shoes|Office":{countryCodes:["de","gb","ie","ro"],tags:{brand:"Office","brand:wikidata":"Q7079121","brand:wikipedia":"en:Office Holdings",name:"Office",shop:"shoes"}},"shop/shoes|Payless ShoeSource":{matchNames:["payless"],tags:{brand:"Payless ShoeSource","brand:wikidata":"Q7156755","brand:wikipedia":"en:Payless ShoeSource",name:"Payless ShoeSource",shop:"shoes"}},"shop/shoes|Quick Schuh":{countryCodes:["at","de"],tags:{brand:"Quick Schuh","brand:wikidata":"Q2123069","brand:wikipedia":"de:Quick Schuh",name:"Quick Schuh",shop:"shoes"}},"shop/shoes|Rack Room Shoes":{countryCodes:["us"],tags:{brand:"Rack Room Shoes","brand:wikidata":"Q17109937","brand:wikipedia":"en:Rack Room Shoes",name:"Rack Room Shoes",shop:"shoes"}},"shop/shoes|Red Wing":{countryCodes:["de","gb","nl","us"],tags:{brand:"Red Wing","brand:wikidata":"Q934096","brand:wikipedia":"en:Red Wing Shoes",name:"Red Wing",shop:"shoes"}},"shop/shoes|Reno":{countryCodes:["at","ch","de","hu","sk"],tags:{brand:"Reno","brand:wikidata":"Q2144204","brand:wikipedia":"de:Reno (Schuhhandel)",name:"Reno",shop:"shoes"}},"shop/shoes|Respect":{countryCodes:["by","ru","ua"],tags:{brand:"Respect",name:"Respect",shop:"shoes"}},"shop/shoes|Rieker":{tags:{brand:"Rieker","brand:wikidata":"Q2152193","brand:wikipedia":"en:Rieker Shoes",name:"Rieker",shop:"shoes"}},"shop/shoes|Rockport":{tags:{brand:"Rockport","brand:wikidata":"Q4048384","brand:wikipedia":"en:Rockport (company)",name:"Rockport",shop:"shoes"}},"shop/shoes|Salamander":{tags:{brand:"Salamander","brand:wikidata":"Q878354","brand:wikipedia":"de:Salamander (Schuhe)",name:"Salamander",shop:"shoes"}},"shop/shoes|San Marina":{countryCodes:["fr"],tags:{brand:"San Marina","brand:wikidata":"Q3471558","brand:wikipedia":"fr:San Marina",name:"San Marina",shop:"shoes"}},"shop/shoes|Scapino":{countryCodes:["nl"],tags:{brand:"Scapino","brand:wikidata":"Q2298792","brand:wikipedia":"nl:Scapino (winkelketen)",name:"Scapino",shop:"shoes"}},"shop/shoes|Schuh":{countryCodes:["de","gb","gg","ie"],tags:{brand:"Schuh","brand:wikidata":"Q7432952","brand:wikipedia":"en:Schuh",name:"Schuh",shop:"shoes"}},"shop/shoes|Shoe Carnival":{countryCodes:["us"],tags:{brand:"Shoe Carnival","brand:wikidata":"Q7500007","brand:wikipedia":"en:Shoe Carnival",name:"Shoe Carnival",shop:"shoes"}},"shop/shoes|Shoe Zone":{tags:{brand:"Shoe Zone","brand:wikidata":"Q7500016","brand:wikipedia":"en:Shoe Zone",name:"Shoe Zone",shop:"shoes"}},"shop/shoes|Siemes Schuhcenter":{countryCodes:["de"],tags:{brand:"Siemes Schuhcenter","brand:wikidata":"Q2800720","brand:wikipedia":"de:Siemes (Unternehmen)",name:"Siemes Schuhcenter",shop:"shoes"}},"shop/shoes|Skechers":{tags:{brand:"Skechers","brand:wikidata":"Q2945643","brand:wikipedia":"en:Skechers",name:"Skechers",shop:"shoes"}},"shop/shoes|Snipes":{countryCodes:["at","ch","de","nl"],tags:{brand:"Snipes",name:"Snipes",shop:"shoes"}},"shop/shoes|Sperry":{countryCodes:["us"],matchNames:["sperry top sider"],tags:{brand:"Sperry","brand:wikidata":"Q7576421","brand:wikipedia":"en:Sperry Top-Sider",name:"Sperry",shop:"shoes"}},"shop/shoes|Stride Rite":{countryCodes:["us"],tags:{brand:"Stride Rite","brand:wikidata":"Q2356171","brand:wikipedia":"en:Stride Rite Corporation",name:"Stride Rite",shop:"shoes"}},"shop/shoes|Tamaris":{tags:{brand:"Tamaris","brand:wikidata":"Q61994827",name:"Tamaris",operator:"Wortmann Schuh-Holding","operator:wikidata":"Q1726079","operator:wikipedia":"de:Wortmann Schuh-Holding",shop:"shoes"}},"shop/shoes|The Shoe Company":{countryCodes:["ca"],tags:{brand:"The Shoe Company","brand:wikidata":"Q7763892","brand:wikipedia":"en:The Shoe Company",name:"The Shoe Company",shop:"shoes"}},"shop/shoes|UGG":{countryCodes:["au","us"],tags:{brand:"UGG","brand:wikidata":"Q1138480","brand:wikipedia":"en:UGG (brand)",name:"UGG",shop:"shoes"}},"shop/shoes|Vans":{matchTags:["shop/clothes"],tags:{brand:"Vans","brand:wikidata":"Q1135366","brand:wikipedia":"en:Vans",name:"Vans",shop:"shoes"}},"shop/shoes|vanHaren":{countryCodes:["be","nl"],tags:{brand:"vanHaren","brand:wikidata":"Q62390668",name:"vanHaren",shop:"shoes"}},"shop/shoes|Éram":{countryCodes:["be","fr"],tags:{brand:"Éram","brand:wikidata":"Q16684192","brand:wikipedia":"fr:Éram",name:"Éram",shop:"shoes"}},"shop/shoes|Марко":{tags:{brand:"Марко",name:"Марко",shop:"shoes"}},"shop/shoes|ЦентрОбувь":{countryCodes:["by","ru","ua"],tags:{brand:"ЦентрОбувь","brand:wikidata":"Q4504072","brand:wikipedia":"ru:ЦентрОбувь",name:"ЦентрОбувь",shop:"shoes"}},"shop/shoes|Юничел":{countryCodes:["kz","ru"],tags:{brand:"Юничел","brand:wikidata":"Q62390569",name:"Юничел",shop:"shoes"}},"shop/shoes|東京靴流通センター":{countryCodes:["jp"],tags:{brand:"東京靴流通センター","brand:en":"Tokyo Shoes Retailing Center","brand:ja":"東京靴流通センター","brand:wikidata":"Q11318515","brand:wikipedia":"ja:チヨダ",name:"東京靴流通センター","name:en":"Tokyo Shoes Retailing Center","name:ja":"東京靴流通センター",shop:"shoes"}},"shop/sports|Academy Sports + Outdoors":{countryCodes:["us"],matchNames:["academy","academy sports and outdoors"],matchTags:["shop/outdoor"],tags:{brand:"Academy Sports + Outdoors","brand:wikidata":"Q4671380","brand:wikipedia":"en:Academy Sports + Outdoors",name:"Academy Sports + Outdoors",shop:"sports"}},"shop/sports|Adidas":{matchTags:["shop/clothes","shop/shoes"],tags:{brand:"Adidas","brand:wikidata":"Q3895","brand:wikipedia":"en:Adidas",name:"Adidas",shop:"sports"}},"shop/sports|Aktiesport":{countryCodes:["nl"],tags:{brand:"Aktiesport","brand:wikidata":"Q57546889",name:"Aktiesport",shop:"sports"}},"shop/sports|American Golf":{countryCodes:["gb","ie"],matchTags:["shop/golf"],tags:{brand:"American Golf","brand:wikidata":"Q62657494",name:"American Golf",shop:"sports",sport:"golf"}},"shop/sports|Big 5 Sporting Goods":{countryCodes:["us"],tags:{brand:"Big 5 Sporting Goods","brand:wikidata":"Q4904902","brand:wikipedia":"en:Big 5 Sporting Goods",name:"Big 5 Sporting Goods",shop:"sports"}},"shop/sports|Centauro":{countryCodes:["br"],tags:{brand:"Centauro","brand:wikidata":"Q28679561","brand:wikipedia":"pt:Lojas Centauro",name:"Centauro",shop:"sports"}},"shop/sports|Decathlon":{tags:{brand:"Decathlon","brand:wikidata":"Q509349","brand:wikipedia":"en:Decathlon Group",name:"Decathlon",shop:"sports"}},"shop/sports|Dick's Sporting Goods":{countryCodes:["us"],tags:{brand:"Dick's Sporting Goods","brand:wikidata":"Q5272601","brand:wikipedia":"en:Dick's Sporting Goods",name:"Dick's Sporting Goods",shop:"sports"}},"shop/sports|Hervis":{countryCodes:["at","cz","de","hr","hu","ro","si"],matchNames:["hervis sport","hervis sports"],tags:{brand:"Hervis","brand:wikidata":"Q1614816","brand:wikipedia":"de:Hervis",name:"Hervis",shop:"sports"}},"shop/sports|Hibbett Sports":{countryCodes:["us"],tags:{brand:"Hibbett Sports","brand:wikidata":"Q5750671","brand:wikipedia":"en:Hibbett Sports",name:"Hibbett Sports",shop:"sports"}},"shop/sports|Intersport":{tags:{brand:"Intersport","brand:wikidata":"Q666888","brand:wikipedia":"en:Intersport",name:"Intersport",shop:"sports"}},"shop/sports|JD Sports":{countryCodes:["de","es","fr","gb","ie","nl"],tags:{brand:"JD Sports","brand:wikidata":"Q6108019","brand:wikipedia":"en:JD Sports",name:"JD Sports",shop:"sports"}},"shop/sports|Marathon Sports":{countryCodes:["bo","ec","pe"],tags:{brand:"Marathon Sports","brand:wikidata":"Q3027516","brand:wikipedia":"es:Marathon Sports",name:"Marathon Sports",shop:"sports"}},"shop/sports|Martes Sport":{countryCodes:["pl"],tags:{brand:"Martes Sport","brand:wikidata":"Q62073490",name:"Martes Sport",shop:"sports"}},"shop/sports|Modell’s Sporting Goods":{countryCodes:["us"],tags:{brand:"Modell’s Sporting Goods","brand:wikidata":"Q3317844","brand:wikipedia":"en:Modell's Sporting Goods",name:"Modell’s Sporting Goods",shop:"sports"}},"shop/sports|Play It Again Sports":{countryCodes:["ca","us"],tags:{brand:"Play It Again Sports","brand:wikidata":"Q7203029","brand:wikipedia":"en:Play It Again Sports",name:"Play It Again Sports",shop:"sports"}},"shop/sports|Sport 2000":{tags:{brand:"Sport 2000","brand:wikidata":"Q262394","brand:wikipedia":"de:Sport 2000",name:"Sport 2000",shop:"sports"}},"shop/sports|Sportisimo":{countryCodes:["cz","sk"],tags:{brand:"Sportisimo","brand:wikidata":"Q54974273",name:"Sportisimo",shop:"sports"}},"shop/sports|Sports Authority":{tags:{brand:"Sports Authority","brand:wikidata":"Q7579688","brand:wikipedia":"en:Sports Authority",name:"Sports Authority",shop:"sports"}},"shop/sports|Sports Direct":{tags:{brand:"Sports Direct","brand:wikidata":"Q2913554","brand:wikipedia":"en:Sports Direct",name:"Sports Direct",shop:"sports"}},"shop/sports|Спортмастер":{countryCodes:["by","kz","ru","ua"],matchNames:["спортмастер гипер"],tags:{brand:"Спортмастер","brand:en":"Sportmaster","brand:ru":"Спортмастер","brand:wikidata":"Q4438176","brand:wikipedia":"ru:Спортмастер",name:"Спортмастер","name:en":"Sportmaster","name:ru":"Спортмастер",shop:"sports"}},"shop/stationery|Buffetti":{tags:{brand:"Buffetti",name:"Buffetti",shop:"stationery"}},"shop/stationery|Bureau Vallée":{tags:{brand:"Bureau Vallée","brand:wikidata":"Q18385014","brand:wikipedia":"fr:Bureau Vallée",name:"Bureau Vallée",shop:"stationery"}},"shop/stationery|McPaper":{countryCodes:["ch","de"],tags:{brand:"McPaper","brand:wikidata":"Q1915329","brand:wikipedia":"de:McPaper",name:"McPaper",shop:"stationery"}},"shop/stationery|Office Depot":{tags:{brand:"Office Depot","brand:wikidata":"Q1337797","brand:wikipedia":"en:Office Depot",name:"Office Depot",shop:"stationery"}},"shop/stationery|OfficeMax":{tags:{brand:"OfficeMax","brand:wikidata":"Q7079111","brand:wikipedia":"en:OfficeMax",name:"OfficeMax",shop:"stationery"}},"shop/stationery|Officeworks":{countryCodes:["au"],tags:{brand:"Officeworks","brand:wikidata":"Q7079486","brand:wikipedia":"en:Officeworks",name:"Officeworks",shop:"stationery"}},"shop/stationery|Pagro":{countryCodes:["at"],tags:{brand:"Pagro","brand:wikidata":"Q57550022",name:"Pagro",shop:"stationery"}},"shop/stationery|Paper Source":{countryCodes:["us"],tags:{brand:"Paper Source","brand:wikidata":"Q25000269","brand:wikipedia":"en:Paper Source",name:"Paper Source",shop:"stationery"}},"shop/stationery|Paperchase":{tags:{brand:"Paperchase","brand:wikidata":"Q7132739","brand:wikipedia":"en:Paperchase",name:"Paperchase",shop:"stationery"}},"shop/stationery|Ryman":{countryCodes:["gb"],tags:{brand:"Ryman","brand:wikidata":"Q7385188","brand:wikipedia":"en:Ryman",name:"Ryman",shop:"stationery"}},"shop/stationery|Staples":{matchTags:["shop/office_supplies"],tags:{brand:"Staples","brand:wikidata":"Q785943","brand:wikipedia":"en:Staples Inc.",name:"Staples",shop:"stationery"}},"shop/stationery|Комус":{countryCodes:["ru"],tags:{brand:"Комус","brand:en":"Komus","brand:wikidata":"Q4230314","brand:wikipedia":"en:Komus (company)",name:"Комус","name:en":"Komus",shop:"stationery"}},"shop/storage_rental|Extra Space Storage":{countryCodes:["pr","us"],tags:{brand:"Extra Space Storage","brand:wikidata":"Q5422162","brand:wikipedia":"en:Extra Space Storage",name:"Extra Space Storage",shop:"storage_rental"}},"shop/storage_rental|Public Storage":{tags:{brand:"Public Storage","brand:wikidata":"Q1156045","brand:wikipedia":"en:Public Storage",name:"Public Storage",shop:"storage_rental"}},"shop/supermarket|8 à Huit":{nomatch:["shop/convenience|8 à Huit"],tags:{brand:"8 à Huit","brand:wikidata":"Q2818601","brand:wikipedia":"fr:8 à Huit",name:"8 à Huit",shop:"supermarket"}},"shop/supermarket|99 Ranch Market":{countryCodes:["us"],matchNames:["99 ranch","ranch 99"],tags:{brand:"99 Ranch Market","brand:wikidata":"Q3600279","brand:wikipedia":"en:99 Ranch Market",cuisine:"asian",name:"99 Ranch Market","name:en":"99 Ranch Market","name:zh-Hans":"大华超级市场","name:zh-Hant":"大華超級市場",shop:"supermarket"}},"shop/supermarket|A&O":{countryCodes:["it"],tags:{brand:"A&O","brand:wikidata":"Q3600279","brand:wikipedia":"it:A&O",name:"A&O",shop:"supermarket"}},"shop/supermarket|A101":{countryCodes:["tr"],tags:{brand:"A101","brand:wikidata":"Q6034496","brand:wikipedia":"tr:A101",name:"A101",shop:"supermarket"}},"shop/supermarket|AD Delhaize":{countryCodes:["be","lu"],tags:{brand:"AD Delhaize","brand:wikidata":"Q1184173","brand:wikipedia":"fr:Delhaize",name:"AD Delhaize",shop:"supermarket"}},"shop/supermarket|ADEG":{countryCodes:["at"],tags:{brand:"ADEG","brand:wikidata":"Q290211","brand:wikipedia":"de:ADEG Österreich",name:"ADEG",shop:"supermarket"}},"shop/supermarket|Acme":{countryCodes:["us"],tags:{brand:"Acme","brand:wikidata":"Q341975","brand:wikipedia":"en:Acme Markets",name:"Acme",shop:"supermarket"}},"shop/supermarket|Ahorramás":{countryCodes:["es"],tags:{brand:"Ahorramás","brand:wikidata":"Q58221883",name:"Ahorramás",shop:"supermarket"}},"shop/supermarket|Albert":{countryCodes:["cz"],tags:{brand:"Albert","brand:wikidata":"Q9144241","brand:wikipedia":"cs:Albert (obchodní řetězec)",name:"Albert",shop:"supermarket"}},"shop/supermarket|Albert Heijn":{countryCodes:["be","nl"],tags:{brand:"Albert Heijn","brand:wikidata":"Q1653985","brand:wikipedia":"nl:Albert Heijn (supermarkt)",name:"Albert Heijn",shop:"supermarket"}},"shop/supermarket|Albertsons":{countryCodes:["us"],tags:{brand:"Albertsons","brand:wikidata":"Q4712282","brand:wikipedia":"en:Albertsons",name:"Albertsons",shop:"supermarket"}},"shop/supermarket|Alcampo":{countryCodes:["es"],tags:{brand:"Alcampo",name:"Alcampo",shop:"supermarket"}},"shop/supermarket|Aldi":{tags:{brand:"Aldi","brand:wikidata":"Q125054","brand:wikipedia":"en:Aldi",name:"Aldi",shop:"supermarket"}},"shop/supermarket|Aldi Nord":{countryCodes:["de"],tags:{brand:"Aldi Nord","brand:wikidata":"Q41171373","brand:wikipedia":"en:Aldi",name:"Aldi Nord",shop:"supermarket"}},"shop/supermarket|Aldi Süd":{countryCodes:["de"],tags:{brand:"Aldi Süd","brand:wikidata":"Q41171672","brand:wikipedia":"en:Aldi",name:"Aldi Süd",shop:"supermarket"}},"shop/supermarket|Alfamart":{tags:{brand:"Alfamart","brand:wikidata":"Q23745600","brand:wikipedia":"en:Alfamart",name:"Alfamart",shop:"supermarket"}},"shop/supermarket|Alimerka":{countryCodes:["es"],tags:{brand:"Alimerka","brand:wikidata":"Q16482738","brand:wikipedia":"es:Alimerka",name:"Alimerka",shop:"supermarket"}},"shop/supermarket|Alnatura":{countryCodes:["ch","de"],tags:{brand:"Alnatura","brand:wikidata":"Q876811","brand:wikipedia":"en:Alnatura",name:"Alnatura",organic:"only",shop:"supermarket"}},"shop/supermarket|Ara":{countryCodes:["co"],tags:{brand:"Ara",name:"Ara",shop:"supermarket"}},"shop/supermarket|Asda":{countryCodes:["gb"],nomatch:["amenity/fuel|Asda"],tags:{brand:"Asda","brand:wikidata":"Q297410","brand:wikipedia":"en:Asda",name:"Asda",shop:"supermarket"}},"shop/supermarket|Atacadão":{countryCodes:["br"],tags:{brand:"Atacadão","brand:wikidata":"Q2868739","brand:wikipedia":"en:Atacadão",name:"Atacadão",shop:"supermarket"}},"shop/supermarket|Auchan":{nomatch:["amenity/fuel|Auchan"],tags:{brand:"Auchan","brand:wikidata":"Q758603","brand:wikipedia":"en:Auchan",name:"Auchan",shop:"supermarket"}},"shop/supermarket|Auchan Drive":{countryCodes:["fr","lu"],tags:{brand:"Auchan Drive",name:"Auchan Drive",shop:"supermarket"}},"shop/supermarket|BM":{tags:{brand:"BM","brand:wikidata":"Q62073462",name:"BM",shop:"supermarket"}},"shop/supermarket|Bi-Lo":{countryCodes:["au","us"],tags:{brand:"Bi-Lo","brand:wikidata":"Q4835622","brand:wikipedia":"en:BI-LO (Australia)",name:"Bi-Lo",shop:"supermarket"}},"shop/supermarket|Biedronka":{countryCodes:["pl"],tags:{brand:"Biedronka","brand:wikidata":"Q857182","brand:wikipedia":"pl:Biedronka (sieć handlowa)",name:"Biedronka",shop:"supermarket"}},"shop/supermarket|Big Bazaar":{countryCodes:["in"],tags:{brand:"Big Bazaar","brand:wikidata":"Q3631008","brand:wikipedia":"en:Big Bazaar",name:"Big Bazaar",shop:"supermarket"}},"shop/supermarket|Big C":{countryCodes:["th","vn"],tags:{brand:"Big C","brand:wikidata":"Q858665","brand:wikipedia":"en:Big C",name:"Big C",shop:"supermarket"}},"shop/supermarket|Billa":{tags:{brand:"Billa","brand:wikidata":"Q537781","brand:wikipedia":"en:Billa (supermarket)",name:"Billa",shop:"supermarket"}},"shop/supermarket|Bim":{countryCodes:["ma","tr"],tags:{brand:"Bim","brand:wikidata":"Q1022075","brand:wikipedia":"en:Bim (company)",name:"Bim",shop:"supermarket"}},"shop/supermarket|Bingo":{countryCodes:["ba"],tags:{brand:"Bingo","brand:wikidata":"Q16842066","brand:wikipedia":"bs:Bingo (kompanija)",name:"Bingo",shop:"supermarket"}},"shop/supermarket|Bio C' Bon":{countryCodes:["es","fr"],tags:{brand:"Bio C' Bon",name:"Bio C' Bon",shop:"supermarket"}},"shop/supermarket|Bio Company":{countryCodes:["de"],tags:{brand:"Bio Company","brand:wikidata":"Q864179","brand:wikipedia":"de:Bio Company",name:"Bio Company",organic:"only",shop:"supermarket"}},"shop/supermarket|Biocoop":{countryCodes:["fr"],tags:{brand:"Biocoop","brand:wikidata":"Q2904039","brand:wikipedia":"fr:Biocoop",name:"Biocoop",shop:"supermarket"}},"shop/supermarket|Bodega Aurrera":{tags:{brand:"Bodega Aurrera","brand:wikidata":"Q3365858","brand:wikipedia":"en:Bodega Aurrerá",name:"Bodega Aurrera",shop:"supermarket"}},"shop/supermarket|Bodega Aurrera Express":{countryCodes:["mx"],tags:{brand:"Bodega Aurrera Express",name:"Bodega Aurrera Express",shop:"supermarket"}},"shop/supermarket|Bonpreu":{countryCodes:["es"],tags:{brand:"Bonpreu",name:"Bonpreu",shop:"supermarket"}},"shop/supermarket|Bravo":{countryCodes:["us"],tags:{brand:"Bravo","brand:wikidata":"Q16985159","brand:wikipedia":"en:Bravo (supermarket)",name:"Bravo",shop:"supermarket"}},"shop/supermarket|Brookshire Brothers":{countryCodes:["us"],tags:{brand:"Brookshire Brothers","brand:wikidata":"Q4975084","brand:wikipedia":"en:Brookshire Brothers",name:"Brookshire Brothers",shop:"supermarket"}},"shop/supermarket|Brookshire's":{countryCodes:["us"],tags:{brand:"Brookshire's","brand:wikidata":"Q4975085","brand:wikipedia":"en:Brookshire Grocery Company",name:"Brookshire's",shop:"supermarket"}},"shop/supermarket|Budgens":{countryCodes:["gb"],nomatch:["shop/convenience|Budgens"],tags:{brand:"Budgens","brand:wikidata":"Q4985016","brand:wikipedia":"en:Budgens",name:"Budgens",shop:"supermarket"}},"shop/supermarket|Bulk Barn":{countryCodes:["ca"],tags:{brand:"Bulk Barn","brand:wikidata":"Q4996466",name:"Bulk Barn",shop:"supermarket"}},"shop/supermarket|Bunnpris":{countryCodes:["no"],tags:{brand:"Bunnpris","brand:wikidata":"Q1774634","brand:wikipedia":"en:Bunnpris",name:"Bunnpris",shop:"supermarket"}},"shop/supermarket|C-Town Supermarkets":{countryCodes:["us"],tags:{brand:"C-Town Supermarkets","brand:wikidata":"Q5005929","brand:wikipedia":"en:C-Town Supermarkets",name:"C-Town",shop:"supermarket"}},"shop/supermarket|CBA":{tags:{brand:"CBA","brand:wikidata":"Q779845","brand:wikipedia":"en:CBA (food retail)",name:"CBA",shop:"supermarket"}},"shop/supermarket|COOP Jednota":{countryCodes:["cz","sk"],matchNames:["jednota"],nomatch:["shop/convenience|COOP Jednota"],tags:{brand:"COOP Jednota","brand:wikidata":"Q41629254","brand:wikipedia":"sk:COOP Jednota Slovensko",name:"COOP Jednota",shop:"supermarket"}},"shop/supermarket|Caprabo":{countryCodes:["ad","es"],tags:{brand:"Caprabo","brand:wikidata":"Q1980781","brand:wikipedia":"en:Caprabo",name:"Caprabo",shop:"supermarket"}},"shop/supermarket|Cargills Food City":{countryCodes:["lk"],tags:{brand:"Cargills Food City","brand:wikidata":"Q58353955",name:"Cargills Food City","operator:wikidata":"Q5039260","operator:wikipedia":"en:Cargills (Ceylon)",shop:"supermarket"}},"shop/supermarket|Carrefour":{nomatch:["amenity/fuel|Carrefour","shop/convenience|Carrefour Express","shop/supermarket|Carrefour Express"],tags:{brand:"Carrefour","brand:wikidata":"Q217599","brand:wikipedia":"fr:Carrefour (enseigne)",name:"Carrefour",operator:"Groupe Carrefour","operator:wikidata":"Q3117359","operator:wikipedia":"fr:Groupe Carrefour",shop:"supermarket"}},"shop/supermarket|Carrefour City":{matchTags:["shop/convenience"],tags:{brand:"Carrefour City","brand:wikidata":"Q2940187","brand:wikipedia":"fr:Carrefour City",name:"Carrefour City",operator:"Groupe Carrefour","operator:wikidata":"Q3117359","operator:wikipedia":"fr:Groupe Carrefour",shop:"supermarket"}},"shop/supermarket|Carrefour Contact":{countryCodes:["fr"],tags:{brand:"Carrefour Contact","brand:wikidata":"Q2940188","brand:wikipedia":"fr:Carrefour Contact",name:"Carrefour Contact",operator:"Groupe Carrefour","operator:wikidata":"Q3117359","operator:wikipedia":"fr:Groupe Carrefour",shop:"supermarket"}},"shop/supermarket|Carrefour Express":{tags:{brand:"Carrefour Express","brand:wikidata":"Q2940190","brand:wikipedia":"fr:Carrefour Express",name:"Carrefour Express",operator:"Groupe Carrefour","operator:wikidata":"Q3117359","operator:wikipedia":"fr:Groupe Carrefour",shop:"supermarket"}},"shop/supermarket|Carrefour Market":{nomatch:["shop/fuel|Carrefour Market"],tags:{brand:"Carrefour Market","brand:wikidata":"Q2689639","brand:wikipedia":"fr:Carrefour Market",name:"Carrefour Market",operator:"Groupe Carrefour","operator:wikidata":"Q3117359","operator:wikipedia":"fr:Groupe Carrefour",shop:"supermarket"}},"shop/supermarket|Carulla":{countryCodes:["co"],tags:{brand:"Carulla","brand:wikidata":"Q5047480","brand:wikipedia":"en:Carulla",name:"Carulla",shop:"supermarket"}},"shop/supermarket|Casino":{tags:{brand:"Casino",name:"Casino",shop:"supermarket"}},"shop/supermarket|Centra":{tags:{brand:"Centra",name:"Centra",shop:"supermarket"}},"shop/supermarket|Centre Commercial E. Leclerc":{tags:{brand:"Centre Commercial E. Leclerc","brand:wikidata":"Q1273376","brand:wikipedia":"fr:E.Leclerc",name:"Centre Commercial E. Leclerc",shop:"supermarket"}},"shop/supermarket|Chata Polska":{countryCodes:["pl"],nomatch:["shop/convenience|Chata Polska"],tags:{brand:"Chata Polska","brand:wikidata":"Q61994406",name:"Chata Polska",shop:"supermarket"}},"shop/supermarket|Checkers":{countryCodes:["bw","na","za"],nomatch:["amenity/fast_food|Checkers"],tags:{brand:"Checkers","brand:wikidata":"Q5089126","brand:wikipedia":"en:Checkers (supermarket chain)",name:"Checkers",shop:"supermarket"}},"shop/supermarket|Chedraui":{countryCodes:["mx"],tags:{brand:"Chedraui","brand:wikidata":"Q2961952","brand:wikipedia":"en:Chedraui",name:"Chedraui",shop:"supermarket"}},"shop/supermarket|City Market":{tags:{brand:"City Market","brand:wikidata":"Q5123299","brand:wikipedia":"en:City Market (US grocery store chain)",name:"City Market",shop:"supermarket"}},"shop/supermarket|Co-op~(Canada)":{countryCodes:["ca"],nomatch:["amenity/fuel|Co-op~(Canada)","shop/convenience|Co-op~(Canada)","shop/convenience|Coop~(Schweiz)","shop/convenience|The Co-operative Food~(UK)","shop/supermarket|Coop~(Schweiz)","shop/supermarket|The Co-operative Food~(UK)"],tags:{brand:"Federated Co-operatives","brand:wikidata":"Q5440676","brand:wikipedia":"en:Federated Co-operatives",name:"Co-op",shop:"supermarket"}},"shop/supermarket|Coles":{countryCodes:["au","gb"],tags:{brand:"Coles","brand:wikidata":"Q1108172","brand:wikipedia":"en:Coles Supermarkets",name:"Coles",shop:"supermarket"}},"shop/supermarket|Colruyt":{countryCodes:["be","fr","lu"],tags:{brand:"Colruyt","brand:wikidata":"Q2363991","brand:wikipedia":"en:Colruyt (supermarket)",name:"Colruyt",shop:"supermarket"}},"shop/supermarket|Combi":{countryCodes:["de"],tags:{brand:"Combi","brand:wikidata":"Q1113618","brand:wikipedia":"de:Combi (Einkaufsmarkt)",name:"Combi",shop:"supermarket"}},"shop/supermarket|Comercial Mexicana":{countryCodes:["mx","us"],tags:{brand:"Comercial Mexicana","brand:wikidata":"Q2985173","brand:wikipedia":"en:Comercial Mexicana",name:"Comercial Mexicana",shop:"supermarket"}},"shop/supermarket|Conad":{countryCodes:["al","it"],tags:{brand:"Conad","brand:wikidata":"Q639075","brand:wikipedia":"it:Conad",name:"Conad",shop:"supermarket"}},"shop/supermarket|Conad City":{countryCodes:["it"],tags:{brand:"Conad City","brand:wikidata":"Q57543102",name:"Conad City",shop:"supermarket"}},"shop/supermarket|Condis":{countryCodes:["es"],tags:{brand:"Condis","brand:wikidata":"Q57417581",name:"Condis",shop:"supermarket"}},"shop/supermarket|Consum":{countryCodes:["es"],tags:{brand:"Consum","brand:wikidata":"Q8350308","brand:wikipedia":"es:Consum",name:"Consum",shop:"supermarket"}},"shop/supermarket|Continente":{countryCodes:["pt"],tags:{brand:"Continente","brand:wikidata":"Q2995683","brand:wikipedia":"en:Continente (Supermarket)",name:"Continente",shop:"supermarket"}},"shop/supermarket|Coop Konsum":{countryCodes:["se"],tags:{brand:"Coop Konsum",name:"Coop Konsum",shop:"supermarket"}},"shop/supermarket|Coop Prix":{countryCodes:["no"],tags:{brand:"Coop Prix","brand:wikidata":"Q5167705","brand:wikipedia":"no:Coop Prix",name:"Coop Prix",shop:"supermarket"}},"shop/supermarket|Coop~(Schweiz)":{countryCodes:["ch"],nomatch:["amenity/fuel|Co-op~(Canada)","shop/convenience|Co-op~(Canada)","shop/convenience|Coop~(Schweiz)","shop/convenience|The Co-operative Food~(UK)","shop/supermarket|Co-op~(Canada)","shop/supermarket|The Co-operative Food~(UK)"],tags:{brand:"Coop","brand:wikidata":"Q432564","brand:wikipedia":"de:Coop (Schweiz)",name:"Coop",shop:"supermarket"}},"shop/supermarket|Cora":{countryCodes:["be","fr","lu","ro"],tags:{brand:"Cora","brand:wikidata":"Q686643","brand:wikipedia":"en:Cora (hypermarket)",name:"Cora",shop:"supermarket"}},"shop/supermarket|Costcutter":{nomatch:["shop/convenience|Costcutter"],tags:{brand:"Costcutter","brand:wikidata":"Q5175072","brand:wikipedia":"en:Costcutter",name:"Costcutter",shop:"supermarket"}},"shop/supermarket|Coto":{countryCodes:["ar"],tags:{brand:"Coto","brand:wikidata":"Q5175411","brand:wikipedia":"es:Coto (supermercado)",name:"Coto",shop:"supermarket"}},"shop/supermarket|Countdown":{countryCodes:["nz"],tags:{brand:"Countdown","brand:wikidata":"Q5176845","brand:wikipedia":"en:Countdown (supermarket)",name:"Countdown",shop:"supermarket"}},"shop/supermarket|Covirán":{countryCodes:["es","pt"],tags:{brand:"Covirán",name:"Covirán",shop:"supermarket"}},"shop/supermarket|Crai":{countryCodes:["ch","it"],tags:{brand:"Crai",name:"Crai",shop:"supermarket"}},"shop/supermarket|Cub Foods":{countryCodes:["us"],tags:{brand:"Cub Foods","brand:wikidata":"Q5191916","brand:wikipedia":"en:Cub Foods",name:"Cub Foods",shop:"supermarket"}},"shop/supermarket|D'Agostino":{countryCodes:["us"],tags:{brand:"D'Agostino","brand:wikidata":"Q20656844","brand:wikipedia":"en:D'Agostino Supermarkets",name:"D'Agostino",shop:"supermarket"}},"shop/supermarket|D1":{countryCodes:["co"],tags:{brand:"D1","brand:wikidata":"Q43403418","brand:wikipedia":"es:Tiendas D1",name:"D1",shop:"supermarket"}},"shop/supermarket|Dagli'Brugsen":{countryCodes:["dk"],tags:{brand:"Dagli'Brugsen","brand:wikidata":"Q12307017","brand:wikipedia":"en:Dagli'Brugsen",name:"Dagli'Brugsen",shop:"supermarket"}},"shop/supermarket|Decò":{countryCodes:["it"],tags:{brand:"Decò",name:"Decò",shop:"supermarket"}},"shop/supermarket|Deen":{countryCodes:["nl"],tags:{brand:"Deen","brand:wikidata":"Q13571727","brand:wikipedia":"nl:Deen (supermarkt)",name:"Deen",shop:"supermarket"}},"shop/supermarket|Delhaize":{countryCodes:["be","lu"],tags:{brand:"Delhaize","brand:wikidata":"Q1184173","brand:wikipedia":"fr:Delhaize",name:"Delhaize",shop:"supermarket"}},"shop/supermarket|Delikatesy Centrum":{countryCodes:["pl"],nomatch:["shop/convenience|Delikatesy Centrum"],tags:{brand:"Delikatesy Centrum","brand:wikidata":"Q11693824","brand:wikipedia":"pl:Delikatesy Centrum",name:"Delikatesy Centrum",shop:"supermarket"}},"shop/supermarket|Denner":{countryCodes:["ch","li"],tags:{brand:"Denner","brand:wikidata":"Q379911","brand:wikipedia":"en:Denner (supermarket)",name:"Denner",shop:"supermarket"}},"shop/supermarket|Despar":{countryCodes:["it"],tags:{brand:"Spar","brand:wikidata":"Q610492","brand:wikipedia":"en:Spar (retailer)",name:"Despar",shop:"supermarket"}},"shop/supermarket|Despensa Familiar":{tags:{brand:"Despensa Familiar","brand:wikidata":"Q61994849",name:"Despensa Familiar",shop:"supermarket"}},"shop/supermarket|Dia":{matchNames:["supermercado dia"],tags:{brand:"Dia","brand:wikidata":"Q925132","brand:wikipedia":"es:Supermercados DIA",name:"Dia",shop:"supermarket"}},"shop/supermarket|Dia Market":{tags:{brand:"Dia Market","brand:wikidata":"Q925132","brand:wikipedia":"es:Supermercados DIA",name:"Dia Market",shop:"supermarket"}},"shop/supermarket|Dino":{countryCodes:["pl"],tags:{brand:"Dino","brand:wikidata":"Q11694239","brand:wikipedia":"pl:Dino Polska",name:"Dino",shop:"supermarket"}},"shop/supermarket|Dirk van den Broek":{countryCodes:["nl"],tags:{brand:"Dirk van den Broek","brand:wikidata":"Q17502722","brand:wikipedia":"en:Dirk (supermarket)",name:"Dirk van den Broek",shop:"supermarket"}},"shop/supermarket|Disco~(Argentina)":{countryCodes:["ar"],tags:{brand:"Disco","brand:wikidata":"Q6135978","brand:wikipedia":"es:Disco (supermercado de Argentina)",name:"Disco",shop:"supermarket"}},"shop/supermarket|Disco~(Uruguay)":{countryCodes:["uy"],tags:{brand:"Disco","brand:wikidata":"Q16636819","brand:wikipedia":"es:Disco (supermercado de Uruguay)",name:"Disco",shop:"supermarket"}},"shop/supermarket|Diska":{countryCodes:["de"],tags:{brand:"Diska","brand:wikidata":"Q62390177",name:"Diska",operator:"Edeka","operator:wikidata":"Q701755","operator:wikipedia":"en:Edeka",shop:"supermarket"}},"shop/supermarket|Dunnes Stores":{tags:{brand:"Dunnes Stores","brand:wikidata":"Q1266203","brand:wikipedia":"en:Dunnes Stores",name:"Dunnes Stores",shop:"supermarket"}},"shop/supermarket|E-Center":{countryCodes:["de"],tags:{brand:"E-Center","brand:wikidata":"Q701755","brand:wikipedia":"en:Edeka",name:"E-Center",shop:"supermarket"}},"shop/supermarket|E. Leclerc":{countryCodes:["es","fr","pl","pt"],tags:{brand:"E. Leclerc","brand:wikidata":"Q1273376","brand:wikipedia":"en:E.Leclerc",name:"E. Leclerc",shop:"supermarket"}},"shop/supermarket|E. Leclerc Drive":{countryCodes:["fr"],tags:{brand:"E. Leclerc Drive","brand:wikidata":"Q1273376","brand:wikipedia":"fr:E.Leclerc",name:"E. Leclerc Drive",operator:"E.Leclerc","operator:wikidata":"Q1273376","operator:wikipedia":"en:E.Leclerc",shop:"supermarket"}},"shop/supermarket|EMTÉ":{countryCodes:["nl"],tags:{brand:"EMTÉ","brand:wikidata":"Q3119122","brand:wikipedia":"en:EMTÉ",name:"EMTÉ",shop:"supermarket"}},"shop/supermarket|Edeka":{countryCodes:["de"],matchNames:["edeka neukauf"],tags:{brand:"Edeka","brand:wikidata":"Q701755","brand:wikipedia":"en:Edeka",name:"Edeka",shop:"supermarket"}},"shop/supermarket|Eko":{countryCodes:["pl"],nomatch:["amenity/fuel|EKO~(Canada)","amenity/fuel|EKO~(Greece)"],tags:{brand:"Eko","brand:wikidata":"Q9251859","brand:wikipedia":"pl:Eko Holding",name:"Eko",shop:"supermarket"}},"shop/supermarket|Ekom":{countryCodes:["it"],tags:{brand:"Ekom","brand:wikidata":"Q62073442",name:"Ekom",shop:"supermarket"}},"shop/supermarket|Ekono":{countryCodes:["cl"],tags:{brand:"Ekono","brand:wikidata":"Q2842729","brand:wikipedia":"es:Ekono",name:"Ekono",shop:"supermarket"}},"shop/supermarket|Eroski":{countryCodes:["es","gi"],matchNames:["charter","eroski center"],tags:{brand:"Eroski","brand:wikidata":"Q1361349","brand:wikipedia":"en:Eroski",name:"Eroski",shop:"supermarket"}},"shop/supermarket|Eroski City":{countryCodes:["es"],tags:{brand:"Eroski City",name:"Eroski City",shop:"supermarket"}},"shop/supermarket|Esselunga":{countryCodes:["it"],tags:{brand:"Esselunga","brand:wikidata":"Q1059636","brand:wikipedia":"en:Esselunga",name:"Esselunga",shop:"supermarket"}},"shop/supermarket|EuroSpin":{countryCodes:["it","si"],tags:{brand:"EuroSpin","brand:wikidata":"Q1374674","brand:wikipedia":"it:Eurospin",name:"EuroSpin",shop:"supermarket"}},"shop/supermarket|Eurospar":{tags:{brand:"Eurospar","brand:wikidata":"Q12309283","brand:wikipedia":"da:Eurospar",name:"Eurospar",shop:"supermarket"}},"shop/supermarket|Extra":{matchNames:["coop extra"],matchTags:["shop/convenience"],tags:{brand:"Extra","brand:wikidata":"Q11964085","brand:wikipedia":"no:Extra (Coop)",name:"Extra",shop:"supermarket"}},"shop/supermarket|Famila":{countryCodes:["de","it"],tags:{brand:"Famila","brand:wikidata":"Q1395108","brand:wikipedia":"de:Famila",name:"Famila",shop:"supermarket"}},"shop/supermarket|Fareway":{countryCodes:["us"],tags:{brand:"Fareway","brand:wikidata":"Q5434998","brand:wikipedia":"en:Fareway",name:"Fareway",shop:"supermarket"}},"shop/supermarket|Farm Boy":{countryCodes:["ca"],matchTags:["shop/greengrocer"],tags:{brand:"Farm Boy","brand:wikidata":"Q5435469","brand:wikipedia":"en:Farm Boy",name:"Farm Boy",shop:"supermarket"}},"shop/supermarket|Farmfoods":{countryCodes:["gb","sk"],tags:{brand:"Farmfoods","brand:wikidata":"Q5435841","brand:wikipedia":"en:Farmfoods",name:"Farmfoods",shop:"supermarket"}},"shop/supermarket|Feneberg":{countryCodes:["at","de"],tags:{brand:"Feneberg","brand:wikidata":"Q5345378","brand:wikipedia":"de:Feneberg Lebensmittel",name:"Feneberg",shop:"supermarket"}},"shop/supermarket|Food 4 Less":{tags:{brand:"Food 4 Less","brand:wikidata":"Q5465282","brand:wikipedia":"en:Food 4 Less",name:"Food 4 Less",shop:"supermarket"}},"shop/supermarket|Food Basics":{tags:{brand:"Food Basics","brand:wikidata":"Q5465300","brand:wikipedia":"en:Food Basics",name:"Food Basics",shop:"supermarket"}},"shop/supermarket|Food City":{tags:{brand:"Food City","brand:wikidata":"Q5465306","brand:wikipedia":"en:Food City (Canada)",name:"Food City",shop:"supermarket"}},"shop/supermarket|Food Lion":{countryCodes:["es","us"],tags:{brand:"Food Lion","brand:wikidata":"Q1435950","brand:wikipedia":"en:Food Lion",name:"Food Lion",shop:"supermarket"}},"shop/supermarket|FoodLand~(US)":{countryCodes:["us"],nomatch:["shop/supermarket|Foodland~(Australia)","shop/supermarket|Foodland~(Canada)","shop/supermarket|Foodland~(Hawaii)"],tags:{brand:"FoodLand","brand:wikidata":"Q5465271","brand:wikipedia":"en:FoodLand",name:"FoodLand",shop:"supermarket"}},"shop/supermarket|FoodMaxx":{countryCodes:["us"],tags:{brand:"FoodMaxx","brand:wikidata":"Q61894844",name:"FoodMaxx","operator:wikidata":"Q7428009","operator:wikipedia":"en:Save Mart Supermarkets",shop:"supermarket"}},"shop/supermarket|Foodland~(Australia)":{countryCodes:["au"],nomatch:["shop/supermarket|Foodland~(Canada)","shop/supermarket|Foodland~(Hawaii)","shop/supermarket|Foodland~(US)"],tags:{brand:"Foodland","brand:wikidata":"Q5465555","brand:wikipedia":"en:Foodland (South Australia)",name:"Foodland",shop:"supermarket"}},"shop/supermarket|Foodland~(Canada)":{countryCodes:["ca"],nomatch:["shop/supermarket|Foodland~(Australia)","shop/supermarket|Foodland~(Hawaii)","shop/supermarket|Foodland~(US)"],tags:{brand:"Foodland","brand:wikidata":"Q5465554","brand:wikipedia":"en:Foodland (Canada)",name:"Foodland",shop:"supermarket"}},"shop/supermarket|Foodland~(Hawaii)":{countryCodes:["us"],nomatch:["shop/supermarket|Foodland~(Australia)","shop/supermarket|Foodland~(Canada)","shop/supermarket|Foodland~(US)"],tags:{brand:"Foodland","brand:wikidata":"Q5465560","brand:wikipedia":"en:Foodland Hawaii",name:"Foodland",shop:"supermarket"}},"shop/supermarket|Foodworks":{countryCodes:["au"],tags:{brand:"Foodworks","brand:wikidata":"Q5465579","brand:wikipedia":"en:Foodworks",name:"Foodworks",shop:"supermarket"}},"shop/supermarket|Franprix":{tags:{brand:"Franprix","brand:wikidata":"Q2420096","brand:wikipedia":"fr:Franprix",name:"Franprix",shop:"supermarket"}},"shop/supermarket|Fred Meyer":{countryCodes:["us"],matchTags:["shop/department_store"],tags:{brand:"Fred Meyer","brand:wikidata":"Q5495932","brand:wikipedia":"en:Fred Meyer",name:"Fred Meyer",shop:"supermarket"}},"shop/supermarket|Fresh Market":{tags:{brand:"Fresh Market",name:"Fresh Market",shop:"supermarket"}},"shop/supermarket|FreshCo":{countryCodes:["ca"],tags:{brand:"FreshCo","brand:wikidata":"Q5502915","brand:wikipedia":"en:FreshCo",name:"FreshCo",shop:"supermarket"}},"shop/supermarket|Froiz":{countryCodes:["es","pt"],tags:{brand:"Froiz","brand:wikidata":"Q17070775","brand:wikipedia":"en:Froiz",name:"Froiz",shop:"supermarket"}},"shop/supermarket|Føtex":{countryCodes:["dk"],tags:{brand:"Føtex","brand:wikidata":"Q1480395","brand:wikipedia":"en:Føtex",name:"Føtex",shop:"supermarket"}},"shop/supermarket|G20":{countryCodes:["fr"],tags:{brand:"G20","brand:wikidata":"Q3504731","brand:wikipedia":"fr:Supermarchés G20",name:"G20",shop:"supermarket"}},"shop/supermarket|GBarbosa":{countryCodes:["br"],tags:{brand:"GBarbosa","brand:website":"http://www.gbarbosa.com.br","brand:wikidata":"Q10287817","brand:wikipedia":"pt:GBarbosa",name:"GBarbosa",shop:"supermarket"}},"shop/supermarket|GS25":{tags:{brand:"GS25",name:"GS25",shop:"supermarket"}},"shop/supermarket|Gadis":{countryCodes:["es"],tags:{brand:"Gadis","brand:wikidata":"Q12389151","brand:wikipedia":"gl:Gadisa",name:"Gadis",shop:"supermarket"}},"shop/supermarket|Giant":{nomatch:["shop/bicycle|Giant"],tags:{brand:"Giant",name:"Giant",shop:"supermarket"}},"shop/supermarket|Giant Eagle":{countryCodes:["us"],tags:{brand:"Giant Eagle","brand:wikidata":"Q1522721","brand:wikipedia":"en:Giant Eagle",name:"Giant Eagle",shop:"supermarket"}},"shop/supermarket|Globus":{tags:{brand:"Globus","brand:wikidata":"Q457503","brand:wikipedia":"en:Globus (hypermarket)",name:"Globus",shop:"supermarket"}},"shop/supermarket|Gordon Food Service":{countryCodes:["ca","us"],tags:{brand:"Gordon Food Service","brand:wikidata":"Q1538006","brand:wikipedia":"en:Gordon Food Service",name:"Gordon Food Service",shop:"supermarket"}},"shop/supermarket|Grand Frais":{countryCodes:["fr"],tags:{brand:"Grand Frais","brand:wikidata":"Q3114675","brand:wikipedia":"fr:Grand Frais",name:"Grand Frais",shop:"supermarket"}},"shop/supermarket|Grocery Outlet":{tags:{brand:"Grocery Outlet","brand:wikidata":"Q5609934","brand:wikipedia":"en:Grocery Outlet",name:"Grocery Outlet",shop:"supermarket"}},"shop/supermarket|Groszek":{countryCodes:["pl"],nomatch:["shop/convenience|Groszek"],tags:{brand:"Groszek","brand:wikidata":"Q9280965","brand:wikipedia":"pl:Groszek (sieć sklepów)",name:"Groszek",shop:"supermarket"}},"shop/supermarket|Géant Casino":{countryCodes:["cg","fr"],tags:{brand:"Géant Casino","brand:wikidata":"Q1380537","brand:wikipedia":"en:Géant Casino",name:"Géant Casino",shop:"supermarket"}},"shop/supermarket|H Mart":{countryCodes:["ca","gb","us"],tags:{"alt_name:ko":"H 마트",brand:"H Mart","brand:wikidata":"Q5636306","brand:wikipedia":"en:H Mart",cuisine:"asian",name:"H Mart","name:en":"H Mart","name:ko":"한아름","name:zh-Hans":"韩亚龙","name:zh-Hant":"韓亞龍",shop:"supermarket"}},"shop/supermarket|H-E-B":{countryCodes:["mx","us"],tags:{brand:"H-E-B","brand:wikidata":"Q830621","brand:wikipedia":"en:H-E-B",name:"H-E-B",shop:"supermarket"}},"shop/supermarket|HIT":{countryCodes:["de"],tags:{brand:"HIT","brand:wikidata":"Q1548713","brand:wikipedia":"de:HIT Handelsgruppe",name:"HIT",shop:"supermarket"}},"shop/supermarket|Hannaford":{countryCodes:["us"],tags:{brand:"Hannaford","brand:wikidata":"Q5648760","brand:wikipedia":"en:Hannaford Brothers Company",name:"Hannaford",shop:"supermarket"}},"shop/supermarket|Harris Teeter":{countryCodes:["us"],tags:{brand:"Harris Teeter","brand:wikidata":"Q5665067","brand:wikipedia":"en:Harris Teeter",name:"Harris Teeter",shop:"supermarket"}},"shop/supermarket|Hemköp":{countryCodes:["se"],tags:{brand:"Hemköp","brand:wikidata":"Q10521746","brand:wikipedia":"sv:Hemköp",name:"Hemköp",shop:"supermarket"}},"shop/supermarket|Heron Foods":{countryCodes:["gb"],tags:{brand:"Heron Foods","brand:wikidata":"Q5743472","brand:wikipedia":"en:Heron Foods",name:"Heron Foods",shop:"supermarket"}},"shop/supermarket|Hofer":{countryCodes:["at","si"],nomatch:["amenity/fuel|Hofer"],tags:{brand:"Hofer","brand:wikidata":"Q15815751","brand:wikipedia":"de:Hofer KG",name:"Hofer",shop:"supermarket"}},"shop/supermarket|Hoogvliet":{countryCodes:["nl"],tags:{brand:"Hoogvliet","brand:wikidata":"Q2770647","brand:wikipedia":"nl:Hoogvliet (supermarkt)",name:"Hoogvliet",shop:"supermarket"}},"shop/supermarket|Hruška":{nomatch:["shop/convenience|Hruška"],tags:{brand:"Hruška",name:"Hruška",shop:"supermarket"}},"shop/supermarket|Hy-Vee":{countryCodes:["us"],tags:{brand:"Hy-Vee","brand:wikidata":"Q1639719","brand:wikipedia":"en:Hy-Vee",name:"Hy-Vee",shop:"supermarket"}},"shop/supermarket|Hyper U":{countryCodes:["fr"],nomatch:["amenity/fuel|Super U","shop/convenience|Utile","shop/supermarket|Super U","shop/supermarket|U Express"],tags:{brand:"Hyper U","brand:wikidata":"Q2529029","brand:wikipedia":"en:Système U",name:"Hyper U",shop:"supermarket"}},"shop/supermarket|ICA":{countryCodes:["no","se"],matchNames:["ica supermarket"],nomatch:["shop/supermarket|ICA Kvantum","shop/supermarket|ICA Maxi"],tags:{brand:"ICA","brand:wikidata":"Q1663776","brand:wikipedia":"sv:Ica",name:"ICA",shop:"supermarket"}},"shop/supermarket|ICA Kvantum":{countryCodes:["se"],nomatch:["shop/supermarket|ICA","shop/supermarket|ICA Maxi"],tags:{brand:"ICA Kvantum","brand:wikidata":"Q1663776","brand:wikipedia":"sv:Ica",name:"ICA Kvantum",shop:"supermarket"}},"shop/supermarket|ICA Maxi":{countryCodes:["no","se"],matchNames:["maxi"],nomatch:["shop/supermarket|ICA","shop/supermarket|ICA Kvantum"],tags:{brand:"ICA Maxi","brand:wikidata":"Q1663776","brand:wikipedia":"sv:Ica",name:"ICA Maxi",shop:"supermarket"}},"shop/supermarket|IDEA":{countryCodes:["rs"],tags:{brand:"IDEA","brand:wikidata":"Q23461622","brand:wikipedia":"en:Idea (supermarkets)",name:"IDEA",shop:"supermarket"}},"shop/supermarket|IGA":{tags:{brand:"IGA","brand:wikidata":"Q3146662","brand:wikipedia":"en:IGA (supermarkets)",name:"IGA",shop:"supermarket"}},"shop/supermarket|Iceland":{tags:{brand:"Iceland","brand:wikidata":"Q721810","brand:wikipedia":"en:Iceland (supermarket)",name:"Iceland",shop:"supermarket"}},"shop/supermarket|Indomaret":{tags:{brand:"Indomaret",name:"Indomaret",shop:"supermarket"}},"shop/supermarket|Ingles":{countryCodes:["us"],tags:{brand:"Ingles","brand:wikidata":"Q6032595","brand:wikipedia":"en:Ingles",name:"Ingles",shop:"supermarket"}},"shop/supermarket|Intermarché":{tags:{brand:"Intermarché","brand:wikidata":"Q3153200","brand:wikipedia":"fr:Intermarché",name:"Intermarché",shop:"supermarket"}},"shop/supermarket|Intermarché Super":{countryCodes:["be","fr","pl","pt"],tags:{brand:"Intermarché Super","brand:wikidata":"Q3153200","brand:wikipedia":"fr:Intermarché",name:"Intermarché Super",shop:"supermarket"}},"shop/supermarket|Interspar":{countryCodes:["at"],tags:{brand:"Interspar","brand:wikidata":"Q15820339","brand:wikipedia":"de:Interspar (Österreich)",name:"Interspar",shop:"supermarket"}},"shop/supermarket|Irma":{countryCodes:["dk"],tags:{brand:"Irma","brand:wikidata":"Q797150","brand:wikipedia":"en:Irma (supermarket)",name:"Irma",shop:"supermarket"}},"shop/supermarket|Jan Linders":{countryCodes:["nl"],tags:{brand:"Jan Linders","brand:wikidata":"Q2200982","brand:wikipedia":"nl:Jan Linders Supermarkten",name:"Jan Linders",shop:"supermarket"}},"shop/supermarket|Jewel-Osco":{countryCodes:["us"],tags:{brand:"Jewel-Osco","brand:wikidata":"Q3178470","brand:wikipedia":"en:Jewel (supermarket)",name:"Jewel-Osco",shop:"supermarket"}},"shop/supermarket|Joker":{countryCodes:["no"],tags:{brand:"Joker","brand:wikidata":"Q716328","brand:wikipedia":"en:Joker (store)",name:"Joker",shop:"supermarket"}},"shop/supermarket|Jumbo":{tags:{brand:"Jumbo","brand:wikidata":"Q2262314","brand:wikipedia":"en:Jumbo (supermarket)",name:"Jumbo",shop:"supermarket"}},"shop/supermarket|K+K":{countryCodes:["de"],tags:{brand:"K+K","brand:wikidata":"Q1718009","brand:wikipedia":"de:K+K Klaas & Kock",name:"K+K",shop:"supermarket"}},"shop/supermarket|Kaufland":{tags:{brand:"Kaufland","brand:wikidata":"Q685967","brand:wikipedia":"en:Kaufland",name:"Kaufland",shop:"supermarket"}},"shop/supermarket|King Soopers":{countryCodes:["us"],tags:{brand:"King Soopers","brand:wikidata":"Q6412065","brand:wikipedia":"en:King Soopers",name:"King Soopers",shop:"supermarket"}},"shop/supermarket|Kiwi":{countryCodes:["dk","no"],tags:{brand:"Kiwi","brand:wikidata":"Q1613639","brand:wikipedia":"en:Kiwi (store)",name:"Kiwi",shop:"supermarket"}},"shop/supermarket|Konsum":{countryCodes:["de","ee","se"],tags:{brand:"Konsum",name:"Konsum",shop:"supermarket"}},"shop/supermarket|Konzum":{tags:{brand:"Konzum",name:"Konzum",shop:"supermarket"}},"shop/supermarket|Kroger":{nomatch:["amenity/fuel|Kroger"],tags:{brand:"Kroger","brand:wikidata":"Q153417","brand:wikipedia":"en:Kroger",name:"Kroger",shop:"supermarket"}},"shop/supermarket|Kvickly":{countryCodes:["dk"],tags:{brand:"Kvickly","brand:wikidata":"Q7061148","brand:wikipedia":"en:Kvickly",name:"Kvickly",shop:"supermarket"}},"shop/supermarket|La Anónima":{countryCodes:["ar"],tags:{brand:"La Anónima","brand:wikidata":"Q6135985","brand:wikipedia":"es:La Anónima",name:"La Anónima",shop:"supermarket"}},"shop/supermarket|La Plaza de DIA":{countryCodes:["es"],tags:{brand:"La Plaza de DIA","brand:wikidata":"Q58904673",name:"La Plaza de DIA","operator:wikidata":"Q925132","operator:wikipedia":"es:Supermercados DIA",shop:"supermarket"}},"shop/supermarket|La Vie Claire":{countryCodes:["fr"],tags:{brand:"La Vie Claire","brand:wikidata":"Q3213589","brand:wikipedia":"en:La Vie Claire (company)",name:"La Vie Claire",shop:"supermarket"}},"shop/supermarket|Landi":{countryCodes:["ch"],tags:{brand:"Landi","brand:wikidata":"Q1803010","brand:wikipedia":"en:Landi (Unternehmen)",name:"Landi",shop:"supermarket"}},"shop/supermarket|Leader Price":{tags:{brand:"Leader Price","brand:wikidata":"Q2181426","brand:wikipedia":"en:Leader Price",name:"Leader Price",shop:"supermarket"}},"shop/supermarket|Leclerc Drive":{countryCodes:["fr"],tags:{brand:"Leclerc Drive",name:"Leclerc Drive",shop:"supermarket"}},"shop/supermarket|Lewiatan":{countryCodes:["pl"],nomatch:["shop/convenience|Lewiatan"],tags:{brand:"Lewiatan","brand:wikidata":"Q11755396","brand:wikipedia":"pl:Lewiatan (sieć handlowa)",name:"Lewiatan",shop:"supermarket"}},"shop/supermarket|Lider":{countryCodes:["cl"],nomatch:["shop/supermarket|Lider Express"],tags:{brand:"Lider","brand:wikidata":"Q6711261","brand:wikipedia":"es:Líder (supermercado)",name:"Lider",shop:"supermarket"}},"shop/supermarket|Lider Express":{countryCodes:["cl"],nomatch:["shop/supermarket|Lider"],tags:{brand:"Lider","brand:wikidata":"Q6711261","brand:wikipedia":"es:Líder (supermercado)",name:"Lider Express",shop:"supermarket"}},"shop/supermarket|Lidl":{tags:{brand:"Lidl","brand:wikidata":"Q151954","brand:wikipedia":"en:Lidl",name:"Lidl",shop:"supermarket"}},"shop/supermarket|Lincolnshire Co-op":{countryCodes:["gb"],tags:{brand:"Lincolnshire Co-op","brand:wikidata":"Q6551231","brand:wikipedia":"en:Lincolnshire Co-operative",name:"Lincolnshire Co-op",shop:"supermarket"}},"shop/supermarket|Linella":{countryCodes:["md"],tags:{brand:"Linella","brand:wikidata":"Q61085990","brand:wikipedia":"ro:Linella",name:"Linella",shop:"supermarket"}},"shop/supermarket|Loblaws":{countryCodes:["ca"],matchNames:["loblaws great food"],tags:{brand:"Loblaws","brand:wikidata":"Q3257626","brand:wikipedia":"en:Loblaws",name:"Loblaws",shop:"supermarket"}},"shop/supermarket|Londis":{tags:{brand:"Londis",name:"Londis",shop:"supermarket"}},"shop/supermarket|Lotte Mart":{tags:{brand:"Lotte Mart","brand:wikidata":"Q326715","brand:wikipedia":"en:Lotte Mart",name:"Lotte Mart",shop:"supermarket"}},"shop/supermarket|Lowe's Market":{countryCodes:["us"],tags:{brand:"Lowe's Market","brand:wikidata":"Q6693107","brand:wikipedia":"en:Lowe's Market",name:"Lowe's Market",shop:"supermarket"}},"shop/supermarket|Lowes Foods":{countryCodes:["us"],tags:{brand:"Lowes Foods","brand:wikidata":"Q6693991","brand:wikipedia":"en:Lowes Foods",name:"Lowes Foods",shop:"supermarket"}},"shop/supermarket|Lucky":{countryCodes:["us"],matchNames:["luckys"],tags:{brand:"Lucky","brand:wikidata":"Q6698032","brand:wikipedia":"en:Lucky Stores",name:"Lucky","operator:wikidata":"Q7428009","operator:wikipedia":"en:Save Mart Supermarkets",shop:"supermarket"}},"shop/supermarket|Lupa":{countryCodes:["es"],tags:{brand:"Lupa","brand:wikidata":"Q58044048",name:"Lupa",shop:"supermarket"}},"shop/supermarket|M&S Simply Food":{tags:{brand:"M&S Simply Food",name:"M&S Simply Food",shop:"supermarket"}},"shop/supermarket|MD":{countryCodes:["it"],matchNames:["md discount"],tags:{brand:"MD","brand:wikidata":"Q3841263","brand:wikipedia":"en:MD Discount",name:"MD",shop:"supermarket"}},"shop/supermarket|MPREIS":{countryCodes:["at","it"],tags:{brand:"MPREIS","brand:wikidata":"Q873491","brand:wikipedia":"de:MPreis",name:"MPREIS",shop:"supermarket"}},"shop/supermarket|Marc's":{countryCodes:["us"],nomatch:["amenity/pharmacy|Marc's"],tags:{brand:"Marc's","brand:wikidata":"Q17080259","brand:wikipedia":"en:Marc's",name:"Marc's",shop:"supermarket"}},"shop/supermarket|Markant":{countryCodes:["de"],tags:{brand:"Markant","brand:wikidata":"Q57523365",name:"Markant",shop:"supermarket"}},"shop/supermarket|Market Basket":{tags:{brand:"Market Basket","brand:wikidata":"Q2079198","brand:wikipedia":"en:Market Basket (New England)",name:"Market Basket",shop:"supermarket"}},"shop/supermarket|Marktkauf":{countryCodes:["de"],tags:{brand:"Marktkauf","brand:wikidata":"Q1533254","brand:wikipedia":"de:Marktkauf Holding",name:"Marktkauf",shop:"supermarket"}},"shop/supermarket|Martin's Super Markets":{countryCodes:["us"],tags:{brand:"Martin's Super Markets","brand:wikidata":"Q6774803","brand:wikipedia":"en:Martin's Super Markets",name:"Martin's Super Markets",shop:"supermarket"}},"shop/supermarket|Match":{countryCodes:["be","fr","hu","lu"],tags:{brand:"Match","brand:wikidata":"Q513977","brand:wikipedia":"en:Match (supermarket)",name:"Match",shop:"supermarket"}},"shop/supermarket|Maxi Dia":{countryCodes:["es"],tags:{brand:"Maxi Dia","brand:wikidata":"Q925132","brand:wikipedia":"es:Supermercados DIA",name:"Maxi Dia",shop:"supermarket"}},"shop/supermarket|Maxima X":{countryCodes:["bg","ee","lt","lv","pl"],nomatch:["shop/supermarket|Maxima XX","shop/supermarket|Maxima XXX"],tags:{brand:"Maxima X","brand:wikidata":"Q1881222","brand:wikipedia":"en:Maxima Group",name:"Maxima X",shop:"supermarket"}},"shop/supermarket|Maxima XX":{countryCodes:["bg","ee","lt","lv","pl"],nomatch:["shop/supermarket|Maxima X","shop/supermarket|Maxima XXX"],tags:{brand:"Maxima XX","brand:wikidata":"Q1881222","brand:wikipedia":"en:Maxima Group",name:"Maxima XX",shop:"supermarket"}},"shop/supermarket|Maxima XXX":{countryCodes:["bg","ee","lt","lv","pl"],matchNames:["maxima"],nomatch:["shop/supermarket|Maxima X","shop/supermarket|Maxima XX"],tags:{brand:"Maxima XXX","brand:wikidata":"Q1881222","brand:wikipedia":"en:Maxima Group",name:"Maxima XXX",shop:"supermarket"}},"shop/supermarket|Maxi~(Canada)":{countryCodes:["ca"],nomatch:["shop/supermarket|Maxi~(Serbia)"],tags:{brand:"Maxi","brand:wikidata":"Q3302441","brand:wikipedia":"en:Maxi (Canadian supermarket)",name:"Maxi",shop:"supermarket"}},"shop/supermarket|Maxi~(Serbia)":{countryCodes:["rs"],nomatch:["shop/supermarket|Maxi~(Canada)"],tags:{brand:"Maxi","brand:wikidata":"Q6795490","brand:wikipedia":"en:Maxi (Serbian supermarket)",name:"Maxi",shop:"supermarket"}},"shop/supermarket|Mega Image":{countryCodes:["ro"],tags:{brand:"Mega Image","brand:wikidata":"Q6808085","brand:wikipedia":"en:Mega Image",name:"Mega Image",shop:"supermarket"}},"shop/supermarket|Mego":{countryCodes:["lv"],tags:{brand:"Mego","brand:wikidata":"Q16363314","brand:wikipedia":"lv:Mego",name:"Mego",shop:"supermarket"}},"shop/supermarket|Meijer":{countryCodes:["us"],tags:{brand:"Meijer","brand:wikidata":"Q1917753","brand:wikipedia":"en:Meijer",name:"Meijer",shop:"supermarket"}},"shop/supermarket|Meny":{countryCodes:["dk","no"],tags:{brand:"Meny","brand:wikidata":"Q10581720","brand:wikipedia":"en:Meny",name:"Meny",shop:"supermarket"}},"shop/supermarket|Mercadona":{tags:{brand:"Mercadona","brand:wikidata":"Q377705","brand:wikipedia":"en:Mercadona",name:"Mercadona",shop:"supermarket"}},"shop/supermarket|Mercator":{tags:{brand:"Mercator",name:"Mercator",shop:"supermarket"}},"shop/supermarket|Merkur":{countryCodes:["at"],tags:{brand:"Merkur","brand:wikidata":"Q1921857","brand:wikipedia":"de:Merkur (Österreich)",name:"Merkur",shop:"supermarket"}},"shop/supermarket|Metro~(Canada)":{countryCodes:["ca"],nomatch:["shop/wholesale|Metro"],tags:{brand:"Metro","brand:wikidata":"Q1145669","brand:wikipedia":"en:Metro Inc.",name:"Metro",shop:"supermarket"}},"shop/supermarket|Metro~(Peru)":{countryCodes:["pe"],nomatch:["shop/wholesale|Metro"],tags:{brand:"Metro","brand:wikidata":"Q16640217","brand:wikipedia":"en:Tiendas Metro",name:"Metro",operator:"Cencosud","operator:wikidata":"Q1053372","operator:wikipedia":"en:Cencosud",shop:"supermarket"}},"shop/supermarket|Migros":{tags:{brand:"Migros","brand:wikidata":"Q680727","brand:wikipedia":"en:Migros",name:"Migros",shop:"supermarket"}},"shop/supermarket|Mila":{countryCodes:["pl"],tags:{brand:"Mila","brand:wikidata":"Q48844636","brand:wikipedia":"pl:Mila (sieć sklepów)",name:"Mila",shop:"supermarket"}},"shop/supermarket|Minipreço":{tags:{brand:"Minipreço","brand:wikidata":"Q3042224","brand:wikipedia":"en:Minipreço",name:"Minipreço",shop:"supermarket"}},"shop/supermarket|Mix Markt":{countryCodes:["de"],tags:{brand:"Mix Markt","brand:wikidata":"Q327854","brand:wikipedia":"de:Mix Markt",name:"Mix Markt",shop:"supermarket"}},"shop/supermarket|Monoprix":{tags:{brand:"Monoprix","brand:wikidata":"Q3321241","brand:wikipedia":"en:Monoprix",name:"Monoprix",shop:"supermarket"}},"shop/supermarket|More":{countryCodes:["in"],tags:{brand:"More","brand:wikidata":"Q6910891","brand:wikipedia":"en:More (store)",name:"More",shop:"supermarket"}},"shop/supermarket|Morrisons":{countryCodes:["gb"],nomatch:["amenity/fuel|Morrisons"],tags:{brand:"Morrisons","brand:wikidata":"Q922344","brand:wikipedia":"en:Morrisons",name:"Morrisons",shop:"supermarket"}},"shop/supermarket|NP":{matchNames:["np-markt"],nomatch:["amenity/fuel|NP"],tags:{brand:"NP",name:"NP",shop:"supermarket"}},"shop/supermarket|Nah & Frisch":{countryCodes:["at","de"],matchNames:["nah und frisch"],tags:{brand:"Nah & Frisch","brand:wikidata":"Q1963643","brand:wikipedia":"de:Nah & Frisch",name:"Nah & Frisch",shop:"supermarket"}},"shop/supermarket|Nahkauf":{countryCodes:["de"],tags:{brand:"Nahkauf","brand:wikidata":"Q57515238",name:"Nahkauf",shop:"supermarket"}},"shop/supermarket|Natural Grocers":{countryCodes:["us"],tags:{brand:"Natural Grocers",name:"Natural Grocers",shop:"supermarket"}},"shop/supermarket|Naturalia":{countryCodes:["fr"],tags:{brand:"Naturalia","brand:wikidata":"Q3337081","brand:wikipedia":"fr:Naturalia",name:"Naturalia",shop:"supermarket"}},"shop/supermarket|Netto":{tags:{brand:"Netto","brand:wikidata":"Q552652","brand:wikipedia":"en:Netto (store)",name:"Netto",shop:"supermarket"}},"shop/supermarket|Netto Marken-Discount":{countryCodes:["de"],tags:{brand:"Netto Marken-Discount","brand:wikidata":"Q879858","brand:wikipedia":"en:Netto Marken-Discount",name:"Netto Marken-Discount",shop:"supermarket"}},"shop/supermarket|New World":{countryCodes:["nz"],tags:{brand:"New World","brand:wikidata":"Q7012488","brand:wikipedia":"en:New World (supermarket)",name:"New World",shop:"supermarket"}},"shop/supermarket|No Frills":{countryCodes:["ca"],tags:{brand:"No Frills","brand:wikidata":"Q3342407","brand:wikipedia":"en:No Frills (grocery store)",name:"No Frills",shop:"supermarket"}},"shop/supermarket|Norfa XL":{countryCodes:["lt"],tags:{brand:"Norfa XL","brand:wikidata":"Q1998983","brand:wikipedia":"lt:Norfa",name:"Norfa XL",shop:"supermarket"}},"shop/supermarket|Norma":{countryCodes:["at","cz","de","fr"],tags:{brand:"Norma","brand:wikidata":"Q450180","brand:wikipedia":"de:Norma (Handelskette)",name:"Norma",shop:"supermarket"}},"shop/supermarket|Okay":{countryCodes:["be"],tags:{brand:"Okay","brand:wikidata":"Q2159701","brand:wikipedia":"fr:OKay",name:"Okay",shop:"supermarket"}},"shop/supermarket|Olímpica":{countryCodes:["co"],tags:{brand:"Olímpica","brand:wikidata":"Q24749847","brand:wikipedia":"es:Grupo Empresarial Olímpica",name:"Olímpica",shop:"supermarket"}},"shop/supermarket|PLUS":{countryCodes:["nl"],nomatch:["shop/mobile_phone|Plus"],tags:{brand:"PLUS","brand:wikidata":"Q1978981","brand:wikipedia":"nl:PLUS (Nederlandse supermarkt)",name:"PLUS",shop:"supermarket"}},"shop/supermarket|POLOmarket":{countryCodes:["pl"],tags:{brand:"POLOmarket","brand:wikidata":"Q11821937","brand:wikipedia":"pl:Polomarket",name:"POLOmarket",shop:"supermarket"}},"shop/supermarket|Palí":{countryCodes:["cr","ni"],tags:{brand:"Palí","brand:wikidata":"Q1064887","brand:wikipedia":"es:Walmart de México y Centroamérica",name:"Palí",shop:"supermarket"}},"shop/supermarket|Pam":{countryCodes:["ch","it"],tags:{brand:"Pam","brand:wikidata":"Q3777398","brand:wikipedia":"it:Gruppo PAM",name:"Pam",shop:"supermarket"}},"shop/supermarket|Pavilions":{countryCodes:["us"],tags:{brand:"Pavilions","brand:wikidata":"Q7155886","brand:wikipedia":"en:Pavilions (supermarket)",name:"Pavilions",shop:"supermarket"}},"shop/supermarket|Penny":{countryCodes:["at","cz","de","hu","it","ro"],matchNames:["penny market","penny markt"],tags:{brand:"Penny","brand:wikidata":"Q284688","brand:wikipedia":"en:Penny (supermarket)",name:"Penny",shop:"supermarket"}},"shop/supermarket|Petit Casino":{tags:{brand:"Petit Casino",name:"Petit Casino",shop:"supermarket"}},"shop/supermarket|Pick 'n Save":{countryCodes:["us","za"],tags:{brand:"Pick 'n Save","brand:wikidata":"Q7371288","brand:wikipedia":"en:Roundy's",name:"Pick 'n Save",shop:"supermarket"}},"shop/supermarket|Pick n Pay":{tags:{brand:"Pick n Pay","brand:wikidata":"Q7190735","brand:wikipedia":"en:Pick n Pay Stores",name:"Pick n Pay",shop:"supermarket"}},"shop/supermarket|Piggly Wiggly":{countryCodes:["gb","us"],tags:{brand:"Piggly Wiggly","brand:wikidata":"Q3388303","brand:wikipedia":"en:Piggly Wiggly",name:"Piggly Wiggly",shop:"supermarket"}},"shop/supermarket|Pingo Doce":{countryCodes:["pt"],tags:{brand:"Pingo Doce","brand:wikidata":"Q1575057","brand:wikipedia":"en:Pingo Doce",name:"Pingo Doce",shop:"supermarket"}},"shop/supermarket|Piotr i Paweł":{countryCodes:["pl"],tags:{brand:"Piotr i Paweł","brand:wikidata":"Q2096356","brand:wikipedia":"pl:Piotr i Paweł",name:"Piotr i Paweł",shop:"supermarket"}},"shop/supermarket|Plaza Vea":{tags:{brand:"Plaza Vea","brand:wikidata":"Q7203672","brand:wikipedia":"en:Plaza Vea",name:"Plaza Vea",shop:"supermarket"}},"shop/supermarket|Plodine":{countryCodes:["hr"],tags:{brand:"Plodine","brand:wikidata":"Q58040098",name:"Plodine",shop:"supermarket"}},"shop/supermarket|Poiesz":{countryCodes:["nl"],tags:{brand:"Poiesz","brand:wikidata":"Q2521700","brand:wikipedia":"nl:Poiesz Supermarkten",name:"Poiesz",shop:"supermarket"}},"shop/supermarket|Price Chopper~(Kansas City)":{countryCodes:["us"],nomatch:["shop/supermarket|Price Chopper~(New York)"],tags:{brand:"Price Chopper","brand:wikidata":"Q7242572","brand:wikipedia":"en:Price Chopper (supermarket)",name:"Price Chopper",shop:"supermarket"}},"shop/supermarket|Price Chopper~(New York)":{countryCodes:["us"],nomatch:["shop/supermarket|Price Chopper~(Kansas City)"],tags:{brand:"Price Chopper","brand:wikidata":"Q7242574","brand:wikipedia":"en:Price Chopper Supermarkets",name:"Price Chopper",shop:"supermarket"}},"shop/supermarket|Prix":{countryCodes:["it"],matchNames:["prix quality"],tags:{brand:"Prix","brand:wikidata":"Q61994819",name:"Prix",shop:"supermarket"}},"shop/supermarket|Profi":{tags:{brand:"Profi","brand:wikidata":"Q956664","brand:wikipedia":"en:Profi",name:"Profi",shop:"supermarket"}},"shop/supermarket|Profi City":{countryCodes:["ro"],tags:{brand:"Profi City",name:"Profi City",shop:"supermarket"}},"shop/supermarket|Provigo":{countryCodes:["ca"],tags:{brand:"Provigo","brand:wikidata":"Q3408306","brand:wikipedia":"en:Provigo",name:"Provigo",shop:"supermarket"}},"shop/supermarket|Proxy Delhaize":{countryCodes:["be","lu"],tags:{brand:"Proxy Delhaize","brand:wikidata":"Q14903417","brand:wikipedia":"en:Delhaize Group",name:"Proxy Delhaize",shop:"supermarket"}},"shop/supermarket|Publix":{countryCodes:["br","us"],tags:{brand:"Publix","brand:wikidata":"Q672170","brand:wikipedia":"en:Publix",name:"Publix",shop:"supermarket"}},"shop/supermarket|Punto Simply":{countryCodes:["it"],tags:{brand:"Punto Simply","brand:wikidata":"Q3484790","brand:wikipedia":"it:Simply Market",name:"Punto Simply",shop:"supermarket"}},"shop/supermarket|Puregold":{countryCodes:["ph"],tags:{brand:"Puregold","brand:wikidata":"Q7261170","brand:wikipedia":"en:Puregold",name:"Puregold",shop:"supermarket"}},"shop/supermarket|Pão de Açúcar":{countryCodes:["br","pt"],tags:{brand:"Pão de Açúcar","brand:wikidata":"Q3411543","brand:wikipedia":"pt:Pão de Açúcar (supermercado brasileiro)",name:"Pão de Açúcar",shop:"supermarket"}},"shop/supermarket|QFC":{countryCodes:["us"],tags:{brand:"QFC","brand:wikidata":"Q7265425","brand:wikipedia":"en:QFC",name:"QFC",shop:"supermarket"}},"shop/supermarket|Raley's":{countryCodes:["us"],tags:{brand:"Raley's","brand:wikidata":"Q7286970","brand:wikipedia":"en:Raley's Supermarkets",name:"Raley's",shop:"supermarket"}},"shop/supermarket|Ralphs":{countryCodes:["us"],tags:{brand:"Ralphs","brand:wikidata":"Q3929820","brand:wikipedia":"en:Ralphs",name:"Ralphs",shop:"supermarket"}},"shop/supermarket|Real":{tags:{brand:"Real","brand:wikidata":"Q698473","brand:wikipedia":"en:Real (hypermarket)",name:"Real",shop:"supermarket"}},"shop/supermarket|Real Canadian Superstore":{countryCodes:["ca"],tags:{brand:"Real Canadian Superstore","brand:wikidata":"Q7300856","brand:wikipedia":"en:Real Canadian Superstore",name:"Real Canadian Superstore",shop:"supermarket"}},"shop/supermarket|Redner's":{countryCodes:["us"],matchNames:["redners warehouse market"],tags:{brand:"Redner's","brand:wikidata":"Q7306166","brand:wikipedia":"en:Redner's Markets",name:"Redner's",shop:"supermarket"}},"shop/supermarket|Reliance Fresh":{countryCodes:["in"],tags:{brand:"Reliance Fresh","brand:wikidata":"Q7311014","brand:wikipedia":"en:Reliance Fresh",name:"Reliance Fresh",shop:"supermarket"}},"shop/supermarket|Rema 1000":{countryCodes:["dk","no"],tags:{brand:"Rema 1000","brand:wikidata":"Q28459","brand:wikipedia":"en:REMA 1000",name:"Rema 1000",shop:"supermarket"}},"shop/supermarket|Rewe":{countryCodes:["de"],nomatch:["shop/supermarket|Rewe City"],tags:{brand:"Rewe","brand:wikidata":"Q16968817","brand:wikipedia":"en:REWE",name:"Rewe",shop:"supermarket"}},"shop/supermarket|Rewe City":{countryCodes:["de"],nomatch:["shop/supermarket|Rewe"],tags:{brand:"Rewe City","brand:wikidata":"Q16968817","brand:wikipedia":"en:REWE",name:"Rewe City",shop:"supermarket"}},"shop/supermarket|Rimi":{countryCodes:["ee","lt","lv"],tags:{brand:"Rimi","brand:wikidata":"Q7334456","brand:wikipedia":"en:Rimi (Norway)",name:"Rimi",shop:"supermarket"}},"shop/supermarket|S-Market":{countryCodes:["fi"],tags:{brand:"S-Market","brand:wikidata":"Q11891613","brand:wikipedia":"fi:S-market",name:"S-Market",shop:"supermarket"}},"shop/supermarket|Safeway":{nomatch:["amenity/fuel|Safeway"],tags:{brand:"Safeway","brand:wikidata":"Q1508234","brand:wikipedia":"en:Safeway Inc.",name:"Safeway",shop:"supermarket"}},"shop/supermarket|Sainsbury's":{countryCodes:["gb"],nomatch:["amenity/fuel|Sainsbury's"],tags:{brand:"Sainsbury's","brand:wikidata":"Q152096","brand:wikipedia":"en:Sainsbury's",name:"Sainsbury's",shop:"supermarket"}},"shop/supermarket|Santa Isabel":{countryCodes:["cl"],tags:{brand:"Santa Isabel","brand:wikidata":"Q7419620","brand:wikipedia":"es:Santa Isabel (supermercado)",name:"Santa Isabel",shop:"supermarket"}},"shop/supermarket|Save-A-Lot":{tags:{brand:"Save-A-Lot","brand:wikidata":"Q7427972","brand:wikipedia":"en:Save-A-Lot",name:"Save-A-Lot",shop:"supermarket"}},"shop/supermarket|Save-On-Foods":{countryCodes:["ca"],tags:{brand:"Save-On-Foods","brand:wikidata":"Q7427974","brand:wikipedia":"en:Save-On-Foods",name:"Save-On-Foods",shop:"supermarket"}},"shop/supermarket|Schnucks":{countryCodes:["us"],tags:{brand:"Schnucks","brand:wikidata":"Q7431920","brand:wikipedia":"en:Schnucks",name:"Schnucks",shop:"supermarket"}},"shop/supermarket|Shaw's":{countryCodes:["us"],tags:{brand:"Shaw's","brand:wikidata":"Q578387","brand:wikipedia":"en:Shaw's and Star Market",name:"Shaw's",shop:"supermarket"}},"shop/supermarket|ShopRite~(USA)":{countryCodes:["us"],nomatch:["shop/supermarket|Shoprite~(Africa)","shop/supermarket|Shoprite~(Isle of Man)"],tags:{brand:"ShopRite","brand:wikidata":"Q7501097","brand:wikipedia":"en:ShopRite (United States)",name:"ShopRite",shop:"supermarket"}},"shop/supermarket|Shoprite~(Africa)":{countryCodes:["ao","bw","cd","gh","ls","mg","mu","mw","mz","na","ng","sz","ug","za","zm"],nomatch:["shop/supermarket|ShopRite~(USA)","shop/supermarket|Shoprite~(Isle of Man)"],tags:{brand:"Shoprite","brand:wikidata":"Q1857639","brand:wikipedia":"en:Shoprite (South Africa)",name:"Shoprite",shop:"supermarket"}},"shop/supermarket|Shoprite~(Isle of Man)":{countryCodes:["im"],nomatch:["shop/supermarket|ShopRite~(USA)","shop/supermarket|Shoprite~(Africa)"],tags:{brand:"Shoprite","brand:wikidata":"Q7501242","brand:wikipedia":"en:Shoprite (Isle of Man)",name:"Shoprite",shop:"supermarket"}},"shop/supermarket|Sigma":{countryCodes:["it"],tags:{brand:"Sigma","brand:wikidata":"Q3977979","brand:wikipedia":"it:Supermercati Sigma",name:"Sigma",shop:"supermarket"}},"shop/supermarket|Simply Market":{matchNames:["simply"],tags:{brand:"Simply Market","brand:wikidata":"Q3484790","brand:wikipedia":"en:Simply Market",name:"Simply Market",shop:"supermarket"}},"shop/supermarket|Sky":{countryCodes:["de","lv","nl"],tags:{brand:"Sky","brand:wikidata":"Q1129779","brand:wikipedia":"de:Coop eG",name:"Sky",shop:"supermarket"}},"shop/supermarket|Smart & Final":{countryCodes:["mx","us"],tags:{brand:"Smart & Final",name:"Smart & Final",shop:"supermarket"}},"shop/supermarket|Smith's":{countryCodes:["ca","us"],nomatch:["amenity/fuel|Smith's"],tags:{brand:"Smith's","brand:wikidata":"Q7544856","brand:wikipedia":"en:Smith's Food and Drug",name:"Smith's",shop:"supermarket"}},"shop/supermarket|Sobeys":{countryCodes:["ca"],tags:{brand:"Sobeys","brand:wikidata":"Q1143340","brand:wikipedia":"en:Sobeys",name:"Sobeys",shop:"supermarket"}},"shop/supermarket|Soriana":{countryCodes:["mx"],tags:{brand:"Soriana","brand:wikidata":"Q735562","brand:wikipedia":"en:Soriana",name:"Soriana",shop:"supermarket"}},"shop/supermarket|Spar":{nomatch:["shop/convenience|Spar","shop/convenience|Spar Express"],tags:{brand:"Spar","brand:wikidata":"Q610492","brand:wikipedia":"en:Spar (retailer)",name:"Spar",shop:"supermarket"}},"shop/supermarket|Społem":{nomatch:["shop/convenience|Społem"],tags:{brand:"Społem","brand:wikidata":"Q11826043","brand:wikipedia":"pl:Powszechna Spółdzielnia Spożywców „Społem”",name:"Społem",shop:"supermarket"}},"shop/supermarket|Sprouts Farmers Market":{countryCodes:["us"],tags:{brand:"Sprouts Farmers Market","brand:wikidata":"Q7581369","brand:wikipedia":"en:Sprouts Farmers Market",name:"Sprouts Farmers Market",shop:"supermarket"}},"shop/supermarket|Stater Bros.":{countryCodes:["us"],tags:{brand:"Stater Bros.","brand:wikidata":"Q7604016","brand:wikipedia":"en:Stater Bros.",name:"Stater Bros.",shop:"supermarket"}},"shop/supermarket|Stokrotka":{countryCodes:["pl"],tags:{brand:"Stokrotka","brand:wikidata":"Q9345945","brand:wikipedia":"pl:Stokrotka (sieć handlowa)",name:"Stokrotka",shop:"supermarket"}},"shop/supermarket|Stop & Shop":{tags:{brand:"Stop & Shop","brand:wikidata":"Q3658429","brand:wikipedia":"en:Stop & Shop",name:"Stop & Shop",shop:"supermarket"}},"shop/supermarket|Studenac":{tags:{brand:"Studenac",name:"Studenac",shop:"supermarket"}},"shop/supermarket|Suma":{countryCodes:["es"],tags:{brand:"Suma","brand:wikidata":"Q58012362",name:"Suma",shop:"supermarket"}},"shop/supermarket|Super 1 Foods":{countryCodes:["us"],tags:{brand:"Super 1 Foods",name:"Super 1 Foods","operator:wikidata":"Q4975085","operator:wikipedia":"en:Brookshire Grocery Company",shop:"supermarket"}},"shop/supermarket|Super C":{tags:{brand:"Super C","brand:wikidata":"Q3504127","brand:wikipedia":"en:Super C (supermarket)",name:"Super C",shop:"supermarket"}},"shop/supermarket|Super H Mart":{countryCodes:["us"],tags:{brand:"H Mart","brand:wikidata":"Q5636306","brand:wikipedia":"en:H Mart",cuisine:"asian",name:"Super H Mart",shop:"supermarket"}},"shop/supermarket|Super One Foods":{countryCodes:["us"],tags:{brand:"Super One Foods","brand:wikidata":"Q17108733","brand:wikipedia":"en:Super One Foods",name:"Super One Foods",shop:"supermarket"}},"shop/supermarket|Super U":{countryCodes:["fr"],nomatch:["amenity/fuel|Super U","shop/convenience|Utile","shop/supermarket|Hyper U","shop/supermarket|U Express"],tags:{brand:"Super U","brand:wikidata":"Q2529029","brand:wikipedia":"en:Système U",name:"Super U",shop:"supermarket"}},"shop/supermarket|SuperBrugsen":{countryCodes:["dk"],tags:{brand:"SuperBrugsen","brand:wikidata":"Q12337746","brand:wikipedia":"en:SuperBrugsen",name:"SuperBrugsen",shop:"supermarket"}},"shop/supermarket|SuperValu":{tags:{brand:"SuperValu","brand:wikidata":"Q7642081","brand:wikipedia":"en:SuperValu (Ireland)",name:"SuperValu",shop:"supermarket"}},"shop/supermarket|Superama":{countryCodes:["mx"],tags:{brand:"Superama","brand:wikidata":"Q6135762","brand:wikipedia":"es:Superama",name:"Superama",shop:"supermarket"}},"shop/supermarket|Supercor":{countryCodes:["es","pt"],tags:{brand:"Supercor","brand:wikidata":"Q6135841","brand:wikipedia":"es:Supercor",name:"Supercor",shop:"supermarket"}},"shop/supermarket|Supersol":{countryCodes:["ar","es","ma","uy"],tags:{brand:"Supersol","brand:wikidata":"Q62073427",name:"Supersol",shop:"supermarket"}},"shop/supermarket|Superspar":{countryCodes:["es","za"],tags:{brand:"Superspar","brand:wikidata":"Q610492","brand:wikipedia":"en:Spar (retailer)",name:"Superspar",shop:"supermarket"}},"shop/supermarket|Tegut":{countryCodes:["de"],tags:{brand:"Tegut","brand:wikidata":"Q1547993","brand:wikipedia":"en:Tegut",name:"Tegut",shop:"supermarket"}},"shop/supermarket|Tesco":{nomatch:["shop/convenience|Tesco Express","shop/supermarket|Tesco Express"],tags:{brand:"Tesco","brand:wikidata":"Q487494","brand:wikipedia":"en:Tesco",name:"Tesco",shop:"supermarket"}},"shop/supermarket|Tesco Express":{tags:{brand:"Tesco Express","brand:wikidata":"Q487494","brand:wikipedia":"en:Tesco",name:"Tesco Express",shop:"supermarket"}},"shop/supermarket|Tesco Extra":{tags:{brand:"Tesco Extra","brand:wikidata":"Q25172225","brand:wikipedia":"en:Tesco Extra",name:"Tesco Extra",shop:"supermarket"}},"shop/supermarket|Tesco Lotus":{countryCodes:["th"],nomatch:["shop/convenience|Tesco Lotus Express"],tags:{brand:"Tesco Lotus",name:"Tesco Lotus",shop:"supermarket"}},"shop/supermarket|Tesco Metro":{countryCodes:["gb"],tags:{brand:"Tesco Metro","brand:wikidata":"Q57551648",name:"Tesco Metro",shop:"supermarket"}},"shop/supermarket|The Co-operative Food~(UK)":{countryCodes:["gb"],matchNames:["coop","coop food","cooperative food","the cooperative"],nomatch:["amenity/fuel|Co-op~(Canada)","shop/convenience|Co-op~(Canada)","shop/convenience|Coop~(Schweiz)","shop/convenience|The Co-operative Food~(UK)","shop/supermarket|Co-op~(Canada)","shop/supermarket|Coop~(Schweiz)"],tags:{brand:"The Co-operative Food","brand:wikidata":"Q3277439","brand:wikipedia":"en:Co-op Food",name:"The Co-operative Food",shop:"supermarket"}},"shop/supermarket|The Fresh Market":{countryCodes:["us"],tags:{brand:"The Fresh Market","brand:wikidata":"Q7735265","brand:wikipedia":"en:The Fresh Market",name:"The Fresh Market",shop:"supermarket"}},"shop/supermarket|Todis":{countryCodes:["it"],tags:{brand:"Todis","brand:wikidata":"Q3992174","brand:wikipedia":"it:Todis",name:"Todis",shop:"supermarket"}},"shop/supermarket|Tommy":{countryCodes:["hr"],tags:{brand:"Tommy","brand:wikidata":"Q12643718","brand:wikipedia":"hr:Tommy",name:"Tommy",shop:"supermarket"}},"shop/supermarket|Top Market":{countryCodes:["pl"],tags:{brand:"Top Market","brand:wikidata":"Q9360044","brand:wikipedia":"pl:Top Market",name:"Top Market",shop:"supermarket"}},"shop/supermarket|Tops":{countryCodes:["us"],tags:{brand:"Tops","brand:wikidata":"Q7825137","brand:wikipedia":"en:Tops Friendly Markets",name:"Tops",shop:"supermarket"}},"shop/supermarket|Tottus":{countryCodes:["cl","pe"],tags:{brand:"Tottus","brand:wikidata":"Q7828510","brand:wikipedia":"en:Tottus",name:"Tottus",shop:"supermarket"}},"shop/supermarket|Trader Joe's":{countryCodes:["us"],tags:{brand:"Trader Joe's","brand:wikidata":"Q688825","brand:wikipedia":"en:Trader Joe's",name:"Trader Joe's",shop:"supermarket"}},"shop/supermarket|Treff 3000":{countryCodes:["de"],tags:{brand:"Treff 3000","brand:wikidata":"Q701755","brand:wikipedia":"de:Edeka",name:"Treff 3000",shop:"supermarket"}},"shop/supermarket|Tuodì":{countryCodes:["it"],tags:{brand:"Tuodì","brand:wikidata":"Q3706995","brand:wikipedia":"it:Tuodì",name:"Tuodì",shop:"supermarket"}},"shop/supermarket|U Express":{countryCodes:["fr"],nomatch:["amenity/fuel|Super U","shop/convenience|Utile","shop/supermarket|Hyper U","shop/supermarket|Super U"],tags:{brand:"U Express","brand:wikidata":"Q2529029","brand:wikipedia":"en:Système U",name:"U Express",shop:"supermarket"}},"shop/supermarket|Unimarc":{countryCodes:["cl"],tags:{brand:"Unimarc","brand:wikidata":"Q6156244","brand:wikipedia":"es:Unimarc",name:"Unimarc",shop:"supermarket"}},"shop/supermarket|Unimarkt":{countryCodes:["at"],tags:{brand:"Unimarkt","brand:wikidata":"Q1169599","brand:wikipedia":"de:Unimarkt",name:"Unimarkt",shop:"supermarket"}},"shop/supermarket|Vea":{countryCodes:["ar"],tags:{brand:"Vea","brand:wikidata":"Q5858167","brand:wikipedia":"es:Vea (supermercado)",name:"Vea",shop:"supermarket"}},"shop/supermarket|VinMart":{countryCodes:["vn"],matchTags:["shop/department_store"],tags:{brand:"VinMart","brand:wikidata":"Q60245505","brand:wikipedia":"vi:VinMart",name:"VinMart",shop:"supermarket"}},"shop/supermarket|Volg":{countryCodes:["ch","li"],tags:{brand:"Volg","brand:wikidata":"Q2530746","brand:wikipedia":"de:Volg",name:"Volg",shop:"supermarket"}},"shop/supermarket|Vomar":{countryCodes:["nl"],tags:{brand:"Vomar","brand:wikidata":"Q3202837","brand:wikipedia":"nl:Vomar",name:"Vomar",shop:"supermarket"}},"shop/supermarket|Vons":{countryCodes:["us"],tags:{brand:"Vons","brand:wikidata":"Q7941609","brand:wikipedia":"en:Vons",name:"Vons",shop:"supermarket"}},"shop/supermarket|Waitrose":{countryCodes:["gb","je"],tags:{brand:"Waitrose","brand:wikidata":"Q771734","brand:wikipedia":"en:Waitrose & Partners",name:"Waitrose",shop:"supermarket"}},"shop/supermarket|Walmart Neighborhood Market":{countryCodes:["ca","mx","us"],tags:{brand:"Walmart","brand:wikidata":"Q483551","brand:wikipedia":"en:Walmart",name:"Walmart Neighborhood Market",operator:"Walmart","operator:wikidata":"Q483551","operator:wikipedia":"en:Walmart",shop:"supermarket"}},"shop/supermarket|Walmart Supercenter":{matchNames:["walmart supercentre"],matchTags:["shop/department_store"],tags:{brand:"Walmart","brand:wikidata":"Q483551","brand:wikipedia":"en:Walmart",name:"Walmart Supercenter",operator:"Walmart","operator:wikidata":"Q483551","operator:wikipedia":"en:Walmart",shop:"supermarket"}},"shop/supermarket|Wasgau":{countryCodes:["de"],tags:{brand:"Wasgau","brand:wikidata":"Q2536857","brand:wikipedia":"de:Wasgau (Unternehmen)",name:"Wasgau",shop:"supermarket"}},"shop/supermarket|Wegmans":{countryCodes:["us"],tags:{brand:"Wegmans","brand:wikidata":"Q11288478","brand:wikipedia":"en:Wegmans",name:"Wegmans",shop:"supermarket"}},"shop/supermarket|Weis":{countryCodes:["us"],tags:{brand:"Weis","brand:wikidata":"Q7980370","brand:wikipedia":"en:Weis Markets",name:"Weis",shop:"supermarket"}},"shop/supermarket|Whole Foods Market":{countryCodes:["ca","gb","us"],matchNames:["whole foods"],tags:{brand:"Whole Foods Market","brand:wikidata":"Q1809448","brand:wikipedia":"en:Whole Foods Market",name:"Whole Foods Market",shop:"supermarket"}},"shop/supermarket|Willys":{countryCodes:["se"],tags:{brand:"Willys","brand:wikidata":"Q10720214","brand:wikipedia":"sv:Willys",name:"Willys",shop:"supermarket"}},"shop/supermarket|WinCo Foods":{countryCodes:["us"],tags:{brand:"WinCo Foods","brand:wikidata":"Q8023592","brand:wikipedia":"en:WinCo Foods",name:"WinCo Foods",shop:"supermarket"}},"shop/supermarket|Winn Dixie":{countryCodes:["us"],tags:{brand:"Winn Dixie","brand:wikidata":"Q1264366","brand:wikipedia":"en:Winn-Dixie",name:"Winn Dixie",shop:"supermarket"}},"shop/supermarket|Woolworths":{countryCodes:["au"],nomatch:["shop/clothes|Woolworths"],tags:{brand:"Woolworths","brand:wikidata":"Q3249145","brand:wikipedia":"en:Woolworths Supermarkets",name:"Woolworths",shop:"supermarket"}},"shop/supermarket|Your Independent Grocer":{countryCodes:["ca"],matchNames:["independent"],tags:{brand:"Your Independent Grocer","brand:wikidata":"Q8058833","brand:wikipedia":"en:Your Independent Grocer",name:"Your Independent Grocer",shop:"supermarket"}},"shop/supermarket|basic":{countryCodes:["de"],tags:{brand:"basic","brand:wikidata":"Q809994","brand:wikipedia":"de:Basic AG",name:"basic",organic:"only",shop:"supermarket"}},"shop/supermarket|denn's Biomarkt":{countryCodes:["at","de"],tags:{brand:"denn's Biomarkt","brand:wikidata":"Q48883773","brand:wikipedia":"de:Dennree",name:"denn's Biomarkt",organic:"only",shop:"supermarket"}},"shop/supermarket|fakta":{countryCodes:["dk"],tags:{brand:"fakta","brand:wikidata":"Q3172238","brand:wikipedia":"en:Fakta",name:"fakta",shop:"supermarket"}},"shop/supermarket|Şok":{countryCodes:["tr"],tags:{brand:"Şok","brand:wikidata":"Q19613992","brand:wikipedia":"tr:Şok (market)",name:"Şok",shop:"supermarket"}},"shop/supermarket|ΑΒ Βασιλόπουλος":{countryCodes:["gr"],tags:{brand:"ΑΒ Βασιλόπουλος","brand:en":"AB Vassilopoulos","brand:wikidata":"Q4721807","brand:wikipedia":"el:Άλφα Βήτα Βασιλόπουλος",name:"ΑΒ Βασιλόπουλος","name:en":"AB Vassilopoulos",shop:"supermarket"}},"shop/supermarket|Γαλαξίας":{countryCodes:["gr"],tags:{brand:"Γαλαξίας","brand:en":"Galaxias","brand:wikidata":"Q5518063","brand:wikipedia":"el:Γαλαξίας (σούπερ μάρκετ)",name:"Γαλαξίας","name:en":"Galaxias",shop:"supermarket"}},"shop/supermarket|Μασούτης":{countryCodes:["gr"],tags:{brand:"Μασούτης","brand:en":"Masoutis","brand:wikidata":"Q6783887","brand:wikipedia":"en:Masoutis",name:"Μασούτης","name:en":"Masoutis",shop:"supermarket"}},"shop/supermarket|Σκλαβενίτης":{countryCodes:["gr"],tags:{brand:"Σκλαβενίτης","brand:en":"Sklavenitis","brand:wikidata":"Q7536037","brand:wikipedia":"el:Σκλαβενίτης",name:"Σκλαβενίτης","name:en":"Sklavenitis",shop:"supermarket"}},"shop/supermarket|АТБ":{tags:{brand:"АТБ",name:"АТБ",shop:"supermarket"}},"shop/supermarket|Абсолют~(Russia)":{countryCodes:["ru"],tags:{brand:"Абсолют","brand:wikidata":"Q62389597",name:"Абсолют",shop:"supermarket"}},"shop/supermarket|Абсолют~(Ukraine)":{countryCodes:["ua"],tags:{brand:"Абсолют","brand:wikidata":"Q62389546",name:"Абсолют",shop:"supermarket"}},"shop/supermarket|Авоська":{tags:{brand:"Авоська",name:"Авоська",shop:"supermarket"}},"shop/supermarket|Азбука Вкуса":{countryCodes:["ru"],tags:{brand:"Азбука Вкуса","brand:en":"Azbuka Vkusa","brand:wikidata":"Q4058209","brand:wikipedia":"en:Azbuka Vkusa",name:"Азбука Вкуса","name:en":"Azbuka Vkusa",shop:"supermarket"}},"shop/supermarket|Атак":{countryCodes:["ru"],tags:{brand:"Атак","brand:en":"Atac","brand:wikidata":"Q2868738","brand:wikipedia":"ru:Atac",name:"Атак","name:en":"Atac",shop:"supermarket"}},"shop/supermarket|Ашан":{tags:{brand:"Ашан","brand:en":"Auchan","brand:wikidata":"Q758603","brand:wikipedia":"ru:Auchan",name:"Ашан","name:en":"Auchan",shop:"supermarket"}},"shop/supermarket|Байрам":{tags:{brand:"Байрам",name:"Байрам",shop:"supermarket"}},"shop/supermarket|Брусничка":{countryCodes:["ua"],tags:{brand:"Брусничка","brand:en":"Brusnichka","brand:wikidata":"Q21656645","brand:wikipedia":"uk:Брусничка (торгова мережа)",name:"Брусничка","name:en":"Brusnichka",shop:"supermarket"}},"shop/supermarket|Верный":{tags:{brand:"Верный",name:"Верный",shop:"supermarket"}},"shop/supermarket|Виктория":{countryCodes:["ru"],matchTags:["shop/convenience"],nomatch:["amenity/cafe|Виктория","shop/hairdresser|Виктория"],tags:{brand:"Виктория","brand:wikidata":"Q4111046","brand:wikipedia":"ru:Виктория (сеть магазинов)",name:"Виктория",shop:"supermarket"}},"shop/supermarket|Виталюр":{countryCodes:["by"],tags:{brand:"Виталюр","brand:wikidata":"Q55663075","brand:wikipedia":"ru:Виталюр",name:"Виталюр",shop:"supermarket"}},"shop/supermarket|Вопак":{countryCodes:["ua"],tags:{brand:"Вопак","brand:en":"Vopak","brand:wikidata":"Q30966107","brand:wikipedia":"uk:Вопак",name:"Вопак","name:en":"Vopak",shop:"supermarket"}},"shop/supermarket|Гастроном":{tags:{brand:"Гастроном",name:"Гастроном",shop:"supermarket"}},"shop/supermarket|Гроздь":{nomatch:["shop/convenience|Гроздь"],tags:{brand:"Гроздь","brand:wikidata":"Q21638412","brand:wikipedia":"ru:Гроздь (сеть магазинов)",name:"Гроздь",shop:"supermarket"}},"shop/supermarket|Гулливер":{countryCodes:["ru"],tags:{brand:"Гулливер","brand:wikidata":"Q58003470",name:"Гулливер",shop:"supermarket"}},"shop/supermarket|Десяточка":{countryCodes:["ru"],tags:{brand:"Десяточка","brand:en":"Desyatochka","brand:wikidata":"Q61876182",name:"Десяточка",shop:"supermarket"}},"shop/supermarket|Дикси":{countryCodes:["ru"],matchTags:["shop/convenience"],tags:{brand:"Дикси","brand:en":"Dixy","brand:wikidata":"Q4161561","brand:wikipedia":"ru:Дикси (сеть магазинов)",name:"Дикси",shop:"supermarket"}},"shop/supermarket|Евроопт":{matchNames:["евроопт market"],matchTags:["shop/convenience"],tags:{brand:"Евроопт","brand:en":"Euroopt","brand:ru":"Евроопт","brand:wikidata":"Q2565040","brand:wikipedia":"be:Еўрагандаль",name:"Евроопт","name:en":"Euroopt","name:ru":"Евроопт",shop:"supermarket"}},"shop/supermarket|Евроопт Super":{tags:{brand:"Евроопт Super",name:"Евроопт Super",shop:"supermarket"}},"shop/supermarket|Караван":{tags:{brand:"Караван",name:"Караван",shop:"supermarket"}},"shop/supermarket|Карусель":{countryCodes:["ru"],tags:{brand:"Карусель","brand:en":"Karusel","brand:wikidata":"Q4216307","brand:wikipedia":"ru:Карусель (сеть магазинов)",name:"Карусель","name:en":"Karusel",shop:"supermarket"}},"shop/supermarket|Квартал":{tags:{brand:"Квартал",name:"Квартал",shop:"supermarket"}},"shop/supermarket|Кировский":{matchTags:["shop/convenience"],tags:{brand:"Кировский","brand:wikidata":"Q63301903",name:"Кировский",shop:"supermarket"}},"shop/supermarket|Командор":{countryCodes:["ru"],tags:{brand:"Командор","brand:en":"Komandor","brand:wikidata":"Q61876152",name:"Командор",shop:"supermarket"}},"shop/supermarket|Красный Яр":{countryCodes:["ru"],tags:{brand:"Красный Яр","brand:en":"Krasnyj Jar","brand:wikidata":"Q1786753","brand:wikipedia":"ru:Красный Яр",name:"Красный Яр",shop:"supermarket"}},"shop/supermarket|Лента":{countryCodes:["ru"],tags:{brand:"Лента","brand:en":"Lenta","brand:wikidata":"Q4258608","brand:wikipedia":"ru:Лента (сеть магазинов)",name:"Лента","name:en":"Lenta",shop:"supermarket"}},"shop/supermarket|Магазин":{tags:{brand:"Магазин",name:"Магазин",shop:"supermarket"}},"shop/supermarket|Магнит":{matchTags:["shop/department_store"],nomatch:["shop/convenience|Магнит","shop/cosmetics|Магнит Косметик"],tags:{brand:"Магнит","brand:en":"Magnit","brand:wikidata":"Q940518","brand:wikipedia":"ru:Магнит (сеть магазинов)",name:"Магнит","name:en":"Magnit",shop:"supermarket"}},"shop/supermarket|Магнит у дома":{tags:{brand:"Магнит у дома",name:"Магнит у дома",shop:"supermarket"}},"shop/supermarket|Магнолия":{countryCodes:["ru"],matchTags:["shop/convenience"],tags:{brand:"Магнолия","brand:wikipedia":"ru:Магнолия (сеть магазинов)",name:"Магнолия",shop:"supermarket"}},"shop/supermarket|Мария-Ра":{countryCodes:["ru"],tags:{brand:"Мария-Ра","brand:en":"Maria-ra","brand:wikidata":"Q4281631","brand:wikipedia":"ru:Мария-Ра",name:"Мария-Ра","name:en":"Maria-ra",shop:"supermarket"}},"shop/supermarket|Мираторг":{tags:{brand:"Мираторг",name:"Мираторг",shop:"supermarket"}},"shop/supermarket|Монетка":{countryCodes:["ru"],tags:{brand:"Монетка","brand:en":"Monetka","brand:wikidata":"Q4301704","brand:wikipedia":"ru:Монетка (сеть магазинов)",name:"Монетка","name:en":"Monetka",shop:"supermarket"}},"shop/supermarket|Народная 7Я семьЯ":{countryCodes:["ru"],matchNames:["семья"],tags:{brand:"Народная 7Я семьЯ","brand:en":"People's 7th Family","brand:wikidata":"Q4032436","brand:wikipedia":"ru:Народная 7Я семья",name:"Народная 7Я семьЯ","name:en":"People's 7th Family",shop:"supermarket"}},"shop/supermarket|Перекрёсток":{countryCodes:["ru"],matchNames:["перекресток"],matchTags:["shop/convenience"],tags:{brand:"Перекрёсток","brand:en":"Perekryostok","brand:wikidata":"Q1684639","brand:wikipedia":"en:Perekrestok (supermarket chain)",name:"Перекрёсток",shop:"supermarket"}},"shop/supermarket|Покупочка":{countryCodes:["ru"],tags:{brand:"Покупочка","brand:wikidata":"Q58003270",name:"Покупочка",shop:"supermarket"}},"shop/supermarket|Полушка":{countryCodes:["ru"],tags:{brand:"Полушка","brand:en":"Polushka","brand:wikidata":"Q4371080","brand:wikipedia":"ru:Полушка (сеть магазинов)",name:"Полушка","name:en":"Polushka",shop:"supermarket"}},"shop/supermarket|Пятёрочка":{countryCodes:["ru"],matchNames:["пятерочка"],matchTags:["shop/convenience"],tags:{brand:"Пятёрочка","brand:en":"Pyaterochka","brand:wikidata":"Q1768969","brand:wikipedia":"ru:Пятёрочка",name:"Пятёрочка","name:en":"Pyaterochka",shop:"supermarket"}},"shop/supermarket|Радеж":{countryCodes:["ru"],tags:{brand:"Радеж","brand:en":"Radezh","brand:wikidata":"Q4387165","brand:wikipedia":"ru:Радеж (торговая сеть)",name:"Радеж","name:en":"Radezh",shop:"supermarket"}},"shop/supermarket|Рублёвский":{tags:{brand:"Рублёвский",name:"Рублёвский",shop:"supermarket"}},"shop/supermarket|Рукавичка":{countryCodes:["ua"],tags:{brand:"Рукавичка","brand:en":"Rukavychka","brand:wikidata":"Q20092568","brand:wikipedia":"uk:Рукавичка (торгова мережа)",name:"Рукавичка","name:en":"Rukavychka",shop:"supermarket"}},"shop/supermarket|Светофор":{countryCodes:["ru"],tags:{brand:"Светофор","brand:en":"Svetofor","brand:wikidata":"Q61875920",name:"Светофор",shop:"supermarket"}},"shop/supermarket|Семишагофф":{countryCodes:["ru"],tags:{brand:"Семишагофф","brand:wikidata":"Q58003374",name:"Семишагофф",shop:"supermarket"}},"shop/supermarket|Сільпо":{countryCodes:["ua"],tags:{brand:"Сільпо","brand:en":"Silpo","brand:wikidata":"Q4419434","brand:wikipedia":"en:Silpo",name:"Сільпо","name:en":"Silpo",shop:"supermarket"}},"shop/supermarket|Таврия В":{countryCodes:["ua"],tags:{brand:"Таврия В","brand:wikidata":"Q61823146","brand:wikipedia":"uk:Таврія В",name:"Таврия В",shop:"supermarket"}},"shop/supermarket|Фора":{countryCodes:["ua"],tags:{brand:"Фора","brand:en":"Fora","brand:wikidata":"Q12165977","brand:wikipedia":"uk:Фора (мережа магазинів)",name:"Фора","name:en":"Fora",shop:"supermarket"}},"shop/supermarket|Фуршет":{countryCodes:["ua"],tags:{brand:"Фуршет","brand:en":"Furshet","brand:wikidata":"Q4493564","brand:wikipedia":"uk:Фуршет (мережа супермаркетів)",name:"Фуршет","name:en":"Furshet",shop:"supermarket"}},"shop/supermarket|Эдельвейс":{countryCodes:["ru"],tags:{brand:"Эдельвейс","brand:en":"Edelveis","brand:wikidata":"Q57979368",name:"Эдельвейс","name:en":"Edelveis",shop:"supermarket"}},"shop/supermarket|いなげや":{countryCodes:["jp"],tags:{brand:"いなげや","brand:en":"Inageya","brand:ja":"いなげや","brand:wikidata":"Q17193392","brand:wikipedia":"ja:いなげや",name:"いなげや","name:en":"Inageya","name:ja":"いなげや",shop:"supermarket"}},"shop/supermarket|まいばすけっと":{countryCodes:["jp"],tags:{brand:"まいばすけっと","brand:en":"My Basket","brand:ja":"まいばすけっと","brand:wikidata":"Q11278154","brand:wikipedia":"ja:まいばすけっと",name:"まいばすけっと","name:en":"My Basket","name:ja":"まいばすけっと",shop:"supermarket"}},"shop/supermarket|イオン":{countryCodes:["jp"],tags:{brand:"イオン","brand:en":"AEON","brand:ja":"イオン","brand:wikidata":"Q11285951","brand:wikipedia":"ja:イオン (店舗ブランド)",name:"イオン","name:en":"AEON","name:ja":"イオン",shop:"supermarket"}},"shop/supermarket|イトーヨーカドー":{countryCodes:["jp"],matchNames:["イトーヨーカ堂"],tags:{brand:"イトーヨーカドー","brand:en":"Ito-Yokado","brand:ja":"イトーヨーカドー","brand:wikidata":"Q3088746","brand:wikipedia":"en:Ito-Yokado",name:"イトーヨーカドー","name:en":"Ito-Yokado","name:ja":"イトーヨーカドー",shop:"supermarket"}},"shop/supermarket|カスミ":{countryCodes:["jp"],tags:{brand:"カスミ","brand:en":"Kasumi","brand:ja":"カスミ","brand:wikidata":"Q11294160","brand:wikipedia":"ja:カスミ",name:"カスミ","name:en":"Kasumi","name:ja":"カスミ",shop:"supermarket"}},"shop/supermarket|コープ":{countryCodes:["jp"],tags:{brand:"コープ","brand:ja":"コープ",name:"コープ","name:ja":"コープ",shop:"supermarket"}},"shop/supermarket|バロー":{countryCodes:["jp"],tags:{brand:"バロー","brand:en":"Valor","brand:ja":"バロー","brand:wikidata":"Q11328346","brand:wikipedia":"ja:バロー (チェーンストア)",name:"バロー","name:en":"Valor","name:ja":"バロー",shop:"supermarket"}},"shop/supermarket|マックスバリュ":{countryCodes:["jp"],tags:{brand:"マックスバリュ","brand:en":"Maxvalu Tokai","brand:ja":"マックスバリュ","brand:wikidata":"Q1960109","brand:wikipedia":"en:MaxValu",name:"マックスバリュ","name:en":"Maxvalu Tokai","name:ja":"マックスバリュ",shop:"supermarket"}},"shop/supermarket|マルエツ":{countryCodes:["jp"],tags:{brand:"マルエツ","brand:en":"Maruetsu","brand:ja":"マルエツ","brand:wikidata":"Q11341197","brand:wikipedia":"ja:マルエツ",name:"マルエツ","name:en":"Maruetsu","name:ja":"マルエツ",shop:"supermarket"}},"shop/supermarket|ヤオコー":{countryCodes:["jp"],tags:{brand:"ヤオコー","brand:en":"Yaoko","brand:ja":"ヤオコー","brand:wikidata":"Q11344967","brand:wikipedia":"ja:ヤオコー",name:"ヤオコー","name:en":"Yaoko","name:ja":"ヤオコー",shop:"supermarket"}},"shop/supermarket|ヨークベニマル":{countryCodes:["jp"],tags:{brand:"ヨークベニマル","brand:en":"York Benimaru","brand:ja":"ヨークベニマル","brand:wikidata":"Q11346199","brand:wikipedia":"ja:ヨークベニマル",name:"ヨークベニマル","name:en":"York Benimaru","name:ja":"ヨークベニマル",shop:"supermarket"}},"shop/supermarket|ヨークマート":{countryCodes:["jp"],tags:{brand:"ヨークマート","brand:en":"YorkMart","brand:ja":"ヨークマート","brand:wikidata":"Q11346201","brand:wikipedia":"ja:ヨークマート",name:"ヨークマート","name:en":"YorkMart","name:ja":"ヨークマート",operator:"株式会社セブン&アイ・ホールディングス","operator:en":"Seven & I Holdings Co., Ltd.","operator:wikidata":"Q639447","operator:wikipedia":"ja:セブン&アイ・ホールディングス",shop:"supermarket"}},"shop/supermarket|ライフ":{countryCodes:["jp"],tags:{brand:"ライフ","brand:en":"Life","brand:ja":"ライフ","brand:wikidata":"Q11346476","brand:wikipedia":"ja:ライフコーポレーション",name:"ライフ","name:en":"Life","name:ja":"ライフ",shop:"supermarket"}},"shop/supermarket|全聯":{countryCodes:["tw"],tags:{brand:"全聯","brand:en":"Pxmart","brand:wikidata":"Q7262792","brand:wikipedia":"en:PX Mart",name:"全聯","name:en":"Pxmart",shop:"supermarket"}},"shop/supermarket|全聯福利中心":{countryCodes:["tw"],tags:{brand:"全聯福利中心","brand:en":"Pxmart","brand:wikidata":"Q7262792","brand:wikipedia":"en:PX Mart",name:"全聯福利中心","name:en":"Pxmart",shop:"supermarket"}},"shop/supermarket|家乐福":{countryCodes:["cn"],tags:{brand:"家乐福","brand:wikidata":"Q217599","brand:wikipedia":"wuu:家乐福",name:"家乐福",shop:"supermarket"}},"shop/supermarket|惠康 Wellcome":{countryCodes:["hk"],tags:{brand:"惠康 Wellcome","brand:en":"Wellcome","brand:wikidata":"Q706247","brand:wikipedia":"zh:惠康",name:"惠康 Wellcome","name:en":"Wellcome",shop:"supermarket"}},"shop/supermarket|業務スーパー":{countryCodes:["jp"],tags:{brand:"業務スーパー","brand:en":"Gyōmu sūpā","brand:ja":"業務スーパー","brand:wikidata":"Q11590183","brand:wikipedia":"ja:神戸物産",name:"業務スーパー","name:en":"Gyōmu sūpā","name:ja":"業務スーパー",shop:"supermarket"}},"shop/supermarket|沃尔玛":{countryCodes:["cn"],tags:{brand:"沃尔玛","brand:en":"Walmart","brand:wikidata":"Q483551","brand:wikipedia":"wuu:沃尔玛",name:"沃尔玛","name:en":"Walmart",shop:"supermarket"}},"shop/supermarket|美廉社":{countryCodes:["tw"],tags:{brand:"美廉社","brand:en":"Simple Mart","brand:wikidata":"Q15914017","brand:wikipedia":"zh:美廉社",name:"美廉社","name:en":"Simple Mart",shop:"supermarket"}},"shop/supermarket|西友":{countryCodes:["jp"],tags:{brand:"西友","brand:en":"Seiyu Group","brand:wikidata":"Q3108542","brand:wikipedia":"en:Seiyu Group",name:"西友","name:en":"Seiyu Group",shop:"supermarket"}},"shop/supermarket|頂好":{countryCodes:["tw"],tags:{brand:"頂好","brand:en":"Wellcome","brand:wikidata":"Q706247","brand:wikipedia":"en:Wellcome",name:"頂好","name:en":"Wellcome",shop:"supermarket"}},"shop/supermarket|頂好超市":{tags:{brand:"頂好超市","brand:en":"Wellcome","brand:wikidata":"Q706247","brand:wikipedia":"en:Wellcome",name:"頂好超市","name:en":"Wellcome",shop:"supermarket"}},"shop/supermarket|롯데마트":{countryCodes:["kr"],tags:{brand:"롯데마트","brand:ko":"롯데마트","brand:wikidata":"Q326715","brand:wikipedia":"ko:롯데마트",name:"롯데마트","name:en":"Lotte Mart","name:ko":"롯데마트",shop:"supermarket"}},"shop/supermarket|우리마트":{countryCodes:["kr"],tags:{brand:"우리마트","brand:ko":"우리마트",name:"우리마트","name:ko":"우리마트",shop:"supermarket"}},"shop/supermarket|하나로마트":{countryCodes:["kr"],tags:{brand:"하나로마트","brand:en":"Hanaro Mart","brand:ko":"하나로마트","brand:wikidata":"Q12590611","brand:wikipedia":"ko:농협유통",name:"하나로마트","name:ko":"하나로마트",shop:"supermarket"}},"shop/tea|T2":{countryCodes:["au"],tags:{brand:"T2","brand:wikidata":"Q48802134","brand:wikipedia":"en:T2 (Australian company)",name:"T2",shop:"tea"}},"shop/tea|TeeGschwendner":{tags:{brand:"TeeGschwendner","brand:wikidata":"Q2399969","brand:wikipedia":"de:TeeGschwendner",name:"TeeGschwendner",shop:"tea"}},"shop/ticket|Boutique Grandes Lignes":{countryCodes:["fr"],tags:{brand:"Boutique Grandes Lignes","brand:wikidata":"Q13646","brand:wikipedia":"fr:Société nationale des chemins de fer français",name:"Boutique Grandes Lignes",shop:"ticket"}},"shop/ticket|DB Reisezentrum":{countryCodes:["de"],matchNames:["reisezentrum"],tags:{brand:"DB Reisezentrum","brand:wikidata":"Q15842100","brand:wikipedia":"de:Reisezentrum",name:"DB Reisezentrum",shop:"ticket"}},"shop/ticket|Guichet Transilien":{countryCodes:["fr"],tags:{brand:"Guichet Transilien","brand:wikidata":"Q389554","brand:wikipedia":"fr:Transilien",name:"Guichet Transilien",shop:"ticket"}},"shop/tobacco|Nemzeti Dohánybolt":{countryCodes:["hu"],matchNames:["dohánybolt"],matchTags:["shop/kiosk"],tags:{brand:"Nemzeti Dohánybolt","brand:wikidata":"Q20639040","brand:wikipedia":"en:Dohánybolt",name:"Nemzeti Dohánybolt",shop:"tobacco"}},"shop/toys|Build-A-Bear Workshop":{countryCodes:["ca","gb","us"],matchNames:["build a bear"],tags:{brand:"Build-A-Bear Workshop","brand:wikidata":"Q1002992","brand:wikipedia":"en:Build-A-Bear Workshop",name:"Build-A-Bear Workshop",shop:"toys"}},"shop/toys|Dráčik":{countryCodes:["cz","sk"],tags:{brand:"Dráčik","brand:wikidata":"Q57653669",name:"Dráčik",shop:"toys"}},"shop/toys|Intertoys":{countryCodes:["be","de","nl"],tags:{brand:"Intertoys","brand:wikidata":"Q1891407","brand:wikipedia":"nl:Intertoys",name:"Intertoys",shop:"toys"}},"shop/toys|JouéClub":{countryCodes:["ad","fr","it","lb","ma","qa"],tags:{brand:"JouéClub","brand:wikidata":"Q3187152","brand:wikipedia":"fr:JouéClub",name:"JouéClub",shop:"toys"}},"shop/toys|King Jouet":{countryCodes:["fr"],tags:{brand:"King Jouet","brand:en":"King Toy","brand:wikidata":"Q3197009","brand:wikipedia":"fr:King Jouet",name:"King Jouet","name:en":"King Toy",shop:"toys"}},"shop/toys|La Grande Récré":{countryCodes:["be","ci","es","fr","ma"],tags:{brand:"La Grande Récré","brand:wikidata":"Q3209556","brand:wikipedia":"fr:La Grande Récré (magasin)",name:"La Grande Récré",shop:"toys"}},"shop/toys|Lego":{tags:{brand:"Lego","brand:wikidata":"Q1063455","brand:wikipedia":"en:The Lego Group",name:"Lego",shop:"toys"}},"shop/toys|Lekia":{countryCodes:["no","se"],tags:{brand:"Lekia","brand:wikidata":"Q56303274","brand:wikipedia":"sv:Lekia",name:"Lekia",shop:"toys"}},"shop/toys|Maxi Toys":{countryCodes:["be","de","fr","it"],tags:{brand:"Maxi Toys","brand:wikidata":"Q16663879","brand:wikipedia":"fr:Maxi Toys",name:"Maxi Toys",shop:"toys"}},"shop/toys|The Entertainer":{countryCodes:["gb","je"],tags:{brand:"The Entertainer","brand:wikidata":"Q7732289","brand:wikipedia":"en:The Entertainer (retailer)",name:"The Entertainer",shop:"toys"}},"shop/toys|Toys R Us":{tags:{brand:"Toys R Us","brand:wikidata":"Q696334","brand:wikipedia":"en:Toys \"R\" Us",name:"Toys R Us",shop:"toys"}},"shop/toys|Бегемотик":{countryCodes:["ru"],tags:{brand:"Бегемотик",name:"Бегемотик",shop:"toys"}},"shop/toys|Детский мир":{tags:{brand:"Детский мир","brand:en":"Detskiy Mir","brand:wikidata":"Q16643324","brand:wikipedia":"en:Detsky Mir",name:"Детский мир","name:en":"Detskiy Mir",shop:"toys"}},"shop/toys|Кораблик":{countryCodes:["ru"],tags:{brand:"Кораблик","brand:wikidata":"Q57653416",name:"Кораблик",shop:"toys"}},"shop/travel_agency|Coral Travel":{countryCodes:["pl","ru","ua"],tags:{brand:"Coral Travel","brand:wikidata":"Q58011479",name:"Coral Travel",shop:"travel_agency"}},"shop/travel_agency|D-reizen":{countryCodes:["nl"],tags:{brand:"D-reizen","brand:wikidata":"Q2445498","brand:wikipedia":"nl:D-reizen",name:"D-reizen",shop:"travel_agency"}},"shop/travel_agency|DER Reisebüro":{countryCodes:["de"],tags:{brand:"DER Reisebüro","brand:wikidata":"Q56729186","brand:wikipedia":"de:Deutsches Reisebüro",name:"DER Reisebüro",shop:"travel_agency"}},"shop/travel_agency|First Reisebüro":{countryCodes:["de"],tags:{brand:"First Reisebüro","brand:wikidata":"Q573103","brand:wikipedia":"en:TUI Group",name:"First Reisebüro",shop:"travel_agency"}},"shop/travel_agency|Flight Centre":{tags:{brand:"Flight Centre","brand:wikidata":"Q5459202","brand:wikipedia":"en:Flight Centre",name:"Flight Centre",shop:"travel_agency"}},"shop/travel_agency|Halcón Viajes":{countryCodes:["es"],tags:{brand:"Halcón Viajes","brand:wikidata":"Q57591939",name:"Halcón Viajes",shop:"travel_agency"}},"shop/travel_agency|Havas Voyages":{countryCodes:["fr"],tags:{brand:"Havas Voyages","brand:wikidata":"Q57628091",name:"Havas Voyages",shop:"travel_agency"}},"shop/travel_agency|Reiseland":{countryCodes:["de"],tags:{brand:"Reiseland","brand:wikidata":"Q40387610","brand:wikipedia":"de:OTTO Reisen",name:"Reiseland",shop:"travel_agency"}},"shop/travel_agency|Selectour":{countryCodes:["fr"],tags:{brand:"Selectour","brand:wikidata":"Q3478073","brand:wikipedia":"fr:Selectour",name:"Selectour",shop:"travel_agency"}},"shop/travel_agency|TUI":{matchNames:["tui reisecenter"],tags:{brand:"TUI","brand:wikidata":"Q573103","brand:wikipedia":"en:TUI Group",name:"TUI",shop:"travel_agency"}},"shop/travel_agency|The Co-operative Travel":{countryCodes:["gb"],tags:{brand:"The Co-operative Travel","brand:wikidata":"Q7726526","brand:wikipedia":"en:The Co-operative Travel",name:"The Co-operative Travel",shop:"travel_agency"}},"shop/travel_agency|Thomas Cook":{tags:{brand:"Thomas Cook","brand:wikidata":"Q2141800","brand:wikipedia":"en:Thomas Cook Group",name:"Thomas Cook",shop:"travel_agency"}},"shop/travel_agency|Thomson":{tags:{brand:"Thomson","brand:wikidata":"Q7795876","brand:wikipedia":"en:TUI UK",name:"Thomson",shop:"travel_agency"}},"shop/travel_agency|Поехали с нами":{countryCodes:["ua"],tags:{brand:"Поехали с нами","brand:wikidata":"Q25439141","brand:wikipedia":"uk:Поїхали з нами",name:"Поехали с нами",shop:"travel_agency"}},"shop/tyres|Big O Tires":{tags:{brand:"Big O Tires","brand:wikidata":"Q4906085","brand:wikipedia":"en:Big O Tires",name:"Big O Tires",shop:"tyres"}},"shop/tyres|Bridgestone":{tags:{brand:"Bridgestone","brand:wikidata":"Q179433","brand:wikipedia":"en:Bridgestone",name:"Bridgestone",shop:"tyres"}},"shop/tyres|Discount Tire":{tags:{brand:"Discount Tire","brand:wikidata":"Q5281735","brand:wikipedia":"en:Discount Tire",name:"Discount Tire",shop:"tyres"}},"shop/tyres|Express Oil Change & Tire Engineers":{countryCodes:["us"],tags:{brand:"Express Oil Change & Tire Engineers","brand:wikidata":"Q39057654","brand:wikipedia":"en:Express Oil Change & Tire Engineers",name:"Express Oil Change & Tire Engineers",shop:"tyres"}},"shop/tyres|Les Schwab Tire Center":{countryCodes:["us"],tags:{brand:"Les Schwab Tire Center","brand:wikidata":"Q6529977","brand:wikipedia":"en:Les Schwab Tire Centers",name:"Les Schwab Tire Center",shop:"tyres"}},"shop/tyres|Michelin":{tags:{brand:"Michelin","brand:wikidata":"Q151107","brand:wikipedia":"en:Michelin",name:"Michelin",shop:"tyres"}},"shop/tyres|Tire Discounters":{countryCodes:["us"],tags:{brand:"Tire Discounters","brand:wikidata":"Q29093639","brand:wikipedia":"en:Tire Discounters",name:"Tire Discounters",shop:"tyres"}},"shop/tyres|Vianor":{tags:{brand:"Vianor","brand:wikidata":"Q10714920","brand:wikipedia":"sv:Vianor",name:"Vianor",shop:"tyres"}},"shop/variety_store|99 Cents Only Stores":{countryCodes:["us"],matchNames:["99 cents only"],matchTags:["shop/convenience","shop/department_store","shop/supermarket"],tags:{brand:"99 Cents Only Stores","brand:wikidata":"Q4646294","brand:wikipedia":"en:99 Cents Only Stores",name:"99 Cents Only Stores",shop:"variety_store"}},"shop/variety_store|Action":{matchTags:["shop/supermarket"],tags:{brand:"Action","brand:wikidata":"Q2634111","brand:wikipedia":"nl:Action (winkel)",name:"Action",shop:"variety_store"}},"shop/variety_store|B&M Bargains":{tags:{brand:"B&M Bargains","brand:wikidata":"Q4836931","brand:wikipedia":"en:B & M",name:"B&M Bargains",shop:"variety_store"}},"shop/variety_store|Big Bazar":{tags:{brand:"Big Bazar","brand:wikidata":"Q15873104","brand:wikipedia":"nl:Big Bazar",name:"Big Bazar",shop:"variety_store"}},"shop/variety_store|Centrakor":{countryCodes:["fr"],tags:{brand:"Centrakor",name:"Centrakor",shop:"variety_store"}},"shop/variety_store|Dollar General":{matchTags:["shop/convenience","shop/department_store","shop/supermarket"],tags:{brand:"Dollar General","brand:wikidata":"Q145168","brand:wikipedia":"en:Dollar General",name:"Dollar General",shop:"variety_store"}},"shop/variety_store|Dollar Tree":{matchTags:["shop/convenience","shop/department_store","shop/supermarket"],tags:{brand:"Dollar Tree","brand:wikidata":"Q5289230","brand:wikipedia":"en:Dollar Tree",name:"Dollar Tree",shop:"variety_store"}},"shop/variety_store|Dollarama":{countryCodes:["ca"],tags:{brand:"Dollarama","brand:wikidata":"Q3033947","brand:wikipedia":"en:Dollarama",name:"Dollarama",shop:"variety_store"}},"shop/variety_store|Family Dollar":{matchTags:["shop/convenience","shop/department_store","shop/supermarket"],tags:{brand:"Family Dollar","brand:wikidata":"Q5433101","brand:wikipedia":"en:Family Dollar",name:"Family Dollar",shop:"variety_store"}},"shop/variety_store|Five Below":{tags:{brand:"Five Below","brand:wikidata":"Q5455836","brand:wikipedia":"en:Five Below",name:"Five Below",shop:"variety_store"}},"shop/variety_store|Fix Price":{tags:{brand:"Fix Price","brand:wikidata":"Q4038791","brand:wikipedia":"ru:Fix Price (сеть магазинов)",name:"Fix Price",shop:"variety_store"}},"shop/variety_store|GiFi":{tags:{brand:"GiFi","brand:wikidata":"Q3105439","brand:wikipedia":"fr:Gifi",name:"GiFi",shop:"variety_store"}},"shop/variety_store|Home Bargains":{matchTags:["shop/supermarket"],tags:{brand:"Home Bargains","brand:wikidata":"Q5888229","brand:wikipedia":"en:Home Bargains",name:"Home Bargains",shop:"variety_store"}},"shop/variety_store|Mäc-Geiz":{countryCodes:["de"],tags:{brand:"Mäc-Geiz","brand:wikidata":"Q1957126","brand:wikipedia":"de:Mäc-Geiz",name:"Mäc-Geiz",shop:"variety_store"}},"shop/variety_store|NOZ":{countryCodes:["fr"],tags:{brand:"NOZ","brand:wikidata":"Q3345688","brand:wikipedia":"fr:Noz",name:"NOZ",shop:"variety_store"}},"shop/variety_store|Poundland":{countryCodes:["gb"],tags:{brand:"Poundland","brand:wikidata":"Q1434528","brand:wikipedia":"en:Poundland",name:"Poundland",shop:"variety_store"}},"shop/variety_store|Poundstretcher":{countryCodes:["gb"],tags:{brand:"Poundstretcher","brand:wikidata":"Q7235675","brand:wikipedia":"en:Poundstretcher",name:"Poundstretcher",shop:"variety_store"}},"shop/variety_store|Poundworld":{tags:{brand:"Poundworld","brand:wikidata":"Q16967516","brand:wikipedia":"en:Poundworld",name:"Poundworld",shop:"variety_store"}},"shop/variety_store|TEDi":{countryCodes:["at","de","es","hr","si","sk"],tags:{brand:"TEDi","brand:wikidata":"Q1364603","brand:wikipedia":"de:TEDi",name:"TEDi",shop:"variety_store"}},"shop/variety_store|Tokmanni":{countryCodes:["fi"],tags:{brand:"Tokmanni","brand:wikidata":"Q13423470","brand:wikipedia":"fi:Tokmanni",name:"Tokmanni",shop:"variety_store"}},"shop/variety_store|Wilko":{countryCodes:["gb"],tags:{brand:"Wilko","brand:wikidata":"Q8002536","brand:wikipedia":"en:Wilko (retailer)",name:"Wilko",shop:"variety_store"}},"shop/variety_store|キャンドゥ":{countryCodes:["jp"],tags:{brand:"キャンドゥ","brand:en":"CAN DO","brand:ja":"キャンドゥ","brand:wikidata":"Q11297367","brand:wikipedia":"ja:キャンドゥ",name:"キャンドゥ","name:en":"CAN DO","name:ja":"キャンドゥ",shop:"variety_store"}},"shop/variety_store|セリア":{countryCodes:["jp"],tags:{brand:"セリア","brand:en":"Seria","brand:ja":"セリア","brand:wikidata":"Q11314509","brand:wikipedia":"ja:セリア (100円ショップ)",name:"セリア","name:en":"Seria","name:ja":"セリア",shop:"variety_store"}},"shop/variety_store|ダイソー":{countryCodes:["jp"],matchNames:["ザ・ダイソー"],tags:{brand:"ダイソー","brand:en":"Daiso","brand:ja":"ダイソー","brand:wikidata":"Q866991","brand:wikipedia":"ja:大創産業",name:"ダイソー","name:en":"Daiso","name:ja":"ダイソー",shop:"variety_store"}},"shop/variety_store|ダイレックス":{countryCodes:["jp"],matchTags:["shop/supermarket"],tags:{brand:"ダイレックス","brand:en":"Direx","brand:ja":"ダイレックス","brand:wikidata":"Q11317051","brand:wikipedia":"ja:ダイレックス (ディスカウントストア)",name:"ダイレックス","name:en":"Direx","name:ja":"ダイレックス",shop:"variety_store"}},"shop/variety_store|トライアル":{countryCodes:["jp"],matchTags:["shop/supermarket"],tags:{brand:"トライアル","brand:en":"Trial","brand:ja":"トライアル","brand:wikidata":"Q11321723","brand:wikipedia":"ja:トライアルカンパニー",name:"トライアル","name:en":"Trial","name:ja":"トライアル",shop:"variety_store"}},"shop/variety_store|ドン・キホーテ":{countryCodes:["jp"],matchTags:["shop/supermarket"],tags:{brand:"ドン・キホーテ","brand:en":"Don Quijote","brand:ja":"ドン・キホーテ","brand:wikidata":"Q1185381","brand:wikipedia":"ja:ドン・キホーテ (企業)",name:"ドン・キホーテ","name:en":"Don Quijote","name:ja":"ドン・キホーテ",opening_hours:"24/7",shop:"variety_store",short_name:"ドンキ","short_name:en":"Donki","short_name:ja":"ドンキ"}},"shop/video_games|EB Games":{tags:{brand:"EB Games","brand:wikidata":"Q4993686","brand:wikipedia":"en:EB Games",name:"EB Games",shop:"video_games"}},"shop/video_games|Game":{countryCodes:["gb"],tags:{brand:"Game","brand:wikidata":"Q5519813","brand:wikipedia":"en:Game (retailer)",name:"Game",shop:"video_games"}},"shop/video_games|GameStop":{tags:{brand:"GameStop","brand:wikidata":"Q202210","brand:wikipedia":"en:GameStop",name:"GameStop",shop:"video_games"}},"shop/video_games|Micromania":{countryCodes:["fr"],tags:{brand:"Micromania","brand:wikidata":"Q3312221","brand:wikipedia":"en:Micromania (video game retailer)",name:"Micromania",shop:"video_games"}},"shop/video|Blockbuster":{tags:{brand:"Blockbuster","brand:wikidata":"Q884711","brand:wikipedia":"en:Blockbuster LLC",name:"Blockbuster",shop:"video"}},"shop/video|Family Video":{tags:{brand:"Family Video","brand:wikidata":"Q5433297","brand:wikipedia":"en:Family Video",name:"Family Video",shop:"video"}},"shop/video|TSUTAYA":{nomatch:["shop/books|TSUTAYA","shop/music|TSUTAYA"],tags:{brand:"TSUTAYA","brand:wikidata":"Q5193457","brand:wikipedia":"ja:カルチュア・コンビニエンス・クラブ",name:"TSUTAYA",shop:"video"}},"shop/video|ゲオ":{countryCodes:["jp"],matchNames:["geo"],tags:{brand:"GEO","brand:ja":"GEO","brand:wikidata":"Q5533938","brand:wikipedia":"ja:ゲオ",name:"ゲオ","name:en":"GEO","name:ja":"ゲオ",shop:"video"}},"shop/watches|Fossil":{tags:{brand:"Fossil","brand:wikidata":"Q356212","brand:wikipedia":"en:Fossil Group",name:"Fossil",shop:"watches"}},"shop/watches|Swatch":{tags:{brand:"Swatch","brand:wikidata":"Q573422","brand:wikipedia":"en:Swatch",name:"Swatch",shop:"watches"}},"shop/wholesale|BJ's Wholesale Club":{matchTags:["shop/department_store"],tags:{brand:"BJ's Wholesale Club","brand:wikidata":"Q4835754","brand:wikipedia":"en:BJ's Wholesale Club",name:"BJ's Wholesale Club",operator:"BJ's Wholesale Club",shop:"wholesale"}},"shop/wholesale|Costco":{matchNames:["costco wholesale"],matchTags:["shop/department_store"],nomatch:["amenity/fuel|Costco Gasoline","amenity/pharmacy|Costco Pharmacy"],tags:{brand:"Costco","brand:wikidata":"Q715583","brand:wikipedia":"en:Costco",name:"Costco",operator:"Costco",shop:"wholesale"}},"shop/wholesale|Makro":{matchTags:["shop/department_store"],tags:{brand:"Makro","brand:wikidata":"Q704606","brand:wikipedia":"en:Makro",name:"Makro",shop:"wholesale"}},"shop/wholesale|Metro":{matchTags:["shop/department_store"],nomatch:["amenity/bank|Metrobank","shop/supermarket|Metro~(Canada)"],tags:{brand:"Metro","brand:wikidata":"Q13610282","brand:wikipedia":"en:Metro Cash and Carry",name:"Metro",shop:"wholesale"}},"shop/wholesale|Sam's Club":{matchTags:["shop/department_store"],nomatch:["amenity/fuel|Sam's Club"],tags:{brand:"Sam's Club","brand:wikidata":"Q1972120","brand:wikipedia":"en:Sam's Club",name:"Sam's Club",operator:"Walmart","operator:wikidata":"Q483551","operator:wikipedia":"en:Walmart",shop:"wholesale"}},"shop/wholesale|コストコ":{countryCodes:["jp"],matchTags:["shop/department_store"],tags:{brand:"コストコ","brand:en":"Costco","brand:ja":"コストコ","brand:wikidata":"Q715583","brand:wikipedia":"ja:コストコ",name:"コストコ","name:en":"Costco","name:ja":"コストコ",operator:"コストコホールセールジャパン株式会社","operator:en":"Costco Wholesale Japan Co., Ltd.",shop:"wholesale"}},"tourism/hotel|B&B Hôtel":{tags:{brand:"B&B Hôtel","brand:wikidata":"Q794939","brand:wikipedia":"en:B&B Hotels",name:"B&B Hôtel",tourism:"hotel"}},"tourism/hotel|Best Western":{nomatch:["tourism/hotel|Best Western Plus"],tags:{brand:"Best Western","brand:wikidata":"Q830334","brand:wikipedia":"en:Best Western",name:"Best Western",tourism:"hotel"}},"tourism/hotel|Best Western Plus":{nomatch:["tourism/hotel|Best Western"],tags:{brand:"Best Western","brand:wikidata":"Q830334","brand:wikipedia":"en:Best Western",name:"Best Western Plus",tourism:"hotel"}},"tourism/hotel|Campanile":{nomatch:["amenity/restaurant|Campanile"],tags:{brand:"Campanile","brand:wikidata":"Q2412064","brand:wikipedia":"fr:Campanile (chaîne d'hôtels)",name:"Campanile",tourism:"hotel"}},"tourism/hotel|Candlewood Suites":{tags:{brand:"Candlewood Suites","brand:wikidata":"Q5032010","brand:wikipedia":"en:Candlewood Suites",name:"Candlewood Suites",tourism:"hotel"}},"tourism/hotel|Comfort Inn":{nomatch:["tourism/hotel|Comfort Suites"],tags:{brand:"Comfort Inn","brand:wikidata":"Q1075788","brand:wikipedia":"en:Choice Hotels",name:"Comfort Inn",tourism:"hotel"}},"tourism/hotel|Comfort Inn & Suites":{tags:{brand:"Comfort Inn & Suites","brand:wikidata":"Q1075788","brand:wikipedia":"en:Choice Hotels",name:"Comfort Inn & Suites",tourism:"hotel"}},"tourism/hotel|Comfort Suites":{nomatch:["tourism/hotel|Comfort Inn"],tags:{brand:"Comfort Suites","brand:wikidata":"Q1075788","brand:wikipedia":"en:Choice Hotels",name:"Comfort Suites",tourism:"hotel"}},"tourism/hotel|Country Inn & Suites":{tags:{brand:"Country Inn & Suites","brand:wikidata":"Q5177332","brand:wikipedia":"en:Country Inns & Suites",name:"Country Inn & Suites",tourism:"hotel"}},"tourism/hotel|Courtyard by Marriott":{matchNames:["courtyard marriott"],tags:{brand:"Courtyard by Marriott","brand:wikidata":"Q1053170","brand:wikipedia":"en:Courtyard by Marriott",name:"Courtyard by Marriott",tourism:"hotel"}},"tourism/hotel|Crowne Plaza":{tags:{brand:"Crowne Plaza","brand:wikidata":"Q2746220","brand:wikipedia":"en:Crowne Plaza",name:"Crowne Plaza",tourism:"hotel"}},"tourism/hotel|Days Inn":{tags:{brand:"Days Inn","brand:wikidata":"Q1047239","brand:wikipedia":"en:Days Inn",name:"Days Inn",operator:"Wyndham Hotels and Resorts","operator:wikidata":"Q8040120","operator:wikipedia":"en:Wyndham Hotels and Resorts",tourism:"hotel"}},"tourism/hotel|Embassy Suites":{tags:{brand:"Embassy Suites","brand:wikidata":"Q5369524","brand:wikipedia":"en:Embassy Suites by Hilton",name:"Embassy Suites",tourism:"hotel"}},"tourism/hotel|Extended Stay America":{tags:{brand:"Extended Stay America","brand:wikidata":"Q5421850","brand:wikipedia":"en:Extended Stay America",name:"Extended Stay America",tourism:"hotel"}},"tourism/hotel|Fairfield Inn":{matchNames:["fairfield inn & suites","fairfield inn and suites"],tags:{brand:"Fairfield Inn","brand:wikidata":"Q5430314","brand:wikipedia":"en:Fairfield Inn by Marriott",name:"Fairfield Inn",tourism:"hotel"}},"tourism/hotel|Formule 1":{tags:{brand:"Formule 1","brand:wikidata":"Q1630895","brand:wikipedia":"en:Hotel Formule 1",name:"Formule 1",tourism:"hotel"}},"tourism/hotel|Grand Hyatt":{tags:{brand:"Grand Hyatt","brand:wikidata":"Q1425063","brand:wikipedia":"en:Hyatt",name:"Grand Hyatt",operator:"Hyatt",tourism:"hotel"}},"tourism/hotel|Hampton":{matchNames:["hampton inn","hampton inn & suites","hampton inn and suites"],tags:{alt_name:"Hampton Inn",brand:"Hampton","brand:wikidata":"Q5646230","brand:wikipedia":"en:Hampton by Hilton",name:"Hampton",tourism:"hotel"}},"tourism/hotel|Hilton":{tags:{brand:"Hilton","brand:wikidata":"Q598884","brand:wikipedia":"en:Hilton Hotels & Resorts",name:"Hilton",tourism:"hotel"}},"tourism/hotel|Hilton Garden Inn":{tags:{brand:"Hilton Garden Inn","brand:wikidata":"Q1162859","brand:wikipedia":"en:Hilton Garden Inn",name:"Hilton Garden Inn",tourism:"hotel"}},"tourism/hotel|Holiday Inn":{nomatch:["tourism/hotel|Holiday Inn Express"],tags:{brand:"Holiday Inn","brand:wikidata":"Q2717882","brand:wikipedia":"en:Holiday Inn",name:"Holiday Inn",tourism:"hotel"}},"tourism/hotel|Holiday Inn Express":{nomatch:["tourism/hotel|Holiday Inn"],tags:{brand:"Holiday Inn Express","brand:wikidata":"Q5880423","brand:wikipedia":"en:Holiday Inn Express",name:"Holiday Inn Express",tourism:"hotel"}},"tourism/hotel|Holiday Inn Express & Suites":{tags:{brand:"Holiday Inn Express & Suites","brand:wikidata":"Q5880423","brand:wikipedia":"en:Holiday Inn Express",name:"Holiday Inn Express & Suites",tourism:"hotel"}},"tourism/hotel|Homewood Suites":{tags:{brand:"Homewood Suites","brand:wikidata":"Q5890701","brand:wikipedia":"en:Homewood Suites by Hilton",name:"Homewood Suites",tourism:"hotel"}},"tourism/hotel|Hyatt":{tags:{brand:"Hyatt","brand:wikidata":"Q1425063","brand:wikipedia":"en:Hyatt",name:"Hyatt",operator:"Hyatt",tourism:"hotel"}},"tourism/hotel|Hyatt Centric":{tags:{brand:"Hyatt Centric","brand:wikidata":"Q1425063","brand:wikipedia":"en:Hyatt",name:"Hyatt Centric",operator:"Hyatt",tourism:"hotel"}},"tourism/hotel|Hyatt House":{tags:{brand:"Hyatt House","brand:wikidata":"Q1425063","brand:wikipedia":"en:Hyatt",name:"Hyatt House",operator:"Hyatt",tourism:"hotel"}},"tourism/hotel|Hyatt Place":{tags:{brand:"Hyatt","brand:wikidata":"Q1425063","brand:wikipedia":"en:Hyatt",name:"Hyatt Place",tourism:"hotel"}},"tourism/hotel|Hyatt Regency":{tags:{brand:"Hyatt Regency","brand:wikidata":"Q1425063","brand:wikipedia":"en:Hyatt",name:"Hyatt Regency",operator:"Hyatt",tourism:"hotel"}},"tourism/hotel|Ibis":{matchNames:["hotel ibis","ibis hotel"],tags:{brand:"Ibis","brand:wikidata":"Q920166","brand:wikipedia":"en:Ibis (hotel)",name:"Ibis",tourism:"hotel"}},"tourism/hotel|Ibis Budget":{tags:{brand:"Ibis Budget","brand:wikidata":"Q1458135","brand:wikipedia":"en:Ibis Budget",name:"Ibis Budget",tourism:"hotel"}},"tourism/hotel|Ibis Styles":{tags:{brand:"Ibis Styles","brand:wikidata":"Q3147425","brand:wikipedia":"en:Ibis Styles",name:"Ibis Styles",tourism:"hotel"}},"tourism/hotel|Kyriad":{countryCodes:["fr"],tags:{brand:"Kyriad","brand:wikidata":"Q11751808","brand:wikipedia":"pl:Kyriad",name:"Kyriad",tourism:"hotel"}},"tourism/hotel|La Quinta":{matchNames:["la quinta inn & suites","la quinta inn and suites","la quinta inns & suites","la quinta inns and suites"],tags:{brand:"La Quinta","brand:wikidata":"Q6464734","brand:wikipedia":"en:La Quinta Inns & Suites",name:"La Quinta",operator:"Wyndham Hotels and Resorts","operator:wikidata":"Q8040120","operator:wikipedia":"en:Wyndham Hotels and Resorts",tourism:"hotel"}},"tourism/hotel|Marriott":{tags:{brand:"Marriott","brand:wikidata":"Q1141173","brand:wikipedia":"en:Marriott International",name:"Marriott",tourism:"hotel"}},"tourism/hotel|Mercure":{tags:{brand:"Mercure","brand:wikidata":"Q1709809","brand:wikipedia":"en:Mercure (hotel)",name:"Mercure",tourism:"hotel"}},"tourism/hotel|Novotel":{tags:{brand:"Novotel","brand:wikidata":"Q420545","brand:wikipedia":"en:Novotel",name:"Novotel",tourism:"hotel"}},"tourism/hotel|Park Hyatt":{tags:{brand:"Park Hyatt","brand:wikidata":"Q1425063","brand:wikipedia":"en:Hyatt",name:"Park Hyatt",operator:"Hyatt",tourism:"hotel"}},"tourism/hotel|Premier Inn":{tags:{brand:"Premier Inn","brand:wikidata":"Q2108626","brand:wikipedia":"en:Premier Inn",name:"Premier Inn",tourism:"hotel"}},"tourism/hotel|Première Classe":{tags:{brand:"Première Classe","brand:wikidata":"Q5964551","brand:wikipedia":"en:Hôtel Première Classe",name:"Première Classe",tourism:"hotel"}},"tourism/hotel|Quality Inn":{tags:{brand:"Quality Inn","brand:wikidata":"Q1075788","brand:wikipedia":"en:Choice Hotels",name:"Quality Inn",tourism:"hotel"}},"tourism/hotel|Quality Inn & Suites":{tags:{brand:"Quality Inn & Suites","brand:wikidata":"Q1075788","brand:wikipedia":"en:Choice Hotels",name:"Quality Inn & Suites",tourism:"hotel"}},"tourism/hotel|Ramada":{tags:{brand:"Ramada","brand:wikidata":"Q1502859","brand:wikipedia":"en:Ramada",name:"Ramada",operator:"Wyndham Hotels and Resorts","operator:wikidata":"Q8040120","operator:wikipedia":"en:Wyndham Hotels and Resorts",tourism:"hotel"}},"tourism/hotel|Red Roof Inn":{tags:{brand:"Red Roof Inn","brand:wikidata":"Q7304949","brand:wikipedia":"en:Red Roof Inn",name:"Red Roof Inn",tourism:"hotel"}},"tourism/hotel|Renaissance Hotel":{tags:{brand:"Renaissance Hotels","brand:wikidata":"Q2143252","brand:wikipedia":"en:Renaissance Hotels",name:"Renaissance Hotel",operator:"Marriott International","operator:wikidata":"Q1141173","operator:wikipedia":"en:Marriott International",tourism:"hotel"}},"tourism/hotel|Residence Inn":{tags:{brand:"Residence Inn","brand:wikidata":"Q7315394","brand:wikipedia":"en:Residence Inn by Marriott",name:"Residence Inn",tourism:"hotel"}},"tourism/hotel|Sheraton":{tags:{brand:"Sheraton","brand:wikidata":"Q634831","brand:wikipedia":"en:Sheraton Hotels and Resorts",name:"Sheraton",tourism:"hotel"}},"tourism/hotel|Sleep Inn":{tags:{brand:"Sleep Inn","brand:wikidata":"Q1075788","brand:wikipedia":"en:Choice Hotels",name:"Sleep Inn",tourism:"hotel"}},"tourism/hotel|Staybridge Suites":{tags:{brand:"Staybridge Suites","brand:wikidata":"Q7605116","brand:wikipedia":"en:Staybridge Suites",name:"Staybridge Suites",tourism:"hotel"}},"tourism/hotel|Travelodge":{tags:{brand:"Travelodge","brand:wikidata":"Q7836087","brand:wikipedia":"en:Travelodge",name:"Travelodge",operator:"Wyndham Hotels and Resorts","operator:wikidata":"Q8040120","operator:wikipedia":"en:Wyndham Hotels and Resorts",tourism:"hotel"}},"tourism/hotel|W Hotels":{tags:{brand:"W Hotels","brand:wikidata":"Q7958488","brand:wikipedia":"en:W Hotels",name:"W Hotels",short_name:"W",tourism:"hotel"}},"tourism/hotel|東横イン":{countryCodes:["jp"],tags:{brand:"東横イン","brand:en":"Toyoko Inn","brand:ja":"東横イン","brand:wikidata":"Q1320541","brand:wikipedia":"en:Toyoko Inn",name:"東横イン","name:en":"Toyoko Inn","name:ja":"東横イン",tourism:"hotel"}},"tourism/motel|Econo Lodge":{tags:{brand:"Econo Lodge","brand:wikidata":"Q5333330","brand:wikipedia":"en:Econo Lodge",name:"Econo Lodge",tourism:"motel"}},"tourism/motel|Motel 6":{tags:{brand:"Motel 6","brand:wikidata":"Q2188884","brand:wikipedia":"en:Motel 6",name:"Motel 6",tourism:"motel"}},"tourism/motel|Rodeway Inn":{tags:{brand:"Rodeway Inn","brand:wikidata":"Q7356709","brand:wikipedia":"en:Rodeway Inn",name:"Rodeway Inn",tourism:"motel"}},"tourism/motel|Super 8":{tags:{brand:"Super 8","brand:wikidata":"Q5364003","brand:wikipedia":"en:Super 8 Motels",name:"Super 8",operator:"Wyndham Hotels and Resorts","operator:wikidata":"Q8040120","operator:wikipedia":"en:Wyndham Hotels and Resorts",tourism:"motel"}}};
64971         var brands$1 = {
64972         brands: brands
64973         };
64974
64975         var keepTags = ["^amenity/bank$","^amenity/bicycle_rental$","^amenity/bureau_de_change$","^amenity/cafe$","^amenity/car_rental$","^amenity/car_sharing$","^amenity/charging_station$","^amenity/cinema$","^amenity/dentist$","^amenity/fast_food$","^amenity/fuel$","^amenity/ice_cream$","^amenity/money_transfer$","^amenity/payment_(centre|terminal)$","^amenity/pharmacy$","^amenity/post_(box|office)$","^amenity/public_bookcase$","^amenity/restaurant$","^amenity/social_(centre|facility)$","^amenity/vending_machine$","^amenity/veterinary$","^leisure/fitness_centre$","^shop/(?!(yes|no|gas|convenience;gas|laundry|lottery|mall))","^tourism/(h|m)otel$"];
64976         var discardKeys = ["^amenity/bank\\|(bank zachodni|bz) wbk$","^amenity/bank\\|.*sparkasse.*$","^amenity/bank\\|bank spółdzielczy$","^amenity/bank\\|pko$","^amenity/bank\\|volks- und raiffeisenbank$","^amenity/bank\\|volksbank( |-)raiffeisenbank$","^amenity/bank\\|vr( |-)bank$","^amenity/cafe\\|(kiosque(\\sà)?\\scafé|caf(e|é)\\sexpress|встреча|рандеву|чайхана|жемчужина)$","^amenity/cinema\\|октябрь$","^amenity/fast_food\\|(ali\\sbaba|antalya|asia\\s(bistro|imbiss|wok)|berlin\\sdöner|city\\s(grill|pizza)|kfc/taco\\sbell)$","^amenity/fast_food\\|(pizza\\s(house|time))$","^amenity/fuel\\|gnv|gpl|posto|spbu|جایگاه\\scng$","^amenity/pharmacy\\|(adler|bahnhof|brunnen|burg|bären|engel|hirsch|hubertus|kur|linden|löwen)(-| )?apotheke$","^amenity/pharmacy\\|(centrum|farm(a|á)cia\\s(central(e)?|comunale))$","^amenity/pharmacy\\|(marien|markt|neue|park|rathaus|rats|rosen|schloss|sonnen|stadt|stern)(-| )?apotheke$","^amenity/pharmacy\\|(айболит|арніка)$","^amenity/pharmacy\\|pharmacie\\s(centrale|comunale|de\\s(l'hôtel\\sde\\sville|la\\s(gare|mairie|poste))|du\\s(centre|marché|parc))$","^amenity/restaurant\\|((da|la|las|el)\\s|delphi|deutsches\\shaus|dionysos|dorfkrug|europa|frohsinn|((gasthaus|schwarzer)\\s)?adler)","^amenity/restaurant\\|(ali\\sbaba|adria|akropolis|aroma|asia|athen|athos|bahnhof|bamboo|bären|bella\\s(vista|napoli)|belvedere)","^amenity/restaurant\\|(canteen|cantina|capri|carpe\\sdiem|casa\\s?(blanca|mia)|casino|china\\s(buffet|garden|house|king|star|town|wok))","^amenity/restaurant\\|(gasthaus\\slöwen|golden\\sdragon|great\\swall|grüner\\sbaum|hellas|hirsch(en)?|hong\\skong|ichiban|jade\\sgarden)","^amenity/restaurant\\|(jägerhof|kirchenwirt|kreta|kreuz|krone|l'|lamm|le\\sbistrot|linde|lindenhof|little\\s(italy|india)|los\\samigos)","^amenity/restaurant\\|(lotus|löwen|maharaja|mamma\\smia|mandarin|marco\\spolo|mediterraneo|mensa|milano|mykonos|mythos|namaste|napoli)","^amenity/restaurant\\|(new\\schina|oasis|ochsen|olympia|osaka|paradise|parrilla|peking|pho|pinocchio)","^amenity/restaurant\\|(pizza\\shouse|pizz(a|e)ria|pizza\\sking|pomodoro|portofino|poseidon|ratskeller|rhodos|ristorante\\s)","^amenity/restaurant\\|(roma|rose|rössl(e|i)|saffron|saigon|sakura|san\\smarco|santorini|schützenhaus|shalimar|shanghai|sonne|sphinx)","^amenity/restaurant\\|(sportheim|sternen|syrtaki|taj\\smahal|taste\\sof\\sindia|the\\skitchen|toscana|tokyo|traube)","^amenity/restaurant\\|(waldschänke|wok|zorbas|(zum|zur)\\s)","^amenity/social_facility\\|dom pomocy społecznej$","^amenity/social_facility\\|maison de retraite$","^amenity/social_facility\\|safe haven$","^shop/(convenience|kiosk)\\|(777|bp|esso|exxon|mobil|shell)$","^shop/(convenience|supermarket)\\|семейный$","^shop/bakery\\|(bäckerei\\s)?müller","^shop/bakery\\|backshop$","^shop/bakery\\|schneider$","^shop/butcher\\|butcher$","^shop/convenience\\|milk bar$","^shop/convenience\\|юлия$","^shop/frame\\|rumah\\spenduduk$","^shop/hairdresser\\|haarwerk$","^shop/hairdresser\\|стиль|локон$","^shop/hardware\\|(всё для дома|1000 мелочей)$","^shop/money_transfer|mobil(e)?\\smoney$","^shop/optician\\|vision\\splus$","^shop/supermarket\\|famiglia cooperativa$","^shop/tailor\\|couture\\s?(dame|homme|mixte)?$","^tourism/(h|m)otel\\|budget inn$","^tourism/hotel\\|(belvedere|krone|victoria)","^tourism/hotel\\|(central|city|europa|grand|palace|park|royal)\\s?hotel$","^tourism/hotel\\|h(o|ô)tel\\s(astoria|central|europa|krone|panorama|plaza|royal|victoria|(zur\\s)?post|de france)$"];
64977         var discardNames = ["\\(historical\\)","^((drummed|independent) )?(cng|filling|fuel|gas|lpg|petrol)(\\s(station|pump))?$","^((le|the) )?salo(o)?n( de)?( coiffure| fryzjerski| beauté)?( homme| dame)?$","^((горячий|свежий) )?хлеб(ница)?$","^((разливное|живое) )?пиво$","^(beer|convenience|corner|general|liquor|variety)(\\sstore)?$","^(bureau de |)change$","^(buzón\\sde\\s)?correos$","^(cl(i|í)nica )?dental$","^(cl(i|í)nica )?veterinari(a|o)$","^(clinique )?vétérinaire$","^(coffee|pet|vulcanizing|gift)(\\sshop)?$","^(hof|dorf)laden$","^(h|m)otel$","^(sklep )?(spożywcz(y|o))(-przemysłowy)?$","^(strom|milch)tankstelle$","^(the )?barber(ia|shop|\\sshop)?$","^(é|e)pic(erie|ier)$","^(агзс|азс|мережа азс приват|магазин при азс)$","^(газовая\\s)?заправка$","^(летнее )?кафе(терий)?$","^(парикмахерская|персона|перукарня)$","^(проездные )?билет(ы)?$","^(свежее )?мяс(ной|о)$","^(спец|детская|женская)?\\s?одежда$","^agencja pocztowa$","^alimentación$","^alimentar(a|i)$","^alimentation\\sgénérale$","^alte (apotheke|post)$","^apotek(a|et)$","^apotheke( am markt)?$","^apteka$","^atelier de couture$","^atm$","^auto serwis$","^baguette$","^bakery$","^bakkal$","^bank$","^baqala$","^bar (centrale|kafe)$","^bar$","^barbea?r(i|í)a$","^bazar$","^benzina$","^berber$","^bike sharing$","^biletomat$","^bistro$","^blumen(laden)?$","^bo(u)?tique$","^bodega$","^borrachar(i|í)a$","^botica$","^botiller(i|í)a$","^boucherie(\\scharcuterie)?$","^boulangerie(\\sp(a|â)tisserie)?$","^bread$","^briefkasten$","^bureau de poste$","^bäckerei$","^büfé$","^cabinet dentaire$","^caf(e|é) de(s)? (la )?(place|sports|gare)$","^caf(e|é)(t(e|é)r(i|í)a)?( )?(central)?$","^cajero\\sautomatico\\sbancared$","^carnicer(i|í)a$","^central$","^centro naturista$","^chifa$","^chinese restaurant$","^cine(ma)?$","^cleaners$","^co-operative$","^coffee$","^coiff(eur|ure)( homme)?$","^colmado$","^comedor$","^comida china$","^commercial hotel$","^consultorio (dental|odontologico)$","^credit union$","^currency exchange$","^d(ö|o)ner(\\skebab)?$","^delikatesy$","^dental(\\s(clinic|surgery))?$","^dentist(a|e)?$","^drinks$","^droguer(i|í)a$","^dép(ô|o)t de gaz$","^dépanneur$","^eczane$","^edicola$","^eiscaf(e|é)(\\s(dolomiti|venezia))?$","^eisdiele","^el árbol$","^estanco$","^euroshop$","^exchange$","^fagyizó$","^family dentistry$","^farm(a|à|á)ci(a|à|á|e)$","^fast food$","^ferramenta$","^ferreter(i|í)a$","^figaro$","^fish (and|&) chips$","^fleuriste$","^florărie$","^food court$","^fotocopias$","^fri(t|z)erie$","^fris(eu|ö)r$","^frituur$","^frutería$","^fryzjer$","^funeraria$","^game$","^garage\\s?(moto|auto)?$","^gasoline(ra)?$","^gast(haus|hof)\\s(krone|(zur)\\s(linde|post))?$","^getränkemarkt$","^gimnasio( municipal)?$","^gomer(i|í)a$","^gym(nase|nasium)?$","^gyógyszertár$","^haar(genau|monie|scharf)$","^hair\\s?(design|lounge|salon|dresser)$","^hardware$","^home\\sutensils$","^hospedaje$","^húsbolt$","^imbiss$","^indipend\\.$","^internet cafe$","^istanbul(\\skebab)?$","^kaf(e|é)$","^kantine$","^kantor pos$","^kantor$","^kebab(ai|\\shouse)?$","^kios(co|k|ko|que)?$","^kisbolt$","^kitchen$","^księgarnia$","^kwiaciarnia$","^kwiaty$","^kулинария$","^ladestation$","^librairie$","^librer(i|í)a$","^libro$","^licorer(i|í)a$","^ljekarna$","^lombard$","^lot 1$","^lubricentro$","^lékárna$","^maceller(i|í)a$","^magazin","^mailbox$","^maison$","^market$","^mercado( municipal)?$","^mercerie$","^mini\\s?(abc|market|mart|mercado|pump)","^máquina de tickets$","^mécanique$","^nagelstudio$","^nails$","^no name$","^obuwie$","^odontologia$","^oplaadpunt$","^opti(c|k)a$","^optical center$","^optyk$","^outlet$","^pa(r|cz)komat$","^pac?k(etbox|station)$","^padaria$","^panader(i|í)a$","^pancake house$","^panificio$","^panorama$","^papeler(i|í)a$","^parafarmacia$","^parduotuvė$","^parkscheinautomat$","^parquímetro$","^peluquer(i|í)a$","^pharmac(ie|y)$","^piekarnia$","^piscine$","^pizz(eri)?a$","^po(s|š)t(a|e|o)$","^poczta$","^poissonnerie$","^post\\s?(agentur|filiale|partner|office|stelle)?$","^potraviny$","^prehrana$","^pressing$","^pulper(i|í)a$","^punkt apteczny$","^quin?cai?llerie$","^quiosco$","^rent a car$","^repuestos automotrices$","^restaurant(e)?(\\suniversit(ário|aire))?$","^rzeźnik$","^sale$","^salle (omnisport|polyvalente)$","^salão de beleza$","^sari-sari store$","^sb\\stank$","^second\\shand$","^shops?$","^sklep$","^smíšené zboží$","^snacks?$","^souvenir(s)?( shop)?$","^spätkauf$","^stacja (benzynowa|paliw)$","^stadium$","^stadtbäckerei$","^station service$","^steak house$","^stores?$","^super ?america","^super\\s?m(arket|ercado)$","^sushi(\\s(bar|shop))?$","^taba(c|k)(os|chi)?(\\strafi(k|c))?$","^tabac\\spresse$","^tabaccher(i|í)a$","^tacos$","^taller( mecánico)?$","^tankstelle$","^tattoo$","^taverna$","^tea stall$","^tesha$","^tienda(\\sde\\s(barrio|abarrotes))?$","^toko pakaian$","^trafik(a)?$","^trattoria$","^trinkhalle$","^télécentre$","^ufficio postale$","^urząd pocztowy$","^vegyesbolt$","^venezia$","^verduler(i|í)a$","^večerka$","^virágbolt$","^vulcanizare$","^warung$","^warzywniak$","^windmill$","^wulkanizacja$","^zahnarzt$","^zigarettenautomat$","^zöldséges$","^änderungsschneiderei$","^élelmiszer(bolt)?$","^φαρμακείο$","^авто(рынок|ремонт|сервис|электрик|запчасти(ни)?)?$","^автома(г|газин|стерская)?$","^автосервис\\+шиномонтаж$","^аптека","^аптечный (пункт|склад)$","^ателье$","^бассейн$","^бистро$","^булочная$","^буфет$","^ветеринарная клиника$","^ветлечебница$","^вс(е|ё) для дома$","^вулканизация$","^газ$","^главпочтамт$","^гостиница$","^детский дом$","^закусочная$","^замена масла$","^золото(й)?$","^зоо(магазин|товары)$","^игрушки$","^канцтовары$","^каравай$","^касса$","^квіти$","^киоск$","^книги$","^кофе(йня|\\sхауз)$","^крамниця$","^купец$","^ломбард$","^меб(ель|лі)$","^метан$","^минимаркет|мини-маркет$","^мороженое$","^мясная лавка$","^обувь$","^овощи(\\sи\\s|-)фрукты$","^октан$","^оптика$","^орхидея$","^памятники$","^пекарня$","^пельменная$","^печать$","^пиццерия$","^по(чт|шт|щ)а$","^подарки$","^почтовое отделение$","^пресса$","^продукт(ы|и)?$","^продуктовый( магазин)?$","^продукты 24$","^промтовары$","^пропан$","^ремонт\\sобуви$","^ресторан$","^ритуал(ьные услуги)?$","^рыб(а|олов)$","^салон красоты$","^сантехника$","^семена$","^социальный участковый$","^спорт(зал|комплекс|товары)$","^столовая$","^стоматолог","^стройматериалы$","^сувениры$","^супермаркет$","^табак(ерка)?$","^ткани$","^товары для дома$","^универ(маг|сам)$","^уют$","^фармация$","^фрукты и овощи$","^химчистка$","^хинкальная$","^хоз(товары|яюшка)$","^хүнсний дэлгүүр$","^цвет(овик|очный|ы)(\\sмагазин)?$","^церковная( лавка)?$","^чайхана$","^ша(ве|у)рма$","^шашлычная$","^шиномонтаж$","^דלק$","^اداره پست$","^باشگاه بدنسازی$","^بانک$","^بقال(ة)?$","^حلاق$","^داروخانه شبانه روزی$","^داروخانه$","^رستوران$","^سوپر\\s?مارکت$","^صيدلية$","^قصابی$","^محط(ه|ة) وقود$","^مخبز(ة)?$","^مطعم$","^مقهى$","^مكتب البريد$","^میوه فروشی$","^نان\\s?(سنگک|بربری|لواش)?$","^نانوایی\\s?(سنگک|بربری|لواش)?ی?$","^پمپ (بنزین|گاز)$","^მარკეტი( \\(market\\))?","^カフェ$","^ポスト$","^体育館$","^加油站$","^珈琲館$","^自動販売機$","^自販機$","^郵局$","^食堂$"];
64978         var filters = {
64979         keepTags: keepTags,
64980         discardKeys: discardKeys,
64981         discardNames: discardNames
64982         };
64983
64984         // ES5 for iD, for now
64985
64986
64987         // remove spaces, punctuation, diacritics
64988         var simplify = function simplify(str) {
64989             return diacritics.remove(
64990                 str.replace(/[\s\-=_!"#%&'*{},.\/:;?\(\)\[\]@\\$\^*+<>~`’\u00a1\u00a7\u00b6\u00b7\u00bf\u037e\u0387\u055a-\u055f\u0589\u05c0\u05c3\u05c6\u05f3\u05f4\u0609\u060a\u060c\u060d\u061b\u061e\u061f\u066a-\u066d\u06d4\u0700-\u070d\u07f7-\u07f9\u0830-\u083e\u085e\u0964\u0965\u0970\u0af0\u0df4\u0e4f\u0e5a\u0e5b\u0f04-\u0f12\u0f14\u0f85\u0fd0-\u0fd4\u0fd9\u0fda\u104a-\u104f\u10fb\u1360-\u1368\u166d\u166e\u16eb-\u16ed\u1735\u1736\u17d4-\u17d6\u17d8-\u17da\u1800-\u1805\u1807-\u180a\u1944\u1945\u1a1e\u1a1f\u1aa0-\u1aa6\u1aa8-\u1aad\u1b5a-\u1b60\u1bfc-\u1bff\u1c3b-\u1c3f\u1c7e\u1c7f\u1cc0-\u1cc7\u1cd3\u2016\u2017\u2020-\u2027\u2030-\u2038\u203b-\u203e\u2041-\u2043\u2047-\u2051\u2053\u2055-\u205e\u2cf9-\u2cfc\u2cfe\u2cff\u2d70\u2e00\u2e01\u2e06-\u2e08\u2e0b\u2e0e-\u2e16\u2e18\u2e19\u2e1b\u2e1e\u2e1f\u2e2a-\u2e2e\u2e30-\u2e39\u3001-\u3003\u303d\u30fb\ua4fe\ua4ff\ua60d-\ua60f\ua673\ua67e\ua6f2-\ua6f7\ua874-\ua877\ua8ce\ua8cf\ua8f8-\ua8fa\ua92e\ua92f\ua95f\ua9c1-\ua9cd\ua9de\ua9df\uaa5c-\uaa5f\uaade\uaadf\uaaf0\uaaf1\uabeb\ufe10-\ufe16\ufe19\ufe30\ufe45\ufe46\ufe49-\ufe4c\ufe50-\ufe52\ufe54-\ufe57\ufe5f-\ufe61\ufe68\ufe6a\ufe6b\uff01-\uff03\uff05-\uff07\uff0a\uff0c\uff0e\uff0f\uff1a\uff1b\uff1f\uff20\uff3c\uff61\uff64\uff65]+/g,'')
64991                     .toLowerCase()
64992             );
64993         };
64994
64995         // ES5 for iD, for now
64996
64997
64998         // toParts - split a name-suggestion-index key into parts
64999         // {
65000         //   kvnd:        "amenity/fast_food|Thaï Express~(North America)",
65001         //   kvn:         "amenity/fast_food|Thaï Express",
65002         //   kv:          "amenity/fast_food",
65003         //   k:           "amenity",
65004         //   v:           "fast_food",
65005         //   n:           "Thaï Express",
65006         //   d:           "(North America)",
65007         //   nsimple:     "thaiexpress",
65008         //   kvnnsimple:  "amenity/fast_food|thaiexpress"
65009         // }
65010         var to_parts = function toParts(kvnd) {
65011             var parts = {};
65012             parts.kvnd = kvnd;
65013
65014             var kvndparts = kvnd.split('~', 2);
65015             if (kvndparts.length > 1) parts.d = kvndparts[1];
65016
65017             parts.kvn = kvndparts[0];
65018             var kvnparts = parts.kvn.split('|', 2);
65019             if (kvnparts.length > 1) parts.n = kvnparts[1];
65020
65021             parts.kv = kvnparts[0];
65022             var kvparts = parts.kv.split('/', 2);
65023             parts.k = kvparts[0];
65024             parts.v = kvparts[1];
65025
65026             parts.nsimple = simplify(parts.n);
65027             parts.kvnsimple = parts.kv + '|' + parts.nsimple;
65028             return parts;
65029         };
65030
65031         var matchGroups = {beauty:["shop/beauty","shop/hairdresser_supply"],beverages:["shop/alcohol","shop/beverages"],confectionery:["shop/candy","shop/chocolate","shop/confectionery"],convenience:["shop/beauty","shop/chemist","shop/convenience","shop/cosmetics"],electronics:["shop/computer","shop/electronics","shop/hifi","shop/mobile","shop/mobile_phone"],fitness:["leisure/fitness_centre","leisure/fitness_center","leisure/sports_centre","leisure/sports_center"],food:["amenity/cafe","amenity/fast_food","amenity/ice_cream","amenity/restaurant","shop/tea","shop/coffee"],fuel:["amenity/fuel","shop/gas","shop/convenience;gas","shop/gas;convenience"],hardware:["shop/doityourself","shop/hardware"],houseware:["shop/houseware","shop/interior_decoration"],lodging:["tourism/hotel","tourism/motel"],money_transfer:["amenity/money_transfer","shop/money_transfer"],outdoor:["shop/outdoor","shop/sports"],parts:["shop/car_parts","shop/car_repair","shop/tires","shop/tyres"],vending:["amenity/vending_machine","shop/vending_machine"],wholesale:["shop/supermarket","shop/wholesale"]};
65032         var match_groups = {
65033         matchGroups: matchGroups
65034         };
65035
65036         var match_groups$1 = /*#__PURE__*/Object.freeze({
65037                 matchGroups: matchGroups,
65038                 'default': match_groups
65039         });
65040
65041         var require$$0 = getCjsExportFromNamespace(match_groups$1);
65042
65043         // ES5 for iD, for now
65044
65045
65046
65047         var matchGroups$1 = require$$0.matchGroups;
65048
65049
65050         var matcher$1 = function() {
65051             var _warnings = [];    // array of match conflict pairs
65052             var _ambiguous = {};
65053             var _matchIndex = {};
65054             var matcher = {};
65055
65056             // Create an index of all the keys/simplenames for fast matching
65057             matcher.buildMatchIndex = function(brands) {
65058                 Object.keys(brands).forEach(function(kvnd) {
65059                     var obj = brands[kvnd];
65060                     var parts = to_parts(kvnd);
65061
65062                     var matchTags = (obj.matchTags || [])
65063                         .map(function(s) { return s.toLowerCase(); });
65064                     var matchNames = (obj.matchNames || [])
65065                         .map(simplify);
65066                     var nomatches = (obj.nomatch || [])
65067                         .map(function(kvnd) { return to_parts(kvnd).kvnsimple; });
65068
65069                     var match_kv = [parts.kv].concat(matchTags);
65070                     var match_nsimple = [parts.nsimple].concat(matchNames);
65071
65072                     match_kv.forEach(function(kv) {
65073                         match_nsimple.forEach(function(nsimple) {
65074                             var test = kv + nsimple;
65075                             if (nomatches.some(function(s) { return s === test; })) {
65076                                 console.log('WARNING match/nomatch conflict for ' + test);
65077                                 return;
65078                             }
65079
65080                             if (parts.d) {
65081                                 // fixme: duplicates will overwrite the single entry (ok for now)
65082                                 if (!_ambiguous[kv]) _ambiguous[kv] = {};
65083                                 _ambiguous[kv][nsimple] = parts;
65084                             } else {
65085                                 // duplicates are a problem in matchIndex, warn if we detect it
65086                                 if (!_matchIndex[kv]) _matchIndex[kv] = {};
65087                                 var m = _matchIndex[kv][nsimple];
65088                                 if (m) {  // there already is a match for this
65089                                     _warnings.push([m.kvnd, kvnd + ' ("' + nsimple + '")']);
65090                                 } else {
65091                                     _matchIndex[kv][nsimple] = parts;
65092                                 }
65093                             }
65094                         });
65095                     });
65096                 });
65097             };
65098
65099
65100             // pass a `key`, `value`, `name` and return the best match
65101             matcher.matchKVN = function(key, value, name) {
65102                 return matcher.matchParts(to_parts(key + '/' + value + '|' + name));
65103             };
65104
65105             // pass a parts object and return the best match
65106             matcher.matchParts = function(parts) {
65107                 var match = null;
65108                 var inGroup = false;
65109
65110                 // fixme: we currently return a single match for ambiguous
65111                 match = _ambiguous[parts.kv] && _ambiguous[parts.kv][parts.nsimple];
65112                 if (match) return match;
65113
65114                 // try to return an exact match
65115                 match = _matchIndex[parts.kv] && _matchIndex[parts.kv][parts.nsimple];
65116                 if (match) return match;
65117
65118                 // look in match groups
65119                 for (var mg in matchGroups$1) {
65120                     var matchGroup = matchGroups$1[mg];
65121                     match = null;
65122                     inGroup = false;
65123
65124                     for (var i = 0; i < matchGroup.length; i++) {
65125                         var otherkv = matchGroup[i].toLowerCase();
65126                         if (!inGroup) {
65127                             inGroup = (otherkv === parts.kv);
65128                         }
65129                         if (!match) {
65130                             // fixme: we currently return a single match for ambiguous
65131                             match = _ambiguous[otherkv] && _ambiguous[otherkv][parts.nsimple];
65132                         }
65133                         if (!match) {
65134                             match = _matchIndex[otherkv] && _matchIndex[otherkv][parts.nsimple];
65135                         }
65136
65137                         if (inGroup && match) {
65138                             return match;
65139                         }
65140                     }
65141                 }
65142
65143                 return null;
65144             };
65145
65146
65147             matcher.getWarnings = function() {
65148                 return _warnings;
65149             };
65150
65151
65152             return matcher;
65153         };
65154
65155         /* DATA */
65156
65157         function validationGenericName() {
65158             var type = 'generic_name';
65159
65160             // known list of generic names (e.g. "bar")
65161             var discardNamesRegexes = filters.discardNames.map(function(discardName) {
65162                 return new RegExp(discardName, 'i');
65163             });
65164
65165             var keysToTestForGenericValues = ['amenity', 'building', 'leisure', 'man_made', 'shop', 'tourism'];
65166
65167             function isGenericName(entity) {
65168                 var name = entity.tags.name;
65169                 if (!name) return false;
65170                 name = name.toLowerCase();
65171
65172                 var i, key, val;
65173
65174                 // test if the name is just the key or tag value (e.g. "park")
65175                 for (i = 0; i < keysToTestForGenericValues.length; i++) {
65176                     key = keysToTestForGenericValues[i];
65177                     val = entity.tags[key];
65178                     if (val) {
65179                         val = val.toLowerCase();
65180                         if (key === name ||
65181                             val === name ||
65182                             key.replace(/\_/g, ' ') === name ||
65183                             val.replace(/\_/g, ' ') === name) {
65184                             return entity.tags.name;
65185                         }
65186                     }
65187                 }
65188
65189                 // test if the name is otherwise generic
65190                 for (i = 0; i < discardNamesRegexes.length; i++) {
65191                     if (discardNamesRegexes[i].test(name)) {
65192                         return entity.tags.name;
65193                     }
65194                 }
65195
65196                 return false;
65197             }
65198
65199
65200             var validation = function checkGenericName(entity, context) {
65201                 var generic = isGenericName(entity);
65202                 if (!generic) return [];
65203
65204                 return [new validationIssue({
65205                     type: type,
65206                     severity: 'warning',
65207                     message: function() {
65208                         var entity = context.hasEntity(this.entityIds[0]);
65209                         if (!entity) return '';
65210                         var preset = utilPreset(entity, context);
65211                         return t('issues.generic_name.message', { feature: preset.name(), name: generic });
65212                     },
65213                     reference: showReference,
65214                     entityIds: [entity.id],
65215                     hash: generic,
65216                     fixes: [
65217                         new validationIssueFix({
65218                             icon: 'iD-operation-delete',
65219                             title: t('issues.fix.remove_generic_name.title'),
65220                             onClick: function() {
65221                                 var entityId = this.issue.entityIds[0];
65222                                 var entity = context.entity(entityId);
65223                                 var tags = Object.assign({}, entity.tags);   // shallow copy
65224                                 delete tags.name;
65225                                 context.perform(
65226                                     actionChangeTags(entityId, tags),
65227                                     t('issues.fix.remove_generic_name.annotation')
65228                                 );
65229                             }
65230                         })
65231                     ]
65232                 })];
65233
65234
65235                 function showReference(selection) {
65236                     selection.selectAll('.issue-reference')
65237                         .data([0])
65238                         .enter()
65239                         .append('div')
65240                         .attr('class', 'issue-reference')
65241                         .text(t('issues.generic_name.reference'));
65242                 }
65243             };
65244
65245             validation.type = type;
65246
65247             return validation;
65248         }
65249
65250         function validationImpossibleOneway() {
65251             var type = 'impossible_oneway';
65252
65253             function typeForWay(way, context) {
65254                 if (way.geometry(context.graph()) !== 'line') return null;
65255
65256                 if (osmRoutableHighwayTagValues[way.tags.highway]) return 'highway';
65257                 if (osmFlowingWaterwayTagValues[way.tags.waterway]) return 'waterway';
65258                 return null;
65259             }
65260
65261             function isOneway(way) {
65262                 if (way.tags.oneway === 'yes') return true;
65263                 if (way.tags.oneway) return false;
65264
65265                 for (var key in way.tags) {
65266                     if (osmOneWayTags[key] && osmOneWayTags[key][way.tags[key]]) {
65267                         return true;
65268                     }
65269                 }
65270                 return false;
65271             }
65272
65273             function continueDrawing(way, vertex, context) {
65274                 // make sure the vertex is actually visible and editable
65275                 var map = context.map();
65276                 if (!map.editable() || !map.trimmedExtent().contains(vertex.loc)) {
65277                     map.zoomToEase(vertex);
65278                 }
65279
65280                 context.enter(
65281                     modeDrawLine(context, way.id, context.graph(), context.graph(), 'line', way.affix(vertex.id), true)
65282                 );
65283             }
65284
65285             function nodeOccursMoreThanOnce(way, nodeID) {
65286                 var occurences = 0;
65287                 for (var index in way.nodes) {
65288                     if (way.nodes[index] === nodeID) {
65289                         occurences += 1;
65290                         if (occurences > 1) return true;
65291                     }
65292                 }
65293                 return false;
65294             }
65295
65296             function isConnectedViaOtherTypes(context, way, node) {
65297
65298                 var wayType = typeForWay(way, context);
65299
65300                 if (wayType === 'highway') {
65301                     // entrances are considered connected
65302                     if (node.tags.entrance && node.tags.entrance !== 'no') return true;
65303                     if (node.tags.amenity === 'parking_entrance') return true;
65304                 } else if (wayType === 'waterway') {
65305                     if (node.id === way.first()) {
65306                         // multiple waterways may start at the same spring
65307                         if (node.tags.natural === 'spring') return true;
65308                     } else {
65309                         // multiple waterways may end at the same drain
65310                         if (node.tags.manhole === 'drain') return true;
65311                     }
65312                 }
65313
65314                 return context.graph().parentWays(node).some(function(parentWay) {
65315                     if (parentWay.id === way.id) return false;
65316
65317                     if (wayType === 'highway') {
65318
65319                         // allow connections to highway areas
65320                         if (parentWay.geometry(context.graph()) === 'area' &&
65321                             osmRoutableHighwayTagValues[parentWay.tags.highway]) return true;
65322
65323                         // count connections to ferry routes as connected
65324                         if (parentWay.tags.route === 'ferry') return true;
65325
65326                         return context.graph().parentRelations(parentWay).some(function(parentRelation) {
65327                             if (parentRelation.tags.type === 'route' &&
65328                                 parentRelation.tags.route === 'ferry') return true;
65329
65330                             // allow connections to highway multipolygons
65331                             return parentRelation.isMultipolygon() && osmRoutableHighwayTagValues[parentRelation.tags.highway];
65332                         });
65333                     } else if (wayType === 'waterway') {
65334                         // multiple waterways may start or end at a water body at the same node
65335                         if (parentWay.tags.natural === 'water' ||
65336                             parentWay.tags.natural === 'coastline') return true;
65337                     }
65338                     return false;
65339                 });
65340             }
65341
65342             function issuesForNode(context, way, nodeID) {
65343
65344                 var isFirst = nodeID === way.first();
65345
65346                 var wayType = typeForWay(way, context);
65347
65348                 // ignore if this way is self-connected at this node
65349                 if (nodeOccursMoreThanOnce(way, nodeID)) return [];
65350
65351                 var osm = context.connection();
65352                 if (!osm) return [];
65353
65354                 var node = context.hasEntity(nodeID);
65355
65356                 // ignore if this node or its tile are unloaded
65357                 if (!node || !osm.isDataLoaded(node.loc)) return [];
65358
65359                 if (isConnectedViaOtherTypes(context, way, node)) return [];
65360
65361                 var attachedWaysOfSameType = context.graph().parentWays(node).filter(function(parentWay) {
65362                     if (parentWay.id === way.id) return false;
65363                     return typeForWay(parentWay, context) === wayType;
65364                 });
65365
65366                 // assume it's okay for waterways to start or end disconnected for now
65367                 if (wayType === 'waterway' && attachedWaysOfSameType.length === 0) return [];
65368
65369                 var attachedOneways = attachedWaysOfSameType.filter(function(attachedWay) {
65370                     return isOneway(attachedWay);
65371                 });
65372
65373                 // ignore if the way is connected to some non-oneway features
65374                 if (attachedOneways.length < attachedWaysOfSameType.length) return [];
65375
65376                 if (attachedOneways.length) {
65377                     var connectedEndpointsOkay = attachedOneways.some(function(attachedOneway) {
65378                         if ((isFirst ? attachedOneway.first() : attachedOneway.last()) !== nodeID) return true;
65379                         if (nodeOccursMoreThanOnce(attachedOneway, nodeID)) return true;
65380                         return false;
65381                     });
65382                     if (connectedEndpointsOkay) return [];
65383                 }
65384
65385                 var fixes = [];
65386
65387                 if (attachedOneways.length) {
65388                     fixes.push(new validationIssueFix({
65389                         icon: 'iD-operation-reverse',
65390                         title: t('issues.fix.reverse_feature.title'),
65391                         entityIds: [way.id],
65392                         onClick: function() {
65393                             var id = this.issue.entityIds[0];
65394                             context.perform(actionReverse(id), t('operations.reverse.annotation'));
65395                         }
65396                     }));
65397                 }
65398                 if (node.tags.noexit !== 'yes') {
65399                     fixes.push(new validationIssueFix({
65400                         icon: 'iD-operation-continue' + (isFirst ? '-left' : ''),
65401                         title: t('issues.fix.continue_from_' + (isFirst ? 'start' : 'end') + '.title'),
65402                         onClick: function() {
65403                             var entityID = this.issue.entityIds[0];
65404                             var vertexID = this.issue.entityIds[1];
65405                             var way = context.entity(entityID);
65406                             var vertex = context.entity(vertexID);
65407                             continueDrawing(way, vertex, context);
65408                         }
65409                     }));
65410                 }
65411
65412                 var placement = isFirst ? 'start' : 'end',
65413                     messageID = wayType + '.',
65414                     referenceID = wayType + '.';
65415
65416                 if (wayType === 'waterway') {
65417                     messageID += 'connected.' + placement;
65418                     referenceID += 'connected';
65419                 } else {
65420                     messageID += placement;
65421                     referenceID += placement;
65422                 }
65423
65424                 return [new validationIssue({
65425                     type: type,
65426                     subtype: wayType,
65427                     severity: 'warning',
65428                     message: function() {
65429                         var entity = context.hasEntity(this.entityIds[0]);
65430                         return entity ? t('issues.impossible_oneway.' + messageID + '.message', {
65431                             feature: utilDisplayLabel(entity, context)
65432                         }) : '';
65433                     },
65434                     reference: getReference(referenceID),
65435                     entityIds: [way.id, node.id],
65436                     fixes: fixes
65437                 })];
65438
65439                 function getReference(referenceID) {
65440                     return function showReference(selection) {
65441                         selection.selectAll('.issue-reference')
65442                             .data([0])
65443                             .enter()
65444                             .append('div')
65445                             .attr('class', 'issue-reference')
65446                             .text(t('issues.impossible_oneway.' + referenceID + '.reference'));
65447                     };
65448                 }
65449             }
65450
65451             var validation = function checkImpossibleOneway(entity, context) {
65452
65453                 if (entity.type !== 'way' || entity.geometry(context.graph()) !== 'line') return [];
65454
65455                 if (entity.isClosed()) return [];
65456
65457                 if (!typeForWay(entity, context)) return [];
65458
65459                 if (!isOneway(entity)) return [];
65460
65461                 var firstIssues = issuesForNode(context, entity, entity.first());
65462                 var lastIssues = issuesForNode(context, entity, entity.last());
65463
65464                 return firstIssues.concat(lastIssues);
65465             };
65466
65467
65468             validation.type = type;
65469
65470             return validation;
65471         }
65472
65473         function validationIncompatibleSource() {
65474             var type = 'incompatible_source';
65475             var invalidSources = [{id:'google', regex:'google'}];
65476
65477             var validation = function checkIncompatibleSource(entity, context) {
65478                 var issues = [];
65479
65480                 if (entity.tags && entity.tags.source) {
65481                     invalidSources.forEach(function(invalidSource) {
65482                         var pattern = new RegExp(invalidSource.regex, 'i');
65483
65484                         if (entity.tags.source.match(pattern)) {
65485                             issues.push(new validationIssue({
65486                                 type: type,
65487                                 severity: 'warning',
65488                                 message: function() {
65489                                     var entity = context.hasEntity(this.entityIds[0]);
65490                                     return entity ? t('issues.incompatible_source.' + invalidSource.id + '.feature.message', {
65491                                         feature: utilDisplayLabel(entity, context)
65492                                     }) : '';
65493                                 },
65494                                 reference: getReference(invalidSource.id),
65495                                 entityIds: [entity.id],
65496                                 fixes: [
65497                                     new validationIssueFix({
65498                                         title: t('issues.fix.remove_proprietary_data.title')
65499                                     })
65500                                 ]
65501                             }));
65502                         }
65503                     });
65504                 }
65505
65506                 return issues;
65507
65508
65509                 function getReference(id) {
65510                     return function showReference(selection) {
65511                         selection.selectAll('.issue-reference')
65512                             .data([0])
65513                             .enter()
65514                             .append('div')
65515                             .attr('class', 'issue-reference')
65516                             .text(t('issues.incompatible_source.' + id + '.reference'));
65517                     };
65518                 }
65519             };
65520
65521             validation.type = type;
65522
65523             return validation;
65524         }
65525
65526         function validationMaprules() {
65527             var type = 'maprules';
65528
65529             var validation = function checkMaprules(entity, context) {
65530                 if (!services$1.maprules) return [];
65531
65532                 var graph = context.graph();
65533                 var rules = services$1.maprules.validationRules();
65534                 var issues = [];
65535
65536                 for (var i = 0; i < rules.length; i++) {
65537                     var rule = rules[i];
65538                     rule.findIssues(entity, graph, issues);
65539                 }
65540
65541                 return issues;
65542             };
65543
65544
65545             validation.type = type;
65546
65547             return validation;
65548         }
65549
65550         function validationMissingRole() {
65551             var type = 'missing_role';
65552
65553             var validation = function checkMissingRole(entity, context) {
65554                 var issues = [];
65555                 if (entity.type === 'way') {
65556                     context.graph().parentRelations(entity).forEach(function(relation) {
65557                         if (!relation.isMultipolygon()) return;
65558
65559                         var member = relation.memberById(entity.id);
65560                         if (member && isMissingRole(member)) {
65561                             issues.push(makeIssue(entity, relation, member, context));
65562                         }
65563                     });
65564                 } else if (entity.type === 'relation' && entity.isMultipolygon()) {
65565                     entity.indexedMembers().forEach(function(member) {
65566                         var way = context.hasEntity(member.id);
65567                         if (way && isMissingRole(member)) {
65568                             issues.push(makeIssue(way, entity, member, context));
65569                         }
65570                     });
65571                 }
65572
65573                 return issues;
65574             };
65575
65576
65577             function isMissingRole(member) {
65578                 return !member.role || !member.role.trim().length;
65579             }
65580
65581
65582             function makeIssue(way, relation, member, context) {
65583                 return new validationIssue({
65584                     type: type,
65585                     severity: 'warning',
65586                     message: function() {
65587                         var member = context.hasEntity(this.entityIds[1]),
65588                             relation = context.hasEntity(this.entityIds[0]);
65589                         return (member && relation) ? t('issues.missing_role.message', {
65590                             member: utilDisplayLabel(member, context),
65591                             relation: utilDisplayLabel(relation, context)
65592                         }) : '';
65593                     },
65594                     reference: showReference,
65595                     entityIds: [relation.id, way.id],
65596                     data: {
65597                         member: member
65598                     },
65599                     hash: member.index.toString(),
65600                     fixes: [
65601                         makeAddRoleFix('inner', context),
65602                         makeAddRoleFix('outer', context),
65603                         new validationIssueFix({
65604                             icon: 'iD-operation-delete',
65605                             title: t('issues.fix.remove_from_relation.title'),
65606                             onClick: function() {
65607                                 context.perform(
65608                                     actionDeleteMember(this.issue.entityIds[0], this.issue.data.member.index),
65609                                     t('operations.delete_member.annotation')
65610                                 );
65611                             }
65612                         })
65613                     ]
65614                 });
65615
65616
65617                 function showReference(selection) {
65618                     selection.selectAll('.issue-reference')
65619                         .data([0])
65620                         .enter()
65621                         .append('div')
65622                         .attr('class', 'issue-reference')
65623                         .text(t('issues.missing_role.multipolygon.reference'));
65624                 }
65625             }
65626
65627
65628             function makeAddRoleFix(role, context) {
65629                 return new validationIssueFix({
65630                     title: t('issues.fix.set_as_' + role + '.title'),
65631                     onClick: function() {
65632                         var oldMember = this.issue.data.member;
65633                         var member = { id: this.issue.entityIds[1], type: oldMember.type, role: role };
65634                         context.perform(
65635                             actionChangeMember(this.issue.entityIds[0], member, oldMember.index),
65636                             t('operations.change_role.annotation')
65637                         );
65638                     }
65639                 });
65640             }
65641
65642             validation.type = type;
65643
65644             return validation;
65645         }
65646
65647         function validationMissingTag() {
65648             var type = 'missing_tag';
65649
65650
65651             function hasDescriptiveTags(entity) {
65652                 var keys = Object.keys(entity.tags)
65653                     .filter(function(k) {
65654                         if (k === 'area' || k === 'name') {
65655                             return false;
65656                         } else {
65657                             return osmIsInterestingTag(k);
65658                         }
65659                     });
65660
65661                 if (entity.type === 'relation' && keys.length === 1) {
65662                     return entity.tags.type !== 'multipolygon';
65663                 }
65664                 return keys.length > 0;
65665             }
65666
65667
65668             function isUnknownRoad(entity) {
65669                 return entity.type === 'way' && entity.tags.highway === 'road';
65670             }
65671
65672             function isUntypedRelation(entity) {
65673                 return entity.type === 'relation' && !entity.tags.type;
65674             }
65675
65676
65677             var validation = function checkMissingTag(entity, context) {
65678                 var graph = context.graph();
65679
65680                 // ignore vertex features and relation members
65681                 if (entity.geometry(graph) === 'vertex' || entity.hasParentRelations(graph)) {
65682                     return [];
65683                 }
65684
65685                 var subtype;
65686
65687                 if (Object.keys(entity.tags).length === 0) {
65688                     subtype = 'any';
65689                 } else if (!hasDescriptiveTags(entity)) {
65690                     subtype = 'descriptive';
65691                 } else if (isUntypedRelation(entity)) {
65692                     subtype = 'relation_type';
65693                 } else if (isUnknownRoad(entity)) {
65694                     subtype = 'highway_classification';
65695                 }
65696
65697                 if (!subtype) return [];
65698
65699                 var selectFixType = subtype === 'highway_classification' ? 'select_road_type' : 'select_preset';
65700
65701                 var fixes = [
65702                     new validationIssueFix({
65703                         icon: 'iD-icon-search',
65704                         title: t('issues.fix.' + selectFixType + '.title'),
65705                         onClick: function() {
65706                             context.ui().sidebar.showPresetList();
65707                         }
65708                     })
65709                 ];
65710
65711                 // can always delete if the user created it in the first place..
65712                 var canDelete = (entity.version === undefined || entity.v !== undefined);
65713
65714                 // otherwise check with operationDelete whether we can delete this entity
65715                 if (!canDelete) {
65716                     canDelete = !operationDelete([entity.id], context).disabled();
65717                 }
65718
65719                 if (canDelete) {
65720                     fixes.push(
65721                         new validationIssueFix({
65722                             icon: 'iD-operation-delete',
65723                             title: t('issues.fix.delete_feature.title'),
65724                             onClick: function() {
65725                                 var id = this.issue.entityIds[0];
65726                                 var operation = operationDelete([id], context);
65727                                 if (!operation.disabled()) {
65728                                     operation();
65729                                 }
65730                             }
65731                         })
65732                     );
65733                 }
65734
65735                 var messageID = subtype === 'highway_classification' ? 'unknown_road' : 'missing_tag.' + subtype;
65736                 var referenceID = subtype === 'highway_classification' ? 'unknown_road' : 'missing_tag';
65737
65738                 var severity = (canDelete && subtype !== 'highway_classification') ? 'error' : 'warning';
65739
65740                 return [new validationIssue({
65741                     type: type,
65742                     subtype: subtype,
65743                     severity: severity,
65744                     message: function() {
65745                         var entity = context.hasEntity(this.entityIds[0]);
65746                         return entity ? t('issues.' + messageID + '.message', {
65747                             feature: utilDisplayLabel(entity, context)
65748                         }) : '';
65749                     },
65750                     reference: showReference,
65751                     entityIds: [entity.id],
65752                     fixes: fixes
65753                 })];
65754
65755
65756                 function showReference(selection) {
65757                     selection.selectAll('.issue-reference')
65758                         .data([0])
65759                         .enter()
65760                         .append('div')
65761                         .attr('class', 'issue-reference')
65762                         .text(t('issues.' + referenceID + '.reference'));
65763                 }
65764             };
65765
65766
65767             validation.type = type;
65768
65769             return validation;
65770         }
65771
65772         function validationOutdatedTags() {
65773             var type = 'outdated_tags';
65774
65775             // initialize name-suggestion-index matcher
65776             var nsiMatcher = matcher$1();
65777             nsiMatcher.buildMatchIndex(brands$1.brands);
65778             var nsiKeys = ['amenity', 'shop', 'tourism', 'leisure', 'office'];
65779
65780
65781             function oldTagIssues(entity, context) {
65782                 var graph = context.graph();
65783                 var oldTags = Object.assign({}, entity.tags);  // shallow copy
65784                 var preset = context.presets().match(entity, graph);
65785                 var explicitPresetUpgrade = preset.replacement;
65786                 var subtype = 'deprecated_tags';
65787
65788                 // upgrade preset..
65789                 if (preset.replacement) {
65790                     var newPreset = context.presets().item(preset.replacement);
65791                     graph = actionChangePreset(entity.id, preset, newPreset, true)(graph);  // true = skip field defaults
65792                     entity = graph.entity(entity.id);
65793                     preset = newPreset;
65794                 }
65795
65796                 // upgrade tags..
65797                 var deprecatedTags = entity.deprecatedTags();
65798                 if (deprecatedTags.length) {
65799                     deprecatedTags.forEach(function(tag) {
65800                         graph = actionUpgradeTags(entity.id, tag.old, tag.replace)(graph);
65801                     });
65802                     entity = graph.entity(entity.id);
65803                 }
65804
65805                 // add missing addTags..
65806                 var newTags = Object.assign({}, entity.tags);  // shallow copy
65807                 if (preset.tags !== preset.addTags) {
65808                     Object.keys(preset.addTags).forEach(function(k) {
65809                         if (!newTags[k]) {
65810                             newTags[k] = preset.addTags[k];
65811                             if (!explicitPresetUpgrade) {
65812                                 subtype = 'incomplete_tags';
65813                             }
65814                         }
65815                     });
65816                 }
65817
65818                 // search name-suggestion-index
65819                 if (newTags.name) {
65820                     for (var i = 0; i < nsiKeys.length; i++) {
65821                         var k = nsiKeys[i];
65822                         if (!newTags[k]) continue;
65823
65824                         var match = nsiMatcher.matchKVN(k, newTags[k], newTags.name);
65825                         if (!match) continue;
65826
65827                         // for now skip ambiguous matches (like Target~(USA) vs Target~(Australia))
65828                         if (match.d) continue;
65829
65830                         var brand = brands$1.brands[match.kvnd];
65831                         if (brand && brand.tags['brand:wikidata']) {
65832                             Object.assign(newTags, brand.tags);
65833                             break;
65834                         }
65835                     }
65836                 }
65837
65838
65839                 // determine diff
65840                 var tagDiff = utilTagDiff(oldTags, newTags);
65841                 if (!tagDiff.length) return [];
65842
65843                 return [new validationIssue({
65844                     type: type,
65845                     subtype: subtype,
65846                     severity: 'warning',
65847                     message: function() {
65848                         var entity = context.hasEntity(this.entityIds[0]);
65849                         return entity ? t('issues.outdated_tags.message', { feature: utilDisplayLabel(entity, context) }) : '';
65850                     },
65851                     reference: showReference,
65852                     entityIds: [entity.id],
65853                     hash: JSON.stringify(tagDiff),
65854                     fixes: [
65855                         new validationIssueFix({
65856                             autoArgs: [doUpgrade, t('issues.fix.upgrade_tags.annotation')],
65857                             title: t('issues.fix.upgrade_tags.title'),
65858                             onClick: function() {
65859                                 context.perform(doUpgrade, t('issues.fix.upgrade_tags.annotation'));
65860                             }
65861                         })
65862                     ]
65863                 })];
65864
65865
65866                 function doUpgrade(graph) {
65867                     return actionChangeTags(entity.id, newTags)(graph);
65868                 }
65869
65870
65871                 function showReference(selection) {
65872                     var enter = selection.selectAll('.issue-reference')
65873                         .data([0])
65874                         .enter();
65875
65876                     enter
65877                         .append('div')
65878                         .attr('class', 'issue-reference')
65879                         .text(t('issues.outdated_tags.reference'));
65880
65881                     enter
65882                         .append('strong')
65883                         .text(t('issues.suggested'));
65884
65885                     enter
65886                         .append('table')
65887                         .attr('class', 'tagDiff-table')
65888                         .selectAll('.tagDiff-row')
65889                         .data(tagDiff)
65890                         .enter()
65891                         .append('tr')
65892                         .attr('class', 'tagDiff-row')
65893                         .append('td')
65894                         .attr('class', function(d) {
65895                             var klass = d.type === '+' ? 'add' : 'remove';
65896                             return 'tagDiff-cell tagDiff-cell-' + klass;
65897                         })
65898                         .text(function(d) { return d.display; });
65899                 }
65900             }
65901
65902             function oldMultipolygonIssues(entity, context) {
65903
65904                 var graph = context.graph();
65905
65906                 var multipolygon, outerWay;
65907                 if (entity.type === 'relation') {
65908                     outerWay = osmOldMultipolygonOuterMemberOfRelation(entity, graph);
65909                     multipolygon = entity;
65910                 } else if (entity.type === 'way') {
65911                     multipolygon = osmIsOldMultipolygonOuterMember(entity, graph);
65912                     outerWay = entity;
65913                 } else {
65914                     return [];
65915                 }
65916
65917                 if (!multipolygon || !outerWay) return [];
65918
65919                 return [new validationIssue({
65920                     type: type,
65921                     subtype: 'old_multipolygon',
65922                     severity: 'warning',
65923                     message: function() {
65924                         var entity = context.hasEntity(this.issue.entityIds[1]);
65925                         return entity ? t('issues.old_multipolygon.message', { multipolygon: utilDisplayLabel(entity, context) }) : '';
65926                     },
65927                     reference: showReference,
65928                     entityIds: [outerWay.id, multipolygon.id],
65929                     fixes: [
65930                         new validationIssueFix({
65931                             autoArgs: [doUpgrade, t('issues.fix.move_tags.annotation')],
65932                             title: t('issues.fix.move_tags.title'),
65933                             onClick: function() {
65934                                 context.perform(doUpgrade, t('issues.fix.move_tags.annotation'));
65935                             }
65936                         })
65937                     ]
65938                 })];
65939
65940
65941                 function doUpgrade(graph) {
65942                     multipolygon = multipolygon.mergeTags(outerWay.tags);
65943                     graph = graph.replace(multipolygon);
65944                     return actionChangeTags(outerWay.id, {})(graph);
65945                 }
65946
65947
65948                 function showReference(selection) {
65949                     selection.selectAll('.issue-reference')
65950                         .data([0])
65951                         .enter()
65952                         .append('div')
65953                         .attr('class', 'issue-reference')
65954                         .text(t('issues.old_multipolygon.reference'));
65955                 }
65956             }
65957
65958
65959             var validation = function checkOutdatedTags(entity, context) {
65960                 var issues = oldMultipolygonIssues(entity, context);
65961                 if (!issues.length) issues = oldTagIssues(entity, context);
65962                 return issues;
65963             };
65964
65965
65966             validation.type = type;
65967
65968             return validation;
65969         }
65970
65971         function validationPrivateData() {
65972             var type = 'private_data';
65973
65974             // assume that some buildings are private
65975             var privateBuildingValues = {
65976                 detached: true,
65977                 farm: true,
65978                 house: true,
65979                 residential: true,
65980                 semidetached_house: true,
65981                 static_caravan: true
65982             };
65983
65984             // but they might be public if they have one of these other tags
65985             var publicKeys = {
65986                 amenity: true,
65987                 craft: true,
65988                 historic: true,
65989                 leisure: true,
65990                 shop: true,
65991                 tourism: true
65992             };
65993
65994             // these tags may contain personally identifying info
65995             var personalTags = {
65996                 'contact:email': true,
65997                 'contact:fax': true,
65998                 'contact:phone': true,
65999                 email: true,
66000                 fax: true,
66001                 phone: true
66002             };
66003
66004
66005             var validation = function checkPrivateData(entity, context) {
66006                 var tags = entity.tags;
66007                 if (!tags.building || !privateBuildingValues[tags.building]) return [];
66008
66009                 var keepTags = {};
66010                 for (var k in tags) {
66011                     if (publicKeys[k]) return [];  // probably a public feature
66012                     if (!personalTags[k]) {
66013                         keepTags[k] = tags[k];
66014                     }
66015                 }
66016
66017                 var tagDiff = utilTagDiff(tags, keepTags);
66018                 if (!tagDiff.length) return [];
66019
66020                 var fixID = tagDiff.length === 1 ? 'remove_tag' : 'remove_tags';
66021
66022                 return [new validationIssue({
66023                     type: type,
66024                     severity: 'warning',
66025                     message: function() {
66026                         var entity = context.hasEntity(this.entityIds[0]);
66027                         return entity ? t('issues.private_data.contact.message', { feature: utilDisplayLabel(entity, context) }) : '';
66028                     },
66029                     reference: showReference,
66030                     entityIds: [entity.id],
66031                     data: {
66032                         newTags: keepTags
66033                     },
66034                     fixes: [
66035                         new validationIssueFix({
66036                             icon: 'iD-operation-delete',
66037                             title: t('issues.fix.' + fixID + '.title'),
66038                             onClick: function() {
66039                                 var entityID = this.issue.entityIds[0];
66040                                 var newTags = this.issue.data.newTags;
66041                                 context.perform(
66042                                     actionChangeTags(entityID, newTags),
66043                                     t('issues.fix.upgrade_tags.annotation')
66044                                 );
66045                             }
66046                         })
66047                     ]
66048                 })];
66049
66050
66051                 function showReference(selection) {
66052                     var enter = selection.selectAll('.issue-reference')
66053                         .data([0])
66054                         .enter();
66055
66056                     enter
66057                         .append('div')
66058                         .attr('class', 'issue-reference')
66059                         .text(t('issues.private_data.reference'));
66060
66061                     enter
66062                         .append('strong')
66063                         .text(t('issues.suggested'));
66064
66065                     enter
66066                         .append('table')
66067                         .attr('class', 'tagDiff-table')
66068                         .selectAll('.tagDiff-row')
66069                         .data(tagDiff)
66070                         .enter()
66071                         .append('tr')
66072                         .attr('class', 'tagDiff-row')
66073                         .append('td')
66074                         .attr('class', function(d) {
66075                             var klass = d.type === '+' ? 'add' : 'remove';
66076                             return 'tagDiff-cell tagDiff-cell-' + klass;
66077                         })
66078                         .text(function(d) { return d.display; });
66079                 }
66080             };
66081
66082
66083             validation.type = type;
66084
66085             return validation;
66086         }
66087
66088         function validationTagSuggestsArea() {
66089             var type = 'tag_suggests_area';
66090
66091
66092             var validation = function checkTagSuggestsArea(entity, context) {
66093                 if (entity.type !== 'way' || entity.isClosed()) return [];
66094
66095                 var tagSuggestingArea = entity.tagSuggestingArea();
66096                 if (!tagSuggestingArea) {
66097                     return [];
66098                 }
66099
66100                 if (context.presets().matchTags(tagSuggestingArea, 'line') ===
66101                     context.presets().matchTags(tagSuggestingArea, 'area')) {
66102                     // these tags also allow lines and making this an area wouldn't matter
66103                     return [];
66104                 }
66105
66106                 var tagText = utilTagText({ tags: tagSuggestingArea });
66107                 var fixes = [];
66108
66109                 var connectEndpointsOnClick;
66110
66111                 // must have at least three nodes to close this automatically
66112                 if (entity.nodes.length >= 3) {
66113                     var nodes = context.graph().childNodes(entity), testNodes;
66114                     var firstToLastDistanceMeters = geoSphericalDistance(nodes[0].loc, nodes[nodes.length-1].loc);
66115
66116                     // if the distance is very small, attempt to merge the endpoints
66117                     if (firstToLastDistanceMeters < 0.75) {
66118                         testNodes = nodes.slice();   // shallow copy
66119                         testNodes.pop();
66120                         testNodes.push(testNodes[0]);
66121                         // make sure this will not create a self-intersection
66122                         if (!geoHasSelfIntersections(testNodes, testNodes[0].id)) {
66123                             connectEndpointsOnClick = function() {
66124                                 var way = context.entity(this.issue.entityIds[0]);
66125                                 context.perform(
66126                                     actionMergeNodes([way.nodes[0], way.nodes[way.nodes.length-1]], nodes[0].loc),
66127                                     t('issues.fix.connect_endpoints.annotation')
66128                                 );
66129                             };
66130                         }
66131                     }
66132
66133                     if (!connectEndpointsOnClick) {
66134                         // if the points were not merged, attempt to close the way
66135                         testNodes = nodes.slice();   // shallow copy
66136                         testNodes.push(testNodes[0]);
66137                         // make sure this will not create a self-intersection
66138                         if (!geoHasSelfIntersections(testNodes, testNodes[0].id)) {
66139                             connectEndpointsOnClick = function() {
66140                                 var wayId = this.issue.entityIds[0];
66141                                 var way = context.entity(wayId);
66142                                 var nodeId = way.nodes[0];
66143                                 var index = way.nodes.length;
66144                                 context.perform(
66145                                     actionAddVertex(wayId, nodeId, index),
66146                                     t('issues.fix.connect_endpoints.annotation')
66147                                 );
66148                             };
66149                         }
66150                     }
66151                 }
66152
66153                 fixes.push(new validationIssueFix({
66154                     title: t('issues.fix.connect_endpoints.title'),
66155                     onClick: connectEndpointsOnClick
66156                 }));
66157
66158                 fixes.push(new validationIssueFix({
66159                     icon: 'iD-operation-delete',
66160                     title: t('issues.fix.remove_tag.title'),
66161                     onClick: function() {
66162                         var entityId = this.issue.entityIds[0];
66163                         var entity = context.entity(entityId);
66164                         var tags = Object.assign({}, entity.tags);  // shallow copy
66165                         for (var key in tagSuggestingArea) {
66166                             delete tags[key];
66167                         }
66168                         context.perform(
66169                             actionChangeTags(entityId, tags),
66170                             t('issues.fix.remove_tag.annotation')
66171                         );
66172                     }
66173                 }));
66174
66175                 return [new validationIssue({
66176                     type: type,
66177                     severity: 'warning',
66178                     message: function() {
66179                         var entity = context.hasEntity(this.entityIds[0]);
66180                         return entity ? t('issues.tag_suggests_area.message', {
66181                             feature: utilDisplayLabel(entity, context),
66182                             tag: tagText
66183                         }) : '';
66184                     },
66185                     reference: showReference,
66186                     entityIds: [entity.id],
66187                     hash: JSON.stringify(tagSuggestingArea),
66188                     fixes: fixes
66189                 })];
66190
66191
66192                 function showReference(selection) {
66193                     selection.selectAll('.issue-reference')
66194                         .data([0])
66195                         .enter()
66196                         .append('div')
66197                         .attr('class', 'issue-reference')
66198                         .text(t('issues.tag_suggests_area.reference'));
66199                 }
66200             };
66201
66202             validation.type = type;
66203
66204             return validation;
66205         }
66206
66207         function validationUnsquareWay() {
66208             var type = 'unsquare_way';
66209             var DEFAULT_DEG_THRESHOLD = 5;   // see also issues.js
66210
66211             // use looser epsilon for detection to reduce warnings of buildings that are essentially square already
66212             var epsilon = 0.05;
66213             var nodeThreshold = 10;
66214
66215             function isBuilding(entity, graph) {
66216                 if (entity.type !== 'way' || entity.geometry(graph) !== 'area') return false;
66217                 return entity.tags.building && entity.tags.building !== 'no';
66218             }
66219
66220
66221             var validation = function checkUnsquareWay(entity, context) {
66222                 var graph = context.graph();
66223                 if (!isBuilding(entity, graph)) return [];
66224
66225                 // don't flag ways marked as physically unsquare
66226                 if (entity.tags.nonsquare === 'yes') return [];
66227
66228                 var isClosed = entity.isClosed();
66229                 if (!isClosed) return [];        // this building has bigger problems
66230
66231                 // don't flag ways with lots of nodes since they are likely detail-mapped
66232                 var nodes = context.childNodes(entity).slice();    // shallow copy
66233                 if (nodes.length > nodeThreshold + 1) return [];   // +1 because closing node appears twice
66234
66235                 // ignore if not all nodes are fully downloaded
66236                 var osm = context.connection();
66237                 if (!osm || nodes.some(function(node) { return !osm.isDataLoaded(node.loc); })) return [];
66238
66239                 // don't flag connected ways to avoid unresolvable unsquare loops
66240                 var hasConnectedSquarableWays = nodes.some(function(node) {
66241                     return graph.parentWays(node).some(function(way) {
66242                         if (way.id === entity.id) return false;
66243                         if (isBuilding(way, graph)) return true;
66244                         return graph.parentRelations(way).some(function(parentRelation) {
66245                             return parentRelation.isMultipolygon() &&
66246                                 parentRelation.tags.building &&
66247                                 parentRelation.tags.building !== 'no';
66248                         });
66249                     });
66250                 });
66251                 if (hasConnectedSquarableWays) return [];
66252
66253
66254                 // user-configurable square threshold
66255                 var storedDegreeThreshold = context.storage('validate-square-degrees');
66256                 var degreeThreshold = isNaN(storedDegreeThreshold) ? DEFAULT_DEG_THRESHOLD : parseFloat(storedDegreeThreshold);
66257
66258                 var points = nodes.map(function(node) { return context.projection(node.loc); });
66259                 if (!geoOrthoCanOrthogonalize(points, isClosed, epsilon, degreeThreshold, true)) return [];
66260
66261                 var autoArgs;
66262                 // don't allow autosquaring features linked to wikidata
66263                 if (!entity.tags.wikidata) {
66264                     // use same degree threshold as for detection
66265                     var autoAction = actionOrthogonalize(entity.id, context.projection, undefined, degreeThreshold);
66266                     autoAction.transitionable = false;  // when autofixing, do it instantly
66267                     autoArgs = [autoAction, t('operations.orthogonalize.annotation.area')];
66268                 }
66269
66270                 return [new validationIssue({
66271                     type: type,
66272                     severity: 'warning',
66273                     message: function() {
66274                         var entity = context.hasEntity(this.entityIds[0]);
66275                         return entity ? t('issues.unsquare_way.message', { feature: utilDisplayLabel(entity, context) }) : '';
66276                     },
66277                     reference: showReference,
66278                     entityIds: [entity.id],
66279                     hash: JSON.stringify(autoArgs !== undefined) + degreeThreshold,
66280                     fixes: [
66281                         new validationIssueFix({
66282                             icon: 'iD-operation-orthogonalize',
66283                             title: t('issues.fix.square_feature.title'),
66284                             autoArgs: autoArgs,
66285                             onClick: function(completionHandler) {
66286                                 var entityId = this.issue.entityIds[0];
66287                                 // use same degree threshold as for detection
66288                                 context.perform(
66289                                     actionOrthogonalize(entityId, context.projection, undefined, degreeThreshold),
66290                                     t('operations.orthogonalize.annotation.area')
66291                                 );
66292                                 // run after the squaring transition (currently 150ms)
66293                                 window.setTimeout(function() { completionHandler(); }, 175);
66294                             }
66295                         }),
66296                         new validationIssueFix({
66297                             title: t('issues.fix.tag_as_unsquare.title'),
66298                             onClick: function() {
66299                                 var entityId = this.issue.entityIds[0];
66300                                 var entity = context.entity(entityId);
66301                                 var tags = Object.assign({}, entity.tags);  // shallow copy
66302                                 tags.nonsquare = 'yes';
66303                                 context.perform(
66304                                     actionChangeTags(entityId, tags),
66305                                     t('issues.fix.tag_as_unsquare.annotation')
66306                                 );
66307                             }
66308                         })
66309                     ]
66310                 })];
66311
66312                 function showReference(selection) {
66313                     selection.selectAll('.issue-reference')
66314                         .data([0])
66315                         .enter()
66316                         .append('div')
66317                         .attr('class', 'issue-reference')
66318                         .text(t('issues.unsquare_way.buildings.reference'));
66319                 }
66320             };
66321
66322             validation.type = type;
66323
66324             return validation;
66325         }
66326
66327
66328
66329         var Validations = /*#__PURE__*/Object.freeze({
66330                 validationAlmostJunction: validationAlmostJunction,
66331                 validationCloseNodes: validationCloseNodes,
66332                 validationCrossingWays: validationCrossingWays,
66333                 validationDisconnectedWay: validationDisconnectedWay,
66334                 validationFixmeTag: validationFixmeTag,
66335                 validationGenericName: validationGenericName,
66336                 validationImpossibleOneway: validationImpossibleOneway,
66337                 validationIncompatibleSource: validationIncompatibleSource,
66338                 validationMaprules: validationMaprules,
66339                 validationMissingRole: validationMissingRole,
66340                 validationMissingTag: validationMissingTag,
66341                 validationOutdatedTags: validationOutdatedTags,
66342                 validationPrivateData: validationPrivateData,
66343                 validationTagSuggestsArea: validationTagSuggestsArea,
66344                 validationUnsquareWay: validationUnsquareWay
66345         });
66346
66347         function coreValidator(context) {
66348             var dispatch$1 = dispatch('validated', 'focusedIssue');
66349             var validator = utilRebind({}, dispatch$1, 'on');
66350
66351             var _rules = {};
66352             var _disabledRules = {};
66353
66354             var _ignoredIssueIDs = {};       // issue.id -> true
66355             var _issuesByIssueID = {};       // issue.id -> issue
66356             var _issuesByEntityID = {};      // entity.id -> set(issue.id)
66357             var _validatedGraph = null;
66358             var _deferred = new Set();
66359
66360             //
66361             // initialize the validator rulesets
66362             //
66363             validator.init = function() {
66364                 Object.values(Validations).forEach(function(validation) {
66365                     if (typeof validation !== 'function') return;
66366
66367                     var fn = validation();
66368                     var key = fn.type;
66369                     _rules[key] = fn;
66370                 });
66371
66372                 var disabledRules = context.storage('validate-disabledRules');
66373                 if (disabledRules) {
66374                     disabledRules.split(',')
66375                         .forEach(function(key) { _disabledRules[key] = true; });
66376                 }
66377             };
66378
66379
66380             //
66381             // clear caches, called whenever iD resets after a save
66382             //
66383             validator.reset = function() {
66384                 Array.from(_deferred).forEach(function(handle) {
66385                     window.cancelIdleCallback(handle);
66386                     _deferred.delete(handle);
66387                 });
66388
66389                 // clear caches
66390                 _ignoredIssueIDs = {};
66391                 _issuesByIssueID = {};
66392                 _issuesByEntityID = {};
66393                 _validatedGraph = null;
66394
66395                 for (var key in _rules) {
66396                     if (typeof _rules[key].reset === 'function') {
66397                         _rules[key].reset();   // 'crossing_ways' is the only one like this
66398                     }
66399                 }
66400             };
66401
66402             validator.resetIgnoredIssues = function() {
66403                 _ignoredIssueIDs = {};
66404                 // reload UI
66405                 dispatch$1.call('validated');
66406             };
66407
66408
66409             // when the user changes the squaring thereshold, rerun this on all buildings
66410             validator.changeSquareThreshold = function() {
66411                 var checkUnsquareWay = _rules.unsquare_way;
66412                 if (typeof checkUnsquareWay !== 'function') return;
66413
66414                 // uncache existing
66415                 Object.values(_issuesByIssueID)
66416                     .filter(function(issue) { return issue.type === 'unsquare_way'; })
66417                     .forEach(function(issue) {
66418                         var entityId = issue.entityIds[0];   // always 1 entity for unsquare way
66419                         if (_issuesByEntityID[entityId]) {
66420                             _issuesByEntityID[entityId].delete(issue.id);
66421                         }
66422                         delete _issuesByIssueID[issue.id];
66423                     });
66424
66425                 var buildings = context.intersects(geoExtent([-180,-90],[180, 90]))  // everywhere
66426                     .filter(function(entity) {
66427                         return entity.type === 'way' && entity.tags.building && entity.tags.building !== 'no';
66428                     });
66429
66430                 // rerun for all buildings
66431                 buildings.forEach(function(entity) {
66432                     var detected = checkUnsquareWay(entity, context);
66433                     if (detected.length !== 1) return;
66434
66435                     var issue = detected[0];
66436                     var ignoreFix = new validationIssueFix({
66437                         title: t('issues.fix.ignore_issue.title'),
66438                         icon: 'iD-icon-close',
66439                         onClick: function() {
66440                             ignoreIssue(this.issue.id);
66441                         }
66442                     });
66443                     ignoreFix.type = 'ignore';
66444                     ignoreFix.issue = issue;
66445                     issue.fixes.push(ignoreFix);
66446
66447                     if (!_issuesByEntityID[entity.id]) {
66448                         _issuesByEntityID[entity.id] = new Set();
66449                     }
66450                     _issuesByEntityID[entity.id].add(issue.id);
66451                     _issuesByIssueID[issue.id] = issue;
66452                 });
66453
66454                 dispatch$1.call('validated');
66455             };
66456
66457
66458             // options = {
66459             //     what: 'all',     // 'all' or 'edited'
66460             //     where: 'all',   // 'all' or 'visible'
66461             //     includeIgnored: false   // true, false, or 'only'
66462             //     includeDisabledRules: false   // true, false, or 'only'
66463             // };
66464             validator.getIssues = function(options) {
66465                 var opts = Object.assign({ what: 'all', where: 'all', includeIgnored: false, includeDisabledRules: false }, options);
66466                 var issues = Object.values(_issuesByIssueID);
66467                 var changes = context.history().difference().changes();
66468                 var view = context.map().extent();
66469
66470                 return issues.filter(function(issue) {
66471                     if (opts.includeDisabledRules === 'only' && !_disabledRules[issue.type]) return false;
66472                     if (!opts.includeDisabledRules && _disabledRules[issue.type]) return false;
66473
66474                     if (opts.includeIgnored === 'only' && !_ignoredIssueIDs[issue.id]) return false;
66475                     if (!opts.includeIgnored && _ignoredIssueIDs[issue.id]) return false;
66476
66477                     // Sanity check:  This issue may be for an entity that not longer exists.
66478                     // If we detect this, uncache and return false so it is not included..
66479                     var entityIds = issue.entityIds || [];
66480                     for (var i = 0; i < entityIds.length; i++) {
66481                         var entityId = entityIds[i];
66482                         if (!context.hasEntity(entityId)) {
66483                             delete _issuesByEntityID[entityId];
66484                             delete _issuesByIssueID[issue.id];
66485                             return false;
66486                         }
66487                     }
66488
66489                     if (opts.what === 'edited') {
66490                         var isEdited = entityIds.some(function(entityId) { return changes[entityId]; });
66491                         if (entityIds.length && !isEdited) return false;
66492                     }
66493
66494                     if (opts.where === 'visible') {
66495                         var extent = issue.extent(context.graph());
66496                         if (!view.intersects(extent)) return false;
66497                     }
66498
66499                     return true;
66500                 });
66501             };
66502
66503             validator.focusIssue = function(issue) {
66504                 var extent = issue.extent(context.graph());
66505
66506                 if (extent) {
66507                     var setZoom = Math.max(context.map().zoom(), 19);
66508                     context.map().unobscuredCenterZoomEase(extent.center(), setZoom);
66509
66510                     // select the first entity
66511                     if (issue.entityIds && issue.entityIds.length) {
66512                         window.setTimeout(function() {
66513                             var ids = issue.entityIds;
66514                             context.enter(modeSelect(context, [ids[0]]));
66515                             dispatch$1.call('focusedIssue', this, issue);
66516                         }, 250);  // after ease
66517                     }
66518                 }
66519             };
66520
66521
66522             validator.getIssuesBySeverity = function(options) {
66523                 var groups = utilArrayGroupBy(validator.getIssues(options), 'severity');
66524                 groups.error = groups.error || [];
66525                 groups.warning = groups.warning || [];
66526                 return groups;
66527             };
66528
66529
66530             validator.getEntityIssues = function(entityID, options) {
66531                 var issueIDs = _issuesByEntityID[entityID];
66532                 if (!issueIDs) return [];
66533
66534                 var opts = options || {};
66535
66536                 return Array.from(issueIDs)
66537                     .map(function(id) { return _issuesByIssueID[id]; })
66538                     .filter(function(issue) {
66539                         if (opts.includeDisabledRules === 'only' && !_disabledRules[issue.type]) return false;
66540                         if (!opts.includeDisabledRules && _disabledRules[issue.type]) return false;
66541
66542                         if (opts.includeIgnored === 'only' && !_ignoredIssueIDs[issue.id]) return false;
66543                         if (!opts.includeIgnored && _ignoredIssueIDs[issue.id]) return false;
66544
66545                         return true;
66546                     });
66547             };
66548
66549
66550             validator.getRuleKeys = function() {
66551                 return Object.keys(_rules)
66552                     .filter(function(key) { return key !== 'maprules'; })
66553                     .sort(function(key1, key2) {
66554                         // alphabetize by localized title
66555                         return t('issues.' + key1 + '.title') < t('issues.' + key2 + '.title') ? -1 : 1;
66556                     });
66557             };
66558
66559
66560             validator.isRuleEnabled = function(key) {
66561                 return !_disabledRules[key];
66562             };
66563
66564
66565             validator.toggleRule = function(key) {
66566                 if (_disabledRules[key]) {
66567                     delete _disabledRules[key];
66568                 } else {
66569                     _disabledRules[key] = true;
66570                 }
66571
66572                 context.storage('validate-disabledRules', Object.keys(_disabledRules).join(','));
66573                 validator.validate();
66574             };
66575
66576
66577             validator.disableRules = function(keys) {
66578                 _disabledRules = {};
66579                 keys.forEach(function(k) {
66580                     _disabledRules[k] = true;
66581                 });
66582
66583                 context.storage('validate-disabledRules', Object.keys(_disabledRules).join(','));
66584                 validator.validate();
66585             };
66586
66587
66588             //
66589             // Remove a single entity and all its related issues from the caches
66590             //
66591             function uncacheEntityID(entityID) {
66592                 var issueIDs = _issuesByEntityID[entityID];
66593                 if (!issueIDs) return;
66594
66595                 issueIDs.forEach(function(issueID) {
66596                     var issue = _issuesByIssueID[issueID];
66597                     if (issue) {
66598                         // When multiple entities are involved (e.g. crossing_ways),
66599                         // remove this issue from the other entity caches too..
66600                         var entityIds = issue.entityIds || [];
66601                         entityIds.forEach(function(other) {
66602                             if (other !== entityID) {
66603                                 if (_issuesByEntityID[other]) {
66604                                     _issuesByEntityID[other].delete(issueID);
66605                                 }
66606                             }
66607                         });
66608                     }
66609
66610                     delete _issuesByIssueID[issueID];
66611                 });
66612
66613                 delete _issuesByEntityID[entityID];
66614             }
66615
66616
66617             function ignoreIssue(id) {
66618                 _ignoredIssueIDs[id] = true;
66619             }
66620
66621
66622             //
66623             // Run validation on a single entity
66624             //
66625             function validateEntity(entity) {
66626                 var entityIssues = [];
66627                 var ran = {};
66628
66629                 // runs validation and appends resulting issues,
66630                 // returning true if validation passed without issue
66631                 function runValidation(key) {
66632                     if (ran[key]) return true;
66633
66634                     var fn = _rules[key];
66635                     if (typeof fn !== 'function') {
66636                         console.error('no such validation rule = ' + key);  // eslint-disable-line no-console
66637                         ran[key] = true;
66638                         return true;
66639                     }
66640
66641                     var detected = fn(entity, context);
66642                     detected.forEach(function(issue) {
66643                         var hasIgnoreFix = issue.fixes && issue.fixes.length && issue.fixes[issue.fixes.length - 1].type === 'ignore';
66644                         if (issue.severity === 'warning' && !hasIgnoreFix) {
66645                             var ignoreFix = new validationIssueFix({
66646                                 title: t('issues.fix.ignore_issue.title'),
66647                                 icon: 'iD-icon-close',
66648                                 onClick: function() {
66649                                     ignoreIssue(this.issue.id);
66650                                 }
66651                             });
66652                             ignoreFix.type = 'ignore';
66653                             ignoreFix.issue = issue;
66654                             issue.fixes.push(ignoreFix);
66655                         }
66656                     });
66657                     entityIssues = entityIssues.concat(detected);
66658                     ran[key] = true;
66659                     return !detected.length;
66660                 }
66661
66662                 // run some validations manually to control the order and to skip some
66663
66664                 runValidation('missing_role');
66665
66666                 if (entity.type === 'relation') {
66667                     if (!runValidation('outdated_tags')) {
66668                         // don't flag missing tags if they are on the outer way
66669                         ran.missing_tag = true;
66670                     }
66671                 }
66672
66673                 runValidation('missing_tag');
66674
66675                 runValidation('outdated_tags');
66676
66677                 runValidation('crossing_ways');
66678                 runValidation('almost_junction');
66679
66680                 // only check impossible_oneway if no disconnected_way issues
66681                 if (runValidation('disconnected_way')) {
66682                     runValidation('impossible_oneway');
66683                 } else {
66684                     ran.impossible_oneway = true;
66685                 }
66686
66687                 runValidation('tag_suggests_area');
66688
66689                 // run all rules not yet run
66690                 Object.keys(_rules).forEach(runValidation);
66691
66692                 return entityIssues;
66693             }
66694
66695             function entityIDsToValidate(entityIDs, graph) {
66696                 var processedIDs = new Set();
66697                 return entityIDs.reduce(function(acc, entityID) {
66698                     // keep redundancy check separate from `acc` because an `entityID`
66699                     // could have been added to `acc` as a related entity through an earlier pass
66700                     if (processedIDs.has(entityID)) return acc;
66701                     processedIDs.add(entityID);
66702
66703                     var entity = graph.hasEntity(entityID);
66704                     if (!entity) return acc;
66705
66706                     acc.add(entityID);
66707
66708                     var checkParentRels = [entity];
66709
66710                     if (entity.type === 'node') {   // include parent ways
66711                         graph.parentWays(entity).forEach(function(parentWay) {
66712                             acc.add(parentWay.id);
66713                             checkParentRels.push(parentWay);
66714                         });
66715                     } else if (entity.type === 'relation') {   // include members
66716                         entity.members.forEach(function(member) {
66717                             acc.add(member.id);
66718                         });
66719                     } else if (entity.type === 'way') {   // include connected ways
66720                         entity.nodes.forEach(function(nodeID) {
66721                             graph._parentWays[nodeID].forEach(function(wayID) {
66722                                 acc.add(wayID);
66723                             });
66724                         });
66725                     }
66726
66727                     checkParentRels.forEach(function(entity) {   // include parent relations
66728                         if (entity.type !== 'relation') {        // but not super-relations
66729                             graph.parentRelations(entity).forEach(function(parentRelation) {
66730                                 acc.add(parentRelation.id);
66731                             });
66732                         }
66733                     });
66734
66735                     return acc;
66736
66737                 }, new Set());
66738             }
66739
66740             //
66741             // Run validation for several entities, supplied `entityIDs`
66742             //
66743             function validateEntities(entityIDs) {
66744
66745                 // clear caches for existing issues related to these entities
66746                 entityIDs.forEach(uncacheEntityID);
66747
66748                 // detect new issues and update caches
66749                 entityIDs.forEach(function(entityID) {
66750                     var entity = context.graph().hasEntity(entityID);
66751                     // don't validate deleted entities
66752                     if (!entity) return;
66753
66754                     var issues = validateEntity(entity);
66755                     issues.forEach(function(issue) {
66756                         var entityIds = issue.entityIds || [];
66757                         entityIds.forEach(function(entityId) {
66758                             if (!_issuesByEntityID[entityId]) {
66759                                 _issuesByEntityID[entityId] = new Set();
66760                             }
66761                             _issuesByEntityID[entityId].add(issue.id);
66762                         });
66763                         _issuesByIssueID[issue.id] = issue;
66764                     });
66765                 });
66766
66767                 dispatch$1.call('validated');
66768             }
66769
66770
66771             //
66772             // Validates anything that has changed since the last time it was run.
66773             // Also updates the "validatedGraph" to be the current graph
66774             // and dispatches a `validated` event when finished.
66775             //
66776             validator.validate = function() {
66777                 var currGraph = context.graph();
66778                 _validatedGraph = _validatedGraph || context.history().base();
66779                 if (currGraph === _validatedGraph) {
66780                     dispatch$1.call('validated');
66781                     return;
66782                 }
66783                 var oldGraph = _validatedGraph;
66784                 var difference = coreDifference(oldGraph, currGraph);
66785                 _validatedGraph = currGraph;
66786
66787                 for (var key in _rules) {
66788                     if (typeof _rules[key].reset === 'function') {
66789                         _rules[key].reset();   // 'crossing_ways' is the only one like this
66790                     }
66791                 }
66792
66793                 var createdAndModifiedEntityIDs = difference.extantIDs(true);   // created/modified (true = w/relation members)
66794                 var entityIDsToCheck = entityIDsToValidate(createdAndModifiedEntityIDs, currGraph);
66795
66796                 // "validate" deleted entities in order to update their related entities
66797                 // (e.g. deleting the only highway connected to a road should create a disconnected highway issue)
66798                 var deletedEntityIDs = difference.deleted().map(function(entity) { return entity.id; });
66799                 var entityIDsToCheckForDeleted = entityIDsToValidate(deletedEntityIDs, oldGraph);
66800
66801                 // concat the sets
66802                 entityIDsToCheckForDeleted.forEach(entityIDsToCheck.add, entityIDsToCheck);
66803
66804                 validateEntities(entityIDsToCheck);   // dispatches 'validated'
66805             };
66806
66807
66808             // WHEN TO RUN VALIDATION:
66809             // When graph changes:
66810             context.history()
66811                 .on('restore.validator', validator.validate)   // restore saved history
66812                 .on('undone.validator', validator.validate)    // undo
66813                 .on('redone.validator', validator.validate);   // redo
66814                 // but not on 'change' (e.g. while drawing)
66815
66816             // When user chages editing modes:
66817             context
66818                 .on('exit.validator', validator.validate);
66819
66820             // When merging fetched data:
66821             context.history()
66822                 .on('merge.validator', function(entities) {
66823                     if (!entities) return;
66824                     var handle = window.requestIdleCallback(function() {
66825                         var ids = entities.map(function(entity) { return entity.id; });
66826                         validateEntities(entityIDsToValidate(ids, context.graph()));
66827                     });
66828                     _deferred.add(handle);
66829                 });
66830
66831
66832             return validator;
66833         }
66834
66835         function presetCollection(collection) {
66836             var maxSearchResults = 50;
66837
66838             var presets = {
66839
66840                 collection: collection,
66841
66842
66843                 item: function(id) {
66844                     return this.collection.find(function(d) {
66845                         return d.id === id;
66846                     });
66847                 },
66848
66849                 index: function(id) {
66850                     return this.collection.findIndex(function(d) {
66851                         return d.id === id;
66852                     });
66853                 },
66854
66855                 matchGeometry: function(geometry) {
66856                     return presetCollection(this.collection.filter(function(d) {
66857                         return d.matchGeometry(geometry);
66858                     }));
66859                 },
66860
66861                 matchAnyGeometry: function(geometries) {
66862                     return presetCollection(this.collection.filter(function(d) {
66863                         return geometries.some(function(geometry) {
66864                             return d.matchGeometry(geometry);
66865                         });
66866                     }));
66867                 },
66868
66869                 fallback: function(geometry) {
66870                     var id = geometry;
66871                     if (id === 'vertex') id = 'point';
66872                     return this.item(id);
66873                 },
66874
66875                 search: function(value, geometry, countryCode) {
66876                     if (!value) return this;
66877
66878                     value = value.toLowerCase().trim();
66879
66880                     // match at name beginning or just after a space (e.g. "office" -> match "Law Office")
66881                     function leading(a) {
66882                         var index = a.indexOf(value);
66883                         return index === 0 || a[index - 1] === ' ';
66884                     }
66885
66886                     // match at name beginning only
66887                     function leadingStrict(a) {
66888                         var index = a.indexOf(value);
66889                         return index === 0;
66890                     }
66891
66892                     function sortNames(a, b) {
66893                         var aCompare = (a.suggestion ? a.originalName : a.name()).toLowerCase();
66894                         var bCompare = (b.suggestion ? b.originalName : b.name()).toLowerCase();
66895
66896                         // priority if search string matches preset name exactly - #4325
66897                         if (value === aCompare) return -1;
66898                         if (value === bCompare) return 1;
66899
66900                         // priority for higher matchScore
66901                         var i = b.originalScore - a.originalScore;
66902                         if (i !== 0) return i;
66903
66904                         // priority if search string appears earlier in preset name
66905                         i = aCompare.indexOf(value) - bCompare.indexOf(value);
66906                         if (i !== 0) return i;
66907
66908                         // priority for shorter preset names
66909                         return aCompare.length - bCompare.length;
66910                     }
66911
66912                     var pool = this.collection;
66913                     if (countryCode) {
66914                         pool = pool.filter(function(a) {
66915                             if (!a.countryCodes) return true;
66916                             return a.countryCodes.indexOf(countryCode) !== -1;
66917                         });
66918                     }
66919                     var searchable = pool.filter(function(a) {
66920                         return a.searchable !== false && a.suggestion !== true;
66921                     });
66922                     var suggestions = pool.filter(function(a) {
66923                         return a.suggestion === true;
66924                     });
66925
66926                     // matches value to preset.name
66927                     var leading_name = searchable
66928                         .filter(function(a) {
66929                             return leading(a.name().toLowerCase());
66930                         }).sort(sortNames);
66931
66932                     // matches value to preset.terms values
66933                     var leading_terms = searchable
66934                         .filter(function(a) {
66935                             return (a.terms() || []).some(leading);
66936                         });
66937
66938                     // matches value to preset.tags values
66939                     var leading_tag_values = searchable
66940                         .filter(function(a) {
66941                             return Object.values(a.tags || {})
66942                                 .filter(function(val) { return val !== '*'; })
66943                                 .some(leading);
66944                         });
66945
66946                     var leading_suggestions = suggestions
66947                         .filter(function(a) {
66948                             return leadingStrict(a.originalName.toLowerCase());
66949                         }).sort(sortNames);
66950
66951                     // finds close matches to value in preset.name
66952                     var similar_name = searchable
66953                         .map(function(a) {
66954                             return { preset: a, dist: utilEditDistance(value, a.name()) };
66955                         }).filter(function(a) {
66956                             return a.dist + Math.min(value.length - a.preset.name().length, 0) < 3;
66957                         }).sort(function(a, b) {
66958                             return a.dist - b.dist;
66959                         }).map(function(a) {
66960                             return a.preset;
66961                         });
66962
66963                     // finds close matches to value in preset.terms
66964                     var similar_terms = searchable
66965                         .filter(function(a) {
66966                             return (a.terms() || []).some(function(b) {
66967                                 return utilEditDistance(value, b) + Math.min(value.length - b.length, 0) < 3;
66968                             });
66969                         });
66970
66971                     var similar_suggestions = suggestions
66972                         .map(function(a) {
66973                             return { preset: a, dist: utilEditDistance(value, a.originalName.toLowerCase()) };
66974                         }).filter(function(a) {
66975                             return a.dist + Math.min(value.length - a.preset.originalName.length, 0) < 1;
66976                         }).sort(function(a, b) {
66977                             return a.dist - b.dist;
66978                         }).map(function(a) {
66979                             return a.preset;
66980                         });
66981
66982                     var results = leading_name.concat(
66983                         leading_suggestions,
66984                         leading_terms,
66985                         leading_tag_values,
66986                         similar_name,
66987                         similar_suggestions,
66988                         similar_terms
66989                     ).slice(0, maxSearchResults - 1);
66990
66991                     if (geometry) {
66992                         if (typeof geometry === 'string') {
66993                             results.push(presets.fallback(geometry));
66994                         } else {
66995                             geometry.forEach(function(geom) {
66996                                 results.push(presets.fallback(geom));
66997                             });
66998                         }
66999                     }
67000
67001                     return presetCollection(utilArrayUniq(results));
67002                 }
67003             };
67004
67005
67006             return presets;
67007         }
67008
67009         function presetCategory(id, category, all) {
67010             category = Object.assign({}, category);   // shallow copy
67011
67012             category.id = id;
67013
67014
67015             category.members = presetCollection(category.members.map(function(id) {
67016                 return all.item(id);
67017             }));
67018
67019
67020             category.geometry = category.members.collection.reduce(function(geometries, preset) {
67021                 for (var index in preset.geometry) {
67022                     var geometry = preset.geometry[index];
67023                     if (geometries.indexOf(geometry) === -1) {
67024                         geometries.push(geometry);
67025                     }
67026                 }
67027                 return geometries;
67028             }, []);
67029
67030
67031             category.matchGeometry = function(geometry) {
67032                 return category.geometry.indexOf(geometry) >= 0;
67033             };
67034
67035
67036             category.matchScore = function() {
67037                 return -1;
67038             };
67039
67040
67041             category.name = function() {
67042                 return t('presets.categories.' + id + '.name', {'default': id});
67043             };
67044
67045
67046             category.terms = function() {
67047                 return [];
67048             };
67049
67050
67051             return category;
67052         }
67053
67054         function presetField(id, field) {
67055             field = Object.assign({}, field);   // shallow copy
67056
67057             field.id = id;
67058
67059             // for use in classes, element ids, css selectors
67060             field.safeid = id.replace(/[^_a-zA-Z0-9\-]/g, '_');
67061
67062             field.matchGeometry = function(geometry) {
67063                 return !field.geometry || field.geometry === geometry;
67064             };
67065
67066
67067             field.t = function(scope, options) {
67068                 return t('presets.fields.' + id + '.' + scope, options);
67069             };
67070
67071
67072             field.label = function() {
67073                 return field.overrideLabel || field.t('label', {'default': id});
67074             };
67075
67076
67077             var placeholder = field.placeholder;
67078             field.placeholder = function() {
67079                 return field.t('placeholder', {'default': placeholder});
67080             };
67081
67082
67083             return field;
67084         }
67085
67086         function presetPreset(id, preset, fields, visible, rawPresets) {
67087             preset = Object.assign({}, preset);   // shallow copy
67088
67089             preset.id = id;
67090
67091             preset.parentPresetID = function() {
67092                 var endIndex = preset.id.lastIndexOf('/');
67093                 if (endIndex < 0) return null;
67094
67095                 return preset.id.substring(0, endIndex);
67096             };
67097
67098
67099             // For a preset without fields, use the fields of the parent preset.
67100             // Replace {preset} placeholders with the fields of the specified presets.
67101             function resolveFieldInheritance() {
67102
67103                 // Skip `fields` for the keys which define the preset.
67104                 // These are usually `typeCombo` fields like `shop=*`
67105                 function shouldInheritFieldWithID(fieldID) {
67106                     var f = fields[fieldID];
67107                     if (f.key) {
67108                         if (preset.tags[f.key] !== undefined &&
67109                             // inherit anyway if multiple values are allowed or just a checkbox
67110                             f.type !== 'multiCombo' && f.type !== 'semiCombo' && f.type !== 'check') {
67111                             return false;
67112                         }
67113                     }
67114                     return true;
67115                 }
67116
67117                 // returns an array of field IDs to inherit from the given presetID, if found
67118                 function inheritedFieldIDs(presetID, prop) {
67119                     if (!presetID) return null;
67120
67121                     var inheritPreset = rawPresets[presetID];
67122                     if (!inheritPreset) return null;
67123
67124                     var inheritFieldIDs = inheritPreset[prop] || [];
67125
67126                     if (prop === 'fields') {
67127                         inheritFieldIDs = inheritFieldIDs.filter(shouldInheritFieldWithID);
67128                     }
67129
67130                     return inheritFieldIDs;
67131                 }
67132
67133
67134                 ['fields', 'moreFields'].forEach(function(prop) {
67135                     var fieldIDs = [];
67136                     if (preset[prop] && preset[prop].length) {    // fields were defined
67137                         preset[prop].forEach(function(fieldID) {
67138                             var match = fieldID.match(/\{(.*)\}/);
67139                             if (match !== null) {        // presetID wrapped in braces {}
67140                                 var inheritIDs = inheritedFieldIDs(match[1], prop);
67141                                 if (inheritIDs !== null) {
67142                                     fieldIDs = fieldIDs.concat(inheritIDs);
67143                                 } else {
67144                                     /* eslint-disable no-console */
67145                                     console.log('Cannot resolve presetID ' + match[0] +
67146                                         ' found in ' + preset.id + ' ' + prop);
67147                                     /* eslint-enable no-console */
67148                                 }
67149                             } else {
67150                                 fieldIDs.push(fieldID);  // no braces - just a normal field
67151                             }
67152                         });
67153
67154                     } else {  // no fields defined, so use the parent's if possible
67155                         fieldIDs = inheritedFieldIDs(preset.parentPresetID(), prop);
67156                     }
67157                     // resolve duplicate fields
67158                     fieldIDs = utilArrayUniq(fieldIDs);
67159
67160                     // update this preset with the results
67161                     preset[prop] = fieldIDs;
67162
67163                     // update the raw object to allow for multiple levels of inheritance
67164                     rawPresets[preset.id][prop] = fieldIDs;
67165                 });
67166             }
67167
67168             if (rawPresets) {
67169                 resolveFieldInheritance();
67170             }
67171
67172             preset.fields = (preset.fields || []).map(getFields);
67173             preset.moreFields = (preset.moreFields || []).map(getFields);
67174             preset.geometry = (preset.geometry || []);
67175
67176             visible = visible || false;
67177
67178             function getFields(f) {
67179                 return fields[f];
67180             }
67181
67182
67183             preset.matchGeometry = function(geometry) {
67184                 return preset.geometry.indexOf(geometry) >= 0;
67185             };
67186
67187
67188             preset.originalScore = preset.matchScore || 1;
67189
67190
67191             preset.matchScore = function(entityTags) {
67192                 var tags = preset.tags;
67193                 var score = 0;
67194
67195                 for (var t in tags) {
67196                     if (entityTags[t] === tags[t]) {
67197                         score += preset.originalScore;
67198                     } else if (tags[t] === '*' && t in entityTags) {
67199                         score += preset.originalScore / 2;
67200                     } else {
67201                         return -1;
67202                     }
67203                 }
67204
67205                 return score;
67206             };
67207
67208             var _textCache = {};
67209
67210             preset.t = function(scope, options) {
67211                 var textID = 'presets.presets.' + id + '.' + scope;
67212
67213                 if (_textCache[textID]) return _textCache[textID];
67214
67215                 var text = t(textID, options);
67216                 _textCache[textID] = text;
67217                 return text;
67218             };
67219
67220
67221             preset.originalName = preset.name || '';
67222
67223
67224             preset.name = function() {
67225                 if (preset.suggestion) {
67226                     var path = id.split('/');
67227                     path.pop();  // remove brand name
67228                     // NOTE: insert an en-dash, not a hypen (to avoid conflict with fr - nl names in Brussels etc)
67229                     return preset.originalName + ' – ' + t('presets.presets.' + path.join('/') + '.name');
67230                 }
67231                 return preset.t('name', { 'default': preset.originalName });
67232             };
67233
67234
67235             preset.originalTerms = (preset.terms || []).join();
67236
67237
67238             preset.terms = function() {
67239                 return preset.t('terms', { 'default': preset.originalTerms }).toLowerCase().trim().split(/\s*,+\s*/);
67240             };
67241
67242
67243             preset.isFallback = function() {
67244                 var tagCount = Object.keys(preset.tags).length;
67245                 return tagCount === 0 || (tagCount === 1 && preset.tags.hasOwnProperty('area'));
67246             };
67247
67248             preset.visible = function(val) {
67249                 if (!arguments.length) return visible;
67250                 visible = val;
67251                 return visible;
67252             };
67253
67254
67255             var reference = preset.reference || {};
67256             preset.reference = function(geometry) {
67257                 // Lookup documentation on Wikidata...
67258                 var qid = preset.tags.wikidata || preset.tags['brand:wikidata'] || preset.tags['operator:wikidata'];
67259                 if (qid) {
67260                     return { qid: qid };
67261                 }
67262
67263                 // Lookup documentation on OSM Wikibase...
67264                 var key = reference.key || Object.keys(utilObjectOmit(preset.tags, 'name'))[0];
67265                 var value = reference.value || preset.tags[key];
67266
67267                 if (geometry === 'relation' && key === 'type') {
67268                     if (value in preset.tags) {
67269                         key = value;
67270                         value = preset.tags[key];
67271                     } else {
67272                         return { rtype: value };
67273                     }
67274                 }
67275
67276                 if (value === '*') {
67277                     return { key: key };
67278                 } else {
67279                     return { key: key, value: value };
67280                 }
67281             };
67282
67283
67284             preset.removeTags = preset.removeTags || preset.addTags || preset.tags || {};
67285             preset.unsetTags = function(tags, geometry) {
67286                 tags = utilObjectOmit(tags, Object.keys(preset.removeTags));
67287
67288                 for (var f in preset.fields) {
67289                     var field = preset.fields[f];
67290                     if (field.matchGeometry(geometry) && field.default === tags[field.key]) {
67291                         delete tags[field.key];
67292                     }
67293                 }
67294
67295                 delete tags.area;
67296                 return tags;
67297             };
67298
67299
67300             preset.addTags = preset.addTags || preset.tags || {};
67301             preset.setTags = function(tags, geometry, skipFieldDefaults) {
67302                 var addTags = preset.addTags;
67303                 var k;
67304
67305                 tags = Object.assign({}, tags);   // shallow copy
67306
67307                 for (k in addTags) {
67308                     if (addTags[k] === '*') {
67309                         tags[k] = 'yes';
67310                     } else {
67311                         tags[k] = addTags[k];
67312                     }
67313                 }
67314
67315                 // Add area=yes if necessary.
67316                 // This is necessary if the geometry is already an area (e.g. user drew an area) AND any of:
67317                 // 1. chosen preset could be either an area or a line (`barrier=city_wall`)
67318                 // 2. chosen preset doesn't have a key in osmAreaKeys (`railway=station`)
67319                 if (!addTags.hasOwnProperty('area')) {
67320                     delete tags.area;
67321                     if (geometry === 'area') {
67322                         var needsAreaTag = true;
67323                         if (preset.geometry.indexOf('line') === -1) {
67324                             for (k in addTags) {
67325                                 if (k in osmAreaKeys) {
67326                                     needsAreaTag = false;
67327                                     break;
67328                                 }
67329                             }
67330                         }
67331                         if (needsAreaTag) {
67332                             tags.area = 'yes';
67333                         }
67334                     }
67335                 }
67336                 if (geometry && !skipFieldDefaults) {
67337                     for (var f in preset.fields) {
67338                         var field = preset.fields[f];
67339                         if (field.matchGeometry(geometry) && field.key && !tags[field.key] && field.default) {
67340                             tags[field.key] = field.default;
67341                         }
67342                     }
67343                 }
67344
67345                 return tags;
67346             };
67347
67348
67349             return preset;
67350         }
67351
67352         function presetIndex(context) {
67353             // a presetCollection with methods for
67354             // loading new data and returning defaults
67355
67356             var dispatch$1 = dispatch('recentsChange', 'favoritePreset');
67357
67358             var all = presetCollection([]);
67359             var _defaults = { area: all, line: all, point: all, vertex: all, relation: all };
67360             var _fields = {};
67361             var _universal = [];
67362             var _favorites, _recents;
67363
67364             // Index of presets by (geometry, tag key).
67365             var _index = {
67366                 point: {},
67367                 vertex: {},
67368                 line: {},
67369                 area: {},
67370                 relation: {}
67371             };
67372
67373             all.match = function(entity, resolver) {
67374                 return resolver.transient(entity, 'presetMatch', function() {
67375                     var geometry = entity.geometry(resolver);
67376
67377                     // Treat entities on addr:interpolation lines as points, not vertices - #3241
67378                     if (geometry === 'vertex' && entity.isOnAddressLine(resolver)) {
67379                         geometry = 'point';
67380                     }
67381
67382                     return all.matchTags(entity.tags, geometry);
67383                 });
67384             };
67385
67386             all.matchTags = function(tags, geometry) {
67387
67388                 var address;
67389                 var geometryMatches = _index[geometry];
67390                 var best = -1;
67391                 var match;
67392
67393                 for (var k in tags) {
67394                     // If any part of an address is present,
67395                     // allow fallback to "Address" preset - #4353
67396                     if (/^addr:/.test(k) && geometryMatches['addr:*']) {
67397                         address = geometryMatches['addr:*'][0];
67398                     }
67399
67400                     var keyMatches = geometryMatches[k];
67401                     if (!keyMatches) continue;
67402
67403                     for (var i = 0; i < keyMatches.length; i++) {
67404                         var score = keyMatches[i].matchScore(tags);
67405                         if (score > best) {
67406                             best = score;
67407                             match = keyMatches[i];
67408                         }
67409                     }
67410
67411                 }
67412
67413                 if (address && (!match || match.isFallback())) {
67414                     match = address;
67415                 }
67416                 return match || all.fallback(geometry);
67417             };
67418
67419             all.allowsVertex = function(entity, resolver) {
67420                 if (entity.type !== 'node') return false;
67421                 if (Object.keys(entity.tags).length === 0) return true;
67422
67423                 return resolver.transient(entity, 'vertexMatch', function() {
67424                     // address lines allow vertices to act as standalone points
67425                     if (entity.isOnAddressLine(resolver)) return true;
67426
67427                     var geometries = osmNodeGeometriesForTags(entity.tags);
67428                     if (geometries.vertex) return true;
67429                     if (geometries.point) return false;
67430                     // allow vertices for unspecified points
67431                     return true;
67432                 });
67433             };
67434
67435
67436             // Because of the open nature of tagging, iD will never have a complete
67437             // list of tags used in OSM, so we want it to have logic like "assume
67438             // that a closed way with an amenity tag is an area, unless the amenity
67439             // is one of these specific types". This function computes a structure
67440             // that allows testing of such conditions, based on the presets designated
67441             // as as supporting (or not supporting) the area geometry.
67442             //
67443             // The returned object L is a whitelist/blacklist of tags. A closed way
67444             // with a tag (k, v) is considered to be an area if `k in L && !(v in L[k])`
67445             // (see `Way#isArea()`). In other words, the keys of L form the whitelist,
67446             // and the subkeys form the blacklist.
67447             all.areaKeys = function() {
67448                 var areaKeys = {};
67449                 var ignore = ['barrier', 'highway', 'footway', 'railway', 'type'];  // probably a line..
67450
67451                 // ignore name-suggestion-index and deprecated presets
67452                 var presets = all.collection.filter(function(p) {
67453                     return !p.suggestion && !p.replacement;
67454                 });
67455
67456                 // whitelist
67457                 presets.forEach(function(d) {
67458                     for (var key in d.tags) break;
67459                     if (!key) return;
67460                     if (ignore.indexOf(key) !== -1) return;
67461
67462                     if (d.geometry.indexOf('area') !== -1) {    // probably an area..
67463                         areaKeys[key] = areaKeys[key] || {};
67464                     }
67465                 });
67466
67467                 // blacklist
67468                 presets.forEach(function(d) {
67469                     for (var key in d.tags) break;
67470                     if (!key) return;
67471                     if (ignore.indexOf(key) !== -1) return;
67472
67473                     var value = d.tags[key];
67474                     if (key in areaKeys &&                      // probably an area...
67475                         d.geometry.indexOf('line') !== -1 &&    // but sometimes a line
67476                         value !== '*') {
67477                         areaKeys[key][value] = true;
67478                     }
67479                 });
67480
67481                 return areaKeys;
67482             };
67483
67484             all.pointTags = function() {
67485                 return all.collection.reduce(function(pointTags, d) {
67486                     // ignore name-suggestion-index, deprecated, and generic presets
67487                     if (d.suggestion || d.replacement || d.searchable === false) return pointTags;
67488
67489                     // only care about the primary tag
67490                     for (var key in d.tags) break;
67491                     if (!key) return pointTags;
67492
67493                     // if this can be a point
67494                     if (d.geometry.indexOf('point') !== -1) {
67495                         pointTags[key] = pointTags[key] || {};
67496                         pointTags[key][d.tags[key]] = true;
67497                     }
67498                     return pointTags;
67499                 }, {});
67500             };
67501
67502             all.vertexTags = function() {
67503                 return all.collection.reduce(function(vertexTags, d) {
67504                     // ignore name-suggestion-index, deprecated, and generic presets
67505                     if (d.suggestion || d.replacement || d.searchable === false) return vertexTags;
67506
67507                     // only care about the primary tag
67508                     for (var key in d.tags) break;
67509                     if (!key) return vertexTags;
67510
67511                     // if this can be a vertex
67512                     if (d.geometry.indexOf('vertex') !== -1) {
67513                         vertexTags[key] = vertexTags[key] || {};
67514                         vertexTags[key][d.tags[key]] = true;
67515                     }
67516                     return vertexTags;
67517                 }, {});
67518             };
67519
67520             all.build = function(d, visible) {
67521                 if (d.fields) {
67522                     Object.keys(d.fields).forEach(function(id) {
67523                         var f = d.fields[id];
67524                         _fields[id] = presetField(id, f);
67525                         if (f.universal) {
67526                             _universal.push(_fields[id]);
67527                         }
67528                     });
67529                 }
67530
67531                 if (d.presets) {
67532                     var rawPresets = d.presets;
67533                     Object.keys(d.presets).forEach(function(id) {
67534                         var p = d.presets[id];
67535                         var existing = all.index(id);
67536                         if (existing !== -1) {
67537                             all.collection[existing] = presetPreset(id, p, _fields, visible, rawPresets);
67538                         } else {
67539                             all.collection.push(presetPreset(id, p, _fields, visible, rawPresets));
67540                         }
67541                     });
67542                 }
67543
67544                 if (d.categories) {
67545                     Object.keys(d.categories).forEach(function(id) {
67546                         var c = d.categories[id];
67547                         var existing = all.index(id);
67548                         if (existing !== -1) {
67549                             all.collection[existing] = presetCategory(id, c, all);
67550                         } else {
67551                             all.collection.push(presetCategory(id, c, all));
67552                         }
67553                     });
67554                 }
67555
67556                 if (d.defaults) {
67557                     var getItem = (all.item).bind(all);
67558                     _defaults = {
67559                         area: presetCollection(d.defaults.area.map(getItem)),
67560                         line: presetCollection(d.defaults.line.map(getItem)),
67561                         point: presetCollection(d.defaults.point.map(getItem)),
67562                         vertex: presetCollection(d.defaults.vertex.map(getItem)),
67563                         relation: presetCollection(d.defaults.relation.map(getItem))
67564                     };
67565                 }
67566
67567                 for (var i = 0; i < all.collection.length; i++) {
67568                     var preset = all.collection[i];
67569                     var geometry = preset.geometry;
67570
67571                     for (var j = 0; j < geometry.length; j++) {
67572                         var g = _index[geometry[j]];
67573                         for (var k in preset.tags) {
67574                             (g[k] = g[k] || []).push(preset);
67575                         }
67576                     }
67577                 }
67578                 return all;
67579             };
67580
67581             all.init = function() {
67582                 all.collection = [];
67583                 _favorites = null;
67584                 _recents = null;
67585                 _fields = {};
67586                 _universal = [];
67587                 _index = { point: {}, vertex: {}, line: {}, area: {}, relation: {} };
67588
67589                 return all.build(data.presets, true);
67590             };
67591
67592
67593             all.reset = function() {
67594                 all.collection = [];
67595                 _defaults = { area: all, line: all, point: all, vertex: all, relation: all };
67596                 _fields = {};
67597                 _universal = [];
67598                 _favorites = null;
67599                 _recents = null;
67600
67601                 // Index of presets by (geometry, tag key).
67602                 _index = {
67603                     point: {},
67604                     vertex: {},
67605                     line: {},
67606                     area: {},
67607                     relation: {}
67608                 };
67609
67610                 return all;
67611             };
67612
67613             all.fromExternal = function(external, done) {
67614                 all.reset();
67615                 d3_json(external)
67616                     .then(function(externalPresets) {
67617                         all.build(data.presets, false);    // make default presets hidden to begin
67618                         all.build(externalPresets, true);  // make the external visible
67619                     })
67620                     .catch(function() {
67621                         all.init();
67622                     })
67623                     .finally(function() {
67624                         done(all);
67625                     });
67626             };
67627
67628             all.field = function(id) {
67629                 return _fields[id];
67630             };
67631
67632             all.universal = function() {
67633                 return _universal;
67634             };
67635
67636             all.defaults = function(geometry, n) {
67637                 var rec = [];
67638                 if (!context.inIntro()) {
67639                     rec = all.recent().matchGeometry(geometry).collection.slice(0, 4);
67640                 }
67641                 var def = utilArrayUniq(rec.concat(_defaults[geometry].collection)).slice(0, n - 1);
67642                 return presetCollection(utilArrayUniq(rec.concat(def).concat(all.fallback(geometry))));
67643             };
67644
67645             all.recent = function() {
67646                 return presetCollection(utilArrayUniq(all.getRecents().map(function(d) {
67647                     return d.preset;
67648                 })));
67649             };
67650
67651             function RibbonItem(preset, geometry, source) {
67652                 var item = {};
67653                 item.preset = preset;
67654                 item.geometry = geometry;
67655                 item.source = source;
67656
67657                 item.isFavorite = function() {
67658                     return item.source === 'favorite';
67659                 };
67660                 item.isRecent = function() {
67661                     return item.source === 'recent';
67662                 };
67663                 item.matches = function(preset, geometry) {
67664                     return item.preset.id === preset.id && item.geometry === geometry;
67665                 };
67666                 item.minified = function() {
67667                     return {
67668                         pID: item.preset.id,
67669                         geom: item.geometry
67670                     };
67671                 };
67672                 return item;
67673             }
67674
67675             function ribbonItemForMinified(d, source) {
67676                 if (d && d.pID && d.geom) {
67677                     var preset = all.item(d.pID);
67678                     if (!preset) return null;
67679
67680                     var geom = d.geom;
67681                     // treat point and vertex features as one geometry
67682                     if (geom === 'vertex') geom = 'point';
67683
67684                     // iD's presets could have changed since this was saved,
67685                     // so make sure it's still valid.
67686                     if (preset.matchGeometry(geom) || (geom === 'point' && preset.matchGeometry('vertex'))) {
67687                         return RibbonItem(preset, geom, source);
67688                     }
67689                 }
67690                 return null;
67691             }
67692
67693             function setFavorites(items) {
67694                 _favorites = items;
67695                 var minifiedItems = items.map(function(d) { return d.minified(); });
67696                 context.storage('preset_favorites', JSON.stringify(minifiedItems));
67697
67698                 // call update
67699                 dispatch$1.call('favoritePreset');
67700             }
67701
67702             all.getFavorites = function() {
67703                 if (!_favorites) {
67704                     // fetch from local storage
67705                     _favorites = (JSON.parse(context.storage('preset_favorites')) || [
67706                             // use the generic presets as the default favorites
67707                             { pID: 'point', geom: 'point'},
67708                             { pID: 'line', geom: 'line'},
67709                             { pID: 'area', geom: 'area'}
67710                         ]).reduce(function(output, d) {
67711                             var item = ribbonItemForMinified(d, 'favorite');
67712                             if (item) output.push(item);
67713                             return output;
67714                         }, []);
67715                 }
67716                 return _favorites;
67717             };
67718
67719             function setRecents(items) {
67720                 _recents = items;
67721                 var minifiedItems = items.map(function(d) { return d.minified(); });
67722                 context.storage('preset_recents', JSON.stringify(minifiedItems));
67723
67724                 dispatch$1.call('recentsChange');
67725             }
67726
67727             all.getRecents = function() {
67728                 if (!_recents) {
67729                     // fetch from local storage
67730                     _recents = (JSON.parse(context.storage('preset_recents')) || [])
67731                         .reduce(function(output, d) {
67732                             var item = ribbonItemForMinified(d, 'recent');
67733                             if (item) output.push(item);
67734                             return output;
67735                         }, []);
67736                 }
67737                 return _recents;
67738             };
67739
67740             all.toggleFavorite = function(preset, geometry) {
67741                 geometry = all.fallback(geometry).id;
67742                 var favs = all.getFavorites();
67743                 var favorite = all.favoriteMatching(preset, geometry);
67744                 if (favorite) {
67745                     favs.splice(favs.indexOf(favorite), 1);
67746                 } else {
67747                     // only allow 10 favorites
67748                     if (favs.length === 10) {
67749                         // remove the last favorite (last in, first out)
67750                         favs.pop();
67751                     }
67752                     // append array
67753                     favs.push(RibbonItem(preset, geometry, 'favorite'));
67754                 }
67755                 setFavorites(favs);
67756             };
67757
67758             all.removeFavorite = function(preset, geometry) {
67759                 geometry = all.fallback(geometry).id;
67760                 var item = all.favoriteMatching(preset, geometry);
67761                 if (item) {
67762                     var items = all.getFavorites();
67763                     items.splice(items.indexOf(item), 1);
67764                     setFavorites(items);
67765                 }
67766             };
67767
67768             all.removeRecent = function(preset, geometry) {
67769                 var item = all.recentMatching(preset, geometry);
67770                 if (item) {
67771                     var items = all.getRecents();
67772                     items.splice(items.indexOf(item), 1);
67773                     setRecents(items);
67774                 }
67775             };
67776
67777             all.favoriteMatching = function(preset, geometry) {
67778                 geometry = all.fallback(geometry).id;
67779                 var favs = all.getFavorites();
67780                 for (var index in favs) {
67781                     if (favs[index].matches(preset, geometry)) {
67782                         return favs[index];
67783                     }
67784                 }
67785                 return null;
67786             };
67787             all.recentMatching = function(preset, geometry) {
67788                 geometry = all.fallback(geometry).id;
67789                 var items = all.getRecents();
67790                 for (var index in items) {
67791                     if (items[index].matches(preset, geometry)) {
67792                         return items[index];
67793                     }
67794                 }
67795                 return null;
67796             };
67797
67798             all.moveItem = function(items, fromIndex, toIndex) {
67799                 if (fromIndex === toIndex ||
67800                     fromIndex < 0 || toIndex < 0 ||
67801                     fromIndex >= items.length || toIndex >= items.length) return null;
67802                 items.splice(toIndex, 0, items.splice(fromIndex, 1)[0]);
67803                 return items;
67804             };
67805
67806             all.moveFavorite = function(fromIndex, toIndex) {
67807                 var items = all.moveItem(all.getFavorites(), fromIndex, toIndex);
67808                 if (items) setFavorites(items);
67809             };
67810
67811             all.moveRecent = function(item, beforeItem) {
67812                 var recents = all.getRecents();
67813                 var fromIndex = recents.indexOf(item);
67814                 var toIndex = recents.indexOf(beforeItem);
67815                 var items = all.moveItem(recents, fromIndex, toIndex);
67816                 if (items) setRecents(items);
67817             };
67818
67819             all.setMostRecent = function(preset, geometry) {
67820                 if (context.inIntro()) return;
67821                 if (preset.searchable === false) return;
67822
67823                 geometry = all.fallback(geometry).id;
67824
67825                 var items = all.getRecents();
67826                 var item = all.recentMatching(preset, geometry);
67827                 if (item) {
67828                     items.splice(items.indexOf(item), 1);
67829                 } else {
67830                     item = RibbonItem(preset, geometry, 'recent');
67831                 }
67832                 // allow 30 recents
67833                 if (items.length === 30) {
67834                     // remove the last favorite (first in, first out)
67835                     items.pop();
67836                 }
67837                 // prepend array
67838                 items.unshift(item);
67839                 setRecents(items);
67840             };
67841
67842             return utilRebind(all, dispatch$1, 'on');
67843         }
67844
67845         function localeDateString(s) {
67846             if (!s) return null;
67847             var detected = utilDetect();
67848             var options = { day: 'numeric', month: 'short', year: 'numeric' };
67849             var d = new Date(s);
67850             if (isNaN(d.getTime())) return null;
67851             return d.toLocaleDateString(detected.locale, options);
67852         }
67853
67854         function vintageRange(vintage) {
67855             var s;
67856             if (vintage.start || vintage.end) {
67857                 s = (vintage.start || '?');
67858                 if (vintage.start !== vintage.end) {
67859                     s += ' - ' + (vintage.end || '?');
67860                 }
67861             }
67862             return s;
67863         }
67864
67865
67866         function rendererBackgroundSource(data) {
67867             var source = Object.assign({}, data);   // shallow copy
67868             var offset = [0, 0];
67869             var name = source.name;
67870             var description = source.description;
67871             var best = !!source.best;
67872             var template = source.template;
67873
67874             source.tileSize = data.tileSize || 256;
67875             source.zoomExtent = data.zoomExtent || [0, 22];
67876             source.overzoom = data.overzoom !== false;
67877
67878             source.offset = function(_) {
67879                 if (!arguments.length) return offset;
67880                 offset = _;
67881                 return source;
67882             };
67883
67884
67885             source.nudge = function(val, zoomlevel) {
67886                 offset[0] += val[0] / Math.pow(2, zoomlevel);
67887                 offset[1] += val[1] / Math.pow(2, zoomlevel);
67888                 return source;
67889             };
67890
67891
67892             source.name = function() {
67893                 var id_safe = source.id.replace(/\./g, '<TX_DOT>');
67894                 return t('imagery.' + id_safe + '.name', { default: name });
67895             };
67896
67897
67898             source.description = function() {
67899                 var id_safe = source.id.replace(/\./g, '<TX_DOT>');
67900                 return t('imagery.' + id_safe + '.description', { default: description });
67901             };
67902
67903
67904             source.best = function() {
67905                 return best;
67906             };
67907
67908
67909             source.area = function() {
67910                 if (!data.polygon) return Number.MAX_VALUE;  // worldwide
67911                 var area = d3_geoArea({ type: 'MultiPolygon', coordinates: [ data.polygon ] });
67912                 return isNaN(area) ? 0 : area;
67913             };
67914
67915
67916             source.imageryUsed = function() {
67917                 return name || source.id;
67918             };
67919
67920
67921             source.template = function(_) {
67922                 if (!arguments.length) return template;
67923                 if (source.id === 'custom') template = _;
67924                 return source;
67925             };
67926
67927
67928             source.url = function(coord) {
67929                 if (this.type === 'wms') {
67930                     var tileToProjectedCoords = (function(x, y, z) {
67931                         //polyfill for IE11, PhantomJS
67932                         var sinh = Math.sinh || function(x) {
67933                             var y = Math.exp(x);
67934                             return (y - 1 / y) / 2;
67935                         };
67936
67937                         var zoomSize = Math.pow(2, z);
67938                         var lon = x / zoomSize * Math.PI * 2 - Math.PI;
67939                         var lat = Math.atan(sinh(Math.PI * (1 - 2 * y / zoomSize)));
67940
67941                         switch (this.projection) {
67942                             case 'EPSG:4326':
67943                                 return {
67944                                     x: lon * 180 / Math.PI,
67945                                     y: lat * 180 / Math.PI
67946                                 };
67947                             default: // EPSG:3857 and synonyms
67948                                 var mercCoords = mercatorRaw(lon, lat);
67949                                 return {
67950                                     x: 20037508.34 / Math.PI * mercCoords[0],
67951                                     y: 20037508.34 / Math.PI * mercCoords[1]
67952                                 };
67953                         }
67954                     }).bind(this);
67955
67956                     var tileSize = this.tileSize;
67957                     var projection = this.projection;
67958                     var minXmaxY = tileToProjectedCoords(coord[0], coord[1], coord[2]);
67959                     var maxXminY = tileToProjectedCoords(coord[0]+1, coord[1]+1, coord[2]);
67960                     return template.replace(/\{(\w+)\}/g, function (token, key) {
67961                       switch (key) {
67962                         case 'width':
67963                         case 'height':
67964                           return tileSize;
67965                         case 'proj':
67966                           return projection;
67967                         case 'wkid':
67968                           return projection.replace(/^EPSG:/, '');
67969                         case 'bbox':
67970                           return minXmaxY.x + ',' + maxXminY.y + ',' + maxXminY.x + ',' + minXmaxY.y;
67971                         case 'w':
67972                           return minXmaxY.x;
67973                         case 's':
67974                           return maxXminY.y;
67975                         case 'n':
67976                           return maxXminY.x;
67977                         case 'e':
67978                           return minXmaxY.y;
67979                         default:
67980                           return token;
67981                       }
67982                     });
67983                 }
67984                 return template
67985                     .replace('{x}', coord[0])
67986                     .replace('{y}', coord[1])
67987                     // TMS-flipped y coordinate
67988                     .replace(/\{[t-]y\}/, Math.pow(2, coord[2]) - coord[1] - 1)
67989                     .replace(/\{z(oom)?\}/, coord[2])
67990                     .replace(/\{switch:([^}]+)\}/, function(s, r) {
67991                         var subdomains = r.split(',');
67992                         return subdomains[(coord[0] + coord[1]) % subdomains.length];
67993                     })
67994                     .replace('{u}', function() {
67995                         var u = '';
67996                         for (var zoom = coord[2]; zoom > 0; zoom--) {
67997                             var b = 0;
67998                             var mask = 1 << (zoom - 1);
67999                             if ((coord[0] & mask) !== 0) b++;
68000                             if ((coord[1] & mask) !== 0) b += 2;
68001                             u += b.toString();
68002                         }
68003                         return u;
68004                     });
68005             };
68006
68007
68008             source.validZoom = function(z) {
68009                 return source.zoomExtent[0] <= z &&
68010                     (source.overzoom || source.zoomExtent[1] > z);
68011             };
68012
68013
68014             source.isLocatorOverlay = function() {
68015                 return source.id === 'mapbox_locator_overlay';
68016             };
68017
68018
68019             /* hides a source from the list, but leaves it available for use */
68020             source.isHidden = function() {
68021                 return source.id === 'DigitalGlobe-Premium-vintage' ||
68022                     source.id === 'DigitalGlobe-Standard-vintage';
68023             };
68024
68025
68026             source.copyrightNotices = function() {};
68027
68028
68029             source.getMetadata = function(center, tileCoord, callback) {
68030                 var vintage = {
68031                     start: localeDateString(source.startDate),
68032                     end: localeDateString(source.endDate)
68033                 };
68034                 vintage.range = vintageRange(vintage);
68035
68036                 var metadata = { vintage: vintage };
68037                 callback(null, metadata);
68038             };
68039
68040
68041             return source;
68042         }
68043
68044
68045         rendererBackgroundSource.Bing = function(data, dispatch) {
68046             // http://msdn.microsoft.com/en-us/library/ff701716.aspx
68047             // http://msdn.microsoft.com/en-us/library/ff701701.aspx
68048
68049             data.template = 'https://ecn.t{switch:0,1,2,3}.tiles.virtualearth.net/tiles/a{u}.jpeg?g=587&mkt=en-gb&n=z';
68050
68051             var bing = rendererBackgroundSource(data);
68052             var key = 'Arzdiw4nlOJzRwOz__qailc8NiR31Tt51dN2D7cm57NrnceZnCpgOkmJhNpGoppU'; // Same as P2 and JOSM
68053             var url = 'https://dev.virtualearth.net/REST/v1/Imagery/Metadata/Aerial?include=ImageryProviders&key=' + key;
68054             var cache = {};
68055             var inflight = {};
68056             var providers = [];
68057
68058             d3_json(url)
68059                 .then(function(json) {
68060                     providers = json.resourceSets[0].resources[0].imageryProviders.map(function(provider) {
68061                         return {
68062                             attribution: provider.attribution,
68063                             areas: provider.coverageAreas.map(function(area) {
68064                                 return {
68065                                     zoom: [area.zoomMin, area.zoomMax],
68066                                     extent: geoExtent([area.bbox[1], area.bbox[0]], [area.bbox[3], area.bbox[2]])
68067                                 };
68068                             })
68069                         };
68070                     });
68071                     dispatch.call('change');
68072                 })
68073                 .catch(function() {
68074                     /* ignore */
68075                 });
68076
68077
68078             bing.copyrightNotices = function(zoom, extent) {
68079                 zoom = Math.min(zoom, 21);
68080                 return providers.filter(function(provider) {
68081                     return provider.areas.some(function(area) {
68082                         return extent.intersects(area.extent) &&
68083                             area.zoom[0] <= zoom &&
68084                             area.zoom[1] >= zoom;
68085                     });
68086                 }).map(function(provider) {
68087                     return provider.attribution;
68088                 }).join(', ');
68089             };
68090
68091
68092             bing.getMetadata = function(center, tileCoord, callback) {
68093                 var tileID = tileCoord.slice(0, 3).join('/');
68094                 var zoom = Math.min(tileCoord[2], 21);
68095                 var centerPoint = center[1] + ',' + center[0];  // lat,lng
68096                 var url = 'https://dev.virtualearth.net/REST/v1/Imagery/Metadata/Aerial/' + centerPoint +
68097                         '?zl=' + zoom + '&key=' + key;
68098
68099                 if (inflight[tileID]) return;
68100
68101                 if (!cache[tileID]) {
68102                     cache[tileID] = {};
68103                 }
68104                 if (cache[tileID] && cache[tileID].metadata) {
68105                     return callback(null, cache[tileID].metadata);
68106                 }
68107
68108                 inflight[tileID] = true;
68109                 d3_json(url)
68110                     .then(function(result) {
68111                         delete inflight[tileID];
68112                         if (!result) {
68113                             throw new Error('Unknown Error');
68114                         }
68115                         var vintage = {
68116                             start: localeDateString(result.resourceSets[0].resources[0].vintageStart),
68117                             end: localeDateString(result.resourceSets[0].resources[0].vintageEnd)
68118                         };
68119                         vintage.range = vintageRange(vintage);
68120
68121                         var metadata = { vintage: vintage };
68122                         cache[tileID].metadata = metadata;
68123                         if (callback) callback(null, metadata);
68124                     })
68125                     .catch(function(err) {
68126                         delete inflight[tileID];
68127                         if (callback) callback(err.message);
68128                     });
68129             };
68130
68131
68132             bing.terms_url = 'https://blog.openstreetmap.org/2010/11/30/microsoft-imagery-details';
68133
68134
68135             return bing;
68136         };
68137
68138
68139
68140         rendererBackgroundSource.Esri = function(data) {
68141             // in addition to using the tilemap at zoom level 20, overzoom real tiles - #4327 (deprecated technique, but it works)
68142             if (data.template.match(/blankTile/) === null) {
68143                 data.template = data.template + '?blankTile=false';
68144             }
68145
68146             var esri = rendererBackgroundSource(data);
68147             var cache = {};
68148             var inflight = {};
68149             var _prevCenter;
68150
68151             // use a tilemap service to set maximum zoom for esri tiles dynamically
68152             // https://developers.arcgis.com/documentation/tiled-elevation-service/
68153             esri.fetchTilemap = function(center) {
68154                 // skip if we have already fetched a tilemap within 5km
68155                 if (_prevCenter && geoSphericalDistance(center, _prevCenter) < 5000) return;
68156                 _prevCenter = center;
68157
68158                 // tiles are available globally to zoom level 19, afterward they may or may not be present
68159                 var z = 20;
68160
68161                 // first generate a random url using the template
68162                 var dummyUrl = esri.url([1,2,3]);
68163
68164                 // calculate url z/y/x from the lat/long of the center of the map
68165                 var x = (Math.floor((center[0] + 180) / 360 * Math.pow(2, z)));
68166                 var y = (Math.floor((1 - Math.log(Math.tan(center[1] * Math.PI / 180) + 1 / Math.cos(center[1] * Math.PI / 180)) / Math.PI) / 2 * Math.pow(2, z)));
68167
68168                 // fetch an 8x8 grid to leverage cache
68169                 var tilemapUrl = dummyUrl.replace(/tile\/[0-9]+\/[0-9]+\/[0-9]+\?blankTile=false/, 'tilemap') + '/' + z + '/' + y + '/' + x + '/8/8';
68170
68171                 // make the request and introspect the response from the tilemap server
68172                 d3_json(tilemapUrl)
68173                     .then(function(tilemap) {
68174                         if (!tilemap) {
68175                             throw new Error('Unknown Error');
68176                         }
68177                         var hasTiles = true;
68178                         for (var i = 0; i < tilemap.data.length; i++) {
68179                             // 0 means an individual tile in the grid doesn't exist
68180                             if (!tilemap.data[i]) {
68181                                 hasTiles = false;
68182                                 break;
68183                             }
68184                         }
68185
68186                         // if any tiles are missing at level 20 we restrict maxZoom to 19
68187                         esri.zoomExtent[1] = (hasTiles ? 22 : 19);
68188                     })
68189                     .catch(function() {
68190                         /* ignore */
68191                     });
68192             };
68193
68194
68195             esri.getMetadata = function(center, tileCoord, callback) {
68196                 var tileID = tileCoord.slice(0, 3).join('/');
68197                 var zoom = Math.min(tileCoord[2], esri.zoomExtent[1]);
68198                 var centerPoint = center[0] + ',' + center[1];  // long, lat (as it should be)
68199                 var unknown = t('info_panels.background.unknown');
68200                 var metadataLayer;
68201                 var vintage = {};
68202                 var metadata = {};
68203
68204                 if (inflight[tileID]) return;
68205
68206                 switch (true) {
68207                     case (zoom >= 20 && esri.id === 'EsriWorldImageryClarity'):
68208                         metadataLayer = 4;
68209                         break;
68210                     case zoom >= 19:
68211                         metadataLayer = 3;
68212                         break;
68213                     case zoom >= 17:
68214                         metadataLayer = 2;
68215                         break;
68216                     case zoom >= 13:
68217                         metadataLayer = 0;
68218                         break;
68219                     default:
68220                         metadataLayer = 99;
68221                 }
68222
68223                 var url;
68224                 // build up query using the layer appropriate to the current zoom
68225                 if (esri.id === 'EsriWorldImagery') {
68226                     url = 'https://services.arcgisonline.com/arcgis/rest/services/World_Imagery/MapServer/';
68227                 } else if (esri.id === 'EsriWorldImageryClarity') {
68228                     url = 'https://serviceslab.arcgisonline.com/arcgis/rest/services/Clarity_World_Imagery/MapServer/';
68229                 }
68230
68231                 url += metadataLayer + '/query?returnGeometry=false&geometry=' + centerPoint + '&inSR=4326&geometryType=esriGeometryPoint&outFields=*&f=json';
68232
68233                 if (!cache[tileID]) {
68234                     cache[tileID] = {};
68235                 }
68236                 if (cache[tileID] && cache[tileID].metadata) {
68237                     return callback(null, cache[tileID].metadata);
68238                 }
68239
68240                 // accurate metadata is only available >= 13
68241                 if (metadataLayer === 99) {
68242                     vintage = {
68243                         start: null,
68244                         end: null,
68245                         range: null
68246                     };
68247                     metadata = {
68248                         vintage: null,
68249                         source: unknown,
68250                         description: unknown,
68251                         resolution: unknown,
68252                         accuracy: unknown
68253                     };
68254
68255                     callback(null, metadata);
68256
68257                 } else {
68258                     inflight[tileID] = true;
68259                     d3_json(url)
68260                         .then(function(result) {
68261                             delete inflight[tileID];
68262                             if (!result) {
68263                                 throw new Error('Unknown Error');
68264                             } else if (result.features && result.features.length < 1) {
68265                                 throw new Error('No Results');
68266                             } else if (result.error && result.error.message) {
68267                                 throw new Error(result.error.message);
68268                             }
68269
68270                             // pass through the discrete capture date from metadata
68271                             var captureDate = localeDateString(result.features[0].attributes.SRC_DATE2);
68272                             vintage = {
68273                                 start: captureDate,
68274                                 end: captureDate,
68275                                 range: captureDate
68276                             };
68277                             metadata = {
68278                                 vintage: vintage,
68279                                 source: clean(result.features[0].attributes.NICE_NAME),
68280                                 description: clean(result.features[0].attributes.NICE_DESC),
68281                                 resolution: clean(result.features[0].attributes.SRC_RES),
68282                                 accuracy: clean(result.features[0].attributes.SRC_ACC)
68283                             };
68284
68285                             // append units - meters
68286                             if (isFinite(metadata.resolution)) {
68287                                 metadata.resolution += ' m';
68288                             }
68289                             if (isFinite(metadata.accuracy)) {
68290                                 metadata.accuracy += ' m';
68291                             }
68292
68293                             cache[tileID].metadata = metadata;
68294                             if (callback) callback(null, metadata);
68295                         })
68296                         .catch(function(err) {
68297                             delete inflight[tileID];
68298                             if (callback) callback(err.message);
68299                         });
68300                 }
68301
68302
68303                 function clean(val) {
68304                     return String(val).trim() || unknown;
68305                 }
68306             };
68307
68308             return esri;
68309         };
68310
68311
68312         rendererBackgroundSource.None = function() {
68313             var source = rendererBackgroundSource({ id: 'none', template: '' });
68314
68315
68316             source.name = function() {
68317                 return t('background.none');
68318             };
68319
68320
68321             source.imageryUsed = function() {
68322                 return null;
68323             };
68324
68325
68326             source.area = function() {
68327                 return -1;  // sources in background pane are sorted by area
68328             };
68329
68330
68331             return source;
68332         };
68333
68334
68335         rendererBackgroundSource.Custom = function(template) {
68336             var source = rendererBackgroundSource({ id: 'custom', template: template });
68337
68338
68339             source.name = function() {
68340                 return t('background.custom');
68341             };
68342
68343
68344             source.imageryUsed = function() {
68345                 return 'Custom (' + source.template() + ')';
68346             };
68347
68348
68349             source.area = function() {
68350                 return -2;  // sources in background pane are sorted by area
68351             };
68352
68353
68354             return source;
68355         };
68356
68357         function rendererTileLayer(context) {
68358             var transformProp = utilPrefixCSSProperty('Transform');
68359             var tiler = utilTiler();
68360
68361             var _tileSize = 256;
68362             var _projection;
68363             var _cache = {};
68364             var _tileOrigin;
68365             var _zoom;
68366             var _source;
68367
68368
68369             function tileSizeAtZoom(d, z) {
68370                 var EPSILON = 0.002;    // close seams
68371                 return ((_tileSize * Math.pow(2, z - d[2])) / _tileSize) + EPSILON;
68372             }
68373
68374
68375             function atZoom(t, distance) {
68376                 var power = Math.pow(2, distance);
68377                 return [
68378                     Math.floor(t[0] * power),
68379                     Math.floor(t[1] * power),
68380                     t[2] + distance
68381                 ];
68382             }
68383
68384
68385             function lookUp(d) {
68386                 for (var up = -1; up > -d[2]; up--) {
68387                     var tile = atZoom(d, up);
68388                     if (_cache[_source.url(tile)] !== false) {
68389                         return tile;
68390                     }
68391                 }
68392             }
68393
68394
68395             function uniqueBy(a, n) {
68396                 var o = [];
68397                 var seen = {};
68398                 for (var i = 0; i < a.length; i++) {
68399                     if (seen[a[i][n]] === undefined) {
68400                         o.push(a[i]);
68401                         seen[a[i][n]] = true;
68402                     }
68403                 }
68404                 return o;
68405             }
68406
68407
68408             function addSource(d) {
68409                 d.push(_source.url(d));
68410                 return d;
68411             }
68412
68413
68414             // Update tiles based on current state of `projection`.
68415             function background(selection) {
68416                 _zoom = geoScaleToZoom(_projection.scale(), _tileSize);
68417
68418                 var pixelOffset;
68419                 if (_source) {
68420                     pixelOffset = [
68421                         _source.offset()[0] * Math.pow(2, _zoom),
68422                         _source.offset()[1] * Math.pow(2, _zoom)
68423                     ];
68424                 } else {
68425                     pixelOffset = [0, 0];
68426                 }
68427
68428                 var translate = [
68429                     _projection.translate()[0] + pixelOffset[0],
68430                     _projection.translate()[1] + pixelOffset[1]
68431                 ];
68432
68433                 tiler
68434                     .scale(_projection.scale() * 2 * Math.PI)
68435                     .translate(translate);
68436
68437                 _tileOrigin = [
68438                     _projection.scale() * Math.PI - translate[0],
68439                     _projection.scale() * Math.PI - translate[1]
68440                 ];
68441
68442                 render(selection);
68443             }
68444
68445
68446             // Derive the tiles onscreen, remove those offscreen and position them.
68447             // Important that this part not depend on `_projection` because it's
68448             // rentered when tiles load/error (see #644).
68449             function render(selection) {
68450                 if (!_source) return;
68451                 var requests = [];
68452                 var showDebug = context.getDebug('tile') && !_source.overlay;
68453
68454                 if (_source.validZoom(_zoom)) {
68455                     tiler.skipNullIsland(!!_source.overlay);
68456
68457                     tiler().forEach(function(d) {
68458                         addSource(d);
68459                         if (d[3] === '') return;
68460                         if (typeof d[3] !== 'string') return; // Workaround for #2295
68461                         requests.push(d);
68462                         if (_cache[d[3]] === false && lookUp(d)) {
68463                             requests.push(addSource(lookUp(d)));
68464                         }
68465                     });
68466
68467                     requests = uniqueBy(requests, 3).filter(function(r) {
68468                         // don't re-request tiles which have failed in the past
68469                         return _cache[r[3]] !== false;
68470                     });
68471                 }
68472
68473                 function load(d) {
68474                     _cache[d[3]] = true;
68475                     d3_select(this)
68476                         .on('error', null)
68477                         .on('load', null)
68478                         .classed('tile-loaded', true);
68479                     render(selection);
68480                 }
68481
68482                 function error(d) {
68483                     _cache[d[3]] = false;
68484                     d3_select(this)
68485                         .on('error', null)
68486                         .on('load', null)
68487                         .remove();
68488                     render(selection);
68489                 }
68490
68491                 function imageTransform(d) {
68492                     var ts = _tileSize * Math.pow(2, _zoom - d[2]);
68493                     var scale = tileSizeAtZoom(d, _zoom);
68494                     return 'translate(' +
68495                         ((d[0] * ts) - _tileOrigin[0]) + 'px,' +
68496                         ((d[1] * ts) - _tileOrigin[1]) + 'px) ' +
68497                         'scale(' + scale + ',' + scale + ')';
68498                 }
68499
68500                 function tileCenter(d) {
68501                     var ts = _tileSize * Math.pow(2, _zoom - d[2]);
68502                     return [
68503                         ((d[0] * ts) - _tileOrigin[0] + (ts / 2)),
68504                         ((d[1] * ts) - _tileOrigin[1] + (ts / 2))
68505                     ];
68506                 }
68507
68508                 function debugTransform(d) {
68509                     var coord = tileCenter(d);
68510                     return 'translate(' + coord[0] + 'px,' + coord[1] + 'px)';
68511                 }
68512
68513
68514                 // Pick a representative tile near the center of the viewport
68515                 // (This is useful for sampling the imagery vintage)
68516                 var dims = tiler.size();
68517                 var mapCenter = [dims[0] / 2, dims[1] / 2];
68518                 var minDist = Math.max(dims[0], dims[1]);
68519                 var nearCenter;
68520
68521                 requests.forEach(function(d) {
68522                     var c = tileCenter(d);
68523                     var dist = geoVecLength(c, mapCenter);
68524                     if (dist < minDist) {
68525                         minDist = dist;
68526                         nearCenter = d;
68527                     }
68528                 });
68529
68530
68531                 var image = selection.selectAll('img')
68532                     .data(requests, function(d) { return d[3]; });
68533
68534                 image.exit()
68535                     .style(transformProp, imageTransform)
68536                     .classed('tile-removing', true)
68537                     .classed('tile-center', false)
68538                     .each(function() {
68539                         var tile = d3_select(this);
68540                         window.setTimeout(function() {
68541                             if (tile.classed('tile-removing')) {
68542                                 tile.remove();
68543                             }
68544                         }, 300);
68545                     });
68546
68547                 image.enter()
68548                   .append('img')
68549                     .attr('class', 'tile')
68550                     .attr('src', function(d) { return d[3]; })
68551                     .on('error', error)
68552                     .on('load', load)
68553                   .merge(image)
68554                     .style(transformProp, imageTransform)
68555                     .classed('tile-debug', showDebug)
68556                     .classed('tile-removing', false)
68557                     .classed('tile-center', function(d) { return d === nearCenter; });
68558
68559
68560
68561                 var debug = selection.selectAll('.tile-label-debug')
68562                     .data(showDebug ? requests : [], function(d) { return d[3]; });
68563
68564                 debug.exit()
68565                     .remove();
68566
68567                 if (showDebug) {
68568                     var debugEnter = debug.enter()
68569                         .append('div')
68570                         .attr('class', 'tile-label-debug');
68571
68572                     debugEnter
68573                         .append('div')
68574                         .attr('class', 'tile-label-debug-coord');
68575
68576                     debugEnter
68577                         .append('div')
68578                         .attr('class', 'tile-label-debug-vintage');
68579
68580                     debug = debug.merge(debugEnter);
68581
68582                     debug
68583                         .style(transformProp, debugTransform);
68584
68585                     debug
68586                         .selectAll('.tile-label-debug-coord')
68587                         .text(function(d) { return d[2] + ' / ' + d[0] + ' / ' + d[1]; });
68588
68589                     debug
68590                         .selectAll('.tile-label-debug-vintage')
68591                         .each(function(d) {
68592                             var span = d3_select(this);
68593                             var center = context.projection.invert(tileCenter(d));
68594                             _source.getMetadata(center, d, function(err, result) {
68595                                 span.text((result && result.vintage && result.vintage.range) ||
68596                                     t('info_panels.background.vintage') + ': ' + t('info_panels.background.unknown')
68597                                 );
68598                             });
68599                         });
68600                 }
68601
68602             }
68603
68604
68605             background.projection = function(val) {
68606                 if (!arguments.length) return _projection;
68607                 _projection = val;
68608                 return background;
68609             };
68610
68611
68612             background.dimensions = function(val) {
68613                 if (!arguments.length) return tiler.size();
68614                 tiler.size(val);
68615                 return background;
68616             };
68617
68618
68619             background.source = function(val) {
68620                 if (!arguments.length) return _source;
68621                 _source = val;
68622                 _tileSize = _source.tileSize;
68623                 _cache = {};
68624                 tiler.tileSize(_source.tileSize).zoomExtent(_source.zoomExtent);
68625                 return background;
68626             };
68627
68628
68629             return background;
68630         }
68631
68632         function rendererBackground(context) {
68633             var dispatch$1 = dispatch('change');
68634             var detected = utilDetect();
68635             var baseLayer = rendererTileLayer(context).projection(context.projection);
68636             var _isValid = true;
68637             var _overlayLayers = [];
68638             var _backgroundSources = [];
68639             var _brightness = 1;
68640             var _contrast = 1;
68641             var _saturation = 1;
68642             var _sharpness = 1;
68643
68644
68645             function background(selection) {
68646                 // If we are displaying an Esri basemap at high zoom,
68647                 // check its tilemap to see how high the zoom can go
68648                 if (context.map().zoom() > 18) {
68649                     var basemap = baseLayer.source();
68650                     if (basemap && /^EsriWorldImagery/.test(basemap.id)) {
68651                         var center = context.map().center();
68652                         basemap.fetchTilemap(center);
68653                     }
68654                 }
68655
68656                 // Is the imagery valid here? - #4827
68657                 var sources = background.sources(context.map().extent());
68658                 var wasValid = _isValid;
68659                 _isValid = !!sources
68660                     .filter(function(d) { return d === baseLayer.source(); }).length;
68661
68662                 if (wasValid !== _isValid) {      // change in valid status
68663                     background.updateImagery();
68664                 }
68665
68666
68667                 var baseFilter = '';
68668                 if (detected.cssfilters) {
68669                     if (_brightness !== 1) {
68670                         baseFilter += 'brightness(' + _brightness + ')';
68671                     }
68672                     if (_contrast !== 1) {
68673                         baseFilter += 'contrast(' + _contrast + ')';
68674                     }
68675                     if (_saturation !== 1) {
68676                         baseFilter += 'saturate(' + _saturation + ')';
68677                     }
68678                     if (_sharpness < 1) {  // gaussian blur
68679                         var blur = d3_interpolateNumber(0.5, 5)(1 - _sharpness);
68680                         baseFilter += 'blur(' + blur + 'px)';
68681                     }
68682                 }
68683
68684                 var base = selection.selectAll('.layer-background')
68685                     .data([0]);
68686
68687                 base = base.enter()
68688                     .insert('div', '.layer-data')
68689                     .attr('class', 'layer layer-background')
68690                     .merge(base);
68691
68692                 if (detected.cssfilters) {
68693                     base.style('filter', baseFilter || null);
68694                 } else {
68695                     base.style('opacity', _brightness);
68696                 }
68697
68698
68699                 var imagery = base.selectAll('.layer-imagery')
68700                     .data([0]);
68701
68702                 imagery.enter()
68703                     .append('div')
68704                     .attr('class', 'layer layer-imagery')
68705                     .merge(imagery)
68706                     .call(baseLayer);
68707
68708
68709                 var maskFilter = '';
68710                 var mixBlendMode = '';
68711                 if (detected.cssfilters && _sharpness > 1) {  // apply unsharp mask
68712                     mixBlendMode = 'overlay';
68713                     maskFilter = 'saturate(0) blur(3px) invert(1)';
68714
68715                     var contrast = _sharpness - 1;
68716                     maskFilter += ' contrast(' + contrast + ')';
68717
68718                     var brightness = d3_interpolateNumber(1, 0.85)(_sharpness - 1);
68719                     maskFilter += ' brightness(' + brightness + ')';
68720                 }
68721
68722                 var mask = base.selectAll('.layer-unsharp-mask')
68723                     .data(detected.cssfilters && _sharpness > 1 ? [0] : []);
68724
68725                 mask.exit()
68726                     .remove();
68727
68728                 mask.enter()
68729                     .append('div')
68730                     .attr('class', 'layer layer-mask layer-unsharp-mask')
68731                     .merge(mask)
68732                     .call(baseLayer)
68733                     .style('filter', maskFilter || null)
68734                     .style('mix-blend-mode', mixBlendMode || null);
68735
68736
68737                 var overlays = selection.selectAll('.layer-overlay')
68738                     .data(_overlayLayers, function(d) { return d.source().name(); });
68739
68740                 overlays.exit()
68741                     .remove();
68742
68743                 overlays.enter()
68744                     .insert('div', '.layer-data')
68745                     .attr('class', 'layer layer-overlay')
68746                     .merge(overlays)
68747                     .each(function(layer) { d3_select(this).call(layer); });
68748             }
68749
68750
68751             background.updateImagery = function() {
68752                 var b = baseLayer.source();
68753                 if (context.inIntro() || !b) return;
68754
68755                 var o = _overlayLayers
68756                     .filter(function (d) { return !d.source().isLocatorOverlay() && !d.source().isHidden(); })
68757                     .map(function (d) { return d.source().id; })
68758                     .join(',');
68759
68760                 var meters = geoOffsetToMeters(b.offset());
68761                 var epsilon = 0.01;
68762                 var x = +meters[0].toFixed(2);
68763                 var y = +meters[1].toFixed(2);
68764                 var q = utilStringQs(window.location.hash.substring(1));
68765
68766                 var id = b.id;
68767                 if (id === 'custom') {
68768                     id = 'custom:' + b.template();
68769                 }
68770
68771                 if (id) {
68772                     q.background = id;
68773                 } else {
68774                     delete q.background;
68775                 }
68776
68777                 if (o) {
68778                     q.overlays = o;
68779                 } else {
68780                     delete q.overlays;
68781                 }
68782
68783                 if (Math.abs(x) > epsilon || Math.abs(y) > epsilon) {
68784                     q.offset = x + ',' + y;
68785                 } else {
68786                     delete q.offset;
68787                 }
68788
68789                 if (!window.mocha) {
68790                     window.location.replace('#' + utilQsString(q, true));
68791                 }
68792
68793                 var imageryUsed = [];
68794                 var photoOverlaysUsed = [];
68795
68796                 var current = b.imageryUsed();
68797                 if (current && _isValid) {
68798                     imageryUsed.push(current);
68799                 }
68800
68801                 _overlayLayers
68802                     .filter(function (d) { return !d.source().isLocatorOverlay() && !d.source().isHidden(); })
68803                     .forEach(function (d) { imageryUsed.push(d.source().imageryUsed()); });
68804
68805                 var data = context.layers().layer('data');
68806                 if (data && data.enabled() && data.hasData()) {
68807                     imageryUsed.push(data.getSrc());
68808                 }
68809
68810                 var photoOverlayLayers = {
68811                     streetside: 'Bing Streetside',
68812                     mapillary: 'Mapillary Images',
68813                     'mapillary-signs': 'Mapillary Signs',
68814                     openstreetcam: 'OpenStreetCam Images'
68815                 };
68816
68817                 for (var layerID in photoOverlayLayers) {
68818                     var layer = context.layers().layer(layerID);
68819                     if (layer && layer.enabled()) {
68820                         photoOverlaysUsed.push(layerID);
68821                         imageryUsed.push(photoOverlayLayers[layerID]);
68822                     }
68823                 }
68824
68825                 context.history().photoOverlaysUsed(photoOverlaysUsed);
68826                 context.history().imageryUsed(imageryUsed);
68827             };
68828
68829
68830             background.sources = function(extent) {
68831                 if (!data.imagery || !data.imagery.query) return [];   // called before init()?
68832
68833                 var matchIDs = {};
68834                 var matchImagery = data.imagery.query.bbox(extent.rectangle(), true) || [];
68835                 matchImagery.forEach(function(d) { matchIDs[d.id] = true; });
68836
68837                 return _backgroundSources.filter(function(source) {
68838                     return matchIDs[source.id] || !source.polygon;   // no polygon = worldwide
68839                 });
68840             };
68841
68842
68843             background.dimensions = function(d) {
68844                 if (!d) return;
68845                 baseLayer.dimensions(d);
68846
68847                 _overlayLayers.forEach(function(layer) {
68848                     layer.dimensions(d);
68849                 });
68850             };
68851
68852
68853             background.baseLayerSource = function(d) {
68854                 if (!arguments.length) return baseLayer.source();
68855
68856                 // test source against OSM imagery blacklists..
68857                 var osm = context.connection();
68858                 if (!osm) return background;
68859
68860                 var blacklists = context.connection().imageryBlacklists();
68861                 var template = d.template();
68862                 var fail = false;
68863                 var tested = 0;
68864                 var regex;
68865
68866                 for (var i = 0; i < blacklists.length; i++) {
68867                     try {
68868                         regex = new RegExp(blacklists[i]);
68869                         fail = regex.test(template);
68870                         tested++;
68871                         if (fail) break;
68872                     } catch (e) {
68873                         /* noop */
68874                     }
68875                 }
68876
68877                 // ensure at least one test was run.
68878                 if (!tested) {
68879                     regex = new RegExp('.*\.google(apis)?\..*/(vt|kh)[\?/].*([xyz]=.*){3}.*');
68880                     fail = regex.test(template);
68881                 }
68882
68883                 baseLayer.source(!fail ? d : background.findSource('none'));
68884                 dispatch$1.call('change');
68885                 background.updateImagery();
68886                 return background;
68887             };
68888
68889
68890             background.findSource = function(id) {
68891                 return _backgroundSources.find(function(d) {
68892                     return d.id && d.id === id;
68893                 });
68894             };
68895
68896
68897             background.bing = function() {
68898                 background.baseLayerSource(background.findSource('Bing'));
68899             };
68900
68901
68902             background.showsLayer = function(d) {
68903                 return d.id === baseLayer.source().id ||
68904                     _overlayLayers.some(function(layer) { return d.id === layer.source().id; });
68905             };
68906
68907
68908             background.overlayLayerSources = function() {
68909                 return _overlayLayers.map(function (l) { return l.source(); });
68910             };
68911
68912
68913             background.toggleOverlayLayer = function(d) {
68914                 var layer;
68915                 for (var i = 0; i < _overlayLayers.length; i++) {
68916                     layer = _overlayLayers[i];
68917                     if (layer.source() === d) {
68918                         _overlayLayers.splice(i, 1);
68919                         dispatch$1.call('change');
68920                         background.updateImagery();
68921                         return;
68922                     }
68923                 }
68924
68925                 layer = rendererTileLayer(context)
68926                     .source(d)
68927                     .projection(context.projection)
68928                     .dimensions(baseLayer.dimensions()
68929                 );
68930
68931                 _overlayLayers.push(layer);
68932                 dispatch$1.call('change');
68933                 background.updateImagery();
68934             };
68935
68936
68937             background.nudge = function(d, zoom) {
68938                 baseLayer.source().nudge(d, zoom);
68939                 dispatch$1.call('change');
68940                 background.updateImagery();
68941                 return background;
68942             };
68943
68944
68945             background.offset = function(d) {
68946                 if (!arguments.length) return baseLayer.source().offset();
68947                 baseLayer.source().offset(d);
68948                 dispatch$1.call('change');
68949                 background.updateImagery();
68950                 return background;
68951             };
68952
68953
68954             background.brightness = function(d) {
68955                 if (!arguments.length) return _brightness;
68956                 _brightness = d;
68957                 if (context.mode()) dispatch$1.call('change');
68958                 return background;
68959             };
68960
68961
68962             background.contrast = function(d) {
68963                 if (!arguments.length) return _contrast;
68964                 _contrast = d;
68965                 if (context.mode()) dispatch$1.call('change');
68966                 return background;
68967             };
68968
68969
68970             background.saturation = function(d) {
68971                 if (!arguments.length) return _saturation;
68972                 _saturation = d;
68973                 if (context.mode()) dispatch$1.call('change');
68974                 return background;
68975             };
68976
68977
68978             background.sharpness = function(d) {
68979                 if (!arguments.length) return _sharpness;
68980                 _sharpness = d;
68981                 if (context.mode()) dispatch$1.call('change');
68982                 return background;
68983             };
68984
68985
68986             background.init = function() {
68987                 function parseMap(qmap) {
68988                     if (!qmap) return false;
68989                     var args = qmap.split('/').map(Number);
68990                     if (args.length < 3 || args.some(isNaN)) return false;
68991                     return geoExtent([args[2], args[1]]);
68992                 }
68993
68994                 var q = utilStringQs(window.location.hash.substring(1));
68995                 var requested = q.background || q.layer;
68996                 var extent = parseMap(q.map);
68997                 var first;
68998                 var best;
68999
69000
69001                 data.imagery = data.imagery || [];
69002                 data.imagery.features = {};
69003
69004                 // build efficient index and querying for data.imagery
69005                 var features = data.imagery.map(function(source) {
69006                     if (!source.polygon) return null;
69007
69008                     // Add an extra array nest to each element in `source.polygon`
69009                     // so the rings are not treated as a bunch of holes:
69010                     // what we have: [ [[outer],[hole],[hole]] ]
69011                     // what we want: [ [[outer]],[[outer]],[[outer]] ]
69012                     var rings = source.polygon.map(function(ring) { return [ring]; });
69013
69014                     var feature = {
69015                         type: 'Feature',
69016                         properties: { id: source.id },
69017                         geometry: { type: 'MultiPolygon', coordinates: rings }
69018                     };
69019
69020                     data.imagery.features[source.id] = feature;
69021                     return feature;
69022
69023                 }).filter(Boolean);
69024
69025                 data.imagery.query = whichPolygon_1({
69026                     type: 'FeatureCollection',
69027                     features: features
69028                 });
69029
69030
69031                 // Add all the available imagery sources
69032                 _backgroundSources = data.imagery.map(function(source) {
69033                     if (source.type === 'bing') {
69034                         return rendererBackgroundSource.Bing(source, dispatch$1);
69035                     } else if (/^EsriWorldImagery/.test(source.id)) {
69036                         return rendererBackgroundSource.Esri(source);
69037                     } else {
69038                         return rendererBackgroundSource(source);
69039                     }
69040                 });
69041
69042                 first = _backgroundSources.length && _backgroundSources[0];
69043
69044                 // Add 'None'
69045                 _backgroundSources.unshift(rendererBackgroundSource.None());
69046
69047                 // Add 'Custom'
69048                 var template = context.storage('background-custom-template') || '';
69049                 var custom = rendererBackgroundSource.Custom(template);
69050                 _backgroundSources.unshift(custom);
69051
69052
69053                 // Decide which background layer to display
69054                 if (!requested && extent) {
69055                     best = this.sources(extent).find(function(s) { return s.best(); });
69056                 }
69057                 if (requested && requested.indexOf('custom:') === 0) {
69058                     template = requested.replace(/^custom:/, '');
69059                     background.baseLayerSource(custom.template(template));
69060                     context.storage('background-custom-template', template);
69061                 } else {
69062                     background.baseLayerSource(
69063                         background.findSource(requested) ||
69064                         best ||
69065                         background.findSource(context.storage('background-last-used')) ||
69066                         background.findSource('Bing') ||
69067                         first ||
69068                         background.findSource('none')
69069                     );
69070                 }
69071
69072                 var locator = _backgroundSources.find(function(d) {
69073                     return d.overlay && d.default;
69074                 });
69075
69076                 if (locator) {
69077                     background.toggleOverlayLayer(locator);
69078                 }
69079
69080                 var overlays = (q.overlays || '').split(',');
69081                 overlays.forEach(function(overlay) {
69082                     overlay = background.findSource(overlay);
69083                     if (overlay) {
69084                         background.toggleOverlayLayer(overlay);
69085                     }
69086                 });
69087
69088                 if (q.gpx) {
69089                     var gpx = context.layers().layer('data');
69090                     if (gpx) {
69091                         gpx.url(q.gpx, '.gpx');
69092                     }
69093                 }
69094
69095                 if (q.offset) {
69096                     var offset = q.offset.replace(/;/g, ',').split(',').map(function(n) {
69097                         return !isNaN(n) && n;
69098                     });
69099
69100                     if (offset.length === 2) {
69101                         background.offset(geoMetersToOffset(offset));
69102                     }
69103                 }
69104             };
69105
69106
69107             return utilRebind(background, dispatch$1, 'on');
69108         }
69109
69110         function rendererFeatures(context) {
69111             var dispatch$1 = dispatch('change', 'redraw');
69112             var features = utilRebind({}, dispatch$1, 'on');
69113             var _deferred = new Set();
69114
69115             var traffic_roads = {
69116                 'motorway': true,
69117                 'motorway_link': true,
69118                 'trunk': true,
69119                 'trunk_link': true,
69120                 'primary': true,
69121                 'primary_link': true,
69122                 'secondary': true,
69123                 'secondary_link': true,
69124                 'tertiary': true,
69125                 'tertiary_link': true,
69126                 'residential': true,
69127                 'unclassified': true,
69128                 'living_street': true
69129             };
69130
69131             var service_roads = {
69132                 'service': true,
69133                 'road': true,
69134                 'track': true
69135             };
69136
69137             var paths = {
69138                 'path': true,
69139                 'footway': true,
69140                 'cycleway': true,
69141                 'bridleway': true,
69142                 'steps': true,
69143                 'pedestrian': true,
69144                 'corridor': true
69145             };
69146
69147             var past_futures = {
69148                 'proposed': true,
69149                 'construction': true,
69150                 'abandoned': true,
69151                 'dismantled': true,
69152                 'disused': true,
69153                 'razed': true,
69154                 'demolished': true,
69155                 'obliterated': true
69156             };
69157
69158             var _cullFactor = 1;
69159             var _cache = {};
69160             var _rules = {};
69161             var _stats = {};
69162             var _keys = [];
69163             var _hidden = [];
69164             var _forceVisible = {};
69165
69166
69167             function update() {
69168                 if (!window.mocha) {
69169                     var q = utilStringQs(window.location.hash.substring(1));
69170                     var disabled = features.disabled();
69171                     if (disabled.length) {
69172                         q.disable_features = disabled.join(',');
69173                     } else {
69174                         delete q.disable_features;
69175                     }
69176                     window.location.replace('#' + utilQsString(q, true));
69177                     context.storage('disabled-features', disabled.join(','));
69178                 }
69179                 _hidden = features.hidden();
69180                 dispatch$1.call('change');
69181                 dispatch$1.call('redraw');
69182             }
69183
69184
69185             function defineRule(k, filter, max) {
69186                 var isEnabled = true;
69187
69188                 _keys.push(k);
69189                 _rules[k] = {
69190                     filter: filter,
69191                     enabled: isEnabled,   // whether the user wants it enabled..
69192                     count: 0,
69193                     currentMax: (max || Infinity),
69194                     defaultMax: (max || Infinity),
69195                     enable: function() { this.enabled = true; this.currentMax = this.defaultMax; },
69196                     disable: function() { this.enabled = false; this.currentMax = 0; },
69197                     hidden: function() {
69198                         return !context.editable() ||
69199                             (this.count === 0 && !this.enabled) ||
69200                             this.count > this.currentMax * _cullFactor;
69201                     },
69202                     autoHidden: function() { return this.hidden() && this.currentMax > 0; }
69203                 };
69204             }
69205
69206
69207             defineRule('points', function isPoint(tags, geometry) {
69208                 return geometry === 'point';
69209             }, 200);
69210
69211             defineRule('traffic_roads', function isTrafficRoad(tags) {
69212                 return traffic_roads[tags.highway];
69213             });
69214
69215             defineRule('service_roads', function isServiceRoad(tags) {
69216                 return service_roads[tags.highway];
69217             });
69218
69219             defineRule('paths', function isPath(tags) {
69220                 return paths[tags.highway];
69221             });
69222
69223             defineRule('buildings', function isBuilding(tags) {
69224                 return (
69225                     !!tags['building:part'] ||
69226                     (!!tags.building && tags.building !== 'no') ||
69227                     tags.parking === 'multi-storey' ||
69228                     tags.parking === 'sheds' ||
69229                     tags.parking === 'carports' ||
69230                     tags.parking === 'garage_boxes'
69231                 );
69232             }, 250);
69233
69234             defineRule('landuse', function isLanduse(tags, geometry) {
69235                 return geometry === 'area' &&
69236                     !_rules.buildings.filter(tags) &&
69237                     !_rules.water.filter(tags);
69238             });
69239
69240             defineRule('boundaries', function isBoundary(tags) {
69241                 return (
69242                     !!tags.boundary
69243                 ) && !(
69244                     traffic_roads[tags.highway] ||
69245                     service_roads[tags.highway] ||
69246                     paths[tags.highway] ||
69247                     tags.waterway ||
69248                     tags.railway ||
69249                     tags.landuse ||
69250                     tags.natural ||
69251                     tags.building ||
69252                     tags.power
69253                 );
69254             });
69255
69256             defineRule('water', function isWater(tags) {
69257                 return (
69258                     !!tags.waterway ||
69259                     tags.natural === 'water' ||
69260                     tags.natural === 'coastline' ||
69261                     tags.natural === 'bay' ||
69262                     tags.landuse === 'pond' ||
69263                     tags.landuse === 'basin' ||
69264                     tags.landuse === 'reservoir' ||
69265                     tags.landuse === 'salt_pond'
69266                 );
69267             });
69268
69269             defineRule('rail', function isRail(tags) {
69270                 return (
69271                     !!tags.railway ||
69272                     tags.landuse === 'railway'
69273                 ) && !(
69274                     traffic_roads[tags.highway] ||
69275                     service_roads[tags.highway] ||
69276                     paths[tags.highway]
69277                 );
69278             });
69279
69280             defineRule('power', function isPower(tags) {
69281                 return !!tags.power;
69282             });
69283
69284             // contains a past/future tag, but not in active use as a road/path/cycleway/etc..
69285             defineRule('past_future', function isPastFuture(tags) {
69286                 if (
69287                     traffic_roads[tags.highway] ||
69288                     service_roads[tags.highway] ||
69289                     paths[tags.highway]
69290                 ) { return false; }
69291
69292                 var strings = Object.keys(tags);
69293
69294                 for (var i = 0; i < strings.length; i++) {
69295                     var s = strings[i];
69296                     if (past_futures[s] || past_futures[tags[s]]) { return true; }
69297                 }
69298                 return false;
69299             });
69300
69301             // Lines or areas that don't match another feature filter.
69302             // IMPORTANT: The 'others' feature must be the last one defined,
69303             //   so that code in getMatches can skip this test if `hasMatch = true`
69304             defineRule('others', function isOther(tags, geometry) {
69305                 return (geometry === 'line' || geometry === 'area');
69306             });
69307
69308
69309
69310             features.features = function() {
69311                 return _rules;
69312             };
69313
69314
69315             features.keys = function() {
69316                 return _keys;
69317             };
69318
69319
69320             features.enabled = function(k) {
69321                 if (!arguments.length) {
69322                     return _keys.filter(function(k) { return _rules[k].enabled; });
69323                 }
69324                 return _rules[k] && _rules[k].enabled;
69325             };
69326
69327
69328             features.disabled = function(k) {
69329                 if (!arguments.length) {
69330                     return _keys.filter(function(k) { return !_rules[k].enabled; });
69331                 }
69332                 return _rules[k] && !_rules[k].enabled;
69333             };
69334
69335
69336             features.hidden = function(k) {
69337                 if (!arguments.length) {
69338                     return _keys.filter(function(k) { return _rules[k].hidden(); });
69339                 }
69340                 return _rules[k] && _rules[k].hidden();
69341             };
69342
69343
69344             features.autoHidden = function(k) {
69345                 if (!arguments.length) {
69346                     return _keys.filter(function(k) { return _rules[k].autoHidden(); });
69347                 }
69348                 return _rules[k] && _rules[k].autoHidden();
69349             };
69350
69351
69352             features.enable = function(k) {
69353                 if (_rules[k] && !_rules[k].enabled) {
69354                     _rules[k].enable();
69355                     update();
69356                 }
69357             };
69358
69359
69360             features.disable = function(k) {
69361                 if (_rules[k] && _rules[k].enabled) {
69362                     _rules[k].disable();
69363                     update();
69364                 }
69365             };
69366
69367
69368             features.toggle = function(k) {
69369                 if (_rules[k]) {
69370                     (function(f) { return f.enabled ? f.disable() : f.enable(); }(_rules[k]));
69371                     update();
69372                 }
69373             };
69374
69375
69376             features.resetStats = function() {
69377                 for (var i = 0; i < _keys.length; i++) {
69378                     _rules[_keys[i]].count = 0;
69379                 }
69380                 dispatch$1.call('change');
69381             };
69382
69383
69384             features.gatherStats = function(d, resolver, dimensions) {
69385                 var needsRedraw = false;
69386                 var types = utilArrayGroupBy(d, 'type');
69387                 var entities = [].concat(types.relation || [], types.way || [], types.node || []);
69388                 var currHidden, geometry, matches, i, j;
69389
69390                 for (i = 0; i < _keys.length; i++) {
69391                     _rules[_keys[i]].count = 0;
69392                 }
69393
69394                 // adjust the threshold for point/building culling based on viewport size..
69395                 // a _cullFactor of 1 corresponds to a 1000x1000px viewport..
69396                 _cullFactor = dimensions[0] * dimensions[1] / 1000000;
69397
69398                 for (i = 0; i < entities.length; i++) {
69399                     geometry = entities[i].geometry(resolver);
69400                     matches = Object.keys(features.getMatches(entities[i], resolver, geometry));
69401                     for (j = 0; j < matches.length; j++) {
69402                         _rules[matches[j]].count++;
69403                     }
69404                 }
69405
69406                 currHidden = features.hidden();
69407                 if (currHidden !== _hidden) {
69408                     _hidden = currHidden;
69409                     needsRedraw = true;
69410                     dispatch$1.call('change');
69411                 }
69412
69413                 return needsRedraw;
69414             };
69415
69416
69417             features.stats = function() {
69418                 for (var i = 0; i < _keys.length; i++) {
69419                     _stats[_keys[i]] = _rules[_keys[i]].count;
69420                 }
69421
69422                 return _stats;
69423             };
69424
69425
69426             features.clear = function(d) {
69427                 for (var i = 0; i < d.length; i++) {
69428                     features.clearEntity(d[i]);
69429                 }
69430             };
69431
69432
69433             features.clearEntity = function(entity) {
69434                 delete _cache[osmEntity.key(entity)];
69435             };
69436
69437
69438             features.reset = function() {
69439                 Array.from(_deferred).forEach(function(handle) {
69440                     window.cancelIdleCallback(handle);
69441                     _deferred.delete(handle);
69442                 });
69443
69444                 _cache = {};
69445             };
69446
69447             // only certain relations are worth checking
69448             function relationShouldBeChecked(relation) {
69449                 // multipolygon features have `area` geometry and aren't checked here
69450                 return relation.tags.type === 'boundary';
69451             }
69452
69453             features.getMatches = function(entity, resolver, geometry) {
69454                 if (geometry === 'vertex' ||
69455                     (geometry === 'relation' && !relationShouldBeChecked(entity))) return {};
69456
69457                 var ent = osmEntity.key(entity);
69458                 if (!_cache[ent]) {
69459                     _cache[ent] = {};
69460                 }
69461
69462                 if (!_cache[ent].matches) {
69463                     var matches = {};
69464                     var hasMatch = false;
69465
69466                     for (var i = 0; i < _keys.length; i++) {
69467                         if (_keys[i] === 'others') {
69468                             if (hasMatch) continue;
69469
69470                             // If an entity...
69471                             //   1. is a way that hasn't matched other 'interesting' feature rules,
69472                             if (entity.type === 'way') {
69473                                 var parents = features.getParents(entity, resolver, geometry);
69474
69475                                 //   2a. belongs only to a single multipolygon relation
69476                                 if ((parents.length === 1 && parents[0].isMultipolygon()) ||
69477                                     // 2b. or belongs only to boundary relations
69478                                     (parents.length > 0 && parents.every(function(parent) { return parent.tags.type === 'boundary'; }))) {
69479
69480                                     // ...then match whatever feature rules the parent relation has matched.
69481                                     // see #2548, #2887
69482                                     //
69483                                     // IMPORTANT:
69484                                     // For this to work, getMatches must be called on relations before ways.
69485                                     //
69486                                     var pkey = osmEntity.key(parents[0]);
69487                                     if (_cache[pkey] && _cache[pkey].matches) {
69488                                         matches = Object.assign({}, _cache[pkey].matches);  // shallow copy
69489                                         continue;
69490                                     }
69491                                 }
69492                             }
69493                         }
69494
69495                         if (_rules[_keys[i]].filter(entity.tags, geometry)) {
69496                             matches[_keys[i]] = hasMatch = true;
69497                         }
69498                     }
69499                     _cache[ent].matches = matches;
69500                 }
69501
69502                 return _cache[ent].matches;
69503             };
69504
69505
69506             features.getParents = function(entity, resolver, geometry) {
69507                 if (geometry === 'point') return [];
69508
69509                 var ent = osmEntity.key(entity);
69510                 if (!_cache[ent]) {
69511                     _cache[ent] = {};
69512                 }
69513
69514                 if (!_cache[ent].parents) {
69515                     var parents = [];
69516                     if (geometry === 'vertex') {
69517                         parents = resolver.parentWays(entity);
69518                     } else {   // 'line', 'area', 'relation'
69519                         parents = resolver.parentRelations(entity);
69520                     }
69521                     _cache[ent].parents = parents;
69522                 }
69523                 return _cache[ent].parents;
69524             };
69525
69526
69527             features.isHiddenPreset = function(preset, geometry) {
69528                 if (!_hidden.length) return false;
69529                 if (!preset.tags) return false;
69530
69531                 var test = preset.setTags({}, geometry);
69532                 for (var key in _rules) {
69533                     if (_rules[key].filter(test, geometry)) {
69534                         if (_hidden.indexOf(key) !== -1) {
69535                             return key;
69536                         }
69537                         return false;
69538                     }
69539                 }
69540                 return false;
69541             };
69542
69543
69544             features.isHiddenFeature = function(entity, resolver, geometry) {
69545                 if (!_hidden.length) return false;
69546                 if (!entity.version) return false;
69547                 if (_forceVisible[entity.id]) return false;
69548
69549                 var matches = Object.keys(features.getMatches(entity, resolver, geometry));
69550                 return matches.length && matches.every(function(k) { return features.hidden(k); });
69551             };
69552
69553
69554             features.isHiddenChild = function(entity, resolver, geometry) {
69555                 if (!_hidden.length) return false;
69556                 if (!entity.version || geometry === 'point') return false;
69557                 if (_forceVisible[entity.id]) return false;
69558
69559                 var parents = features.getParents(entity, resolver, geometry);
69560                 if (!parents.length) return false;
69561
69562                 for (var i = 0; i < parents.length; i++) {
69563                     if (!features.isHidden(parents[i], resolver, parents[i].geometry(resolver))) {
69564                         return false;
69565                     }
69566                 }
69567                 return true;
69568             };
69569
69570
69571             features.hasHiddenConnections = function(entity, resolver) {
69572                 if (!_hidden.length) return false;
69573
69574                 var childNodes, connections;
69575                 if (entity.type === 'midpoint') {
69576                     childNodes = [resolver.entity(entity.edge[0]), resolver.entity(entity.edge[1])];
69577                     connections = [];
69578                 } else {
69579                     childNodes = entity.nodes ? resolver.childNodes(entity) : [];
69580                     connections = features.getParents(entity, resolver, entity.geometry(resolver));
69581                 }
69582
69583                 // gather ways connected to child nodes..
69584                 connections = childNodes.reduce(function(result, e) {
69585                     return resolver.isShared(e) ? utilArrayUnion(result, resolver.parentWays(e)) : result;
69586                 }, connections);
69587
69588                 return connections.some(function(e) {
69589                     return features.isHidden(e, resolver, e.geometry(resolver));
69590                 });
69591             };
69592
69593
69594             features.isHidden = function(entity, resolver, geometry) {
69595                 if (!_hidden.length) return false;
69596                 if (!entity.version) return false;
69597
69598                 var fn = (geometry === 'vertex' ? features.isHiddenChild : features.isHiddenFeature);
69599                 return fn(entity, resolver, geometry);
69600             };
69601
69602
69603             features.filter = function(d, resolver) {
69604                 if (!_hidden.length) return d;
69605
69606                 var result = [];
69607                 for (var i = 0; i < d.length; i++) {
69608                     var entity = d[i];
69609                     if (!features.isHidden(entity, resolver, entity.geometry(resolver))) {
69610                         result.push(entity);
69611                     }
69612                 }
69613                 return result;
69614             };
69615
69616
69617             features.forceVisible = function(entityIDs) {
69618                 if (!arguments.length) return Object.keys(_forceVisible);
69619
69620                 _forceVisible = {};
69621                 for (var i = 0; i < entityIDs.length; i++) {
69622                     _forceVisible[entityIDs[i]] = true;
69623                     var entity = context.hasEntity(entityIDs[i]);
69624                     if (entity && entity.type === 'relation') {
69625                         // also show relation members (one level deep)
69626                         for (var j in entity.members) {
69627                             _forceVisible[entity.members[j].id] = true;
69628                         }
69629                     }
69630                 }
69631                 return features;
69632             };
69633
69634
69635             features.init = function() {
69636                 var storage = context.storage('disabled-features');
69637                 if (storage) {
69638                     var storageDisabled = storage.replace(/;/g, ',').split(',');
69639                     storageDisabled.forEach(features.disable);
69640                 }
69641
69642                 var q = utilStringQs(window.location.hash.substring(1));
69643                 if (q.disable_features) {
69644                     var hashDisabled = q.disable_features.replace(/;/g, ',').split(',');
69645                     hashDisabled.forEach(features.disable);
69646                 }
69647             };
69648
69649
69650             // warm up the feature matching cache upon merging fetched data
69651             context.history().on('merge.features', function(newEntities) {
69652                 if (!newEntities) return;
69653                 var handle = window.requestIdleCallback(function() {
69654                     var graph = context.graph();
69655                     var types = utilArrayGroupBy(newEntities, 'type');
69656                     // ensure that getMatches is called on relations before ways
69657                     var entities = [].concat(types.relation || [], types.way || [], types.node || []);
69658                     for (var i = 0; i < entities.length; i++) {
69659                         var geometry = entities[i].geometry(graph);
69660                         features.getMatches(entities[i], graph, geometry);
69661                     }
69662                 });
69663                 _deferred.add(handle);
69664             });
69665
69666
69667             return features;
69668         }
69669
69670         // Touch targets control which other vertices we can drag a vertex onto.
69671         //
69672         // - the activeID - nope
69673         // - 1 away (adjacent) to the activeID - yes (vertices will be merged)
69674         // - 2 away from the activeID - nope (would create a self intersecting segment)
69675         // - all others on a linear way - yes
69676         // - all others on a closed way - nope (would create a self intersecting polygon)
69677         //
69678         // returns
69679         // 0 = active vertex - no touch/connect
69680         // 1 = passive vertex - yes touch/connect
69681         // 2 = adjacent vertex - yes but pay attention segmenting a line here
69682         //
69683         function svgPassiveVertex(node, graph, activeID) {
69684             if (!activeID) return 1;
69685             if (activeID === node.id) return 0;
69686
69687             var parents = graph.parentWays(node);
69688
69689             for (var i = 0; i < parents.length; i++) {
69690                 var nodes = parents[i].nodes;
69691                 var isClosed = parents[i].isClosed();
69692                 for (var j = 0; j < nodes.length; j++) {   // find this vertex, look nearby
69693                     if (nodes[j] === node.id) {
69694                         var ix1 = j - 2;
69695                         var ix2 = j - 1;
69696                         var ix3 = j + 1;
69697                         var ix4 = j + 2;
69698
69699                         if (isClosed) {  // wraparound if needed
69700                             var max = nodes.length - 1;
69701                             if (ix1 < 0)   ix1 = max + ix1;
69702                             if (ix2 < 0)   ix2 = max + ix2;
69703                             if (ix3 > max) ix3 = ix3 - max;
69704                             if (ix4 > max) ix4 = ix4 - max;
69705                         }
69706
69707                         if (nodes[ix1] === activeID) return 0;        // no - prevent self intersect
69708                         else if (nodes[ix2] === activeID) return 2;   // ok - adjacent
69709                         else if (nodes[ix3] === activeID) return 2;   // ok - adjacent
69710                         else if (nodes[ix4] === activeID) return 0;   // no - prevent self intersect
69711                         else if (isClosed && nodes.indexOf(activeID) !== -1) return 0;  // no - prevent self intersect
69712                     }
69713                 }
69714             }
69715
69716             return 1;   // ok
69717         }
69718
69719
69720         function svgMarkerSegments(projection, graph, dt,
69721                                           shouldReverse,
69722                                           bothDirections) {
69723             return function(entity) {
69724                 var i = 0;
69725                 var offset = dt;
69726                 var segments = [];
69727                 var clip = d3_geoIdentity().clipExtent(projection.clipExtent()).stream;
69728                 var coordinates = graph.childNodes(entity).map(function(n) { return n.loc; });
69729                 var a, b;
69730
69731                 if (shouldReverse(entity)) {
69732                     coordinates.reverse();
69733                 }
69734
69735                 d3_geoStream({
69736                     type: 'LineString',
69737                     coordinates: coordinates
69738                 }, projection.stream(clip({
69739                     lineStart: function() {},
69740                     lineEnd: function() { a = null; },
69741                     point: function(x, y) {
69742                         b = [x, y];
69743
69744                         if (a) {
69745                             var span = geoVecLength(a, b) - offset;
69746
69747                             if (span >= 0) {
69748                                 var heading = geoVecAngle(a, b);
69749                                 var dx = dt * Math.cos(heading);
69750                                 var dy = dt * Math.sin(heading);
69751                                 var p = [
69752                                     a[0] + offset * Math.cos(heading),
69753                                     a[1] + offset * Math.sin(heading)
69754                                 ];
69755
69756                                 // gather coordinates
69757                                 var coord = [a, p];
69758                                 for (span -= dt; span >= 0; span -= dt) {
69759                                     p = geoVecAdd(p, [dx, dy]);
69760                                     coord.push(p);
69761                                 }
69762                                 coord.push(b);
69763
69764                                 // generate svg paths
69765                                 var segment = '';
69766                                 var j;
69767
69768                                 for (j = 0; j < coord.length; j++) {
69769                                     segment += (j === 0 ? 'M' : 'L') + coord[j][0] + ',' + coord[j][1];
69770                                 }
69771                                 segments.push({ id: entity.id, index: i++, d: segment });
69772
69773                                 if (bothDirections(entity)) {
69774                                     segment = '';
69775                                     for (j = coord.length - 1; j >= 0; j--) {
69776                                         segment += (j === coord.length - 1 ? 'M' : 'L') + coord[j][0] + ',' + coord[j][1];
69777                                     }
69778                                     segments.push({ id: entity.id, index: i++, d: segment });
69779                                 }
69780                             }
69781
69782                             offset = -span;
69783                         }
69784
69785                         a = b;
69786                     }
69787                 })));
69788
69789                 return segments;
69790             };
69791         }
69792
69793
69794         function svgPath(projection, graph, isArea) {
69795
69796             // Explanation of magic numbers:
69797             // "padding" here allows space for strokes to extend beyond the viewport,
69798             // so that the stroke isn't drawn along the edge of the viewport when
69799             // the shape is clipped.
69800             //
69801             // When drawing lines, pad viewport by 5px.
69802             // When drawing areas, pad viewport by 65px in each direction to allow
69803             // for 60px area fill stroke (see ".fill-partial path.fill" css rule)
69804
69805             var cache = {};
69806             var padding = isArea ? 65 : 5;
69807             var viewport = projection.clipExtent();
69808             var paddedExtent = [
69809                 [viewport[0][0] - padding, viewport[0][1] - padding],
69810                 [viewport[1][0] + padding, viewport[1][1] + padding]
69811             ];
69812             var clip = d3_geoIdentity().clipExtent(paddedExtent).stream;
69813             var project = projection.stream;
69814             var path = d3_geoPath()
69815                 .projection({stream: function(output) { return project(clip(output)); }});
69816
69817             var svgpath = function(entity) {
69818                 if (entity.id in cache) {
69819                     return cache[entity.id];
69820                 } else {
69821                     return cache[entity.id] = path(entity.asGeoJSON(graph));
69822                 }
69823             };
69824
69825             svgpath.geojson = function(d) {
69826                 if (d.__featurehash__ !== undefined) {
69827                     if (d.__featurehash__ in cache) {
69828                         return cache[d.__featurehash__];
69829                     } else {
69830                         return cache[d.__featurehash__] = path(d);
69831                     }
69832                 } else {
69833                     return path(d);
69834                 }
69835             };
69836
69837             return svgpath;
69838         }
69839
69840
69841         function svgPointTransform(projection) {
69842             var svgpoint = function(entity) {
69843                 // http://jsperf.com/short-array-join
69844                 var pt = projection(entity.loc);
69845                 return 'translate(' + pt[0] + ',' + pt[1] + ')';
69846             };
69847
69848             svgpoint.geojson = function(d) {
69849                 return svgpoint(d.properties.entity);
69850             };
69851
69852             return svgpoint;
69853         }
69854
69855
69856         function svgRelationMemberTags(graph) {
69857             return function(entity) {
69858                 var tags = entity.tags;
69859                 var shouldCopyMultipolygonTags = !entity.hasInterestingTags();
69860                 graph.parentRelations(entity).forEach(function(relation) {
69861                     var type = relation.tags.type;
69862                     if ((type === 'multipolygon' && shouldCopyMultipolygonTags) || type === 'boundary') {
69863                         tags = Object.assign({}, relation.tags, tags);
69864                     }
69865                 });
69866                 return tags;
69867             };
69868         }
69869
69870
69871         function svgSegmentWay(way, graph, activeID) {
69872             // When there is no activeID, we can memoize this expensive computation
69873             if (activeID === undefined) {
69874                 return graph.transient(way, 'waySegments', getWaySegments);
69875             } else {
69876                 return getWaySegments();
69877             }
69878
69879             function getWaySegments() {
69880                 var isActiveWay = (way.nodes.indexOf(activeID) !== -1);
69881                 var features = { passive: [], active: [] };
69882                 var start = {};
69883                 var end = {};
69884                 var node, type;
69885
69886                 for (var i = 0; i < way.nodes.length; i++) {
69887                     node = graph.entity(way.nodes[i]);
69888                     type = svgPassiveVertex(node, graph, activeID);
69889                     end = { node: node, type: type };
69890
69891                     if (start.type !== undefined) {
69892                         if (start.node.id === activeID || end.node.id === activeID) ; else if (isActiveWay && (start.type === 2 || end.type === 2)) {   // one adjacent vertex
69893                             pushActive(start, end, i);
69894                         } else if (start.type === 0 && end.type === 0) {   // both active vertices
69895                             pushActive(start, end, i);
69896                         } else {
69897                             pushPassive(start, end, i);
69898                         }
69899                     }
69900
69901                     start = end;
69902                 }
69903
69904                 return features;
69905
69906                 function pushActive(start, end, index) {
69907                     features.active.push({
69908                         type: 'Feature',
69909                         id: way.id + '-' + index + '-nope',
69910                         properties: {
69911                             nope: true,
69912                             target: true,
69913                             entity: way,
69914                             nodes: [start.node, end.node],
69915                             index: index
69916                         },
69917                         geometry: {
69918                             type: 'LineString',
69919                             coordinates: [start.node.loc, end.node.loc]
69920                         }
69921                     });
69922                 }
69923
69924                 function pushPassive(start, end, index) {
69925                     features.passive.push({
69926                         type: 'Feature',
69927                         id: way.id + '-' + index,
69928                         properties: {
69929                             target: true,
69930                             entity: way,
69931                             nodes: [start.node, end.node],
69932                             index: index
69933                         },
69934                         geometry: {
69935                             type: 'LineString',
69936                             coordinates: [start.node.loc, end.node.loc]
69937                         }
69938                     });
69939                 }
69940             }
69941         }
69942
69943         function svgTagClasses() {
69944             var primaries = [
69945                 'building', 'highway', 'railway', 'waterway', 'aeroway', 'aerialway',
69946                 'piste:type', 'boundary', 'power', 'amenity', 'natural', 'landuse',
69947                 'leisure', 'military', 'place', 'man_made', 'route', 'attraction',
69948                 'building:part', 'indoor'
69949             ];
69950             var statuses = [
69951                 'proposed', 'construction', 'disused', 'abandoned', 'dismantled',
69952                 'razed', 'demolished', 'obliterated', 'intermittent'
69953             ];
69954             var secondaries = [
69955                 'oneway', 'bridge', 'tunnel', 'embankment', 'cutting', 'barrier',
69956                 'surface', 'tracktype', 'footway', 'crossing', 'service', 'sport',
69957                 'public_transport', 'location', 'parking', 'golf', 'type', 'leisure',
69958                 'man_made', 'indoor'
69959             ];
69960             var _tags = function(entity) { return entity.tags; };
69961
69962
69963             var tagClasses = function(selection) {
69964                 selection.each(function tagClassesEach(entity) {
69965                     var value = this.className;
69966
69967                     if (value.baseVal !== undefined) {
69968                         value = value.baseVal;
69969                     }
69970
69971                     var t = _tags(entity);
69972
69973                     var computed = tagClasses.getClassesString(t, value, entity);
69974
69975                     if (computed !== value) {
69976                         d3_select(this).attr('class', computed);
69977                     }
69978                 });
69979             };
69980
69981
69982             tagClasses.getClassesString = function(t, value, entity) {
69983                 var primary, status;
69984                 var i, k, v;
69985
69986                 // in some situations we want to render perimeter strokes a certain way
69987                 var overrideGeometry;
69988                 if (/\bstroke\b/.test(value)) {
69989                     if (!!t.barrier && t.barrier !== 'no') {
69990                         overrideGeometry = 'line';
69991                     } else if (t.type === 'multipolygon' && !entity.hasInterestingTags()) {
69992                         overrideGeometry = 'area';
69993                     }
69994                 }
69995
69996                 // preserve base classes (nothing with `tag-`)
69997                 var classes = value.trim().split(/\s+/)
69998                     .filter(function(klass) {
69999                         return klass.length && !/^tag-/.test(klass);
70000                     })
70001                     .map(function(klass) {  // special overrides for some perimeter strokes
70002                         return (klass === 'line' || klass === 'area') ? (overrideGeometry || klass) : klass;
70003                     });
70004
70005                 // pick at most one primary classification tag..
70006                 for (i = 0; i < primaries.length; i++) {
70007                     k = primaries[i];
70008                     v = t[k];
70009                     if (!v || v === 'no') continue;
70010
70011                     if (k === 'piste:type') {  // avoid a ':' in the class name
70012                         k = 'piste';
70013                     } else if (k === 'building:part') {  // avoid a ':' in the class name
70014                         k = 'building_part';
70015                     }
70016
70017                     primary = k;
70018                     if (statuses.indexOf(v) !== -1) {   // e.g. `railway=abandoned`
70019                         status = v;
70020                         classes.push('tag-' + k);
70021                     } else {
70022                         classes.push('tag-' + k);
70023                         classes.push('tag-' + k + '-' + v);
70024                     }
70025
70026                     break;
70027                 }
70028
70029                 // add at most one status tag, only if relates to primary tag..
70030                 if (!status) {
70031                     for (i = 0; i < statuses.length; i++) {
70032                         k = statuses[i];
70033                         v = t[k];
70034                         if (!v || v === 'no') continue;
70035
70036                         if (v === 'yes') {   // e.g. `railway=rail + abandoned=yes`
70037                             status = k;
70038                         }
70039                         else if (primary && primary === v) {  // e.g. `railway=rail + abandoned=railway`
70040                             status = k;
70041                         } else if (!primary && primaries.indexOf(v) !== -1) {  // e.g. `abandoned=railway`
70042                             status = k;
70043                             primary = v;
70044                             classes.push('tag-' + v);
70045                         }  // else ignore e.g.  `highway=path + abandoned=railway`
70046
70047                         if (status) break;
70048                     }
70049                 }
70050
70051                 if (status) {
70052                     classes.push('tag-status');
70053                     classes.push('tag-status-' + status);
70054                 }
70055
70056                 // add any secondary tags
70057                 for (i = 0; i < secondaries.length; i++) {
70058                     k = secondaries[i];
70059                     v = t[k];
70060                     if (!v || v === 'no' || k === primary) continue;
70061                     classes.push('tag-' + k);
70062                     classes.push('tag-' + k + '-' + v);
70063                 }
70064
70065                 // For highways, look for surface tagging..
70066                 if (primary === 'highway' || primary === 'aeroway') {
70067                     var paved = (t.highway !== 'track');
70068                     for (k in t) {
70069                         v = t[k];
70070                         if (k in osmPavedTags) {
70071                             paved = !!osmPavedTags[k][v];
70072                             break;
70073                         }
70074                     }
70075                     if (!paved) {
70076                         classes.push('tag-unpaved');
70077                     }
70078                 }
70079
70080                 // If this is a wikidata-tagged item, add a class for that..
70081                 if (t.wikidata || t['brand:wikidata']) {
70082                     classes.push('tag-wikidata');
70083                 }
70084
70085                 return classes.join(' ').trim();
70086             };
70087
70088
70089             tagClasses.tags = function(val) {
70090                 if (!arguments.length) return _tags;
70091                 _tags = val;
70092                 return tagClasses;
70093             };
70094
70095             return tagClasses;
70096         }
70097
70098         function svgAreas(projection, context) {
70099             // Patterns only work in Firefox when set directly on element.
70100             // (This is not a bug: https://bugzilla.mozilla.org/show_bug.cgi?id=750632)
70101             var patterns = {
70102                 // tag - pattern name
70103                 // -or-
70104                 // tag - value - pattern name
70105                 // -or-
70106                 // tag - value - rules (optional tag-values, pattern name)
70107                 // (matches earlier rules first, so fallback should be last entry)
70108                 amenity: {
70109                     grave_yard: 'cemetery',
70110                     fountain: 'water_standing'
70111                 },
70112                 landuse: {
70113                     cemetery: [
70114                         { religion: 'christian', pattern: 'cemetery_christian' },
70115                         { religion: 'buddhist', pattern: 'cemetery_buddhist' },
70116                         { religion: 'muslim', pattern: 'cemetery_muslim' },
70117                         { religion: 'jewish', pattern: 'cemetery_jewish' },
70118                         { pattern: 'cemetery' }
70119                     ],
70120                     construction: 'construction',
70121                     farmland: 'farmland',
70122                     farmyard: 'farmyard',
70123                     forest: [
70124                         { leaf_type: 'broadleaved', pattern: 'forest_broadleaved' },
70125                         { leaf_type: 'needleleaved', pattern: 'forest_needleleaved' },
70126                         { leaf_type: 'leafless', pattern: 'forest_leafless' },
70127                         { pattern: 'forest' } // same as 'leaf_type:mixed'
70128                     ],
70129                     grave_yard: 'cemetery',
70130                     grass: 'grass',
70131                     landfill: 'landfill',
70132                     meadow: 'meadow',
70133                     military: 'construction',
70134                     orchard: 'orchard',
70135                     quarry: 'quarry',
70136                     vineyard: 'vineyard'
70137                 },
70138                 natural: {
70139                     beach: 'beach',
70140                     grassland: 'grass',
70141                     sand: 'beach',
70142                     scrub: 'scrub',
70143                     water: [
70144                         { water: 'pond', pattern: 'pond' },
70145                         { water: 'reservoir', pattern: 'water_standing' },
70146                         { pattern: 'waves' }
70147                     ],
70148                     wetland: [
70149                         { wetland: 'marsh', pattern: 'wetland_marsh' },
70150                         { wetland: 'swamp', pattern: 'wetland_swamp' },
70151                         { wetland: 'bog', pattern: 'wetland_bog' },
70152                         { wetland: 'reedbed', pattern: 'wetland_reedbed' },
70153                         { pattern: 'wetland' }
70154                     ],
70155                     wood: [
70156                         { leaf_type: 'broadleaved', pattern: 'forest_broadleaved' },
70157                         { leaf_type: 'needleleaved', pattern: 'forest_needleleaved' },
70158                         { leaf_type: 'leafless', pattern: 'forest_leafless' },
70159                         { pattern: 'forest' } // same as 'leaf_type:mixed'
70160                     ]
70161                 },
70162                 traffic_calming: {
70163                     island: [
70164                         { surface: 'grass', pattern: 'grass' },
70165                     ],
70166                     chicane: [
70167                         { surface: 'grass', pattern: 'grass' },
70168                     ],
70169                     choker: [
70170                         { surface: 'grass', pattern: 'grass' },
70171                     ]
70172                 }
70173             };
70174
70175             function setPattern(entity) {
70176                 // Skip pattern filling if this is a building (buildings don't get patterns applied)
70177                 if (entity.tags.building && entity.tags.building !== 'no') {
70178                     this.style.fill = this.style.stroke = '';
70179                     return;
70180                 }
70181
70182                 for (var tag in patterns) {
70183                     var entityValue = entity.tags[tag];
70184                     if (!entityValue) continue;
70185
70186                     if (typeof patterns[tag] === 'string') { // extra short syntax (just tag) - pattern name
70187                         this.style.fill = this.style.stroke = 'url("#pattern-' + patterns[tag] + '")';
70188                         return;
70189                     } else {
70190                         var values = patterns[tag];
70191                         for (var value in values) {
70192                             if (entityValue !== value) continue;
70193
70194                             var rules = values[value];
70195                             if (typeof rules === 'string') { // short syntax - pattern name
70196                                 this.style.fill = this.style.stroke = 'url("#pattern-' + rules + '")';
70197                                 return;
70198                             } else { // long syntax - rule array
70199                                 for (var ruleKey in rules) {
70200                                     var rule = rules[ruleKey];
70201
70202                                     var pass = true;
70203                                     for (var criterion in rule) {
70204                                         if (criterion !== 'pattern') { // reserved for pattern name
70205                                             // The only rule is a required tag-value pair
70206                                             var v = entity.tags[criterion];
70207                                             if (!v || v !== rule[criterion]) {
70208                                                 pass = false;
70209                                                 break;
70210                                             }
70211                                         }
70212                                     }
70213
70214                                     if (pass) {
70215                                         this.style.fill = this.style.stroke = 'url("#pattern-' + rule.pattern + '")';
70216                                         return;
70217                                     }
70218                                 }
70219                             }
70220                         }
70221                     }
70222                 }
70223
70224                 this.style.fill = this.style.stroke = '';
70225             }
70226
70227
70228             function drawTargets(selection, graph, entities, filter) {
70229                 var targetClass = context.getDebug('target') ? 'pink ' : 'nocolor ';
70230                 var nopeClass = context.getDebug('target') ? 'red ' : 'nocolor ';
70231                 var getPath = svgPath(projection).geojson;
70232                 var activeID = context.activeID();
70233
70234                 // The targets and nopes will be MultiLineString sub-segments of the ways
70235                 var data = { targets: [], nopes: [] };
70236
70237                 entities.forEach(function(way) {
70238                     var features = svgSegmentWay(way, graph, activeID);
70239                     data.targets.push.apply(data.targets, features.passive);
70240                     data.nopes.push.apply(data.nopes, features.active);
70241                 });
70242
70243
70244                 // Targets allow hover and vertex snapping
70245                 var targetData = data.targets.filter(getPath);
70246                 var targets = selection.selectAll('.area.target-allowed')
70247                     .filter(function(d) { return filter(d.properties.entity); })
70248                     .data(targetData, function key(d) { return d.id; });
70249
70250                 // exit
70251                 targets.exit()
70252                     .remove();
70253
70254                 // enter/update
70255                 targets.enter()
70256                     .append('path')
70257                     .merge(targets)
70258                     .attr('d', getPath)
70259                     .attr('class', function(d) { return 'way area target target-allowed ' + targetClass + d.id; });
70260
70261
70262                 // NOPE
70263                 var nopeData = data.nopes.filter(getPath);
70264                 var nopes = selection.selectAll('.area.target-nope')
70265                     .filter(function(d) { return filter(d.properties.entity); })
70266                     .data(nopeData, function key(d) { return d.id; });
70267
70268                 // exit
70269                 nopes.exit()
70270                     .remove();
70271
70272                 // enter/update
70273                 nopes.enter()
70274                     .append('path')
70275                     .merge(nopes)
70276                     .attr('d', getPath)
70277                     .attr('class', function(d) { return 'way area target target-nope ' + nopeClass + d.id; });
70278             }
70279
70280
70281             function drawAreas(selection, graph, entities, filter) {
70282                 var path = svgPath(projection, graph, true);
70283                 var areas = {};
70284                 var multipolygon;
70285
70286                 for (var i = 0; i < entities.length; i++) {
70287                     var entity = entities[i];
70288                     if (entity.geometry(graph) !== 'area') continue;
70289
70290                     multipolygon = osmIsOldMultipolygonOuterMember(entity, graph);
70291                     if (multipolygon) {
70292                         areas[multipolygon.id] = {
70293                             entity: multipolygon.mergeTags(entity.tags),
70294                             area: Math.abs(entity.area(graph))
70295                         };
70296                     } else if (!areas[entity.id]) {
70297                         areas[entity.id] = {
70298                             entity: entity,
70299                             area: Math.abs(entity.area(graph))
70300                         };
70301                     }
70302                 }
70303
70304                 var fills = Object.values(areas).filter(function hasPath(a) { return path(a.entity); });
70305                 fills.sort(function areaSort(a, b) { return b.area - a.area; });
70306                 fills = fills.map(function(a) { return a.entity; });
70307
70308                 var strokes = fills.filter(function(area) { return area.type === 'way'; });
70309
70310                 var data = {
70311                     clip: fills,
70312                     shadow: strokes,
70313                     stroke: strokes,
70314                     fill: fills
70315                 };
70316
70317                 var clipPaths = context.surface().selectAll('defs').selectAll('.clipPath-osm')
70318                    .filter(filter)
70319                    .data(data.clip, osmEntity.key);
70320
70321                 clipPaths.exit()
70322                    .remove();
70323
70324                 var clipPathsEnter = clipPaths.enter()
70325                    .append('clipPath')
70326                    .attr('class', 'clipPath-osm')
70327                    .attr('id', function(entity) { return entity.id + '-clippath'; });
70328
70329                 clipPathsEnter
70330                    .append('path');
70331
70332                 clipPaths.merge(clipPathsEnter)
70333                    .selectAll('path')
70334                    .attr('d', path);
70335
70336
70337                 var drawLayer = selection.selectAll('.layer-osm.areas');
70338                 var touchLayer = selection.selectAll('.layer-touch.areas');
70339
70340                 // Draw areas..
70341                 var areagroup = drawLayer
70342                     .selectAll('g.areagroup')
70343                     .data(['fill', 'shadow', 'stroke']);
70344
70345                 areagroup = areagroup.enter()
70346                     .append('g')
70347                     .attr('class', function(d) { return 'areagroup area-' + d; })
70348                     .merge(areagroup);
70349
70350                 var paths = areagroup
70351                     .selectAll('path')
70352                     .filter(filter)
70353                     .data(function(layer) { return data[layer]; }, osmEntity.key);
70354
70355                 paths.exit()
70356                     .remove();
70357
70358
70359                 var fillpaths = selection.selectAll('.area-fill path.area').nodes();
70360                 var bisect = d3_bisector(function(node) { return -node.__data__.area(graph); }).left;
70361
70362                 function sortedByArea(entity) {
70363                     if (this._parent.__data__ === 'fill') {
70364                         return fillpaths[bisect(fillpaths, -entity.area(graph))];
70365                     }
70366                 }
70367
70368                 paths = paths.enter()
70369                     .insert('path', sortedByArea)
70370                     .merge(paths)
70371                     .each(function(entity) {
70372                         var layer = this.parentNode.__data__;
70373                         this.setAttribute('class', entity.type + ' area ' + layer + ' ' + entity.id);
70374
70375                         if (layer === 'fill') {
70376                             this.setAttribute('clip-path', 'url(#' + entity.id + '-clippath)');
70377                             setPattern.call(this, entity);
70378                         }
70379                     })
70380                     .call(svgTagClasses())
70381                     .attr('d', path);
70382
70383
70384                 // Draw touch targets..
70385                 touchLayer
70386                     .call(drawTargets, graph, data.stroke, filter);
70387             }
70388
70389             return drawAreas;
70390         }
70391
70392         //[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]
70393         //[4a]          NameChar           ::=          NameStartChar | "-" | "." | [0-9] | #xB7 | [#x0300-#x036F] | [#x203F-#x2040]
70394         //[5]           Name       ::=          NameStartChar (NameChar)*
70395         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
70396         var nameChar = new RegExp("[\\-\\.0-9"+nameStartChar.source.slice(1,-1)+"\\u00B7\\u0300-\\u036F\\u203F-\\u2040]");
70397         var tagNamePattern = new RegExp('^'+nameStartChar.source+nameChar.source+'*(?:\:'+nameStartChar.source+nameChar.source+'*)?$');
70398         //var tagNamePattern = /^[a-zA-Z_][\w\-\.]*(?:\:[a-zA-Z_][\w\-\.]*)?$/
70399         //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(',')
70400
70401         //S_TAG,        S_ATTR, S_EQ,   S_ATTR_NOQUOT_VALUE
70402         //S_ATTR_SPACE, S_ATTR_END,     S_TAG_SPACE, S_TAG_CLOSE
70403         var S_TAG = 0;//tag name offerring
70404         var S_ATTR = 1;//attr name offerring 
70405         var S_ATTR_SPACE=2;//attr name end and space offer
70406         var S_EQ = 3;//=space?
70407         var S_ATTR_NOQUOT_VALUE = 4;//attr value(no quot value only)
70408         var S_ATTR_END = 5;//attr value end and no space(quot end)
70409         var S_TAG_SPACE = 6;//(attr value end || tag end ) && (space offer)
70410         var S_TAG_CLOSE = 7;//closed el<el />
70411
70412         function XMLReader(){
70413                 
70414         }
70415
70416         XMLReader.prototype = {
70417                 parse:function(source,defaultNSMap,entityMap){
70418                         var domBuilder = this.domBuilder;
70419                         domBuilder.startDocument();
70420                         _copy(defaultNSMap ,defaultNSMap = {});
70421                         parse(source,defaultNSMap,entityMap,
70422                                         domBuilder,this.errorHandler);
70423                         domBuilder.endDocument();
70424                 }
70425         };
70426         function parse(source,defaultNSMapCopy,entityMap,domBuilder,errorHandler){
70427                 function fixedFromCharCode(code) {
70428                         // String.prototype.fromCharCode does not supports
70429                         // > 2 bytes unicode chars directly
70430                         if (code > 0xffff) {
70431                                 code -= 0x10000;
70432                                 var surrogate1 = 0xd800 + (code >> 10)
70433                                         , surrogate2 = 0xdc00 + (code & 0x3ff);
70434
70435                                 return String.fromCharCode(surrogate1, surrogate2);
70436                         } else {
70437                                 return String.fromCharCode(code);
70438                         }
70439                 }
70440                 function entityReplacer(a){
70441                         var k = a.slice(1,-1);
70442                         if(k in entityMap){
70443                                 return entityMap[k]; 
70444                         }else if(k.charAt(0) === '#'){
70445                                 return fixedFromCharCode(parseInt(k.substr(1).replace('x','0x')))
70446                         }else{
70447                                 errorHandler.error('entity not found:'+a);
70448                                 return a;
70449                         }
70450                 }
70451                 function appendText(end){//has some bugs
70452                         if(end>start){
70453                                 var xt = source.substring(start,end).replace(/&#?\w+;/g,entityReplacer);
70454                                 locator&&position(start);
70455                                 domBuilder.characters(xt,0,end-start);
70456                                 start = end;
70457                         }
70458                 }
70459                 function position(p,m){
70460                         while(p>=lineEnd && (m = linePattern.exec(source))){
70461                                 lineStart = m.index;
70462                                 lineEnd = lineStart + m[0].length;
70463                                 locator.lineNumber++;
70464                                 //console.log('line++:',locator,startPos,endPos)
70465                         }
70466                         locator.columnNumber = p-lineStart+1;
70467                 }
70468                 var lineStart = 0;
70469                 var lineEnd = 0;
70470                 var linePattern = /.*(?:\r\n?|\n)|.*$/g;
70471                 var locator = domBuilder.locator;
70472                 
70473                 var parseStack = [{currentNSMap:defaultNSMapCopy}];
70474                 var closeMap = {};
70475                 var start = 0;
70476                 while(true){
70477                         try{
70478                                 var tagStart = source.indexOf('<',start);
70479                                 if(tagStart<0){
70480                                         if(!source.substr(start).match(/^\s*$/)){
70481                                                 var doc = domBuilder.doc;
70482                                         var text = doc.createTextNode(source.substr(start));
70483                                         doc.appendChild(text);
70484                                         domBuilder.currentElement = text;
70485                                         }
70486                                         return;
70487                                 }
70488                                 if(tagStart>start){
70489                                         appendText(tagStart);
70490                                 }
70491                                 switch(source.charAt(tagStart+1)){
70492                                 case '/':
70493                                         var end = source.indexOf('>',tagStart+3);
70494                                         var tagName = source.substring(tagStart+2,end);
70495                                         var config = parseStack.pop();
70496                                         if(end<0){
70497                                                 
70498                                         tagName = source.substring(tagStart+2).replace(/[\s<].*/,'');
70499                                         //console.error('#@@@@@@'+tagName)
70500                                         errorHandler.error("end tag name: "+tagName+' is not complete:'+config.tagName);
70501                                         end = tagStart+1+tagName.length;
70502                                 }else if(tagName.match(/\s</)){
70503                                         tagName = tagName.replace(/[\s<].*/,'');
70504                                         errorHandler.error("end tag name: "+tagName+' maybe not complete');
70505                                         end = tagStart+1+tagName.length;
70506                                         }
70507                                         //console.error(parseStack.length,parseStack)
70508                                         //console.error(config);
70509                                         var localNSMap = config.localNSMap;
70510                                         var endMatch = config.tagName == tagName;
70511                                         var endIgnoreCaseMach = endMatch || config.tagName&&config.tagName.toLowerCase() == tagName.toLowerCase();
70512                                 if(endIgnoreCaseMach){
70513                                         domBuilder.endElement(config.uri,config.localName,tagName);
70514                                                 if(localNSMap){
70515                                                         for(var prefix in localNSMap){
70516                                                                 domBuilder.endPrefixMapping(prefix) ;
70517                                                         }
70518                                                 }
70519                                                 if(!endMatch){
70520                                         errorHandler.fatalError("end tag name: "+tagName+' is not match the current start tagName:'+config.tagName );
70521                                                 }
70522                                 }else{
70523                                         parseStack.push(config);
70524                                 }
70525                                         
70526                                         end++;
70527                                         break;
70528                                         // end elment
70529                                 case '?':// <?...?>
70530                                         locator&&position(tagStart);
70531                                         end = parseInstruction(source,tagStart,domBuilder);
70532                                         break;
70533                                 case '!':// <!doctype,<![CDATA,<!--
70534                                         locator&&position(tagStart);
70535                                         end = parseDCC(source,tagStart,domBuilder,errorHandler);
70536                                         break;
70537                                 default:
70538                                         locator&&position(tagStart);
70539                                         var el = new ElementAttributes();
70540                                         var currentNSMap = parseStack[parseStack.length-1].currentNSMap;
70541                                         //elStartEnd
70542                                         var end = parseElementStartPart(source,tagStart,el,currentNSMap,entityReplacer,errorHandler);
70543                                         var len = el.length;
70544                                         
70545                                         
70546                                         if(!el.closed && fixSelfClosed(source,end,el.tagName,closeMap)){
70547                                                 el.closed = true;
70548                                                 if(!entityMap.nbsp){
70549                                                         errorHandler.warning('unclosed xml attribute');
70550                                                 }
70551                                         }
70552                                         if(locator && len){
70553                                                 var locator2 = copyLocator(locator,{});
70554                                                 //try{//attribute position fixed
70555                                                 for(var i = 0;i<len;i++){
70556                                                         var a = el[i];
70557                                                         position(a.offset);
70558                                                         a.locator = copyLocator(locator,{});
70559                                                 }
70560                                                 //}catch(e){console.error('@@@@@'+e)}
70561                                                 domBuilder.locator = locator2;
70562                                                 if(appendElement(el,domBuilder,currentNSMap)){
70563                                                         parseStack.push(el);
70564                                                 }
70565                                                 domBuilder.locator = locator;
70566                                         }else{
70567                                                 if(appendElement(el,domBuilder,currentNSMap)){
70568                                                         parseStack.push(el);
70569                                                 }
70570                                         }
70571                                         
70572                                         
70573                                         
70574                                         if(el.uri === 'http://www.w3.org/1999/xhtml' && !el.closed){
70575                                                 end = parseHtmlSpecialContent(source,end,el.tagName,entityReplacer,domBuilder);
70576                                         }else{
70577                                                 end++;
70578                                         }
70579                                 }
70580                         }catch(e){
70581                                 errorHandler.error('element parse error: '+e);
70582                                 //errorHandler.error('element parse error: '+e);
70583                                 end = -1;
70584                                 //throw e;
70585                         }
70586                         if(end>start){
70587                                 start = end;
70588                         }else{
70589                                 //TODO: 这里有可能sax回退,有位置错误风险
70590                                 appendText(Math.max(tagStart,start)+1);
70591                         }
70592                 }
70593         }
70594         function copyLocator(f,t){
70595                 t.lineNumber = f.lineNumber;
70596                 t.columnNumber = f.columnNumber;
70597                 return t;
70598         }
70599
70600         /**
70601          * @see #appendElement(source,elStartEnd,el,selfClosed,entityReplacer,domBuilder,parseStack);
70602          * @return end of the elementStartPart(end of elementEndPart for selfClosed el)
70603          */
70604         function parseElementStartPart(source,start,el,currentNSMap,entityReplacer,errorHandler){
70605                 var attrName;
70606                 var value;
70607                 var p = ++start;
70608                 var s = S_TAG;//status
70609                 while(true){
70610                         var c = source.charAt(p);
70611                         switch(c){
70612                         case '=':
70613                                 if(s === S_ATTR){//attrName
70614                                         attrName = source.slice(start,p);
70615                                         s = S_EQ;
70616                                 }else if(s === S_ATTR_SPACE){
70617                                         s = S_EQ;
70618                                 }else{
70619                                         //fatalError: equal must after attrName or space after attrName
70620                                         throw new Error('attribute equal must after attrName');
70621                                 }
70622                                 break;
70623                         case '\'':
70624                         case '"':
70625                                 if(s === S_EQ || s === S_ATTR //|| s == S_ATTR_SPACE
70626                                         ){//equal
70627                                         if(s === S_ATTR){
70628                                                 errorHandler.warning('attribute value must after "="');
70629                                                 attrName = source.slice(start,p);
70630                                         }
70631                                         start = p+1;
70632                                         p = source.indexOf(c,start);
70633                                         if(p>0){
70634                                                 value = source.slice(start,p).replace(/&#?\w+;/g,entityReplacer);
70635                                                 el.add(attrName,value,start-1);
70636                                                 s = S_ATTR_END;
70637                                         }else{
70638                                                 //fatalError: no end quot match
70639                                                 throw new Error('attribute value no end \''+c+'\' match');
70640                                         }
70641                                 }else if(s == S_ATTR_NOQUOT_VALUE){
70642                                         value = source.slice(start,p).replace(/&#?\w+;/g,entityReplacer);
70643                                         //console.log(attrName,value,start,p)
70644                                         el.add(attrName,value,start);
70645                                         //console.dir(el)
70646                                         errorHandler.warning('attribute "'+attrName+'" missed start quot('+c+')!!');
70647                                         start = p+1;
70648                                         s = S_ATTR_END;
70649                                 }else{
70650                                         //fatalError: no equal before
70651                                         throw new Error('attribute value must after "="');
70652                                 }
70653                                 break;
70654                         case '/':
70655                                 switch(s){
70656                                 case S_TAG:
70657                                         el.setTagName(source.slice(start,p));
70658                                 case S_ATTR_END:
70659                                 case S_TAG_SPACE:
70660                                 case S_TAG_CLOSE:
70661                                         s =S_TAG_CLOSE;
70662                                         el.closed = true;
70663                                 case S_ATTR_NOQUOT_VALUE:
70664                                 case S_ATTR:
70665                                 case S_ATTR_SPACE:
70666                                         break;
70667                                 //case S_EQ:
70668                                 default:
70669                                         throw new Error("attribute invalid close char('/')")
70670                                 }
70671                                 break;
70672                         case ''://end document
70673                                 //throw new Error('unexpected end of input')
70674                                 errorHandler.error('unexpected end of input');
70675                                 if(s == S_TAG){
70676                                         el.setTagName(source.slice(start,p));
70677                                 }
70678                                 return p;
70679                         case '>':
70680                                 switch(s){
70681                                 case S_TAG:
70682                                         el.setTagName(source.slice(start,p));
70683                                 case S_ATTR_END:
70684                                 case S_TAG_SPACE:
70685                                 case S_TAG_CLOSE:
70686                                         break;//normal
70687                                 case S_ATTR_NOQUOT_VALUE://Compatible state
70688                                 case S_ATTR:
70689                                         value = source.slice(start,p);
70690                                         if(value.slice(-1) === '/'){
70691                                                 el.closed  = true;
70692                                                 value = value.slice(0,-1);
70693                                         }
70694                                 case S_ATTR_SPACE:
70695                                         if(s === S_ATTR_SPACE){
70696                                                 value = attrName;
70697                                         }
70698                                         if(s == S_ATTR_NOQUOT_VALUE){
70699                                                 errorHandler.warning('attribute "'+value+'" missed quot(")!!');
70700                                                 el.add(attrName,value.replace(/&#?\w+;/g,entityReplacer),start);
70701                                         }else{
70702                                                 if(currentNSMap[''] !== 'http://www.w3.org/1999/xhtml' || !value.match(/^(?:disabled|checked|selected)$/i)){
70703                                                         errorHandler.warning('attribute "'+value+'" missed value!! "'+value+'" instead!!');
70704                                                 }
70705                                                 el.add(value,value,start);
70706                                         }
70707                                         break;
70708                                 case S_EQ:
70709                                         throw new Error('attribute value missed!!');
70710                                 }
70711         //                      console.log(tagName,tagNamePattern,tagNamePattern.test(tagName))
70712                                 return p;
70713                         /*xml space '\x20' | #x9 | #xD | #xA; */
70714                         case '\u0080':
70715                                 c = ' ';
70716                         default:
70717                                 if(c<= ' '){//space
70718                                         switch(s){
70719                                         case S_TAG:
70720                                                 el.setTagName(source.slice(start,p));//tagName
70721                                                 s = S_TAG_SPACE;
70722                                                 break;
70723                                         case S_ATTR:
70724                                                 attrName = source.slice(start,p);
70725                                                 s = S_ATTR_SPACE;
70726                                                 break;
70727                                         case S_ATTR_NOQUOT_VALUE:
70728                                                 var value = source.slice(start,p).replace(/&#?\w+;/g,entityReplacer);
70729                                                 errorHandler.warning('attribute "'+value+'" missed quot(")!!');
70730                                                 el.add(attrName,value,start);
70731                                         case S_ATTR_END:
70732                                                 s = S_TAG_SPACE;
70733                                                 break;
70734                                         //case S_TAG_SPACE:
70735                                         //case S_EQ:
70736                                         //case S_ATTR_SPACE:
70737                                         //      void();break;
70738                                         //case S_TAG_CLOSE:
70739                                                 //ignore warning
70740                                         }
70741                                 }else{//not space
70742         //S_TAG,        S_ATTR, S_EQ,   S_ATTR_NOQUOT_VALUE
70743         //S_ATTR_SPACE, S_ATTR_END,     S_TAG_SPACE, S_TAG_CLOSE
70744                                         switch(s){
70745                                         //case S_TAG:void();break;
70746                                         //case S_ATTR:void();break;
70747                                         //case S_ATTR_NOQUOT_VALUE:void();break;
70748                                         case S_ATTR_SPACE:
70749                                                 var tagName =  el.tagName;
70750                                                 if(currentNSMap[''] !== 'http://www.w3.org/1999/xhtml' || !attrName.match(/^(?:disabled|checked|selected)$/i)){
70751                                                         errorHandler.warning('attribute "'+attrName+'" missed value!! "'+attrName+'" instead2!!');
70752                                                 }
70753                                                 el.add(attrName,attrName,start);
70754                                                 start = p;
70755                                                 s = S_ATTR;
70756                                                 break;
70757                                         case S_ATTR_END:
70758                                                 errorHandler.warning('attribute space is required"'+attrName+'"!!');
70759                                         case S_TAG_SPACE:
70760                                                 s = S_ATTR;
70761                                                 start = p;
70762                                                 break;
70763                                         case S_EQ:
70764                                                 s = S_ATTR_NOQUOT_VALUE;
70765                                                 start = p;
70766                                                 break;
70767                                         case S_TAG_CLOSE:
70768                                                 throw new Error("elements closed character '/' and '>' must be connected to");
70769                                         }
70770                                 }
70771                         }//end outer switch
70772                         //console.log('p++',p)
70773                         p++;
70774                 }
70775         }
70776         /**
70777          * @return true if has new namespace define
70778          */
70779         function appendElement(el,domBuilder,currentNSMap){
70780                 var tagName = el.tagName;
70781                 var localNSMap = null;
70782                 //var currentNSMap = parseStack[parseStack.length-1].currentNSMap;
70783                 var i = el.length;
70784                 while(i--){
70785                         var a = el[i];
70786                         var qName = a.qName;
70787                         var value = a.value;
70788                         var nsp = qName.indexOf(':');
70789                         if(nsp>0){
70790                                 var prefix = a.prefix = qName.slice(0,nsp);
70791                                 var localName = qName.slice(nsp+1);
70792                                 var nsPrefix = prefix === 'xmlns' && localName;
70793                         }else{
70794                                 localName = qName;
70795                                 prefix = null;
70796                                 nsPrefix = qName === 'xmlns' && '';
70797                         }
70798                         //can not set prefix,because prefix !== ''
70799                         a.localName = localName ;
70800                         //prefix == null for no ns prefix attribute 
70801                         if(nsPrefix !== false){//hack!!
70802                                 if(localNSMap == null){
70803                                         localNSMap = {};
70804                                         //console.log(currentNSMap,0)
70805                                         _copy(currentNSMap,currentNSMap={});
70806                                         //console.log(currentNSMap,1)
70807                                 }
70808                                 currentNSMap[nsPrefix] = localNSMap[nsPrefix] = value;
70809                                 a.uri = 'http://www.w3.org/2000/xmlns/';
70810                                 domBuilder.startPrefixMapping(nsPrefix, value); 
70811                         }
70812                 }
70813                 var i = el.length;
70814                 while(i--){
70815                         a = el[i];
70816                         var prefix = a.prefix;
70817                         if(prefix){//no prefix attribute has no namespace
70818                                 if(prefix === 'xml'){
70819                                         a.uri = 'http://www.w3.org/XML/1998/namespace';
70820                                 }if(prefix !== 'xmlns'){
70821                                         a.uri = currentNSMap[prefix || ''];
70822                                         
70823                                         //{console.log('###'+a.qName,domBuilder.locator.systemId+'',currentNSMap,a.uri)}
70824                                 }
70825                         }
70826                 }
70827                 var nsp = tagName.indexOf(':');
70828                 if(nsp>0){
70829                         prefix = el.prefix = tagName.slice(0,nsp);
70830                         localName = el.localName = tagName.slice(nsp+1);
70831                 }else{
70832                         prefix = null;//important!!
70833                         localName = el.localName = tagName;
70834                 }
70835                 //no prefix element has default namespace
70836                 var ns = el.uri = currentNSMap[prefix || ''];
70837                 domBuilder.startElement(ns,localName,tagName,el);
70838                 //endPrefixMapping and startPrefixMapping have not any help for dom builder
70839                 //localNSMap = null
70840                 if(el.closed){
70841                         domBuilder.endElement(ns,localName,tagName);
70842                         if(localNSMap){
70843                                 for(prefix in localNSMap){
70844                                         domBuilder.endPrefixMapping(prefix); 
70845                                 }
70846                         }
70847                 }else{
70848                         el.currentNSMap = currentNSMap;
70849                         el.localNSMap = localNSMap;
70850                         //parseStack.push(el);
70851                         return true;
70852                 }
70853         }
70854         function parseHtmlSpecialContent(source,elStartEnd,tagName,entityReplacer,domBuilder){
70855                 if(/^(?:script|textarea)$/i.test(tagName)){
70856                         var elEndStart =  source.indexOf('</'+tagName+'>',elStartEnd);
70857                         var text = source.substring(elStartEnd+1,elEndStart);
70858                         if(/[&<]/.test(text)){
70859                                 if(/^script$/i.test(tagName)){
70860                                         //if(!/\]\]>/.test(text)){
70861                                                 //lexHandler.startCDATA();
70862                                                 domBuilder.characters(text,0,text.length);
70863                                                 //lexHandler.endCDATA();
70864                                                 return elEndStart;
70865                                         //}
70866                                 }//}else{//text area
70867                                         text = text.replace(/&#?\w+;/g,entityReplacer);
70868                                         domBuilder.characters(text,0,text.length);
70869                                         return elEndStart;
70870                                 //}
70871                                 
70872                         }
70873                 }
70874                 return elStartEnd+1;
70875         }
70876         function fixSelfClosed(source,elStartEnd,tagName,closeMap){
70877                 //if(tagName in closeMap){
70878                 var pos = closeMap[tagName];
70879                 if(pos == null){
70880                         //console.log(tagName)
70881                         pos =  source.lastIndexOf('</'+tagName+'>');
70882                         if(pos<elStartEnd){//忘记闭合
70883                                 pos = source.lastIndexOf('</'+tagName);
70884                         }
70885                         closeMap[tagName] =pos;
70886                 }
70887                 return pos<elStartEnd;
70888                 //} 
70889         }
70890         function _copy(source,target){
70891                 for(var n in source){target[n] = source[n];}
70892         }
70893         function parseDCC(source,start,domBuilder,errorHandler){//sure start with '<!'
70894                 var next= source.charAt(start+2);
70895                 switch(next){
70896                 case '-':
70897                         if(source.charAt(start + 3) === '-'){
70898                                 var end = source.indexOf('-->',start+4);
70899                                 //append comment source.substring(4,end)//<!--
70900                                 if(end>start){
70901                                         domBuilder.comment(source,start+4,end-start-4);
70902                                         return end+3;
70903                                 }else{
70904                                         errorHandler.error("Unclosed comment");
70905                                         return -1;
70906                                 }
70907                         }else{
70908                                 //error
70909                                 return -1;
70910                         }
70911                 default:
70912                         if(source.substr(start+3,6) == 'CDATA['){
70913                                 var end = source.indexOf(']]>',start+9);
70914                                 domBuilder.startCDATA();
70915                                 domBuilder.characters(source,start+9,end-start-9);
70916                                 domBuilder.endCDATA(); 
70917                                 return end+3;
70918                         }
70919                         //<!DOCTYPE
70920                         //startDTD(java.lang.String name, java.lang.String publicId, java.lang.String systemId) 
70921                         var matchs = split(source,start);
70922                         var len = matchs.length;
70923                         if(len>1 && /!doctype/i.test(matchs[0][0])){
70924                                 var name = matchs[1][0];
70925                                 var pubid = len>3 && /^public$/i.test(matchs[2][0]) && matchs[3][0];
70926                                 var sysid = len>4 && matchs[4][0];
70927                                 var lastMatch = matchs[len-1];
70928                                 domBuilder.startDTD(name,pubid && pubid.replace(/^(['"])(.*?)\1$/,'$2'),
70929                                                 sysid && sysid.replace(/^(['"])(.*?)\1$/,'$2'));
70930                                 domBuilder.endDTD();
70931                                 
70932                                 return lastMatch.index+lastMatch[0].length
70933                         }
70934                 }
70935                 return -1;
70936         }
70937
70938
70939
70940         function parseInstruction(source,start,domBuilder){
70941                 var end = source.indexOf('?>',start);
70942                 if(end){
70943                         var match = source.substring(start,end).match(/^<\?(\S*)\s*([\s\S]*?)\s*$/);
70944                         if(match){
70945                                 var len = match[0].length;
70946                                 domBuilder.processingInstruction(match[1], match[2]) ;
70947                                 return end+2;
70948                         }else{//error
70949                                 return -1;
70950                         }
70951                 }
70952                 return -1;
70953         }
70954
70955         /**
70956          * @param source
70957          */
70958         function ElementAttributes(source){
70959                 
70960         }
70961         ElementAttributes.prototype = {
70962                 setTagName:function(tagName){
70963                         if(!tagNamePattern.test(tagName)){
70964                                 throw new Error('invalid tagName:'+tagName)
70965                         }
70966                         this.tagName = tagName;
70967                 },
70968                 add:function(qName,value,offset){
70969                         if(!tagNamePattern.test(qName)){
70970                                 throw new Error('invalid attribute:'+qName)
70971                         }
70972                         this[this.length++] = {qName:qName,value:value,offset:offset};
70973                 },
70974                 length:0,
70975                 getLocalName:function(i){return this[i].localName},
70976                 getLocator:function(i){return this[i].locator},
70977                 getQName:function(i){return this[i].qName},
70978                 getURI:function(i){return this[i].uri},
70979                 getValue:function(i){return this[i].value}
70980         //      ,getIndex:function(uri, localName)){
70981         //              if(localName){
70982         //                      
70983         //              }else{
70984         //                      var qName = uri
70985         //              }
70986         //      },
70987         //      getValue:function(){return this.getValue(this.getIndex.apply(this,arguments))},
70988         //      getType:function(uri,localName){}
70989         //      getType:function(i){},
70990         };
70991
70992
70993
70994
70995         function _set_proto_(thiz,parent){
70996                 thiz.__proto__ = parent;
70997                 return thiz;
70998         }
70999         if(!(_set_proto_({},_set_proto_.prototype) instanceof _set_proto_)){
71000                 _set_proto_ = function(thiz,parent){
71001                         function p(){}          p.prototype = parent;
71002                         p = new p();
71003                         for(parent in thiz){
71004                                 p[parent] = thiz[parent];
71005                         }
71006                         return p;
71007                 };
71008         }
71009
71010         function split(source,start){
71011                 var match;
71012                 var buf = [];
71013                 var reg = /'[^']+'|"[^"]+"|[^\s<>\/=]+=?|(\/?\s*>|<)/g;
71014                 reg.lastIndex = start;
71015                 reg.exec(source);//skip <
71016                 while(match = reg.exec(source)){
71017                         buf.push(match);
71018                         if(match[1])return buf;
71019                 }
71020         }
71021
71022         var XMLReader_1 = XMLReader;
71023
71024         var sax = {
71025                 XMLReader: XMLReader_1
71026         };
71027
71028         /*
71029          * DOM Level 2
71030          * Object DOMException
71031          * @see http://www.w3.org/TR/REC-DOM-Level-1/ecma-script-language-binding.html
71032          * @see http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/ecma-script-binding.html
71033          */
71034
71035         function copy$3(src,dest){
71036                 for(var p in src){
71037                         dest[p] = src[p];
71038                 }
71039         }
71040         /**
71041         ^\w+\.prototype\.([_\w]+)\s*=\s*((?:.*\{\s*?[\r\n][\s\S]*?^})|\S.*?(?=[;\r\n]));?
71042         ^\w+\.prototype\.([_\w]+)\s*=\s*(\S.*?(?=[;\r\n]));?
71043          */
71044         function _extends(Class,Super){
71045                 var pt = Class.prototype;
71046                 if(Object.create){
71047                         var ppt = Object.create(Super.prototype);
71048                         pt.__proto__ = ppt;
71049                 }
71050                 if(!(pt instanceof Super)){
71051                         function t(){}          t.prototype = Super.prototype;
71052                         t = new t();
71053                         copy$3(pt,t);
71054                         Class.prototype = pt = t;
71055                 }
71056                 if(pt.constructor != Class){
71057                         if(typeof Class != 'function'){
71058                                 console.error("unknow Class:"+Class);
71059                         }
71060                         pt.constructor = Class;
71061                 }
71062         }
71063         var htmlns = 'http://www.w3.org/1999/xhtml' ;
71064         // Node Types
71065         var NodeType = {};
71066         var ELEMENT_NODE                = NodeType.ELEMENT_NODE                = 1;
71067         var ATTRIBUTE_NODE              = NodeType.ATTRIBUTE_NODE              = 2;
71068         var TEXT_NODE                   = NodeType.TEXT_NODE                   = 3;
71069         var CDATA_SECTION_NODE          = NodeType.CDATA_SECTION_NODE          = 4;
71070         var ENTITY_REFERENCE_NODE       = NodeType.ENTITY_REFERENCE_NODE       = 5;
71071         var ENTITY_NODE                 = NodeType.ENTITY_NODE                 = 6;
71072         var PROCESSING_INSTRUCTION_NODE = NodeType.PROCESSING_INSTRUCTION_NODE = 7;
71073         var COMMENT_NODE                = NodeType.COMMENT_NODE                = 8;
71074         var DOCUMENT_NODE               = NodeType.DOCUMENT_NODE               = 9;
71075         var DOCUMENT_TYPE_NODE          = NodeType.DOCUMENT_TYPE_NODE          = 10;
71076         var DOCUMENT_FRAGMENT_NODE      = NodeType.DOCUMENT_FRAGMENT_NODE      = 11;
71077         var NOTATION_NODE               = NodeType.NOTATION_NODE               = 12;
71078
71079         // ExceptionCode
71080         var ExceptionCode = {};
71081         var ExceptionMessage = {};
71082         var INDEX_SIZE_ERR              = ExceptionCode.INDEX_SIZE_ERR              = ((ExceptionMessage[1]="Index size error"),1);
71083         var DOMSTRING_SIZE_ERR          = ExceptionCode.DOMSTRING_SIZE_ERR          = ((ExceptionMessage[2]="DOMString size error"),2);
71084         var HIERARCHY_REQUEST_ERR       = ExceptionCode.HIERARCHY_REQUEST_ERR       = ((ExceptionMessage[3]="Hierarchy request error"),3);
71085         var WRONG_DOCUMENT_ERR          = ExceptionCode.WRONG_DOCUMENT_ERR          = ((ExceptionMessage[4]="Wrong document"),4);
71086         var INVALID_CHARACTER_ERR       = ExceptionCode.INVALID_CHARACTER_ERR       = ((ExceptionMessage[5]="Invalid character"),5);
71087         var NO_DATA_ALLOWED_ERR         = ExceptionCode.NO_DATA_ALLOWED_ERR         = ((ExceptionMessage[6]="No data allowed"),6);
71088         var NO_MODIFICATION_ALLOWED_ERR = ExceptionCode.NO_MODIFICATION_ALLOWED_ERR = ((ExceptionMessage[7]="No modification allowed"),7);
71089         var NOT_FOUND_ERR               = ExceptionCode.NOT_FOUND_ERR               = ((ExceptionMessage[8]="Not found"),8);
71090         var NOT_SUPPORTED_ERR           = ExceptionCode.NOT_SUPPORTED_ERR           = ((ExceptionMessage[9]="Not supported"),9);
71091         var INUSE_ATTRIBUTE_ERR         = ExceptionCode.INUSE_ATTRIBUTE_ERR         = ((ExceptionMessage[10]="Attribute in use"),10);
71092         //level2
71093         var INVALID_STATE_ERR           = ExceptionCode.INVALID_STATE_ERR               = ((ExceptionMessage[11]="Invalid state"),11);
71094         var SYNTAX_ERR                  = ExceptionCode.SYNTAX_ERR                      = ((ExceptionMessage[12]="Syntax error"),12);
71095         var INVALID_MODIFICATION_ERR    = ExceptionCode.INVALID_MODIFICATION_ERR        = ((ExceptionMessage[13]="Invalid modification"),13);
71096         var NAMESPACE_ERR               = ExceptionCode.NAMESPACE_ERR                   = ((ExceptionMessage[14]="Invalid namespace"),14);
71097         var INVALID_ACCESS_ERR          = ExceptionCode.INVALID_ACCESS_ERR              = ((ExceptionMessage[15]="Invalid access"),15);
71098
71099
71100         function DOMException$2(code, message) {
71101                 if(message instanceof Error){
71102                         var error = message;
71103                 }else{
71104                         error = this;
71105                         Error.call(this, ExceptionMessage[code]);
71106                         this.message = ExceptionMessage[code];
71107                         if(Error.captureStackTrace) Error.captureStackTrace(this, DOMException$2);
71108                 }
71109                 error.code = code;
71110                 if(message) this.message = this.message + ": " + message;
71111                 return error;
71112         }DOMException$2.prototype = Error.prototype;
71113         copy$3(ExceptionCode,DOMException$2);
71114         /**
71115          * @see http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-536297177
71116          * 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.
71117          * The items in the NodeList are accessible via an integral index, starting from 0.
71118          */
71119         function NodeList() {
71120         }NodeList.prototype = {
71121                 /**
71122                  * The number of nodes in the list. The range of valid child node indices is 0 to length-1 inclusive.
71123                  * @standard level1
71124                  */
71125                 length:0, 
71126                 /**
71127                  * 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.
71128                  * @standard level1
71129                  * @param index  unsigned long 
71130                  *   Index into the collection.
71131                  * @return Node
71132                  *      The node at the indexth position in the NodeList, or null if that is not a valid index. 
71133                  */
71134                 item: function(index) {
71135                         return this[index] || null;
71136                 },
71137                 toString:function(isHTML,nodeFilter){
71138                         for(var buf = [], i = 0;i<this.length;i++){
71139                                 serializeToString(this[i],buf,isHTML,nodeFilter);
71140                         }
71141                         return buf.join('');
71142                 }
71143         };
71144         function LiveNodeList(node,refresh){
71145                 this._node = node;
71146                 this._refresh = refresh;
71147                 _updateLiveList(this);
71148         }
71149         function _updateLiveList(list){
71150                 var inc = list._node._inc || list._node.ownerDocument._inc;
71151                 if(list._inc != inc){
71152                         var ls = list._refresh(list._node);
71153                         //console.log(ls.length)
71154                         __set__(list,'length',ls.length);
71155                         copy$3(ls,list);
71156                         list._inc = inc;
71157                 }
71158         }
71159         LiveNodeList.prototype.item = function(i){
71160                 _updateLiveList(this);
71161                 return this[i];
71162         };
71163
71164         _extends(LiveNodeList,NodeList);
71165         /**
71166          * 
71167          * 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.
71168          * NamedNodeMap objects in the DOM are live.
71169          * used for attributes or DocumentType entities 
71170          */
71171         function NamedNodeMap() {
71172         }
71173         function _findNodeIndex(list,node){
71174                 var i = list.length;
71175                 while(i--){
71176                         if(list[i] === node){return i}
71177                 }
71178         }
71179
71180         function _addNamedNode(el,list,newAttr,oldAttr){
71181                 if(oldAttr){
71182                         list[_findNodeIndex(list,oldAttr)] = newAttr;
71183                 }else{
71184                         list[list.length++] = newAttr;
71185                 }
71186                 if(el){
71187                         newAttr.ownerElement = el;
71188                         var doc = el.ownerDocument;
71189                         if(doc){
71190                                 oldAttr && _onRemoveAttribute(doc,el,oldAttr);
71191                                 _onAddAttribute(doc,el,newAttr);
71192                         }
71193                 }
71194         }
71195         function _removeNamedNode(el,list,attr){
71196                 //console.log('remove attr:'+attr)
71197                 var i = _findNodeIndex(list,attr);
71198                 if(i>=0){
71199                         var lastIndex = list.length-1;
71200                         while(i<lastIndex){
71201                                 list[i] = list[++i];
71202                         }
71203                         list.length = lastIndex;
71204                         if(el){
71205                                 var doc = el.ownerDocument;
71206                                 if(doc){
71207                                         _onRemoveAttribute(doc,el,attr);
71208                                         attr.ownerElement = null;
71209                                 }
71210                         }
71211                 }else{
71212                         throw DOMException$2(NOT_FOUND_ERR,new Error(el.tagName+'@'+attr))
71213                 }
71214         }
71215         NamedNodeMap.prototype = {
71216                 length:0,
71217                 item:NodeList.prototype.item,
71218                 getNamedItem: function(key) {
71219         //              if(key.indexOf(':')>0 || key == 'xmlns'){
71220         //                      return null;
71221         //              }
71222                         //console.log()
71223                         var i = this.length;
71224                         while(i--){
71225                                 var attr = this[i];
71226                                 //console.log(attr.nodeName,key)
71227                                 if(attr.nodeName == key){
71228                                         return attr;
71229                                 }
71230                         }
71231                 },
71232                 setNamedItem: function(attr) {
71233                         var el = attr.ownerElement;
71234                         if(el && el!=this._ownerElement){
71235                                 throw new DOMException$2(INUSE_ATTRIBUTE_ERR);
71236                         }
71237                         var oldAttr = this.getNamedItem(attr.nodeName);
71238                         _addNamedNode(this._ownerElement,this,attr,oldAttr);
71239                         return oldAttr;
71240                 },
71241                 /* returns Node */
71242                 setNamedItemNS: function(attr) {// raises: WRONG_DOCUMENT_ERR,NO_MODIFICATION_ALLOWED_ERR,INUSE_ATTRIBUTE_ERR
71243                         var el = attr.ownerElement, oldAttr;
71244                         if(el && el!=this._ownerElement){
71245                                 throw new DOMException$2(INUSE_ATTRIBUTE_ERR);
71246                         }
71247                         oldAttr = this.getNamedItemNS(attr.namespaceURI,attr.localName);
71248                         _addNamedNode(this._ownerElement,this,attr,oldAttr);
71249                         return oldAttr;
71250                 },
71251
71252                 /* returns Node */
71253                 removeNamedItem: function(key) {
71254                         var attr = this.getNamedItem(key);
71255                         _removeNamedNode(this._ownerElement,this,attr);
71256                         return attr;
71257                         
71258                         
71259                 },// raises: NOT_FOUND_ERR,NO_MODIFICATION_ALLOWED_ERR
71260                 
71261                 //for level2
71262                 removeNamedItemNS:function(namespaceURI,localName){
71263                         var attr = this.getNamedItemNS(namespaceURI,localName);
71264                         _removeNamedNode(this._ownerElement,this,attr);
71265                         return attr;
71266                 },
71267                 getNamedItemNS: function(namespaceURI, localName) {
71268                         var i = this.length;
71269                         while(i--){
71270                                 var node = this[i];
71271                                 if(node.localName == localName && node.namespaceURI == namespaceURI){
71272                                         return node;
71273                                 }
71274                         }
71275                         return null;
71276                 }
71277         };
71278         /**
71279          * @see http://www.w3.org/TR/REC-DOM-Level-1/level-one-core.html#ID-102161490
71280          */
71281         function DOMImplementation(/* Object */ features) {
71282                 this._features = {};
71283                 if (features) {
71284                         for (var feature in features) {
71285                                  this._features = features[feature];
71286                         }
71287                 }
71288         }
71289         DOMImplementation.prototype = {
71290                 hasFeature: function(/* string */ feature, /* string */ version) {
71291                         var versions = this._features[feature.toLowerCase()];
71292                         if (versions && (!version || version in versions)) {
71293                                 return true;
71294                         } else {
71295                                 return false;
71296                         }
71297                 },
71298                 // Introduced in DOM Level 2:
71299                 createDocument:function(namespaceURI,  qualifiedName, doctype){// raises:INVALID_CHARACTER_ERR,NAMESPACE_ERR,WRONG_DOCUMENT_ERR
71300                         var doc = new Document();
71301                         doc.implementation = this;
71302                         doc.childNodes = new NodeList();
71303                         doc.doctype = doctype;
71304                         if(doctype){
71305                                 doc.appendChild(doctype);
71306                         }
71307                         if(qualifiedName){
71308                                 var root = doc.createElementNS(namespaceURI,qualifiedName);
71309                                 doc.appendChild(root);
71310                         }
71311                         return doc;
71312                 },
71313                 // Introduced in DOM Level 2:
71314                 createDocumentType:function(qualifiedName, publicId, systemId){// raises:INVALID_CHARACTER_ERR,NAMESPACE_ERR
71315                         var node = new DocumentType();
71316                         node.name = qualifiedName;
71317                         node.nodeName = qualifiedName;
71318                         node.publicId = publicId;
71319                         node.systemId = systemId;
71320                         // Introduced in DOM Level 2:
71321                         //readonly attribute DOMString        internalSubset;
71322                         
71323                         //TODO:..
71324                         //  readonly attribute NamedNodeMap     entities;
71325                         //  readonly attribute NamedNodeMap     notations;
71326                         return node;
71327                 }
71328         };
71329
71330
71331         /**
71332          * @see http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-1950641247
71333          */
71334
71335         function Node$2() {
71336         }
71337         Node$2.prototype = {
71338                 firstChild : null,
71339                 lastChild : null,
71340                 previousSibling : null,
71341                 nextSibling : null,
71342                 attributes : null,
71343                 parentNode : null,
71344                 childNodes : null,
71345                 ownerDocument : null,
71346                 nodeValue : null,
71347                 namespaceURI : null,
71348                 prefix : null,
71349                 localName : null,
71350                 // Modified in DOM Level 2:
71351                 insertBefore:function(newChild, refChild){//raises 
71352                         return _insertBefore(this,newChild,refChild);
71353                 },
71354                 replaceChild:function(newChild, oldChild){//raises 
71355                         this.insertBefore(newChild,oldChild);
71356                         if(oldChild){
71357                                 this.removeChild(oldChild);
71358                         }
71359                 },
71360                 removeChild:function(oldChild){
71361                         return _removeChild(this,oldChild);
71362                 },
71363                 appendChild:function(newChild){
71364                         return this.insertBefore(newChild,null);
71365                 },
71366                 hasChildNodes:function(){
71367                         return this.firstChild != null;
71368                 },
71369                 cloneNode:function(deep){
71370                         return cloneNode(this.ownerDocument||this,this,deep);
71371                 },
71372                 // Modified in DOM Level 2:
71373                 normalize:function(){
71374                         var child = this.firstChild;
71375                         while(child){
71376                                 var next = child.nextSibling;
71377                                 if(next && next.nodeType == TEXT_NODE && child.nodeType == TEXT_NODE){
71378                                         this.removeChild(next);
71379                                         child.appendData(next.data);
71380                                 }else{
71381                                         child.normalize();
71382                                         child = next;
71383                                 }
71384                         }
71385                 },
71386                 // Introduced in DOM Level 2:
71387                 isSupported:function(feature, version){
71388                         return this.ownerDocument.implementation.hasFeature(feature,version);
71389                 },
71390             // Introduced in DOM Level 2:
71391             hasAttributes:function(){
71392                 return this.attributes.length>0;
71393             },
71394             lookupPrefix:function(namespaceURI){
71395                 var el = this;
71396                 while(el){
71397                         var map = el._nsMap;
71398                         //console.dir(map)
71399                         if(map){
71400                                 for(var n in map){
71401                                         if(map[n] == namespaceURI){
71402                                                 return n;
71403                                         }
71404                                 }
71405                         }
71406                         el = el.nodeType == ATTRIBUTE_NODE?el.ownerDocument : el.parentNode;
71407                 }
71408                 return null;
71409             },
71410             // Introduced in DOM Level 3:
71411             lookupNamespaceURI:function(prefix){
71412                 var el = this;
71413                 while(el){
71414                         var map = el._nsMap;
71415                         //console.dir(map)
71416                         if(map){
71417                                 if(prefix in map){
71418                                         return map[prefix] ;
71419                                 }
71420                         }
71421                         el = el.nodeType == ATTRIBUTE_NODE?el.ownerDocument : el.parentNode;
71422                 }
71423                 return null;
71424             },
71425             // Introduced in DOM Level 3:
71426             isDefaultNamespace:function(namespaceURI){
71427                 var prefix = this.lookupPrefix(namespaceURI);
71428                 return prefix == null;
71429             }
71430         };
71431
71432
71433         function _xmlEncoder(c){
71434                 return c == '<' && '&lt;' ||
71435                  c == '>' && '&gt;' ||
71436                  c == '&' && '&amp;' ||
71437                  c == '"' && '&quot;' ||
71438                  '&#'+c.charCodeAt()+';'
71439         }
71440
71441
71442         copy$3(NodeType,Node$2);
71443         copy$3(NodeType,Node$2.prototype);
71444
71445         /**
71446          * @param callback return true for continue,false for break
71447          * @return boolean true: break visit;
71448          */
71449         function _visitNode(node,callback){
71450                 if(callback(node)){
71451                         return true;
71452                 }
71453                 if(node = node.firstChild){
71454                         do{
71455                                 if(_visitNode(node,callback)){return true}
71456                 }while(node=node.nextSibling)
71457             }
71458         }
71459
71460
71461
71462         function Document(){
71463         }
71464         function _onAddAttribute(doc,el,newAttr){
71465                 doc && doc._inc++;
71466                 var ns = newAttr.namespaceURI ;
71467                 if(ns == 'http://www.w3.org/2000/xmlns/'){
71468                         //update namespace
71469                         el._nsMap[newAttr.prefix?newAttr.localName:''] = newAttr.value;
71470                 }
71471         }
71472         function _onRemoveAttribute(doc,el,newAttr,remove){
71473                 doc && doc._inc++;
71474                 var ns = newAttr.namespaceURI ;
71475                 if(ns == 'http://www.w3.org/2000/xmlns/'){
71476                         //update namespace
71477                         delete el._nsMap[newAttr.prefix?newAttr.localName:''];
71478                 }
71479         }
71480         function _onUpdateChild(doc,el,newChild){
71481                 if(doc && doc._inc){
71482                         doc._inc++;
71483                         //update childNodes
71484                         var cs = el.childNodes;
71485                         if(newChild){
71486                                 cs[cs.length++] = newChild;
71487                         }else{
71488                                 //console.log(1)
71489                                 var child = el.firstChild;
71490                                 var i = 0;
71491                                 while(child){
71492                                         cs[i++] = child;
71493                                         child =child.nextSibling;
71494                                 }
71495                                 cs.length = i;
71496                         }
71497                 }
71498         }
71499
71500         /**
71501          * attributes;
71502          * children;
71503          * 
71504          * writeable properties:
71505          * nodeValue,Attr:value,CharacterData:data
71506          * prefix
71507          */
71508         function _removeChild(parentNode,child){
71509                 var previous = child.previousSibling;
71510                 var next = child.nextSibling;
71511                 if(previous){
71512                         previous.nextSibling = next;
71513                 }else{
71514                         parentNode.firstChild = next;
71515                 }
71516                 if(next){
71517                         next.previousSibling = previous;
71518                 }else{
71519                         parentNode.lastChild = previous;
71520                 }
71521                 _onUpdateChild(parentNode.ownerDocument,parentNode);
71522                 return child;
71523         }
71524         /**
71525          * preformance key(refChild == null)
71526          */
71527         function _insertBefore(parentNode,newChild,nextChild){
71528                 var cp = newChild.parentNode;
71529                 if(cp){
71530                         cp.removeChild(newChild);//remove and update
71531                 }
71532                 if(newChild.nodeType === DOCUMENT_FRAGMENT_NODE){
71533                         var newFirst = newChild.firstChild;
71534                         if (newFirst == null) {
71535                                 return newChild;
71536                         }
71537                         var newLast = newChild.lastChild;
71538                 }else{
71539                         newFirst = newLast = newChild;
71540                 }
71541                 var pre = nextChild ? nextChild.previousSibling : parentNode.lastChild;
71542
71543                 newFirst.previousSibling = pre;
71544                 newLast.nextSibling = nextChild;
71545                 
71546                 
71547                 if(pre){
71548                         pre.nextSibling = newFirst;
71549                 }else{
71550                         parentNode.firstChild = newFirst;
71551                 }
71552                 if(nextChild == null){
71553                         parentNode.lastChild = newLast;
71554                 }else{
71555                         nextChild.previousSibling = newLast;
71556                 }
71557                 do{
71558                         newFirst.parentNode = parentNode;
71559                 }while(newFirst !== newLast && (newFirst= newFirst.nextSibling))
71560                 _onUpdateChild(parentNode.ownerDocument||parentNode,parentNode);
71561                 //console.log(parentNode.lastChild.nextSibling == null)
71562                 if (newChild.nodeType == DOCUMENT_FRAGMENT_NODE) {
71563                         newChild.firstChild = newChild.lastChild = null;
71564                 }
71565                 return newChild;
71566         }
71567         function _appendSingleChild(parentNode,newChild){
71568                 var cp = newChild.parentNode;
71569                 if(cp){
71570                         var pre = parentNode.lastChild;
71571                         cp.removeChild(newChild);//remove and update
71572                         var pre = parentNode.lastChild;
71573                 }
71574                 var pre = parentNode.lastChild;
71575                 newChild.parentNode = parentNode;
71576                 newChild.previousSibling = pre;
71577                 newChild.nextSibling = null;
71578                 if(pre){
71579                         pre.nextSibling = newChild;
71580                 }else{
71581                         parentNode.firstChild = newChild;
71582                 }
71583                 parentNode.lastChild = newChild;
71584                 _onUpdateChild(parentNode.ownerDocument,parentNode,newChild);
71585                 return newChild;
71586                 //console.log("__aa",parentNode.lastChild.nextSibling == null)
71587         }
71588         Document.prototype = {
71589                 //implementation : null,
71590                 nodeName :  '#document',
71591                 nodeType :  DOCUMENT_NODE,
71592                 doctype :  null,
71593                 documentElement :  null,
71594                 _inc : 1,
71595                 
71596                 insertBefore :  function(newChild, refChild){//raises 
71597                         if(newChild.nodeType == DOCUMENT_FRAGMENT_NODE){
71598                                 var child = newChild.firstChild;
71599                                 while(child){
71600                                         var next = child.nextSibling;
71601                                         this.insertBefore(child,refChild);
71602                                         child = next;
71603                                 }
71604                                 return newChild;
71605                         }
71606                         if(this.documentElement == null && newChild.nodeType == ELEMENT_NODE){
71607                                 this.documentElement = newChild;
71608                         }
71609                         
71610                         return _insertBefore(this,newChild,refChild),(newChild.ownerDocument = this),newChild;
71611                 },
71612                 removeChild :  function(oldChild){
71613                         if(this.documentElement == oldChild){
71614                                 this.documentElement = null;
71615                         }
71616                         return _removeChild(this,oldChild);
71617                 },
71618                 // Introduced in DOM Level 2:
71619                 importNode : function(importedNode,deep){
71620                         return importNode(this,importedNode,deep);
71621                 },
71622                 // Introduced in DOM Level 2:
71623                 getElementById :        function(id){
71624                         var rtv = null;
71625                         _visitNode(this.documentElement,function(node){
71626                                 if(node.nodeType == ELEMENT_NODE){
71627                                         if(node.getAttribute('id') == id){
71628                                                 rtv = node;
71629                                                 return true;
71630                                         }
71631                                 }
71632                         });
71633                         return rtv;
71634                 },
71635                 
71636                 //document factory method:
71637                 createElement : function(tagName){
71638                         var node = new Element();
71639                         node.ownerDocument = this;
71640                         node.nodeName = tagName;
71641                         node.tagName = tagName;
71642                         node.childNodes = new NodeList();
71643                         var attrs       = node.attributes = new NamedNodeMap();
71644                         attrs._ownerElement = node;
71645                         return node;
71646                 },
71647                 createDocumentFragment :        function(){
71648                         var node = new DocumentFragment();
71649                         node.ownerDocument = this;
71650                         node.childNodes = new NodeList();
71651                         return node;
71652                 },
71653                 createTextNode :        function(data){
71654                         var node = new Text();
71655                         node.ownerDocument = this;
71656                         node.appendData(data);
71657                         return node;
71658                 },
71659                 createComment : function(data){
71660                         var node = new Comment();
71661                         node.ownerDocument = this;
71662                         node.appendData(data);
71663                         return node;
71664                 },
71665                 createCDATASection :    function(data){
71666                         var node = new CDATASection();
71667                         node.ownerDocument = this;
71668                         node.appendData(data);
71669                         return node;
71670                 },
71671                 createProcessingInstruction :   function(target,data){
71672                         var node = new ProcessingInstruction();
71673                         node.ownerDocument = this;
71674                         node.tagName = node.target = target;
71675                         node.nodeValue= node.data = data;
71676                         return node;
71677                 },
71678                 createAttribute :       function(name){
71679                         var node = new Attr();
71680                         node.ownerDocument      = this;
71681                         node.name = name;
71682                         node.nodeName   = name;
71683                         node.localName = name;
71684                         node.specified = true;
71685                         return node;
71686                 },
71687                 createEntityReference : function(name){
71688                         var node = new EntityReference();
71689                         node.ownerDocument      = this;
71690                         node.nodeName   = name;
71691                         return node;
71692                 },
71693                 // Introduced in DOM Level 2:
71694                 createElementNS :       function(namespaceURI,qualifiedName){
71695                         var node = new Element();
71696                         var pl = qualifiedName.split(':');
71697                         var attrs       = node.attributes = new NamedNodeMap();
71698                         node.childNodes = new NodeList();
71699                         node.ownerDocument = this;
71700                         node.nodeName = qualifiedName;
71701                         node.tagName = qualifiedName;
71702                         node.namespaceURI = namespaceURI;
71703                         if(pl.length == 2){
71704                                 node.prefix = pl[0];
71705                                 node.localName = pl[1];
71706                         }else{
71707                                 //el.prefix = null;
71708                                 node.localName = qualifiedName;
71709                         }
71710                         attrs._ownerElement = node;
71711                         return node;
71712                 },
71713                 // Introduced in DOM Level 2:
71714                 createAttributeNS :     function(namespaceURI,qualifiedName){
71715                         var node = new Attr();
71716                         var pl = qualifiedName.split(':');
71717                         node.ownerDocument = this;
71718                         node.nodeName = qualifiedName;
71719                         node.name = qualifiedName;
71720                         node.namespaceURI = namespaceURI;
71721                         node.specified = true;
71722                         if(pl.length == 2){
71723                                 node.prefix = pl[0];
71724                                 node.localName = pl[1];
71725                         }else{
71726                                 //el.prefix = null;
71727                                 node.localName = qualifiedName;
71728                         }
71729                         return node;
71730                 }
71731         };
71732         _extends(Document,Node$2);
71733
71734
71735         function Element() {
71736                 this._nsMap = {};
71737         }Element.prototype = {
71738                 nodeType : ELEMENT_NODE,
71739                 hasAttribute : function(name){
71740                         return this.getAttributeNode(name)!=null;
71741                 },
71742                 getAttribute : function(name){
71743                         var attr = this.getAttributeNode(name);
71744                         return attr && attr.value || '';
71745                 },
71746                 getAttributeNode : function(name){
71747                         return this.attributes.getNamedItem(name);
71748                 },
71749                 setAttribute : function(name, value){
71750                         var attr = this.ownerDocument.createAttribute(name);
71751                         attr.value = attr.nodeValue = "" + value;
71752                         this.setAttributeNode(attr);
71753                 },
71754                 removeAttribute : function(name){
71755                         var attr = this.getAttributeNode(name);
71756                         attr && this.removeAttributeNode(attr);
71757                 },
71758                 
71759                 //four real opeartion method
71760                 appendChild:function(newChild){
71761                         if(newChild.nodeType === DOCUMENT_FRAGMENT_NODE){
71762                                 return this.insertBefore(newChild,null);
71763                         }else{
71764                                 return _appendSingleChild(this,newChild);
71765                         }
71766                 },
71767                 setAttributeNode : function(newAttr){
71768                         return this.attributes.setNamedItem(newAttr);
71769                 },
71770                 setAttributeNodeNS : function(newAttr){
71771                         return this.attributes.setNamedItemNS(newAttr);
71772                 },
71773                 removeAttributeNode : function(oldAttr){
71774                         //console.log(this == oldAttr.ownerElement)
71775                         return this.attributes.removeNamedItem(oldAttr.nodeName);
71776                 },
71777                 //get real attribute name,and remove it by removeAttributeNode
71778                 removeAttributeNS : function(namespaceURI, localName){
71779                         var old = this.getAttributeNodeNS(namespaceURI, localName);
71780                         old && this.removeAttributeNode(old);
71781                 },
71782                 
71783                 hasAttributeNS : function(namespaceURI, localName){
71784                         return this.getAttributeNodeNS(namespaceURI, localName)!=null;
71785                 },
71786                 getAttributeNS : function(namespaceURI, localName){
71787                         var attr = this.getAttributeNodeNS(namespaceURI, localName);
71788                         return attr && attr.value || '';
71789                 },
71790                 setAttributeNS : function(namespaceURI, qualifiedName, value){
71791                         var attr = this.ownerDocument.createAttributeNS(namespaceURI, qualifiedName);
71792                         attr.value = attr.nodeValue = "" + value;
71793                         this.setAttributeNode(attr);
71794                 },
71795                 getAttributeNodeNS : function(namespaceURI, localName){
71796                         return this.attributes.getNamedItemNS(namespaceURI, localName);
71797                 },
71798                 
71799                 getElementsByTagName : function(tagName){
71800                         return new LiveNodeList(this,function(base){
71801                                 var ls = [];
71802                                 _visitNode(base,function(node){
71803                                         if(node !== base && node.nodeType == ELEMENT_NODE && (tagName === '*' || node.tagName == tagName)){
71804                                                 ls.push(node);
71805                                         }
71806                                 });
71807                                 return ls;
71808                         });
71809                 },
71810                 getElementsByTagNameNS : function(namespaceURI, localName){
71811                         return new LiveNodeList(this,function(base){
71812                                 var ls = [];
71813                                 _visitNode(base,function(node){
71814                                         if(node !== base && node.nodeType === ELEMENT_NODE && (namespaceURI === '*' || node.namespaceURI === namespaceURI) && (localName === '*' || node.localName == localName)){
71815                                                 ls.push(node);
71816                                         }
71817                                 });
71818                                 return ls;
71819                                 
71820                         });
71821                 }
71822         };
71823         Document.prototype.getElementsByTagName = Element.prototype.getElementsByTagName;
71824         Document.prototype.getElementsByTagNameNS = Element.prototype.getElementsByTagNameNS;
71825
71826
71827         _extends(Element,Node$2);
71828         function Attr() {
71829         }Attr.prototype.nodeType = ATTRIBUTE_NODE;
71830         _extends(Attr,Node$2);
71831
71832
71833         function CharacterData() {
71834         }CharacterData.prototype = {
71835                 data : '',
71836                 substringData : function(offset, count) {
71837                         return this.data.substring(offset, offset+count);
71838                 },
71839                 appendData: function(text) {
71840                         text = this.data+text;
71841                         this.nodeValue = this.data = text;
71842                         this.length = text.length;
71843                 },
71844                 insertData: function(offset,text) {
71845                         this.replaceData(offset,0,text);
71846                 
71847                 },
71848                 appendChild:function(newChild){
71849                         throw new Error(ExceptionMessage[HIERARCHY_REQUEST_ERR])
71850                 },
71851                 deleteData: function(offset, count) {
71852                         this.replaceData(offset,count,"");
71853                 },
71854                 replaceData: function(offset, count, text) {
71855                         var start = this.data.substring(0,offset);
71856                         var end = this.data.substring(offset+count);
71857                         text = start + text + end;
71858                         this.nodeValue = this.data = text;
71859                         this.length = text.length;
71860                 }
71861         };
71862         _extends(CharacterData,Node$2);
71863         function Text() {
71864         }Text.prototype = {
71865                 nodeName : "#text",
71866                 nodeType : TEXT_NODE,
71867                 splitText : function(offset) {
71868                         var text = this.data;
71869                         var newText = text.substring(offset);
71870                         text = text.substring(0, offset);
71871                         this.data = this.nodeValue = text;
71872                         this.length = text.length;
71873                         var newNode = this.ownerDocument.createTextNode(newText);
71874                         if(this.parentNode){
71875                                 this.parentNode.insertBefore(newNode, this.nextSibling);
71876                         }
71877                         return newNode;
71878                 }
71879         };
71880         _extends(Text,CharacterData);
71881         function Comment() {
71882         }Comment.prototype = {
71883                 nodeName : "#comment",
71884                 nodeType : COMMENT_NODE
71885         };
71886         _extends(Comment,CharacterData);
71887
71888         function CDATASection() {
71889         }CDATASection.prototype = {
71890                 nodeName : "#cdata-section",
71891                 nodeType : CDATA_SECTION_NODE
71892         };
71893         _extends(CDATASection,CharacterData);
71894
71895
71896         function DocumentType() {
71897         }DocumentType.prototype.nodeType = DOCUMENT_TYPE_NODE;
71898         _extends(DocumentType,Node$2);
71899
71900         function Notation() {
71901         }Notation.prototype.nodeType = NOTATION_NODE;
71902         _extends(Notation,Node$2);
71903
71904         function Entity() {
71905         }Entity.prototype.nodeType = ENTITY_NODE;
71906         _extends(Entity,Node$2);
71907
71908         function EntityReference() {
71909         }EntityReference.prototype.nodeType = ENTITY_REFERENCE_NODE;
71910         _extends(EntityReference,Node$2);
71911
71912         function DocumentFragment() {
71913         }DocumentFragment.prototype.nodeName =  "#document-fragment";
71914         DocumentFragment.prototype.nodeType =   DOCUMENT_FRAGMENT_NODE;
71915         _extends(DocumentFragment,Node$2);
71916
71917
71918         function ProcessingInstruction() {
71919         }
71920         ProcessingInstruction.prototype.nodeType = PROCESSING_INSTRUCTION_NODE;
71921         _extends(ProcessingInstruction,Node$2);
71922         function XMLSerializer$1(){}
71923         XMLSerializer$1.prototype.serializeToString = function(node,isHtml,nodeFilter){
71924                 return nodeSerializeToString.call(node,isHtml,nodeFilter);
71925         };
71926         Node$2.prototype.toString = nodeSerializeToString;
71927         function nodeSerializeToString(isHtml,nodeFilter){
71928                 var buf = [];
71929                 var refNode = this.nodeType == 9?this.documentElement:this;
71930                 var prefix = refNode.prefix;
71931                 var uri = refNode.namespaceURI;
71932                 
71933                 if(uri && prefix == null){
71934                         //console.log(prefix)
71935                         var prefix = refNode.lookupPrefix(uri);
71936                         if(prefix == null){
71937                                 //isHTML = true;
71938                                 var visibleNamespaces=[
71939                                 {namespace:uri,prefix:null}
71940                                 //{namespace:uri,prefix:''}
71941                                 ];
71942                         }
71943                 }
71944                 serializeToString(this,buf,isHtml,nodeFilter,visibleNamespaces);
71945                 //console.log('###',this.nodeType,uri,prefix,buf.join(''))
71946                 return buf.join('');
71947         }
71948         function needNamespaceDefine(node,isHTML, visibleNamespaces) {
71949                 var prefix = node.prefix||'';
71950                 var uri = node.namespaceURI;
71951                 if (!prefix && !uri){
71952                         return false;
71953                 }
71954                 if (prefix === "xml" && uri === "http://www.w3.org/XML/1998/namespace" 
71955                         || uri == 'http://www.w3.org/2000/xmlns/'){
71956                         return false;
71957                 }
71958                 
71959                 var i = visibleNamespaces.length; 
71960                 //console.log('@@@@',node.tagName,prefix,uri,visibleNamespaces)
71961                 while (i--) {
71962                         var ns = visibleNamespaces[i];
71963                         // get namespace prefix
71964                         //console.log(node.nodeType,node.tagName,ns.prefix,prefix)
71965                         if (ns.prefix == prefix){
71966                                 return ns.namespace != uri;
71967                         }
71968                 }
71969                 //console.log(isHTML,uri,prefix=='')
71970                 //if(isHTML && prefix ==null && uri == 'http://www.w3.org/1999/xhtml'){
71971                 //      return false;
71972                 //}
71973                 //node.flag = '11111'
71974                 //console.error(3,true,node.flag,node.prefix,node.namespaceURI)
71975                 return true;
71976         }
71977         function serializeToString(node,buf,isHTML,nodeFilter,visibleNamespaces){
71978                 if(nodeFilter){
71979                         node = nodeFilter(node);
71980                         if(node){
71981                                 if(typeof node == 'string'){
71982                                         buf.push(node);
71983                                         return;
71984                                 }
71985                         }else{
71986                                 return;
71987                         }
71988                         //buf.sort.apply(attrs, attributeSorter);
71989                 }
71990                 switch(node.nodeType){
71991                 case ELEMENT_NODE:
71992                         if (!visibleNamespaces) visibleNamespaces = [];
71993                         var startVisibleNamespaces = visibleNamespaces.length;
71994                         var attrs = node.attributes;
71995                         var len = attrs.length;
71996                         var child = node.firstChild;
71997                         var nodeName = node.tagName;
71998                         
71999                         isHTML =  (htmlns === node.namespaceURI) ||isHTML; 
72000                         buf.push('<',nodeName);
72001                         
72002                         
72003                         
72004                         for(var i=0;i<len;i++){
72005                                 // add namespaces for attributes
72006                                 var attr = attrs.item(i);
72007                                 if (attr.prefix == 'xmlns') {
72008                                         visibleNamespaces.push({ prefix: attr.localName, namespace: attr.value });
72009                                 }else if(attr.nodeName == 'xmlns'){
72010                                         visibleNamespaces.push({ prefix: '', namespace: attr.value });
72011                                 }
72012                         }
72013                         for(var i=0;i<len;i++){
72014                                 var attr = attrs.item(i);
72015                                 if (needNamespaceDefine(attr,isHTML, visibleNamespaces)) {
72016                                         var prefix = attr.prefix||'';
72017                                         var uri = attr.namespaceURI;
72018                                         var ns = prefix ? ' xmlns:' + prefix : " xmlns";
72019                                         buf.push(ns, '="' , uri , '"');
72020                                         visibleNamespaces.push({ prefix: prefix, namespace:uri });
72021                                 }
72022                                 serializeToString(attr,buf,isHTML,nodeFilter,visibleNamespaces);
72023                         }
72024                         // add namespace for current node               
72025                         if (needNamespaceDefine(node,isHTML, visibleNamespaces)) {
72026                                 var prefix = node.prefix||'';
72027                                 var uri = node.namespaceURI;
72028                                 var ns = prefix ? ' xmlns:' + prefix : " xmlns";
72029                                 buf.push(ns, '="' , uri , '"');
72030                                 visibleNamespaces.push({ prefix: prefix, namespace:uri });
72031                         }
72032                         
72033                         if(child || isHTML && !/^(?:meta|link|img|br|hr|input)$/i.test(nodeName)){
72034                                 buf.push('>');
72035                                 //if is cdata child node
72036                                 if(isHTML && /^script$/i.test(nodeName)){
72037                                         while(child){
72038                                                 if(child.data){
72039                                                         buf.push(child.data);
72040                                                 }else{
72041                                                         serializeToString(child,buf,isHTML,nodeFilter,visibleNamespaces);
72042                                                 }
72043                                                 child = child.nextSibling;
72044                                         }
72045                                 }else
72046                                 {
72047                                         while(child){
72048                                                 serializeToString(child,buf,isHTML,nodeFilter,visibleNamespaces);
72049                                                 child = child.nextSibling;
72050                                         }
72051                                 }
72052                                 buf.push('</',nodeName,'>');
72053                         }else{
72054                                 buf.push('/>');
72055                         }
72056                         // remove added visible namespaces
72057                         //visibleNamespaces.length = startVisibleNamespaces;
72058                         return;
72059                 case DOCUMENT_NODE:
72060                 case DOCUMENT_FRAGMENT_NODE:
72061                         var child = node.firstChild;
72062                         while(child){
72063                                 serializeToString(child,buf,isHTML,nodeFilter,visibleNamespaces);
72064                                 child = child.nextSibling;
72065                         }
72066                         return;
72067                 case ATTRIBUTE_NODE:
72068                         return buf.push(' ',node.name,'="',node.value.replace(/[<&"]/g,_xmlEncoder),'"');
72069                 case TEXT_NODE:
72070                         return buf.push(node.data.replace(/[<&]/g,_xmlEncoder));
72071                 case CDATA_SECTION_NODE:
72072                         return buf.push( '<![CDATA[',node.data,']]>');
72073                 case COMMENT_NODE:
72074                         return buf.push( "<!--",node.data,"-->");
72075                 case DOCUMENT_TYPE_NODE:
72076                         var pubid = node.publicId;
72077                         var sysid = node.systemId;
72078                         buf.push('<!DOCTYPE ',node.name);
72079                         if(pubid){
72080                                 buf.push(' PUBLIC "',pubid);
72081                                 if (sysid && sysid!='.') {
72082                                         buf.push( '" "',sysid);
72083                                 }
72084                                 buf.push('">');
72085                         }else if(sysid && sysid!='.'){
72086                                 buf.push(' SYSTEM "',sysid,'">');
72087                         }else{
72088                                 var sub = node.internalSubset;
72089                                 if(sub){
72090                                         buf.push(" [",sub,"]");
72091                                 }
72092                                 buf.push(">");
72093                         }
72094                         return;
72095                 case PROCESSING_INSTRUCTION_NODE:
72096                         return buf.push( "<?",node.target," ",node.data,"?>");
72097                 case ENTITY_REFERENCE_NODE:
72098                         return buf.push( '&',node.nodeName,';');
72099                 //case ENTITY_NODE:
72100                 //case NOTATION_NODE:
72101                 default:
72102                         buf.push('??',node.nodeName);
72103                 }
72104         }
72105         function importNode(doc,node,deep){
72106                 var node2;
72107                 switch (node.nodeType) {
72108                 case ELEMENT_NODE:
72109                         node2 = node.cloneNode(false);
72110                         node2.ownerDocument = doc;
72111                         //var attrs = node2.attributes;
72112                         //var len = attrs.length;
72113                         //for(var i=0;i<len;i++){
72114                                 //node2.setAttributeNodeNS(importNode(doc,attrs.item(i),deep));
72115                         //}
72116                 case DOCUMENT_FRAGMENT_NODE:
72117                         break;
72118                 case ATTRIBUTE_NODE:
72119                         deep = true;
72120                         break;
72121                 //case ENTITY_REFERENCE_NODE:
72122                 //case PROCESSING_INSTRUCTION_NODE:
72123                 ////case TEXT_NODE:
72124                 //case CDATA_SECTION_NODE:
72125                 //case COMMENT_NODE:
72126                 //      deep = false;
72127                 //      break;
72128                 //case DOCUMENT_NODE:
72129                 //case DOCUMENT_TYPE_NODE:
72130                 //cannot be imported.
72131                 //case ENTITY_NODE:
72132                 //case NOTATION_NODE:
72133                 //can not hit in level3
72134                 //default:throw e;
72135                 }
72136                 if(!node2){
72137                         node2 = node.cloneNode(false);//false
72138                 }
72139                 node2.ownerDocument = doc;
72140                 node2.parentNode = null;
72141                 if(deep){
72142                         var child = node.firstChild;
72143                         while(child){
72144                                 node2.appendChild(importNode(doc,child,deep));
72145                                 child = child.nextSibling;
72146                         }
72147                 }
72148                 return node2;
72149         }
72150         //
72151         //var _relationMap = {firstChild:1,lastChild:1,previousSibling:1,nextSibling:1,
72152         //                                      attributes:1,childNodes:1,parentNode:1,documentElement:1,doctype,};
72153         function cloneNode(doc,node,deep){
72154                 var node2 = new node.constructor();
72155                 for(var n in node){
72156                         var v = node[n];
72157                         if(typeof v != 'object' ){
72158                                 if(v != node2[n]){
72159                                         node2[n] = v;
72160                                 }
72161                         }
72162                 }
72163                 if(node.childNodes){
72164                         node2.childNodes = new NodeList();
72165                 }
72166                 node2.ownerDocument = doc;
72167                 switch (node2.nodeType) {
72168                 case ELEMENT_NODE:
72169                         var attrs       = node.attributes;
72170                         var attrs2      = node2.attributes = new NamedNodeMap();
72171                         var len = attrs.length;
72172                         attrs2._ownerElement = node2;
72173                         for(var i=0;i<len;i++){
72174                                 node2.setAttributeNode(cloneNode(doc,attrs.item(i),true));
72175                         }
72176                         break;
72177                 case ATTRIBUTE_NODE:
72178                         deep = true;
72179                 }
72180                 if(deep){
72181                         var child = node.firstChild;
72182                         while(child){
72183                                 node2.appendChild(cloneNode(doc,child,deep));
72184                                 child = child.nextSibling;
72185                         }
72186                 }
72187                 return node2;
72188         }
72189
72190         function __set__(object,key,value){
72191                 object[key] = value;
72192         }
72193         //do dynamic
72194         try{
72195                 if(Object.defineProperty){
72196                         Object.defineProperty(LiveNodeList.prototype,'length',{
72197                                 get:function(){
72198                                         _updateLiveList(this);
72199                                         return this.$$length;
72200                                 }
72201                         });
72202                         Object.defineProperty(Node$2.prototype,'textContent',{
72203                                 get:function(){
72204                                         return getTextContent(this);
72205                                 },
72206                                 set:function(data){
72207                                         switch(this.nodeType){
72208                                         case ELEMENT_NODE:
72209                                         case DOCUMENT_FRAGMENT_NODE:
72210                                                 while(this.firstChild){
72211                                                         this.removeChild(this.firstChild);
72212                                                 }
72213                                                 if(data || String(data)){
72214                                                         this.appendChild(this.ownerDocument.createTextNode(data));
72215                                                 }
72216                                                 break;
72217                                         default:
72218                                                 //TODO:
72219                                                 this.data = data;
72220                                                 this.value = data;
72221                                                 this.nodeValue = data;
72222                                         }
72223                                 }
72224                         });
72225                         
72226                         function getTextContent(node){
72227                                 switch(node.nodeType){
72228                                 case ELEMENT_NODE:
72229                                 case DOCUMENT_FRAGMENT_NODE:
72230                                         var buf = [];
72231                                         node = node.firstChild;
72232                                         while(node){
72233                                                 if(node.nodeType!==7 && node.nodeType !==8){
72234                                                         buf.push(getTextContent(node));
72235                                                 }
72236                                                 node = node.nextSibling;
72237                                         }
72238                                         return buf.join('');
72239                                 default:
72240                                         return node.nodeValue;
72241                                 }
72242                         }
72243                         __set__ = function(object,key,value){
72244                                 //console.log(value)
72245                                 object['$$'+key] = value;
72246                         };
72247                 }
72248         }catch(e){//ie8
72249         }
72250
72251         //if(typeof require == 'function'){
72252                 var DOMImplementation_1 = DOMImplementation;
72253                 var XMLSerializer_1 = XMLSerializer$1;
72254         //}
72255
72256         var dom = {
72257                 DOMImplementation: DOMImplementation_1,
72258                 XMLSerializer: XMLSerializer_1
72259         };
72260
72261         var domParser = createCommonjsModule(function (module, exports) {
72262         function DOMParser(options){
72263                 this.options = options ||{locator:{}};
72264                 
72265         }
72266         DOMParser.prototype.parseFromString = function(source,mimeType){
72267                 var options = this.options;
72268                 var sax =  new XMLReader();
72269                 var domBuilder = options.domBuilder || new DOMHandler();//contentHandler and LexicalHandler
72270                 var errorHandler = options.errorHandler;
72271                 var locator = options.locator;
72272                 var defaultNSMap = options.xmlns||{};
72273                 var entityMap = {'lt':'<','gt':'>','amp':'&','quot':'"','apos':"'"};
72274                 if(locator){
72275                         domBuilder.setDocumentLocator(locator);
72276                 }
72277                 
72278                 sax.errorHandler = buildErrorHandler(errorHandler,domBuilder,locator);
72279                 sax.domBuilder = options.domBuilder || domBuilder;
72280                 if(/\/x?html?$/.test(mimeType)){
72281                         entityMap.nbsp = '\xa0';
72282                         entityMap.copy = '\xa9';
72283                         defaultNSMap['']= 'http://www.w3.org/1999/xhtml';
72284                 }
72285                 defaultNSMap.xml = defaultNSMap.xml || 'http://www.w3.org/XML/1998/namespace';
72286                 if(source){
72287                         sax.parse(source,defaultNSMap,entityMap);
72288                 }else{
72289                         sax.errorHandler.error("invalid doc source");
72290                 }
72291                 return domBuilder.doc;
72292         };
72293         function buildErrorHandler(errorImpl,domBuilder,locator){
72294                 if(!errorImpl){
72295                         if(domBuilder instanceof DOMHandler){
72296                                 return domBuilder;
72297                         }
72298                         errorImpl = domBuilder ;
72299                 }
72300                 var errorHandler = {};
72301                 var isCallback = errorImpl instanceof Function;
72302                 locator = locator||{};
72303                 function build(key){
72304                         var fn = errorImpl[key];
72305                         if(!fn && isCallback){
72306                                 fn = errorImpl.length == 2?function(msg){errorImpl(key,msg);}:errorImpl;
72307                         }
72308                         errorHandler[key] = fn && function(msg){
72309                                 fn('[xmldom '+key+']\t'+msg+_locator(locator));
72310                         }||function(){};
72311                 }
72312                 build('warning');
72313                 build('error');
72314                 build('fatalError');
72315                 return errorHandler;
72316         }
72317
72318         //console.log('#\n\n\n\n\n\n\n####')
72319         /**
72320          * +ContentHandler+ErrorHandler
72321          * +LexicalHandler+EntityResolver2
72322          * -DeclHandler-DTDHandler 
72323          * 
72324          * DefaultHandler:EntityResolver, DTDHandler, ContentHandler, ErrorHandler
72325          * DefaultHandler2:DefaultHandler,LexicalHandler, DeclHandler, EntityResolver2
72326          * @link http://www.saxproject.org/apidoc/org/xml/sax/helpers/DefaultHandler.html
72327          */
72328         function DOMHandler() {
72329             this.cdata = false;
72330         }
72331         function position(locator,node){
72332                 node.lineNumber = locator.lineNumber;
72333                 node.columnNumber = locator.columnNumber;
72334         }
72335         /**
72336          * @see org.xml.sax.ContentHandler#startDocument
72337          * @link http://www.saxproject.org/apidoc/org/xml/sax/ContentHandler.html
72338          */ 
72339         DOMHandler.prototype = {
72340                 startDocument : function() {
72341                 this.doc = new DOMImplementation().createDocument(null, null, null);
72342                 if (this.locator) {
72343                         this.doc.documentURI = this.locator.systemId;
72344                 }
72345                 },
72346                 startElement:function(namespaceURI, localName, qName, attrs) {
72347                         var doc = this.doc;
72348                     var el = doc.createElementNS(namespaceURI, qName||localName);
72349                     var len = attrs.length;
72350                     appendElement(this, el);
72351                     this.currentElement = el;
72352                     
72353                         this.locator && position(this.locator,el);
72354                     for (var i = 0 ; i < len; i++) {
72355                         var namespaceURI = attrs.getURI(i);
72356                         var value = attrs.getValue(i);
72357                         var qName = attrs.getQName(i);
72358                                 var attr = doc.createAttributeNS(namespaceURI, qName);
72359                                 this.locator &&position(attrs.getLocator(i),attr);
72360                                 attr.value = attr.nodeValue = value;
72361                                 el.setAttributeNode(attr);
72362                     }
72363                 },
72364                 endElement:function(namespaceURI, localName, qName) {
72365                         var current = this.currentElement;
72366                         var tagName = current.tagName;
72367                         this.currentElement = current.parentNode;
72368                 },
72369                 startPrefixMapping:function(prefix, uri) {
72370                 },
72371                 endPrefixMapping:function(prefix) {
72372                 },
72373                 processingInstruction:function(target, data) {
72374                     var ins = this.doc.createProcessingInstruction(target, data);
72375                     this.locator && position(this.locator,ins);
72376                     appendElement(this, ins);
72377                 },
72378                 ignorableWhitespace:function(ch, start, length) {
72379                 },
72380                 characters:function(chars, start, length) {
72381                         chars = _toString.apply(this,arguments);
72382                         //console.log(chars)
72383                         if(chars){
72384                                 if (this.cdata) {
72385                                         var charNode = this.doc.createCDATASection(chars);
72386                                 } else {
72387                                         var charNode = this.doc.createTextNode(chars);
72388                                 }
72389                                 if(this.currentElement){
72390                                         this.currentElement.appendChild(charNode);
72391                                 }else if(/^\s*$/.test(chars)){
72392                                         this.doc.appendChild(charNode);
72393                                         //process xml
72394                                 }
72395                                 this.locator && position(this.locator,charNode);
72396                         }
72397                 },
72398                 skippedEntity:function(name) {
72399                 },
72400                 endDocument:function() {
72401                         this.doc.normalize();
72402                 },
72403                 setDocumentLocator:function (locator) {
72404                     if(this.locator = locator){// && !('lineNumber' in locator)){
72405                         locator.lineNumber = 0;
72406                     }
72407                 },
72408                 //LexicalHandler
72409                 comment:function(chars, start, length) {
72410                         chars = _toString.apply(this,arguments);
72411                     var comm = this.doc.createComment(chars);
72412                     this.locator && position(this.locator,comm);
72413                     appendElement(this, comm);
72414                 },
72415                 
72416                 startCDATA:function() {
72417                     //used in characters() methods
72418                     this.cdata = true;
72419                 },
72420                 endCDATA:function() {
72421                     this.cdata = false;
72422                 },
72423                 
72424                 startDTD:function(name, publicId, systemId) {
72425                         var impl = this.doc.implementation;
72426                     if (impl && impl.createDocumentType) {
72427                         var dt = impl.createDocumentType(name, publicId, systemId);
72428                         this.locator && position(this.locator,dt);
72429                         appendElement(this, dt);
72430                     }
72431                 },
72432                 /**
72433                  * @see org.xml.sax.ErrorHandler
72434                  * @link http://www.saxproject.org/apidoc/org/xml/sax/ErrorHandler.html
72435                  */
72436                 warning:function(error) {
72437                         console.warn('[xmldom warning]\t'+error,_locator(this.locator));
72438                 },
72439                 error:function(error) {
72440                         console.error('[xmldom error]\t'+error,_locator(this.locator));
72441                 },
72442                 fatalError:function(error) {
72443                         console.error('[xmldom fatalError]\t'+error,_locator(this.locator));
72444                     throw error;
72445                 }
72446         };
72447         function _locator(l){
72448                 if(l){
72449                         return '\n@'+(l.systemId ||'')+'#[line:'+l.lineNumber+',col:'+l.columnNumber+']'
72450                 }
72451         }
72452         function _toString(chars,start,length){
72453                 if(typeof chars == 'string'){
72454                         return chars.substr(start,length)
72455                 }else{//java sax connect width xmldom on rhino(what about: "? && !(chars instanceof String)")
72456                         if(chars.length >= start+length || start){
72457                                 return new java.lang.String(chars,start,length)+'';
72458                         }
72459                         return chars;
72460                 }
72461         }
72462
72463         /*
72464          * @link http://www.saxproject.org/apidoc/org/xml/sax/ext/LexicalHandler.html
72465          * used method of org.xml.sax.ext.LexicalHandler:
72466          *  #comment(chars, start, length)
72467          *  #startCDATA()
72468          *  #endCDATA()
72469          *  #startDTD(name, publicId, systemId)
72470          *
72471          *
72472          * IGNORED method of org.xml.sax.ext.LexicalHandler:
72473          *  #endDTD()
72474          *  #startEntity(name)
72475          *  #endEntity(name)
72476          *
72477          *
72478          * @link http://www.saxproject.org/apidoc/org/xml/sax/ext/DeclHandler.html
72479          * IGNORED method of org.xml.sax.ext.DeclHandler
72480          *      #attributeDecl(eName, aName, type, mode, value)
72481          *  #elementDecl(name, model)
72482          *  #externalEntityDecl(name, publicId, systemId)
72483          *  #internalEntityDecl(name, value)
72484          * @link http://www.saxproject.org/apidoc/org/xml/sax/ext/EntityResolver2.html
72485          * IGNORED method of org.xml.sax.EntityResolver2
72486          *  #resolveEntity(String name,String publicId,String baseURI,String systemId)
72487          *  #resolveEntity(publicId, systemId)
72488          *  #getExternalSubset(name, baseURI)
72489          * @link http://www.saxproject.org/apidoc/org/xml/sax/DTDHandler.html
72490          * IGNORED method of org.xml.sax.DTDHandler
72491          *  #notationDecl(name, publicId, systemId) {};
72492          *  #unparsedEntityDecl(name, publicId, systemId, notationName) {};
72493          */
72494         "endDTD,startEntity,endEntity,attributeDecl,elementDecl,externalEntityDecl,internalEntityDecl,resolveEntity,getExternalSubset,notationDecl,unparsedEntityDecl".replace(/\w+/g,function(key){
72495                 DOMHandler.prototype[key] = function(){return null};
72496         });
72497
72498         /* 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 */
72499         function appendElement (hander,node) {
72500             if (!hander.currentElement) {
72501                 hander.doc.appendChild(node);
72502             } else {
72503                 hander.currentElement.appendChild(node);
72504             }
72505         }//appendChild and setAttributeNS are preformance key
72506
72507         //if(typeof require == 'function'){
72508                 var XMLReader = sax.XMLReader;
72509                 var DOMImplementation = exports.DOMImplementation = dom.DOMImplementation;
72510                 exports.XMLSerializer = dom.XMLSerializer ;
72511                 exports.DOMParser = DOMParser;
72512         //}
72513         });
72514         var domParser_1 = domParser.DOMImplementation;
72515         var domParser_2 = domParser.XMLSerializer;
72516         var domParser_3 = domParser.DOMParser;
72517
72518         var togeojson = createCommonjsModule(function (module, exports) {
72519         var toGeoJSON = (function() {
72520
72521             var removeSpace = /\s*/g,
72522                 trimSpace = /^\s*|\s*$/g,
72523                 splitSpace = /\s+/;
72524             // generate a short, numeric hash of a string
72525             function okhash(x) {
72526                 if (!x || !x.length) return 0;
72527                 for (var i = 0, h = 0; i < x.length; i++) {
72528                     h = ((h << 5) - h) + x.charCodeAt(i) | 0;
72529                 } return h;
72530             }
72531             // all Y children of X
72532             function get(x, y) { return x.getElementsByTagName(y); }
72533             function attr(x, y) { return x.getAttribute(y); }
72534             function attrf(x, y) { return parseFloat(attr(x, y)); }
72535             // one Y child of X, if any, otherwise null
72536             function get1(x, y) { var n = get(x, y); return n.length ? n[0] : null; }
72537             // https://developer.mozilla.org/en-US/docs/Web/API/Node.normalize
72538             function norm(el) { if (el.normalize) { el.normalize(); } return el; }
72539             // cast array x into numbers
72540             function numarray(x) {
72541                 for (var j = 0, o = []; j < x.length; j++) { o[j] = parseFloat(x[j]); }
72542                 return o;
72543             }
72544             // get the content of a text node, if any
72545             function nodeVal(x) {
72546                 if (x) { norm(x); }
72547                 return (x && x.textContent) || '';
72548             }
72549             // get the contents of multiple text nodes, if present
72550             function getMulti(x, ys) {
72551                 var o = {}, n, k;
72552                 for (k = 0; k < ys.length; k++) {
72553                     n = get1(x, ys[k]);
72554                     if (n) o[ys[k]] = nodeVal(n);
72555                 }
72556                 return o;
72557             }
72558             // add properties of Y to X, overwriting if present in both
72559             function extend(x, y) { for (var k in y) x[k] = y[k]; }
72560             // get one coordinate from a coordinate array, if any
72561             function coord1(v) { return numarray(v.replace(removeSpace, '').split(',')); }
72562             // get all coordinates from a coordinate array as [[],[]]
72563             function coord(v) {
72564                 var coords = v.replace(trimSpace, '').split(splitSpace),
72565                     o = [];
72566                 for (var i = 0; i < coords.length; i++) {
72567                     o.push(coord1(coords[i]));
72568                 }
72569                 return o;
72570             }
72571             function coordPair(x) {
72572                 var ll = [attrf(x, 'lon'), attrf(x, 'lat')],
72573                     ele = get1(x, 'ele'),
72574                     // handle namespaced attribute in browser
72575                     heartRate = get1(x, 'gpxtpx:hr') || get1(x, 'hr'),
72576                     time = get1(x, 'time'),
72577                     e;
72578                 if (ele) {
72579                     e = parseFloat(nodeVal(ele));
72580                     if (!isNaN(e)) {
72581                         ll.push(e);
72582                     }
72583                 }
72584                 return {
72585                     coordinates: ll,
72586                     time: time ? nodeVal(time) : null,
72587                     heartRate: heartRate ? parseFloat(nodeVal(heartRate)) : null
72588                 };
72589             }
72590
72591             // create a new feature collection parent object
72592             function fc() {
72593                 return {
72594                     type: 'FeatureCollection',
72595                     features: []
72596                 };
72597             }
72598
72599             var serializer;
72600             if (typeof XMLSerializer !== 'undefined') {
72601                 /* istanbul ignore next */
72602                 serializer = new XMLSerializer();
72603             // only require xmldom in a node environment
72604             } else if (typeof process === 'object' && !process.browser) {
72605                 serializer = new (domParser.XMLSerializer)();
72606             }
72607             function xml2str(str) {
72608                 // IE9 will create a new XMLSerializer but it'll crash immediately.
72609                 // This line is ignored because we don't run coverage tests in IE9
72610                 /* istanbul ignore next */
72611                 if (str.xml !== undefined) return str.xml;
72612                 return serializer.serializeToString(str);
72613             }
72614
72615             var t = {
72616                 kml: function(doc) {
72617
72618                     var gj = fc(),
72619                         // styleindex keeps track of hashed styles in order to match features
72620                         styleIndex = {}, styleByHash = {},
72621                         // stylemapindex keeps track of style maps to expose in properties
72622                         styleMapIndex = {},
72623                         // atomic geospatial types supported by KML - MultiGeometry is
72624                         // handled separately
72625                         geotypes = ['Polygon', 'LineString', 'Point', 'Track', 'gx:Track'],
72626                         // all root placemarks in the file
72627                         placemarks = get(doc, 'Placemark'),
72628                         styles = get(doc, 'Style'),
72629                         styleMaps = get(doc, 'StyleMap');
72630
72631                     for (var k = 0; k < styles.length; k++) {
72632                         var hash = okhash(xml2str(styles[k])).toString(16);
72633                         styleIndex['#' + attr(styles[k], 'id')] = hash;
72634                         styleByHash[hash] = styles[k];
72635                     }
72636                     for (var l = 0; l < styleMaps.length; l++) {
72637                         styleIndex['#' + attr(styleMaps[l], 'id')] = okhash(xml2str(styleMaps[l])).toString(16);
72638                         var pairs = get(styleMaps[l], 'Pair');
72639                         var pairsMap = {};
72640                         for (var m = 0; m < pairs.length; m++) {
72641                             pairsMap[nodeVal(get1(pairs[m], 'key'))] = nodeVal(get1(pairs[m], 'styleUrl'));
72642                         }
72643                         styleMapIndex['#' + attr(styleMaps[l], 'id')] = pairsMap;
72644
72645                     }
72646                     for (var j = 0; j < placemarks.length; j++) {
72647                         gj.features = gj.features.concat(getPlacemark(placemarks[j]));
72648                     }
72649                     function kmlColor(v) {
72650                         var color, opacity;
72651                         v = v || '';
72652                         if (v.substr(0, 1) === '#') { v = v.substr(1); }
72653                         if (v.length === 6 || v.length === 3) { color = v; }
72654                         if (v.length === 8) {
72655                             opacity = parseInt(v.substr(0, 2), 16) / 255;
72656                             color = '#' + v.substr(6, 2) +
72657                                 v.substr(4, 2) +
72658                                 v.substr(2, 2);
72659                         }
72660                         return [color, isNaN(opacity) ? undefined : opacity];
72661                     }
72662                     function gxCoord(v) { return numarray(v.split(' ')); }
72663                     function gxCoords(root) {
72664                         var elems = get(root, 'coord', 'gx'), coords = [], times = [];
72665                         if (elems.length === 0) elems = get(root, 'gx:coord');
72666                         for (var i = 0; i < elems.length; i++) coords.push(gxCoord(nodeVal(elems[i])));
72667                         var timeElems = get(root, 'when');
72668                         for (var j = 0; j < timeElems.length; j++) times.push(nodeVal(timeElems[j]));
72669                         return {
72670                             coords: coords,
72671                             times: times
72672                         };
72673                     }
72674                     function getGeometry(root) {
72675                         var geomNode, geomNodes, i, j, k, geoms = [], coordTimes = [];
72676                         if (get1(root, 'MultiGeometry')) { return getGeometry(get1(root, 'MultiGeometry')); }
72677                         if (get1(root, 'MultiTrack')) { return getGeometry(get1(root, 'MultiTrack')); }
72678                         if (get1(root, 'gx:MultiTrack')) { return getGeometry(get1(root, 'gx:MultiTrack')); }
72679                         for (i = 0; i < geotypes.length; i++) {
72680                             geomNodes = get(root, geotypes[i]);
72681                             if (geomNodes) {
72682                                 for (j = 0; j < geomNodes.length; j++) {
72683                                     geomNode = geomNodes[j];
72684                                     if (geotypes[i] === 'Point') {
72685                                         geoms.push({
72686                                             type: 'Point',
72687                                             coordinates: coord1(nodeVal(get1(geomNode, 'coordinates')))
72688                                         });
72689                                     } else if (geotypes[i] === 'LineString') {
72690                                         geoms.push({
72691                                             type: 'LineString',
72692                                             coordinates: coord(nodeVal(get1(geomNode, 'coordinates')))
72693                                         });
72694                                     } else if (geotypes[i] === 'Polygon') {
72695                                         var rings = get(geomNode, 'LinearRing'),
72696                                             coords = [];
72697                                         for (k = 0; k < rings.length; k++) {
72698                                             coords.push(coord(nodeVal(get1(rings[k], 'coordinates'))));
72699                                         }
72700                                         geoms.push({
72701                                             type: 'Polygon',
72702                                             coordinates: coords
72703                                         });
72704                                     } else if (geotypes[i] === 'Track' ||
72705                                         geotypes[i] === 'gx:Track') {
72706                                         var track = gxCoords(geomNode);
72707                                         geoms.push({
72708                                             type: 'LineString',
72709                                             coordinates: track.coords
72710                                         });
72711                                         if (track.times.length) coordTimes.push(track.times);
72712                                     }
72713                                 }
72714                             }
72715                         }
72716                         return {
72717                             geoms: geoms,
72718                             coordTimes: coordTimes
72719                         };
72720                     }
72721                     function getPlacemark(root) {
72722                         var geomsAndTimes = getGeometry(root), i, properties = {},
72723                             name = nodeVal(get1(root, 'name')),
72724                             address = nodeVal(get1(root, 'address')),
72725                             styleUrl = nodeVal(get1(root, 'styleUrl')),
72726                             description = nodeVal(get1(root, 'description')),
72727                             timeSpan = get1(root, 'TimeSpan'),
72728                             timeStamp = get1(root, 'TimeStamp'),
72729                             extendedData = get1(root, 'ExtendedData'),
72730                             lineStyle = get1(root, 'LineStyle'),
72731                             polyStyle = get1(root, 'PolyStyle'),
72732                             visibility = get1(root, 'visibility');
72733
72734                         if (!geomsAndTimes.geoms.length) return [];
72735                         if (name) properties.name = name;
72736                         if (address) properties.address = address;
72737                         if (styleUrl) {
72738                             if (styleUrl[0] !== '#') {
72739                                 styleUrl = '#' + styleUrl;
72740                             }
72741
72742                             properties.styleUrl = styleUrl;
72743                             if (styleIndex[styleUrl]) {
72744                                 properties.styleHash = styleIndex[styleUrl];
72745                             }
72746                             if (styleMapIndex[styleUrl]) {
72747                                 properties.styleMapHash = styleMapIndex[styleUrl];
72748                                 properties.styleHash = styleIndex[styleMapIndex[styleUrl].normal];
72749                             }
72750                             // Try to populate the lineStyle or polyStyle since we got the style hash
72751                             var style = styleByHash[properties.styleHash];
72752                             if (style) {
72753                                 if (!lineStyle) lineStyle = get1(style, 'LineStyle');
72754                                 if (!polyStyle) polyStyle = get1(style, 'PolyStyle');
72755                             }
72756                         }
72757                         if (description) properties.description = description;
72758                         if (timeSpan) {
72759                             var begin = nodeVal(get1(timeSpan, 'begin'));
72760                             var end = nodeVal(get1(timeSpan, 'end'));
72761                             properties.timespan = { begin: begin, end: end };
72762                         }
72763                         if (timeStamp) {
72764                             properties.timestamp = nodeVal(get1(timeStamp, 'when'));
72765                         }
72766                         if (lineStyle) {
72767                             var linestyles = kmlColor(nodeVal(get1(lineStyle, 'color'))),
72768                                 color = linestyles[0],
72769                                 opacity = linestyles[1],
72770                                 width = parseFloat(nodeVal(get1(lineStyle, 'width')));
72771                             if (color) properties.stroke = color;
72772                             if (!isNaN(opacity)) properties['stroke-opacity'] = opacity;
72773                             if (!isNaN(width)) properties['stroke-width'] = width;
72774                         }
72775                         if (polyStyle) {
72776                             var polystyles = kmlColor(nodeVal(get1(polyStyle, 'color'))),
72777                                 pcolor = polystyles[0],
72778                                 popacity = polystyles[1],
72779                                 fill = nodeVal(get1(polyStyle, 'fill')),
72780                                 outline = nodeVal(get1(polyStyle, 'outline'));
72781                             if (pcolor) properties.fill = pcolor;
72782                             if (!isNaN(popacity)) properties['fill-opacity'] = popacity;
72783                             if (fill) properties['fill-opacity'] = fill === '1' ? properties['fill-opacity'] || 1 : 0;
72784                             if (outline) properties['stroke-opacity'] = outline === '1' ? properties['stroke-opacity'] || 1 : 0;
72785                         }
72786                         if (extendedData) {
72787                             var datas = get(extendedData, 'Data'),
72788                                 simpleDatas = get(extendedData, 'SimpleData');
72789
72790                             for (i = 0; i < datas.length; i++) {
72791                                 properties[datas[i].getAttribute('name')] = nodeVal(get1(datas[i], 'value'));
72792                             }
72793                             for (i = 0; i < simpleDatas.length; i++) {
72794                                 properties[simpleDatas[i].getAttribute('name')] = nodeVal(simpleDatas[i]);
72795                             }
72796                         }
72797                         if (visibility) {
72798                             properties.visibility = nodeVal(visibility);
72799                         }
72800                         if (geomsAndTimes.coordTimes.length) {
72801                             properties.coordTimes = (geomsAndTimes.coordTimes.length === 1) ?
72802                                 geomsAndTimes.coordTimes[0] : geomsAndTimes.coordTimes;
72803                         }
72804                         var feature = {
72805                             type: 'Feature',
72806                             geometry: (geomsAndTimes.geoms.length === 1) ? geomsAndTimes.geoms[0] : {
72807                                 type: 'GeometryCollection',
72808                                 geometries: geomsAndTimes.geoms
72809                             },
72810                             properties: properties
72811                         };
72812                         if (attr(root, 'id')) feature.id = attr(root, 'id');
72813                         return [feature];
72814                     }
72815                     return gj;
72816                 },
72817                 gpx: function(doc) {
72818                     var i,
72819                         tracks = get(doc, 'trk'),
72820                         routes = get(doc, 'rte'),
72821                         waypoints = get(doc, 'wpt'),
72822                         // a feature collection
72823                         gj = fc(),
72824                         feature;
72825                     for (i = 0; i < tracks.length; i++) {
72826                         feature = getTrack(tracks[i]);
72827                         if (feature) gj.features.push(feature);
72828                     }
72829                     for (i = 0; i < routes.length; i++) {
72830                         feature = getRoute(routes[i]);
72831                         if (feature) gj.features.push(feature);
72832                     }
72833                     for (i = 0; i < waypoints.length; i++) {
72834                         gj.features.push(getPoint(waypoints[i]));
72835                     }
72836                     function getPoints(node, pointname) {
72837                         var pts = get(node, pointname),
72838                             line = [],
72839                             times = [],
72840                             heartRates = [],
72841                             l = pts.length;
72842                         if (l < 2) return {};  // Invalid line in GeoJSON
72843                         for (var i = 0; i < l; i++) {
72844                             var c = coordPair(pts[i]);
72845                             line.push(c.coordinates);
72846                             if (c.time) times.push(c.time);
72847                             if (c.heartRate) heartRates.push(c.heartRate);
72848                         }
72849                         return {
72850                             line: line,
72851                             times: times,
72852                             heartRates: heartRates
72853                         };
72854                     }
72855                     function getTrack(node) {
72856                         var segments = get(node, 'trkseg'),
72857                             track = [],
72858                             times = [],
72859                             heartRates = [],
72860                             line;
72861                         for (var i = 0; i < segments.length; i++) {
72862                             line = getPoints(segments[i], 'trkpt');
72863                             if (line) {
72864                                 if (line.line) track.push(line.line);
72865                                 if (line.times && line.times.length) times.push(line.times);
72866                                 if (line.heartRates && line.heartRates.length) heartRates.push(line.heartRates);
72867                             }
72868                         }
72869                         if (track.length === 0) return;
72870                         var properties = getProperties(node);
72871                         extend(properties, getLineStyle(get1(node, 'extensions')));
72872                         if (times.length) properties.coordTimes = track.length === 1 ? times[0] : times;
72873                         if (heartRates.length) properties.heartRates = track.length === 1 ? heartRates[0] : heartRates;
72874                         return {
72875                             type: 'Feature',
72876                             properties: properties,
72877                             geometry: {
72878                                 type: track.length === 1 ? 'LineString' : 'MultiLineString',
72879                                 coordinates: track.length === 1 ? track[0] : track
72880                             }
72881                         };
72882                     }
72883                     function getRoute(node) {
72884                         var line = getPoints(node, 'rtept');
72885                         if (!line.line) return;
72886                         var prop = getProperties(node);
72887                         extend(prop, getLineStyle(get1(node, 'extensions')));
72888                         var routeObj = {
72889                             type: 'Feature',
72890                             properties: prop,
72891                             geometry: {
72892                                 type: 'LineString',
72893                                 coordinates: line.line
72894                             }
72895                         };
72896                         return routeObj;
72897                     }
72898                     function getPoint(node) {
72899                         var prop = getProperties(node);
72900                         extend(prop, getMulti(node, ['sym']));
72901                         return {
72902                             type: 'Feature',
72903                             properties: prop,
72904                             geometry: {
72905                                 type: 'Point',
72906                                 coordinates: coordPair(node).coordinates
72907                             }
72908                         };
72909                     }
72910                     function getLineStyle(extensions) {
72911                         var style = {};
72912                         if (extensions) {
72913                             var lineStyle = get1(extensions, 'line');
72914                             if (lineStyle) {
72915                                 var color = nodeVal(get1(lineStyle, 'color')),
72916                                     opacity = parseFloat(nodeVal(get1(lineStyle, 'opacity'))),
72917                                     width = parseFloat(nodeVal(get1(lineStyle, 'width')));
72918                                 if (color) style.stroke = color;
72919                                 if (!isNaN(opacity)) style['stroke-opacity'] = opacity;
72920                                 // GPX width is in mm, convert to px with 96 px per inch
72921                                 if (!isNaN(width)) style['stroke-width'] = width * 96 / 25.4;
72922                             }
72923                         }
72924                         return style;
72925                     }
72926                     function getProperties(node) {
72927                         var prop = getMulti(node, ['name', 'cmt', 'desc', 'type', 'time', 'keywords']),
72928                             links = get(node, 'link');
72929                         if (links.length) prop.links = [];
72930                         for (var i = 0, link; i < links.length; i++) {
72931                             link = { href: attr(links[i], 'href') };
72932                             extend(link, getMulti(links[i], ['text', 'type']));
72933                             prop.links.push(link);
72934                         }
72935                         return prop;
72936                     }
72937                     return gj;
72938                 }
72939             };
72940             return t;
72941         })();
72942
72943         module.exports = toGeoJSON;
72944         });
72945
72946         var _initialized = false;
72947         var _enabled = false;
72948         var _geojson;
72949
72950
72951         function svgData(projection, context, dispatch) {
72952             var throttledRedraw = throttle(function () { dispatch.call('change'); }, 1000);
72953             var _showLabels = true;
72954             var detected = utilDetect();
72955             var layer = d3_select(null);
72956             var _vtService;
72957             var _fileList;
72958             var _template;
72959             var _src;
72960
72961
72962             function init() {
72963                 if (_initialized) return;  // run once
72964
72965                 _geojson = {};
72966                 _enabled = true;
72967
72968                 function over() {
72969                     event.stopPropagation();
72970                     event.preventDefault();
72971                     event.dataTransfer.dropEffect = 'copy';
72972                 }
72973
72974                 d3_select('body')
72975                     .attr('dropzone', 'copy')
72976                     .on('drop.svgData', function() {
72977                         event.stopPropagation();
72978                         event.preventDefault();
72979                         if (!detected.filedrop) return;
72980                         drawData.fileList(event.dataTransfer.files);
72981                     })
72982                     .on('dragenter.svgData', over)
72983                     .on('dragexit.svgData', over)
72984                     .on('dragover.svgData', over);
72985
72986                 _initialized = true;
72987             }
72988
72989
72990             function getService() {
72991                 if (services$1.vectorTile && !_vtService) {
72992                     _vtService = services$1.vectorTile;
72993                     _vtService.event.on('loadedData', throttledRedraw);
72994                 } else if (!services$1.vectorTile && _vtService) {
72995                     _vtService = null;
72996                 }
72997
72998                 return _vtService;
72999             }
73000
73001
73002             function showLayer() {
73003                 layerOn();
73004
73005                 layer
73006                     .style('opacity', 0)
73007                     .transition()
73008                     .duration(250)
73009                     .style('opacity', 1)
73010                     .on('end', function () { dispatch.call('change'); });
73011             }
73012
73013
73014             function hideLayer() {
73015                 throttledRedraw.cancel();
73016
73017                 layer
73018                     .transition()
73019                     .duration(250)
73020                     .style('opacity', 0)
73021                     .on('end', layerOff);
73022             }
73023
73024
73025             function layerOn() {
73026                 layer.style('display', 'block');
73027             }
73028
73029
73030             function layerOff() {
73031                 layer.selectAll('.viewfield-group').remove();
73032                 layer.style('display', 'none');
73033             }
73034
73035
73036             // ensure that all geojson features in a collection have IDs
73037             function ensureIDs(gj) {
73038                 if (!gj) return null;
73039
73040                 if (gj.type === 'FeatureCollection') {
73041                     for (var i = 0; i < gj.features.length; i++) {
73042                         ensureFeatureID(gj.features[i]);
73043                     }
73044                 } else {
73045                     ensureFeatureID(gj);
73046                 }
73047                 return gj;
73048             }
73049
73050
73051             // ensure that each single Feature object has a unique ID
73052             function ensureFeatureID(feature) {
73053                 if (!feature) return;
73054                 feature.__featurehash__ = utilHashcode(fastJsonStableStringify(feature));
73055                 return feature;
73056             }
73057
73058
73059             // Prefer an array of Features instead of a FeatureCollection
73060             function getFeatures(gj) {
73061                 if (!gj) return [];
73062
73063                 if (gj.type === 'FeatureCollection') {
73064                     return gj.features;
73065                 } else {
73066                     return [gj];
73067                 }
73068             }
73069
73070
73071             function featureKey(d) {
73072                 return d.__featurehash__;
73073             }
73074
73075
73076             function isPolygon(d) {
73077                 return d.geometry.type === 'Polygon' || d.geometry.type === 'MultiPolygon';
73078             }
73079
73080
73081             function clipPathID(d) {
73082                 return 'data-' + d.__featurehash__ + '-clippath';
73083             }
73084
73085
73086             function featureClasses(d) {
73087                 return [
73088                     'data' + d.__featurehash__,
73089                     d.geometry.type,
73090                     isPolygon(d) ? 'area' : '',
73091                     d.__layerID__ || ''
73092                 ].filter(Boolean).join(' ');
73093             }
73094
73095
73096             function drawData(selection) {
73097                 var vtService = getService();
73098                 var getPath = svgPath(projection).geojson;
73099                 var getAreaPath = svgPath(projection, null, true).geojson;
73100                 var hasData = drawData.hasData();
73101
73102                 layer = selection.selectAll('.layer-mapdata')
73103                     .data(_enabled && hasData ? [0] : []);
73104
73105                 layer.exit()
73106                     .remove();
73107
73108                 layer = layer.enter()
73109                     .append('g')
73110                     .attr('class', 'layer-mapdata')
73111                     .merge(layer);
73112
73113                 var surface = context.surface();
73114                 if (!surface || surface.empty()) return;  // not ready to draw yet, starting up
73115
73116
73117                 // Gather data
73118                 var geoData, polygonData;
73119                 if (_template && vtService) {   // fetch data from vector tile service
73120                     var sourceID = _template;
73121                     vtService.loadTiles(sourceID, _template, projection);
73122                     geoData = vtService.data(sourceID, projection);
73123                 } else {
73124                     geoData = getFeatures(_geojson);
73125                 }
73126                 geoData = geoData.filter(getPath);
73127                 polygonData = geoData.filter(isPolygon);
73128
73129
73130                 // Draw clip paths for polygons
73131                 var clipPaths = surface.selectAll('defs').selectAll('.clipPath-data')
73132                    .data(polygonData, featureKey);
73133
73134                 clipPaths.exit()
73135                    .remove();
73136
73137                 var clipPathsEnter = clipPaths.enter()
73138                    .append('clipPath')
73139                    .attr('class', 'clipPath-data')
73140                    .attr('id', clipPathID);
73141
73142                 clipPathsEnter
73143                    .append('path');
73144
73145                 clipPaths.merge(clipPathsEnter)
73146                    .selectAll('path')
73147                    .attr('d', getAreaPath);
73148
73149
73150                 // Draw fill, shadow, stroke layers
73151                 var datagroups = layer
73152                     .selectAll('g.datagroup')
73153                     .data(['fill', 'shadow', 'stroke']);
73154
73155                 datagroups = datagroups.enter()
73156                     .append('g')
73157                     .attr('class', function(d) { return 'datagroup datagroup-' + d; })
73158                     .merge(datagroups);
73159
73160
73161                 // Draw paths
73162                 var pathData = {
73163                     fill: polygonData,
73164                     shadow: geoData,
73165                     stroke: geoData
73166                 };
73167
73168                 var paths = datagroups
73169                     .selectAll('path')
73170                     .data(function(layer) { return pathData[layer]; }, featureKey);
73171
73172                 // exit
73173                 paths.exit()
73174                     .remove();
73175
73176                 // enter/update
73177                 paths = paths.enter()
73178                     .append('path')
73179                     .attr('class', function(d) {
73180                         var datagroup = this.parentNode.__data__;
73181                         return 'pathdata ' + datagroup + ' ' + featureClasses(d);
73182                     })
73183                     .attr('clip-path', function(d) {
73184                         var datagroup = this.parentNode.__data__;
73185                         return datagroup === 'fill' ? ('url(#' + clipPathID(d) + ')') : null;
73186                     })
73187                     .merge(paths)
73188                     .attr('d', function(d) {
73189                         var datagroup = this.parentNode.__data__;
73190                         return datagroup === 'fill' ? getAreaPath(d) : getPath(d);
73191                     });
73192
73193
73194                 // Draw labels
73195                 layer
73196                     .call(drawLabels, 'label-halo', geoData)
73197                     .call(drawLabels, 'label', geoData);
73198
73199
73200                 function drawLabels(selection, textClass, data) {
73201                     var labelPath = d3_geoPath(projection);
73202                     var labelData = data.filter(function(d) {
73203                         return _showLabels && d.properties && (d.properties.desc || d.properties.name);
73204                     });
73205
73206                     var labels = selection.selectAll('text.' + textClass)
73207                         .data(labelData, featureKey);
73208
73209                     // exit
73210                     labels.exit()
73211                         .remove();
73212
73213                     // enter/update
73214                     labels = labels.enter()
73215                         .append('text')
73216                         .attr('class', function(d) { return textClass + ' ' + featureClasses(d); })
73217                         .merge(labels)
73218                         .text(function(d) {
73219                             return d.properties.desc || d.properties.name;
73220                         })
73221                         .attr('x', function(d) {
73222                             var centroid = labelPath.centroid(d);
73223                             return centroid[0] + 11;
73224                         })
73225                         .attr('y', function(d) {
73226                             var centroid = labelPath.centroid(d);
73227                             return centroid[1];
73228                         });
73229                 }
73230             }
73231
73232
73233             function getExtension(fileName) {
73234                 if (!fileName) return;
73235
73236                 var re = /\.(gpx|kml|(geo)?json)$/i;
73237                 var match = fileName.toLowerCase().match(re);
73238                 return match && match.length && match[0];
73239             }
73240
73241
73242             function xmlToDom(textdata) {
73243                 return (new DOMParser()).parseFromString(textdata, 'text/xml');
73244             }
73245
73246
73247             drawData.setFile = function(extension, data) {
73248                 _template = null;
73249                 _fileList = null;
73250                 _geojson = null;
73251                 _src = null;
73252
73253                 var gj;
73254                 switch (extension) {
73255                     case '.gpx':
73256                         gj = togeojson.gpx(xmlToDom(data));
73257                         break;
73258                     case '.kml':
73259                         gj = togeojson.kml(xmlToDom(data));
73260                         break;
73261                     case '.geojson':
73262                     case '.json':
73263                         gj = JSON.parse(data);
73264                         break;
73265                 }
73266
73267                 gj = gj || {};
73268                 if (Object.keys(gj).length) {
73269                     _geojson = ensureIDs(gj);
73270                     _src = extension + ' data file';
73271                     this.fitZoom();
73272                 }
73273
73274                 dispatch.call('change');
73275                 return this;
73276             };
73277
73278
73279             drawData.showLabels = function(val) {
73280                 if (!arguments.length) return _showLabels;
73281
73282                 _showLabels = val;
73283                 return this;
73284             };
73285
73286
73287             drawData.enabled = function(val) {
73288                 if (!arguments.length) return _enabled;
73289
73290                 _enabled = val;
73291                 if (_enabled) {
73292                     showLayer();
73293                 } else {
73294                     hideLayer();
73295                 }
73296
73297                 dispatch.call('change');
73298                 return this;
73299             };
73300
73301
73302             drawData.hasData = function() {
73303                 var gj = _geojson || {};
73304                 return !!(_template || Object.keys(gj).length);
73305             };
73306
73307
73308             drawData.template = function(val, src) {
73309                 if (!arguments.length) return _template;
73310
73311                 // test source against OSM imagery blacklists..
73312                 var osm = context.connection();
73313                 if (osm) {
73314                     var blacklists = osm.imageryBlacklists();
73315                     var fail = false;
73316                     var tested = 0;
73317                     var regex;
73318
73319                     for (var i = 0; i < blacklists.length; i++) {
73320                         try {
73321                             regex = new RegExp(blacklists[i]);
73322                             fail = regex.test(val);
73323                             tested++;
73324                             if (fail) break;
73325                         } catch (e) {
73326                             /* noop */
73327                         }
73328                     }
73329
73330                     // ensure at least one test was run.
73331                     if (!tested) {
73332                         regex = new RegExp('.*\.google(apis)?\..*/(vt|kh)[\?/].*([xyz]=.*){3}.*');
73333                         fail = regex.test(val);
73334                     }
73335                 }
73336
73337                 _template = val;
73338                 _fileList = null;
73339                 _geojson = null;
73340
73341                 // strip off the querystring/hash from the template,
73342                 // it often includes the access token
73343                 _src = src || ('vectortile:' + val.split(/[?#]/)[0]);
73344
73345                 dispatch.call('change');
73346                 return this;
73347             };
73348
73349
73350             drawData.geojson = function(gj, src) {
73351                 if (!arguments.length) return _geojson;
73352
73353                 _template = null;
73354                 _fileList = null;
73355                 _geojson = null;
73356                 _src = null;
73357
73358                 gj = gj || {};
73359                 if (Object.keys(gj).length) {
73360                     _geojson = ensureIDs(gj);
73361                     _src = src || 'unknown.geojson';
73362                 }
73363
73364                 dispatch.call('change');
73365                 return this;
73366             };
73367
73368
73369             drawData.fileList = function(fileList) {
73370                 if (!arguments.length) return _fileList;
73371
73372                 _template = null;
73373                 _fileList = fileList;
73374                 _geojson = null;
73375                 _src = null;
73376
73377                 if (!fileList || !fileList.length) return this;
73378                 var f = fileList[0];
73379                 var extension = getExtension(f.name);
73380                 var reader = new FileReader();
73381                 reader.onload = (function() {
73382                     return function(e) {
73383                         drawData.setFile(extension, e.target.result);
73384                     };
73385                 })(f);
73386
73387                 reader.readAsText(f);
73388
73389                 return this;
73390             };
73391
73392
73393             drawData.url = function(url, defaultExtension) {
73394                 _template = null;
73395                 _fileList = null;
73396                 _geojson = null;
73397                 _src = null;
73398
73399                 // strip off any querystring/hash from the url before checking extension
73400                 var testUrl = url.split(/[?#]/)[0];
73401                 var extension = getExtension(testUrl) || defaultExtension;
73402                 if (extension) {
73403                     _template = null;
73404                     d3_text(url)
73405                         .then(function(data) {
73406                             drawData.setFile(extension, data);
73407                         })
73408                         .catch(function() {
73409                             /* ignore */
73410                         });
73411
73412                 } else {
73413                     drawData.template(url);
73414                 }
73415
73416                 return this;
73417             };
73418
73419
73420             drawData.getSrc = function() {
73421                 return _src || '';
73422             };
73423
73424
73425             drawData.fitZoom = function() {
73426                 var features = getFeatures(_geojson);
73427                 if (!features.length) return;
73428
73429                 var map = context.map();
73430                 var viewport = map.trimmedExtent().polygon();
73431                 var coords = features.reduce(function(coords, feature) {
73432                     var c = feature.geometry.coordinates;
73433
73434                     /* eslint-disable no-fallthrough */
73435                     switch (feature.geometry.type) {
73436                         case 'Point':
73437                             c = [c];
73438                         case 'MultiPoint':
73439                         case 'LineString':
73440                             break;
73441
73442                         case 'MultiPolygon':
73443                             c = utilArrayFlatten(c);
73444                         case 'Polygon':
73445                         case 'MultiLineString':
73446                             c = utilArrayFlatten(c);
73447                             break;
73448                     }
73449                     /* eslint-enable no-fallthrough */
73450
73451                     return utilArrayUnion(coords, c);
73452                 }, []);
73453
73454                 if (!geoPolygonIntersectsPolygon(viewport, coords, true)) {
73455                     var extent = geoExtent(d3_geoBounds({ type: 'LineString', coordinates: coords }));
73456                     map.centerZoom(extent.center(), map.trimmedExtentZoom(extent));
73457                 }
73458
73459                 return this;
73460             };
73461
73462
73463             init();
73464             return drawData;
73465         }
73466
73467         function svgDebug(projection, context) {
73468
73469             function drawDebug(selection) {
73470                 var showsTile = context.getDebug('tile');
73471                 var showsCollision = context.getDebug('collision');
73472                 var showsImagery = context.getDebug('imagery');
73473                 var showsCommunity = context.getDebug('community');
73474                 var showsImperial = context.getDebug('imperial');
73475                 var showsDriveLeft = context.getDebug('driveLeft');
73476                 var showsTouchTargets = context.getDebug('target');
73477                 var showsDownloaded = context.getDebug('downloaded');
73478
73479                 var debugData = [];
73480                 if (showsTile) {
73481                     debugData.push({ class: 'red', label: 'tile' });
73482                 }
73483                 if (showsCollision) {
73484                     debugData.push({ class: 'yellow', label: 'collision' });
73485                 }
73486                 if (showsImagery) {
73487                     debugData.push({ class: 'orange', label: 'imagery' });
73488                 }
73489                 if (showsCommunity) {
73490                     debugData.push({ class: 'blue', label: 'community' });
73491                 }
73492                 if (showsImperial) {
73493                     debugData.push({ class: 'cyan', label: 'imperial' });
73494                 }
73495                 if (showsDriveLeft) {
73496                     debugData.push({ class: 'green', label: 'driveLeft' });
73497                 }
73498                 if (showsTouchTargets) {
73499                     debugData.push({ class: 'pink', label: 'touchTargets' });
73500                 }
73501                 if (showsDownloaded) {
73502                     debugData.push({ class: 'purple', label: 'downloaded' });
73503                 }
73504
73505
73506                 var legend = d3_select('#content')
73507                     .selectAll('.debug-legend')
73508                     .data(debugData.length ? [0] : []);
73509
73510                 legend.exit()
73511                     .remove();
73512
73513                 legend = legend.enter()
73514                     .append('div')
73515                     .attr('class', 'fillD debug-legend')
73516                     .merge(legend);
73517
73518
73519                 var legendItems = legend.selectAll('.debug-legend-item')
73520                     .data(debugData, function(d) { return d.label; });
73521
73522                 legendItems.exit()
73523                     .remove();
73524
73525                 legendItems.enter()
73526                     .append('span')
73527                     .attr('class', function(d) { return 'debug-legend-item ' + d.class; })
73528                     .text(function(d) { return d.label; });
73529
73530
73531                 var layer = selection.selectAll('.layer-debug')
73532                     .data(showsImagery || showsCommunity || showsImperial || showsDriveLeft || showsDownloaded ? [0] : []);
73533
73534                 layer.exit()
73535                     .remove();
73536
73537                 layer = layer.enter()
73538                     .append('g')
73539                     .attr('class', 'layer-debug')
73540                     .merge(layer);
73541
73542
73543                 // imagery
73544                 var extent = context.map().extent();
73545                 var matchImagery = (showsImagery && data.imagery.query.bbox(extent.rectangle(), true)) || [];
73546                 var features = matchImagery.map(function(d) { return data.imagery.features[d.id]; });
73547
73548                 var imagery = layer.selectAll('path.debug-imagery')
73549                     .data(features);
73550
73551                 imagery.exit()
73552                     .remove();
73553
73554                 imagery.enter()
73555                     .append('path')
73556                     .attr('class', 'debug-imagery debug orange');
73557
73558
73559                 // community index
73560                 var community = layer.selectAll('path.debug-community')
73561                     .data(showsCommunity ? Object.values(data.community.features) : []);
73562
73563                 community.exit()
73564                     .remove();
73565
73566                 community.enter()
73567                     .append('path')
73568                     .attr('class', 'debug-community debug blue');
73569
73570
73571                 // imperial
73572                 var imperial = layer
73573                     .selectAll('path.debug-imperial')
73574                     .data(showsImperial ? [dataImperial] : []);
73575
73576                 imperial.exit()
73577                     .remove();
73578
73579                 imperial.enter()
73580                     .append('path')
73581                     .attr('class', 'debug-imperial debug cyan');
73582
73583
73584                 // driveleft
73585                 var driveLeft = layer
73586                     .selectAll('path.debug-drive-left')
73587                     .data(showsDriveLeft ? [dataDriveLeft] : []);
73588
73589                 driveLeft.exit()
73590                     .remove();
73591
73592                 driveLeft.enter()
73593                     .append('path')
73594                     .attr('class', 'debug-drive-left debug green');
73595
73596
73597                 // downloaded
73598                 var osm = context.connection();
73599                 var dataDownloaded = [];
73600
73601                 if (osm) {
73602                     var rtree = osm.caches('get').tile.rtree;
73603                     dataDownloaded = rtree.all().map(function(bbox) {
73604                         return {
73605                             type: 'Feature',
73606                             properties: { id: bbox.id },
73607                             geometry: {
73608                                 type: 'Polygon',
73609                                 coordinates: [[
73610                                     [ bbox.minX, bbox.minY ],
73611                                     [ bbox.minX, bbox.maxY ],
73612                                     [ bbox.maxX, bbox.maxY ],
73613                                     [ bbox.maxX, bbox.minY ],
73614                                     [ bbox.minX, bbox.minY ]
73615                                 ]]
73616                             }
73617                         };
73618                     });
73619                 }
73620
73621
73622                 var downloaded = layer
73623                     .selectAll('path.debug-downloaded')
73624                     .data(showsDownloaded ? dataDownloaded : []);
73625
73626                 downloaded.exit()
73627                     .remove();
73628
73629                 downloaded.enter()
73630                     .append('path')
73631                     .attr('class', 'debug-downloaded debug purple');
73632
73633
73634                 // update
73635                 layer.selectAll('path')
73636                     .attr('d', svgPath(projection).geojson);
73637             }
73638
73639
73640             // This looks strange because `enabled` methods on other layers are
73641             // chainable getter/setters, and this one is just a getter.
73642             drawDebug.enabled = function() {
73643                 if (!arguments.length) {
73644                     return context.getDebug('tile') ||
73645                         context.getDebug('collision') ||
73646                         context.getDebug('imagery') ||
73647                         context.getDebug('imperial') ||
73648                         context.getDebug('driveLeft') ||
73649                         context.getDebug('target') ||
73650                         context.getDebug('downloaded');
73651                 } else {
73652                     return this;
73653                 }
73654             };
73655
73656
73657             return drawDebug;
73658         }
73659
73660         var _keepRightEnabled = false;
73661         var _keepRightService;
73662
73663
73664         function svgKeepRight(projection, context, dispatch) {
73665             var throttledRedraw = throttle(function () { dispatch.call('change'); }, 1000);
73666             var minZoom = 12;
73667             var touchLayer = d3_select(null);
73668             var drawLayer = d3_select(null);
73669             var _keepRightVisible = false;
73670
73671
73672             function markerPath(selection, klass) {
73673                 selection
73674                     .attr('class', klass)
73675                     .attr('transform', 'translate(-4, -24)')
73676                     .attr('d', 'M11.6,6.2H7.1l1.4-5.1C8.6,0.6,8.1,0,7.5,0H2.2C1.7,0,1.3,0.3,1.3,0.8L0,10.2c-0.1,0.6,0.4,1.1,0.9,1.1h4.6l-1.8,7.6C3.6,19.4,4.1,20,4.7,20c0.3,0,0.6-0.2,0.8-0.5l6.9-11.9C12.7,7,12.3,6.2,11.6,6.2z');
73677             }
73678
73679
73680             // Loosely-coupled keepRight service for fetching errors.
73681             function getService() {
73682                 if (services$1.keepRight && !_keepRightService) {
73683                     _keepRightService = services$1.keepRight;
73684                     _keepRightService.on('loaded', throttledRedraw);
73685                 } else if (!services$1.keepRight && _keepRightService) {
73686                     _keepRightService = null;
73687                 }
73688
73689                 return _keepRightService;
73690             }
73691
73692
73693             // Show the errors
73694             function editOn() {
73695                 if (!_keepRightVisible) {
73696                     _keepRightVisible = true;
73697                     drawLayer
73698                         .style('display', 'block');
73699                 }
73700             }
73701
73702
73703             // Immediately remove the errors and their touch targets
73704             function editOff() {
73705                 if (_keepRightVisible) {
73706                     _keepRightVisible = false;
73707                     drawLayer
73708                         .style('display', 'none');
73709                     drawLayer.selectAll('.qa_error.keepRight')
73710                         .remove();
73711                     touchLayer.selectAll('.qa_error.keepRight')
73712                         .remove();
73713                 }
73714             }
73715
73716
73717             // Enable the layer.  This shows the errors and transitions them to visible.
73718             function layerOn() {
73719                 editOn();
73720
73721                 drawLayer
73722                     .style('opacity', 0)
73723                     .transition()
73724                     .duration(250)
73725                     .style('opacity', 1)
73726                     .on('end interrupt', function () {
73727                         dispatch.call('change');
73728                     });
73729             }
73730
73731
73732             // Disable the layer.  This transitions the layer invisible and then hides the errors.
73733             function layerOff() {
73734                 throttledRedraw.cancel();
73735                 drawLayer.interrupt();
73736                 touchLayer.selectAll('.qa_error.keepRight')
73737                     .remove();
73738
73739                 drawLayer
73740                     .transition()
73741                     .duration(250)
73742                     .style('opacity', 0)
73743                     .on('end interrupt', function () {
73744                         editOff();
73745                         dispatch.call('change');
73746                     });
73747             }
73748
73749
73750             // Update the error markers
73751             function updateMarkers() {
73752                 if (!_keepRightVisible || !_keepRightEnabled) return;
73753
73754                 var service = getService();
73755                 var selectedID = context.selectedErrorID();
73756                 var data = (service ? service.getErrors(projection) : []);
73757                 var getTransform = svgPointTransform(projection);
73758
73759                 // Draw markers..
73760                 var markers = drawLayer.selectAll('.qa_error.keepRight')
73761                     .data(data, function(d) { return d.id; });
73762
73763                 // exit
73764                 markers.exit()
73765                     .remove();
73766
73767                 // enter
73768                 var markersEnter = markers.enter()
73769                     .append('g')
73770                     .attr('class', function(d) {
73771                         return [
73772                             'qa_error',
73773                             d.service,
73774                             'error_id-' + d.id,
73775                             'error_type-' + d.parent_error_type
73776                         ].join(' ');
73777                     });
73778
73779                 markersEnter
73780                     .append('ellipse')
73781                     .attr('cx', 0.5)
73782                     .attr('cy', 1)
73783                     .attr('rx', 6.5)
73784                     .attr('ry', 3)
73785                     .attr('class', 'stroke');
73786
73787                 markersEnter
73788                     .append('path')
73789                     .call(markerPath, 'shadow');
73790
73791                 markersEnter
73792                     .append('use')
73793                     .attr('class', 'qa_error-fill')
73794                     .attr('width', '20px')
73795                     .attr('height', '20px')
73796                     .attr('x', '-8px')
73797                     .attr('y', '-22px')
73798                     .attr('xlink:href', '#iD-icon-bolt');
73799
73800                 // update
73801                 markers
73802                     .merge(markersEnter)
73803                     .sort(sortY)
73804                     .classed('selected', function(d) { return d.id === selectedID; })
73805                     .attr('transform', getTransform);
73806
73807
73808                 // Draw targets..
73809                 if (touchLayer.empty()) return;
73810                 var fillClass = context.getDebug('target') ? 'pink ' : 'nocolor ';
73811
73812                 var targets = touchLayer.selectAll('.qa_error.keepRight')
73813                     .data(data, function(d) { return d.id; });
73814
73815                 // exit
73816                 targets.exit()
73817                     .remove();
73818
73819                 // enter/update
73820                 targets.enter()
73821                     .append('rect')
73822                     .attr('width', '20px')
73823                     .attr('height', '20px')
73824                     .attr('x', '-8px')
73825                     .attr('y', '-22px')
73826                     .merge(targets)
73827                     .sort(sortY)
73828                     .attr('class', function(d) {
73829                         return 'qa_error ' + d.service + ' target error_id-' + d.id + ' ' + fillClass;
73830                     })
73831                     .attr('transform', getTransform);
73832
73833
73834                 function sortY(a, b) {
73835                     return (a.id === selectedID) ? 1
73836                         : (b.id === selectedID) ? -1
73837                         : (a.severity === 'error' && b.severity !== 'error') ? 1
73838                         : (b.severity === 'error' && a.severity !== 'error') ? -1
73839                         : b.loc[1] - a.loc[1];
73840                 }
73841             }
73842
73843
73844             // Draw the keepRight layer and schedule loading errors and updating markers.
73845             function drawKeepRight(selection) {
73846                 var service = getService();
73847
73848                 var surface = context.surface();
73849                 if (surface && !surface.empty()) {
73850                     touchLayer = surface.selectAll('.data-layer.touch .layer-touch.markers');
73851                 }
73852
73853                 drawLayer = selection.selectAll('.layer-keepRight')
73854                     .data(service ? [0] : []);
73855
73856                 drawLayer.exit()
73857                     .remove();
73858
73859                 drawLayer = drawLayer.enter()
73860                     .append('g')
73861                     .attr('class', 'layer-keepRight')
73862                     .style('display', _keepRightEnabled ? 'block' : 'none')
73863                     .merge(drawLayer);
73864
73865                 if (_keepRightEnabled) {
73866                     if (service && ~~context.map().zoom() >= minZoom) {
73867                         editOn();
73868                         service.loadErrors(projection);
73869                         updateMarkers();
73870                     } else {
73871                         editOff();
73872                     }
73873                 }
73874             }
73875
73876
73877             // Toggles the layer on and off
73878             drawKeepRight.enabled = function(val) {
73879                 if (!arguments.length) return _keepRightEnabled;
73880
73881                 _keepRightEnabled = val;
73882                 if (_keepRightEnabled) {
73883                     layerOn();
73884                 } else {
73885                     layerOff();
73886                     if (context.selectedErrorID()) {
73887                         context.enter(modeBrowse(context));
73888                     }
73889                 }
73890
73891                 dispatch.call('change');
73892                 return this;
73893             };
73894
73895
73896             drawKeepRight.supported = function() {
73897                 return !!getService();
73898             };
73899
73900
73901             return drawKeepRight;
73902         }
73903
73904         function svgGeolocate(projection) {
73905             var layer = d3_select(null);
73906             var _position;
73907
73908
73909             function init() {
73910                 if (svgGeolocate.initialized) return;  // run once
73911                 svgGeolocate.enabled = false;
73912                 svgGeolocate.initialized = true;
73913             }
73914
73915             function showLayer() {
73916                 layer.style('display', 'block');
73917             }
73918
73919
73920             function hideLayer() {
73921                 layer
73922                     .transition()
73923                     .duration(250)
73924                     .style('opacity', 0);
73925             }
73926
73927             function layerOn() {
73928                 layer
73929                     .style('opacity', 0)
73930                     .transition()
73931                     .duration(250)
73932                     .style('opacity', 1);
73933
73934             }
73935
73936             function layerOff() {
73937                 layer.style('display', 'none');
73938             }
73939
73940             function transform(d) {
73941                 return svgPointTransform(projection)(d);
73942             }
73943
73944             function accuracy(accuracy, loc) { // converts accuracy to pixels...
73945                 var degreesRadius = geoMetersToLat(accuracy),
73946                     tangentLoc = [loc[0], loc[1] + degreesRadius],
73947                     projectedTangent = projection(tangentLoc),
73948                     projectedLoc = projection([loc[0], loc[1]]);
73949
73950                 // southern most point will have higher pixel value...
73951                return Math.round(projectedLoc[1] - projectedTangent[1]).toString();
73952             }
73953
73954             function update() {
73955                 var geolocation = { loc: [_position.coords.longitude, _position.coords.latitude] };
73956
73957                 var groups = layer.selectAll('.geolocations').selectAll('.geolocation')
73958                     .data([geolocation]);
73959
73960                 groups.exit()
73961                     .remove();
73962
73963                 var pointsEnter = groups.enter()
73964                     .append('g')
73965                     .attr('class', 'geolocation');
73966
73967                 pointsEnter
73968                     .append('circle')
73969                     .attr('id', 'geolocate-radius')
73970                     .attr('dx', '0')
73971                     .attr('dy', '0')
73972                     .attr('fill', 'rgb(15,128,225)')
73973                     .attr('fill-opacity', '0.3')
73974                     .attr('r', '0');
73975
73976                 pointsEnter
73977                     .append('circle')
73978                     .attr('dx', '0')
73979                     .attr('dy', '0')
73980                     .attr('fill', 'rgb(15,128,225)')
73981                     .attr('stroke', 'white')
73982                     .attr('stroke-width', '1.5')
73983                     .attr('r', '6');
73984
73985                 groups.merge(pointsEnter)
73986                     .attr('transform', transform);
73987
73988                 d3_select('#geolocate-radius').attr('r', accuracy(_position.coords.accuracy, geolocation.loc));
73989             }
73990
73991             function drawLocation(selection) {
73992                 var enabled = svgGeolocate.enabled;
73993
73994                 layer = selection.selectAll('.layer-geolocate')
73995                     .data([0]);
73996
73997                 layer.exit()
73998                     .remove();
73999
74000                 var layerEnter = layer.enter()
74001                     .append('g')
74002                     .attr('class', 'layer-geolocate')
74003                     .style('display', enabled ? 'block' : 'none');
74004
74005                 layerEnter
74006                     .append('g')
74007                     .attr('class', 'geolocations');
74008
74009                 layer = layerEnter
74010                     .merge(layer);
74011
74012                 if (enabled) {
74013                     update();
74014                 } else {
74015                     layerOff();
74016                 }
74017             }
74018
74019             drawLocation.enabled = function (position, enabled) {
74020                 if (!arguments.length) return svgGeolocate.enabled;
74021                 _position = position;
74022                 svgGeolocate.enabled = enabled;
74023                 if (svgGeolocate.enabled) {
74024                     showLayer();
74025                     layerOn();
74026                 } else {
74027                     hideLayer();
74028                 }
74029                 return this;
74030             };
74031
74032             init();
74033             return drawLocation;
74034         }
74035
74036         function svgLabels(projection, context) {
74037             var path = d3_geoPath(projection);
74038             var detected = utilDetect();
74039             var baselineHack = (detected.ie || detected.browser.toLowerCase() === 'edge');
74040             var _rdrawn = rbush_1();
74041             var _rskipped = rbush_1();
74042             var _textWidthCache = {};
74043             var _entitybboxes = {};
74044
74045             // Listed from highest to lowest priority
74046             var labelStack = [
74047                 ['line', 'aeroway', '*', 12],
74048                 ['line', 'highway', 'motorway', 12],
74049                 ['line', 'highway', 'trunk', 12],
74050                 ['line', 'highway', 'primary', 12],
74051                 ['line', 'highway', 'secondary', 12],
74052                 ['line', 'highway', 'tertiary', 12],
74053                 ['line', 'highway', '*', 12],
74054                 ['line', 'railway', '*', 12],
74055                 ['line', 'waterway', '*', 12],
74056                 ['area', 'aeroway', '*', 12],
74057                 ['area', 'amenity', '*', 12],
74058                 ['area', 'building', '*', 12],
74059                 ['area', 'historic', '*', 12],
74060                 ['area', 'leisure', '*', 12],
74061                 ['area', 'man_made', '*', 12],
74062                 ['area', 'natural', '*', 12],
74063                 ['area', 'shop', '*', 12],
74064                 ['area', 'tourism', '*', 12],
74065                 ['area', 'camp_site', '*', 12],
74066                 ['point', 'aeroway', '*', 10],
74067                 ['point', 'amenity', '*', 10],
74068                 ['point', 'building', '*', 10],
74069                 ['point', 'historic', '*', 10],
74070                 ['point', 'leisure', '*', 10],
74071                 ['point', 'man_made', '*', 10],
74072                 ['point', 'natural', '*', 10],
74073                 ['point', 'shop', '*', 10],
74074                 ['point', 'tourism', '*', 10],
74075                 ['point', 'camp_site', '*', 10],
74076                 ['line', 'name', '*', 12],
74077                 ['area', 'name', '*', 12],
74078                 ['point', 'name', '*', 10]
74079             ];
74080
74081
74082             function blacklisted(preset) {
74083                 var noIcons = ['building', 'landuse', 'natural'];
74084                 return noIcons.some(function(s) {
74085                     return preset.id.indexOf(s) >= 0;
74086                 });
74087             }
74088
74089
74090             function get(array, prop) {
74091                 return function(d, i) { return array[i][prop]; };
74092             }
74093
74094
74095             function textWidth(text, size, elem) {
74096                 var c = _textWidthCache[size];
74097                 if (!c) c = _textWidthCache[size] = {};
74098
74099                 if (c[text]) {
74100                     return c[text];
74101
74102                 } else if (elem) {
74103                     c[text] = elem.getComputedTextLength();
74104                     return c[text];
74105
74106                 } else {
74107                     var str = encodeURIComponent(text).match(/%[CDEFcdef]/g);
74108                     if (str === null) {
74109                         return size / 3 * 2 * text.length;
74110                     } else {
74111                         return size / 3 * (2 * text.length + str.length);
74112                     }
74113                 }
74114             }
74115
74116
74117             function drawLinePaths(selection, entities, filter, classes, labels) {
74118                 var paths = selection.selectAll('path')
74119                     .filter(filter)
74120                     .data(entities, osmEntity.key);
74121
74122                 // exit
74123                 paths.exit()
74124                     .remove();
74125
74126                 // enter/update
74127                 paths.enter()
74128                     .append('path')
74129                     .style('stroke-width', get(labels, 'font-size'))
74130                     .attr('id', function(d) { return 'labelpath-' + d.id; })
74131                     .attr('class', classes)
74132                     .merge(paths)
74133                     .attr('d', get(labels, 'lineString'));
74134             }
74135
74136
74137             function drawLineLabels(selection, entities, filter, classes, labels) {
74138                 var texts = selection.selectAll('text.' + classes)
74139                     .filter(filter)
74140                     .data(entities, osmEntity.key);
74141
74142                 // exit
74143                 texts.exit()
74144                     .remove();
74145
74146                 // enter
74147                 texts.enter()
74148                     .append('text')
74149                     .attr('class', function(d, i) { return classes + ' ' + labels[i].classes + ' ' + d.id; })
74150                     .attr('dy', baselineHack ? '0.35em' : null)
74151                     .append('textPath')
74152                     .attr('class', 'textpath');
74153
74154                 // update
74155                 selection.selectAll('text.' + classes).selectAll('.textpath')
74156                     .filter(filter)
74157                     .data(entities, osmEntity.key)
74158                     .attr('startOffset', '50%')
74159                     .attr('xlink:href', function(d) { return '#labelpath-' + d.id; })
74160                     .text(utilDisplayNameForPath);
74161             }
74162
74163
74164             function drawPointLabels(selection, entities, filter, classes, labels) {
74165                 var texts = selection.selectAll('text.' + classes)
74166                     .filter(filter)
74167                     .data(entities, osmEntity.key);
74168
74169                 // exit
74170                 texts.exit()
74171                     .remove();
74172
74173                 // enter/update
74174                 texts.enter()
74175                     .append('text')
74176                     .attr('class', function(d, i) {
74177                         return classes + ' ' + labels[i].classes + ' ' + d.id;
74178                     })
74179                     .merge(texts)
74180                     .attr('x', get(labels, 'x'))
74181                     .attr('y', get(labels, 'y'))
74182                     .style('text-anchor', get(labels, 'textAnchor'))
74183                     .text(utilDisplayName)
74184                     .each(function(d, i) {
74185                         textWidth(utilDisplayName(d), labels[i].height, this);
74186                     });
74187             }
74188
74189
74190             function drawAreaLabels(selection, entities, filter, classes, labels) {
74191                 entities = entities.filter(hasText);
74192                 labels = labels.filter(hasText);
74193                 drawPointLabels(selection, entities, filter, classes, labels);
74194
74195                 function hasText(d, i) {
74196                     return labels[i].hasOwnProperty('x') && labels[i].hasOwnProperty('y');
74197                 }
74198             }
74199
74200
74201             function drawAreaIcons(selection, entities, filter, classes, labels) {
74202                 var icons = selection.selectAll('use.' + classes)
74203                     .filter(filter)
74204                     .data(entities, osmEntity.key);
74205
74206                 // exit
74207                 icons.exit()
74208                     .remove();
74209
74210                 // enter/update
74211                 icons.enter()
74212                     .append('use')
74213                     .attr('class', 'icon ' + classes)
74214                     .attr('width', '17px')
74215                     .attr('height', '17px')
74216                     .merge(icons)
74217                     .attr('transform', get(labels, 'transform'))
74218                     .attr('xlink:href', function(d) {
74219                         var preset = context.presets().match(d, context.graph());
74220                         var picon = preset && preset.icon;
74221
74222                         if (!picon) {
74223                             return '';
74224                         } else {
74225                             var isMaki = /^maki-/.test(picon);
74226                             return '#' + picon + (isMaki ? '-15' : '');
74227                         }
74228                     });
74229             }
74230
74231
74232             function drawCollisionBoxes(selection, rtree, which) {
74233                 var classes = 'debug ' + which + ' ' + (which === 'debug-skipped' ? 'orange' : 'yellow');
74234
74235                 var gj = [];
74236                 if (context.getDebug('collision')) {
74237                     gj = rtree.all().map(function(d) {
74238                         return { type: 'Polygon', coordinates: [[
74239                             [d.minX, d.minY],
74240                             [d.maxX, d.minY],
74241                             [d.maxX, d.maxY],
74242                             [d.minX, d.maxY],
74243                             [d.minX, d.minY]
74244                         ]]};
74245                     });
74246                 }
74247
74248                 var boxes = selection.selectAll('.' + which)
74249                     .data(gj);
74250
74251                 // exit
74252                 boxes.exit()
74253                     .remove();
74254
74255                 // enter/update
74256                 boxes.enter()
74257                     .append('path')
74258                     .attr('class', classes)
74259                     .merge(boxes)
74260                     .attr('d', d3_geoPath());
74261             }
74262
74263
74264             function drawLabels(selection, graph, entities, filter, dimensions, fullRedraw) {
74265                 var wireframe = context.surface().classed('fill-wireframe');
74266                 var zoom = geoScaleToZoom(projection.scale());
74267
74268                 var labelable = [];
74269                 var renderNodeAs = {};
74270                 var i, j, k, entity, geometry;
74271
74272                 for (i = 0; i < labelStack.length; i++) {
74273                     labelable.push([]);
74274                 }
74275
74276                 if (fullRedraw) {
74277                     _rdrawn.clear();
74278                     _rskipped.clear();
74279                     _entitybboxes = {};
74280
74281                 } else {
74282                     for (i = 0; i < entities.length; i++) {
74283                         entity = entities[i];
74284                         var toRemove = []
74285                             .concat(_entitybboxes[entity.id] || [])
74286                             .concat(_entitybboxes[entity.id + 'I'] || []);
74287
74288                         for (j = 0; j < toRemove.length; j++) {
74289                             _rdrawn.remove(toRemove[j]);
74290                             _rskipped.remove(toRemove[j]);
74291                         }
74292                     }
74293                 }
74294
74295                 // Loop through all the entities to do some preprocessing
74296                 for (i = 0; i < entities.length; i++) {
74297                     entity = entities[i];
74298                     geometry = entity.geometry(graph);
74299
74300                     // Insert collision boxes around interesting points/vertices
74301                     if (geometry === 'point' || (geometry === 'vertex' && isInterestingVertex(entity))) {
74302                         var hasDirections = entity.directions(graph, projection).length;
74303                         var markerPadding;
74304
74305                         if (!wireframe && geometry === 'point' && !(zoom >= 18 && hasDirections)) {
74306                             renderNodeAs[entity.id] = 'point';
74307                             markerPadding = 20;   // extra y for marker height
74308                         } else {
74309                             renderNodeAs[entity.id] = 'vertex';
74310                             markerPadding = 0;
74311                         }
74312
74313                         var coord = projection(entity.loc);
74314                         var nodePadding = 10;
74315                         var bbox = {
74316                             minX: coord[0] - nodePadding,
74317                             minY: coord[1] - nodePadding - markerPadding,
74318                             maxX: coord[0] + nodePadding,
74319                             maxY: coord[1] + nodePadding
74320                         };
74321
74322                         doInsert(bbox, entity.id + 'P');
74323                     }
74324
74325                     // From here on, treat vertices like points
74326                     if (geometry === 'vertex') {
74327                         geometry = 'point';
74328                     }
74329
74330                     // Determine which entities are label-able
74331                     var preset = geometry === 'area' && context.presets().match(entity, graph);
74332                     var icon = preset && !blacklisted(preset) && preset.icon;
74333
74334                     if (!icon && !utilDisplayName(entity))
74335                         continue;
74336
74337                     for (k = 0; k < labelStack.length; k++) {
74338                         var matchGeom = labelStack[k][0];
74339                         var matchKey = labelStack[k][1];
74340                         var matchVal = labelStack[k][2];
74341                         var hasVal = entity.tags[matchKey];
74342
74343                         if (geometry === matchGeom && hasVal && (matchVal === '*' || matchVal === hasVal)) {
74344                             labelable[k].push(entity);
74345                             break;
74346                         }
74347                     }
74348                 }
74349
74350                 var positions = {
74351                     point: [],
74352                     line: [],
74353                     area: []
74354                 };
74355
74356                 var labelled = {
74357                     point: [],
74358                     line: [],
74359                     area: []
74360                 };
74361
74362                 // Try and find a valid label for labellable entities
74363                 for (k = 0; k < labelable.length; k++) {
74364                     var fontSize = labelStack[k][3];
74365
74366                     for (i = 0; i < labelable[k].length; i++) {
74367                         entity = labelable[k][i];
74368                         geometry = entity.geometry(graph);
74369
74370                         var getName = (geometry === 'line') ? utilDisplayNameForPath : utilDisplayName;
74371                         var name = getName(entity);
74372                         var width = name && textWidth(name, fontSize);
74373                         var p = null;
74374
74375                         if (geometry === 'point' || geometry === 'vertex') {
74376                             // no point or vertex labels in wireframe mode
74377                             // no vertex labels at low zooms (vertices have no icons)
74378                             if (wireframe) continue;
74379                             var renderAs = renderNodeAs[entity.id];
74380                             if (renderAs === 'vertex' && zoom < 17) continue;
74381
74382                             p = getPointLabel(entity, width, fontSize, renderAs);
74383
74384                         } else if (geometry === 'line') {
74385                             p = getLineLabel(entity, width, fontSize);
74386
74387                         } else if (geometry === 'area') {
74388                             p = getAreaLabel(entity, width, fontSize);
74389                         }
74390
74391                         if (p) {
74392                             if (geometry === 'vertex') { geometry = 'point'; }  // treat vertex like point
74393                             p.classes = geometry + ' tag-' + labelStack[k][1];
74394                             positions[geometry].push(p);
74395                             labelled[geometry].push(entity);
74396                         }
74397                     }
74398                 }
74399
74400
74401                 function isInterestingVertex(entity) {
74402                     var selectedIDs = context.selectedIDs();
74403
74404                     return entity.hasInterestingTags() ||
74405                         entity.isEndpoint(graph) ||
74406                         entity.isConnected(graph) ||
74407                         selectedIDs.indexOf(entity.id) !== -1 ||
74408                         graph.parentWays(entity).some(function(parent) {
74409                             return selectedIDs.indexOf(parent.id) !== -1;
74410                         });
74411                 }
74412
74413
74414                 function getPointLabel(entity, width, height, geometry) {
74415                     var y = (geometry === 'point' ? -12 : 0);
74416                     var pointOffsets = {
74417                         ltr: [15, y, 'start'],
74418                         rtl: [-15, y, 'end']
74419                     };
74420
74421                     var coord = projection(entity.loc);
74422                     var textPadding = 2;
74423                     var offset = pointOffsets[textDirection];
74424                     var p = {
74425                         height: height,
74426                         width: width,
74427                         x: coord[0] + offset[0],
74428                         y: coord[1] + offset[1],
74429                         textAnchor: offset[2]
74430                     };
74431
74432                     // insert a collision box for the text label..
74433                     var bbox;
74434                     if (textDirection === 'rtl') {
74435                         bbox = {
74436                             minX: p.x - width - textPadding,
74437                             minY: p.y - (height / 2) - textPadding,
74438                             maxX: p.x + textPadding,
74439                             maxY: p.y + (height / 2) + textPadding
74440                         };
74441                     } else {
74442                         bbox = {
74443                             minX: p.x - textPadding,
74444                             minY: p.y - (height / 2) - textPadding,
74445                             maxX: p.x + width + textPadding,
74446                             maxY: p.y + (height / 2) + textPadding
74447                         };
74448                     }
74449
74450                     if (tryInsert([bbox], entity.id, true)) {
74451                         return p;
74452                     }
74453                 }
74454
74455
74456                 function getLineLabel(entity, width, height) {
74457                     var viewport = geoExtent(context.projection.clipExtent()).polygon();
74458                     var points = graph.childNodes(entity)
74459                         .map(function(node) { return projection(node.loc); });
74460                     var length = geoPathLength(points);
74461
74462                     if (length < width + 20) return;
74463
74464                     // todo: properly clip points to viewport
74465
74466                     // % along the line to attempt to place the label
74467                     var lineOffsets = [50, 45, 55, 40, 60, 35, 65, 30, 70,
74468                                        25, 75, 20, 80, 15, 95, 10, 90, 5, 95];
74469                     var padding = 3;
74470
74471                     for (var i = 0; i < lineOffsets.length; i++) {
74472                         var offset = lineOffsets[i];
74473                         var middle = offset / 100 * length;
74474                         var start = middle - width / 2;
74475
74476                         if (start < 0 || start + width > length) continue;
74477
74478                         // generate subpath and ignore paths that are invalid or don't cross viewport.
74479                         var sub = subpath(points, start, start + width);
74480                         if (!sub || !geoPolygonIntersectsPolygon(viewport, sub, true)) {
74481                             continue;
74482                         }
74483
74484                         var isReverse = reverse(sub);
74485                         if (isReverse) {
74486                             sub = sub.reverse();
74487                         }
74488
74489                         var bboxes = [];
74490                         var boxsize = (height + 2) / 2;
74491
74492                         for (var j = 0; j < sub.length - 1; j++) {
74493                             var a = sub[j];
74494                             var b = sub[j + 1];
74495
74496                             // split up the text into small collision boxes
74497                             var num = Math.max(1, Math.floor(geoVecLength(a, b) / boxsize / 2));
74498
74499                             for (var box = 0; box < num; box++) {
74500                                 var p = geoVecInterp(a, b, box / num);
74501                                 var x0 = p[0] - boxsize - padding;
74502                                 var y0 = p[1] - boxsize - padding;
74503                                 var x1 = p[0] + boxsize + padding;
74504                                 var y1 = p[1] + boxsize + padding;
74505
74506                                 bboxes.push({
74507                                     minX: Math.min(x0, x1),
74508                                     minY: Math.min(y0, y1),
74509                                     maxX: Math.max(x0, x1),
74510                                     maxY: Math.max(y0, y1)
74511                                 });
74512                             }
74513                         }
74514
74515                         if (tryInsert(bboxes, entity.id, false)) {   // accept this one
74516                             return {
74517                                 'font-size': height + 2,
74518                                 lineString: lineString(sub),
74519                                 startOffset: offset + '%'
74520                             };
74521                         }
74522                     }
74523
74524                     function reverse(p) {
74525                         var angle = Math.atan2(p[1][1] - p[0][1], p[1][0] - p[0][0]);
74526                         return !(p[0][0] < p[p.length - 1][0] && angle < Math.PI/2 && angle > -Math.PI/2);
74527                     }
74528
74529                     function lineString(points) {
74530                         return 'M' + points.join('L');
74531                     }
74532
74533                     function subpath(points, from, to) {
74534                         var sofar = 0;
74535                         var start, end, i0, i1;
74536
74537                         for (var i = 0; i < points.length - 1; i++) {
74538                             var a = points[i];
74539                             var b = points[i + 1];
74540                             var current = geoVecLength(a, b);
74541                             var portion;
74542                             if (!start && sofar + current >= from) {
74543                                 portion = (from - sofar) / current;
74544                                 start = [
74545                                     a[0] + portion * (b[0] - a[0]),
74546                                     a[1] + portion * (b[1] - a[1])
74547                                 ];
74548                                 i0 = i + 1;
74549                             }
74550                             if (!end && sofar + current >= to) {
74551                                 portion = (to - sofar) / current;
74552                                 end = [
74553                                     a[0] + portion * (b[0] - a[0]),
74554                                     a[1] + portion * (b[1] - a[1])
74555                                 ];
74556                                 i1 = i + 1;
74557                             }
74558                             sofar += current;
74559                         }
74560
74561                         var result = points.slice(i0, i1);
74562                         result.unshift(start);
74563                         result.push(end);
74564                         return result;
74565                     }
74566                 }
74567
74568
74569                 function getAreaLabel(entity, width, height) {
74570                     var centroid = path.centroid(entity.asGeoJSON(graph, true));
74571                     var extent = entity.extent(graph);
74572                     var areaWidth = projection(extent[1])[0] - projection(extent[0])[0];
74573
74574                     if (isNaN(centroid[0]) || areaWidth < 20) return;
74575
74576                     var preset = context.presets().match(entity, context.graph());
74577                     var picon = preset && preset.icon;
74578                     var iconSize = 17;
74579                     var padding = 2;
74580                     var p = {};
74581
74582                     if (picon) {  // icon and label..
74583                         if (addIcon()) {
74584                             addLabel(iconSize + padding);
74585                             return p;
74586                         }
74587                     } else {   // label only..
74588                         if (addLabel(0)) {
74589                             return p;
74590                         }
74591                     }
74592
74593
74594                     function addIcon() {
74595                         var iconX = centroid[0] - (iconSize / 2);
74596                         var iconY = centroid[1] - (iconSize / 2);
74597                         var bbox = {
74598                             minX: iconX,
74599                             minY: iconY,
74600                             maxX: iconX + iconSize,
74601                             maxY: iconY + iconSize
74602                         };
74603
74604                         if (tryInsert([bbox], entity.id + 'I', true)) {
74605                             p.transform = 'translate(' + iconX + ',' + iconY + ')';
74606                             return true;
74607                         }
74608                         return false;
74609                     }
74610
74611                     function addLabel(yOffset) {
74612                         if (width && areaWidth >= width + 20) {
74613                             var labelX = centroid[0];
74614                             var labelY = centroid[1] + yOffset;
74615                             var bbox = {
74616                                 minX: labelX - (width / 2) - padding,
74617                                 minY: labelY - (height / 2) - padding,
74618                                 maxX: labelX + (width / 2) + padding,
74619                                 maxY: labelY + (height / 2) + padding
74620                             };
74621
74622                             if (tryInsert([bbox], entity.id, true)) {
74623                                 p.x = labelX;
74624                                 p.y = labelY;
74625                                 p.textAnchor = 'middle';
74626                                 p.height = height;
74627                                 return true;
74628                             }
74629                         }
74630                         return false;
74631                     }
74632                 }
74633
74634
74635                 // force insert a singular bounding box
74636                 // singular box only, no array, id better be unique
74637                 function doInsert(bbox, id) {
74638                     bbox.id = id;
74639
74640                     var oldbox = _entitybboxes[id];
74641                     if (oldbox) {
74642                         _rdrawn.remove(oldbox);
74643                     }
74644                     _entitybboxes[id] = bbox;
74645                     _rdrawn.insert(bbox);
74646                 }
74647
74648
74649                 function tryInsert(bboxes, id, saveSkipped) {
74650                     var skipped = false;
74651
74652                     for (var i = 0; i < bboxes.length; i++) {
74653                         var bbox = bboxes[i];
74654                         bbox.id = id;
74655
74656                         // Check that label is visible
74657                         if (bbox.minX < 0 || bbox.minY < 0 || bbox.maxX > dimensions[0] || bbox.maxY > dimensions[1]) {
74658                             skipped = true;
74659                             break;
74660                         }
74661                         if (_rdrawn.collides(bbox)) {
74662                             skipped = true;
74663                             break;
74664                         }
74665                     }
74666
74667                     _entitybboxes[id] = bboxes;
74668
74669                     if (skipped) {
74670                         if (saveSkipped) {
74671                             _rskipped.load(bboxes);
74672                         }
74673                     } else {
74674                         _rdrawn.load(bboxes);
74675                     }
74676
74677                     return !skipped;
74678                 }
74679
74680
74681                 var layer = selection.selectAll('.layer-osm.labels');
74682                 layer.selectAll('.labels-group')
74683                     .data(['halo', 'label', 'debug'])
74684                     .enter()
74685                     .append('g')
74686                     .attr('class', function(d) { return 'labels-group ' + d; });
74687
74688                 var halo = layer.selectAll('.labels-group.halo');
74689                 var label = layer.selectAll('.labels-group.label');
74690                 var debug = layer.selectAll('.labels-group.debug');
74691
74692                 // points
74693                 drawPointLabels(label, labelled.point, filter, 'pointlabel', positions.point);
74694                 drawPointLabels(halo, labelled.point, filter, 'pointlabel-halo', positions.point);
74695
74696                 // lines
74697                 drawLinePaths(layer, labelled.line, filter, '', positions.line);
74698                 drawLineLabels(label, labelled.line, filter, 'linelabel', positions.line);
74699                 drawLineLabels(halo, labelled.line, filter, 'linelabel-halo', positions.line);
74700
74701                 // areas
74702                 drawAreaLabels(label, labelled.area, filter, 'arealabel', positions.area);
74703                 drawAreaLabels(halo, labelled.area, filter, 'arealabel-halo', positions.area);
74704                 drawAreaIcons(label, labelled.area, filter, 'areaicon', positions.area);
74705                 drawAreaIcons(halo, labelled.area, filter, 'areaicon-halo', positions.area);
74706
74707                 // debug
74708                 drawCollisionBoxes(debug, _rskipped, 'debug-skipped');
74709                 drawCollisionBoxes(debug, _rdrawn, 'debug-drawn');
74710
74711                 layer.call(filterLabels);
74712             }
74713
74714
74715             function filterLabels(selection) {
74716                 var drawLayer = selection.selectAll('.layer-osm.labels');
74717                 var layers = drawLayer.selectAll('.labels-group.halo, .labels-group.label');
74718
74719                 layers.selectAll('.nolabel')
74720                     .classed('nolabel', false);
74721
74722                 var mouse = context.mouse();
74723                 var graph = context.graph();
74724                 var selectedIDs = context.selectedIDs();
74725                 var ids = [];
74726                 var pad, bbox;
74727
74728                 // hide labels near the mouse
74729                 if (mouse) {
74730                     pad = 20;
74731                     bbox = { minX: mouse[0] - pad, minY: mouse[1] - pad, maxX: mouse[0] + pad, maxY: mouse[1] + pad };
74732                     var nearMouse = _rdrawn.search(bbox).map(function(entity) { return entity.id; });
74733                     ids.push.apply(ids, nearMouse);
74734                 }
74735
74736                 // hide labels on selected nodes (they look weird when dragging / haloed)
74737                 for (var i = 0; i < selectedIDs.length; i++) {
74738                     var entity = graph.hasEntity(selectedIDs[i]);
74739                     if (entity && entity.type === 'node') {
74740                         ids.push(selectedIDs[i]);
74741                     }
74742                 }
74743
74744                 layers.selectAll(utilEntitySelector(ids))
74745                     .classed('nolabel', true);
74746
74747
74748                 // draw the mouse bbox if debugging is on..
74749                 var debug = selection.selectAll('.labels-group.debug');
74750                 var gj = [];
74751                 if (context.getDebug('collision')) {
74752                     gj = bbox ? [{
74753                         type: 'Polygon',
74754                         coordinates: [[
74755                             [bbox.minX, bbox.minY],
74756                             [bbox.maxX, bbox.minY],
74757                             [bbox.maxX, bbox.maxY],
74758                             [bbox.minX, bbox.maxY],
74759                             [bbox.minX, bbox.minY]
74760                         ]]
74761                     }] : [];
74762                 }
74763
74764                 var box = debug.selectAll('.debug-mouse')
74765                     .data(gj);
74766
74767                 // exit
74768                 box.exit()
74769                     .remove();
74770
74771                 // enter/update
74772                 box.enter()
74773                     .append('path')
74774                     .attr('class', 'debug debug-mouse yellow')
74775                     .merge(box)
74776                     .attr('d', d3_geoPath());
74777             }
74778
74779
74780             var throttleFilterLabels = throttle(filterLabels, 100);
74781
74782
74783             drawLabels.observe = function(selection) {
74784                 var listener = function() { throttleFilterLabels(selection); };
74785                 selection.on('mousemove.hidelabels', listener);
74786                 context.on('enter.hidelabels', listener);
74787             };
74788
74789
74790             drawLabels.off = function(selection) {
74791                 throttleFilterLabels.cancel();
74792                 selection.on('mousemove.hidelabels', null);
74793                 context.on('enter.hidelabels', null);
74794             };
74795
74796
74797             return drawLabels;
74798         }
74799
74800         var _improveOsmEnabled = false;
74801         var _errorService;
74802
74803
74804         function svgImproveOSM(projection, context, dispatch) {
74805             var throttledRedraw = throttle(function () { dispatch.call('change'); }, 1000);
74806             var minZoom = 12;
74807             var touchLayer = d3_select(null);
74808             var drawLayer = d3_select(null);
74809             var _improveOsmVisible = false;
74810
74811             function markerPath(selection, klass) {
74812                 selection
74813                     .attr('class', klass)
74814                     .attr('transform', 'translate(-10, -28)')
74815                     .attr('points', '16,3 4,3 1,6 1,17 4,20 7,20 10,27 13,20 16,20 19,17.033 19,6');
74816             }
74817
74818
74819             // Loosely-coupled improveOSM service for fetching errors.
74820             function getService() {
74821                 if (services$1.improveOSM && !_errorService) {
74822                     _errorService = services$1.improveOSM;
74823                     _errorService.on('loaded', throttledRedraw);
74824                 } else if (!services$1.improveOSM && _errorService) {
74825                     _errorService = null;
74826                 }
74827
74828                 return _errorService;
74829             }
74830
74831
74832             // Show the errors
74833             function editOn() {
74834                 if (!_improveOsmVisible) {
74835                     _improveOsmVisible = true;
74836                     drawLayer
74837                         .style('display', 'block');
74838                 }
74839             }
74840
74841
74842             // Immediately remove the errors and their touch targets
74843             function editOff() {
74844                 if (_improveOsmVisible) {
74845                     _improveOsmVisible = false;
74846                     drawLayer
74847                         .style('display', 'none');
74848                     drawLayer.selectAll('.qa_error.improveOSM')
74849                         .remove();
74850                     touchLayer.selectAll('.qa_error.improveOSM')
74851                         .remove();
74852                 }
74853             }
74854
74855
74856             // Enable the layer.  This shows the errors and transitions them to visible.
74857             function layerOn() {
74858                 editOn();
74859
74860                 drawLayer
74861                     .style('opacity', 0)
74862                     .transition()
74863                     .duration(250)
74864                     .style('opacity', 1)
74865                     .on('end interrupt', function () {
74866                         dispatch.call('change');
74867                     });
74868             }
74869
74870
74871             // Disable the layer.  This transitions the layer invisible and then hides the errors.
74872             function layerOff() {
74873                 throttledRedraw.cancel();
74874                 drawLayer.interrupt();
74875                 touchLayer.selectAll('.qa_error.improveOSM')
74876                     .remove();
74877
74878                 drawLayer
74879                     .transition()
74880                     .duration(250)
74881                     .style('opacity', 0)
74882                     .on('end interrupt', function () {
74883                         editOff();
74884                         dispatch.call('change');
74885                     });
74886             }
74887
74888
74889             // Update the error markers
74890             function updateMarkers() {
74891                 if (!_improveOsmVisible || !_improveOsmEnabled) return;
74892
74893                 var service = getService();
74894                 var selectedID = context.selectedErrorID();
74895                 var data = (service ? service.getErrors(projection) : []);
74896                 var getTransform = svgPointTransform(projection);
74897
74898                 // Draw markers..
74899                 var markers = drawLayer.selectAll('.qa_error.improveOSM')
74900                     .data(data, function(d) { return d.id; });
74901
74902                 // exit
74903                 markers.exit()
74904                     .remove();
74905
74906                 // enter
74907                 var markersEnter = markers.enter()
74908                     .append('g')
74909                     .attr('class', function(d) {
74910                         return [
74911                             'qa_error',
74912                             d.service,
74913                             'error_id-' + d.id,
74914                             'error_type-' + d.error_type,
74915                             'category-' + d.category
74916                         ].join(' ');
74917                     });
74918
74919                 markersEnter
74920                     .append('polygon')
74921                     .call(markerPath, 'shadow');
74922
74923                 markersEnter
74924                     .append('ellipse')
74925                     .attr('cx', 0)
74926                     .attr('cy', 0)
74927                     .attr('rx', 4.5)
74928                     .attr('ry', 2)
74929                     .attr('class', 'stroke');
74930
74931                 markersEnter
74932                     .append('polygon')
74933                     .attr('fill', 'currentColor')
74934                     .call(markerPath, 'qa_error-fill');
74935
74936                 markersEnter
74937                     .append('use')
74938                     .attr('transform', 'translate(-5.5, -21)')
74939                     .attr('class', 'icon-annotation')
74940                     .attr('width', '11px')
74941                     .attr('height', '11px')
74942                     .attr('xlink:href', function(d) {
74943                         var picon = d.icon;
74944
74945                         if (!picon) {
74946                             return '';
74947                         } else {
74948                             var isMaki = /^maki-/.test(picon);
74949                             return '#' + picon + (isMaki ? '-11' : '');
74950                         }
74951                     });
74952
74953                 // update
74954                 markers
74955                     .merge(markersEnter)
74956                     .sort(sortY)
74957                     .classed('selected', function(d) { return d.id === selectedID; })
74958                     .attr('transform', getTransform);
74959
74960
74961                 // Draw targets..
74962                 if (touchLayer.empty()) return;
74963                 var fillClass = context.getDebug('target') ? 'pink ' : 'nocolor ';
74964
74965                 var targets = touchLayer.selectAll('.qa_error.improveOSM')
74966                     .data(data, function(d) { return d.id; });
74967
74968                 // exit
74969                 targets.exit()
74970                     .remove();
74971
74972                 // enter/update
74973                 targets.enter()
74974                     .append('rect')
74975                     .attr('width', '20px')
74976                     .attr('height', '30px')
74977                     .attr('x', '-10px')
74978                     .attr('y', '-28px')
74979                     .merge(targets)
74980                     .sort(sortY)
74981                     .attr('class', function(d) {
74982                         return 'qa_error ' + d.service + ' target error_id-' + d.id + ' ' + fillClass;
74983                     })
74984                     .attr('transform', getTransform);
74985
74986
74987                 function sortY(a, b) {
74988                     return (a.id === selectedID) ? 1
74989                         : (b.id === selectedID) ? -1
74990                         : b.loc[1] - a.loc[1];
74991                 }
74992             }
74993
74994
74995             // Draw the ImproveOSM layer and schedule loading errors and updating markers.
74996             function drawImproveOSM(selection) {
74997                 var service = getService();
74998
74999                 var surface = context.surface();
75000                 if (surface && !surface.empty()) {
75001                     touchLayer = surface.selectAll('.data-layer.touch .layer-touch.markers');
75002                 }
75003
75004                 drawLayer = selection.selectAll('.layer-improveOSM')
75005                     .data(service ? [0] : []);
75006
75007                 drawLayer.exit()
75008                     .remove();
75009
75010                 drawLayer = drawLayer.enter()
75011                     .append('g')
75012                     .attr('class', 'layer-improveOSM')
75013                     .style('display', _improveOsmEnabled ? 'block' : 'none')
75014                     .merge(drawLayer);
75015
75016                 if (_improveOsmEnabled) {
75017                     if (service && ~~context.map().zoom() >= minZoom) {
75018                         editOn();
75019                         service.loadErrors(projection);
75020                         updateMarkers();
75021                     } else {
75022                         editOff();
75023                     }
75024                 }
75025             }
75026
75027
75028             // Toggles the layer on and off
75029             drawImproveOSM.enabled = function(val) {
75030                 if (!arguments.length) return _improveOsmEnabled;
75031
75032                 _improveOsmEnabled = val;
75033                 if (_improveOsmEnabled) {
75034                     layerOn();
75035                 } else {
75036                     layerOff();
75037                     if (context.selectedErrorID()) {
75038                         context.enter(modeBrowse(context));
75039                     }
75040                 }
75041
75042                 dispatch.call('change');
75043                 return this;
75044             };
75045
75046
75047             drawImproveOSM.supported = function() {
75048                 return !!getService();
75049             };
75050
75051
75052             return drawImproveOSM;
75053         }
75054
75055         function svgStreetside(projection, context, dispatch) {
75056             var throttledRedraw = throttle(function () { dispatch.call('change'); }, 1000);
75057             var minZoom = 14;
75058             var minMarkerZoom = 16;
75059             var minViewfieldZoom = 18;
75060             var layer = d3_select(null);
75061             var _viewerYaw = 0;
75062             var _selectedSequence = null;
75063             var _streetside;
75064
75065             /**
75066              * init().
75067              */
75068             function init() {
75069                 if (svgStreetside.initialized) return;  // run once
75070                 svgStreetside.enabled = false;
75071                 svgStreetside.initialized = true;
75072             }
75073
75074             /**
75075              * getService().
75076              */
75077             function getService() {
75078                 if (services$1.streetside && !_streetside) {
75079                     _streetside = services$1.streetside;
75080                     _streetside.event
75081                         .on('viewerChanged', viewerChanged)
75082                         .on('loadedBubbles', throttledRedraw);
75083                 } else if (!services$1.streetside && _streetside) {
75084                     _streetside = null;
75085                 }
75086
75087                 return _streetside;
75088             }
75089
75090             /**
75091              * showLayer().
75092              */
75093             function showLayer() {
75094                 var service = getService();
75095                 if (!service) return;
75096
75097                 editOn();
75098
75099                 layer
75100                     .style('opacity', 0)
75101                     .transition()
75102                     .duration(250)
75103                     .style('opacity', 1)
75104                     .on('end', function () { dispatch.call('change'); });
75105             }
75106
75107             /**
75108              * hideLayer().
75109              */
75110             function hideLayer() {
75111                 throttledRedraw.cancel();
75112
75113                 layer
75114                     .transition()
75115                     .duration(250)
75116                     .style('opacity', 0)
75117                     .on('end', editOff);
75118             }
75119
75120             /**
75121              * editOn().
75122              */
75123             function editOn() {
75124                 layer.style('display', 'block');
75125             }
75126
75127             /**
75128              * editOff().
75129              */
75130             function editOff() {
75131                 layer.selectAll('.viewfield-group').remove();
75132                 layer.style('display', 'none');
75133             }
75134
75135             /**
75136              * click() Handles 'bubble' point click event.
75137              */
75138             function click(d) {
75139                 var service = getService();
75140                 if (!service) return;
75141
75142                 // try to preserve the viewer rotation when staying on the same sequence
75143                 if (d.sequenceKey !== _selectedSequence) {
75144                     _viewerYaw = 0;  // reset
75145                 }
75146                 _selectedSequence = d.sequenceKey;
75147
75148                 service
75149                     .selectImage(d)
75150                     .then(function(r) {
75151                         if (r.status === 'ok'){
75152                             service.showViewer(_viewerYaw);
75153                         }
75154                     });
75155
75156
75157                 context.map().centerEase(d.loc);
75158             }
75159
75160             /**
75161              * mouseover().
75162              */
75163             function mouseover(d) {
75164                 var service = getService();
75165                 if (service) service.setStyles(d);
75166             }
75167
75168             /**
75169              * mouseout().
75170              */
75171             function mouseout() {
75172                 var service = getService();
75173                 if (service) service.setStyles(null);
75174             }
75175
75176             /**
75177              * transform().
75178              */
75179             function transform(d) {
75180                 var t = svgPointTransform(projection)(d);
75181                 var rot = d.ca + _viewerYaw;
75182                 if (rot) {
75183                     t += ' rotate(' + Math.floor(rot) + ',0,0)';
75184                 }
75185                 return t;
75186             }
75187
75188
75189             function viewerChanged() {
75190                 var service = getService();
75191                 if (!service) return;
75192
75193                 var viewer = service.viewer();
75194                 if (!viewer) return;
75195
75196                 // update viewfield rotation
75197                 _viewerYaw = viewer.getYaw();
75198
75199                 // avoid updating if the map is currently transformed
75200                 // e.g. during drags or easing.
75201                 if (context.map().isTransformed()) return;
75202
75203                 layer.selectAll('.viewfield-group.currentView')
75204                     .attr('transform', transform);
75205             }
75206
75207
75208             context.photos().on('change.streetside', update);
75209
75210             /**
75211              * update().
75212              */
75213             function update() {
75214                 var viewer = d3_select('#photoviewer');
75215                 var selected = viewer.empty() ? undefined : viewer.datum();
75216                 var z = ~~context.map().zoom();
75217                 var showMarkers = (z >= minMarkerZoom);
75218                 var showViewfields = (z >= minViewfieldZoom);
75219                 var service = getService();
75220
75221                 var sequences = [];
75222                 var bubbles = [];
75223
75224                 if (context.photos().showsPanoramic()) {
75225                     sequences = (service ? service.sequences(projection) : []);
75226                     bubbles = (service && showMarkers ? service.bubbles(projection) : []);
75227                 }
75228
75229                 var traces = layer.selectAll('.sequences').selectAll('.sequence')
75230                     .data(sequences, function(d) { return d.properties.key; });
75231
75232                 // exit
75233                 traces.exit()
75234                     .remove();
75235
75236                 // enter/update
75237                 traces = traces.enter()
75238                     .append('path')
75239                     .attr('class', 'sequence')
75240                     .merge(traces)
75241                     .attr('d', svgPath(projection).geojson);
75242
75243
75244                 var groups = layer.selectAll('.markers').selectAll('.viewfield-group')
75245                     .data(bubbles, function(d) {
75246                         // force reenter once bubbles are attached to a sequence
75247                         return d.key + (d.sequenceKey ? 'v1' : 'v0');
75248                     });
75249
75250                 // exit
75251                 groups.exit()
75252                     .remove();
75253
75254                 // enter
75255                 var groupsEnter = groups.enter()
75256                     .append('g')
75257                     .attr('class', 'viewfield-group')
75258                     .on('mouseenter', mouseover)
75259                     .on('mouseleave', mouseout)
75260                     .on('click', click);
75261
75262                 groupsEnter
75263                     .append('g')
75264                     .attr('class', 'viewfield-scale');
75265
75266                 // update
75267                 var markers = groups
75268                     .merge(groupsEnter)
75269                     .sort(function(a, b) {
75270                         return (a === selected) ? 1
75271                             : (b === selected) ? -1
75272                             : b.loc[1] - a.loc[1];
75273                     })
75274                     .attr('transform', transform)
75275                     .select('.viewfield-scale');
75276
75277
75278                 markers.selectAll('circle')
75279                     .data([0])
75280                     .enter()
75281                     .append('circle')
75282                     .attr('dx', '0')
75283                     .attr('dy', '0')
75284                     .attr('r', '6');
75285
75286                 var viewfields = markers.selectAll('.viewfield')
75287                     .data(showViewfields ? [0] : []);
75288
75289                 viewfields.exit()
75290                     .remove();
75291
75292                 // viewfields may or may not be drawn...
75293                 // but if they are, draw below the circles
75294                 viewfields.enter()
75295                     .insert('path', 'circle')
75296                     .attr('class', 'viewfield')
75297                     .attr('transform', 'scale(1.5,1.5),translate(-8, -13)')
75298                     .attr('d', viewfieldPath);
75299
75300                 function viewfieldPath() {
75301                     var d = this.parentNode.__data__;
75302                     if (d.pano) {
75303                         return 'M 8,13 m -10,0 a 10,10 0 1,0 20,0 a 10,10 0 1,0 -20,0';
75304                     } else {
75305                         return 'M 6,9 C 8,8.4 8,8.4 10,9 L 16,-2 C 12,-5 4,-5 0,-2 z';
75306                     }
75307                 }
75308
75309             }
75310
75311             /**
75312              * drawImages()
75313              * drawImages is the method that is returned (and that runs) everytime 'svgStreetside()' is called.
75314              * 'svgStreetside()' is called from index.js
75315              */
75316             function drawImages(selection) {
75317                 var enabled = svgStreetside.enabled;
75318                 var service = getService();
75319
75320                 layer = selection.selectAll('.layer-streetside-images')
75321                     .data(service ? [0] : []);
75322
75323                 layer.exit()
75324                     .remove();
75325
75326                 var layerEnter = layer.enter()
75327                     .append('g')
75328                     .attr('class', 'layer-streetside-images')
75329                     .style('display', enabled ? 'block' : 'none');
75330
75331                 layerEnter
75332                     .append('g')
75333                     .attr('class', 'sequences');
75334
75335                 layerEnter
75336                     .append('g')
75337                     .attr('class', 'markers');
75338
75339                 layer = layerEnter
75340                     .merge(layer);
75341
75342                 if (enabled) {
75343                     if (service && ~~context.map().zoom() >= minZoom) {
75344                         editOn();
75345                         update();
75346                         service.loadBubbles(projection);
75347                     } else {
75348                         editOff();
75349                     }
75350                 }
75351             }
75352
75353
75354             /**
75355              * drawImages.enabled().
75356              */
75357             drawImages.enabled = function(_) {
75358                 if (!arguments.length) return svgStreetside.enabled;
75359                 svgStreetside.enabled = _;
75360                 if (svgStreetside.enabled) {
75361                     showLayer();
75362                 } else {
75363                     hideLayer();
75364                 }
75365                 dispatch.call('change');
75366                 return this;
75367             };
75368
75369             /**
75370              * drawImages.supported().
75371              */
75372             drawImages.supported = function() {
75373                 return !!getService();
75374             };
75375
75376             init();
75377
75378             return drawImages;
75379         }
75380
75381         function svgMapillaryImages(projection, context, dispatch) {
75382             var throttledRedraw = throttle(function () { dispatch.call('change'); }, 1000);
75383             var minZoom = 12;
75384             var minMarkerZoom = 16;
75385             var minViewfieldZoom = 18;
75386             var layer = d3_select(null);
75387             var _mapillary;
75388             var viewerCompassAngle;
75389
75390
75391             function init() {
75392                 if (svgMapillaryImages.initialized) return;  // run once
75393                 svgMapillaryImages.enabled = false;
75394                 svgMapillaryImages.initialized = true;
75395             }
75396
75397
75398             function getService() {
75399                 if (services$1.mapillary && !_mapillary) {
75400                     _mapillary = services$1.mapillary;
75401                     _mapillary.event.on('loadedImages', throttledRedraw);
75402                     _mapillary.event.on('bearingChanged', function(e) {
75403                         viewerCompassAngle = e;
75404
75405                         // avoid updating if the map is currently transformed
75406                         // e.g. during drags or easing.
75407                         if (context.map().isTransformed()) return;
75408
75409                         layer.selectAll('.viewfield-group.currentView')
75410                             .filter(function(d) {
75411                                 return d.pano;
75412                             })
75413                             .attr('transform', transform);
75414                     });
75415                 } else if (!services$1.mapillary && _mapillary) {
75416                     _mapillary = null;
75417                 }
75418
75419                 return _mapillary;
75420             }
75421
75422
75423             function showLayer() {
75424                 var service = getService();
75425                 if (!service) return;
75426
75427                 editOn();
75428
75429                 layer
75430                     .style('opacity', 0)
75431                     .transition()
75432                     .duration(250)
75433                     .style('opacity', 1)
75434                     .on('end', function () { dispatch.call('change'); });
75435             }
75436
75437
75438             function hideLayer() {
75439                 throttledRedraw.cancel();
75440
75441                 layer
75442                     .transition()
75443                     .duration(250)
75444                     .style('opacity', 0)
75445                     .on('end', editOff);
75446             }
75447
75448
75449             function editOn() {
75450                 layer.style('display', 'block');
75451             }
75452
75453
75454             function editOff() {
75455                 layer.selectAll('.viewfield-group').remove();
75456                 layer.style('display', 'none');
75457             }
75458
75459
75460             function click(d) {
75461                 var service = getService();
75462                 if (!service) return;
75463
75464                 service
75465                     .selectImage(d)
75466                     .updateViewer(d.key, context)
75467                     .showViewer();
75468
75469                 context.map().centerEase(d.loc);
75470             }
75471
75472
75473             function mouseover(d) {
75474                 var service = getService();
75475                 if (service) service.setStyles(d);
75476             }
75477
75478
75479             function mouseout() {
75480                 var service = getService();
75481                 if (service) service.setStyles(null);
75482             }
75483
75484
75485             function transform(d) {
75486                 var t = svgPointTransform(projection)(d);
75487                 if (d.pano && viewerCompassAngle !== null && isFinite(viewerCompassAngle)) {
75488                     t += ' rotate(' + Math.floor(viewerCompassAngle) + ',0,0)';
75489                 } else if (d.ca) {
75490                     t += ' rotate(' + Math.floor(d.ca) + ',0,0)';
75491                 }
75492                 return t;
75493             }
75494
75495             context.photos().on('change.mapillary_images', update);
75496
75497             function filterImages(images) {
75498                 var showsPano = context.photos().showsPanoramic();
75499                 var showsFlat = context.photos().showsFlat();
75500                 if (!showsPano || !showsFlat) {
75501                     images = images.filter(function(image) {
75502                         if (image.pano) return showsPano;
75503                         return showsFlat;
75504                     });
75505                 }
75506                 return images;
75507             }
75508
75509             function filterSequences(sequences, service) {
75510                 var showsPano = context.photos().showsPanoramic();
75511                 var showsFlat = context.photos().showsFlat();
75512                 if (!showsPano || !showsFlat) {
75513                     sequences = sequences.filter(function(sequence) {
75514                         if (sequence.properties.hasOwnProperty('pano')) {
75515                             if (sequence.properties.pano) return showsPano;
75516                             return showsFlat;
75517                         } else {
75518                             // if the sequence doesn't specify pano or not, search its images
75519                             var cProps = sequence.properties.coordinateProperties;
75520                             if (cProps && cProps.image_keys && cProps.image_keys.length > 0) {
75521                                 for (var index in cProps.image_keys) {
75522                                     var imageKey = cProps.image_keys[index];
75523                                     var image = service.cachedImage(imageKey);
75524                                     if (image && image.hasOwnProperty('pano')) {
75525                                         if (image.pano) return showsPano;
75526                                         return showsFlat;
75527                                     }
75528                                 }
75529                             }
75530                         }
75531                     });
75532                 }
75533                 return sequences;
75534             }
75535
75536             function update() {
75537                 var viewer = d3_select('#photoviewer');
75538                 var selected = viewer.empty() ? undefined : viewer.datum();
75539
75540                 var z = ~~context.map().zoom();
75541                 var showMarkers = (z >= minMarkerZoom);
75542                 var showViewfields = (z >= minViewfieldZoom);
75543
75544                 var service = getService();
75545                 var sequences = (service ? service.sequences(projection) : []);
75546                 var images = (service && showMarkers ? service.images(projection) : []);
75547
75548                 images = filterImages(images);
75549                 sequences = filterSequences(sequences, service);
75550
75551                 var traces = layer.selectAll('.sequences').selectAll('.sequence')
75552                     .data(sequences, function(d) { return d.properties.key; });
75553
75554                 // exit
75555                 traces.exit()
75556                     .remove();
75557
75558                 // enter/update
75559                 traces = traces.enter()
75560                     .append('path')
75561                     .attr('class', 'sequence')
75562                     .merge(traces)
75563                     .attr('d', svgPath(projection).geojson);
75564
75565
75566                 var groups = layer.selectAll('.markers').selectAll('.viewfield-group')
75567                     .data(images, function(d) { return d.key; });
75568
75569                 // exit
75570                 groups.exit()
75571                     .remove();
75572
75573                 // enter
75574                 var groupsEnter = groups.enter()
75575                     .append('g')
75576                     .attr('class', 'viewfield-group')
75577                     .on('mouseenter', mouseover)
75578                     .on('mouseleave', mouseout)
75579                     .on('click', click);
75580
75581                 groupsEnter
75582                     .append('g')
75583                     .attr('class', 'viewfield-scale');
75584
75585                 // update
75586                 var markers = groups
75587                     .merge(groupsEnter)
75588                     .sort(function(a, b) {
75589                         return (a === selected) ? 1
75590                             : (b === selected) ? -1
75591                             : b.loc[1] - a.loc[1];  // sort Y
75592                     })
75593                     .attr('transform', transform)
75594                     .select('.viewfield-scale');
75595
75596
75597                 markers.selectAll('circle')
75598                     .data([0])
75599                     .enter()
75600                     .append('circle')
75601                     .attr('dx', '0')
75602                     .attr('dy', '0')
75603                     .attr('r', '6');
75604
75605                 var viewfields = markers.selectAll('.viewfield')
75606                     .data(showViewfields ? [0] : []);
75607
75608                 viewfields.exit()
75609                     .remove();
75610
75611                 viewfields.enter()               // viewfields may or may not be drawn...
75612                     .insert('path', 'circle')    // but if they are, draw below the circles
75613                     .attr('class', 'viewfield')
75614                     .classed('pano', function() { return this.parentNode.__data__.pano; })
75615                     .attr('transform', 'scale(1.5,1.5),translate(-8, -13)')
75616                     .attr('d', viewfieldPath);
75617
75618                 function viewfieldPath() {
75619                     var d = this.parentNode.__data__;
75620                     if (d.pano) {
75621                         return 'M 8,13 m -10,0 a 10,10 0 1,0 20,0 a 10,10 0 1,0 -20,0';
75622                     } else {
75623                         return 'M 6,9 C 8,8.4 8,8.4 10,9 L 16,-2 C 12,-5 4,-5 0,-2 z';
75624                     }
75625                 }
75626             }
75627
75628
75629             function drawImages(selection) {
75630                 var enabled = svgMapillaryImages.enabled;
75631                 var service = getService();
75632
75633                 layer = selection.selectAll('.layer-mapillary')
75634                     .data(service ? [0] : []);
75635
75636                 layer.exit()
75637                     .remove();
75638
75639                 var layerEnter = layer.enter()
75640                     .append('g')
75641                     .attr('class', 'layer-mapillary')
75642                     .style('display', enabled ? 'block' : 'none');
75643
75644                 layerEnter
75645                     .append('g')
75646                     .attr('class', 'sequences');
75647
75648                 layerEnter
75649                     .append('g')
75650                     .attr('class', 'markers');
75651
75652                 layer = layerEnter
75653                     .merge(layer);
75654
75655                 if (enabled) {
75656                     if (service && ~~context.map().zoom() >= minZoom) {
75657                         editOn();
75658                         update();
75659                         service.loadImages(projection);
75660                     } else {
75661                         editOff();
75662                     }
75663                 }
75664             }
75665
75666
75667             drawImages.enabled = function(_) {
75668                 if (!arguments.length) return svgMapillaryImages.enabled;
75669                 svgMapillaryImages.enabled = _;
75670                 if (svgMapillaryImages.enabled) {
75671                     showLayer();
75672                 } else {
75673                     hideLayer();
75674                 }
75675                 dispatch.call('change');
75676                 return this;
75677             };
75678
75679
75680             drawImages.supported = function() {
75681                 return !!getService();
75682             };
75683
75684
75685             init();
75686             return drawImages;
75687         }
75688
75689         function svgMapillarySigns(projection, context, dispatch) {
75690             var throttledRedraw = throttle(function () { dispatch.call('change'); }, 1000);
75691             var minZoom = 12;
75692             var layer = d3_select(null);
75693             var _mapillary;
75694
75695
75696             function init() {
75697                 if (svgMapillarySigns.initialized) return;  // run once
75698                 svgMapillarySigns.enabled = false;
75699                 svgMapillarySigns.initialized = true;
75700             }
75701
75702
75703             function getService() {
75704                 if (services$1.mapillary && !_mapillary) {
75705                     _mapillary = services$1.mapillary;
75706                     _mapillary.event.on('loadedSigns', throttledRedraw);
75707                 } else if (!services$1.mapillary && _mapillary) {
75708                     _mapillary = null;
75709                 }
75710                 return _mapillary;
75711             }
75712
75713
75714             function showLayer() {
75715                 var service = getService();
75716                 if (!service) return;
75717
75718                 editOn();
75719             }
75720
75721
75722             function hideLayer() {
75723                 throttledRedraw.cancel();
75724                 editOff();
75725             }
75726
75727
75728             function editOn() {
75729                 layer.style('display', 'block');
75730             }
75731
75732
75733             function editOff() {
75734                 layer.selectAll('.icon-sign').remove();
75735                 layer.style('display', 'none');
75736             }
75737
75738
75739             function click(d) {
75740                 var service = getService();
75741                 if (!service) return;
75742
75743                 context.map().centerEase(d.loc);
75744
75745                 var selected = service.getSelectedImage();
75746                 var selectedImageKey = selected && selected.key;
75747                 var imageKey;
75748
75749                 // Pick one of the images the sign was detected in,
75750                 // preference given to an image already selected.
75751                 d.detections.forEach(function(detection) {
75752                     if (!imageKey || selectedImageKey === detection.image_key) {
75753                         imageKey = detection.image_key;
75754                     }
75755                 });
75756
75757                 service
75758                     .selectImage(null, imageKey)
75759                     .updateViewer(imageKey, context)
75760                     .showViewer();
75761             }
75762
75763
75764             function update() {
75765                 var service = getService();
75766                 var data = (service ? service.signs(projection) : []);
75767                 var viewer = d3_select('#photoviewer');
75768                 var selected = viewer.empty() ? undefined : viewer.datum();
75769                 var selectedImageKey = selected && selected.key;
75770                 var transform = svgPointTransform(projection);
75771
75772                 var signs = layer.selectAll('.icon-sign')
75773                     .data(data, function(d) { return d.key; });
75774
75775                 // exit
75776                 signs.exit()
75777                     .remove();
75778
75779                 // enter
75780                 var enter = signs.enter()
75781                     .append('use')
75782                     .attr('class', 'icon-sign')
75783                     .attr('width', '24px')
75784                     .attr('height', '24px')
75785                     .attr('x', '-12px')
75786                     .attr('y', '-12px')
75787                     .attr('xlink:href', function(d) { return '#' + d.value; })
75788                     .classed('currentView', function(d) {
75789                         return d.detections.some(function(detection) {
75790                             return detection.image_key === selectedImageKey;
75791                         });
75792                     })
75793                     .on('click', click);
75794
75795                 // update
75796                 signs
75797                     .merge(enter)
75798                     .sort(function(a, b) {
75799                         return (a === selected) ? 1
75800                             : (b === selected) ? -1
75801                             : b.loc[1] - a.loc[1];  // sort Y
75802                     })
75803                     .attr('transform', transform);
75804             }
75805
75806
75807             function drawSigns(selection) {
75808                 var enabled = svgMapillarySigns.enabled;
75809                 var service = getService();
75810
75811                 layer = selection.selectAll('.layer-mapillary-signs')
75812                     .data(service ? [0] : []);
75813
75814                 layer.exit()
75815                     .remove();
75816
75817                 layer = layer.enter()
75818                     .append('g')
75819                     .attr('class', 'layer-mapillary-signs')
75820                     .style('display', enabled ? 'block' : 'none')
75821                     .merge(layer);
75822
75823                 if (enabled) {
75824                     if (service && ~~context.map().zoom() >= minZoom) {
75825                         editOn();
75826                         update();
75827                         service.loadSigns(projection);
75828                     } else {
75829                         editOff();
75830                     }
75831                 }
75832             }
75833
75834
75835             drawSigns.enabled = function(_) {
75836                 if (!arguments.length) return svgMapillarySigns.enabled;
75837                 svgMapillarySigns.enabled = _;
75838                 if (svgMapillarySigns.enabled) {
75839                     showLayer();
75840                 } else {
75841                     hideLayer();
75842                 }
75843                 dispatch.call('change');
75844                 return this;
75845             };
75846
75847
75848             drawSigns.supported = function() {
75849                 return !!getService();
75850             };
75851
75852
75853             init();
75854             return drawSigns;
75855         }
75856
75857         function svgOpenstreetcamImages(projection, context, dispatch) {
75858             var throttledRedraw = throttle(function () { dispatch.call('change'); }, 1000);
75859             var minZoom = 12;
75860             var minMarkerZoom = 16;
75861             var minViewfieldZoom = 18;
75862             var layer = d3_select(null);
75863             var _openstreetcam;
75864
75865
75866             function init() {
75867                 if (svgOpenstreetcamImages.initialized) return;  // run once
75868                 svgOpenstreetcamImages.enabled = false;
75869                 svgOpenstreetcamImages.initialized = true;
75870             }
75871
75872
75873             function getService() {
75874                 if (services$1.openstreetcam && !_openstreetcam) {
75875                     _openstreetcam = services$1.openstreetcam;
75876                     _openstreetcam.event.on('loadedImages', throttledRedraw);
75877                 } else if (!services$1.openstreetcam && _openstreetcam) {
75878                     _openstreetcam = null;
75879                 }
75880
75881                 return _openstreetcam;
75882             }
75883
75884
75885             function showLayer() {
75886                 var service = getService();
75887                 if (!service) return;
75888
75889                 editOn();
75890
75891                 layer
75892                     .style('opacity', 0)
75893                     .transition()
75894                     .duration(250)
75895                     .style('opacity', 1)
75896                     .on('end', function () { dispatch.call('change'); });
75897             }
75898
75899
75900             function hideLayer() {
75901                 throttledRedraw.cancel();
75902
75903                 layer
75904                     .transition()
75905                     .duration(250)
75906                     .style('opacity', 0)
75907                     .on('end', editOff);
75908             }
75909
75910
75911             function editOn() {
75912                 layer.style('display', 'block');
75913             }
75914
75915
75916             function editOff() {
75917                 layer.selectAll('.viewfield-group').remove();
75918                 layer.style('display', 'none');
75919             }
75920
75921
75922             function click(d) {
75923                 var service = getService();
75924                 if (!service) return;
75925
75926                 service
75927                     .selectImage(d)
75928                     .updateViewer(d)
75929                     .showViewer();
75930
75931                 context.map().centerEase(d.loc);
75932             }
75933
75934
75935             function mouseover(d) {
75936                 var service = getService();
75937                 if (service) service.setStyles(d);
75938             }
75939
75940
75941             function mouseout() {
75942                 var service = getService();
75943                 if (service) service.setStyles(null);
75944             }
75945
75946
75947             function transform(d) {
75948                 var t = svgPointTransform(projection)(d);
75949                 if (d.ca) {
75950                     t += ' rotate(' + Math.floor(d.ca) + ',0,0)';
75951                 }
75952                 return t;
75953             }
75954
75955
75956             context.photos().on('change.openstreetcam_images', update);
75957
75958             function update() {
75959                 var viewer = d3_select('#photoviewer');
75960                 var selected = viewer.empty() ? undefined : viewer.datum();
75961
75962                 var z = ~~context.map().zoom();
75963                 var showMarkers = (z >= minMarkerZoom);
75964                 var showViewfields = (z >= minViewfieldZoom);
75965
75966                 var service = getService();
75967                 var sequences = [];
75968                 var images = [];
75969
75970                 if (context.photos().showsFlat()) {
75971                     sequences = (service ? service.sequences(projection) : []);
75972                     images = (service && showMarkers ? service.images(projection) : []);
75973                 }
75974
75975                 var traces = layer.selectAll('.sequences').selectAll('.sequence')
75976                     .data(sequences, function(d) { return d.properties.key; });
75977
75978                 // exit
75979                 traces.exit()
75980                     .remove();
75981
75982                 // enter/update
75983                 traces = traces.enter()
75984                     .append('path')
75985                     .attr('class', 'sequence')
75986                     .merge(traces)
75987                     .attr('d', svgPath(projection).geojson);
75988
75989
75990                 var groups = layer.selectAll('.markers').selectAll('.viewfield-group')
75991                     .data(images, function(d) { return d.key; });
75992
75993                 // exit
75994                 groups.exit()
75995                     .remove();
75996
75997                 // enter
75998                 var groupsEnter = groups.enter()
75999                     .append('g')
76000                     .attr('class', 'viewfield-group')
76001                     .on('mouseenter', mouseover)
76002                     .on('mouseleave', mouseout)
76003                     .on('click', click);
76004
76005                 groupsEnter
76006                     .append('g')
76007                     .attr('class', 'viewfield-scale');
76008
76009                 // update
76010                 var markers = groups
76011                     .merge(groupsEnter)
76012                     .sort(function(a, b) {
76013                         return (a === selected) ? 1
76014                             : (b === selected) ? -1
76015                             : b.loc[1] - a.loc[1];  // sort Y
76016                     })
76017                     .attr('transform', transform)
76018                     .select('.viewfield-scale');
76019
76020
76021                 markers.selectAll('circle')
76022                     .data([0])
76023                     .enter()
76024                     .append('circle')
76025                     .attr('dx', '0')
76026                     .attr('dy', '0')
76027                     .attr('r', '6');
76028
76029                 var viewfields = markers.selectAll('.viewfield')
76030                     .data(showViewfields ? [0] : []);
76031
76032                 viewfields.exit()
76033                     .remove();
76034
76035                 viewfields.enter()               // viewfields may or may not be drawn...
76036                     .insert('path', 'circle')    // but if they are, draw below the circles
76037                     .attr('class', 'viewfield')
76038                     .attr('transform', 'scale(1.5,1.5),translate(-8, -13)')
76039                     .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');
76040             }
76041
76042
76043             function drawImages(selection) {
76044                 var enabled = svgOpenstreetcamImages.enabled,
76045                     service = getService();
76046
76047                 layer = selection.selectAll('.layer-openstreetcam')
76048                     .data(service ? [0] : []);
76049
76050                 layer.exit()
76051                     .remove();
76052
76053                 var layerEnter = layer.enter()
76054                     .append('g')
76055                     .attr('class', 'layer-openstreetcam')
76056                     .style('display', enabled ? 'block' : 'none');
76057
76058                 layerEnter
76059                     .append('g')
76060                     .attr('class', 'sequences');
76061
76062                 layerEnter
76063                     .append('g')
76064                     .attr('class', 'markers');
76065
76066                 layer = layerEnter
76067                     .merge(layer);
76068
76069                 if (enabled) {
76070                     if (service && ~~context.map().zoom() >= minZoom) {
76071                         editOn();
76072                         update();
76073                         service.loadImages(projection);
76074                     } else {
76075                         editOff();
76076                     }
76077                 }
76078             }
76079
76080
76081             drawImages.enabled = function(_) {
76082                 if (!arguments.length) return svgOpenstreetcamImages.enabled;
76083                 svgOpenstreetcamImages.enabled = _;
76084                 if (svgOpenstreetcamImages.enabled) {
76085                     showLayer();
76086                 } else {
76087                     hideLayer();
76088                 }
76089                 dispatch.call('change');
76090                 return this;
76091             };
76092
76093
76094             drawImages.supported = function() {
76095                 return !!getService();
76096             };
76097
76098
76099             init();
76100             return drawImages;
76101         }
76102
76103         function svgOsm(projection, context, dispatch) {
76104             var enabled = true;
76105
76106
76107             function drawOsm(selection) {
76108                 selection.selectAll('.layer-osm')
76109                     .data(['covered', 'areas', 'lines', 'points', 'labels'])
76110                     .enter()
76111                     .append('g')
76112                     .attr('class', function(d) { return 'layer-osm ' + d; });
76113
76114                 selection.selectAll('.layer-osm.points').selectAll('.points-group')
76115                     .data(['points', 'midpoints', 'vertices', 'turns'])
76116                     .enter()
76117                     .append('g')
76118                     .attr('class', function(d) { return 'points-group ' + d; });
76119             }
76120
76121
76122             function showLayer() {
76123                 var layer = context.surface().selectAll('.data-layer.osm');
76124                 layer.interrupt();
76125
76126                 layer
76127                     .classed('disabled', false)
76128                     .style('opacity', 0)
76129                     .transition()
76130                     .duration(250)
76131                     .style('opacity', 1)
76132                     .on('end interrupt', function () {
76133                         dispatch.call('change');
76134                     });
76135             }
76136
76137
76138             function hideLayer() {
76139                 var layer = context.surface().selectAll('.data-layer.osm');
76140                 layer.interrupt();
76141
76142                 layer
76143                     .transition()
76144                     .duration(250)
76145                     .style('opacity', 0)
76146                     .on('end interrupt', function () {
76147                         layer.classed('disabled', true);
76148                         dispatch.call('change');
76149                     });
76150             }
76151
76152
76153             drawOsm.enabled = function(val) {
76154                 if (!arguments.length) return enabled;
76155                 enabled = val;
76156
76157                 if (enabled) {
76158                     showLayer();
76159                 } else {
76160                     hideLayer();
76161                 }
76162
76163                 dispatch.call('change');
76164                 return this;
76165             };
76166
76167
76168             return drawOsm;
76169         }
76170
76171         var _notesEnabled = false;
76172         var _osmService;
76173
76174
76175         function svgNotes(projection, context, dispatch$1) {
76176             if (!dispatch$1) { dispatch$1 = dispatch('change'); }
76177             var throttledRedraw = throttle(function () { dispatch$1.call('change'); }, 1000);
76178             var minZoom = 12;
76179             var touchLayer = d3_select(null);
76180             var drawLayer = d3_select(null);
76181             var _notesVisible = false;
76182
76183
76184             function markerPath(selection, klass) {
76185                 selection
76186                     .attr('class', klass)
76187                     .attr('transform', 'translate(-8, -22)')
76188                     .attr('d', 'm17.5,0l-15,0c-1.37,0 -2.5,1.12 -2.5,2.5l0,11.25c0,1.37 1.12,2.5 2.5,2.5l3.75,0l0,3.28c0,0.38 0.43,0.6 0.75,0.37l4.87,-3.65l5.62,0c1.37,0 2.5,-1.12 2.5,-2.5l0,-11.25c0,-1.37 -1.12,-2.5 -2.5,-2.5z');
76189             }
76190
76191
76192             // Loosely-coupled osm service for fetching notes.
76193             function getService() {
76194                 if (services$1.osm && !_osmService) {
76195                     _osmService = services$1.osm;
76196                     _osmService.on('loadedNotes', throttledRedraw);
76197                 } else if (!services$1.osm && _osmService) {
76198                     _osmService = null;
76199                 }
76200
76201                 return _osmService;
76202             }
76203
76204
76205             // Show the notes
76206             function editOn() {
76207                 if (!_notesVisible) {
76208                     _notesVisible = true;
76209                     drawLayer
76210                         .style('display', 'block');
76211                 }
76212             }
76213
76214
76215             // Immediately remove the notes and their touch targets
76216             function editOff() {
76217                 if (_notesVisible) {
76218                     _notesVisible = false;
76219                     drawLayer
76220                         .style('display', 'none');
76221                     drawLayer.selectAll('.note')
76222                         .remove();
76223                     touchLayer.selectAll('.note')
76224                         .remove();
76225                 }
76226             }
76227
76228
76229             // Enable the layer.  This shows the notes and transitions them to visible.
76230             function layerOn() {
76231                 editOn();
76232
76233                 drawLayer
76234                     .style('opacity', 0)
76235                     .transition()
76236                     .duration(250)
76237                     .style('opacity', 1)
76238                     .on('end interrupt', function () {
76239                         dispatch$1.call('change');
76240                     });
76241             }
76242
76243
76244             // Disable the layer.  This transitions the layer invisible and then hides the notes.
76245             function layerOff() {
76246                 throttledRedraw.cancel();
76247                 drawLayer.interrupt();
76248                 touchLayer.selectAll('.note')
76249                     .remove();
76250
76251                 drawLayer
76252                     .transition()
76253                     .duration(250)
76254                     .style('opacity', 0)
76255                     .on('end interrupt', function () {
76256                         editOff();
76257                         dispatch$1.call('change');
76258                     });
76259             }
76260
76261
76262             // Update the note markers
76263             function updateMarkers() {
76264                 if (!_notesVisible || !_notesEnabled) return;
76265
76266                 var service = getService();
76267                 var selectedID = context.selectedNoteID();
76268                 var data = (service ? service.notes(projection) : []);
76269                 var getTransform = svgPointTransform(projection);
76270
76271                 // Draw markers..
76272                 var notes = drawLayer.selectAll('.note')
76273                     .data(data, function(d) { return d.status + d.id; });
76274
76275                 // exit
76276                 notes.exit()
76277                     .remove();
76278
76279                 // enter
76280                 var notesEnter = notes.enter()
76281                     .append('g')
76282                     .attr('class', function(d) { return 'note note-' + d.id + ' ' + d.status; })
76283                     .classed('new', function(d) { return d.id < 0; });
76284
76285                 notesEnter
76286                     .append('ellipse')
76287                     .attr('cx', 0.5)
76288                     .attr('cy', 1)
76289                     .attr('rx', 6.5)
76290                     .attr('ry', 3)
76291                     .attr('class', 'stroke');
76292
76293                 notesEnter
76294                     .append('path')
76295                     .call(markerPath, 'shadow');
76296
76297                 notesEnter
76298                     .append('use')
76299                     .attr('class', 'note-fill')
76300                     .attr('width', '20px')
76301                     .attr('height', '20px')
76302                     .attr('x', '-8px')
76303                     .attr('y', '-22px')
76304                     .attr('xlink:href', '#iD-icon-note');
76305
76306                 notesEnter.selectAll('.icon-annotation')
76307                     .data(function(d) { return [d]; })
76308                     .enter()
76309                     .append('use')
76310                     .attr('class', 'icon-annotation')
76311                     .attr('width', '10px')
76312                     .attr('height', '10px')
76313                     .attr('x', '-3px')
76314                     .attr('y', '-19px')
76315                     .attr('xlink:href', function(d) {
76316                         return '#iD-icon-' + (d.id < 0 ? 'plus' : (d.status === 'open' ? 'close' : 'apply'));
76317                     });
76318
76319                 // update
76320                 notes
76321                     .merge(notesEnter)
76322                     .sort(sortY)
76323                     .classed('selected', function(d) {
76324                         var mode = context.mode();
76325                         var isMoving = mode && mode.id === 'drag-note';  // no shadows when dragging
76326                         return !isMoving && d.id === selectedID;
76327                     })
76328                     .attr('transform', getTransform);
76329
76330
76331                 // Draw targets..
76332                 if (touchLayer.empty()) return;
76333                 var fillClass = context.getDebug('target') ? 'pink ' : 'nocolor ';
76334
76335                 var targets = touchLayer.selectAll('.note')
76336                     .data(data, function(d) { return d.id; });
76337
76338                 // exit
76339                 targets.exit()
76340                     .remove();
76341
76342                 // enter/update
76343                 targets.enter()
76344                     .append('rect')
76345                     .attr('width', '20px')
76346                     .attr('height', '20px')
76347                     .attr('x', '-8px')
76348                     .attr('y', '-22px')
76349                     .merge(targets)
76350                     .sort(sortY)
76351                     .attr('class', function(d) {
76352                         var newClass = (d.id < 0 ? 'new' : '');
76353                         return 'note target note-' + d.id + ' ' + fillClass + newClass;
76354                     })
76355                     .attr('transform', getTransform);
76356
76357
76358                 function sortY(a, b) {
76359                     return (a.id === selectedID) ? 1 : (b.id === selectedID) ? -1 : b.loc[1] - a.loc[1];
76360                 }
76361             }
76362
76363
76364             // Draw the notes layer and schedule loading notes and updating markers.
76365             function drawNotes(selection) {
76366                 var service = getService();
76367
76368                 var surface = context.surface();
76369                 if (surface && !surface.empty()) {
76370                     touchLayer = surface.selectAll('.data-layer.touch .layer-touch.markers');
76371                 }
76372
76373                 drawLayer = selection.selectAll('.layer-notes')
76374                     .data(service ? [0] : []);
76375
76376                 drawLayer.exit()
76377                     .remove();
76378
76379                 drawLayer = drawLayer.enter()
76380                     .append('g')
76381                     .attr('class', 'layer-notes')
76382                     .style('display', _notesEnabled ? 'block' : 'none')
76383                     .merge(drawLayer);
76384
76385                 if (_notesEnabled) {
76386                     if (service && ~~context.map().zoom() >= minZoom) {
76387                         editOn();
76388                         service.loadNotes(projection);
76389                         updateMarkers();
76390                     } else {
76391                         editOff();
76392                     }
76393                 }
76394             }
76395
76396
76397             // Toggles the layer on and off
76398             drawNotes.enabled = function(val) {
76399                 if (!arguments.length) return _notesEnabled;
76400
76401                 _notesEnabled = val;
76402                 if (_notesEnabled) {
76403                     layerOn();
76404                 } else {
76405                     layerOff();
76406                     if (context.selectedNoteID()) {
76407                         context.enter(modeBrowse(context));
76408                     }
76409                 }
76410
76411                 dispatch$1.call('change');
76412                 return this;
76413             };
76414
76415
76416             return drawNotes;
76417         }
76418
76419         function svgTouch() {
76420
76421             function drawTouch(selection) {
76422                 selection.selectAll('.layer-touch')
76423                     .data(['areas', 'lines', 'points', 'turns', 'markers'])
76424                     .enter()
76425                     .append('g')
76426                     .attr('class', function(d) { return 'layer-touch ' + d; });
76427             }
76428
76429             return drawTouch;
76430         }
76431
76432         function svgLayers(projection, context) {
76433             var dispatch$1 = dispatch('change');
76434             var svg = d3_select(null);
76435             var _layers = [
76436                 { id: 'osm', layer: svgOsm(projection, context, dispatch$1) },
76437                 { id: 'notes', layer: svgNotes(projection, context, dispatch$1) },
76438                 { id: 'data', layer: svgData(projection, context, dispatch$1) },
76439                 { id: 'keepRight', layer: svgKeepRight(projection, context, dispatch$1) },
76440                 { id: 'improveOSM', layer: svgImproveOSM(projection, context, dispatch$1) },
76441                 { id: 'streetside', layer: svgStreetside(projection, context, dispatch$1)},
76442                 { id: 'mapillary', layer: svgMapillaryImages(projection, context, dispatch$1) },
76443                 { id: 'mapillary-signs',  layer: svgMapillarySigns(projection, context, dispatch$1) },
76444                 { id: 'openstreetcam', layer: svgOpenstreetcamImages(projection, context, dispatch$1) },
76445                 { id: 'debug', layer: svgDebug(projection, context, dispatch$1) },
76446                 { id: 'geolocate', layer: svgGeolocate(projection, context, dispatch$1) },
76447                 { id: 'touch', layer: svgTouch(projection, context, dispatch$1) }
76448             ];
76449
76450
76451             function drawLayers(selection) {
76452                 svg = selection.selectAll('.surface')
76453                     .data([0]);
76454
76455                 svg = svg.enter()
76456                     .append('svg')
76457                     .attr('class', 'surface')
76458                     .merge(svg);
76459
76460                 var defs = svg.selectAll('.surface-defs')
76461                     .data([0]);
76462
76463                 defs.enter()
76464                     .append('defs')
76465                     .attr('class', 'surface-defs');
76466
76467                 var groups = svg.selectAll('.data-layer')
76468                     .data(_layers);
76469
76470                 groups.exit()
76471                     .remove();
76472
76473                 groups.enter()
76474                     .append('g')
76475                     .attr('class', function(d) { return 'data-layer ' + d.id; })
76476                     .merge(groups)
76477                     .each(function(d) { d3_select(this).call(d.layer); });
76478             }
76479
76480
76481             drawLayers.all = function() {
76482                 return _layers;
76483             };
76484
76485
76486             drawLayers.layer = function(id) {
76487                 var obj = _layers.find(function(o) { return o.id === id; });
76488                 return obj && obj.layer;
76489             };
76490
76491
76492             drawLayers.only = function(what) {
76493                 var arr = [].concat(what);
76494                 var all = _layers.map(function(layer) { return layer.id; });
76495                 return drawLayers.remove(utilArrayDifference(all, arr));
76496             };
76497
76498
76499             drawLayers.remove = function(what) {
76500                 var arr = [].concat(what);
76501                 arr.forEach(function(id) {
76502                     _layers = _layers.filter(function(o) { return o.id !== id; });
76503                 });
76504                 dispatch$1.call('change');
76505                 return this;
76506             };
76507
76508
76509             drawLayers.add = function(what) {
76510                 var arr = [].concat(what);
76511                 arr.forEach(function(obj) {
76512                     if ('id' in obj && 'layer' in obj) {
76513                         _layers.push(obj);
76514                     }
76515                 });
76516                 dispatch$1.call('change');
76517                 return this;
76518             };
76519
76520
76521             drawLayers.dimensions = function(val) {
76522                 if (!arguments.length) return utilGetDimensions(svg);
76523                 utilSetDimensions(svg, val);
76524                 return this;
76525             };
76526
76527
76528             return utilRebind(drawLayers, dispatch$1, 'on');
76529         }
76530
76531         function svgLines(projection, context) {
76532             var detected = utilDetect();
76533
76534             var highway_stack = {
76535                 motorway: 0,
76536                 motorway_link: 1,
76537                 trunk: 2,
76538                 trunk_link: 3,
76539                 primary: 4,
76540                 primary_link: 5,
76541                 secondary: 6,
76542                 tertiary: 7,
76543                 unclassified: 8,
76544                 residential: 9,
76545                 service: 10,
76546                 footway: 11
76547             };
76548
76549
76550             function drawTargets(selection, graph, entities, filter) {
76551                 var targetClass = context.getDebug('target') ? 'pink ' : 'nocolor ';
76552                 var nopeClass = context.getDebug('target') ? 'red ' : 'nocolor ';
76553                 var getPath = svgPath(projection).geojson;
76554                 var activeID = context.activeID();
76555
76556                 // The targets and nopes will be MultiLineString sub-segments of the ways
76557                 var data = { targets: [], nopes: [] };
76558
76559                 entities.forEach(function(way) {
76560                     var features = svgSegmentWay(way, graph, activeID);
76561                     data.targets.push.apply(data.targets, features.passive);
76562                     data.nopes.push.apply(data.nopes, features.active);
76563                 });
76564
76565
76566                 // Targets allow hover and vertex snapping
76567                 var targetData = data.targets.filter(getPath);
76568                 var targets = selection.selectAll('.line.target-allowed')
76569                     .filter(function(d) { return filter(d.properties.entity); })
76570                     .data(targetData, function key(d) { return d.id; });
76571
76572                 // exit
76573                 targets.exit()
76574                     .remove();
76575
76576                 // enter/update
76577                 targets.enter()
76578                     .append('path')
76579                     .merge(targets)
76580                     .attr('d', getPath)
76581                     .attr('class', function(d) { return 'way line target target-allowed ' + targetClass + d.id; });
76582
76583
76584                 // NOPE
76585                 var nopeData = data.nopes.filter(getPath);
76586                 var nopes = selection.selectAll('.line.target-nope')
76587                     .filter(function(d) { return filter(d.properties.entity); })
76588                     .data(nopeData, function key(d) { return d.id; });
76589
76590                 // exit
76591                 nopes.exit()
76592                     .remove();
76593
76594                 // enter/update
76595                 nopes.enter()
76596                     .append('path')
76597                     .merge(nopes)
76598                     .attr('d', getPath)
76599                     .attr('class', function(d) { return 'way line target target-nope ' + nopeClass + d.id; });
76600             }
76601
76602
76603             function drawLines(selection, graph, entities, filter) {
76604
76605                 function waystack(a, b) {
76606                     var selected = context.selectedIDs();
76607                     var scoreA = selected.indexOf(a.id) !== -1 ? 20 : 0;
76608                     var scoreB = selected.indexOf(b.id) !== -1 ? 20 : 0;
76609
76610                     if (a.tags.highway) { scoreA -= highway_stack[a.tags.highway]; }
76611                     if (b.tags.highway) { scoreB -= highway_stack[b.tags.highway]; }
76612                     return scoreA - scoreB;
76613                 }
76614
76615
76616                 function drawLineGroup(selection, klass, isSelected) {
76617                     // Note: Don't add `.selected` class in draw modes
76618                     var mode = context.mode();
76619                     var isDrawing = mode && /^draw/.test(mode.id);
76620                     var selectedClass = (!isDrawing && isSelected) ? 'selected ' : '';
76621
76622                     var lines = selection
76623                         .selectAll('path')
76624                         .filter(filter)
76625                         .data(getPathData(isSelected), osmEntity.key);
76626
76627                     lines.exit()
76628                         .remove();
76629
76630                     // Optimization: Call expensive TagClasses only on enter selection. This
76631                     // works because osmEntity.key is defined to include the entity v attribute.
76632                     lines.enter()
76633                         .append('path')
76634                         .attr('class', function(d) {
76635
76636                             var prefix = 'way line';
76637                             if (!d.hasInterestingTags() && graph.parentMultipolygons(d).length > 0) {
76638                                 // fudge the classes to style multipolygon member lines as area edges
76639                                 prefix = 'relation area';
76640                             }
76641
76642                             var oldMPClass = oldMultiPolygonOuters[d.id] ? 'old-multipolygon ' : '';
76643                             return prefix + ' ' + klass + ' ' + selectedClass + oldMPClass + d.id;
76644                         })
76645                         .call(svgTagClasses())
76646                         .merge(lines)
76647                         .sort(waystack)
76648                         .attr('d', getPath)
76649                         .call(svgTagClasses().tags(svgRelationMemberTags(graph)));
76650
76651                     return selection;
76652                 }
76653
76654
76655                 function getPathData(isSelected) {
76656                     return function() {
76657                         var layer = this.parentNode.__data__;
76658                         var data = pathdata[layer] || [];
76659                         return data.filter(function(d) {
76660                             if (isSelected)
76661                                 return context.selectedIDs().indexOf(d.id) !== -1;
76662                             else
76663                                 return context.selectedIDs().indexOf(d.id) === -1;
76664                         });
76665                     };
76666                 }
76667
76668                 function addMarkers(layergroup, pathclass, groupclass, groupdata, marker) {
76669                     var markergroup = layergroup
76670                         .selectAll('g.' + groupclass)
76671                         .data([pathclass]);
76672
76673                     markergroup = markergroup.enter()
76674                         .append('g')
76675                         .attr('class', groupclass)
76676                         .merge(markergroup);
76677
76678                     var markers = markergroup
76679                         .selectAll('path')
76680                         .filter(filter)
76681                         .data(
76682                             function data() { return groupdata[this.parentNode.__data__] || []; },
76683                             function key(d) { return [d.id, d.index]; }
76684                         );
76685
76686                     markers.exit()
76687                         .remove();
76688
76689                     markers = markers.enter()
76690                         .append('path')
76691                         .attr('class', pathclass)
76692                         .attr('marker-mid', marker)
76693                         .merge(markers)
76694                         .attr('d', function(d) { return d.d; });
76695
76696                     if (detected.ie) {
76697                         markers.each(function() { this.parentNode.insertBefore(this, this); });
76698                     }
76699                 }
76700
76701
76702                 var getPath = svgPath(projection, graph);
76703                 var ways = [];
76704                 var onewaydata = {};
76705                 var sideddata = {};
76706                 var oldMultiPolygonOuters = {};
76707
76708                 for (var i = 0; i < entities.length; i++) {
76709                     var entity = entities[i];
76710                     var outer = osmOldMultipolygonOuterMember(entity, graph);
76711                     if (outer) {
76712                         ways.push(entity.mergeTags(outer.tags));
76713                         oldMultiPolygonOuters[outer.id] = true;
76714                     } else if (entity.geometry(graph) === 'line') {
76715                         ways.push(entity);
76716                     }
76717                 }
76718
76719                 ways = ways.filter(getPath);
76720                 var pathdata = utilArrayGroupBy(ways, function(way) { return way.layer(); });
76721
76722                 Object.keys(pathdata).forEach(function(k) {
76723                     var v = pathdata[k];
76724                     var onewayArr = v.filter(function(d) { return d.isOneWay(); });
76725                     var onewaySegments = svgMarkerSegments(
76726                         projection, graph, 35,
76727                         function shouldReverse(entity) { return entity.tags.oneway === '-1'; },
76728                         function bothDirections(entity) {
76729                             return entity.tags.oneway === 'reversible' || entity.tags.oneway === 'alternating';
76730                         }
76731                     );
76732                     onewaydata[k] = utilArrayFlatten(onewayArr.map(onewaySegments));
76733
76734                     var sidedArr = v.filter(function(d) { return d.isSided(); });
76735                     var sidedSegments = svgMarkerSegments(
76736                         projection, graph, 30,
76737                         function shouldReverse() { return false; },
76738                         function bothDirections() { return false; }
76739                     );
76740                     sideddata[k] = utilArrayFlatten(sidedArr.map(sidedSegments));
76741                 });
76742
76743
76744                 var covered = selection.selectAll('.layer-osm.covered');     // under areas
76745                 var uncovered = selection.selectAll('.layer-osm.lines');     // over areas
76746                 var touchLayer = selection.selectAll('.layer-touch.lines');
76747
76748                 // Draw lines..
76749                 [covered, uncovered].forEach(function(selection) {
76750                     var range = (selection === covered ? d3_range(-10,0) : d3_range(0,11));
76751                     var layergroup = selection
76752                         .selectAll('g.layergroup')
76753                         .data(range);
76754
76755                     layergroup = layergroup.enter()
76756                         .append('g')
76757                         .attr('class', function(d) { return 'layergroup layer' + String(d); })
76758                         .merge(layergroup);
76759
76760                     layergroup
76761                         .selectAll('g.linegroup')
76762                         .data(['shadow', 'casing', 'stroke', 'shadow-highlighted', 'casing-highlighted', 'stroke-highlighted'])
76763                         .enter()
76764                         .append('g')
76765                         .attr('class', function(d) { return 'linegroup line-' + d; });
76766
76767                     layergroup.selectAll('g.line-shadow')
76768                         .call(drawLineGroup, 'shadow', false);
76769                     layergroup.selectAll('g.line-casing')
76770                         .call(drawLineGroup, 'casing', false);
76771                     layergroup.selectAll('g.line-stroke')
76772                         .call(drawLineGroup, 'stroke', false);
76773
76774                     layergroup.selectAll('g.line-shadow-highlighted')
76775                         .call(drawLineGroup, 'shadow', true);
76776                     layergroup.selectAll('g.line-casing-highlighted')
76777                         .call(drawLineGroup, 'casing', true);
76778                     layergroup.selectAll('g.line-stroke-highlighted')
76779                         .call(drawLineGroup, 'stroke', true);
76780
76781                     addMarkers(layergroup, 'oneway', 'onewaygroup', onewaydata, 'url(#oneway-marker)');
76782                     addMarkers(layergroup, 'sided', 'sidedgroup', sideddata,
76783                         function marker(d) {
76784                             var category = graph.entity(d.id).sidednessIdentifier();
76785                             return 'url(#sided-marker-' + category + ')';
76786                         }
76787                     );
76788                 });
76789
76790                 // Draw touch targets..
76791                 touchLayer
76792                     .call(drawTargets, graph, ways, filter);
76793             }
76794
76795
76796             return drawLines;
76797         }
76798
76799         function svgMidpoints(projection, context) {
76800             var targetRadius = 8;
76801
76802             function drawTargets(selection, graph, entities, filter) {
76803                 var fillClass = context.getDebug('target') ? 'pink ' : 'nocolor ';
76804                 var getTransform = svgPointTransform(projection).geojson;
76805
76806                 var data = entities.map(function(midpoint) {
76807                     return {
76808                         type: 'Feature',
76809                         id: midpoint.id,
76810                         properties: {
76811                             target: true,
76812                             entity: midpoint
76813                         },
76814                         geometry: {
76815                             type: 'Point',
76816                             coordinates: midpoint.loc
76817                         }
76818                     };
76819                 });
76820
76821                 var targets = selection.selectAll('.midpoint.target')
76822                     .filter(function(d) { return filter(d.properties.entity); })
76823                     .data(data, function key(d) { return d.id; });
76824
76825                 // exit
76826                 targets.exit()
76827                     .remove();
76828
76829                 // enter/update
76830                 targets.enter()
76831                     .append('circle')
76832                     .attr('r', targetRadius)
76833                     .merge(targets)
76834                     .attr('class', function(d) { return 'node midpoint target ' + fillClass + d.id; })
76835                     .attr('transform', getTransform);
76836             }
76837
76838
76839             function drawMidpoints(selection, graph, entities, filter, extent) {
76840                 var drawLayer = selection.selectAll('.layer-osm.points .points-group.midpoints');
76841                 var touchLayer = selection.selectAll('.layer-touch.points');
76842
76843                 var mode = context.mode();
76844                 if (mode && mode.id !== 'select') {
76845                     drawLayer.selectAll('.midpoint').remove();
76846                     touchLayer.selectAll('.midpoint.target').remove();
76847                     return;
76848                 }
76849
76850                 var poly = extent.polygon();
76851                 var midpoints = {};
76852
76853                 for (var i = 0; i < entities.length; i++) {
76854                     var entity = entities[i];
76855
76856                     if (entity.type !== 'way') continue;
76857                     if (!filter(entity)) continue;
76858                     if (context.selectedIDs().indexOf(entity.id) < 0) continue;
76859
76860                     var nodes = graph.childNodes(entity);
76861                     for (var j = 0; j < nodes.length - 1; j++) {
76862                         var a = nodes[j];
76863                         var b = nodes[j + 1];
76864                         var id = [a.id, b.id].sort().join('-');
76865
76866                         if (midpoints[id]) {
76867                             midpoints[id].parents.push(entity);
76868                         } else if (geoVecLength(projection(a.loc), projection(b.loc)) > 40) {
76869                             var point = geoVecInterp(a.loc, b.loc, 0.5);
76870                             var loc = null;
76871
76872                             if (extent.intersects(point)) {
76873                                 loc = point;
76874                             } else {
76875                                 for (var k = 0; k < 4; k++) {
76876                                     point = geoLineIntersection([a.loc, b.loc], [poly[k], poly[k + 1]]);
76877                                     if (point &&
76878                                         geoVecLength(projection(a.loc), projection(point)) > 20 &&
76879                                         geoVecLength(projection(b.loc), projection(point)) > 20)
76880                                     {
76881                                         loc = point;
76882                                         break;
76883                                     }
76884                                 }
76885                             }
76886
76887                             if (loc) {
76888                                 midpoints[id] = {
76889                                     type: 'midpoint',
76890                                     id: id,
76891                                     loc: loc,
76892                                     edge: [a.id, b.id],
76893                                     parents: [entity]
76894                                 };
76895                             }
76896                         }
76897                     }
76898                 }
76899
76900
76901                 function midpointFilter(d) {
76902                     if (midpoints[d.id])
76903                         return true;
76904
76905                     for (var i = 0; i < d.parents.length; i++) {
76906                         if (filter(d.parents[i])) {
76907                             return true;
76908                         }
76909                     }
76910
76911                     return false;
76912                 }
76913
76914
76915                 var groups = drawLayer.selectAll('.midpoint')
76916                     .filter(midpointFilter)
76917                     .data(Object.values(midpoints), function(d) { return d.id; });
76918
76919                 groups.exit()
76920                     .remove();
76921
76922                 var enter = groups.enter()
76923                     .insert('g', ':first-child')
76924                     .attr('class', 'midpoint');
76925
76926                 enter
76927                     .append('polygon')
76928                     .attr('points', '-6,8 10,0 -6,-8')
76929                     .attr('class', 'shadow');
76930
76931                 enter
76932                     .append('polygon')
76933                     .attr('points', '-3,4 5,0 -3,-4')
76934                     .attr('class', 'fill');
76935
76936                 groups = groups
76937                     .merge(enter)
76938                     .attr('transform', function(d) {
76939                         var translate = svgPointTransform(projection);
76940                         var a = graph.entity(d.edge[0]);
76941                         var b = graph.entity(d.edge[1]);
76942                         var angle = geoAngle(a, b, projection) * (180 / Math.PI);
76943                         return translate(d) + ' rotate(' + angle + ')';
76944                     })
76945                     .call(svgTagClasses().tags(
76946                         function(d) { return d.parents[0].tags; }
76947                     ));
76948
76949                 // Propagate data bindings.
76950                 groups.select('polygon.shadow');
76951                 groups.select('polygon.fill');
76952
76953
76954                 // Draw touch targets..
76955                 touchLayer
76956                     .call(drawTargets, graph, Object.values(midpoints), midpointFilter);
76957             }
76958
76959             return drawMidpoints;
76960         }
76961
76962         function svgPoints(projection, context) {
76963
76964             function markerPath(selection, klass) {
76965                 selection
76966                     .attr('class', klass)
76967                     .attr('transform', 'translate(-8, -23)')
76968                     .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');
76969             }
76970
76971             function sortY(a, b) {
76972                 return b.loc[1] - a.loc[1];
76973             }
76974
76975
76976             // Avoid exit/enter if we're just moving stuff around.
76977             // The node will get a new version but we only need to run the update selection.
76978             function fastEntityKey(d) {
76979                 var mode = context.mode();
76980                 var isMoving = mode && /^(add|draw|drag|move|rotate)/.test(mode.id);
76981                 return isMoving ? d.id : osmEntity.key(d);
76982             }
76983
76984
76985             function drawTargets(selection, graph, entities, filter) {
76986                 var fillClass = context.getDebug('target') ? 'pink ' : 'nocolor ';
76987                 var getTransform = svgPointTransform(projection).geojson;
76988                 var activeID = context.activeID();
76989                 var data = [];
76990
76991                 entities.forEach(function(node) {
76992                     if (activeID === node.id) return;   // draw no target on the activeID
76993
76994                     data.push({
76995                         type: 'Feature',
76996                         id: node.id,
76997                         properties: {
76998                             target: true,
76999                             entity: node
77000                         },
77001                         geometry: node.asGeoJSON()
77002                     });
77003                 });
77004
77005                 var targets = selection.selectAll('.point.target')
77006                     .filter(function(d) { return filter(d.properties.entity); })
77007                     .data(data, function key(d) { return d.id; });
77008
77009                 // exit
77010                 targets.exit()
77011                     .remove();
77012
77013                 // enter/update
77014                 targets.enter()
77015                     .append('rect')
77016                     .attr('x', -10)
77017                     .attr('y', -26)
77018                     .attr('width', 20)
77019                     .attr('height', 30)
77020                     .merge(targets)
77021                     .attr('class', function(d) { return 'node point target ' + fillClass + d.id; })
77022                     .attr('transform', getTransform);
77023             }
77024
77025
77026             function drawPoints(selection, graph, entities, filter) {
77027                 var wireframe = context.surface().classed('fill-wireframe');
77028                 var zoom = geoScaleToZoom(projection.scale());
77029
77030                 // Points with a direction will render as vertices at higher zooms..
77031                 function renderAsPoint(entity) {
77032                     return entity.geometry(graph) === 'point' &&
77033                         !(zoom >= 18 && entity.directions(graph, projection).length);
77034                 }
77035
77036                 // All points will render as vertices in wireframe mode too..
77037                 var points = wireframe ? [] : entities.filter(renderAsPoint);
77038                 points.sort(sortY);
77039
77040
77041                 var drawLayer = selection.selectAll('.layer-osm.points .points-group.points');
77042                 var touchLayer = selection.selectAll('.layer-touch.points');
77043
77044                 // Draw points..
77045                 var groups = drawLayer.selectAll('g.point')
77046                     .filter(filter)
77047                     .data(points, fastEntityKey);
77048
77049                 groups.exit()
77050                     .remove();
77051
77052                 var enter = groups.enter()
77053                     .append('g')
77054                     .attr('class', function(d) { return 'node point ' + d.id; })
77055                     .order();
77056
77057                 enter
77058                     .append('path')
77059                     .call(markerPath, 'shadow');
77060
77061                 enter
77062                     .append('ellipse')
77063                     .attr('cx', 0.5)
77064                     .attr('cy', 1)
77065                     .attr('rx', 6.5)
77066                     .attr('ry', 3)
77067                     .attr('class', 'stroke');
77068
77069                 enter
77070                     .append('path')
77071                     .call(markerPath, 'stroke');
77072
77073                 enter
77074                     .append('use')
77075                     .attr('transform', 'translate(-5, -19)')
77076                     .attr('class', 'icon')
77077                     .attr('width', '11px')
77078                     .attr('height', '11px');
77079
77080                 groups = groups
77081                     .merge(enter)
77082                     .attr('transform', svgPointTransform(projection))
77083                     .call(svgTagClasses());
77084
77085                 groups.select('.shadow');   // propagate bound data
77086                 groups.select('.stroke');   // propagate bound data
77087                 groups.select('.icon')      // propagate bound data
77088                     .attr('xlink:href', function(entity) {
77089                         var preset = context.presets().match(entity, graph);
77090                         var picon = preset && preset.icon;
77091
77092                         if (!picon) {
77093                             return '';
77094                         } else {
77095                             var isMaki = /^maki-/.test(picon);
77096                             return '#' + picon + (isMaki ? '-11' : '');
77097                         }
77098                     });
77099
77100
77101                 // Draw touch targets..
77102                 touchLayer
77103                     .call(drawTargets, graph, points, filter);
77104             }
77105
77106
77107             return drawPoints;
77108         }
77109
77110         function svgTurns(projection, context) {
77111
77112             function icon(turn) {
77113                 var u = turn.u ? '-u' : '';
77114                 if (turn.no) return '#iD-turn-no' + u;
77115                 if (turn.only) return '#iD-turn-only' + u;
77116                 return '#iD-turn-yes' + u;
77117             }
77118
77119             function drawTurns(selection, graph, turns) {
77120
77121                 function turnTransform(d) {
77122                     var pxRadius = 50;
77123                     var toWay = graph.entity(d.to.way);
77124                     var toPoints = graph.childNodes(toWay)
77125                         .map(function (n) { return n.loc; })
77126                         .map(projection);
77127                     var toLength = geoPathLength(toPoints);
77128                     var mid = toLength / 2;    // midpoint of destination way
77129
77130                     var toNode = graph.entity(d.to.node);
77131                     var toVertex = graph.entity(d.to.vertex);
77132                     var a = geoAngle(toVertex, toNode, projection);
77133                     var o = projection(toVertex.loc);
77134                     var r = d.u ? 0                  // u-turn: no radius
77135                         : !toWay.__via ? pxRadius    // leaf way: put marker at pxRadius
77136                         : Math.min(mid, pxRadius);   // via way: prefer pxRadius, fallback to mid for very short ways
77137
77138                     return 'translate(' + (r * Math.cos(a) + o[0]) + ',' + (r * Math.sin(a) + o[1]) + ') ' +
77139                         'rotate(' + a * 180 / Math.PI + ')';
77140                 }
77141
77142
77143                 var drawLayer = selection.selectAll('.layer-osm.points .points-group.turns');
77144                 var touchLayer = selection.selectAll('.layer-touch.turns');
77145
77146                 // Draw turns..
77147                 var groups = drawLayer.selectAll('g.turn')
77148                     .data(turns, function(d) { return d.key; });
77149
77150                 // exit
77151                 groups.exit()
77152                     .remove();
77153
77154                 // enter
77155                 var groupsEnter = groups.enter()
77156                     .append('g')
77157                     .attr('class', function(d) { return 'turn ' + d.key; });
77158
77159                 var turnsEnter = groupsEnter
77160                     .filter(function(d) { return !d.u; });
77161
77162                 turnsEnter.append('rect')
77163                     .attr('transform', 'translate(-22, -12)')
77164                     .attr('width', '44')
77165                     .attr('height', '24');
77166
77167                 turnsEnter.append('use')
77168                     .attr('transform', 'translate(-22, -12)')
77169                     .attr('width', '44')
77170                     .attr('height', '24');
77171
77172                 var uEnter = groupsEnter
77173                     .filter(function(d) { return d.u; });
77174
77175                 uEnter.append('circle')
77176                     .attr('r', '16');
77177
77178                 uEnter.append('use')
77179                     .attr('transform', 'translate(-16, -16)')
77180                     .attr('width', '32')
77181                     .attr('height', '32');
77182
77183                 // update
77184                 groups = groups
77185                     .merge(groupsEnter)
77186                     .attr('opacity', function(d) { return d.direct === false ? '0.7' : null; })
77187                     .attr('transform', turnTransform);
77188
77189                 groups.select('use')
77190                     .attr('xlink:href', icon);
77191
77192                 groups.select('rect');      // propagate bound data
77193                 groups.select('circle');    // propagate bound data
77194
77195
77196                 // Draw touch targets..
77197                 var fillClass = context.getDebug('target') ? 'pink ' : 'nocolor ';
77198                 groups = touchLayer.selectAll('g.turn')
77199                     .data(turns, function(d) { return d.key; });
77200
77201                 // exit
77202                 groups.exit()
77203                     .remove();
77204
77205                 // enter
77206                 groupsEnter = groups.enter()
77207                     .append('g')
77208                     .attr('class', function(d) { return 'turn ' + d.key; });
77209
77210                 turnsEnter = groupsEnter
77211                     .filter(function(d) { return !d.u; });
77212
77213                 turnsEnter.append('rect')
77214                     .attr('class', 'target ' + fillClass)
77215                     .attr('transform', 'translate(-22, -12)')
77216                     .attr('width', '44')
77217                     .attr('height', '24');
77218
77219                 uEnter = groupsEnter
77220                     .filter(function(d) { return d.u; });
77221
77222                 uEnter.append('circle')
77223                     .attr('class', 'target ' + fillClass)
77224                     .attr('r', '16');
77225
77226                 // update
77227                 groups = groups
77228                     .merge(groupsEnter)
77229                     .attr('transform', turnTransform);
77230
77231                 groups.select('rect');      // propagate bound data
77232                 groups.select('circle');    // propagate bound data
77233
77234
77235                 return this;
77236             }
77237
77238             return drawTurns;
77239         }
77240
77241         function svgVertices(projection, context) {
77242             var radiuses = {
77243                 //       z16-, z17,   z18+,  w/icon
77244                 shadow: [6,    7.5,   7.5,   12],
77245                 stroke: [2.5,  3.5,   3.5,   8],
77246                 fill:   [1,    1.5,   1.5,   1.5]
77247             };
77248
77249             var _currHoverTarget;
77250             var _currPersistent = {};
77251             var _currHover = {};
77252             var _prevHover = {};
77253             var _currSelected = {};
77254             var _prevSelected = {};
77255             var _radii = {};
77256
77257
77258             function sortY(a, b) {
77259                 return b.loc[1] - a.loc[1];
77260             }
77261
77262             // Avoid exit/enter if we're just moving stuff around.
77263             // The node will get a new version but we only need to run the update selection.
77264             function fastEntityKey(d) {
77265                 var mode = context.mode();
77266                 var isMoving = mode && /^(add|draw|drag|move|rotate)/.test(mode.id);
77267                 return isMoving ? d.id : osmEntity.key(d);
77268             }
77269
77270
77271             function draw(selection, graph, vertices, sets, filter) {
77272                 sets = sets || { selected: {}, important: {}, hovered: {} };
77273
77274                 var icons = {};
77275                 var directions = {};
77276                 var wireframe = context.surface().classed('fill-wireframe');
77277                 var zoom = geoScaleToZoom(projection.scale());
77278                 var z = (zoom < 17 ? 0 : zoom < 18 ? 1 : 2);
77279                 var activeID = context.activeID();
77280
77281
77282                 function getIcon(d) {
77283                     // always check latest entity, as fastEntityKey avoids enter/exit now
77284                     var entity = graph.entity(d.id);
77285                     if (entity.id in icons) return icons[entity.id];
77286
77287                     icons[entity.id] =
77288                         entity.hasInterestingTags() &&
77289                         context.presets().match(entity, graph).icon;
77290
77291                     return icons[entity.id];
77292                 }
77293
77294
77295                 // memoize directions results, return false for empty arrays (for use in filter)
77296                 function getDirections(entity) {
77297                     if (entity.id in directions) return directions[entity.id];
77298
77299                     var angles = entity.directions(graph, projection);
77300                     directions[entity.id] = angles.length ? angles : false;
77301                     return angles;
77302                 }
77303
77304
77305                 function updateAttributes(selection) {
77306                     ['shadow', 'stroke', 'fill'].forEach(function(klass) {
77307                         var rads = radiuses[klass];
77308                         selection.selectAll('.' + klass)
77309                             .each(function(entity) {
77310                                 var i = z && getIcon(entity);
77311                                 var r = rads[i ? 3 : z];
77312
77313                                 // slightly increase the size of unconnected endpoints #3775
77314                                 if (entity.id !== activeID && entity.isEndpoint(graph) && !entity.isConnected(graph)) {
77315                                     r += 1.5;
77316                                 }
77317
77318                                 if (klass === 'shadow') {   // remember this value, so we don't need to
77319                                     _radii[entity.id] = r;  // recompute it when we draw the touch targets
77320                                 }
77321
77322                                 d3_select(this)
77323                                     .attr('r', r)
77324                                     .attr('visibility', (i && klass === 'fill') ? 'hidden' : null);
77325                             });
77326                     });
77327                 }
77328
77329                 vertices.sort(sortY);
77330
77331                 var groups = selection.selectAll('g.vertex')
77332                     .filter(filter)
77333                     .data(vertices, fastEntityKey);
77334
77335                 // exit
77336                 groups.exit()
77337                     .remove();
77338
77339                 // enter
77340                 var enter = groups.enter()
77341                     .append('g')
77342                     .attr('class', function(d) { return 'node vertex ' + d.id; })
77343                     .order();
77344
77345                 enter
77346                     .append('circle')
77347                     .attr('class', 'shadow');
77348
77349                 enter
77350                     .append('circle')
77351                     .attr('class', 'stroke');
77352
77353                 // Vertices with tags get a fill.
77354                 enter.filter(function(d) { return d.hasInterestingTags(); })
77355                     .append('circle')
77356                     .attr('class', 'fill');
77357
77358                 // update
77359                 groups = groups
77360                     .merge(enter)
77361                     .attr('transform', svgPointTransform(projection))
77362                     .classed('sibling', function(d) { return d.id in sets.selected; })
77363                     .classed('shared', function(d) { return graph.isShared(d); })
77364                     .classed('endpoint', function(d) { return d.isEndpoint(graph); })
77365                     .call(updateAttributes);
77366
77367
77368                 // Vertices with icons get a `use`.
77369                 var iconUse = groups
77370                     .selectAll('.icon')
77371                     .data(function data(d) { return zoom >= 17 && getIcon(d) ? [d] : []; }, fastEntityKey);
77372
77373                 // exit
77374                 iconUse.exit()
77375                     .remove();
77376
77377                 // enter
77378                 iconUse.enter()
77379                     .append('use')
77380                     .attr('class', 'icon')
77381                     .attr('width', '11px')
77382                     .attr('height', '11px')
77383                     .attr('transform', 'translate(-5.5, -5.5)')
77384                     .attr('xlink:href', function(d) {
77385                         var picon = getIcon(d);
77386                         var isMaki = /^maki-/.test(picon);
77387                         return '#' + picon + (isMaki ? '-11' : '');
77388                     });
77389
77390
77391                 // Vertices with directions get viewfields
77392                 var dgroups = groups
77393                     .selectAll('.viewfieldgroup')
77394                     .data(function data(d) { return zoom >= 18 && getDirections(d) ? [d] : []; }, fastEntityKey);
77395
77396                 // exit
77397                 dgroups.exit()
77398                     .remove();
77399
77400                 // enter/update
77401                 dgroups = dgroups.enter()
77402                     .insert('g', '.shadow')
77403                     .attr('class', 'viewfieldgroup')
77404                     .merge(dgroups);
77405
77406                 var viewfields = dgroups.selectAll('.viewfield')
77407                     .data(getDirections, function key(d) { return osmEntity.key(d); });
77408
77409                 // exit
77410                 viewfields.exit()
77411                     .remove();
77412
77413                 // enter/update
77414                 viewfields.enter()
77415                     .append('path')
77416                     .attr('class', 'viewfield')
77417                     .attr('d', 'M0,0H0')
77418                     .merge(viewfields)
77419                     .attr('marker-start', 'url(#viewfield-marker' + (wireframe ? '-wireframe' : '') + ')')
77420                     .attr('transform', function(d) { return 'rotate(' + d + ')'; });
77421             }
77422
77423
77424             function drawTargets(selection, graph, entities, filter) {
77425                 var targetClass = context.getDebug('target') ? 'pink ' : 'nocolor ';
77426                 var nopeClass = context.getDebug('target') ? 'red ' : 'nocolor ';
77427                 var getTransform = svgPointTransform(projection).geojson;
77428                 var activeID = context.activeID();
77429                 var data = { targets: [], nopes: [] };
77430
77431                 entities.forEach(function(node) {
77432                     if (activeID === node.id) return;   // draw no target on the activeID
77433
77434                     var vertexType = svgPassiveVertex(node, graph, activeID);
77435                     if (vertexType !== 0) {     // passive or adjacent - allow to connect
77436                         data.targets.push({
77437                             type: 'Feature',
77438                             id: node.id,
77439                             properties: {
77440                                 target: true,
77441                                 entity: node
77442                             },
77443                             geometry: node.asGeoJSON()
77444                         });
77445                     } else {
77446                         data.nopes.push({
77447                             type: 'Feature',
77448                             id: node.id + '-nope',
77449                             properties: {
77450                                 nope: true,
77451                                 target: true,
77452                                 entity: node
77453                             },
77454                             geometry: node.asGeoJSON()
77455                         });
77456                     }
77457                 });
77458
77459
77460                 // Targets allow hover and vertex snapping
77461                 var targets = selection.selectAll('.vertex.target-allowed')
77462                     .filter(function(d) { return filter(d.properties.entity); })
77463                     .data(data.targets, function key(d) { return d.id; });
77464
77465                 // exit
77466                 targets.exit()
77467                     .remove();
77468
77469                 // enter/update
77470                 targets.enter()
77471                     .append('circle')
77472                     .attr('r', function(d) { return (_radii[d.id] || radiuses.shadow[3]); })
77473                     .merge(targets)
77474                     .attr('class', function(d) { return 'node vertex target target-allowed ' + targetClass + d.id; })
77475                     .attr('transform', getTransform);
77476
77477
77478                 // NOPE
77479                 var nopes = selection.selectAll('.vertex.target-nope')
77480                     .filter(function(d) { return filter(d.properties.entity); })
77481                     .data(data.nopes, function key(d) { return d.id; });
77482
77483                 // exit
77484                 nopes.exit()
77485                     .remove();
77486
77487                 // enter/update
77488                 nopes.enter()
77489                     .append('circle')
77490                     .attr('r', function(d) { return (_radii[d.properties.entity.id] || radiuses.shadow[3]); })
77491                     .merge(nopes)
77492                     .attr('class', function(d) { return 'node vertex target target-nope ' + nopeClass + d.id; })
77493                     .attr('transform', getTransform);
77494             }
77495
77496
77497             // Points can also render as vertices:
77498             // 1. in wireframe mode or
77499             // 2. at higher zooms if they have a direction
77500             function renderAsVertex(entity, graph, wireframe, zoom) {
77501                 var geometry = entity.geometry(graph);
77502                 return geometry === 'vertex' || (geometry === 'point' && (
77503                     wireframe || (zoom >= 18 && entity.directions(graph, projection).length)
77504                 ));
77505             }
77506
77507
77508             function getSiblingAndChildVertices(ids, graph, wireframe, zoom) {
77509                 var results = {};
77510
77511                 function addChildVertices(entity) {
77512                     var geometry = entity.geometry(graph);
77513                     if (!context.features().isHiddenFeature(entity, graph, geometry)) {
77514                         var i;
77515                         if (entity.type === 'way') {
77516                             for (i = 0; i < entity.nodes.length; i++) {
77517                                 var child = graph.hasEntity(entity.nodes[i]);
77518                                 if (child) {
77519                                     addChildVertices(child);
77520                                 }
77521                             }
77522                         } else if (entity.type === 'relation') {
77523                             for (i = 0; i < entity.members.length; i++) {
77524                                 var member = graph.hasEntity(entity.members[i].id);
77525                                 if (member) {
77526                                     addChildVertices(member);
77527                                 }
77528                             }
77529                         } else if (renderAsVertex(entity, graph, wireframe, zoom)) {
77530                             results[entity.id] = entity;
77531                         }
77532                     }
77533                 }
77534
77535                 ids.forEach(function(id) {
77536                     var entity = graph.hasEntity(id);
77537                     if (!entity) return;
77538
77539                     if (entity.type === 'node') {
77540                         if (renderAsVertex(entity, graph, wireframe, zoom)) {
77541                             results[entity.id] = entity;
77542                             graph.parentWays(entity).forEach(function(entity) {
77543                                 addChildVertices(entity);
77544                             });
77545                         }
77546                     } else {  // way, relation
77547                         addChildVertices(entity);
77548                     }
77549                 });
77550
77551                 return results;
77552             }
77553
77554
77555             function drawVertices(selection, graph, entities, filter, extent, fullRedraw) {
77556                 var wireframe = context.surface().classed('fill-wireframe');
77557                 var zoom = geoScaleToZoom(projection.scale());
77558                 var mode = context.mode();
77559                 var isMoving = mode && /^(add|draw|drag|move|rotate)/.test(mode.id);
77560
77561                 var drawLayer = selection.selectAll('.layer-osm.points .points-group.vertices');
77562                 var touchLayer = selection.selectAll('.layer-touch.points');
77563
77564                 if (fullRedraw) {
77565                     _currPersistent = {};
77566                     _radii = {};
77567                 }
77568
77569                 // Collect important vertices from the `entities` list..
77570                 // (during a paritial redraw, it will not contain everything)
77571                 for (var i = 0; i < entities.length; i++) {
77572                     var entity = entities[i];
77573                     var geometry = entity.geometry(graph);
77574                     var keep = false;
77575
77576                     // a point that looks like a vertex..
77577                     if ((geometry === 'point') && renderAsVertex(entity, graph, wireframe, zoom)) {
77578                         _currPersistent[entity.id] = entity;
77579                         keep = true;
77580
77581                     // a vertex of some importance..
77582                     } else if (geometry === 'vertex' &&
77583                         (entity.hasInterestingTags() || entity.isEndpoint(graph) || entity.isConnected(graph))) {
77584                         _currPersistent[entity.id] = entity;
77585                         keep = true;
77586                     }
77587
77588                     // whatever this is, it's not a persistent vertex..
77589                     if (!keep && !fullRedraw) {
77590                         delete _currPersistent[entity.id];
77591                     }
77592                 }
77593
77594                 // 3 sets of vertices to consider:
77595                 var sets = {
77596                     persistent: _currPersistent,  // persistent = important vertices (render always)
77597                     selected: _currSelected,      // selected + siblings of selected (render always)
77598                     hovered: _currHover           // hovered + siblings of hovered (render only in draw modes)
77599                 };
77600
77601                 var all = Object.assign({}, (isMoving ? _currHover : {}), _currSelected, _currPersistent);
77602
77603                 // Draw the vertices..
77604                 // The filter function controls the scope of what objects d3 will touch (exit/enter/update)
77605                 // Adjust the filter function to expand the scope beyond whatever entities were passed in.
77606                 var filterRendered = function(d) {
77607                     return d.id in _currPersistent || d.id in _currSelected || d.id in _currHover || filter(d);
77608                 };
77609                 drawLayer
77610                     .call(draw, graph, currentVisible(all), sets, filterRendered);
77611
77612                 // Draw touch targets..
77613                 // When drawing, render all targets (not just those affected by a partial redraw)
77614                 var filterTouch = function(d) {
77615                     return isMoving ? true : filterRendered(d);
77616                 };
77617                 touchLayer
77618                     .call(drawTargets, graph, currentVisible(all), filterTouch);
77619
77620
77621                 function currentVisible(which) {
77622                     return Object.keys(which)
77623                         .map(graph.hasEntity, graph)     // the current version of this entity
77624                         .filter(function (entity) { return entity && entity.intersects(extent, graph); });
77625                 }
77626             }
77627
77628
77629             // partial redraw - only update the selected items..
77630             drawVertices.drawSelected = function(selection, graph, extent) {
77631                 var wireframe = context.surface().classed('fill-wireframe');
77632                 var zoom = geoScaleToZoom(projection.scale());
77633
77634                 _prevSelected = _currSelected || {};
77635                 _currSelected = getSiblingAndChildVertices(context.selectedIDs(), graph, wireframe, zoom);
77636
77637                 // note that drawVertices will add `_currSelected` automatically if needed..
77638                 var filter = function(d) { return d.id in _prevSelected; };
77639                 drawVertices(selection, graph, Object.values(_prevSelected), filter, extent, false);
77640             };
77641
77642
77643             // partial redraw - only update the hovered items..
77644             drawVertices.drawHover = function(selection, graph, target, extent) {
77645                 if (target === _currHoverTarget) return;  // continue only if something changed
77646
77647                 var wireframe = context.surface().classed('fill-wireframe');
77648                 var zoom = geoScaleToZoom(projection.scale());
77649
77650                 _prevHover = _currHover || {};
77651                 _currHoverTarget = target;
77652                 var entity = target && target.properties && target.properties.entity;
77653
77654                 if (entity) {
77655                     _currHover = getSiblingAndChildVertices([entity.id], graph, wireframe, zoom);
77656                 } else {
77657                     _currHover = {};
77658                 }
77659
77660                 // note that drawVertices will add `_currHover` automatically if needed..
77661                 var filter = function(d) { return d.id in _prevHover; };
77662                 drawVertices(selection, graph, Object.values(_prevHover), filter, extent, false);
77663             };
77664
77665             return drawVertices;
77666         }
77667
77668         function utilBindOnce(target, type, listener, capture) {
77669             var typeOnce = type + '.once';
77670             function one() {
77671                 target.on(typeOnce, null);
77672                 listener.apply(this, arguments);
77673             }
77674             target.on(typeOnce, one, capture);
77675             return this;
77676         }
77677
77678         // constants
77679         var TILESIZE = 256;
77680         var kMin = geoZoomToScale(2, TILESIZE);
77681         var kMax = geoZoomToScale(24, TILESIZE);
77682
77683         function clamp(num, min, max) {
77684             return Math.max(min, Math.min(num, max));
77685         }
77686
77687
77688         function rendererMap(context) {
77689             var dispatch$1 = dispatch('move', 'drawn');
77690             var projection = context.projection;
77691             var curtainProjection = context.curtainProjection;
77692             var drawLayers = svgLayers(projection, context);
77693             var drawPoints = svgPoints(projection, context);
77694             var drawVertices = svgVertices(projection, context);
77695             var drawLines = svgLines(projection, context);
77696             var drawAreas = svgAreas(projection, context);
77697             var drawMidpoints = svgMidpoints(projection, context);
77698             var drawLabels = svgLabels(projection, context);
77699
77700             var _selection = d3_select(null);
77701             var supersurface = d3_select(null);
77702             var wrapper = d3_select(null);
77703             var surface = d3_select(null);
77704
77705             var _dimensions = [1, 1];
77706             var _dblClickEnabled = true;
77707             var _redrawEnabled = true;
77708             var _gestureTransformStart;
77709             var _transformStart = projection.transform();
77710             var _transformLast;
77711             var _isTransformed = false;
77712             var _minzoom = 0;
77713             var _getMouseCoords;
77714             var _mouseEvent;
77715
77716             var zoom = d3_zoom()
77717                 .scaleExtent([kMin, kMax])
77718                 .interpolate(d3_interpolate)
77719                 .filter(zoomEventFilter)
77720                 .on('zoom', zoomPan);
77721
77722             var scheduleRedraw = throttle(redraw, 750);
77723             // var isRedrawScheduled = false;
77724             // var pendingRedrawCall;
77725             // function scheduleRedraw() {
77726             //     // Only schedule the redraw if one has not already been set.
77727             //     if (isRedrawScheduled) return;
77728             //     isRedrawScheduled = true;
77729             //     var that = this;
77730             //     var args = arguments;
77731             //     pendingRedrawCall = window.requestIdleCallback(function () {
77732             //         // Reset the boolean so future redraws can be set.
77733             //         isRedrawScheduled = false;
77734             //         redraw.apply(that, args);
77735             //     }, { timeout: 1400 });
77736             // }
77737
77738             function cancelPendingRedraw() {
77739                 scheduleRedraw.cancel();
77740                 // isRedrawScheduled = false;
77741                 // window.cancelIdleCallback(pendingRedrawCall);
77742             }
77743
77744
77745             function map(selection) {
77746                 _selection = selection;
77747
77748                 context
77749                     .on('change.map', immediateRedraw);
77750
77751                 var osm = context.connection();
77752                 if (osm) {
77753                     osm.on('change.map', immediateRedraw);
77754                 }
77755
77756                 function didUndoOrRedo(targetTransform) {
77757                     var mode = context.mode().id;
77758                     if (mode !== 'browse' && mode !== 'select') return;
77759                     if (targetTransform) {
77760                         map.transformEase(targetTransform);
77761                     }
77762                 }
77763
77764                 context.history()
77765                     .on('merge.map', function() { scheduleRedraw(); })
77766                     .on('change.map', immediateRedraw)
77767                     .on('undone.map', function(stack, fromStack) {
77768                         didUndoOrRedo(fromStack.transform);
77769                     })
77770                     .on('redone.map', function(stack) {
77771                         didUndoOrRedo(stack.transform);
77772                     });
77773
77774                 context.background()
77775                     .on('change.map', immediateRedraw);
77776
77777                 context.features()
77778                     .on('redraw.map', immediateRedraw);
77779
77780                 drawLayers
77781                     .on('change.map', function() {
77782                         context.background().updateImagery();
77783                         immediateRedraw();
77784                     });
77785
77786                 selection
77787                     .on('dblclick.map', dblClick)
77788                     .call(zoom)
77789                     .call(zoom.transform, projection.transform());
77790
77791                 supersurface = selection.append('div')
77792                     .attr('id', 'supersurface')
77793                     .call(utilSetTransform, 0, 0);
77794
77795                 // Need a wrapper div because Opera can't cope with an absolutely positioned
77796                 // SVG element: http://bl.ocks.org/jfirebaugh/6fbfbd922552bf776c16
77797                 wrapper = supersurface
77798                     .append('div')
77799                     .attr('class', 'layer layer-data');
77800
77801                 map.surface = surface = wrapper
77802                     .call(drawLayers)
77803                     .selectAll('.surface')
77804                     .attr('id', 'surface');
77805
77806                 surface
77807                     .call(drawLabels.observe)
77808                     .on('gesturestart.surface', function() {
77809                         _gestureTransformStart = projection.transform();
77810                     })
77811                     .on('gesturechange.surface', gestureChange)
77812                     .on('mousedown.zoom', function() {
77813                         if (event.button === 2) {
77814                             event.stopPropagation();
77815                         }
77816                     }, true)
77817                     .on('mouseup.zoom', function() {
77818                         if (resetTransform()) {
77819                             immediateRedraw();
77820                         }
77821                     })
77822                     .on('mousemove.map', function() {
77823                         _mouseEvent = event;
77824                     })
77825                     .on('mouseover.vertices', function() {
77826                         if (map.editable() && !_isTransformed) {
77827                             var hover = event.target.__data__;
77828                             surface.call(drawVertices.drawHover, context.graph(), hover, map.extent());
77829                             dispatch$1.call('drawn', this, { full: false });
77830                         }
77831                     })
77832                     .on('mouseout.vertices', function() {
77833                         if (map.editable() && !_isTransformed) {
77834                             var hover = event.relatedTarget && event.relatedTarget.__data__;
77835                             surface.call(drawVertices.drawHover, context.graph(), hover, map.extent());
77836                             dispatch$1.call('drawn', this, { full: false });
77837                         }
77838                     });
77839
77840                 context.on('enter.map',  function() {
77841                     if (map.editable() && !_isTransformed) {
77842                         // redraw immediately any objects affected by a change in selectedIDs.
77843                         var graph = context.graph();
77844                         var selectedAndParents = {};
77845                         context.selectedIDs().forEach(function(id) {
77846                             var entity = graph.hasEntity(id);
77847                             if (entity) {
77848                                 selectedAndParents[entity.id] = entity;
77849                                 if (entity.type === 'node') {
77850                                     graph.parentWays(entity).forEach(function(parent) {
77851                                         selectedAndParents[parent.id] = parent;
77852                                     });
77853                                 }
77854                             }
77855                         });
77856                         var data = Object.values(selectedAndParents);
77857                         var filter = function(d) { return d.id in selectedAndParents; };
77858
77859                         data = context.features().filter(data, graph);
77860
77861                         surface
77862                             .call(drawVertices.drawSelected, graph, map.extent())
77863                             .call(drawLines, graph, data, filter)
77864                             .call(drawAreas, graph, data, filter)
77865                             .call(drawMidpoints, graph, data, filter, map.trimmedExtent());
77866
77867                         dispatch$1.call('drawn', this, { full: false });
77868
77869                         // redraw everything else later
77870                         scheduleRedraw();
77871                     }
77872                 });
77873
77874                 map.dimensions(utilGetDimensions(selection));
77875             }
77876
77877
77878             function zoomEventFilter() {
77879                 // Fix for #2151, (see also d3/d3-zoom#60, d3/d3-brush#18)
77880                 // Intercept `mousedown` and check if there is an orphaned zoom gesture.
77881                 // This can happen if a previous `mousedown` occurred without a `mouseup`.
77882                 // If we detect this, dispatch `mouseup` to complete the orphaned gesture,
77883                 // so that d3-zoom won't stop propagation of new `mousedown` events.
77884                 if (event.type === 'mousedown') {
77885                     var hasOrphan = false;
77886                     var listeners = window.__on;
77887                     for (var i = 0; i < listeners.length; i++) {
77888                         var listener = listeners[i];
77889                         if (listener.name === 'zoom' && listener.type === 'mouseup') {
77890                             hasOrphan = true;
77891                             break;
77892                         }
77893                     }
77894                     if (hasOrphan) {
77895                         var event$1 = window.CustomEvent;
77896                         if (event$1) {
77897                             event$1 = new event$1('mouseup');
77898                         } else {
77899                             event$1 = window.document.createEvent('Event');
77900                             event$1.initEvent('mouseup', false, false);
77901                         }
77902                         // Event needs to be dispatched with an event.view property.
77903                         event$1.view = window;
77904                         window.dispatchEvent(event$1);
77905                     }
77906                 }
77907
77908                 return event.button !== 2;   // ignore right clicks
77909             }
77910
77911
77912             function pxCenter() {
77913                 return [_dimensions[0] / 2, _dimensions[1] / 2];
77914             }
77915
77916
77917             function drawEditable(difference, extent) {
77918                 var mode = context.mode();
77919                 var graph = context.graph();
77920                 var features = context.features();
77921                 var all = context.intersects(map.extent());
77922                 var fullRedraw = false;
77923                 var data;
77924                 var set;
77925                 var filter;
77926
77927                 if (difference) {
77928                     var complete = difference.complete(map.extent());
77929                     data = Object.values(complete).filter(Boolean);
77930                     set = new Set(data.map(function(entity) { return entity.id; }));
77931                     filter = function(d) { return set.has(d.id); };
77932                     features.clear(data);
77933
77934                 } else {
77935                     // force a full redraw if gatherStats detects that a feature
77936                     // should be auto-hidden (e.g. points or buildings)..
77937                     if (features.gatherStats(all, graph, _dimensions)) {
77938                         extent = undefined;
77939                     }
77940
77941                     if (extent) {
77942                         data = context.intersects(map.extent().intersection(extent));
77943                         set = new Set(data.map(function(entity) { return entity.id; }));
77944                         filter = function(d) { return set.has(d.id); };
77945
77946                     } else {
77947                         data = all;
77948                         fullRedraw = true;
77949                         filter = utilFunctor(true);
77950                     }
77951                 }
77952
77953                 data = features.filter(data, graph);
77954
77955                 if (mode && mode.id === 'select') {
77956                     // update selected vertices - the user might have just double-clicked a way,
77957                     // creating a new vertex, triggering a partial redraw without a mode change
77958                     surface.call(drawVertices.drawSelected, graph, map.extent());
77959                 }
77960
77961                 surface
77962                     .call(drawVertices, graph, data, filter, map.extent(), fullRedraw)
77963                     .call(drawLines, graph, data, filter)
77964                     .call(drawAreas, graph, data, filter)
77965                     .call(drawMidpoints, graph, data, filter, map.trimmedExtent())
77966                     .call(drawLabels, graph, data, filter, _dimensions, fullRedraw)
77967                     .call(drawPoints, graph, data, filter);
77968
77969                 dispatch$1.call('drawn', this, {full: true});
77970             }
77971
77972
77973             function editOff() {
77974                 context.features().resetStats();
77975                 surface.selectAll('.layer-osm *').remove();
77976                 surface.selectAll('.layer-touch:not(.markers) *').remove();
77977
77978                 var allowed = {
77979                     'browse': true,
77980                     'save': true,
77981                     'select-note': true,
77982                     'select-data': true,
77983                     'select-error': true
77984                 };
77985
77986                 var mode = context.mode();
77987                 if (mode && !allowed[mode.id]) {
77988                     context.enter(modeBrowse(context));
77989                 }
77990
77991                 dispatch$1.call('drawn', this, {full: true});
77992             }
77993
77994
77995             function dblClick() {
77996                 if (!_dblClickEnabled) {
77997                     event.preventDefault();
77998                     event.stopImmediatePropagation();
77999                 }
78000             }
78001
78002
78003             function gestureChange() {
78004                 // Remap Safari gesture events to wheel events - #5492
78005                 // We want these disabled most places, but enabled for zoom/unzoom on map surface
78006                 // https://developer.mozilla.org/en-US/docs/Web/API/GestureEvent
78007                 var e = event;
78008                 e.preventDefault();
78009
78010                 var props = {
78011                     deltaMode: 0,    // dummy values to ignore in zoomPan
78012                     deltaY: 1,       // dummy values to ignore in zoomPan
78013                     clientX: e.clientX,
78014                     clientY: e.clientY,
78015                     screenX: e.screenX,
78016                     screenY: e.screenY,
78017                     x: e.x,
78018                     y: e.y
78019                 };
78020
78021                 var e2 = new WheelEvent('wheel', props);
78022                 e2._scale = e.scale;         // preserve the original scale
78023                 e2._rotation = e.rotation;   // preserve the original rotation
78024
78025                 _selection.node().dispatchEvent(e2);
78026             }
78027
78028
78029             function zoomPan(manualEvent) {
78030                 var event$1 = (manualEvent || event);
78031                 var source = event$1.sourceEvent;
78032                 var eventTransform = event$1.transform;
78033                 var x = eventTransform.x;
78034                 var y = eventTransform.y;
78035                 var k = eventTransform.k;
78036
78037                 if (_transformStart.x === x &&
78038                     _transformStart.y === y &&
78039                     _transformStart.k === k) {
78040                     return;  // no change
78041                 }
78042
78043                 // Special handling of 'wheel' events:
78044                 // They might be triggered by the user scrolling the mouse wheel,
78045                 // or 2-finger pinch/zoom gestures, the transform may need adjustment.
78046                 if (source && source.type === 'wheel') {
78047                     var detected = utilDetect();
78048                     var dX = source.deltaX;
78049                     var dY = source.deltaY;
78050                     var x2 = x;
78051                     var y2 = y;
78052                     var k2 = k;
78053                     var t0, p0, p1;
78054
78055                     // Normalize mousewheel scroll speed (Firefox) - #3029
78056                     // If wheel delta is provided in LINE units, recalculate it in PIXEL units
78057                     // We are essentially redoing the calculations that occur here:
78058                     //   https://github.com/d3/d3-zoom/blob/78563a8348aa4133b07cac92e2595c2227ca7cd7/src/zoom.js#L203
78059                     // See this for more info:
78060                     //   https://github.com/basilfx/normalize-wheel/blob/master/src/normalizeWheel.js
78061                     if (source.deltaMode === 1 /* LINE */) {
78062                         // Convert from lines to pixels, more if the user is scrolling fast.
78063                         // (I made up the exp function to roughly match Firefox to what Chrome does)
78064                         // These numbers should be floats, because integers are treated as pan gesture below.
78065                         var lines = Math.abs(source.deltaY);
78066                         var sign = (source.deltaY > 0) ? 1 : -1;
78067                         dY = sign * clamp(
78068                             Math.exp((lines - 1) * 0.75) * 4.000244140625,
78069                             4.000244140625,    // min
78070                             350.000244140625   // max
78071                         );
78072
78073                         // On Firefox Windows and Linux we always get +/- the scroll line amount (default 3)
78074                         // There doesn't seem to be any scroll accelleration.
78075                         // This multiplier increases the speed a little bit - #5512
78076                         if (detected.os !== 'mac') {
78077                             dY *= 5;
78078                         }
78079
78080                         // recalculate x2,y2,k2
78081                         t0 = _isTransformed ? _transformLast : _transformStart;
78082                         p0 = _getMouseCoords(source);
78083                         p1 = t0.invert(p0);
78084                         k2 = t0.k * Math.pow(2, -dY / 500);
78085                         x2 = p0[0] - p1[0] * k2;
78086                         y2 = p0[1] - p1[1] * k2;
78087
78088                     // 2 finger map pinch zooming (Safari) - #5492
78089                     // These are fake `wheel` events we made from Safari `gesturechange` events..
78090                     } else if (source._scale) {
78091                         // recalculate x2,y2,k2
78092                         t0 = _gestureTransformStart;
78093                         p0 = _getMouseCoords(source);
78094                         p1 = t0.invert(p0);
78095                         k2 = t0.k * source._scale;
78096                         x2 = p0[0] - p1[0] * k2;
78097                         y2 = p0[1] - p1[1] * k2;
78098
78099                     // 2 finger map pinch zooming (all browsers except Safari) - #5492
78100                     // Pinch zooming via the `wheel` event will always have:
78101                     // - `ctrlKey = true`
78102                     // - `deltaY` is not round integer pixels (ignore `deltaX`)
78103                     } else if (source.ctrlKey && !isInteger(dY)) {
78104                         dY *= 6;   // slightly scale up whatever the browser gave us
78105
78106                         // recalculate x2,y2,k2
78107                         t0 = _isTransformed ? _transformLast : _transformStart;
78108                         p0 = _getMouseCoords(source);
78109                         p1 = t0.invert(p0);
78110                         k2 = t0.k * Math.pow(2, -dY / 500);
78111                         x2 = p0[0] - p1[0] * k2;
78112                         y2 = p0[1] - p1[1] * k2;
78113
78114                     // Trackpad scroll zooming with shift or alt/option key down
78115                     } else if ((source.altKey || source.shiftKey) && isInteger(dY)) {
78116                         // recalculate x2,y2,k2
78117                         t0 = _isTransformed ? _transformLast : _transformStart;
78118                         p0 = _getMouseCoords(source);
78119                         p1 = t0.invert(p0);
78120                         k2 = t0.k * Math.pow(2, -dY / 500);
78121                         x2 = p0[0] - p1[0] * k2;
78122                         y2 = p0[1] - p1[1] * k2;
78123
78124                     // 2 finger map panning (Mac only, all browsers) - #5492, #5512
78125                     // Panning via the `wheel` event will always have:
78126                     // - `ctrlKey = false`
78127                     // - `deltaX`,`deltaY` are round integer pixels
78128                     } else if (detected.os === 'mac' && !source.ctrlKey && isInteger(dX) && isInteger(dY)) {
78129                         p1 = projection.translate();
78130                         x2 = p1[0] - dX;
78131                         y2 = p1[1] - dY;
78132                         k2 = projection.scale();
78133                     }
78134
78135                     // something changed - replace the event transform
78136                     if (x2 !== x || y2 !== y || k2 !== k) {
78137                         x = x2;
78138                         y = y2;
78139                         k = k2;
78140                         eventTransform = identity$8.translate(x2, y2).scale(k2);
78141                         _selection.node().__zoom = eventTransform;
78142                     }
78143
78144                 }
78145
78146                 if (geoScaleToZoom(k, TILESIZE) < _minzoom) {
78147                     surface.interrupt();
78148                     uiFlash().text(t('cannot_zoom'))();
78149                     setCenterZoom(map.center(), context.minEditableZoom(), 0, true);
78150                     scheduleRedraw();
78151                     dispatch$1.call('move', this, map);
78152                     return;
78153                 }
78154
78155                 projection.transform(eventTransform);
78156
78157                 var scale = k / _transformStart.k;
78158                 var tX = (x / scale - _transformStart.x) * scale;
78159                 var tY = (y / scale - _transformStart.y) * scale;
78160
78161                 if (context.inIntro()) {
78162                     curtainProjection.transform({
78163                         x: x - tX,
78164                         y: y - tY,
78165                         k: k
78166                     });
78167                 }
78168
78169                 if (source) {
78170                     _mouseEvent = event$1;
78171                 }
78172                 _isTransformed = true;
78173                 _transformLast = eventTransform;
78174                 utilSetTransform(supersurface, tX, tY, scale);
78175                 scheduleRedraw();
78176
78177                 dispatch$1.call('move', this, map);
78178
78179
78180                 function isInteger(val) {
78181                     return typeof val === 'number' && isFinite(val) && Math.floor(val) === val;
78182                 }
78183             }
78184
78185
78186             function resetTransform() {
78187                 if (!_isTransformed) return false;
78188
78189                 // deprecation warning - Radial Menu to be removed in iD v3
78190                 surface.selectAll('.edit-menu, .radial-menu').interrupt().remove();
78191                 utilSetTransform(supersurface, 0, 0);
78192                 _isTransformed = false;
78193                 if (context.inIntro()) {
78194                     curtainProjection.transform(projection.transform());
78195                 }
78196                 return true;
78197             }
78198
78199
78200             function redraw(difference, extent) {
78201                 if (surface.empty() || !_redrawEnabled) return;
78202
78203                 // If we are in the middle of a zoom/pan, we can't do differenced redraws.
78204                 // It would result in artifacts where differenced entities are redrawn with
78205                 // one transform and unchanged entities with another.
78206                 if (resetTransform()) {
78207                     difference = extent = undefined;
78208                 }
78209
78210                 var zoom = map.zoom();
78211                 var z = String(~~zoom);
78212
78213                 if (surface.attr('data-zoom') !== z) {
78214                     surface.attr('data-zoom', z);
78215                 }
78216
78217                 // class surface as `lowzoom` around z17-z18.5 (based on latitude)
78218                 var lat = map.center()[1];
78219                 var lowzoom = linear$2()
78220                     .domain([-60, 0, 60])
78221                     .range([17, 18.5, 17])
78222                     .clamp(true);
78223
78224                 surface
78225                     .classed('low-zoom', zoom <= lowzoom(lat));
78226
78227
78228                 if (!difference) {
78229                     supersurface.call(context.background());
78230                     wrapper.call(drawLayers);
78231                 }
78232
78233                 // OSM
78234                 if (map.editable()) {
78235                     context.loadTiles(projection);
78236                     drawEditable(difference, extent);
78237                 } else {
78238                     editOff();
78239                 }
78240
78241                 _transformStart = projection.transform();
78242
78243                 return map;
78244             }
78245
78246
78247
78248             var immediateRedraw = function(difference, extent) {
78249                 if (!difference && !extent) cancelPendingRedraw();
78250                 redraw(difference, extent);
78251             };
78252
78253
78254             map.mouse = function() {
78255                 var event$1 = _mouseEvent || event;
78256                 if (event$1) {
78257                     var s;
78258                     while ((s = event$1.sourceEvent)) { event$1 = s; }
78259                     return _getMouseCoords(event$1);
78260                 }
78261                 return null;
78262             };
78263
78264
78265             // returns Lng/Lat
78266             map.mouseCoordinates = function() {
78267                 var coord = map.mouse() || pxCenter();
78268                 return projection.invert(coord);
78269             };
78270
78271
78272             map.dblclickEnable = function(val) {
78273                 if (!arguments.length) return _dblClickEnabled;
78274                 _dblClickEnabled = val;
78275                 return map;
78276             };
78277
78278
78279             map.redrawEnable = function(val) {
78280                 if (!arguments.length) return _redrawEnabled;
78281                 _redrawEnabled = val;
78282                 return map;
78283             };
78284
78285
78286             map.isTransformed = function() {
78287                 return _isTransformed;
78288             };
78289
78290
78291             function setTransform(t2, duration, force) {
78292                 var t = projection.transform();
78293                 if (!force && t2.k === t.k && t2.x === t.x && t2.y === t.y) return false;
78294
78295                 if (duration) {
78296                     _selection
78297                         .transition()
78298                         .duration(duration)
78299                         .on('start', function() { map.startEase(); })
78300                         .call(zoom.transform, identity$8.translate(t2.x, t2.y).scale(t2.k));
78301                 } else {
78302                     projection.transform(t2);
78303                     _transformStart = t2;
78304                     _selection.call(zoom.transform, _transformStart);
78305                 }
78306
78307                 return true;
78308             }
78309
78310
78311             function setCenterZoom(loc2, z2, duration, force) {
78312                 var c = map.center();
78313                 var z = map.zoom();
78314                 if (loc2[0] === c[0] && loc2[1] === c[1] && z2 === z && !force) return false;
78315
78316                 var proj = geoRawMercator().transform(projection.transform());  // copy projection
78317
78318                 var k2 = clamp(geoZoomToScale(z2, TILESIZE), kMin, kMax);
78319                 proj.scale(k2);
78320
78321                 var t = proj.translate();
78322                 var point = proj(loc2);
78323
78324                 var center = pxCenter();
78325                 t[0] += center[0] - point[0];
78326                 t[1] += center[1] - point[1];
78327
78328                 return setTransform(identity$8.translate(t[0], t[1]).scale(k2), duration, force);
78329             }
78330
78331
78332             map.pan = function(delta, duration) {
78333                 var t = projection.translate();
78334                 var k = projection.scale();
78335
78336                 t[0] += delta[0];
78337                 t[1] += delta[1];
78338
78339                 if (duration) {
78340                     _selection
78341                         .transition()
78342                         .duration(duration)
78343                         .on('start', function() { map.startEase(); })
78344                         .call(zoom.transform, identity$8.translate(t[0], t[1]).scale(k));
78345                 } else {
78346                     projection.translate(t);
78347                     _transformStart = projection.transform();
78348                     _selection.call(zoom.transform, _transformStart);
78349                     dispatch$1.call('move', this, map);
78350                     immediateRedraw();
78351                 }
78352
78353                 return map;
78354             };
78355
78356
78357             map.dimensions = function(val) {
78358                 if (!arguments.length) return _dimensions;
78359
78360                 _dimensions = val;
78361                 drawLayers.dimensions(_dimensions);
78362                 context.background().dimensions(_dimensions);
78363                 projection.clipExtent([[0, 0], _dimensions]);
78364                 _getMouseCoords = utilFastMouse(supersurface.node());
78365
78366                 scheduleRedraw();
78367                 return map;
78368             };
78369
78370
78371             function zoomIn(delta) {
78372                 setCenterZoom(map.center(), ~~map.zoom() + delta, 250, true);
78373             }
78374
78375             function zoomOut(delta) {
78376                 setCenterZoom(map.center(), ~~map.zoom() - delta, 250, true);
78377             }
78378
78379             map.zoomIn = function() { zoomIn(1); };
78380             map.zoomInFurther = function() { zoomIn(4); };
78381
78382             map.zoomOut = function() { zoomOut(1); };
78383             map.zoomOutFurther = function() { zoomOut(4); };
78384
78385
78386             map.center = function(loc2) {
78387                 if (!arguments.length) {
78388                     return projection.invert(pxCenter());
78389                 }
78390
78391                 if (setCenterZoom(loc2, map.zoom())) {
78392                     dispatch$1.call('move', this, map);
78393                 }
78394
78395                 scheduleRedraw();
78396                 return map;
78397             };
78398
78399             map.unobscuredCenterZoomEase = function(loc, zoom) {
78400                 var offset = map.unobscuredOffset();
78401                 var locPx = projection(loc);
78402                 var offsetLocPx = [locPx[0] + offset[0], locPx[1] + offset[1]];
78403                 var offsetLoc = projection.invert(offsetLocPx);
78404                 map.centerZoomEase(offsetLoc, zoom);
78405             };
78406
78407             map.unobscuredOffset = function() {
78408                 var openPane = d3_select('.map-panes .map-pane.shown');
78409                 if (!openPane.empty()) {
78410                     return [openPane.node().offsetWidth/2, 0];
78411                 }
78412                 return [0, 0];
78413             };
78414
78415             map.zoom = function(z2) {
78416                 if (!arguments.length) {
78417                     return Math.max(geoScaleToZoom(projection.scale(), TILESIZE), 0);
78418                 }
78419
78420                 if (z2 < _minzoom) {
78421                     surface.interrupt();
78422                     uiFlash().text(t('cannot_zoom'))();
78423                     z2 = context.minEditableZoom();
78424                 }
78425
78426                 if (setCenterZoom(map.center(), z2)) {
78427                     dispatch$1.call('move', this, map);
78428                 }
78429
78430                 scheduleRedraw();
78431                 return map;
78432             };
78433
78434
78435             map.centerZoom = function(loc2, z2) {
78436                 if (setCenterZoom(loc2, z2)) {
78437                     dispatch$1.call('move', this, map);
78438                 }
78439
78440                 scheduleRedraw();
78441                 return map;
78442             };
78443
78444
78445             map.zoomTo = function(entity) {
78446                 var extent = entity.extent(context.graph());
78447                 if (!isFinite(extent.area())) return map;
78448
78449                 var z2 = clamp(map.trimmedExtentZoom(extent), context.minEditableZoom(), 20);
78450                 return map.centerZoom(extent.center(), z2);
78451             };
78452
78453
78454             map.centerEase = function(loc2, duration) {
78455                 duration = duration || 250;
78456                 setCenterZoom(loc2, map.zoom(), duration);
78457                 return map;
78458             };
78459
78460
78461             map.zoomEase = function(z2, duration) {
78462                 duration = duration || 250;
78463                 setCenterZoom(map.center(), z2, duration, false);
78464                 return map;
78465             };
78466
78467
78468             map.centerZoomEase = function(loc2, z2, duration) {
78469                 duration = duration || 250;
78470                 setCenterZoom(loc2, z2, duration, false);
78471                 return map;
78472             };
78473
78474
78475             map.transformEase = function(t2, duration) {
78476                 duration = duration || 250;
78477                 setTransform(t2, duration, false);
78478                 return map;
78479             };
78480
78481
78482             map.zoomToEase = function(entity, duration) {
78483                 var extent = entity.extent(context.graph());
78484                 if (!isFinite(extent.area())) return map;
78485
78486                 var z2 = clamp(map.trimmedExtentZoom(extent), context.minEditableZoom(), 20);
78487                 return map.centerZoomEase(extent.center(), z2, duration);
78488             };
78489
78490
78491             map.startEase = function() {
78492                 utilBindOnce(surface, 'mousedown.ease', function() {
78493                     map.cancelEase();
78494                 });
78495                 return map;
78496             };
78497
78498
78499             map.cancelEase = function() {
78500                 _selection.interrupt();
78501                 return map;
78502             };
78503
78504
78505             map.extent = function(val) {
78506                 if (!arguments.length) {
78507                     return new geoExtent(
78508                         projection.invert([0, _dimensions[1]]),
78509                         projection.invert([_dimensions[0], 0])
78510                     );
78511                 } else {
78512                     var extent = geoExtent(val);
78513                     map.centerZoom(extent.center(), map.extentZoom(extent));
78514                 }
78515             };
78516
78517
78518             map.trimmedExtent = function(val) {
78519                 if (!arguments.length) {
78520                     var headerY = 60;
78521                     var footerY = 30;
78522                     var pad = 10;
78523                     return new geoExtent(
78524                         projection.invert([pad, _dimensions[1] - footerY - pad]),
78525                         projection.invert([_dimensions[0] - pad, headerY + pad])
78526                     );
78527                 } else {
78528                     var extent = geoExtent(val);
78529                     map.centerZoom(extent.center(), map.trimmedExtentZoom(extent));
78530                 }
78531             };
78532
78533
78534             function calcExtentZoom(extent, dim) {
78535                 var tl = projection([extent[0][0], extent[1][1]]);
78536                 var br = projection([extent[1][0], extent[0][1]]);
78537
78538                 // Calculate maximum zoom that fits extent
78539                 var hFactor = (br[0] - tl[0]) / dim[0];
78540                 var vFactor = (br[1] - tl[1]) / dim[1];
78541                 var hZoomDiff = Math.log(Math.abs(hFactor)) / Math.LN2;
78542                 var vZoomDiff = Math.log(Math.abs(vFactor)) / Math.LN2;
78543                 var newZoom = map.zoom() - Math.max(hZoomDiff, vZoomDiff);
78544
78545                 return newZoom;
78546             }
78547
78548
78549             map.extentZoom = function(val) {
78550                 return calcExtentZoom(geoExtent(val), _dimensions);
78551             };
78552
78553
78554             map.trimmedExtentZoom = function(val) {
78555                 var trimY = 120;
78556                 var trimX = 40;
78557                 var trimmed = [_dimensions[0] - trimX, _dimensions[1] - trimY];
78558                 return calcExtentZoom(geoExtent(val), trimmed);
78559             };
78560
78561
78562             map.editable = function() {
78563                 var layer = context.layers().layer('osm');
78564                 if (!layer || !layer.enabled()) return false;
78565
78566                 return map.zoom() >= context.minEditableZoom();
78567             };
78568
78569
78570             map.notesEditable = function() {
78571                 var layer = context.layers().layer('notes');
78572                 if (!layer || !layer.enabled()) return false;
78573
78574                 return map.zoom() >= context.minEditableZoom();
78575             };
78576
78577
78578             map.minzoom = function(val) {
78579                 if (!arguments.length) return _minzoom;
78580                 _minzoom = val;
78581                 return map;
78582             };
78583
78584
78585             map.layers = drawLayers;
78586
78587
78588             return utilRebind(map, dispatch$1, 'on');
78589         }
78590
78591         function rendererPhotos(context) {
78592             var dispatch$1 = dispatch('change');
78593             var _layerIDs = ['streetside', 'mapillary', 'mapillary-signs', 'openstreetcam'];
78594             var _allPhotoTypes = ['flat', 'panoramic'];
78595             var _shownPhotoTypes = _allPhotoTypes.slice();   // shallow copy
78596
78597             function photos() {}
78598
78599             function updateStorage() {
78600                 if (window.mocha) return;
78601
78602                 var q = utilStringQs(window.location.hash.substring(1));
78603                 var enabled = context.layers().all().filter(function(d) {
78604                     return _layerIDs.indexOf(d.id) !== -1 && d.layer && d.layer.supported() && d.layer.enabled();
78605                 }).map(function(d) {
78606                     return d.id;
78607                 });
78608                 if (enabled.length) {
78609                     q.photo_overlay = enabled.join(',');
78610                 } else {
78611                     delete q.photo_overlay;
78612                 }
78613                 window.location.replace('#' + utilQsString(q, true));
78614             }
78615
78616             photos.overlayLayerIDs = function() {
78617                 return _layerIDs;
78618             };
78619
78620             photos.allPhotoTypes = function() {
78621                 return _allPhotoTypes;
78622             };
78623
78624             function showsLayer(id) {
78625                 var layer = context.layers().layer(id);
78626                 return layer && layer.supported() && layer.enabled();
78627             }
78628
78629             photos.shouldFilterByPhotoType = function() {
78630                 return showsLayer('mapillary') ||
78631                     (showsLayer('streetside') && showsLayer('openstreetcam'));
78632             };
78633
78634             photos.showsPhotoType = function(val) {
78635                 if (!photos.shouldFilterByPhotoType()) return true;
78636
78637                 return _shownPhotoTypes.indexOf(val) !== -1;
78638             };
78639
78640             photos.showsFlat = function() {
78641                 return photos.showsPhotoType('flat');
78642             };
78643
78644             photos.showsPanoramic = function() {
78645                 return photos.showsPhotoType('panoramic');
78646             };
78647
78648             photos.togglePhotoType = function(val) {
78649                 var index = _shownPhotoTypes.indexOf(val);
78650                 if (index !== -1) {
78651                     _shownPhotoTypes.splice(index, 1);
78652                 } else {
78653                     _shownPhotoTypes.push(val);
78654                 }
78655                 dispatch$1.call('change', this);
78656                 return photos;
78657             };
78658
78659             photos.init = function() {
78660                 var q = utilStringQs(window.location.hash.substring(1));
78661                 if (q.photo_overlay) {
78662                     var hashOverlayIDs = q.photo_overlay.replace(/;/g, ',').split(',');
78663                     hashOverlayIDs.forEach(function(id) {
78664                         var layer = context.layers().layer(id);
78665                         if (layer) layer.enabled(true);
78666                     });
78667                 }
78668
78669                 context.layers().on('change.rendererPhotos', updateStorage);
78670             };
78671
78672             return utilRebind(photos, dispatch$1, 'on');
78673         }
78674
78675         function uiAccount(context) {
78676             var osm = context.connection();
78677
78678
78679             function update(selection) {
78680                 if (!osm) return;
78681
78682                 if (!osm.authenticated()) {
78683                     selection.selectAll('#userLink, #logoutLink')
78684                         .classed('hide', true);
78685                     return;
78686                 }
78687
78688                 osm.userDetails(function(err, details) {
78689                     var userLink = selection.select('#userLink'),
78690                         logoutLink = selection.select('#logoutLink');
78691
78692                     userLink.html('');
78693                     logoutLink.html('');
78694
78695                     if (err) return;
78696
78697                     selection.selectAll('#userLink, #logoutLink')
78698                         .classed('hide', false);
78699
78700                     // Link
78701                     userLink.append('a')
78702                         .attr('href', osm.userURL(details.display_name))
78703                         .attr('target', '_blank');
78704
78705                     // Add thumbnail or dont
78706                     if (details.image_url) {
78707                         userLink.append('img')
78708                             .attr('class', 'icon pre-text user-icon')
78709                             .attr('src', details.image_url);
78710                     } else {
78711                         userLink
78712                             .call(svgIcon('#iD-icon-avatar', 'pre-text light'));
78713                     }
78714
78715                     // Add user name
78716                     userLink.append('span')
78717                         .attr('class', 'label')
78718                         .text(details.display_name);
78719
78720                     logoutLink.append('a')
78721                         .attr('class', 'logout')
78722                         .attr('href', '#')
78723                         .text(t('logout'))
78724                         .on('click.logout', function() {
78725                             event.preventDefault();
78726                             osm.logout();
78727                         });
78728                 });
78729             }
78730
78731
78732             return function(selection) {
78733                 selection.append('li')
78734                     .attr('id', 'logoutLink')
78735                     .classed('hide', true);
78736
78737                 selection.append('li')
78738                     .attr('id', 'userLink')
78739                     .classed('hide', true);
78740
78741                 if (osm) {
78742                     osm.on('change.account', function() { update(selection); });
78743                     update(selection);
78744                 }
78745             };
78746         }
78747
78748         function uiAttribution(context) {
78749             var selection;
78750
78751
78752             function attribution(data, klass) {
78753                 var div = selection.selectAll('.' + klass)
78754                     .data([0]);
78755
78756                 div = div.enter()
78757                     .append('div')
78758                     .attr('class', klass)
78759                     .merge(div);
78760
78761
78762                 var background = div.selectAll('.attribution')
78763                     .data(data, function(d) { return d.name(); });
78764
78765                 background.exit()
78766                     .remove();
78767
78768                 background = background.enter()
78769                     .append('span')
78770                     .attr('class', 'attribution')
78771                     .each(function(d) {
78772                         if (d.terms_html) {
78773                             d3_select(this)
78774                                 .html(d.terms_html);
78775                             return;
78776                         }
78777
78778                         var selection;
78779                         if (d.terms_url) {
78780                             selection = d3_select(this)
78781                                 .append('a')
78782                                 .attr('href', d.terms_url)
78783                                 .attr('target', '_blank');
78784                         } else {
78785                             selection = d3_select(this);
78786                         }
78787
78788
78789                         var id_safe = d.id.replace(/\./g, '<TX_DOT>');
78790                         var terms_text = t('imagery.' + id_safe + '.attribution.text',
78791                             { default: d.terms_text || d.id || d.name() }
78792                         );
78793
78794                         if (d.icon && !d.overlay) {
78795                             selection
78796                                 .append('img')
78797                                 .attr('class', 'source-image')
78798                                 .attr('src', d.icon);
78799                         }
78800
78801                         selection
78802                             .append('span')
78803                             .attr('class', 'attribution-text')
78804                             .text(terms_text);
78805                     })
78806                     .merge(background);
78807
78808
78809                 var copyright = background.selectAll('.copyright-notice')
78810                     .data(function(d) {
78811                         var notice = d.copyrightNotices(context.map().zoom(), context.map().extent());
78812                         return notice ? [notice] : [];
78813                     });
78814
78815                 copyright.exit()
78816                     .remove();
78817
78818                 copyright = copyright.enter()
78819                     .append('span')
78820                     .attr('class', 'copyright-notice')
78821                     .merge(copyright);
78822
78823                 copyright
78824                     .text(String);
78825             }
78826
78827
78828             function update() {
78829                 attribution([context.background().baseLayerSource()], 'base-layer-attribution');
78830                 attribution(context.background().overlayLayerSources().filter(function (s) {
78831                     return s.validZoom(context.map().zoom());
78832                 }), 'overlay-layer-attribution');
78833             }
78834
78835
78836             return function(select) {
78837                 selection = select;
78838
78839                 context.background()
78840                     .on('change.attribution', update);
78841
78842                 context.map()
78843                     .on('move.attribution', throttle(update, 400, {leading: false}));
78844
78845                 update();
78846             };
78847         }
78848
78849         function uiBackgroundDisplayOptions(context) {
78850             var detected = utilDetect();
78851             var storedOpacity = context.storage('background-opacity');
78852             var minVal = 0.25;
78853             var maxVal = detected.cssfilters ? 2 : 1;
78854
78855             var sliders = detected.cssfilters
78856                 ? ['brightness', 'contrast', 'saturation', 'sharpness']
78857                 : ['brightness'];
78858
78859             var _options = {
78860                 brightness: (storedOpacity !== null ? (+storedOpacity) : 1),
78861                 contrast: 1,
78862                 saturation: 1,
78863                 sharpness: 1
78864             };
78865
78866             var _selection = d3_select(null);
78867
78868
78869             function clamp(x, min, max) {
78870                 return Math.max(min, Math.min(x, max));
78871             }
78872
78873
78874             function updateValue(d, val) {
78875                 if (!val && event && event.target) {
78876                     val = event.target.value;
78877                 }
78878
78879                 val = clamp(val, minVal, maxVal);
78880
78881                 _options[d] = val;
78882                 context.background()[d](val);
78883
78884                 if (d === 'brightness') {
78885                     context.storage('background-opacity', val);
78886                 }
78887
78888                 _selection
78889                     .call(render);
78890             }
78891
78892
78893             function render(selection) {
78894                 var container = selection.selectAll('.display-options-container')
78895                     .data([0]);
78896
78897                 var containerEnter = container.enter()
78898                     .append('div')
78899                     .attr('class', 'display-options-container controls-list');
78900
78901                 // add slider controls
78902                 var slidersEnter = containerEnter.selectAll('.display-control')
78903                     .data(sliders)
78904                     .enter()
78905                     .append('div')
78906                     .attr('class', function(d) { return 'display-control display-control-' + d; });
78907
78908                 slidersEnter
78909                     .append('h5')
78910                     .text(function(d) { return t('background.' + d); })
78911                     .append('span')
78912                     .attr('class', function(d) { return 'display-option-value display-option-value-' + d; });
78913
78914                 slidersEnter
78915                     .append('input')
78916                     .attr('class', function(d) { return 'display-option-input display-option-input-' + d; })
78917                     .attr('type', 'range')
78918                     .attr('min', minVal)
78919                     .attr('max', maxVal)
78920                     .attr('step', '0.05')
78921                     .on('input', function(d) {
78922                         var val = d3_select(this).property('value');
78923                         updateValue(d, val);
78924                     });
78925
78926                 slidersEnter
78927                     .append('button')
78928                     .attr('title', t('background.reset'))
78929                     .attr('class', function(d) { return 'display-option-reset display-option-reset-' + d; })
78930                     .on('click', function(d) {
78931                         if (event.button !== 0) return;
78932                         updateValue(d, 1);
78933                     })
78934                     .call(svgIcon('#iD-icon-' + (textDirection === 'rtl' ? 'redo' : 'undo')));
78935
78936                 // reset all button
78937                 containerEnter
78938                     .append('a')
78939                     .attr('class', 'display-option-resetlink')
78940                     .attr('href', '#')
78941                     .text(t('background.reset_all'))
78942                     .on('click', function() {
78943                         for (var i = 0; i < sliders.length; i++) {
78944                             updateValue(sliders[i],1);
78945                         }
78946                     });
78947
78948                 // update
78949                 container = containerEnter
78950                     .merge(container);
78951
78952                 container.selectAll('.display-option-input')
78953                     .property('value', function(d) { return _options[d]; });
78954
78955                 container.selectAll('.display-option-value')
78956                     .text(function(d) { return Math.floor(_options[d] * 100) + '%'; });
78957
78958                 container.selectAll('.display-option-reset')
78959                     .classed('disabled', function(d) { return _options[d] === 1; });
78960
78961                 // first time only, set brightness if needed
78962                 if (containerEnter.size() && _options.brightness !== 1) {
78963                     context.background().brightness(_options.brightness);
78964                 }
78965             }
78966
78967
78968             function backgroundDisplayOptions(selection) {
78969                 _selection = selection;
78970
78971                 selection
78972                     .call(uiDisclosure(context, 'background_display_options', true)
78973                         .title(t('background.display_options'))
78974                         .content(render)
78975                     );
78976             }
78977
78978
78979             return backgroundDisplayOptions;
78980         }
78981
78982         function uiBackgroundOffset(context) {
78983             var directions = [
78984                 ['right', [0.5, 0]],
78985                 ['top', [0, -0.5]],
78986                 ['left', [-0.5, 0]],
78987                 ['bottom', [0, 0.5]]
78988             ];
78989
78990
78991             function d3_eventCancel() {
78992                 event.stopPropagation();
78993                 event.preventDefault();
78994             }
78995
78996
78997             function updateValue() {
78998                 var meters = geoOffsetToMeters(context.background().offset());
78999                 var x = +meters[0].toFixed(2);
79000                 var y = +meters[1].toFixed(2);
79001
79002                 d3_selectAll('.nudge-inner-rect')
79003                     .select('input')
79004                     .classed('error', false)
79005                     .property('value', x + ', ' + y);
79006
79007                 d3_selectAll('.nudge-reset')
79008                     .classed('disabled', function() {
79009                         return (x === 0 && y === 0);
79010                     });
79011             }
79012
79013
79014             function resetOffset() {
79015                 context.background().offset([0, 0]);
79016                 updateValue();
79017             }
79018
79019
79020             function nudge(d) {
79021                 context.background().nudge(d, context.map().zoom());
79022                 updateValue();
79023             }
79024
79025
79026             function clickNudgeButton(d) {
79027                 var interval;
79028                 var timeout = window.setTimeout(function() {
79029                         interval = window.setInterval(nudge.bind(null, d), 100);
79030                     }, 500);
79031
79032                 function doneNudge() {
79033                     window.clearTimeout(timeout);
79034                     window.clearInterval(interval);
79035                     d3_select(window)
79036                         .on('mouseup.buttonoffset', null, true)
79037                         .on('mousedown.buttonoffset', null, true);
79038                 }
79039
79040                 d3_select(window)
79041                     .on('mouseup.buttonoffset', doneNudge, true)
79042                     .on('mousedown.buttonoffset', doneNudge, true);
79043
79044                 nudge(d);
79045             }
79046
79047
79048             function inputOffset() {
79049                 var input = d3_select(this);
79050                 var d = input.node().value;
79051
79052                 if (d === '') return resetOffset();
79053
79054                 d = d.replace(/;/g, ',').split(',').map(function(n) {
79055                     // if n is NaN, it will always get mapped to false.
79056                     return !isNaN(n) && n;
79057                 });
79058
79059                 if (d.length !== 2 || !d[0] || !d[1]) {
79060                     input.classed('error', true);
79061                     return;
79062                 }
79063
79064                 context.background().offset(geoMetersToOffset(d));
79065                 updateValue();
79066             }
79067
79068
79069             function dragOffset() {
79070                 event.preventDefault();
79071                 if (event.button !== 0) return;
79072
79073                 var origin = [event.clientX, event.clientY];
79074
79075                 context.container()
79076                     .append('div')
79077                     .attr('class', 'nudge-surface');
79078
79079                 d3_select(window)
79080                     .on('mousemove.offset', function() {
79081                         var latest = [event.clientX, event.clientY];
79082                         var d = [
79083                             -(origin[0] - latest[0]) / 4,
79084                             -(origin[1] - latest[1]) / 4
79085                         ];
79086
79087                         origin = latest;
79088                         nudge(d);
79089                     })
79090                     .on('mouseup.offset', function() {
79091                         if (event.button !== 0) return;
79092                         d3_selectAll('.nudge-surface')
79093                             .remove();
79094
79095                         d3_select(window)
79096                             .on('mousemove.offset', null)
79097                             .on('mouseup.offset', null);
79098                     });
79099             }
79100
79101
79102             function render(selection) {
79103                 var container = selection.selectAll('.nudge-container')
79104                     .data([0]);
79105
79106                 var containerEnter = container.enter()
79107                     .append('div')
79108                     .attr('class', 'nudge-container cf');
79109
79110                 containerEnter
79111                     .append('div')
79112                     .attr('class', 'nudge-instructions')
79113                     .text(t('background.offset'));
79114
79115                 var nudgeEnter = containerEnter
79116                     .append('div')
79117                     .attr('class', 'nudge-outer-rect')
79118                     .on('mousedown', dragOffset);
79119
79120                 nudgeEnter
79121                     .append('div')
79122                     .attr('class', 'nudge-inner-rect')
79123                     .append('input')
79124                     .on('change', inputOffset);
79125
79126                 containerEnter
79127                     .append('div')
79128                     .selectAll('button')
79129                     .data(directions).enter()
79130                     .append('button')
79131                     .attr('class', function(d) { return d[0] + ' nudge'; })
79132                     .on('contextmenu', d3_eventCancel)
79133                     .on('mousedown', function(d) {
79134                         if (event.button !== 0) return;
79135                         clickNudgeButton(d[1]);
79136                     });
79137
79138                 containerEnter
79139                     .append('button')
79140                     .attr('title', t('background.reset'))
79141                     .attr('class', 'nudge-reset disabled')
79142                     .on('contextmenu', d3_eventCancel)
79143                     .on('click', function() {
79144                         if (event.button !== 0) return;
79145                         resetOffset();
79146                     })
79147                     .call(svgIcon('#iD-icon-' + (textDirection === 'rtl' ? 'redo' : 'undo')));
79148
79149                 updateValue();
79150             }
79151
79152
79153             function backgroundOffset(selection) {
79154                 selection
79155                     .call(uiDisclosure(context, 'background_offset', false)
79156                         .title(t('background.fix_misalignment'))
79157                         .content(render)
79158                     );
79159             }
79160
79161
79162             context.background()
79163                 .on('change.backgroundOffset-update', updateValue);
79164
79165             return backgroundOffset;
79166         }
79167
79168         // import { utilGetDimensions } from '../util/dimensions';
79169
79170
79171         function uiMapInMap(context) {
79172
79173             function mapInMap(selection) {
79174                 var backgroundLayer = rendererTileLayer(context);
79175                 var overlayLayers = {};
79176                 var projection = geoRawMercator();
79177                 var dataLayer = svgData(projection, context).showLabels(false);
79178                 var debugLayer = svgDebug(projection, context);
79179                 var zoom = d3_zoom()
79180                     .scaleExtent([geoZoomToScale(0.5), geoZoomToScale(24)])
79181                     .on('start', zoomStarted)
79182                     .on('zoom', zoomed)
79183                     .on('end', zoomEnded);
79184
79185                 var wrap = d3_select(null);
79186                 var tiles = d3_select(null);
79187                 var viewport = d3_select(null);
79188
79189                 var _isTransformed = false;
79190                 var _isHidden = true;
79191                 var _skipEvents = false;
79192                 var _gesture = null;
79193                 var _zDiff = 6;    // by default, minimap renders at (main zoom - 6)
79194                 var _dMini;        // dimensions of minimap
79195                 var _cMini;        // center pixel of minimap
79196                 var _tStart;       // transform at start of gesture
79197                 var _tCurr;        // transform at most recent event
79198                 var _timeoutID;
79199
79200
79201                 function zoomStarted() {
79202                     if (_skipEvents) return;
79203                     _tStart = _tCurr = projection.transform();
79204                     _gesture = null;
79205                 }
79206
79207
79208                 function zoomed() {
79209                     if (_skipEvents) return;
79210
79211                     var x = event.transform.x;
79212                     var y = event.transform.y;
79213                     var k = event.transform.k;
79214                     var isZooming = (k !== _tStart.k);
79215                     var isPanning = (x !== _tStart.x || y !== _tStart.y);
79216
79217                     if (!isZooming && !isPanning) {
79218                         return;  // no change
79219                     }
79220
79221                     // lock in either zooming or panning, don't allow both in minimap.
79222                     if (!_gesture) {
79223                         _gesture = isZooming ? 'zoom' : 'pan';
79224                     }
79225
79226                     var tMini = projection.transform();
79227                     var tX, tY, scale;
79228
79229                     if (_gesture === 'zoom') {
79230                         scale = k / tMini.k;
79231                         tX = (_cMini[0] / scale - _cMini[0]) * scale;
79232                         tY = (_cMini[1] / scale - _cMini[1]) * scale;
79233                     } else {
79234                         k = tMini.k;
79235                         scale = 1;
79236                         tX = x - tMini.x;
79237                         tY = y - tMini.y;
79238                     }
79239
79240                     utilSetTransform(tiles, tX, tY, scale);
79241                     utilSetTransform(viewport, 0, 0, scale);
79242                     _isTransformed = true;
79243                     _tCurr = identity$8.translate(x, y).scale(k);
79244
79245                     var zMain = geoScaleToZoom(context.projection.scale());
79246                     var zMini = geoScaleToZoom(k);
79247
79248                     _zDiff = zMain - zMini;
79249
79250                     queueRedraw();
79251                 }
79252
79253
79254                 function zoomEnded() {
79255                     if (_skipEvents) return;
79256                     if (_gesture !== 'pan') return;
79257
79258                     updateProjection();
79259                     _gesture = null;
79260                     context.map().center(projection.invert(_cMini));   // recenter main map..
79261                 }
79262
79263
79264                 function updateProjection() {
79265                     var loc = context.map().center();
79266                     var tMain = context.projection.transform();
79267                     var zMain = geoScaleToZoom(tMain.k);
79268                     var zMini = Math.max(zMain - _zDiff, 0.5);
79269                     var kMini = geoZoomToScale(zMini);
79270
79271                     projection
79272                         .translate([tMain.x, tMain.y])
79273                         .scale(kMini);
79274
79275                     var point = projection(loc);
79276                     var mouse = (_gesture === 'pan') ? geoVecSubtract([_tCurr.x, _tCurr.y], [_tStart.x, _tStart.y]) : [0, 0];
79277                     var xMini = _cMini[0] - point[0] + tMain.x + mouse[0];
79278                     var yMini = _cMini[1] - point[1] + tMain.y + mouse[1];
79279
79280                     projection
79281                         .translate([xMini, yMini])
79282                         .clipExtent([[0, 0], _dMini]);
79283
79284                     _tCurr = projection.transform();
79285
79286                     if (_isTransformed) {
79287                         utilSetTransform(tiles, 0, 0);
79288                         utilSetTransform(viewport, 0, 0);
79289                         _isTransformed = false;
79290                     }
79291
79292                     zoom
79293                         .scaleExtent([geoZoomToScale(0.5), geoZoomToScale(zMain - 3)]);
79294
79295                     _skipEvents = true;
79296                     wrap.call(zoom.transform, _tCurr);
79297                     _skipEvents = false;
79298                 }
79299
79300
79301                 function redraw() {
79302                     clearTimeout(_timeoutID);
79303                     if (_isHidden) return;
79304
79305                     updateProjection();
79306                     var zMini = geoScaleToZoom(projection.scale());
79307
79308                     // setup tile container
79309                     tiles = wrap
79310                         .selectAll('.map-in-map-tiles')
79311                         .data([0]);
79312
79313                     tiles = tiles.enter()
79314                         .append('div')
79315                         .attr('class', 'map-in-map-tiles')
79316                         .merge(tiles);
79317
79318                     // redraw background
79319                     backgroundLayer
79320                         .source(context.background().baseLayerSource())
79321                         .projection(projection)
79322                         .dimensions(_dMini);
79323
79324                     var background = tiles
79325                         .selectAll('.map-in-map-background')
79326                         .data([0]);
79327
79328                     background.enter()
79329                         .append('div')
79330                         .attr('class', 'map-in-map-background')
79331                         .merge(background)
79332                         .call(backgroundLayer);
79333
79334
79335                     // redraw overlay
79336                     var overlaySources = context.background().overlayLayerSources();
79337                     var activeOverlayLayers = [];
79338                     for (var i = 0; i < overlaySources.length; i++) {
79339                         if (overlaySources[i].validZoom(zMini)) {
79340                             if (!overlayLayers[i]) overlayLayers[i] = rendererTileLayer(context);
79341                             activeOverlayLayers.push(overlayLayers[i]
79342                                 .source(overlaySources[i])
79343                                 .projection(projection)
79344                                 .dimensions(_dMini));
79345                         }
79346                     }
79347
79348                     var overlay = tiles
79349                         .selectAll('.map-in-map-overlay')
79350                         .data([0]);
79351
79352                     overlay = overlay.enter()
79353                         .append('div')
79354                         .attr('class', 'map-in-map-overlay')
79355                         .merge(overlay);
79356
79357
79358                     var overlays = overlay
79359                         .selectAll('div')
79360                         .data(activeOverlayLayers, function(d) { return d.source().name(); });
79361
79362                     overlays.exit()
79363                         .remove();
79364
79365                     overlays = overlays.enter()
79366                         .append('div')
79367                         .merge(overlays)
79368                         .each(function(layer) { d3_select(this).call(layer); });
79369
79370
79371                     var dataLayers = tiles
79372                         .selectAll('.map-in-map-data')
79373                         .data([0]);
79374
79375                     dataLayers.exit()
79376                         .remove();
79377
79378                     dataLayers = dataLayers.enter()
79379                         .append('svg')
79380                         .attr('class', 'map-in-map-data')
79381                         .merge(dataLayers)
79382                         .call(dataLayer)
79383                         .call(debugLayer);
79384
79385
79386                     // redraw viewport bounding box
79387                     if (_gesture !== 'pan') {
79388                         var getPath = d3_geoPath(projection);
79389                         var bbox = { type: 'Polygon', coordinates: [context.map().extent().polygon()] };
79390
79391                         viewport = wrap.selectAll('.map-in-map-viewport')
79392                             .data([0]);
79393
79394                         viewport = viewport.enter()
79395                             .append('svg')
79396                             .attr('class', 'map-in-map-viewport')
79397                             .merge(viewport);
79398
79399
79400                         var path = viewport.selectAll('.map-in-map-bbox')
79401                             .data([bbox]);
79402
79403                         path.enter()
79404                             .append('path')
79405                             .attr('class', 'map-in-map-bbox')
79406                             .merge(path)
79407                             .attr('d', getPath)
79408                             .classed('thick', function(d) { return getPath.area(d) < 30; });
79409                     }
79410                 }
79411
79412
79413                 function queueRedraw() {
79414                     clearTimeout(_timeoutID);
79415                     _timeoutID = setTimeout(function() { redraw(); }, 750);
79416                 }
79417
79418
79419                 function toggle() {
79420                     if (event) event.preventDefault();
79421
79422                     _isHidden = !_isHidden;
79423
79424                     d3_select('.minimap-toggle-item')
79425                         .classed('active', !_isHidden)
79426                         .select('input')
79427                         .property('checked', !_isHidden);
79428
79429                     if (_isHidden) {
79430                         wrap
79431                             .style('display', 'block')
79432                             .style('opacity', '1')
79433                             .transition()
79434                             .duration(200)
79435                             .style('opacity', '0')
79436                             .on('end', function() {
79437                                 selection.selectAll('.map-in-map')
79438                                     .style('display', 'none');
79439                             });
79440                     } else {
79441                         wrap
79442                             .style('display', 'block')
79443                             .style('opacity', '0')
79444                             .transition()
79445                             .duration(200)
79446                             .style('opacity', '1')
79447                             .on('end', function() {
79448                                 redraw();
79449                             });
79450                     }
79451                 }
79452
79453
79454                 uiMapInMap.toggle = toggle;
79455
79456                 wrap = selection.selectAll('.map-in-map')
79457                     .data([0]);
79458
79459                 wrap = wrap.enter()
79460                     .append('div')
79461                     .attr('class', 'map-in-map')
79462                     .style('display', (_isHidden ? 'none' : 'block'))
79463                     .call(zoom)
79464                     .on('dblclick.zoom', null)
79465                     .merge(wrap);
79466
79467                 // reflow warning: Hardcode dimensions - currently can't resize it anyway..
79468                 _dMini = [200,150]; //utilGetDimensions(wrap);
79469                 _cMini = geoVecScale(_dMini, 0.5);
79470
79471                 context.map()
79472                     .on('drawn.map-in-map', function(drawn) {
79473                         if (drawn.full === true) {
79474                             redraw();
79475                         }
79476                     });
79477
79478                 redraw();
79479
79480                 context.keybinding()
79481                     .on(t('background.minimap.key'), toggle);
79482             }
79483
79484             return mapInMap;
79485         }
79486
79487         function uiConfirm(selection) {
79488             var modalSelection = uiModal(selection);
79489
79490             modalSelection.select('.modal')
79491                 .classed('modal-alert', true);
79492
79493             var section = modalSelection.select('.content');
79494
79495             section.append('div')
79496                 .attr('class', 'modal-section header');
79497
79498             section.append('div')
79499                 .attr('class', 'modal-section message-text');
79500
79501             var buttons = section.append('div')
79502                 .attr('class', 'modal-section buttons cf');
79503
79504
79505             modalSelection.okButton = function() {
79506                 buttons
79507                     .append('button')
79508                     .attr('class', 'button ok-button action')
79509                     .on('click.confirm', function() {
79510                         modalSelection.remove();
79511                     })
79512                     .text(t('confirm.okay'))
79513                     .node()
79514                     .focus();
79515
79516                 return modalSelection;
79517             };
79518
79519
79520             return modalSelection;
79521         }
79522
79523         function uiSettingsCustomBackground(context) {
79524             var dispatch$1 = dispatch('change');
79525
79526             function render(selection) {
79527                 // keep separate copies of original and current settings
79528                 var _origSettings = {
79529                     template: context.storage('background-custom-template')
79530                 };
79531                 var _currSettings = {
79532                     template: context.storage('background-custom-template')
79533                 };
79534
79535                 var example = 'https://{switch:a,b,c}.tile.openstreetmap.org/{zoom}/{x}/{y}.png';
79536                 var modal = uiConfirm(selection).okButton();
79537
79538                 modal
79539                     .classed('settings-modal settings-custom-background', true);
79540
79541                 modal.select('.modal-section.header')
79542                     .append('h3')
79543                     .text(t('settings.custom_background.header'));
79544
79545
79546                 var textSection = modal.select('.modal-section.message-text');
79547
79548                 textSection
79549                     .append('pre')
79550                     .attr('class', 'instructions-template')
79551                     .text(t('settings.custom_background.instructions', { example: example }));
79552
79553                 textSection
79554                     .append('textarea')
79555                     .attr('class', 'field-template')
79556                     .attr('placeholder', t('settings.custom_background.template.placeholder'))
79557                     .call(utilNoAuto)
79558                     .property('value', _currSettings.template);
79559
79560
79561                 // insert a cancel button
79562                 var buttonSection = modal.select('.modal-section.buttons');
79563
79564                 buttonSection
79565                     .insert('button', '.ok-button')
79566                     .attr('class', 'button cancel-button secondary-action')
79567                     .text(t('confirm.cancel'));
79568
79569
79570                 buttonSection.select('.cancel-button')
79571                     .on('click.cancel', clickCancel);
79572
79573                 buttonSection.select('.ok-button')
79574                     .attr('disabled', isSaveDisabled)
79575                     .on('click.save', clickSave);
79576
79577
79578                 function isSaveDisabled() {
79579                     return null;
79580                 }
79581
79582
79583                 // restore the original template
79584                 function clickCancel() {
79585                     textSection.select('.field-template').property('value', _origSettings.template);
79586                     context.storage('background-custom-template', _origSettings.template);
79587                     this.blur();
79588                     modal.close();
79589                 }
79590
79591                 // accept the current template
79592                 function clickSave() {
79593                     _currSettings.template = textSection.select('.field-template').property('value');
79594                     context.storage('background-custom-template', _currSettings.template);
79595                     this.blur();
79596                     modal.close();
79597                     dispatch$1.call('change', this, _currSettings);
79598                 }
79599             }
79600
79601             return utilRebind(render, dispatch$1, 'on');
79602         }
79603
79604         function uiBackground(context) {
79605             var key = t('background.key');
79606
79607             var _pane = d3_select(null), _toggleButton = d3_select(null);
79608
79609             var _customSource = context.background().findSource('custom');
79610             var _previousBackground = context.background().findSource(context.storage('background-last-used-toggle'));
79611
79612             var _backgroundList = d3_select(null);
79613             var _overlayList = d3_select(null);
79614             var _displayOptionsContainer = d3_select(null);
79615             var _offsetContainer = d3_select(null);
79616
79617             var backgroundDisplayOptions = uiBackgroundDisplayOptions(context);
79618             var backgroundOffset = uiBackgroundOffset(context);
79619
79620             var settingsCustomBackground = uiSettingsCustomBackground(context)
79621                 .on('change', customChanged);
79622
79623
79624             function setTooltips(selection) {
79625                 selection.each(function(d, i, nodes) {
79626                     var item = d3_select(this).select('label');
79627                     var span = item.select('span');
79628                     var placement = (i < nodes.length / 2) ? 'bottom' : 'top';
79629                     var description = d.description();
79630                     var isOverflowing = (span.property('clientWidth') !== span.property('scrollWidth'));
79631
79632                     item.call(tooltip().destroyAny);
79633
79634                     if (d === _previousBackground) {
79635                         item.call(tooltip()
79636                             .placement(placement)
79637                             .html(true)
79638                             .title(function() {
79639                                 var tip = '<div>' + t('background.switch') + '</div>';
79640                                 return uiTooltipHtml(tip, uiCmd('⌘' + key));
79641                             })
79642                         );
79643                     } else if (description || isOverflowing) {
79644                         item.call(tooltip()
79645                             .placement(placement)
79646                             .title(description || d.name())
79647                         );
79648                     }
79649                 });
79650             }
79651
79652
79653             function updateLayerSelections(selection) {
79654                 function active(d) {
79655                     return context.background().showsLayer(d);
79656                 }
79657
79658                 selection.selectAll('li')
79659                     .classed('active', active)
79660                     .classed('switch', function(d) { return d === _previousBackground; })
79661                     .call(setTooltips)
79662                     .selectAll('input')
79663                     .property('checked', active);
79664             }
79665
79666
79667             function chooseBackground(d) {
79668                 if (d.id === 'custom' && !d.template()) {
79669                     return editCustom();
79670                 }
79671
79672                 event.preventDefault();
79673                 _previousBackground = context.background().baseLayerSource();
79674                 context.storage('background-last-used-toggle', _previousBackground.id);
79675                 context.storage('background-last-used', d.id);
79676                 context.background().baseLayerSource(d);
79677                 _backgroundList.call(updateLayerSelections);
79678                 document.activeElement.blur();
79679             }
79680
79681
79682             function customChanged(d) {
79683                 if (d && d.template) {
79684                     _customSource.template(d.template);
79685                     chooseBackground(_customSource);
79686                 } else {
79687                     _customSource.template('');
79688                     chooseBackground(context.background().findSource('none'));
79689                 }
79690             }
79691
79692
79693             function editCustom() {
79694                 event.preventDefault();
79695                 context.container()
79696                     .call(settingsCustomBackground);
79697             }
79698
79699
79700             function chooseOverlay(d) {
79701                 event.preventDefault();
79702                 context.background().toggleOverlayLayer(d);
79703                 _overlayList.call(updateLayerSelections);
79704                 document.activeElement.blur();
79705             }
79706
79707
79708             function drawListItems(layerList, type, change, filter) {
79709                 var sources = context.background()
79710                     .sources(context.map().extent())
79711                     .filter(filter);
79712
79713                 var layerLinks = layerList.selectAll('li')
79714                     .data(sources, function(d) { return d.name(); });
79715
79716                 layerLinks.exit()
79717                     .remove();
79718
79719                 var enter = layerLinks.enter()
79720                     .append('li')
79721                     .classed('layer-custom', function(d) { return d.id === 'custom'; })
79722                     .classed('best', function(d) { return d.best(); });
79723
79724                 enter.filter(function(d) { return d.id === 'custom'; })
79725                     .append('button')
79726                     .attr('class', 'layer-browse')
79727                     .call(tooltip()
79728                         .title(t('settings.custom_background.tooltip'))
79729                         .placement((textDirection === 'rtl') ? 'right' : 'left')
79730                     )
79731                     .on('click', editCustom)
79732                     .call(svgIcon('#iD-icon-more'));
79733
79734                 enter.filter(function(d) { return d.best(); })
79735                     .append('div')
79736                     .attr('class', 'best')
79737                     .call(tooltip()
79738                         .title(t('background.best_imagery'))
79739                         .placement((textDirection === 'rtl') ? 'right' : 'left')
79740                     )
79741                     .append('span')
79742                     .html('&#9733;');
79743
79744                 var label = enter
79745                     .append('label');
79746
79747                 label
79748                     .append('input')
79749                     .attr('type', type)
79750                     .attr('name', 'layers')
79751                     .on('change', change);
79752
79753                 label
79754                     .append('span')
79755                     .text(function(d) { return d.name(); });
79756
79757
79758                 layerList.selectAll('li')
79759                     .sort(sortSources)
79760                     .style('display', layerList.selectAll('li').data().length > 0 ? 'block' : 'none');
79761
79762                 layerList
79763                     .call(updateLayerSelections);
79764
79765
79766                 function sortSources(a, b) {
79767                     return a.best() && !b.best() ? -1
79768                         : b.best() && !a.best() ? 1
79769                         : d3_descending(a.area(), b.area()) || d3_ascending(a.name(), b.name()) || 0;
79770                 }
79771             }
79772
79773
79774             function renderBackgroundList(selection) {
79775
79776                 // the background list
79777                 var container = selection.selectAll('.layer-background-list')
79778                     .data([0]);
79779
79780                 _backgroundList = container.enter()
79781                     .append('ul')
79782                     .attr('class', 'layer-list layer-background-list')
79783                     .attr('dir', 'auto')
79784                     .merge(container);
79785
79786
79787                 // add minimap toggle below list
79788                 var minimapEnter = selection.selectAll('.minimap-toggle-list')
79789                     .data([0])
79790                     .enter()
79791                     .append('ul')
79792                     .attr('class', 'layer-list minimap-toggle-list')
79793                     .append('li')
79794                     .attr('class', 'minimap-toggle-item');
79795
79796                 var minimapLabelEnter = minimapEnter
79797                     .append('label')
79798                     .call(tooltip()
79799                         .html(true)
79800                         .title(uiTooltipHtml(t('background.minimap.tooltip'), t('background.minimap.key')))
79801                         .placement('top')
79802                     );
79803
79804                 minimapLabelEnter
79805                     .append('input')
79806                     .attr('type', 'checkbox')
79807                     .on('change', function() {
79808                         event.preventDefault();
79809                         uiMapInMap.toggle();
79810                     });
79811
79812                 minimapLabelEnter
79813                     .append('span')
79814                     .text(t('background.minimap.description'));
79815
79816
79817                 // "Info / Report a Problem" link
79818                 selection.selectAll('.imagery-faq')
79819                     .data([0])
79820                     .enter()
79821                     .append('div')
79822                     .attr('class', 'imagery-faq')
79823                     .append('a')
79824                     .attr('target', '_blank')
79825                     .attr('tabindex', -1)
79826                     .call(svgIcon('#iD-icon-out-link', 'inline'))
79827                     .attr('href', 'https://github.com/openstreetmap/iD/blob/master/FAQ.md#how-can-i-report-an-issue-with-background-imagery')
79828                     .append('span')
79829                     .text(t('background.imagery_source_faq'));
79830
79831                 updateBackgroundList();
79832             }
79833
79834
79835             function renderOverlayList(selection) {
79836                 var container = selection.selectAll('.layer-overlay-list')
79837                     .data([0]);
79838
79839                 _overlayList = container.enter()
79840                     .append('ul')
79841                     .attr('class', 'layer-list layer-overlay-list')
79842                     .attr('dir', 'auto')
79843                     .merge(container);
79844
79845                 updateOverlayList();
79846             }
79847
79848             function updateBackgroundList() {
79849                 _backgroundList
79850                     .call(drawListItems, 'radio', chooseBackground, function(d) { return !d.isHidden() && !d.overlay; });
79851             }
79852
79853             function updateOverlayList() {
79854                 _overlayList
79855                     .call(drawListItems, 'checkbox', chooseOverlay, function(d) { return !d.isHidden() && d.overlay; });
79856             }
79857
79858
79859             function update() {
79860                 if (!_pane.select('.disclosure-wrap-background_list').classed('hide')) {
79861                     updateBackgroundList();
79862                 }
79863
79864                 if (!_pane.select('.disclosure-wrap-overlay_list').classed('hide')) {
79865                     updateOverlayList();
79866                 }
79867
79868                 _displayOptionsContainer
79869                     .call(backgroundDisplayOptions);
79870
79871                 _offsetContainer
79872                     .call(backgroundOffset);
79873             }
79874
79875
79876             function quickSwitch() {
79877                 if (event) {
79878                     event.stopImmediatePropagation();
79879                     event.preventDefault();
79880                 }
79881                 if (_previousBackground) {
79882                     chooseBackground(_previousBackground);
79883                 }
79884             }
79885
79886             var paneTooltip = tooltip()
79887                 .placement((textDirection === 'rtl') ? 'right' : 'left')
79888                 .html(true)
79889                 .title(uiTooltipHtml(t('background.description'), key));
79890
79891             uiBackground.togglePane = function() {
79892                 if (event) event.preventDefault();
79893                 paneTooltip.hide(_toggleButton);
79894                 context.ui().togglePanes(!_pane.classed('shown') ? _pane : undefined);
79895             };
79896
79897             function hidePane() {
79898                 context.ui().togglePanes();
79899             }
79900
79901             uiBackground.renderToggleButton = function(selection) {
79902
79903                 _toggleButton = selection
79904                     .append('button')
79905                     .attr('tabindex', -1)
79906                     .on('click', uiBackground.togglePane)
79907                     .call(svgIcon('#iD-icon-layers', 'light'))
79908                     .call(paneTooltip);
79909             };
79910
79911             uiBackground.renderPane = function(selection) {
79912
79913                 _pane = selection
79914                     .append('div')
79915                     .attr('class', 'fillL map-pane background-pane hide')
79916                     .attr('pane', 'background');
79917
79918
79919                 var heading = _pane
79920                     .append('div')
79921                     .attr('class', 'pane-heading');
79922
79923                 heading
79924                     .append('h2')
79925                     .text(t('background.title'));
79926
79927                 heading
79928                     .append('button')
79929                     .on('click', hidePane)
79930                     .call(svgIcon('#iD-icon-close'));
79931
79932
79933                 var content = _pane
79934                     .append('div')
79935                     .attr('class', 'pane-content');
79936
79937                 // background list
79938                 content
79939                     .append('div')
79940                     .attr('class', 'background-background-list-container')
79941                     .call(uiDisclosure(context, 'background_list', true)
79942                         .title(t('background.backgrounds'))
79943                         .content(renderBackgroundList)
79944                     );
79945
79946                 // overlay list
79947                 content
79948                     .append('div')
79949                     .attr('class', 'background-overlay-list-container')
79950                     .call(uiDisclosure(context, 'overlay_list', true)
79951                         .title(t('background.overlays'))
79952                         .content(renderOverlayList)
79953                     );
79954
79955                 // display options
79956                 _displayOptionsContainer = content
79957                     .append('div')
79958                     .attr('class', 'background-display-options');
79959
79960                 // offset controls
79961                 _offsetContainer = content
79962                     .append('div')
79963                     .attr('class', 'background-offset');
79964
79965
79966                 // add listeners
79967                 context.map()
79968                     .on('move.background-update',
79969                         debounce(function() { window.requestIdleCallback(update); }, 1000)
79970                     );
79971
79972
79973                 context.background()
79974                     .on('change.background-update', update);
79975
79976
79977                 update();
79978
79979                 context.keybinding()
79980                     .on(key, uiBackground.togglePane)
79981                     .on(uiCmd('⌘' + key), quickSwitch);
79982             };
79983
79984             return uiBackground;
79985         }
79986
79987         function uiContributors(context) {
79988             var osm = context.connection(),
79989                 debouncedUpdate = debounce(function() { update(); }, 1000),
79990                 limit = 4,
79991                 hidden = false,
79992                 wrap = d3_select(null);
79993
79994
79995             function update() {
79996                 if (!osm) return;
79997
79998                 var users = {},
79999                     entities = context.intersects(context.map().extent());
80000
80001                 entities.forEach(function(entity) {
80002                     if (entity && entity.user) users[entity.user] = true;
80003                 });
80004
80005                 var u = Object.keys(users),
80006                     subset = u.slice(0, u.length > limit ? limit - 1 : limit);
80007
80008                 wrap.html('')
80009                     .call(svgIcon('#iD-icon-nearby', 'pre-text light'));
80010
80011                 var userList = d3_select(document.createElement('span'));
80012
80013                 userList.selectAll()
80014                     .data(subset)
80015                     .enter()
80016                     .append('a')
80017                     .attr('class', 'user-link')
80018                     .attr('href', function(d) { return osm.userURL(d); })
80019                     .attr('target', '_blank')
80020                     .attr('tabindex', -1)
80021                     .text(String);
80022
80023                 if (u.length > limit) {
80024                     var count = d3_select(document.createElement('span'));
80025
80026                     count.append('a')
80027                         .attr('target', '_blank')
80028                         .attr('tabindex', -1)
80029                         .attr('href', function() {
80030                             return osm.changesetsURL(context.map().center(), context.map().zoom());
80031                         })
80032                         .text(u.length - limit + 1);
80033
80034                     wrap.append('span')
80035                         .html(t('contributors.truncated_list', { users: userList.html(), count: count.html() }));
80036
80037                 } else {
80038                     wrap.append('span')
80039                         .html(t('contributors.list', { users: userList.html() }));
80040                 }
80041
80042                 if (!u.length) {
80043                     hidden = true;
80044                     wrap
80045                         .transition()
80046                         .style('opacity', 0);
80047
80048                 } else if (hidden) {
80049                     wrap
80050                         .transition()
80051                         .style('opacity', 1);
80052                 }
80053             }
80054
80055
80056             return function(selection) {
80057                 if (!osm) return;
80058                 wrap = selection;
80059                 update();
80060
80061                 osm.on('loaded.contributors', debouncedUpdate);
80062                 context.map().on('move.contributors', debouncedUpdate);
80063             };
80064         }
80065
80066         function uiFeatureInfo(context) {
80067             function update(selection) {
80068                 var features = context.features();
80069                 var stats = features.stats();
80070                 var count = 0;
80071                 var hiddenList = features.hidden().map(function(k) {
80072                     if (stats[k]) {
80073                         count += stats[k];
80074                         return String(stats[k]) + ' ' + t('feature.' + k + '.description');
80075                     }
80076                 }).filter(Boolean);
80077
80078                 selection.html('');
80079
80080                 if (hiddenList.length) {
80081                     var tooltipBehavior = tooltip()
80082                         .placement('top')
80083                         .html(true)
80084                         .title(function() {
80085                             return uiTooltipHtml(hiddenList.join('<br/>'));
80086                         });
80087
80088                     var warning = selection.append('a')
80089                         .attr('href', '#')
80090                         .attr('tabindex', -1)
80091                         .html(t('feature_info.hidden_warning', { count: count }))
80092                         .call(tooltipBehavior)
80093                         .on('click', function() {
80094                             tooltipBehavior.hide(warning);
80095                             // open map data panel?
80096                             event.preventDefault();
80097                         });
80098                 }
80099
80100                 selection
80101                     .classed('hide', !hiddenList.length);
80102             }
80103
80104
80105             return function(selection) {
80106                 update(selection);
80107
80108                 context.features().on('change.feature_info', function() {
80109                     update(selection);
80110                 });
80111             };
80112         }
80113
80114         function uiFullScreen(context) {
80115             var element = context.container().node();
80116             // var button = d3_select(null);
80117
80118
80119             function getFullScreenFn() {
80120                 if (element.requestFullscreen) {
80121                     return element.requestFullscreen;
80122                 } else if (element.msRequestFullscreen) {
80123                     return element.msRequestFullscreen;
80124                 } else if (element.mozRequestFullScreen) {
80125                     return element.mozRequestFullScreen;
80126                 } else if (element.webkitRequestFullscreen) {
80127                     return element.webkitRequestFullscreen;
80128                 }
80129             }
80130
80131
80132             function getExitFullScreenFn() {
80133                 if (document.exitFullscreen) {
80134                     return document.exitFullscreen;
80135                 } else if (document.msExitFullscreen) {
80136                     return document.msExitFullscreen;
80137                 } else if (document.mozCancelFullScreen) {
80138                     return document.mozCancelFullScreen;
80139                 } else if (document.webkitExitFullscreen) {
80140                     return document.webkitExitFullscreen;
80141                 }
80142             }
80143
80144
80145             function isFullScreen() {
80146                 return document.fullscreenElement ||
80147                     document.mozFullScreenElement ||
80148                     document.webkitFullscreenElement ||
80149                     document.msFullscreenElement;
80150             }
80151
80152
80153             function isSupported() {
80154                 return !!getFullScreenFn();
80155             }
80156
80157
80158             function fullScreen() {
80159                 event.preventDefault();
80160                 if (!isFullScreen()) {
80161                     // button.classed('active', true);
80162                     getFullScreenFn().apply(element);
80163                 } else {
80164                     // button.classed('active', false);
80165                     getExitFullScreenFn().apply(document);
80166                 }
80167             }
80168
80169
80170             return function() { // selection) {
80171                 if (!isSupported()) return;
80172
80173                 // button = selection.append('button')
80174                 //     .attr('title', t('full_screen'))
80175                 //     .attr('tabindex', -1)
80176                 //     .on('click', fullScreen)
80177                 //     .call(tooltip);
80178
80179                 // button.append('span')
80180                 //     .attr('class', 'icon full-screen');
80181
80182                 var detected = utilDetect();
80183                 var keys = (detected.os === 'mac' ? [uiCmd('⌃⌘F'), 'f11'] : ['f11']);
80184                 context.keybinding().on(keys, fullScreen);
80185             };
80186         }
80187
80188         function uiGeolocate(context) {
80189             var geoOptions = { enableHighAccuracy: false, timeout: 6000 /* 6sec */ };
80190             var locating = uiLoading(context).message(t('geolocate.locating')).blocking(true);
80191             var layer = context.layers().layer('geolocate');
80192             var _position;
80193             var _extent;
80194             var _timeoutID;
80195
80196
80197             function click() {
80198                 if (context.inIntro()) return;
80199                 context.enter(modeBrowse(context));
80200                 if (!layer.enabled()) {
80201                     if (!_position) {
80202                         context.container().call(locating);
80203                         navigator.geolocation.getCurrentPosition(success, error, geoOptions);
80204                     } else {
80205                         zoomTo();
80206                     }
80207                 } else {
80208                     layer.enabled(null, false);
80209                 }
80210                 // This timeout ensures that we still call finish() even if
80211                 // the user declines to share their location in Firefox
80212                 _timeoutID = setTimeout(finish, 10000 /* 10sec */ );
80213             }
80214
80215             function zoomTo() {
80216                 var map = context.map();
80217                 layer.enabled(_position, true);
80218                 map.centerZoomEase(_extent.center(), Math.min(20, map.extentZoom(_extent)));
80219             }
80220
80221
80222             function success(geolocation) {
80223                 _position = geolocation;
80224                 var coords = _position.coords;
80225                 _extent = geoExtent([coords.longitude, coords.latitude]).padByMeters(coords.accuracy);
80226                 zoomTo();
80227                 finish();
80228             }
80229
80230
80231             function error() {
80232                 finish();
80233             }
80234
80235
80236             function finish() {
80237                 locating.close();  // unblock ui
80238                 if (_timeoutID) { clearTimeout(_timeoutID); }
80239                 _timeoutID = undefined;
80240             }
80241
80242
80243             return function(selection) {
80244                 if (!navigator.geolocation) return;
80245
80246                 selection
80247                     .append('button')
80248                     .attr('tabindex', -1)
80249                     .attr('title', t('geolocate.title'))
80250                     .on('click', click)
80251                     .call(svgIcon('#iD-icon-geolocate', 'light'))
80252                     .call(tooltip()
80253                         .placement((textDirection === 'rtl') ? 'right' : 'left'));
80254             };
80255         }
80256
80257         var marked = createCommonjsModule(function (module, exports) {
80258         (function(root) {
80259
80260         /**
80261          * Block-Level Grammar
80262          */
80263
80264         var block = {
80265           newline: /^\n+/,
80266           code: /^( {4}[^\n]+\n*)+/,
80267           fences: noop,
80268           hr: /^ {0,3}((?:- *){3,}|(?:_ *){3,}|(?:\* *){3,})(?:\n+|$)/,
80269           heading: /^ *(#{1,6}) *([^\n]+?) *(?:#+ *)?(?:\n+|$)/,
80270           nptable: noop,
80271           blockquote: /^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/,
80272           list: /^( {0,3})(bull) [\s\S]+?(?:hr|def|\n{2,}(?! )(?!\1bull )\n*|\s*$)/,
80273           html: '^ {0,3}(?:' // optional indentation
80274             + '<(script|pre|style)[\\s>][\\s\\S]*?(?:</\\1>[^\\n]*\\n+|$)' // (1)
80275             + '|comment[^\\n]*(\\n+|$)' // (2)
80276             + '|<\\?[\\s\\S]*?\\?>\\n*' // (3)
80277             + '|<![A-Z][\\s\\S]*?>\\n*' // (4)
80278             + '|<!\\[CDATA\\[[\\s\\S]*?\\]\\]>\\n*' // (5)
80279             + '|</?(tag)(?: +|\\n|/?>)[\\s\\S]*?(?:\\n{2,}|$)' // (6)
80280             + '|<(?!script|pre|style)([a-z][\\w-]*)(?:attribute)*? */?>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:\\n{2,}|$)' // (7) open tag
80281             + '|</(?!script|pre|style)[a-z][\\w-]*\\s*>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:\\n{2,}|$)' // (7) closing tag
80282             + ')',
80283           def: /^ {0,3}\[(label)\]: *\n? *<?([^\s>]+)>?(?:(?: +\n? *| *\n *)(title))? *(?:\n+|$)/,
80284           table: noop,
80285           lheading: /^([^\n]+)\n *(=|-){2,} *(?:\n+|$)/,
80286           paragraph: /^([^\n]+(?:\n(?!hr|heading|lheading| {0,3}>|<\/?(?:tag)(?: +|\n|\/?>)|<(?:script|pre|style|!--))[^\n]+)*)/,
80287           text: /^[^\n]+/
80288         };
80289
80290         block._label = /(?!\s*\])(?:\\[\[\]]|[^\[\]])+/;
80291         block._title = /(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/;
80292         block.def = edit(block.def)
80293           .replace('label', block._label)
80294           .replace('title', block._title)
80295           .getRegex();
80296
80297         block.bullet = /(?:[*+-]|\d{1,9}\.)/;
80298         block.item = /^( *)(bull) ?[^\n]*(?:\n(?!\1bull ?)[^\n]*)*/;
80299         block.item = edit(block.item, 'gm')
80300           .replace(/bull/g, block.bullet)
80301           .getRegex();
80302
80303         block.list = edit(block.list)
80304           .replace(/bull/g, block.bullet)
80305           .replace('hr', '\\n+(?=\\1?(?:(?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$))')
80306           .replace('def', '\\n+(?=' + block.def.source + ')')
80307           .getRegex();
80308
80309         block._tag = 'address|article|aside|base|basefont|blockquote|body|caption'
80310           + '|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption'
80311           + '|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe'
80312           + '|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option'
80313           + '|p|param|section|source|summary|table|tbody|td|tfoot|th|thead|title|tr'
80314           + '|track|ul';
80315         block._comment = /<!--(?!-?>)[\s\S]*?-->/;
80316         block.html = edit(block.html, 'i')
80317           .replace('comment', block._comment)
80318           .replace('tag', block._tag)
80319           .replace('attribute', / +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/)
80320           .getRegex();
80321
80322         block.paragraph = edit(block.paragraph)
80323           .replace('hr', block.hr)
80324           .replace('heading', block.heading)
80325           .replace('lheading', block.lheading)
80326           .replace('tag', block._tag) // pars can be interrupted by type (6) html blocks
80327           .getRegex();
80328
80329         block.blockquote = edit(block.blockquote)
80330           .replace('paragraph', block.paragraph)
80331           .getRegex();
80332
80333         /**
80334          * Normal Block Grammar
80335          */
80336
80337         block.normal = merge({}, block);
80338
80339         /**
80340          * GFM Block Grammar
80341          */
80342
80343         block.gfm = merge({}, block.normal, {
80344           fences: /^ {0,3}(`{3,}|~{3,})([^`\n]*)\n(?:|([\s\S]*?)\n)(?: {0,3}\1[~`]* *(?:\n+|$)|$)/,
80345           paragraph: /^/,
80346           heading: /^ *(#{1,6}) +([^\n]+?) *#* *(?:\n+|$)/
80347         });
80348
80349         block.gfm.paragraph = edit(block.paragraph)
80350           .replace('(?!', '(?!'
80351             + block.gfm.fences.source.replace('\\1', '\\2') + '|'
80352             + block.list.source.replace('\\1', '\\3') + '|')
80353           .getRegex();
80354
80355         /**
80356          * GFM + Tables Block Grammar
80357          */
80358
80359         block.tables = merge({}, block.gfm, {
80360           nptable: /^ *([^|\n ].*\|.*)\n *([-:]+ *\|[-| :]*)(?:\n((?:.*[^>\n ].*(?:\n|$))*)\n*|$)/,
80361           table: /^ *\|(.+)\n *\|?( *[-:]+[-| :]*)(?:\n((?: *[^>\n ].*(?:\n|$))*)\n*|$)/
80362         });
80363
80364         /**
80365          * Pedantic grammar
80366          */
80367
80368         block.pedantic = merge({}, block.normal, {
80369           html: edit(
80370             '^ *(?:comment *(?:\\n|\\s*$)'
80371             + '|<(tag)[\\s\\S]+?</\\1> *(?:\\n{2,}|\\s*$)' // closed tag
80372             + '|<tag(?:"[^"]*"|\'[^\']*\'|\\s[^\'"/>\\s]*)*?/?> *(?:\\n{2,}|\\s*$))')
80373             .replace('comment', block._comment)
80374             .replace(/tag/g, '(?!(?:'
80375               + 'a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub'
80376               + '|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)'
80377               + '\\b)\\w+(?!:|[^\\w\\s@]*@)\\b')
80378             .getRegex(),
80379           def: /^ *\[([^\]]+)\]: *<?([^\s>]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/
80380         });
80381
80382         /**
80383          * Block Lexer
80384          */
80385
80386         function Lexer(options) {
80387           this.tokens = [];
80388           this.tokens.links = Object.create(null);
80389           this.options = options || marked.defaults;
80390           this.rules = block.normal;
80391
80392           if (this.options.pedantic) {
80393             this.rules = block.pedantic;
80394           } else if (this.options.gfm) {
80395             if (this.options.tables) {
80396               this.rules = block.tables;
80397             } else {
80398               this.rules = block.gfm;
80399             }
80400           }
80401         }
80402
80403         /**
80404          * Expose Block Rules
80405          */
80406
80407         Lexer.rules = block;
80408
80409         /**
80410          * Static Lex Method
80411          */
80412
80413         Lexer.lex = function(src, options) {
80414           var lexer = new Lexer(options);
80415           return lexer.lex(src);
80416         };
80417
80418         /**
80419          * Preprocessing
80420          */
80421
80422         Lexer.prototype.lex = function(src) {
80423           src = src
80424             .replace(/\r\n|\r/g, '\n')
80425             .replace(/\t/g, '    ')
80426             .replace(/\u00a0/g, ' ')
80427             .replace(/\u2424/g, '\n');
80428
80429           return this.token(src, true);
80430         };
80431
80432         /**
80433          * Lexing
80434          */
80435
80436         Lexer.prototype.token = function(src, top) {
80437           src = src.replace(/^ +$/gm, '');
80438           var next,
80439               loose,
80440               cap,
80441               bull,
80442               b,
80443               item,
80444               listStart,
80445               listItems,
80446               t,
80447               space,
80448               i,
80449               tag,
80450               l,
80451               isordered,
80452               istask,
80453               ischecked;
80454
80455           while (src) {
80456             // newline
80457             if (cap = this.rules.newline.exec(src)) {
80458               src = src.substring(cap[0].length);
80459               if (cap[0].length > 1) {
80460                 this.tokens.push({
80461                   type: 'space'
80462                 });
80463               }
80464             }
80465
80466             // code
80467             if (cap = this.rules.code.exec(src)) {
80468               src = src.substring(cap[0].length);
80469               cap = cap[0].replace(/^ {4}/gm, '');
80470               this.tokens.push({
80471                 type: 'code',
80472                 text: !this.options.pedantic
80473                   ? rtrim(cap, '\n')
80474                   : cap
80475               });
80476               continue;
80477             }
80478
80479             // fences (gfm)
80480             if (cap = this.rules.fences.exec(src)) {
80481               src = src.substring(cap[0].length);
80482               this.tokens.push({
80483                 type: 'code',
80484                 lang: cap[2] ? cap[2].trim() : cap[2],
80485                 text: cap[3] || ''
80486               });
80487               continue;
80488             }
80489
80490             // heading
80491             if (cap = this.rules.heading.exec(src)) {
80492               src = src.substring(cap[0].length);
80493               this.tokens.push({
80494                 type: 'heading',
80495                 depth: cap[1].length,
80496                 text: cap[2]
80497               });
80498               continue;
80499             }
80500
80501             // table no leading pipe (gfm)
80502             if (cap = this.rules.nptable.exec(src)) {
80503               item = {
80504                 type: 'table',
80505                 header: splitCells(cap[1].replace(/^ *| *\| *$/g, '')),
80506                 align: cap[2].replace(/^ *|\| *$/g, '').split(/ *\| */),
80507                 cells: cap[3] ? cap[3].replace(/\n$/, '').split('\n') : []
80508               };
80509
80510               if (item.header.length === item.align.length) {
80511                 src = src.substring(cap[0].length);
80512
80513                 for (i = 0; i < item.align.length; i++) {
80514                   if (/^ *-+: *$/.test(item.align[i])) {
80515                     item.align[i] = 'right';
80516                   } else if (/^ *:-+: *$/.test(item.align[i])) {
80517                     item.align[i] = 'center';
80518                   } else if (/^ *:-+ *$/.test(item.align[i])) {
80519                     item.align[i] = 'left';
80520                   } else {
80521                     item.align[i] = null;
80522                   }
80523                 }
80524
80525                 for (i = 0; i < item.cells.length; i++) {
80526                   item.cells[i] = splitCells(item.cells[i], item.header.length);
80527                 }
80528
80529                 this.tokens.push(item);
80530
80531                 continue;
80532               }
80533             }
80534
80535             // hr
80536             if (cap = this.rules.hr.exec(src)) {
80537               src = src.substring(cap[0].length);
80538               this.tokens.push({
80539                 type: 'hr'
80540               });
80541               continue;
80542             }
80543
80544             // blockquote
80545             if (cap = this.rules.blockquote.exec(src)) {
80546               src = src.substring(cap[0].length);
80547
80548               this.tokens.push({
80549                 type: 'blockquote_start'
80550               });
80551
80552               cap = cap[0].replace(/^ *> ?/gm, '');
80553
80554               // Pass `top` to keep the current
80555               // "toplevel" state. This is exactly
80556               // how markdown.pl works.
80557               this.token(cap, top);
80558
80559               this.tokens.push({
80560                 type: 'blockquote_end'
80561               });
80562
80563               continue;
80564             }
80565
80566             // list
80567             if (cap = this.rules.list.exec(src)) {
80568               src = src.substring(cap[0].length);
80569               bull = cap[2];
80570               isordered = bull.length > 1;
80571
80572               listStart = {
80573                 type: 'list_start',
80574                 ordered: isordered,
80575                 start: isordered ? +bull : '',
80576                 loose: false
80577               };
80578
80579               this.tokens.push(listStart);
80580
80581               // Get each top-level item.
80582               cap = cap[0].match(this.rules.item);
80583
80584               listItems = [];
80585               next = false;
80586               l = cap.length;
80587               i = 0;
80588
80589               for (; i < l; i++) {
80590                 item = cap[i];
80591
80592                 // Remove the list item's bullet
80593                 // so it is seen as the next token.
80594                 space = item.length;
80595                 item = item.replace(/^ *([*+-]|\d+\.) */, '');
80596
80597                 // Outdent whatever the
80598                 // list item contains. Hacky.
80599                 if (~item.indexOf('\n ')) {
80600                   space -= item.length;
80601                   item = !this.options.pedantic
80602                     ? item.replace(new RegExp('^ {1,' + space + '}', 'gm'), '')
80603                     : item.replace(/^ {1,4}/gm, '');
80604                 }
80605
80606                 // Determine whether the next list item belongs here.
80607                 // Backpedal if it does not belong in this list.
80608                 if (i !== l - 1) {
80609                   b = block.bullet.exec(cap[i + 1])[0];
80610                   if (bull.length > 1 ? b.length === 1
80611                     : (b.length > 1 || (this.options.smartLists && b !== bull))) {
80612                     src = cap.slice(i + 1).join('\n') + src;
80613                     i = l - 1;
80614                   }
80615                 }
80616
80617                 // Determine whether item is loose or not.
80618                 // Use: /(^|\n)(?! )[^\n]+\n\n(?!\s*$)/
80619                 // for discount behavior.
80620                 loose = next || /\n\n(?!\s*$)/.test(item);
80621                 if (i !== l - 1) {
80622                   next = item.charAt(item.length - 1) === '\n';
80623                   if (!loose) loose = next;
80624                 }
80625
80626                 if (loose) {
80627                   listStart.loose = true;
80628                 }
80629
80630                 // Check for task list items
80631                 istask = /^\[[ xX]\] /.test(item);
80632                 ischecked = undefined;
80633                 if (istask) {
80634                   ischecked = item[1] !== ' ';
80635                   item = item.replace(/^\[[ xX]\] +/, '');
80636                 }
80637
80638                 t = {
80639                   type: 'list_item_start',
80640                   task: istask,
80641                   checked: ischecked,
80642                   loose: loose
80643                 };
80644
80645                 listItems.push(t);
80646                 this.tokens.push(t);
80647
80648                 // Recurse.
80649                 this.token(item, false);
80650
80651                 this.tokens.push({
80652                   type: 'list_item_end'
80653                 });
80654               }
80655
80656               if (listStart.loose) {
80657                 l = listItems.length;
80658                 i = 0;
80659                 for (; i < l; i++) {
80660                   listItems[i].loose = true;
80661                 }
80662               }
80663
80664               this.tokens.push({
80665                 type: 'list_end'
80666               });
80667
80668               continue;
80669             }
80670
80671             // html
80672             if (cap = this.rules.html.exec(src)) {
80673               src = src.substring(cap[0].length);
80674               this.tokens.push({
80675                 type: this.options.sanitize
80676                   ? 'paragraph'
80677                   : 'html',
80678                 pre: !this.options.sanitizer
80679                   && (cap[1] === 'pre' || cap[1] === 'script' || cap[1] === 'style'),
80680                 text: cap[0]
80681               });
80682               continue;
80683             }
80684
80685             // def
80686             if (top && (cap = this.rules.def.exec(src))) {
80687               src = src.substring(cap[0].length);
80688               if (cap[3]) cap[3] = cap[3].substring(1, cap[3].length - 1);
80689               tag = cap[1].toLowerCase().replace(/\s+/g, ' ');
80690               if (!this.tokens.links[tag]) {
80691                 this.tokens.links[tag] = {
80692                   href: cap[2],
80693                   title: cap[3]
80694                 };
80695               }
80696               continue;
80697             }
80698
80699             // table (gfm)
80700             if (cap = this.rules.table.exec(src)) {
80701               item = {
80702                 type: 'table',
80703                 header: splitCells(cap[1].replace(/^ *| *\| *$/g, '')),
80704                 align: cap[2].replace(/^ *|\| *$/g, '').split(/ *\| */),
80705                 cells: cap[3] ? cap[3].replace(/\n$/, '').split('\n') : []
80706               };
80707
80708               if (item.header.length === item.align.length) {
80709                 src = src.substring(cap[0].length);
80710
80711                 for (i = 0; i < item.align.length; i++) {
80712                   if (/^ *-+: *$/.test(item.align[i])) {
80713                     item.align[i] = 'right';
80714                   } else if (/^ *:-+: *$/.test(item.align[i])) {
80715                     item.align[i] = 'center';
80716                   } else if (/^ *:-+ *$/.test(item.align[i])) {
80717                     item.align[i] = 'left';
80718                   } else {
80719                     item.align[i] = null;
80720                   }
80721                 }
80722
80723                 for (i = 0; i < item.cells.length; i++) {
80724                   item.cells[i] = splitCells(
80725                     item.cells[i].replace(/^ *\| *| *\| *$/g, ''),
80726                     item.header.length);
80727                 }
80728
80729                 this.tokens.push(item);
80730
80731                 continue;
80732               }
80733             }
80734
80735             // lheading
80736             if (cap = this.rules.lheading.exec(src)) {
80737               src = src.substring(cap[0].length);
80738               this.tokens.push({
80739                 type: 'heading',
80740                 depth: cap[2] === '=' ? 1 : 2,
80741                 text: cap[1]
80742               });
80743               continue;
80744             }
80745
80746             // top-level paragraph
80747             if (top && (cap = this.rules.paragraph.exec(src))) {
80748               src = src.substring(cap[0].length);
80749               this.tokens.push({
80750                 type: 'paragraph',
80751                 text: cap[1].charAt(cap[1].length - 1) === '\n'
80752                   ? cap[1].slice(0, -1)
80753                   : cap[1]
80754               });
80755               continue;
80756             }
80757
80758             // text
80759             if (cap = this.rules.text.exec(src)) {
80760               // Top-level should never reach here.
80761               src = src.substring(cap[0].length);
80762               this.tokens.push({
80763                 type: 'text',
80764                 text: cap[0]
80765               });
80766               continue;
80767             }
80768
80769             if (src) {
80770               throw new Error('Infinite loop on byte: ' + src.charCodeAt(0));
80771             }
80772           }
80773
80774           return this.tokens;
80775         };
80776
80777         /**
80778          * Inline-Level Grammar
80779          */
80780
80781         var inline = {
80782           escape: /^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/,
80783           autolink: /^<(scheme:[^\s\x00-\x1f<>]*|email)>/,
80784           url: noop,
80785           tag: '^comment'
80786             + '|^</[a-zA-Z][\\w:-]*\\s*>' // self-closing tag
80787             + '|^<[a-zA-Z][\\w-]*(?:attribute)*?\\s*/?>' // open tag
80788             + '|^<\\?[\\s\\S]*?\\?>' // processing instruction, e.g. <?php ?>
80789             + '|^<![a-zA-Z]+\\s[\\s\\S]*?>' // declaration, e.g. <!DOCTYPE html>
80790             + '|^<!\\[CDATA\\[[\\s\\S]*?\\]\\]>', // CDATA section
80791           link: /^!?\[(label)\]\(href(?:\s+(title))?\s*\)/,
80792           reflink: /^!?\[(label)\]\[(?!\s*\])((?:\\[\[\]]?|[^\[\]\\])+)\]/,
80793           nolink: /^!?\[(?!\s*\])((?:\[[^\[\]]*\]|\\[\[\]]|[^\[\]])*)\](?:\[\])?/,
80794           strong: /^__([^\s_])__(?!_)|^\*\*([^\s*])\*\*(?!\*)|^__([^\s][\s\S]*?[^\s])__(?!_)|^\*\*([^\s][\s\S]*?[^\s])\*\*(?!\*)/,
80795           em: /^_([^\s_])_(?!_)|^\*([^\s*"<\[])\*(?!\*)|^_([^\s][\s\S]*?[^\s_])_(?!_|[^\spunctuation])|^_([^\s_][\s\S]*?[^\s])_(?!_|[^\spunctuation])|^\*([^\s"<\[][\s\S]*?[^\s*])\*(?!\*)|^\*([^\s*"<\[][\s\S]*?[^\s])\*(?!\*)/,
80796           code: /^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/,
80797           br: /^( {2,}|\\)\n(?!\s*$)/,
80798           del: noop,
80799           text: /^(`+|[^`])(?:[\s\S]*?(?:(?=[\\<!\[`*]|\b_|$)|[^ ](?= {2,}\n))|(?= {2,}\n))/
80800         };
80801
80802         // list of punctuation marks from common mark spec
80803         // without ` and ] to workaround Rule 17 (inline code blocks/links)
80804         inline._punctuation = '!"#$%&\'()*+,\\-./:;<=>?@\\[^_{|}~';
80805         inline.em = edit(inline.em).replace(/punctuation/g, inline._punctuation).getRegex();
80806
80807         inline._escapes = /\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/g;
80808
80809         inline._scheme = /[a-zA-Z][a-zA-Z0-9+.-]{1,31}/;
80810         inline._email = /[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/;
80811         inline.autolink = edit(inline.autolink)
80812           .replace('scheme', inline._scheme)
80813           .replace('email', inline._email)
80814           .getRegex();
80815
80816         inline._attribute = /\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/;
80817
80818         inline.tag = edit(inline.tag)
80819           .replace('comment', block._comment)
80820           .replace('attribute', inline._attribute)
80821           .getRegex();
80822
80823         inline._label = /(?:\[[^\[\]]*\]|\\[\[\]]?|`[^`]*`|`(?!`)|[^\[\]\\`])*?/;
80824         inline._href = /\s*(<(?:\\[<>]?|[^\s<>\\])*>|[^\s\x00-\x1f]*)/;
80825         inline._title = /"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/;
80826
80827         inline.link = edit(inline.link)
80828           .replace('label', inline._label)
80829           .replace('href', inline._href)
80830           .replace('title', inline._title)
80831           .getRegex();
80832
80833         inline.reflink = edit(inline.reflink)
80834           .replace('label', inline._label)
80835           .getRegex();
80836
80837         /**
80838          * Normal Inline Grammar
80839          */
80840
80841         inline.normal = merge({}, inline);
80842
80843         /**
80844          * Pedantic Inline Grammar
80845          */
80846
80847         inline.pedantic = merge({}, inline.normal, {
80848           strong: /^__(?=\S)([\s\S]*?\S)__(?!_)|^\*\*(?=\S)([\s\S]*?\S)\*\*(?!\*)/,
80849           em: /^_(?=\S)([\s\S]*?\S)_(?!_)|^\*(?=\S)([\s\S]*?\S)\*(?!\*)/,
80850           link: edit(/^!?\[(label)\]\((.*?)\)/)
80851             .replace('label', inline._label)
80852             .getRegex(),
80853           reflink: edit(/^!?\[(label)\]\s*\[([^\]]*)\]/)
80854             .replace('label', inline._label)
80855             .getRegex()
80856         });
80857
80858         /**
80859          * GFM Inline Grammar
80860          */
80861
80862         inline.gfm = merge({}, inline.normal, {
80863           escape: edit(inline.escape).replace('])', '~|])').getRegex(),
80864           _extended_email: /[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/,
80865           url: /^((?:ftp|https?):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/,
80866           _backpedal: /(?:[^?!.,:;*_~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_~)]+(?!$))+/,
80867           del: /^~+(?=\S)([\s\S]*?\S)~+/,
80868           text: /^(`+|[^`])(?:[\s\S]*?(?:(?=[\\<!\[`*~]|\b_|https?:\/\/|ftp:\/\/|www\.|$)|[^ ](?= {2,}\n)|[^a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-](?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@))|(?= {2,}\n|[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@))/
80869         });
80870
80871         inline.gfm.url = edit(inline.gfm.url, 'i')
80872           .replace('email', inline.gfm._extended_email)
80873           .getRegex();
80874         /**
80875          * GFM + Line Breaks Inline Grammar
80876          */
80877
80878         inline.breaks = merge({}, inline.gfm, {
80879           br: edit(inline.br).replace('{2,}', '*').getRegex(),
80880           text: edit(inline.gfm.text).replace(/\{2,\}/g, '*').getRegex()
80881         });
80882
80883         /**
80884          * Inline Lexer & Compiler
80885          */
80886
80887         function InlineLexer(links, options) {
80888           this.options = options || marked.defaults;
80889           this.links = links;
80890           this.rules = inline.normal;
80891           this.renderer = this.options.renderer || new Renderer();
80892           this.renderer.options = this.options;
80893
80894           if (!this.links) {
80895             throw new Error('Tokens array requires a `links` property.');
80896           }
80897
80898           if (this.options.pedantic) {
80899             this.rules = inline.pedantic;
80900           } else if (this.options.gfm) {
80901             if (this.options.breaks) {
80902               this.rules = inline.breaks;
80903             } else {
80904               this.rules = inline.gfm;
80905             }
80906           }
80907         }
80908
80909         /**
80910          * Expose Inline Rules
80911          */
80912
80913         InlineLexer.rules = inline;
80914
80915         /**
80916          * Static Lexing/Compiling Method
80917          */
80918
80919         InlineLexer.output = function(src, links, options) {
80920           var inline = new InlineLexer(links, options);
80921           return inline.output(src);
80922         };
80923
80924         /**
80925          * Lexing/Compiling
80926          */
80927
80928         InlineLexer.prototype.output = function(src) {
80929           var out = '',
80930               link,
80931               text,
80932               href,
80933               title,
80934               cap,
80935               prevCapZero;
80936
80937           while (src) {
80938             // escape
80939             if (cap = this.rules.escape.exec(src)) {
80940               src = src.substring(cap[0].length);
80941               out += escape(cap[1]);
80942               continue;
80943             }
80944
80945             // tag
80946             if (cap = this.rules.tag.exec(src)) {
80947               if (!this.inLink && /^<a /i.test(cap[0])) {
80948                 this.inLink = true;
80949               } else if (this.inLink && /^<\/a>/i.test(cap[0])) {
80950                 this.inLink = false;
80951               }
80952               if (!this.inRawBlock && /^<(pre|code|kbd|script)(\s|>)/i.test(cap[0])) {
80953                 this.inRawBlock = true;
80954               } else if (this.inRawBlock && /^<\/(pre|code|kbd|script)(\s|>)/i.test(cap[0])) {
80955                 this.inRawBlock = false;
80956               }
80957
80958               src = src.substring(cap[0].length);
80959               out += this.options.sanitize
80960                 ? this.options.sanitizer
80961                   ? this.options.sanitizer(cap[0])
80962                   : escape(cap[0])
80963                 : cap[0];
80964               continue;
80965             }
80966
80967             // link
80968             if (cap = this.rules.link.exec(src)) {
80969               var lastParenIndex = findClosingBracket(cap[2], '()');
80970               if (lastParenIndex > -1) {
80971                 var linkLen = cap[0].length - (cap[2].length - lastParenIndex) - (cap[3] || '').length;
80972                 cap[2] = cap[2].substring(0, lastParenIndex);
80973                 cap[0] = cap[0].substring(0, linkLen).trim();
80974                 cap[3] = '';
80975               }
80976               src = src.substring(cap[0].length);
80977               this.inLink = true;
80978               href = cap[2];
80979               if (this.options.pedantic) {
80980                 link = /^([^'"]*[^\s])\s+(['"])(.*)\2/.exec(href);
80981
80982                 if (link) {
80983                   href = link[1];
80984                   title = link[3];
80985                 } else {
80986                   title = '';
80987                 }
80988               } else {
80989                 title = cap[3] ? cap[3].slice(1, -1) : '';
80990               }
80991               href = href.trim().replace(/^<([\s\S]*)>$/, '$1');
80992               out += this.outputLink(cap, {
80993                 href: InlineLexer.escapes(href),
80994                 title: InlineLexer.escapes(title)
80995               });
80996               this.inLink = false;
80997               continue;
80998             }
80999
81000             // reflink, nolink
81001             if ((cap = this.rules.reflink.exec(src))
81002                 || (cap = this.rules.nolink.exec(src))) {
81003               src = src.substring(cap[0].length);
81004               link = (cap[2] || cap[1]).replace(/\s+/g, ' ');
81005               link = this.links[link.toLowerCase()];
81006               if (!link || !link.href) {
81007                 out += cap[0].charAt(0);
81008                 src = cap[0].substring(1) + src;
81009                 continue;
81010               }
81011               this.inLink = true;
81012               out += this.outputLink(cap, link);
81013               this.inLink = false;
81014               continue;
81015             }
81016
81017             // strong
81018             if (cap = this.rules.strong.exec(src)) {
81019               src = src.substring(cap[0].length);
81020               out += this.renderer.strong(this.output(cap[4] || cap[3] || cap[2] || cap[1]));
81021               continue;
81022             }
81023
81024             // em
81025             if (cap = this.rules.em.exec(src)) {
81026               src = src.substring(cap[0].length);
81027               out += this.renderer.em(this.output(cap[6] || cap[5] || cap[4] || cap[3] || cap[2] || cap[1]));
81028               continue;
81029             }
81030
81031             // code
81032             if (cap = this.rules.code.exec(src)) {
81033               src = src.substring(cap[0].length);
81034               out += this.renderer.codespan(escape(cap[2].trim(), true));
81035               continue;
81036             }
81037
81038             // br
81039             if (cap = this.rules.br.exec(src)) {
81040               src = src.substring(cap[0].length);
81041               out += this.renderer.br();
81042               continue;
81043             }
81044
81045             // del (gfm)
81046             if (cap = this.rules.del.exec(src)) {
81047               src = src.substring(cap[0].length);
81048               out += this.renderer.del(this.output(cap[1]));
81049               continue;
81050             }
81051
81052             // autolink
81053             if (cap = this.rules.autolink.exec(src)) {
81054               src = src.substring(cap[0].length);
81055               if (cap[2] === '@') {
81056                 text = escape(this.mangle(cap[1]));
81057                 href = 'mailto:' + text;
81058               } else {
81059                 text = escape(cap[1]);
81060                 href = text;
81061               }
81062               out += this.renderer.link(href, null, text);
81063               continue;
81064             }
81065
81066             // url (gfm)
81067             if (!this.inLink && (cap = this.rules.url.exec(src))) {
81068               if (cap[2] === '@') {
81069                 text = escape(cap[0]);
81070                 href = 'mailto:' + text;
81071               } else {
81072                 // do extended autolink path validation
81073                 do {
81074                   prevCapZero = cap[0];
81075                   cap[0] = this.rules._backpedal.exec(cap[0])[0];
81076                 } while (prevCapZero !== cap[0]);
81077                 text = escape(cap[0]);
81078                 if (cap[1] === 'www.') {
81079                   href = 'http://' + text;
81080                 } else {
81081                   href = text;
81082                 }
81083               }
81084               src = src.substring(cap[0].length);
81085               out += this.renderer.link(href, null, text);
81086               continue;
81087             }
81088
81089             // text
81090             if (cap = this.rules.text.exec(src)) {
81091               src = src.substring(cap[0].length);
81092               if (this.inRawBlock) {
81093                 out += this.renderer.text(cap[0]);
81094               } else {
81095                 out += this.renderer.text(escape(this.smartypants(cap[0])));
81096               }
81097               continue;
81098             }
81099
81100             if (src) {
81101               throw new Error('Infinite loop on byte: ' + src.charCodeAt(0));
81102             }
81103           }
81104
81105           return out;
81106         };
81107
81108         InlineLexer.escapes = function(text) {
81109           return text ? text.replace(InlineLexer.rules._escapes, '$1') : text;
81110         };
81111
81112         /**
81113          * Compile Link
81114          */
81115
81116         InlineLexer.prototype.outputLink = function(cap, link) {
81117           var href = link.href,
81118               title = link.title ? escape(link.title) : null;
81119
81120           return cap[0].charAt(0) !== '!'
81121             ? this.renderer.link(href, title, this.output(cap[1]))
81122             : this.renderer.image(href, title, escape(cap[1]));
81123         };
81124
81125         /**
81126          * Smartypants Transformations
81127          */
81128
81129         InlineLexer.prototype.smartypants = function(text) {
81130           if (!this.options.smartypants) return text;
81131           return text
81132             // em-dashes
81133             .replace(/---/g, '\u2014')
81134             // en-dashes
81135             .replace(/--/g, '\u2013')
81136             // opening singles
81137             .replace(/(^|[-\u2014/(\[{"\s])'/g, '$1\u2018')
81138             // closing singles & apostrophes
81139             .replace(/'/g, '\u2019')
81140             // opening doubles
81141             .replace(/(^|[-\u2014/(\[{\u2018\s])"/g, '$1\u201c')
81142             // closing doubles
81143             .replace(/"/g, '\u201d')
81144             // ellipses
81145             .replace(/\.{3}/g, '\u2026');
81146         };
81147
81148         /**
81149          * Mangle Links
81150          */
81151
81152         InlineLexer.prototype.mangle = function(text) {
81153           if (!this.options.mangle) return text;
81154           var out = '',
81155               l = text.length,
81156               i = 0,
81157               ch;
81158
81159           for (; i < l; i++) {
81160             ch = text.charCodeAt(i);
81161             if (Math.random() > 0.5) {
81162               ch = 'x' + ch.toString(16);
81163             }
81164             out += '&#' + ch + ';';
81165           }
81166
81167           return out;
81168         };
81169
81170         /**
81171          * Renderer
81172          */
81173
81174         function Renderer(options) {
81175           this.options = options || marked.defaults;
81176         }
81177
81178         Renderer.prototype.code = function(code, infostring, escaped) {
81179           var lang = (infostring || '').match(/\S*/)[0];
81180           if (this.options.highlight) {
81181             var out = this.options.highlight(code, lang);
81182             if (out != null && out !== code) {
81183               escaped = true;
81184               code = out;
81185             }
81186           }
81187
81188           if (!lang) {
81189             return '<pre><code>'
81190               + (escaped ? code : escape(code, true))
81191               + '</code></pre>';
81192           }
81193
81194           return '<pre><code class="'
81195             + this.options.langPrefix
81196             + escape(lang, true)
81197             + '">'
81198             + (escaped ? code : escape(code, true))
81199             + '</code></pre>\n';
81200         };
81201
81202         Renderer.prototype.blockquote = function(quote) {
81203           return '<blockquote>\n' + quote + '</blockquote>\n';
81204         };
81205
81206         Renderer.prototype.html = function(html) {
81207           return html;
81208         };
81209
81210         Renderer.prototype.heading = function(text, level, raw, slugger) {
81211           if (this.options.headerIds) {
81212             return '<h'
81213               + level
81214               + ' id="'
81215               + this.options.headerPrefix
81216               + slugger.slug(raw)
81217               + '">'
81218               + text
81219               + '</h'
81220               + level
81221               + '>\n';
81222           }
81223           // ignore IDs
81224           return '<h' + level + '>' + text + '</h' + level + '>\n';
81225         };
81226
81227         Renderer.prototype.hr = function() {
81228           return this.options.xhtml ? '<hr/>\n' : '<hr>\n';
81229         };
81230
81231         Renderer.prototype.list = function(body, ordered, start) {
81232           var type = ordered ? 'ol' : 'ul',
81233               startatt = (ordered && start !== 1) ? (' start="' + start + '"') : '';
81234           return '<' + type + startatt + '>\n' + body + '</' + type + '>\n';
81235         };
81236
81237         Renderer.prototype.listitem = function(text) {
81238           return '<li>' + text + '</li>\n';
81239         };
81240
81241         Renderer.prototype.checkbox = function(checked) {
81242           return '<input '
81243             + (checked ? 'checked="" ' : '')
81244             + 'disabled="" type="checkbox"'
81245             + (this.options.xhtml ? ' /' : '')
81246             + '> ';
81247         };
81248
81249         Renderer.prototype.paragraph = function(text) {
81250           return '<p>' + text + '</p>\n';
81251         };
81252
81253         Renderer.prototype.table = function(header, body) {
81254           if (body) body = '<tbody>' + body + '</tbody>';
81255
81256           return '<table>\n'
81257             + '<thead>\n'
81258             + header
81259             + '</thead>\n'
81260             + body
81261             + '</table>\n';
81262         };
81263
81264         Renderer.prototype.tablerow = function(content) {
81265           return '<tr>\n' + content + '</tr>\n';
81266         };
81267
81268         Renderer.prototype.tablecell = function(content, flags) {
81269           var type = flags.header ? 'th' : 'td';
81270           var tag = flags.align
81271             ? '<' + type + ' align="' + flags.align + '">'
81272             : '<' + type + '>';
81273           return tag + content + '</' + type + '>\n';
81274         };
81275
81276         // span level renderer
81277         Renderer.prototype.strong = function(text) {
81278           return '<strong>' + text + '</strong>';
81279         };
81280
81281         Renderer.prototype.em = function(text) {
81282           return '<em>' + text + '</em>';
81283         };
81284
81285         Renderer.prototype.codespan = function(text) {
81286           return '<code>' + text + '</code>';
81287         };
81288
81289         Renderer.prototype.br = function() {
81290           return this.options.xhtml ? '<br/>' : '<br>';
81291         };
81292
81293         Renderer.prototype.del = function(text) {
81294           return '<del>' + text + '</del>';
81295         };
81296
81297         Renderer.prototype.link = function(href, title, text) {
81298           href = cleanUrl(this.options.sanitize, this.options.baseUrl, href);
81299           if (href === null) {
81300             return text;
81301           }
81302           var out = '<a href="' + escape(href) + '"';
81303           if (title) {
81304             out += ' title="' + title + '"';
81305           }
81306           out += '>' + text + '</a>';
81307           return out;
81308         };
81309
81310         Renderer.prototype.image = function(href, title, text) {
81311           href = cleanUrl(this.options.sanitize, this.options.baseUrl, href);
81312           if (href === null) {
81313             return text;
81314           }
81315
81316           var out = '<img src="' + href + '" alt="' + text + '"';
81317           if (title) {
81318             out += ' title="' + title + '"';
81319           }
81320           out += this.options.xhtml ? '/>' : '>';
81321           return out;
81322         };
81323
81324         Renderer.prototype.text = function(text) {
81325           return text;
81326         };
81327
81328         /**
81329          * TextRenderer
81330          * returns only the textual part of the token
81331          */
81332
81333         function TextRenderer() {}
81334
81335         // no need for block level renderers
81336
81337         TextRenderer.prototype.strong =
81338         TextRenderer.prototype.em =
81339         TextRenderer.prototype.codespan =
81340         TextRenderer.prototype.del =
81341         TextRenderer.prototype.text = function (text) {
81342           return text;
81343         };
81344
81345         TextRenderer.prototype.link =
81346         TextRenderer.prototype.image = function(href, title, text) {
81347           return '' + text;
81348         };
81349
81350         TextRenderer.prototype.br = function() {
81351           return '';
81352         };
81353
81354         /**
81355          * Parsing & Compiling
81356          */
81357
81358         function Parser(options) {
81359           this.tokens = [];
81360           this.token = null;
81361           this.options = options || marked.defaults;
81362           this.options.renderer = this.options.renderer || new Renderer();
81363           this.renderer = this.options.renderer;
81364           this.renderer.options = this.options;
81365           this.slugger = new Slugger();
81366         }
81367
81368         /**
81369          * Static Parse Method
81370          */
81371
81372         Parser.parse = function(src, options) {
81373           var parser = new Parser(options);
81374           return parser.parse(src);
81375         };
81376
81377         /**
81378          * Parse Loop
81379          */
81380
81381         Parser.prototype.parse = function(src) {
81382           this.inline = new InlineLexer(src.links, this.options);
81383           // use an InlineLexer with a TextRenderer to extract pure text
81384           this.inlineText = new InlineLexer(
81385             src.links,
81386             merge({}, this.options, {renderer: new TextRenderer()})
81387           );
81388           this.tokens = src.reverse();
81389
81390           var out = '';
81391           while (this.next()) {
81392             out += this.tok();
81393           }
81394
81395           return out;
81396         };
81397
81398         /**
81399          * Next Token
81400          */
81401
81402         Parser.prototype.next = function() {
81403           return this.token = this.tokens.pop();
81404         };
81405
81406         /**
81407          * Preview Next Token
81408          */
81409
81410         Parser.prototype.peek = function() {
81411           return this.tokens[this.tokens.length - 1] || 0;
81412         };
81413
81414         /**
81415          * Parse Text Tokens
81416          */
81417
81418         Parser.prototype.parseText = function() {
81419           var body = this.token.text;
81420
81421           while (this.peek().type === 'text') {
81422             body += '\n' + this.next().text;
81423           }
81424
81425           return this.inline.output(body);
81426         };
81427
81428         /**
81429          * Parse Current Token
81430          */
81431
81432         Parser.prototype.tok = function() {
81433           switch (this.token.type) {
81434             case 'space': {
81435               return '';
81436             }
81437             case 'hr': {
81438               return this.renderer.hr();
81439             }
81440             case 'heading': {
81441               return this.renderer.heading(
81442                 this.inline.output(this.token.text),
81443                 this.token.depth,
81444                 unescape(this.inlineText.output(this.token.text)),
81445                 this.slugger);
81446             }
81447             case 'code': {
81448               return this.renderer.code(this.token.text,
81449                 this.token.lang,
81450                 this.token.escaped);
81451             }
81452             case 'table': {
81453               var header = '',
81454                   body = '',
81455                   i,
81456                   row,
81457                   cell,
81458                   j;
81459
81460               // header
81461               cell = '';
81462               for (i = 0; i < this.token.header.length; i++) {
81463                 cell += this.renderer.tablecell(
81464                   this.inline.output(this.token.header[i]),
81465                   { header: true, align: this.token.align[i] }
81466                 );
81467               }
81468               header += this.renderer.tablerow(cell);
81469
81470               for (i = 0; i < this.token.cells.length; i++) {
81471                 row = this.token.cells[i];
81472
81473                 cell = '';
81474                 for (j = 0; j < row.length; j++) {
81475                   cell += this.renderer.tablecell(
81476                     this.inline.output(row[j]),
81477                     { header: false, align: this.token.align[j] }
81478                   );
81479                 }
81480
81481                 body += this.renderer.tablerow(cell);
81482               }
81483               return this.renderer.table(header, body);
81484             }
81485             case 'blockquote_start': {
81486               body = '';
81487
81488               while (this.next().type !== 'blockquote_end') {
81489                 body += this.tok();
81490               }
81491
81492               return this.renderer.blockquote(body);
81493             }
81494             case 'list_start': {
81495               body = '';
81496               var ordered = this.token.ordered,
81497                   start = this.token.start;
81498
81499               while (this.next().type !== 'list_end') {
81500                 body += this.tok();
81501               }
81502
81503               return this.renderer.list(body, ordered, start);
81504             }
81505             case 'list_item_start': {
81506               body = '';
81507               var loose = this.token.loose;
81508               var checked = this.token.checked;
81509               var task = this.token.task;
81510
81511               if (this.token.task) {
81512                 body += this.renderer.checkbox(checked);
81513               }
81514
81515               while (this.next().type !== 'list_item_end') {
81516                 body += !loose && this.token.type === 'text'
81517                   ? this.parseText()
81518                   : this.tok();
81519               }
81520               return this.renderer.listitem(body, task, checked);
81521             }
81522             case 'html': {
81523               // TODO parse inline content if parameter markdown=1
81524               return this.renderer.html(this.token.text);
81525             }
81526             case 'paragraph': {
81527               return this.renderer.paragraph(this.inline.output(this.token.text));
81528             }
81529             case 'text': {
81530               return this.renderer.paragraph(this.parseText());
81531             }
81532             default: {
81533               var errMsg = 'Token with "' + this.token.type + '" type was not found.';
81534               if (this.options.silent) {
81535                 console.log(errMsg);
81536               } else {
81537                 throw new Error(errMsg);
81538               }
81539             }
81540           }
81541         };
81542
81543         /**
81544          * Slugger generates header id
81545          */
81546
81547         function Slugger () {
81548           this.seen = {};
81549         }
81550
81551         /**
81552          * Convert string to unique id
81553          */
81554
81555         Slugger.prototype.slug = function (value) {
81556           var slug = value
81557             .toLowerCase()
81558             .trim()
81559             .replace(/[\u2000-\u206F\u2E00-\u2E7F\\'!"#$%&()*+,./:;<=>?@[\]^`{|}~]/g, '')
81560             .replace(/\s/g, '-');
81561
81562           if (this.seen.hasOwnProperty(slug)) {
81563             var originalSlug = slug;
81564             do {
81565               this.seen[originalSlug]++;
81566               slug = originalSlug + '-' + this.seen[originalSlug];
81567             } while (this.seen.hasOwnProperty(slug));
81568           }
81569           this.seen[slug] = 0;
81570
81571           return slug;
81572         };
81573
81574         /**
81575          * Helpers
81576          */
81577
81578         function escape(html, encode) {
81579           if (encode) {
81580             if (escape.escapeTest.test(html)) {
81581               return html.replace(escape.escapeReplace, function (ch) { return escape.replacements[ch]; });
81582             }
81583           } else {
81584             if (escape.escapeTestNoEncode.test(html)) {
81585               return html.replace(escape.escapeReplaceNoEncode, function (ch) { return escape.replacements[ch]; });
81586             }
81587           }
81588
81589           return html;
81590         }
81591
81592         escape.escapeTest = /[&<>"']/;
81593         escape.escapeReplace = /[&<>"']/g;
81594         escape.replacements = {
81595           '&': '&amp;',
81596           '<': '&lt;',
81597           '>': '&gt;',
81598           '"': '&quot;',
81599           "'": '&#39;'
81600         };
81601
81602         escape.escapeTestNoEncode = /[<>"']|&(?!#?\w+;)/;
81603         escape.escapeReplaceNoEncode = /[<>"']|&(?!#?\w+;)/g;
81604
81605         function unescape(html) {
81606           // explicitly match decimal, hex, and named HTML entities
81607           return html.replace(/&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/ig, function(_, n) {
81608             n = n.toLowerCase();
81609             if (n === 'colon') return ':';
81610             if (n.charAt(0) === '#') {
81611               return n.charAt(1) === 'x'
81612                 ? String.fromCharCode(parseInt(n.substring(2), 16))
81613                 : String.fromCharCode(+n.substring(1));
81614             }
81615             return '';
81616           });
81617         }
81618
81619         function edit(regex, opt) {
81620           regex = regex.source || regex;
81621           opt = opt || '';
81622           return {
81623             replace: function(name, val) {
81624               val = val.source || val;
81625               val = val.replace(/(^|[^\[])\^/g, '$1');
81626               regex = regex.replace(name, val);
81627               return this;
81628             },
81629             getRegex: function() {
81630               return new RegExp(regex, opt);
81631             }
81632           };
81633         }
81634
81635         function cleanUrl(sanitize, base, href) {
81636           if (sanitize) {
81637             try {
81638               var prot = decodeURIComponent(unescape(href))
81639                 .replace(/[^\w:]/g, '')
81640                 .toLowerCase();
81641             } catch (e) {
81642               return null;
81643             }
81644             if (prot.indexOf('javascript:') === 0 || prot.indexOf('vbscript:') === 0 || prot.indexOf('data:') === 0) {
81645               return null;
81646             }
81647           }
81648           if (base && !originIndependentUrl.test(href)) {
81649             href = resolveUrl(base, href);
81650           }
81651           try {
81652             href = encodeURI(href).replace(/%25/g, '%');
81653           } catch (e) {
81654             return null;
81655           }
81656           return href;
81657         }
81658
81659         function resolveUrl(base, href) {
81660           if (!baseUrls[' ' + base]) {
81661             // we can ignore everything in base after the last slash of its path component,
81662             // but we might need to add _that_
81663             // https://tools.ietf.org/html/rfc3986#section-3
81664             if (/^[^:]+:\/*[^/]*$/.test(base)) {
81665               baseUrls[' ' + base] = base + '/';
81666             } else {
81667               baseUrls[' ' + base] = rtrim(base, '/', true);
81668             }
81669           }
81670           base = baseUrls[' ' + base];
81671
81672           if (href.slice(0, 2) === '//') {
81673             return base.replace(/:[\s\S]*/, ':') + href;
81674           } else if (href.charAt(0) === '/') {
81675             return base.replace(/(:\/*[^/]*)[\s\S]*/, '$1') + href;
81676           } else {
81677             return base + href;
81678           }
81679         }
81680         var baseUrls = {};
81681         var originIndependentUrl = /^$|^[a-z][a-z0-9+.-]*:|^[?#]/i;
81682
81683         function noop() {}
81684         noop.exec = noop;
81685
81686         function merge(obj) {
81687           var i = 1,
81688               target,
81689               key;
81690
81691           for (; i < arguments.length; i++) {
81692             target = arguments[i];
81693             for (key in target) {
81694               if (Object.prototype.hasOwnProperty.call(target, key)) {
81695                 obj[key] = target[key];
81696               }
81697             }
81698           }
81699
81700           return obj;
81701         }
81702
81703         function splitCells(tableRow, count) {
81704           // ensure that every cell-delimiting pipe has a space
81705           // before it to distinguish it from an escaped pipe
81706           var row = tableRow.replace(/\|/g, function (match, offset, str) {
81707                 var escaped = false,
81708                     curr = offset;
81709                 while (--curr >= 0 && str[curr] === '\\') escaped = !escaped;
81710                 if (escaped) {
81711                   // odd number of slashes means | is escaped
81712                   // so we leave it alone
81713                   return '|';
81714                 } else {
81715                   // add space before unescaped |
81716                   return ' |';
81717                 }
81718               }),
81719               cells = row.split(/ \|/),
81720               i = 0;
81721
81722           if (cells.length > count) {
81723             cells.splice(count);
81724           } else {
81725             while (cells.length < count) cells.push('');
81726           }
81727
81728           for (; i < cells.length; i++) {
81729             // leading or trailing whitespace is ignored per the gfm spec
81730             cells[i] = cells[i].trim().replace(/\\\|/g, '|');
81731           }
81732           return cells;
81733         }
81734
81735         // Remove trailing 'c's. Equivalent to str.replace(/c*$/, '').
81736         // /c*$/ is vulnerable to REDOS.
81737         // invert: Remove suffix of non-c chars instead. Default falsey.
81738         function rtrim(str, c, invert) {
81739           if (str.length === 0) {
81740             return '';
81741           }
81742
81743           // Length of suffix matching the invert condition.
81744           var suffLen = 0;
81745
81746           // Step left until we fail to match the invert condition.
81747           while (suffLen < str.length) {
81748             var currChar = str.charAt(str.length - suffLen - 1);
81749             if (currChar === c && !invert) {
81750               suffLen++;
81751             } else if (currChar !== c && invert) {
81752               suffLen++;
81753             } else {
81754               break;
81755             }
81756           }
81757
81758           return str.substr(0, str.length - suffLen);
81759         }
81760
81761         function findClosingBracket(str, b) {
81762           if (str.indexOf(b[1]) === -1) {
81763             return -1;
81764           }
81765           var level = 0;
81766           for (var i = 0; i < str.length; i++) {
81767             if (str[i] === '\\') {
81768               i++;
81769             } else if (str[i] === b[0]) {
81770               level++;
81771             } else if (str[i] === b[1]) {
81772               level--;
81773               if (level < 0) {
81774                 return i;
81775               }
81776             }
81777           }
81778           return -1;
81779         }
81780
81781         /**
81782          * Marked
81783          */
81784
81785         function marked(src, opt, callback) {
81786           // throw error in case of non string input
81787           if (typeof src === 'undefined' || src === null) {
81788             throw new Error('marked(): input parameter is undefined or null');
81789           }
81790           if (typeof src !== 'string') {
81791             throw new Error('marked(): input parameter is of type '
81792               + Object.prototype.toString.call(src) + ', string expected');
81793           }
81794
81795           if (callback || typeof opt === 'function') {
81796             if (!callback) {
81797               callback = opt;
81798               opt = null;
81799             }
81800
81801             opt = merge({}, marked.defaults, opt || {});
81802
81803             var highlight = opt.highlight,
81804                 tokens,
81805                 pending,
81806                 i = 0;
81807
81808             try {
81809               tokens = Lexer.lex(src, opt);
81810             } catch (e) {
81811               return callback(e);
81812             }
81813
81814             pending = tokens.length;
81815
81816             var done = function(err) {
81817               if (err) {
81818                 opt.highlight = highlight;
81819                 return callback(err);
81820               }
81821
81822               var out;
81823
81824               try {
81825                 out = Parser.parse(tokens, opt);
81826               } catch (e) {
81827                 err = e;
81828               }
81829
81830               opt.highlight = highlight;
81831
81832               return err
81833                 ? callback(err)
81834                 : callback(null, out);
81835             };
81836
81837             if (!highlight || highlight.length < 3) {
81838               return done();
81839             }
81840
81841             delete opt.highlight;
81842
81843             if (!pending) return done();
81844
81845             for (; i < tokens.length; i++) {
81846               (function(token) {
81847                 if (token.type !== 'code') {
81848                   return --pending || done();
81849                 }
81850                 return highlight(token.text, token.lang, function(err, code) {
81851                   if (err) return done(err);
81852                   if (code == null || code === token.text) {
81853                     return --pending || done();
81854                   }
81855                   token.text = code;
81856                   token.escaped = true;
81857                   --pending || done();
81858                 });
81859               })(tokens[i]);
81860             }
81861
81862             return;
81863           }
81864           try {
81865             if (opt) opt = merge({}, marked.defaults, opt);
81866             return Parser.parse(Lexer.lex(src, opt), opt);
81867           } catch (e) {
81868             e.message += '\nPlease report this to https://github.com/markedjs/marked.';
81869             if ((opt || marked.defaults).silent) {
81870               return '<p>An error occurred:</p><pre>'
81871                 + escape(e.message + '', true)
81872                 + '</pre>';
81873             }
81874             throw e;
81875           }
81876         }
81877
81878         /**
81879          * Options
81880          */
81881
81882         marked.options =
81883         marked.setOptions = function(opt) {
81884           merge(marked.defaults, opt);
81885           return marked;
81886         };
81887
81888         marked.getDefaults = function () {
81889           return {
81890             baseUrl: null,
81891             breaks: false,
81892             gfm: true,
81893             headerIds: true,
81894             headerPrefix: '',
81895             highlight: null,
81896             langPrefix: 'language-',
81897             mangle: true,
81898             pedantic: false,
81899             renderer: new Renderer(),
81900             sanitize: false,
81901             sanitizer: null,
81902             silent: false,
81903             smartLists: false,
81904             smartypants: false,
81905             tables: true,
81906             xhtml: false
81907           };
81908         };
81909
81910         marked.defaults = marked.getDefaults();
81911
81912         /**
81913          * Expose
81914          */
81915
81916         marked.Parser = Parser;
81917         marked.parser = Parser.parse;
81918
81919         marked.Renderer = Renderer;
81920         marked.TextRenderer = TextRenderer;
81921
81922         marked.Lexer = Lexer;
81923         marked.lexer = Lexer.lex;
81924
81925         marked.InlineLexer = InlineLexer;
81926         marked.inlineLexer = InlineLexer.output;
81927
81928         marked.Slugger = Slugger;
81929
81930         marked.parse = marked;
81931
81932         {
81933           module.exports = marked;
81934         }
81935         })(commonjsGlobal || (typeof window !== 'undefined' ? window : commonjsGlobal));
81936         });
81937
81938         function pointBox(loc, context) {
81939             var rect = context.surfaceRect();
81940             var point = context.curtainProjection(loc);
81941             return {
81942                 left: point[0] + rect.left - 40,
81943                 top: point[1] + rect.top - 60,
81944                 width: 80,
81945                 height: 90
81946             };
81947         }
81948
81949
81950         function pad$2(locOrBox, padding, context) {
81951             var box;
81952             if (locOrBox instanceof Array) {
81953                 var rect = context.surfaceRect();
81954                 var point = context.curtainProjection(locOrBox);
81955                 box = {
81956                     left: point[0] + rect.left,
81957                     top: point[1] + rect.top
81958                 };
81959             } else {
81960                 box = locOrBox;
81961             }
81962
81963             return {
81964                 left: box.left - padding,
81965                 top: box.top - padding,
81966                 width: (box.width || 0) + 2 * padding,
81967                 height: (box.width || 0) + 2 * padding
81968             };
81969         }
81970
81971
81972         function icon(name, svgklass, useklass) {
81973             return '<svg class="icon ' + (svgklass || '') + '">' +
81974                  '<use xlink:href="' + name + '"' +
81975                  (useklass ? ' class="' + useklass + '"' : '') + '></use></svg>';
81976         }
81977
81978
81979         function slugify(text) {
81980             return text.toString().toLowerCase()
81981                 .replace(/\s+/g, '-')           // Replace spaces with -
81982                 .replace(/[^\w\-]+/g, '')       // Remove all non-word chars
81983                 .replace(/\-\-+/g, '-')         // Replace multiple - with single -
81984                 .replace(/^-+/, '')             // Trim - from start of text
81985                 .replace(/-+$/, '');            // Trim - from end of text
81986         }
81987
81988
81989         // console warning for missing walkthrough names
81990         var missingStrings = {};
81991         function checkKey(key, text) {
81992             if (t(key, { default: undefined}) === undefined) {
81993                 if (missingStrings.hasOwnProperty(key)) return;  // warn once
81994                 missingStrings[key] = text;
81995                 var missing = key + ': ' + text;
81996                 if (typeof console !== 'undefined') console.log(missing); // eslint-disable-line
81997             }
81998         }
81999
82000
82001         function localize(obj) {
82002             var key;
82003
82004             // Assign name if entity has one..
82005             var name = obj.tags && obj.tags.name;
82006             if (name) {
82007                 key = 'intro.graph.name.' + slugify(name);
82008                 obj.tags.name = t(key, { default: name });
82009                 checkKey(key, name);
82010             }
82011
82012             // Assign street name if entity has one..
82013             var street = obj.tags && obj.tags['addr:street'];
82014             if (street) {
82015                 key = 'intro.graph.name.' + slugify(street);
82016                 obj.tags['addr:street'] = t(key, { default: street });
82017                 checkKey(key, street);
82018
82019                 // Add address details common across walkthrough..
82020                 var addrTags = [
82021                     'block_number', 'city', 'county', 'district', 'hamlet', 'neighbourhood',
82022                     'postcode', 'province', 'quarter', 'state', 'subdistrict', 'suburb'
82023                 ];
82024                 addrTags.forEach(function(k) {
82025                     var key = 'intro.graph.' + k;
82026                     var tag = 'addr:' + k;
82027                     var val = obj.tags && obj.tags[tag];
82028                     var str = t(key, { default: val });
82029
82030                     if (str) {
82031                         if (str.match(/^<.*>$/) !== null) {
82032                             delete obj.tags[tag];
82033                         } else {
82034                             obj.tags[tag] = str;
82035                         }
82036                     }
82037                 });
82038             }
82039
82040             return obj;
82041         }
82042
82043
82044         // Used to detect squareness.. some duplicataion of code from actionOrthogonalize.
82045         function isMostlySquare(points) {
82046             // note: uses 15 here instead of the 12 from actionOrthogonalize because
82047             // actionOrthogonalize can actually straighten some larger angles as it iterates
82048             var threshold = 15; // degrees within right or straight
82049             var lowerBound = Math.cos((90 - threshold) * Math.PI / 180);  // near right
82050             var upperBound = Math.cos(threshold * Math.PI / 180);         // near straight
82051
82052             for (var i = 0; i < points.length; i++) {
82053                 var a = points[(i - 1 + points.length) % points.length];
82054                 var origin = points[i];
82055                 var b = points[(i + 1) % points.length];
82056
82057                 var dotp = geoVecNormalizedDot(a, b, origin);
82058                 var mag = Math.abs(dotp);
82059                 if (mag > lowerBound && mag < upperBound) {
82060                     return false;
82061                 }
82062             }
82063
82064             return true;
82065         }
82066
82067
82068         function selectMenuItem(operation) {
82069             var selector = '.edit-menu .edit-menu-item-' + operation +
82070                 ', .radial-menu .radial-menu-item-' + operation;
82071             return d3_select(selector);
82072         }
82073
82074
82075         function transitionTime(point1, point2) {
82076             var distance = geoSphericalDistance(point1, point2);
82077             if (distance === 0)
82078                 return 0;
82079             else if (distance < 80)
82080                 return 500;
82081             else
82082                 return 1000;
82083         }
82084
82085         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",brand:"Sherwin Williams","brand:wikidata":"Q48881","brand:wikipedia":"en:Sherwin-Williams"}},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",brand:"Dollar Tree","brand:wikidata":"Q5289230","brand:wikipedia":"en:Dollar Tree",shop:"variety_store"}},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.634513,41.946181]},n102:{id:"n102",loc:[-85.637357,41.942216]},n1020:{id:"n1020",loc:[-85.634079,41.946194]},n1021:{id:"n1021",loc:[-85.634357,41.945805]},n1022:{id:"n1022",loc:[-85.634389,41.945788]},n1023:{id:"n1023",loc:[-85.634491,41.94581]},n1024:{id:"n1024",loc:[-85.634513,41.945853]},n1025:{id:"n1025",loc:[-85.634506,41.94583]},n1026:{id:"n1026",loc:[-85.634762,41.946056],tags:{crossing:"marked",highway:"crossing"}},n1027:{id:"n1027",loc:[-85.634766,41.946178]},n1028:{id:"n1028",loc:[-85.634622,41.946179],tags:{crossing:"marked",highway:"crossing"}},n1029:{id:"n1029",loc:[-85.640655,41.942057]},n103:{id:"n103",loc:[-85.637386,41.942054]},n1030:{id:"n1030",loc:[-85.640947,41.942057]},n1031:{id:"n1031",loc:[-85.640957,41.942593]},n1032:{id:"n1032",loc:[-85.630953,41.960873]},n1033:{id:"n1033",loc:[-85.632174,41.960679]},n1034:{id:"n1034",loc:[-85.638785,41.943066]},n1035:{id:"n1035",loc:[-85.638853,41.943065]},n1036:{id:"n1036",loc:[-85.638855,41.943183]},n1037:{id:"n1037",loc:[-85.638552,41.943189]},n1038:{id:"n1038",loc:[-85.63855,41.943149]},n1039:{id:"n1039",loc:[-85.638638,41.943068]},n104:{id:"n104",loc:[-85.637387,41.942125]},n1040:{id:"n1040",loc:[-85.638638,41.943078]},n1041:{id:"n1041",loc:[-85.638813,41.943163]},n1042:{id:"n1042",loc:[-85.638684,41.943165]},n1043:{id:"n1043",loc:[-85.638682,41.943105]},n1044:{id:"n1044",loc:[-85.638706,41.943105]},n1045:{id:"n1045",loc:[-85.638707,41.943117]},n1046:{id:"n1046",loc:[-85.638812,41.943115]},n1047:{id:"n1047",loc:[-85.638769,41.943407]},n1048:{id:"n1048",loc:[-85.638549,41.943407]},n1049:{id:"n1049",loc:[-85.638567,41.943555]},n105:{id:"n105",loc:[-85.637319,41.942125]},n1050:{id:"n1050",loc:[-85.638426,41.943554]},n1051:{id:"n1051",loc:[-85.638427,41.94346]},n1052:{id:"n1052",loc:[-85.638568,41.943461]},n1053:{id:"n1053",loc:[-85.639264,41.943415]},n1054:{id:"n1054",loc:[-85.639082,41.943417]},n1055:{id:"n1055",loc:[-85.63908,41.943331]},n1056:{id:"n1056",loc:[-85.639136,41.94333]},n1057:{id:"n1057",loc:[-85.639158,41.943312]},n1058:{id:"n1058",loc:[-85.639188,41.943313]},n1059:{id:"n1059",loc:[-85.639211,41.943331]},n106:{id:"n106",loc:[-85.637319,41.942137]},n1060:{id:"n1060",loc:[-85.639262,41.943331]},n1061:{id:"n1061",loc:[-85.638986,41.943515]},n1062:{id:"n1062",loc:[-85.63888,41.943521]},n1063:{id:"n1063",loc:[-85.638871,41.943436]},n1064:{id:"n1064",loc:[-85.638958,41.943431]},n1065:{id:"n1065",loc:[-85.638979,41.943443]},n1066:{id:"n1066",loc:[-85.63926,41.943703]},n1067:{id:"n1067",loc:[-85.639152,41.943704]},n1068:{id:"n1068",loc:[-85.639152,41.943691]},n1069:{id:"n1069",loc:[-85.639063,41.943691]},n107:{id:"n107",loc:[-85.637259,41.942137]},n1070:{id:"n1070",loc:[-85.639062,41.943613]},n1071:{id:"n1071",loc:[-85.639259,41.943611]},n1072:{id:"n1072",loc:[-85.639117,41.943726]},n1073:{id:"n1073",loc:[-85.639118,41.943767]},n1074:{id:"n1074",loc:[-85.639051,41.943768]},n1075:{id:"n1075",loc:[-85.63905,41.943727]},n1076:{id:"n1076",loc:[-85.638627,41.943716]},n1077:{id:"n1077",loc:[-85.63863,41.943634]},n1078:{id:"n1078",loc:[-85.63844,41.943631]},n1079:{id:"n1079",loc:[-85.638437,41.943729]},n108:{id:"n108",loc:[-85.637259,41.942126]},n1080:{id:"n1080",loc:[-85.638533,41.94373]},n1081:{id:"n1081",loc:[-85.638534,41.943715]},n1082:{id:"n1082",loc:[-85.638678,41.943941]},n1083:{id:"n1083",loc:[-85.638522,41.943944]},n1084:{id:"n1084",loc:[-85.63852,41.943864]},n1085:{id:"n1085",loc:[-85.638676,41.943861]},n1086:{id:"n1086",loc:[-85.638663,41.944059]},n1087:{id:"n1087",loc:[-85.638513,41.944061]},n1088:{id:"n1088",loc:[-85.638511,41.943991]},n1089:{id:"n1089",loc:[-85.638661,41.943989]},n109:{id:"n109",loc:[-85.637193,41.942126]},n1090:{id:"n1090",loc:[-85.63865,41.944134]},n1091:{id:"n1091",loc:[-85.638429,41.944144]},n1092:{id:"n1092",loc:[-85.638426,41.944106]},n1093:{id:"n1093",loc:[-85.638476,41.944104]},n1094:{id:"n1094",loc:[-85.638475,41.94409]},n1095:{id:"n1095",loc:[-85.638594,41.944084]},n1096:{id:"n1096",loc:[-85.638595,41.944101]},n1097:{id:"n1097",loc:[-85.638647,41.944099]},n1098:{id:"n1098",loc:[-85.63829,41.944154]},n1099:{id:"n1099",loc:[-85.638558,41.944155]},n11:{id:"n11",loc:[-85.634602,41.941523]},n110:{id:"n110",loc:[-85.637192,41.942053]},n1100:{id:"n1100",loc:[-85.638558,41.944338]},n1101:{id:"n1101",loc:[-85.638851,41.944408]},n1102:{id:"n1102",loc:[-85.637771,41.943989]},n1103:{id:"n1103",loc:[-85.639345,41.943964]},n1104:{id:"n1104",loc:[-85.638515,41.94397]},n1105:{id:"n1105",loc:[-85.639256,41.943928]},n1106:{id:"n1106",loc:[-85.639157,41.943929]},n1107:{id:"n1107",loc:[-85.639156,41.9439]},n1108:{id:"n1108",loc:[-85.639118,41.9439]},n1109:{id:"n1109",loc:[-85.639116,41.94382]},n111:{id:"n111",loc:[-85.637248,41.942053]},n1110:{id:"n1110",loc:[-85.639202,41.943819]},n1111:{id:"n1111",loc:[-85.639202,41.943837]},n1112:{id:"n1112",loc:[-85.639293,41.943836]},n1113:{id:"n1113",loc:[-85.639295,41.943898]},n1114:{id:"n1114",loc:[-85.639255,41.943898]},n1115:{id:"n1115",loc:[-85.639296,41.944083]},n1116:{id:"n1116",loc:[-85.639144,41.944084]},n1117:{id:"n1117",loc:[-85.639143,41.944026]},n1118:{id:"n1118",loc:[-85.639162,41.944026]},n1119:{id:"n1119",loc:[-85.639162,41.944]},n112:{id:"n112",loc:[-85.637248,41.942042]},n1120:{id:"n1120",loc:[-85.639295,41.943999]},n1121:{id:"n1121",loc:[-85.639131,41.944139]},n1122:{id:"n1122",loc:[-85.63901,41.94414]},n1123:{id:"n1123",loc:[-85.63901,41.944076]},n1124:{id:"n1124",loc:[-85.63913,41.944075]},n1125:{id:"n1125",loc:[-85.639092,41.944155]},n1126:{id:"n1126",loc:[-85.639093,41.944308]},n1127:{id:"n1127",loc:[-85.639225,41.944308]},n1128:{id:"n1128",loc:[-85.639225,41.94429]},n1129:{id:"n1129",loc:[-85.639253,41.944289]},n113:{id:"n113",loc:[-85.637338,41.942041]},n1130:{id:"n1130",loc:[-85.639253,41.944269]},n1131:{id:"n1131",loc:[-85.639243,41.944269]},n1132:{id:"n1132",loc:[-85.639243,41.944229]},n1133:{id:"n1133",loc:[-85.639224,41.944229]},n1134:{id:"n1134",loc:[-85.639224,41.944196]},n1135:{id:"n1135",loc:[-85.639195,41.944196]},n1136:{id:"n1136",loc:[-85.639195,41.944155]},n1137:{id:"n1137",loc:[-85.639072,41.944154]},n1138:{id:"n1138",loc:[-85.638865,41.944154]},n1139:{id:"n1139",loc:[-85.638863,41.943967]},n114:{id:"n114",loc:[-85.637338,41.942055]},n1140:{id:"n1140",loc:[-85.6386,41.942698]},n1141:{id:"n1141",loc:[-85.639348,41.942698]},n1142:{id:"n1142",loc:[-85.639377,41.944984]},n1143:{id:"n1143",loc:[-85.63937,41.945013]},n1144:{id:"n1144",loc:[-85.639357,41.945033]},n1145:{id:"n1145",loc:[-85.639353,41.945053]},n1146:{id:"n1146",loc:[-85.639352,41.945084]},n1147:{id:"n1147",loc:[-85.638278,41.945516]},n1148:{id:"n1148",loc:[-85.637505,41.945801]},n1149:{id:"n1149",loc:[-85.637327,41.945857]},n115:{id:"n115",loc:[-85.637583,41.941943]},n1150:{id:"n1150",loc:[-85.637168,41.945899]},n1151:{id:"n1151",loc:[-85.637017,41.94593]},n1152:{id:"n1152",loc:[-85.637185,41.945938]},n1153:{id:"n1153",loc:[-85.63682,41.945963]},n1154:{id:"n1154",loc:[-85.636639,41.945984]},n1155:{id:"n1155",loc:[-85.636439,41.945999]},n1156:{id:"n1156",loc:[-85.635801,41.945999]},n1157:{id:"n1157",loc:[-85.635769,41.945908]},n1158:{id:"n1158",loc:[-85.635953,41.946154]},n1159:{id:"n1159",loc:[-85.635472,41.94598]},n116:{id:"n116",loc:[-85.637584,41.941983]},n1160:{id:"n1160",loc:[-85.635409,41.945981]},n1161:{id:"n1161",loc:[-85.635583,41.945987]},n1162:{id:"n1162",loc:[-85.636452,41.945805]},n1163:{id:"n1163",loc:[-85.636425,41.94582]},n1164:{id:"n1164",loc:[-85.636396,41.945817]},n1165:{id:"n1165",loc:[-85.636368,41.945797]},n1166:{id:"n1166",loc:[-85.636346,41.945767]},n1167:{id:"n1167",loc:[-85.636307,41.945745]},n1168:{id:"n1168",loc:[-85.636194,41.94565]},n1169:{id:"n1169",loc:[-85.636121,41.945579]},n117:{id:"n117",loc:[-85.63751,41.941983]},n1170:{id:"n1170",loc:[-85.635995,41.945432]},n1171:{id:"n1171",loc:[-85.637564,41.943538]},n1172:{id:"n1172",loc:[-85.63756,41.943505]},n1173:{id:"n1173",loc:[-85.637435,41.943489]},n1174:{id:"n1174",loc:[-85.637093,41.943556]},n1175:{id:"n1175",loc:[-85.634836,41.941574]},n1176:{id:"n1176",loc:[-85.634692,41.9415]},n1177:{id:"n1177",loc:[-85.634261,41.941337]},n1178:{id:"n1178",loc:[-85.634208,41.940962]},n1179:{id:"n1179",loc:[-85.635247,41.940968]},n118:{id:"n118",loc:[-85.637509,41.941944]},n1180:{id:"n1180",loc:[-85.63514,41.941205]},n1181:{id:"n1181",loc:[-85.634858,41.941511]},n1182:{id:"n1182",loc:[-85.630725,41.943465]},n1183:{id:"n1183",loc:[-85.632591,41.942826]},n1184:{id:"n1184",loc:[-85.634487,41.941928]},n1185:{id:"n1185",loc:[-85.634499,41.942056]},n1186:{id:"n1186",loc:[-85.63433,41.943102]},n1187:{id:"n1187",loc:[-85.634158,41.943151]},n1188:{id:"n1188",loc:[-85.634107,41.94305]},n1189:{id:"n1189",loc:[-85.634279,41.943002]},n119:{id:"n119",loc:[-85.637724,41.941973]},n1190:{id:"n1190",loc:[-85.634362,41.943762]},n1191:{id:"n1191",loc:[-85.634331,41.943731]},n1192:{id:"n1192",loc:[-85.634396,41.943695]},n1193:{id:"n1193",loc:[-85.634426,41.943726]},n1194:{id:"n1194",loc:[-85.621569,41.956021]},n1195:{id:"n1195",loc:[-85.621574,41.956164]},n1196:{id:"n1196",loc:[-85.621489,41.956165]},n1197:{id:"n1197",loc:[-85.621488,41.956136]},n1198:{id:"n1198",loc:[-85.621372,41.956139]},n1199:{id:"n1199",loc:[-85.621369,41.956049]},n12:{id:"n12",loc:[-85.63359,41.941093]},n120:{id:"n120",loc:[-85.637633,41.941973]},n1200:{id:"n1200",loc:[-85.621493,41.956047]},n1201:{id:"n1201",loc:[-85.621492,41.956022]},n1202:{id:"n1202",loc:[-85.619744,41.953192]},n1203:{id:"n1203",loc:[-85.619059,41.953902]},n1204:{id:"n1204",loc:[-85.623984,41.95469]},n1205:{id:"n1205",loc:[-85.630159,41.958208]},n1206:{id:"n1206",loc:[-85.63002,41.958208]},n1207:{id:"n1207",loc:[-85.630021,41.95814]},n1208:{id:"n1208",loc:[-85.63,41.95814]},n1209:{id:"n1209",loc:[-85.63,41.958043]},n121:{id:"n121",loc:[-85.637633,41.941853]},n1210:{id:"n1210",loc:[-85.630159,41.958043]},n1211:{id:"n1211",loc:[-85.630304,41.957566]},n1212:{id:"n1212",loc:[-85.630303,41.957684]},n1213:{id:"n1213",loc:[-85.630073,41.957683]},n1214:{id:"n1214",loc:[-85.630072,41.957721]},n1215:{id:"n1215",loc:[-85.629993,41.95772]},n1216:{id:"n1216",loc:[-85.629993,41.95768]},n1217:{id:"n1217",loc:[-85.629968,41.95768]},n1218:{id:"n1218",loc:[-85.629969,41.957588]},n1219:{id:"n1219",loc:[-85.630219,41.95759]},n122:{id:"n122",loc:[-85.637724,41.941853]},n1220:{id:"n1220",loc:[-85.630219,41.957566]},n1221:{id:"n1221",loc:[-85.630717,41.957744]},n1222:{id:"n1222",loc:[-85.630596,41.957745]},n1223:{id:"n1223",loc:[-85.630598,41.957553]},n1224:{id:"n1224",loc:[-85.630717,41.957555]},n1225:{id:"n1225",loc:[-85.630609,41.957745]},n1226:{id:"n1226",loc:[-85.63061,41.957789]},n1227:{id:"n1227",loc:[-85.630327,41.957791]},n1228:{id:"n1228",loc:[-85.630324,41.95752]},n1229:{id:"n1229",loc:[-85.630325,41.95756]},n123:{id:"n123",loc:[-85.637773,41.941988]},n1230:{id:"n1230",loc:[-85.63057,41.95756]},n1231:{id:"n1231",loc:[-85.63069,41.958016]},n1232:{id:"n1232",loc:[-85.630586,41.958017]},n1233:{id:"n1233",loc:[-85.630584,41.957956]},n1234:{id:"n1234",loc:[-85.630614,41.957956]},n1235:{id:"n1235",loc:[-85.630611,41.957835]},n1236:{id:"n1236",loc:[-85.630737,41.957833]},n1237:{id:"n1237",loc:[-85.630739,41.957921]},n1238:{id:"n1238",loc:[-85.630688,41.957922]},n1239:{id:"n1239",loc:[-85.630719,41.958291]},n124:{id:"n124",loc:[-85.637773,41.942046]},n1240:{id:"n1240",loc:[-85.630592,41.958291]},n1241:{id:"n1241",loc:[-85.630593,41.958108]},n1242:{id:"n1242",loc:[-85.630701,41.958109]},n1243:{id:"n1243",loc:[-85.6307,41.958173]},n1244:{id:"n1244",loc:[-85.630711,41.958173]},n1245:{id:"n1245",loc:[-85.630711,41.958233]},n1246:{id:"n1246",loc:[-85.630719,41.958233]},n1247:{id:"n1247",loc:[-85.630523,41.958329]},n1248:{id:"n1248",loc:[-85.630388,41.958329]},n1249:{id:"n1249",loc:[-85.630387,41.958262]},n125:{id:"n125",loc:[-85.637693,41.942047]},n1250:{id:"n1250",loc:[-85.630523,41.958261]},n1251:{id:"n1251",loc:[-85.63072,41.958636]},n1252:{id:"n1252",loc:[-85.630721,41.958709]},n1253:{id:"n1253",loc:[-85.630503,41.958712]},n1254:{id:"n1254",loc:[-85.630498,41.958511]},n1255:{id:"n1255",loc:[-85.630635,41.95851]},n1256:{id:"n1256",loc:[-85.630638,41.958636]},n1257:{id:"n1257",loc:[-85.630437,41.958822]},n1258:{id:"n1258",loc:[-85.630437,41.958849]},n1259:{id:"n1259",loc:[-85.630393,41.958849]},n126:{id:"n126",loc:[-85.637692,41.941988]},n1260:{id:"n1260",loc:[-85.630393,41.958822]},n1261:{id:"n1261",loc:[-85.630605,41.959102]},n1262:{id:"n1262",loc:[-85.63049,41.959104]},n1263:{id:"n1263",loc:[-85.630487,41.958996]},n1264:{id:"n1264",loc:[-85.630462,41.958996]},n1265:{id:"n1265",loc:[-85.63046,41.958922]},n1266:{id:"n1266",loc:[-85.630562,41.958921]},n1267:{id:"n1267",loc:[-85.630564,41.958992]},n1268:{id:"n1268",loc:[-85.630602,41.958992]},n1269:{id:"n1269",loc:[-85.630126,41.957096]},n127:{id:"n127",loc:[-85.637604,41.941994]},n1270:{id:"n1270",loc:[-85.630129,41.957283]},n1271:{id:"n1271",loc:[-85.629993,41.957284]},n1272:{id:"n1272",loc:[-85.629992,41.957216]},n1273:{id:"n1273",loc:[-85.630015,41.957215]},n1274:{id:"n1274",loc:[-85.630013,41.957097]},n1275:{id:"n1275",loc:[-85.630211,41.956592]},n1276:{id:"n1276",loc:[-85.630211,41.956676]},n1277:{id:"n1277",loc:[-85.630162,41.956676]},n1278:{id:"n1278",loc:[-85.630162,41.95676]},n1279:{id:"n1279",loc:[-85.630037,41.956761]},n128:{id:"n128",loc:[-85.637604,41.942057]},n1280:{id:"n1280",loc:[-85.630037,41.956592]},n1281:{id:"n1281",loc:[-85.630309,41.95653]},n1282:{id:"n1282",loc:[-85.630326,41.957065]},n1283:{id:"n1283",loc:[-85.630118,41.957065]},n1284:{id:"n1284",loc:[-85.630119,41.957096]},n1285:{id:"n1285",loc:[-85.63067,41.957307]},n1286:{id:"n1286",loc:[-85.630536,41.957308]},n1287:{id:"n1287",loc:[-85.630533,41.957111]},n1288:{id:"n1288",loc:[-85.630667,41.95711]},n1289:{id:"n1289",loc:[-85.630676,41.956808]},n129:{id:"n129",loc:[-85.63748,41.942057]},n1290:{id:"n1290",loc:[-85.630551,41.956808]},n1291:{id:"n1291",loc:[-85.630552,41.956982]},n1292:{id:"n1292",loc:[-85.63059,41.956982]},n1293:{id:"n1293",loc:[-85.63059,41.957001]},n1294:{id:"n1294",loc:[-85.630692,41.957001]},n1295:{id:"n1295",loc:[-85.630692,41.956936]},n1296:{id:"n1296",loc:[-85.630676,41.956936]},n1297:{id:"n1297",loc:[-85.630496,41.956889]},n1298:{id:"n1298",loc:[-85.630501,41.956947]},n1299:{id:"n1299",loc:[-85.630377,41.956953]},n13:{id:"n13",loc:[-85.633643,41.941143]},n130:{id:"n130",loc:[-85.63748,41.941994]},n1300:{id:"n1300",loc:[-85.630359,41.956938]},n1301:{id:"n1301",loc:[-85.630359,41.956912]},n1302:{id:"n1302",loc:[-85.63038,41.956894]},n1303:{id:"n1303",loc:[-85.630679,41.956747]},n1304:{id:"n1304",loc:[-85.630572,41.956748]},n1305:{id:"n1305",loc:[-85.63057,41.956668]},n1306:{id:"n1306",loc:[-85.630501,41.956669]},n1307:{id:"n1307",loc:[-85.630499,41.95659]},n1308:{id:"n1308",loc:[-85.630565,41.956589]},n1309:{id:"n1309",loc:[-85.630564,41.956541]},n131:{id:"n131",loc:[-85.637431,41.941832]},n1310:{id:"n1310",loc:[-85.630686,41.956539]},n1311:{id:"n1311",loc:[-85.630688,41.956631]},n1312:{id:"n1312",loc:[-85.630676,41.956631]},n1313:{id:"n1313",loc:[-85.630686,41.956487]},n1314:{id:"n1314",loc:[-85.63059,41.956487]},n1315:{id:"n1315",loc:[-85.63059,41.956396]},n1316:{id:"n1316",loc:[-85.630686,41.956396]},n1317:{id:"n1317",loc:[-85.630643,41.9563]},n1318:{id:"n1318",loc:[-85.630548,41.956301]},n1319:{id:"n1319",loc:[-85.630545,41.956217]},n132:{id:"n132",loc:[-85.637432,41.94189]},n1320:{id:"n1320",loc:[-85.630529,41.956214]},n1321:{id:"n1321",loc:[-85.630521,41.956202]},n1322:{id:"n1322",loc:[-85.63052,41.95618]},n1323:{id:"n1323",loc:[-85.630527,41.956169]},n1324:{id:"n1324",loc:[-85.630544,41.956163]},n1325:{id:"n1325",loc:[-85.630543,41.956094]},n1326:{id:"n1326",loc:[-85.630641,41.956093]},n1327:{id:"n1327",loc:[-85.630642,41.956134]},n1328:{id:"n1328",loc:[-85.630656,41.956134]},n1329:{id:"n1329",loc:[-85.630657,41.956252]},n133:{id:"n133",loc:[-85.637412,41.94189]},n1330:{id:"n1330",loc:[-85.630643,41.956252]},n1331:{id:"n1331",loc:[-85.630409,41.956044]},n1332:{id:"n1332",loc:[-85.630409,41.956075]},n1333:{id:"n1333",loc:[-85.630195,41.956078]},n1334:{id:"n1334",loc:[-85.630195,41.9561]},n1335:{id:"n1335",loc:[-85.630088,41.956101]},n1336:{id:"n1336",loc:[-85.630087,41.956048]},n1337:{id:"n1337",loc:[-85.630345,41.956114]},n1338:{id:"n1338",loc:[-85.630328,41.956113]},n1339:{id:"n1339",loc:[-85.63034,41.956189]},n134:{id:"n134",loc:[-85.637413,41.941938]},n1340:{id:"n1340",loc:[-85.630355,41.956185]},n1341:{id:"n1341",loc:[-85.630311,41.956117]},n1342:{id:"n1342",loc:[-85.630297,41.956125]},n1343:{id:"n1343",loc:[-85.630287,41.956136]},n1344:{id:"n1344",loc:[-85.630283,41.956149]},n1345:{id:"n1345",loc:[-85.630285,41.956162]},n1346:{id:"n1346",loc:[-85.630293,41.956174]},n1347:{id:"n1347",loc:[-85.630306,41.956183]},n1348:{id:"n1348",loc:[-85.630322,41.956188]},n1349:{id:"n1349",loc:[-85.630368,41.956179]},n135:{id:"n135",loc:[-85.637342,41.941939]},n1350:{id:"n1350",loc:[-85.630378,41.95617]},n1351:{id:"n1351",loc:[-85.630384,41.956159]},n1352:{id:"n1352",loc:[-85.630385,41.956147]},n1353:{id:"n1353",loc:[-85.630381,41.956136]},n1354:{id:"n1354",loc:[-85.630372,41.956126]},n1355:{id:"n1355",loc:[-85.63036,41.956118]},n1356:{id:"n1356",loc:[-85.630776,41.956041]},n1357:{id:"n1357",loc:[-85.630195,41.956036]},n1358:{id:"n1358",loc:[-85.630137,41.956037]},n1359:{id:"n1359",loc:[-85.630136,41.956006]},n136:{id:"n136",loc:[-85.637342,41.941914]},n1360:{id:"n1360",loc:[-85.630194,41.956005]},n1361:{id:"n1361",loc:[-85.629864,41.956039]},n1362:{id:"n1362",loc:[-85.629864,41.955862]},n1363:{id:"n1363",loc:[-85.629541,41.958291]},n1364:{id:"n1364",loc:[-85.629419,41.958292]},n1365:{id:"n1365",loc:[-85.629417,41.958168]},n1366:{id:"n1366",loc:[-85.629445,41.958168]},n1367:{id:"n1367",loc:[-85.629444,41.958109]},n1368:{id:"n1368",loc:[-85.629537,41.958108]},n1369:{id:"n1369",loc:[-85.629351,41.958136]},n137:{id:"n137",loc:[-85.637212,41.941916]},n1370:{id:"n1370",loc:[-85.629352,41.958202]},n1371:{id:"n1371",loc:[-85.629365,41.958202]},n1372:{id:"n1372",loc:[-85.629365,41.958223]},n1373:{id:"n1373",loc:[-85.629291,41.958224]},n1374:{id:"n1374",loc:[-85.62929,41.958137]},n1375:{id:"n1375",loc:[-85.629443,41.958073]},n1376:{id:"n1376",loc:[-85.629252,41.958075]},n1377:{id:"n1377",loc:[-85.629253,41.95827]},n1378:{id:"n1378",loc:[-85.629566,41.957585]},n1379:{id:"n1379",loc:[-85.629566,41.957692]},n138:{id:"n138",loc:[-85.637211,41.941835]},n1380:{id:"n1380",loc:[-85.629281,41.957693]},n1381:{id:"n1381",loc:[-85.62928,41.957585]},n1382:{id:"n1382",loc:[-85.629004,41.957599]},n1383:{id:"n1383",loc:[-85.629004,41.957682]},n1384:{id:"n1384",loc:[-85.628902,41.957682]},n1385:{id:"n1385",loc:[-85.628902,41.957723]},n1386:{id:"n1386",loc:[-85.628731,41.957724]},n1387:{id:"n1387",loc:[-85.628731,41.9576]},n1388:{id:"n1388",loc:[-85.62836,41.957679]},n1389:{id:"n1389",loc:[-85.628359,41.957759]},n139:{id:"n139",loc:[-85.637293,41.941834]},n1390:{id:"n1390",loc:[-85.628062,41.957757]},n1391:{id:"n1391",loc:[-85.628063,41.957657]},n1392:{id:"n1392",loc:[-85.628198,41.957657]},n1393:{id:"n1393",loc:[-85.628198,41.957678]},n1394:{id:"n1394",loc:[-85.627775,41.958095]},n1395:{id:"n1395",loc:[-85.627608,41.958095]},n1396:{id:"n1396",loc:[-85.627606,41.957829]},n1397:{id:"n1397",loc:[-85.627774,41.957829]},n1398:{id:"n1398",loc:[-85.626816,41.957636]},n1399:{id:"n1399",loc:[-85.626787,41.957681]},n14:{id:"n14",loc:[-85.633643,41.940122]},n140:{id:"n140",loc:[-85.637293,41.941823]},n1400:{id:"n1400",loc:[-85.626673,41.95764]},n1401:{id:"n1401",loc:[-85.626703,41.957594]},n1402:{id:"n1402",loc:[-85.62694,41.95752]},n1403:{id:"n1403",loc:[-85.62688,41.957611]},n1404:{id:"n1404",loc:[-85.626798,41.957582]},n1405:{id:"n1405",loc:[-85.626793,41.95759]},n1406:{id:"n1406",loc:[-85.626657,41.95754]},n1407:{id:"n1407",loc:[-85.626666,41.957526]},n1408:{id:"n1408",loc:[-85.626584,41.957497]},n1409:{id:"n1409",loc:[-85.626638,41.957415]},n141:{id:"n141",loc:[-85.637363,41.941822]},n1410:{id:"n1410",loc:[-85.626731,41.957449]},n1411:{id:"n1411",loc:[-85.626725,41.957457]},n1412:{id:"n1412",loc:[-85.626843,41.9575]},n1413:{id:"n1413",loc:[-85.626851,41.957487]},n1414:{id:"n1414",loc:[-85.626579,41.957521]},n1415:{id:"n1415",loc:[-85.626537,41.957587]},n1416:{id:"n1416",loc:[-85.626427,41.957551]},n1417:{id:"n1417",loc:[-85.626468,41.957483]},n1418:{id:"n1418",loc:[-85.626592,41.957639]},n1419:{id:"n1419",loc:[-85.626807,41.957713]},n142:{id:"n142",loc:[-85.637364,41.941833]},n1420:{id:"n1420",loc:[-85.627129,41.957401]},n1421:{id:"n1421",loc:[-85.627209,41.95742]},n1422:{id:"n1422",loc:[-85.627302,41.957435]},n1423:{id:"n1423",loc:[-85.629566,41.957048]},n1424:{id:"n1424",loc:[-85.629568,41.957215]},n1425:{id:"n1425",loc:[-85.629383,41.957216]},n1426:{id:"n1426",loc:[-85.629384,41.95727]},n1427:{id:"n1427",loc:[-85.629231,41.957271]},n1428:{id:"n1428",loc:[-85.62923,41.957198]},n1429:{id:"n1429",loc:[-85.629322,41.957198]},n143:{id:"n143",loc:[-85.637559,41.942448]},n1430:{id:"n1430",loc:[-85.629321,41.957108]},n1431:{id:"n1431",loc:[-85.629441,41.957108]},n1432:{id:"n1432",loc:[-85.62944,41.957049]},n1433:{id:"n1433",loc:[-85.629337,41.957018]},n1434:{id:"n1434",loc:[-85.629366,41.957028]},n1435:{id:"n1435",loc:[-85.629375,41.957044]},n1436:{id:"n1436",loc:[-85.629354,41.957071]},n1437:{id:"n1437",loc:[-85.629317,41.957071]},n1438:{id:"n1438",loc:[-85.62929,41.957074]},n1439:{id:"n1439",loc:[-85.62927,41.957084]},n144:{id:"n144",loc:[-85.637036,41.942454]},n1440:{id:"n1440",loc:[-85.629232,41.957081]},n1441:{id:"n1441",loc:[-85.629222,41.957057]},n1442:{id:"n1442",loc:[-85.629259,41.957025]},n1443:{id:"n1443",loc:[-85.629293,41.957017]},n1444:{id:"n1444",loc:[-85.629251,41.957085]},n1445:{id:"n1445",loc:[-85.629235,41.957041]},n1446:{id:"n1446",loc:[-85.62937,41.95706]},n1447:{id:"n1447",loc:[-85.629531,41.956909]},n1448:{id:"n1448",loc:[-85.629408,41.956909]},n1449:{id:"n1449",loc:[-85.629402,41.956681]},n145:{id:"n145",loc:[-85.636692,41.942828]},n1450:{id:"n1450",loc:[-85.62953,41.956681]},n1451:{id:"n1451",loc:[-85.629402,41.956728]},n1452:{id:"n1452",loc:[-85.629408,41.956845]},n1453:{id:"n1453",loc:[-85.629385,41.956845]},n1454:{id:"n1454",loc:[-85.629384,41.956728]},n1455:{id:"n1455",loc:[-85.629063,41.956973]},n1456:{id:"n1456",loc:[-85.629064,41.957009]},n1457:{id:"n1457",loc:[-85.62902,41.957009]},n1458:{id:"n1458",loc:[-85.629019,41.956973]},n1459:{id:"n1459",loc:[-85.629136,41.956633]},n146:{id:"n146",loc:[-85.635929,41.942826]},n1460:{id:"n1460",loc:[-85.629084,41.956632]},n1461:{id:"n1461",loc:[-85.629084,41.956605]},n1462:{id:"n1462",loc:[-85.629136,41.956605]},n1463:{id:"n1463",loc:[-85.629153,41.956657]},n1464:{id:"n1464",loc:[-85.627914,41.956661]},n1465:{id:"n1465",loc:[-85.630096,41.956101]},n1466:{id:"n1466",loc:[-85.630097,41.95612]},n1467:{id:"n1467",loc:[-85.630011,41.956121]},n1468:{id:"n1468",loc:[-85.630015,41.956374]},n1469:{id:"n1469",loc:[-85.629148,41.95626]},n147:{id:"n147",loc:[-85.636433,41.942828]},n1470:{id:"n1470",loc:[-85.629527,41.956591]},n1471:{id:"n1471",loc:[-85.629405,41.956591]},n1472:{id:"n1472",loc:[-85.629405,41.956459]},n1473:{id:"n1473",loc:[-85.629369,41.956459]},n1474:{id:"n1474",loc:[-85.629369,41.956424]},n1475:{id:"n1475",loc:[-85.629413,41.956424]},n1476:{id:"n1476",loc:[-85.629414,41.956326]},n1477:{id:"n1477",loc:[-85.629522,41.956326]},n1478:{id:"n1478",loc:[-85.629522,41.956487]},n1479:{id:"n1479",loc:[-85.629527,41.956487]},n148:{id:"n148",loc:[-85.636435,41.942864],tags:{entrance:"yes"}},n1480:{id:"n1480",loc:[-85.629414,41.95634]},n1481:{id:"n1481",loc:[-85.629149,41.956338]},n1482:{id:"n1482",loc:[-85.62931,41.956531]},n1483:{id:"n1483",loc:[-85.629291,41.95655]},n1484:{id:"n1484",loc:[-85.629255,41.95655]},n1485:{id:"n1485",loc:[-85.629236,41.956533]},n1486:{id:"n1486",loc:[-85.629237,41.956461]},n1487:{id:"n1487",loc:[-85.629257,41.956445]},n1488:{id:"n1488",loc:[-85.629257,41.956428]},n1489:{id:"n1489",loc:[-85.629287,41.956428]},n149:{id:"n149",loc:[-85.637235,41.942622]},n1490:{id:"n1490",loc:[-85.629287,41.956445]},n1491:{id:"n1491",loc:[-85.62931,41.95646]},n1492:{id:"n1492",loc:[-85.629049,41.956425]},n1493:{id:"n1493",loc:[-85.628907,41.956427]},n1494:{id:"n1494",loc:[-85.628907,41.956455]},n1495:{id:"n1495",loc:[-85.628841,41.956455]},n1496:{id:"n1496",loc:[-85.62884,41.956424]},n1497:{id:"n1497",loc:[-85.628764,41.956425]},n1498:{id:"n1498",loc:[-85.628762,41.956323]},n1499:{id:"n1499",loc:[-85.628808,41.956323]},n15:{id:"n15",loc:[-85.633477,41.940187]},n150:{id:"n150",loc:[-85.637247,41.943116]},n1500:{id:"n1500",loc:[-85.628808,41.956314]},n1501:{id:"n1501",loc:[-85.628911,41.956313]},n1502:{id:"n1502",loc:[-85.628911,41.956322]},n1503:{id:"n1503",loc:[-85.62896,41.956322]},n1504:{id:"n1504",loc:[-85.62896,41.956348]},n1505:{id:"n1505",loc:[-85.629047,41.956347]},n1506:{id:"n1506",loc:[-85.628893,41.957263]},n1507:{id:"n1507",loc:[-85.628788,41.957264]},n1508:{id:"n1508",loc:[-85.628786,41.95711]},n1509:{id:"n1509",loc:[-85.628894,41.957109]},n151:{id:"n151",loc:[-85.637564,41.943116]},n1510:{id:"n1510",loc:[-85.628893,41.957075]},n1511:{id:"n1511",loc:[-85.628965,41.957075]},n1512:{id:"n1512",loc:[-85.628965,41.957111]},n1513:{id:"n1513",loc:[-85.629035,41.95711]},n1514:{id:"n1514",loc:[-85.629036,41.957209]},n1515:{id:"n1515",loc:[-85.628893,41.95721]},n1516:{id:"n1516",loc:[-85.631348,41.95773]},n1517:{id:"n1517",loc:[-85.631101,41.957732]},n1518:{id:"n1518",loc:[-85.631099,41.957558]},n1519:{id:"n1519",loc:[-85.63123,41.957557]},n152:{id:"n152",loc:[-85.637552,41.942619]},n1520:{id:"n1520",loc:[-85.631231,41.957618]},n1521:{id:"n1521",loc:[-85.63129,41.957618]},n1522:{id:"n1522",loc:[-85.63129,41.957651]},n1523:{id:"n1523",loc:[-85.631346,41.957651]},n1524:{id:"n1524",loc:[-85.631366,41.95802]},n1525:{id:"n1525",loc:[-85.631141,41.958021]},n1526:{id:"n1526",loc:[-85.63114,41.957943]},n1527:{id:"n1527",loc:[-85.631167,41.957943]},n1528:{id:"n1528",loc:[-85.631166,41.957808]},n1529:{id:"n1529",loc:[-85.631301,41.957807]},n153:{id:"n153",loc:[-85.63763,41.942528]},n1530:{id:"n1530",loc:[-85.631302,41.95789]},n1531:{id:"n1531",loc:[-85.631364,41.95789]},n1532:{id:"n1532",loc:[-85.631539,41.957754]},n1533:{id:"n1533",loc:[-85.631069,41.957756]},n1534:{id:"n1534",loc:[-85.631536,41.957518]},n1535:{id:"n1535",loc:[-85.631543,41.957995]},n1536:{id:"n1536",loc:[-85.631531,41.957748]},n1537:{id:"n1537",loc:[-85.631485,41.957748]},n1538:{id:"n1538",loc:[-85.631484,41.957698]},n1539:{id:"n1539",loc:[-85.631531,41.957698]},n154:{id:"n154",loc:[-85.637151,41.94253]},n1540:{id:"n1540",loc:[-85.631586,41.957742]},n1541:{id:"n1541",loc:[-85.63155,41.957742]},n1542:{id:"n1542",loc:[-85.631551,41.957702]},n1543:{id:"n1543",loc:[-85.631587,41.957702]},n1544:{id:"n1544",loc:[-85.631534,41.95807]},n1545:{id:"n1545",loc:[-85.631534,41.958097]},n1546:{id:"n1546",loc:[-85.631491,41.958097]},n1547:{id:"n1547",loc:[-85.631491,41.95807]},n1548:{id:"n1548",loc:[-85.631304,41.958861]},n1549:{id:"n1549",loc:[-85.631186,41.958862]},n155:{id:"n155",loc:[-85.63715,41.942424]},n1550:{id:"n1550",loc:[-85.631182,41.958653]},n1551:{id:"n1551",loc:[-85.6313,41.958651]},n1552:{id:"n1552",loc:[-85.631293,41.95854]},n1553:{id:"n1553",loc:[-85.631176,41.958539]},n1554:{id:"n1554",loc:[-85.631176,41.958377]},n1555:{id:"n1555",loc:[-85.631297,41.958377]},n1556:{id:"n1556",loc:[-85.631297,41.958422]},n1557:{id:"n1557",loc:[-85.631333,41.958422]},n1558:{id:"n1558",loc:[-85.631333,41.958479]},n1559:{id:"n1559",loc:[-85.631293,41.958479]},n156:{id:"n156",loc:[-85.637629,41.942422]},n1560:{id:"n1560",loc:[-85.631951,41.958908]},n1561:{id:"n1561",loc:[-85.631838,41.958909]},n1562:{id:"n1562",loc:[-85.631837,41.958847]},n1563:{id:"n1563",loc:[-85.631859,41.958847]},n1564:{id:"n1564",loc:[-85.631858,41.958746]},n1565:{id:"n1565",loc:[-85.631961,41.958745]},n1566:{id:"n1566",loc:[-85.631962,41.958812]},n1567:{id:"n1567",loc:[-85.631949,41.958813]},n1568:{id:"n1568",loc:[-85.631579,41.958913]},n1569:{id:"n1569",loc:[-85.631567,41.95864]},n157:{id:"n157",loc:[-85.638232,41.942477]},n1570:{id:"n1570",loc:[-85.631942,41.958639]},n1571:{id:"n1571",loc:[-85.631543,41.958594]},n1572:{id:"n1572",loc:[-85.631543,41.958065]},n1573:{id:"n1573",loc:[-85.631888,41.958546]},n1574:{id:"n1574",loc:[-85.631804,41.958546]},n1575:{id:"n1575",loc:[-85.631803,41.95841]},n1576:{id:"n1576",loc:[-85.631886,41.958409]},n1577:{id:"n1577",loc:[-85.631897,41.958125]},n1578:{id:"n1578",loc:[-85.631755,41.958126]},n1579:{id:"n1579",loc:[-85.631756,41.958174]},n158:{id:"n158",loc:[-85.637775,41.942483]},n1580:{id:"n1580",loc:[-85.63178,41.958174]},n1581:{id:"n1581",loc:[-85.631782,41.958272]},n1582:{id:"n1582",loc:[-85.631922,41.958271]},n1583:{id:"n1583",loc:[-85.631922,41.958244]},n1584:{id:"n1584",loc:[-85.631883,41.958245]},n1585:{id:"n1585",loc:[-85.631882,41.958175]},n1586:{id:"n1586",loc:[-85.631898,41.958175]},n1587:{id:"n1587",loc:[-85.631924,41.958032]},n1588:{id:"n1588",loc:[-85.631762,41.958032]},n1589:{id:"n1589",loc:[-85.63176,41.957827]},n159:{id:"n159",loc:[-85.638107,41.942512]},n1590:{id:"n1590",loc:[-85.631888,41.957826]},n1591:{id:"n1591",loc:[-85.631888,41.957892]},n1592:{id:"n1592",loc:[-85.631871,41.957892]},n1593:{id:"n1593",loc:[-85.631872,41.957949]},n1594:{id:"n1594",loc:[-85.631923,41.957949]},n1595:{id:"n1595",loc:[-85.631695,41.95795]},n1596:{id:"n1596",loc:[-85.631666,41.957975]},n1597:{id:"n1597",loc:[-85.63163,41.957975]},n1598:{id:"n1598",loc:[-85.6316,41.957951]},n1599:{id:"n1599",loc:[-85.6316,41.95785]},n16:{id:"n16",loc:[-85.63341,41.94032]},n160:{id:"n160",loc:[-85.637763,41.942514]},n1600:{id:"n1600",loc:[-85.63166,41.95785]},n1601:{id:"n1601",loc:[-85.631696,41.957873]},n1602:{id:"n1602",loc:[-85.631924,41.957762]},n1603:{id:"n1603",loc:[-85.631762,41.957762]},n1604:{id:"n1604",loc:[-85.631762,41.957708]},n1605:{id:"n1605",loc:[-85.631785,41.957708]},n1606:{id:"n1606",loc:[-85.631785,41.957606]},n1607:{id:"n1607",loc:[-85.631734,41.957606]},n1608:{id:"n1608",loc:[-85.631734,41.957538]},n1609:{id:"n1609",loc:[-85.631821,41.957538]},n161:{id:"n161",loc:[-85.637763,41.942445]},n1610:{id:"n1610",loc:[-85.631935,41.957545]},n1611:{id:"n1611",loc:[-85.631821,41.957544]},n1612:{id:"n1612",loc:[-85.631935,41.957645]},n1613:{id:"n1613",loc:[-85.631924,41.957645]},n1614:{id:"n1614",loc:[-85.627135,41.953828]},n1615:{id:"n1615",loc:[-85.633517,41.941353],tags:{man_made:"lighthouse","seamark:type":"light_major"}},n1616:{id:"n1616",loc:[-85.633659,41.942041],tags:{amenity:"bbq"}},n1617:{id:"n1617",loc:[-85.63662,41.942911],tags:{amenity:"toilets"}},n1618:{id:"n1618",loc:[-85.637487,41.943876],tags:{amenity:"toilets"}},n1619:{id:"n1619",loc:[-85.634938,41.941917],tags:{amenity:"toilets"}},n162:{id:"n162",loc:[-85.638107,41.942443]},n1620:{id:"n1620",loc:[-85.632427,41.941678],tags:{amenity:"bbq"}},n1621:{id:"n1621",loc:[-85.638033,41.944568],tags:{amenity:"bbq"}},n1622:{id:"n1622",loc:[-85.638052,41.944522],tags:{amenity:"bbq"}},n1623:{id:"n1623",loc:[-85.635001,41.941965]},n1624:{id:"n1624",loc:[-85.634635,41.941884]},n1625:{id:"n1625",loc:[-85.634667,41.941894]},n1626:{id:"n1626",loc:[-85.634791,41.942011]},n1627:{id:"n1627",loc:[-85.634749,41.941938]},n1628:{id:"n1628",loc:[-85.627295,41.953946],tags:{barrier:"gate"}},n1629:{id:"n1629",loc:[-85.629076,41.954689]},n163:{id:"n163",loc:[-85.638813,41.942475]},n1630:{id:"n1630",loc:[-85.640667,41.942595]},n1631:{id:"n1631",loc:[-85.639455,41.94261]},n1632:{id:"n1632",loc:[-85.643407,41.942336]},n1633:{id:"n1633",loc:[-85.641845,41.941316]},n1634:{id:"n1634",loc:[-85.643322,41.942224]},n1635:{id:"n1635",loc:[-85.643301,41.942124]},n1636:{id:"n1636",loc:[-85.640639,41.941326]},n1637:{id:"n1637",loc:[-85.640614,41.940058]},n1638:{id:"n1638",loc:[-85.639428,41.941335]},n1639:{id:"n1639",loc:[-85.643078,41.941293]},n164:{id:"n164",loc:[-85.63883,41.942422]},n1640:{id:"n1640",loc:[-85.64371,41.942302]},n1641:{id:"n1641",loc:[-85.643056,41.94001]},n1642:{id:"n1642",loc:[-85.643097,41.942575],tags:{highway:"traffic_signals",traffic_signals:"signal","traffic_signals:direction":"both"}},n1643:{id:"n1643",loc:[-85.641855,41.942586]},n1644:{id:"n1644",loc:[-85.643549,41.942209]},n1645:{id:"n1645",loc:[-85.639359,41.94007]},n1646:{id:"n1646",loc:[-85.642797,41.940522]},n1647:{id:"n1647",loc:[-85.642589,41.940523]},n1648:{id:"n1648",loc:[-85.642587,41.940287]},n1649:{id:"n1649",loc:[-85.642797,41.940286]},n165:{id:"n165",loc:[-85.63883,41.942508]},n1650:{id:"n1650",loc:[-85.642571,41.940523]},n1651:{id:"n1651",loc:[-85.642568,41.940286]},n1652:{id:"n1652",loc:[-85.642316,41.940289]},n1653:{id:"n1653",loc:[-85.642321,41.940436]},n1654:{id:"n1654",loc:[-85.642292,41.940458]},n1655:{id:"n1655",loc:[-85.642287,41.940483]},n1656:{id:"n1656",loc:[-85.642323,41.940509]},n1657:{id:"n1657",loc:[-85.642385,41.940511]},n1658:{id:"n1658",loc:[-85.642408,41.940526]},n1659:{id:"n1659",loc:[-85.641962,41.94109]},n166:{id:"n166",loc:[-85.638364,41.942508]},n1660:{id:"n1660",loc:[-85.642753,41.941084]},n1661:{id:"n1661",loc:[-85.642752,41.941004]},n1662:{id:"n1662",loc:[-85.642806,41.941003]},n1663:{id:"n1663",loc:[-85.642803,41.940731]},n1664:{id:"n1664",loc:[-85.642741,41.940732]},n1665:{id:"n1665",loc:[-85.64274,41.940645]},n1666:{id:"n1666",loc:[-85.641957,41.940651]},n1667:{id:"n1667",loc:[-85.642937,41.941241]},n1668:{id:"n1668",loc:[-85.641776,41.941253]},n1669:{id:"n1669",loc:[-85.641766,41.940598]},n167:{id:"n167",loc:[-85.638836,41.942167]},n1670:{id:"n1670",loc:[-85.64198,41.940598]},n1671:{id:"n1671",loc:[-85.641961,41.940137]},n1672:{id:"n1672",loc:[-85.642934,41.94012]},n1673:{id:"n1673",loc:[-85.643074,41.941173]},n1674:{id:"n1674",loc:[-85.642841,41.940997]},n1675:{id:"n1675",loc:[-85.642839,41.940721]},n1676:{id:"n1676",loc:[-85.643065,41.940552]},n1677:{id:"n1677",loc:[-85.642732,41.94124]},n1678:{id:"n1678",loc:[-85.641815,41.941246]},n1679:{id:"n1679",loc:[-85.641813,41.941132]},n168:{id:"n168",loc:[-85.638836,41.94229]},n1680:{id:"n1680",loc:[-85.641839,41.941111]},n1681:{id:"n1681",loc:[-85.641884,41.941098]},n1682:{id:"n1682",loc:[-85.642732,41.941092]},n1683:{id:"n1683",loc:[-85.642776,41.941302]},n1684:{id:"n1684",loc:[-85.632788,41.946236]},n1685:{id:"n1685",loc:[-85.622342,41.953127]},n1686:{id:"n1686",loc:[-85.641848,41.941167]},n1687:{id:"n1687",loc:[-85.643753,41.941503]},n1688:{id:"n1688",loc:[-85.643762,41.942119]},n1689:{id:"n1689",loc:[-85.64238,41.942262]},n169:{id:"n169",loc:[-85.638594,41.94229]},n1690:{id:"n1690",loc:[-85.642374,41.941944]},n1691:{id:"n1691",loc:[-85.642518,41.941943]},n1692:{id:"n1692",loc:[-85.642519,41.94198]},n1693:{id:"n1693",loc:[-85.642831,41.941977]},n1694:{id:"n1694",loc:[-85.642837,41.942312]},n1695:{id:"n1695",loc:[-85.642495,41.942315]},n1696:{id:"n1696",loc:[-85.642494,41.942261]},n1697:{id:"n1697",loc:[-85.641087,41.942433]},n1698:{id:"n1698",loc:[-85.641081,41.942006]},n1699:{id:"n1699",loc:[-85.641244,41.942005]},n17:{id:"n17",loc:[-85.633478,41.94081]},n170:{id:"n170",loc:[-85.638594,41.942422]},n1700:{id:"n1700",loc:[-85.64125,41.942431]},n1701:{id:"n1701",loc:[-85.641331,41.942968]},n1702:{id:"n1702",loc:[-85.641328,41.942713]},n1703:{id:"n1703",loc:[-85.641521,41.942712]},n1704:{id:"n1704",loc:[-85.641523,41.942924]},n1705:{id:"n1705",loc:[-85.641504,41.942924]},n1706:{id:"n1706",loc:[-85.641505,41.942967]},n1707:{id:"n1707",loc:[-85.638612,41.942408]},n1708:{id:"n1708",loc:[-85.638612,41.942327]},n1709:{id:"n1709",loc:[-85.638775,41.942327]},n171:{id:"n171",loc:[-85.638364,41.942356]},n1710:{id:"n1710",loc:[-85.638775,41.942299]},n1711:{id:"n1711",loc:[-85.638835,41.942298]},n1712:{id:"n1712",loc:[-85.638835,41.942407]},n1713:{id:"n1713",loc:[-85.639116,41.942444]},n1714:{id:"n1714",loc:[-85.639114,41.942362]},n1715:{id:"n1715",loc:[-85.639294,41.94236]},n1716:{id:"n1716",loc:[-85.639296,41.942442]},n1717:{id:"n1717",loc:[-85.639808,41.942385]},n1718:{id:"n1718",loc:[-85.639805,41.942285]},n1719:{id:"n1719",loc:[-85.639988,41.942283]},n172:{id:"n172",loc:[-85.638364,41.942167]},n1720:{id:"n1720",loc:[-85.63999,41.942383]},n1721:{id:"n1721",loc:[-85.639633,41.943023]},n1722:{id:"n1722",loc:[-85.639867,41.943019]},n1723:{id:"n1723",loc:[-85.639866,41.942964]},n1724:{id:"n1724",loc:[-85.639888,41.942963]},n1725:{id:"n1725",loc:[-85.639883,41.942779]},n1726:{id:"n1726",loc:[-85.639851,41.94278]},n1727:{id:"n1727",loc:[-85.63985,41.94274]},n1728:{id:"n1728",loc:[-85.639789,41.942741]},n1729:{id:"n1729",loc:[-85.639789,41.942753]},n173:{id:"n173",loc:[-85.639038,41.942463]},n1730:{id:"n1730",loc:[-85.639698,41.942754]},n1731:{id:"n1731",loc:[-85.639699,41.942788]},n1732:{id:"n1732",loc:[-85.639675,41.942789]},n1733:{id:"n1733",loc:[-85.639676,41.94283]},n1734:{id:"n1734",loc:[-85.639701,41.942829]},n1735:{id:"n1735",loc:[-85.639702,41.942869]},n1736:{id:"n1736",loc:[-85.639629,41.94287]},n1737:{id:"n1737",loc:[-85.643568,41.942946]},n1738:{id:"n1738",loc:[-85.643568,41.942777]},n1739:{id:"n1739",loc:[-85.643401,41.942777]},n174:{id:"n174",loc:[-85.638897,41.942464]},n1740:{id:"n1740",loc:[-85.643401,41.942863]},n1741:{id:"n1741",loc:[-85.643448,41.942863]},n1742:{id:"n1742",loc:[-85.643448,41.942946]},n1743:{id:"n1743",loc:[-85.642836,41.942981]},n1744:{id:"n1744",loc:[-85.642917,41.942979]},n1745:{id:"n1745",loc:[-85.642914,41.942904]},n1746:{id:"n1746",loc:[-85.642938,41.942903]},n1747:{id:"n1747",loc:[-85.642935,41.942813]},n1748:{id:"n1748",loc:[-85.642775,41.942816]},n1749:{id:"n1749",loc:[-85.642778,41.942906]},n175:{id:"n175",loc:[-85.638897,41.942423]},n1750:{id:"n1750",loc:[-85.642833,41.942905]},n1751:{id:"n1751",loc:[-85.642302,41.942886]},n1752:{id:"n1752",loc:[-85.642299,41.942721]},n1753:{id:"n1753",loc:[-85.642422,41.94272]},n1754:{id:"n1754",loc:[-85.642425,41.942868]},n1755:{id:"n1755",loc:[-85.642385,41.942869]},n1756:{id:"n1756",loc:[-85.642385,41.942885]},n1757:{id:"n1757",loc:[-85.641533,41.942939]},n1758:{id:"n1758",loc:[-85.64161,41.942877]},n1759:{id:"n1759",loc:[-85.641676,41.942922]},n176:{id:"n176",loc:[-85.638853,41.942423]},n1760:{id:"n1760",loc:[-85.6416,41.942985]},n1761:{id:"n1761",loc:[-85.64206,41.942802]},n1762:{id:"n1762",loc:[-85.642059,41.942741]},n1763:{id:"n1763",loc:[-85.642196,41.942741]},n1764:{id:"n1764",loc:[-85.642196,41.942818]},n1765:{id:"n1765",loc:[-85.642128,41.942819]},n1766:{id:"n1766",loc:[-85.642128,41.942801]},n1767:{id:"n1767",loc:[-85.640943,41.942934]},n1768:{id:"n1768",loc:[-85.641035,41.942933]},n1769:{id:"n1769",loc:[-85.641032,41.942797]},n177:{id:"n177",loc:[-85.638852,41.94237]},n1770:{id:"n1770",loc:[-85.640997,41.942798]},n1771:{id:"n1771",loc:[-85.640996,41.942764]},n1772:{id:"n1772",loc:[-85.640861,41.942766]},n1773:{id:"n1773",loc:[-85.640862,41.942848]},n1774:{id:"n1774",loc:[-85.640941,41.942847]},n1775:{id:"n1775",loc:[-85.643766,41.942226]},n1776:{id:"n1776",loc:[-85.643768,41.942407]},n1777:{id:"n1777",loc:[-85.643218,41.94177]},n1778:{id:"n1778",loc:[-85.64321,41.941327]},n1779:{id:"n1779",loc:[-85.643649,41.941323]},n178:{id:"n178",loc:[-85.638892,41.94237]},n1780:{id:"n1780",loc:[-85.643656,41.941716]},n1781:{id:"n1781",loc:[-85.64358,41.941717]},n1782:{id:"n1782",loc:[-85.64358,41.941767]},n1783:{id:"n1783",loc:[-85.64382,41.941495]},n1784:{id:"n1784",loc:[-85.643817,41.941317]},n1785:{id:"n1785",loc:[-85.643235,41.941833]},n1786:{id:"n1786",loc:[-85.64335,41.941842]},n1787:{id:"n1787",loc:[-85.643504,41.941903]},n1788:{id:"n1788",loc:[-85.643554,41.941946]},n1789:{id:"n1789",loc:[-85.643618,41.942015]},n179:{id:"n179",loc:[-85.638891,41.942334]},n1790:{id:"n1790",loc:[-85.64346,41.941971]},n1791:{id:"n1791",loc:[-85.643528,41.942468]},n1792:{id:"n1792",loc:[-85.643621,41.942363]},n1793:{id:"n1793",loc:[-85.643496,41.942297]},n1794:{id:"n1794",loc:[-85.643446,41.942246]},n1795:{id:"n1795",loc:[-85.643398,41.942177]},n1796:{id:"n1796",loc:[-85.643398,41.942031]},n1797:{id:"n1797",loc:[-85.621531,41.952693]},n1798:{id:"n1798",loc:[-85.643221,41.942028]},n1799:{id:"n1799",loc:[-85.643225,41.942276]},n18:{id:"n18",loc:[-85.63345,41.94071]},n180:{id:"n180",loc:[-85.639037,41.942334]},n1800:{id:"n1800",loc:[-85.643265,41.942347]},n1801:{id:"n1801",loc:[-85.643323,41.942413]},n1802:{id:"n1802",loc:[-85.643411,41.94247]},n1803:{id:"n1803",loc:[-85.643459,41.942435]},n1804:{id:"n1804",loc:[-85.643767,41.942307]},n1805:{id:"n1805",loc:[-85.643661,41.942293]},n1806:{id:"n1806",loc:[-85.643578,41.942247]},n1807:{id:"n1807",loc:[-85.643522,41.942125]},n1808:{id:"n1808",loc:[-85.643515,41.942061]},n1809:{id:"n1809",loc:[-85.643346,41.941924]},n181:{id:"n181",loc:[-85.638074,41.941839]},n1810:{id:"n1810",loc:[-85.643086,41.94192]},n1811:{id:"n1811",loc:[-85.643529,41.94217]},n1812:{id:"n1812",loc:[-85.643489,41.942003]},n1813:{id:"n1813",loc:[-85.643295,41.941919]},n1814:{id:"n1814",loc:[-85.643305,41.942163]},n1815:{id:"n1815",loc:[-85.643354,41.942285]},n1816:{id:"n1816",loc:[-85.643472,41.942389]},n1817:{id:"n1817",loc:[-85.643608,41.942271]},n1818:{id:"n1818",loc:[-85.643876,41.941402]},n1819:{id:"n1819",loc:[-85.643818,41.941369]},n182:{id:"n182",loc:[-85.638076,41.941942]},n1820:{id:"n1820",loc:[-85.643682,41.941304]},n1821:{id:"n1821",loc:[-85.64359,41.941286]},n1822:{id:"n1822",loc:[-85.643317,41.941727]},n1823:{id:"n1823",loc:[-85.643301,41.941286]},n1824:{id:"n1824",loc:[-85.643553,41.941698]},n1825:{id:"n1825",loc:[-85.643543,41.941286]},n1826:{id:"n1826",loc:[-85.636967,41.940118]},n1827:{id:"n1827",loc:[-85.63378,41.940114]},n1828:{id:"n1828",loc:[-85.637254,41.940075]},n1829:{id:"n1829",loc:[-85.637002,41.941355]},n183:{id:"n183",loc:[-85.637955,41.941944]},n1830:{id:"n1830",loc:[-85.643532,41.94204]},n1831:{id:"n1831",loc:[-85.638235,41.942615]},n1832:{id:"n1832",loc:[-85.637039,41.942624]},n1833:{id:"n1833",loc:[-85.636369,41.94266]},n1834:{id:"n1834",loc:[-85.63582,41.942771],tags:{highway:"traffic_signals",traffic_signals:"emergency","traffic_signals:direction":"both"}},n1835:{id:"n1835",loc:[-85.634873,41.943044]},n1836:{id:"n1836",loc:[-85.643482,41.941976]},n1837:{id:"n1837",loc:[-85.64345,41.941945]},n1838:{id:"n1838",loc:[-85.641885,41.943851]},n1839:{id:"n1839",loc:[-85.641915,41.945121]},n184:{id:"n184",loc:[-85.637953,41.94184]},n1840:{id:"n1840",loc:[-85.639454,41.943871]},n1841:{id:"n1841",loc:[-85.639491,41.945191]},n1842:{id:"n1842",loc:[-85.635775,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",crossing:"unmarked"}},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.635806,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.942648]},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.634982,41.946262],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.635805,41.941906]},n2410:{id:"n2410",loc:[-85.634448,41.945626],tags:{highway:"traffic_signals",traffic_signals:"signal"}},n2411:{id:"n2411",loc:[-85.63456,41.945731],tags:{crossing:"marked",highway:"crossing"}},n2412:{id:"n2412",loc:[-85.634592,41.94578]},n2413:{id:"n2413",loc:[-85.634607,41.945815]},n2414:{id:"n2414",loc:[-85.634614,41.945864]},n2415:{id:"n2415",loc:[-85.636066,41.946185]},n2416:{id:"n2416",loc:[-85.636128,41.946352]},n2417:{id:"n2417",loc:[-85.636142,41.946452]},n2418:{id:"n2418",loc:[-85.635327,41.945292]},n2419:{id:"n2419",loc:[-85.635648,41.94558]},n242:{id:"n242",loc:[-85.635909,41.941906]},n2420:{id:"n2420",loc:[-85.635769,41.945729]},n2421:{id:"n2421",loc:[-85.637349,41.945897]},n2422:{id:"n2422",loc:[-85.632211,41.95596],tags:{emergency:"fire_hydrant"}},n2423:{id:"n2423",loc:[-85.635942,41.94598]},n2424:{id:"n2424",loc:[-85.636443,41.946042]},n2425:{id:"n2425",loc:[-85.635819,41.946052]},n2426:{id:"n2426",loc:[-85.636669,41.946025]},n2427:{id:"n2427",loc:[-85.636832,41.946005]},n2428:{id:"n2428",loc:[-85.637039,41.945968]},n2429:{id:"n2429",loc:[-85.636291,41.946046]},n243:{id:"n243",loc:[-85.636359,41.941904]},n2430:{id:"n2430",loc:[-85.634005,41.943367]},n2431:{id:"n2431",loc:[-85.633366,41.943724]},n2432:{id:"n2432",loc:[-85.634617,41.946057]},n2433:{id:"n2433",loc:[-85.636534,41.944793]},n2434:{id:"n2434",loc:[-85.637055,41.945188]},n2435:{id:"n2435",loc:[-85.636153,41.944618]},n2436:{id:"n2436",loc:[-85.636803,41.944944]},n2437:{id:"n2437",loc:[-85.633389,41.945735]},n2438:{id:"n2438",loc:[-85.633536,41.94585]},n2439:{id:"n2439",loc:[-85.63363,41.945993]},n244:{id:"n244",loc:[-85.636351,41.941438]},n2440:{id:"n2440",loc:[-85.633268,41.94568]},n2441:{id:"n2441",loc:[-85.635947,41.94546]},n2442:{id:"n2442",loc:[-85.636277,41.945268]},n2443:{id:"n2443",loc:[-85.635203,41.944287]},n2444:{id:"n2444",loc:[-85.634876,41.944477]},n2445:{id:"n2445",loc:[-85.634975,41.944419]},n2446:{id:"n2446",loc:[-85.633877,41.943438]},n2447:{id:"n2447",loc:[-85.63508,41.945113]},n2448:{id:"n2448",loc:[-85.635372,41.944932]},n2449:{id:"n2449",loc:[-85.636594,41.945935]},n245:{id:"n245",loc:[-85.635903,41.941436]},n2450:{id:"n2450",loc:[-85.636901,41.945747]},n2451:{id:"n2451",loc:[-85.636329,41.945228]},n2452:{id:"n2452",loc:[-85.636025,41.945417]},n2453:{id:"n2453",loc:[-85.634002,41.944644]},n2454:{id:"n2454",loc:[-85.63407,41.944692]},n2455:{id:"n2455",loc:[-85.634114,41.944756]},n2456:{id:"n2456",loc:[-85.633762,41.944809]},n2457:{id:"n2457",loc:[-85.634184,41.944807]},n2458:{id:"n2458",loc:[-85.634291,41.944819]},n2459:{id:"n2459",loc:[-85.634639,41.944845]},n246:{id:"n246",loc:[-85.635798,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.634841,41.945778]},n2525:{id:"n2525",loc:[-85.635315,41.945939]},n2526:{id:"n2526",loc:[-85.634841,41.945921]},n2527:{id:"n2527",loc:[-85.635461,41.944879]},n2528:{id:"n2528",loc:[-85.636024,41.945384]},n2529:{id:"n2529",loc:[-85.636145,41.945312]},n253:{id:"n253",loc:[-85.636716,41.941509]},n2530:{id:"n2530",loc:[-85.6356,41.944797]},n2531:{id:"n2531",loc:[-85.635135,41.944354]},n2532:{id:"n2532",loc:[-85.632988,41.945369]},n2533:{id:"n2533",loc:[-85.633376,41.94563]},n2534:{id:"n2534",loc:[-85.633539,41.945534]},n2535:{id:"n2535",loc:[-85.633238,41.945248]},n2536:{id:"n2536",loc:[-85.633166,41.945216]},n2537:{id:"n2537",loc:[-85.633114,41.945188]},n2538:{id:"n2538",loc:[-85.633078,41.945127]},n2539:{id:"n2539",loc:[-85.633066,41.94508]},n254:{id:"n254",loc:[-85.636732,41.941509]},n2540:{id:"n2540",loc:[-85.633222,41.945358]},n2541:{id:"n2541",loc:[-85.633425,41.945541]},n2542:{id:"n2542",loc:[-85.63299,41.9455]},n2543:{id:"n2543",loc:[-85.634374,41.944327]},n2544:{id:"n2544",loc:[-85.633648,41.943697]},n2545:{id:"n2545",loc:[-85.633533,41.943764]},n2546:{id:"n2546",loc:[-85.634239,41.944417]},n2547:{id:"n2547",loc:[-85.634122,41.944395]},n2548:{id:"n2548",loc:[-85.634235,41.944326]},n2549:{id:"n2549",loc:[-85.633613,41.943787]},n255:{id:"n255",loc:[-85.636731,41.941461]},n2550:{id:"n2550",loc:[-85.633915,41.943613]},n2551:{id:"n2551",loc:[-85.634015,41.943555]},n2552:{id:"n2552",loc:[-85.63433,41.943839]},n2553:{id:"n2553",loc:[-85.634236,41.943894]},n2554:{id:"n2554",loc:[-85.635413,41.946052]},n2555:{id:"n2555",loc:[-85.635405,41.94569]},n2556:{id:"n2556",loc:[-85.635684,41.945925]},n2557:{id:"n2557",loc:[-85.635614,41.945742]},n2558:{id:"n2558",loc:[-85.635401,41.945745]},n2559:{id:"n2559",loc:[-85.635406,41.945928]},n256:{id:"n256",loc:[-85.636799,41.941461]},n2560:{id:"n2560",loc:[-85.633478,41.943663]},n2561:{id:"n2561",loc:[-85.633291,41.943526]},n2562:{id:"n2562",loc:[-85.633094,41.943541]},n2563:{id:"n2563",loc:[-85.633302,41.943492]},n2564:{id:"n2564",loc:[-85.633047,41.943623]},n2565:{id:"n2565",loc:[-85.633275,41.943562]},n2566:{id:"n2566",loc:[-85.633351,41.943518]},n2567:{id:"n2567",loc:[-85.633224,41.9434]},n2568:{id:"n2568",loc:[-85.633235,41.943369]},n2569:{id:"n2569",loc:[-85.635179,41.943911]},n257:{id:"n257",loc:[-85.6368,41.9415]},n2570:{id:"n2570",loc:[-85.635146,41.943918]},n2571:{id:"n2571",loc:[-85.634888,41.943905]},n2572:{id:"n2572",loc:[-85.634832,41.943911]},n2573:{id:"n2573",loc:[-85.634638,41.944007]},n2574:{id:"n2574",loc:[-85.634568,41.94405]},n2575:{id:"n2575",loc:[-85.635994,41.94501]},n2576:{id:"n2576",loc:[-85.636388,41.944608]},n2577:{id:"n2577",loc:[-85.636215,41.944787]},n2578:{id:"n2578",loc:[-85.637948,41.944587]},n2579:{id:"n2579",loc:[-85.637849,41.944567]},n258:{id:"n258",loc:[-85.636814,41.9415]},n2580:{id:"n2580",loc:[-85.637895,41.944455]},n2581:{id:"n2581",loc:[-85.637996,41.944477]},n2582:{id:"n2582",loc:[-85.635525,41.94337]},n2583:{id:"n2583",loc:[-85.637847,41.943923]},n2584:{id:"n2584",loc:[-85.637891,41.944124]},n2585:{id:"n2585",loc:[-85.638167,41.944229]},n2586:{id:"n2586",loc:[-85.638236,41.944097]},n2587:{id:"n2587",loc:[-85.638207,41.944025]},n2588:{id:"n2588",loc:[-85.638141,41.943997]},n2589:{id:"n2589",loc:[-85.638057,41.944015]},n259:{id:"n259",loc:[-85.636815,41.941538]},n2590:{id:"n2590",loc:[-85.637902,41.944231]},n2591:{id:"n2591",loc:[-85.638134,41.944307]},n2592:{id:"n2592",loc:[-85.638242,41.944294]},n2593:{id:"n2593",loc:[-85.638274,41.944222]},n2594:{id:"n2594",loc:[-85.638236,41.944174]},n2595:{id:"n2595",loc:[-85.638207,41.944157]},n2596:{id:"n2596",loc:[-85.637818,41.943984]},n2597:{id:"n2597",loc:[-85.634996,41.944439]},n2598:{id:"n2598",loc:[-85.633946,41.945804]},n2599:{id:"n2599",loc:[-85.634102,41.945864]},n26:{id:"n26",loc:[-85.634346,41.942744]},n260:{id:"n260",loc:[-85.636827,41.941538]},n2600:{id:"n2600",loc:[-85.633819,41.945756]},n2601:{id:"n2601",loc:[-85.634025,41.945975]},n2602:{id:"n2602",loc:[-85.633742,41.945867]},n2603:{id:"n2603",loc:[-85.63373,41.946004]},n2604:{id:"n2604",loc:[-85.633947,41.946081]},n2605:{id:"n2605",loc:[-85.633872,41.945917]},n2606:{id:"n2606",loc:[-85.633825,41.945985]},n2607:{id:"n2607",loc:[-85.633762,41.94596]},n2608:{id:"n2608",loc:[-85.634224,41.946037]},n2609:{id:"n2609",loc:[-85.634357,41.945851]},n261:{id:"n261",loc:[-85.636828,41.941584]},n2610:{id:"n2610",loc:[-85.634398,41.945813]},n2611:{id:"n2611",loc:[-85.634461,41.945812]},n2612:{id:"n2612",loc:[-85.634501,41.945852]},n2613:{id:"n2613",loc:[-85.634503,41.94597]},n2614:{id:"n2614",loc:[-85.634462,41.945971]},n2615:{id:"n2615",loc:[-85.634465,41.946036]},n2616:{id:"n2616",loc:[-85.634235,41.946072]},n2617:{id:"n2617",loc:[-85.634447,41.946036]},n2618:{id:"n2618",loc:[-85.634448,41.946052]},n2619:{id:"n2619",loc:[-85.634494,41.946051]},n262:{id:"n262",loc:[-85.636819,41.941585]},n2620:{id:"n2620",loc:[-85.634497,41.946144]},n2621:{id:"n2621",loc:[-85.634453,41.946144]},n2622:{id:"n2622",loc:[-85.634454,41.94616]},n2623:{id:"n2623",loc:[-85.634393,41.946161]},n2624:{id:"n2624",loc:[-85.634394,41.94618]},n2625:{id:"n2625",loc:[-85.634345,41.94618]},n2626:{id:"n2626",loc:[-85.634344,41.946162]},n2627:{id:"n2627",loc:[-85.63427,41.946163]},n2628:{id:"n2628",loc:[-85.634266,41.946071]},n2629:{id:"n2629",loc:[-85.634148,41.946163]},n263:{id:"n263",loc:[-85.636854,41.941714]},n2630:{id:"n2630",loc:[-85.634213,41.946072]},n2631:{id:"n2631",loc:[-85.633293,41.946309]},n2632:{id:"n2632",loc:[-85.633122,41.946239]},n2633:{id:"n2633",loc:[-85.633295,41.946005]},n2634:{id:"n2634",loc:[-85.633395,41.946047]},n2635:{id:"n2635",loc:[-85.633404,41.946035]},n2636:{id:"n2636",loc:[-85.633459,41.946057]},n2637:{id:"n2637",loc:[-85.633387,41.946154]},n2638:{id:"n2638",loc:[-85.633403,41.946161]},n2639:{id:"n2639",loc:[-85.634176,41.946415]},n264:{id:"n264",loc:[-85.636855,41.941774]},n2640:{id:"n2640",loc:[-85.634179,41.946339]},n2641:{id:"n2641",loc:[-85.634455,41.946345]},n2642:{id:"n2642",loc:[-85.634452,41.946422]},n2643:{id:"n2643",loc:[-85.63437,41.946421]},n2644:{id:"n2644",loc:[-85.634367,41.946497]},n2645:{id:"n2645",loc:[-85.634289,41.946495]},n2646:{id:"n2646",loc:[-85.634291,41.946448]},n2647:{id:"n2647",loc:[-85.634269,41.946448]},n2648:{id:"n2648",loc:[-85.63427,41.946417]},n2649:{id:"n2649",loc:[-85.63484,41.946328]},n265:{id:"n265",loc:[-85.636822,41.941774]},n2650:{id:"n2650",loc:[-85.634839,41.946187]},n2651:{id:"n2651",loc:[-85.635148,41.946186]},n2652:{id:"n2652",loc:[-85.635148,41.946216]},n2653:{id:"n2653",loc:[-85.63521,41.946216]},n2654:{id:"n2654",loc:[-85.63521,41.946348]},n2655:{id:"n2655",loc:[-85.635154,41.946348]},n2656:{id:"n2656",loc:[-85.635153,41.946327]},n2657:{id:"n2657",loc:[-85.634037,41.946957]},n2658:{id:"n2658",loc:[-85.634253,41.946953]},n2659:{id:"n2659",loc:[-85.63481,41.946543]},n266:{id:"n266",loc:[-85.636822,41.941778]},n2660:{id:"n2660",loc:[-85.634809,41.946459]},n2661:{id:"n2661",loc:[-85.635154,41.946458]},n2662:{id:"n2662",loc:[-85.635155,41.946554]},n2663:{id:"n2663",loc:[-85.635022,41.946547]},n2664:{id:"n2664",loc:[-85.635022,41.946573]},n2665:{id:"n2665",loc:[-85.634909,41.946574]},n2666:{id:"n2666",loc:[-85.634909,41.946561]},n2667:{id:"n2667",loc:[-85.634896,41.947159]},n2668:{id:"n2668",loc:[-85.634894,41.947032]},n2669:{id:"n2669",loc:[-85.635024,41.947031]},n267:{id:"n267",loc:[-85.636756,41.941779]},n2670:{id:"n2670",loc:[-85.635026,41.947158]},n2671:{id:"n2671",loc:[-85.635233,41.947105]},n2672:{id:"n2672",loc:[-85.635236,41.946991]},n2673:{id:"n2673",loc:[-85.635369,41.946993]},n2674:{id:"n2674",loc:[-85.635366,41.947107]},n2675:{id:"n2675",loc:[-85.634824,41.946929]},n2676:{id:"n2676",loc:[-85.634825,41.946818]},n2677:{id:"n2677",loc:[-85.63512,41.946819]},n2678:{id:"n2678",loc:[-85.635119,41.94693]},n2679:{id:"n2679",loc:[-85.634796,41.946806]},n268:{id:"n268",loc:[-85.636756,41.941774]},n2680:{id:"n2680",loc:[-85.634792,41.946604]},n2681:{id:"n2681",loc:[-85.634948,41.946602]},n2682:{id:"n2682",loc:[-85.634949,41.946645]},n2683:{id:"n2683",loc:[-85.634975,41.946644]},n2684:{id:"n2684",loc:[-85.634974,41.946599]},n2685:{id:"n2685",loc:[-85.635117,41.946598]},n2686:{id:"n2686",loc:[-85.635122,41.946801]},n2687:{id:"n2687",loc:[-85.634981,41.946803]},n2688:{id:"n2688",loc:[-85.634979,41.946752]},n2689:{id:"n2689",loc:[-85.634952,41.946752]},n269:{id:"n269",loc:[-85.636721,41.941774]},n2690:{id:"n2690",loc:[-85.634953,41.946804]},n2691:{id:"n2691",loc:[-85.634649,41.946841]},n2692:{id:"n2692",loc:[-85.634331,41.94684]},n2693:{id:"n2693",loc:[-85.634183,41.946809]},n2694:{id:"n2694",loc:[-85.633699,41.946607]},n2695:{id:"n2695",loc:[-85.634487,41.946664]},n2696:{id:"n2696",loc:[-85.634486,41.946598]},n2697:{id:"n2697",loc:[-85.63423,41.946599]},n2698:{id:"n2698",loc:[-85.634231,41.946662]},n2699:{id:"n2699",loc:[-85.634284,41.946662]},n27:{id:"n27",loc:[-85.634136,41.943183]},n270:{id:"n270",loc:[-85.63672,41.941714]},n2700:{id:"n2700",loc:[-85.634284,41.946679]},n2701:{id:"n2701",loc:[-85.634365,41.946679]},n2702:{id:"n2702",loc:[-85.634365,41.946664]},n2703:{id:"n2703",loc:[-85.635443,41.947015]},n2704:{id:"n2704",loc:[-85.635442,41.946801]},n2705:{id:"n2705",loc:[-85.63603,41.9468]},n2706:{id:"n2706",loc:[-85.636028,41.947016]},n2707:{id:"n2707",loc:[-85.635457,41.946582]},n2708:{id:"n2708",loc:[-85.635455,41.946211]},n2709:{id:"n2709",loc:[-85.635636,41.946579]},n271:{id:"n271",loc:[-85.636767,41.941713]},n2710:{id:"n2710",loc:[-85.635716,41.9468]},n2711:{id:"n2711",loc:[-85.635969,41.9468]},n2712:{id:"n2712",loc:[-85.635973,41.946295]},n2713:{id:"n2713",loc:[-85.636019,41.946484]},n2714:{id:"n2714",loc:[-85.636022,41.946388]},n2715:{id:"n2715",loc:[-85.635961,41.946493]},n2716:{id:"n2716",loc:[-85.635713,41.94621]},n2717:{id:"n2717",loc:[-85.635416,41.946142]},n2718:{id:"n2718",loc:[-85.635759,41.946203]},n2719:{id:"n2719",loc:[-85.636153,41.946747]},n272:{id:"n272",loc:[-85.636767,41.941706]},n2720:{id:"n2720",loc:[-85.635417,41.946915]},n2721:{id:"n2721",loc:[-85.636154,41.946915]},n2722:{id:"n2722",loc:[-85.635866,41.946473]},n2723:{id:"n2723",loc:[-85.635717,41.946633]},n2724:{id:"n2724",loc:[-85.635556,41.946166]},n2725:{id:"n2725",loc:[-85.63556,41.946556]},n2726:{id:"n2726",loc:[-85.635731,41.946594]},n2727:{id:"n2727",loc:[-85.635866,41.946595]},n2728:{id:"n2728",loc:[-85.635456,41.947028]},n2729:{id:"n2729",loc:[-85.635796,41.947023]},n273:{id:"n273",loc:[-85.636779,41.941698]},n2730:{id:"n2730",loc:[-85.635798,41.947091]},n2731:{id:"n2731",loc:[-85.63573,41.947092]},n2732:{id:"n2732",loc:[-85.635733,41.947233]},n2733:{id:"n2733",loc:[-85.636283,41.946863]},n2734:{id:"n2734",loc:[-85.63628,41.946706]},n2735:{id:"n2735",loc:[-85.636341,41.946705]},n2736:{id:"n2736",loc:[-85.636273,41.946584]},n2737:{id:"n2737",loc:[-85.636396,41.946545]},n2738:{id:"n2738",loc:[-85.636474,41.946684]},n2739:{id:"n2739",loc:[-85.636511,41.946861]},n274:{id:"n274",loc:[-85.636798,41.941697]},n2740:{id:"n2740",loc:[-85.633713,41.947184]},n2741:{id:"n2741",loc:[-85.633651,41.94716]},n2742:{id:"n2742",loc:[-85.633704,41.947085]},n2743:{id:"n2743",loc:[-85.6336,41.947044]},n2744:{id:"n2744",loc:[-85.633506,41.947177]},n2745:{id:"n2745",loc:[-85.629586,41.952469]},n2746:{id:"n2746",loc:[-85.634723,41.953681]},n2747:{id:"n2747",loc:[-85.63478,41.959007]},n2748:{id:"n2748",loc:[-85.632793,41.94405],tags:{highway:"traffic_signals",traffic_signals:"signal","traffic_signals:direction":"both"}},n2749:{id:"n2749",loc:[-85.634648,41.947325]},n275:{id:"n275",loc:[-85.63681,41.941705]},n2750:{id:"n2750",loc:[-85.625078,41.952097]},n2751:{id:"n2751",loc:[-85.633195,41.94734]},n2752:{id:"n2752",loc:[-85.626447,41.957168]},n2753:{id:"n2753",loc:[-85.632023,41.949012]},n2754:{id:"n2754",loc:[-85.630835,41.950656]},n2755:{id:"n2755",loc:[-85.634655,41.948612]},n2756:{id:"n2756",loc:[-85.636182,41.948605]},n2757:{id:"n2757",loc:[-85.634729,41.954667]},n2758:{id:"n2758",loc:[-85.634686,41.951159]},n2759:{id:"n2759",loc:[-85.636206,41.951146]},n276:{id:"n276",loc:[-85.63681,41.941714]},n2760:{id:"n2760",loc:[-85.634668,41.949891]},n2761:{id:"n2761",loc:[-85.634701,41.952422]},n2762:{id:"n2762",loc:[-85.634747,41.955907]},n2763:{id:"n2763",loc:[-85.627975,41.954695]},n2764:{id:"n2764",loc:[-85.626832,41.954698]},n2765:{id:"n2765",loc:[-85.632278,41.948624]},n2766:{id:"n2766",loc:[-85.628639,41.953725]},n2767:{id:"n2767",loc:[-85.636233,41.95241]},n2768:{id:"n2768",loc:[-85.631385,41.949913]},n2769:{id:"n2769",loc:[-85.630486,41.951194]},n277:{id:"n277",loc:[-85.636861,41.942041]},n2770:{id:"n2770",loc:[-85.624937,41.952088]},n2771:{id:"n2771",loc:[-85.624945,41.952022]},n2772:{id:"n2772",loc:[-85.636162,41.94731]},n2773:{id:"n2773",loc:[-85.636188,41.949881]},n2774:{id:"n2774",loc:[-85.631422,41.948294]},n2775:{id:"n2775",loc:[-85.632844,41.945547]},n2776:{id:"n2776",loc:[-85.632484,41.945344]},n2777:{id:"n2777",loc:[-85.631775,41.944636]},n2778:{id:"n2778",loc:[-85.632656,41.945471]},n2779:{id:"n2779",loc:[-85.631959,41.944827]},n278:{id:"n278",loc:[-85.636862,41.942099]},n2780:{id:"n2780",loc:[-85.631679,41.94438]},n2781:{id:"n2781",loc:[-85.625129,41.959272]},n2782:{id:"n2782",loc:[-85.632446,41.944861]},n2783:{id:"n2783",loc:[-85.632804,41.945477]},n2784:{id:"n2784",loc:[-85.632255,41.944962]},n2785:{id:"n2785",loc:[-85.632736,41.944757]},n2786:{id:"n2786",loc:[-85.632543,41.94486]},n2787:{id:"n2787",loc:[-85.632889,41.945561]},n2788:{id:"n2788",loc:[-85.632091,41.944949]},n2789:{id:"n2789",loc:[-85.632537,41.944713]},n279:{id:"n279",loc:[-85.636807,41.942099]},n2790:{id:"n2790",loc:[-85.632279,41.94485]},n2791:{id:"n2791",loc:[-85.632749,41.943247]},n2792:{id:"n2792",loc:[-85.632824,41.943152]},n2793:{id:"n2793",loc:[-85.632929,41.94317]},n2794:{id:"n2794",loc:[-85.632897,41.943078]},n2795:{id:"n2795",loc:[-85.632626,41.943231]},n2796:{id:"n2796",loc:[-85.634048,41.947257]},n2797:{id:"n2797",loc:[-85.634264,41.947252]},n2798:{id:"n2798",loc:[-85.635418,41.947317]},n2799:{id:"n2799",loc:[-85.635461,41.947237]},n28:{id:"n28",loc:[-85.63821,41.944308]},n280:{id:"n280",loc:[-85.636807,41.942126]},n2800:{id:"n2800",loc:[-85.632868,41.946229]},n2801:{id:"n2801",loc:[-85.633673,41.947242]},n2802:{id:"n2802",loc:[-85.623604,41.945881],tags:{amenity:"school",name:"Barrows School"}},n2803:{id:"n2803",loc:[-85.627401,41.943496]},n2804:{id:"n2804",loc:[-85.627403,41.943625]},n2805:{id:"n2805",loc:[-85.626409,41.943215]},n2806:{id:"n2806",loc:[-85.624884,41.943508]},n2807:{id:"n2807",loc:[-85.625191,41.943509]},n2808:{id:"n2808",loc:[-85.624882,41.94382]},n2809:{id:"n2809",loc:[-85.624893,41.945618]},n281:{id:"n281",loc:[-85.636726,41.942126]},n2810:{id:"n2810",loc:[-85.624912,41.946524]},n2811:{id:"n2811",loc:[-85.622721,41.946535]},n2812:{id:"n2812",loc:[-85.627399,41.94469]},n2813:{id:"n2813",loc:[-85.622716,41.945622]},n2814:{id:"n2814",loc:[-85.624886,41.944724]},n2815:{id:"n2815",loc:[-85.622674,41.944737]},n2816:{id:"n2816",loc:[-85.625092,41.945063]},n2817:{id:"n2817",loc:[-85.625233,41.945064]},n2818:{id:"n2818",loc:[-85.625229,41.944871]},n2819:{id:"n2819",loc:[-85.625066,41.944871]},n282:{id:"n282",loc:[-85.636726,41.942098]},n2820:{id:"n2820",loc:[-85.625024,41.944901]},n2821:{id:"n2821",loc:[-85.625025,41.944924]},n2822:{id:"n2822",loc:[-85.625087,41.944926]},n2823:{id:"n2823",loc:[-85.625349,41.944506]},n2824:{id:"n2824",loc:[-85.625347,41.944388]},n2825:{id:"n2825",loc:[-85.625152,41.94439]},n2826:{id:"n2826",loc:[-85.625152,41.944431]},n2827:{id:"n2827",loc:[-85.625134,41.944431]},n2828:{id:"n2828",loc:[-85.625136,41.944508]},n2829:{id:"n2829",loc:[-85.623236,41.946341]},n283:{id:"n283",loc:[-85.636708,41.942098]},n2830:{id:"n2830",loc:[-85.623241,41.946067]},n2831:{id:"n2831",loc:[-85.623207,41.946067]},n2832:{id:"n2832",loc:[-85.623212,41.945827]},n2833:{id:"n2833",loc:[-85.622981,41.945825]},n2834:{id:"n2834",loc:[-85.622976,41.946063]},n2835:{id:"n2835",loc:[-85.623006,41.946063]},n2836:{id:"n2836",loc:[-85.623002,41.946256]},n2837:{id:"n2837",loc:[-85.623075,41.946256]},n2838:{id:"n2838",loc:[-85.623074,41.946339]},n2839:{id:"n2839",loc:[-85.624574,41.951755]},n284:{id:"n284",loc:[-85.636708,41.942041]},n2840:{id:"n2840",loc:[-85.62498,41.951844]},n2841:{id:"n2841",loc:[-85.625086,41.95188]},n2842:{id:"n2842",loc:[-85.625135,41.951922]},n2843:{id:"n2843",loc:[-85.615273,41.945637]},n2844:{id:"n2844",loc:[-85.620172,41.945627]},n2845:{id:"n2845",loc:[-85.625167,41.951985]},n2846:{id:"n2846",loc:[-85.622741,41.947437]},n2847:{id:"n2847",loc:[-85.624907,41.947428]},n2848:{id:"n2848",loc:[-85.627046,41.940995]},n2849:{id:"n2849",loc:[-85.627295,41.941304]},n285:{id:"n285",loc:[-85.635618,41.941852]},n2850:{id:"n2850",loc:[-85.627352,41.94148]},n2851:{id:"n2851",loc:[-85.62737,41.942261]},n2852:{id:"n2852",loc:[-85.6264,41.942263]},n2853:{id:"n2853",loc:[-85.622769,41.949228]},n2854:{id:"n2854",loc:[-85.624937,41.949218]},n2855:{id:"n2855",loc:[-85.630001,41.944664]},n2856:{id:"n2856",loc:[-85.624873,41.942022]},n2857:{id:"n2857",loc:[-85.622761,41.948333]},n2858:{id:"n2858",loc:[-85.624924,41.948334]},n2859:{id:"n2859",loc:[-85.620051,41.94383]},n286:{id:"n286",loc:[-85.635621,41.94202]},n2860:{id:"n2860",loc:[-85.627629,41.946498]},n2861:{id:"n2861",loc:[-85.622757,41.950111]},n2862:{id:"n2862",loc:[-85.623685,41.954624]},n2863:{id:"n2863",loc:[-85.621459,41.944756]},n2864:{id:"n2864",loc:[-85.628637,41.944676]},n2865:{id:"n2865",loc:[-85.630125,41.944654]},n2866:{id:"n2866",loc:[-85.625196,41.952097]},n2867:{id:"n2867",loc:[-85.630257,41.944637]},n2868:{id:"n2868",loc:[-85.631247,41.944459]},n2869:{id:"n2869",loc:[-85.624867,41.94159]},n287:{id:"n287",loc:[-85.63524,41.942023]},n2870:{id:"n2870",loc:[-85.624958,41.950343]},n2871:{id:"n2871",loc:[-85.624948,41.950484]},n2872:{id:"n2872",loc:[-85.624813,41.950983]},n2873:{id:"n2873",loc:[-85.624723,41.951789]},n2874:{id:"n2874",loc:[-85.624262,41.9512]},n2875:{id:"n2875",loc:[-85.62414,41.951201]},n2876:{id:"n2876",loc:[-85.624139,41.95112]},n2877:{id:"n2877",loc:[-85.628481,41.945611]},n2878:{id:"n2878",loc:[-85.620072,41.946538]},n2879:{id:"n2879",loc:[-85.622763,41.95099]},n288:{id:"n288",loc:[-85.635237,41.941855]},n2880:{id:"n2880",loc:[-85.62814,41.946963]},n2881:{id:"n2881",loc:[-85.628245,41.947031]},n2882:{id:"n2882",loc:[-85.628331,41.947066]},n2883:{id:"n2883",loc:[-85.629722,41.944444],tags:{leisure:"park",name:"Scouter Park"}},n2884:{id:"n2884",loc:[-85.629977,41.943907]},n2885:{id:"n2885",loc:[-85.629947,41.943775]},n2886:{id:"n2886",loc:[-85.629899,41.943625]},n2887:{id:"n2887",loc:[-85.632286,41.944257]},n2888:{id:"n2888",loc:[-85.632523,41.944179]},n2889:{id:"n2889",loc:[-85.632141,41.944293]},n289:{id:"n289",loc:[-85.635568,41.940475]},n2890:{id:"n2890",loc:[-85.631571,41.9444]},n2891:{id:"n2891",loc:[-85.643236,41.941895]},n2892:{id:"n2892",loc:[-85.62865,41.945353]},n2893:{id:"n2893",loc:[-85.628594,41.945481]},n2894:{id:"n2894",loc:[-85.628581,41.947169]},n2895:{id:"n2895",loc:[-85.631843,41.943793]},n2896:{id:"n2896",loc:[-85.632299,41.943472]},n2897:{id:"n2897",loc:[-85.631519,41.944881]},n2898:{id:"n2898",loc:[-85.628429,41.947219]},n2899:{id:"n2899",loc:[-85.63145,41.945162]},n29:{id:"n29",loc:[-85.637963,41.944263]},n290:{id:"n290",loc:[-85.634584,41.940477]},n2900:{id:"n2900",loc:[-85.630939,41.945519]},n2901:{id:"n2901",loc:[-85.62903,41.945719]},n2902:{id:"n2902",loc:[-85.630521,41.945559]},n2903:{id:"n2903",loc:[-85.629294,41.945585]},n2904:{id:"n2904",loc:[-85.629845,41.945543]},n2905:{id:"n2905",loc:[-85.631497,41.944625]},n2906:{id:"n2906",loc:[-85.630281,41.945553]},n2907:{id:"n2907",loc:[-85.628553,41.946973]},n2908:{id:"n2908",loc:[-85.631383,41.945338]},n2909:{id:"n2909",loc:[-85.628843,41.946103]},n291:{id:"n291",loc:[-85.634583,41.940203]},n2910:{id:"n2910",loc:[-85.631193,41.945473]},n2911:{id:"n2911",loc:[-85.628897,41.945944]},n2912:{id:"n2912",loc:[-85.628789,41.946454]},n2913:{id:"n2913",loc:[-85.632548,41.944563]},n2914:{id:"n2914",loc:[-85.627527,41.944555]},n2915:{id:"n2915",loc:[-85.62752,41.943726]},n2916:{id:"n2916",loc:[-85.627894,41.943723]},n2917:{id:"n2917",loc:[-85.627897,41.943919]},n2918:{id:"n2918",loc:[-85.627991,41.943934]},n2919:{id:"n2919",loc:[-85.628082,41.943966]},n292:{id:"n292",loc:[-85.635567,41.940201]},n2920:{id:"n2920",loc:[-85.628177,41.944015]},n2921:{id:"n2921",loc:[-85.628193,41.944048]},n2922:{id:"n2922",loc:[-85.628167,41.944054]},n2923:{id:"n2923",loc:[-85.628193,41.944094]},n2924:{id:"n2924",loc:[-85.628213,41.944144]},n2925:{id:"n2925",loc:[-85.628214,41.944199]},n2926:{id:"n2926",loc:[-85.62833,41.944196]},n2927:{id:"n2927",loc:[-85.628328,41.944262]},n2928:{id:"n2928",loc:[-85.628173,41.944262]},n2929:{id:"n2929",loc:[-85.628171,41.944293]},n293:{id:"n293",loc:[-85.635818,41.942677],tags:{crossing:"marked",highway:"crossing"}},n2930:{id:"n2930",loc:[-85.628039,41.944296]},n2931:{id:"n2931",loc:[-85.62804,41.944329]},n2932:{id:"n2932",loc:[-85.627829,41.944335]},n2933:{id:"n2933",loc:[-85.627835,41.94455]},n2936:{id:"n2936",loc:[-85.632823,41.945994]},n294:{id:"n294",loc:[-85.635696,41.942712]},n2940:{id:"n2940",loc:[-85.632192,41.945973]},n2941:{id:"n2941",loc:[-85.63226,41.94587]},n2942:{id:"n2942",loc:[-85.632721,41.946036]},n2943:{id:"n2943",loc:[-85.632641,41.946142]},n2944:{id:"n2944",loc:[-85.62937,41.947467]},n2945:{id:"n2945",loc:[-85.62959,41.942936]},n2946:{id:"n2946",loc:[-85.629551,41.94284]},n2947:{id:"n2947",loc:[-85.629501,41.942704]},n2948:{id:"n2948",loc:[-85.629472,41.942578]},n2949:{id:"n2949",loc:[-85.629361,41.941801]},n295:{id:"n295",loc:[-85.635679,41.941962]},n2950:{id:"n2950",loc:[-85.629339,41.941716]},n2951:{id:"n2951",loc:[-85.629315,41.94166]},n2952:{id:"n2952",loc:[-85.629279,41.941602]},n2953:{id:"n2953",loc:[-85.629227,41.941556]},n2954:{id:"n2954",loc:[-85.624261,41.95112]},n2955:{id:"n2955",loc:[-85.629153,41.941524]},n2956:{id:"n2956",loc:[-85.626904,41.941098]},n2957:{id:"n2957",loc:[-85.624588,41.951294]},n2958:{id:"n2958",loc:[-85.631844,41.942945]},n2959:{id:"n2959",loc:[-85.625854,41.949222]},n296:{id:"n296",loc:[-85.635672,41.941337]},n2960:{id:"n2960",loc:[-85.625146,41.955238]},n2961:{id:"n2961",loc:[-85.626745,41.948296]},n2962:{id:"n2962",loc:[-85.625721,41.95524]},n2963:{id:"n2963",loc:[-85.624706,41.952317]},n2964:{id:"n2964",loc:[-85.62609,41.956147]},n2965:{id:"n2965",loc:[-85.624401,41.954928]},n2966:{id:"n2966",loc:[-85.626558,41.955367]},n2967:{id:"n2967",loc:[-85.62468,41.955096]},n2968:{id:"n2968",loc:[-85.624159,41.953929]},n2969:{id:"n2969",loc:[-85.62506,41.951113]},n297:{id:"n297",loc:[-85.635658,41.941284]},n2970:{id:"n2970",loc:[-85.624942,41.951591]},n2971:{id:"n2971",loc:[-85.627399,41.947546]},n2972:{id:"n2972",loc:[-85.627695,41.947404]},n2973:{id:"n2973",loc:[-85.625925,41.94896]},n2974:{id:"n2974",loc:[-85.625725,41.950211]},n2975:{id:"n2975",loc:[-85.627008,41.947963]},n2976:{id:"n2976",loc:[-85.624373,41.953458]},n2977:{id:"n2977",loc:[-85.624137,41.954392]},n2978:{id:"n2978",loc:[-85.628257,41.947307]},n2979:{id:"n2979",loc:[-85.625281,41.95066]},n298:{id:"n298",loc:[-85.635602,41.941166]},n2980:{id:"n2980",loc:[-85.625865,41.949804]},n2981:{id:"n2981",loc:[-85.626508,41.955932]},n2982:{id:"n2982",loc:[-85.626333,41.955216]},n2983:{id:"n2983",loc:[-85.626637,41.955676]},n2984:{id:"n2984",loc:[-85.624223,41.954599]},n2985:{id:"n2985",loc:[-85.626219,41.948671]},n2986:{id:"n2986",loc:[-85.624556,41.953043]},n2987:{id:"n2987",loc:[-85.625598,41.956302]},n2988:{id:"n2988",loc:[-85.624571,41.952971]},n2989:{id:"n2989",loc:[-85.627141,41.940727]},n299:{id:"n299",loc:[-85.635598,41.941138]},n2990:{id:"n2990",loc:[-85.627102,41.939144]},n2991:{id:"n2991",loc:[-85.627127,41.940086]},n2992:{id:"n2992",loc:[-85.627116,41.940843]},n2993:{id:"n2993",loc:[-85.627132,41.9402]},n2994:{id:"n2994",loc:[-85.629734,41.940078]},n2995:{id:"n2995",loc:[-85.6276,41.937412]},n2996:{id:"n2996",loc:[-85.627451,41.937549]},n2997:{id:"n2997",loc:[-85.627375,41.937618]},n2998:{id:"n2998",loc:[-85.627278,41.937728]},n2999:{id:"n2999",loc:[-85.627199,41.937842]},n3:{id:"n3",loc:[-85.627345,41.953983]},n30:{id:"n30",loc:[-85.637882,41.944205]},n300:{id:"n300",loc:[-85.635614,41.941076]},n3000:{id:"n3000",loc:[-85.627141,41.937981]},n3001:{id:"n3001",loc:[-85.627109,41.938153]},n3002:{id:"n3002",loc:[-85.627101,41.938699]},n3003:{id:"n3003",loc:[-85.628311,41.942261]},n3004:{id:"n3004",loc:[-85.628439,41.940082]},n3005:{id:"n3005",loc:[-85.619538,41.942622],tags:{leisure:"slipway"}},n3006:{id:"n3006",loc:[-85.619872,41.942618]},n3007:{id:"n3007",loc:[-85.619755,41.942612]},n3008:{id:"n3008",loc:[-85.619647,41.942628]},n3009:{id:"n3009",loc:[-85.619415,41.942626]},n301:{id:"n301",loc:[-85.635659,41.940956]},n3010:{id:"n3010",loc:[-85.619212,41.942623]},n3011:{id:"n3011",loc:[-85.631485,41.942472]},n3012:{id:"n3012",loc:[-85.630986,41.941786]},n3013:{id:"n3013",loc:[-85.631797,41.942006]},n3014:{id:"n3014",loc:[-85.630972,41.941162]},n3015:{id:"n3015",loc:[-85.631396,41.941611],tags:{railway:"level_crossing"}},n3016:{id:"n3016",loc:[-85.631878,41.941545]},n3017:{id:"n3017",loc:[-85.630461,41.94055]},n3018:{id:"n3018",loc:[-85.629751,41.939539],tags:{railway:"level_crossing"}},n3019:{id:"n3019",loc:[-85.631663,41.941513]},n302:{id:"n302",loc:[-85.635666,41.940922]},n3020:{id:"n3020",loc:[-85.631328,41.941375]},n3021:{id:"n3021",loc:[-85.632554,41.941779]},n3022:{id:"n3022",loc:[-85.63245,41.941769]},n3023:{id:"n3023",loc:[-85.632475,41.941644]},n3024:{id:"n3024",loc:[-85.632581,41.941654]},n3025:{id:"n3025",loc:[-85.631957,41.941352]},n3026:{id:"n3026",loc:[-85.632293,41.941139]},n3027:{id:"n3027",loc:[-85.632315,41.941153]},n3028:{id:"n3028",loc:[-85.632302,41.941262]},n3029:{id:"n3029",loc:[-85.63237,41.941267]},n303:{id:"n303",loc:[-85.635667,41.940877]},n3030:{id:"n3030",loc:[-85.632356,41.941538]},n3031:{id:"n3031",loc:[-85.632134,41.941678]},n3032:{id:"n3032",loc:[-85.631942,41.941687]},n3033:{id:"n3033",loc:[-85.63203,41.941694]},n3034:{id:"n3034",loc:[-85.632166,41.941555]},n3035:{id:"n3035",loc:[-85.632412,41.941416]},n3036:{id:"n3036",loc:[-85.63248,41.941342]},n3037:{id:"n3037",loc:[-85.632502,41.941259]},n3038:{id:"n3038",loc:[-85.632453,41.941161]},n3039:{id:"n3039",loc:[-85.63235,41.941103]},n304:{id:"n304",loc:[-85.635668,41.940655]},n3040:{id:"n3040",loc:[-85.632236,41.941118]},n3041:{id:"n3041",loc:[-85.631894,41.941355]},n3042:{id:"n3042",loc:[-85.631859,41.941411]},n3043:{id:"n3043",loc:[-85.632011,41.941587]},n3044:{id:"n3044",loc:[-85.632446,41.941379]},n3045:{id:"n3045",loc:[-85.632511,41.941416]},n3046:{id:"n3046",loc:[-85.632545,41.941634]},n3047:{id:"n3047",loc:[-85.632612,41.94164]},n3048:{id:"n3048",loc:[-85.632595,41.942197]},n3049:{id:"n3049",loc:[-85.632565,41.942241]},n305:{id:"n305",loc:[-85.635628,41.940617]},n3050:{id:"n3050",loc:[-85.632515,41.942256]},n3051:{id:"n3051",loc:[-85.63245,41.94223]},n3052:{id:"n3052",loc:[-85.632401,41.942174]},n3053:{id:"n3053",loc:[-85.632391,41.942115]},n3054:{id:"n3054",loc:[-85.632029,41.941859]},n3055:{id:"n3055",loc:[-85.631828,41.941639]},n3056:{id:"n3056",loc:[-85.631829,41.941508]},n3057:{id:"n3057",loc:[-85.631281,41.94312]},n3058:{id:"n3058",loc:[-85.631421,41.943065]},n3059:{id:"n3059",loc:[-85.631339,41.942949]},n306:{id:"n306",loc:[-85.635623,41.940272]},n3060:{id:"n3060",loc:[-85.631199,41.943004]},n3061:{id:"n3061",loc:[-85.631102,41.942931]},n3062:{id:"n3062",loc:[-85.631009,41.942809]},n3063:{id:"n3063",loc:[-85.631383,41.94265]},n3064:{id:"n3064",loc:[-85.631477,41.942773]},n3065:{id:"n3065",loc:[-85.630638,41.942809]},n3066:{id:"n3066",loc:[-85.630738,41.942943]},n3067:{id:"n3067",loc:[-85.630841,41.9429]},n3068:{id:"n3068",loc:[-85.630741,41.942766]},n3069:{id:"n3069",loc:[-85.63054,41.942603]},n307:{id:"n307",loc:[-85.635651,41.940183]},n3070:{id:"n3070",loc:[-85.630498,41.942619]},n3071:{id:"n3071",loc:[-85.630567,41.942718]},n3072:{id:"n3072",loc:[-85.630616,41.942698]},n3073:{id:"n3073",loc:[-85.630642,41.94273]},n3074:{id:"n3074",loc:[-85.630686,41.942714]},n3075:{id:"n3075",loc:[-85.630715,41.942754]},n3076:{id:"n3076",loc:[-85.6309,41.942681]},n3077:{id:"n3077",loc:[-85.630843,41.942605]},n3078:{id:"n3078",loc:[-85.6309,41.942581]},n3079:{id:"n3079",loc:[-85.630832,41.942487]},n308:{id:"n308",loc:[-85.635777,41.940183],tags:{crossing:"marked",highway:"crossing"}},n3080:{id:"n3080",loc:[-85.630773,41.942509]},n3081:{id:"n3081",loc:[-85.630718,41.942436]},n3082:{id:"n3082",loc:[-85.630485,41.942524]},n3083:{id:"n3083",loc:[-85.631468,41.941233]},n3084:{id:"n3084",loc:[-85.631334,41.94114]},n3085:{id:"n3085",loc:[-85.632052,41.940568]},n3086:{id:"n3086",loc:[-85.63219,41.940663]},n3087:{id:"n3087",loc:[-85.631323,41.940834]},n3088:{id:"n3088",loc:[-85.631122,41.941002]},n3089:{id:"n3089",loc:[-85.631321,41.941133]},n309:{id:"n309",loc:[-85.636939,41.942544]},n3090:{id:"n3090",loc:[-85.631521,41.940966]},n3091:{id:"n3091",loc:[-85.631103,41.940253]},n3092:{id:"n3092",loc:[-85.631226,41.940211]},n3093:{id:"n3093",loc:[-85.631597,41.940805]},n3094:{id:"n3094",loc:[-85.631474,41.940847]},n3095:{id:"n3095",loc:[-85.631811,41.940534]},n3096:{id:"n3096",loc:[-85.631588,41.94061]},n3097:{id:"n3097",loc:[-85.631438,41.940366]},n3098:{id:"n3098",loc:[-85.631661,41.94029]},n3099:{id:"n3099",loc:[-85.630621,41.940041]},n31:{id:"n31",loc:[-85.63827,41.944203]},n310:{id:"n310",loc:[-85.636323,41.942552]},n3100:{id:"n3100",loc:[-85.630436,41.939773]},n3101:{id:"n3101",loc:[-85.63059,41.939714]},n3102:{id:"n3102",loc:[-85.630775,41.939983]},n3103:{id:"n3103",loc:[-85.63047,41.940167]},n3104:{id:"n3104",loc:[-85.63013,41.939686]},n3105:{id:"n3105",loc:[-85.630302,41.939618]},n3106:{id:"n3106",loc:[-85.630641,41.9401]},n3107:{id:"n3107",loc:[-85.630966,41.940619]},n3108:{id:"n3108",loc:[-85.630874,41.940493]},n3109:{id:"n3109",loc:[-85.630933,41.940469]},n311:{id:"n311",loc:[-85.636257,41.942555]},n3110:{id:"n3110",loc:[-85.630763,41.940236]},n3111:{id:"n3111",loc:[-85.63088,41.940189]},n3112:{id:"n3112",loc:[-85.631142,41.940548]},n3113:{id:"n3113",loc:[-85.630958,41.940871]},n3114:{id:"n3114",loc:[-85.630874,41.940778]},n3115:{id:"n3115",loc:[-85.631062,41.940684]},n3116:{id:"n3116",loc:[-85.631146,41.940777]},n3117:{id:"n3117",loc:[-85.632031,41.940575]},n3118:{id:"n3118",loc:[-85.631777,41.940186]},n3119:{id:"n3119",loc:[-85.631346,41.940179]},n312:{id:"n312",loc:[-85.636208,41.942561]},n3120:{id:"n3120",loc:[-85.631342,41.94012]},n3121:{id:"n3121",loc:[-85.631831,41.940118]},n3122:{id:"n3122",loc:[-85.632115,41.940543]},n3123:{id:"n3123",loc:[-85.631031,41.941683]},n3124:{id:"n3124",loc:[-85.630981,41.941608]},n3125:{id:"n3125",loc:[-85.631209,41.941516]},n3126:{id:"n3126",loc:[-85.631264,41.941586]},n3127:{id:"n3127",loc:[-85.630938,41.94155]},n3128:{id:"n3128",loc:[-85.631156,41.941462]},n3129:{id:"n3129",loc:[-85.631197,41.94152]},n313:{id:"n313",loc:[-85.636159,41.942573]},n3130:{id:"n3130",loc:[-85.630895,41.941485]},n3131:{id:"n3131",loc:[-85.630824,41.941389]},n3132:{id:"n3132",loc:[-85.630986,41.941323]},n3133:{id:"n3133",loc:[-85.631057,41.941419]},n3134:{id:"n3134",loc:[-85.630777,41.941328]},n3135:{id:"n3135",loc:[-85.630907,41.941274]},n3136:{id:"n3136",loc:[-85.630953,41.941335]},n3137:{id:"n3137",loc:[-85.630797,41.941247]},n3138:{id:"n3138",loc:[-85.630701,41.94117]},n3139:{id:"n3139",loc:[-85.630829,41.941113]},n314:{id:"n314",loc:[-85.635743,41.942881]},n3140:{id:"n3140",loc:[-85.6309,41.941201]},n3141:{id:"n3141",loc:[-85.630765,41.941206]},n3142:{id:"n3142",loc:[-85.630739,41.941218]},n3143:{id:"n3143",loc:[-85.630582,41.941039]},n3144:{id:"n3144",loc:[-85.630412,41.940818]},n3145:{id:"n3145",loc:[-85.630509,41.940777]},n3146:{id:"n3146",loc:[-85.630678,41.941004]},n3147:{id:"n3147",loc:[-85.630773,41.942166]},n3148:{id:"n3148",loc:[-85.630708,41.942074]},n3149:{id:"n3149",loc:[-85.630863,41.942013]},n315:{id:"n315",loc:[-85.635452,41.942966]},n3150:{id:"n3150",loc:[-85.630928,41.942105]},n3151:{id:"n3151",loc:[-85.630701,41.942026]},n3152:{id:"n3152",loc:[-85.630665,41.941971]},n3153:{id:"n3153",loc:[-85.630793,41.941918]},n3154:{id:"n3154",loc:[-85.630837,41.94197]},n3155:{id:"n3155",loc:[-85.630757,41.941871]},n3156:{id:"n3156",loc:[-85.630629,41.941923]},n3157:{id:"n3157",loc:[-85.630694,41.941783]},n3158:{id:"n3158",loc:[-85.630534,41.941847]},n3159:{id:"n3159",loc:[-85.630598,41.941935]},n316:{id:"n316",loc:[-85.634911,41.943118]},n3160:{id:"n3160",loc:[-85.631548,41.93938]},n3161:{id:"n3161",loc:[-85.631525,41.939919]},n3162:{id:"n3162",loc:[-85.631648,41.940043]},n3163:{id:"n3163",loc:[-85.624586,41.951121]},n3164:{id:"n3164",loc:[-85.622139,41.952064]},n3165:{id:"n3165",loc:[-85.622141,41.952144]},n3166:{id:"n3166",loc:[-85.621977,41.952146]},n3167:{id:"n3167",loc:[-85.621978,41.952211]},n3168:{id:"n3168",loc:[-85.62191,41.952212]},n3169:{id:"n3169",loc:[-85.633628,41.935437]},n317:{id:"n317",loc:[-85.634743,41.943167]},n3170:{id:"n3170",loc:[-85.632849,41.935518]},n3171:{id:"n3171",loc:[-85.632376,41.93574]},n3172:{id:"n3172",loc:[-85.631517,41.935897]},n3173:{id:"n3173",loc:[-85.630433,41.936124]},n3174:{id:"n3174",loc:[-85.630207,41.936427]},n3175:{id:"n3175",loc:[-85.630346,41.936795]},n3176:{id:"n3176",loc:[-85.62996,41.936974]},n3177:{id:"n3177",loc:[-85.629916,41.937488]},n3178:{id:"n3178",loc:[-85.629946,41.937802]},n3179:{id:"n3179",loc:[-85.629977,41.937905]},n318:{id:"n318",loc:[-85.634401,41.94328]},n3180:{id:"n3180",loc:[-85.63016,41.937909]},n3181:{id:"n3181",loc:[-85.630804,41.937791]},n3182:{id:"n3182",loc:[-85.631688,41.937808]},n3183:{id:"n3183",loc:[-85.631685,41.938008]},n3184:{id:"n3184",loc:[-85.631845,41.938116]},n3185:{id:"n3185",loc:[-85.63207,41.938181]},n3186:{id:"n3186",loc:[-85.632143,41.938371]},n3187:{id:"n3187",loc:[-85.632056,41.938435]},n3188:{id:"n3188",loc:[-85.631787,41.938457]},n3189:{id:"n3189",loc:[-85.631657,41.938728]},n319:{id:"n319",loc:[-85.634345,41.943299]},n3190:{id:"n3190",loc:[-85.631595,41.93775]},n3191:{id:"n3191",loc:[-85.630264,41.937839]},n3192:{id:"n3192",loc:[-85.628591,41.948536]},n3193:{id:"n3193",loc:[-85.63205,41.951181]},n3194:{id:"n3194",loc:[-85.632034,41.949909]},n3195:{id:"n3195",loc:[-85.630841,41.951191]},n3196:{id:"n3196",loc:[-85.632083,41.9537]},n3197:{id:"n3197",loc:[-85.630929,41.959037]},n3198:{id:"n3198",loc:[-85.632151,41.959028]},n3199:{id:"n3199",loc:[-85.630911,41.957428]},n32:{id:"n32",loc:[-85.638273,41.944246]},n320:{id:"n320",loc:[-85.634287,41.943326]},n3200:{id:"n3200",loc:[-85.63213,41.957427]},n3201:{id:"n3201",loc:[-85.632072,41.952447]},n3202:{id:"n3202",loc:[-85.632095,41.954677]},n3203:{id:"n3203",loc:[-85.632111,41.955911]},n3204:{id:"n3204",loc:[-85.630855,41.952457]},n3205:{id:"n3205",loc:[-85.630869,41.953709]},n3206:{id:"n3206",loc:[-85.63088,41.954682]},n3207:{id:"n3207",loc:[-85.630894,41.955913]},n3208:{id:"n3208",loc:[-85.633214,41.948619]},n3209:{id:"n3209",loc:[-85.633253,41.951171]},n321:{id:"n321",loc:[-85.634233,41.943354]},n3210:{id:"n3210",loc:[-85.633234,41.949901]},n3211:{id:"n3211",loc:[-85.633922,41.948616]},n3212:{id:"n3212",loc:[-85.625188,41.947832]},n3213:{id:"n3213",loc:[-85.625208,41.947775]},n3214:{id:"n3214",loc:[-85.625229,41.94776]},n3215:{id:"n3215",loc:[-85.625201,41.947749]},n3216:{id:"n3216",loc:[-85.625168,41.947707]},n3217:{id:"n3217",loc:[-85.625171,41.947609]},n3218:{id:"n3218",loc:[-85.625213,41.947564]},n3219:{id:"n3219",loc:[-85.62529,41.94756]},n322:{id:"n322",loc:[-85.634099,41.943429]},n3220:{id:"n3220",loc:[-85.625303,41.947533]},n3221:{id:"n3221",loc:[-85.625344,41.947482]},n3222:{id:"n3222",loc:[-85.625442,41.947468]},n3223:{id:"n3223",loc:[-85.62565,41.947494]},n3224:{id:"n3224",loc:[-85.625726,41.947613]},n3225:{id:"n3225",loc:[-85.625703,41.947728]},n3226:{id:"n3226",loc:[-85.625534,41.94781]},n3227:{id:"n3227",loc:[-85.625391,41.947822]},n3228:{id:"n3228",loc:[-85.625304,41.947859]},n3229:{id:"n3229",loc:[-85.625203,41.947885]},n323:{id:"n323",loc:[-85.633958,41.943507],tags:{highway:"crossing"}},n3230:{id:"n3230",loc:[-85.624691,41.948659]},n3231:{id:"n3231",loc:[-85.624328,41.948661]},n3232:{id:"n3232",loc:[-85.624331,41.949046]},n3233:{id:"n3233",loc:[-85.624694,41.949045]},n3234:{id:"n3234",loc:[-85.623623,41.949606]},n3235:{id:"n3235",loc:[-85.623623,41.9497]},n3236:{id:"n3236",loc:[-85.623357,41.9497]},n3237:{id:"n3237",loc:[-85.623357,41.949614]},n3238:{id:"n3238",loc:[-85.623974,41.949429]},n3239:{id:"n3239",loc:[-85.623974,41.949605]},n324:{id:"n324",loc:[-85.633698,41.943651],tags:{railway:"crossing"}},n3240:{id:"n3240",loc:[-85.624501,41.951226]},n3241:{id:"n3241",loc:[-85.624501,41.951123]},n3242:{id:"n3242",loc:[-85.624319,41.951123]},n3243:{id:"n3243",loc:[-85.624319,41.951226]},n3244:{id:"n3244",loc:[-85.624121,41.950866]},n3245:{id:"n3245",loc:[-85.624115,41.950525]},n3246:{id:"n3246",loc:[-85.624315,41.950523]},n3247:{id:"n3247",loc:[-85.62432,41.950865]},n3248:{id:"n3248",loc:[-85.624393,41.950867]},n3249:{id:"n3249",loc:[-85.62439,41.950596]},n325:{id:"n325",loc:[-85.633508,41.943757]},n3250:{id:"n3250",loc:[-85.624673,41.950594]},n3251:{id:"n3251",loc:[-85.624675,41.95082]},n3252:{id:"n3252",loc:[-85.62451,41.950821]},n3253:{id:"n3253",loc:[-85.62451,41.950866]},n3254:{id:"n3254",loc:[-85.624101,41.949346]},n3255:{id:"n3255",loc:[-85.624244,41.949346]},n3256:{id:"n3256",loc:[-85.624244,41.949368]},n3257:{id:"n3257",loc:[-85.62434,41.949368]},n3258:{id:"n3258",loc:[-85.624342,41.949351]},n3259:{id:"n3259",loc:[-85.624725,41.949348]},n326:{id:"n326",loc:[-85.634839,41.942974]},n3260:{id:"n3260",loc:[-85.624755,41.950495]},n3261:{id:"n3261",loc:[-85.624121,41.950502]},n3262:{id:"n3262",loc:[-85.625453,41.950163]},n3263:{id:"n3263",loc:[-85.625454,41.949976]},n3264:{id:"n3264",loc:[-85.625549,41.949977]},n3265:{id:"n3265",loc:[-85.62555,41.949833]},n3266:{id:"n3266",loc:[-85.625577,41.949833]},n3267:{id:"n3267",loc:[-85.625578,41.949656]},n3268:{id:"n3268",loc:[-85.625195,41.949655]},n3269:{id:"n3269",loc:[-85.625192,41.950162]},n327:{id:"n327",loc:[-85.634657,41.943028]},n3270:{id:"n3270",loc:[-85.622992,41.949614]},n3271:{id:"n3271",loc:[-85.622991,41.949431]},n3272:{id:"n3272",loc:[-85.620103,41.951]},n3273:{id:"n3273",loc:[-85.605644,41.947468]},n3274:{id:"n3274",loc:[-85.617421,41.947457]},n3275:{id:"n3275",loc:[-85.620078,41.947444]},n3276:{id:"n3276",loc:[-85.620087,41.94924]},n3277:{id:"n3277",loc:[-85.62156,41.948333]},n3278:{id:"n3278",loc:[-85.620106,41.950132]},n3279:{id:"n3279",loc:[-85.637412,41.951136]},n328:{id:"n328",loc:[-85.634222,41.943152]},n3280:{id:"n3280",loc:[-85.635429,41.948608]},n3281:{id:"n3281",loc:[-85.635047,41.947788]},n3282:{id:"n3282",loc:[-85.635048,41.947796]},n3283:{id:"n3283",loc:[-85.635002,41.947797]},n3284:{id:"n3284",loc:[-85.635002,41.947788]},n3285:{id:"n3285",loc:[-85.634914,41.94779]},n3286:{id:"n3286",loc:[-85.634913,41.947753]},n3287:{id:"n3287",loc:[-85.63494,41.947753]},n3288:{id:"n3288",loc:[-85.634938,41.947708]},n3289:{id:"n3289",loc:[-85.635124,41.947705]},n329:{id:"n329",loc:[-85.634099,41.943202]},n3290:{id:"n3290",loc:[-85.635126,41.947787]},n3291:{id:"n3291",loc:[-85.634972,41.947599]},n3292:{id:"n3292",loc:[-85.634921,41.9476]},n3293:{id:"n3293",loc:[-85.63485,41.947546]},n3294:{id:"n3294",loc:[-85.63485,41.947508]},n3295:{id:"n3295",loc:[-85.634924,41.947457]},n3296:{id:"n3296",loc:[-85.634967,41.947456]},n3297:{id:"n3297",loc:[-85.635041,41.947512]},n3298:{id:"n3298",loc:[-85.635041,41.947542]},n3299:{id:"n3299",loc:[-85.634244,41.947839]},n33:{id:"n33",loc:[-85.638257,41.944188]},n330:{id:"n330",loc:[-85.634093,41.943138]},n3300:{id:"n3300",loc:[-85.634243,41.947793]},n3301:{id:"n3301",loc:[-85.634244,41.947686]},n3302:{id:"n3302",loc:[-85.634243,41.947657]},n3303:{id:"n3303",loc:[-85.634462,41.947653]},n3304:{id:"n3304",loc:[-85.634468,41.947835]},n3305:{id:"n3305",loc:[-85.634416,41.948006]},n3306:{id:"n3306",loc:[-85.634415,41.947898]},n3307:{id:"n3307",loc:[-85.634275,41.947899]},n3308:{id:"n3308",loc:[-85.634275,41.947927]},n3309:{id:"n3309",loc:[-85.63425,41.947927]},n331:{id:"n331",loc:[-85.633938,41.943291]},n3310:{id:"n3310",loc:[-85.63425,41.947976]},n3311:{id:"n3311",loc:[-85.634274,41.947976]},n3312:{id:"n3312",loc:[-85.634275,41.948007]},n3313:{id:"n3313",loc:[-85.634342,41.947635]},n3314:{id:"n3314",loc:[-85.634339,41.947497]},n3315:{id:"n3315",loc:[-85.634313,41.94748]},n3316:{id:"n3316",loc:[-85.634287,41.947474]},n3317:{id:"n3317",loc:[-85.63498,41.94815]},n3318:{id:"n3318",loc:[-85.634891,41.94815]},n3319:{id:"n3319",loc:[-85.634892,41.948169]},n332:{id:"n332",loc:[-85.633535,41.943511],tags:{railway:"crossing"}},n3320:{id:"n3320",loc:[-85.634852,41.948169]},n3321:{id:"n3321",loc:[-85.634853,41.948268]},n3322:{id:"n3322",loc:[-85.634832,41.948268]},n3323:{id:"n3323",loc:[-85.634832,41.948296]},n3324:{id:"n3324",loc:[-85.634965,41.948295]},n3325:{id:"n3325",loc:[-85.634966,41.948321]},n3326:{id:"n3326",loc:[-85.634999,41.948321]},n3327:{id:"n3327",loc:[-85.634999,41.948295]},n3328:{id:"n3328",loc:[-85.635175,41.948293]},n3329:{id:"n3329",loc:[-85.635175,41.948262]},n333:{id:"n333",loc:[-85.63339,41.943596]},n3330:{id:"n3330",loc:[-85.635159,41.948262]},n3331:{id:"n3331",loc:[-85.635158,41.948152]},n3332:{id:"n3332",loc:[-85.635067,41.948152]},n3333:{id:"n3333",loc:[-85.635065,41.947966]},n3334:{id:"n3334",loc:[-85.634979,41.947966]},n3335:{id:"n3335",loc:[-85.634307,41.948326]},n3336:{id:"n3336",loc:[-85.634305,41.948298]},n3337:{id:"n3337",loc:[-85.634331,41.948055]},n3338:{id:"n3338",loc:[-85.634331,41.948046]},n3339:{id:"n3339",loc:[-85.634435,41.948047]},n334:{id:"n334",loc:[-85.632842,41.943895]},n3340:{id:"n3340",loc:[-85.634434,41.948375]},n3341:{id:"n3341",loc:[-85.634463,41.948373]},n3342:{id:"n3342",loc:[-85.634464,41.948456]},n3343:{id:"n3343",loc:[-85.63443,41.948457]},n3344:{id:"n3344",loc:[-85.634432,41.948505]},n3345:{id:"n3345",loc:[-85.637386,41.94906]},n3346:{id:"n3346",loc:[-85.637113,41.9486]},n3347:{id:"n3347",loc:[-85.635448,41.949424]},n335:{id:"n335",loc:[-85.633856,41.943315]},n3352:{id:"n3352",loc:[-85.635457,41.949787]},n3353:{id:"n3353",loc:[-85.635459,41.949886]},n336:{id:"n336",loc:[-85.633697,41.943405]},n337:{id:"n337",loc:[-85.63347,41.943181]},n3372:{id:"n3372",loc:[-85.634423,41.950964]},n3373:{id:"n3373",loc:[-85.634424,41.95074]},n3374:{id:"n3374",loc:[-85.634394,41.950284]},n3375:{id:"n3375",loc:[-85.634398,41.950626]},n3376:{id:"n3376",loc:[-85.63452,41.951063]},n3377:{id:"n3377",loc:[-85.634511,41.949977]},n3378:{id:"n3378",loc:[-85.637409,41.949873]},n3379:{id:"n3379",loc:[-85.634824,41.94996]},n338:{id:"n338",loc:[-85.633597,41.943109]},n3380:{id:"n3380",loc:[-85.635437,41.949954]},n3381:{id:"n3381",loc:[-85.634844,41.951064]},n3382:{id:"n3382",loc:[-85.635458,41.951058]},n3383:{id:"n3383",loc:[-85.633921,41.947333]},n3384:{id:"n3384",loc:[-85.634208,41.947793]},n3385:{id:"n3385",loc:[-85.634204,41.947687]},n3386:{id:"n3386",loc:[-85.63424,41.947475]},n3387:{id:"n3387",loc:[-85.63424,41.947635]},n3388:{id:"n3388",loc:[-85.634089,41.948328]},n3389:{id:"n3389",loc:[-85.63424,41.948299]},n339:{id:"n339",loc:[-85.633673,41.943184]},n3390:{id:"n3390",loc:[-85.634239,41.948212]},n3391:{id:"n3391",loc:[-85.634086,41.948214]},n3392:{id:"n3392",loc:[-85.63408,41.948056]},n3393:{id:"n3393",loc:[-85.634093,41.948506]},n3394:{id:"n3394",loc:[-85.64344,41.941866]},n3395:{id:"n3395",loc:[-85.63378,41.95099]},n3396:{id:"n3396",loc:[-85.633779,41.950967]},n3397:{id:"n3397",loc:[-85.63375,41.950746]},n3398:{id:"n3398",loc:[-85.63375,41.950697]},n3399:{id:"n3399",loc:[-85.633903,41.950696]},n34:{id:"n34",loc:[-85.638176,41.944312]},n340:{id:"n340",loc:[-85.633714,41.94316]},n3400:{id:"n3400",loc:[-85.633901,41.950436]},n3401:{id:"n3401",loc:[-85.633492,41.950438]},n3402:{id:"n3402",loc:[-85.633494,41.950756]},n3403:{id:"n3403",loc:[-85.633454,41.950756]},n3404:{id:"n3404",loc:[-85.633456,41.950992]},n3405:{id:"n3405",loc:[-85.633994,41.950284]},n3406:{id:"n3406",loc:[-85.633998,41.950628]},n3407:{id:"n3407",loc:[-85.633364,41.951068]},n3408:{id:"n3408",loc:[-85.633356,41.949982]},n3409:{id:"n3409",loc:[-85.643327,41.941903]},n341:{id:"n341",loc:[-85.633811,41.943256]},n3410:{id:"n3410",loc:[-85.633292,41.953691]},n3411:{id:"n3411",loc:[-85.637432,41.952399]},n3412:{id:"n3412",loc:[-85.633349,41.957422]},n3413:{id:"n3413",loc:[-85.633326,41.955909]},n3414:{id:"n3414",loc:[-85.633307,41.954673]},n3415:{id:"n3415",loc:[-85.633273,41.952436]},n3416:{id:"n3416",loc:[-85.633361,41.95823],tags:{highway:"turning_circle"}},n3417:{id:"n3417",loc:[-85.619899,41.945527]},n3418:{id:"n3418",loc:[-85.643422,41.941946]},n3419:{id:"n3419",loc:[-85.643505,41.942033]},n342:{id:"n342",loc:[-85.633801,41.943261]},n3420:{id:"n3420",loc:[-85.620088,41.945571]},n3421:{id:"n3421",loc:[-85.620051,41.945505]},n3422:{id:"n3422",loc:[-85.62001,41.94541]},n3423:{id:"n3423",loc:[-85.620982,41.944742]},n3424:{id:"n3424",loc:[-85.621305,41.944782]},n3425:{id:"n3425",loc:[-85.621174,41.944819]},n3426:{id:"n3426",loc:[-85.621029,41.944871]},n3427:{id:"n3427",loc:[-85.620741,41.945011]},n3428:{id:"n3428",loc:[-85.620616,41.945085]},n3429:{id:"n3429",loc:[-85.620506,41.945172]},n343:{id:"n343",loc:[-85.63374,41.943514]},n3430:{id:"n3430",loc:[-85.620394,41.945273]},n3431:{id:"n3431",loc:[-85.620316,41.94536]},n3432:{id:"n3432",loc:[-85.620257,41.945452]},n3433:{id:"n3433",loc:[-85.620212,41.945535]},n3434:{id:"n3434",loc:[-85.620101,41.945811]},n3435:{id:"n3435",loc:[-85.620081,41.945937]},n3436:{id:"n3436",loc:[-85.619899,41.943718]},n3437:{id:"n3437",loc:[-85.619969,41.943211]},n3438:{id:"n3438",loc:[-85.619894,41.943292]},n3439:{id:"n3439",loc:[-85.620047,41.944738]},n344:{id:"n344",loc:[-85.633665,41.943441]},n3440:{id:"n3440",loc:[-85.620226,41.946088]},n3441:{id:"n3441",loc:[-85.620225,41.945864]},n3442:{id:"n3442",loc:[-85.620518,41.945863]},n3443:{id:"n3443",loc:[-85.620519,41.945944]},n3444:{id:"n3444",loc:[-85.620388,41.945944]},n3445:{id:"n3445",loc:[-85.620389,41.946088]},n3446:{id:"n3446",loc:[-85.618405,41.946566]},n3447:{id:"n3447",loc:[-85.619156,41.946562]},n3448:{id:"n3448",loc:[-85.619154,41.946319]},n3449:{id:"n3449",loc:[-85.618736,41.946322]},n345:{id:"n345",loc:[-85.633162,41.942947]},n3450:{id:"n3450",loc:[-85.618733,41.94612]},n3451:{id:"n3451",loc:[-85.619317,41.946116]},n3452:{id:"n3452",loc:[-85.619316,41.946023]},n3453:{id:"n3453",loc:[-85.619622,41.946021]},n3454:{id:"n3454",loc:[-85.619624,41.946171]},n3455:{id:"n3455",loc:[-85.61977,41.94617]},n3456:{id:"n3456",loc:[-85.619769,41.94602]},n3457:{id:"n3457",loc:[-85.619732,41.94602]},n3458:{id:"n3458",loc:[-85.619731,41.945856]},n3459:{id:"n3459",loc:[-85.619617,41.945857]},n346:{id:"n346",loc:[-85.633598,41.943083]},n3460:{id:"n3460",loc:[-85.619616,41.945776]},n3461:{id:"n3461",loc:[-85.619447,41.945777]},n3462:{id:"n3462",loc:[-85.619415,41.945778]},n3463:{id:"n3463",loc:[-85.618378,41.945788]},n3464:{id:"n3464",loc:[-85.618384,41.946132]},n3465:{id:"n3465",loc:[-85.618503,41.94613]},n3466:{id:"n3466",loc:[-85.618506,41.946319]},n3467:{id:"n3467",loc:[-85.6184,41.94632]},n3468:{id:"n3468",loc:[-85.618248,41.946416]},n3469:{id:"n3469",loc:[-85.618247,41.946319]},n347:{id:"n347",loc:[-85.63343,41.943179]},n3470:{id:"n3470",loc:[-85.618039,41.946321]},n3471:{id:"n3471",loc:[-85.61804,41.946418]},n3472:{id:"n3472",loc:[-85.620118,41.951895]},n3473:{id:"n3473",loc:[-85.617075,41.95469]},n3474:{id:"n3474",loc:[-85.620107,41.952113]},n3475:{id:"n3475",loc:[-85.620091,41.95232]},n3476:{id:"n3476",loc:[-85.620047,41.952505]},n3477:{id:"n3477",loc:[-85.61998,41.952715]},n3478:{id:"n3478",loc:[-85.619861,41.952986]},n3479:{id:"n3479",loc:[-85.619622,41.953365]},n348:{id:"n348",loc:[-85.633669,41.94341]},n3480:{id:"n3480",loc:[-85.619441,41.953567]},n3481:{id:"n3481",loc:[-85.619259,41.953741]},n3482:{id:"n3482",loc:[-85.618835,41.954056]},n3483:{id:"n3483",loc:[-85.618602,41.954194]},n3484:{id:"n3484",loc:[-85.618305,41.954347]},n3485:{id:"n3485",loc:[-85.618006,41.954466]},n3486:{id:"n3486",loc:[-85.617611,41.954587]},n3487:{id:"n3487",loc:[-85.615094,41.943412]},n3488:{id:"n3488",loc:[-85.619337,41.943025]},n3489:{id:"n3489",loc:[-85.610477,41.945527]},n349:{id:"n349",loc:[-85.633566,41.943466]},n3490:{id:"n3490",loc:[-85.610477,41.943718]},n3491:{id:"n3491",loc:[-85.619804,41.942976]},n3492:{id:"n3492",loc:[-85.61921,41.942672]},n3493:{id:"n3493",loc:[-85.619862,41.942836]},n3494:{id:"n3494",loc:[-85.616326,41.942769]},n3495:{id:"n3495",loc:[-85.617953,41.942917]},n3496:{id:"n3496",loc:[-85.61972,41.942728]},n3497:{id:"n3497",loc:[-85.61944,41.942784]},n3498:{id:"n3498",loc:[-85.615323,41.942841]},n3499:{id:"n3499",loc:[-85.612923,41.943718]},n35:{id:"n35",loc:[-85.637928,41.944249]},n350:{id:"n350",loc:[-85.633031,41.942986]},n3500:{id:"n3500",loc:[-85.61958,41.942756]},n3501:{id:"n3501",loc:[-85.619643,41.942647],tags:{leisure:"fishing"}},n3502:{id:"n3502",loc:[-85.619935,41.942962]},n3503:{id:"n3503",loc:[-85.629677,41.954687]},n3504:{id:"n3504",loc:[-85.629083,41.953722]},n3505:{id:"n3505",loc:[-85.621907,41.952067]},n3506:{id:"n3506",loc:[-85.621788,41.952058]},n3507:{id:"n3507",loc:[-85.629665,41.953718]},n3508:{id:"n3508",loc:[-85.624454,41.954707]},n3509:{id:"n3509",loc:[-85.634609,41.954585]},n351:{id:"n351",loc:[-85.633238,41.94283]},n3510:{id:"n3510",loc:[-85.634595,41.953772]},n3511:{id:"n3511",loc:[-85.633425,41.953783]},n3512:{id:"n3512",loc:[-85.633439,41.954596]},n3517:{id:"n3517",loc:[-85.621789,41.952179]},n3518:{id:"n3518",loc:[-85.624105,41.954704]},n3519:{id:"n3519",loc:[-85.623306,41.954542]},n352:{id:"n352",loc:[-85.633173,41.943556]},n3520:{id:"n3520",loc:[-85.623123,41.954502]},n3521:{id:"n3521",loc:[-85.622965,41.954473]},n3522:{id:"n3522",loc:[-85.622822,41.954455]},n3523:{id:"n3523",loc:[-85.62269,41.954448]},n3524:{id:"n3524",loc:[-85.622388,41.954467]},n3525:{id:"n3525",loc:[-85.62403,41.954895]},n3526:{id:"n3526",loc:[-85.623579,41.954855]},n3527:{id:"n3527",loc:[-85.623836,41.954951]},n3528:{id:"n3528",loc:[-85.622473,41.954592]},n3529:{id:"n3529",loc:[-85.622753,41.95458]},n353:{id:"n353",loc:[-85.633127,41.943552]},n3530:{id:"n3530",loc:[-85.62404,41.955078]},n3531:{id:"n3531",loc:[-85.624126,41.954999]},n3532:{id:"n3532",loc:[-85.623171,41.954687]},n3533:{id:"n3533",loc:[-85.624276,41.955206]},n3534:{id:"n3534",loc:[-85.62491,41.952801]},n3535:{id:"n3535",loc:[-85.625186,41.952756]},n3536:{id:"n3536",loc:[-85.625552,41.952792]},n3537:{id:"n3537",loc:[-85.626001,41.952948]},n3538:{id:"n3538",loc:[-85.626528,41.952984]},n3539:{id:"n3539",loc:[-85.626942,41.952886]},n354:{id:"n354",loc:[-85.632745,41.943222]},n3540:{id:"n3540",loc:[-85.627092,41.952685]},n3541:{id:"n3541",loc:[-85.627212,41.95244]},n3542:{id:"n3542",loc:[-85.627158,41.952226]},n3543:{id:"n3543",loc:[-85.627002,41.951972]},n3544:{id:"n3544",loc:[-85.626822,41.951838]},n3545:{id:"n3545",loc:[-85.626528,41.951807]},n3546:{id:"n3546",loc:[-85.625653,41.951852]},n3547:{id:"n3547",loc:[-85.625348,41.951834]},n3548:{id:"n3548",loc:[-85.625114,41.951767]},n3549:{id:"n3549",loc:[-85.620627,41.954682]},n355:{id:"n355",loc:[-85.632756,41.943199]},n3550:{id:"n3550",loc:[-85.622758,41.951884]},n3551:{id:"n3551",loc:[-85.618135,41.954734]},n3552:{id:"n3552",loc:[-85.620229,41.95472]},n3553:{id:"n3553",loc:[-85.624491,41.955573]},n3554:{id:"n3554",loc:[-85.621792,41.958314]},n3555:{id:"n3555",loc:[-85.623395,41.960001]},n3556:{id:"n3556",loc:[-85.620461,41.956212]},n3557:{id:"n3557",loc:[-85.62109,41.956766]},n3558:{id:"n3558",loc:[-85.620246,41.956224]},n3559:{id:"n3559",loc:[-85.625017,41.956068]},n356:{id:"n356",loc:[-85.632855,41.943147]},n3560:{id:"n3560",loc:[-85.622795,41.959702]},n3561:{id:"n3561",loc:[-85.621573,41.958457]},n3562:{id:"n3562",loc:[-85.619631,41.9573]},n3563:{id:"n3563",loc:[-85.62095,41.956311]},n3564:{id:"n3564",loc:[-85.619694,41.957408]},n3565:{id:"n3565",loc:[-85.621079,41.957751]},n3566:{id:"n3566",loc:[-85.622426,41.961142]},n3567:{id:"n3567",loc:[-85.623251,41.960484]},n3568:{id:"n3568",loc:[-85.619084,41.956291]},n3569:{id:"n3569",loc:[-85.622227,41.959303]},n357:{id:"n357",loc:[-85.632888,41.94315]},n3570:{id:"n3570",loc:[-85.620976,41.959104]},n3571:{id:"n3571",loc:[-85.621208,41.95653]},n3572:{id:"n3572",loc:[-85.623531,41.95951]},n3573:{id:"n3573",loc:[-85.623556,41.957935]},n3574:{id:"n3574",loc:[-85.623037,41.95746]},n3575:{id:"n3575",loc:[-85.621175,41.956427]},n3576:{id:"n3576",loc:[-85.622651,41.960109]},n3577:{id:"n3577",loc:[-85.621803,41.960747]},n3578:{id:"n3578",loc:[-85.620791,41.961874]},n3579:{id:"n3579",loc:[-85.625295,41.956786]},n358:{id:"n358",loc:[-85.633232,41.943547]},n3580:{id:"n3580",loc:[-85.619662,41.956894]},n3581:{id:"n3581",loc:[-85.622442,41.958708]},n3582:{id:"n3582",loc:[-85.621744,41.955864]},n3583:{id:"n3583",loc:[-85.621336,41.959212]},n3584:{id:"n3584",loc:[-85.622801,41.957304]},n3585:{id:"n3585",loc:[-85.619973,41.957433]},n3586:{id:"n3586",loc:[-85.619556,41.955717]},n3587:{id:"n3587",loc:[-85.622978,41.958601]},n3588:{id:"n3588",loc:[-85.625396,41.956264]},n3589:{id:"n3589",loc:[-85.623525,41.958034]},n359:{id:"n359",loc:[-85.633302,41.94351]},n3590:{id:"n3590",loc:[-85.623299,41.959631]},n3591:{id:"n3591",loc:[-85.622678,41.959873]},n3592:{id:"n3592",loc:[-85.625553,41.956179]},n3593:{id:"n3593",loc:[-85.623557,41.959231]},n3594:{id:"n3594",loc:[-85.622843,41.957373]},n3595:{id:"n3595",loc:[-85.619378,41.955677]},n3596:{id:"n3596",loc:[-85.620092,41.955425]},n3597:{id:"n3597",loc:[-85.622666,41.96044]},n3598:{id:"n3598",loc:[-85.621996,41.960256]},n3599:{id:"n3599",loc:[-85.623273,41.959997]},n36:{id:"n36",loc:[-85.637894,41.945551]},n360:{id:"n360",loc:[-85.633442,41.943794],tags:{highway:"crossing"}},n3600:{id:"n3600",loc:[-85.62477,41.95689]},n3601:{id:"n3601",loc:[-85.621641,41.955015]},n3602:{id:"n3602",loc:[-85.622495,41.960392]},n3603:{id:"n3603",loc:[-85.61918,41.955565]},n3604:{id:"n3604",loc:[-85.620017,41.955505]},n3605:{id:"n3605",loc:[-85.621739,41.956315]},n3606:{id:"n3606",loc:[-85.622957,41.959837]},n3607:{id:"n3607",loc:[-85.620912,41.960919]},n3608:{id:"n3608",loc:[-85.625231,41.956235]},n3609:{id:"n3609",loc:[-85.620976,41.961868]},n361:{id:"n361",loc:[-85.633381,41.94383]},n3610:{id:"n3610",loc:[-85.620956,41.958908]},n3611:{id:"n3611",loc:[-85.619035,41.956139]},n3612:{id:"n3612",loc:[-85.623643,41.958669]},n3613:{id:"n3613",loc:[-85.61949,41.956539]},n3614:{id:"n3614",loc:[-85.621927,41.958242]},n3615:{id:"n3615",loc:[-85.620826,41.955721]},n3616:{id:"n3616",loc:[-85.621202,41.961321]},n3617:{id:"n3617",loc:[-85.624877,41.95594]},n3618:{id:"n3618",loc:[-85.62065,41.958369]},n3619:{id:"n3619",loc:[-85.621524,41.956279]},n362:{id:"n362",loc:[-85.632977,41.944053]},n3620:{id:"n3620",loc:[-85.624662,41.955932]},n3621:{id:"n3621",loc:[-85.623048,41.958509]},n3622:{id:"n3622",loc:[-85.62111,41.95754]},n3623:{id:"n3623",loc:[-85.621508,41.954847]},n3624:{id:"n3624",loc:[-85.620655,41.958601]},n3625:{id:"n3625",loc:[-85.62154,41.954971]},n3626:{id:"n3626",loc:[-85.621691,41.955521]},n3627:{id:"n3627",loc:[-85.62154,41.954739]},n3628:{id:"n3628",loc:[-85.621996,41.959913]},n3629:{id:"n3629",loc:[-85.622286,41.960699]},n363:{id:"n363",loc:[-85.632915,41.943981],tags:{crossing:"marked",highway:"crossing"}},n3630:{id:"n3630",loc:[-85.622844,41.9572]},n3631:{id:"n3631",loc:[-85.620252,41.955446]},n3632:{id:"n3632",loc:[-85.623434,41.957528]},n3633:{id:"n3633",loc:[-85.623429,41.956858]},n3634:{id:"n3634",loc:[-85.622957,41.957137]},n3635:{id:"n3635",loc:[-85.622554,41.959027]},n3636:{id:"n3636",loc:[-85.623289,41.958314]},n3637:{id:"n3637",loc:[-85.622977,41.960855]},n3638:{id:"n3638",loc:[-85.624008,41.956953]},n3639:{id:"n3639",loc:[-85.621278,41.960855]},n364:{id:"n364",loc:[-85.632724,41.943969],tags:{crossing:"marked",highway:"crossing"}},n3640:{id:"n3640",loc:[-85.623128,41.956993]},n3641:{id:"n3641",loc:[-85.622452,41.959183]},n3642:{id:"n3642",loc:[-85.621095,41.961082]},n3643:{id:"n3643",loc:[-85.622011,41.960544]},n3644:{id:"n3644",loc:[-85.621637,41.955385]},n3645:{id:"n3645",loc:[-85.620999,41.959271]},n3646:{id:"n3646",loc:[-85.620044,41.956347]},n3647:{id:"n3647",loc:[-85.621936,41.959682]},n3648:{id:"n3648",loc:[-85.623761,41.95685]},n3649:{id:"n3649",loc:[-85.621239,41.959343]},n365:{id:"n365",loc:[-85.632621,41.944034]},n3650:{id:"n3650",loc:[-85.621073,41.956012]},n3651:{id:"n3651",loc:[-85.621271,41.956184]},n3652:{id:"n3652",loc:[-85.623444,41.95778]},n3653:{id:"n3653",loc:[-85.62125,41.96186]},n3654:{id:"n3654",loc:[-85.62169,41.961059]},n3655:{id:"n3655",loc:[-85.620012,41.955637]},n3656:{id:"n3656",loc:[-85.621058,41.9573]},n3657:{id:"n3657",loc:[-85.621138,41.957663]},n3658:{id:"n3658",loc:[-85.620773,41.957895]},n3659:{id:"n3659",loc:[-85.62007,41.957157]},n366:{id:"n366",loc:[-85.632684,41.944109],tags:{crossing:"marked",highway:"crossing"}},n3660:{id:"n3660",loc:[-85.624534,41.955844]},n3661:{id:"n3661",loc:[-85.621932,41.960807]},n3662:{id:"n3662",loc:[-85.623358,41.958138]},n3663:{id:"n3663",loc:[-85.620456,41.955514]},n3664:{id:"n3664",loc:[-85.623504,41.957607]},n3665:{id:"n3665",loc:[-85.621444,41.960751]},n3666:{id:"n3666",loc:[-85.623492,41.960213]},n3667:{id:"n3667",loc:[-85.621669,41.954655]},n3668:{id:"n3668",loc:[-85.623106,41.958685]},n3669:{id:"n3669",loc:[-85.620922,41.957867]},n367:{id:"n367",loc:[-85.632738,41.944172]},n3670:{id:"n3670",loc:[-85.620092,41.957296]},n3671:{id:"n3671",loc:[-85.621669,41.955222]},n3672:{id:"n3672",loc:[-85.621614,41.960967]},n3673:{id:"n3673",loc:[-85.621691,41.955732]},n3674:{id:"n3674",loc:[-85.619207,41.956419]},n3675:{id:"n3675",loc:[-85.621116,41.956603]},n3676:{id:"n3676",loc:[-85.623311,41.956929]},n3677:{id:"n3677",loc:[-85.625671,41.956499]},n3678:{id:"n3678",loc:[-85.623525,41.956738]},n3679:{id:"n3679",loc:[-85.625381,41.956634]},n368:{id:"n368",loc:[-85.63287,41.944135],tags:{crossing:"marked",highway:"crossing"}},n3680:{id:"n3680",loc:[-85.620096,41.95677]},n3681:{id:"n3681",loc:[-85.623803,41.958745]},n3682:{id:"n3682",loc:[-85.623498,41.958457]},n3683:{id:"n3683",loc:[-85.624223,41.957009]},n3684:{id:"n3684",loc:[-85.620026,41.956946]},n3685:{id:"n3685",loc:[-85.623005,41.960124]},n3686:{id:"n3686",loc:[-85.619073,41.955832]},n3687:{id:"n3687",loc:[-85.621744,41.95501]},n3688:{id:"n3688",loc:[-85.620804,41.958781]},n3689:{id:"n3689",loc:[-85.619844,41.957448]},n369:{id:"n369",loc:[-85.63298,41.944076]},n3690:{id:"n3690",loc:[-85.623713,41.958872]},n3691:{id:"n3691",loc:[-85.622329,41.960507]},n3692:{id:"n3692",loc:[-85.620804,41.956244]},n3693:{id:"n3693",loc:[-85.621818,41.955968]},n3694:{id:"n3694",loc:[-85.621405,41.958697]},n3695:{id:"n3695",loc:[-85.620998,41.960996]},n3696:{id:"n3696",loc:[-85.621621,41.960444]},n3697:{id:"n3697",loc:[-85.620941,41.961637]},n3698:{id:"n3698",loc:[-85.622195,41.958333]},n3699:{id:"n3699",loc:[-85.621668,41.961529]},n37:{id:"n37",loc:[-85.637611,41.945383]},n370:{id:"n370",loc:[-85.633191,41.944471]},n3700:{id:"n3700",loc:[-85.621015,41.957049]},n3701:{id:"n3701",loc:[-85.619368,41.955521]},n3702:{id:"n3702",loc:[-85.651578,41.942534]},n3703:{id:"n3703",loc:[-85.651541,41.943847]},n3704:{id:"n3704",loc:[-85.651365,41.944817]},n3705:{id:"n3705",loc:[-85.651076,41.945985]},n3706:{id:"n3706",loc:[-85.650626,41.947213]},n3707:{id:"n3707",loc:[-85.649669,41.949161]},n3708:{id:"n3708",loc:[-85.641802,41.961801]},n3709:{id:"n3709",loc:[-85.623333,41.961987]},n371:{id:"n371",loc:[-85.633132,41.94372]},n3710:{id:"n3710",loc:[-85.620621,41.965658]},n3711:{id:"n3711",loc:[-85.605673,41.965764]},n3712:{id:"n3712",loc:[-85.605664,41.962094]},n3713:{id:"n3713",loc:[-85.583774,41.962178]},n3714:{id:"n3714",loc:[-85.583774,41.961789]},n3715:{id:"n3715",loc:[-85.581303,41.961783]},n3716:{id:"n3716",loc:[-85.581245,41.958394]},n3717:{id:"n3717",loc:[-85.585299,41.955483]},n3718:{id:"n3718",loc:[-85.585588,41.955331]},n3719:{id:"n3719",loc:[-85.586053,41.955163]},n372:{id:"n372",loc:[-85.633011,41.943788]},n3720:{id:"n3720",loc:[-85.58632,41.955076]},n3721:{id:"n3721",loc:[-85.586478,41.955025]},n3722:{id:"n3722",loc:[-85.58692,41.954947]},n3723:{id:"n3723",loc:[-85.587345,41.954913]},n3724:{id:"n3724",loc:[-85.605592,41.954766]},n3725:{id:"n3725",loc:[-85.605303,41.936236]},n3726:{id:"n3726",loc:[-85.606941,41.936117]},n3727:{id:"n3727",loc:[-85.60876,41.935856]},n3728:{id:"n3728",loc:[-85.610092,41.935451]},n3729:{id:"n3729",loc:[-85.610681,41.935247]},n373:{id:"n373",loc:[-85.632854,41.943632]},n3730:{id:"n3730",loc:[-85.611446,41.934955]},n3731:{id:"n3731",loc:[-85.612057,41.934696]},n3732:{id:"n3732",loc:[-85.613256,41.934084]},n3733:{id:"n3733",loc:[-85.613948,41.933682]},n3734:{id:"n3734",loc:[-85.614638,41.933212]},n3735:{id:"n3735",loc:[-85.619801,41.929305]},n3736:{id:"n3736",loc:[-85.619768,41.925548]},n3737:{id:"n3737",loc:[-85.625761,41.925597]},n3738:{id:"n3738",loc:[-85.6263,41.927323]},n3739:{id:"n3739",loc:[-85.633708,41.927402]},n374:{id:"n374",loc:[-85.632974,41.943565]},n3740:{id:"n3740",loc:[-85.633927,41.929109]},n3741:{id:"n3741",loc:[-85.639213,41.929088]},n3742:{id:"n3742",loc:[-85.639204,41.925488]},n3743:{id:"n3743",loc:[-85.651425,41.925406]},n3744:{id:"n3744",loc:[-85.643386,41.941933]},n3745:{id:"n3745",loc:[-85.642776,41.941161]},n3746:{id:"n3746",loc:[-85.637277,41.948812]},n3747:{id:"n3747",loc:[-85.637366,41.94897]},n3748:{id:"n3748",loc:[-85.637329,41.94889]},n3749:{id:"n3749",loc:[-85.629649,41.952596]},n375:{id:"n375",loc:[-85.632741,41.943351]},n3750:{id:"n3750",loc:[-85.630291,41.954684]},n3751:{id:"n3751",loc:[-85.630284,41.953713]},n3752:{id:"n3752",loc:[-85.630269,41.952463]},n3753:{id:"n3753",loc:[-85.633933,41.949896]},n3754:{id:"n3754",loc:[-85.629339,41.941467]},n3755:{id:"n3755",loc:[-85.629857,41.94316]},n3756:{id:"n3756",loc:[-85.629987,41.944025]},n3757:{id:"n3757",loc:[-85.628538,41.948604]},n3758:{id:"n3758",loc:[-85.627415,41.957442]},n3759:{id:"n3759",loc:[-85.627019,41.957369]},n376:{id:"n376",loc:[-85.63251,41.943481]},n3760:{id:"n3760",loc:[-85.62167,41.952179]},n3761:{id:"n3761",loc:[-85.62167,41.952138]},n3762:{id:"n3762",loc:[-85.621562,41.952139]},n3763:{id:"n3763",loc:[-85.621562,41.952058]},n3764:{id:"n3764",loc:[-85.621476,41.952043]},n3765:{id:"n3765",loc:[-85.621477,41.952132]},n3766:{id:"n3766",loc:[-85.621386,41.952132]},n3767:{id:"n3767",loc:[-85.621387,41.95214]},n3768:{id:"n3768",loc:[-85.621262,41.95214]},n3769:{id:"n3769",loc:[-85.621261,41.952038]},n377:{id:"n377",loc:[-85.632706,41.943715]},n3770:{id:"n3770",loc:[-85.621389,41.952038]},n3771:{id:"n3771",loc:[-85.621389,41.952043]},n3772:{id:"n3772",loc:[-85.620898,41.952024]},n3773:{id:"n3773",loc:[-85.620898,41.952085]},n3774:{id:"n3774",loc:[-85.620774,41.952084]},n3775:{id:"n3775",loc:[-85.620774,41.952023]},n3776:{id:"n3776",loc:[-85.620749,41.952036]},n3777:{id:"n3777",loc:[-85.620723,41.952097]},n3778:{id:"n3778",loc:[-85.626158,41.958996]},n3779:{id:"n3779",loc:[-85.626319,41.958686]},n378:{id:"n378",loc:[-85.638683,41.943295]},n3780:{id:"n3780",loc:[-85.626119,41.958629]},n3781:{id:"n3781",loc:[-85.626064,41.958733]},n3782:{id:"n3782",loc:[-85.626155,41.958759]},n3783:{id:"n3783",loc:[-85.626048,41.958965]},n3784:{id:"n3784",loc:[-85.620648,41.952079]},n3785:{id:"n3785",loc:[-85.63826,41.961213]},n3786:{id:"n3786",loc:[-85.638003,41.961614]},n3787:{id:"n3787",loc:[-85.638817,41.961902]},n3788:{id:"n3788",loc:[-85.639073,41.961501]},n3789:{id:"n3789",loc:[-85.620674,41.952018]},n379:{id:"n379",loc:[-85.638684,41.94323]},n3790:{id:"n3790",loc:[-85.62082,41.952106]},n3791:{id:"n3791",loc:[-85.620819,41.952143]},n3792:{id:"n3792",loc:[-85.620778,41.952143]},n3793:{id:"n3793",loc:[-85.620778,41.952106]},n3794:{id:"n3794",loc:[-85.620563,41.952276]},n3795:{id:"n3795",loc:[-85.620543,41.95238]},n3796:{id:"n3796",loc:[-85.620422,41.952367]},n3797:{id:"n3797",loc:[-85.620441,41.952263]},n3798:{id:"n3798",loc:[-85.620561,41.952266]},n3799:{id:"n3799",loc:[-85.620444,41.952254]},n38:{id:"n38",loc:[-85.63879,41.943295]},n380:{id:"n380",loc:[-85.638627,41.94322]},n3800:{id:"n3800",loc:[-85.620773,41.955585]},n3801:{id:"n3801",loc:[-85.621265,41.955989]},n3802:{id:"n3802",loc:[-85.620692,41.954969]},n3803:{id:"n3803",loc:[-85.620691,41.955367]},n3804:{id:"n3804",loc:[-85.620458,41.952178]},n3805:{id:"n3805",loc:[-85.620575,41.95219]},n3806:{id:"n3806",loc:[-85.617609,41.952712]},n3807:{id:"n3807",loc:[-85.617533,41.952801],tags:{entrance:"yes"}},n3808:{id:"n3808",loc:[-85.616816,41.952911]},n3809:{id:"n3809",loc:[-85.616797,41.952901]},n381:{id:"n381",loc:[-85.638624,41.943294]},n3810:{id:"n3810",loc:[-85.616343,41.952694]},n3811:{id:"n3811",loc:[-85.616336,41.952729]},n3812:{id:"n3812",loc:[-85.616343,41.952772]},n3813:{id:"n3813",loc:[-85.628479,41.948649]},n3814:{id:"n3814",loc:[-85.628413,41.948679]},n3815:{id:"n3815",loc:[-85.628336,41.948694]},n3816:{id:"n3816",loc:[-85.62826,41.948694]},n3817:{id:"n3817",loc:[-85.628185,41.948679]},n3818:{id:"n3818",loc:[-85.628103,41.948649]},n3819:{id:"n3819",loc:[-85.627482,41.948395]},n382:{id:"n382",loc:[-85.638437,41.943291]},n3820:{id:"n3820",loc:[-85.619957,41.951168]},n3821:{id:"n3821",loc:[-85.619955,41.952077]},n3822:{id:"n3822",loc:[-85.619843,41.952666]},n3823:{id:"n3823",loc:[-85.619513,41.95324]},n3824:{id:"n3824",loc:[-85.619163,41.953668]},n3825:{id:"n3825",loc:[-85.618813,41.953947]},n3826:{id:"n3826",loc:[-85.618265,41.954252]},n3827:{id:"n3827",loc:[-85.617691,41.954458]},n3828:{id:"n3828",loc:[-85.616978,41.95459]},n3829:{id:"n3829",loc:[-85.615408,41.954628]},n383:{id:"n383",loc:[-85.63844,41.943209]},n3830:{id:"n3830",loc:[-85.615374,41.951076]},n3831:{id:"n3831",loc:[-85.61932,41.947564]},n3832:{id:"n3832",loc:[-85.610553,41.94755]},n3833:{id:"n3833",loc:[-85.610572,41.951065]},n3834:{id:"n3834",loc:[-85.617548,41.94757]},n3835:{id:"n3835",loc:[-85.619842,41.947939]},n3836:{id:"n3836",loc:[-85.619874,41.950905]},n3837:{id:"n3837",loc:[-85.619695,41.950911]},n3838:{id:"n3838",loc:[-85.617591,41.951078]},n3839:{id:"n3839",loc:[-85.619551,41.951065]},n384:{id:"n384",loc:[-85.632616,41.944021]},n3840:{id:"n3840",loc:[-85.626813,41.947337]},n3841:{id:"n3841",loc:[-85.616371,41.952814]},n3842:{id:"n3842",loc:[-85.617205,41.951308]},n3843:{id:"n3843",loc:[-85.616795,41.950953]},n3844:{id:"n3844",loc:[-85.617441,41.950889]},n3845:{id:"n3845",loc:[-85.619155,41.949377]},n3846:{id:"n3846",loc:[-85.618556,41.949377]},n3847:{id:"n3847",loc:[-85.618557,41.948372]},n3848:{id:"n3848",loc:[-85.619156,41.948372]},n3849:{id:"n3849",loc:[-85.61927,41.949796]},n385:{id:"n385",loc:[-85.632319,41.944172]},n3850:{id:"n3850",loc:[-85.61926,41.948344]},n3851:{id:"n3851",loc:[-85.619219,41.948264]},n3852:{id:"n3852",loc:[-85.619147,41.948196]},n3853:{id:"n3853",loc:[-85.619049,41.948144]},n3854:{id:"n3854",loc:[-85.618942,41.948116]},n3855:{id:"n3855",loc:[-85.618822,41.948109]},n3856:{id:"n3856",loc:[-85.618699,41.94813]},n3857:{id:"n3857",loc:[-85.618937,41.951943]},n3858:{id:"n3858",loc:[-85.616762,41.952222]},n3859:{id:"n3859",loc:[-85.616799,41.95472]},n386:{id:"n386",loc:[-85.63221,41.944066]},n3860:{id:"n3860",loc:[-85.616458,41.954735]},n3861:{id:"n3861",loc:[-85.61763,41.951515]},n3862:{id:"n3862",loc:[-85.617735,41.951572]},n3863:{id:"n3863",loc:[-85.61929,41.951573]},n3864:{id:"n3864",loc:[-85.617134,41.951348]},n3865:{id:"n3865",loc:[-85.616598,41.95192]},n3866:{id:"n3866",loc:[-85.616557,41.951997]},n3867:{id:"n3867",loc:[-85.61658,41.952093]},n3868:{id:"n3868",loc:[-85.616636,41.952145]},n3869:{id:"n3869",loc:[-85.616918,41.952276]},n387:{id:"n387",loc:[-85.632524,41.943912]},n3870:{id:"n3870",loc:[-85.617098,41.952235]},n3871:{id:"n3871",loc:[-85.61892,41.951467]},n3872:{id:"n3872",loc:[-85.618035,41.951473]},n3873:{id:"n3873",loc:[-85.618036,41.951572]},n3874:{id:"n3874",loc:[-85.61892,41.951573]},n3875:{id:"n3875",loc:[-85.618919,41.951957]},n3876:{id:"n3876",loc:[-85.619457,41.952237]},n3877:{id:"n3877",loc:[-85.618178,41.953618]},n3878:{id:"n3878",loc:[-85.617658,41.953366]},n3879:{id:"n3879",loc:[-85.617987,41.953024]},n388:{id:"n388",loc:[-85.632268,41.943621]},n3880:{id:"n3880",loc:[-85.618429,41.953248]},n3881:{id:"n3881",loc:[-85.618554,41.953119]},n3882:{id:"n3882",loc:[-85.618077,41.952868]},n3883:{id:"n3883",loc:[-85.618039,41.952886]},n3884:{id:"n3884",loc:[-85.619375,41.952169]},n3885:{id:"n3885",loc:[-85.618137,41.953538]},n3886:{id:"n3886",loc:[-85.61799,41.953555]},n3887:{id:"n3887",loc:[-85.617729,41.953423]},n3888:{id:"n3888",loc:[-85.618101,41.953029]},n3889:{id:"n3889",loc:[-85.618516,41.953119]},n389:{id:"n389",loc:[-85.631951,41.943773]},n3890:{id:"n3890",loc:[-85.619132,41.952042]},n3891:{id:"n3891",loc:[-85.618235,41.952981]},n3892:{id:"n3892",loc:[-85.618485,41.952425]},n3893:{id:"n3893",loc:[-85.618676,41.952519]},n3894:{id:"n3894",loc:[-85.618942,41.952648]},n3895:{id:"n3895",loc:[-85.618287,41.953122]},n3896:{id:"n3896",loc:[-85.617914,41.953516]},n3897:{id:"n3897",loc:[-85.617836,41.953573]},n3898:{id:"n3898",loc:[-85.616477,41.95289]},n3899:{id:"n3899",loc:[-85.618441,41.953201]},n39:{id:"n39",loc:[-85.619931,41.951013]},n390:{id:"n390",loc:[-85.631981,41.943654]},n3900:{id:"n3900",loc:[-85.617537,41.953335]},n3901:{id:"n3901",loc:[-85.617221,41.953166]},n3902:{id:"n3902",loc:[-85.617253,41.953135]},n3903:{id:"n3903",loc:[-85.617211,41.953114]},n3904:{id:"n3904",loc:[-85.617197,41.95313]},n3905:{id:"n3905",loc:[-85.616802,41.952925]},n3906:{id:"n3906",loc:[-85.616771,41.952928]},n3907:{id:"n3907",loc:[-85.616493,41.952785]},n3908:{id:"n3908",loc:[-85.616823,41.952426]},n3909:{id:"n3909",loc:[-85.617191,41.952616]},n391:{id:"n391",loc:[-85.631886,41.943699]},n3910:{id:"n3910",loc:[-85.61724,41.952559]},n3911:{id:"n3911",loc:[-85.61721,41.952542]},n3912:{id:"n3912",loc:[-85.617395,41.952351]},n3913:{id:"n3913",loc:[-85.617426,41.952368]},n3914:{id:"n3914",loc:[-85.617483,41.952309]},n3915:{id:"n3915",loc:[-85.617332,41.952229]},n3916:{id:"n3916",loc:[-85.617451,41.952102]},n3917:{id:"n3917",loc:[-85.617477,41.952115]},n3918:{id:"n3918",loc:[-85.617658,41.951923]},n3919:{id:"n3919",loc:[-85.617634,41.95191]},n392:{id:"n392",loc:[-85.631807,41.943606]},n3920:{id:"n3920",loc:[-85.617747,41.951786]},n3921:{id:"n3921",loc:[-85.618268,41.952056]},n3922:{id:"n3922",loc:[-85.618211,41.952122]},n3923:{id:"n3923",loc:[-85.618386,41.95222]},n3924:{id:"n3924",loc:[-85.618098,41.952527]},n3925:{id:"n3925",loc:[-85.617916,41.95243]},n3926:{id:"n3926",loc:[-85.617854,41.952498]},n3927:{id:"n3927",loc:[-85.617769,41.952453]},n3928:{id:"n3928",loc:[-85.617476,41.952773]},n3929:{id:"n3929",loc:[-85.617876,41.952973]},n393:{id:"n393",loc:[-85.631902,41.943561]},n3930:{id:"n3930",loc:[-85.617174,41.953638]},n3931:{id:"n3931",loc:[-85.618016,41.953578]},n3932:{id:"n3932",loc:[-85.618107,41.953628]},n3933:{id:"n3933",loc:[-85.618067,41.954268]},n3934:{id:"n3934",loc:[-85.617864,41.954263]},n3935:{id:"n3935",loc:[-85.61762,41.954205]},n3936:{id:"n3936",loc:[-85.617437,41.954103]},n3937:{id:"n3937",loc:[-85.617294,41.953978]},n3938:{id:"n3938",loc:[-85.617217,41.95384]},n3939:{id:"n3939",loc:[-85.616814,41.954327]},n394:{id:"n394",loc:[-85.63236,41.943543]},n3940:{id:"n3940",loc:[-85.616778,41.95381]},n3941:{id:"n3941",loc:[-85.616585,41.953707]},n3942:{id:"n3942",loc:[-85.616458,41.954318]},n3943:{id:"n3943",loc:[-85.616643,41.954345]},n3944:{id:"n3944",loc:[-85.618133,41.951412]},n3945:{id:"n3945",loc:[-85.618326,41.951411]},n3946:{id:"n3946",loc:[-85.618503,41.95141]},n3947:{id:"n3947",loc:[-85.618681,41.951409]},n3948:{id:"n3948",loc:[-85.618868,41.951408]},n3949:{id:"n3949",loc:[-85.617047,41.95136]},n395:{id:"n395",loc:[-85.633839,41.944082]},n3950:{id:"n3950",loc:[-85.616502,41.951946]},n3951:{id:"n3951",loc:[-85.616497,41.952072]},n3952:{id:"n3952",loc:[-85.616565,41.952165]},n3953:{id:"n3953",loc:[-85.616663,41.952218]},n3954:{id:"n3954",loc:[-85.616733,41.952255]},n3955:{id:"n3955",loc:[-85.617238,41.952512],tags:{entrance:"yes"}},n3956:{id:"n3956",loc:[-85.617043,41.952406]},n3957:{id:"n3957",loc:[-85.617691,41.951711]},n3958:{id:"n3958",loc:[-85.617773,41.951679]},n3959:{id:"n3959",loc:[-85.619085,41.951681]},n396:{id:"n396",loc:[-85.63376,41.944097]},n3960:{id:"n3960",loc:[-85.617943,41.952895]},n3961:{id:"n3961",loc:[-85.618039,41.952938]},n3962:{id:"n3962",loc:[-85.61763,41.95336]},n3963:{id:"n3963",loc:[-85.617554,41.95344]},n3964:{id:"n3964",loc:[-85.617381,41.952366],tags:{entrance:"yes"}},n3965:{id:"n3965",loc:[-85.617184,41.952254]},n3966:{id:"n3966",loc:[-85.617208,41.952496]},n3967:{id:"n3967",loc:[-85.617124,41.952581],tags:{entrance:"yes"}},n3968:{id:"n3968",loc:[-85.618094,41.952735]},n3969:{id:"n3969",loc:[-85.617702,41.952525],tags:{entrance:"yes"}},n397:{id:"n397",loc:[-85.63361,41.943957]},n3970:{id:"n3970",loc:[-85.617554,41.952686],tags:{entrance:"yes"}},n3971:{id:"n3971",loc:[-85.617959,41.952878]},n3972:{id:"n3972",loc:[-85.616367,41.952655]},n3973:{id:"n3973",loc:[-85.616416,41.952851]},n3974:{id:"n3974",loc:[-85.619777,41.951075]},n3975:{id:"n3975",loc:[-85.618611,41.94817]},n3976:{id:"n3976",loc:[-85.618538,41.948229]},n3977:{id:"n3977",loc:[-85.617421,41.947559]},n3978:{id:"n3978",loc:[-85.617395,41.951039]},n3979:{id:"n3979",loc:[-85.618488,41.94829]},n398:{id:"n398",loc:[-85.633309,41.943886]},n3980:{id:"n3980",loc:[-85.610238,41.954774]},n3981:{id:"n3981",loc:[-85.617449,41.950756]},n3982:{id:"n3982",loc:[-85.617288,41.951286]},n3983:{id:"n3983",loc:[-85.61745,41.950197]},n3984:{id:"n3984",loc:[-85.617436,41.948908]},n3985:{id:"n3985",loc:[-85.615915,41.953804]},n3986:{id:"n3986",loc:[-85.615953,41.953968]},n3987:{id:"n3987",loc:[-85.616031,41.954085]},n3988:{id:"n3988",loc:[-85.616135,41.954181]},n3989:{id:"n3989",loc:[-85.616273,41.954263]},n399:{id:"n399",loc:[-85.633226,41.943931]},n3990:{id:"n3990",loc:[-85.618327,41.951083]},n3991:{id:"n3991",loc:[-85.618135,41.951084]},n3992:{id:"n3992",loc:[-85.618503,41.951082]},n3993:{id:"n3993",loc:[-85.618682,41.951081]},n3994:{id:"n3994",loc:[-85.618864,41.951082]},n3995:{id:"n3995",loc:[-85.616761,41.950101]},n3996:{id:"n3996",loc:[-85.617317,41.947558]},n3997:{id:"n3997",loc:[-85.617336,41.948883]},n3998:{id:"n3998",loc:[-85.616779,41.949295]},n3999:{id:"n3999",loc:[-85.616754,41.949349]},n4:{id:"n4",loc:[-85.622764,41.950892],tags:{highway:"stop",direction:"forward",stop:"minor"}},n40:{id:"n40",loc:[-85.619841,41.951037]},n400:{id:"n400",loc:[-85.63326,41.943966]},n4000:{id:"n4000",loc:[-85.616761,41.950865]},n4001:{id:"n4001",loc:[-85.616883,41.951041]},n4002:{id:"n4002",loc:[-85.617004,41.951142]},n4003:{id:"n4003",loc:[-85.617062,41.951248]},n4004:{id:"n4004",loc:[-85.616809,41.949273]},n4005:{id:"n4005",loc:[-85.616755,41.949489]},n4006:{id:"n4006",loc:[-85.616759,41.949971]},n4007:{id:"n4007",loc:[-85.616757,41.949702]},n4008:{id:"n4008",loc:[-85.618456,41.94836]},n4009:{id:"n4009",loc:[-85.618447,41.948428]},n401:{id:"n401",loc:[-85.63324,41.943976]},n4010:{id:"n4010",loc:[-85.618437,41.949322]},n4011:{id:"n4011",loc:[-85.618447,41.949418]},n4012:{id:"n4012",loc:[-85.618478,41.949491]},n4013:{id:"n4013",loc:[-85.618535,41.949559]},n4014:{id:"n4014",loc:[-85.618623,41.94962]},n4015:{id:"n4015",loc:[-85.618721,41.94966]},n4016:{id:"n4016",loc:[-85.618838,41.949674]},n4017:{id:"n4017",loc:[-85.618967,41.949667]},n4018:{id:"n4018",loc:[-85.619065,41.949632]},n4019:{id:"n4019",loc:[-85.61915,41.949578]},n402:{id:"n402",loc:[-85.63327,41.944006]},n4020:{id:"n4020",loc:[-85.619216,41.949507]},n4021:{id:"n4021",loc:[-85.61927,41.949399]},n4022:{id:"n4022",loc:[-85.619074,41.947639]},n4023:{id:"n4023",loc:[-85.619073,41.947793]},n4024:{id:"n4024",loc:[-85.618912,41.947793]},n4025:{id:"n4025",loc:[-85.618911,41.947947]},n4026:{id:"n4026",loc:[-85.618752,41.947947]},n4027:{id:"n4027",loc:[-85.618754,41.947637]},n4028:{id:"n4028",loc:[-85.617896,41.947599]},n4029:{id:"n4029",loc:[-85.617898,41.947811]},n403:{id:"n403",loc:[-85.633278,41.944002]},n4030:{id:"n4030",loc:[-85.617717,41.947812]},n4031:{id:"n4031",loc:[-85.617715,41.9476]},n4032:{id:"n4032",loc:[-85.619003,41.949828]},n4033:{id:"n4033",loc:[-85.619003,41.949882]},n4034:{id:"n4034",loc:[-85.618926,41.949882]},n4035:{id:"n4035",loc:[-85.618926,41.949828]},n4036:{id:"n4036",loc:[-85.618861,41.949809]},n4037:{id:"n4037",loc:[-85.618861,41.949898]},n4038:{id:"n4038",loc:[-85.618688,41.949898]},n4039:{id:"n4039",loc:[-85.618687,41.94981]},n404:{id:"n404",loc:[-85.63331,41.944036]},n4040:{id:"n4040",loc:[-85.618349,41.949473]},n4041:{id:"n4041",loc:[-85.618287,41.949473]},n4042:{id:"n4042",loc:[-85.618287,41.94942]},n4043:{id:"n4043",loc:[-85.618348,41.949419]},n4044:{id:"n4044",loc:[-85.62316,41.951604]},n4045:{id:"n4045",loc:[-85.623026,41.951605]},n4046:{id:"n4046",loc:[-85.623023,41.951466]},n4047:{id:"n4047",loc:[-85.623134,41.951465]},n4048:{id:"n4048",loc:[-85.623136,41.951539]},n4049:{id:"n4049",loc:[-85.623159,41.951539]},n405:{id:"n405",loc:[-85.633348,41.944015]},n4050:{id:"n4050",loc:[-85.623025,41.95155]},n4051:{id:"n4051",loc:[-85.622955,41.951551]},n4052:{id:"n4052",loc:[-85.622953,41.951507]},n4053:{id:"n4053",loc:[-85.623024,41.951506]},n4054:{id:"n4054",loc:[-85.623318,41.951242]},n4055:{id:"n4055",loc:[-85.623175,41.951241]},n4056:{id:"n4056",loc:[-85.623176,41.951153]},n4057:{id:"n4057",loc:[-85.623319,41.951154]},n4058:{id:"n4058",loc:[-85.623077,41.951191]},n4059:{id:"n4059",loc:[-85.622973,41.951191]},n406:{id:"n406",loc:[-85.63338,41.944048]},n4060:{id:"n4060",loc:[-85.622972,41.951349]},n4061:{id:"n4061",loc:[-85.623059,41.95135]},n4062:{id:"n4062",loc:[-85.62306,41.951301]},n4063:{id:"n4063",loc:[-85.623077,41.951301]},n4064:{id:"n4064",loc:[-85.623117,41.951405]},n4065:{id:"n4065",loc:[-85.62312,41.951087]},n4066:{id:"n4066",loc:[-85.623118,41.951274]},n4067:{id:"n4067",loc:[-85.62328,41.951275]},n4068:{id:"n4068",loc:[-85.62328,41.951242]},n4069:{id:"n4069",loc:[-85.623179,41.951392]},n407:{id:"n407",loc:[-85.633431,41.94402]},n4070:{id:"n4070",loc:[-85.623141,41.951392]},n4071:{id:"n4071",loc:[-85.623142,41.95136]},n4072:{id:"n4072",loc:[-85.623179,41.951361]},n4073:{id:"n4073",loc:[-85.622565,41.951639]},n4074:{id:"n4074",loc:[-85.622565,41.951741]},n4075:{id:"n4075",loc:[-85.622463,41.95174]},n4076:{id:"n4076",loc:[-85.622463,41.95173]},n4077:{id:"n4077",loc:[-85.622442,41.95173]},n4078:{id:"n4078",loc:[-85.622442,41.951742]},n4079:{id:"n4079",loc:[-85.622361,41.951742]},n408:{id:"n408",loc:[-85.633425,41.944014]},n4080:{id:"n4080",loc:[-85.622362,41.951667]},n4081:{id:"n4081",loc:[-85.622441,41.951667]},n4082:{id:"n4082",loc:[-85.622441,41.951688]},n4083:{id:"n4083",loc:[-85.622461,41.951688]},n4084:{id:"n4084",loc:[-85.622461,41.951638]},n4085:{id:"n4085",loc:[-85.62255,41.951587]},n4086:{id:"n4086",loc:[-85.622449,41.95159]},n4087:{id:"n4087",loc:[-85.622441,41.951448]},n4088:{id:"n4088",loc:[-85.62253,41.951445]},n4089:{id:"n4089",loc:[-85.622532,41.951486]},n409:{id:"n409",loc:[-85.633457,41.943997]},n4090:{id:"n4090",loc:[-85.622555,41.951485]},n4091:{id:"n4091",loc:[-85.622558,41.951531]},n4092:{id:"n4092",loc:[-85.622547,41.951531]},n4093:{id:"n4093",loc:[-85.622451,41.95159]},n4094:{id:"n4094",loc:[-85.622452,41.95161]},n4095:{id:"n4095",loc:[-85.622106,41.951617]},n4096:{id:"n4096",loc:[-85.622133,41.951443]},n4097:{id:"n4097",loc:[-85.622552,41.951379]},n4098:{id:"n4098",loc:[-85.622443,41.95138]},n4099:{id:"n4099",loc:[-85.622441,41.951281]},n41:{id:"n41",loc:[-85.636233,41.942764]},n410:{id:"n410",loc:[-85.633429,41.943969]},n4100:{id:"n4100",loc:[-85.62255,41.95128]},n4101:{id:"n4101",loc:[-85.622541,41.951437]},n4102:{id:"n4102",loc:[-85.622441,41.951438]},n4103:{id:"n4103",loc:[-85.621561,41.951444]},n4104:{id:"n4104",loc:[-85.622302,41.951479]},n4105:{id:"n4105",loc:[-85.6223,41.95152]},n4106:{id:"n4106",loc:[-85.622169,41.951517]},n4107:{id:"n4107",loc:[-85.622171,41.951476]},n4108:{id:"n4108",loc:[-85.622543,41.951228]},n4109:{id:"n4109",loc:[-85.622433,41.951228]},n411:{id:"n411",loc:[-85.633442,41.943962]},n4110:{id:"n4110",loc:[-85.622433,41.951133]},n4111:{id:"n4111",loc:[-85.622543,41.951133]},n4112:{id:"n4112",loc:[-85.622356,41.951256]},n4113:{id:"n4113",loc:[-85.622293,41.951256]},n4114:{id:"n4114",loc:[-85.622292,41.9512]},n4115:{id:"n4115",loc:[-85.622313,41.9512]},n4116:{id:"n4116",loc:[-85.622312,41.951173]},n4117:{id:"n4117",loc:[-85.622364,41.951173]},n4118:{id:"n4118",loc:[-85.622365,41.951231]},n4119:{id:"n4119",loc:[-85.622355,41.951231]},n412:{id:"n412",loc:[-85.633411,41.943932]},n4120:{id:"n4120",loc:[-85.62197,41.951155]},n4121:{id:"n4121",loc:[-85.62197,41.951213]},n4122:{id:"n4122",loc:[-85.621848,41.951213]},n4123:{id:"n4123",loc:[-85.621848,41.951155]},n4124:{id:"n4124",loc:[-85.622193,41.951268]},n4125:{id:"n4125",loc:[-85.622194,41.951305]},n4126:{id:"n4126",loc:[-85.622121,41.951306]},n4127:{id:"n4127",loc:[-85.622121,41.951322]},n4128:{id:"n4128",loc:[-85.621984,41.951324]},n4129:{id:"n4129",loc:[-85.621983,41.951271]},n413:{id:"n413",loc:[-85.633421,41.943926]},n4130:{id:"n4130",loc:[-85.622171,41.9514]},n4131:{id:"n4131",loc:[-85.622148,41.951382]},n4132:{id:"n4132",loc:[-85.6221,41.951414]},n4133:{id:"n4133",loc:[-85.622122,41.951433]},n4134:{id:"n4134",loc:[-85.621782,41.951148]},n4135:{id:"n4135",loc:[-85.621783,41.951219]},n4136:{id:"n4136",loc:[-85.62164,41.951221]},n4137:{id:"n4137",loc:[-85.62164,41.951236]},n4138:{id:"n4138",loc:[-85.621556,41.951237]},n4139:{id:"n4139",loc:[-85.621555,41.95117]},n414:{id:"n414",loc:[-85.633376,41.94388]},n4140:{id:"n4140",loc:[-85.621644,41.951169]},n4141:{id:"n4141",loc:[-85.621643,41.951139]},n4142:{id:"n4142",loc:[-85.621719,41.951138]},n4143:{id:"n4143",loc:[-85.621719,41.951148]},n4144:{id:"n4144",loc:[-85.621409,41.951322]},n4145:{id:"n4145",loc:[-85.621338,41.951322]},n4146:{id:"n4146",loc:[-85.621336,41.95115]},n4147:{id:"n4147",loc:[-85.621521,41.951149]},n4148:{id:"n4148",loc:[-85.621522,41.951228]},n4149:{id:"n4149",loc:[-85.621408,41.951228]},n415:{id:"n415",loc:[-85.633348,41.943895]},n4150:{id:"n4150",loc:[-85.621284,41.951219]},n4151:{id:"n4151",loc:[-85.621153,41.951219]},n4152:{id:"n4152",loc:[-85.621152,41.951152]},n4153:{id:"n4153",loc:[-85.621283,41.951152]},n4154:{id:"n4154",loc:[-85.621159,41.951241]},n4155:{id:"n4155",loc:[-85.62116,41.951301]},n4156:{id:"n4156",loc:[-85.621088,41.951302]},n4157:{id:"n4157",loc:[-85.621088,41.951241]},n4158:{id:"n4158",loc:[-85.621049,41.951158]},n4159:{id:"n4159",loc:[-85.62105,41.951229]},n416:{id:"n416",loc:[-85.633341,41.943888]},n4160:{id:"n4160",loc:[-85.620976,41.951229]},n4161:{id:"n4161",loc:[-85.620977,41.951295]},n4162:{id:"n4162",loc:[-85.620887,41.951296]},n4163:{id:"n4163",loc:[-85.620886,41.951229]},n4164:{id:"n4164",loc:[-85.620862,41.951229]},n4165:{id:"n4165",loc:[-85.620861,41.951159]},n4166:{id:"n4166",loc:[-85.620626,41.951133]},n4167:{id:"n4167",loc:[-85.620626,41.951205]},n4168:{id:"n4168",loc:[-85.620412,41.951206]},n4169:{id:"n4169",loc:[-85.620411,41.951134]},n417:{id:"n417",loc:[-85.633321,41.943898]},n4170:{id:"n4170",loc:[-85.621775,41.951443]},n4171:{id:"n4171",loc:[-85.621777,41.951264]},n4172:{id:"n4172",loc:[-85.621565,41.951654]},n4173:{id:"n4173",loc:[-85.621331,41.951439]},n4174:{id:"n4174",loc:[-85.621031,41.951443]},n4175:{id:"n4175",loc:[-85.621836,41.951724]},n4176:{id:"n4176",loc:[-85.621834,41.951621]},n4177:{id:"n4177",loc:[-85.62197,41.951619]},n4178:{id:"n4178",loc:[-85.621972,41.951722]},n4179:{id:"n4179",loc:[-85.621772,41.951638]},n418:{id:"n418",loc:[-85.633547,41.943896]},n4180:{id:"n4180",loc:[-85.621772,41.951715]},n4181:{id:"n4181",loc:[-85.621699,41.951716]},n4182:{id:"n4182",loc:[-85.6217,41.951722]},n4183:{id:"n4183",loc:[-85.621641,41.951722]},n4184:{id:"n4184",loc:[-85.62164,41.951639]},n4185:{id:"n4185",loc:[-85.621505,41.951655]},n4186:{id:"n4186",loc:[-85.621505,41.951729]},n4187:{id:"n4187",loc:[-85.621389,41.951729]},n4188:{id:"n4188",loc:[-85.62139,41.951654]},n4189:{id:"n4189",loc:[-85.621105,41.951635]},n419:{id:"n419",loc:[-85.633467,41.944075]},n4190:{id:"n4190",loc:[-85.621104,41.951576]},n4191:{id:"n4191",loc:[-85.621168,41.951576]},n4192:{id:"n4192",loc:[-85.621168,41.951595]},n4193:{id:"n4193",loc:[-85.621261,41.951595]},n4194:{id:"n4194",loc:[-85.621261,41.951646]},n4195:{id:"n4195",loc:[-85.621294,41.951646]},n4196:{id:"n4196",loc:[-85.621294,41.951732]},n4197:{id:"n4197",loc:[-85.621251,41.951732]},n4198:{id:"n4198",loc:[-85.621251,41.95174]},n4199:{id:"n4199",loc:[-85.621175,41.951741]},n42:{id:"n42",loc:[-85.635996,41.942727]},n420:{id:"n420",loc:[-85.633578,41.944055]},n4200:{id:"n4200",loc:[-85.621175,41.951651]},n4201:{id:"n4201",loc:[-85.621189,41.951651]},n4202:{id:"n4202",loc:[-85.621189,41.951635]},n4203:{id:"n4203",loc:[-85.620554,41.951641]},n4204:{id:"n4204",loc:[-85.620555,41.951742]},n4205:{id:"n4205",loc:[-85.620719,41.951742]},n4206:{id:"n4206",loc:[-85.620719,41.951731]},n4207:{id:"n4207",loc:[-85.620803,41.95173]},n4208:{id:"n4208",loc:[-85.620803,41.951603]},n4209:{id:"n4209",loc:[-85.62072,41.951603]},n421:{id:"n421",loc:[-85.633462,41.944125]},n4210:{id:"n4210",loc:[-85.620721,41.951641]},n4211:{id:"n4211",loc:[-85.620269,41.953053]},n4212:{id:"n4212",loc:[-85.620229,41.953051]},n4213:{id:"n4213",loc:[-85.620231,41.953013]},n4214:{id:"n4214",loc:[-85.620271,41.953015]},n4215:{id:"n4215",loc:[-85.620215,41.953133]},n4216:{id:"n4216",loc:[-85.62013,41.953134]},n4217:{id:"n4217",loc:[-85.620129,41.953083]},n4218:{id:"n4218",loc:[-85.620214,41.953082]},n4219:{id:"n4219",loc:[-85.62016,41.953272]},n422:{id:"n422",loc:[-85.633372,41.944061]},n4220:{id:"n4220",loc:[-85.620046,41.953273]},n4221:{id:"n4221",loc:[-85.620045,41.953171]},n4222:{id:"n4222",loc:[-85.620088,41.953171]},n4223:{id:"n4223",loc:[-85.620087,41.953162]},n4224:{id:"n4224",loc:[-85.620121,41.953162]},n4225:{id:"n4225",loc:[-85.620121,41.953173]},n4226:{id:"n4226",loc:[-85.620157,41.953173]},n4227:{id:"n4227",loc:[-85.620158,41.953196]},n4228:{id:"n4228",loc:[-85.620189,41.953196]},n4229:{id:"n4229",loc:[-85.620189,41.953246]},n423:{id:"n423",loc:[-85.633509,41.943981]},n4230:{id:"n4230",loc:[-85.62016,41.953246]},n4231:{id:"n4231",loc:[-85.6195,41.954012]},n4232:{id:"n4232",loc:[-85.619438,41.954057]},n4233:{id:"n4233",loc:[-85.619418,41.954043]},n4234:{id:"n4234",loc:[-85.619381,41.954069]},n4235:{id:"n4235",loc:[-85.619399,41.954083]},n4236:{id:"n4236",loc:[-85.619339,41.954126]},n4237:{id:"n4237",loc:[-85.619584,41.954313]},n4238:{id:"n4238",loc:[-85.619743,41.954198]},n4239:{id:"n4239",loc:[-85.619453,41.954727]},n424:{id:"n424",loc:[-85.635421,41.945367]},n4240:{id:"n4240",loc:[-85.619503,41.954581]},n4241:{id:"n4241",loc:[-85.619597,41.954472]},n4242:{id:"n4242",loc:[-85.619862,41.95419]},n4243:{id:"n4243",loc:[-85.619506,41.953907]},n4244:{id:"n4244",loc:[-85.619261,41.9541]},n4245:{id:"n4245",loc:[-85.619246,41.954139]},n4246:{id:"n4246",loc:[-85.619244,41.9542]},n4247:{id:"n4247",loc:[-85.619259,41.954243]},n4248:{id:"n4248",loc:[-85.619285,41.954274]},n4249:{id:"n4249",loc:[-85.619123,41.954381]},n425:{id:"n425",loc:[-85.634425,41.943552]},n4250:{id:"n4250",loc:[-85.619641,41.954607]},n4251:{id:"n4251",loc:[-85.619383,41.954615]},n4252:{id:"n4252",loc:[-85.61896,41.954391]},n4253:{id:"n4253",loc:[-85.619211,41.954178]},n4254:{id:"n4254",loc:[-85.619115,41.954102]},n4255:{id:"n4255",loc:[-85.619519,41.953821]},n4256:{id:"n4256",loc:[-85.619956,41.954156]},n4257:{id:"n4257",loc:[-85.619851,41.954266]},n4258:{id:"n4258",loc:[-85.619779,41.95436]},n4259:{id:"n4259",loc:[-85.620525,41.954364]},n426:{id:"n426",loc:[-85.634248,41.943654]},n4260:{id:"n4260",loc:[-85.620398,41.954365]},n4261:{id:"n4261",loc:[-85.620398,41.954324]},n4262:{id:"n4262",loc:[-85.620525,41.954323]},n4263:{id:"n4263",loc:[-85.620359,41.954588]},n4264:{id:"n4264",loc:[-85.620321,41.954588]},n4265:{id:"n4265",loc:[-85.620321,41.954599]},n4266:{id:"n4266",loc:[-85.620296,41.954599]},n4267:{id:"n4267",loc:[-85.620296,41.954587]},n4268:{id:"n4268",loc:[-85.620262,41.954588]},n4269:{id:"n4269",loc:[-85.620261,41.954516]},n427:{id:"n427",loc:[-85.634177,41.943585]},n4270:{id:"n4270",loc:[-85.620282,41.954516]},n4271:{id:"n4271",loc:[-85.620282,41.954373]},n4272:{id:"n4272",loc:[-85.620378,41.954373]},n4273:{id:"n4273",loc:[-85.620379,41.954486]},n4274:{id:"n4274",loc:[-85.620348,41.954486]},n4275:{id:"n4275",loc:[-85.620348,41.954537]},n4276:{id:"n4276",loc:[-85.620359,41.954537]},n4277:{id:"n4277",loc:[-85.620463,41.95521]},n4278:{id:"n4278",loc:[-85.620409,41.955273]},n4279:{id:"n4279",loc:[-85.620205,41.955177]},n428:{id:"n428",loc:[-85.634354,41.943484]},n4280:{id:"n4280",loc:[-85.620288,41.955079]},n4281:{id:"n4281",loc:[-85.620379,41.955121]},n4282:{id:"n4282",loc:[-85.620349,41.955157]},n4283:{id:"n4283",loc:[-85.620083,41.955101]},n4284:{id:"n4284",loc:[-85.620083,41.954986]},n4285:{id:"n4285",loc:[-85.620016,41.954986]},n4286:{id:"n4286",loc:[-85.620016,41.954999]},n4287:{id:"n4287",loc:[-85.619941,41.954999]},n4288:{id:"n4288",loc:[-85.619941,41.954988]},n4289:{id:"n4289",loc:[-85.619815,41.954988]},n429:{id:"n429",loc:[-85.638577,41.943212]},n4290:{id:"n4290",loc:[-85.619815,41.955075]},n4291:{id:"n4291",loc:[-85.619948,41.955075]},n4292:{id:"n4292",loc:[-85.619948,41.955082]},n4293:{id:"n4293",loc:[-85.620004,41.955082]},n4294:{id:"n4294",loc:[-85.620004,41.955101]},n4295:{id:"n4295",loc:[-85.619293,41.955127]},n4296:{id:"n4296",loc:[-85.619208,41.955124]},n4297:{id:"n4297",loc:[-85.619212,41.955061]},n4298:{id:"n4298",loc:[-85.619297,41.955064]},n4299:{id:"n4299",loc:[-85.619068,41.954936]},n43:{id:"n43",loc:[-85.637047,41.943054]},n430:{id:"n430",loc:[-85.638576,41.943219]},n4300:{id:"n4300",loc:[-85.619003,41.954936]},n4301:{id:"n4301",loc:[-85.619004,41.955003]},n4302:{id:"n4302",loc:[-85.618994,41.955003]},n4303:{id:"n4303",loc:[-85.618994,41.955016]},n4304:{id:"n4304",loc:[-85.618973,41.955016]},n4305:{id:"n4305",loc:[-85.618973,41.955071]},n4306:{id:"n4306",loc:[-85.619061,41.955071]},n4307:{id:"n4307",loc:[-85.61906,41.955024]},n4308:{id:"n4308",loc:[-85.619105,41.955024]},n4309:{id:"n4309",loc:[-85.619105,41.954956]},n431:{id:"n431",loc:[-85.638653,41.943078]},n4310:{id:"n4310",loc:[-85.619068,41.954956]},n4311:{id:"n4311",loc:[-85.618294,41.954596]},n4312:{id:"n4312",loc:[-85.618235,41.954602]},n4313:{id:"n4313",loc:[-85.618222,41.954535]},n4314:{id:"n4314",loc:[-85.618281,41.954529]},n4315:{id:"n4315",loc:[-85.618593,41.954556]},n4316:{id:"n4316",loc:[-85.618551,41.954565]},n4317:{id:"n4317",loc:[-85.618545,41.954552]},n4318:{id:"n4318",loc:[-85.618493,41.954563]},n4319:{id:"n4319",loc:[-85.618449,41.954455]},n432:{id:"n432",loc:[-85.638654,41.943148]},n4320:{id:"n4320",loc:[-85.618544,41.954434]},n4321:{id:"n4321",loc:[-85.622545,41.950775]},n4322:{id:"n4322",loc:[-85.622546,41.950843]},n4323:{id:"n4323",loc:[-85.622503,41.950844]},n4324:{id:"n4324",loc:[-85.622503,41.950853]},n4325:{id:"n4325",loc:[-85.622479,41.950853]},n4326:{id:"n4326",loc:[-85.622478,41.950843]},n4327:{id:"n4327",loc:[-85.622425,41.950843]},n4328:{id:"n4328",loc:[-85.622425,41.950808]},n4329:{id:"n4329",loc:[-85.622366,41.950809]},n433:{id:"n433",loc:[-85.638387,41.943151]},n4330:{id:"n4330",loc:[-85.622364,41.950673]},n4331:{id:"n4331",loc:[-85.622448,41.950673]},n4332:{id:"n4332",loc:[-85.622449,41.950732]},n4333:{id:"n4333",loc:[-85.622479,41.950731]},n4334:{id:"n4334",loc:[-85.622479,41.950775]},n4335:{id:"n4335",loc:[-85.621909,41.950641]},n4336:{id:"n4336",loc:[-85.621864,41.950641]},n4337:{id:"n4337",loc:[-85.621865,41.950567]},n4338:{id:"n4338",loc:[-85.62191,41.950567]},n4339:{id:"n4339",loc:[-85.621787,41.950829]},n434:{id:"n434",loc:[-85.638386,41.94308]},n4340:{id:"n4340",loc:[-85.621786,41.950775]},n4341:{id:"n4341",loc:[-85.621588,41.950776]},n4342:{id:"n4342",loc:[-85.621589,41.950848]},n4343:{id:"n4343",loc:[-85.621737,41.950847]},n4344:{id:"n4344",loc:[-85.621737,41.950829]},n4345:{id:"n4345",loc:[-85.621509,41.950846]},n4346:{id:"n4346",loc:[-85.621399,41.950846]},n4347:{id:"n4347",loc:[-85.621398,41.95073]},n4348:{id:"n4348",loc:[-85.621509,41.95073]},n4349:{id:"n4349",loc:[-85.621217,41.950841]},n435:{id:"n435",loc:[-85.634427,41.943533]},n4350:{id:"n4350",loc:[-85.6211,41.95084]},n4351:{id:"n4351",loc:[-85.6211,41.950777]},n4352:{id:"n4352",loc:[-85.621218,41.950778]},n4353:{id:"n4353",loc:[-85.621055,41.950764]},n4354:{id:"n4354",loc:[-85.621054,41.950826]},n4355:{id:"n4355",loc:[-85.620988,41.950826]},n4356:{id:"n4356",loc:[-85.620988,41.950843]},n4357:{id:"n4357",loc:[-85.620842,41.950843]},n4358:{id:"n4358",loc:[-85.620842,41.950764]},n4359:{id:"n4359",loc:[-85.620825,41.950922]},n436:{id:"n436",loc:[-85.63428,41.943229]},n4360:{id:"n4360",loc:[-85.620824,41.950553]},n4361:{id:"n4361",loc:[-85.620543,41.950771]},n4362:{id:"n4362",loc:[-85.620431,41.950772]},n4363:{id:"n4363",loc:[-85.62043,41.950585]},n4364:{id:"n4364",loc:[-85.620542,41.950585]},n4365:{id:"n4365",loc:[-85.62068,41.950505]},n4366:{id:"n4366",loc:[-85.620681,41.950552]},n4367:{id:"n4367",loc:[-85.620589,41.950553]},n4368:{id:"n4368",loc:[-85.620588,41.950506]},n4369:{id:"n4369",loc:[-85.620539,41.950407]},n437:{id:"n437",loc:[-85.634499,41.943461]},n4370:{id:"n4370",loc:[-85.62054,41.950504]},n4371:{id:"n4371",loc:[-85.620416,41.950504]},n4372:{id:"n4372",loc:[-85.620416,41.950408]},n4373:{id:"n4373",loc:[-85.620742,41.95038]},n4374:{id:"n4374",loc:[-85.620527,41.95038]},n4375:{id:"n4375",loc:[-85.620528,41.950408]},n4376:{id:"n4376",loc:[-85.622449,41.950373]},n4377:{id:"n4377",loc:[-85.622452,41.950397]},n4378:{id:"n4378",loc:[-85.622336,41.950404]},n4379:{id:"n4379",loc:[-85.622333,41.950379]},n438:{id:"n438",loc:[-85.634514,41.943486]},n4380:{id:"n4380",loc:[-85.622263,41.950324]},n4381:{id:"n4381",loc:[-85.622261,41.950256]},n4382:{id:"n4382",loc:[-85.62236,41.950254]},n4383:{id:"n4383",loc:[-85.62236,41.95027]},n4384:{id:"n4384",loc:[-85.622402,41.950281]},n4385:{id:"n4385",loc:[-85.622403,41.9503]},n4386:{id:"n4386",loc:[-85.622439,41.950299]},n4387:{id:"n4387",loc:[-85.62244,41.950334]},n4388:{id:"n4388",loc:[-85.622414,41.950335]},n4389:{id:"n4389",loc:[-85.622414,41.95036]},n439:{id:"n439",loc:[-85.63452,41.943511]},n4390:{id:"n4390",loc:[-85.62231,41.950362]},n4391:{id:"n4391",loc:[-85.622309,41.950323]},n4392:{id:"n4392",loc:[-85.622015,41.950539]},n4393:{id:"n4393",loc:[-85.621909,41.95054]},n4394:{id:"n4394",loc:[-85.621909,41.950472]},n4395:{id:"n4395",loc:[-85.622015,41.950471]},n4396:{id:"n4396",loc:[-85.62199,41.950439]},n4397:{id:"n4397",loc:[-85.621956,41.95044]},n4398:{id:"n4398",loc:[-85.621955,41.950405]},n4399:{id:"n4399",loc:[-85.621988,41.950404]},n44:{id:"n44",loc:[-85.636799,41.943055]},n440:{id:"n440",loc:[-85.63451,41.943534]},n4400:{id:"n4400",loc:[-85.621668,41.950418]},n4401:{id:"n4401",loc:[-85.621667,41.950343]},n4402:{id:"n4402",loc:[-85.621745,41.950342]},n4403:{id:"n4403",loc:[-85.621744,41.950306]},n4404:{id:"n4404",loc:[-85.621764,41.950306]},n4405:{id:"n4405",loc:[-85.621763,41.950254]},n4406:{id:"n4406",loc:[-85.621861,41.950253]},n4407:{id:"n4407",loc:[-85.621861,41.950274]},n4408:{id:"n4408",loc:[-85.621896,41.950273]},n4409:{id:"n4409",loc:[-85.621898,41.950389]},n441:{id:"n441",loc:[-85.634483,41.943556]},n4410:{id:"n4410",loc:[-85.621843,41.95039]},n4411:{id:"n4411",loc:[-85.621843,41.950425]},n4412:{id:"n4412",loc:[-85.621789,41.950425]},n4413:{id:"n4413",loc:[-85.621789,41.950386]},n4414:{id:"n4414",loc:[-85.621752,41.950387]},n4415:{id:"n4415",loc:[-85.621753,41.950417]},n4416:{id:"n4416",loc:[-85.621556,41.950562]},n4417:{id:"n4417",loc:[-85.621552,41.950217]},n4418:{id:"n4418",loc:[-85.621788,41.950562]},n4419:{id:"n4419",loc:[-85.621155,41.950562]},n442:{id:"n442",loc:[-85.63419,41.943713]},n4420:{id:"n4420",loc:[-85.622473,41.950551]},n4421:{id:"n4421",loc:[-85.622043,41.950551]},n4422:{id:"n4422",loc:[-85.62142,41.950454]},n4423:{id:"n4423",loc:[-85.621315,41.950455]},n4424:{id:"n4424",loc:[-85.621313,41.950311]},n4425:{id:"n4425",loc:[-85.621388,41.950311]},n4426:{id:"n4426",loc:[-85.621387,41.950261]},n4427:{id:"n4427",loc:[-85.621468,41.95026]},n4428:{id:"n4428",loc:[-85.621468,41.950271]},n4429:{id:"n4429",loc:[-85.621503,41.95027]},n443:{id:"n443",loc:[-85.634462,41.943294]},n4430:{id:"n4430",loc:[-85.621505,41.950353]},n4431:{id:"n4431",loc:[-85.621483,41.950354]},n4432:{id:"n4432",loc:[-85.621483,41.950392]},n4433:{id:"n4433",loc:[-85.621419,41.950393]},n4434:{id:"n4434",loc:[-85.621213,41.95039]},n4435:{id:"n4435",loc:[-85.621127,41.950391]},n4436:{id:"n4436",loc:[-85.621126,41.950357]},n4437:{id:"n4437",loc:[-85.621094,41.950357]},n4438:{id:"n4438",loc:[-85.621094,41.950391]},n4439:{id:"n4439",loc:[-85.620977,41.950392]},n444:{id:"n444",loc:[-85.634298,41.943389]},n4440:{id:"n4440",loc:[-85.620975,41.950278]},n4441:{id:"n4441",loc:[-85.621087,41.950277]},n4442:{id:"n4442",loc:[-85.621088,41.950331]},n4443:{id:"n4443",loc:[-85.621211,41.950312]},n4444:{id:"n4444",loc:[-85.621104,41.950313]},n4445:{id:"n4445",loc:[-85.621105,41.950331]},n4446:{id:"n4446",loc:[-85.620706,41.950328]},n4447:{id:"n4447",loc:[-85.620606,41.950327]},n4448:{id:"n4448",loc:[-85.620607,41.950261]},n4449:{id:"n4449",loc:[-85.620707,41.950262]},n445:{id:"n445",loc:[-85.634527,41.943623]},n4450:{id:"n4450",loc:[-85.620599,41.950336]},n4451:{id:"n4451",loc:[-85.620559,41.950336]},n4452:{id:"n4452",loc:[-85.620559,41.950299]},n4453:{id:"n4453",loc:[-85.620599,41.950299]},n4454:{id:"n4454",loc:[-85.620545,41.950357]},n4455:{id:"n4455",loc:[-85.620418,41.950357]},n4456:{id:"n4456",loc:[-85.620417,41.950257]},n4457:{id:"n4457",loc:[-85.620544,41.950256]},n4458:{id:"n4458",loc:[-85.620246,41.950131],tags:{highway:"crossing"}},n4459:{id:"n4459",loc:[-85.620252,41.950956]},n446:{id:"n446",loc:[-85.634608,41.943577]},n4460:{id:"n4460",loc:[-85.620245,41.950179]},n4461:{id:"n4461",loc:[-85.620246,41.950088]},n4462:{id:"n4462",loc:[-85.620251,41.950885]},n4463:{id:"n4463",loc:[-85.620103,41.950884],tags:{crossing:"marked",highway:"crossing"}},n4464:{id:"n4464",loc:[-85.619992,41.950884]},n4465:{id:"n4465",loc:[-85.619704,41.951008]},n4466:{id:"n4466",loc:[-85.619599,41.951122]},n4467:{id:"n4467",loc:[-85.619264,41.951486]},n4468:{id:"n4468",loc:[-85.619179,41.951573],tags:{highway:"crossing"}},n4469:{id:"n4469",loc:[-85.620251,41.950999],tags:{highway:"crossing"}},n447:{id:"n447",loc:[-85.634555,41.943531]},n4470:{id:"n4470",loc:[-85.620249,41.951066]},n4471:{id:"n4471",loc:[-85.620256,41.951374]},n4472:{id:"n4472",loc:[-85.620249,41.951389]},n4473:{id:"n4473",loc:[-85.620249,41.951407]},n4474:{id:"n4474",loc:[-85.620255,41.951423]},n4475:{id:"n4475",loc:[-85.62026,41.951853]},n4476:{id:"n4476",loc:[-85.620262,41.951894],tags:{highway:"crossing"}},n4477:{id:"n4477",loc:[-85.620265,41.951957]},n4478:{id:"n4478",loc:[-85.620262,41.952135]},n4479:{id:"n4479",loc:[-85.620241,41.952424]},n448:{id:"n448",loc:[-85.634555,41.943482]},n4480:{id:"n4480",loc:[-85.620213,41.952583]},n4481:{id:"n4481",loc:[-85.620158,41.952754]},n4482:{id:"n4482",loc:[-85.620065,41.952942]},n4483:{id:"n4483",loc:[-85.619753,41.953439]},n4484:{id:"n4484",loc:[-85.619605,41.953626]},n4485:{id:"n4485",loc:[-85.619381,41.953834]},n4486:{id:"n4486",loc:[-85.619069,41.954066]},n4487:{id:"n4487",loc:[-85.618674,41.95429]},n4488:{id:"n4488",loc:[-85.621816,41.952389]},n4489:{id:"n4489",loc:[-85.6217,41.952386]},n449:{id:"n449",loc:[-85.634509,41.943427]},n4490:{id:"n4490",loc:[-85.621705,41.952306]},n4491:{id:"n4491",loc:[-85.621821,41.95231]},n4492:{id:"n4492",loc:[-85.621819,41.952272]},n4493:{id:"n4493",loc:[-85.621778,41.952272]},n4494:{id:"n4494",loc:[-85.621778,41.952199]},n4495:{id:"n4495",loc:[-85.621818,41.952199]},n4496:{id:"n4496",loc:[-85.621754,41.952281]},n4497:{id:"n4497",loc:[-85.621701,41.95228]},n4498:{id:"n4498",loc:[-85.621702,41.952197]},n4499:{id:"n4499",loc:[-85.621755,41.952197]},n45:{id:"n45",loc:[-85.636791,41.942792]},n450:{id:"n450",loc:[-85.63453,41.943365]},n4500:{id:"n4500",loc:[-85.628201,41.954694],tags:{highway:"stop",stop:"all",direction:"forward"}},n4501:{id:"n4501",loc:[-85.627921,41.954783],tags:{highway:"stop",stop:"all",direction:"backward"}},n4502:{id:"n4502",loc:[-85.62775,41.954696],tags:{highway:"stop",stop:"all",direction:"backward"}},n4503:{id:"n4503",loc:[-85.628046,41.954591],tags:{highway:"stop",stop:"all",direction:"forward"}},n4504:{id:"n4504",loc:[-85.631074,41.957428],tags:{highway:"stop",direction:"backward",stop:"minor"}},n4505:{id:"n4505",loc:[-85.630768,41.957429],tags:{highway:"stop",direction:"forward",stop:"minor"}},n4506:{id:"n4506",loc:[-85.629888,41.957432],tags:{highway:"stop",direction:"backward",stop:"minor"}},n4507:{id:"n4507",loc:[-85.629565,41.957433],tags:{highway:"stop",stop:"minor",direction:"forward"}},n4508:{id:"n4508",loc:[-85.629559,41.957343]},n4509:{id:"n4509",loc:[-85.628723,41.95735]},n451:{id:"n451",loc:[-85.634356,41.943468]},n4510:{id:"n4510",loc:[-85.62842,41.957515]},n4511:{id:"n4511",loc:[-85.627561,41.957525]},n4512:{id:"n4512",loc:[-85.630323,41.957508]},n4513:{id:"n4513",loc:[-85.630811,41.957506]},n4514:{id:"n4514",loc:[-85.630839,41.960874]},n4515:{id:"n4515",loc:[-85.631035,41.957506]},n4516:{id:"n4516",loc:[-85.632027,41.9575]},n4517:{id:"n4517",loc:[-85.631038,41.958066]},n4518:{id:"n4518",loc:[-85.630787,41.954769]},n4519:{id:"n4519",loc:[-85.630806,41.957342]},n452:{id:"n452",loc:[-85.634123,41.943596]},n4520:{id:"n4520",loc:[-85.630809,41.957428],tags:{highway:"crossing"}},n4521:{id:"n4521",loc:[-85.630912,41.957506],tags:{highway:"crossing"}},n4522:{id:"n4522",loc:[-85.631033,41.957428],tags:{highway:"crossing"}},n4523:{id:"n4523",loc:[-85.631032,41.957341]},n4524:{id:"n4524",loc:[-85.63091,41.957341],tags:{highway:"crossing"}},n4525:{id:"n4525",loc:[-85.631027,41.95597]},n4526:{id:"n4526",loc:[-85.631027,41.955913],tags:{highway:"crossing"}},n4527:{id:"n4527",loc:[-85.631025,41.955873]},n4528:{id:"n4528",loc:[-85.631073,41.955913],tags:{highway:"stop",stop:"minor",direction:"backward"}},n4529:{id:"n4529",loc:[-85.631007,41.954766]},n453:{id:"n453",loc:[-85.634709,41.943926]},n4530:{id:"n4530",loc:[-85.630881,41.954768],tags:{highway:"crossing"}},n4531:{id:"n4531",loc:[-85.628022,41.954776]},n4532:{id:"n4532",loc:[-85.627385,41.95584]},n4533:{id:"n4533",loc:[-85.627329,41.955937]},n4534:{id:"n4534",loc:[-85.626583,41.957153]},n4535:{id:"n4535",loc:[-85.629675,41.954564],tags:{highway:"stop",direction:"forward",stop:"minor"}},n4536:{id:"n4536",loc:[-85.630881,41.954806],tags:{highway:"stop",stop:"minor",direction:"backward"}},n4537:{id:"n4537",loc:[-85.630879,41.954564],tags:{highway:"stop",stop:"minor",direction:"forward"}},n4538:{id:"n4538",loc:[-85.630784,41.954682],tags:{highway:"crossing"}},n4539:{id:"n4539",loc:[-85.63078,41.954595]},n454:{id:"n454",loc:[-85.63525,41.943855]},n4540:{id:"n4540",loc:[-85.630879,41.954595],tags:{highway:"crossing"}},n4541:{id:"n4541",loc:[-85.631004,41.954594]},n4542:{id:"n4542",loc:[-85.631006,41.954681],tags:{highway:"crossing"}},n4543:{id:"n4543",loc:[-85.631045,41.959036],tags:{highway:"stop",stop:"minor",direction:"backward"}},n4544:{id:"n4544",loc:[-85.632071,41.959029],tags:{highway:"stop",stop:"minor",direction:"forward"}},n4545:{id:"n4545",loc:[-85.632257,41.959027],tags:{highway:"stop",stop:"minor",direction:"backward"}},n4546:{id:"n4546",loc:[-85.631966,41.957427],tags:{highway:"stop",direction:"forward",stop:"minor"}},n4547:{id:"n4547",loc:[-85.632297,41.957426],tags:{highway:"stop",direction:"backward",stop:"minor"}},n4548:{id:"n4548",loc:[-85.631976,41.955911],tags:{highway:"give_way",direction:"forward"}},n4549:{id:"n4549",loc:[-85.632272,41.955911],tags:{highway:"give_way",direction:"backward"}},n455:{id:"n455",loc:[-85.635224,41.943869]},n4550:{id:"n4550",loc:[-85.632097,41.954805],tags:{highway:"stop",stop:"minor",direction:"backward"}},n4551:{id:"n4551",loc:[-85.632094,41.954566],tags:{highway:"stop",stop:"minor",direction:"forward"}},n4552:{id:"n4552",loc:[-85.626519,41.957256]},n4553:{id:"n4553",loc:[-85.625334,41.959165]},n4554:{id:"n4554",loc:[-85.626483,41.95806]},n4555:{id:"n4555",loc:[-85.626481,41.958175]},n4556:{id:"n4556",loc:[-85.626412,41.958174]},n4557:{id:"n4557",loc:[-85.626412,41.958202]},n4558:{id:"n4558",loc:[-85.62628,41.958201]},n4559:{id:"n4559",loc:[-85.626283,41.958057]},n456:{id:"n456",loc:[-85.638854,41.943104]},n4560:{id:"n4560",loc:[-85.622763,41.95109],tags:{highway:"stop",direction:"backward",stop:"minor"}},n4561:{id:"n4561",loc:[-85.622858,41.950876],tags:{emergency:"fire_hydrant"}},n4562:{id:"n4562",loc:[-85.624073,41.950393]},n4563:{id:"n4563",loc:[-85.624077,41.950924]},n4564:{id:"n4564",loc:[-85.624599,41.950984],tags:{highway:"stop",direction:"forward",stop:"minor"}},n4565:{id:"n4565",loc:[-85.624831,41.95119],tags:{emergency:"fire_hydrant"}},n4566:{id:"n4566",loc:[-85.624437,41.952568],tags:{emergency:"fire_hydrant"}},n4567:{id:"n4567",loc:[-85.624077,41.954606],tags:{emergency:"fire_hydrant"}},n4568:{id:"n4568",loc:[-85.624263,41.954888]},n4569:{id:"n4569",loc:[-85.624206,41.954919]},n457:{id:"n457",loc:[-85.635186,41.943901]},n4570:{id:"n4570",loc:[-85.624154,41.954865]},n4571:{id:"n4571",loc:[-85.624212,41.954835]},n4572:{id:"n4572",loc:[-85.622442,41.954401],tags:{emergency:"fire_hydrant"}},n4573:{id:"n4573",loc:[-85.619751,41.954658],tags:{emergency:"fire_hydrant"}},n4574:{id:"n4574",loc:[-85.617785,41.954534]},n4575:{id:"n4575",loc:[-85.617416,41.954721]},n4576:{id:"n4576",loc:[-85.617662,41.95474]},n4577:{id:"n4577",loc:[-85.618014,41.954717]},n4578:{id:"n4578",loc:[-85.617886,41.954671]},n4579:{id:"n4579",loc:[-85.617831,41.954612]},n458:{id:"n458",loc:[-85.635162,41.943917]},n4580:{id:"n4580",loc:[-85.617968,41.954752]},n4581:{id:"n4581",loc:[-85.617815,41.954752]},n4582:{id:"n4582",loc:[-85.617938,41.954695]},n4583:{id:"n4583",loc:[-85.617856,41.954642],tags:{highway:"stop",direction:"forward",stop:"minor"}},n4584:{id:"n4584",loc:[-85.619116,41.954164],tags:{man_made:"flagpole"}},n4585:{id:"n4585",loc:[-85.619569,41.953255],tags:{emergency:"fire_hydrant"}},n4586:{id:"n4586",loc:[-85.620352,41.951894],tags:{highway:"stop",direction:"forward",stop:"minor"}},n4587:{id:"n4587",loc:[-85.620485,41.951948],tags:{emergency:"fire_hydrant"}},n4588:{id:"n4588",loc:[-85.620316,41.950999],tags:{highway:"stop",direction:"backward",stop:"minor"}},n4589:{id:"n4589",loc:[-85.620311,41.950131],tags:{highway:"stop",direction:"backward",stop:"minor"}},n459:{id:"n459",loc:[-85.634856,41.943905]},n4590:{id:"n4590",loc:[-85.620374,41.95018],tags:{emergency:"fire_hydrant"}},n4591:{id:"n4591",loc:[-85.620301,41.949239],tags:{highway:"stop",direction:"backward",stop:"minor"}},n4592:{id:"n4592",loc:[-85.620278,41.947443],tags:{highway:"stop",direction:"backward",stop:"minor"}},n4593:{id:"n4593",loc:[-85.619844,41.947444],tags:{highway:"stop",direction:"forward",stop:"minor"}},n4594:{id:"n4594",loc:[-85.620191,41.947352],tags:{emergency:"fire_hydrant"}},n4595:{id:"n4595",loc:[-85.622819,41.947493],tags:{emergency:"fire_hydrant"}},n4596:{id:"n4596",loc:[-85.622744,41.947541],tags:{highway:"stop",stop:"minor",direction:"backward"}},n4597:{id:"n4597",loc:[-85.622739,41.947316],tags:{highway:"stop",direction:"forward",stop:"minor"}},n4598:{id:"n4598",loc:[-85.622909,41.948333],tags:{highway:"give_way"}},n4599:{id:"n4599",loc:[-85.622593,41.948333],tags:{highway:"give_way"}},n46:{id:"n46",loc:[-85.637131,41.94307]},n460:{id:"n460",loc:[-85.634811,41.944007]},n4600:{id:"n4600",loc:[-85.622835,41.948387],tags:{emergency:"fire_hydrant"}},n4601:{id:"n4601",loc:[-85.622768,41.949125],tags:{highway:"stop",direction:"forward",stop:"minor"}},n4602:{id:"n4602",loc:[-85.622769,41.949325],tags:{highway:"stop",stop:"minor",direction:"backward"}},n4603:{id:"n4603",loc:[-85.622837,41.949329],tags:{emergency:"fire_hydrant"}},n4604:{id:"n4604",loc:[-85.622614,41.950113],tags:{highway:"give_way",direction:"forward"}},n4605:{id:"n4605",loc:[-85.624777,41.949219],tags:{highway:"stop",direction:"forward",stop:"minor"}},n4606:{id:"n4606",loc:[-85.624849,41.949106],tags:{emergency:"fire_hydrant"}},n4607:{id:"n4607",loc:[-85.624858,41.950119],tags:{emergency:"fire_hydrant"}},n4608:{id:"n4608",loc:[-85.624752,41.948334],tags:{highway:"give_way"}},n4609:{id:"n4609",loc:[-85.624845,41.948422],tags:{emergency:"fire_hydrant"}},n461:{id:"n461",loc:[-85.634987,41.943112]},n4610:{id:"n4610",loc:[-85.62484,41.947539],tags:{emergency:"fire_hydrant"}},n4611:{id:"n4611",loc:[-85.62476,41.947428],tags:{highway:"stop",stop:"minor",direction:"forward"}},n4612:{id:"n4612",loc:[-85.620286,41.950926]},n4613:{id:"n4613",loc:[-85.618237,41.950963]},n4614:{id:"n4614",loc:[-85.618107,41.950876]},n4615:{id:"n4615",loc:[-85.618131,41.950393]},n4616:{id:"n4616",loc:[-85.618232,41.949913]},n4617:{id:"n4617",loc:[-85.619138,41.950212]},n4618:{id:"n4618",loc:[-85.619299,41.950388]},n4619:{id:"n4619",loc:[-85.619306,41.950897]},n462:{id:"n462",loc:[-85.634698,41.943194]},n4620:{id:"n4620",loc:[-85.619155,41.950958]},n4621:{id:"n4621",loc:[-85.620079,41.947715]},n4622:{id:"n4622",loc:[-85.619674,41.947728]},n4623:{id:"n4623",loc:[-85.619634,41.947735]},n4624:{id:"n4624",loc:[-85.619587,41.947756],tags:{barrier:"gate"}},n4625:{id:"n4625",loc:[-85.61953,41.947796]},n4626:{id:"n4626",loc:[-85.619475,41.947847]},n4627:{id:"n4627",loc:[-85.619433,41.947903]},n4628:{id:"n4628",loc:[-85.619402,41.947982]},n4629:{id:"n4629",loc:[-85.619394,41.948043]},n463:{id:"n463",loc:[-85.634632,41.943219]},n4630:{id:"n4630",loc:[-85.619395,41.948476]},n4631:{id:"n4631",loc:[-85.618367,41.947452]},n4632:{id:"n4632",loc:[-85.618371,41.947567],tags:{barrier:"gate"}},n4633:{id:"n4633",loc:[-85.618341,41.947622]},n4634:{id:"n4634",loc:[-85.618138,41.94773]},n4635:{id:"n4635",loc:[-85.618078,41.947814]},n4636:{id:"n4636",loc:[-85.618072,41.948009]},n4637:{id:"n4637",loc:[-85.618269,41.947666]},n4638:{id:"n4638",loc:[-85.618099,41.947765]},n4639:{id:"n4639",loc:[-85.618378,41.954453]},n464:{id:"n464",loc:[-85.63459,41.943239]},n4640:{id:"n4640",loc:[-85.618198,41.95453]},n4641:{id:"n4641",loc:[-85.618212,41.954623]},n4642:{id:"n4642",loc:[-85.635211,41.943103],tags:{leisure:"picnic_table"}},n4643:{id:"n4643",loc:[-85.635345,41.943448],tags:{leisure:"picnic_table"}},n4644:{id:"n4644",loc:[-85.635901,41.943353],tags:{amenity:"bench"}},n4645:{id:"n4645",loc:[-85.635818,41.942638],tags:{highway:"stop",direction:"forward",stop:"minor"}},n4646:{id:"n4646",loc:[-85.635355,41.942044],tags:{leisure:"picnic_table"}},n4647:{id:"n4647",loc:[-85.635206,41.942045],tags:{leisure:"picnic_table"}},n4648:{id:"n4648",loc:[-85.63504,41.941992],tags:{leisure:"picnic_table"}},n4649:{id:"n4649",loc:[-85.635185,41.942001]},n465:{id:"n465",loc:[-85.634555,41.943263]},n4650:{id:"n4650",loc:[-85.635176,41.942021]},n4651:{id:"n4651",loc:[-85.635127,41.942008]},n4652:{id:"n4652",loc:[-85.635136,41.941988]},n4653:{id:"n4653",loc:[-85.635,41.941709],tags:{emergency:"fire_hydrant"}},n4654:{id:"n4654",loc:[-85.634893,41.941801]},n4655:{id:"n4655",loc:[-85.634937,41.941843]},n4656:{id:"n4656",loc:[-85.634963,41.941859]},n4657:{id:"n4657",loc:[-85.635027,41.941904]},n4658:{id:"n4658",loc:[-85.63494,41.94187]},n4659:{id:"n4659",loc:[-85.634951,41.941871]},n466:{id:"n466",loc:[-85.634526,41.943289]},n4660:{id:"n4660",loc:[-85.634753,41.941701],tags:{amenity:"drinking_water"}},n4661:{id:"n4661",loc:[-85.634717,41.941804],tags:{amenity:"bench"}},n4662:{id:"n4662",loc:[-85.634554,41.941883],tags:{amenity:"bench"}},n4663:{id:"n4663",loc:[-85.635002,41.941579],tags:{amenity:"fountain"}},n4664:{id:"n4664",loc:[-85.635258,41.94188],tags:{amenity:"waste_basket"}},n4665:{id:"n4665",loc:[-85.635262,41.941581],tags:{amenity:"bench"}},n4666:{id:"n4666",loc:[-85.635319,41.941744],tags:{amenity:"bench"}},n4667:{id:"n4667",loc:[-85.634702,41.941473],tags:{amenity:"waste_basket"}},n4668:{id:"n4668",loc:[-85.633981,41.941966],tags:{amenity:"bench"}},n4669:{id:"n4669",loc:[-85.63388,41.941743]},n467:{id:"n467",loc:[-85.635163,41.944985]},n4670:{id:"n4670",loc:[-85.633746,41.941741]},n4671:{id:"n4671",loc:[-85.633749,41.941664]},n4672:{id:"n4672",loc:[-85.633883,41.941667]},n4673:{id:"n4673",loc:[-85.634283,41.941183],tags:{leisure:"picnic_table"}},n4674:{id:"n4674",loc:[-85.634046,41.941102],tags:{amenity:"bbq"}},n4675:{id:"n4675",loc:[-85.63401,41.941093],tags:{amenity:"bbq"}},n4676:{id:"n4676",loc:[-85.633408,41.940862],tags:{amenity:"bench"}},n4677:{id:"n4677",loc:[-85.633359,41.940651],tags:{amenity:"bench"}},n4678:{id:"n4678",loc:[-85.634109,41.940831]},n4679:{id:"n4679",loc:[-85.63396,41.940867]},n468:{id:"n468",loc:[-85.635095,41.945035]},n4680:{id:"n4680",loc:[-85.633816,41.940913]},n4681:{id:"n4681",loc:[-85.633237,41.940455]},n4682:{id:"n4682",loc:[-85.634453,41.940025],tags:{emergency:"fire_hydrant"}},n4683:{id:"n4683",loc:[-85.635692,41.940218],tags:{emergency:"fire_hydrant"}},n4684:{id:"n4684",loc:[-85.635566,41.940102],tags:{highway:"stop",direction:"forward",stop:"minor"}},n4685:{id:"n4685",loc:[-85.635961,41.940125],tags:{highway:"stop",stop:"minor",direction:"backward"}},n4686:{id:"n4686",loc:[-85.635883,41.94012],tags:{crossing:"marked",highway:"crossing"}},n4687:{id:"n4687",loc:[-85.635883,41.94006]},n4688:{id:"n4688",loc:[-85.635774,41.940051],tags:{crossing:"marked",highway:"crossing"}},n4689:{id:"n4689",loc:[-85.635669,41.940043]},n469:{id:"n469",loc:[-85.634269,41.944431]},n4690:{id:"n4690",loc:[-85.635661,41.940107],tags:{crossing:"marked",highway:"crossing"}},n4691:{id:"n4691",loc:[-85.635424,41.941005],tags:{amenity:"fountain"}},n4692:{id:"n4692",loc:[-85.635542,41.941371],tags:{amenity:"bench"}},n4693:{id:"n4693",loc:[-85.635709,41.941341],tags:{emergency:"fire_hydrant"}},n4694:{id:"n4694",loc:[-85.637038,41.942513],tags:{highway:"stop",direction:"forward",stop:"minor"}},n4695:{id:"n4695",loc:[-85.637174,41.941354],tags:{highway:"stop",direction:"backward",stop:"minor"}},n4696:{id:"n4696",loc:[-85.637091,41.941273],tags:{emergency:"fire_hydrant"}},n4697:{id:"n4697",loc:[-85.638058,41.941346],tags:{highway:"give_way",direction:"forward"}},n4698:{id:"n4698",loc:[-85.638359,41.941344],tags:{highway:"give_way",direction:"backward"}},n4699:{id:"n4699",loc:[-85.638288,41.941236],tags:{emergency:"fire_hydrant"}},n47:{id:"n47",loc:[-85.636693,41.943073]},n470:{id:"n470",loc:[-85.634352,41.944376]},n4700:{id:"n4700",loc:[-85.63935,41.94128],tags:{emergency:"fire_hydrant"}},n4701:{id:"n4701",loc:[-85.639277,41.941337],tags:{highway:"give_way",direction:"forward"}},n4702:{id:"n4702",loc:[-85.639548,41.941334],tags:{highway:"give_way",direction:"backward"}},n4703:{id:"n4703",loc:[-85.642191,41.940039]},n4704:{id:"n4704",loc:[-85.640585,41.941263],tags:{emergency:"fire_hydrant"}},n4705:{id:"n4705",loc:[-85.64049,41.941327],tags:{highway:"stop",direction:"forward",stop:"minor"}},n4706:{id:"n4706",loc:[-85.640803,41.941324],tags:{highway:"stop",direction:"backward",stop:"minor"}},n4707:{id:"n4707",loc:[-85.641717,41.941317],tags:{highway:"stop",direction:"forward",stop:"all"}},n4708:{id:"n4708",loc:[-85.641846,41.941415],tags:{highway:"stop",direction:"backward",stop:"all"}},n4709:{id:"n4709",loc:[-85.641756,41.941392],tags:{emergency:"fire_hydrant"}},n471:{id:"n471",loc:[-85.634747,41.944561],tags:{railway:"crossing"}},n4710:{id:"n4710",loc:[-85.642014,41.941313],tags:{highway:"stop",direction:"forward",stop:"all"}},n4711:{id:"n4711",loc:[-85.641854,41.942455],tags:{highway:"stop",direction:"forward",stop:"minor"}},n4712:{id:"n4712",loc:[-85.641859,41.942739],tags:{highway:"stop",direction:"backward",stop:"minor"}},n4713:{id:"n4713",loc:[-85.640754,41.942707],tags:{emergency:"fire_hydrant"}},n4714:{id:"n4714",loc:[-85.640669,41.942716],tags:{highway:"stop",direction:"backward",stop:"minor"}},n4715:{id:"n4715",loc:[-85.640664,41.942478],tags:{highway:"stop",direction:"forward",stop:"minor"}},n4716:{id:"n4716",loc:[-85.63964,41.94274],tags:{man_made:"flagpole"}},n4717:{id:"n4717",loc:[-85.639455,41.942731],tags:{highway:"stop",direction:"backward",stop:"minor"}},n4718:{id:"n4718",loc:[-85.63945,41.942492],tags:{highway:"stop",direction:"forward",stop:"minor"}},n4719:{id:"n4719",loc:[-85.639527,41.942505],tags:{emergency:"fire_hydrant"}},n472:{id:"n472",loc:[-85.634667,41.944613]},n4720:{id:"n4720",loc:[-85.638238,41.942745],tags:{highway:"stop",direction:"backward",stop:"minor"}},n4721:{id:"n4721",loc:[-85.638233,41.942511],tags:{highway:"stop",direction:"forward",stop:"minor"}},n4722:{id:"n4722",loc:[-85.638018,41.94299],tags:{amenity:"waste_disposal"}},n4723:{id:"n4723",loc:[-85.637918,41.944152],tags:{amenity:"waste_basket"}},n4724:{id:"n4724",loc:[-85.635902,41.943291],tags:{leisure:"picnic_table"}},n4725:{id:"n4725",loc:[-85.63704,41.942741],tags:{highway:"stop",direction:"forward",stop:"minor"}},n4726:{id:"n4726",loc:[-85.633467,41.943818],tags:{highway:"stop",stop:"minor",direction:"backward"}},n4727:{id:"n4727",loc:[-85.633987,41.943531],tags:{highway:"stop",direction:"forward",stop:"minor"}},n4728:{id:"n4728",loc:[-85.632154,41.943539],tags:{emergency:"fire_hydrant"}},n4729:{id:"n4729",loc:[-85.633567,41.944641],tags:{amenity:"bench"}},n473:{id:"n473",loc:[-85.634161,41.944371]},n4730:{id:"n4730",loc:[-85.633127,41.944574],tags:{amenity:"bench"}},n4731:{id:"n4731",loc:[-85.633439,41.944871],tags:{amenity:"bench"}},n4732:{id:"n4732",loc:[-85.633676,41.944799],tags:{amenity:"waste_basket"}},n4733:{id:"n4733",loc:[-85.633466,41.944862],tags:{amenity:"waste_basket"}},n4734:{id:"n4734",loc:[-85.633451,41.944847],tags:{emergency:"fire_hydrant"}},n4735:{id:"n4735",loc:[-85.634202,41.945543],tags:{amenity:"waste_basket"}},n4736:{id:"n4736",loc:[-85.634652,41.945472],tags:{leisure:"picnic_table"}},n4737:{id:"n4737",loc:[-85.6347,41.945445],tags:{leisure:"picnic_table"}},n4738:{id:"n4738",loc:[-85.634646,41.945662],tags:{emergency:"fire_hydrant"}},n4739:{id:"n4739",loc:[-85.634673,41.945687],tags:{amenity:"waste_basket"}},n474:{id:"n474",loc:[-85.633861,41.944117]},n4740:{id:"n4740",loc:[-85.63449,41.945827],tags:{amenity:"clock",display:"analog"}},n4741:{id:"n4741",loc:[-85.63481,41.946056],tags:{highway:"stop",stop:"minor",direction:"backward"}},n4742:{id:"n4742",loc:[-85.634814,41.946176],tags:{amenity:"post_box"}},n4743:{id:"n4743",loc:[-85.638744,41.945328]},n4744:{id:"n4744",loc:[-85.63867,41.945228],tags:{amenity:"bench"}},n4745:{id:"n4745",loc:[-85.639487,41.945042],tags:{highway:"stop",direction:"forward",stop:"minor"}},n4746:{id:"n4746",loc:[-85.639635,41.94387],tags:{highway:"stop",stop:"minor",direction:"backward"}},n4747:{id:"n4747",loc:[-85.639549,41.943756],tags:{emergency:"fire_hydrant"}},n4748:{id:"n4748",loc:[-85.64055,41.943862],tags:{highway:"stop",direction:"forward",stop:"minor"}},n4749:{id:"n4749",loc:[-85.640864,41.943859],tags:{highway:"stop",stop:"minor",direction:"backward"}},n475:{id:"n475",loc:[-85.633906,41.943535]},n4750:{id:"n4750",loc:[-85.640718,41.945022],tags:{highway:"stop",direction:"forward",stop:"minor"}},n4751:{id:"n4751",loc:[-85.640664,41.945076],tags:{emergency:"fire_hydrant"}},n4752:{id:"n4752",loc:[-85.641913,41.94502],tags:{highway:"stop",direction:"forward",stop:"minor"}},n4753:{id:"n4753",loc:[-85.641838,41.945076],tags:{emergency:"fire_hydrant"}},n4754:{id:"n4754",loc:[-85.642045,41.94385],tags:{highway:"give_way",direction:"backward"}},n4755:{id:"n4755",loc:[-85.641738,41.943852],tags:{highway:"give_way",direction:"forward"}},n4756:{id:"n4756",loc:[-85.642928,41.943843],tags:{highway:"stop",stop:"minor",direction:"forward"}},n4757:{id:"n4757",loc:[-85.64305,41.943902],tags:{emergency:"fire_hydrant"}},n4758:{id:"n4758",loc:[-85.642986,41.945105],tags:{highway:"stop",direction:"backward",stop:"all"}},n4759:{id:"n4759",loc:[-85.643136,41.94502],tags:{highway:"stop",stop:"all",direction:"forward"}},n476:{id:"n476",loc:[-85.63423,41.943692]},n4760:{id:"n4760",loc:[-85.63169,41.947812]},n4761:{id:"n4761",loc:[-85.631307,41.947655]},n4762:{id:"n4762",loc:[-85.631407,41.947413]},n4763:{id:"n4763",loc:[-85.631173,41.947306]},n4764:{id:"n4764",loc:[-85.631316,41.947145]},n4765:{id:"n4765",loc:[-85.631476,41.947087]},n4766:{id:"n4766",loc:[-85.631793,41.946871]},n4767:{id:"n4767",loc:[-85.631884,41.946723]},n4768:{id:"n4768",loc:[-85.631814,41.946397]},n4769:{id:"n4769",loc:[-85.631382,41.947685]},n477:{id:"n477",loc:[-85.635096,41.942814]},n4770:{id:"n4770",loc:[-85.63109,41.947819]},n4771:{id:"n4771",loc:[-85.630921,41.947961]},n4772:{id:"n4772",loc:[-85.630249,41.947709]},n4773:{id:"n4773",loc:[-85.630149,41.947451]},n4774:{id:"n4774",loc:[-85.629733,41.947339]},n4775:{id:"n4775",loc:[-85.629755,41.946948]},n4776:{id:"n4776",loc:[-85.630457,41.947103]},n4777:{id:"n4777",loc:[-85.630934,41.946939]},n4778:{id:"n4778",loc:[-85.631277,41.946852]},n4779:{id:"n4779",loc:[-85.63142,41.946781]},n478:{id:"n478",loc:[-85.635058,41.942795]},n4780:{id:"n4780",loc:[-85.631116,41.946474]},n4781:{id:"n4781",loc:[-85.63073,41.945965]},n4782:{id:"n4782",loc:[-85.631337,41.94571]},n4783:{id:"n4783",loc:[-85.631589,41.945487]},n4784:{id:"n4784",loc:[-85.632278,41.945784]},n4785:{id:"n4785",loc:[-85.632105,41.946034]},n4786:{id:"n4786",loc:[-85.632532,41.946198]},n4787:{id:"n4787",loc:[-85.632566,41.946151]},n4788:{id:"n4788",loc:[-85.632684,41.946196]},n4789:{id:"n4789",loc:[-85.628676,41.947106]},n479:{id:"n479",loc:[-85.635002,41.94279]},n4790:{id:"n4790",loc:[-85.628973,41.946476]},n4791:{id:"n4791",loc:[-85.629094,41.946079]},n4792:{id:"n4792",loc:[-85.629226,41.94578]},n4793:{id:"n4793",loc:[-85.629479,41.945682]},n4794:{id:"n4794",loc:[-85.630606,41.94569]},n4795:{id:"n4795",loc:[-85.631255,41.945588]},n4796:{id:"n4796",loc:[-85.631546,41.945281]},n4797:{id:"n4797",loc:[-85.631629,41.944823]},n4798:{id:"n4798",loc:[-85.631766,41.944958]},n4799:{id:"n4799",loc:[-85.631689,41.945318]},n48:{id:"n48",loc:[-85.636689,41.94276]},n480:{id:"n480",loc:[-85.634908,41.94279]},n4800:{id:"n4800",loc:[-85.615069,41.945527]},n4801:{id:"n4801",loc:[-85.615058,41.946677]},n4802:{id:"n4802",loc:[-85.613692,41.946689]},n4803:{id:"n4803",loc:[-85.613475,41.946531]},n4804:{id:"n4804",loc:[-85.611717,41.946252]},n4805:{id:"n4805",loc:[-85.611353,41.946385]},n4806:{id:"n4806",loc:[-85.611304,41.947397]},n4807:{id:"n4807",loc:[-85.610564,41.947401]},n4808:{id:"n4808",loc:[-85.610553,41.947122]},n4809:{id:"n4809",loc:[-85.610194,41.946992]},n481:{id:"n481",loc:[-85.634478,41.942342]},n4810:{id:"n4810",loc:[-85.609976,41.946628]},n4811:{id:"n4811",loc:[-85.609769,41.946523]},n4812:{id:"n4812",loc:[-85.609307,41.946523]},n4813:{id:"n4813",loc:[-85.609035,41.946462]},n4814:{id:"n4814",loc:[-85.609018,41.943277]},n4815:{id:"n4815",loc:[-85.609617,41.943423]},n4816:{id:"n4816",loc:[-85.610471,41.943447]},n4817:{id:"n4817",loc:[-85.621491,41.949168]},n4818:{id:"n4818",loc:[-85.620266,41.94917]},n4819:{id:"n4819",loc:[-85.620262,41.947557]},n482:{id:"n482",loc:[-85.634521,41.942254]},n4820:{id:"n4820",loc:[-85.620825,41.947556]},n4821:{id:"n4821",loc:[-85.620827,41.948371]},n4822:{id:"n4822",loc:[-85.621489,41.94837]},n4823:{id:"n4823",loc:[-85.622865,41.950928]},n4824:{id:"n4824",loc:[-85.622858,41.949744]},n4825:{id:"n4825",loc:[-85.623696,41.949714]},n4826:{id:"n4826",loc:[-85.623696,41.949647]},n4827:{id:"n4827",loc:[-85.624019,41.949647]},n4828:{id:"n4828",loc:[-85.624024,41.950093]},n4829:{id:"n4829",loc:[-85.622885,41.949711]},n483:{id:"n483",loc:[-85.63425,41.941819]},n4830:{id:"n4830",loc:[-85.624584,41.951049]},n4831:{id:"n4831",loc:[-85.624669,41.9511]},n4832:{id:"n4832",loc:[-85.624316,41.952218]},n4833:{id:"n4833",loc:[-85.623819,41.952094]},n4834:{id:"n4834",loc:[-85.623385,41.952101]},n4835:{id:"n4835",loc:[-85.623456,41.951238]},n4836:{id:"n4836",loc:[-85.623535,41.951051]},n4837:{id:"n4837",loc:[-85.624693,41.950921]},n4838:{id:"n4838",loc:[-85.624727,41.950897]},n4839:{id:"n4839",loc:[-85.624869,41.950341]},n484:{id:"n484",loc:[-85.634324,41.942131]},n4840:{id:"n4840",loc:[-85.624859,41.949284]},n4841:{id:"n4841",loc:[-85.624788,41.949262]},n4842:{id:"n4842",loc:[-85.62402,41.949265]},n4843:{id:"n4843",loc:[-85.610382,41.954663]},n4844:{id:"n4844",loc:[-85.605675,41.954667]},n4845:{id:"n4845",loc:[-85.605669,41.949407]},n4846:{id:"n4846",loc:[-85.610376,41.949404]},n4847:{id:"n4847",loc:[-85.605552,41.958536]},n4848:{id:"n4848",loc:[-85.595755,41.958588]},n4849:{id:"n4849",loc:[-85.595732,41.956419]},n485:{id:"n485",loc:[-85.634211,41.941374]},n4850:{id:"n4850",loc:[-85.596908,41.955605]},n4851:{id:"n4851",loc:[-85.597723,41.955596]},n4852:{id:"n4852",loc:[-85.597715,41.954967]},n4853:{id:"n4853",loc:[-85.5874,41.955018]},n4854:{id:"n4854",loc:[-85.586615,41.955124]},n4855:{id:"n4855",loc:[-85.58613,41.955293]},n4856:{id:"n4856",loc:[-85.586166,41.962122]},n4857:{id:"n4857",loc:[-85.587008,41.955052]},n4858:{id:"n4858",loc:[-85.591685,41.95499]},n4859:{id:"n4859",loc:[-85.591718,41.956649]},n486:{id:"n486",loc:[-85.634085,41.940704]},n4860:{id:"n4860",loc:[-85.591133,41.956649]},n4861:{id:"n4861",loc:[-85.591061,41.95582]},n4862:{id:"n4862",loc:[-85.590677,41.95613]},n4863:{id:"n4863",loc:[-85.590826,41.956369]},n4864:{id:"n4864",loc:[-85.591016,41.954991]},n4865:{id:"n4865",loc:[-85.587656,41.954855]},n4866:{id:"n4866",loc:[-85.5964,41.955274]},n4867:{id:"n4867",loc:[-85.58776,41.96178]},n4868:{id:"n4868",loc:[-85.601172,41.960448]},n4869:{id:"n4869",loc:[-85.589489,41.960478]},n487:{id:"n487",loc:[-85.635567,41.940944]},n4870:{id:"n4870",loc:[-85.586664,41.960493]},n4871:{id:"n4871",loc:[-85.591227,41.95676]},n4872:{id:"n4872",loc:[-85.589424,41.958093]},n4873:{id:"n4873",loc:[-85.588779,41.957611]},n4874:{id:"n4874",loc:[-85.590583,41.956278]},n4875:{id:"n4875",loc:[-85.590759,41.957106]},n4876:{id:"n4876",loc:[-85.592213,41.958218]},n4877:{id:"n4877",loc:[-85.592262,41.958279]},n4878:{id:"n4878",loc:[-85.592304,41.958358]},n4879:{id:"n4879",loc:[-85.592351,41.95849]},n488:{id:"n488",loc:[-85.635542,41.940919]},n4880:{id:"n4880",loc:[-85.592363,41.958605]},n4881:{id:"n4881",loc:[-85.592383,41.96047]},n4882:{id:"n4882",loc:[-85.592376,41.959808]},n4883:{id:"n4883",loc:[-85.600825,41.959779]},n4884:{id:"n4884",loc:[-85.601084,41.959844]},n4885:{id:"n4885",loc:[-85.601144,41.959908]},n4886:{id:"n4886",loc:[-85.601164,41.960008]},n4887:{id:"n4887",loc:[-85.601162,41.960125]},n4888:{id:"n4888",loc:[-85.601134,41.960221]},n4889:{id:"n4889",loc:[-85.600993,41.960353]},n489:{id:"n489",loc:[-85.635514,41.940906]},n4890:{id:"n4890",loc:[-85.600794,41.960449]},n4891:{id:"n4891",loc:[-85.60098,41.959792]},n4892:{id:"n4892",loc:[-85.601067,41.960294]},n4893:{id:"n4893",loc:[-85.596829,41.959793]},n4894:{id:"n4894",loc:[-85.596839,41.960459]},n4895:{id:"n4895",loc:[-85.589364,41.958048]},n4896:{id:"n4896",loc:[-85.587374,41.959511]},n4897:{id:"n4897",loc:[-85.587286,41.959564]},n4898:{id:"n4898",loc:[-85.587163,41.959632]},n4899:{id:"n4899",loc:[-85.586694,41.959865]},n49:{id:"n49",loc:[-85.637127,41.942757]},n490:{id:"n490",loc:[-85.635469,41.940896]},n4900:{id:"n4900",loc:[-85.586634,41.959921]},n4901:{id:"n4901",loc:[-85.586607,41.960001]},n4902:{id:"n4902",loc:[-85.586599,41.960099]},n4903:{id:"n4903",loc:[-85.586602,41.96034]},n4904:{id:"n4904",loc:[-85.586669,41.960439]},n4905:{id:"n4905",loc:[-85.586758,41.960493]},n4906:{id:"n4906",loc:[-85.586618,41.960391]},n4907:{id:"n4907",loc:[-85.591201,41.956352]},n4908:{id:"n4908",loc:[-85.59112,41.954843]},n4909:{id:"n4909",loc:[-85.591536,41.956349]},n491:{id:"n491",loc:[-85.635667,41.940826]},n4910:{id:"n4910",loc:[-85.590953,41.956354]},n4911:{id:"n4911",loc:[-85.591468,41.956406]},n4912:{id:"n4912",loc:[-85.591469,41.956478]},n4913:{id:"n4913",loc:[-85.591123,41.956481]},n4914:{id:"n4914",loc:[-85.591121,41.956409]},n4915:{id:"n4915",loc:[-85.590826,41.955954]},n4916:{id:"n4916",loc:[-85.590612,41.956115]},n4917:{id:"n4917",loc:[-85.590402,41.955962]},n4918:{id:"n4918",loc:[-85.590622,41.955804]},n4919:{id:"n4919",loc:[-85.59011,41.956502]},n492:{id:"n492",loc:[-85.636197,41.940599]},n4920:{id:"n4920",loc:[-85.589877,41.956668]},n4921:{id:"n4921",loc:[-85.589777,41.95659]},n4922:{id:"n4922",loc:[-85.59001,41.956424]},n4923:{id:"n4923",loc:[-85.589595,41.956427]},n4924:{id:"n4924",loc:[-85.589434,41.956549]},n4925:{id:"n4925",loc:[-85.589262,41.956424]},n4926:{id:"n4926",loc:[-85.589422,41.956302]},n4927:{id:"n4927",loc:[-85.589358,41.956286]},n4928:{id:"n4928",loc:[-85.5892,41.956408]},n4929:{id:"n4929",loc:[-85.589032,41.956288]},n493:{id:"n493",loc:[-85.6362,41.940686]},n4930:{id:"n4930",loc:[-85.58919,41.956166]},n4931:{id:"n4931",loc:[-85.589165,41.956132]},n4932:{id:"n4932",loc:[-85.589002,41.956253]},n4933:{id:"n4933",loc:[-85.588826,41.956122]},n4934:{id:"n4934",loc:[-85.588989,41.956001]},n4935:{id:"n4935",loc:[-85.588673,41.955757]},n4936:{id:"n4936",loc:[-85.588502,41.955882]},n4937:{id:"n4937",loc:[-85.588339,41.955759]},n4938:{id:"n4938",loc:[-85.58851,41.955633]},n4939:{id:"n4939",loc:[-85.590382,41.955892]},n494:{id:"n494",loc:[-85.635969,41.94069]},n4940:{id:"n4940",loc:[-85.589923,41.956231]},n4941:{id:"n4941",loc:[-85.58984,41.956168]},n4942:{id:"n4942",loc:[-85.5903,41.95583]},n4943:{id:"n4943",loc:[-85.589636,41.956038]},n4944:{id:"n4944",loc:[-85.589546,41.956105]},n4945:{id:"n4945",loc:[-85.589045,41.955729]},n4946:{id:"n4946",loc:[-85.589135,41.955662]},n4947:{id:"n4947",loc:[-85.590718,41.955293]},n4948:{id:"n4948",loc:[-85.590718,41.955374]},n4949:{id:"n4949",loc:[-85.589211,41.955369]},n495:{id:"n495",loc:[-85.635965,41.940561]},n4950:{id:"n4950",loc:[-85.589212,41.955287]},n4951:{id:"n4951",loc:[-85.589675,41.956817]},n4952:{id:"n4952",loc:[-85.58947,41.95697]},n4953:{id:"n4953",loc:[-85.589219,41.956784]},n4954:{id:"n4954",loc:[-85.589425,41.95663]},n4955:{id:"n4955",loc:[-85.589373,41.95702]},n4956:{id:"n4956",loc:[-85.589171,41.957172]},n4957:{id:"n4957",loc:[-85.588962,41.957019]},n4958:{id:"n4958",loc:[-85.589164,41.956867]},n4959:{id:"n4959",loc:[-85.588881,41.955006]},n496:{id:"n496",loc:[-85.636031,41.94056]},n4960:{id:"n4960",loc:[-85.588804,41.955006]},n4961:{id:"n4961",loc:[-85.604773,41.954521]},n4962:{id:"n4962",loc:[-85.601603,41.954527]},n4963:{id:"n4963",loc:[-85.600823,41.954169]},n4964:{id:"n4964",loc:[-85.600828,41.950191]},n4965:{id:"n4965",loc:[-85.601673,41.949457]},n4966:{id:"n4966",loc:[-85.604464,41.949488]},n4967:{id:"n4967",loc:[-85.60538,41.950212]},n4968:{id:"n4968",loc:[-85.605395,41.954108]},n4969:{id:"n4969",loc:[-85.604771,41.954109]},n497:{id:"n497",loc:[-85.636032,41.940602]},n4970:{id:"n4970",loc:[-85.600613,41.953916]},n4971:{id:"n4971",loc:[-85.599758,41.954649]},n4972:{id:"n4972",loc:[-85.591194,41.954663]},n4973:{id:"n4973",loc:[-85.591182,41.950465]},n4974:{id:"n4974",loc:[-85.591871,41.950464]},n4975:{id:"n4975",loc:[-85.591868,41.949209]},n4976:{id:"n4976",loc:[-85.592155,41.949209]},n4977:{id:"n4977",loc:[-85.592155,41.94848]},n4978:{id:"n4978",loc:[-85.600615,41.948482]},n4979:{id:"n4979",loc:[-85.605421,41.949378]},n498:{id:"n498",loc:[-85.635783,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.635785,41.9407]},n51:{id:"n51",loc:[-85.636673,41.942864]},n510:{id:"n510",loc:[-85.636044,41.940578]},n511:{id:"n511",loc:[-85.635946,41.940578]},n512:{id:"n512",loc:[-85.636475,41.940732]},n513:{id:"n513",loc:[-85.636475,41.940777]},n514:{id:"n514",loc:[-85.636405,41.940777]},n515:{id:"n515",loc:[-85.636405,41.940732]},n516:{id:"n516",loc:[-85.636471,41.940916]},n517:{id:"n517",loc:[-85.636471,41.940961]},n518:{id:"n518",loc:[-85.636404,41.940961]},n519:{id:"n519",loc:[-85.636404,41.940916]},n52:{id:"n52",loc:[-85.636227,41.942864]},n520:{id:"n520",loc:[-85.636286,41.941127]},n521:{id:"n521",loc:[-85.636203,41.941126]},n522:{id:"n522",loc:[-85.636204,41.941083]},n523:{id:"n523",loc:[-85.636287,41.941083]},n524:{id:"n524",loc:[-85.636124,41.941064]},n525:{id:"n525",loc:[-85.636,41.941065]},n526:{id:"n526",loc:[-85.636,41.940964]},n527:{id:"n527",loc:[-85.636045,41.940964]},n528:{id:"n528",loc:[-85.636045,41.940928]},n529:{id:"n529",loc:[-85.636111,41.940928]},n53:{id:"n53",loc:[-85.636227,41.943143]},n530:{id:"n530",loc:[-85.636111,41.940961]},n531:{id:"n531",loc:[-85.636123,41.940961]},n532:{id:"n532",loc:[-85.636124,41.940997]},n533:{id:"n533",loc:[-85.636164,41.940997]},n534:{id:"n534",loc:[-85.636164,41.941044]},n535:{id:"n535",loc:[-85.636124,41.941044]},n536:{id:"n536",loc:[-85.636534,41.941256]},n537:{id:"n537",loc:[-85.63645,41.941246]},n538:{id:"n538",loc:[-85.636462,41.941189]},n539:{id:"n539",loc:[-85.636546,41.941199]},n54:{id:"n54",loc:[-85.636198,41.943119]},n540:{id:"n540",loc:[-85.636802,41.941226]},n541:{id:"n541",loc:[-85.636701,41.941215]},n542:{id:"n542",loc:[-85.636709,41.941174]},n543:{id:"n543",loc:[-85.636656,41.941168]},n544:{id:"n544",loc:[-85.636666,41.941122]},n545:{id:"n545",loc:[-85.636781,41.941136]},n546:{id:"n546",loc:[-85.636774,41.94117]},n547:{id:"n547",loc:[-85.636812,41.941175]},n548:{id:"n548",loc:[-85.636803,41.941047]},n549:{id:"n549",loc:[-85.636785,41.941047]},n55:{id:"n55",loc:[-85.635945,41.94312]},n550:{id:"n550",loc:[-85.636785,41.941058]},n551:{id:"n551",loc:[-85.636644,41.941059]},n552:{id:"n552",loc:[-85.636644,41.941038]},n553:{id:"n553",loc:[-85.636581,41.941039]},n554:{id:"n554",loc:[-85.636581,41.940995]},n555:{id:"n555",loc:[-85.636746,41.940995]},n556:{id:"n556",loc:[-85.636746,41.940978]},n557:{id:"n557",loc:[-85.636803,41.940978]},n558:{id:"n558",loc:[-85.636781,41.940768]},n559:{id:"n559",loc:[-85.636783,41.940828]},n56:{id:"n56",loc:[-85.635943,41.942909]},n560:{id:"n560",loc:[-85.636761,41.940828]},n561:{id:"n561",loc:[-85.636762,41.940857]},n562:{id:"n562",loc:[-85.636641,41.940859]},n563:{id:"n563",loc:[-85.63664,41.940805]},n564:{id:"n564",loc:[-85.636676,41.940804]},n565:{id:"n565",loc:[-85.636675,41.940769]},n566:{id:"n566",loc:[-85.636733,41.94033]},n567:{id:"n567",loc:[-85.636471,41.940334]},n568:{id:"n568",loc:[-85.636469,41.940262]},n569:{id:"n569",loc:[-85.636731,41.940257]},n57:{id:"n57",loc:[-85.636227,41.942909]},n570:{id:"n570",loc:[-85.636798,41.940419]},n571:{id:"n571",loc:[-85.6368,41.940524]},n572:{id:"n572",loc:[-85.63664,41.940526]},n573:{id:"n573",loc:[-85.636638,41.940421]},n574:{id:"n574",loc:[-85.636372,41.940551]},n575:{id:"n575",loc:[-85.636338,41.94055]},n576:{id:"n576",loc:[-85.636339,41.940524]},n577:{id:"n577",loc:[-85.636373,41.940525]},n578:{id:"n578",loc:[-85.636388,41.940435]},n579:{id:"n579",loc:[-85.636222,41.940436]},n58:{id:"n58",loc:[-85.63627,41.943175]},n580:{id:"n580",loc:[-85.636222,41.940366]},n581:{id:"n581",loc:[-85.636387,41.940365]},n582:{id:"n582",loc:[-85.636158,41.940482]},n583:{id:"n583",loc:[-85.635963,41.940484]},n584:{id:"n584",loc:[-85.635961,41.940399]},n585:{id:"n585",loc:[-85.636156,41.940397]},n586:{id:"n586",loc:[-85.635987,41.940314]},n587:{id:"n587",loc:[-85.635987,41.940268]},n588:{id:"n588",loc:[-85.635968,41.940268]},n589:{id:"n589",loc:[-85.635967,41.940212]},n59:{id:"n59",loc:[-85.635531,41.943176]},n590:{id:"n590",loc:[-85.636082,41.940211]},n591:{id:"n591",loc:[-85.636083,41.94027]},n592:{id:"n592",loc:[-85.636064,41.94027]},n593:{id:"n593",loc:[-85.636064,41.940313]},n594:{id:"n594",loc:[-85.638071,41.941562]},n595:{id:"n595",loc:[-85.637953,41.941562]},n596:{id:"n596",loc:[-85.637952,41.941522]},n597:{id:"n597",loc:[-85.637876,41.941523]},n598:{id:"n598",loc:[-85.637876,41.941471]},n599:{id:"n599",loc:[-85.638035,41.94147]},n6:{id:"n6",loc:[-85.624925,41.950604]},n60:{id:"n60",loc:[-85.63542,41.942883]},n600:{id:"n600",loc:[-85.638035,41.941513]},n601:{id:"n601",loc:[-85.638071,41.941512]},n602:{id:"n602",loc:[-85.637038,41.942543],tags:{crossing:"marked",highway:"crossing"}},n603:{id:"n603",loc:[-85.637134,41.942542]},n604:{id:"n604",loc:[-85.638122,41.942532]},n605:{id:"n605",loc:[-85.638121,41.942478]},n606:{id:"n606",loc:[-85.638104,41.941424]},n607:{id:"n607",loc:[-85.637115,41.941438]},n608:{id:"n608",loc:[-85.637133,41.942453]},n609:{id:"n609",loc:[-85.637429,41.942004]},n61:{id:"n61",loc:[-85.635701,41.942802]},n610:{id:"n610",loc:[-85.637125,41.942004]},n611:{id:"n611",loc:[-85.637022,41.942004]},n612:{id:"n612",loc:[-85.635952,41.943579]},n613:{id:"n613",loc:[-85.635872,41.943594]},n614:{id:"n614",loc:[-85.635857,41.943551]},n615:{id:"n615",loc:[-85.635937,41.943535]},n616:{id:"n616",loc:[-85.63671,41.94344]},n617:{id:"n617",loc:[-85.636427,41.94334]},n618:{id:"n618",loc:[-85.635353,41.943279]},n619:{id:"n619",loc:[-85.635319,41.943257]},n62:{id:"n62",loc:[-85.6358,41.942997]},n620:{id:"n620",loc:[-85.638786,41.943105]},n621:{id:"n621",loc:[-85.634957,41.943146]},n622:{id:"n622",loc:[-85.635012,41.943119]},n623:{id:"n623",loc:[-85.632409,41.944222]},n624:{id:"n624",loc:[-85.631863,41.944749]},n625:{id:"n625",loc:[-85.631915,41.944722]},n626:{id:"n626",loc:[-85.631884,41.94464]},n627:{id:"n627",loc:[-85.631792,41.944359]},n628:{id:"n628",loc:[-85.631817,41.944703]},n629:{id:"n629",loc:[-85.633464,41.945787]},n63:{id:"n63",loc:[-85.635808,41.943176]},n630:{id:"n630",loc:[-85.633583,41.945919]},n631:{id:"n631",loc:[-85.63382,41.945698]},n632:{id:"n632",loc:[-85.633681,41.945571]},n633:{id:"n633",loc:[-85.634217,41.946824]},n634:{id:"n634",loc:[-85.634271,41.946836]},n635:{id:"n635",loc:[-85.634319,41.94573]},n636:{id:"n636",loc:[-85.634377,41.945672]},n637:{id:"n637",loc:[-85.634909,41.945354]},n638:{id:"n638",loc:[-85.634726,41.945493],tags:{artwork_type:"mural",tourism:"artwork"}},n639:{id:"n639",loc:[-85.63546,41.945612]},n64:{id:"n64",loc:[-85.63631,41.943253]},n640:{id:"n640",loc:[-85.635561,41.945493]},n641:{id:"n641",loc:[-85.635417,41.945565]},n642:{id:"n642",loc:[-85.635315,41.945583]},n643:{id:"n643",loc:[-85.63506,41.945383]},n644:{id:"n644",loc:[-85.635198,41.945199]},n645:{id:"n645",loc:[-85.635361,41.94558]},n646:{id:"n646",loc:[-85.635017,41.945066]},n647:{id:"n647",loc:[-85.634779,41.945206]},n648:{id:"n648",loc:[-85.63425,41.945655]},n649:{id:"n649",loc:[-85.634247,41.945631]},n65:{id:"n65",loc:[-85.635398,41.943259]},n650:{id:"n650",loc:[-85.634889,41.945921]},n651:{id:"n651",loc:[-85.634889,41.945939]},n652:{id:"n652",loc:[-85.634889,41.945761]},n653:{id:"n653",loc:[-85.63489,41.945778]},n654:{id:"n654",loc:[-85.635112,41.945715]},n655:{id:"n655",loc:[-85.635025,41.945714]},n656:{id:"n656",loc:[-85.635027,41.945761]},n657:{id:"n657",loc:[-85.635438,41.945665]},n658:{id:"n658",loc:[-85.635416,41.945676]},n659:{id:"n659",loc:[-85.635401,41.945709]},n66:{id:"n66",loc:[-85.635336,41.943036]},n660:{id:"n660",loc:[-85.635271,41.945566]},n661:{id:"n661",loc:[-85.636106,41.946268]},n662:{id:"n662",loc:[-85.635867,41.946747]},n663:{id:"n663",loc:[-85.636476,41.946797]},n664:{id:"n664",loc:[-85.63651,41.946796]},n665:{id:"n665",loc:[-85.635367,41.946389]},n666:{id:"n666",loc:[-85.635367,41.946437]},n667:{id:"n667",loc:[-85.634787,41.946441]},n668:{id:"n668",loc:[-85.6358,41.946243]},n669:{id:"n669",loc:[-85.635784,41.94622]},n67:{id:"n67",loc:[-85.635911,41.942899]},n670:{id:"n670",loc:[-85.635727,41.946195]},n671:{id:"n671",loc:[-85.635708,41.946588]},n672:{id:"n672",loc:[-85.635648,41.946561]},n673:{id:"n673",loc:[-85.635624,41.946555]},n674:{id:"n674",loc:[-85.635417,41.946559]},n675:{id:"n675",loc:[-85.634866,41.946561]},n676:{id:"n676",loc:[-85.634866,41.946543]},n677:{id:"n677",loc:[-85.635085,41.946546]},n678:{id:"n678",loc:[-85.635085,41.946554]},n679:{id:"n679",loc:[-85.634584,41.94488]},n68:{id:"n68",loc:[-85.635915,41.943156]},n680:{id:"n680",loc:[-85.634557,41.944882]},n681:{id:"n681",loc:[-85.634455,41.944943]},n682:{id:"n682",loc:[-85.634305,41.944968]},n683:{id:"n683",loc:[-85.634261,41.944927]},n684:{id:"n684",loc:[-85.634132,41.944741]},n685:{id:"n685",loc:[-85.633705,41.944759]},n686:{id:"n686",loc:[-85.633918,41.944616]},n687:{id:"n687",loc:[-85.633974,41.944663]},n688:{id:"n688",loc:[-85.6336,41.944665]},n689:{id:"n689",loc:[-85.633817,41.944528]},n69:{id:"n69",loc:[-85.63631,41.943157]},n690:{id:"n690",loc:[-85.633889,41.944485]},n691:{id:"n691",loc:[-85.633931,41.944525]},n692:{id:"n692",loc:[-85.633864,41.944563]},n693:{id:"n693",loc:[-85.633456,41.944524]},n694:{id:"n694",loc:[-85.633676,41.944399]},n695:{id:"n695",loc:[-85.633352,41.944415]},n696:{id:"n696",loc:[-85.633655,41.944234]},n697:{id:"n697",loc:[-85.633761,41.94435]},n698:{id:"n698",loc:[-85.633254,41.944318]},n699:{id:"n699",loc:[-85.633472,41.944188]},n7:{id:"n7",loc:[-85.638791,41.943231]},n70:{id:"n70",loc:[-85.63579,41.942967]},n700:{id:"n700",loc:[-85.633524,41.944237]},n701:{id:"n701",loc:[-85.633583,41.944202]},n702:{id:"n702",loc:[-85.633632,41.944247]},n703:{id:"n703",loc:[-85.633165,41.944228]},n704:{id:"n704",loc:[-85.633388,41.944105]},n705:{id:"n705",loc:[-85.633117,41.944175]},n706:{id:"n706",loc:[-85.633302,41.944077]},n707:{id:"n707",loc:[-85.633352,41.944126]},n708:{id:"n708",loc:[-85.633052,41.944107]},n709:{id:"n709",loc:[-85.633237,41.944009]},n71:{id:"n71",loc:[-85.637506,41.942824]},n710:{id:"n710",loc:[-85.633187,41.943955]},n711:{id:"n711",loc:[-85.633,41.944054]},n712:{id:"n712",loc:[-85.633155,41.944265]},n713:{id:"n713",loc:[-85.633669,41.944765]},n714:{id:"n714",loc:[-85.634468,41.945503]},n715:{id:"n715",loc:[-85.63455,41.945566]},n716:{id:"n716",loc:[-85.634737,41.945729]},n717:{id:"n717",loc:[-85.634753,41.945752]},n718:{id:"n718",loc:[-85.634756,41.945781]},n719:{id:"n719",loc:[-85.634758,41.945978]},n72:{id:"n72",loc:[-85.637511,41.943056]},n720:{id:"n720",loc:[-85.634363,41.945548],tags:{crossing:"marked",highway:"crossing"}},n721:{id:"n721",loc:[-85.634245,41.945599]},n722:{id:"n722",loc:[-85.633474,41.944889]},n723:{id:"n723",loc:[-85.632997,41.944418]},n724:{id:"n724",loc:[-85.63278,41.944183]},n725:{id:"n725",loc:[-85.63331,41.944429]},n726:{id:"n726",loc:[-85.633568,41.944829],tags:{crossing:"marked",highway:"crossing"}},n727:{id:"n727",loc:[-85.634669,41.94567]},n728:{id:"n728",loc:[-85.634462,41.945787]},n729:{id:"n729",loc:[-85.634272,41.945625]},n73:{id:"n73",loc:[-85.637361,41.943058]},n730:{id:"n730",loc:[-85.634344,41.945699],tags:{crossing:"marked",highway:"crossing"}},n731:{id:"n731",loc:[-85.634426,41.945783]},n732:{id:"n732",loc:[-85.632425,41.944137]},n733:{id:"n733",loc:[-85.632302,41.944192]},n734:{id:"n734",loc:[-85.632762,41.944174]},n735:{id:"n735",loc:[-85.632713,41.944179]},n736:{id:"n736",loc:[-85.632411,41.944327]},n737:{id:"n737",loc:[-85.632362,41.944341]},n738:{id:"n738",loc:[-85.632236,41.944204]},n739:{id:"n739",loc:[-85.634939,41.942165]},n74:{id:"n74",loc:[-85.637356,41.942825]},n740:{id:"n740",loc:[-85.635079,41.941535]},n741:{id:"n741",loc:[-85.635112,41.941595]},n742:{id:"n742",loc:[-85.635113,41.941633]},n743:{id:"n743",loc:[-85.635067,41.941652]},n744:{id:"n744",loc:[-85.634989,41.941651]},n745:{id:"n745",loc:[-85.634921,41.941609]},n746:{id:"n746",loc:[-85.634881,41.941544]},n747:{id:"n747",loc:[-85.635537,41.940939]},n748:{id:"n748",loc:[-85.635573,41.941048]},n749:{id:"n749",loc:[-85.635453,41.94091]},n75:{id:"n75",loc:[-85.638097,41.942833]},n750:{id:"n750",loc:[-85.635319,41.940943]},n751:{id:"n751",loc:[-85.637057,41.943224]},n752:{id:"n752",loc:[-85.636989,41.943296]},n753:{id:"n753",loc:[-85.636851,41.943299]},n754:{id:"n754",loc:[-85.636848,41.94322]},n755:{id:"n755",loc:[-85.636986,41.943217]},n756:{id:"n756",loc:[-85.637569,41.943454]},n757:{id:"n757",loc:[-85.637437,41.943458]},n758:{id:"n758",loc:[-85.637432,41.943384]},n759:{id:"n759",loc:[-85.637564,41.94338]},n76:{id:"n76",loc:[-85.638098,41.942912]},n760:{id:"n760",loc:[-85.637213,41.943378]},n761:{id:"n761",loc:[-85.637217,41.943435]},n762:{id:"n762",loc:[-85.637235,41.943434]},n763:{id:"n763",loc:[-85.637237,41.943465]},n764:{id:"n764",loc:[-85.637424,41.943459]},n765:{id:"n765",loc:[-85.637418,41.943371]},n766:{id:"n766",loc:[-85.638094,41.943149]},n767:{id:"n767",loc:[-85.638096,41.943201]},n768:{id:"n768",loc:[-85.638041,41.943202]},n769:{id:"n769",loc:[-85.638042,41.943216]},n77:{id:"n77",loc:[-85.637705,41.942913]},n770:{id:"n770",loc:[-85.637927,41.943218]},n771:{id:"n771",loc:[-85.637926,41.943201]},n772:{id:"n772",loc:[-85.637897,41.943201]},n773:{id:"n773",loc:[-85.637896,41.943155]},n774:{id:"n774",loc:[-85.637962,41.943153]},n775:{id:"n775",loc:[-85.637962,41.943134]},n776:{id:"n776",loc:[-85.638017,41.943132]},n777:{id:"n777",loc:[-85.638018,41.943151]},n778:{id:"n778",loc:[-85.638045,41.943289]},n779:{id:"n779",loc:[-85.638048,41.943363]},n78:{id:"n78",loc:[-85.637705,41.942834]},n780:{id:"n780",loc:[-85.637842,41.943367]},n781:{id:"n781",loc:[-85.637839,41.943296]},n782:{id:"n782",loc:[-85.637896,41.943295]},n783:{id:"n783",loc:[-85.637897,41.943314]},n784:{id:"n784",loc:[-85.637957,41.943312]},n785:{id:"n785",loc:[-85.637957,41.943291]},n786:{id:"n786",loc:[-85.637816,41.943375]},n787:{id:"n787",loc:[-85.637815,41.943416]},n788:{id:"n788",loc:[-85.637715,41.943415]},n789:{id:"n789",loc:[-85.637716,41.943374]},n79:{id:"n79",loc:[-85.638071,41.942298]},n790:{id:"n790",loc:[-85.637912,41.943545]},n791:{id:"n791",loc:[-85.637909,41.943479]},n792:{id:"n792",loc:[-85.637967,41.943477]},n793:{id:"n793",loc:[-85.637967,41.94346]},n794:{id:"n794",loc:[-85.638077,41.943457]},n795:{id:"n795",loc:[-85.638078,41.943473]},n796:{id:"n796",loc:[-85.638124,41.943471]},n797:{id:"n797",loc:[-85.638126,41.943514]},n798:{id:"n798",loc:[-85.638079,41.943515]},n799:{id:"n799",loc:[-85.638079,41.943532]},n8:{id:"n8",loc:[-85.635241,41.941948]},n80:{id:"n80",loc:[-85.638074,41.942431]},n800:{id:"n800",loc:[-85.638028,41.943534]},n801:{id:"n801",loc:[-85.638028,41.943542]},n802:{id:"n802",loc:[-85.638845,41.942983]},n803:{id:"n803",loc:[-85.638846,41.94305]},n804:{id:"n804",loc:[-85.638661,41.943052]},n805:{id:"n805",loc:[-85.63866,41.942984]},n806:{id:"n806",loc:[-85.638579,41.942753]},n807:{id:"n807",loc:[-85.638445,41.942755]},n808:{id:"n808",loc:[-85.638452,41.942978]},n809:{id:"n809",loc:[-85.638545,41.942976]},n81:{id:"n81",loc:[-85.637836,41.942433]},n810:{id:"n810",loc:[-85.638543,41.942935]},n811:{id:"n811",loc:[-85.638571,41.942934]},n812:{id:"n812",loc:[-85.63857,41.942901]},n813:{id:"n813",loc:[-85.638611,41.9429]},n814:{id:"n814",loc:[-85.638607,41.942769]},n815:{id:"n815",loc:[-85.63858,41.94277]},n816:{id:"n816",loc:[-85.638597,41.942614]},n817:{id:"n817",loc:[-85.638601,41.94273]},n818:{id:"n818",loc:[-85.638686,41.942731]},n819:{id:"n819",loc:[-85.638689,41.942917]},n82:{id:"n82",loc:[-85.637835,41.94242]},n820:{id:"n820",loc:[-85.638558,41.943018]},n821:{id:"n821",loc:[-85.638243,41.943019]},n822:{id:"n822",loc:[-85.637536,41.943887]},n823:{id:"n823",loc:[-85.63749,41.943926]},n824:{id:"n824",loc:[-85.63743,41.943886]},n825:{id:"n825",loc:[-85.637476,41.943847]},n826:{id:"n826",loc:[-85.637527,41.943846]},n827:{id:"n827",loc:[-85.637141,41.943728]},n828:{id:"n828",loc:[-85.637201,41.943755]},n829:{id:"n829",loc:[-85.636987,41.943608]},n83:{id:"n83",loc:[-85.63776,41.942421]},n830:{id:"n830",loc:[-85.637441,41.943807]},n831:{id:"n831",loc:[-85.637673,41.94399]},n832:{id:"n832",loc:[-85.637783,41.944137]},n833:{id:"n833",loc:[-85.63845,41.944333]},n834:{id:"n834",loc:[-85.638159,41.944248]},n835:{id:"n835",loc:[-85.637859,41.94416]},n836:{id:"n836",loc:[-85.638685,41.944542]},n837:{id:"n837",loc:[-85.638714,41.944611]},n838:{id:"n838",loc:[-85.638711,41.944757]},n839:{id:"n839",loc:[-85.638774,41.945069]},n84:{id:"n84",loc:[-85.637758,41.942339]},n840:{id:"n840",loc:[-85.638742,41.945205]},n841:{id:"n841",loc:[-85.640267,41.942403]},n842:{id:"n842",loc:[-85.640154,41.942404]},n843:{id:"n843",loc:[-85.640152,41.942249]},n844:{id:"n844",loc:[-85.640266,41.942248]},n845:{id:"n845",loc:[-85.640366,41.942599]},n846:{id:"n846",loc:[-85.640362,41.942192]},n847:{id:"n847",loc:[-85.640146,41.942191]},n848:{id:"n848",loc:[-85.640122,41.942196]},n849:{id:"n849",loc:[-85.640108,41.942211]},n85:{id:"n85",loc:[-85.637836,41.942339]},n850:{id:"n850",loc:[-85.640101,41.942236]},n851:{id:"n851",loc:[-85.640103,41.94241]},n852:{id:"n852",loc:[-85.64011,41.942435]},n853:{id:"n853",loc:[-85.640126,41.942445]},n854:{id:"n854",loc:[-85.640153,41.942451]},n855:{id:"n855",loc:[-85.640183,41.942452]},n856:{id:"n856",loc:[-85.640364,41.942452]},n857:{id:"n857",loc:[-85.640007,41.942452]},n858:{id:"n858",loc:[-85.639449,41.942461]},n859:{id:"n859",loc:[-85.640049,41.942391]},n86:{id:"n86",loc:[-85.637835,41.942301]},n860:{id:"n860",loc:[-85.640052,41.942503]},n861:{id:"n861",loc:[-85.639575,41.94251]},n862:{id:"n862",loc:[-85.639572,41.942398]},n863:{id:"n863",loc:[-85.638782,41.942227]},n864:{id:"n864",loc:[-85.63843,41.942226]},n865:{id:"n865",loc:[-85.63823,41.942183]},n866:{id:"n866",loc:[-85.638363,41.942216],tags:{barrier:"gate"}},n867:{id:"n867",loc:[-85.6384,41.942223]},n868:{id:"n868",loc:[-85.636042,41.942797]},n869:{id:"n869",loc:[-85.636308,41.942752]},n87:{id:"n87",loc:[-85.637566,41.942367]},n870:{id:"n870",loc:[-85.636516,41.942729]},n871:{id:"n871",loc:[-85.636782,41.942712]},n872:{id:"n872",loc:[-85.636944,41.942706]},n873:{id:"n873",loc:[-85.63704,41.942706]},n874:{id:"n874",loc:[-85.637237,41.942703]},n875:{id:"n875",loc:[-85.637553,41.9427]},n876:{id:"n876",loc:[-85.638236,41.942697]},n877:{id:"n877",loc:[-85.636284,41.942781]},n878:{id:"n878",loc:[-85.636551,41.942641]},n879:{id:"n879",loc:[-85.633914,41.943693]},n88:{id:"n88",loc:[-85.637566,41.94241]},n880:{id:"n880",loc:[-85.63389,41.943708]},n881:{id:"n881",loc:[-85.633866,41.943686]},n882:{id:"n882",loc:[-85.63389,41.943671]},n883:{id:"n883",loc:[-85.633857,41.943609]},n884:{id:"n884",loc:[-85.634858,41.944474]},n885:{id:"n885",loc:[-85.633988,41.943234]},n886:{id:"n886",loc:[-85.633999,41.943485]},n887:{id:"n887",loc:[-85.634109,41.943449],tags:{emergency:"fire_hydrant"}},n888:{id:"n888",loc:[-85.635728,41.942655],tags:{emergency:"fire_hydrant"}},n889:{id:"n889",loc:[-85.636499,41.942845],tags:{man_made:"flagpole"}},n89:{id:"n89",loc:[-85.637455,41.94241]},n890:{id:"n890",loc:[-85.636197,41.943073]},n891:{id:"n891",loc:[-85.636227,41.943073]},n892:{id:"n892",loc:[-85.637433,41.942933],tags:{"addr:city":"Three Rivers","addr:housenumber":"401","addr:postcode":"49093","addr:state":"MI","addr:street":"Michigan Avenue",amenity:"restaurant",cuisine:"pizza",name:"Pizza Hut",brand:"Pizza Hut","brand:wikidata":"Q191615","brand:wikipedia":"en: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",natural:"water",water:"river"}},r5:{id:"r5",members:[{id:"w642",role:"outer",type:"way"}],tags:{admin_level:"8",border_type:"city",boundary:"administrative",name:"Three Rivers",place:"city",type:"boundary"}},w1:{id:"w1",nodes:["n5","n1797"],tags:{highway:"residential",name:"12th Avenue"}},w10:{id:"w10",nodes:["n54","n55","n56","n57","n891","n890","n54"],tags:{building:"yes"}},w100:{id:"w100",nodes:["n451","n915","n452"],tags:{highway:"footway"}},w101:{id:"w101",nodes:["n461","n462","n463","n464","n465","n466"],tags:{barrier:"fence"}},w102:{id:"w102",nodes:["n467","n468","n469","n470","n472","n467"],tags:{amenity:"parking"}},w103:{id:"w103",nodes:["n2597","n2444","n471","n472"],tags:{highway:"footway"}},w104:{id:"w104",nodes:["n473","n474","n325"],tags:{footway:"sidewalk",highway:"footway"}},w105:{id:"w105",nodes:["n475","n324","n325"],tags:{footway:"sidewalk",highway:"footway"}},w106:{id:"w106",nodes:["n886","n452","n476"],tags:{footway:"sidewalk",highway:"footway"}},w107:{id:"w107",nodes:["n485","n4678","n486","n18"],tags:{highway:"service"}},w108:{id:"w108",nodes:["n300","n487","n488","n489","n490"],tags:{highway:"footway"}},w109:{id:"w109",nodes:["n490","n491"],tags:{highway:"footway"}},w11:{id:"w11",nodes:["n58","n63","n59","n315","n60"],tags:{highway:"service"}},w110:{id:"w110",nodes:["n492","n493","n494","n495","n496","n497","n492"],tags:{building:"yes"}},w111:{id:"w111",nodes:["n498","n499","n511"],tags:{highway:"service"}},w112:{id:"w112",nodes:["n510","n500","n501","n502","n503","n504","n505","n506","n507","n508","n509"],tags:{highway:"service"}},w113:{id:"w113",nodes:["n511","n510"],tags:{covered:"yes",highway:"service"}},w114:{id:"w114",nodes:["n512","n513","n514","n515","n512"],tags:{building:"yes"}},w115:{id:"w115",nodes:["n516","n517","n518","n519","n516"],tags:{building:"yes"}},w116:{id:"w116",nodes:["n520","n521","n522","n523","n520"],tags:{building:"yes"}},w117:{id:"w117",nodes:["n524","n525","n526","n527","n528","n529","n530","n531","n532","n533","n534","n535","n524"],tags:{building:"yes"}},w118:{id:"w118",nodes:["n536","n537","n538","n539","n536"],tags:{building:"yes"}},w119:{id:"w119",nodes:["n540","n541","n542","n543","n544","n545","n546","n547","n540"],tags:{building:"yes"}},w12:{id:"w12",nodes:["n61","n314","n70","n62","n63"],tags:{highway:"service"}},w120:{id:"w120",nodes:["n548","n549","n550","n551","n552","n553","n554","n555","n556","n557","n548"],tags:{building:"yes"}},w121:{id:"w121",nodes:["n558","n559","n560","n561","n562","n563","n564","n565","n558"],tags:{building:"yes"}},w122:{id:"w122",nodes:["n566","n567","n568","n569","n566"],tags:{building:"yes"}},w123:{id:"w123",nodes:["n570","n571","n572","n573","n570"],tags:{building:"yes"}},w124:{id:"w124",nodes:["n574","n575","n576","n577","n574"],tags:{building:"yes"}},w125:{id:"w125",nodes:["n578","n579","n580","n581","n578"],tags:{building:"yes"}},w126:{id:"w126",nodes:["n582","n583","n584","n585","n582"],tags:{building:"yes"}},w127:{id:"w127",nodes:["n586","n587","n588","n589","n590","n591","n592","n593","n586"],tags:{building:"yes"}},w128:{id:"w128",nodes:["n594","n595","n596","n597","n598","n599","n600","n601","n594"],tags:{building:"yes"}},w129:{id:"w129",nodes:["n309","n602","n603"],tags:{crossing:"marked",footway:"crossing",highway:"footway"}},w13:{id:"w13",nodes:["n64","n65","n66","n67","n68","n69","n64"],tags:{amenity:"parking"}},w130:{id:"w130",nodes:["n603","n604"],tags:{footway:"sidewalk",highway:"footway"}},w131:{id:"w131",nodes:["n604","n605","n606"],tags:{footway:"sidewalk",highway:"footway"}},w132:{id:"w132",nodes:["n606","n607"],tags:{footway:"sidewalk",highway:"footway"}},w133:{id:"w133",nodes:["n607","n610","n608","n603"],tags:{footway:"sidewalk",highway:"footway"}},w134:{id:"w134",nodes:["n609","n610","n611"],tags:{highway:"service",service:"driveway",surface:"unpaved"}},w135:{id:"w135",nodes:["n244","n245","n246"],tags:{highway:"service"}},w136:{id:"w136",nodes:["n612","n613","n614","n615","n612"],tags:{amenity:"shelter",building:"yes"}},w137:{id:"w137",nodes:["n2779","n2788","n2776","n2778","n2775","n2787","n2440","n2437","n629","n2438","n630","n2439","n2407","n2408","n2409"],tags:{highway:"residential",name:"Foster Street"}},w138:{id:"w138",nodes:["n2779","n625","n626","n627"],tags:{highway:"residential",name:"Foster Street",oneway:"yes"}},w139:{id:"w139",nodes:["n630","n631","n632","n2437"],tags:{highway:"service"}},w14:{id:"w14",nodes:["n71","n72","n73","n74","n71"],tags:{building:"yes"}},w140:{id:"w140",nodes:["n643","n637","n715","n2410"],tags:{highway:"footway",name:"Mural Mall"}},w141:{id:"w141",nodes:["n639","n2516"],tags:{barrier:"wall"}},w142:{id:"w142",nodes:["n640","n641","n645","n642","n660","n643","n644"],tags:{highway:"service"}},w143:{id:"w143",nodes:["n646","n647"],tags:{highway:"service"}},w144:{id:"w144",nodes:["n654","n655","n656"],tags:{barrier:"wall"}},w145:{id:"w145",nodes:["n665","n666","n667"],tags:{barrier:"wall"}},w146:{id:"w146",nodes:["n2727","n662","n2719"],tags:{highway:"service",oneway:"yes",service:"parking_aisle"}},w147:{id:"w147",nodes:["n2725","n674"],tags:{highway:"service",oneway:"yes"}},w148:{id:"w148",nodes:["n2464","n2460","n2454","n684","n2455","n2464"],tags:{building:"yes"}},w149:{id:"w149",nodes:["n2456","n685","n686","n687","n2456"],tags:{building:"yes"}},w15:{id:"w15",nodes:["n75","n76","n77","n78","n75"],tags:{building:"yes"}},w150:{id:"w150",nodes:["n685","n688","n689","n690","n691","n692","n686","n685"],tags:{building:"yes"}},w151:{id:"w151",nodes:["n688","n693","n694","n689","n688"],tags:{building:"yes"}},w152:{id:"w152",nodes:["n693","n695","n702","n696","n697","n694","n693"],tags:{building:"yes"}},w153:{id:"w153",nodes:["n695","n698","n699","n700","n701","n702","n695"],tags:{building:"yes"}},w154:{id:"w154",nodes:["n698","n703","n707","n704","n699","n698"],tags:{building:"yes"}},w155:{id:"w155",nodes:["n703","n705","n706","n707","n703"],tags:{building:"yes"}},w156:{id:"w156",nodes:["n705","n708","n709","n706","n705"],tags:{building:"yes"}},w157:{id:"w157",nodes:["n709","n710","n711","n708","n709"],tags:{building:"yes"}},w158:{id:"w158",nodes:["n369","n712","n725","n713","n714","n715","n727","n716","n717","n718","n719"],tags:{footway:"sidewalk",highway:"footway"}},w159:{id:"w159",nodes:["n714","n720","n721"],tags:{crossing:"marked",footway:"crossing",highway:"footway"}},w16:{id:"w16",nodes:["n79","n80","n81","n82","n83","n84","n85","n86","n79"],tags:{building:"yes"}},w160:{id:"w160",nodes:["n729","n721","n722","n964","n723","n724"],tags:{footway:"sidewalk",highway:"footway"}},w161:{id:"w161",nodes:["n713","n726","n722"],tags:{crossing:"marked",footway:"crossing",highway:"footway"}},w162:{id:"w162",nodes:["n727","n2411","n728"],tags:{crossing:"marked",footway:"crossing",highway:"footway"}},w163:{id:"w163",nodes:["n729","n730","n731"],tags:{crossing:"marked",footway:"crossing",highway:"footway"}},w164:{id:"w164",nodes:["n365","n732","n733","n738"],tags:{footway:"sidewalk",highway:"footway"}},w165:{id:"w165",nodes:["n724","n734","n367","n735","n736","n737"],tags:{footway:"sidewalk",highway:"footway"}},w166:{id:"w166",nodes:["n739","n2037","n2038","n2039","n2040","n1623","n2032"],tags:{highway:"footway"}},w167:{id:"w167",nodes:["n150","n751"],tags:{highway:"service"}},w168:{id:"w168",nodes:["n752","n753","n754","n755","n752"],tags:{building:"yes"}},w169:{id:"w169",nodes:["n756","n757","n758","n759","n756"],tags:{building:"yes"}},w17:{id:"w17",nodes:["n87","n88","n89","n90","n87"],tags:{building:"yes"}},w170:{id:"w170",nodes:["n760","n761","n762","n763","n764","n765","n760"],tags:{building:"yes"}},w171:{id:"w171",nodes:["n766","n767","n768","n769","n770","n771","n772","n773","n774","n775","n776","n777","n766"],tags:{building:"yes"}},w172:{id:"w172",nodes:["n778","n779","n780","n781","n782","n783","n784","n785","n778"],tags:{building:"yes"}},w173:{id:"w173",nodes:["n786","n787","n788","n789","n786"],tags:{building:"yes"}},w174:{id:"w174",nodes:["n790","n791","n792","n793","n794","n795","n796","n797","n798","n799","n800","n801","n790"],tags:{building:"yes"}},w175:{id:"w175",nodes:["n802","n803","n804","n805","n802"],tags:{building:"yes"}},w176:{id:"w176",nodes:["n806","n807","n808","n809","n810","n811","n812","n813","n814","n815","n806"],tags:{building:"yes"}},w177:{id:"w177",nodes:["n816","n1140","n817","n818","n819","n820","n821"],tags:{highway:"service"}},w178:{id:"w178",nodes:["n822","n823","n824","n825","n822"],tags:{building:"yes"}},w179:{id:"w179",nodes:["n841","n842","n843","n844","n841"],tags:{building:"yes"}},w18:{id:"w18",nodes:["n91","n92","n93","n94","n91"],tags:{building:"yes"}},w180:{id:"w180",nodes:["n845","n856","n846"],tags:{highway:"service"}},w181:{id:"w181",nodes:["n846","n847","n848","n849","n850","n851","n852","n853","n854","n855","n856"],tags:{highway:"service",oneway:"yes",service:"drive-through"}},w182:{id:"w182",nodes:["n857","n858"],tags:{highway:"service"}},w183:{id:"w183",nodes:["n859","n860","n861","n862","n859"],tags:{amenity:"parking"}},w184:{id:"w184",nodes:["n863","n864","n867","n866","n865"],tags:{highway:"service"}},w185:{id:"w185",nodes:["n883","n884"],tags:{barrier:"fence"}},w186:{id:"w186",nodes:["n1954","n622","n1955"],tags:{highway:"path",name:"Riverwalk Trail"}},w187:{id:"w187",nodes:["n621","n1954"],tags:{highway:"steps",incline:"up",name:"Riverwalk Trail",surface:"wood"}},w188:{id:"w188",nodes:["n2274","n2275","n2276","n2277","n2278","n2279","n1953","n621"],tags:{highway:"path",name:"Riverwalk Trail",surface:"wood"}},w189:{id:"w189",nodes:["n2273","n2274"],tags:{highway:"steps",incline:"down",name:"Riverwalk Trail",surface:"wood"}},w19:{id:"w19",nodes:["n95","n96","n97","n98","n99","n100","n101","n102","n95"],tags:{building:"yes"}},w190:{id:"w190",nodes:["n821","n894","n900","n903","n901"],tags:{highway:"service"}},w191:{id:"w191",nodes:["n896","n897","n898","n899","n900","n894","n896"],tags:{amenity:"parking"}},w192:{id:"w192",nodes:["n903","n904","n905"],tags:{highway:"service"}},w193:{id:"w193",nodes:["n901","n906","n902"],tags:{highway:"service"}},w194:{id:"w194",nodes:["n912","n913"],tags:{highway:"footway"}},w195:{id:"w195",nodes:["n914","n915"],tags:{highway:"footway"}},w196:{id:"w196",nodes:["n2466","n918","n919","n920","n2466"],tags:{building:"yes"}},w197:{id:"w197",nodes:["n918","n921","n922","n919","n918"],tags:{building:"yes"}},w198:{id:"w198",nodes:["n923","n925","n926","n924","n923"],tags:{building:"yes"}},w199:{id:"w199",nodes:["n925","n927","n932","n928","n929","n926","n925"],tags:{building:"yes"}},w2:{id:"w2",nodes:["n3523","n2182","n2160"],tags:{highway:"service"}},w20:{id:"w20",nodes:["n103","n104","n105","n106","n107","n108","n109","n110","n111","n112","n113","n114","n103"],tags:{building:"yes"}},w200:{id:"w200",nodes:["n927","n930","n931","n932","n927"],tags:{building:"yes"}},w201:{id:"w201",nodes:["n930","n933","n934","n935","n931","n930"],tags:{building:"yes"}},w202:{id:"w202",nodes:["n933","n936","n937","n934","n933"],tags:{building:"yes"}},w203:{id:"w203",nodes:["n936","n938","n942","n939","n954","n937","n936"],tags:{building:"yes"}},w204:{id:"w204",nodes:["n938","n940","n941","n942","n938"],tags:{building:"yes"}},w205:{id:"w205",nodes:["n940","n943","n944","n941","n940"],tags:{building:"yes"}},w206:{id:"w206",nodes:["n943","n945","n946","n947","n948","n944","n943"],tags:{building:"yes"}},w207:{id:"w207",nodes:["n944","n949","n950","n951","n941","n944"],tags:{building:"yes"}},w208:{id:"w208",nodes:["n941","n951","n952","n939","n942","n941"],tags:{building:"yes"}},w209:{id:"w209",nodes:["n952","n953","n954","n939","n952"],tags:{building:"yes"}},w21:{id:"w21",nodes:["n115","n116","n117","n118","n115"],tags:{building:"yes"}},w210:{id:"w210",nodes:["n953","n955","n956","n934","n937","n954","n953"],tags:{building:"yes"}},w211:{id:"w211",nodes:["n964","n965"],tags:{highway:"footway"}},w212:{id:"w212",nodes:["n966","n983","n967","n989"],tags:{highway:"footway"}},w213:{id:"w213",nodes:["n965","n968","n969","n966","n970","n971","n965"],tags:{highway:"footway"}},w214:{id:"w214",nodes:["n973","n999","n992","n974","n975","n976","n993","n977","n978","n979","n980","n967","n981","n1000","n1001","n1002","n1003","n1004","n1005","n1006","n1007","n1008","n1009"],tags:{footway:"sidewalk",highway:"footway"}},w215:{id:"w215",nodes:["n978","n982","n983","n984","n985","n986","n987","n988","n981"],tags:{highway:"footway"}},w216:{id:"w216",nodes:["n976","n990","n991","n992"],tags:{highway:"footway"}},w217:{id:"w217",nodes:["n998","n999"],tags:{highway:"footway"}},w218:{id:"w218",nodes:["n1019","n3355","n1020"],tags:{footway:"sidewalk",highway:"footway"}},w219:{id:"w219",nodes:["n719","n1026","n1027"],tags:{crossing:"marked",footway:"crossing",highway:"footway"}},w22:{id:"w22",nodes:["n119","n120","n121","n122","n119"],tags:{building:"yes"}},w220:{id:"w220",nodes:["n1027","n1028","n1019"],tags:{crossing:"marked",footway:"crossing",highway:"footway"}},w221:{id:"w221",nodes:["n2080","n1828","n1863","n1829"],tags:{highway:"tertiary",name:"Constantine Street"}},w222:{id:"w222",nodes:["n1029","n1030","n1031"],tags:{highway:"service"}},w223:{id:"w223",nodes:["n2213","n2171","n2183","n2180","n2205","n2177","n2179","n2218","n2200","n2188","n2169","n2196","n2162","n2170","n2211","n2216","n2204","n2220","n2164","n2210","n2217","n2189","n460","n453","n2282"],tags:{name:"Rocky River",waterway:"river"}},w224:{id:"w224",nodes:["n3750","n3751","n3752"],tags:{highway:"service",service:"alley",surface:"unpaved"}},w225:{id:"w225",nodes:["n2134","n2127","n2313","n2109","n2112","n2129","n2156","n2146","n2126","n2153","n2288","n2283","n2284","n2131","n2286","n2287","n2285","n2132","n2140","n2289","n2122","n2114","n2149","n2119","n2106","n2111","n2145","n2113","n2117","n2159","n2143","n2123","n2142","n2116","n2154","n2139","n2150","n2157","n2120","n2138","n2130","n2136","n2155","n2107","n2141","n2124","n3754","n2121","n2105","n2108","n3755","n2128","n2110","n2152","n2125","n2135","n2186","n2115","n2144","n2137","n2133","n2148","n2118","n1871","n1875","n1872","n2041","n1873","n2042","n1874","n1884","n1870","n2151","n2147","n2158","n2104","n2134"]},w226:{id:"w226",nodes:["n2243","n2280","n2244","n2245","n2246","n2247","n1931","n1932","n1933","n1934","n1935","n1936","n1937","n1938","n4681","n1939","n1940","n1941","n1942","n1943","n1944","n1945","n1946","n1947"],tags:{highway:"path",name:"Riverwalk Trail",surface:"asphalt",width:"3"}},w227:{id:"w227",nodes:["n2994","n3012","n3011","n2958"],tags:{highway:"secondary",name:"Main Street"}},w228:{id:"w228",nodes:["n2747","n2762","n2757","n2746","n2761","n2758","n2760","n2755","n2749","n2691","n1028","n2432","n2414","n2413","n2412","n2411","n2410","n720","n726","n370","n368","n2748"],tags:{highway:"primary",name:"Main Street"}},w229:{id:"w229",nodes:["n2083","n2103","n2102","n2084","n2085","n2086","n2087","n2242","n471","n324","n2101","n332","n1868"],tags:{name:"Conrail Railroad",railway:"rail"}},w23:{id:"w23",nodes:["n123","n124","n125","n126","n123"],tags:{building:"yes"}},w230:{id:"w230",nodes:["n2232","n2236","n2231","n2230","n2226","n2241","n2237","n2227","n1182","n2233","n2228","n2229","n1183","n2234","n19","n1891","n20","n2223","n2224","n2238","n2235","n2240","n2225","n2239"],tags:{name:"Saint Joseph River",waterway:"river"}},w231:{id:"w231",nodes:["n456","n1036","n1037","n1038"],tags:{barrier:"wall"}},w232:{id:"w232",nodes:["n1034","n1039","n1040"],tags:{barrier:"wall"}},w233:{id:"w233",nodes:["n1041","n1042","n1043","n1044","n1045","n1046","n1041"],tags:{access:"private",leisure:"swimming_pool"}},w234:{id:"w234",nodes:["n1047","n1048"],tags:{barrier:"hedge"}},w235:{id:"w235",nodes:["n1049","n1050","n1051","n1052","n1049"],tags:{building:"yes"}},w236:{id:"w236",nodes:["n1053","n1054","n1055","n1056","n1057","n1058","n1059","n1060","n1053"],tags:{building:"yes"}},w237:{id:"w237",nodes:["n1061","n1062","n1063","n1064","n1065","n1061"],tags:{building:"yes"}},w238:{id:"w238",nodes:["n1066","n1067","n1068","n1069","n1070","n1071","n1066"],tags:{building:"yes"}},w239:{id:"w239",nodes:["n1072","n1073","n1074","n1075","n1072"],tags:{building:"yes"}},w24:{id:"w24",nodes:["n127","n128","n129","n130","n127"],tags:{building:"yes"}},w240:{id:"w240",nodes:["n1076","n1077","n1078","n1079","n1080","n1081","n1076"],tags:{building:"yes"}},w241:{id:"w241",nodes:["n1082","n1083","n1084","n1085","n1082"],tags:{building:"yes"}},w242:{id:"w242",nodes:["n1086","n1087","n1088","n1089","n1086"],tags:{building:"yes"}},w243:{id:"w243",nodes:["n1090","n1091","n1092","n1093","n1094","n1095","n1096","n1097","n1090"],tags:{building:"yes"}},w244:{id:"w244",nodes:["n1098","n1099","n1100","n1101"],tags:{barrier:"fence"}},w245:{id:"w245",nodes:["n1102","n835","n30","n2590","n35","n29","n2591","n34","n28","n2592","n2312","n32","n2593","n31","n33","n2594","n2595","n1102"],tags:{highway:"service"}},w246:{id:"w246",nodes:["n1103","n1139","n1104"],tags:{barrier:"fence"}},w247:{id:"w247",nodes:["n1105","n1106","n1107","n1108","n1109","n1110","n1111","n1112","n1113","n1114","n1105"],tags:{building:"yes"}},w248:{id:"w248",nodes:["n1115","n1116","n1117","n1118","n1119","n1120","n1115"],tags:{building:"yes"}},w249:{id:"w249",nodes:["n1121","n1122","n1123","n1124","n1121"],tags:{building:"yes"}},w25:{id:"w25",nodes:["n131","n132","n133","n134","n135","n136","n137","n138","n139","n140","n141","n142","n131"],tags:{building:"yes"}},w250:{id:"w250",nodes:["n1125","n1126","n1127","n1128","n1129","n1130","n1131","n1132","n1133","n1134","n1135","n1136","n1125"],tags:{building:"yes"}},w251:{id:"w251",nodes:["n1137","n1138","n1139"],tags:{barrier:"fence"}},w252:{id:"w252",nodes:["n876","n1140","n1141"],tags:{footway:"sidewalk",highway:"footway"}},w253:{id:"w253",nodes:["n1141","n1142","n1143","n1144","n1145","n1146"],tags:{footway:"sidewalk",highway:"footway"}},w254:{id:"w254",nodes:["n1146","n4743","n1147","n1148"],tags:{footway:"sidewalk",highway:"footway"}},w255:{id:"w255",nodes:["n1148","n1149","n1150","n1151"],tags:{bridge:"yes",footway:"sidewalk",highway:"footway",layer:"1"}},w256:{id:"w256",nodes:["n1151","n1153","n1154","n1155"],tags:{footway:"sidewalk",highway:"footway"}},w257:{id:"w257",nodes:["n1155","n1156"],tags:{bridge:"yes",footway:"sidewalk",highway:"footway",layer:"1"}},w258:{id:"w258",nodes:["n1157","n1158"],tags:{barrier:"retaining_wall"}},w259:{id:"w259",nodes:["n1156","n1161","n1159","n1160","n719"],tags:{footway:"sidewalk",highway:"footway"}},w26:{id:"w26",nodes:["n143","n608","n144"],tags:{highway:"service"}},w260:{id:"w260",nodes:["n1162","n1163","n1164","n1165","n1166","n1167","n1168","n1169","n1170","n2528"],tags:{highway:"footway"}},w261:{id:"w261",nodes:["n1171","n1172","n1173"],tags:{barrier:"wall"}},w262:{id:"w262",nodes:["n1175","n1176","n1177","n1178","n1179","n1180","n1181","n1175"],tags:{natural:"wood"}},w263:{id:"w263",nodes:["n1947","n1184","n1948","n1185","n1949","n1957","n1950","n480","n1951","n479","n478","n477","n1952","n1851","n1956","n2248","n619","n618","n2249","n2250","n2251","n617","n2252","n616","n2253","n829","n2254","n827","n828","n2255","n830","n2256","n826","n2257","n831","n2258","n832","n835","n834","n2312","n2267","n2259","n833","n2268","n2260","n836","n2261","n837","n2262","n838","n2263","n2264","n839","n2265","n840","n2266"],tags:{highway:"path",name:"Riverwalk Trail",surface:"asphalt",width:"3"}},w264:{id:"w264",nodes:["n1186","n1187","n1188","n1189","n1186"],tags:{building:"yes"}},w265:{id:"w265",nodes:["n1190","n1191","n1192","n1193","n1190"],tags:{building:"yes"}},w266:{id:"w266",nodes:["n1194","n1195","n1196","n1197","n1198","n1199","n1200","n1201","n1194"],tags:{building:"yes"}},w267:{id:"w267",nodes:["n1205","n1206","n1207","n1208","n1209","n1210","n1205"],tags:{building:"house"}},w268:{id:"w268",nodes:["n1211","n1212","n1213","n1214","n1215","n1216","n1217","n1218","n1219","n1220","n1211"],tags:{building:"house"}},w269:{id:"w269",nodes:["n1221","n1225","n1222","n1223","n1224","n1221"],tags:{building:"house"}},w27:{id:"w27",nodes:["n145","n147","n146"],tags:{highway:"footway"}},w270:{id:"w270",nodes:["n1225","n1226","n1227","n1229","n1228"],tags:{barrier:"fence"}},w271:{id:"w271",nodes:["n1229","n1230"],tags:{barrier:"fence"}},w272:{id:"w272",nodes:["n1231","n1232","n1233","n1234","n1235","n1236","n1237","n1238","n1231"],tags:{building:"house"}},w273:{id:"w273",nodes:["n1239","n1240","n1241","n1242","n1243","n1244","n1245","n1246","n1239"],tags:{building:"house"}},w274:{id:"w274",nodes:["n1247","n1248","n1249","n1250","n1247"],tags:{building:"house"}},w275:{id:"w275",nodes:["n1251","n1252","n1253","n1254","n1255","n1256","n1251"],tags:{building:"house"}},w276:{id:"w276",nodes:["n1257","n1258","n1259","n1260","n1257"],tags:{building:"shed"}},w277:{id:"w277",nodes:["n1261","n1262","n1263","n1264","n1265","n1266","n1267","n1268","n1261"],tags:{building:"house"}},w278:{id:"w278",nodes:["n1269","n1270","n1271","n1272","n1273","n1274","n1284","n1269"],tags:{building:"house"}},w279:{id:"w279",nodes:["n1275","n1276","n1277","n1278","n1279","n1280","n1275"],tags:{building:"house"}},w28:{id:"w28",nodes:["n147","n148"],tags:{highway:"footway"}},w280:{id:"w280",nodes:["n1281","n1282","n1283","n1284"],tags:{barrier:"fence"}},w281:{id:"w281",nodes:["n1285","n1286","n1287","n1288","n1285"],tags:{building:"house"}},w282:{id:"w282",nodes:["n1289","n1290","n1291","n1292","n1293","n1294","n1295","n1296","n1289"],tags:{building:"house"}},w283:{id:"w283",nodes:["n1297","n1298","n1299","n1300","n1301","n1302","n1297"],tags:{access:"private",leisure:"swimming_pool"}},w284:{id:"w284",nodes:["n1303","n1304","n1305","n1306","n1307","n1308","n1309","n1310","n1311","n1312","n1303"],tags:{building:"house"}},w285:{id:"w285",nodes:["n1313","n1314","n1315","n1316","n1313"],tags:{building:"house"}},w286:{id:"w286",nodes:["n1317","n1318","n1319","n1320","n1321","n1322","n1323","n1324","n1325","n1326","n1327","n1328","n1329","n1330","n1317"],tags:{building:"house"}},w287:{id:"w287",nodes:["n1331","n1332","n1333","n1334","n1465","n1335","n1336","n1331"],tags:{building:"yes"}},w288:{id:"w288",nodes:["n1349","n1350","n1351","n1352","n1353","n1354","n1355","n1337","n1338","n1341","n1342","n1343","n1344","n1345","n1346","n1347","n1348","n1339","n1340","n1349"],tags:{access:"private",leisure:"swimming_pool"}},w289:{id:"w289",nodes:["n1356","n1331"],tags:{barrier:"fence"}},w29:{id:"w29",nodes:["n149","n874","n150","n151","n897","n898","n875","n152"],tags:{highway:"service",oneway:"yes"}},w290:{id:"w290",nodes:["n1357","n1358","n1359","n1360","n1357"],tags:{building:"shed"}},w291:{id:"w291",nodes:["n1358","n1361","n1362"],tags:{barrier:"fence"}},w292:{id:"w292",nodes:["n1363","n1364","n1365","n1366","n1367","n1368","n1363"],tags:{building:"house"}},w293:{id:"w293",nodes:["n1369","n1370","n1371","n1372","n1373","n1374","n1369"],tags:{leisure:"swimming_pool"}},w294:{id:"w294",nodes:["n1367","n1375","n1376","n1377"],tags:{barrier:"fence"}},w295:{id:"w295",nodes:["n1378","n1379","n1380","n1381","n1378"],tags:{building:"house"}},w296:{id:"w296",nodes:["n1382","n1383","n1384","n1385","n1386","n1387","n1382"],tags:{building:"house"}},w297:{id:"w297",nodes:["n1388","n1389","n1390","n1391","n1392","n1393","n1388"],tags:{building:"house"}},w298:{id:"w298",nodes:["n1394","n1395","n1396","n1397","n1394"],tags:{building:"house"}},w299:{id:"w299",nodes:["n1398","n1399","n1400","n1401","n1398"],tags:{access:"private3",leisure:"swimming_pool"}},w3:{id:"w3",nodes:["n1","n2"],tags:{highway:"track",name:"Water Street"}},w30:{id:"w30",nodes:["n153","n154","n155","n156","n153"],tags:{amenity:"parking"}},w300:{id:"w300",nodes:["n1402","n1403","n1404","n1405","n1406","n1407","n1408","n1409","n1410","n1411","n1412","n1413","n1402"],tags:{building:"house"}},w301:{id:"w301",nodes:["n1414","n1415","n1416","n1417","n1414"],tags:{building:"garage"}},w302:{id:"w302",nodes:["n1406","n1418","n1419","n1403"],tags:{barrier:"fence"}},w303:{id:"w303",nodes:["n1423","n1424","n1425","n1426","n1427","n1428","n1429","n1430","n1431","n1432","n1423"],tags:{building:"house"}},w304:{id:"w304",nodes:["n1433","n1434","n1435","n1446","n1436","n1437","n1438","n1439","n1444","n1440","n1441","n1445","n1442","n1443","n1433"],tags:{access:"private",leisure:"swimming_pool"}},w305:{id:"w305",nodes:["n1447","n1448","n1452","n1453","n1454","n1451","n1449","n1450","n1447"],tags:{building:"house"}},w306:{id:"w306",nodes:["n1455","n1456","n1457","n1458","n1455"],tags:{building:"shed"}},w307:{id:"w307",nodes:["n1459","n1460","n1461","n1462","n1459"],tags:{building:"shed"}},w308:{id:"w308",nodes:["n1463","n1464"],tags:{barrier:"fence"}},w309:{id:"w309",nodes:["n1465","n1466","n1467","n1468"],tags:{barrier:"fence"}},w31:{id:"w31",nodes:["n157","n605","n158"],tags:{highway:"service"}},w310:{id:"w310",nodes:["n1469","n1481","n1463"],tags:{barrier:"hedge"}},w311:{id:"w311",nodes:["n1470","n1471","n1472","n1473","n1474","n1475","n1480","n1476","n1477","n1478","n1479","n1470"],tags:{building:"house"}},w312:{id:"w312",nodes:["n1480","n1481"],tags:{barrier:"wall"}},w313:{id:"w313",nodes:["n1482","n1483","n1484","n1485","n1486","n1487","n1488","n1489","n1490","n1491","n1482"],tags:{access:"private",leisure:"swimming_pool"}},w314:{id:"w314",nodes:["n1492","n1493","n1494","n1495","n1496","n1497","n1498","n1499","n1500","n1501","n1502","n1503","n1504","n1505","n1492"],tags:{building:"house"}},w315:{id:"w315",nodes:["n1506","n1507","n1508","n1509","n1510","n1511","n1512","n1513","n1514","n1515","n1506"],tags:{building:"house"}},w316:{id:"w316",nodes:["n1516","n1517","n1518","n1519","n1520","n1521","n1522","n1523","n1516"],tags:{building:"house"}},w317:{id:"w317",nodes:["n1524","n1525","n1526","n1527","n1528","n1529","n1530","n1531","n1524"],tags:{building:"house"}},w318:{id:"w318",nodes:["n1532","n1533"],tags:{barrier:"fence"}},w319:{id:"w319",nodes:["n1534","n1532","n1535"],tags:{barrier:"fence"}},w32:{id:"w32",nodes:["n159","n160","n161","n162","n159"],tags:{amenity:"parking"}},w320:{id:"w320",nodes:["n1536","n1537","n1538","n1539","n1536"],tags:{building:"shed"}},w321:{id:"w321",nodes:["n1540","n1541","n1542","n1543","n1540"],tags:{building:"shed"}},w322:{id:"w322",nodes:["n1544","n1545","n1546","n1547","n1544"],tags:{building:"shed"}},w323:{id:"w323",nodes:["n1548","n1549","n1550","n1551","n1548"],tags:{building:"house"}},w324:{id:"w324",nodes:["n1552","n1553","n1554","n1555","n1556","n1557","n1558","n1559","n1552"],tags:{building:"house"}},w325:{id:"w325",nodes:["n1560","n1561","n1562","n1563","n1564","n1565","n1566","n1567","n1560"],tags:{building:"house"}},w326:{id:"w326",nodes:["n1561","n1568","n1569","n1570"],tags:{barrier:"wall"}},w327:{id:"w327",nodes:["n1571","n1572"],tags:{barrier:"fence"}},w328:{id:"w328",nodes:["n1573","n1574","n1575","n1576","n1573"],tags:{building:"house"}},w329:{id:"w329",nodes:["n1577","n1578","n1579","n1580","n1581","n1582","n1583","n1584","n1585","n1586","n1577"],tags:{building:"house"}},w33:{id:"w33",nodes:["n157","n163"],tags:{highway:"service"}},w330:{id:"w330",nodes:["n1587","n1588","n1589","n1590","n1591","n1592","n1593","n1594","n1587"],tags:{building:"house"}},w331:{id:"w331",nodes:["n1595","n1596","n1597","n1598","n1599","n1600","n1601","n1595"],tags:{access:"private",leisure:"swimming_pool"}},w332:{id:"w332",nodes:["n1602","n1603","n1604","n1605","n1606","n1607","n1608","n1609","n1611","n1610","n1612","n1613","n1602"],tags:{building:"house"}},w333:{id:"w333",nodes:["n2018","n1626","n1627","n2017","n2018"],tags:{amenity:"shelter",building:"yes",shelter_type:"picnic_shelter"}},w334:{id:"w334",nodes:["n2","n3","n2764"],tags:{highway:"service",name:"Water Street"}},w335:{id:"w335",nodes:["n3","n1628","n1614"],tags:{highway:"service"}},w336:{id:"w336",nodes:["n3198","n4545","n2747"],tags:{highway:"residential",name:"Morris Avenue"}},w337:{id:"w337",nodes:["n1629","n3504"],tags:{highway:"service",service:"alley",surface:"unpaved"}},w338:{id:"w338",nodes:["n1813","n1635","n1814","n1634","n1815","n1632","n1816","n1817"],tags:{highway:"service",service:"parking_aisle"}},w339:{id:"w339",nodes:["n1827","n4684","n4690","n1842","n4686","n4685","n1826","n1828","n1846","n1645","n1637","n4703","n1641"],tags:{highway:"residential",name:"Millard Street"}},w34:{id:"w34",nodes:["n164","n165","n166","n171","n866","n172","n167","n168","n169","n910","n170","n164"],tags:{amenity:"parking"}},w340:{id:"w340",nodes:["n1824","n1825"],tags:{highway:"service",service:"parking_aisle"}},w341:{id:"w341",nodes:["n1701","n1702","n1703","n1704","n1705","n1706","n1701"],tags:{building:"yes"}},w342:{id:"w342",nodes:["n1855","n1860","n1856","n1775","n1804","n1776","n1855"],tags:{amenity:"parking",fee:"no"}},w343:{id:"w343",nodes:["n1757","n1758","n1759","n1760","n1757"],tags:{building:"yes"}},w344:{id:"w344",nodes:["n1659","n1660","n1661","n1662","n1663","n1664","n1665","n1666","n1659"],tags:{building:"school"}},w345:{id:"w345",nodes:["n1751","n1752","n1753","n1754","n1755","n1756","n1751"],tags:{building:"yes"}},w346:{id:"w346",nodes:["n1641","n1676","n1673","n1639","n1810","n1642","n1849","n4759","n1845"],tags:{highway:"residential",name:"Douglas Avenue"}},w347:{id:"w347",nodes:["n1642","n1643","n1031","n1630","n845","n1631","n816","n1831","n902","n905","n152","n149","n1832","n1850","n878","n1833","n1852","n42","n1834","n61","n60","n1851","n1835"],tags:{highway:"primary",name:"Michigan Avenue"}},w348:{id:"w348",nodes:["n1650","n1651","n1652","n1653","n1654","n1655","n1656","n1657","n1658","n1650"],tags:{leisure:"playground"}},w349:{id:"w349",nodes:["n1861","n1818","n1819","n1820","n1821","n1825","n1823","n1639"],tags:{highway:"service"}},w35:{id:"w35",nodes:["n168","n167","n172"],tags:{barrier:"fence",fence_type:"chain_link"}},w350:{id:"w350",nodes:["n1783","n1819","n1784","n1857","n1861","n1858","n1783"],tags:{amenity:"parking"}},w351:{id:"w351",nodes:["n1717","n1718","n1719","n1720","n1717"],tags:{building:"yes"}},w352:{id:"w352",nodes:["n1743","n1744","n1745","n1746","n1747","n1748","n1749","n1750","n1743"],tags:{building:"yes"}},w353:{id:"w353",nodes:["n1637","n1636","n1029","n4715","n1630"],tags:{highway:"residential",name:"Lincoln Avenue"}},w354:{id:"w354",nodes:["n1713","n1714","n1715","n1716","n1713"],tags:{building:"yes"}},w355:{id:"w355",nodes:["n1689","n1690","n1691","n1692","n1693","n1694","n1695","n1696","n1689"],tags:{building:"yes"}},w356:{id:"w356",nodes:["n1631","n4717","n1840","n4745","n1841"],tags:{highway:"residential",name:"Hook Avenue"}},w357:{id:"w357",nodes:["n1737","n1738","n1739","n1740","n1741","n1742","n1737"],tags:{building:"yes"}},w358:{id:"w358",nodes:["n1707","n1708","n1709","n1710","n1711","n1712","n1707"],tags:{building:"yes"}},w359:{id:"w359",nodes:["n1829","n4695","n4697","n1843","n4698","n4701","n1638","n4702","n4705","n1636","n4706","n4707","n1633"],tags:{highway:"residential",name:"South Street"}},w36:{id:"w36",nodes:["n910","n171","n866","n172"],tags:{barrier:"fence",fence_type:"chain_link"}},w360:{id:"w360",nodes:["n1767","n1768","n1769","n1770","n1771","n1772","n1773","n1774","n1767"],tags:{building:"yes"}},w361:{id:"w361",nodes:["n1859","n1860","n1804","n1640","n1805","n1817","n1806","n1644","n1811","n1807","n1808","n3419","n1812","n1790","n3418","n3744","n1809","n1813","n1810"],tags:{highway:"service"}},w362:{id:"w362",nodes:["n1639","n1683","n4710","n1633"],tags:{highway:"residential",name:"South Street",oneway:"yes"}},w363:{id:"w363",nodes:["n1646","n1647","n1648","n1649","n1646"],tags:{leisure:"pitch",pitch:"basketball"}},w364:{id:"w364",nodes:["n3820","n3821","n3822","n3823","n3824","n3825","n3826","n3827","n3828","n3829","n3830","n3838","n3839","n3820"],tags:{amenity:"school",name:"Three Rivers Middle School"}},w365:{id:"w365",nodes:["n1721","n1722","n1723","n1724","n1725","n1726","n1727","n1728","n1729","n1730","n1731","n1732","n1733","n1734","n1735","n1736","n1721"],tags:{building:"yes"}},w366:{id:"w366",nodes:["n1791","n1792","n1793","n1794","n1795","n1796","n1798","n1799","n1800","n1801","n1802","n1803","n1791"],tags:{amenity:"parking"}},w367:{id:"w367",nodes:["n1633","n4708","n4711","n1643","n4712","n1838","n4752","n1839"],tags:{highway:"residential",name:"Grant Avenue"}},w368:{id:"w368",nodes:["n1853","n1687","n1688","n1854","n1853"],tags:{amenity:"library",building:"yes",name:"Three Rivers Public Library"}},w369:{id:"w369",nodes:["n1777","n1778","n1779","n1780","n1781","n1782","n1777"],tags:{amenity:"parking"}},w37:{id:"w37",nodes:["n173","n174","n175","n176","n177","n178","n179","n180","n173"],tags:{building:"yes"}},w370:{id:"w370",nodes:["n1645","n1638","n858","n4718","n1631"],tags:{highway:"residential",name:"Hook Avenue"}},w371:{id:"w371",nodes:["n3836","n3835","n4624","n3831","n4632","n3834","n3832","n3833","n3830","n3838","n3839","n3837","n3836"],tags:{amenity:"school",name:"Three Rivers High School"}},w372:{id:"w372",nodes:["n1697","n1698","n1699","n1700","n1697"],tags:{building:"yes"}},w373:{id:"w373",nodes:["n2891","n1785","n1786","n3394","n1787","n1788","n1789","n1830","n1836","n1837","n1848","n3409","n2891"],tags:{amenity:"parking"}},w374:{id:"w374",nodes:["n1761","n1762","n1763","n1764","n1765","n1766","n1761"],tags:{building:"yes"}},w375:{id:"w375",nodes:["n1822","n1823"],tags:{highway:"service",service:"parking_aisle"}},w376:{id:"w376",nodes:["n1677","n1678","n1679","n1680","n1681","n1682","n1677"],tags:{amenity:"parking"}},w377:{id:"w377",nodes:["n1676","n1675","n1674","n1673"],tags:{highway:"service",oneway:"yes"}},w378:{id:"w378",nodes:["n1667","n1668","n1669","n1670","n1671","n1672","n1667"],tags:{amenity:"school",name:"Andrews Elementary School"}},w379:{id:"w379",nodes:["n1630","n4714","n1847","n4750","n1844"],tags:{highway:"residential",name:"Lincoln Avenue"}},w38:{id:"w38",nodes:["n181","n182","n183","n185","n184","n181"],tags:{building:"yes"}},w380:{id:"w380",nodes:["n1683","n3745","n1686","n1633"],tags:{highway:"service",oneway:"yes",service:"parking_aisle"}},w381:{id:"w381",nodes:["n2022","n2037"],tags:{highway:"footway"}},w382:{id:"w382",nodes:["n1826","n1863"],tags:{highway:"residential"}},w383:{id:"w383",nodes:["n2011","n2012","n739","n2013","n2014","n2029","n2011"],tags:{amenity:"shelter",building:"yes",shelter_type:"picnic_shelter"}},w384:{id:"w384",nodes:["n2064","n2065","n2066","n2067","n2068","n2069","n2070","n2071","n2072","n2073","n2074","n2075","n2076","n2077","n2078","n2079","n2064"],tags:{building:"yes"}},w385:{id:"w385",nodes:["n1923","n1924","n1925","n1926","n1927","n1928","n1930","n1929","n1923"],tags:{natural:"water"}},w386:{id:"w386",nodes:["n1827","n14","n1886","n15","n1887","n16","n1888","n18","n17","n1889","n12","n13","n1890","n485","n1864","n11","n10","n2058","n2036","n1865","n2020","n9","n8","n1866","n295","n1867"],tags:{highway:"service"}},w387:{id:"w387",nodes:["n1846","n1843","n865","n157","n4721","n1831"],tags:{highway:"residential",name:"Andrews Street"}},w388:{id:"w388",nodes:["n2019","n2020","n2021","n2022","n2023","n2024","n2025","n2026","n2027","n2028","n2029"],tags:{highway:"footway"}},w389:{id:"w389",nodes:["n2217","n2222","n2221","n2219","n1877","n1879","n1882","n1883","n484","n1885","n483","n1880","n1881","n1878","n1884","n2223"],tags:{name:"Rocky River",waterway:"river"}},w39:{id:"w39",nodes:["n185","n186","n187"],tags:{barrier:"fence"}},w390:{id:"w390",nodes:["n2050","n2051","n2052","n2053","n2050"],tags:{amenity:"shelter",building:"yes",shelter_type:"picnic_shelter"}},w391:{id:"w391",nodes:["n2089","n2090","n2091","n2092","n2093","n2094","n2311","n2095","n2096","n2097","n2098","n1174","n2099","n751","n43","n2062","n4725","n873","n1832"],tags:{highway:"residential",name:"Constantine Street"}},w392:{id:"w392",nodes:["n1869","n212","n436","n2281","n2081"],tags:{highway:"primary",name:"Michigan Avenue"}},w393:{id:"w393",nodes:["n1829","n611","n144","n4694","n602","n1832"],tags:{highway:"tertiary",name:"Constantine Street"}},w394:{id:"w394",nodes:["n1997","n1998","n2000","n1999"],tags:{highway:"service",service:"parking_aisle"}},w395:{id:"w395",nodes:["n1835","n1869"],tags:{bridge:"yes",highway:"primary",name:"Michigan Avenue"}},w396:{id:"w396",nodes:["n2000","n2001"],tags:{highway:"service",service:"parking_aisle"}},w397:{id:"w397",nodes:["n2082","n4688","n1842","n308","n498","n509","n246","n241","n1867","n4645","n293","n1834"],tags:{highway:"residential",name:"Spring Street"}},w398:{id:"w398",nodes:["n2015","n2016","n2017","n2018","n2015"],tags:{building:"yes"}},w399:{id:"w399",nodes:["n2062","n45","n2063","n877","n41","n1852"],tags:{highway:"service"}},w4:{id:"w4",nodes:["n7","n38","n378","n379","n7"],tags:{building:"yes"}},w40:{id:"w40",nodes:["n188","n189","n190","n191","n192","n193","n188"],tags:{building:"house"}},w400:{id:"w400",nodes:["n1968","n1969","n1970","n1971","n2007","n1972","n1973","n1978","n1974","n1977","n1976","n1975","n1968"],tags:{amenity:"parking"}},w401:{id:"w401",nodes:["n1963","n1964"],tags:{bridge:"yes",highway:"footway"}},w402:{id:"w402",nodes:["n1892","n1893","n1894","n1895","n1896","n1897","n1898","n1899","n1900","n1901","n1902","n1903","n1892"],tags:{"addr:city":"Three Rivers","addr:housenumber":"112","addr:postcode":"49093","addr:state":"MI","addr:street":"Spring Street",barrier:"fence",name:"Scidmore Park Petting Zoo",tourism:"zoo",zoo:"petting_zoo"}},w403:{id:"w403",nodes:["n1957","n1958","n1959","n481","n1960","n482","n1949"],tags:{highway:"path"}},w404:{id:"w404",nodes:["n2281","n27","n330","n1987","n1988"],tags:{highway:"service"}},w405:{id:"w405",nodes:["n2249","n2269","n2270","n2271","n2272","n454","n455","n2273"],tags:{highway:"path",name:"Riverwalk Trail"}},w406:{id:"w406",nodes:["n1947","n1624","n1625","n2030","n2033","n4658","n4659","n2031","n2032","n2021"],tags:{highway:"footway"}},w407:{id:"w407",nodes:["n2034","n2036","n2009"],tags:{highway:"footway"}},w408:{id:"w408",nodes:["n1964","n1965","n2002","n1966","n21","n1967","n1969"],tags:{highway:"footway"}},w409:{id:"w409",nodes:["n1904","n1905","n1906","n1907","n1908","n1909","n748","n1910","n747","n1911","n749","n1912","n750","n1913","n1922","n1914","n1921","n1915","n746","n1916","n745","n1917","n744","n1918","n743","n742","n1919","n741","n1920","n740","n1904"],tags:{natural:"water"}},w41:{id:"w41",nodes:["n194","n195","n196","n197","n198","n199","n200","n201","n202","n203","n204","n205","n194"],tags:{building:"house"}},w410:{id:"w410",nodes:["n1868","n2088"],tags:{bridge:"yes",name:"Conrail Railroad",railway:"rail"}},w411:{id:"w411",nodes:["n2010","n2019","n2009","n2008","n2058","n2035","n1961","n1962","n1947","n1963"],tags:{highway:"footway"}},w412:{id:"w412",nodes:["n2290","n2043","n2044","n2045","n1872","n2041","n1873","n2042","n1874","n2046","n2047","n2048","n2049","n2290"],tags:{"addr:city":"Three Rivers","addr:housenumber":"112","addr:postcode":"49093","addr:state":"MI","addr:street":"Spring Street",leisure:"park",name:"Scidmore Park"}},w413:{id:"w413",nodes:["n1831","n876","n4720","n821","n2089"],tags:{highway:"residential",name:"Andrews Street"}},w414:{id:"w414",nodes:["n2002","n2003","n2004","n2005","n2006","n2007"],tags:{highway:"footway"}},w415:{id:"w415",nodes:["n1979","n1980","n1981","n1982","n1979"],tags:{amenity:"parking"}},w416:{id:"w416",nodes:["n2054","n2055","n2056","n2057","n2054"],tags:{amenity:"shelter",building:"yes",shelter_type:"picnic_shelter"}},w417:{id:"w417",nodes:["n2291","n2292","n2293","n2294","n2295","n2296","n2297","n2298","n2299","n1098","n2300","n2301","n2302","n2303","n2304","n2059","n2060","n2305","n2307","n2306","n2310","n2308","n2309","n2291"],tags:{leisure:"park",name:"Memory Isle Park"}},w418:{id:"w418",nodes:["n2033","n2034","n2035"],tags:{highway:"footway"}},w419:{id:"w419",nodes:["n1983","n1984","n1985","n1986","n1983"],tags:{amenity:"parking"}},w42:{id:"w42",nodes:["n206","n207","n208","n209","n210","n211","n206"],tags:{building:"house"}},w420:{id:"w420",nodes:["n1840","n4746","n4748","n1847","n4749","n4755","n1838","n4754","n4756","n1849"],tags:{highway:"residential",name:"French Street"}},w421:{id:"w421",nodes:["n2337","n2268"],tags:{highway:"path"}},w422:{id:"w422",nodes:["n2338","n2339","n2320","n2317","n2319","n2318","n2340","n2341","n2342","n2343","n2344","n2345","n2346","n2347","n2348","n2338"],tags:{natural:"water"}},w423:{id:"w423",nodes:["n2180","n2349","n2350","n2351","n2352","n2404","n2353","n2354","n2355","n2356","n2357","n2358","n2359","n2360","n2361","n2362","n2363","n2364","n2365","n2366","n2370","n2371","n2372","n2373","n2374","n2375","n2377","n2378","n2380","n2381","n2382","n2383","n2386","n2389","n2390","n2391","n2392","n2393","n2396","n2397","n2401","n2402","n2321","n2322","n2323","n2403","n2180"],tags:{natural:"wetland"}},w424:{id:"w424",nodes:["n2324","n2316","n1841","n2315","n2314","n1844","n1839","n4758","n1845"],tags:{highway:"residential",name:"Pealer Street"}},w425:{id:"w425",nodes:["n2267","n2337","n2336","n2335","n2334","n2333","n2332","n2331","n2330","n37","n2329","n2328","n2327","n36","n2326","n2325","n2266"],tags:{highway:"path",name:"Riverwalk Trail"}},w426:{id:"w426",nodes:["n2478","n681","n680","n679","n2459","n2467","n2487","n2478"],tags:{building:"yes"}},w427:{id:"w427",nodes:["n2671","n2672","n2673","n2674","n2671"],tags:{building:"yes"}},w428:{id:"w428",nodes:["n2483","n2482","n2486","n2489","n2492","n2502","n2495","n2480","n2483"],tags:{building:"yes"}},w429:{id:"w429",nodes:["n2707","n2708","n2716","n2712","n2714","n2713","n2715","n2711","n2710","n2723","n2709","n2707"],tags:{amenity:"parking"}},w43:{id:"w43",nodes:["n1955","n1956"],tags:{footway:"sidewalk",highway:"footway",name:"Riverwalk Trail"}},w430:{id:"w430",nodes:["n2471","n2474","n2484","n2479","n2471"],tags:{building:"yes"}},w431:{id:"w431",nodes:["n2218","n2434","n2436","n2433","n2435","n2210"],tags:{name:"Rocky River",waterway:"river"}},w432:{id:"w432",nodes:["n2782","n2532","n2783","n2784","n2782"],tags:{amenity:"parking"}},w433:{id:"w433",nodes:["n2513","n649","n2520","n2514","n2507","n2513"],tags:{building:"yes"}},w434:{id:"w434",nodes:["n2470","n2468","n2461","n2465","n2470"],tags:{building:"yes"}},w435:{id:"w435",nodes:["n2598","n2599","n648","n649","n2520","n2598"],tags:{building:"yes"}},w436:{id:"w436",nodes:["n2639","n2640","n2641","n2642","n2643","n2644","n2645","n2646","n2647","n2648","n2639"],tags:{building:"yes"}},w437:{id:"w437",nodes:["n2503","n2512","n2508","n2499","n2503"],tags:{building:"yes"}},w438:{id:"w438",nodes:["n2440","n2800","n2774","n1"],tags:{highway:"residential",name:"Water Street"}},w439:{id:"w439",nodes:["n2675","n2676","n2677","n2678","n2675"],tags:{building:"yes"}},w44:{id:"w44",nodes:["n213","n214","n215","n216","n213"],tags:{building:"yes"}},w440:{id:"w440",nodes:["n2512","n2503","n2507","n2514","n2512"],tags:{building:"yes"}},w441:{id:"w441",nodes:["n2554","n2717","n674","n2720","n2798"],tags:{highway:"service",oneway:"yes"}},w442:{id:"w442",nodes:["n2583","n2596","n2584","n2585","n2595","n2586","n2587","n2588","n2589","n2583"],tags:{amenity:"parking"}},w443:{id:"w443",nodes:["n2629","n2627","n2628","n2616","n2630","n2629"],tags:{building:"yes"}},w444:{id:"w444",nodes:["n2717","n2724","n670","n2718","n669","n668","n2722","n2727"],tags:{highway:"service",oneway:"yes",service:"parking_aisle"}},w445:{id:"w445",nodes:["n2572","n2573"],tags:{bridge:"yes",highway:"path",name:"Riverwalk Trail"}},w446:{id:"w446",nodes:["n2603","n2604","n2601","n2605","n2606","n2607","n2603"],tags:{building:"yes"}},w447:{id:"w447",nodes:["n2780","n2777","n628","n624","n2779"],tags:{highway:"residential",name:"Foster Street",oneway:"yes"}},w448:{id:"w448",nodes:["n2733","n2734","n2735","n2736","n2737","n2738","n663","n664","n2739","n2733"],tags:{building:"yes"}},w449:{id:"w449",nodes:["n2564","n2565","n2566","n2567","n2568","n2794","n2795","n2564"],tags:{amenity:"parking"}},w45:{id:"w45",nodes:["n217","n218","n219","n220","n217"],tags:{amenity:"shelter",building:"yes",shelter_type:"picnic_shelter"}},w450:{id:"w450",nodes:["n2799","n2728","n2729","n2730","n2731","n2732","n2799"],tags:{building:"yes"}},w451:{id:"w451",nodes:["n2441","n1170","n2442","n2575","n2443","n2445","n2444","n2448","n2441"],tags:{amenity:"parking"}},w452:{id:"w452",nodes:["n2273","n457","n2569","n458","n2570"],tags:{highway:"path",name:"Riverwalk Trail"}},w453:{id:"w453",nodes:["n2447","n2242","n2448","n2527","n2530"],tags:{highway:"service"}},w454:{id:"w454",nodes:["n2560","n333","n2561"],tags:{highway:"service",service:"parking_aisle"}},w455:{id:"w455",nodes:["n2679","n2680","n2681","n2682","n2683","n2684","n2685","n2686","n2687","n2688","n2689","n2690","n2679"],tags:{building:"yes"}},w456:{id:"w456",nodes:["n2425","n2429","n2424"],tags:{bridge:"yes",highway:"residential",name:"Moore Street"}},w457:{id:"w457",nodes:["n2487","n2467","n2472","n2480","n2495","n2487"],tags:{building:"yes"}},w458:{id:"w458",nodes:["n2659","n2660","n2661","n2662","n678","n677","n2663","n2664","n2665","n2666","n675","n676","n2659"],tags:{building:"yes"}},w459:{id:"w459",nodes:["n2600","n2598","n2599","n2601","n2605","n2602","n2600"],tags:{building:"yes"}},w46:{id:"w46",nodes:["n221","n222","n223","n224","n221"],tags:{amenity:"shelter",building:"yes",shelter_type:"picnic_shelter"}},w460:{id:"w460",nodes:["n2468","n2464","n2455","n2457","n2461","n2468"],tags:{building:"yes"}},w461:{id:"w461",nodes:["n2478","n2473","n683","n682","n2463","n681","n2478"],tags:{building:"yes"}},w462:{id:"w462",nodes:["n2547","n473","n2548","n2549"],tags:{highway:"service",service:"parking_aisle"}},w463:{id:"w463",nodes:["n2573","n2574"],tags:{highway:"path",name:"Riverwalk Trail"}},w464:{id:"w464",nodes:["n2445","n2597","n2527","n2528","n2529","n2530","n2531","n2597"],tags:{highway:"service",service:"parking_aisle"}},w465:{id:"w465",nodes:["n2571","n459","n2572"],tags:{highway:"path",name:"Riverwalk Trail"}},w466:{id:"w466",nodes:["n2445","n2574","n2552","n442","n2551","n4727","n323","n2446"],tags:{highway:"service"}},w467:{id:"w467",nodes:["n2484","n2474","n2477","n2485","n2488","n2484"],tags:{building:"yes"}},w468:{id:"w468",nodes:["n2695","n2696","n2697","n2698","n2699","n2700","n2701","n2702","n2695"],tags:{building:"yes"}},w469:{id:"w469",nodes:["n2469","n2476","n2481","n2475","n920","n2466","n2469"],tags:{building:"yes"}},w47:{id:"w47",nodes:["n1988","n1997","n1989","n25","n24","n1990","n26","n1991","n21","n1992","n2006","n1993","n22","n1994","n23","n1995","n1999","n1996","n2001","n1988"],tags:{highway:"service"}},w470:{id:"w470",nodes:["n2473","n2470","n2465","n2458","n2462","n683","n2473"],tags:{building:"yes"}},w471:{id:"w471",nodes:["n2490","n2496","n994","n997","n998","n996","n995","n2485","n2477","n2490"],tags:{building:"yes"}},w472:{id:"w472",nodes:["n2424","n2426","n2427","n2428"],tags:{highway:"residential",name:"Moore Street"}},w473:{id:"w473",nodes:["n2432","n1026","n4741","n2554","n2425"],tags:{highway:"residential",name:"Moore Street"}},w474:{id:"w474",nodes:["n2577","n2576"],tags:{bridge:"yes",highway:"footway"}},w475:{id:"w475",nodes:["n2497","n2505","n2500","n2493","n2497"],tags:{building:"yes"}},w476:{id:"w476",nodes:["n2493","n2500","n2501","n2496","n2490","n2493"],tags:{building:"yes"}},w477:{id:"w477",nodes:["n2431","n360","n4726","n418","n397","n396","n2547","n646","n2447","n644","n2418","n424","n640","n2419","n2420","n2423"],tags:{highway:"residential",name:"Railroad Drive"}},w478:{id:"w478",nodes:["n2515","n2511","n2498","n2504","n2509","n2515"],tags:{building:"yes"}},w479:{id:"w479",nodes:["n2525","n651","n650","n2526","n2524","n653","n652","n656","n2523","n654","n2518","n2517","n2521","n2522","n2525"],tags:{building:"yes"}},w48:{id:"w48",nodes:["n225","n237","n226","n227","n228","n229","n230","n231","n232","n233","n234","n235","n236","n225"],tags:{building:"yes"}},w480:{id:"w480",nodes:["n2703","n2704","n2710","n2711","n2705","n2706","n2703"],tags:{amenity:"parking"}},w481:{id:"w481",nodes:["n2796","n2657","n2658","n2797","n2796"],tags:{building:"yes"}},w482:{id:"w482",nodes:["n2550","n2551","n442","n2552","n2553","n2550"],tags:{amenity:"parking"}},w483:{id:"w483",nodes:["n2790","n2542"],tags:{highway:"service",service:"parking_aisle"}},w484:{id:"w484",nodes:["n2311","n1102"],tags:{highway:"service"}},w485:{id:"w485",nodes:["n2515","n2509","n2516","n2519","n2515"],tags:{building:"yes"}},w486:{id:"w486",nodes:["n2506","n2502","n2492","n2491","n2494","n2506"],tags:{building:"yes"}},w487:{id:"w487",nodes:["n2667","n2668","n2669","n2670","n2667"],tags:{building:"yes"}},w488:{id:"w488",nodes:["n2616","n2608","n2617","n2618","n2619","n2620","n2621","n2622","n2623","n2624","n2625","n2626","n2627","n2628","n2616"],tags:{building:"yes"}},w489:{id:"w489",nodes:["n2081","n2430"],tags:{bridge:"yes",highway:"primary",name:"Michigan Avenue"}},w49:{id:"w49",nodes:["n237","n238"],tags:{highway:"footway"}},w490:{id:"w490",nodes:["n2410","n636","n730","n635","n2409","n2694","n2751","n2765","n2753","n2768","n2754","n2769","n2745","n2766","n4503","n2763","n4501","n2752","n2781"],tags:{highway:"residential",name:"Portage Avenue"}},w491:{id:"w491",nodes:["n2578","n2579","n2580","n2581","n2578"],tags:{amenity:"shelter",building:"yes",shelter_type:"picnic_shelter"}},w492:{id:"w492",nodes:["n2556","n2557","n2558","n2559","n2556"],tags:{amenity:"parking"}},w493:{id:"w493",nodes:["n2460","n2456","n687","n2453","n2454","n2460"],tags:{building:"yes"}},w494:{id:"w494",nodes:["n2471","n2479","n2476","n2469","n2471"],tags:{building:"yes"}},w495:{id:"w495",nodes:["n2724","n2725","n673","n672","n671","n2726","n2727"],tags:{highway:"service",oneway:"yes",service:"parking_aisle"}},w496:{id:"w496",nodes:["n2649","n2650","n2651","n2652","n2653","n2654","n2655","n2656","n2649"],tags:{building:"yes"}},w497:{id:"w497",nodes:["n2430","n2446","n343","n2101","n2560","n2431","n363","n2748"],tags:{highway:"primary",name:"Michigan Avenue"}},w498:{id:"w498",nodes:["n2691","n2692","n634","n633","n2693","n2694"],tags:{highway:"service"}},w499:{id:"w499",nodes:["n2423","n2415","n661","n2416","n2417","n2719","n2721","n2772","n2756","n2773","n2759","n2767"],tags:{highway:"residential",name:"West Street"}},w5:{id:"w5",nodes:["n380","n381","n382","n383","n429","n430","n380"],tags:{building:"yes"}},w50:{id:"w50",nodes:["n239","n499","n508","n245","n238","n242","n240"],tags:{footway:"sidewalk",highway:"footway"}},w500:{id:"w500",nodes:["n2428","n1152","n2421","n2324"],tags:{bridge:"yes",highway:"residential",name:"Moore Street"}},w501:{id:"w501",nodes:["n2608","n2609","n2610","n2611","n2612","n2613","n2614","n2615","n2617","n2608"],tags:{building:"yes"}},w502:{id:"w502",nodes:["n2570","n2571"],tags:{bridge:"yes",highway:"path",name:"Riverwalk Trail"}},w503:{id:"w503",nodes:["n2540","n2542","n2787"],tags:{highway:"service"}},w504:{id:"w504",nodes:["n2269","n2582","n2250"],tags:{highway:"path"}},w505:{id:"w505",nodes:["n2631","n2632","n2633","n2634","n2635","n2636","n2637","n2638","n2631"],tags:{building:"yes"}},w506:{id:"w506",nodes:["n2543","n2544","n2545","n395","n2546","n2543"],tags:{amenity:"parking"}},w507:{id:"w507",nodes:["n2449","n2450","n2451","n2452","n1162","n2449"],tags:{leisure:"pitch",sport:"tennis"}},w508:{id:"w508",nodes:["n2554","n1160","n2559","n2558","n659","n2555","n658","n657","n2419"],tags:{highway:"service"}},w509:{id:"w509",nodes:["n2499","n2508","n2510","n2505","n2497","n2499"],tags:{building:"yes"}},w51:{id:"w51",nodes:["n241","n242","n243","n244"],tags:{highway:"service",surface:"unpaved"}},w510:{id:"w510",nodes:["n2575","n2577"],tags:{highway:"footway"}},w511:{id:"w511",nodes:["n2533","n2534","n2535","n2536","n2537","n2538","n2539","n2785","n2786","n2533"],tags:{amenity:"parking"}},w512:{id:"w512",nodes:["n2801","n2740","n2741","n2742","n2743","n2744","n2801"],tags:{building:"yes"}},w513:{id:"w513",nodes:["n2720","n2721"],tags:{highway:"service",service:"parking_aisle"}},w514:{id:"w514",nodes:["n2788","n2790","n2789","n989","n2540","n2541"],tags:{highway:"service",service:"parking_aisle"}},w515:{id:"w515",nodes:["n2848","n2849","n2850","n2851","n2803","n2804","n2812"],tags:{highway:"residential",name:"Middle Street"}},w516:{id:"w516",nodes:["n2852","n2805"],tags:{access:"private",highway:"service",name:"Battle Street"}},w517:{id:"w517",nodes:["n2863","n2815","n2814","n2812","n2864","n2855","n2865","n2867","n2868"],tags:{highway:"secondary",name:"Michigan Avenue",name_1:"State Highway 60",ref:"M 60"}},w518:{id:"w518",nodes:["n2859","n2808"],tags:{highway:"residential",name:"2nd Avenue"}},w519:{id:"w519",nodes:["n2823","n2824","n2825","n2826","n2827","n2828","n2823"],tags:{building:"yes"}},w52:{id:"w52",nodes:["n247","n248","n249","n250","n247"],tags:{amenity:"parking"}},w520:{id:"w520",nodes:["n2806","n2807","n2803"],tags:{highway:"residential",name:"2nd Avenue"}},w521:{id:"w521",nodes:["n2829","n2830","n2831","n2832","n2833","n2834","n2835","n2836","n2837","n2838","n2829"],tags:{building:"yes"}},w522:{id:"w522",nodes:["n2815","n2813","n2811","n4597","n2846","n4596","n2857","n4601","n2853","n4602","n2861","n4","n2879","n4560","n3550","n5","n1685"],tags:{highway:"residential",name:"Washington Street"}},w523:{id:"w523",nodes:["n2878","n2811","n2810","n2860","n2880","n2881","n2882"],tags:{highway:"residential",name:"5th Avenue"}},w524:{id:"w524",nodes:["n2816","n2817","n2818","n2819","n2820","n2821","n2822","n2816"],tags:{building:"yes"}},w525:{id:"w525",nodes:["n2869","n2856","n2806","n2808","n2814","n2809","n2810","n2847","n2858","n2854","n2870","n2871","n6","n2872","n2839","n2862"],tags:{highway:"residential",name:"Wood Street"}},w526:{id:"w526",nodes:["n2877","n2809","n2813","n2844","n2843"],tags:{highway:"residential",name:"4th Avenue"}},w527:{id:"w527",nodes:["n4785","n4784","n2936","n4788","n4787","n4786","n4785"],tags:{amenity:"parking"}},w528:{id:"w528",nodes:["n2864","n2892","n2893","n2877","n2860","n3840"],tags:{highway:"residential",name:"Garden Street"}},w529:{id:"w529",nodes:["n2868","n2890"],tags:{bridge:"yes",highway:"secondary",name:"Michigan Avenue",name_1:"State Highway 60",ref:"M 60"}},w53:{id:"w53",nodes:["n251","n252","n253","n254","n255","n256","n257","n258","n259","n260","n261","n262","n251"],tags:{building:"yes"}},w530:{id:"w530",nodes:["n2914","n2915","n2916","n2917","n2918","n2919","n2920","n2921","n2922","n2923","n2924","n2925","n2926","n2927","n2928","n2929","n2930","n2931","n2932","n2933","n2914"],tags:{building:"yes"}},w531:{id:"w531",nodes:["n2958","n2896"],tags:{bridge:"yes",highway:"secondary",name:"Main Street"}},w532:{id:"w532",nodes:["n2896","n394","n364","n2748"],tags:{highway:"secondary",name:"Main Street"}},w533:{id:"w533",nodes:["n2800","n2943","n2940","n2941","n2942","n2943"],tags:{highway:"service",service:"parking_aisle"}},w534:{id:"w534",nodes:["n3836","n3837","n3839","n3838","n3834","n4632","n3831","n4624","n3835","n3836"],tags:{barrier:"fence"}},w535:{id:"w535",nodes:["n2894","n2944","n2774","n2765"],tags:{highway:"residential",name:"5th Avenue"}},w536:{id:"w536",nodes:["n2890","n2780","n627","n2889","n2887","n623","n2888","n366","n2748"],tags:{highway:"secondary",name:"Michigan Avenue",name_1:"State Highway 60",ref:"M 60"}},w537:{id:"w537",nodes:["n2895","n738","n2887","n737","n2913"],tags:{highway:"residential",name:"Water Street"}},w538:{id:"w538",nodes:["n2855","n3756","n2884","n2885","n2886","n2945","n2946","n2947","n2948","n2949","n2950","n2951","n2952","n2953","n2955","n2848","n2956","n2856"],tags:{highway:"residential",name:"River Drive"}},w539:{id:"w539",nodes:["n2882","n2894"],tags:{bridge:"yes",highway:"residential",name:"5th Avenue"}},w54:{id:"w54",nodes:["n263","n264","n265","n266","n267","n268","n269","n270","n271","n272","n273","n274","n275","n276","n263"],tags:{building:"yes"}},w540:{id:"w540",nodes:["n2987","n2964","n2981","n2983","n2966","n2982","n2962","n2960","n2967","n2965","n2984","n2977","n2968","n2976","n2986","n2988","n2963","n2970","n2969","n2979","n2974","n2980","n2959","n2973","n2985","n2961","n2975","n2971","n2972","n2978","n2898","n2907","n2912","n2909","n2911","n2901","n2903","n2904","n2906","n2902","n2900","n2910","n2908","n2899","n2897","n2905","n2186","n2233"],tags:{name:"Portage River",waterway:"river"}},w541:{id:"w541",nodes:["n2852","n2851","n3003"],tags:{highway:"residential",name:"1st Avenue"}},w542:{id:"w542",nodes:["n2991","n3004","n2994"],tags:{highway:"residential",name:"River Street"}},w543:{id:"w543",nodes:["n2993","n2989"],tags:{bridge:"yes",highway:"residential",name:"6th Street"}},w544:{id:"w544",nodes:["n2995","n2996","n2997","n2998","n2999","n3000","n3001","n3002","n2990","n2991","n2993"],tags:{highway:"residential",name:"6th Street"}},w545:{id:"w545",nodes:["n2989","n2992","n2848"],tags:{highway:"residential",name:"6th Street"}},w546:{id:"w546",nodes:["n2313","n3169","n3170","n3171","n3172","n3173","n3174","n3175","n3176","n3177","n3178","n3179","n3180","n3191","n3181","n3190","n3182","n3183","n3184","n3185","n3186","n3187","n3188","n3189","n3160","n3161","n3162","n2126","n2146","n2156","n2129","n2112","n2109","n2313"],tags:{natural:"wetland"}},w547:{id:"w547",nodes:["n2088","n3013","n3015","n3014","n3017","n3018"],tags:{name:"Conrail Railroad",railway:"rail"}},w548:{id:"w548",nodes:["n3083","n3084","n3085","n3086","n3083"],tags:{building:"yes"}},w549:{id:"w549",nodes:["n3020","n2288","n2283","n2284","n2131","n2286","n2287","n2285","n2132","n2140","n2289","n3020"],tags:{leisure:"park",name:"Conservation Park"}},w55:{id:"w55",nodes:["n277","n278","n279","n280","n281","n282","n283","n284","n277"],tags:{building:"yes"}},w550:{id:"w550",nodes:["n3056","n3042","n3041","n3040","n3039","n3038","n3037","n3036","n3044","n3035","n3034","n3043","n3016","n3056","n3019","n3015","n3012"],tags:{highway:"service"}},w551:{id:"w551",nodes:["n3044","n3045","n3046","n3047","n3048","n3049","n3050","n3051","n3052","n3053","n3054","n3055","n3016"],tags:{highway:"footway"}},w552:{id:"w552",nodes:["n3117","n3118","n3119","n3120","n3121","n3122","n3117"],tags:{building:"yes"}},w553:{id:"w553",nodes:["n3123","n3124","n3129","n3125","n3126","n3123"],tags:{building:"yes"}},w554:{id:"w554",nodes:["n3069","n3070","n3071","n3072","n3073","n3074","n3075","n3076","n3077","n3078","n3079","n3080","n3081","n3082","n3069"],tags:{building:"yes"}},w555:{id:"w555",nodes:["n3087","n3088","n3089","n3090","n3087"],tags:{building:"yes"}},w556:{id:"w556",nodes:["n3113","n3114","n3115","n3116","n3113"],tags:{building:"yes"}},w557:{id:"w557",nodes:["n3103","n3104","n3105","n3106","n3103"],tags:{building:"yes"}},w558:{id:"w558",nodes:["n3127","n3128","n3129","n3124","n3127"],tags:{building:"yes"}},w559:{id:"w559",nodes:["n3137","n3141","n3142","n3138","n3139","n3140","n3137"],tags:{building:"yes"}},w56:{id:"w56",nodes:["n285","n286","n287","n288","n285"],tags:{amenity:"parking"}},w560:{id:"w560",nodes:["n3091","n3092","n3093","n3094","n3091"],tags:{building:"yes"}},w561:{id:"w561",nodes:["n3155","n3157","n3158","n3159","n3156","n3155"],tags:{building:"yes"}},w562:{id:"w562",nodes:["n3057","n3058","n3059","n3060","n3057"],tags:{building:"yes"}},w563:{id:"w563",nodes:["n3107","n3108","n3109","n3110","n3111","n3112","n3107"],tags:{building:"yes"}},w564:{id:"w564",nodes:["n3134","n3135","n3136","n3131","n3134"],tags:{building:"yes"}},w565:{id:"w565",nodes:["n3143","n3144","n3145","n3146","n3143"],tags:{building:"yes"}},w566:{id:"w566",nodes:["n3095","n3096","n3097","n3098","n3095"],tags:{building:"yes"}},w567:{id:"w567",nodes:["n3130","n3131","n3136","n3132","n3133","n3130"],tags:{building:"yes"}},w568:{id:"w568",nodes:["n3025","n3026","n3027","n3028","n3029","n3030","n3031","n3033","n3032","n3025"],tags:{amenity:"parking"}},w569:{id:"w569",nodes:["n3061","n3062","n3063","n3064","n3061"],tags:{building:"yes"}},w57:{id:"w57",nodes:["n289","n290","n291","n292","n289"],tags:{amenity:"parking"}},w570:{id:"w570",nodes:["n3155","n3156","n3152","n3153","n3155"],tags:{building:"yes"}},w571:{id:"w571",nodes:["n3099","n3100","n3101","n3102","n3099"],tags:{building:"yes"}},w572:{id:"w572",nodes:["n3147","n3148","n3149","n3150","n3147"],tags:{building:"yes"}},w573:{id:"w573",nodes:["n3039","n2284"],tags:{highway:"service"}},w574:{id:"w574",nodes:["n3151","n3152","n3153","n3154","n3151"],tags:{building:"yes"}},w575:{id:"w575",nodes:["n3021","n3022","n3023","n3024","n3021"],tags:{amenity:"shelter",building:"yes",shelter_type:"picnic_shelter"}},w576:{id:"w576",nodes:["n3065","n3066","n3067","n3068","n3065"],tags:{building:"yes"}},w577:{id:"w577",nodes:["n2944","n3192","n3757","n3813","n3814","n3815","n3816","n3817","n3818","n3819"],tags:{highway:"service",name:"Willow Drive",service:"driveway",surface:"unpaved"}},w578:{id:"w578",nodes:["n2163","n2165","n2166","n2167","n2168","n2172","n2173","n2174","n2175","n2176","n2178","n2181","n2163"],tags:{building:"yes"}},w579:{id:"w579",nodes:["n2754","n3195","n3204","n3205","n4537","n4540","n3206","n4530","n4536","n3207","n4524","n3199","n4521","n3197","n1032"],tags:{highway:"residential",name:"Elm Street"}},w58:{id:"w58",nodes:["n240","n293","n294"],tags:{crossing:"marked",footway:"crossing",highway:"footway"}},w580:{id:"w580",nodes:["n2184","n2185","n2187","n2190","n2191","n2192","n2184"],tags:{building:"yes"}},w581:{id:"w581",nodes:["n2765","n3208","n3211","n2755","n3280","n2756","n3346"],tags:{highway:"residential",name:"Kelsey Street"}},w582:{id:"w582",nodes:["n2753","n3194","n3193","n3201","n3196","n4551","n3202","n4550","n3203","n3200","n3198","n1033"],tags:{highway:"residential",name:"Walnut Street"}},w583:{id:"w583",nodes:["n3272","n4469","n4588","n2879","n4564","n2872"],tags:{highway:"residential",name:"10th Avenue"}},w584:{id:"w584",nodes:["n3243","n3242","n3241","n3240","n3243"],tags:{building:"industrial"}},w585:{id:"w585",nodes:["n3273","n3274","n4631","n4593","n3275","n4592","n2846","n4611","n2847"],tags:{highway:"residential",name:"6th Avenue"}},w586:{id:"w586",nodes:["n3276","n4591","n2853","n4605","n2854"],tags:{highway:"residential",name:"8th Avenue"}},w587:{id:"w587",nodes:["n3269","n3268","n3267","n3266","n3265","n3264","n3263","n3262","n3269"],tags:{building:"industrial"}},w588:{id:"w588",nodes:["n3277","n4599","n2857","n4598","n4608","n2858"],tags:{highway:"residential",name:"7th Avenue"}},w589:{id:"w589",nodes:["n3239","n3238","n3271","n3270","n3237","n3236","n3235","n3234","n3239"],tags:{building:"yes"}},w59:{id:"w59",nodes:["n294","n295","n296","n297","n298","n299","n300","n301","n302","n303","n491","n304","n305","n306","n307"],tags:{footway:"sidewalk",highway:"footway"}},w590:{id:"w590",nodes:["n3278","n4458","n4589","n4604","n2861"],tags:{highway:"residential",name:"9th Avenue"}},w591:{id:"w591",nodes:["n3253","n3252","n3251","n3250","n3249","n3248","n3253"],tags:{building:"industrial"}},w592:{id:"w592",nodes:["n3229","n3228","n3227","n3226","n3225","n3224","n3223","n3222","n3221","n3220","n3219","n3218","n3217","n3216","n3215","n3214","n3213","n3212","n3229"],tags:{natural:"water",water:"pond"}},w593:{id:"w593",nodes:["n3261","n3260","n3259","n3258","n3257","n3256","n3255","n3254","n3261"],tags:{building:"industrial"}},w594:{id:"w594",nodes:["n3233","n3232","n3231","n3230","n3233"],tags:{building:"yes"}},w595:{id:"w595",nodes:["n3247","n3246","n3245","n3244","n3247"],tags:{building:"industrial"}},w596:{id:"w596",nodes:["n2769","n3195","n3193","n3209","n2758","n2759","n3279"],tags:{highway:"residential",name:"Armitage Street"}},w597:{id:"w597",nodes:["n2193","n2194","n2195","n2197","n2193"],tags:{building:"yes"}},w598:{id:"w598",nodes:["n3404","n3403","n3402","n3401","n3400","n3399","n3398","n3397","n3373","n3372","n3396","n3395","n3404"],tags:{building:"school"}},w6:{id:"w6",nodes:["n879","n880","n881","n882","n879"],tags:{building:"shed"}},w60:{id:"w60",nodes:["n239","n308","n307"],tags:{crossing:"marked",footway:"crossing",highway:"footway"}},w600:{id:"w600",nodes:["n3387","n3386","n3316","n3315","n3314","n3313","n3387"],tags:{building:"yes"}},w601:{id:"w601",nodes:["n3304","n3303","n3302","n3301","n3385","n3384","n3300","n3299","n3304"],tags:{building:"yes"}},w602:{id:"w602",nodes:["n3334","n3333","n3332","n3331","n3330","n3329","n3328","n3327","n3326","n3325","n3324","n3323","n3322","n3321","n3320","n3319","n3318","n3317","n3334"],tags:{building:"yes"}},w603:{id:"w603",nodes:["n3353","n3352","n3347","n3280","n2798"],tags:{highway:"service",service:"alley",surface:"unpaved"}},w604:{id:"w604",nodes:["n3753","n3211","n3383"],tags:{highway:"service",service:"alley"}},w605:{id:"w605",nodes:["n3290","n3289","n3288","n3287","n3286","n3285","n3284","n3283","n3282","n3281","n3290"],tags:{building:"yes"}},w606:{id:"w606",nodes:["n2198","n2199","n2201","n2202","n2203","n2206","n2198"],tags:{building:"yes"}},w607:{id:"w607",nodes:["n2198","n2207"],tags:{barrier:"wall"}},w608:{id:"w608",nodes:["n2751","n3208","n3210","n3209","n3415","n3410","n3414","n3413","n3412","n3416"],tags:{highway:"residential",name:"East Street"}},w609:{id:"w609",nodes:["n2772","n3346","n3746","n3748","n3747","n3345","n3378","n3279","n3411"],tags:{highway:"residential",name:"Maple Street"}},w61:{id:"w61",nodes:["n309","n310","n311","n312","n313","n240"],tags:{footway:"sidewalk",highway:"footway"}},w610:{id:"w610",nodes:["n3379","n3380","n3382","n3381","n3379"],tags:{leisure:"park",name:"LaFayette Park"}},w611:{id:"w611",nodes:["n2768","n3194","n3210","n3753","n2760","n3353","n2773","n3378"],tags:{highway:"residential",name:"Bennett Street"}},w612:{id:"w612",nodes:["n2751","n3383","n2749","n2798","n2772"],tags:{highway:"residential",name:"Market Street"}},w613:{id:"w613",nodes:["n3298","n3297","n3296","n3295","n3294","n3293","n3292","n3291","n3298"],tags:{building:"yes"}},w614:{id:"w614",nodes:["n3375","n3406","n3405","n3374","n3375"],tags:{leisure:"playground"}},w615:{id:"w615",nodes:["n3393","n3344","n3343","n3342","n3341","n3340","n3339","n3338","n3337","n3392","n3391","n3390","n3389","n3336","n3335","n3388","n3393"],tags:{building:"yes"}},w616:{id:"w616",nodes:["n3376","n3407","n3408","n3377","n3376"],tags:{amenity:"school",name:"Three Rivers Elementary School"}},w617:{id:"w617",nodes:["n3312","n3311","n3310","n3309","n3308","n3307","n3306","n3305","n3312"],tags:{building:"yes"}},w619:{id:"w619",nodes:["n2863","n3424","n3425","n3426","n3427","n3428","n3429","n3430","n3431","n3432","n3433","n2844"],tags:{highway:"secondary",name:"Michigan Avenue",ref:"M 60"}},w62:{id:"w62",nodes:["n876","n906","n904","n875","n874","n873","n872","n871","n870","n869","n41","n868","n146","n314","n315","n1956"],tags:{footway:"sidewalk",highway:"footway"}},w620:{id:"w620",nodes:["n2844","n3420","n3421","n3422","n3439","n2859","n3437","n3493","n3496","n3500","n3497"],tags:{highway:"residential"}},w621:{id:"w621",nodes:["n3468","n3469","n3470","n3471","n3468"],tags:{building:"yes"}},w622:{id:"w622",nodes:["n3417","n3436","n3438","n3491","n3488","n3492","n3495","n3494","n3498","n3487","n3499","n3490","n3489","n4800","n3417"],tags:{landuse:"cemetery",name:"Riverside Cemetery"}},w623:{id:"w623",nodes:["n3440","n3441","n3442","n3443","n3444","n3445","n3440"],tags:{building:"yes"}},w624:{id:"w624",nodes:["n3446","n3447","n3448","n3449","n3450","n3451","n3452","n3453","n3454","n3455","n3456","n3457","n3458","n3459","n3460","n3461","n3462","n3463","n3464","n3465","n3466","n3467","n3446"],tags:{building:"yes"}},w625:{id:"w625",nodes:["n2844","n3434","n3435","n2878","n3275","n4621","n3276","n3278","n4463","n3272","n3472","n3474","n3475","n3476","n3477","n3478","n1202","n3479","n3480","n3481","n1203","n3482","n3483","n3484","n3485","n4574","n3486","n3473"],tags:{highway:"secondary",name:"Jefferson Street",name_1:"State Highway 60",ref:"M 60"}},w626:{id:"w626",nodes:["n3439","n3423","n2863"],tags:{highway:"unclassified",name:"Michigan Avenue",name_1:"State Highway 60"}},w627:{id:"w627",nodes:["n3500","n3005"],tags:{highway:"service"}},w628:{id:"w628",nodes:["n3491","n3488","n3492","n3010","n3009","n3005","n3008","n3007","n3006","n3502","n3491"],tags:{leisure:"park",name:"Marina Park"}},w629:{id:"w629",nodes:["n2208","n2209","n2212","n2214","n2208"],tags:{building:"yes"}},w63:{id:"w63",nodes:["n1955","n316"],tags:{footway:"sidewalk",highway:"footway"}},w630:{id:"w630",nodes:["n2757","n3414","n3202","n4542","n3206","n4538","n3750","n3503","n1629","n4500","n2763","n4502","n2764","n3508"],tags:{highway:"residential",name:"Hoffman Street"}},w631:{id:"w631",nodes:["n2215","n2750","n2770","n2771","n2215"],tags:{building:"yes"}},w632:{id:"w632",nodes:["n2766","n3504","n3507","n3751","n3205","n3196","n3410","n2746"],tags:{highway:"residential",name:"Cushman Street"}},w633:{id:"w633",nodes:["n2745","n3749","n3507","n4535","n3503"],tags:{highway:"residential",name:"Pine Street"}},w634:{id:"w634",nodes:["n3510","n3511","n3512","n3509","n3510"],tags:{leisure:"park",name:"Bowman Park"}},w636:{id:"w636",nodes:["n2745","n3752","n3204","n3201","n3415","n2761","n2767","n3411"],tags:{highway:"residential",name:"Wheeler Street"}},w637:{id:"w637",nodes:["n3550","n4586","n4476","n3472"],tags:{highway:"residential",name:"11th Avenue"}},w638:{id:"w638",nodes:["n3508","n3518"],tags:{bridge:"yes",highway:"residential",name:"Hoffman Street"}},w639:{id:"w639",nodes:["n3518","n1204","n2862","n3519","n3520","n3521","n3522","n3523","n2161","n3524","n3549","n3552","n4239","n3551","n4577","n4582","n4578","n4583","n4579","n4574"],tags:{highway:"residential",name:"Hoffman Street"}},w64:{id:"w64",nodes:["n316","n317"],tags:{bridge:"yes",footway:"sidewalk",highway:"footway",layer:"1"}},w640:{id:"w640",nodes:["n3634","n3640","n3676","n3633","n3678","n3648","n3638","n3683","n3600","n3579","n3679","n3677","n2987","n3592","n3588","n3608","n3559","n3617","n3620","n3660","n3553","n3533","n3530","n3531","n3525","n3527","n3526","n3532","n3529","n3528","n3667","n3627","n3623","n3625","n3601","n3687","n3671","n3644","n3626","n3673","n3582","n3693","n3605","n3619","n3651","n3650","n3615","n3663","n3631","n3596","n3604","n3655","n3586","n3595","n3701","n3603","n3686","n3611","n3568","n3674","n3613","n3580","n3562","n3564","n3689","n3585","n3670","n3659","n3684","n3680","n3646","n3558","n3556","n3692","n3563","n3575","n3571","n3675","n3557","n3700","n3656","n3622","n3657","n3565","n3669","n3658","n3618","n3624","n3688","n3610","n3570","n3645","n3649","n3583","n3694","n3561","n3554","n3614","n3698","n3581","n3635","n3641","n3569","n3647","n3628","n3598","n3696","n3665","n3639","n3607","n3695","n3642","n3672","n3577","n3643","n3691","n3602","n3576","n3591","n3560","n3606","n3685","n3597","n3629","n3661","n3654","n3616","n3697","n3578","n3609","n3653","n3699","n3566","n3637","n3567","n3666","n3555","n3599","n3590","n3572","n3593","n3690","n3681","n3612","n3682","n3668","n3587","n3621","n3636","n3662","n3589","n3573","n3652","n3664","n3632","n3574","n3594","n3584","n3630","n3634"],tags:{name:"Hoffman Pond",natural:"water",water:"reservoir"}},w641:{id:"w641",nodes:["n2988","n3534","n3535","n3536","n3537","n3538","n3539","n3540","n3541","n3542","n3543","n3544","n3545","n3546","n3547","n3548","n2970"],tags:{waterway:"river"}},w642:{id:"w642",nodes:["n3702","n3703","n3704","n3705","n3706","n3707","n3708","n3709","n3710","n3711","n3712","n3713","n3714","n3715","n3716","n3717","n3718","n3719","n3720","n3721","n3722","n3723","n3724","n3725","n3726","n3727","n3728","n3729","n3730","n3731","n3732","n3733","n3734","n3735","n3736","n3737","n3738","n3739","n3740","n3741","n3742","n3743","n3702"],tags:{admin_level:"8",boundary:"administrative"}},w643:{id:"w643",nodes:["n2839","n2873"],tags:{highway:"service",service:"driveway"}},w644:{id:"w644",nodes:["n2873","n2840"],tags:{bridge:"yes",highway:"service",layer:"1",service:"driveway"}},w645:{id:"w645",nodes:["n2840","n2841","n2842","n2845","n2866"],tags:{highway:"service",service:"driveway",surface:"unpaved"}},w646:{id:"w646",nodes:["n2752","n3759","n1420","n1421","n1422","n3758","n4507","n4506","n4505","n4520","n3199","n4522","n4504","n4546","n3200","n4547","n3412"],tags:{highway:"residential",name:"Flower Street"}},w647:{id:"w647",nodes:["n2874","n2875","n2876","n2954","n2874"],tags:{building:"industrial"}},w648:{id:"w648",nodes:["n3778","n3779","n3780","n3781","n3782","n3783","n3778"],tags:{building:"yes"}},w649:{id:"w649",nodes:["n3197","n4543","n4544","n3198"],tags:{highway:"residential",name:"Morris Avenue",surface:"unpaved"}},w65:{id:"w65",nodes:["n317","n318","n319","n320","n321"],tags:{footway:"sidewalk",highway:"footway"}},w650:{id:"w650",nodes:["n3207","n4526","n4528","n4548","n3203","n4549","n3413","n2762"],tags:{highway:"residential",name:"Adams Street"}},w651:{id:"w651",nodes:["n3788","n3785","n3786","n3787","n3788"],tags:{power:"station"}},w652:{id:"w652",nodes:["n2957","n3163","n3241"],tags:{barrier:"wall"}},w653:{id:"w653",nodes:["n3549","n3802","n3803","n3800","n3801"],tags:{highway:"service",surface:"unpaved"}},w654:{id:"w654",nodes:["n3164","n3165","n3166","n3167","n3168","n3505","n3164"],tags:{building:"yes"}},w655:{id:"w655",nodes:["n3506","n3517","n3760","n3761","n3762","n3763","n3506"],tags:{building:"yes"}},w656:{id:"w656",nodes:["n3764","n3765","n3766","n3767","n3768","n3769","n3770","n3771","n3764"],tags:{building:"yes"}},w657:{id:"w657",nodes:["n3772","n3773","n3774","n3775","n3772"],tags:{building:"yes"}},w658:{id:"w658",nodes:["n3776","n3777","n3784","n3789","n3776"],tags:{building:"yes"}},w659:{id:"w659",nodes:["n3930","n3931","n3932","n3933","n3934","n3935","n3936","n3937","n3938","n3930"],tags:{leisure:"pitch",sport:"baseball"}},w66:{id:"w66",nodes:["n321","n322"],tags:{bridge:"yes",footway:"sidewalk",highway:"footway",layer:"1"}},w660:{id:"w660",nodes:["n3982","n3842","n3864","n3865","n2938","n3866","n2939","n3867","n3868","n3858","n2937","n3869","n2935","n2934","n3870","n3348","n3862"],tags:{highway:"service"}},w661:{id:"w661",nodes:["n3968","n3969"],tags:{highway:"footway"}},w662:{id:"w662",nodes:["n3875","n3876","n3877","n3878","n3879","n3880","n3881","n3882","n3875"],tags:{amenity:"parking"}},w663:{id:"w663",nodes:["n3964","n3965"],tags:{highway:"footway"}},w664:{id:"w664",nodes:["n3966","n3967"],tags:{highway:"footway"}},w665:{id:"w665",nodes:["n3857","n3890","n3884","n3894","n3889","n3899","n3885","n3886","n3896","n3887"],tags:{highway:"service",service:"parking_aisle"}},w666:{id:"w666",nodes:["n3895","n3896"],tags:{highway:"service",service:"parking_aisle"}},w667:{id:"w667",nodes:["n3274","n3977","n3984","n3983","n3981","n3844","n3978","n3982","n3861","n3862","n3873","n3874","n4468","n3863"],tags:{access:"private",highway:"service",name:"Collins Drive"}},w668:{id:"w668",nodes:["n3900","n3901","n3902","n3903","n3904","n3905","n3808","n3809","n3906","n3907","n3908","n3967","n3909","n3910","n3911","n3955","n3964","n3912","n3913","n3914","n3915","n3916","n3917","n3918","n3919","n3920","n3921","n3922","n3923","n3924","n3925","n3926","n3927","n3969","n3970","n3928","n3807","n3929","n3900"],tags:{building:"school"}},w669:{id:"w669",nodes:["n3272","n39","n40","n3974","n3863","n3857","n3892","n3883","n3891","n3889"],tags:{highway:"service"}},w67:{id:"w67",nodes:["n322","n886","n323","n475"],tags:{footway:"crossing",highway:"footway"}},w670:{id:"w670",nodes:["n3473","n3859","n3860","n3980","n4908","n4865"],tags:{highway:"secondary",name:"Hoffman Street",ref:"M 60"}},w671:{id:"w671",nodes:["n3970","n3806","n3971"],tags:{highway:"footway"}},w672:{id:"w672",nodes:["n3892","n3893","n3894"],tags:{highway:"service",service:"parking_aisle"}},w673:{id:"w673",nodes:["n3945","n3946","n3992","n3990","n3945"],tags:{leisure:"pitch",sport:"tennis"}},w674:{id:"w674",nodes:["n3890","n3893","n3891"],tags:{highway:"service",service:"parking_aisle"}},w675:{id:"w675",nodes:["n3947","n3948","n3994","n3993","n3947"],tags:{leisure:"pitch",sport:"tennis"}},w676:{id:"w676",nodes:["n3858","n3954","n3972","n3810","n3811","n3812","n3841","n3973","n3898","n3963","n3897","n3896"],tags:{highway:"service"}},w677:{id:"w677",nodes:["n3977","n3996","n3997","n4004","n3998","n3999","n4005","n4007","n4006","n3995","n4000","n3843","n4001","n4002","n4003","n3949","n3351","n3950","n3354","n3350","n3951","n3349","n3952","n3953","n3954","n3956","n3966","n3955"],tags:{highway:"footway"}},w678:{id:"w678",nodes:["n3887","n3888","n3895","n3899"],tags:{highway:"service",service:"parking_aisle"}},w679:{id:"w679",nodes:["n3946","n3947","n3993","n3992","n3946"],tags:{leisure:"pitch",sport:"tennis"}},w68:{id:"w68",nodes:["n294","n1952","n326"],tags:{footway:"sidewalk",highway:"footway"}},w680:{id:"w680",nodes:["n3939","n3940","n3941","n3985","n3986","n3987","n3988","n3989","n3942","n3943","n3939"],tags:{leisure:"pitch",sport:"baseball"}},w681:{id:"w681",nodes:["n3990","n3991","n3944","n3945","n3990"],tags:{leisure:"pitch",sport:"tennis"}},w682:{id:"w682",nodes:["n3871","n3872","n3873","n3874","n3871"],tags:{amenity:"parking"}},w683:{id:"w683",nodes:["n3956","n3965","n3957","n3958","n3959"],tags:{footway:"sidewalk",highway:"footway"}},w684:{id:"w684",nodes:["n3790","n3791","n3792","n3793","n3790"],tags:{building:"shed"}},w685:{id:"w685",nodes:["n3794","n3795","n3796","n3797","n3794"],tags:{building:"yes"}},w686:{id:"w686",nodes:["n3798","n3799","n3804","n3805","n3798"],tags:{building:"yes"}},w687:{id:"w687",nodes:["n3806","n3807"],tags:{highway:"footway"}},w688:{id:"w688",nodes:["n3845","n3846","n3847","n3848","n3845"],tags:{leisure:"pitch",sport:"american_football"}},w689:{id:"w689",nodes:["n3849","n4021","n3850","n3851","n3852","n3853","n3854","n3855","n3856","n3975","n3976","n3979","n4008","n4009","n4010","n4011","n4012","n4013","n4014","n4015","n4016","n4017","n4018","n4019","n4020","n4021"],tags:{leisure:"track",sport:"running",highway:"footway"}},w69:{id:"w69",nodes:["n326","n327"],tags:{bridge:"yes",footway:"sidewalk",highway:"footway",layer:"1"}},w690:{id:"w690",nodes:["n4022","n4023","n4024","n4025","n4026","n4027","n4022"],tags:{building:"yes"}},w691:{id:"w691",nodes:["n4028","n4029","n4030","n4031","n4028"],tags:{building:"yes"}},w692:{id:"w692",nodes:["n4032","n4033","n4034","n4035","n4032"],tags:{building:"yes"}},w693:{id:"w693",nodes:["n4036","n4037","n4038","n4039","n4036"],tags:{building:"yes"}},w694:{id:"w694",nodes:["n4040","n4041","n4042","n4043","n4040"],tags:{building:"yes"}},w695:{id:"w695",nodes:["n4044","n4045","n4050","n4053","n4046","n4047","n4048","n4049","n4044"],tags:{building:"yes"}},w696:{id:"w696",nodes:["n4050","n4051","n4052","n4053","n4050"],tags:{building:"roof"}},w697:{id:"w697",nodes:["n4054","n4068","n4055","n4056","n4057","n4054"],tags:{building:"yes"}},w698:{id:"w698",nodes:["n4058","n4059","n4060","n4061","n4062","n4063","n4058"],tags:{building:"yes"}},w699:{id:"w699",nodes:["n4064","n4066","n4065"],tags:{barrier:"fence"}},w7:{id:"w7",nodes:["n43","n44","n45"],tags:{highway:"service"}},w70:{id:"w70",nodes:["n327","n328","n27","n329"],tags:{footway:"sidewalk",highway:"footway"}},w700:{id:"w700",nodes:["n4066","n4067","n4068"],tags:{barrier:"fence"}},w701:{id:"w701",nodes:["n4069","n4070","n4071","n4072","n4069"],tags:{building:"shed"}},w702:{id:"w702",nodes:["n4073","n4074","n4075","n4076","n4077","n4078","n4079","n4080","n4081","n4082","n4083","n4084","n4073"],tags:{building:"yes"}},w703:{id:"w703",nodes:["n4085","n4093","n4086","n4087","n4088","n4089","n4090","n4091","n4092","n4085"],tags:{building:"yes"}},w704:{id:"w704",nodes:["n4093","n4094","n4095","n4096"],tags:{barrier:"fence"}},w705:{id:"w705",nodes:["n4097","n4098","n4099","n4100","n4097"],tags:{building:"yes"}},w706:{id:"w706",nodes:["n4098","n4102","n4087"],tags:{barrier:"fence"}},w707:{id:"w707",nodes:["n4101","n4102","n4096","n4170","n4103"],tags:{barrier:"fence"}},w708:{id:"w708",nodes:["n4104","n4105","n4106","n4107","n4104"],tags:{access:"private",leisure:"swimming_pool"}},w709:{id:"w709",nodes:["n4108","n4109","n4110","n4111","n4108"],tags:{building:"yes"}},w71:{id:"w71",nodes:["n329","n331"],tags:{bridge:"yes",footway:"sidewalk",highway:"footway",layer:"1"}},w710:{id:"w710",nodes:["n4112","n4113","n4114","n4115","n4116","n4117","n4118","n4119","n4112"],tags:{building:"yes"}},w711:{id:"w711",nodes:["n4120","n4121","n4122","n4123","n4120"],tags:{building:"yes"}},w712:{id:"w712",nodes:["n4124","n4125","n4126","n4127","n4128","n4129","n4124"],tags:{building:"yes"}},w713:{id:"w713",nodes:["n4130","n4131","n4132","n4133","n4130"],tags:{building:"shed"}},w714:{id:"w714",nodes:["n4134","n4135","n4136","n4137","n4138","n4139","n4140","n4141","n4142","n4143","n4134"],tags:{building:"yes"}},w715:{id:"w715",nodes:["n4144","n4145","n4146","n4147","n4148","n4149","n4144"],tags:{building:"yes"}},w716:{id:"w716",nodes:["n4150","n4151","n4152","n4153","n4150"],tags:{building:"yes"}},w717:{id:"w717",nodes:["n4154","n4155","n4156","n4157","n4154"],tags:{building:"yes"}},w718:{id:"w718",nodes:["n4158","n4159","n4160","n4161","n4162","n4163","n4164","n4165","n4158"],tags:{building:"yes"}},w719:{id:"w719",nodes:["n4166","n4167","n4168","n4169","n4166"],tags:{building:"yes"}},w72:{id:"w72",nodes:["n331","n344","n332","n333","n334"],tags:{footway:"sidewalk",highway:"footway"}},w720:{id:"w720",nodes:["n4170","n4171"],tags:{barrier:"fence"}},w721:{id:"w721",nodes:["n4138","n4103"],tags:{barrier:"fence"}},w722:{id:"w722",nodes:["n4103","n4172"],tags:{barrier:"fence"}},w723:{id:"w723",nodes:["n4173","n4174"],tags:{barrier:"fence"}},w724:{id:"w724",nodes:["n4175","n4176","n4177","n4178","n4175"],tags:{building:"yes"}},w725:{id:"w725",nodes:["n4179","n4180","n4181","n4182","n4183","n4184","n4179"],tags:{building:"yes"}},w726:{id:"w726",nodes:["n4185","n4186","n4187","n4188","n4185"],tags:{building:"yes"}},w727:{id:"w727",nodes:["n4189","n4190","n4191","n4192","n4193","n4194","n4195","n4196","n4197","n4198","n4199","n4200","n4201","n4202","n4189"],tags:{building:"yes"}},w728:{id:"w728",nodes:["n4203","n4204","n4205","n4206","n4207","n4208","n4209","n4210","n4203"],tags:{building:"yes"}},w729:{id:"w729",nodes:["n4211","n4212","n4213","n4214","n4211"],tags:{building:"shed"}},w73:{id:"w73",nodes:["n335","n336","n337","n338","n339","n340","n341","n342","n335"],tags:{building:"yes"}},w730:{id:"w730",nodes:["n4215","n4216","n4217","n4218","n4215"],tags:{building:"yes"}},w731:{id:"w731",nodes:["n4219","n4220","n4221","n4222","n4223","n4224","n4225","n4226","n4227","n4228","n4229","n4230","n4219"],tags:{building:"yes"}},w732:{id:"w732",nodes:["n4231","n4232","n4233","n4234","n4235","n4236","n4237","n4238","n4231"],tags:{building:"yes"}},w733:{id:"w733",nodes:["n4239","n4240","n4241","n4242","n4243","n4244","n4245","n4246","n4247","n4248","n4241"],tags:{highway:"service"}},w734:{id:"w734",nodes:["n4240","n4249","n4248"],tags:{highway:"service",service:"parking_aisle"}},w735:{id:"w735",nodes:["n4250","n4251","n4252","n4253","n4254","n4255","n4256","n4257","n4258","n4250"],tags:{amenity:"parking"}},w736:{id:"w736",nodes:["n4259","n4260","n4261","n4262","n4259"],tags:{building:"yes"}},w737:{id:"w737",nodes:["n4263","n4264","n4265","n4266","n4267","n4268","n4269","n4270","n4271","n4272","n4273","n4274","n4275","n4276","n4263"],tags:{building:"yes"}},w738:{id:"w738",nodes:["n4277","n4278","n4279","n4280","n4281","n4282","n4277"],tags:{building:"yes"}},w739:{id:"w739",nodes:["n4283","n4284","n4285","n4286","n4287","n4288","n4289","n4290","n4291","n4292","n4293","n4294","n4283"],tags:{building:"yes"}},w74:{id:"w74",nodes:["n343","n344","n345"],tags:{highway:"service"}},w740:{id:"w740",nodes:["n4295","n4296","n4297","n4298","n4295"],tags:{building:"yes"}},w741:{id:"w741",nodes:["n4299","n4300","n4301","n4302","n4303","n4304","n4305","n4306","n4307","n4308","n4309","n4310","n4299"],tags:{building:"yes"}},w742:{id:"w742",nodes:["n4311","n4312","n4313","n4314","n4311"],tags:{building:"shed"}},w743:{id:"w743",nodes:["n4315","n4316","n4317","n4318","n4319","n4320","n4315"],tags:{building:"yes"}},w744:{id:"w744",nodes:["n4321","n4322","n4323","n4324","n4325","n4326","n4327","n4328","n4329","n4330","n4331","n4332","n4333","n4334","n4321"],tags:{building:"yes"}},w745:{id:"w745",nodes:["n4335","n4336","n4337","n4338","n4335"],tags:{building:"shed"}},w746:{id:"w746",nodes:["n4339","n4340","n4341","n4342","n4343","n4344","n4339"],tags:{building:"yes"}},w747:{id:"w747",nodes:["n4345","n4346","n4347","n4348","n4345"],tags:{building:"yes"}},w748:{id:"w748",nodes:["n4349","n4350","n4351","n4352","n4349"],tags:{building:"yes"}},w749:{id:"w749",nodes:["n4353","n4354","n4355","n4356","n4357","n4358","n4353"],tags:{building:"yes"}},w75:{id:"w75",nodes:["n346","n347","n348","n349","n350","n351","n346"],tags:{amenity:"parking"}},w750:{id:"w750",nodes:["n4612","n4359","n4360"],tags:{barrier:"fence"}},w751:{id:"w751",nodes:["n4361","n4362","n4363","n4364","n4361"],tags:{building:"yes"}},w752:{id:"w752",nodes:["n4365","n4366","n4367","n4368","n4365"],tags:{building:"yes"}},w753:{id:"w753",nodes:["n4369","n4370","n4371","n4372","n4375","n4369"],tags:{building:"yes"}},w754:{id:"w754",nodes:["n4373","n4374","n4375"],tags:{barrier:"fence"}},w755:{id:"w755",nodes:["n4376","n4377","n4378","n4379","n4376"],tags:{building:"shed"}},w756:{id:"w756",nodes:["n4380","n4381","n4382","n4383","n4384","n4385","n4386","n4387","n4388","n4389","n4390","n4391","n4380"],tags:{building:"yes"}},w757:{id:"w757",nodes:["n4392","n4393","n4394","n4395","n4392"],tags:{building:"yes"}},w758:{id:"w758",nodes:["n4396","n4397","n4398","n4399","n4396"],tags:{building:"shed"}},w759:{id:"w759",nodes:["n4400","n4401","n4402","n4403","n4404","n4405","n4406","n4407","n4408","n4409","n4410","n4411","n4412","n4413","n4414","n4415","n4400"],tags:{building:"yes"}},w76:{id:"w76",nodes:["n2561","n359","n2563","n2793","n357","n356","n2792","n355","n354","n2791","n2562","n353","n352","n358","n2561"],tags:{highway:"service",oneway:"yes",service:"parking_aisle"}},w760:{id:"w760",nodes:["n4416","n4417"],tags:{barrier:"fence"}},w761:{id:"w761",nodes:["n4418","n4416","n4419"],tags:{barrier:"fence"}},w762:{id:"w762",nodes:["n4420","n4421"],tags:{barrier:"fence"}},w763:{id:"w763",nodes:["n4422","n4423","n4424","n4425","n4426","n4427","n4428","n4429","n4430","n4431","n4432","n4433","n4422"],tags:{building:"yes"}},w764:{id:"w764",nodes:["n4434","n4435","n4436","n4437","n4438","n4439","n4440","n4441","n4442","n4445","n4444","n4443","n4434"],tags:{building:"yes"}},w765:{id:"w765",nodes:["n4446","n4447","n4448","n4449","n4446"],tags:{building:"yes"}},w766:{id:"w766",nodes:["n4450","n4451","n4452","n4453","n4450"],tags:{building:"yes"}},w767:{id:"w767",nodes:["n4454","n4455","n4456","n4457","n4454"],tags:{building:"yes"}},w768:{id:"w768",nodes:["n4461","n4458","n4460"],tags:{footway:"crossing",highway:"footway"}},w769:{id:"w769",nodes:["n4460","n4462","n4459"],tags:{footway:"sidewalk",highway:"footway"}},w77:{id:"w77",nodes:["n325","n360","n361"],tags:{footway:"crossing",highway:"footway"}},w770:{id:"w770",nodes:["n4462","n4463","n4464"],tags:{crossing:"marked",footway:"crossing",highway:"footway"}},w771:{id:"w771",nodes:["n4464","n4465","n4466","n4467"],tags:{footway:"sidewalk",highway:"footway"}},w772:{id:"w772",nodes:["n3959","n3968","n3971","n3960","n3961","n3962","n3963"],tags:{footway:"sidewalk",highway:"footway"}},w773:{id:"w773",nodes:["n4467","n4468","n3959"],tags:{footway:"crossing",highway:"footway"}},w774:{id:"w774",nodes:["n4459","n4469","n4470"],tags:{footway:"crossing",highway:"footway"}},w775:{id:"w775",nodes:["n4470","n4471","n4472","n4473","n4474","n4475"],tags:{footway:"sidewalk",highway:"footway"}},w776:{id:"w776",nodes:["n4475","n4476","n4477"],tags:{footway:"crossing",highway:"footway"}},w777:{id:"w777",nodes:["n4477","n4478","n4479","n4480","n4481","n4482","n4483","n4484","n4485","n4486","n4487"],tags:{footway:"sidewalk",highway:"footway"}},w778:{id:"w778",nodes:["n4488","n4489","n4490","n4491","n4488"],tags:{building:"yes"}},w779:{id:"w779",nodes:["n4492","n4493","n4494","n4495","n4492"],tags:{building:"yes"}},w78:{id:"w78",nodes:["n361","n362","n369"],tags:{footway:"sidewalk",highway:"footway"}},w780:{id:"w780",nodes:["n4496","n4497","n4498","n4499","n4496"],tags:{access:"private",leisure:"swimming_pool"}},w781:{id:"w781",nodes:["n4508","n4509"],tags:{footway:"sidewalk",highway:"footway"}},w782:{id:"w782",nodes:["n4510","n4511"],tags:{footway:"sidewalk",highway:"footway"}},w783:{id:"w783",nodes:["n4512","n4513"],tags:{footway:"sidewalk",highway:"footway"}},w784:{id:"w784",nodes:["n4513","n4514"],tags:{footway:"sidewalk",highway:"footway"}},w785:{id:"w785",nodes:["n4515","n4516"],tags:{footway:"sidewalk",highway:"footway"}},w786:{id:"w786",nodes:["n4517","n4515"],tags:{footway:"sidewalk",highway:"footway"}},w787:{id:"w787",nodes:["n4518","n4519"],tags:{footway:"sidewalk",highway:"footway"}},w788:{id:"w788",nodes:["n4519","n4520","n4513"],tags:{footway:"crossing",highway:"footway"}},w789:{id:"w789",nodes:["n4515","n4521","n4513"],tags:{footway:"crossing",highway:"footway"}},w79:{id:"w79",nodes:["n362","n363","n334"],tags:{crossing:"marked",footway:"crossing",highway:"footway"}},w790:{id:"w790",nodes:["n4515","n4522","n4523"],tags:{footway:"crossing",highway:"footway"}},w791:{id:"w791",nodes:["n4523","n4524","n4519"],tags:{footway:"crossing",highway:"footway"}},w792:{id:"w792",nodes:["n4523","n4525"],tags:{footway:"sidewalk",highway:"footway"}},w793:{id:"w793",nodes:["n4525","n4526","n4527"],tags:{footway:"crossing",highway:"footway"}},w794:{id:"w794",nodes:["n4527","n4529"],tags:{footway:"sidewalk",highway:"footway"}},w795:{id:"w795",nodes:["n4529","n4530","n4518"],tags:{footway:"crossing",highway:"footway"}},w796:{id:"w796",nodes:["n4518","n4531"],tags:{footway:"sidewalk",highway:"footway"}},w797:{id:"w797",nodes:["n4531","n4532"],tags:{footway:"sidewalk",highway:"footway"}},w798:{id:"w798",nodes:["n4533","n4534"],tags:{footway:"sidewalk",highway:"footway"}},w799:{id:"w799",nodes:["n4518","n4538","n4539"],tags:{footway:"crossing",highway:"footway"}},w8:{id:"w8",nodes:["n46","n47","n145","n48","n49","n46"],tags:{amenity:"parking"}},w80:{id:"w80",nodes:["n334","n364","n365"],tags:{crossing:"marked",footway:"crossing",highway:"footway"}},w800:{id:"w800",nodes:["n4539","n4540","n4541"],tags:{footway:"crossing",highway:"footway"}},w801:{id:"w801",nodes:["n4541","n4542","n4529"],tags:{footway:"crossing",highway:"footway"}},w802:{id:"w802",nodes:["n4552","n4553"],tags:{footway:"sidewalk",highway:"footway"}},w803:{id:"w803",nodes:["n4554","n4555","n4556","n4557","n4558","n4559","n4554"],tags:{building:"yes"}},w804:{id:"w804",nodes:["n4562","n4563"],tags:{barrier:"retaining_wall"}},w805:{id:"w805",nodes:["n4568","n4569","n4570","n4571","n4568"],tags:{building:"yes"}},w806:{id:"w806",nodes:["n3473","n4575","n4576","n4581","n4580","n3551"],tags:{highway:"residential",oneway:"yes"}},w807:{id:"w807",nodes:["n4613","n4614","n4615","n4616","n4617","n4618","n4619","n4620","n4613"],tags:{leisure:"pitch",sport:"baseball"}},w808:{id:"w808",nodes:["n4621","n4622","n4623","n4624","n4625","n4626","n4627","n4628","n4629","n4630"],tags:{highway:"service"}},w809:{id:"w809",nodes:["n4631","n4632","n4633","n4637","n4634","n4638","n4635","n4636"],tags:{highway:"service"}},w81:{id:"w81",nodes:["n365","n366","n367"],tags:{crossing:"marked",footway:"crossing",highway:"footway"}},w810:{id:"w810",nodes:["n4639","n4640","n4641"],tags:{barrier:"fence"}},w811:{id:"w811",nodes:["n4649","n4650","n4651","n4652","n4649"],tags:{building:"yes"}},w812:{id:"w812",nodes:["n4654","n4655"],tags:{barrier:"fence"}},w813:{id:"w813",nodes:["n4656","n4657"],tags:{barrier:"fence"}},w814:{id:"w814",nodes:["n4669","n4670","n4671","n4672","n4669"],tags:{amenity:"shelter",building:"yes",shelter_type:"picnic_shelter"}},w815:{id:"w815",nodes:["n4678","n4679","n4680","n1889"],tags:{highway:"service"}},w816:{id:"w816",nodes:["n239","n4686","n4687"],tags:{crossing:"marked",footway:"crossing",highway:"footway"}},w817:{id:"w817",nodes:["n4687","n4688","n4689"],tags:{crossing:"marked",footway:"crossing",highway:"footway"}},w818:{id:"w818",nodes:["n4689","n4690","n307"],tags:{crossing:"marked",footway:"crossing",highway:"footway"}},w819:{id:"w819",nodes:["n2266","n4743"],tags:{highway:"path"}},w82:{id:"w82",nodes:["n724","n368","n369"],tags:{crossing:"marked",footway:"crossing",highway:"footway"}},w820:{id:"w820",nodes:["n4785","n4786","n4787","n4788","n1684","n4760","n4769","n4761","n4762","n4763","n4764","n4765","n4766","n4767","n4768","n4785"],tags:{natural:"wood"}},w821:{id:"w821",nodes:["n4769","n4770","n4771","n4772","n4773","n4774","n4775","n4776","n4777","n4778","n4779","n4780","n4781","n4782","n4783","n4784","n4785","n4768","n4767","n4766","n4765","n4764","n4763","n4762","n4761","n4769"],tags:{natural:"scrub"}},w822:{id:"w822",nodes:["n4772","n4789","n4790","n4791","n4792","n4793","n4794","n4795","n4796","n4797","n4798","n4799","n4783","n4782","n4781","n4780","n4779","n4778","n4777","n4776","n4775","n4774","n4773","n4772"],tags:{natural:"wood"}},w823:{id:"w823",nodes:["n4800","n4801","n4802","n4803","n4804","n4805","n4806","n4807","n4808","n4809","n4810","n4811","n4812","n4813","n4814","n4815","n4816","n3490","n3489","n4800"],tags:{natural:"wood"}},w824:{id:"w824",nodes:["n4817","n4818","n4819","n4820","n4821","n4822","n4817"],tags:{landuse:"recreation_ground"}},w825:{id:"w825",nodes:["n4563","n4823","n4824","n4829","n4825","n4826","n4827","n4828","n4562","n4563"],tags:{landuse:"recreation_ground"}},w826:{id:"w826",nodes:["n4830","n4831","n4832","n4833","n4834","n4835","n4836","n4830"],tags:{landuse:"industrial"}},w827:{id:"w827",nodes:["n4563","n4837","n4838","n4839","n4840","n4841","n4842","n4827","n4828","n4562","n4563"],tags:{landuse:"industrial"}},w828:{id:"w828",nodes:["n4843","n4844","n4845","n4846","n4843"],tags:{landuse:"farmland"}},w829:{id:"w829",nodes:["n3712","n4847","n4848","n4849","n4850","n4851","n4852","n4858","n4864","n4959","n4960","n4853","n4857","n4854","n4855","n4856","n3712"],tags:{aeroway:"aerodrome",name:"Three Rivers Municipal Airport"}},w83:{id:"w83",nodes:["n371","n372","n373","n374","n371"],tags:{building:"yes"}},w830:{id:"w830",nodes:["n4855","n4854","n4857","n4853","n4960"],tags:{barrier:"fence"}},w831:{id:"w831",nodes:["n4860","n4859","n4858","n4852","n4851"],tags:{barrier:"fence"}},w832:{id:"w832",nodes:["n4866","n4878","n4869","n4867"],tags:{aeroway:"runway",ref:"5/23"}},w833:{id:"w833",nodes:["n4868","n4890","n4894","n4881","n4869","n4905","n4870"],tags:{aeroway:"runway",ref:"9/27"}},w834:{id:"w834",nodes:["n4871","n4875","n4872","n4895","n4873","n4874","n4871"],tags:{aeroway:"apron"}},w835:{id:"w835",nodes:["n4875","n4876","n4877","n4878","n4879","n4880","n4882","n4881"],tags:{aeroway:"taxiway"}},w836:{id:"w836",nodes:["n4882","n4893","n4883","n4891","n4884","n4885","n4886","n4887","n4888","n4892","n4889","n4890"],tags:{aeroway:"taxiway"}},w837:{id:"w837",nodes:["n4893","n4894"],tags:{aeroway:"taxiway"}},w838:{id:"w838",nodes:["n4895","n4896","n4897","n4898","n4899","n4900","n4901","n4902","n4903","n4906","n4904","n4905"],tags:{aeroway:"taxiway"}},w839:{id:"w839",nodes:["n4907","n4908"],tags:{highway:"service"}},w84:{id:"w84",nodes:["n374","n375","n376","n377","n373","n374"],tags:{building:"yes"}},w840:{id:"w840",nodes:["n4909","n4907","n4910"],tags:{highway:"service"}},w841:{id:"w841",nodes:["n4911","n4912","n4913","n4914","n4911"],tags:{building:"yes"}},w842:{id:"w842",nodes:["n4915","n4916","n4917","n4918","n4915"],tags:{aeroway:"hangar",building:"yes"}},w843:{id:"w843",nodes:["n4919","n4920","n4921","n4922","n4919"],tags:{building:"yes"}},w844:{id:"w844",nodes:["n4923","n4924","n4925","n4926","n4923"],tags:{aeroway:"hangar",building:"yes"}},w845:{id:"w845",nodes:["n4927","n4928","n4929","n4930","n4927"],tags:{aeroway:"hangar",building:"yes"}},w846:{id:"w846",nodes:["n4931","n4932","n4933","n4934","n4931"],tags:{aeroway:"hangar",building:"yes"}},w847:{id:"w847",nodes:["n4935","n4936","n4937","n4938","n4935"],tags:{aeroway:"hangar",building:"yes"}},w848:{id:"w848",nodes:["n4939","n4940","n4941","n4942","n4939"],tags:{aeroway:"hangar",building:"yes"}},w849:{id:"w849",nodes:["n4943","n4944","n4945","n4946","n4943"],tags:{aeroway:"hangar",building:"yes"}},w85:{id:"w85",nodes:["n431","n432","n1038","n433","n434","n1040","n431"],tags:{building:"yes"}},w850:{id:"w850",nodes:["n4947","n4948","n4949","n4950","n4947"],tags:{aeroway:"hangar",building:"yes"}},w851:{id:"w851",nodes:["n4951","n4952","n4953","n4954","n4951"],tags:{aeroway:"hangar",building:"yes"}},w852:{id:"w852",nodes:["n4955","n4956","n4957","n4958","n4955"],tags:{aeroway:"hangar",building:"yes"}},w853:{id:"w853",nodes:["n4959","n4864","n4861","n4862","n4863"],tags:{barrier:"fence"}},w854:{id:"w854",nodes:["n4961","n4962","n4963","n4964","n4965","n4966","n4967","n4968","n4969","n4961"],tags:{landuse:"farmland"}},w855:{id:"w855",nodes:["n4970","n4971","n4972","n4973","n4974","n4975","n4976","n4977","n4978","n4980","n4970"],tags:{landuse:"farmland"}},w856:{id:"w856",nodes:["n4979","n4980","n4978","n4981","n4982","n4983","n4984","n4985","n4979"],tags:{natural:"scrub"}},w857:{id:"w857",nodes:["n4986","n4987","n4988","n5032","n4989","n4990","n4991","n4992","n4993","n4994","n4995","n4996","n4997","n4998","n4999","n5000","n5001","n5002","n5022","n5023","n5024","n5025","n5030","n5031","n5029","n5028","n5027","n5026","n4986"],tags:{landuse:"farmland"}},w858:{id:"w858",nodes:["n5001","n5003","n5004","n4999","n5000","n5001"],tags:{natural:"scrub"}},w859:{id:"w859",nodes:["n5005","n5006","n5007","n5008","n5009","n5010","n5021","n5020","n5019","n5011","n5012","n5013","n5018","n5014","n5015","n5017","n5016","n5005"],tags:{landuse:"farmland"}},w86:{id:"w86",nodes:["n384","n385","n386","n387","n384"],tags:{building:"yes"}},w860:{id:"w860",nodes:["n3020","n5033","n5034","n5035","n3179","n3180","n3191","n3181","n3190","n3182","n3183","n3184","n3185","n3186","n3187","n3188","n3189","n3160","n3161","n3162","n2126","n2153","n2288","n3020"],tags:{landuse:"industrial"}},w87:{id:"w87",nodes:["n387","n388","n389","n386","n387"],tags:{building:"yes"}},w88:{id:"w88",nodes:["n390","n391","n392","n393","n390"],tags:{building:"yes"}},w89:{id:"w89",nodes:["n394","n2895"],tags:{highway:"service"}},w9:{id:"w9",nodes:["n50","n51","n148","n52","n57","n891","n53","n50"],tags:{building:"yes"}},w90:{id:"w90",nodes:["n398","n399","n400","n401","n402","n403","n404","n405","n406","n407","n408","n409","n410","n411","n412","n413","n414","n415","n416","n417","n398"],tags:{building:"yes"}},w91:{id:"w91",nodes:["n418","n423","n419"],tags:{highway:"service"}},w92:{id:"w92",nodes:["n420","n421","n422","n423","n420"],tags:{amenity:"parking"}},w93:{id:"w93",nodes:["n2282","n1876"],tags:{name:"Rocky River",tunnel:"building_passage",waterway:"river"}},w94:{id:"w94",nodes:["n1876","n885","n1875","n2234"],tags:{name:"Rocky River",waterway:"river"}},w95:{id:"w95",nodes:["n425","n426","n427","n914","n428","n913","n425"],tags:{building:"yes"}},w96:{id:"w96",nodes:["n456","n620","n1034","n1035","n456"],tags:{building:"yes"}},w97:{id:"w97",nodes:["n435","n912","n451","n321"],tags:{highway:"footway"}},w98:{id:"w98",nodes:["n436","n319","n437","n438","n439","n440","n441","n476","n442"],tags:{highway:"service"}},w99:{id:"w99",nodes:["n443","n444","n445","n446","n447","n448","n449","n450","n443"],tags:{amenity:"parking"}},n2934:{id:"n2934",loc:[-85.617051,41.952263]},n2935:{id:"n2935",loc:[-85.61699,41.952276]},n2937:{id:"n2937",loc:[-85.616847,41.952262]},n2938:{id:"n2938",loc:[-85.616577,41.951956]},n2939:{id:"n2939",loc:[-85.61656,41.952044]},n3348:{id:"n3348",loc:[-85.61714,41.9522]},n3349:{id:"n3349",loc:[-85.616517,41.95212]},n3350:{id:"n3350",loc:[-85.616489,41.952033]},n3351:{id:"n3351",loc:[-85.616529,41.951907]},n3354:{id:"n3354",loc:[-85.616488,41.951994]},w599:{tags:{footway:"sidewalk",highway:"footway"},id:"w599",nodes:["n1021","n1022","n731","n728","n1023","n1025","n1024","n1019"]},w618:{tags:{footway:"sidewalk",highway:"footway"},id:"w618",nodes:["n1020","n1021"]},n3355:{id:"n3355",loc:[-85.634489,41.946193]}};
82086
82087         // Tooltips and svg mask used to highlight certain features
82088         function uiCurtain() {
82089
82090             var surface = d3_select(null),
82091                 tooltip = d3_select(null),
82092                 darkness = d3_select(null);
82093
82094             function curtain(selection) {
82095                 surface = selection
82096                     .append('svg')
82097                     .attr('id', 'curtain')
82098                     .style('z-index', 1000)
82099                     .style('pointer-events', 'none')
82100                     .style('position', 'absolute')
82101                     .style('top', 0)
82102                     .style('left', 0);
82103
82104                 darkness = surface.append('path')
82105                     .attr('x', 0)
82106                     .attr('y', 0)
82107                     .attr('class', 'curtain-darkness');
82108
82109                 d3_select(window).on('resize.curtain', resize);
82110
82111                 tooltip = selection.append('div')
82112                     .attr('class', 'tooltip')
82113                     .style('z-index', 1002);
82114
82115                 tooltip
82116                     .append('div')
82117                     .attr('class', 'tooltip-arrow');
82118
82119                 tooltip
82120                     .append('div')
82121                     .attr('class', 'tooltip-inner');
82122
82123                 resize();
82124
82125
82126                 function resize() {
82127                     surface
82128                         .attr('width', window.innerWidth)
82129                         .attr('height', window.innerHeight);
82130                     curtain.cut(darkness.datum());
82131                 }
82132             }
82133
82134
82135             /**
82136              * Reveal cuts the curtain to highlight the given box,
82137              * and shows a tooltip with instructions next to the box.
82138              *
82139              * @param  {String|ClientRect} [box]   box used to cut the curtain
82140              * @param  {String}    [text]          text for a tooltip
82141              * @param  {Object}    [options]
82142              * @param  {string}    [options.tooltipClass]    optional class to add to the tooltip
82143              * @param  {integer}   [options.duration]        transition time in milliseconds
82144              * @param  {string}    [options.buttonText]      if set, create a button with this text label
82145              * @param  {function}  [options.buttonCallback]  if set, the callback for the button
82146              * @param  {String|ClientRect} [options.tooltipBox]  box for tooltip position, if different from box for the curtain
82147              */
82148             curtain.reveal = function(box, text, options) {
82149                 if (typeof box === 'string') {
82150                     box = d3_select(box).node();
82151                 }
82152                 if (box && box.getBoundingClientRect) {
82153                     box = copyBox(box.getBoundingClientRect());
82154                 }
82155
82156                 options = options || {};
82157
82158                 var tooltipBox;
82159                 if (options.tooltipBox) {
82160                     tooltipBox = options.tooltipBox;
82161                     if (typeof tooltipBox === 'string') {
82162                         tooltipBox = d3_select(tooltipBox).node();
82163                     }
82164                     if (tooltipBox && tooltipBox.getBoundingClientRect) {
82165                         tooltipBox = copyBox(tooltipBox.getBoundingClientRect());
82166                     }
82167                 } else {
82168                     tooltipBox = box;
82169                 }
82170
82171                 if (tooltipBox && text) {
82172                     // pseudo markdown bold text for the instruction section..
82173                     var parts = text.split('**');
82174                     var html = parts[0] ? '<span>' + parts[0] + '</span>' : '';
82175                     if (parts[1]) {
82176                         html += '<span class="instruction">' + parts[1] + '</span>';
82177                     }
82178
82179                     html = html.replace(/\*(.*?)\*/g, '<em>$1</em>');   // emphasis
82180                     html = html.replace(/\{br\}/g, '<br/><br/>');       // linebreak
82181
82182                     if (options.buttonText && options.buttonCallback) {
82183                         html += '<div class="button-section">' +
82184                             '<button href="#" class="button action">' + options.buttonText + '</button></div>';
82185                     }
82186
82187                     var classes = 'curtain-tooltip tooltip in ' + (options.tooltipClass || '');
82188                     tooltip
82189                         .classed(classes, true)
82190                         .selectAll('.tooltip-inner')
82191                         .html(html);
82192
82193                     if (options.buttonText && options.buttonCallback) {
82194                         var button = tooltip.selectAll('.button-section .button.action');
82195                         button
82196                             .on('click', function() {
82197                                 event.preventDefault();
82198                                 options.buttonCallback();
82199                             });
82200                     }
82201
82202                     var tip = copyBox(tooltip.node().getBoundingClientRect()),
82203                         w = window.innerWidth,
82204                         h = window.innerHeight,
82205                         tooltipWidth = 200,
82206                         tooltipArrow = 5,
82207                         side, pos;
82208
82209
82210                     // hack: this will have bottom placement,
82211                     // so need to reserve extra space for the tooltip illustration.
82212                     if (options.tooltipClass === 'intro-mouse') {
82213                         tip.height += 80;
82214                     }
82215
82216                     // trim box dimensions to just the portion that fits in the window..
82217                     if (tooltipBox.top + tooltipBox.height > h) {
82218                         tooltipBox.height -= (tooltipBox.top + tooltipBox.height - h);
82219                     }
82220                     if (tooltipBox.left + tooltipBox.width > w) {
82221                         tooltipBox.width -= (tooltipBox.left + tooltipBox.width - w);
82222                     }
82223
82224                     // determine tooltip placement..
82225
82226                     if (tooltipBox.top + tooltipBox.height < 100) {
82227                         // tooltip below box..
82228                         side = 'bottom';
82229                         pos = [
82230                             tooltipBox.left + tooltipBox.width / 2 - tip.width / 2,
82231                             tooltipBox.top + tooltipBox.height
82232                         ];
82233
82234                     } else if (tooltipBox.top > h - 140) {
82235                         // tooltip above box..
82236                         side = 'top';
82237                         pos = [
82238                             tooltipBox.left + tooltipBox.width / 2 - tip.width / 2,
82239                             tooltipBox.top - tip.height
82240                         ];
82241
82242                     } else {
82243                         // tooltip to the side of the tooltipBox..
82244                         var tipY = tooltipBox.top + tooltipBox.height / 2 - tip.height / 2;
82245
82246                         if (textDirection === 'rtl') {
82247                             if (tooltipBox.left - tooltipWidth - tooltipArrow < 70) {
82248                                 side = 'right';
82249                                 pos = [tooltipBox.left + tooltipBox.width + tooltipArrow, tipY];
82250
82251                             } else {
82252                                 side = 'left';
82253                                 pos = [tooltipBox.left - tooltipWidth - tooltipArrow, tipY];
82254                             }
82255
82256                         } else {
82257                             if (tooltipBox.left + tooltipBox.width + tooltipArrow + tooltipWidth > w - 70) {
82258                                 side = 'left';
82259                                 pos = [tooltipBox.left - tooltipWidth - tooltipArrow, tipY];
82260                             }
82261                             else {
82262                                 side = 'right';
82263                                 pos = [tooltipBox.left + tooltipBox.width + tooltipArrow, tipY];
82264                             }
82265                         }
82266                     }
82267
82268                     if (options.duration !== 0 || !tooltip.classed(side)) {
82269                         tooltip.call(uiToggle(true));
82270                     }
82271
82272                     tooltip
82273                         .style('top', pos[1] + 'px')
82274                         .style('left', pos[0] + 'px')
82275                         .attr('class', classes + ' ' + side);
82276
82277
82278                     // shift tooltip-inner if it is very close to the top or bottom edge
82279                     // (doesn't affect the placement of the tooltip-arrow)
82280                     var shiftY = 0;
82281                     if (side === 'left' || side === 'right') {
82282                         if (pos[1] < 60) {
82283                             shiftY = 60 - pos[1];
82284                         }
82285                         else if (pos[1] + tip.height > h - 100) {
82286                             shiftY = h - pos[1] - tip.height - 100;
82287                         }
82288                     }
82289                     tooltip.selectAll('.tooltip-inner')
82290                         .style('top', shiftY + 'px');
82291
82292                 } else {
82293                     tooltip
82294                         .classed('in', false)
82295                         .call(uiToggle(false));
82296                 }
82297
82298                 curtain.cut(box, options.duration);
82299
82300                 return tooltip;
82301             };
82302
82303
82304             curtain.cut = function(datum, duration) {
82305                 darkness.datum(datum)
82306                     .interrupt();
82307
82308                 var selection;
82309                 if (duration === 0) {
82310                     selection = darkness;
82311                 } else {
82312                     selection = darkness
82313                         .transition()
82314                         .duration(duration || 600)
82315                         .ease(linear$1);
82316                 }
82317
82318                 selection
82319                     .attr('d', function(d) {
82320                         var string = 'M 0,0 L 0,' + window.innerHeight + ' L ' +
82321                             window.innerWidth + ',' + window.innerHeight + 'L' +
82322                             window.innerWidth + ',0 Z';
82323
82324                         if (!d) return string;
82325                         return string + 'M' +
82326                             d.left + ',' + d.top + 'L' +
82327                             d.left + ',' + (d.top + d.height) + 'L' +
82328                             (d.left + d.width) + ',' + (d.top + d.height) + 'L' +
82329                             (d.left + d.width) + ',' + (d.top) + 'Z';
82330
82331                     });
82332             };
82333
82334
82335             curtain.remove = function() {
82336                 surface.remove();
82337                 tooltip.remove();
82338                 d3_select(window).on('resize.curtain', null);
82339             };
82340
82341
82342             // ClientRects are immutable, so copy them to an object,
82343             // in case we need to trim the height/width.
82344             function copyBox(src) {
82345                 return {
82346                     top: src.top,
82347                     right: src.right,
82348                     bottom: src.bottom,
82349                     left: src.left,
82350                     width: src.width,
82351                     height: src.height
82352                 };
82353             }
82354
82355
82356             return curtain;
82357         }
82358
82359         function uiIntroWelcome(context, reveal) {
82360             var dispatch$1 = dispatch('done');
82361             var listener = clickListener();
82362
82363             var chapter = {
82364                 title: 'intro.welcome.title'
82365             };
82366
82367
82368             function welcome() {
82369                 context.map().centerZoom([-85.63591, 41.94285], 19);
82370                 reveal('.intro-nav-wrap .chapter-welcome',
82371                     t('intro.welcome.welcome'),
82372                     { buttonText: t('intro.ok'), buttonCallback: practice }
82373                 );
82374             }
82375
82376             function practice() {
82377                 reveal('.intro-nav-wrap .chapter-welcome',
82378                     t('intro.welcome.practice'),
82379                     { buttonText: t('intro.ok'), buttonCallback: words }
82380                 );
82381             }
82382
82383             function words() {
82384                 reveal('.intro-nav-wrap .chapter-welcome',
82385                     t('intro.welcome.words'),
82386                     { buttonText: t('intro.ok'), buttonCallback: mouse }
82387                 );
82388             }
82389
82390
82391             function mouse() {
82392                 reveal('.intro-nav-wrap .chapter-welcome',
82393                     t('intro.welcome.mouse'),
82394                     { buttonText: t('intro.ok'), buttonCallback: leftClick }
82395                 );
82396             }
82397
82398
82399             function leftClick() {
82400                 var counter = 0;
82401                 var times = 5;
82402
82403                 var tooltip = reveal('.intro-nav-wrap .chapter-welcome',
82404                     t('intro.welcome.leftclick', { num: times }),
82405                     { tooltipClass: 'intro-mouse' }
82406                 );
82407
82408                 tooltip.selectAll('.tooltip-inner')
82409                     .insert('svg', 'span')
82410                     .attr('class', 'tooltip-illustration')
82411                     .append('use')
82412                     .attr('xlink:href', '#iD-walkthrough-mouse');
82413
82414                 tooltip
82415                     .append('div')
82416                     .attr('class', 'counter');
82417
82418                 tooltip.call(listener);
82419
82420                 listener.on('click', function(which) {
82421                     if (which === 'left') {
82422                         d3_select('.curtain-tooltip.intro-mouse .counter')
82423                             .text(String(++counter));
82424
82425                         if (counter === times) {
82426                             window.setTimeout(function() { continueTo(rightClick); }, 1000);
82427                         }
82428                     }
82429                 });
82430
82431                 function continueTo(nextStep) {
82432                     listener.on('click', null);
82433                     tooltip.call(listener.off);
82434                     tooltip.select('.counter').remove();
82435                     nextStep();
82436                 }
82437             }
82438
82439
82440             function rightClick() {
82441                 var counter = 0;
82442                 var times = 5;
82443
82444                 var tooltip = reveal('.intro-nav-wrap .chapter-welcome',
82445                     t('intro.welcome.rightclick', { num: times }),
82446                     { tooltipClass: 'intro-mouse' }
82447                 );
82448
82449                 tooltip.selectAll('.tooltip-inner')
82450                     .insert('svg', 'span')
82451                     .attr('class', 'tooltip-illustration')
82452                     .append('use')
82453                     .attr('xlink:href', '#iD-walkthrough-mouse');
82454
82455                 tooltip
82456                     .append('div')
82457                     .attr('class', 'counter');
82458
82459                 tooltip.call(listener);
82460
82461                 listener.on('click', function(which) {
82462                     if (which === 'right') {
82463                         d3_select('.curtain-tooltip.intro-mouse .counter')
82464                             .text(String(++counter));
82465
82466                         if (counter === times) {
82467                             window.setTimeout(function() { continueTo(chapters); }, 1000);
82468                         }
82469                     }
82470                 });
82471
82472                 function continueTo(nextStep) {
82473                     listener.on('click', null);
82474                     tooltip.call(listener.off);
82475                     tooltip.select('.counter').remove();
82476                     nextStep();
82477                 }
82478             }
82479
82480
82481             function chapters() {
82482                 dispatch$1.call('done');
82483                 reveal('.intro-nav-wrap .chapter-navigation',
82484                     t('intro.welcome.chapters', { next: t('intro.navigation.title') })
82485                 );
82486             }
82487
82488
82489             chapter.enter = function() {
82490                 welcome();
82491             };
82492
82493
82494             chapter.exit = function() {
82495                 listener.off();
82496                 d3_select('.curtain-tooltip.intro-mouse')
82497                     .selectAll('.counter')
82498                     .remove();
82499             };
82500
82501
82502             chapter.restart = function() {
82503                 chapter.exit();
82504                 chapter.enter();
82505             };
82506
82507
82508             return utilRebind(chapter, dispatch$1, 'on');
82509         }
82510
82511
82512
82513         function clickListener() {
82514             var dispatch$1 = dispatch('click');
82515             var minTime = 120;
82516             var tooltip = d3_select(null);
82517             var down = {};
82518
82519             // `down` keeps track of which buttons/keys are down.
82520             // Setting a property in `down` happens immediately.
82521             // Unsetting a property in `down` is delayed because
82522             //   on Windows a contextmenu event happens after keyup/mouseup
82523
82524             function keydown() {
82525                 if (event.keyCode === 93)  {   // context menu
82526                     event.preventDefault();
82527                     event.stopPropagation();
82528                     down.menu = event.timeStamp;
82529                     tooltip.classed('rightclick', true);
82530                 }
82531             }
82532
82533
82534             function keyup() {
82535                 if (event.keyCode === 93)  {   // context menu
82536                     event.preventDefault();
82537                     event.stopPropagation();
82538                     var endTime = event.timeStamp;
82539                     var startTime = down.menu || endTime;
82540                     var delay = (endTime - startTime < minTime) ? minTime : 0;
82541
82542                     window.setTimeout(function() {
82543                         tooltip.classed('rightclick', false);
82544                         down.menu = undefined;  // delayed, for Windows
82545                     }, delay);
82546
82547                     dispatch$1.call('click', this, 'right');
82548                 }
82549             }
82550
82551
82552             function mousedown() {
82553                 var button = event.button;
82554                 if (button === 0 && !event.ctrlKey) {
82555                     tooltip.classed('leftclick', true);
82556                 } else if (button === 2) {
82557                     tooltip.classed('rightclick', true);
82558                 }
82559                 down[button] = event.timeStamp;
82560             }
82561
82562
82563             function mouseup() {
82564                 var button = event.button;
82565                 var endTime = event.timeStamp;
82566                 var startTime = down[button] || endTime;
82567                 var delay = (endTime - startTime < minTime) ? minTime : 0;
82568
82569                 if (button === 0 && !event.ctrlKey) {
82570                     window.setTimeout(function() {
82571                         tooltip.classed('leftclick', false);
82572                         down[button] = undefined;  // delayed, for Windows
82573                     }, delay);
82574
82575                     dispatch$1.call('click', this, 'left');
82576
82577                 } else if (button === 2) {
82578                     window.setTimeout(function() {
82579                         tooltip.classed('rightclick', false);
82580                         down[button] = undefined;  // delayed, for Windows
82581                     }, delay);
82582
82583                     dispatch$1.call('click', this, 'right');
82584
82585                 } else {
82586                     window.setTimeout(function() {
82587                         down[button] = undefined;  // delayed, for Windows
82588                     }, delay);
82589                 }
82590             }
82591
82592
82593             function contextmenu() {
82594                 event.preventDefault();
82595                 event.stopPropagation();
82596                 if (!down[2] && !down.menu) {
82597                     tooltip.classed('rightclick', true);
82598                     window.setTimeout(function() {
82599                         tooltip.classed('rightclick', false);
82600                     }, minTime);
82601                     dispatch$1.call('click', this, 'right');
82602                 }
82603             }
82604
82605
82606             var behavior = function(selection) {
82607                 tooltip = selection;
82608                 down = {};
82609
82610                 d3_select(window)
82611                     .on('keydown.intro', keydown)
82612                     .on('keyup.intro', keyup)
82613                     .on('mousedown.intro', mousedown)
82614                     .on('mouseup.intro', mouseup)
82615                     .on('contextmenu.intro', contextmenu);
82616             };
82617
82618
82619             behavior.off = function() {
82620                 d3_select(window)
82621                     .on('keydown.intro', null)
82622                     .on('keyup.intro', null)
82623                     .on('mousedown.intro', null)
82624                     .on('mouseup.intro', null)
82625                     .on('contextmenu.intro', null);
82626
82627                 tooltip
82628                     .classed('leftclick', false)
82629                     .classed('rightclick', false);
82630             };
82631
82632             return utilRebind(behavior, dispatch$1, 'on');
82633         }
82634
82635         function uiIntroNavigation(context, reveal) {
82636             var dispatch$1 = dispatch('done');
82637             var timeouts = [];
82638             var hallId = 'n2061';
82639             var townHall = [-85.63591, 41.94285];
82640             var springStreetId = 'w397';
82641             var springStreetEndId = 'n1834';
82642             var springStreet = [-85.63582, 41.94255];
82643             var onewayField = context.presets().field('oneway');
82644             var maxspeedField = context.presets().field('maxspeed');
82645
82646
82647             var chapter = {
82648                 title: 'intro.navigation.title'
82649             };
82650
82651
82652             function timeout(f, t) {
82653                 timeouts.push(window.setTimeout(f, t));
82654             }
82655
82656
82657             function eventCancel() {
82658                 event.stopPropagation();
82659                 event.preventDefault();
82660             }
82661
82662
82663             function isTownHallSelected() {
82664                 var ids = context.selectedIDs();
82665                 return ids.length === 1 && ids[0] === hallId;
82666             }
82667
82668
82669             function dragMap() {
82670                 context.enter(modeBrowse(context));
82671                 context.history().reset('initial');
82672
82673                 var msec = transitionTime(townHall, context.map().center());
82674                 if (msec) { reveal(null, null, { duration: 0 }); }
82675                 context.map().centerZoomEase(townHall, 19, msec);
82676
82677                 timeout(function() {
82678                     var centerStart = context.map().center();
82679
82680                     reveal('#surface', t('intro.navigation.drag'));
82681                     context.map().on('drawn.intro', function() {
82682                         reveal('#surface', t('intro.navigation.drag'), { duration: 0 });
82683                     });
82684
82685                     context.map().on('move.intro', function() {
82686                         var centerNow = context.map().center();
82687                         if (centerStart[0] !== centerNow[0] || centerStart[1] !== centerNow[1]) {
82688                             context.map().on('move.intro', null);
82689                             timeout(function() { continueTo(zoomMap); }, 3000);
82690                         }
82691                     });
82692
82693                 }, msec + 100);
82694
82695                 function continueTo(nextStep) {
82696                     context.map().on('move.intro drawn.intro', null);
82697                     nextStep();
82698                 }
82699             }
82700
82701
82702             function zoomMap() {
82703                 var zoomStart = context.map().zoom();
82704
82705                 reveal('#surface',
82706                     t('intro.navigation.zoom', {
82707                         plus: icon('#iD-icon-plus', 'pre-text'),
82708                         minus: icon('#iD-icon-minus', 'pre-text')
82709                     })
82710                 );
82711
82712                 context.map().on('drawn.intro', function() {
82713                     reveal('#surface',
82714                         t('intro.navigation.zoom', {
82715                             plus: icon('#iD-icon-plus', 'pre-text'),
82716                             minus: icon('#iD-icon-minus', 'pre-text')
82717                         }), { duration: 0 }
82718                     );
82719                 });
82720
82721                 context.map().on('move.intro', function() {
82722                     if (context.map().zoom() !== zoomStart) {
82723                         context.map().on('move.intro', null);
82724                         timeout(function() { continueTo(features); }, 3000);
82725                     }
82726                 });
82727
82728                 function continueTo(nextStep) {
82729                     context.map().on('move.intro drawn.intro', null);
82730                     nextStep();
82731                 }
82732             }
82733
82734
82735             function features() {
82736                 var onClick = function() { continueTo(pointsLinesAreas); };
82737
82738                 reveal('#surface', t('intro.navigation.features'),
82739                     { buttonText: t('intro.ok'), buttonCallback: onClick }
82740                 );
82741
82742                 context.map().on('drawn.intro', function() {
82743                     reveal('#surface', t('intro.navigation.features'),
82744                         { duration: 0, buttonText: t('intro.ok'), buttonCallback: onClick }
82745                     );
82746                 });
82747
82748                 function continueTo(nextStep) {
82749                     context.map().on('drawn.intro', null);
82750                     nextStep();
82751                 }
82752             }
82753
82754             function pointsLinesAreas() {
82755                 var onClick = function() { continueTo(nodesWays); };
82756
82757                 reveal('#surface', t('intro.navigation.points_lines_areas'),
82758                     { buttonText: t('intro.ok'), buttonCallback: onClick }
82759                 );
82760
82761                 context.map().on('drawn.intro', function() {
82762                     reveal('#surface', t('intro.navigation.points_lines_areas'),
82763                         { duration: 0, buttonText: t('intro.ok'), buttonCallback: onClick }
82764                     );
82765                 });
82766
82767                 function continueTo(nextStep) {
82768                     context.map().on('drawn.intro', null);
82769                     nextStep();
82770                 }
82771             }
82772
82773             function nodesWays() {
82774                 var onClick = function() { continueTo(clickTownHall); };
82775
82776                 reveal('#surface', t('intro.navigation.nodes_ways'),
82777                     { buttonText: t('intro.ok'), buttonCallback: onClick }
82778                 );
82779
82780                 context.map().on('drawn.intro', function() {
82781                     reveal('#surface', t('intro.navigation.nodes_ways'),
82782                         { duration: 0, buttonText: t('intro.ok'), buttonCallback: onClick }
82783                     );
82784                 });
82785
82786                 function continueTo(nextStep) {
82787                     context.map().on('drawn.intro', null);
82788                     nextStep();
82789                 }
82790             }
82791
82792             function clickTownHall() {
82793                 context.enter(modeBrowse(context));
82794                 context.history().reset('initial');
82795
82796                 var entity = context.hasEntity(hallId);
82797                 if (!entity) return;
82798                 reveal(null, null, { duration: 0 });
82799                 context.map().centerZoomEase(entity.loc, 19, 500);
82800
82801                 timeout(function() {
82802                     var entity = context.hasEntity(hallId);
82803                     if (!entity) return;
82804                     var box = pointBox(entity.loc, context);
82805                     reveal(box, t('intro.navigation.click_townhall'));
82806
82807                     context.map().on('move.intro drawn.intro', function() {
82808                         var entity = context.hasEntity(hallId);
82809                         if (!entity) return;
82810                         var box = pointBox(entity.loc, context);
82811                         reveal(box, t('intro.navigation.click_townhall'), { duration: 0 });
82812                     });
82813
82814                     context.on('enter.intro', function() {
82815                         if (isTownHallSelected()) continueTo(selectedTownHall);
82816                     });
82817
82818                 }, 550);  // after centerZoomEase
82819
82820                 context.history().on('change.intro', function() {
82821                     if (!context.hasEntity(hallId)) {
82822                         continueTo(clickTownHall);
82823                     }
82824                 });
82825
82826                 function continueTo(nextStep) {
82827                     context.on('enter.intro', null);
82828                     context.map().on('move.intro drawn.intro', null);
82829                     context.history().on('change.intro', null);
82830                     nextStep();
82831                 }
82832             }
82833
82834
82835             function selectedTownHall() {
82836                 if (!isTownHallSelected()) return clickTownHall();
82837
82838                 var entity = context.hasEntity(hallId);
82839                 if (!entity) return clickTownHall();
82840
82841                 var box = pointBox(entity.loc, context);
82842                 var onClick = function() { continueTo(editorTownHall); };
82843
82844                 reveal(box, t('intro.navigation.selected_townhall'),
82845                     { buttonText: t('intro.ok'), buttonCallback: onClick }
82846                 );
82847
82848                 context.map().on('move.intro drawn.intro', function() {
82849                     var entity = context.hasEntity(hallId);
82850                     if (!entity) return;
82851                     var box = pointBox(entity.loc, context);
82852                     reveal(box, t('intro.navigation.selected_townhall'),
82853                         { duration: 0, buttonText: t('intro.ok'), buttonCallback: onClick }
82854                     );
82855                 });
82856
82857                 context.history().on('change.intro', function() {
82858                     if (!context.hasEntity(hallId)) {
82859                         continueTo(clickTownHall);
82860                     }
82861                 });
82862
82863                 function continueTo(nextStep) {
82864                     context.map().on('move.intro drawn.intro', null);
82865                     context.history().on('change.intro', null);
82866                     nextStep();
82867                 }
82868             }
82869
82870
82871             function editorTownHall() {
82872                 if (!isTownHallSelected()) return clickTownHall();
82873
82874                 // disallow scrolling
82875                 d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
82876
82877                 var onClick = function() { continueTo(presetTownHall); };
82878
82879                 reveal('.entity-editor-pane',
82880                     t('intro.navigation.editor_townhall'),
82881                     { buttonText: t('intro.ok'), buttonCallback: onClick }
82882                 );
82883
82884                 context.on('exit.intro', function() {
82885                     continueTo(clickTownHall);
82886                 });
82887
82888                 context.history().on('change.intro', function() {
82889                     if (!context.hasEntity(hallId)) {
82890                         continueTo(clickTownHall);
82891                     }
82892                 });
82893
82894                 function continueTo(nextStep) {
82895                     context.on('exit.intro', null);
82896                     context.history().on('change.intro', null);
82897                     d3_select('.inspector-wrap').on('wheel.intro', null);
82898                     nextStep();
82899                 }
82900             }
82901
82902
82903             function presetTownHall() {
82904                 if (!isTownHallSelected()) return clickTownHall();
82905
82906                 // reset pane, in case user happened to change it..
82907                 d3_select('.inspector-wrap .panewrap').style('right', '0%');
82908                 // disallow scrolling
82909                 d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
82910
82911                 // preset match, in case the user happened to change it.
82912                 var entity = context.entity(context.selectedIDs()[0]);
82913                 var preset = context.presets().match(entity, context.graph());
82914
82915                 var onClick = function() { continueTo(fieldsTownHall); };
82916
82917                 context.on('exit.intro', function() {
82918                     continueTo(clickTownHall);
82919                 });
82920
82921                 context.history().on('change.intro', function() {
82922                     if (!context.hasEntity(hallId)) {
82923                         continueTo(clickTownHall);
82924                     }
82925                 });
82926
82927                 reveal('.inspector-body .preset-list-item.inspector-inner',
82928                     t('intro.navigation.preset_townhall', { preset: preset.name() }),
82929                     { buttonText: t('intro.ok'), buttonCallback: onClick }
82930                 );
82931
82932                 function continueTo(nextStep) {
82933                     context.on('exit.intro', null);
82934                     context.history().on('change.intro', null);
82935                     d3_select('.inspector-wrap').on('wheel.intro', null);
82936                     nextStep();
82937                 }
82938             }
82939
82940
82941             function fieldsTownHall() {
82942                 if (!isTownHallSelected()) return clickTownHall();
82943
82944                 // reset pane, in case user happened to change it..
82945                 d3_select('.inspector-wrap .panewrap').style('right', '0%');
82946                 // disallow scrolling
82947                 d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
82948
82949                 var onClick = function() { continueTo(closeTownHall); };
82950
82951                 reveal('.inspector-body .preset-editor',
82952                     t('intro.navigation.fields_townhall'),
82953                     { buttonText: t('intro.ok'), buttonCallback: onClick }
82954                 );
82955
82956                 context.on('exit.intro', function() {
82957                     continueTo(clickTownHall);
82958                 });
82959
82960                 context.history().on('change.intro', function() {
82961                     if (!context.hasEntity(hallId)) {
82962                         continueTo(clickTownHall);
82963                     }
82964                 });
82965
82966                 function continueTo(nextStep) {
82967                     context.on('exit.intro', null);
82968                     context.history().on('change.intro', null);
82969                     d3_select('.inspector-wrap').on('wheel.intro', null);
82970                     nextStep();
82971                 }
82972             }
82973
82974
82975             function closeTownHall() {
82976                 if (!isTownHallSelected()) return clickTownHall();
82977
82978                 var selector = '.entity-editor-pane button.preset-close svg use';
82979                 var href = d3_select(selector).attr('href') || '#iD-icon-close';
82980
82981                 reveal('.entity-editor-pane',
82982                     t('intro.navigation.close_townhall', { button: icon(href, 'pre-text') })
82983                 );
82984
82985                 context.on('exit.intro', function() {
82986                     continueTo(searchStreet);
82987                 });
82988
82989                 context.history().on('change.intro', function() {
82990                     // update the close icon in the tooltip if the user edits something.
82991                     var selector = '.entity-editor-pane button.preset-close svg use';
82992                     var href = d3_select(selector).attr('href') || '#iD-icon-close';
82993
82994                     reveal('.entity-editor-pane',
82995                         t('intro.navigation.close_townhall', { button: icon(href, 'pre-text') }),
82996                         { duration: 0 }
82997                     );
82998                 });
82999
83000                 function continueTo(nextStep) {
83001                     context.on('exit.intro', null);
83002                     context.history().on('change.intro', null);
83003                     nextStep();
83004                 }
83005             }
83006
83007
83008             function searchStreet() {
83009                 context.enter(modeBrowse(context));
83010                 context.history().reset('initial');  // ensure spring street exists
83011
83012                 var msec = transitionTime(springStreet, context.map().center());
83013                 if (msec) { reveal(null, null, { duration: 0 }); }
83014                 context.map().centerZoomEase(springStreet, 19, msec);  // ..and user can see it
83015
83016                 timeout(function() {
83017                     reveal('.search-header input',
83018                         t('intro.navigation.search_street', { name: t('intro.graph.name.spring-street') })
83019                     );
83020
83021                     d3_select('.search-header input')
83022                         .on('keyup.intro', checkSearchResult);
83023                 }, msec + 100);
83024             }
83025
83026
83027             function checkSearchResult() {
83028                 var first = d3_select('.feature-list-item:nth-child(0n+2)');  // skip "No Results" item
83029                 var firstName = first.select('.entity-name');
83030                 var name = t('intro.graph.name.spring-street');
83031
83032                 if (!firstName.empty() && firstName.text() === name) {
83033                     reveal(first.node(),
83034                         t('intro.navigation.choose_street', { name: name }),
83035                         { duration: 300 }
83036                     );
83037
83038                     context.on('exit.intro', function() {
83039                         continueTo(selectedStreet);
83040                     });
83041
83042                     d3_select('.search-header input')
83043                         .on('keydown.intro', eventCancel, true)
83044                         .on('keyup.intro', null);
83045                 }
83046
83047                 function continueTo(nextStep) {
83048                     context.on('exit.intro', null);
83049                     d3_select('.search-header input')
83050                         .on('keydown.intro', null)
83051                         .on('keyup.intro', null);
83052                     nextStep();
83053                 }
83054             }
83055
83056
83057             function selectedStreet() {
83058                 if (!context.hasEntity(springStreetEndId) || !context.hasEntity(springStreetId)) {
83059                     return searchStreet();
83060                 }
83061
83062                 var onClick = function() { continueTo(editorStreet); };
83063                 var entity = context.entity(springStreetEndId);
83064                 var box = pointBox(entity.loc, context);
83065                 box.height = 500;
83066
83067                 reveal(box,
83068                     t('intro.navigation.selected_street', { name: t('intro.graph.name.spring-street') }),
83069                     { duration: 600, buttonText: t('intro.ok'), buttonCallback: onClick }
83070                 );
83071
83072                 timeout(function() {
83073                     context.map().on('move.intro drawn.intro', function() {
83074                         var entity = context.hasEntity(springStreetEndId);
83075                         if (!entity) return;
83076                         var box = pointBox(entity.loc, context);
83077                         box.height = 500;
83078                         reveal(box,
83079                             t('intro.navigation.selected_street', { name: t('intro.graph.name.spring-street') }),
83080                             { duration: 0, buttonText: t('intro.ok'), buttonCallback: onClick }
83081                         );
83082                     });
83083                 }, 600);  // after reveal.
83084
83085                 context.on('enter.intro', function(mode) {
83086                     if (!context.hasEntity(springStreetId)) {
83087                         return continueTo(searchStreet);
83088                     }
83089                     var ids = context.selectedIDs();
83090                     if (mode.id !== 'select' || !ids.length || ids[0] !== springStreetId) {
83091                         // keep Spring Street selected..
83092                         context.enter(modeSelect(context, [springStreetId]));
83093                     }
83094                 });
83095
83096                 context.history().on('change.intro', function() {
83097                     if (!context.hasEntity(springStreetEndId) || !context.hasEntity(springStreetId)) {
83098                         timeout(function() {
83099                             continueTo(searchStreet);
83100                         }, 300);  // after any transition (e.g. if user deleted intersection)
83101                     }
83102                 });
83103
83104                 function continueTo(nextStep) {
83105                     context.map().on('move.intro drawn.intro', null);
83106                     context.on('enter.intro', null);
83107                     context.history().on('change.intro', null);
83108                     nextStep();
83109                 }
83110             }
83111
83112
83113             function editorStreet() {
83114                 var selector = '.entity-editor-pane button.preset-close svg use';
83115                 var href = d3_select(selector).attr('href') || '#iD-icon-close';
83116
83117                 reveal('.entity-editor-pane',
83118                     t('intro.navigation.editor_street', {
83119                         button: icon(href, 'pre-text'),
83120                         field1: onewayField.label(),
83121                         field2: maxspeedField.label()
83122                     })
83123                 );
83124
83125                 context.on('exit.intro', function() {
83126                     continueTo(play);
83127                 });
83128
83129                 context.history().on('change.intro', function() {
83130                     // update the close icon in the tooltip if the user edits something.
83131                     var selector = '.entity-editor-pane button.preset-close svg use';
83132                     var href = d3_select(selector).attr('href') || '#iD-icon-close';
83133
83134                     reveal('.entity-editor-pane',
83135                         t('intro.navigation.editor_street', {
83136                             button: icon(href, 'pre-text'),
83137                             field1: onewayField.label().toLowerCase(),
83138                             field2: maxspeedField.label().toLowerCase()
83139                         }), { duration: 0 }
83140                     );
83141                 });
83142
83143                 function continueTo(nextStep) {
83144                     context.on('exit.intro', null);
83145                     context.history().on('change.intro', null);
83146                     nextStep();
83147                 }
83148             }
83149
83150
83151             function play() {
83152                 dispatch$1.call('done');
83153                 reveal('#id-container',
83154                     t('intro.navigation.play', { next: t('intro.points.title') }), {
83155                         tooltipBox: '.intro-nav-wrap .chapter-point',
83156                         buttonText: t('intro.ok'),
83157                         buttonCallback: function() { reveal('#id-container'); }
83158                     }
83159                 );
83160             }
83161
83162
83163             chapter.enter = function() {
83164                 dragMap();
83165             };
83166
83167
83168             chapter.exit = function() {
83169                 timeouts.forEach(window.clearTimeout);
83170                 context.on('enter.intro exit.intro', null);
83171                 context.map().on('move.intro drawn.intro', null);
83172                 context.history().on('change.intro', null);
83173                 d3_select('.inspector-wrap').on('wheel.intro', null);
83174                 d3_select('.search-header input').on('keydown.intro keyup.intro', null);
83175             };
83176
83177
83178             chapter.restart = function() {
83179                 chapter.exit();
83180                 chapter.enter();
83181             };
83182
83183
83184             return utilRebind(chapter, dispatch$1, 'on');
83185         }
83186
83187         function uiIntroPoint(context, reveal) {
83188             var dispatch$1 = dispatch('done');
83189             var timeouts = [];
83190             var intersection = [-85.63279, 41.94394];
83191             var building = [-85.632422, 41.944045];
83192             var cafePreset = context.presets().item('amenity/cafe');
83193             var _pointID = null;
83194
83195
83196             var chapter = {
83197                 title: 'intro.points.title'
83198             };
83199
83200
83201             function timeout(f, t) {
83202                 timeouts.push(window.setTimeout(f, t));
83203             }
83204
83205
83206             function revealEditMenu(loc, text, options) {
83207                 var rect = context.surfaceRect();
83208                 var point = context.curtainProjection(loc);
83209                 var pad = 40;
83210                 var width = 250 + (2 * pad);
83211                 var height = 250;
83212                 var startX = rect.left + point[0];
83213                 var left = (textDirection === 'rtl') ? (startX - width + pad) : (startX - pad);
83214                 var box = {
83215                     left: left,
83216                     top: point[1] + rect.top - 60,
83217                     width: width,
83218                     height: height
83219                 };
83220                 reveal(box, text, options);
83221             }
83222
83223
83224             function eventCancel() {
83225                 event.stopPropagation();
83226                 event.preventDefault();
83227             }
83228
83229
83230             function addPoint() {
83231                 context.enter(modeBrowse(context));
83232                 context.history().reset('initial');
83233
83234                 var msec = transitionTime(intersection, context.map().center());
83235                 if (msec) { reveal(null, null, { duration: 0 }); }
83236                 context.map().centerZoomEase(intersection, 19, msec);
83237
83238                 timeout(function() {
83239                     var tooltip = reveal('button.add-point',
83240                         t('intro.points.add_point', { button: icon('#iD-icon-point', 'pre-text') }));
83241
83242                     _pointID = null;
83243
83244                     tooltip.selectAll('.tooltip-inner')
83245                         .insert('svg', 'span')
83246                         .attr('class', 'tooltip-illustration')
83247                         .append('use')
83248                         .attr('xlink:href', '#iD-graphic-points');
83249
83250                     context.on('enter.intro', function(mode) {
83251                         if (mode.id !== 'add-point') return;
83252                         continueTo(placePoint);
83253                     });
83254                 }, msec + 100);
83255
83256                 function continueTo(nextStep) {
83257                     context.on('enter.intro', null);
83258                     nextStep();
83259                 }
83260             }
83261
83262
83263             function placePoint() {
83264                 if (context.mode().id !== 'add-point') {
83265                     return chapter.restart();
83266                 }
83267
83268                 var pointBox = pad$2(building, 150, context);
83269                 reveal(pointBox, t('intro.points.place_point'));
83270
83271                 context.map().on('move.intro drawn.intro', function() {
83272                     pointBox = pad$2(building, 150, context);
83273                     reveal(pointBox, t('intro.points.place_point'), { duration: 0 });
83274                 });
83275
83276                 context.on('enter.intro', function(mode) {
83277                     if (mode.id !== 'select') return chapter.restart();
83278                     _pointID = context.mode().selectedIDs()[0];
83279                     continueTo(searchPreset);
83280                 });
83281
83282                 function continueTo(nextStep) {
83283                     context.map().on('move.intro drawn.intro', null);
83284                     context.on('enter.intro', null);
83285                     nextStep();
83286                 }
83287             }
83288
83289
83290             function searchPreset() {
83291                 if (context.mode().id !== 'select' || !_pointID || !context.hasEntity(_pointID)) {
83292                     return addPoint();
83293                 }
83294
83295                 // disallow scrolling
83296                 d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
83297
83298                 d3_select('.preset-search-input')
83299                     .on('keydown.intro', null)
83300                     .on('keyup.intro', checkPresetSearch);
83301
83302                 reveal('.preset-search-input',
83303                     t('intro.points.search_cafe', { preset: cafePreset.name() })
83304                 );
83305
83306                 context.on('enter.intro', function(mode) {
83307                     if (!_pointID || !context.hasEntity(_pointID)) {
83308                         return continueTo(addPoint);
83309                     }
83310
83311                     var ids = context.selectedIDs();
83312                     if (mode.id !== 'select' || !ids.length || ids[0] !== _pointID) {
83313                         // keep the user's point selected..
83314                         context.enter(modeSelect(context, [_pointID]));
83315
83316                         // disallow scrolling
83317                         d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
83318
83319                         d3_select('.preset-search-input')
83320                             .on('keydown.intro', null)
83321                             .on('keyup.intro', checkPresetSearch);
83322
83323                         reveal('.preset-search-input',
83324                             t('intro.points.search_cafe', { preset: cafePreset.name() })
83325                         );
83326
83327                         context.history().on('change.intro', null);
83328                     }
83329                 });
83330
83331
83332                 function checkPresetSearch() {
83333                     var first = d3_select('.preset-list-item:first-child');
83334
83335                     if (first.classed('preset-amenity-cafe')) {
83336                         d3_select('.preset-search-input')
83337                             .on('keydown.intro', eventCancel, true)
83338                             .on('keyup.intro', null);
83339
83340                         reveal(first.select('.preset-list-button').node(),
83341                             t('intro.points.choose_cafe', { preset: cafePreset.name() }),
83342                             { duration: 300 }
83343                         );
83344
83345                         context.history().on('change.intro', function() {
83346                             continueTo(aboutFeatureEditor);
83347                         });
83348                     }
83349                 }
83350
83351                 function continueTo(nextStep) {
83352                     context.on('enter.intro', null);
83353                     context.history().on('change.intro', null);
83354                     d3_select('.inspector-wrap').on('wheel.intro', null);
83355                     d3_select('.preset-search-input').on('keydown.intro keyup.intro', null);
83356                     nextStep();
83357                 }
83358             }
83359
83360
83361             function aboutFeatureEditor() {
83362                 if (context.mode().id !== 'select' || !_pointID || !context.hasEntity(_pointID)) {
83363                     return addPoint();
83364                 }
83365
83366                 timeout(function() {
83367                     reveal('.entity-editor-pane', t('intro.points.feature_editor'), {
83368                         tooltipClass: 'intro-points-describe',
83369                         buttonText: t('intro.ok'),
83370                         buttonCallback: function() { continueTo(addName); }
83371                     });
83372                 }, 400);
83373
83374                 context.on('exit.intro', function() {
83375                     // if user leaves select mode here, just continue with the tutorial.
83376                     continueTo(reselectPoint);
83377                 });
83378
83379                 function continueTo(nextStep) {
83380                     context.on('exit.intro', null);
83381                     nextStep();
83382                 }
83383             }
83384
83385
83386             function addName() {
83387                 if (context.mode().id !== 'select' || !_pointID || !context.hasEntity(_pointID)) {
83388                     return addPoint();
83389                 }
83390
83391                 // reset pane, in case user happened to change it..
83392                 d3_select('.inspector-wrap .panewrap').style('right', '0%');
83393
83394                 timeout(function() {
83395                     // It's possible for the user to add a name in a previous step..
83396                     // If so, don't tell them to add the name in this step.
83397                     // Give them an OK button instead.
83398                     var entity = context.entity(_pointID);
83399                     if (entity.tags.name) {
83400                         var tooltip = reveal('.entity-editor-pane', t('intro.points.add_name'), {
83401                             tooltipClass: 'intro-points-describe',
83402                             buttonText: t('intro.ok'),
83403                             buttonCallback: function() { continueTo(addCloseEditor); }
83404                         });
83405                         tooltip.select('.instruction').style('display', 'none');
83406
83407                     } else {
83408                         reveal('.entity-editor-pane', t('intro.points.add_name'),
83409                             { tooltipClass: 'intro-points-describe' }
83410                         );
83411                     }
83412                 }, 400);
83413
83414                 context.history().on('change.intro', function() {
83415                     continueTo(addCloseEditor);
83416                 });
83417
83418                 context.on('exit.intro', function() {
83419                     // if user leaves select mode here, just continue with the tutorial.
83420                     continueTo(reselectPoint);
83421                 });
83422
83423                 function continueTo(nextStep) {
83424                     context.on('exit.intro', null);
83425                     context.history().on('change.intro', null);
83426                     nextStep();
83427                 }
83428             }
83429
83430
83431             function addCloseEditor() {
83432                 // reset pane, in case user happened to change it..
83433                 d3_select('.inspector-wrap .panewrap').style('right', '0%');
83434
83435                 var selector = '.entity-editor-pane button.preset-close svg use';
83436                 var href = d3_select(selector).attr('href') || '#iD-icon-close';
83437
83438                 context.on('exit.intro', function() {
83439                     continueTo(reselectPoint);
83440                 });
83441
83442                 reveal('.entity-editor-pane',
83443                     t('intro.points.add_close', { button: icon(href, 'pre-text') })
83444                 );
83445
83446                 function continueTo(nextStep) {
83447                     context.on('exit.intro', null);
83448                     nextStep();
83449                 }
83450             }
83451
83452
83453             function reselectPoint() {
83454                 if (!_pointID) return chapter.restart();
83455                 var entity = context.hasEntity(_pointID);
83456                 if (!entity) return chapter.restart();
83457
83458                 // make sure it's still a cafe, in case user somehow changed it..
83459                 var oldPreset = context.presets().match(entity, context.graph());
83460                 context.replace(actionChangePreset(_pointID, oldPreset, cafePreset));
83461
83462                 context.enter(modeBrowse(context));
83463
83464                 var msec = transitionTime(entity.loc, context.map().center());
83465                 if (msec) { reveal(null, null, { duration: 0 }); }
83466                 context.map().centerEase(entity.loc, msec);
83467
83468                 timeout(function() {
83469                     var box = pointBox(entity.loc, context);
83470                     reveal(box, t('intro.points.reselect'), { duration: 600 });
83471
83472                     timeout(function() {
83473                         context.map().on('move.intro drawn.intro', function() {
83474                             var entity = context.hasEntity(_pointID);
83475                             if (!entity) return chapter.restart();
83476                             var box = pointBox(entity.loc, context);
83477                             reveal(box, t('intro.points.reselect'), { duration: 0 });
83478                         });
83479                     }, 600); // after reveal..
83480
83481                     context.on('enter.intro', function(mode) {
83482                         if (mode.id !== 'select') return;
83483                         continueTo(updatePoint);
83484                     });
83485
83486                 }, msec + 100);
83487
83488                 function continueTo(nextStep) {
83489                     context.map().on('move.intro drawn.intro', null);
83490                     context.on('enter.intro', null);
83491                     nextStep();
83492                 }
83493             }
83494
83495
83496             function updatePoint() {
83497                 if (context.mode().id !== 'select' || !_pointID || !context.hasEntity(_pointID)) {
83498                     return continueTo(reselectPoint);
83499                 }
83500
83501                 // reset pane, in case user happened to untag the point..
83502                 d3_select('.inspector-wrap .panewrap').style('right', '0%');
83503
83504                 context.on('exit.intro', function() {
83505                     continueTo(reselectPoint);
83506                 });
83507
83508                 context.history().on('change.intro', function() {
83509                     continueTo(updateCloseEditor);
83510                 });
83511
83512                 timeout(function() {
83513                     reveal('.entity-editor-pane', t('intro.points.update'),
83514                         { tooltipClass: 'intro-points-describe' }
83515                     );
83516                 }, 400);
83517
83518                 function continueTo(nextStep) {
83519                     context.on('exit.intro', null);
83520                     context.history().on('change.intro', null);
83521                     nextStep();
83522                 }
83523             }
83524
83525
83526             function updateCloseEditor() {
83527                 if (context.mode().id !== 'select' || !_pointID || !context.hasEntity(_pointID)) {
83528                     return continueTo(reselectPoint);
83529                 }
83530
83531                 // reset pane, in case user happened to change it..
83532                 d3_select('.inspector-wrap .panewrap').style('right', '0%');
83533
83534                 context.on('exit.intro', function() {
83535                     continueTo(rightClickPoint);
83536                 });
83537
83538                 timeout(function() {
83539                     reveal('.entity-editor-pane',
83540                         t('intro.points.update_close', { button: icon('#iD-icon-apply', 'pre-text') })
83541                     );
83542                 }, 500);
83543
83544                 function continueTo(nextStep) {
83545                     context.on('exit.intro', null);
83546                     nextStep();
83547                 }
83548             }
83549
83550
83551             function rightClickPoint() {
83552                 if (!_pointID) return chapter.restart();
83553                 var entity = context.hasEntity(_pointID);
83554                 if (!entity) return chapter.restart();
83555
83556                 context.enter(modeBrowse(context));
83557
83558                 var box = pointBox(entity.loc, context);
83559                 reveal(box, t('intro.points.rightclick'), { duration: 600 });
83560
83561                 timeout(function() {
83562                     context.map().on('move.intro drawn.intro', function() {
83563                         var entity = context.hasEntity(_pointID);
83564                         if (!entity) return chapter.restart();
83565                         var box = pointBox(entity.loc, context);
83566                         reveal(box, t('intro.points.rightclick'), { duration: 0 });
83567                     });
83568                 }, 600); // after reveal
83569
83570                 context.on('enter.intro', function(mode) {
83571                     if (mode.id !== 'select') return;
83572                     var ids = context.selectedIDs();
83573                     if (ids.length !== 1 || ids[0] !== _pointID) return;
83574
83575                     timeout(function() {
83576                         var node = selectMenuItem('delete').node();
83577                         if (!node) return;
83578                         continueTo(enterDelete);
83579                     }, 300);  // after menu visible
83580                 });
83581
83582                 function continueTo(nextStep) {
83583                     context.on('enter.intro', null);
83584                     context.map().on('move.intro drawn.intro', null);
83585                     nextStep();
83586                 }
83587             }
83588
83589
83590             function enterDelete() {
83591                 if (!_pointID) return chapter.restart();
83592                 var entity = context.hasEntity(_pointID);
83593                 if (!entity) return chapter.restart();
83594
83595                 var node = selectMenuItem('delete').node();
83596                 if (!node) { return continueTo(rightClickPoint); }
83597
83598                 revealEditMenu(entity.loc,
83599                     t('intro.points.delete', { button: icon('#iD-operation-delete', 'pre-text') })
83600                 );
83601
83602                 timeout(function() {
83603                     context.map().on('move.intro drawn.intro', function() {
83604                         revealEditMenu(entity.loc,
83605                             t('intro.points.delete', { button: icon('#iD-operation-delete', 'pre-text') }),
83606                             { duration: 0}
83607                         );
83608                     });
83609                 }, 300); // after menu visible
83610
83611                 context.on('exit.intro', function() {
83612                     if (!_pointID) return chapter.restart();
83613                     var entity = context.hasEntity(_pointID);
83614                     if (entity) return continueTo(rightClickPoint);  // point still exists
83615                 });
83616
83617                 context.history().on('change.intro', function(changed) {
83618                     if (changed.deleted().length) {
83619                         continueTo(undo);
83620                     }
83621                 });
83622
83623                 function continueTo(nextStep) {
83624                     context.map().on('move.intro drawn.intro', null);
83625                     context.history().on('change.intro', null);
83626                     context.on('exit.intro', null);
83627                     nextStep();
83628                 }
83629             }
83630
83631
83632             function undo() {
83633                 context.history().on('change.intro', function() {
83634                     continueTo(play);
83635                 });
83636
83637                 var iconName = '#iD-icon-' + (textDirection === 'rtl' ? 'redo' : 'undo');
83638                 reveal('#bar button.undo-button',
83639                     t('intro.points.undo', { button: icon(iconName, 'pre-text') })
83640                 );
83641
83642                 function continueTo(nextStep) {
83643                     context.history().on('change.intro', null);
83644                     nextStep();
83645                 }
83646             }
83647
83648
83649             function play() {
83650                 dispatch$1.call('done');
83651                 reveal('#id-container',
83652                     t('intro.points.play', { next: t('intro.areas.title') }), {
83653                         tooltipBox: '.intro-nav-wrap .chapter-area',
83654                         buttonText: t('intro.ok'),
83655                         buttonCallback: function() { reveal('#id-container'); }
83656                     }
83657                 );
83658             }
83659
83660
83661             chapter.enter = function() {
83662                 addPoint();
83663             };
83664
83665
83666             chapter.exit = function() {
83667                 timeouts.forEach(window.clearTimeout);
83668                 context.on('enter.intro exit.intro', null);
83669                 context.map().on('move.intro drawn.intro', null);
83670                 context.history().on('change.intro', null);
83671                 d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
83672                 d3_select('.preset-search-input').on('keydown.intro keyup.intro', null);
83673             };
83674
83675
83676             chapter.restart = function() {
83677                 chapter.exit();
83678                 chapter.enter();
83679             };
83680
83681
83682             return utilRebind(chapter, dispatch$1, 'on');
83683         }
83684
83685         function uiIntroArea(context, reveal) {
83686             var dispatch$1 = dispatch('done');
83687             var playground = [-85.63552, 41.94159];
83688             var playgroundPreset = context.presets().item('leisure/playground');
83689             var descriptionField = context.presets().field('description');
83690             var timeouts = [];
83691             var _areaID;
83692
83693
83694             var chapter = {
83695                 title: 'intro.areas.title'
83696             };
83697
83698
83699             function timeout(f, t) {
83700                 timeouts.push(window.setTimeout(f, t));
83701             }
83702
83703
83704             function eventCancel() {
83705                 event.stopPropagation();
83706                 event.preventDefault();
83707             }
83708
83709
83710             function revealPlayground(center, text, options) {
83711                 var padding = 180 * Math.pow(2, context.map().zoom() - 19.5);
83712                 var box = pad$2(center, padding, context);
83713                 reveal(box, text, options);
83714             }
83715
83716
83717             function addArea() {
83718                 context.enter(modeBrowse(context));
83719                 context.history().reset('initial');
83720                 _areaID = null;
83721
83722                 var msec = transitionTime(playground, context.map().center());
83723                 if (msec) { reveal(null, null, { duration: 0 }); }
83724                 context.map().centerZoomEase(playground, 19, msec);
83725
83726                 timeout(function() {
83727                     var tooltip = reveal('button.add-area',
83728                         t('intro.areas.add_playground', { button: icon('#iD-icon-area', 'pre-text') }));
83729
83730                     tooltip.selectAll('.tooltip-inner')
83731                         .insert('svg', 'span')
83732                         .attr('class', 'tooltip-illustration')
83733                         .append('use')
83734                         .attr('xlink:href', '#iD-graphic-areas');
83735
83736                     context.on('enter.intro', function(mode) {
83737                         if (mode.id !== 'add-area') return;
83738                         continueTo(startPlayground);
83739                     });
83740                 }, msec + 100);
83741
83742                 function continueTo(nextStep) {
83743                     context.on('enter.intro', null);
83744                     nextStep();
83745                 }
83746             }
83747
83748
83749             function startPlayground() {
83750                 if (context.mode().id !== 'add-area') {
83751                     return chapter.restart();
83752                 }
83753
83754                 _areaID = null;
83755                 context.map().zoomEase(19.5, 500);
83756
83757                 timeout(function() {
83758                     revealPlayground(playground,
83759                         t('intro.areas.start_playground'), { duration: 250 }
83760                     );
83761
83762                     timeout(function() {
83763                         context.map().on('move.intro drawn.intro', function() {
83764                             revealPlayground(playground,
83765                                 t('intro.areas.start_playground'), { duration: 0 }
83766                             );
83767                         });
83768                         context.on('enter.intro', function(mode) {
83769                             if (mode.id !== 'draw-area') return chapter.restart();
83770                             continueTo(continuePlayground);
83771                         });
83772                     }, 250);  // after reveal
83773
83774                 }, 550);  // after easing
83775
83776                 function continueTo(nextStep) {
83777                     context.map().on('move.intro drawn.intro', null);
83778                     context.on('enter.intro', null);
83779                     nextStep();
83780                 }
83781             }
83782
83783
83784             function continuePlayground() {
83785                 if (context.mode().id !== 'draw-area') {
83786                     return chapter.restart();
83787                 }
83788
83789                 _areaID = null;
83790                 revealPlayground(playground,
83791                     t('intro.areas.continue_playground', { alt: uiCmd.display('⌥') }),
83792                     { duration: 250 }
83793                 );
83794
83795                 timeout(function() {
83796                     context.map().on('move.intro drawn.intro', function() {
83797                         revealPlayground(playground,
83798                             t('intro.areas.continue_playground', { alt: uiCmd.display('⌥') }),
83799                             { duration: 0 }
83800                         );
83801                     });
83802                 }, 250);  // after reveal
83803
83804                 context.on('enter.intro', function(mode) {
83805                     if (mode.id === 'draw-area') {
83806                         var entity = context.hasEntity(context.selectedIDs()[0]);
83807                         if (entity && entity.nodes.length >= 6) {
83808                             return continueTo(finishPlayground);
83809                         } else {
83810                             return;
83811                         }
83812                     } else if (mode.id === 'select') {
83813                         _areaID = context.selectedIDs()[0];
83814                         return continueTo(searchPresets);
83815                     } else {
83816                         return chapter.restart();
83817                     }
83818                 });
83819
83820                 function continueTo(nextStep) {
83821                     context.map().on('move.intro drawn.intro', null);
83822                     context.on('enter.intro', null);
83823                     nextStep();
83824                 }
83825             }
83826
83827
83828             function finishPlayground() {
83829                 if (context.mode().id !== 'draw-area') {
83830                     return chapter.restart();
83831                 }
83832
83833                 _areaID = null;
83834                 revealPlayground(playground,
83835                     t('intro.areas.finish_playground'), { duration: 250 }
83836                 );
83837
83838                 timeout(function() {
83839                     context.map().on('move.intro drawn.intro', function() {
83840                         revealPlayground(playground,
83841                             t('intro.areas.finish_playground'), { duration: 0 }
83842                         );
83843                     });
83844                 }, 250);  // after reveal
83845
83846                 context.on('enter.intro', function(mode) {
83847                     if (mode.id === 'draw-area') {
83848                         return;
83849                     } else if (mode.id === 'select') {
83850                         _areaID = context.selectedIDs()[0];
83851                         return continueTo(searchPresets);
83852                     } else {
83853                         return chapter.restart();
83854                     }
83855                 });
83856
83857                 function continueTo(nextStep) {
83858                     context.map().on('move.intro drawn.intro', null);
83859                     context.on('enter.intro', null);
83860                     nextStep();
83861                 }
83862             }
83863
83864
83865             function searchPresets() {
83866                 if (!_areaID || !context.hasEntity(_areaID)) {
83867                     return addArea();
83868                 }
83869                 var ids = context.selectedIDs();
83870                 if (context.mode().id !== 'select' || !ids.length || ids[0] !== _areaID) {
83871                     context.enter(modeSelect(context, [_areaID]));
83872                 }
83873
83874                 // disallow scrolling
83875                 d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
83876
83877                 timeout(function() {
83878                     // reset pane, in case user somehow happened to change it..
83879                     d3_select('.inspector-wrap .panewrap').style('right', '-100%');
83880
83881                     d3_select('.preset-search-input')
83882                         .on('keydown.intro', null)
83883                         .on('keyup.intro', checkPresetSearch);
83884
83885                     reveal('.preset-search-input',
83886                         t('intro.areas.search_playground', { preset: playgroundPreset.name() })
83887                     );
83888                 }, 400);  // after preset list pane visible..
83889
83890                 context.on('enter.intro', function(mode) {
83891                     if (!_areaID || !context.hasEntity(_areaID)) {
83892                         return continueTo(addArea);
83893                     }
83894
83895                     var ids = context.selectedIDs();
83896                     if (mode.id !== 'select' || !ids.length || ids[0] !== _areaID) {
83897                         // keep the user's area selected..
83898                         context.enter(modeSelect(context, [_areaID]));
83899
83900                         // reset pane, in case user somehow happened to change it..
83901                         d3_select('.inspector-wrap .panewrap').style('right', '-100%');
83902                         // disallow scrolling
83903                         d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
83904
83905                         d3_select('.preset-search-input')
83906                             .on('keydown.intro', null)
83907                             .on('keyup.intro', checkPresetSearch);
83908
83909                         reveal('.preset-search-input',
83910                             t('intro.areas.search_playground', { preset: playgroundPreset.name() })
83911                         );
83912
83913                         context.history().on('change.intro', null);
83914                     }
83915                 });
83916
83917                 function checkPresetSearch() {
83918                     var first = d3_select('.preset-list-item:first-child');
83919
83920                     if (first.classed('preset-leisure-playground')) {
83921                         reveal(first.select('.preset-list-button').node(),
83922                             t('intro.areas.choose_playground', { preset: playgroundPreset.name() }),
83923                             { duration: 300 }
83924                         );
83925
83926                         d3_select('.preset-search-input')
83927                             .on('keydown.intro', eventCancel, true)
83928                             .on('keyup.intro', null);
83929
83930                         context.history().on('change.intro', function() {
83931                             continueTo(clickAddField);
83932                         });
83933                     }
83934                 }
83935
83936                 function continueTo(nextStep) {
83937                     d3_select('.inspector-wrap').on('wheel.intro', null);
83938                     context.on('enter.intro', null);
83939                     context.history().on('change.intro', null);
83940                     d3_select('.preset-search-input').on('keydown.intro keyup.intro', null);
83941                     nextStep();
83942                 }
83943             }
83944
83945
83946             function clickAddField() {
83947                 if (!_areaID || !context.hasEntity(_areaID)) {
83948                     return addArea();
83949                 }
83950                 var ids = context.selectedIDs();
83951                 if (context.mode().id !== 'select' || !ids.length || ids[0] !== _areaID) {
83952                     return searchPresets();
83953                 }
83954
83955                 if (!d3_select('.form-field-description').empty()) {
83956                     return continueTo(describePlayground);
83957                 }
83958
83959                 // disallow scrolling
83960                 d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
83961
83962                 timeout(function() {
83963                     // reset pane, in case user somehow happened to change it..
83964                     d3_select('.inspector-wrap .panewrap').style('right', '0%');
83965
83966                     // It's possible for the user to add a description in a previous step..
83967                     // If they did this already, just continue to next step.
83968                     var entity = context.entity(_areaID);
83969                     if (entity.tags.description) {
83970                         return continueTo(play);
83971                     }
83972
83973                     // scroll "Add field" into view
83974                     var box = d3_select('.more-fields').node().getBoundingClientRect();
83975                     if (box.top > 300) {
83976                         var pane = d3_select('.entity-editor-pane .inspector-body');
83977                         var start = pane.node().scrollTop;
83978                         var end = start + (box.top - 300);
83979
83980                         pane
83981                             .transition()
83982                             .duration(250)
83983                             .tween('scroll.inspector', function() {
83984                                 var node = this;
83985                                 var i = d3_interpolateNumber(start, end);
83986                                 return function(t) {
83987                                     node.scrollTop = i(t);
83988                                 };
83989                             });
83990                     }
83991
83992                     timeout(function() {
83993                         reveal('.more-fields .combobox-input',
83994                             t('intro.areas.add_field'),
83995                             { duration: 300 }
83996                         );
83997
83998                         d3_select('.more-fields .combobox-input')
83999                             .on('click.intro', function() {
84000                                 // Watch for the combobox to appear...
84001                                 var watcher;
84002                                 watcher = window.setInterval(function() {
84003                                     if (!d3_select('div.combobox').empty()) {
84004                                         window.clearInterval(watcher);
84005                                         continueTo(chooseDescriptionField);
84006                                     }
84007                                 }, 300);
84008                             });
84009                     }, 300);  // after "Add Field" visible
84010
84011                 }, 400);  // after editor pane visible
84012
84013                 context.on('exit.intro', function() {
84014                     return continueTo(searchPresets);
84015                 });
84016
84017                 function continueTo(nextStep) {
84018                     d3_select('.inspector-wrap').on('wheel.intro', null);
84019                     d3_select('.more-fields .combobox-input').on('click.intro', null);
84020                     context.on('exit.intro', null);
84021                     nextStep();
84022                 }
84023             }
84024
84025
84026             function chooseDescriptionField() {
84027                 if (!_areaID || !context.hasEntity(_areaID)) {
84028                     return addArea();
84029                 }
84030                 var ids = context.selectedIDs();
84031                 if (context.mode().id !== 'select' || !ids.length || ids[0] !== _areaID) {
84032                     return searchPresets();
84033                 }
84034
84035                 if (!d3_select('.form-field-description').empty()) {
84036                     return continueTo(describePlayground);
84037                 }
84038
84039                 // Make sure combobox is ready..
84040                 if (d3_select('div.combobox').empty()) {
84041                     return continueTo(clickAddField);
84042                 }
84043                 // Watch for the combobox to go away..
84044                 var watcher;
84045                 watcher = window.setInterval(function() {
84046                     if (d3_select('div.combobox').empty()) {
84047                         window.clearInterval(watcher);
84048                         timeout(function() {
84049                             if (d3_select('.form-field-description').empty()) {
84050                                 continueTo(retryChooseDescription);
84051                             } else {
84052                                 continueTo(describePlayground);
84053                             }
84054                         }, 300);  // after description field added.
84055                     }
84056                 }, 300);
84057
84058                 reveal('div.combobox',
84059                     t('intro.areas.choose_field', { field: descriptionField.label() }),
84060                     { duration: 300 }
84061                 );
84062
84063                 context.on('exit.intro', function() {
84064                     return continueTo(searchPresets);
84065                 });
84066
84067                 function continueTo(nextStep) {
84068                     if (watcher) window.clearInterval(watcher);
84069                     context.on('exit.intro', null);
84070                     nextStep();
84071                 }
84072             }
84073
84074
84075             function describePlayground() {
84076                 if (!_areaID || !context.hasEntity(_areaID)) {
84077                     return addArea();
84078                 }
84079                 var ids = context.selectedIDs();
84080                 if (context.mode().id !== 'select' || !ids.length || ids[0] !== _areaID) {
84081                     return searchPresets();
84082                 }
84083
84084                 // reset pane, in case user happened to change it..
84085                 d3_select('.inspector-wrap .panewrap').style('right', '0%');
84086
84087                 if (d3_select('.form-field-description').empty()) {
84088                     return continueTo(retryChooseDescription);
84089                 }
84090
84091                 context.on('exit.intro', function() {
84092                     continueTo(play);
84093                 });
84094
84095                 reveal('.entity-editor-pane',
84096                     t('intro.areas.describe_playground', { button: icon('#iD-icon-apply', 'pre-text') }),
84097                     { duration: 300 }
84098                 );
84099
84100                 function continueTo(nextStep) {
84101                     context.on('exit.intro', null);
84102                     nextStep();
84103                 }
84104             }
84105
84106
84107             function retryChooseDescription() {
84108                 if (!_areaID || !context.hasEntity(_areaID)) {
84109                     return addArea();
84110                 }
84111                 var ids = context.selectedIDs();
84112                 if (context.mode().id !== 'select' || !ids.length || ids[0] !== _areaID) {
84113                     return searchPresets();
84114                 }
84115
84116                 // reset pane, in case user happened to change it..
84117                 d3_select('.inspector-wrap .panewrap').style('right', '0%');
84118
84119                 reveal('.entity-editor-pane',
84120                     t('intro.areas.retry_add_field', { field: descriptionField.label() }), {
84121                     buttonText: t('intro.ok'),
84122                     buttonCallback: function() { continueTo(clickAddField); }
84123                 });
84124
84125                 context.on('exit.intro', function() {
84126                     return continueTo(searchPresets);
84127                 });
84128
84129                 function continueTo(nextStep) {
84130                     context.on('exit.intro', null);
84131                     nextStep();
84132                 }
84133             }
84134
84135
84136             function play() {
84137                 dispatch$1.call('done');
84138                 reveal('#id-container',
84139                     t('intro.areas.play', { next: t('intro.lines.title') }), {
84140                         tooltipBox: '.intro-nav-wrap .chapter-line',
84141                         buttonText: t('intro.ok'),
84142                         buttonCallback: function() { reveal('#id-container'); }
84143                     }
84144                 );
84145             }
84146
84147
84148             chapter.enter = function() {
84149                 addArea();
84150             };
84151
84152
84153             chapter.exit = function() {
84154                 timeouts.forEach(window.clearTimeout);
84155                 context.on('enter.intro exit.intro', null);
84156                 context.map().on('move.intro drawn.intro', null);
84157                 context.history().on('change.intro', null);
84158                 d3_select('.inspector-wrap').on('wheel.intro', null);
84159                 d3_select('.preset-search-input').on('keydown.intro keyup.intro', null);
84160                 d3_select('.more-fields .combobox-input').on('click.intro', null);
84161             };
84162
84163
84164             chapter.restart = function() {
84165                 chapter.exit();
84166                 chapter.enter();
84167             };
84168
84169
84170             return utilRebind(chapter, dispatch$1, 'on');
84171         }
84172
84173         function uiIntroLine(context, reveal) {
84174             var dispatch$1 = dispatch('done');
84175             var timeouts = [];
84176             var _tulipRoadID = null;
84177             var flowerRoadID = 'w646';
84178             var tulipRoadStart = [-85.6297754121684, 41.95805253325314];
84179             var tulipRoadMidpoint = [-85.62975395449628, 41.95787501510204];
84180             var tulipRoadIntersection = [-85.62974496187628, 41.95742515554585];
84181             var roadCategory = context.presets().item('category-road_minor');
84182             var residentialPreset = context.presets().item('highway/residential');
84183             var woodRoadID = 'w525';
84184             var woodRoadEndID = 'n2862';
84185             var woodRoadAddNode = [-85.62390110349587, 41.95397111462291];
84186             var woodRoadDragEndpoint = [-85.623867390213, 41.95466987786487];
84187             var woodRoadDragMidpoint = [-85.62386254803509, 41.95430395953872];
84188             var washingtonStreetID = 'w522';
84189             var twelfthAvenueID = 'w1';
84190             var eleventhAvenueEndID = 'n3550';
84191             var twelfthAvenueEndID = 'n5';
84192             var _washingtonSegmentID = null;
84193             var eleventhAvenueEnd = context.entity(eleventhAvenueEndID).loc;
84194             var twelfthAvenueEnd = context.entity(twelfthAvenueEndID).loc;
84195             var deleteLinesLoc = [-85.6219395542764, 41.95228033922477];
84196             var twelfthAvenue = [-85.62219310052491, 41.952505413152956];
84197
84198
84199             var chapter = {
84200                 title: 'intro.lines.title'
84201             };
84202
84203
84204             function timeout(f, t) {
84205                 timeouts.push(window.setTimeout(f, t));
84206             }
84207
84208
84209             function eventCancel() {
84210                 event.stopPropagation();
84211                 event.preventDefault();
84212             }
84213
84214
84215             function revealEditMenu(loc, text, options) {
84216                 var rect = context.surfaceRect();
84217                 var point = context.curtainProjection(loc);
84218                 var pad = 40;
84219                 var width = 250 + (2 * pad);
84220                 var height = 350;
84221                 var startX = rect.left + point[0];
84222                 var left = (textDirection === 'rtl') ? (startX - width + pad) : (startX - pad);
84223                 var box = {
84224                     left: left,
84225                     top: point[1] + rect.top - 60,
84226                     width: width,
84227                     height: height
84228                 };
84229                 reveal(box, text, options);
84230             }
84231
84232
84233             function addLine() {
84234                 context.enter(modeBrowse(context));
84235                 context.history().reset('initial');
84236
84237                 var msec = transitionTime(tulipRoadStart, context.map().center());
84238                 if (msec) { reveal(null, null, { duration: 0 }); }
84239                 context.map().centerZoomEase(tulipRoadStart, 18.5, msec);
84240
84241                 timeout(function() {
84242                     var tooltip = reveal('button.add-line',
84243                         t('intro.lines.add_line', { button: icon('#iD-icon-line', 'pre-text') }));
84244
84245                     tooltip.selectAll('.tooltip-inner')
84246                         .insert('svg', 'span')
84247                         .attr('class', 'tooltip-illustration')
84248                         .append('use')
84249                         .attr('xlink:href', '#iD-graphic-lines');
84250
84251                     context.on('enter.intro', function(mode) {
84252                         if (mode.id !== 'add-line') return;
84253                         continueTo(startLine);
84254                     });
84255                 }, msec + 100);
84256
84257                 function continueTo(nextStep) {
84258                     context.on('enter.intro', null);
84259                     nextStep();
84260                 }
84261             }
84262
84263
84264             function startLine() {
84265                 if (context.mode().id !== 'add-line') return chapter.restart();
84266
84267                 _tulipRoadID = null;
84268
84269                 var padding = 70 * Math.pow(2, context.map().zoom() - 18);
84270                 var box = pad$2(tulipRoadStart, padding, context);
84271                 box.height = box.height + 100;
84272                 reveal(box, t('intro.lines.start_line'));
84273
84274                 context.map().on('move.intro drawn.intro', function() {
84275                     padding = 70 * Math.pow(2, context.map().zoom() - 18);
84276                     box = pad$2(tulipRoadStart, padding, context);
84277                     box.height = box.height + 100;
84278                     reveal(box, t('intro.lines.start_line'), { duration: 0 });
84279                 });
84280
84281                 context.on('enter.intro', function(mode) {
84282                     if (mode.id !== 'draw-line') return chapter.restart();
84283                     continueTo(drawLine);
84284                 });
84285
84286                 function continueTo(nextStep) {
84287                     context.map().on('move.intro drawn.intro', null);
84288                     context.on('enter.intro', null);
84289                     nextStep();
84290                 }
84291             }
84292
84293
84294             function drawLine() {
84295                 if (context.mode().id !== 'draw-line') return chapter.restart();
84296
84297                 _tulipRoadID = context.mode().selectedIDs()[0];
84298                 context.map().centerEase(tulipRoadMidpoint, 500);
84299
84300                 timeout(function() {
84301                     var padding = 200 * Math.pow(2, context.map().zoom() - 18.5);
84302                     var box = pad$2(tulipRoadMidpoint, padding, context);
84303                     box.height = box.height * 2;
84304                     reveal(box,
84305                         t('intro.lines.intersect', { name: t('intro.graph.name.flower-street') })
84306                     );
84307
84308                     context.map().on('move.intro drawn.intro', function() {
84309                         padding = 200 * Math.pow(2, context.map().zoom() - 18.5);
84310                         box = pad$2(tulipRoadMidpoint, padding, context);
84311                         box.height = box.height * 2;
84312                         reveal(box,
84313                             t('intro.lines.intersect', { name: t('intro.graph.name.flower-street') }),
84314                             { duration: 0 }
84315                         );
84316                     });
84317                 }, 550);  // after easing..
84318
84319                 context.history().on('change.intro', function() {
84320                     if (isLineConnected()) {
84321                         continueTo(continueLine);
84322                     }
84323                 });
84324
84325                 context.on('enter.intro', function(mode) {
84326                     if (mode.id === 'draw-line') {
84327                         return;
84328                     } else if (mode.id === 'select') {
84329                         continueTo(retryIntersect);
84330                         return;
84331                     } else {
84332                         return chapter.restart();
84333                     }
84334                 });
84335
84336                 function continueTo(nextStep) {
84337                     context.map().on('move.intro drawn.intro', null);
84338                     context.history().on('change.intro', null);
84339                     context.on('enter.intro', null);
84340                     nextStep();
84341                 }
84342             }
84343
84344
84345             function isLineConnected() {
84346                 var entity = _tulipRoadID && context.hasEntity(_tulipRoadID);
84347                 if (!entity) return false;
84348
84349                 var drawNodes = context.graph().childNodes(entity);
84350                 return drawNodes.some(function(node) {
84351                     return context.graph().parentWays(node).some(function(parent) {
84352                         return parent.id === flowerRoadID;
84353                     });
84354                 });
84355             }
84356
84357
84358             function retryIntersect() {
84359                 d3_select(window).on('mousedown.intro', eventCancel, true);
84360
84361                 var box = pad$2(tulipRoadIntersection, 80, context);
84362                 reveal(box,
84363                     t('intro.lines.retry_intersect', { name: t('intro.graph.name.flower-street') })
84364                 );
84365
84366                 timeout(chapter.restart, 3000);
84367             }
84368
84369
84370             function continueLine() {
84371                 if (context.mode().id !== 'draw-line') return chapter.restart();
84372                 var entity = _tulipRoadID && context.hasEntity(_tulipRoadID);
84373                 if (!entity) return chapter.restart();
84374
84375                 context.map().centerEase(tulipRoadIntersection, 500);
84376
84377                 reveal('#surface', t('intro.lines.continue_line'));
84378
84379                 context.on('enter.intro', function(mode) {
84380                     if (mode.id === 'draw-line')
84381                         return;
84382                     else if (mode.id === 'select')
84383                         return continueTo(chooseCategoryRoad);
84384                     else
84385                         return chapter.restart();
84386                 });
84387
84388                 function continueTo(nextStep) {
84389                     context.on('enter.intro', null);
84390                     nextStep();
84391                 }
84392             }
84393
84394
84395             function chooseCategoryRoad() {
84396                 if (context.mode().id !== 'select') return chapter.restart();
84397
84398                 context.on('exit.intro', function() {
84399                     return chapter.restart();
84400                 });
84401
84402                 var button = d3_select('.preset-category-road_minor .preset-list-button');
84403                 if (button.empty()) return chapter.restart();
84404
84405                 // disallow scrolling
84406                 d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
84407
84408                 timeout(function() {
84409                     // reset pane, in case user somehow happened to change it..
84410                     d3_select('.inspector-wrap .panewrap').style('right', '-100%');
84411
84412                     reveal(button.node(),
84413                         t('intro.lines.choose_category_road', { category: roadCategory.name() })
84414                     );
84415
84416                     button.on('click.intro', function() {
84417                         continueTo(choosePresetResidential);
84418                     });
84419
84420                 }, 400);  // after editor pane visible
84421
84422                 function continueTo(nextStep) {
84423                     d3_select('.inspector-wrap').on('wheel.intro', null);
84424                     d3_select('.preset-list-button').on('click.intro', null);
84425                     context.on('exit.intro', null);
84426                     nextStep();
84427                 }
84428             }
84429
84430
84431             function choosePresetResidential() {
84432                 if (context.mode().id !== 'select') return chapter.restart();
84433
84434                 context.on('exit.intro', function() {
84435                     return chapter.restart();
84436                 });
84437
84438                 var subgrid = d3_select('.preset-category-road_minor .subgrid');
84439                 if (subgrid.empty()) return chapter.restart();
84440
84441                 subgrid.selectAll(':not(.preset-highway-residential) .preset-list-button')
84442                     .on('click.intro', function() {
84443                         continueTo(retryPresetResidential);
84444                     });
84445
84446                 subgrid.selectAll('.preset-highway-residential .preset-list-button')
84447                     .on('click.intro', function() {
84448                         continueTo(nameRoad);
84449                     });
84450
84451                 timeout(function() {
84452                     reveal(subgrid.node(),
84453                         t('intro.lines.choose_preset_residential', { preset: residentialPreset.name() }),
84454                         { tooltipBox: '.preset-highway-residential .preset-list-button', duration: 300 }
84455                     );
84456                 }, 300);
84457
84458                 function continueTo(nextStep) {
84459                     d3_select('.preset-list-button').on('click.intro', null);
84460                     context.on('exit.intro', null);
84461                     nextStep();
84462                 }
84463             }
84464
84465
84466             // selected wrong road type
84467             function retryPresetResidential() {
84468                 if (context.mode().id !== 'select') return chapter.restart();
84469
84470                 context.on('exit.intro', function() {
84471                     return chapter.restart();
84472                 });
84473
84474                 // disallow scrolling
84475                 d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
84476
84477                 timeout(function() {
84478                     var button = d3_select('.entity-editor-pane .preset-list-button');
84479
84480                     reveal(button.node(),
84481                         t('intro.lines.retry_preset_residential', { preset: residentialPreset.name() })
84482                     );
84483
84484                     button.on('click.intro', function() {
84485                         continueTo(chooseCategoryRoad);
84486                     });
84487
84488                 }, 500);
84489
84490                 function continueTo(nextStep) {
84491                     d3_select('.inspector-wrap').on('wheel.intro', null);
84492                     d3_select('.preset-list-button').on('click.intro', null);
84493                     context.on('exit.intro', null);
84494                     nextStep();
84495                 }
84496             }
84497
84498
84499             function nameRoad() {
84500                 context.on('exit.intro', function() {
84501                     continueTo(didNameRoad);
84502                 });
84503
84504                 timeout(function() {
84505                     reveal('.entity-editor-pane',
84506                         t('intro.lines.name_road', { button: icon('#iD-icon-apply', 'pre-text') }),
84507                         { tooltipClass: 'intro-lines-name_road' }
84508                     );
84509                 }, 500);
84510
84511                 function continueTo(nextStep) {
84512                     context.on('exit.intro', null);
84513                     nextStep();
84514                 }
84515             }
84516
84517
84518             function didNameRoad() {
84519                 context.history().checkpoint('doneAddLine');
84520
84521                 timeout(function() {
84522                     reveal('#surface', t('intro.lines.did_name_road'), {
84523                         buttonText: t('intro.ok'),
84524                         buttonCallback: function() { continueTo(updateLine); }
84525                     });
84526                 }, 500);
84527
84528                 function continueTo(nextStep) {
84529                     nextStep();
84530                 }
84531             }
84532
84533
84534             function updateLine() {
84535                 context.history().reset('doneAddLine');
84536                 if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) {
84537                     return chapter.restart();
84538                 }
84539
84540                 var msec = transitionTime(woodRoadDragMidpoint, context.map().center());
84541                 if (msec) { reveal(null, null, { duration: 0 }); }
84542                 context.map().centerZoomEase(woodRoadDragMidpoint, 19, msec);
84543
84544                 timeout(function() {
84545                     var padding = 250 * Math.pow(2, context.map().zoom() - 19);
84546                     var box = pad$2(woodRoadDragMidpoint, padding, context);
84547                     var advance = function() { continueTo(addNode); };
84548
84549                     reveal(box, t('intro.lines.update_line'),
84550                         { buttonText: t('intro.ok'), buttonCallback: advance }
84551                     );
84552
84553                     context.map().on('move.intro drawn.intro', function() {
84554                         var padding = 250 * Math.pow(2, context.map().zoom() - 19);
84555                         var box = pad$2(woodRoadDragMidpoint, padding, context);
84556                         reveal(box, t('intro.lines.update_line'),
84557                             { duration: 0, buttonText: t('intro.ok'), buttonCallback: advance }
84558                         );
84559                     });
84560                 }, msec + 100);
84561
84562                 function continueTo(nextStep) {
84563                     context.map().on('move.intro drawn.intro', null);
84564                     nextStep();
84565                 }
84566             }
84567
84568
84569             function addNode() {
84570                 context.history().reset('doneAddLine');
84571                 if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) {
84572                     return chapter.restart();
84573                 }
84574
84575                 var padding = 40 * Math.pow(2, context.map().zoom() - 19);
84576                 var box = pad$2(woodRoadAddNode, padding, context);
84577                 reveal(box, t('intro.lines.add_node'));
84578
84579                 context.map().on('move.intro drawn.intro', function() {
84580                     var padding = 40 * Math.pow(2, context.map().zoom() - 19);
84581                     var box = pad$2(woodRoadAddNode, padding, context);
84582                     reveal(box, t('intro.lines.add_node'), { duration: 0 });
84583                 });
84584
84585                 context.history().on('change.intro', function(changed) {
84586                     if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) {
84587                         return continueTo(updateLine);
84588                     }
84589                     if (changed.created().length === 1) {
84590                         timeout(function() { continueTo(startDragEndpoint); }, 500);
84591                     }
84592                 });
84593
84594                 context.on('enter.intro', function(mode) {
84595                     if (mode.id !== 'select') {
84596                         continueTo(updateLine);
84597                     }
84598                 });
84599
84600                 function continueTo(nextStep) {
84601                     context.map().on('move.intro drawn.intro', null);
84602                     context.history().on('change.intro', null);
84603                     context.on('enter.intro', null);
84604                     nextStep();
84605                 }
84606             }
84607
84608
84609             function startDragEndpoint() {
84610                 if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) {
84611                     return continueTo(updateLine);
84612                 }
84613                 var padding = 100 * Math.pow(2, context.map().zoom() - 19);
84614                 var box = pad$2(woodRoadDragEndpoint, padding, context);
84615                 reveal(box, t('intro.lines.start_drag_endpoint'));
84616
84617                 context.map().on('move.intro drawn.intro', function() {
84618                     if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) {
84619                         return continueTo(updateLine);
84620                     }
84621                     var padding = 100 * Math.pow(2, context.map().zoom() - 19);
84622                     var box = pad$2(woodRoadDragEndpoint, padding, context);
84623                     reveal(box, t('intro.lines.start_drag_endpoint'), { duration: 0 });
84624
84625                     var entity = context.entity(woodRoadEndID);
84626                     if (geoSphericalDistance(entity.loc, woodRoadDragEndpoint) <= 4) {
84627                         continueTo(finishDragEndpoint);
84628                     }
84629                 });
84630
84631                 function continueTo(nextStep) {
84632                     context.map().on('move.intro drawn.intro', null);
84633                     nextStep();
84634                 }
84635             }
84636
84637
84638             function finishDragEndpoint() {
84639                 if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) {
84640                     return continueTo(updateLine);
84641                 }
84642
84643                 var padding = 100 * Math.pow(2, context.map().zoom() - 19);
84644                 var box = pad$2(woodRoadDragEndpoint, padding, context);
84645                 reveal(box, t('intro.lines.finish_drag_endpoint'));
84646
84647                 context.map().on('move.intro drawn.intro', function() {
84648                     if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) {
84649                         return continueTo(updateLine);
84650                     }
84651                     var padding = 100 * Math.pow(2, context.map().zoom() - 19);
84652                     var box = pad$2(woodRoadDragEndpoint, padding, context);
84653                     reveal(box, t('intro.lines.finish_drag_endpoint'), { duration: 0 });
84654
84655                     var entity = context.entity(woodRoadEndID);
84656                     if (geoSphericalDistance(entity.loc, woodRoadDragEndpoint) > 4) {
84657                         continueTo(startDragEndpoint);
84658                     }
84659                 });
84660
84661                 context.on('enter.intro', function() {
84662                     continueTo(startDragMidpoint);
84663                 });
84664
84665                 function continueTo(nextStep) {
84666                     context.map().on('move.intro drawn.intro', null);
84667                     context.on('enter.intro', null);
84668                     nextStep();
84669                 }
84670             }
84671
84672
84673             function startDragMidpoint() {
84674                 if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) {
84675                     return continueTo(updateLine);
84676                 }
84677                 if (context.selectedIDs().indexOf(woodRoadID) === -1) {
84678                     context.enter(modeSelect(context, [woodRoadID]));
84679                 }
84680
84681                 var padding = 80 * Math.pow(2, context.map().zoom() - 19);
84682                 var box = pad$2(woodRoadDragMidpoint, padding, context);
84683                 reveal(box, t('intro.lines.start_drag_midpoint'));
84684
84685                 context.map().on('move.intro drawn.intro', function() {
84686                     if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) {
84687                         return continueTo(updateLine);
84688                     }
84689                     var padding = 80 * Math.pow(2, context.map().zoom() - 19);
84690                     var box = pad$2(woodRoadDragMidpoint, padding, context);
84691                     reveal(box, t('intro.lines.start_drag_midpoint'), { duration: 0 });
84692                 });
84693
84694                 context.history().on('change.intro', function(changed) {
84695                     if (changed.created().length === 1) {
84696                         continueTo(continueDragMidpoint);
84697                     }
84698                 });
84699
84700                 context.on('enter.intro', function(mode) {
84701                     if (mode.id !== 'select') {
84702                         // keep Wood Road selected so midpoint triangles are drawn..
84703                         context.enter(modeSelect(context, [woodRoadID]));
84704                     }
84705                 });
84706
84707                 function continueTo(nextStep) {
84708                     context.map().on('move.intro drawn.intro', null);
84709                     context.history().on('change.intro', null);
84710                     context.on('enter.intro', null);
84711                     nextStep();
84712                 }
84713             }
84714
84715
84716             function continueDragMidpoint() {
84717                 if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) {
84718                     return continueTo(updateLine);
84719                 }
84720
84721                 var padding = 100 * Math.pow(2, context.map().zoom() - 19);
84722                 var box = pad$2(woodRoadDragEndpoint, padding, context);
84723                 box.height += 400;
84724
84725                 var advance = function() {
84726                     context.history().checkpoint('doneUpdateLine');
84727                     continueTo(deleteLines);
84728                 };
84729
84730                 reveal(box, t('intro.lines.continue_drag_midpoint'),
84731                     { buttonText: t('intro.ok'), buttonCallback: advance }
84732                 );
84733
84734                 context.map().on('move.intro drawn.intro', function() {
84735                     if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) {
84736                         return continueTo(updateLine);
84737                     }
84738                     var padding = 100 * Math.pow(2, context.map().zoom() - 19);
84739                     var box = pad$2(woodRoadDragEndpoint, padding, context);
84740                     box.height += 400;
84741                     reveal(box, t('intro.lines.continue_drag_midpoint'),
84742                         { duration: 0, buttonText: t('intro.ok'), buttonCallback: advance }
84743                     );
84744                 });
84745
84746                 function continueTo(nextStep) {
84747                     context.map().on('move.intro drawn.intro', null);
84748                     nextStep();
84749                 }
84750             }
84751
84752
84753             function deleteLines() {
84754                 context.history().reset('doneUpdateLine');
84755                 context.enter(modeBrowse(context));
84756
84757                 if (!context.hasEntity(washingtonStreetID) ||
84758                     !context.hasEntity(twelfthAvenueID) ||
84759                     !context.hasEntity(eleventhAvenueEndID)) {
84760                     return chapter.restart();
84761                 }
84762
84763                 var msec = transitionTime(deleteLinesLoc, context.map().center());
84764                 if (msec) { reveal(null, null, { duration: 0 }); }
84765                 context.map().centerZoomEase(deleteLinesLoc, 18, msec);
84766
84767                 timeout(function() {
84768                     var padding = 200 * Math.pow(2, context.map().zoom() - 18);
84769                     var box = pad$2(deleteLinesLoc, padding, context);
84770                     box.top -= 200;
84771                     box.height += 400;
84772                     var advance = function() { continueTo(rightClickIntersection); };
84773
84774                     reveal(box, t('intro.lines.delete_lines', { street: t('intro.graph.name.12th-avenue') }),
84775                         { buttonText: t('intro.ok'), buttonCallback: advance }
84776                     );
84777
84778                     context.map().on('move.intro drawn.intro', function() {
84779                         var padding = 200 * Math.pow(2, context.map().zoom() - 18);
84780                         var box = pad$2(deleteLinesLoc, padding, context);
84781                         box.top -= 200;
84782                         box.height += 400;
84783                         reveal(box, t('intro.lines.delete_lines', { street: t('intro.graph.name.12th-avenue') }),
84784                             { duration: 0, buttonText: t('intro.ok'), buttonCallback: advance }
84785                         );
84786                     });
84787
84788                     context.history().on('change.intro', function() {
84789                         timeout(function() {
84790                             continueTo(deleteLines);
84791                         }, 500);  // after any transition (e.g. if user deleted intersection)
84792                     });
84793
84794                 }, msec + 100);
84795
84796                 function continueTo(nextStep) {
84797                     context.map().on('move.intro drawn.intro', null);
84798                     context.history().on('change.intro', null);
84799                     nextStep();
84800                 }
84801             }
84802
84803
84804             function rightClickIntersection() {
84805                 context.history().reset('doneUpdateLine');
84806                 context.enter(modeBrowse(context));
84807
84808                 context.map().centerZoomEase(eleventhAvenueEnd, 18, 500);
84809
84810                 timeout(function() {
84811                     var padding = 60 * Math.pow(2, context.map().zoom() - 18);
84812                     var box = pad$2(eleventhAvenueEnd, padding, context);
84813                     reveal(box, t('intro.lines.rightclick_intersection',
84814                         { street1: t('intro.graph.name.11th-avenue'), street2: t('intro.graph.name.washington-street') })
84815                     );
84816
84817                     context.map().on('move.intro drawn.intro', function() {
84818                         var padding = 60 * Math.pow(2, context.map().zoom() - 18);
84819                         var box = pad$2(eleventhAvenueEnd, padding, context);
84820                         reveal(box, t('intro.lines.rightclick_intersection',
84821                             { street1: t('intro.graph.name.11th-avenue'), street2: t('intro.graph.name.washington-street') }),
84822                             { duration: 0 }
84823                         );
84824                     });
84825
84826                     context.on('enter.intro', function(mode) {
84827                         if (mode.id !== 'select') return;
84828                         var ids = context.selectedIDs();
84829                         if (ids.length !== 1 || ids[0] !== eleventhAvenueEndID) return;
84830
84831                         timeout(function() {
84832                             var node = selectMenuItem('split').node();
84833                             if (!node) return;
84834                             continueTo(splitIntersection);
84835                         }, 300);  // after menu visible
84836                     });
84837
84838                     context.history().on('change.intro', function() {
84839                         timeout(function() {
84840                             continueTo(deleteLines);
84841                         }, 300);  // after any transition (e.g. if user deleted intersection)
84842                     });
84843
84844                 }, 600);
84845
84846                 function continueTo(nextStep) {
84847                     context.map().on('move.intro drawn.intro', null);
84848                     context.on('enter.intro', null);
84849                     context.history().on('change.intro', null);
84850                     nextStep();
84851                 }
84852             }
84853
84854
84855             function splitIntersection() {
84856                 if (!context.hasEntity(washingtonStreetID) ||
84857                     !context.hasEntity(twelfthAvenueID) ||
84858                     !context.hasEntity(eleventhAvenueEndID)) {
84859                     return continueTo(deleteLines);
84860                 }
84861
84862                 var node = selectMenuItem('split').node();
84863                 if (!node) { return continueTo(rightClickIntersection); }
84864
84865                 var wasChanged = false;
84866                 var menuCoords = context.map().mouseCoordinates();
84867                 _washingtonSegmentID = null;
84868
84869                 revealEditMenu(menuCoords, t('intro.lines.split_intersection',
84870                     { button: icon('#iD-operation-split', 'pre-text'), street: t('intro.graph.name.washington-street') })
84871                 );
84872
84873                 context.map().on('move.intro drawn.intro', function() {
84874                     var node = selectMenuItem('split').node();
84875                     if (!wasChanged && !node) { return continueTo(rightClickIntersection); }
84876
84877                     revealEditMenu(menuCoords, t('intro.lines.split_intersection',
84878                         { button: icon('#iD-operation-split', 'pre-text'), street: t('intro.graph.name.washington-street') }),
84879                         { duration: 0 }
84880                     );
84881                 });
84882
84883                 context.history().on('change.intro', function(changed) {
84884                     wasChanged = true;
84885                     timeout(function() {
84886                         if (context.history().undoAnnotation() === t('operations.split.annotation.line')) {
84887                             _washingtonSegmentID = changed.created()[0].id;
84888                             continueTo(didSplit);
84889                         } else {
84890                             _washingtonSegmentID = null;
84891                             continueTo(retrySplit);
84892                         }
84893                     }, 300);  // after any transition (e.g. if user deleted intersection)
84894                 });
84895
84896                 function continueTo(nextStep) {
84897                     context.map().on('move.intro drawn.intro', null);
84898                     context.history().on('change.intro', null);
84899                     nextStep();
84900                 }
84901             }
84902
84903
84904             function retrySplit() {
84905                 context.enter(modeBrowse(context));
84906                 context.map().centerZoomEase(eleventhAvenueEnd, 18, 500);
84907                 var advance = function() { continueTo(rightClickIntersection); };
84908
84909                 var padding = 60 * Math.pow(2, context.map().zoom() - 18);
84910                 var box = pad$2(eleventhAvenueEnd, padding, context);
84911                 reveal(box, t('intro.lines.retry_split'),
84912                     { buttonText: t('intro.ok'), buttonCallback: advance }
84913                 );
84914
84915                 context.map().on('move.intro drawn.intro', function() {
84916                     var padding = 60 * Math.pow(2, context.map().zoom() - 18);
84917                     var box = pad$2(eleventhAvenueEnd, padding, context);
84918                     reveal(box, t('intro.lines.retry_split'),
84919                         { duration: 0, buttonText: t('intro.ok'), buttonCallback: advance }
84920                     );
84921                 });
84922
84923                 function continueTo(nextStep) {
84924                     context.map().on('move.intro drawn.intro', null);
84925                     nextStep();
84926                 }
84927             }
84928
84929
84930             function didSplit() {
84931                 if (!_washingtonSegmentID ||
84932                     !context.hasEntity(_washingtonSegmentID) ||
84933                     !context.hasEntity(washingtonStreetID) ||
84934                     !context.hasEntity(twelfthAvenueID) ||
84935                     !context.hasEntity(eleventhAvenueEndID)) {
84936                     return continueTo(rightClickIntersection);
84937                 }
84938
84939                 var ids = context.selectedIDs();
84940                 var string = 'intro.lines.did_split_' + (ids.length > 1 ? 'multi' : 'single');
84941                 var street = t('intro.graph.name.washington-street');
84942
84943                 var padding = 200 * Math.pow(2, context.map().zoom() - 18);
84944                 var box = pad$2(twelfthAvenue, padding, context);
84945                 box.width = box.width / 2;
84946                 reveal(box, t(string, { street1: street, street2: street }),
84947                     { duration: 500 }
84948                 );
84949
84950                 timeout(function() {
84951                     context.map().centerZoomEase(twelfthAvenue, 18, 500);
84952
84953                     context.map().on('move.intro drawn.intro', function() {
84954                         var padding = 200 * Math.pow(2, context.map().zoom() - 18);
84955                         var box = pad$2(twelfthAvenue, padding, context);
84956                         box.width = box.width / 2;
84957                         reveal(box, t(string, { street1: street, street2: street }),
84958                             { duration: 0 }
84959                         );
84960                     });
84961                 }, 600);  // after initial reveal and curtain cut
84962
84963                 context.on('enter.intro', function() {
84964                     var ids = context.selectedIDs();
84965                     if (ids.length === 1 && ids[0] === _washingtonSegmentID) {
84966                         continueTo(multiSelect);
84967                     }
84968                 });
84969
84970                 context.history().on('change.intro', function() {
84971                     if (!_washingtonSegmentID ||
84972                         !context.hasEntity(_washingtonSegmentID) ||
84973                         !context.hasEntity(washingtonStreetID) ||
84974                         !context.hasEntity(twelfthAvenueID) ||
84975                         !context.hasEntity(eleventhAvenueEndID)) {
84976                         return continueTo(rightClickIntersection);
84977                     }
84978                 });
84979
84980                 function continueTo(nextStep) {
84981                     context.map().on('move.intro drawn.intro', null);
84982                     context.on('enter.intro', null);
84983                     context.history().on('change.intro', null);
84984                     nextStep();
84985                 }
84986             }
84987
84988
84989             function multiSelect() {
84990                 if (!_washingtonSegmentID ||
84991                     !context.hasEntity(_washingtonSegmentID) ||
84992                     !context.hasEntity(washingtonStreetID) ||
84993                     !context.hasEntity(twelfthAvenueID) ||
84994                     !context.hasEntity(eleventhAvenueEndID)) {
84995                     return continueTo(rightClickIntersection);
84996                 }
84997
84998                 var ids = context.selectedIDs();
84999                 var hasWashington = ids.indexOf(_washingtonSegmentID) !== -1;
85000                 var hasTwelfth = ids.indexOf(twelfthAvenueID) !== -1;
85001
85002                 if (hasWashington && hasTwelfth) {
85003                     return continueTo(multiRightClick);
85004                 } else if (!hasWashington && !hasTwelfth) {
85005                     return continueTo(didSplit);
85006                 }
85007
85008                 context.map().centerZoomEase(twelfthAvenue, 18, 500);
85009
85010                 timeout(function() {
85011                     var selected, other, padding, box;
85012                     if (hasWashington) {
85013                         selected = t('intro.graph.name.washington-street');
85014                         other = t('intro.graph.name.12th-avenue');
85015                         padding = 60 * Math.pow(2, context.map().zoom() - 18);
85016                         box = pad$2(twelfthAvenueEnd, padding, context);
85017                         box.width *= 3;
85018                     } else {
85019                         selected = t('intro.graph.name.12th-avenue');
85020                         other = t('intro.graph.name.washington-street');
85021                         padding = 200 * Math.pow(2, context.map().zoom() - 18);
85022                         box = pad$2(twelfthAvenue, padding, context);
85023                         box.width /= 2;
85024                     }
85025
85026                     reveal(box,
85027                         t('intro.lines.multi_select', { selected: selected, other1: other, other2: other })
85028                     );
85029
85030                     context.map().on('move.intro drawn.intro', function() {
85031                         if (hasWashington) {
85032                             selected = t('intro.graph.name.washington-street');
85033                             other = t('intro.graph.name.12th-avenue');
85034                             padding = 60 * Math.pow(2, context.map().zoom() - 18);
85035                             box = pad$2(twelfthAvenueEnd, padding, context);
85036                             box.width *= 3;
85037                         } else {
85038                             selected = t('intro.graph.name.12th-avenue');
85039                             other = t('intro.graph.name.washington-street');
85040                             padding = 200 * Math.pow(2, context.map().zoom() - 18);
85041                             box = pad$2(twelfthAvenue, padding, context);
85042                             box.width /= 2;
85043                         }
85044
85045                         reveal(box,
85046                             t('intro.lines.multi_select', { selected: selected, other1: other, other2: other }),
85047                             { duration: 0 }
85048                         );
85049                     });
85050
85051                     context.on('enter.intro', function() {
85052                         continueTo(multiSelect);
85053                     });
85054
85055                     context.history().on('change.intro', function() {
85056                         if (!_washingtonSegmentID ||
85057                             !context.hasEntity(_washingtonSegmentID) ||
85058                             !context.hasEntity(washingtonStreetID) ||
85059                             !context.hasEntity(twelfthAvenueID) ||
85060                             !context.hasEntity(eleventhAvenueEndID)) {
85061                             return continueTo(rightClickIntersection);
85062                         }
85063                     });
85064                 }, 600);
85065
85066                 function continueTo(nextStep) {
85067                     context.map().on('move.intro drawn.intro', null);
85068                     context.on('enter.intro', null);
85069                     context.history().on('change.intro', null);
85070                     nextStep();
85071                 }
85072             }
85073
85074
85075             function multiRightClick() {
85076                 if (!_washingtonSegmentID ||
85077                     !context.hasEntity(_washingtonSegmentID) ||
85078                     !context.hasEntity(washingtonStreetID) ||
85079                     !context.hasEntity(twelfthAvenueID) ||
85080                     !context.hasEntity(eleventhAvenueEndID)) {
85081                     return continueTo(rightClickIntersection);
85082                 }
85083
85084                 var padding = 200 * Math.pow(2, context.map().zoom() - 18);
85085                 var box = pad$2(twelfthAvenue, padding, context);
85086                 reveal(box, t('intro.lines.multi_rightclick'));
85087
85088                 context.map().on('move.intro drawn.intro', function() {
85089                     var padding = 200 * Math.pow(2, context.map().zoom() - 18);
85090                     var box = pad$2(twelfthAvenue, padding, context);
85091                     reveal(box, t('intro.lines.multi_rightclick'), { duration: 0 });
85092                 });
85093
85094                 d3_select(window).on('click.intro contextmenu.intro', function() {
85095                     timeout(function() {
85096                         var ids = context.selectedIDs();
85097                         if (ids.length === 2 &&
85098                             ids.indexOf(twelfthAvenueID) !== -1 &&
85099                             ids.indexOf(_washingtonSegmentID) !== -1) {
85100                                 var node = selectMenuItem('delete').node();
85101                                 if (!node) return;
85102                                 continueTo(multiDelete);
85103                         } else if (ids.length === 1 &&
85104                             ids.indexOf(_washingtonSegmentID) !== -1) {
85105                             return continueTo(multiSelect);
85106                         } else {
85107                             return continueTo(didSplit);
85108                         }
85109                     }, 300);  // after edit menu visible
85110                 }, true);
85111
85112                 context.history().on('change.intro', function() {
85113                     if (!_washingtonSegmentID ||
85114                         !context.hasEntity(_washingtonSegmentID) ||
85115                         !context.hasEntity(washingtonStreetID) ||
85116                         !context.hasEntity(twelfthAvenueID) ||
85117                         !context.hasEntity(eleventhAvenueEndID)) {
85118                         return continueTo(rightClickIntersection);
85119                     }
85120                 });
85121
85122                 function continueTo(nextStep) {
85123                     context.map().on('move.intro drawn.intro', null);
85124                     d3_select(window).on('click.intro contextmenu.intro', null, true);
85125                     context.history().on('change.intro', null);
85126                     nextStep();
85127                 }
85128             }
85129
85130
85131             function multiDelete() {
85132                 if (!_washingtonSegmentID ||
85133                     !context.hasEntity(_washingtonSegmentID) ||
85134                     !context.hasEntity(washingtonStreetID) ||
85135                     !context.hasEntity(twelfthAvenueID) ||
85136                     !context.hasEntity(eleventhAvenueEndID)) {
85137                     return continueTo(rightClickIntersection);
85138                 }
85139
85140                 var node = selectMenuItem('delete').node();
85141                 if (!node) return continueTo(multiRightClick);
85142
85143                 var menuCoords = context.map().mouseCoordinates();
85144                 revealEditMenu(menuCoords,
85145                     t('intro.lines.multi_delete', { button: icon('#iD-operation-delete', 'pre-text') })
85146                 );
85147
85148                 context.map().on('move.intro drawn.intro', function() {
85149                     revealEditMenu(menuCoords,
85150                         t('intro.lines.multi_delete', { button: icon('#iD-operation-delete', 'pre-text') }),
85151                         { duration: 0 }
85152                     );
85153                 });
85154
85155                 context.on('exit.intro', function() {
85156                     if (context.hasEntity(_washingtonSegmentID) || context.hasEntity(twelfthAvenueID)) {
85157                         return continueTo(multiSelect);  // left select mode but roads still exist
85158                     }
85159                 });
85160
85161                 context.history().on('change.intro', function() {
85162                     if (context.hasEntity(_washingtonSegmentID) || context.hasEntity(twelfthAvenueID)) {
85163                         continueTo(retryDelete);         // changed something but roads still exist
85164                     } else {
85165                         continueTo(play);
85166                     }
85167                 });
85168
85169                 function continueTo(nextStep) {
85170                     context.map().on('move.intro drawn.intro', null);
85171                     context.on('exit.intro', null);
85172                     context.history().on('change.intro', null);
85173                     nextStep();
85174                 }
85175             }
85176
85177
85178             function retryDelete() {
85179                 context.enter(modeBrowse(context));
85180
85181                 var padding = 200 * Math.pow(2, context.map().zoom() - 18);
85182                 var box = pad$2(twelfthAvenue, padding, context);
85183                 reveal(box, t('intro.lines.retry_delete'), {
85184                     buttonText: t('intro.ok'),
85185                     buttonCallback: function() { continueTo(multiSelect); }
85186                 });
85187
85188                 function continueTo(nextStep) {
85189                     nextStep();
85190                 }
85191             }
85192
85193
85194             function play() {
85195                 dispatch$1.call('done');
85196                 reveal('#id-container',
85197                     t('intro.lines.play', { next: t('intro.buildings.title') }), {
85198                         tooltipBox: '.intro-nav-wrap .chapter-building',
85199                         buttonText: t('intro.ok'),
85200                         buttonCallback: function() { reveal('#id-container'); }
85201                     }
85202                 );
85203            }
85204
85205
85206             chapter.enter = function() {
85207                 addLine();
85208             };
85209
85210
85211             chapter.exit = function() {
85212                 timeouts.forEach(window.clearTimeout);
85213                 d3_select(window).on('mousedown.intro', null, true);
85214                 context.on('enter.intro exit.intro', null);
85215                 context.map().on('move.intro drawn.intro', null);
85216                 context.history().on('change.intro', null);
85217                 d3_select('.inspector-wrap').on('wheel.intro', null);
85218                 d3_select('.preset-list-button').on('click.intro', null);
85219             };
85220
85221
85222             chapter.restart = function() {
85223                 chapter.exit();
85224                 chapter.enter();
85225             };
85226
85227
85228             return utilRebind(chapter, dispatch$1, 'on');
85229         }
85230
85231         function uiIntroBuilding(context, reveal) {
85232             var dispatch$1 = dispatch('done');
85233             var house = [-85.62815, 41.95638];
85234             var tank = [-85.62732, 41.95347];
85235             var buildingCatetory = context.presets().item('category-building');
85236             var housePreset = context.presets().item('building/house');
85237             var tankPreset = context.presets().item('man_made/storage_tank');
85238             var timeouts = [];
85239             var _houseID = null;
85240             var _tankID = null;
85241
85242
85243             var chapter = {
85244                 title: 'intro.buildings.title'
85245             };
85246
85247
85248             function timeout(f, t) {
85249                 timeouts.push(window.setTimeout(f, t));
85250             }
85251
85252
85253             function eventCancel() {
85254                 event.stopPropagation();
85255                 event.preventDefault();
85256             }
85257
85258
85259             function revealHouse(center, text, options) {
85260                 var padding = 160 * Math.pow(2, context.map().zoom() - 20);
85261                 var box = pad$2(center, padding, context);
85262                 reveal(box, text, options);
85263             }
85264
85265
85266             function revealTank(center, text, options) {
85267                 var padding = 190 * Math.pow(2, context.map().zoom() - 19.5);
85268                 var box = pad$2(center, padding, context);
85269                 reveal(box, text, options);
85270             }
85271
85272
85273             function revealEditMenu(loc, text, options) {
85274                 var rect = context.surfaceRect();
85275                 var point = context.curtainProjection(loc);
85276                 var pad = 40;
85277                 var width = 250 + (2 * pad);
85278                 var height = 350;
85279                 var startX = rect.left + point[0];
85280                 var left = (textDirection === 'rtl') ? (startX - width + pad) : (startX - pad);
85281                 var box = {
85282                     left: left,
85283                     top: point[1] + rect.top - 60,
85284                     width: width,
85285                     height: height
85286                 };
85287                 reveal(box, text, options);
85288             }
85289
85290
85291             function addHouse() {
85292                 context.enter(modeBrowse(context));
85293                 context.history().reset('initial');
85294                 _houseID = null;
85295
85296                 var msec = transitionTime(house, context.map().center());
85297                 if (msec) { reveal(null, null, { duration: 0 }); }
85298                 context.map().centerZoomEase(house, 19, msec);
85299
85300                 timeout(function() {
85301                     var tooltip = reveal('button.add-area',
85302                         t('intro.buildings.add_building', { button: icon('#iD-icon-area', 'pre-text') }));
85303
85304                     tooltip.selectAll('.tooltip-inner')
85305                         .insert('svg', 'span')
85306                         .attr('class', 'tooltip-illustration')
85307                         .append('use')
85308                         .attr('xlink:href', '#iD-graphic-buildings');
85309
85310                     context.on('enter.intro', function(mode) {
85311                         if (mode.id !== 'add-area') return;
85312                         continueTo(startHouse);
85313                     });
85314                 }, msec + 100);
85315
85316                 function continueTo(nextStep) {
85317                     context.on('enter.intro', null);
85318                     nextStep();
85319                 }
85320             }
85321
85322
85323             function startHouse() {
85324                 if (context.mode().id !== 'add-area') {
85325                     return continueTo(addHouse);
85326                 }
85327
85328                 _houseID = null;
85329                 context.map().zoomEase(20, 500);
85330
85331                 timeout(function() {
85332                     revealHouse(house, t('intro.buildings.start_building'));
85333
85334                     context.map().on('move.intro drawn.intro', function() {
85335                         revealHouse(house, t('intro.buildings.start_building'), { duration: 0 });
85336                     });
85337
85338                     context.on('enter.intro', function(mode) {
85339                         if (mode.id !== 'draw-area') return chapter.restart();
85340                         continueTo(continueHouse);
85341                     });
85342
85343                 }, 550);  // after easing
85344
85345                 function continueTo(nextStep) {
85346                     context.map().on('move.intro drawn.intro', null);
85347                     context.on('enter.intro', null);
85348                     nextStep();
85349                 }
85350             }
85351
85352
85353             function continueHouse() {
85354                 if (context.mode().id !== 'draw-area') {
85355                     return continueTo(addHouse);
85356                 }
85357
85358                 _houseID = null;
85359
85360                 revealHouse(house, t('intro.buildings.continue_building'));
85361
85362                 context.map().on('move.intro drawn.intro', function() {
85363                     revealHouse(house, t('intro.buildings.continue_building'), { duration: 0 });
85364                 });
85365
85366                 context.on('enter.intro', function(mode) {
85367                     if (mode.id === 'draw-area') {
85368                         return;
85369                     } else if (mode.id === 'select') {
85370                         var graph = context.graph();
85371                         var way = context.entity(context.selectedIDs()[0]);
85372                         var nodes = graph.childNodes(way);
85373                         var points = utilArrayUniq(nodes)
85374                             .map(function(n) { return context.projection(n.loc); });
85375
85376                         if (isMostlySquare(points)) {
85377                             _houseID = way.id;
85378                             return continueTo(chooseCategoryBuilding);
85379                         } else {
85380                             return continueTo(retryHouse);
85381                         }
85382
85383                     } else {
85384                         return chapter.restart();
85385                     }
85386                 });
85387
85388                 function continueTo(nextStep) {
85389                     context.map().on('move.intro drawn.intro', null);
85390                     context.on('enter.intro', null);
85391                     nextStep();
85392                 }
85393             }
85394
85395
85396             function retryHouse() {
85397                 var onClick = function() { continueTo(addHouse); };
85398
85399                 revealHouse(house, t('intro.buildings.retry_building'),
85400                     { buttonText: t('intro.ok'), buttonCallback: onClick }
85401                 );
85402
85403                 context.map().on('move.intro drawn.intro', function() {
85404                     revealHouse(house, t('intro.buildings.retry_building'),
85405                         { duration: 0, buttonText: t('intro.ok'), buttonCallback: onClick }
85406                     );
85407                 });
85408
85409                 function continueTo(nextStep) {
85410                     context.map().on('move.intro drawn.intro', null);
85411                     nextStep();
85412                 }
85413             }
85414
85415
85416             function chooseCategoryBuilding() {
85417                 if (!_houseID || !context.hasEntity(_houseID)) {
85418                     return addHouse();
85419                 }
85420                 var ids = context.selectedIDs();
85421                 if (context.mode().id !== 'select' || !ids.length || ids[0] !== _houseID) {
85422                     context.enter(modeSelect(context, [_houseID]));
85423                 }
85424
85425                 // disallow scrolling
85426                 d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
85427
85428                 timeout(function() {
85429                     // reset pane, in case user somehow happened to change it..
85430                     d3_select('.inspector-wrap .panewrap').style('right', '-100%');
85431
85432                     var button = d3_select('.preset-category-building .preset-list-button');
85433
85434                     reveal(button.node(),
85435                         t('intro.buildings.choose_category_building', { category: buildingCatetory.name() })
85436                     );
85437
85438                     button.on('click.intro', function() {
85439                         button.on('click.intro', null);
85440                         continueTo(choosePresetHouse);
85441                     });
85442
85443                 }, 400);  // after preset list pane visible..
85444
85445
85446                 context.on('enter.intro', function(mode) {
85447                     if (!_houseID || !context.hasEntity(_houseID)) {
85448                         return continueTo(addHouse);
85449                     }
85450                     var ids = context.selectedIDs();
85451                     if (mode.id !== 'select' || !ids.length || ids[0] !== _houseID) {
85452                         return continueTo(chooseCategoryBuilding);
85453                     }
85454                 });
85455
85456                 function continueTo(nextStep) {
85457                     d3_select('.inspector-wrap').on('wheel.intro', null);
85458                     d3_select('.preset-list-button').on('click.intro', null);
85459                     context.on('enter.intro', null);
85460                     nextStep();
85461                 }
85462             }
85463
85464
85465             function choosePresetHouse() {
85466                 if (!_houseID || !context.hasEntity(_houseID)) {
85467                     return addHouse();
85468                 }
85469                 var ids = context.selectedIDs();
85470                 if (context.mode().id !== 'select' || !ids.length || ids[0] !== _houseID) {
85471                     context.enter(modeSelect(context, [_houseID]));
85472                 }
85473
85474                 // disallow scrolling
85475                 d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
85476
85477                 timeout(function() {
85478                     // reset pane, in case user somehow happened to change it..
85479                     d3_select('.inspector-wrap .panewrap').style('right', '-100%');
85480
85481                     var button = d3_select('.preset-building-house .preset-list-button');
85482
85483                     reveal(button.node(),
85484                         t('intro.buildings.choose_preset_house', { preset: housePreset.name() }),
85485                         { duration: 300 }
85486                     );
85487
85488                     button.on('click.intro', function() {
85489                         button.on('click.intro', null);
85490                         continueTo(closeEditorHouse);
85491                     });
85492
85493                 }, 400);  // after preset list pane visible..
85494
85495                 context.on('enter.intro', function(mode) {
85496                     if (!_houseID || !context.hasEntity(_houseID)) {
85497                         return continueTo(addHouse);
85498                     }
85499                     var ids = context.selectedIDs();
85500                     if (mode.id !== 'select' || !ids.length || ids[0] !== _houseID) {
85501                         return continueTo(chooseCategoryBuilding);
85502                     }
85503                 });
85504
85505                 function continueTo(nextStep) {
85506                     d3_select('.inspector-wrap').on('wheel.intro', null);
85507                     d3_select('.preset-list-button').on('click.intro', null);
85508                     context.on('enter.intro', null);
85509                     nextStep();
85510                 }
85511             }
85512
85513
85514             function closeEditorHouse() {
85515                 if (!_houseID || !context.hasEntity(_houseID)) {
85516                     return addHouse();
85517                 }
85518                 var ids = context.selectedIDs();
85519                 if (context.mode().id !== 'select' || !ids.length || ids[0] !== _houseID) {
85520                     context.enter(modeSelect(context, [_houseID]));
85521                 }
85522
85523                 context.history().checkpoint('hasHouse');
85524
85525                 context.on('exit.intro', function() {
85526                     continueTo(rightClickHouse);
85527                 });
85528
85529                 timeout(function() {
85530                     reveal('.entity-editor-pane',
85531                         t('intro.buildings.close', { button: icon('#iD-icon-apply', 'pre-text') })
85532                     );
85533                 }, 500);
85534
85535                 function continueTo(nextStep) {
85536                     context.on('exit.intro', null);
85537                     nextStep();
85538                 }
85539             }
85540
85541
85542             function rightClickHouse() {
85543                 if (!_houseID) return chapter.restart();
85544
85545                 context.enter(modeBrowse(context));
85546                 context.history().reset('hasHouse');
85547                 var zoom = context.map().zoom();
85548                 if (zoom < 20) {
85549                     zoom = 20;
85550                 }
85551                 context.map().centerZoomEase(house, zoom, 500);
85552
85553                 context.on('enter.intro', function(mode) {
85554                     if (mode.id !== 'select') return;
85555                     var ids = context.selectedIDs();
85556                     if (ids.length !== 1 || ids[0] !== _houseID) return;
85557
85558                     timeout(function() {
85559                         var node = selectMenuItem('orthogonalize').node();
85560                         if (!node) return;
85561                         continueTo(clickSquare);
85562                     }, 300);  // after menu visible
85563                 });
85564
85565                 context.map().on('move.intro drawn.intro', function() {
85566                     revealHouse(house, t('intro.buildings.rightclick_building'), { duration: 0 });
85567                 });
85568
85569                 context.history().on('change.intro', function() {
85570                     continueTo(rightClickHouse);
85571                 });
85572
85573                 function continueTo(nextStep) {
85574                     context.on('enter.intro', null);
85575                     context.map().on('move.intro drawn.intro', null);
85576                     context.history().on('change.intro', null);
85577                     nextStep();
85578                 }
85579             }
85580
85581
85582             function clickSquare() {
85583                 if (!_houseID) return chapter.restart();
85584                 var entity = context.hasEntity(_houseID);
85585                 if (!entity) return continueTo(rightClickHouse);
85586
85587                 var node = selectMenuItem('orthogonalize').node();
85588                 if (!node) { return continueTo(rightClickHouse); }
85589
85590                 var wasChanged = false;
85591                 var menuCoords = context.map().mouseCoordinates();
85592
85593                 revealEditMenu(menuCoords,
85594                     t('intro.buildings.square_building', { button: icon('#iD-operation-orthogonalize', 'pre-text') })
85595                 );
85596
85597                 context.on('enter.intro', function(mode) {
85598                     if (mode.id === 'browse') {
85599                         continueTo(rightClickHouse);
85600                     } else if (mode.id === 'move' || mode.id === 'rotate') {
85601                         continueTo(retryClickSquare);
85602                     }
85603                 });
85604
85605                 context.map().on('move.intro drawn.intro', function() {
85606                     var node = selectMenuItem('orthogonalize').node();
85607                     if (!wasChanged && !node) { return continueTo(rightClickHouse); }
85608
85609                     revealEditMenu(menuCoords,
85610                         t('intro.buildings.square_building', { button: icon('#iD-operation-orthogonalize', 'pre-text') }),
85611                         { duration: 0 }
85612                     );
85613                 });
85614
85615                 context.history().on('change.intro', function() {
85616                     wasChanged = true;
85617                     context.history().on('change.intro', null);
85618
85619                     // Something changed.  Wait for transition to complete and check undo annotation.
85620                     timeout(function() {
85621                         if (context.history().undoAnnotation() === t('operations.orthogonalize.annotation.area')) {
85622                             continueTo(doneSquare);
85623                         } else {
85624                             continueTo(retryClickSquare);
85625                         }
85626                     }, 500);  // after transitioned actions
85627                 });
85628
85629                 function continueTo(nextStep) {
85630                     context.on('enter.intro', null);
85631                     context.map().on('move.intro drawn.intro', null);
85632                     context.history().on('change.intro', null);
85633                     nextStep();
85634                 }
85635             }
85636
85637
85638             function retryClickSquare() {
85639                 context.enter(modeBrowse(context));
85640
85641                 revealHouse(house, t('intro.buildings.retry_square'), {
85642                     buttonText: t('intro.ok'),
85643                     buttonCallback: function() { continueTo(rightClickHouse); }
85644                 });
85645
85646                 function continueTo(nextStep) {
85647                     nextStep();
85648                 }
85649             }
85650
85651
85652             function doneSquare() {
85653                 context.history().checkpoint('doneSquare');
85654
85655                 revealHouse(house, t('intro.buildings.done_square'), {
85656                     buttonText: t('intro.ok'),
85657                     buttonCallback: function() { continueTo(addTank); }
85658                 });
85659
85660                 function continueTo(nextStep) {
85661                     nextStep();
85662                 }
85663             }
85664
85665
85666             function addTank() {
85667                 context.enter(modeBrowse(context));
85668                 context.history().reset('doneSquare');
85669                 _tankID = null;
85670
85671                 var msec = transitionTime(tank, context.map().center());
85672                 if (msec) { reveal(null, null, { duration: 0 }); }
85673                 context.map().centerZoomEase(tank, 19.5, msec);
85674
85675                 timeout(function() {
85676                     reveal('button.add-area',
85677                         t('intro.buildings.add_tank', { button: icon('#iD-icon-area', 'pre-text') })
85678                     );
85679
85680                     context.on('enter.intro', function(mode) {
85681                         if (mode.id !== 'add-area') return;
85682                         continueTo(startTank);
85683                     });
85684                 }, msec + 100);
85685
85686                 function continueTo(nextStep) {
85687                     context.on('enter.intro', null);
85688                     nextStep();
85689                 }
85690             }
85691
85692
85693             function startTank() {
85694                 if (context.mode().id !== 'add-area') {
85695                     return continueTo(addTank);
85696                 }
85697
85698                 _tankID = null;
85699
85700                 timeout(function() {
85701                     revealTank(tank, t('intro.buildings.start_tank'));
85702
85703                     context.map().on('move.intro drawn.intro', function() {
85704                         revealTank(tank, t('intro.buildings.start_tank'), { duration: 0 });
85705                     });
85706
85707                     context.on('enter.intro', function(mode) {
85708                         if (mode.id !== 'draw-area') return chapter.restart();
85709                         continueTo(continueTank);
85710                     });
85711
85712                 }, 550);  // after easing
85713
85714                 function continueTo(nextStep) {
85715                     context.map().on('move.intro drawn.intro', null);
85716                     context.on('enter.intro', null);
85717                     nextStep();
85718                 }
85719             }
85720
85721
85722             function continueTank() {
85723                 if (context.mode().id !== 'draw-area') {
85724                     return continueTo(addTank);
85725                 }
85726
85727                 _tankID = null;
85728
85729                 revealTank(tank, t('intro.buildings.continue_tank'));
85730
85731                 context.map().on('move.intro drawn.intro', function() {
85732                     revealTank(tank, t('intro.buildings.continue_tank'), { duration: 0 });
85733                 });
85734
85735                 context.on('enter.intro', function(mode) {
85736                     if (mode.id === 'draw-area') {
85737                         return;
85738                     } else if (mode.id === 'select') {
85739                         _tankID = context.selectedIDs()[0];
85740                         return continueTo(searchPresetTank);
85741                     } else {
85742                         return continueTo(addTank);
85743                     }
85744                 });
85745
85746                 function continueTo(nextStep) {
85747                     context.map().on('move.intro drawn.intro', null);
85748                     context.on('enter.intro', null);
85749                     nextStep();
85750                 }
85751             }
85752
85753
85754             function searchPresetTank() {
85755                 if (!_tankID || !context.hasEntity(_tankID)) {
85756                     return addTank();
85757                 }
85758                 var ids = context.selectedIDs();
85759                 if (context.mode().id !== 'select' || !ids.length || ids[0] !== _tankID) {
85760                     context.enter(modeSelect(context, [_tankID]));
85761                 }
85762
85763                 // disallow scrolling
85764                 d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
85765
85766                 timeout(function() {
85767                     // reset pane, in case user somehow happened to change it..
85768                     d3_select('.inspector-wrap .panewrap').style('right', '-100%');
85769
85770                     d3_select('.preset-search-input')
85771                         .on('keydown.intro', null)
85772                         .on('keyup.intro', checkPresetSearch);
85773
85774                     reveal('.preset-search-input',
85775                         t('intro.buildings.search_tank', { preset: tankPreset.name() })
85776                     );
85777                 }, 400);  // after preset list pane visible..
85778
85779                 context.on('enter.intro', function(mode) {
85780                     if (!_tankID || !context.hasEntity(_tankID)) {
85781                         return continueTo(addTank);
85782                     }
85783
85784                     var ids = context.selectedIDs();
85785                     if (mode.id !== 'select' || !ids.length || ids[0] !== _tankID) {
85786                         // keep the user's area selected..
85787                         context.enter(modeSelect(context, [_tankID]));
85788
85789                         // reset pane, in case user somehow happened to change it..
85790                         d3_select('.inspector-wrap .panewrap').style('right', '-100%');
85791                         // disallow scrolling
85792                         d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
85793
85794                         d3_select('.preset-search-input')
85795                             .on('keydown.intro', null)
85796                             .on('keyup.intro', checkPresetSearch);
85797
85798                         reveal('.preset-search-input',
85799                             t('intro.buildings.search_tank', { preset: tankPreset.name() })
85800                         );
85801
85802                         context.history().on('change.intro', null);
85803                     }
85804                 });
85805
85806                 function checkPresetSearch() {
85807                     var first = d3_select('.preset-list-item:first-child');
85808
85809                     if (first.classed('preset-man_made-storage_tank')) {
85810                         reveal(first.select('.preset-list-button').node(),
85811                             t('intro.buildings.choose_tank', { preset: tankPreset.name() }),
85812                             { duration: 300 }
85813                         );
85814
85815                         d3_select('.preset-search-input')
85816                             .on('keydown.intro', eventCancel, true)
85817                             .on('keyup.intro', null);
85818
85819                         context.history().on('change.intro', function() {
85820                             continueTo(closeEditorTank);
85821                         });
85822                     }
85823                 }
85824
85825                 function continueTo(nextStep) {
85826                     d3_select('.inspector-wrap').on('wheel.intro', null);
85827                     context.on('enter.intro', null);
85828                     context.history().on('change.intro', null);
85829                     d3_select('.preset-search-input').on('keydown.intro keyup.intro', null);
85830                     nextStep();
85831                 }
85832             }
85833
85834
85835             function closeEditorTank() {
85836                 if (!_tankID || !context.hasEntity(_tankID)) {
85837                     return addTank();
85838                 }
85839                 var ids = context.selectedIDs();
85840                 if (context.mode().id !== 'select' || !ids.length || ids[0] !== _tankID) {
85841                     context.enter(modeSelect(context, [_tankID]));
85842                 }
85843
85844                 context.history().checkpoint('hasTank');
85845
85846                 context.on('exit.intro', function() {
85847                     continueTo(rightClickTank);
85848                 });
85849
85850                 timeout(function() {
85851                     reveal('.entity-editor-pane',
85852                         t('intro.buildings.close', { button: icon('#iD-icon-apply', 'pre-text') })
85853                     );
85854                 }, 500);
85855
85856                 function continueTo(nextStep) {
85857                     context.on('exit.intro', null);
85858                     nextStep();
85859                 }
85860             }
85861
85862
85863             function rightClickTank() {
85864                 if (!_tankID) return continueTo(addTank);
85865
85866                 context.enter(modeBrowse(context));
85867                 context.history().reset('hasTank');
85868                 context.map().centerEase(tank, 500);
85869
85870                 timeout(function() {
85871                     context.on('enter.intro', function(mode) {
85872                         if (mode.id !== 'select') return;
85873                         var ids = context.selectedIDs();
85874                         if (ids.length !== 1 || ids[0] !== _tankID) return;
85875
85876                         timeout(function() {
85877                             var node = selectMenuItem('circularize').node();
85878                             if (!node) return;
85879                             continueTo(clickCircle);
85880                         }, 300);  // after menu visible
85881                     });
85882
85883                     revealTank(tank, t('intro.buildings.rightclick_tank'));
85884
85885                     context.map().on('move.intro drawn.intro', function() {
85886                         revealTank(tank, t('intro.buildings.rightclick_tank'), { duration: 0 });
85887                     });
85888
85889                     context.history().on('change.intro', function() {
85890                         continueTo(rightClickTank);
85891                     });
85892
85893                 }, 600);
85894
85895                 function continueTo(nextStep) {
85896                     context.on('enter.intro', null);
85897                     context.map().on('move.intro drawn.intro', null);
85898                     context.history().on('change.intro', null);
85899                     nextStep();
85900                 }
85901             }
85902
85903
85904             function clickCircle() {
85905                 if (!_tankID) return chapter.restart();
85906                 var entity = context.hasEntity(_tankID);
85907                 if (!entity) return continueTo(rightClickTank);
85908
85909                 var node = selectMenuItem('circularize').node();
85910                 if (!node) { return continueTo(rightClickTank); }
85911
85912                 var wasChanged = false;
85913                 var menuCoords = context.map().mouseCoordinates();
85914
85915                 revealEditMenu(menuCoords,
85916                     t('intro.buildings.circle_tank', { button: icon('#iD-operation-circularize', 'pre-text') })
85917                 );
85918
85919                 context.on('enter.intro', function(mode) {
85920                     if (mode.id === 'browse') {
85921                         continueTo(rightClickTank);
85922                     } else if (mode.id === 'move' || mode.id === 'rotate') {
85923                         continueTo(retryClickCircle);
85924                     }
85925                 });
85926
85927                 context.map().on('move.intro drawn.intro', function() {
85928                     var node = selectMenuItem('circularize').node();
85929                     if (!wasChanged && !node) { return continueTo(rightClickTank); }
85930
85931                     revealEditMenu(menuCoords,
85932                         t('intro.buildings.circle_tank', { button: icon('#iD-operation-circularize', 'pre-text') }),
85933                         { duration: 0 }
85934                     );
85935                 });
85936
85937                 context.history().on('change.intro', function() {
85938                     wasChanged = true;
85939                     context.history().on('change.intro', null);
85940
85941                     // Something changed.  Wait for transition to complete and check undo annotation.
85942                     timeout(function() {
85943                         if (context.history().undoAnnotation() === t('operations.circularize.annotation.area')) {
85944                             continueTo(play);
85945                         } else {
85946                             continueTo(retryClickCircle);
85947                         }
85948                     }, 500);  // after transitioned actions
85949                 });
85950
85951                 function continueTo(nextStep) {
85952                     context.on('enter.intro', null);
85953                     context.map().on('move.intro drawn.intro', null);
85954                     context.history().on('change.intro', null);
85955                     nextStep();
85956                 }
85957             }
85958
85959
85960             function retryClickCircle() {
85961                 context.enter(modeBrowse(context));
85962
85963                 revealTank(tank, t('intro.buildings.retry_circle'), {
85964                     buttonText: t('intro.ok'),
85965                     buttonCallback: function() { continueTo(rightClickTank); }
85966                 });
85967
85968                 function continueTo(nextStep) {
85969                     nextStep();
85970                 }
85971             }
85972
85973
85974             function play() {
85975                 dispatch$1.call('done');
85976                 reveal('#id-container',
85977                     t('intro.buildings.play', { next: t('intro.startediting.title') }), {
85978                         tooltipBox: '.intro-nav-wrap .chapter-startEditing',
85979                         buttonText: t('intro.ok'),
85980                         buttonCallback: function() { reveal('#id-container'); }
85981                     }
85982                 );
85983             }
85984
85985
85986             chapter.enter = function() {
85987                 addHouse();
85988             };
85989
85990
85991             chapter.exit = function() {
85992                 timeouts.forEach(window.clearTimeout);
85993                 context.on('enter.intro exit.intro', null);
85994                 context.map().on('move.intro drawn.intro', null);
85995                 context.history().on('change.intro', null);
85996                 d3_select('.inspector-wrap').on('wheel.intro', null);
85997                 d3_select('.preset-search-input').on('keydown.intro keyup.intro', null);
85998                 d3_select('.more-fields .combobox-input').on('click.intro', null);
85999             };
86000
86001
86002             chapter.restart = function() {
86003                 chapter.exit();
86004                 chapter.enter();
86005             };
86006
86007
86008             return utilRebind(chapter, dispatch$1, 'on');
86009         }
86010
86011         function uiIntroStartEditing(context, reveal) {
86012             var dispatch$1 = dispatch('done', 'startEditing');
86013             var modalSelection = d3_select(null);
86014
86015
86016             var chapter = {
86017                 title: 'intro.startediting.title'
86018             };
86019
86020             function showHelp() {
86021                 reveal('.map-control.help-control',
86022                     t('intro.startediting.help', { button: icon('#iD-icon-help', 'pre-text'), key: t('help.key') }), {
86023                         buttonText: t('intro.ok'),
86024                         buttonCallback: function() { shortcuts(); }
86025                     }
86026                 );
86027             }
86028
86029             function shortcuts() {
86030                 reveal('.map-control.help-control',
86031                     t('intro.startediting.shortcuts', { key: t('shortcuts.toggle.key') }), {
86032                         buttonText: t('intro.ok'),
86033                         buttonCallback: function() { showSave(); }
86034                     }
86035                 );
86036             }
86037
86038             function showSave() {
86039                 d3_selectAll('.shaded').remove();  // in case user opened keyboard shortcuts
86040                 reveal('#bar button.save',
86041                     t('intro.startediting.save'), {
86042                         buttonText: t('intro.ok'),
86043                         buttonCallback: function() { showStart(); }
86044                     }
86045                 );
86046             }
86047
86048             function showStart() {
86049                 d3_selectAll('.shaded').remove();  // in case user opened keyboard shortcuts
86050
86051                 modalSelection = uiModal(context.container());
86052
86053                 modalSelection.select('.modal')
86054                     .attr('class', 'modal-splash modal col6');
86055
86056                 modalSelection.selectAll('.close').remove();
86057
86058                 var startbutton = modalSelection.select('.content')
86059                     .attr('class', 'fillL')
86060                     .append('button')
86061                         .attr('class', 'modal-section huge-modal-button')
86062                         .on('click', function() {
86063                             modalSelection.remove();
86064                         });
86065
86066                     startbutton
86067                         .append('svg')
86068                         .attr('class', 'illustration')
86069                         .append('use')
86070                         .attr('xlink:href', '#iD-logo-walkthrough');
86071
86072                     startbutton
86073                         .append('h2')
86074                         .text(t('intro.startediting.start'));
86075
86076                 dispatch$1.call('startEditing');
86077             }
86078
86079
86080             chapter.enter = function() {
86081                 showHelp();
86082             };
86083
86084
86085             chapter.exit = function() {
86086                 modalSelection.remove();
86087                 d3_selectAll('.shaded').remove();  // in case user opened keyboard shortcuts
86088             };
86089
86090
86091             return utilRebind(chapter, dispatch$1, 'on');
86092         }
86093
86094         var chapterUi = {
86095             welcome: uiIntroWelcome,
86096             navigation: uiIntroNavigation,
86097             point: uiIntroPoint,
86098             area: uiIntroArea,
86099             line: uiIntroLine,
86100             building: uiIntroBuilding,
86101             startEditing: uiIntroStartEditing
86102         };
86103
86104         var chapterFlow = [
86105             'welcome',
86106             'navigation',
86107             'point',
86108             'area',
86109             'line',
86110             'building',
86111             'startEditing'
86112         ];
86113
86114
86115         function uiIntro(context) {
86116             var INTRO_IMAGERY = 'EsriWorldImageryClarity';
86117             var introGraph = {};
86118             var _currChapter;
86119
86120             // create entities for intro graph and localize names
86121             for (var id in dataIntroGraph) {
86122                 introGraph[id] = osmEntity(localize(dataIntroGraph[id]));
86123             }
86124
86125
86126             function intro(selection) {
86127                 context.enter(modeBrowse(context));
86128
86129                 // Save current map state
86130                 var osm = context.connection();
86131                 var history = context.history().toJSON();
86132                 var hash = window.location.hash;
86133                 var center = context.map().center();
86134                 var zoom = context.map().zoom();
86135                 var background = context.background().baseLayerSource();
86136                 var overlays = context.background().overlayLayerSources();
86137                 var opacity = d3_selectAll('#map .layer-background').style('opacity');
86138                 var caches = osm && osm.caches();
86139                 var baseEntities = context.history().graph().base().entities;
86140                 var countryCode = services$1.geocoder.countryCode;
86141
86142                 // Show sidebar and disable the sidebar resizing button
86143                 // (this needs to be before `context.inIntro(true)`)
86144                 context.ui().sidebar.expand();
86145                 d3_selectAll('button.sidebar-toggle').classed('disabled', true);
86146
86147                 // Block saving
86148                 context.inIntro(true);
86149
86150                 // Load semi-real data used in intro
86151                 if (osm) { osm.toggle(false).reset(); }
86152                 context.history().reset();
86153                 context.history().merge(Object.values(coreGraph().load(introGraph).entities));
86154                 context.history().checkpoint('initial');
86155
86156                 // Setup imagery
86157                 var imagery = context.background().findSource(INTRO_IMAGERY);
86158                 if (imagery) {
86159                     context.background().baseLayerSource(imagery);
86160                 } else {
86161                     context.background().bing();
86162                 }
86163                 overlays.forEach(function(d) {
86164                     context.background().toggleOverlayLayer(d);
86165                 });
86166
86167                 // Setup data layers (only OSM)
86168                 var layers = context.layers();
86169                 layers.all().forEach(function(item) {
86170                     // if the layer has the function `enabled`
86171                     if (typeof item.layer.enabled === 'function') {
86172                         item.layer.enabled(item.id === 'osm');
86173                     }
86174                 });
86175
86176                 // Mock geocoder
86177                 services$1.geocoder.countryCode = function(location, callback) {
86178                     callback(null, t('intro.graph.countrycode'));
86179                 };
86180
86181
86182                 d3_selectAll('#map .layer-background').style('opacity', 1);
86183
86184                 var curtain = uiCurtain();
86185                 selection.call(curtain);
86186
86187                 // Store that the user started the walkthrough..
86188                 context.storage('walkthrough_started', 'yes');
86189
86190                 // Restore previous walkthrough progress..
86191                 var storedProgress = context.storage('walkthrough_progress') || '';
86192                 var progress = storedProgress.split(';').filter(Boolean);
86193
86194                 var chapters = chapterFlow.map(function(chapter, i) {
86195                     var s = chapterUi[chapter](context, curtain.reveal)
86196                         .on('done', function() {
86197                             context.presets().init();  // clear away "recent" presets
86198
86199                             buttons.filter(function(d) {
86200                                 return d.title === s.title;
86201                             }).classed('finished', true);
86202
86203                             if (i < chapterFlow.length - 1) {
86204                                 var next = chapterFlow[i + 1];
86205                                 d3_select('button.chapter-' + next)
86206                                     .classed('next', true);
86207                             }
86208
86209                             // Store walkthrough progress..
86210                             progress.push(chapter);
86211                             context.storage('walkthrough_progress', utilArrayUniq(progress).join(';'));
86212                         });
86213                     return s;
86214                 });
86215
86216                 chapters[chapters.length - 1].on('startEditing', function() {
86217                     // Store walkthrough progress..
86218                     progress.push('startEditing');
86219                     context.storage('walkthrough_progress', utilArrayUniq(progress).join(';'));
86220
86221                     // Store if walkthrough is completed..
86222                     var incomplete = utilArrayDifference(chapterFlow, progress);
86223                     if (!incomplete.length) {
86224                         context.storage('walkthrough_completed', 'yes');
86225                     }
86226
86227                     curtain.remove();
86228                     navwrap.remove();
86229                     d3_selectAll('#map .layer-background').style('opacity', opacity);
86230                     d3_selectAll('button.sidebar-toggle').classed('disabled', false);
86231                     if (osm) { osm.toggle(true).reset().caches(caches); }
86232                     context.history().reset().merge(Object.values(baseEntities));
86233                     context.background().baseLayerSource(background);
86234                     overlays.forEach(function(d) { context.background().toggleOverlayLayer(d); });
86235                     if (history) { context.history().fromJSON(history, false); }
86236                     context.map().centerZoom(center, zoom);
86237                     window.location.replace(hash);
86238                     services$1.geocoder.countryCode = countryCode;
86239                     context.inIntro(false);
86240                 });
86241
86242                 var navwrap = selection
86243                     .append('div')
86244                     .attr('class', 'intro-nav-wrap fillD');
86245
86246                 navwrap
86247                     .append('svg')
86248                     .attr('class', 'intro-nav-wrap-logo')
86249                     .append('use')
86250                     .attr('xlink:href', '#iD-logo-walkthrough');
86251
86252                 var buttonwrap = navwrap
86253                     .append('div')
86254                     .attr('class', 'joined')
86255                     .selectAll('button.chapter');
86256
86257                 var buttons = buttonwrap
86258                     .data(chapters)
86259                     .enter()
86260                     .append('button')
86261                     .attr('class', function(d, i) { return 'chapter chapter-' + chapterFlow[i]; })
86262                     .on('click', enterChapter);
86263
86264                 buttons
86265                     .append('span')
86266                     .text(function(d) { return t(d.title); });
86267
86268                 buttons
86269                     .append('span')
86270                     .attr('class', 'status')
86271                     .call(svgIcon((textDirection === 'rtl' ? '#iD-icon-backward' : '#iD-icon-forward'), 'inline'));
86272
86273                 enterChapter(chapters[0]);
86274
86275
86276                 function enterChapter(newChapter) {
86277                     if (_currChapter) { _currChapter.exit(); }
86278                     context.enter(modeBrowse(context));
86279
86280                     _currChapter = newChapter;
86281                     _currChapter.enter();
86282
86283                     buttons
86284                         .classed('next', false)
86285                         .classed('active', function(d) {
86286                             return d.title === _currChapter.title;
86287                         });
86288                 }
86289             }
86290
86291
86292             return intro;
86293         }
86294
86295         function uiShortcuts(context) {
86296             var detected = utilDetect();
86297             var _activeTab = 0;
86298             var _modalSelection;
86299             var _selection = d3_select(null);
86300
86301
86302             context.keybinding()
86303                 .on([t('shortcuts.toggle.key'), '?'], function () {
86304                     if (d3_selectAll('.modal-shortcuts').size()) {  // already showing
86305                         if (_modalSelection) {
86306                             _modalSelection.close();
86307                             _modalSelection = null;
86308                         }
86309                     } else {
86310                         _modalSelection = uiModal(_selection);
86311                         shortcutsModal(_modalSelection);
86312                     }
86313                 });
86314
86315
86316             function shortcutsModal(_modalSelection) {
86317                 _modalSelection.select('.modal')
86318                     .classed('modal-shortcuts', true);
86319
86320                 var shortcutsModal = _modalSelection.select('.content');
86321
86322                 shortcutsModal
86323                     .append('div')
86324                     .attr('class', 'modal-section')
86325                     .append('h3')
86326                     .text(t('shortcuts.title'));
86327
86328                 shortcutsModal
86329                     .call(render);
86330             }
86331
86332
86333             function render(selection) {
86334                 var wrapper = selection
86335                     .selectAll('.wrapper')
86336                     .data([0]);
86337
86338                 var wrapperEnter = wrapper
86339                     .enter()
86340                     .append('div')
86341                     .attr('class', 'wrapper modal-section');
86342
86343                 var tabsBar = wrapperEnter
86344                     .append('div')
86345                     .attr('class', 'tabs-bar');
86346
86347                 var shortcutsList = wrapperEnter
86348                     .append('div')
86349                     .attr('class', 'shortcuts-list');
86350
86351                 wrapper = wrapper.merge(wrapperEnter);
86352
86353                 var tabs = tabsBar
86354                     .selectAll('.tab')
86355                     .data(dataShortcuts);
86356
86357                 var tabsEnter = tabs
86358                     .enter()
86359                     .append('div')
86360                     .attr('class', 'tab')
86361                     .on('click', function (d, i) {
86362                         _activeTab = i;
86363                         render(selection);
86364                     });
86365
86366                 tabsEnter
86367                     .append('span')
86368                     .text(function (d) { return t(d.text); });
86369
86370                 tabs = tabs
86371                     .merge(tabsEnter);
86372
86373                 // Update
86374                 wrapper.selectAll('.tab')
86375                     .classed('active', function (d, i) {
86376                         return i === _activeTab;
86377                     });
86378
86379
86380                 var shortcuts = shortcutsList
86381                     .selectAll('.shortcut-tab')
86382                     .data(dataShortcuts);
86383
86384                 var shortcutsEnter = shortcuts
86385                     .enter()
86386                     .append('div')
86387                     .attr('class', function(d) { return 'shortcut-tab shortcut-tab-' + d.tab; });
86388
86389                 var columnsEnter = shortcutsEnter
86390                     .selectAll('.shortcut-column')
86391                     .data(function (d) { return d.columns; })
86392                     .enter()
86393                     .append('table')
86394                     .attr('class', 'shortcut-column');
86395
86396                 var rowsEnter = columnsEnter
86397                     .selectAll('.shortcut-row')
86398                     .data(function (d) { return d.rows; })
86399                     .enter()
86400                     .append('tr')
86401                     .attr('class', 'shortcut-row');
86402
86403
86404                 var sectionRows = rowsEnter
86405                     .filter(function (d) { return !d.shortcuts; });
86406
86407                 sectionRows
86408                     .append('td');
86409
86410                 sectionRows
86411                     .append('td')
86412                     .attr('class', 'shortcut-section')
86413                     .append('h3')
86414                     .text(function (d) { return t(d.text); });
86415
86416
86417                 var shortcutRows = rowsEnter
86418                     .filter(function (d) { return d.shortcuts; });
86419
86420                 var shortcutKeys = shortcutRows
86421                     .append('td')
86422                     .attr('class', 'shortcut-keys');
86423
86424                 var modifierKeys = shortcutKeys
86425                     .filter(function (d) { return d.modifiers; });
86426
86427                 modifierKeys
86428                     .selectAll('kbd.modifier')
86429                     .data(function (d) {
86430                         if (detected.os === 'win' && d.text === 'shortcuts.editing.commands.redo') {
86431                             return ['⌘'];
86432                         } else if (detected.os !== 'mac' && d.text === 'shortcuts.browsing.display_options.fullscreen') {
86433                             return [];
86434                         } else {
86435                             return d.modifiers;
86436                         }
86437                     })
86438                     .enter()
86439                     .each(function () {
86440                         var selection = d3_select(this);
86441
86442                         selection
86443                             .append('kbd')
86444                             .attr('class', 'modifier')
86445                             .text(function (d) { return uiCmd.display(d); });
86446
86447                         selection
86448                             .append('span')
86449                             .text('+');
86450                     });
86451
86452
86453                 shortcutKeys
86454                     .selectAll('kbd.shortcut')
86455                     .data(function (d) {
86456                         var arr = d.shortcuts;
86457                         if (detected.os === 'win' && d.text === 'shortcuts.editing.commands.redo') {
86458                             arr = ['Y'];
86459                         } else if (detected.os !== 'mac' && d.text === 'shortcuts.browsing.display_options.fullscreen') {
86460                             arr = ['F11'];
86461                         }
86462
86463                         // replace translations
86464                         arr = arr.map(function(s) {
86465                             return uiCmd.display(s.indexOf('.') !== -1 ? t(s) : s);
86466                         });
86467
86468                         return utilArrayUniq(arr).map(function(s) {
86469                             return {
86470                                 shortcut: s,
86471                                 separator: d.separator,
86472                                 suffix: d.suffix
86473                             };
86474                         });
86475                     })
86476                     .enter()
86477                     .each(function (d, i, nodes) {
86478                         var selection = d3_select(this);
86479                         var click = d.shortcut.toLowerCase().match(/(.*).click/);
86480
86481                         if (click && click[1]) {   // replace "left_click", "right_click" with mouse icon
86482                             selection
86483                                 .call(svgIcon('#iD-walkthrough-mouse', 'mouseclick', click[1]));
86484                         } else {
86485                             selection
86486                                 .append('kbd')
86487                                 .attr('class', 'shortcut')
86488                                 .text(function (d) { return d.shortcut; });
86489                         }
86490
86491                         if (i < nodes.length - 1) {
86492                             selection
86493                                 .append('span')
86494                                 .text(d.separator || '\u00a0' + t('shortcuts.or') + '\u00a0');
86495                         } else if (i === nodes.length - 1 && d.suffix) {
86496                             selection
86497                                 .append('span')
86498                                 .text(d.suffix);
86499                         }
86500                     });
86501
86502
86503                 shortcutKeys
86504                     .filter(function(d) { return d.gesture; })
86505                     .each(function () {
86506                         var selection = d3_select(this);
86507
86508                         selection
86509                             .append('span')
86510                             .text('+');
86511
86512                         selection
86513                             .append('span')
86514                             .attr('class', 'gesture')
86515                             .text(function (d) { return t(d.gesture); });
86516                     });
86517
86518
86519                 shortcutRows
86520                     .append('td')
86521                     .attr('class', 'shortcut-desc')
86522                     .text(function (d) { return d.text ? t(d.text) : '\u00a0'; });
86523
86524
86525                 shortcuts = shortcuts
86526                     .merge(shortcutsEnter);
86527
86528                 // Update
86529                 wrapper.selectAll('.shortcut-tab')
86530                     .style('display', function (d, i) {
86531                         return i === _activeTab ? 'flex' : 'none';
86532                     });
86533             }
86534
86535
86536             return function(selection, show) {
86537                 _selection = selection;
86538                 if (show) {
86539                     _modalSelection = uiModal(selection);
86540                     shortcutsModal(_modalSelection);
86541                 }
86542             };
86543         }
86544
86545         function uiHelp(context) {
86546             var key = t('help.key');
86547
86548             var _pane = d3_select(null), _toggleButton = d3_select(null);
86549
86550             var docKeys = [
86551                 ['help', [
86552                     'welcome',
86553                     'open_data_h',
86554                     'open_data',
86555                     'before_start_h',
86556                     'before_start',
86557                     'open_source_h',
86558                     'open_source',
86559                     'open_source_help'
86560                 ]],
86561                 ['overview', [
86562                     'navigation_h',
86563                     'navigation_drag',
86564                     'navigation_zoom',
86565                     'features_h',
86566                     'features',
86567                     'nodes_ways'
86568                 ]],
86569                 ['editing', [
86570                     'select_h',
86571                     'select_left_click',
86572                     'select_right_click',
86573                     'multiselect_h',
86574                     'multiselect_shift_click',
86575                     'multiselect_lasso',
86576                     'undo_redo_h',
86577                     'undo_redo',
86578                     'save_h',
86579                     'save',
86580                     'save_validation',
86581                     'upload_h',
86582                     'upload',
86583                     'backups_h',
86584                     'backups',
86585                     'keyboard_h',
86586                     'keyboard'
86587                 ]],
86588                 ['feature_editor', [
86589                     'intro',
86590                     'definitions',
86591                     'type_h',
86592                     'type',
86593                     'type_picker',
86594                     'fields_h',
86595                     'fields_all_fields',
86596                     'fields_example',
86597                     'fields_add_field',
86598                     'tags_h',
86599                     'tags_all_tags',
86600                     'tags_resources'
86601                 ]],
86602                 ['points', [
86603                     'intro',
86604                     'add_point_h',
86605                     'add_point',
86606                     'add_point_finish',
86607                     'move_point_h',
86608                     'move_point',
86609                     'delete_point_h',
86610                     'delete_point',
86611                     'delete_point_command'
86612                 ]],
86613                 ['lines', [
86614                     'intro',
86615                     'add_line_h',
86616                     'add_line',
86617                     'add_line_draw',
86618                     'add_line_finish',
86619                     'modify_line_h',
86620                     'modify_line_dragnode',
86621                     'modify_line_addnode',
86622                     'connect_line_h',
86623                     'connect_line',
86624                     'connect_line_display',
86625                     'connect_line_drag',
86626                     'connect_line_tag',
86627                     'disconnect_line_h',
86628                     'disconnect_line_command',
86629                     'move_line_h',
86630                     'move_line_command',
86631                     'move_line_connected',
86632                     'delete_line_h',
86633                     'delete_line',
86634                     'delete_line_command'
86635                 ]],
86636                 ['areas', [
86637                     'intro',
86638                     'point_or_area_h',
86639                     'point_or_area',
86640                     'add_area_h',
86641                     'add_area_command',
86642                     'add_area_draw',
86643                     'add_area_finish',
86644                     'square_area_h',
86645                     'square_area_command',
86646                     'modify_area_h',
86647                     'modify_area_dragnode',
86648                     'modify_area_addnode',
86649                     'delete_area_h',
86650                     'delete_area',
86651                     'delete_area_command'
86652                 ]],
86653                 ['relations', [
86654                     'intro',
86655                     'edit_relation_h',
86656                     'edit_relation',
86657                     'edit_relation_add',
86658                     'edit_relation_delete',
86659                     'maintain_relation_h',
86660                     'maintain_relation',
86661                     'relation_types_h',
86662                     'multipolygon_h',
86663                     'multipolygon',
86664                     'multipolygon_create',
86665                     'multipolygon_merge',
86666                     'turn_restriction_h',
86667                     'turn_restriction',
86668                     'turn_restriction_field',
86669                     'turn_restriction_editing',
86670                     'route_h',
86671                     'route',
86672                     'route_add',
86673                     'boundary_h',
86674                     'boundary',
86675                     'boundary_add'
86676                 ]],
86677                 ['notes', [
86678                     'intro',
86679                     'add_note_h',
86680                     'add_note',
86681                     'move_note',
86682                     'update_note_h',
86683                     'update_note',
86684                     'save_note_h',
86685                     'save_note'
86686                 ]],
86687
86688                 ['imagery', [
86689                     'intro',
86690                     'sources_h',
86691                     'choosing',
86692                     'sources',
86693                     'offsets_h',
86694                     'offset',
86695                     'offset_change'
86696                 ]],
86697                 ['streetlevel', [
86698                     'intro',
86699                     'using_h',
86700                     'using',
86701                     'photos',
86702                     'viewer'
86703                 ]],
86704                 ['gps', [
86705                     'intro',
86706                     'survey',
86707                     'using_h',
86708                     'using',
86709                     'tracing',
86710                     'upload'
86711                 ]],
86712                 ['qa', [
86713                     'intro',
86714                     'tools_h',
86715                     'tools',
86716                     'issues_h',
86717                     'issues'
86718                 ]]
86719             ];
86720
86721             var headings = {
86722                 'help.help.open_data_h': 3,
86723                 'help.help.before_start_h': 3,
86724                 'help.help.open_source_h': 3,
86725                 'help.overview.navigation_h': 3,
86726                 'help.overview.features_h': 3,
86727                 'help.editing.select_h': 3,
86728                 'help.editing.multiselect_h': 3,
86729                 'help.editing.undo_redo_h': 3,
86730                 'help.editing.save_h': 3,
86731                 'help.editing.upload_h': 3,
86732                 'help.editing.backups_h': 3,
86733                 'help.editing.keyboard_h': 3,
86734                 'help.feature_editor.type_h': 3,
86735                 'help.feature_editor.fields_h': 3,
86736                 'help.feature_editor.tags_h': 3,
86737                 'help.points.add_point_h': 3,
86738                 'help.points.move_point_h': 3,
86739                 'help.points.delete_point_h': 3,
86740                 'help.lines.add_line_h': 3,
86741                 'help.lines.modify_line_h': 3,
86742                 'help.lines.connect_line_h': 3,
86743                 'help.lines.disconnect_line_h': 3,
86744                 'help.lines.move_line_h': 3,
86745                 'help.lines.delete_line_h': 3,
86746                 'help.areas.point_or_area_h': 3,
86747                 'help.areas.add_area_h': 3,
86748                 'help.areas.square_area_h': 3,
86749                 'help.areas.modify_area_h': 3,
86750                 'help.areas.delete_area_h': 3,
86751                 'help.relations.edit_relation_h': 3,
86752                 'help.relations.maintain_relation_h': 3,
86753                 'help.relations.relation_types_h': 2,
86754                 'help.relations.multipolygon_h': 3,
86755                 'help.relations.turn_restriction_h': 3,
86756                 'help.relations.route_h': 3,
86757                 'help.relations.boundary_h': 3,
86758                 'help.notes.add_note_h': 3,
86759                 'help.notes.update_note_h': 3,
86760                 'help.notes.save_note_h': 3,
86761                 'help.imagery.sources_h': 3,
86762                 'help.imagery.offsets_h': 3,
86763                 'help.streetlevel.using_h': 3,
86764                 'help.gps.using_h': 3,
86765                 'help.qa.tools_h': 3,
86766                 'help.qa.issues_h': 3
86767             };
86768
86769             var replacements = {
86770                 point: icon('#iD-icon-point', 'pre-text'),
86771                 line: icon('#iD-icon-line', 'pre-text'),
86772                 area: icon('#iD-icon-area', 'pre-text'),
86773                 note: icon('#iD-icon-note', 'pre-text add-note'),
86774                 plus: icon('#iD-icon-plus', 'pre-text'),
86775                 minus: icon('#iD-icon-minus', 'pre-text'),
86776                 orthogonalize: icon('#iD-operation-orthogonalize', 'pre-text'),
86777                 disconnect: icon('#iD-operation-disconnect', 'pre-text'),
86778                 layers: icon('#iD-icon-layers', 'pre-text'),
86779                 data: icon('#iD-icon-data', 'pre-text'),
86780                 inspect: icon('#iD-icon-inspect', 'pre-text'),
86781                 move: icon('#iD-operation-move', 'pre-text'),
86782                 merge: icon('#iD-operation-merge', 'pre-text'),
86783                 delete: icon('#iD-operation-delete', 'pre-text'),
86784                 close: icon('#iD-icon-close', 'pre-text'),
86785                 undo: icon(textDirection === 'rtl' ? '#iD-icon-redo' : '#iD-icon-undo', 'pre-text'),
86786                 redo: icon(textDirection === 'rtl' ? '#iD-icon-undo' : '#iD-icon-redo', 'pre-text'),
86787                 save: icon('#iD-icon-save', 'pre-text'),
86788                 leftclick: icon('#iD-walkthrough-mouse', 'pre-text mouseclick', 'left'),
86789                 rightclick: icon('#iD-walkthrough-mouse', 'pre-text mouseclick', 'right'),
86790                 shift: uiCmd.display('⇧'),
86791                 alt: uiCmd.display('⌥'),
86792                 return: uiCmd.display('↵'),
86793                 version: context.version
86794             };
86795
86796             // For each section, squash all the texts into a single markdown document
86797             var docs = docKeys.map(function(key) {
86798                 var helpkey = 'help.' + key[0];
86799                 var text = key[1].reduce(function(all, part) {
86800                     var subkey = helpkey + '.' + part;
86801                     var depth = headings[subkey];                              // is this subkey a heading?
86802                     var hhh = depth ? Array(depth + 1).join('#') + ' ' : '';   // if so, prepend with some ##'s
86803                     return all + hhh + t(subkey, replacements) + '\n\n';
86804                 }, '');
86805
86806                 return {
86807                     title: t(helpkey + '.title'),
86808                     html: marked(text.trim())
86809                 };
86810             });
86811
86812             var paneTooltip = tooltip()
86813                 .placement((textDirection === 'rtl') ? 'right' : 'left')
86814                 .html(true)
86815                 .title(uiTooltipHtml(t('help.title'), key));
86816
86817             function hidePane() {
86818                 context.ui().togglePanes();
86819             }
86820
86821             uiHelp.togglePane = function() {
86822                 if (event) event.preventDefault();
86823                 paneTooltip.hide(_toggleButton);
86824                 context.ui().togglePanes(!_pane.classed('shown') ? _pane : undefined);
86825             };
86826
86827             uiHelp.renderToggleButton = function(selection) {
86828
86829                 _toggleButton = selection.append('button')
86830                     .attr('tabindex', -1)
86831                     .on('click', uiHelp.togglePane)
86832                     .call(svgIcon('#iD-icon-help', 'light'))
86833                     .call(paneTooltip);
86834             };
86835
86836
86837             uiHelp.renderPane = function(selection) {
86838
86839                 function clickHelp(d, i) {
86840                     var rtl = (textDirection === 'rtl');
86841                     content.property('scrollTop', 0);
86842                     doctitle.html(d.title);
86843
86844                     body.html(d.html);
86845                     body.selectAll('a')
86846                         .attr('target', '_blank');
86847                     menuItems.classed('selected', function(m) {
86848                         return m.title === d.title;
86849                     });
86850
86851                     nav.html('');
86852                     if (rtl) {
86853                         nav.call(drawNext).call(drawPrevious);
86854                     } else {
86855                         nav.call(drawPrevious).call(drawNext);
86856                     }
86857
86858
86859                     function drawNext(selection) {
86860                         if (i < docs.length - 1) {
86861                             var nextLink = selection
86862                                 .append('a')
86863                                 .attr('class', 'next')
86864                                 .on('click', function() {
86865                                     clickHelp(docs[i + 1], i + 1);
86866                                 });
86867
86868                             nextLink
86869                                 .append('span')
86870                                 .text(docs[i + 1].title)
86871                                 .call(svgIcon((rtl ? '#iD-icon-backward' : '#iD-icon-forward'), 'inline'));
86872                         }
86873                     }
86874
86875
86876                     function drawPrevious(selection) {
86877                         if (i > 0) {
86878                             var prevLink = selection
86879                                 .append('a')
86880                                 .attr('class', 'previous')
86881                                 .on('click', function() {
86882                                     clickHelp(docs[i - 1], i - 1);
86883                                 });
86884
86885                             prevLink
86886                                 .call(svgIcon((rtl ? '#iD-icon-forward' : '#iD-icon-backward'), 'inline'))
86887                                 .append('span')
86888                                 .text(docs[i - 1].title);
86889                         }
86890                     }
86891                 }
86892
86893
86894                 function clickWalkthrough() {
86895                     if (context.inIntro()) return;
86896                     context.container().call(uiIntro(context));
86897                     context.ui().togglePanes();
86898                 }
86899
86900
86901                 function clickShortcuts() {
86902                     context.container().call(uiShortcuts(context), true);
86903                 }
86904
86905
86906                 _pane = selection.append('div')
86907                     .attr('class', 'help-wrap map-pane fillL hide')
86908                     .attr('pane', 'help');
86909
86910                 var heading = _pane
86911                     .append('div')
86912                     .attr('class', 'pane-heading');
86913
86914                 var doctitle = heading
86915                     .append('h2')
86916                     .text(t('help.title'));
86917
86918                 heading
86919                     .append('button')
86920                     .on('click', hidePane)
86921                     .call(svgIcon('#iD-icon-close'));
86922
86923
86924                 var content = _pane
86925                     .append('div')
86926                     .attr('class', 'pane-content');
86927
86928                 var toc = content
86929                     .append('ul')
86930                     .attr('class', 'toc');
86931
86932                 var menuItems = toc.selectAll('li')
86933                     .data(docs)
86934                     .enter()
86935                     .append('li')
86936                     .append('a')
86937                     .html(function(d) { return d.title; })
86938                     .on('click', clickHelp);
86939
86940                 var shortcuts = toc
86941                     .append('li')
86942                     .attr('class', 'shortcuts')
86943                     .call(tooltip()
86944                         .html(true)
86945                         .title(uiTooltipHtml(t('shortcuts.tooltip'), '?'))
86946                         .placement('top')
86947                     )
86948                     .append('a')
86949                     .on('click', clickShortcuts);
86950
86951                 shortcuts
86952                     .append('div')
86953                     .text(t('shortcuts.title'));
86954
86955                 var walkthrough = toc
86956                     .append('li')
86957                     .attr('class', 'walkthrough')
86958                     .append('a')
86959                     .on('click', clickWalkthrough);
86960
86961                 walkthrough
86962                     .append('svg')
86963                     .attr('class', 'logo logo-walkthrough')
86964                     .append('use')
86965                     .attr('xlink:href', '#iD-logo-walkthrough');
86966
86967                 walkthrough
86968                     .append('div')
86969                     .text(t('splash.walkthrough'));
86970
86971
86972                 var helpContent = content
86973                     .append('div')
86974                     .attr('class', 'left-content');
86975
86976                 var body = helpContent
86977                     .append('div')
86978                     .attr('class', 'body');
86979
86980                 var nav = helpContent
86981                     .append('div')
86982                     .attr('class', 'nav');
86983
86984                 clickHelp(docs[0], 0);
86985
86986                 context.keybinding()
86987                     .on(key, uiHelp.togglePane);
86988
86989             };
86990
86991             return uiHelp;
86992         }
86993
86994         function uiPanelBackground(context) {
86995             var background = context.background();
86996             var currSourceName = null;
86997             var metadata = {};
86998             var metadataKeys = [
86999                 'zoom', 'vintage', 'source', 'description', 'resolution', 'accuracy'
87000             ];
87001
87002             var debouncedRedraw = debounce(redraw, 250);
87003
87004             function redraw(selection) {
87005                 var source = background.baseLayerSource();
87006                 var isDG = (source.id.match(/^DigitalGlobe/i) !== null);
87007
87008                 if (currSourceName !== source.name()) {
87009                     currSourceName = source.name();
87010                     metadata = {};
87011                 }
87012
87013                 selection.html('');
87014
87015                 var list = selection
87016                     .append('ul')
87017                     .attr('class', 'background-info');
87018
87019                 list
87020                     .append('li')
87021                     .text(currSourceName);
87022
87023                 metadataKeys.forEach(function(k) {
87024                     // DigitalGlobe vintage is available in raster layers for now.
87025                     if (isDG && k === 'vintage') return;
87026
87027                     list
87028                         .append('li')
87029                         .attr('class', 'background-info-list-' + k)
87030                         .classed('hide', !metadata[k])
87031                         .text(t('info_panels.background.' + k) + ':')
87032                         .append('span')
87033                         .attr('class', 'background-info-span-' + k)
87034                         .text(metadata[k]);
87035                 });
87036
87037                 debouncedGetMetadata(selection);
87038
87039                 var toggleTiles = context.getDebug('tile') ? 'hide_tiles' : 'show_tiles';
87040
87041                 selection
87042                     .append('a')
87043                     .text(t('info_panels.background.' + toggleTiles))
87044                     .attr('href', '#')
87045                     .attr('class', 'button button-toggle-tiles')
87046                     .on('click', function() {
87047                         event.preventDefault();
87048                         context.setDebug('tile', !context.getDebug('tile'));
87049                         selection.call(redraw);
87050                     });
87051
87052                 if (isDG) {
87053                     var key = source.id + '-vintage';
87054                     var sourceVintage = context.background().findSource(key);
87055                     var showsVintage = context.background().showsLayer(sourceVintage);
87056                     var toggleVintage = showsVintage ? 'hide_vintage' : 'show_vintage';
87057                     selection
87058                         .append('a')
87059                         .text(t('info_panels.background.' + toggleVintage))
87060                         .attr('href', '#')
87061                         .attr('class', 'button button-toggle-vintage')
87062                         .on('click', function() {
87063                             event.preventDefault();
87064                             context.background().toggleOverlayLayer(sourceVintage);
87065                             selection.call(redraw);
87066                         });
87067                 }
87068
87069                 // disable if necessary
87070                 ['DigitalGlobe-Premium', 'DigitalGlobe-Standard'].forEach(function(layerId) {
87071                     if (source.id !== layerId) {
87072                         var key = layerId + '-vintage';
87073                         var sourceVintage = context.background().findSource(key);
87074                         if (context.background().showsLayer(sourceVintage)) {
87075                             context.background().toggleOverlayLayer(sourceVintage);
87076                         }
87077                     }
87078                 });
87079             }
87080
87081
87082             var debouncedGetMetadata = debounce(getMetadata, 250);
87083
87084             function getMetadata(selection) {
87085                 var tile = d3_select('.layer-background img.tile-center');   // tile near viewport center
87086                 if (tile.empty()) return;
87087
87088                 var sourceName = currSourceName;
87089                 var d = tile.datum();
87090                 var zoom = (d && d.length >= 3 && d[2]) || Math.floor(context.map().zoom());
87091                 var center = context.map().center();
87092
87093                 // update zoom
87094                 metadata.zoom = String(zoom);
87095                 selection.selectAll('.background-info-list-zoom')
87096                     .classed('hide', false)
87097                     .selectAll('.background-info-span-zoom')
87098                     .text(metadata.zoom);
87099
87100                 if (!d || !d.length >= 3) return;
87101
87102                 background.baseLayerSource().getMetadata(center, d, function(err, result) {
87103                     if (err || currSourceName !== sourceName) return;
87104
87105                     // update vintage
87106                     var vintage = result.vintage;
87107                     metadata.vintage = (vintage && vintage.range) || t('info_panels.background.unknown');
87108                     selection.selectAll('.background-info-list-vintage')
87109                         .classed('hide', false)
87110                         .selectAll('.background-info-span-vintage')
87111                         .text(metadata.vintage);
87112
87113                     // update other metdata
87114                     metadataKeys.forEach(function(k) {
87115                         if (k === 'zoom' || k === 'vintage') return;  // done already
87116                         var val = result[k];
87117                         metadata[k] = val;
87118                         selection.selectAll('.background-info-list-' + k)
87119                             .classed('hide', !val)
87120                             .selectAll('.background-info-span-' + k)
87121                             .text(val);
87122                     });
87123                 });
87124             }
87125
87126
87127             var panel = function(selection) {
87128                 selection.call(redraw);
87129
87130                 context.map()
87131                     .on('drawn.info-background', function() {
87132                         selection.call(debouncedRedraw);
87133                     })
87134                     .on('move.info-background', function() {
87135                         selection.call(debouncedGetMetadata);
87136                     });
87137
87138             };
87139
87140             panel.off = function() {
87141                 context.map()
87142                     .on('drawn.info-background', null)
87143                     .on('move.info-background', null);
87144             };
87145
87146             panel.id = 'background';
87147             panel.title = t('info_panels.background.title');
87148             panel.key = t('info_panels.background.key');
87149
87150
87151             return panel;
87152         }
87153
87154         function uiPanelHistory(context) {
87155             var osm;
87156
87157             function displayTimestamp(timestamp) {
87158                 if (!timestamp) return t('info_panels.history.unknown');
87159                 var detected = utilDetect();
87160                 var options = {
87161                     day: 'numeric', month: 'short', year: 'numeric',
87162                     hour: 'numeric', minute: 'numeric', second: 'numeric'
87163                 };
87164                 var d = new Date(timestamp);
87165                 if (isNaN(d.getTime())) return t('info_panels.history.unknown');
87166                 return d.toLocaleString(detected.locale, options);
87167             }
87168
87169
87170             function displayUser(selection, userName) {
87171                 if (!userName) {
87172                     selection
87173                         .append('span')
87174                         .text(t('info_panels.history.unknown'));
87175                     return;
87176                 }
87177
87178                 selection
87179                     .append('span')
87180                     .attr('class', 'user-name')
87181                     .text(userName);
87182
87183                 var links = selection
87184                     .append('div')
87185                     .attr('class', 'links');
87186
87187                 if (osm) {
87188                     links
87189                         .append('a')
87190                         .attr('class', 'user-osm-link')
87191                         .attr('href', osm.userURL(userName))
87192                         .attr('target', '_blank')
87193                         .attr('tabindex', -1)
87194                         .text('OSM');
87195                 }
87196
87197                 links
87198                     .append('a')
87199                     .attr('class', 'user-hdyc-link')
87200                     .attr('href', 'https://hdyc.neis-one.org/?' + userName)
87201                     .attr('target', '_blank')
87202                     .attr('tabindex', -1)
87203                     .text('HDYC');
87204             }
87205
87206
87207             function displayChangeset(selection, changeset) {
87208                 if (!changeset) {
87209                     selection
87210                         .append('span')
87211                         .text(t('info_panels.history.unknown'));
87212                     return;
87213                 }
87214
87215                 selection
87216                     .append('span')
87217                     .attr('class', 'changeset-id')
87218                     .text(changeset);
87219
87220                 var links = selection
87221                     .append('div')
87222                     .attr('class', 'links');
87223
87224                 if (osm) {
87225                     links
87226                         .append('a')
87227                         .attr('class', 'changeset-osm-link')
87228                         .attr('href', osm.changesetURL(changeset))
87229                         .attr('target', '_blank')
87230                         .attr('tabindex', -1)
87231                         .text('OSM');
87232                 }
87233
87234                 links
87235                     .append('a')
87236                     .attr('class', 'changeset-osmcha-link')
87237                     .attr('href', 'https://osmcha.mapbox.com/changesets/' + changeset)
87238                     .attr('target', '_blank')
87239                     .attr('tabindex', -1)
87240                     .text('OSMCha');
87241             }
87242
87243
87244             function redraw(selection) {
87245                 var selectedNoteID = context.selectedNoteID();
87246                 osm = context.connection();
87247
87248                 var selected, note, entity;
87249                 if (selectedNoteID && osm) {       // selected 1 note
87250                     selected = [ t('note.note') + ' ' + selectedNoteID ];
87251                     note = osm.getNote(selectedNoteID);
87252                 } else {                           // selected 1..n entities
87253                     selected = context.selectedIDs()
87254                         .filter(function(e) { return context.hasEntity(e); });
87255                     if (selected.length) {
87256                         entity = context.entity(selected[0]);
87257                     }
87258                 }
87259
87260                 var singular = selected.length === 1 ? selected[0] : null;
87261
87262                 selection.html('');
87263
87264                 selection
87265                     .append('h4')
87266                     .attr('class', 'history-heading')
87267                     .text(singular || t('info_panels.history.selected', { n: selected.length }));
87268
87269                 if (!singular) return;
87270
87271                 if (entity) {
87272                     selection.call(redrawEntity, entity);
87273                 } else if (note) {
87274                     selection.call(redrawNote, note);
87275                 }
87276             }
87277
87278
87279             function redrawNote(selection, note) {
87280                 if (!note || note.isNew()) {
87281                     selection
87282                         .append('div')
87283                         .text(t('info_panels.history.note_no_history'));
87284                     return;
87285                 }
87286
87287                 var list = selection
87288                     .append('ul');
87289
87290                 list
87291                     .append('li')
87292                     .text(t('info_panels.history.note_comments') + ':')
87293                     .append('span')
87294                     .text(note.comments.length);
87295
87296                 if (note.comments.length) {
87297                     list
87298                         .append('li')
87299                         .text(t('info_panels.history.note_created_date') + ':')
87300                         .append('span')
87301                         .text(displayTimestamp(note.comments[0].date));
87302
87303                     list
87304                         .append('li')
87305                         .text(t('info_panels.history.note_created_user') + ':')
87306                         .call(displayUser, note.comments[0].user);
87307                 }
87308
87309                 if (osm) {
87310                     selection
87311                         .append('a')
87312                         .attr('class', 'view-history-on-osm')
87313                         .attr('target', '_blank')
87314                         .attr('tabindex', -1)
87315                         .attr('href', osm.noteURL(note))
87316                         .call(svgIcon('#iD-icon-out-link', 'inline'))
87317                         .append('span')
87318                         .text(t('info_panels.history.note_link_text'));
87319                 }
87320             }
87321
87322
87323             function redrawEntity(selection, entity) {
87324                 if (!entity || entity.isNew()) {
87325                     selection
87326                         .append('div')
87327                         .text(t('info_panels.history.no_history'));
87328                     return;
87329                 }
87330
87331                 var links = selection
87332                     .append('div')
87333                     .attr('class', 'links');
87334
87335                 if (osm) {
87336                     links
87337                         .append('a')
87338                         .attr('class', 'view-history-on-osm')
87339                         .attr('href', osm.historyURL(entity))
87340                         .attr('target', '_blank')
87341                         .attr('tabindex', -1)
87342                         .attr('title', t('info_panels.history.link_text'))
87343                         .text('OSM');
87344                 }
87345                 links
87346                     .append('a')
87347                     .attr('class', 'pewu-history-viewer-link')
87348                     .attr('href', 'https://pewu.github.io/osm-history/#/' + entity.type + '/' + entity.osmId())
87349                     .attr('target', '_blank')
87350                     .attr('tabindex', -1)
87351                     .text('PeWu');
87352
87353                 var list = selection
87354                     .append('ul');
87355
87356                 list
87357                     .append('li')
87358                     .text(t('info_panels.history.version') + ':')
87359                     .append('span')
87360                     .text(entity.version);
87361
87362                 list
87363                     .append('li')
87364                     .text(t('info_panels.history.last_edit') + ':')
87365                     .append('span')
87366                     .text(displayTimestamp(entity.timestamp));
87367
87368                 list
87369                     .append('li')
87370                     .text(t('info_panels.history.edited_by') + ':')
87371                     .call(displayUser, entity.user);
87372
87373                 list
87374                     .append('li')
87375                     .text(t('info_panels.history.changeset') + ':')
87376                     .call(displayChangeset, entity.changeset);
87377             }
87378
87379
87380             var panel = function(selection) {
87381                 selection.call(redraw);
87382
87383                 context.map()
87384                     .on('drawn.info-history', function() {
87385                         selection.call(redraw);
87386                     });
87387
87388                 context
87389                     .on('enter.info-history', function() {
87390                         selection.call(redraw);
87391                     });
87392             };
87393
87394             panel.off = function() {
87395                 context.map().on('drawn.info-history', null);
87396                 context.on('enter.info-history', null);
87397             };
87398
87399             panel.id = 'history';
87400             panel.title = t('info_panels.history.title');
87401             panel.key = t('info_panels.history.key');
87402
87403
87404             return panel;
87405         }
87406
87407         var OSM_PRECISION = 7;
87408         var locale$2 = utilDetect().locale;
87409
87410         /**
87411          * Returns a localized representation of the given length measurement.
87412          *
87413          * @param {Number} m area in meters
87414          * @param {Boolean} isImperial true for U.S. customary units; false for metric
87415          */
87416         function displayLength(m, isImperial) {
87417             var d = m * (isImperial ? 3.28084 : 1);
87418             var unit;
87419
87420             if (isImperial) {
87421                 if (d >= 5280) {
87422                     d /= 5280;
87423                     unit = 'miles';
87424                 } else {
87425                     unit = 'feet';
87426                 }
87427             } else {
87428                 if (d >= 1000) {
87429                     d /= 1000;
87430                     unit = 'kilometers';
87431                 } else {
87432                     unit = 'meters';
87433                 }
87434             }
87435
87436             return t('units.' + unit, {
87437                 quantity: d.toLocaleString(locale$2, {
87438                     maximumSignificantDigits: 4
87439                 })
87440             });
87441         }
87442
87443         /**
87444          * Returns a localized representation of the given area measurement.
87445          *
87446          * @param {Number} m2 area in square meters
87447          * @param {Boolean} isImperial true for U.S. customary units; false for metric
87448          */
87449         function displayArea(m2, isImperial) {
87450             var d = m2 * (isImperial ? 10.7639111056 : 1);
87451             var d1, d2, area;
87452             var unit1 = '';
87453             var unit2 = '';
87454
87455             if (isImperial) {
87456                 if (d >= 6969600) { // > 0.25mi² show mi²
87457                     d1 = d / 27878400;
87458                     unit1 = 'square_miles';
87459                 } else {
87460                     d1 = d;
87461                     unit1 = 'square_feet';
87462                 }
87463
87464                 if (d > 4356 && d < 43560000) { // 0.1 - 1000 acres
87465                     d2 = d / 43560;
87466                     unit2 = 'acres';
87467                 }
87468
87469             } else {
87470                 if (d >= 250000) { // > 0.25km² show km²
87471                     d1 = d / 1000000;
87472                     unit1 = 'square_kilometers';
87473                 } else {
87474                     d1 = d;
87475                     unit1 = 'square_meters';
87476                 }
87477
87478                 if (d > 1000 && d < 10000000) { // 0.1 - 1000 hectares
87479                     d2 = d / 10000;
87480                     unit2 = 'hectares';
87481                 }
87482             }
87483
87484             area = t('units.' + unit1, {
87485                 quantity: d1.toLocaleString(locale$2, {
87486                     maximumSignificantDigits: 4
87487                 })
87488             });
87489
87490             if (d2) {
87491                 return t('units.area_pair', {
87492                     area1: area,
87493                     area2: t('units.' + unit2, {
87494                         quantity: d2.toLocaleString(locale$2, {
87495                             maximumSignificantDigits: 2
87496                         })
87497                     })
87498                 });
87499             } else {
87500                 return area;
87501             }
87502         }
87503
87504         function wrap(x, min, max) {
87505             var d = max - min;
87506             return ((x - min) % d + d) % d + min;
87507         }
87508
87509         function clamp$1(x, min, max) {
87510             return Math.max(min, Math.min(x, max));
87511         }
87512
87513         function displayCoordinate(deg, pos, neg) {
87514             var min = (Math.abs(deg) - Math.floor(Math.abs(deg))) * 60;
87515             var sec = (min - Math.floor(min)) * 60;
87516             var displayDegrees = t('units.arcdegrees', {
87517                 quantity: Math.floor(Math.abs(deg)).toLocaleString(locale$2)
87518             });
87519             var displayCoordinate;
87520
87521             if (Math.floor(sec) > 0) {
87522                 displayCoordinate = displayDegrees +
87523                     t('units.arcminutes', {
87524                         quantity: Math.floor(min).toLocaleString(locale$2)
87525                     }) +
87526                     t('units.arcseconds', {
87527                         quantity: Math.round(sec).toLocaleString(locale$2)
87528                     });
87529             } else if (Math.floor(min) > 0) {
87530                 displayCoordinate = displayDegrees +
87531                     t('units.arcminutes', {
87532                         quantity: Math.round(min).toLocaleString(locale$2)
87533                     });
87534             } else {
87535                 displayCoordinate = t('units.arcdegrees', {
87536                     quantity: Math.round(Math.abs(deg)).toLocaleString(locale$2)
87537                 });
87538             }
87539
87540             if (deg === 0) {
87541                 return displayCoordinate;
87542             } else {
87543                 return t('units.coordinate', {
87544                     coordinate: displayCoordinate,
87545                     direction: t('units.' + (deg > 0 ? pos : neg))
87546                 });
87547             }
87548         }
87549
87550         /**
87551          * Returns given coordinate pair in degree-minute-second format.
87552          *
87553          * @param {Array<Number>} coord longitude and latitude
87554          */
87555         function dmsCoordinatePair(coord) {
87556             return t('units.coordinate_pair', {
87557                 latitude: displayCoordinate(clamp$1(coord[1], -90, 90), 'north', 'south'),
87558                 longitude: displayCoordinate(wrap(coord[0], -180, 180), 'east', 'west')
87559             });
87560         }
87561
87562         /**
87563          * Returns the given coordinate pair in decimal format.
87564          * note: unlocalized to avoid comma ambiguity - see #4765
87565          *
87566          * @param {Array<Number>} coord longitude and latitude
87567          */
87568         function decimalCoordinatePair(coord) {
87569             return t('units.coordinate_pair', {
87570                 latitude: clamp$1(coord[1], -90, 90).toFixed(OSM_PRECISION),
87571                 longitude: wrap(coord[0], -180, 180).toFixed(OSM_PRECISION)
87572             });
87573         }
87574
87575         function uiPanelLocation(context) {
87576             var currLocation = '';
87577
87578
87579             function redraw(selection) {
87580                 selection.html('');
87581
87582                 var list = selection
87583                     .append('ul');
87584
87585                 // Mouse coordinates
87586                 var coord = context.map().mouseCoordinates();
87587                 if (coord.some(isNaN)) {
87588                     coord = context.map().center();
87589                 }
87590
87591                 list
87592                     .append('li')
87593                     .text(dmsCoordinatePair(coord))
87594                     .append('li')
87595                     .text(decimalCoordinatePair(coord));
87596
87597                 // Location Info
87598                 selection
87599                     .append('div')
87600                     .attr('class', 'location-info')
87601                     .text(currLocation || ' ');
87602
87603                 debouncedGetLocation(selection, coord);
87604             }
87605
87606
87607             var debouncedGetLocation = debounce(getLocation, 250);
87608             function getLocation(selection, coord) {
87609                 if (!services$1.geocoder) {
87610                     currLocation = t('info_panels.location.unknown_location');
87611                     selection.selectAll('.location-info')
87612                         .text(currLocation);
87613                 } else {
87614                     services$1.geocoder.reverse(coord, function(err, result) {
87615                         currLocation = result ? result.display_name : t('info_panels.location.unknown_location');
87616                         selection.selectAll('.location-info')
87617                             .text(currLocation);
87618                     });
87619                 }
87620             }
87621
87622
87623             var panel = function(selection) {
87624                 selection.call(redraw);
87625
87626                 context.surface()
87627                     .on('mousemove.info-location', function() {
87628                         selection.call(redraw);
87629                     });
87630             };
87631
87632             panel.off = function() {
87633                 context.surface()
87634                     .on('mousemove.info-location', null);
87635             };
87636
87637             panel.id = 'location';
87638             panel.title = t('info_panels.location.title');
87639             panel.key = t('info_panels.location.key');
87640
87641
87642             return panel;
87643         }
87644
87645         function uiPanelMeasurement(context) {
87646             var locale = utilDetect().locale;
87647             var isImperial = (locale.toLowerCase() === 'en-us');
87648
87649
87650             function radiansToMeters(r) {
87651                 // using WGS84 authalic radius (6371007.1809 m)
87652                 return r * 6371007.1809;
87653             }
87654
87655             function steradiansToSqmeters(r) {
87656                 // http://gis.stackexchange.com/a/124857/40446
87657                 return r / (4 * Math.PI) * 510065621724000;
87658             }
87659
87660
87661             function toLineString(feature) {
87662                 if (feature.type === 'LineString') return feature;
87663
87664                 var result = { type: 'LineString', coordinates: [] };
87665                 if (feature.type === 'Polygon') {
87666                     result.coordinates = feature.coordinates[0];
87667                 } else if (feature.type === 'MultiPolygon') {
87668                     result.coordinates = feature.coordinates[0][0];
87669                 }
87670
87671                 return result;
87672             }
87673
87674
87675             function nodeCount(feature) {
87676               if (feature.type === 'LineString') return feature.coordinates.length;
87677               if (feature.type === 'Polygon') return feature.coordinates[0].length - 1;
87678             }
87679
87680
87681             function redraw(selection) {
87682                 var resolver = context.graph();
87683                 var selectedNoteID = context.selectedNoteID();
87684                 var osm = services$1.osm;
87685
87686                 var selected, center, entity, note, geometry;
87687
87688                 if (selectedNoteID && osm) {       // selected 1 note
87689                     selected = [ t('note.note') + ' ' + selectedNoteID ];
87690                     note = osm.getNote(selectedNoteID);
87691                     center = note.loc;
87692                     geometry = 'note';
87693
87694                 } else {                           // selected 1..n entities
87695                     var extent = geoExtent();
87696                     selected = context.selectedIDs()
87697                         .filter(function(e) { return context.hasEntity(e); });
87698                     if (selected.length) {
87699                         for (var i = 0; i < selected.length; i++) {
87700                             entity = context.entity(selected[i]);
87701                             extent._extend(entity.extent(resolver));
87702                         }
87703                         center = extent.center();
87704                         geometry = entity.geometry(resolver);
87705                     }
87706                 }
87707
87708                 var singular = selected.length === 1 ? selected[0] : null;
87709
87710                 selection.html('');
87711
87712                 selection
87713                     .append('h4')
87714                     .attr('class', 'measurement-heading')
87715                     .text(singular || t('info_panels.measurement.selected', { n: selected.length.toLocaleString(locale) }));
87716
87717                 if (!selected.length) return;
87718
87719
87720                 var list = selection
87721                     .append('ul');
87722                 var coordItem;
87723
87724                 // multiple selected features, just display extent center..
87725                 if (!singular) {
87726                     coordItem = list
87727                         .append('li')
87728                         .text(t('info_panels.measurement.center') + ':');
87729                     coordItem.append('span')
87730                         .text(dmsCoordinatePair(center));
87731                     coordItem.append('span')
87732                         .text(decimalCoordinatePair(center));
87733                     return;
87734                 }
87735
87736                 // single selected feature, display details..
87737                 if (geometry === 'line' || geometry === 'area') {
87738                     var closed = (entity.type === 'relation') || (entity.isClosed() && !entity.isDegenerate());
87739                     var feature = entity.asGeoJSON(resolver);
87740                     var length = radiansToMeters(d3_geoLength(toLineString(feature)));
87741                     var lengthLabel = t('info_panels.measurement.' + (closed ? 'perimeter' : 'length'));
87742                     var centroid = d3_geoCentroid(feature);
87743
87744                     list
87745                         .append('li')
87746                         .text(t('info_panels.measurement.geometry') + ':')
87747                         .append('span')
87748                         .text(
87749                             closed ? t('info_panels.measurement.closed_' + geometry) : t('geometry.' + geometry)
87750                         );
87751
87752                     if (entity.type !== 'relation') {
87753                         list
87754                             .append('li')
87755                             .text(t('info_panels.measurement.node_count') + ':')
87756                             .append('span')
87757                             .text(nodeCount(feature).toLocaleString(locale));
87758                     }
87759
87760                     if (closed) {
87761                         var area = steradiansToSqmeters(entity.area(resolver));
87762                         list
87763                             .append('li')
87764                             .text(t('info_panels.measurement.area') + ':')
87765                             .append('span')
87766                             .text(displayArea(area, isImperial));
87767                     }
87768
87769
87770                     list
87771                         .append('li')
87772                         .text(lengthLabel + ':')
87773                         .append('span')
87774                         .text(displayLength(length, isImperial));
87775
87776                     coordItem = list
87777                         .append('li')
87778                         .text(t('info_panels.measurement.centroid') + ':');
87779                     coordItem.append('span')
87780                         .text(dmsCoordinatePair(centroid));
87781                     coordItem.append('span')
87782                         .text(decimalCoordinatePair(centroid));
87783
87784                     var toggle  = isImperial ? 'imperial' : 'metric';
87785
87786                     selection
87787                         .append('a')
87788                         .text(t('info_panels.measurement.' + toggle))
87789                         .attr('href', '#')
87790                         .attr('class', 'button button-toggle-units')
87791                         .on('click', function() {
87792                             event.preventDefault();
87793                             isImperial = !isImperial;
87794                             selection.call(redraw);
87795                         });
87796
87797                 } else {
87798                     var centerLabel = t('info_panels.measurement.' +
87799                         (note || entity.type === 'node' ? 'location' : 'center'));
87800
87801                     list
87802                         .append('li')
87803                         .text(t('info_panels.measurement.geometry') + ':')
87804                         .append('span')
87805                         .text(t('geometry.' + geometry));
87806
87807                     coordItem = list
87808                         .append('li')
87809                         .text(centerLabel + ':');
87810                     coordItem.append('span')
87811                         .text(dmsCoordinatePair(center));
87812                     coordItem.append('span')
87813                         .text(decimalCoordinatePair(center));
87814                 }
87815             }
87816
87817
87818             var panel = function(selection) {
87819                 selection.call(redraw);
87820
87821                 context.map()
87822                     .on('drawn.info-measurement', function() {
87823                         selection.call(redraw);
87824                     });
87825
87826                 context
87827                     .on('enter.info-measurement', function() {
87828                         selection.call(redraw);
87829                     });
87830             };
87831
87832             panel.off = function() {
87833                 context.map().on('drawn.info-measurement', null);
87834                 context.on('enter.info-measurement', null);
87835             };
87836
87837             panel.id = 'measurement';
87838             panel.title = t('info_panels.measurement.title');
87839             panel.key = t('info_panels.measurement.key');
87840
87841
87842             return panel;
87843         }
87844
87845         var uiInfoPanels = {
87846             background: uiPanelBackground,
87847             history: uiPanelHistory,
87848             location: uiPanelLocation,
87849             measurement: uiPanelMeasurement,
87850         };
87851
87852         function uiInfo(context) {
87853             var ids = Object.keys(uiInfoPanels);
87854             var wasActive = ['measurement'];
87855             var panels = {};
87856             var active = {};
87857
87858             // create panels
87859             ids.forEach(function(k) {
87860                 if (!panels[k]) {
87861                     panels[k] = uiInfoPanels[k](context);
87862                     active[k] = false;
87863                 }
87864             });
87865
87866
87867             function info(selection) {
87868
87869                 function redraw() {
87870                     var activeids = ids.filter(function(k) { return active[k]; }).sort();
87871
87872                     var containers = infoPanels.selectAll('.panel-container')
87873                         .data(activeids, function(k) { return k; });
87874
87875                     containers.exit()
87876                         .style('opacity', 1)
87877                         .transition()
87878                         .duration(200)
87879                         .style('opacity', 0)
87880                         .on('end', function(d) {
87881                             d3_select(this)
87882                                 .call(panels[d].off)
87883                                 .remove();
87884                         });
87885
87886                     var enter = containers.enter()
87887                         .append('div')
87888                         .attr('class', function(d) { return 'fillD2 panel-container panel-container-' + d; });
87889
87890                     enter
87891                         .style('opacity', 0)
87892                         .transition()
87893                         .duration(200)
87894                         .style('opacity', 1);
87895
87896                     var title = enter
87897                         .append('div')
87898                         .attr('class', 'panel-title fillD2');
87899
87900                     title
87901                         .append('h3')
87902                         .text(function(d) { return panels[d].title; });
87903
87904                     title
87905                         .append('button')
87906                         .attr('class', 'close')
87907                         .on('click', function (d) { toggle(d); })
87908                         .call(svgIcon('#iD-icon-close'));
87909
87910                     enter
87911                         .append('div')
87912                         .attr('class', function(d) { return 'panel-content panel-content-' + d; });
87913
87914
87915                     // redraw the panels
87916                     infoPanels.selectAll('.panel-content')
87917                         .each(function(d) {
87918                             d3_select(this).call(panels[d]);
87919                         });
87920                 }
87921
87922
87923                 function toggle(which) {
87924                     if (event) {
87925                         event.stopImmediatePropagation();
87926                         event.preventDefault();
87927                     }
87928
87929                     var activeids = ids.filter(function(k) { return active[k]; });
87930
87931                     if (which) {  // toggle one
87932                         active[which] = !active[which];
87933                         if (activeids.length === 1 && activeids[0] === which) {  // none active anymore
87934                             wasActive = [which];
87935                         }
87936                     } else {      // toggle all
87937                         if (activeids.length) {
87938                             wasActive = activeids;
87939                             activeids.forEach(function(k) { active[k] = false; });
87940                         } else {
87941                             wasActive.forEach(function(k) { active[k] = true; });
87942                         }
87943                     }
87944
87945                     redraw();
87946                 }
87947
87948
87949                 var infoPanels = selection.selectAll('.info-panels')
87950                     .data([0]);
87951
87952                 infoPanels = infoPanels.enter()
87953                     .append('div')
87954                     .attr('class', 'info-panels')
87955                     .merge(infoPanels);
87956
87957                 redraw();
87958
87959                 context.keybinding()
87960                     .on(uiCmd('⌘' + t('info_panels.key')), toggle);
87961
87962                 ids.forEach(function(k) {
87963                     var key = t('info_panels.' + k + '.key', { default: null });
87964                     if (!key) return;
87965                     context.keybinding()
87966                         .on(uiCmd('⌘⇧' + key), function() { toggle(k); });
87967                 });
87968             }
87969
87970             return info;
87971         }
87972
87973         function uiIssues(context) {
87974             var key = t('issues.key');
87975
87976             var MINSQUARE = 0;
87977             var MAXSQUARE = 20;
87978             var DEFAULTSQUARE = 5;  // see also unsquare_way.js
87979
87980             var _errorsSelection = d3_select(null);
87981             var _warningsSelection = d3_select(null);
87982             var _rulesList = d3_select(null);
87983             var _pane = d3_select(null);
87984             var _toggleButton = d3_select(null);
87985
87986             var _errors = [];
87987             var _warnings = [];
87988             var _options = {
87989                 what: context.storage('validate-what') || 'edited',    // 'all', 'edited'
87990                 where: context.storage('validate-where') || 'all'  // 'all', 'visible'
87991             };
87992
87993             // listeners
87994             context.validator().on('validated.uiIssues',
87995                 function() { window.requestIdleCallback(update); }
87996             );
87997             context.map().on('move.uiIssues',
87998                 debounce(function() { window.requestIdleCallback(update); }, 1000)
87999             );
88000
88001
88002             function addNotificationBadge(selection) {
88003                 var d = 10;
88004                 selection.selectAll('svg.notification-badge')
88005                     .data([0])
88006                     .enter()
88007                     .append('svg')
88008                     .attr('viewbox', '0 0 ' + d + ' ' + d)
88009                     .attr('class', 'notification-badge hide')
88010                     .append('circle')
88011                     .attr('cx', d / 2)
88012                     .attr('cy', d / 2)
88013                     .attr('r', (d / 2) - 1)
88014                     .attr('fill', 'currentColor');
88015             }
88016
88017
88018             function renderErrorsList(selection) {
88019                 _errorsSelection = selection
88020                     .call(drawIssuesList, 'errors', _errors);
88021             }
88022
88023
88024             function renderWarningsList(selection) {
88025                 _warningsSelection = selection
88026                     .call(drawIssuesList, 'warnings', _warnings);
88027             }
88028
88029
88030             function drawIssuesList(selection, which, issues) {
88031                 var list = selection.selectAll('.issues-list')
88032                     .data([0]);
88033
88034                 list = list.enter()
88035                     .append('ul')
88036                     .attr('class', 'layer-list issues-list ' + which + '-list')
88037                     .merge(list);
88038
88039
88040                 var items = list.selectAll('li')
88041                     .data(issues, function(d) { return d.id; });
88042
88043                 // Exit
88044                 items.exit()
88045                     .remove();
88046
88047                 // Enter
88048                 var itemsEnter = items.enter()
88049                     .append('li')
88050                     .attr('class', function (d) { return 'issue severity-' + d.severity; })
88051                     .on('click', function(d) {
88052                         context.validator().focusIssue(d);
88053                     })
88054                     .on('mouseover', function(d) {
88055                         utilHighlightEntities(d.entityIds, true, context);
88056                     })
88057                     .on('mouseout', function(d) {
88058                         utilHighlightEntities(d.entityIds, false, context);
88059                     });
88060
88061
88062                 var labelsEnter = itemsEnter
88063                     .append('div')
88064                     .attr('class', 'issue-label');
88065
88066                 var textEnter = labelsEnter
88067                     .append('span')
88068                     .attr('class', 'issue-text');
88069
88070                 textEnter
88071                     .append('span')
88072                     .attr('class', 'issue-icon')
88073                     .each(function(d) {
88074                         var iconName = '#iD-icon-' + (d.severity === 'warning' ? 'alert' : 'error');
88075                         d3_select(this)
88076                             .call(svgIcon(iconName));
88077                     });
88078
88079                 textEnter
88080                     .append('span')
88081                     .attr('class', 'issue-message');
88082
88083
88084                 labelsEnter
88085                     .append('span')
88086                     .attr('class', 'issue-autofix')
88087                     .each(function(d) {
88088                         if (!d.autoFix) return;
88089
88090                         d3_select(this)
88091                             .append('button')
88092                             .attr('title', t('issues.fix_one.title'))
88093                             .datum(d.autoFix)  // set button datum to the autofix
88094                             .attr('class', 'autofix action')
88095                             .on('click', function(d) {
88096                                 event.preventDefault();
88097                                 event.stopPropagation();
88098
88099                                 var issuesEntityIDs = d.issue.entityIds;
88100                                 utilHighlightEntities(issuesEntityIDs.concat(d.entityIds), false, context);
88101
88102                                 context.perform.apply(context, d.autoArgs);
88103                                 context.validator().validate();
88104                             })
88105                             .call(svgIcon('#iD-icon-wrench'));
88106                     });
88107
88108
88109                 // Update
88110                 items = items
88111                     .merge(itemsEnter)
88112                     .order();
88113
88114                 items.selectAll('.issue-message')
88115                     .text(function(d) {
88116                         return d.message();
88117                     });
88118
88119
88120                 // autofix
88121                 var canAutoFix = issues.filter(function(issue) { return issue.autoFix; });
88122
88123                 var autoFixAll = selection.selectAll('.autofix-all')
88124                     .data(canAutoFix.length ? [0] : []);
88125
88126                 // exit
88127                 autoFixAll.exit()
88128                     .remove();
88129
88130                 // enter
88131                 var autoFixAllEnter = autoFixAll.enter()
88132                     .insert('div', '.issues-list')
88133                     .attr('class', 'autofix-all');
88134
88135                 var linkEnter = autoFixAllEnter
88136                     .append('a')
88137                     .attr('class', 'autofix-all-link')
88138                     .attr('href', '#');
88139
88140                 linkEnter
88141                     .append('span')
88142                     .attr('class', 'autofix-all-link-text')
88143                     .text(t('issues.fix_all.title'));
88144
88145                 linkEnter
88146                     .append('span')
88147                     .attr('class', 'autofix-all-link-icon')
88148                     .call(svgIcon('#iD-icon-wrench'));
88149
88150                 if (which === 'warnings') {
88151                     renderIgnoredIssuesReset(selection);
88152                 }
88153
88154                 // update
88155                 autoFixAll = autoFixAll
88156                     .merge(autoFixAllEnter);
88157
88158                 autoFixAll.selectAll('.autofix-all-link')
88159                     .on('click', function() {
88160                         context.pauseChangeDispatch();
88161                         context.perform(actionNoop());
88162                         canAutoFix.forEach(function(issue) {
88163                             var args = issue.autoFix.autoArgs.slice();  // copy
88164                             if (typeof args[args.length - 1] !== 'function') {
88165                                 args.pop();
88166                             }
88167                             args.push(t('issues.fix_all.annotation'));
88168                             context.replace.apply(context, args);
88169                         });
88170                         context.resumeChangeDispatch();
88171                         context.validator().validate();
88172                     });
88173             }
88174
88175
88176             function updateOptionValue(d, val) {
88177                 if (!val && event && event.target) {
88178                     val = event.target.value;
88179                 }
88180
88181                 _options[d] = val;
88182                 context.storage('validate-' + d, val);
88183                 update();
88184             }
88185
88186
88187             function renderIssuesOptions(selection) {
88188                 var container = selection.selectAll('.issues-options-container')
88189                     .data([0]);
88190
88191                 container = container.enter()
88192                     .append('div')
88193                     .attr('class', 'issues-options-container')
88194                     .merge(container);
88195
88196                 var data = [
88197                     { key: 'what', values: ['edited', 'all'] },
88198                     { key: 'where', values: ['visible', 'all'] }
88199                 ];
88200
88201                 var options = container.selectAll('.issues-option')
88202                     .data(data, function(d) { return d.key; });
88203
88204                 var optionsEnter = options.enter()
88205                     .append('div')
88206                     .attr('class', function(d) { return 'issues-option issues-option-' + d.key; });
88207
88208                 optionsEnter
88209                     .append('div')
88210                     .attr('class', 'issues-option-title')
88211                     .text(function(d) { return t('issues.options.' + d.key + '.title'); });
88212
88213                 var valuesEnter = optionsEnter.selectAll('label')
88214                     .data(function(d) {
88215                         return d.values.map(function(val) { return { value: val, key: d.key }; });
88216                     })
88217                     .enter()
88218                     .append('label');
88219
88220                 valuesEnter
88221                     .append('input')
88222                     .attr('type', 'radio')
88223                     .attr('name', function(d) { return 'issues-option-' + d.key; })
88224                     .attr('value', function(d) { return d.value; })
88225                     .property('checked', function(d) { return _options[d.key] === d.value; })
88226                     .on('change', function(d) { updateOptionValue(d.key, d.value); });
88227
88228                 valuesEnter
88229                     .append('span')
88230                     .text(function(d) { return t('issues.options.' + d.key + '.' + d.value); });
88231             }
88232
88233
88234             function renderNoIssuesBox(selection) {
88235
88236                 var box = selection.append('div')
88237                     .attr('class', 'box');
88238
88239                 box
88240                     .append('div')
88241                     .call(svgIcon('#iD-icon-apply', 'pre-text'));
88242
88243                 var noIssuesMessage = box
88244                     .append('span');
88245
88246                 noIssuesMessage
88247                     .append('strong')
88248                     .attr('class', 'message');
88249
88250                 noIssuesMessage
88251                     .append('br');
88252
88253                 noIssuesMessage
88254                     .append('span')
88255                     .attr('class', 'details');
88256             }
88257
88258             function renderIgnoredIssuesReset(selection) {
88259
88260                 var ignoredIssues = context.validator()
88261                     .getIssues(Object.assign({ includeIgnored: 'only' }, _options));
88262
88263                 var resetIgnored = selection.selectAll('.reset-ignored')
88264                     .data(ignoredIssues.length ? [0] : []);
88265
88266                 // exit
88267                 resetIgnored.exit()
88268                     .remove();
88269
88270                 // enter
88271                 var resetIgnoredEnter = resetIgnored.enter()
88272                     .append('div')
88273                     .attr('class', 'reset-ignored section-footer');
88274
88275                 resetIgnoredEnter
88276                     .append('a')
88277                     .attr('href', '#');
88278
88279                 // update
88280                 resetIgnored = resetIgnored
88281                     .merge(resetIgnoredEnter);
88282
88283                 resetIgnored.select('a')
88284                     .text(t('issues.reset_ignored', { count: ignoredIssues.length.toString() }));
88285
88286                 resetIgnored.on('click', function() {
88287                         context.validator().resetIgnoredIssues();
88288                     });
88289             }
88290
88291
88292             function renderRulesList(selection) {
88293                 var container = selection.selectAll('.issues-rulelist-container')
88294                     .data([0]);
88295
88296                 var containerEnter = container.enter()
88297                     .append('div')
88298                     .attr('class', 'issues-rulelist-container');
88299
88300                 containerEnter
88301                     .append('ul')
88302                     .attr('class', 'layer-list issue-rules-list');
88303
88304                 var ruleLinks = containerEnter
88305                     .append('div')
88306                     .attr('class', 'issue-rules-links section-footer');
88307
88308                 ruleLinks
88309                     .append('a')
88310                     .attr('class', 'issue-rules-link')
88311                     .attr('href', '#')
88312                     .text(t('issues.enable_all'))
88313                     .on('click', function() {
88314                         context.validator().disableRules([]);
88315                     });
88316
88317                 ruleLinks
88318                     .append('a')
88319                     .attr('class', 'issue-rules-link')
88320                     .attr('href', '#')
88321                     .text(t('issues.disable_all'))
88322                     .on('click', function() {
88323                         var keys = context.validator().getRuleKeys();
88324                         context.validator().disableRules(keys);
88325                     });
88326
88327
88328                 // Update
88329                 container = container
88330                     .merge(containerEnter);
88331
88332                 _rulesList = container.selectAll('.issue-rules-list');
88333
88334                 updateRulesList();
88335             }
88336
88337
88338             function updateRulesList() {
88339                 var ruleKeys = context.validator().getRuleKeys();
88340                 _rulesList
88341                     .call(drawListItems, ruleKeys, 'checkbox', 'rule', toggleRule, isRuleEnabled);
88342             }
88343
88344
88345             function isRuleEnabled(d) {
88346                 return context.validator().isRuleEnabled(d);
88347             }
88348
88349
88350             function toggleRule(d) {
88351                 context.validator().toggleRule(d);
88352             }
88353
88354             function setNoIssuesText() {
88355
88356                 function checkForHiddenIssues(cases) {
88357                     for (var type in cases) {
88358                         var opts = cases[type];
88359                         var hiddenIssues = context.validator().getIssues(opts);
88360                         if (hiddenIssues.length) {
88361                             _pane.select('.issues-none .details')
88362                                 .text(t(
88363                                     'issues.no_issues.hidden_issues.' + type,
88364                                     { count: hiddenIssues.length.toString() }
88365                                 ));
88366                             return;
88367                         }
88368                     }
88369                     _pane.select('.issues-none .details')
88370                         .text(t('issues.no_issues.hidden_issues.none'));
88371                 }
88372
88373                 var messageType;
88374
88375                 if (_options.what === 'edited' && _options.where === 'visible') {
88376
88377                     messageType = 'edits_in_view';
88378
88379                     checkForHiddenIssues({
88380                         elsewhere: { what: 'edited', where: 'all' },
88381                         other_features: { what: 'all', where: 'visible' },
88382                         disabled_rules: { what: 'edited', where: 'visible', includeDisabledRules: 'only' },
88383                         other_features_elsewhere: { what: 'all', where: 'all' },
88384                         disabled_rules_elsewhere: { what: 'edited', where: 'all', includeDisabledRules: 'only' },
88385                         ignored_issues: { what: 'edited', where: 'visible', includeIgnored: 'only' },
88386                         ignored_issues_elsewhere: { what: 'edited', where: 'all', includeIgnored: 'only' }
88387                     });
88388
88389                 } else if (_options.what === 'edited' && _options.where === 'all') {
88390
88391                     messageType = 'edits';
88392
88393                     checkForHiddenIssues({
88394                         other_features: { what: 'all', where: 'all' },
88395                         disabled_rules: { what: 'edited', where: 'all', includeDisabledRules: 'only' },
88396                         ignored_issues: { what: 'edited', where: 'all', includeIgnored: 'only' }
88397                     });
88398
88399                 } else if (_options.what === 'all' && _options.where === 'visible') {
88400
88401                     messageType = 'everything_in_view';
88402
88403                     checkForHiddenIssues({
88404                         elsewhere: { what: 'all', where: 'all' },
88405                         disabled_rules: { what: 'all', where: 'visible', includeDisabledRules: 'only' },
88406                         disabled_rules_elsewhere: { what: 'all', where: 'all', includeDisabledRules: 'only' },
88407                         ignored_issues: { what: 'all', where: 'visible', includeIgnored: 'only' },
88408                         ignored_issues_elsewhere: { what: 'all', where: 'all', includeIgnored: 'only' }
88409                     });
88410                 } else if (_options.what === 'all' && _options.where === 'all') {
88411
88412                     messageType = 'everything';
88413
88414                     checkForHiddenIssues({
88415                         disabled_rules: { what: 'all', where: 'all', includeDisabledRules: 'only' },
88416                         ignored_issues: { what: 'all', where: 'all', includeIgnored: 'only' }
88417                     });
88418                 }
88419
88420                 _pane.select('.issues-none .message')
88421                     .text(t('issues.no_issues.message.' + messageType));
88422
88423             }
88424
88425
88426             function update() {
88427                 var issuesBySeverity = context.validator().getIssuesBySeverity(_options);
88428
88429                 // sort issues by distance away from the center of the map
88430                 var center = context.map().center();
88431                 var graph = context.graph();
88432                 _errors = issuesBySeverity.error.map(withDistance).sort(byDistance);
88433                 _warnings = issuesBySeverity.warning.map(withDistance).sort(byDistance);
88434
88435                 // cut off at 1000
88436                 var errorCount = _errors.length > 1000 ? '1000+' : String(_errors.length);
88437                 var warningCount = _warnings.length > 1000 ? '1000+' : String(_warnings.length);
88438                 _errors = _errors.slice(0, 1000);
88439                 _warnings = _warnings.slice(0, 1000);
88440
88441
88442                 _toggleButton.selectAll('.notification-badge')
88443                     .classed('error', (_errors.length > 0))
88444                     .classed('warning', (_errors.length === 0 && _warnings.length > 0))
88445                     .classed('hide', (_errors.length === 0 && _warnings.length === 0));
88446
88447
88448                 _pane.selectAll('.issues-errors')
88449                     .classed('hide', _errors.length === 0);
88450
88451                 if (_errors.length > 0) {
88452                     _pane.selectAll('.hide-toggle-issues_errors .hide-toggle-text')
88453                         .text(t('issues.errors.list_title', { count: errorCount }));
88454                     if (!_pane.select('.disclosure-wrap-issues_errors').classed('hide')) {
88455                         _errorsSelection
88456                             .call(drawIssuesList, 'errors', _errors);
88457                     }
88458                 }
88459
88460                 _pane.selectAll('.issues-warnings')
88461                     .classed('hide', _warnings.length === 0);
88462
88463                 if (_warnings.length > 0) {
88464                     _pane.selectAll('.hide-toggle-issues_warnings .hide-toggle-text')
88465                         .text(t('issues.warnings.list_title', { count: warningCount }));
88466                     if (!_pane.select('.disclosure-wrap-issues_warnings').classed('hide')) {
88467                         _warningsSelection
88468                             .call(drawIssuesList, 'warnings', _warnings);
88469                     }
88470                 }
88471
88472                 var hasIssues = _warnings.length > 0 || _errors.length > 0;
88473
88474                 var issuesNone = _pane.select('.issues-none');
88475                 issuesNone.classed('hide', hasIssues);
88476                 if (!hasIssues) {
88477                     renderIgnoredIssuesReset(issuesNone);
88478                     setNoIssuesText();
88479                 }
88480
88481                 if (!_pane.select('.disclosure-wrap-issues_rules').classed('hide')) {
88482                     updateRulesList();
88483                 }
88484
88485
88486                 function byDistance(a, b) {
88487                     return a.dist - b.dist;
88488                 }
88489
88490                 function withDistance(issue) {
88491                     var extent = issue.extent(graph);
88492                     var dist = extent ? geoSphericalDistance(center, extent.center()) : 0;
88493                     return Object.assign(issue, { dist: dist });
88494                 }
88495             }
88496
88497
88498             function drawListItems(selection, data, type, name, change, active) {
88499                 var items = selection.selectAll('li')
88500                     .data(data);
88501
88502                 // Exit
88503                 items.exit()
88504                     .remove();
88505
88506                 // Enter
88507                 var enter = items.enter()
88508                     .append('li');
88509
88510                 if (name === 'rule') {
88511                     enter
88512                         .call(tooltip()
88513                             .title(function(d) { return t('issues.' + d + '.tip'); })
88514                             .placement('top')
88515                         );
88516                 }
88517
88518                 var label = enter
88519                     .append('label');
88520
88521                 label
88522                     .append('input')
88523                     .attr('type', type)
88524                     .attr('name', name)
88525                     .on('change', change);
88526
88527                 label
88528                     .append('span')
88529                     .html(function(d) {
88530                         var params = {};
88531                         if (d === 'unsquare_way') {
88532                             params.val = '<span class="square-degrees"></span>';
88533                         }
88534                         return t('issues.' + d + '.title', params);
88535                     });
88536
88537                 // Update
88538                 items = items
88539                     .merge(enter);
88540
88541                 items
88542                     .classed('active', active)
88543                     .selectAll('input')
88544                     .property('checked', active)
88545                     .property('indeterminate', false);
88546
88547
88548                 // user-configurable square threshold
88549                 var degStr = context.storage('validate-square-degrees');
88550                 if (degStr === null) {
88551                     degStr = '' + DEFAULTSQUARE;
88552                 }
88553
88554                 var span = items.selectAll('.square-degrees');
88555                 var input = span.selectAll('.square-degrees-input')
88556                     .data([0]);
88557
88558                 // enter / update
88559                 input.enter()
88560                     .append('input')
88561                     .attr('type', 'number')
88562                     .attr('min', '' + MINSQUARE)
88563                     .attr('max', '' + MAXSQUARE)
88564                     .attr('step', '0.5')
88565                     .attr('class', 'square-degrees-input')
88566                     .call(utilNoAuto)
88567                     .on('input', function() {
88568                         this.style.width = (this.value.length + 1) + 'ch';   // resize
88569                     })
88570                     .on('click', function () {
88571                         event.preventDefault();
88572                         event.stopPropagation();
88573                         this.select();
88574                     })
88575                     .on('keyup', function () {
88576                         if (event.keyCode === 13) { // enter
88577                             this.blur();
88578                             this.select();
88579                         }
88580                     })
88581                     .on('blur', changeSquare)
88582                     .merge(input)
88583                     .property('value', degStr)
88584                     .style('width', (degStr.length + 1) + 'ch');   // resize
88585             }
88586
88587
88588             function changeSquare() {
88589                 var input = d3_select(this);
88590                 var degStr = utilGetSetValue(input).trim();
88591                 var degNum = parseFloat(degStr, 10);
88592
88593                 if (!isFinite(degNum)) {
88594                     degNum = DEFAULTSQUARE;
88595                 } else if (degNum > MAXSQUARE) {
88596                     degNum = MAXSQUARE;
88597                 } else if (degNum < MINSQUARE) {
88598                     degNum = MINSQUARE;
88599                 }
88600
88601                 degNum = Math.round(degNum * 10 ) / 10;   // round to 1 decimal
88602                 degStr = '' + degNum;
88603
88604                 input
88605                     .property('value', degStr)
88606                     .style('width', (degStr.length + 1) + 'ch');   // resize
88607
88608                 context.storage('validate-square-degrees', degStr);
88609                 context.validator().changeSquareThreshold(degNum);
88610             }
88611
88612
88613             function hidePane() {
88614                 context.ui().togglePanes();
88615             }
88616
88617
88618
88619             var paneTooltip = tooltip()
88620                 .placement((textDirection === 'rtl') ? 'right' : 'left')
88621                 .html(true)
88622                 .title(uiTooltipHtml(t('issues.title'), key));
88623
88624
88625
88626             uiIssues.togglePane = function() {
88627                 if (event) event.preventDefault();
88628                 paneTooltip.hide(_toggleButton);
88629                 context.ui().togglePanes(!_pane.classed('shown') ? _pane : undefined);
88630             };
88631
88632
88633             uiIssues.renderToggleButton = function(selection) {
88634                 _toggleButton = selection
88635                     .append('button')
88636                     .attr('tabindex', -1)
88637                     .on('click', uiIssues.togglePane)
88638                     .call(svgIcon('#iD-icon-alert', 'light'))
88639                     .call(addNotificationBadge)
88640                     .call(paneTooltip);
88641             };
88642
88643
88644             uiIssues.renderPane = function(selection) {
88645                 _pane = selection
88646                     .append('div')
88647                     .attr('class', 'fillL map-pane issues-pane hide')
88648                     .attr('pane', 'map-issues');
88649
88650                 var heading = _pane
88651                     .append('div')
88652                     .attr('class', 'pane-heading');
88653
88654                 heading
88655                     .append('h2')
88656                     .text(t('issues.title'));
88657
88658                 heading
88659                     .append('button')
88660                     .on('click', hidePane)
88661                     .call(svgIcon('#iD-icon-close'));
88662
88663                 var content = _pane
88664                     .append('div')
88665                     .attr('class', 'pane-content');
88666
88667                 content
88668                     .append('div')
88669                     .attr('class', 'issues-options')
88670                     .call(renderIssuesOptions);
88671
88672                 content
88673                     .append('div')
88674                     .attr('class', 'issues-none')
88675                     .call(renderNoIssuesBox);
88676
88677                 // errors
88678                 content
88679                     .append('div')
88680                     .attr('class', 'issues-errors')
88681                     .call(uiDisclosure(context, 'issues_errors', true)
88682                         .content(renderErrorsList)
88683                     );
88684
88685                 // warnings
88686                 content
88687                     .append('div')
88688                     .attr('class', 'issues-warnings')
88689                     .call(uiDisclosure(context, 'issues_warnings', true)
88690                         .content(renderWarningsList)
88691                     );
88692
88693                 // rules
88694                 content
88695                     .append('div')
88696                     .attr('class', 'issues-rules')
88697                     .call(uiDisclosure(context, 'issues_rules', false)
88698                         .title(t('issues.rules.title'))
88699                         .content(renderRulesList)
88700                     );
88701
88702                 // update();
88703
88704                 context.keybinding()
88705                     .on(key, uiIssues.togglePane);
88706             };
88707
88708             return uiIssues;
88709         }
88710
88711         function uiSettingsCustomData(context) {
88712             var dispatch$1 = dispatch('change');
88713
88714             function render(selection) {
88715                 var dataLayer = context.layers().layer('data');
88716
88717                 // keep separate copies of original and current settings
88718                 var _origSettings = {
88719                     fileList: (dataLayer && dataLayer.fileList()) || null,
88720                     url: context.storage('settings-custom-data-url')
88721                 };
88722                 var _currSettings = {
88723                     fileList: (dataLayer && dataLayer.fileList()) || null,
88724                     url: context.storage('settings-custom-data-url')
88725                 };
88726
88727                 // var example = 'https://{switch:a,b,c}.tile.openstreetmap.org/{zoom}/{x}/{y}.png';
88728                 var modal = uiConfirm(selection).okButton();
88729
88730                 modal
88731                     .classed('settings-modal settings-custom-data', true);
88732
88733                 modal.select('.modal-section.header')
88734                     .append('h3')
88735                     .text(t('settings.custom_data.header'));
88736
88737
88738                 var textSection = modal.select('.modal-section.message-text');
88739
88740                 textSection
88741                     .append('pre')
88742                     .attr('class', 'instructions-file')
88743                     .text(t('settings.custom_data.file.instructions'));
88744
88745                 textSection
88746                     .append('input')
88747                     .attr('class', 'field-file')
88748                     .attr('type', 'file')
88749                     .property('files', _currSettings.fileList)  // works for all except IE11
88750                     .on('change', function() {
88751                         var files = event.target.files;
88752                         if (files && files.length) {
88753                             _currSettings.url = '';
88754                             textSection.select('.field-url').property('value', '');
88755                             _currSettings.fileList = files;
88756                         } else {
88757                             _currSettings.fileList = null;
88758                         }
88759                     });
88760
88761                 textSection
88762                     .append('h4')
88763                     .text(t('settings.custom_data.or'));
88764
88765                 textSection
88766                     .append('pre')
88767                     .attr('class', 'instructions-url')
88768                     .text(t('settings.custom_data.url.instructions'));
88769
88770                 textSection
88771                     .append('textarea')
88772                     .attr('class', 'field-url')
88773                     .attr('placeholder', t('settings.custom_data.url.placeholder'))
88774                     .call(utilNoAuto)
88775                     .property('value', _currSettings.url);
88776
88777
88778                 // insert a cancel button
88779                 var buttonSection = modal.select('.modal-section.buttons');
88780
88781                 buttonSection
88782                     .insert('button', '.ok-button')
88783                     .attr('class', 'button cancel-button secondary-action')
88784                     .text(t('confirm.cancel'));
88785
88786
88787                 buttonSection.select('.cancel-button')
88788                     .on('click.cancel', clickCancel);
88789
88790                 buttonSection.select('.ok-button')
88791                     .attr('disabled', isSaveDisabled)
88792                     .on('click.save', clickSave);
88793
88794
88795                 function isSaveDisabled() {
88796                     return null;
88797                 }
88798
88799
88800                 // restore the original url
88801                 function clickCancel() {
88802                     textSection.select('.field-url').property('value', _origSettings.url);
88803                     context.storage('settings-custom-data-url', _origSettings.url);
88804                     this.blur();
88805                     modal.close();
88806                 }
88807
88808                 // accept the current url
88809                 function clickSave() {
88810                     _currSettings.url = textSection.select('.field-url').property('value').trim();
88811
88812                     // one or the other but not both
88813                     if (_currSettings.url) { _currSettings.fileList = null; }
88814                     if (_currSettings.fileList) { _currSettings.url = ''; }
88815
88816                     context.storage('settings-custom-data-url', _currSettings.url);
88817                     this.blur();
88818                     modal.close();
88819                     dispatch$1.call('change', this, _currSettings);
88820                 }
88821             }
88822
88823             return utilRebind(render, dispatch$1, 'on');
88824         }
88825
88826         function uiMapData(context) {
88827             var key = t('map_data.key');
88828             var osmDataToggleKey = uiCmd('⌥' + t('area_fill.wireframe.key'));
88829             var features = context.features().keys();
88830             var layers = context.layers();
88831             var fills = ['wireframe', 'partial', 'full'];
88832
88833             var settingsCustomData = uiSettingsCustomData(context)
88834                 .on('change', customChanged);
88835
88836             var _pane = d3_select(null), _toggleButton = d3_select(null);
88837
88838             var _fillSelected = context.storage('area-fill') || 'partial';
88839             var _dataLayerContainer = d3_select(null);
88840             var _photoOverlayContainer = d3_select(null);
88841             var _fillList = d3_select(null);
88842             var _featureList = d3_select(null);
88843             var _QAList = d3_select(null);
88844
88845
88846             function showsFeature(d) {
88847                 return context.features().enabled(d);
88848             }
88849
88850
88851             function autoHiddenFeature(d) {
88852                 if (d.type === 'kr_error') return context.errors().autoHidden(d);
88853                 return context.features().autoHidden(d);
88854             }
88855
88856
88857             function clickFeature(d) {
88858                 context.features().toggle(d);
88859                 update();
88860             }
88861
88862
88863             function showsQA(d) {
88864                 var QAKeys = [d];
88865                 var QALayers = layers.all().filter(function(obj) { return QAKeys.indexOf(obj.id) !== -1; });
88866                 var data = QALayers.filter(function(obj) { return obj.layer.supported(); });
88867
88868                 function layerSupported(d) {
88869                     return d.layer && d.layer.supported();
88870                 }
88871                 function layerEnabled(d) {
88872                     return layerSupported(d) && d.layer.enabled();
88873                 }
88874
88875                 return layerEnabled(data[0]);
88876             }
88877
88878
88879             function showsFill(d) {
88880                 return _fillSelected === d;
88881             }
88882
88883
88884             function setFill(d) {
88885                 fills.forEach(function(opt) {
88886                     context.surface().classed('fill-' + opt, Boolean(opt === d));
88887                 });
88888
88889                 _fillSelected = d;
88890                 context.storage('area-fill', d);
88891                 if (d !== 'wireframe') {
88892                     context.storage('area-fill-toggle', d);
88893                 }
88894                 update();
88895             }
88896
88897
88898             function showsLayer(which) {
88899                 var layer = layers.layer(which);
88900                 if (layer) {
88901                     return layer.enabled();
88902                 }
88903                 return false;
88904             }
88905
88906
88907             function setLayer(which, enabled) {
88908                 var layer = layers.layer(which);
88909                 if (layer) {
88910                     layer.enabled(enabled);
88911
88912                     if (!enabled && (which === 'osm' || which === 'notes')) {
88913                         context.enter(modeBrowse(context));
88914                     }
88915
88916                     update();
88917                 }
88918             }
88919
88920
88921             function toggleLayer(which) {
88922                 setLayer(which, !showsLayer(which));
88923             }
88924
88925
88926             function drawPhotoItems(selection) {
88927                 var photoKeys = context.photos().overlayLayerIDs();
88928                 var photoLayers = layers.all().filter(function(obj) { return photoKeys.indexOf(obj.id) !== -1; });
88929                 var data = photoLayers.filter(function(obj) { return obj.layer.supported(); });
88930
88931                 function layerSupported(d) {
88932                     return d.layer && d.layer.supported();
88933                 }
88934                 function layerEnabled(d) {
88935                     return layerSupported(d) && d.layer.enabled();
88936                 }
88937
88938                 var ul = selection
88939                     .selectAll('.layer-list-photos')
88940                     .data([0]);
88941
88942                 ul = ul.enter()
88943                     .append('ul')
88944                     .attr('class', 'layer-list layer-list-photos')
88945                     .merge(ul);
88946
88947                 var li = ul.selectAll('.list-item-photos')
88948                     .data(data);
88949
88950                 li.exit()
88951                     .remove();
88952
88953                 var liEnter = li.enter()
88954                     .append('li')
88955                     .attr('class', function(d) {
88956                         var classes = 'list-item-photos list-item-' + d.id;
88957                         if (d.id === 'mapillary-signs') {
88958                             classes += ' indented';
88959                         }
88960                         return classes;
88961                     });
88962
88963                 var labelEnter = liEnter
88964                     .append('label')
88965                     .each(function(d) {
88966                         var titleID;
88967                         if (d.id === 'mapillary-signs') titleID = 'mapillary.signs.tooltip';
88968                         else if (d.id === 'mapillary') titleID = 'mapillary_images.tooltip';
88969                         else if (d.id === 'openstreetcam') titleID = 'openstreetcam_images.tooltip';
88970                         else titleID = d.id.replace('-', '_') + '.tooltip';
88971                         d3_select(this)
88972                             .call(tooltip()
88973                                 .title(t(titleID))
88974                                 .placement('top')
88975                             );
88976                     });
88977
88978                 labelEnter
88979                     .append('input')
88980                     .attr('type', 'checkbox')
88981                     .on('change', function(d) { toggleLayer(d.id); });
88982
88983                 labelEnter
88984                     .append('span')
88985                     .text(function(d) {
88986                         var id = d.id;
88987                         if (id === 'mapillary-signs') id = 'photo_overlays.traffic_signs';
88988                         return t(id.replace('-', '_') + '.title');
88989                     });
88990
88991
88992                 // Update
88993                 li
88994                     .merge(liEnter)
88995                     .classed('active', layerEnabled)
88996                     .selectAll('input')
88997                     .property('checked', layerEnabled);
88998             }
88999
89000             function drawPhotoTypeItems(selection) {
89001                 var data = context.photos().allPhotoTypes();
89002
89003                 function typeEnabled(d) {
89004                     return context.photos().showsPhotoType(d);
89005                 }
89006
89007                 var ul = selection
89008                     .selectAll('.layer-list-photo-types')
89009                     .data(context.photos().shouldFilterByPhotoType() ? [0] : []);
89010
89011                 ul.exit()
89012                     .remove();
89013
89014                 ul = ul.enter()
89015                     .append('ul')
89016                     .attr('class', 'layer-list layer-list-photo-types')
89017                     .merge(ul);
89018
89019                 var li = ul.selectAll('.list-item-photo-types')
89020                     .data(data);
89021
89022                 li.exit()
89023                     .remove();
89024
89025                 var liEnter = li.enter()
89026                     .append('li')
89027                     .attr('class', function(d) {
89028                         return 'list-item-photo-types list-item-' + d;
89029                     });
89030
89031                 var labelEnter = liEnter
89032                     .append('label')
89033                     .each(function(d) {
89034                         d3_select(this)
89035                             .call(tooltip()
89036                                 .title(t('photo_overlays.photo_type.' + d + '.tooltip'))
89037                                 .placement('top')
89038                             );
89039                     });
89040
89041                 labelEnter
89042                     .append('input')
89043                     .attr('type', 'checkbox')
89044                     .on('change', function(d) {
89045                         context.photos().togglePhotoType(d);
89046                         update();
89047                     });
89048
89049                 labelEnter
89050                     .append('span')
89051                     .text(function(d) {
89052                         return t('photo_overlays.photo_type.' + d + '.title');
89053                     });
89054
89055
89056                 // Update
89057                 li
89058                     .merge(liEnter)
89059                     .classed('active', typeEnabled)
89060                     .selectAll('input')
89061                     .property('checked', typeEnabled);
89062             }
89063
89064
89065             function drawOsmItems(selection) {
89066                 var osmKeys = ['osm', 'notes'];
89067                 var osmLayers = layers.all().filter(function(obj) { return osmKeys.indexOf(obj.id) !== -1; });
89068
89069                 var ul = selection
89070                     .selectAll('.layer-list-osm')
89071                     .data([0]);
89072
89073                 ul = ul.enter()
89074                     .append('ul')
89075                     .attr('class', 'layer-list layer-list-osm')
89076                     .merge(ul);
89077
89078                 var li = ul.selectAll('.list-item')
89079                     .data(osmLayers);
89080
89081                 li.exit()
89082                     .remove();
89083
89084                 var liEnter = li.enter()
89085                     .append('li')
89086                     .attr('class', function(d) { return 'list-item list-item-' + d.id; });
89087
89088                 var labelEnter = liEnter
89089                     .append('label')
89090                     .each(function(d) {
89091                         if (d.id === 'osm') {
89092                             d3_select(this)
89093                                 .call(tooltip()
89094                                     .html(true)
89095                                     .title(uiTooltipHtml(t('map_data.layers.' + d.id + '.tooltip'), osmDataToggleKey))
89096                                     .placement('bottom')
89097                                 );
89098                         } else {
89099                             d3_select(this)
89100                                 .call(tooltip()
89101                                     .title(t('map_data.layers.' + d.id + '.tooltip'))
89102                                     .placement('bottom')
89103                                 );
89104                         }
89105                     });
89106
89107                 labelEnter
89108                     .append('input')
89109                     .attr('type', 'checkbox')
89110                     .on('change', function(d) { toggleLayer(d.id); });
89111
89112                 labelEnter
89113                     .append('span')
89114                     .text(function(d) { return t('map_data.layers.' + d.id + '.title'); });
89115
89116
89117                 // Update
89118                 li
89119                     .merge(liEnter)
89120                     .classed('active', function (d) { return d.layer.enabled(); })
89121                     .selectAll('input')
89122                     .property('checked', function (d) { return d.layer.enabled(); });
89123             }
89124
89125
89126             function drawQAItems(selection) {
89127                 var qaKeys = ['keepRight', 'improveOSM'];
89128                 var qaLayers = layers.all().filter(function(obj) { return qaKeys.indexOf(obj.id) !== -1; });
89129
89130                 var ul = selection
89131                     .selectAll('.layer-list-qa')
89132                     .data([0]);
89133
89134                 ul = ul.enter()
89135                     .append('ul')
89136                     .attr('class', 'layer-list layer-list-qa')
89137                     .merge(ul);
89138
89139                 var li = ul.selectAll('.list-item')
89140                     .data(qaLayers);
89141
89142                 li.exit()
89143                     .remove();
89144
89145                 var liEnter = li.enter()
89146                     .append('li')
89147                     .attr('class', function(d) { return 'list-item list-item-' + d.id; });
89148
89149                 var labelEnter = liEnter
89150                     .append('label')
89151                     .each(function(d) {
89152                         d3_select(this)
89153                             .call(tooltip()
89154                                 .title(t('map_data.layers.' + d.id + '.tooltip'))
89155                                 .placement('bottom')
89156                             );
89157                     });
89158
89159                 labelEnter
89160                     .append('input')
89161                     .attr('type', 'checkbox')
89162                     .on('change', function(d) { toggleLayer(d.id); });
89163
89164                 labelEnter
89165                     .append('span')
89166                     .text(function(d) { return t('map_data.layers.' + d.id + '.title'); });
89167
89168
89169                 // Update
89170                 li
89171                     .merge(liEnter)
89172                     .classed('active', function (d) { return d.layer.enabled(); })
89173                     .selectAll('input')
89174                     .property('checked', function (d) { return d.layer.enabled(); });
89175             }
89176
89177
89178             // Beta feature - sample vector layers to support Detroit Mapping Challenge
89179             // https://github.com/osmus/detroit-mapping-challenge
89180             function drawVectorItems(selection) {
89181                 var dataLayer = layers.layer('data');
89182                 var vtData = [
89183                     {
89184                         name: 'Detroit Neighborhoods/Parks',
89185                         src: 'neighborhoods-parks',
89186                         tooltip: 'Neighborhood boundaries and parks as compiled by City of Detroit in concert with community groups.',
89187                         template: 'https://{switch:a,b,c,d}.tiles.mapbox.com/v4/jonahadkins.cjksmur6x34562qp9iv1u3ksf-54hev,jonahadkins.cjksmqxdx33jj2wp90xd9x2md-4e5y2/{z}/{x}/{y}.vector.pbf?access_token=pk.eyJ1Ijoiam9uYWhhZGtpbnMiLCJhIjoiRlVVVkx3VSJ9.9sdVEK_B_VkEXPjssU5MqA'
89188                     }, {
89189                         name: 'Detroit Composite POIs',
89190                         src: 'composite-poi',
89191                         tooltip: 'Fire Inspections, Business Licenses, and other public location data collated from the City of Detroit.',
89192                         template: 'https://{switch:a,b,c,d}.tiles.mapbox.com/v4/jonahadkins.cjksmm6a02sli31myxhsr7zf3-2sw8h/{z}/{x}/{y}.vector.pbf?access_token=pk.eyJ1Ijoiam9uYWhhZGtpbnMiLCJhIjoiRlVVVkx3VSJ9.9sdVEK_B_VkEXPjssU5MqA'
89193                     }, {
89194                         name: 'Detroit All-The-Places POIs',
89195                         src: 'alltheplaces-poi',
89196                         tooltip: 'Public domain business location data created by web scrapers.',
89197                         template: 'https://{switch:a,b,c,d}.tiles.mapbox.com/v4/jonahadkins.cjksmswgk340g2vo06p1w9w0j-8fjjc/{z}/{x}/{y}.vector.pbf?access_token=pk.eyJ1Ijoiam9uYWhhZGtpbnMiLCJhIjoiRlVVVkx3VSJ9.9sdVEK_B_VkEXPjssU5MqA'
89198                     }
89199                 ];
89200
89201                 // Only show this if the map is around Detroit..
89202                 var detroit = geoExtent([-83.5, 42.1], [-82.8, 42.5]);
89203                 var showVectorItems = (context.map().zoom() > 9 && detroit.contains(context.map().center()));
89204
89205                 var container = selection.selectAll('.vectortile-container')
89206                     .data(showVectorItems ? [0] : []);
89207
89208                 container.exit()
89209                     .remove();
89210
89211                 var containerEnter = container.enter()
89212                     .append('div')
89213                     .attr('class', 'vectortile-container');
89214
89215                 containerEnter
89216                     .append('h4')
89217                     .attr('class', 'vectortile-header')
89218                     .text('Detroit Vector Tiles (Beta)');
89219
89220                 containerEnter
89221                     .append('ul')
89222                     .attr('class', 'layer-list layer-list-vectortile');
89223
89224                 containerEnter
89225                     .append('div')
89226                     .attr('class', 'vectortile-footer')
89227                     .append('a')
89228                     .attr('target', '_blank')
89229                     .attr('tabindex', -1)
89230                     .call(svgIcon('#iD-icon-out-link', 'inline'))
89231                     .attr('href', 'https://github.com/osmus/detroit-mapping-challenge')
89232                     .append('span')
89233                     .text('About these layers');
89234
89235                 container = container
89236                     .merge(containerEnter);
89237
89238
89239                 var ul = container.selectAll('.layer-list-vectortile');
89240
89241                 var li = ul.selectAll('.list-item')
89242                     .data(vtData);
89243
89244                 li.exit()
89245                     .remove();
89246
89247                 var liEnter = li.enter()
89248                     .append('li')
89249                     .attr('class', function(d) { return 'list-item list-item-' + d.src; });
89250
89251                 var labelEnter = liEnter
89252                     .append('label')
89253                     .each(function(d) {
89254                         d3_select(this).call(
89255                             tooltip().title(d.tooltip).placement('top')
89256                         );
89257                     });
89258
89259                 labelEnter
89260                     .append('input')
89261                     .attr('type', 'radio')
89262                     .attr('name', 'vectortile')
89263                     .on('change', selectVTLayer);
89264
89265                 labelEnter
89266                     .append('span')
89267                     .text(function(d) { return d.name; });
89268
89269                 // Update
89270                 li
89271                     .merge(liEnter)
89272                     .classed('active', isVTLayerSelected)
89273                     .selectAll('input')
89274                     .property('checked', isVTLayerSelected);
89275
89276
89277                 function isVTLayerSelected(d) {
89278                     return dataLayer && dataLayer.template() === d.template;
89279                 }
89280
89281                 function selectVTLayer(d) {
89282                     context.storage('settings-custom-data-url', d.template);
89283                     if (dataLayer) {
89284                         dataLayer.template(d.template, d.src);
89285                         dataLayer.enabled(true);
89286                     }
89287                 }
89288             }
89289
89290
89291             function drawCustomDataItems(selection) {
89292                 var dataLayer = layers.layer('data');
89293                 var hasData = dataLayer && dataLayer.hasData();
89294                 var showsData = hasData && dataLayer.enabled();
89295
89296                 var ul = selection
89297                     .selectAll('.layer-list-data')
89298                     .data(dataLayer ? [0] : []);
89299
89300                 // Exit
89301                 ul.exit()
89302                     .remove();
89303
89304                 // Enter
89305                 var ulEnter = ul.enter()
89306                     .append('ul')
89307                     .attr('class', 'layer-list layer-list-data');
89308
89309                 var liEnter = ulEnter
89310                     .append('li')
89311                     .attr('class', 'list-item-data');
89312
89313                 liEnter
89314                     .append('button')
89315                     .call(tooltip()
89316                         .title(t('settings.custom_data.tooltip'))
89317                         .placement((textDirection === 'rtl') ? 'right' : 'left')
89318                     )
89319                     .on('click', editCustom)
89320                     .call(svgIcon('#iD-icon-more'));
89321
89322                 liEnter
89323                     .append('button')
89324                     .call(tooltip()
89325                         .title(t('map_data.layers.custom.zoom'))
89326                         .placement((textDirection === 'rtl') ? 'right' : 'left')
89327                     )
89328                     .on('click', function() {
89329                         event.preventDefault();
89330                         event.stopPropagation();
89331                         dataLayer.fitZoom();
89332                     })
89333                     .call(svgIcon('#iD-icon-search'));
89334
89335                 var labelEnter = liEnter
89336                     .append('label')
89337                     .call(tooltip()
89338                         .title(t('map_data.layers.custom.tooltip'))
89339                         .placement('top')
89340                     );
89341
89342                 labelEnter
89343                     .append('input')
89344                     .attr('type', 'checkbox')
89345                     .on('change', function() { toggleLayer('data'); });
89346
89347                 labelEnter
89348                     .append('span')
89349                     .text(t('map_data.layers.custom.title'));
89350
89351                 // Update
89352                 ul = ul
89353                     .merge(ulEnter);
89354
89355                 ul.selectAll('.list-item-data')
89356                     .classed('active', showsData)
89357                     .selectAll('label')
89358                     .classed('deemphasize', !hasData)
89359                     .selectAll('input')
89360                     .property('disabled', !hasData)
89361                     .property('checked', showsData);
89362             }
89363
89364
89365             function editCustom() {
89366                 event.preventDefault();
89367                 context.container()
89368                     .call(settingsCustomData);
89369             }
89370
89371
89372             function customChanged(d) {
89373                 var dataLayer = layers.layer('data');
89374
89375                 if (d && d.url) {
89376                     dataLayer.url(d.url);
89377                 } else if (d && d.fileList) {
89378                     dataLayer.fileList(d.fileList);
89379                 }
89380             }
89381
89382
89383             function drawListItems(selection, data, type, name, change, active) {
89384                 var items = selection.selectAll('li')
89385                     .data(data);
89386
89387                 // Exit
89388                 items.exit()
89389                     .remove();
89390
89391                 // Enter
89392                 var enter = items.enter()
89393                     .append('li')
89394                     .call(tooltip()
89395                         .html(true)
89396                         .title(function(d) {
89397                             var tip = t(name + '.' + d + '.tooltip');
89398                             var key = (d === 'wireframe' ? t('area_fill.wireframe.key') : null);
89399                             if ((name === 'feature' || name === 'keepRight') && autoHiddenFeature(d)) {
89400                                 var msg = showsLayer('osm') ? t('map_data.autohidden') : t('map_data.osmhidden');
89401                                 tip += '<div>' + msg + '</div>';
89402                             }
89403                             return uiTooltipHtml(tip, key);
89404                         })
89405                         .placement('top')
89406                     );
89407
89408                 var label = enter
89409                     .append('label');
89410
89411                 label
89412                     .append('input')
89413                     .attr('type', type)
89414                     .attr('name', name)
89415                     .on('change', change);
89416
89417                 label
89418                     .append('span')
89419                     .text(function(d) { return t(name + '.' + d + '.description'); });
89420
89421                 // Update
89422                 items = items
89423                     .merge(enter);
89424
89425                 items
89426                     .classed('active', active)
89427                     .selectAll('input')
89428                     .property('checked', active)
89429                     .property('indeterminate', function(d) {
89430                         return ((name === 'feature' || name === 'keepRight') && autoHiddenFeature(d));
89431                     });
89432             }
89433
89434
89435             function renderDataLayers(selection) {
89436                 var container = selection.selectAll('.data-layer-container')
89437                     .data([0]);
89438
89439                 _dataLayerContainer = container.enter()
89440                     .append('div')
89441                     .attr('class', 'data-layer-container')
89442                     .merge(container);
89443
89444                 updateDataLayers();
89445             }
89446
89447             function renderPhotoOverlays(selection) {
89448                 var container = selection.selectAll('.photo-overlay-container')
89449                     .data([0]);
89450
89451                 _photoOverlayContainer = container.enter()
89452                     .append('div')
89453                     .attr('class', 'photo-overlay-container')
89454                     .merge(container);
89455
89456                 updatePhotoOverlays();
89457             }
89458
89459
89460             function renderFillList(selection) {
89461                 var container = selection.selectAll('.layer-fill-list')
89462                     .data([0]);
89463
89464                 _fillList = container.enter()
89465                     .append('ul')
89466                     .attr('class', 'layer-list layer-fill-list')
89467                     .merge(container);
89468
89469                 updateFillList();
89470             }
89471
89472
89473             function renderFeatureList(selection) {
89474                 var container = selection.selectAll('.layer-feature-list')
89475                     .data([0]);
89476
89477                 _featureList = container.enter()
89478                     .append('ul')
89479                     .attr('class', 'layer-list layer-feature-list')
89480                     .merge(container);
89481
89482                 updateFeatureList();
89483             }
89484
89485             function updatePhotoOverlays() {
89486                 _photoOverlayContainer
89487                     .call(drawPhotoItems)
89488                     .call(drawPhotoTypeItems);
89489             }
89490
89491             function updateDataLayers() {
89492                 _dataLayerContainer
89493                     .call(drawOsmItems)
89494                     .call(drawQAItems)
89495                     .call(drawCustomDataItems)
89496                     .call(drawVectorItems);      // Beta - Detroit mapping challenge
89497             }
89498
89499             function updateFillList() {
89500                 _fillList
89501                     .call(drawListItems, fills, 'radio', 'area_fill', setFill, showsFill);
89502             }
89503
89504             function updateFeatureList() {
89505                 _featureList
89506                     .call(drawListItems, features, 'checkbox', 'feature', clickFeature, showsFeature);
89507             }
89508
89509             function update() {
89510
89511                 if (!_pane.select('.disclosure-wrap-data_layers').classed('hide')) {
89512                     updateDataLayers();
89513                 }
89514                 if (!_pane.select('.disclosure-wrap-photo_overlays').classed('hide')) {
89515                     updatePhotoOverlays();
89516                 }
89517                 if (!_pane.select('.disclosure-wrap-fill_area').classed('hide')) {
89518                     updateFillList();
89519                 }
89520                 if (!_pane.select('.disclosure-wrap-map_features').classed('hide')) {
89521                     updateFeatureList();
89522                 }
89523
89524                 _QAList
89525                     .call(drawListItems, ['keep-right'], 'checkbox', 'QA', function(d) { toggleLayer(d); }, showsQA);
89526             }
89527
89528
89529             function toggleWireframe() {
89530                 if (event) {
89531                     event.preventDefault();
89532                     event.stopPropagation();
89533                 }
89534
89535                 if (_fillSelected === 'wireframe') {
89536                     _fillSelected = context.storage('area-fill-toggle') || 'partial';
89537                 } else {
89538                     _fillSelected = 'wireframe';
89539                 }
89540
89541                 setFill(_fillSelected);
89542                 context.map().pan([0,0]);  // trigger a redraw
89543             }
89544
89545             var paneTooltip = tooltip()
89546                 .placement((textDirection === 'rtl') ? 'right' : 'left')
89547                 .html(true)
89548                 .title(uiTooltipHtml(t('map_data.description'), key));
89549
89550             function hidePane() {
89551                 context.ui().togglePanes();
89552             }
89553
89554             uiMapData.togglePane = function() {
89555                 if (event) event.preventDefault();
89556                 paneTooltip.hide(_toggleButton);
89557                 context.ui().togglePanes(!_pane.classed('shown') ? _pane : undefined);
89558             };
89559
89560             uiMapData.renderToggleButton = function(selection) {
89561
89562                 _toggleButton = selection
89563                     .append('button')
89564                     .attr('tabindex', -1)
89565                     .on('click', uiMapData.togglePane)
89566                     .call(svgIcon('#iD-icon-data', 'light'))
89567                     .call(paneTooltip);
89568             };
89569
89570
89571             uiMapData.renderPane = function(selection) {
89572
89573                 _pane = selection
89574                     .append('div')
89575                     .attr('class', 'fillL map-pane map-data-pane hide')
89576                     .attr('pane', 'map-data');
89577
89578                 var heading = _pane
89579                     .append('div')
89580                     .attr('class', 'pane-heading');
89581
89582                 heading
89583                     .append('h2')
89584                     .text(t('map_data.title'));
89585
89586                 heading
89587                     .append('button')
89588                     .on('click', hidePane)
89589                     .call(svgIcon('#iD-icon-close'));
89590
89591
89592                 var content = _pane
89593                     .append('div')
89594                     .attr('class', 'pane-content');
89595
89596
89597                 // data layers
89598                 content
89599                     .append('div')
89600                     .attr('class', 'map-data-data-layers')
89601                     .call(uiDisclosure(context, 'data_layers', true)
89602                         .title(t('map_data.data_layers'))
89603                         .content(renderDataLayers)
89604                     );
89605
89606                 // photo overlays
89607                 content
89608                     .append('div')
89609                     .attr('class', 'map-data-photo-overlays')
89610                     .call(uiDisclosure(context, 'photo_overlays', false)
89611                         .title(t('photo_overlays.title'))
89612                         .content(renderPhotoOverlays)
89613                     );
89614
89615                 // area fills
89616                 content
89617                     .append('div')
89618                     .attr('class', 'map-data-area-fills')
89619                     .call(uiDisclosure(context, 'fill_area', false)
89620                         .title(t('map_data.fill_area'))
89621                         .content(renderFillList)
89622                     );
89623
89624                 // feature filters
89625                 content
89626                     .append('div')
89627                     .attr('class', 'map-data-feature-filters')
89628                     .call(uiDisclosure(context, 'map_features', false)
89629                         .title(t('map_data.map_features'))
89630                         .content(renderFeatureList)
89631                     );
89632
89633
89634                 // add listeners
89635                 context.features()
89636                     .on('change.map_data-update', update);
89637
89638                 update();
89639                 setFill(_fillSelected);
89640
89641                 context.keybinding()
89642                     .on(key, uiMapData.togglePane)
89643                     .on(t('area_fill.wireframe.key'), toggleWireframe)
89644                     .on(osmDataToggleKey, function() {
89645                         event.preventDefault();
89646                         event.stopPropagation();
89647                         toggleLayer('osm');
89648                     });
89649             };
89650
89651             return uiMapData;
89652         }
89653
89654         function uiNotice(context) {
89655
89656             return function(selection) {
89657                 var div = selection
89658                     .append('div')
89659                     .attr('class', 'notice');
89660
89661                 var button = div
89662                     .append('button')
89663                     .attr('class', 'zoom-to notice fillD')
89664                     .on('click', function() {
89665                         context.map().zoomEase(context.minEditableZoom());
89666                     })
89667                     .on('wheel', function() {   // let wheel events pass through #4482
89668                         var e2 = new WheelEvent(event.type, event);
89669                         context.surface().node().dispatchEvent(e2);
89670                     });
89671
89672                 button
89673                     .call(svgIcon('#iD-icon-plus', 'pre-text'))
89674                     .append('span')
89675                     .attr('class', 'label')
89676                     .text(t('zoom_in_edit'));
89677
89678
89679                 function disableTooHigh() {
89680                     var canEdit = context.map().zoom() >= context.minEditableZoom();
89681                     div.style('display', canEdit ? 'none' : 'block');
89682                 }
89683
89684                 context.map()
89685                     .on('move.notice', debounce(disableTooHigh, 500));
89686
89687                 disableTooHigh();
89688             };
89689         }
89690
89691         function uiPhotoviewer(context) {
89692
89693             var dispatch$1 = dispatch('resize');
89694
89695             function photoviewer(selection) {
89696                 selection
89697                     .append('button')
89698                     .attr('class', 'thumb-hide')
89699                     .on('click', function () {
89700                         if (services$1.streetside) { services$1.streetside.hideViewer(); }
89701                         if (services$1.mapillary) { services$1.mapillary.hideViewer(); }
89702                         if (services$1.openstreetcam) { services$1.openstreetcam.hideViewer(); }
89703                     })
89704                     .append('div')
89705                     .call(svgIcon('#iD-icon-close'));
89706
89707                 selection
89708                     .append('button')
89709                     .attr('class', 'resize-handle-xy')
89710                     .on(
89711                         'mousedown',
89712                         buildResizeListener(selection, 'resize', dispatch$1, { resizeOnX: true, resizeOnY: true })
89713                     );
89714
89715                 selection
89716                     .append('button')
89717                     .attr('class', 'resize-handle-x')
89718                     .on(
89719                         'mousedown',
89720                         buildResizeListener(selection, 'resize', dispatch$1, { resizeOnX: true })
89721                     );
89722
89723                 selection
89724                     .append('button')
89725                     .attr('class', 'resize-handle-y')
89726                     .on(
89727                         'mousedown',
89728                         buildResizeListener(selection, 'resize', dispatch$1, { resizeOnY: true })
89729                     );
89730
89731                 services$1.streetside.loadViewer(context);
89732                 services$1.mapillary.loadViewer(context);
89733                 services$1.openstreetcam.loadViewer(context);
89734
89735                 function buildResizeListener(target, eventName, dispatch, options) {
89736                     var resizeOnX = !!options.resizeOnX;
89737                     var resizeOnY = !!options.resizeOnY;
89738                     var minHeight = options.minHeight || 240;
89739                     var minWidth = options.minWidth || 320;
89740                     var startX;
89741                     var startY;
89742                     var startWidth;
89743                     var startHeight;
89744
89745                     function startResize() {
89746                         var mapSize = context.map().dimensions();
89747
89748                         if (resizeOnX) {
89749                             var maxWidth = mapSize[0];
89750                             var newWidth = clamp((startWidth + event.clientX - startX), minWidth, maxWidth);
89751                             target.style('width', newWidth + 'px');
89752                         }
89753
89754                         if (resizeOnY) {
89755                             var maxHeight = mapSize[1] - 90;  // preserve space at top/bottom of map
89756                             var newHeight = clamp((startHeight + startY - event.clientY), minHeight, maxHeight);
89757                             target.style('height', newHeight + 'px');
89758                         }
89759
89760                         dispatch.call(eventName, target, utilGetDimensions(target, true));
89761                     }
89762
89763                     function clamp(num, min, max) {
89764                         return Math.max(min, Math.min(num, max));
89765                     }
89766
89767                     function stopResize() {
89768                         d3_select(window)
89769                             .on('.' + eventName, null);
89770                     }
89771
89772                     return function initResize() {
89773                         startX = event.clientX;
89774                         startY = event.clientY;
89775                         startWidth = target.node().getBoundingClientRect().width;
89776                         startHeight = target.node().getBoundingClientRect().height;
89777
89778                         d3_select(window)
89779                             .on('mousemove.' + eventName, startResize, false)
89780                             .on('mouseup.' + eventName, stopResize, false);
89781                     };
89782                 }
89783             }
89784
89785             photoviewer.onMapResize = function() {
89786                 var photoviewer = d3_select('#photoviewer');
89787                 var content = d3_select('#content');
89788                 var mapDimensions = utilGetDimensions(content, true);
89789                 // shrink photo viewer if it is too big
89790                 // (-90 preserves space at top and bottom of map used by menus)
89791                 var photoDimensions = utilGetDimensions(photoviewer, true);
89792                 if (photoDimensions[0] > mapDimensions[0] || photoDimensions[1] > (mapDimensions[1] - 90)) {
89793                     var setPhotoDimensions = [
89794                         Math.min(photoDimensions[0], mapDimensions[0]),
89795                         Math.min(photoDimensions[1], mapDimensions[1] - 90),
89796                     ];
89797
89798                     photoviewer
89799                         .style('width', setPhotoDimensions[0] + 'px')
89800                         .style('height', setPhotoDimensions[1] + 'px');
89801
89802                     dispatch$1.call('resize', photoviewer, setPhotoDimensions);
89803                 }
89804             };
89805
89806             return utilRebind(photoviewer, dispatch$1, 'on');
89807         }
89808
89809         function uiRestore(context) {
89810
89811             return function(selection) {
89812                 if (!context.history().lock() || !context.history().restorableChanges())
89813                     return;
89814
89815                 var modalSelection = uiModal(selection, true);
89816
89817                 modalSelection.select('.modal')
89818                     .attr('class', 'modal fillL');
89819
89820                 var introModal = modalSelection.select('.content');
89821
89822                 introModal
89823                     .append('div')
89824                     .attr('class', 'modal-section')
89825                     .append('h3')
89826                     .text(t('restore.heading'));
89827
89828                 introModal
89829                     .append('div')
89830                     .attr('class','modal-section')
89831                     .append('p')
89832                     .text(t('restore.description'));
89833
89834                 var buttonWrap = introModal
89835                     .append('div')
89836                     .attr('class', 'modal-actions');
89837
89838                 var restore = buttonWrap
89839                     .append('button')
89840                     .attr('class', 'restore')
89841                     .on('click', function() {
89842                         context.history().restore();
89843                         modalSelection.remove();
89844                     });
89845
89846                 restore
89847                     .append('svg')
89848                     .attr('class', 'logo logo-restore')
89849                     .append('use')
89850                     .attr('xlink:href', '#iD-logo-restore');
89851
89852                 restore
89853                     .append('div')
89854                     .text(t('restore.restore'));
89855
89856                 var reset = buttonWrap
89857                     .append('button')
89858                     .attr('class', 'reset')
89859                     .on('click', function() {
89860                         context.history().clearSaved();
89861                         modalSelection.remove();
89862                     });
89863
89864                 reset
89865                     .append('svg')
89866                     .attr('class', 'logo logo-reset')
89867                     .append('use')
89868                     .attr('xlink:href', '#iD-logo-reset');
89869
89870                 reset
89871                     .append('div')
89872                     .text(t('restore.reset'));
89873
89874                 restore.node().focus();
89875             };
89876         }
89877
89878         function uiScale(context) {
89879             var projection = context.projection,
89880                 isImperial = (utilDetect().locale.toLowerCase() === 'en-us'),
89881                 maxLength = 180,
89882                 tickHeight = 8;
89883
89884
89885             function scaleDefs(loc1, loc2) {
89886                 var lat = (loc2[1] + loc1[1]) / 2,
89887                     conversion = (isImperial ? 3.28084 : 1),
89888                     dist = geoLonToMeters(loc2[0] - loc1[0], lat) * conversion,
89889                     scale = { dist: 0, px: 0, text: '' },
89890                     buckets, i, val, dLon;
89891
89892                 if (isImperial) {
89893                     buckets = [5280000, 528000, 52800, 5280, 500, 50, 5, 1];
89894                 } else {
89895                     buckets = [5000000, 500000, 50000, 5000, 500, 50, 5, 1];
89896                 }
89897
89898                 // determine a user-friendly endpoint for the scale
89899                 for (i = 0; i < buckets.length; i++) {
89900                     val = buckets[i];
89901                     if (dist >= val) {
89902                         scale.dist = Math.floor(dist / val) * val;
89903                         break;
89904                     } else {
89905                         scale.dist = +dist.toFixed(2);
89906                     }
89907                 }
89908
89909                 dLon = geoMetersToLon(scale.dist / conversion, lat);
89910                 scale.px = Math.round(projection([loc1[0] + dLon, loc1[1]])[0]);
89911
89912                 scale.text = displayLength(scale.dist / conversion, isImperial);
89913
89914                 return scale;
89915             }
89916
89917
89918             function update(selection) {
89919                 // choose loc1, loc2 along bottom of viewport (near where the scale will be drawn)
89920                 var dims = context.map().dimensions(),
89921                     loc1 = projection.invert([0, dims[1]]),
89922                     loc2 = projection.invert([maxLength, dims[1]]),
89923                     scale = scaleDefs(loc1, loc2);
89924
89925                 selection.select('#scale-path')
89926                     .attr('d', 'M0.5,0.5v' + tickHeight + 'h' + scale.px + 'v-' + tickHeight);
89927
89928                 selection.select('#scale-textgroup')
89929                     .attr('transform', 'translate(' + (scale.px + 8) + ',' + tickHeight + ')');
89930
89931                 selection.select('#scale-text')
89932                     .text(scale.text);
89933             }
89934
89935
89936             return function(selection) {
89937                 function switchUnits() {
89938                     isImperial = !isImperial;
89939                     selection.call(update);
89940                 }
89941
89942                 var scalegroup = selection.append('svg')
89943                     .attr('id', 'scale')
89944                     .on('click', switchUnits)
89945                     .append('g')
89946                     .attr('transform', 'translate(10,11)');
89947
89948                 scalegroup
89949                     .append('path')
89950                     .attr('id', 'scale-path');
89951
89952                 scalegroup
89953                     .append('g')
89954                     .attr('id', 'scale-textgroup')
89955                     .append('text')
89956                     .attr('id', 'scale-text');
89957
89958                 selection.call(update);
89959
89960                 context.map().on('move.scale', function() {
89961                     update(selection);
89962                 });
89963             };
89964         }
89965
89966         var pair_1 = pair$1;
89967
89968         function search(x, dims, r) {
89969           if (!dims) dims = 'NSEW';
89970           if (typeof x !== 'string') return { val: null, regex: r };
89971
89972           r = r || /[\s\,]*([NSEW])?\s*([\-|\—|\―]?[0-9.]+)°?\s*(?:([0-9.]+)['’′‘]\s*)?(?:([0-9.]+)(?:''|"|”|″)\s*)?([NSEW])?/gi;
89973
89974           var m = r.exec(x);
89975           if (!m) return { val: null, regex: r };
89976
89977           var dim = m[1] || m[5];
89978           if (dim && dims.indexOf(dim) === -1) return { val: null, regex: r };
89979
89980           return {
89981             val: (((m[2]) ? parseFloat(m[2]) : 0) +
89982                   ((m[3] ? parseFloat(m[3]) / 60 : 0)) +
89983                   ((m[4] ? parseFloat(m[4]) / 3600 : 0))) *
89984                   ((dim === 'S' || dim === 'W') ? -1 : 1),
89985             regex: r,
89986             raw: m[0],
89987             dim: dim
89988           };
89989         }
89990
89991         function pair$1(x, dims) {
89992           x = x.trim();
89993           var one = search(x, dims);
89994           if (one.val === null) return null;
89995           var two = search(x, dims, one.regex);
89996           if (two.val === null) return null;
89997           // null if one/two are not contiguous.
89998           if (one.raw + two.raw !== x) return null;
89999           if (one.dim) {
90000             return swapdim(one.val, two.val, one.dim);
90001           } else {
90002             return [one.val, two.val];
90003           }
90004         }
90005
90006         function swapdim(a, b, dim) {
90007           if (dim === 'N' || dim === 'S') return [a, b];
90008           if (dim === 'W' || dim === 'E') return [b, a];
90009         }
90010
90011         function uiFeatureList(context) {
90012             var _geocodeResults;
90013
90014
90015             function featureList(selection) {
90016                 var header = selection
90017                     .append('div')
90018                     .attr('class', 'header fillL cf');
90019
90020                 header
90021                     .append('h3')
90022                     .text(t('inspector.feature_list'));
90023
90024                 var searchWrap = selection
90025                     .append('div')
90026                     .attr('class', 'search-header');
90027
90028                 var search = searchWrap
90029                     .append('input')
90030                     .attr('placeholder', t('inspector.search'))
90031                     .attr('type', 'search')
90032                     .call(utilNoAuto)
90033                     .on('keypress', keypress)
90034                     .on('keydown', keydown)
90035                     .on('input', inputevent);
90036
90037                 searchWrap
90038                     .call(svgIcon('#iD-icon-search', 'pre-text'));
90039
90040                 var listWrap = selection
90041                     .append('div')
90042                     .attr('class', 'inspector-body');
90043
90044                 var list = listWrap
90045                     .append('div')
90046                     .attr('class', 'feature-list cf');
90047
90048                 context
90049                     .on('exit.feature-list', clearSearch);
90050                 context.map()
90051                     .on('drawn.feature-list', mapDrawn);
90052
90053                 context.keybinding()
90054                     .on(uiCmd('⌘F'), focusSearch);
90055
90056
90057                 function focusSearch() {
90058                     var mode = context.mode() && context.mode().id;
90059                     if (mode !== 'browse') return;
90060
90061                     event.preventDefault();
90062                     search.node().focus();
90063                 }
90064
90065
90066                 function keydown() {
90067                     if (event.keyCode === 27) {  // escape
90068                         search.node().blur();
90069                     }
90070                 }
90071
90072
90073                 function keypress() {
90074                     var q = search.property('value'),
90075                         items = list.selectAll('.feature-list-item');
90076                     if (event.keyCode === 13 && q.length && items.size()) {  // return
90077                         click(items.datum());
90078                     }
90079                 }
90080
90081
90082                 function inputevent() {
90083                     _geocodeResults = undefined;
90084                     drawList();
90085                 }
90086
90087
90088                 function clearSearch() {
90089                     search.property('value', '');
90090                     drawList();
90091                 }
90092
90093
90094                 function mapDrawn(e) {
90095                     if (e.full) {
90096                         drawList();
90097                     }
90098                 }
90099
90100
90101                 function features() {
90102                     var entities = {};
90103                     var result = [];
90104                     var graph = context.graph();
90105                     var q = search.property('value').toLowerCase();
90106
90107                     if (!q) return result;
90108
90109                     var idMatch = q.match(/^([nwr])([0-9]+)$/);
90110
90111                     if (idMatch) {
90112                         result.push({
90113                             id: idMatch[0],
90114                             geometry: idMatch[1] === 'n' ? 'point' : idMatch[1] === 'w' ? 'line' : 'relation',
90115                             type: idMatch[1] === 'n' ? t('inspector.node') : idMatch[1] === 'w' ? t('inspector.way') : t('inspector.relation'),
90116                             name: idMatch[2]
90117                         });
90118                     }
90119
90120                     var locationMatch = pair_1(q.toUpperCase()) || q.match(/^(-?\d+\.?\d*)\s+(-?\d+\.?\d*)$/);
90121
90122                     if (locationMatch) {
90123                         var loc = [parseFloat(locationMatch[0]), parseFloat(locationMatch[1])];
90124                         result.push({
90125                             id: -1,
90126                             geometry: 'point',
90127                             type: t('inspector.location'),
90128                             name: dmsCoordinatePair([loc[1], loc[0]]),
90129                             location: loc
90130                         });
90131                     }
90132
90133                     function addEntity(entity) {
90134                         if (entity.id in entities || result.length > 200)
90135                             return;
90136
90137                         entities[entity.id] = true;
90138
90139                         var name = utilDisplayName(entity) || '';
90140                         if (name.toLowerCase().indexOf(q) >= 0) {
90141                             var matched = context.presets().match(entity, graph);
90142                             var type = (matched && matched.name()) || utilDisplayType(entity.id);
90143
90144                             result.push({
90145                                 id: entity.id,
90146                                 entity: entity,
90147                                 geometry: context.geometry(entity.id),
90148                                 type: type,
90149                                 name: name
90150                             });
90151                         }
90152
90153                         graph.parentRelations(entity).forEach(function(parent) {
90154                             addEntity(parent);
90155                         });
90156                     }
90157
90158                     var visible = context.surface().selectAll('.point, .line, .area').nodes();
90159                     for (var i = 0; i < visible.length && result.length <= 200; i++) {
90160                         var datum = visible[i].__data__;
90161                         var entity = datum && datum.properties && datum.properties.entity;
90162                         if (entity) { addEntity(entity); }
90163                     }
90164
90165                     (_geocodeResults || []).forEach(function(d) {
90166                         if (d.osm_type && d.osm_id) {    // some results may be missing these - #1890
90167
90168                             // Make a temporary osmEntity so we can preset match
90169                             // and better localize the search result - #4725
90170                             var id = osmEntity.id.fromOSM(d.osm_type, d.osm_id);
90171                             var tags = {};
90172                             tags[d.class] = d.type;
90173
90174                             var attrs = { id: id, type: d.osm_type, tags: tags };
90175                             if (d.osm_type === 'way') {   // for ways, add some fake closed nodes
90176                                 attrs.nodes = ['a','a'];  // so that geometry area is possible
90177                             }
90178
90179                             var tempEntity = osmEntity(attrs);
90180                             var tempGraph = coreGraph([tempEntity]);
90181                             var matched = context.presets().match(tempEntity, tempGraph);
90182                             var type = (matched && matched.name()) || utilDisplayType(id);
90183
90184                             result.push({
90185                                 id: tempEntity.id,
90186                                 geometry: tempEntity.geometry(tempGraph),
90187                                 type: type,
90188                                 name: d.display_name,
90189                                 extent: new geoExtent(
90190                                     [parseFloat(d.boundingbox[3]), parseFloat(d.boundingbox[0])],
90191                                     [parseFloat(d.boundingbox[2]), parseFloat(d.boundingbox[1])])
90192                             });
90193                         }
90194                     });
90195
90196                     return result;
90197                 }
90198
90199
90200                 function drawList() {
90201                     var value = search.property('value');
90202                     var results = features();
90203
90204                     list.classed('filtered', value.length);
90205
90206                     var noResultsWorldwide = _geocodeResults && _geocodeResults.length === 0;
90207
90208                     var resultsIndicator = list.selectAll('.no-results-item')
90209                         .data([0])
90210                         .enter()
90211                         .append('button')
90212                         .property('disabled', true)
90213                         .attr('class', 'no-results-item')
90214                         .call(svgIcon('#iD-icon-alert', 'pre-text'));
90215
90216                     resultsIndicator.append('span')
90217                         .attr('class', 'entity-name');
90218
90219                     list.selectAll('.no-results-item .entity-name')
90220                         .text(noResultsWorldwide ? t('geocoder.no_results_worldwide') : t('geocoder.no_results_visible'));
90221
90222                     if (services$1.geocoder) {
90223                       list.selectAll('.geocode-item')
90224                           .data([0])
90225                           .enter()
90226                           .append('button')
90227                           .attr('class', 'geocode-item')
90228                           .on('click', geocoderSearch)
90229                           .append('div')
90230                           .attr('class', 'label')
90231                           .append('span')
90232                           .attr('class', 'entity-name')
90233                           .text(t('geocoder.search'));
90234                     }
90235
90236                     list.selectAll('.no-results-item')
90237                         .style('display', (value.length && !results.length) ? 'block' : 'none');
90238
90239                     list.selectAll('.geocode-item')
90240                         .style('display', (value && _geocodeResults === undefined) ? 'block' : 'none');
90241
90242                     list.selectAll('.feature-list-item')
90243                         .data([-1])
90244                         .remove();
90245
90246                     var items = list.selectAll('.feature-list-item')
90247                         .data(results, function(d) { return d.id; });
90248
90249                     var enter = items.enter()
90250                         .insert('button', '.geocode-item')
90251                         .attr('class', 'feature-list-item')
90252                         .on('mouseover', mouseover)
90253                         .on('mouseout', mouseout)
90254                         .on('click', click);
90255
90256                     var label = enter
90257                         .append('div')
90258                         .attr('class', 'label');
90259
90260                     label
90261                         .each(function(d) {
90262                             d3_select(this)
90263                                 .call(svgIcon('#iD-icon-' + d.geometry, 'pre-text'));
90264                         });
90265
90266                     label
90267                         .append('span')
90268                         .attr('class', 'entity-type')
90269                         .text(function(d) { return d.type; });
90270
90271                     label
90272                         .append('span')
90273                         .attr('class', 'entity-name')
90274                         .text(function(d) { return d.name; });
90275
90276                     enter
90277                         .style('opacity', 0)
90278                         .transition()
90279                         .style('opacity', 1);
90280
90281                     items.order();
90282
90283                     items.exit()
90284                         .remove();
90285                 }
90286
90287
90288                 function mouseover(d) {
90289                     if (d.id === -1) return;
90290
90291                     context.surface().selectAll(utilEntityOrMemberSelector([d.id], context.graph()))
90292                         .classed('hover', true);
90293                 }
90294
90295
90296                 function mouseout() {
90297                     context.surface().selectAll('.hover')
90298                         .classed('hover', false);
90299                 }
90300
90301
90302                 function click(d) {
90303                     event.preventDefault();
90304                     if (d.location) {
90305                         context.map().centerZoomEase([d.location[1], d.location[0]], 19);
90306                     }
90307                     else if (d.entity) {
90308                         if (d.entity.type === 'node') {
90309                             context.map().center(d.entity.loc);
90310                         } else if (d.entity.type === 'way') {
90311                             var center = context.projection(context.map().center());
90312                             var edge = geoChooseEdge(context.childNodes(d.entity), center, context.projection);
90313                             context.map().center(edge.loc);
90314                         }
90315                         context.enter(modeSelect(context, [d.entity.id]));
90316                     } else {
90317                         context.zoomToEntity(d.id);
90318                     }
90319                 }
90320
90321
90322                 function geocoderSearch() {
90323                     services$1.geocoder.search(search.property('value'), function (err, resp) {
90324                         _geocodeResults = resp || [];
90325                         drawList();
90326                     });
90327                 }
90328             }
90329
90330
90331             return featureList;
90332         }
90333
90334         function uiPresetFavoriteButton(preset, geom, context, klass) {
90335
90336             geom = context.presets().fallback(geom).id;
90337
90338             var presetFavorite = {};
90339
90340             var _button = d3_select(null);
90341
90342
90343             presetFavorite.button = function(selection) {
90344
90345                 _button = selection.selectAll('.preset-favorite-button')
90346                     .data([]);
90347
90348                 _button.exit().remove();
90349
90350                 _button = _button.enter()
90351                     .insert('button', '.tag-reference-button')
90352                     .attr('class', 'preset-favorite-button ' + klass)
90353                     .attr('title', t('icons.favorite'))
90354                     .attr('tabindex', -1)
90355                     .call(svgIcon('#iD-icon-favorite'))
90356                     .merge(_button);
90357
90358                 _button
90359                     .on('click', function () {
90360                         event.stopPropagation();
90361                         event.preventDefault();
90362
90363                         context.presets().toggleFavorite(preset, geom);
90364
90365                         update();
90366                     });
90367
90368                 update();
90369             };
90370
90371             function update() {
90372                 _button
90373                     .classed('active', context.presets().favoriteMatching(preset, geom));
90374             }
90375
90376             context.presets().on('favoritePreset.button-' + preset.id.replace(/[^a-zA-Z\d:]/g, '-') + '-' + geom, update);
90377
90378             return presetFavorite;
90379         }
90380
90381         function uiPresetIcon(context) {
90382             var preset, geometry, sizeClass = 'medium';
90383
90384             function isSmall() {
90385                 return sizeClass === 'small';
90386             }
90387
90388
90389             function presetIcon(selection) {
90390                 selection.each(render);
90391             }
90392
90393
90394             function getIcon(p, geom) {
90395                 if (isSmall() && p.isFallback && p.isFallback())
90396                     return 'iD-icon-' + p.id;
90397                 else if (p.icon)
90398                     return p.icon;
90399                 else if (geom === 'line')
90400                     return 'iD-other-line';
90401                 else if (geom === 'vertex')
90402                     return p.isFallback() ? '' : 'temaki-vertex';
90403                 else if (isSmall() && geom === 'point')
90404                     return '';
90405                 else
90406                     return 'maki-marker-stroked';
90407             }
90408
90409             function renderPointBorder(enter) {
90410                 var w = 40, h = 40;
90411                 enter = enter
90412                     .append('svg')
90413                     .attr('class', 'preset-icon-fill preset-icon-point-border')
90414                     .attr('width', w)
90415                     .attr('height', h)
90416                     .attr('viewBox', '0 0 ' + w + ' ' + h);
90417
90418                 enter.append('path')
90419                     .attr('transform', 'translate(11.5, 8)')
90420                     .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');
90421             }
90422
90423             function renderCircleFill(fillEnter) {
90424                 var w = 60, h = 60, d = 40;
90425                 fillEnter = fillEnter
90426                     .append('svg')
90427                     .attr('class', 'preset-icon-fill preset-icon-fill-vertex')
90428                     .attr('width', w)
90429                     .attr('height', h)
90430                     .attr('viewBox', '0 0 ' + w + ' ' + h);
90431
90432                 fillEnter.append('circle')
90433                     .attr('cx', w/2)
90434                     .attr('cy', h/2)
90435                     .attr('r', d/2);
90436             }
90437
90438             function renderSquareFill(fillEnter) {
90439                 var d = isSmall() ? 40 : 60;
90440                 var w = d, h = d, l = d*2/3, c1 = (w-l)/2, c2 = c1 + l;
90441                 fillEnter = fillEnter
90442                     .append('svg')
90443                     .attr('class', 'preset-icon-fill preset-icon-fill-area')
90444                     .attr('width', w)
90445                     .attr('height', h)
90446                     .attr('viewBox', '0 0 ' + w + ' ' + h);
90447
90448                 var data = 'M' + c1 + ' ' + c1 + ' L' + c1 + ' ' + c2 + ' L' + c2 + ' ' + c2 + ' L' + c2 + ' ' + c1 + ' Z';
90449
90450                 fillEnter.append('path')
90451                     .attr('d', data)
90452                     .attr('class', 'line area fill');
90453
90454                 fillEnter.append('path')
90455                     .attr('d', data)
90456                     .attr('class', 'line area stroke');
90457
90458                 var r = 2.5;
90459                 var coordinates = [c1, c2];
90460                 for (var xIndex in coordinates) {
90461                     for (var yIndex in coordinates) {
90462                         fillEnter.append('circle')
90463                             .attr('class', 'vertex')
90464                             .attr('cx', coordinates[xIndex])
90465                             .attr('cy', coordinates[yIndex])
90466                             .attr('r', r);
90467                     }
90468                 }
90469
90470                 if (!isSmall()) {
90471                     var midCoordinates = [[c1, w/2], [c2, w/2], [h/2, c1], [h/2, c2]];
90472                     for (var index in midCoordinates) {
90473                         var loc = midCoordinates[index];
90474                         fillEnter.append('circle')
90475                             .attr('class', 'midpoint')
90476                             .attr('cx', loc[0])
90477                             .attr('cy', loc[1])
90478                             .attr('r', 1.25);
90479                     }
90480                 }
90481
90482             }
90483
90484             function renderLine(lineEnter) {
90485                 var d = isSmall() ? 40 : 60;
90486                 // draw the line parametrically
90487                 var w = d, h = d, y = Math.round(d*0.72), l = Math.round(d*0.6), r = 2.5;
90488                 var x1 = (w - l)/2, x2 = x1 + l;
90489
90490                 lineEnter = lineEnter
90491                     .append('svg')
90492                     .attr('class', 'preset-icon-line')
90493                     .attr('width', w)
90494                     .attr('height', h)
90495                     .attr('viewBox', '0 0 ' + w + ' ' + h);
90496
90497                 ['casing', 'stroke'].forEach(function(klass) {
90498                     lineEnter.append('path')
90499                         .attr('d', 'M' + x1 + ' ' + y + ' L' + x2 + ' ' + y)
90500                         .attr('class', 'line ' + klass);
90501                 });
90502
90503                 [[x1 - 1, y], [x2 + 1, y]].forEach(function(loc) {
90504                     lineEnter.append('circle')
90505                         .attr('class', 'vertex')
90506                         .attr('cx', loc[0])
90507                         .attr('cy', loc[1])
90508                         .attr('r', r);
90509                 });
90510             }
90511
90512             function renderRoute(routeEnter) {
90513                 var d = isSmall() ? 40 : 60;
90514                 // draw the route parametrically
90515                 var w = d,
90516                     h = d,
90517                     y1 = Math.round(d*0.80),
90518                     y2 = Math.round(d*0.68),
90519                     l = Math.round(d*0.6),
90520                     r = 2;
90521                 var x1 = (w - l)/2, x2 = x1 + l/3, x3 = x2 + l/3, x4 = x3 + l/3;
90522
90523                 routeEnter = routeEnter
90524                     .append('svg')
90525                     .attr('class', 'preset-icon-route')
90526                     .attr('width', w)
90527                     .attr('height', h)
90528                     .attr('viewBox', '0 0 ' + w + ' ' + h);
90529
90530                 ['casing', 'stroke'].forEach(function(klass) {
90531                     routeEnter.append('path')
90532                         .attr('d', 'M' + x1 + ' ' + y1 + ' L' + x2 + ' ' + y2)
90533                         .attr('class', 'segment0 line ' + klass);
90534                     routeEnter.append('path')
90535                         .attr('d', 'M' + x2 + ' ' + y2 + ' L' + x3 + ' ' + y1)
90536                         .attr('class', 'segment1 line ' + klass);
90537                     routeEnter.append('path')
90538                         .attr('d', 'M' + x3 + ' ' + y1 + ' L' + x4 + ' ' + y2)
90539                         .attr('class', 'segment2 line ' + klass);
90540                 });
90541
90542                 [[x1, y1], [x2, y2], [x3, y1], [x4, y2]].forEach(function(loc) {
90543                     routeEnter.append('circle')
90544                         .attr('class', 'vertex')
90545                         .attr('cx', loc[0])
90546                         .attr('cy', loc[1])
90547                         .attr('r', r);
90548                 });
90549             }
90550
90551             var routeSegements = {
90552                 bicycle: ['highway/cycleway', 'highway/cycleway', 'highway/cycleway'],
90553                 bus: ['highway/unclassified', 'highway/secondary', 'highway/primary'],
90554                 detour: ['highway/tertiary', 'highway/residential', 'highway/unclassified'],
90555                 ferry: ['route/ferry', 'route/ferry', 'route/ferry'],
90556                 foot: ['highway/footway', 'highway/footway', 'highway/footway'],
90557                 hiking: ['highway/path', 'highway/path', 'highway/path'],
90558                 horse: ['highway/bridleway', 'highway/bridleway', 'highway/bridleway'],
90559                 light_rail: ['railway/light_rail', 'railway/light_rail', 'railway/light_rail'],
90560                 monorail: ['railway/monorail', 'railway/monorail', 'railway/monorail'],
90561                 pipeline: ['man_made/pipeline', 'man_made/pipeline', 'man_made/pipeline'],
90562                 piste: ['piste/downhill', 'piste/hike', 'piste/nordic'],
90563                 power: ['power/line', 'power/line', 'power/line'],
90564                 road: ['highway/secondary', 'highway/primary', 'highway/trunk'],
90565                 subway: ['railway/subway', 'railway/subway', 'railway/subway'],
90566                 train: ['railway/rail', 'railway/rail', 'railway/rail'],
90567                 tram: ['railway/tram', 'railway/tram', 'railway/tram'],
90568                 waterway: ['waterway/stream', 'waterway/stream', 'waterway/stream']
90569             };
90570
90571             function render() {
90572
90573                 var p = preset.apply(this, arguments);
90574                 var isFallback = isSmall() && p.isFallback && p.isFallback();
90575                 var geom = geometry ? geometry.apply(this, arguments) : null;
90576                 if (geom === 'relation' && p.tags && ((p.tags.type === 'route' && p.tags.route && routeSegements[p.tags.route]) || p.tags.type === 'waterway')) {
90577                     geom = 'route';
90578                 }
90579                 var imageURL = p.imageURL;
90580                 var picon = imageURL ? null : getIcon(p, geom);
90581                 var isMaki = picon && /^maki-/.test(picon);
90582                 var isTemaki = picon && /^temaki-/.test(picon);
90583                 var isFa = picon && /^fa[srb]-/.test(picon);
90584                 var isTnp = picon && /^tnp-/.test(picon);
90585                 var isiDIcon = picon && !(isMaki || isTemaki || isFa || isTnp);
90586                 var isCategory = !p.setTags;
90587                 var drawPoint = picon && geom === 'point' && isSmall() && !isFallback;
90588                 var drawVertex = picon !== null && geom === 'vertex' && (!isSmall() || !isFallback);
90589                 var drawLine = picon && geom === 'line' && !isFallback && !isCategory;
90590                 var drawArea = picon && geom === 'area' && !isFallback;
90591                 var drawRoute = picon && geom === 'route';
90592                 var isFramed = (drawVertex || drawArea || drawLine || drawRoute);
90593
90594                 var tags = !isCategory ? p.setTags({}, geom) : {};
90595                 for (var k in tags) {
90596                     if (tags[k] === '*') {
90597                         tags[k] = 'yes';
90598                     }
90599                 }
90600                 var tagClasses = svgTagClasses().getClassesString(tags, '');
90601
90602                 var selection = d3_select(this);
90603
90604                 var container = selection.selectAll('.preset-icon-container')
90605                     .data([0]);
90606
90607                 container = container.enter()
90608                     .append('div')
90609                     .attr('class', 'preset-icon-container ' + sizeClass)
90610                     .merge(container);
90611
90612                 container.classed('fallback', isFallback);
90613
90614                 var imageIcon = container.selectAll('img.image-icon')
90615                     .data(imageURL ? [0] : []);
90616
90617                 imageIcon.exit()
90618                     .remove();
90619
90620                 imageIcon = imageIcon.enter()
90621                     .append('img')
90622                     .attr('class', 'image-icon')
90623                     .merge(imageIcon);
90624
90625                 imageIcon
90626                     .attr('src', imageURL);
90627
90628                 var pointBorder = container.selectAll('.preset-icon-point-border')
90629                     .data(drawPoint ? [0] : []);
90630
90631                 pointBorder.exit()
90632                     .remove();
90633
90634                 var pointBorderEnter = pointBorder.enter();
90635                 renderPointBorder(pointBorderEnter);
90636                 pointBorder = pointBorderEnter.merge(pointBorder);
90637
90638
90639                 var vertexFill = container.selectAll('.preset-icon-fill-vertex')
90640                     .data(drawVertex ? [0] : []);
90641
90642                 vertexFill.exit()
90643                     .remove();
90644
90645                 var vertexFillEnter = vertexFill.enter();
90646                 renderCircleFill(vertexFillEnter);
90647                 vertexFill = vertexFillEnter.merge(vertexFill);
90648
90649
90650                 var fill = container.selectAll('.preset-icon-fill-area')
90651                     .data(drawArea ? [0] : []);
90652
90653                 fill.exit()
90654                     .remove();
90655
90656                 var fillEnter = fill.enter();
90657                 renderSquareFill(fillEnter);
90658                 fill = fillEnter.merge(fill);
90659
90660                 fill.selectAll('path.stroke')
90661                     .attr('class', 'area stroke ' + tagClasses);
90662                 fill.selectAll('path.fill')
90663                     .attr('class', 'area fill ' + tagClasses);
90664
90665
90666                 var line = container.selectAll('.preset-icon-line')
90667                     .data(drawLine ? [0] : []);
90668
90669                 line.exit()
90670                     .remove();
90671
90672                 var lineEnter = line.enter();
90673                 renderLine(lineEnter);
90674
90675                 line = lineEnter.merge(line);
90676
90677                 line.selectAll('path.stroke')
90678                     .attr('class', 'line stroke ' + tagClasses);
90679                 line.selectAll('path.casing')
90680                     .attr('class', 'line casing ' + tagClasses);
90681
90682                 var route = container.selectAll('.preset-icon-route')
90683                     .data(drawRoute ? [0] : []);
90684
90685                 route.exit()
90686                     .remove();
90687
90688                 var routeEnter = route.enter();
90689                 renderRoute(routeEnter);
90690
90691                 route = routeEnter.merge(route);
90692
90693                 if (drawRoute) {
90694                     var routeType = p.tags.type === 'waterway' ? 'waterway' : p.tags.route;
90695                     var segmentPresetIDs = routeSegements[routeType];
90696                     for (var segmentIndex in segmentPresetIDs) {
90697                         var segmentPreset = context.presets().item(segmentPresetIDs[segmentIndex]);
90698                         var segmentTagClasses = svgTagClasses().getClassesString(segmentPreset.tags, '');
90699                         route.selectAll('path.stroke.segment' + segmentIndex)
90700                             .attr('class', 'segment' + segmentIndex + ' line stroke ' + segmentTagClasses);
90701                         route.selectAll('path.casing.segment' + segmentIndex)
90702                             .attr('class', 'segment' + segmentIndex + ' line casing ' + segmentTagClasses);
90703                     }
90704
90705                 }
90706
90707
90708                 var icon = container.selectAll('.preset-icon')
90709                     .data(picon ? [0] : []);
90710
90711                 icon.exit()
90712                     .remove();
90713
90714                 icon = icon.enter()
90715                     .append('div')
90716                     .attr('class', 'preset-icon')
90717                     .call(svgIcon(''))
90718                     .merge(icon);
90719
90720                 icon
90721                     .attr('class', 'preset-icon ' + (geom ? geom + '-geom' : ''))
90722                     .classed('framed', isFramed)
90723                     .classed('preset-icon-iD', isiDIcon);
90724
90725                 icon.selectAll('svg')
90726                     .attr('class', function() {
90727                         return 'icon ' + picon + ' ' + (!isiDIcon && geom !== 'line'  ? '' : tagClasses);
90728                     });
90729
90730                 icon.selectAll('use')
90731                     .attr('href', '#' + picon + (isMaki ? (isSmall() && geom === 'point' ? '-11' : '-15') : ''));
90732
90733             }
90734
90735
90736             presetIcon.preset = function(val) {
90737                 if (!arguments.length) return preset;
90738                 preset = utilFunctor(val);
90739                 return presetIcon;
90740             };
90741
90742
90743             presetIcon.geometry = function(val) {
90744                 if (!arguments.length) return geometry;
90745                 geometry = utilFunctor(val);
90746                 return presetIcon;
90747             };
90748
90749
90750             presetIcon.sizeClass = function(val) {
90751                 if (!arguments.length) return sizeClass;
90752                 sizeClass = val;
90753                 return presetIcon;
90754             };
90755
90756             return presetIcon;
90757         }
90758
90759         function uiRawMemberEditor(context) {
90760             var taginfo = services$1.taginfo;
90761             var _entityID;
90762             var _contentSelection = d3_select(null);
90763             var _maxMembers = 1000;
90764
90765             function downloadMember(d) {
90766                 event.preventDefault();
90767
90768                 // display the loading indicator
90769                 d3_select(this.parentNode).classed('tag-reference-loading', true);
90770                 context.loadEntity(d.id, function() {
90771                     updateDisclosureContent(_contentSelection);
90772                 });
90773             }
90774
90775             function zoomToMember(d) {
90776                 event.preventDefault();
90777
90778                 var entity = context.entity(d.id);
90779                 context.map().zoomTo(entity);
90780
90781                 // highlight the feature in case it wasn't previously on-screen
90782                 utilHighlightEntities([d.id], true, context);
90783             }
90784
90785
90786             function selectMember(d) {
90787                 event.preventDefault();
90788
90789                 // remove the hover-highlight styling
90790                 utilHighlightEntities([d.id], false, context);
90791
90792                 var entity = context.entity(d.id);
90793                 var mapExtent = context.map().extent();
90794                 if (!entity.intersects(mapExtent, context.graph())) {
90795                     // zoom to the entity if its extent is not visible now
90796                     context.map().zoomToEase(entity);
90797                 }
90798
90799                 context.enter(modeSelect(context, [d.id]));
90800             }
90801
90802
90803             function changeRole(d) {
90804                 var oldRole = d.role;
90805                 var newRole = d3_select(this).property('value');
90806
90807                 if (oldRole !== newRole) {
90808                     var member = { id: d.id, type: d.type, role: newRole };
90809                     context.perform(
90810                         actionChangeMember(d.relation.id, member, d.index),
90811                         t('operations.change_role.annotation')
90812                     );
90813                 }
90814             }
90815
90816
90817             function deleteMember(d) {
90818
90819                 // remove the hover-highlight styling
90820                 utilHighlightEntities([d.id], false, context);
90821
90822                 context.perform(
90823                     actionDeleteMember(d.relation.id, d.index),
90824                     t('operations.delete_member.annotation')
90825                 );
90826
90827                 if (!context.hasEntity(d.relation.id)) {
90828                     context.enter(modeBrowse(context));
90829                 }
90830             }
90831
90832             function updateDisclosureContent(selection) {
90833                 _contentSelection = selection;
90834
90835                 var memberships = [];
90836                 var entity = context.entity(_entityID);
90837                 entity.members.slice(0, _maxMembers).forEach(function(member, index) {
90838                     memberships.push({
90839                         index: index,
90840                         id: member.id,
90841                         type: member.type,
90842                         role: member.role,
90843                         relation: entity,
90844                         member: context.hasEntity(member.id)
90845                     });
90846                 });
90847
90848                 var list = selection.selectAll('.member-list')
90849                     .data([0]);
90850
90851                 list = list.enter()
90852                     .append('ul')
90853                     .attr('class', 'member-list')
90854                     .merge(list);
90855
90856
90857                 var items = list.selectAll('li')
90858                     .data(memberships, function(d) {
90859                         return osmEntity.key(d.relation) + ',' + d.index + ',' +
90860                             (d.member ? osmEntity.key(d.member) : 'incomplete');
90861                     });
90862
90863                 items.exit()
90864                     .each(unbind)
90865                     .remove();
90866
90867                 var itemsEnter = items.enter()
90868                     .append('li')
90869                     .attr('class', 'member-row form-field')
90870                     .classed('member-incomplete', function(d) { return !d.member; });
90871
90872                 itemsEnter
90873                     .each(function(d) {
90874                         var item = d3_select(this);
90875
90876                         var label = item
90877                             .append('label')
90878                             .attr('class', 'field-label');
90879
90880                         if (d.member) {
90881                             // highlight the member feature in the map while hovering on the list item
90882                             item
90883                                 .on('mouseover', function() {
90884                                     utilHighlightEntities([d.id], true, context);
90885                                 })
90886                                 .on('mouseout', function() {
90887                                     utilHighlightEntities([d.id], false, context);
90888                                 });
90889
90890                             var labelLink = label
90891                                 .append('span')
90892                                 .attr('class', 'label-text')
90893                                 .append('a')
90894                                 .attr('href', '#')
90895                                 .on('click', selectMember);
90896
90897                             labelLink
90898                                 .append('span')
90899                                 .attr('class', 'member-entity-type')
90900                                 .text(function(d) {
90901                                     var matched = context.presets().match(d.member, context.graph());
90902                                     return (matched && matched.name()) || utilDisplayType(d.member.id);
90903                                 });
90904
90905                             labelLink
90906                                 .append('span')
90907                                 .attr('class', 'member-entity-name')
90908                                 .text(function(d) { return utilDisplayName(d.member); });
90909
90910                             label
90911                                 .append('button')
90912                                 .attr('class', 'member-zoom')
90913                                 .attr('title', t('icons.zoom_to'))
90914                                 .attr('tabindex', -1)
90915                                 .call(svgIcon('#iD-icon-geolocate'))
90916                                 .on('click', zoomToMember);
90917
90918                         } else {
90919                             var labelText = label
90920                                 .append('span')
90921                                 .attr('class', 'label-text');
90922
90923                             labelText
90924                                 .append('span')
90925                                 .attr('class', 'member-entity-type')
90926                                 .text(t('inspector.' + d.type, { id: d.id }));
90927
90928                             labelText
90929                                 .append('span')
90930                                 .attr('class', 'member-entity-name')
90931                                 .text(t('inspector.incomplete', { id: d.id }));
90932
90933                             label
90934                                 .append('button')
90935                                 .attr('class', 'member-download')
90936                                 .attr('title', t('icons.download'))
90937                                 .attr('tabindex', -1)
90938                                 .call(svgIcon('#iD-icon-load'))
90939                                 .on('click', downloadMember);
90940                         }
90941                     });
90942
90943                 var wrapEnter = itemsEnter
90944                     .append('div')
90945                     .attr('class', 'form-field-input-wrap form-field-input-member');
90946
90947                 wrapEnter
90948                     .append('input')
90949                     .attr('class', 'member-role')
90950                     .property('type', 'text')
90951                     .attr('maxlength', 255)
90952                     .attr('placeholder', t('inspector.role'))
90953                     .call(utilNoAuto);
90954
90955                 wrapEnter
90956                     .append('button')
90957                     .attr('tabindex', -1)
90958                     .attr('title', t('icons.remove'))
90959                     .attr('class', 'remove form-field-button member-delete')
90960                     .call(svgIcon('#iD-operation-delete'));
90961
90962                 if (taginfo) {
90963                     wrapEnter.each(bindTypeahead);
90964                 }
90965
90966                 var dragOrigin, targetIndex;
90967
90968                 itemsEnter.call(d3_drag()
90969                     .on('start', function() {
90970                         dragOrigin = {
90971                             x: event.x,
90972                             y: event.y
90973                         };
90974                         targetIndex = null;
90975                     })
90976                     .on('drag', function(d, index) {
90977                         var x = event.x - dragOrigin.x,
90978                             y = event.y - dragOrigin.y;
90979
90980                         if (!d3_select(this).classed('dragging') &&
90981                             // don't display drag until dragging beyond a distance threshold
90982                             Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2)) <= 5) return;
90983
90984                         d3_select(this)
90985                             .classed('dragging', true);
90986
90987                         targetIndex = null;
90988
90989                         selection.selectAll('li.member-row')
90990                             .style('transform', function(d2, index2) {
90991                                 var node = d3_select(this).node();
90992                                 if (index === index2) {
90993                                     return 'translate(' + x + 'px, ' + y + 'px)';
90994                                 } else if (index2 > index && event.y > node.offsetTop - node.offsetHeight) {
90995                                     if (targetIndex === null || index2 > targetIndex) {
90996                                         targetIndex = index2;
90997                                     }
90998                                     return 'translateY(-100%)';
90999                                 } else if (index2 < index && event.y < node.offsetTop) {
91000                                     if (targetIndex === null || index2 < targetIndex) {
91001                                         targetIndex = index2;
91002                                     }
91003                                     return 'translateY(100%)';
91004                                 }
91005                                 return null;
91006                             });
91007                     })
91008                     .on('end', function(d, index) {
91009
91010                         if (!d3_select(this).classed('dragging')) {
91011                             return;
91012                         }
91013
91014                         d3_select(this)
91015                             .classed('dragging', false);
91016
91017                         selection.selectAll('li.member-row')
91018                             .style('transform', null);
91019
91020                         if (targetIndex !== null) {
91021                             // dragged to a new position, reorder
91022                             context.perform(
91023                                 actionMoveMember(d.relation.id, index, targetIndex),
91024                                 t('operations.reorder_members.annotation')
91025                             );
91026                         }
91027                     })
91028                 );
91029
91030
91031                 // update
91032                 items = items
91033                     .merge(itemsEnter);
91034
91035                 items.select('input.member-role')
91036                     .property('value', function(d) { return d.role; })
91037                     .on('blur', changeRole)
91038                     .on('change', changeRole);
91039
91040                 items.select('button.member-delete')
91041                     .on('click', deleteMember);
91042
91043
91044
91045                 function bindTypeahead(d) {
91046                     var row = d3_select(this);
91047                     var role = row.selectAll('input.member-role');
91048                     var origValue = role.property('value');
91049
91050                     function sort(value, data) {
91051                         var sameletter = [];
91052                         var other = [];
91053                         for (var i = 0; i < data.length; i++) {
91054                             if (data[i].value.substring(0, value.length) === value) {
91055                                 sameletter.push(data[i]);
91056                             } else {
91057                                 other.push(data[i]);
91058                             }
91059                         }
91060                         return sameletter.concat(other);
91061                     }
91062
91063                     role.call(uiCombobox(context, 'member-role')
91064                         .fetcher(function(role, callback) {
91065                             // The `geometry` param is used in the `taginfo.js` interface for
91066                             // filtering results, as a key into the `tag_members_fractions`
91067                             // object.  If we don't know the geometry because the member is
91068                             // not yet downloaded, it's ok to guess based on type.
91069                             var geometry;
91070                             if (d.member) {
91071                                 geometry = context.geometry(d.member.id);
91072                             } else if (d.type === 'relation') {
91073                                 geometry = 'relation';
91074                             } else if (d.type === 'way') {
91075                                 geometry = 'line';
91076                             } else {
91077                                 geometry = 'point';
91078                             }
91079
91080                             var rtype = entity.tags.type;
91081                             taginfo.roles({
91082                                 debounce: true,
91083                                 rtype: rtype || '',
91084                                 geometry: geometry,
91085                                 query: role
91086                             }, function(err, data) {
91087                                 if (!err) callback(sort(role, data));
91088                             });
91089                         })
91090                         .on('cancel', function() {
91091                             role.property('value', origValue);
91092                         })
91093                     );
91094                 }
91095
91096
91097                 function unbind() {
91098                     var row = d3_select(this);
91099
91100                     row.selectAll('input.member-role')
91101                         .call(uiCombobox.off);
91102                 }
91103             }
91104
91105             function rawMemberEditor(selection) {
91106                 var entity = context.entity(_entityID);
91107
91108                 var gt = entity.members.length > _maxMembers ? '>' : '';
91109                 selection.call(uiDisclosure(context, 'raw_member_editor', true)
91110                     .title(t('inspector.all_members') + ' (' + gt + entity.members.slice(0, _maxMembers).length + ')')
91111                     .expanded(true)
91112                     .updatePreference(false)
91113                     .on('toggled', function(expanded) {
91114                         if (expanded) {
91115                             selection.node().parentNode.scrollTop += 200;
91116                         }
91117                     })
91118                     .content(updateDisclosureContent)
91119                 );
91120             }
91121
91122             rawMemberEditor.entityID = function(val) {
91123                 if (!arguments.length) return _entityID;
91124                 _entityID = val;
91125                 return rawMemberEditor;
91126             };
91127
91128
91129             return rawMemberEditor;
91130         }
91131
91132         function uiRawMembershipEditor(context) {
91133             var taginfo = services$1.taginfo;
91134             var nearbyCombo = uiCombobox(context, 'parent-relation')
91135                 .minItems(1)
91136                 .fetcher(fetchNearbyRelations);
91137             var _inChange = false;
91138             var _entityID;
91139             var _showBlank;
91140
91141
91142             function selectRelation(d) {
91143                 event.preventDefault();
91144
91145                 // remove the hover-highlight styling
91146                 utilHighlightEntities([d.relation.id], false, context);
91147
91148                 context.enter(modeSelect(context, [d.relation.id]));
91149             }
91150
91151
91152             function changeRole(d) {
91153                 if (d === 0) return;    // called on newrow (shoudn't happen)
91154                 if (_inChange) return;  // avoid accidental recursive call #5731
91155
91156                 var oldRole = d.member.role;
91157                 var newRole = d3_select(this).property('value');
91158
91159                 if (oldRole !== newRole) {
91160                     _inChange = true;
91161                     context.perform(
91162                         actionChangeMember(d.relation.id, Object.assign({}, d.member, { role: newRole }), d.index),
91163                         t('operations.change_role.annotation')
91164                     );
91165                 }
91166                 _inChange = false;
91167             }
91168
91169
91170             function addMembership(d, role) {
91171                 this.blur();           // avoid keeping focus on the button
91172                 _showBlank = false;
91173
91174                 var member = { id: _entityID, type: context.entity(_entityID).type, role: role };
91175
91176                 if (d.relation) {
91177                     context.perform(
91178                         actionAddMember(d.relation.id, member),
91179                         t('operations.add_member.annotation')
91180                     );
91181
91182                 } else {
91183                     var relation = osmRelation();
91184                     context.perform(
91185                         actionAddEntity(relation),
91186                         actionAddMember(relation.id, member),
91187                         t('operations.add.annotation.relation')
91188                     );
91189
91190                     context.enter(modeSelect(context, [relation.id]).newFeature(true));
91191                 }
91192             }
91193
91194
91195             function deleteMembership(d) {
91196                 this.blur();           // avoid keeping focus on the button
91197                 if (d === 0) return;   // called on newrow (shoudn't happen)
91198
91199                 // remove the hover-highlight styling
91200                 utilHighlightEntities([d.relation.id], false, context);
91201
91202                 context.perform(
91203                     actionDeleteMember(d.relation.id, d.index),
91204                     t('operations.delete_member.annotation')
91205                 );
91206             }
91207
91208
91209             function fetchNearbyRelations(q, callback) {
91210                 var newRelation = { relation: null, value: t('inspector.new_relation') };
91211                 var result = [];
91212                 var graph = context.graph();
91213
91214                 context.intersects(context.extent()).forEach(function(entity) {
91215                     if (entity.type !== 'relation' || entity.id === _entityID) return;
91216
91217                     var matched = context.presets().match(entity, graph);
91218                     var presetName = (matched && matched.name()) || t('inspector.relation');
91219                     var entityName = utilDisplayName(entity) || '';
91220
91221                     var value = presetName + ' ' + entityName;
91222                     if (q && value.toLowerCase().indexOf(q.toLowerCase()) === -1) return;
91223
91224                     result.push({ relation: entity, value: value });
91225                 });
91226
91227                 result.sort(function(a, b) {
91228                     return osmRelation.creationOrder(a.relation, b.relation);
91229                 });
91230
91231                 // Dedupe identical names by appending relation id - see #2891
91232                 var dupeGroups = Object.values(utilArrayGroupBy(result, 'value'))
91233                     .filter(function(v) { return v.length > 1; });
91234
91235                 dupeGroups.forEach(function(group) {
91236                     group.forEach(function(obj) {
91237                         obj.value += ' ' + obj.relation.id;
91238                     });
91239                 });
91240
91241                 result.forEach(function(obj) {
91242                     obj.title = obj.value;
91243                 });
91244
91245                 result.unshift(newRelation);
91246                 callback(result);
91247             }
91248
91249
91250             function rawMembershipEditor(selection) {
91251                 var entity = context.entity(_entityID);
91252                 var parents = context.graph().parentRelations(entity);
91253                 var memberships = [];
91254
91255                 parents.slice(0, 1000).forEach(function(relation) {
91256                     relation.members.forEach(function(member, index) {
91257                         if (member.id === entity.id) {
91258                             memberships.push({ relation: relation, member: member, index: index });
91259                         }
91260                     });
91261                 });
91262
91263                 var gt = parents.length > 1000 ? '>' : '';
91264                 selection.call(uiDisclosure(context, 'raw_membership_editor', true)
91265                     .title(t('inspector.all_relations') + ' (' + gt + memberships.length + ')')
91266                     .expanded(true)
91267                     .updatePreference(false)
91268                     .on('toggled', function(expanded) {
91269                         if (expanded) { selection.node().parentNode.scrollTop += 200; }
91270                     })
91271                     .content(content)
91272                 );
91273
91274
91275                 function content(selection) {
91276                     var list = selection.selectAll('.member-list')
91277                         .data([0]);
91278
91279                     list = list.enter()
91280                         .append('ul')
91281                         .attr('class', 'member-list')
91282                         .merge(list);
91283
91284
91285                     var items = list.selectAll('li.member-row-normal')
91286                         .data(memberships, function(d) {
91287                             return osmEntity.key(d.relation) + ',' + d.index;
91288                         });
91289
91290                     items.exit()
91291                         .each(unbind)
91292                         .remove();
91293
91294                     // Enter
91295                     var itemsEnter = items.enter()
91296                         .append('li')
91297                         .attr('class', 'member-row member-row-normal form-field');
91298
91299                     // highlight the relation in the map while hovering on the list item
91300                     itemsEnter.on('mouseover', function(d) {
91301                             utilHighlightEntities([d.relation.id], true, context);
91302                         })
91303                         .on('mouseout', function(d) {
91304                             utilHighlightEntities([d.relation.id], false, context);
91305                         });
91306
91307                     var labelEnter = itemsEnter
91308                         .append('label')
91309                         .attr('class', 'field-label')
91310                         .append('span')
91311                         .attr('class', 'label-text')
91312                         .append('a')
91313                         .attr('href', '#')
91314                         .on('click', selectRelation);
91315
91316                     labelEnter
91317                         .append('span')
91318                         .attr('class', 'member-entity-type')
91319                         .text(function(d) {
91320                             var matched = context.presets().match(d.relation, context.graph());
91321                             return (matched && matched.name()) || t('inspector.relation');
91322                         });
91323
91324                     labelEnter
91325                         .append('span')
91326                         .attr('class', 'member-entity-name')
91327                         .text(function(d) { return utilDisplayName(d.relation); });
91328
91329                     var wrapEnter = itemsEnter
91330                         .append('div')
91331                         .attr('class', 'form-field-input-wrap form-field-input-member');
91332
91333                     wrapEnter
91334                         .append('input')
91335                         .attr('class', 'member-role')
91336                         .property('type', 'text')
91337                         .attr('maxlength', 255)
91338                         .attr('placeholder', t('inspector.role'))
91339                         .call(utilNoAuto)
91340                         .property('value', function(d) { return d.member.role; })
91341                         .on('blur', changeRole)
91342                         .on('change', changeRole);
91343
91344                     wrapEnter
91345                         .append('button')
91346                         .attr('tabindex', -1)
91347                         .attr('class', 'remove form-field-button member-delete')
91348                         .call(svgIcon('#iD-operation-delete'))
91349                         .on('click', deleteMembership);
91350
91351                     if (taginfo) {
91352                         wrapEnter.each(bindTypeahead);
91353                     }
91354
91355
91356                     var newMembership = list.selectAll('.member-row-new')
91357                         .data(_showBlank ? [0] : []);
91358
91359                     // Exit
91360                     newMembership.exit()
91361                         .remove();
91362
91363                     // Enter
91364                     var newMembershipEnter = newMembership.enter()
91365                         .append('li')
91366                         .attr('class', 'member-row member-row-new form-field');
91367
91368                     newMembershipEnter
91369                         .append('label')
91370                         .attr('class', 'field-label')
91371                         .append('input')
91372                         .attr('placeholder', t('inspector.choose_relation'))
91373                         .attr('type', 'text')
91374                         .attr('class', 'member-entity-input')
91375                         .call(utilNoAuto);
91376
91377                     var newWrapEnter = newMembershipEnter
91378                         .append('div')
91379                         .attr('class', 'form-field-input-wrap form-field-input-member');
91380
91381                     newWrapEnter
91382                         .append('input')
91383                         .attr('class', 'member-role')
91384                         .property('type', 'text')
91385                         .attr('maxlength', 255)
91386                         .attr('placeholder', t('inspector.role'))
91387                         .call(utilNoAuto);
91388
91389                     newWrapEnter
91390                         .append('button')
91391                         .attr('tabindex', -1)
91392                         .attr('class', 'remove form-field-button member-delete')
91393                         .call(svgIcon('#iD-operation-delete'))
91394                         .on('click', function() {
91395                             list.selectAll('.member-row-new')
91396                                 .remove();
91397                         });
91398
91399                     // Update
91400                     newMembership = newMembership
91401                         .merge(newMembershipEnter);
91402
91403                     newMembership.selectAll('.member-entity-input')
91404                         .on('blur', cancelEntity)   // if it wasn't accepted normally, cancel it
91405                         .call(nearbyCombo
91406                             .on('accept', acceptEntity)
91407                             .on('cancel', cancelEntity)
91408                         );
91409
91410
91411                     // Container for the Add button
91412                     var addRow = selection.selectAll('.add-row')
91413                         .data([0]);
91414
91415                     // enter
91416                     var addRowEnter = addRow.enter()
91417                         .append('div')
91418                         .attr('class', 'add-row');
91419
91420                     var addRelationButton = addRowEnter
91421                         .append('button')
91422                         .attr('class', 'add-relation');
91423
91424                     addRelationButton
91425                         .call(svgIcon('#iD-icon-plus', 'light'));
91426                     addRelationButton
91427                         .call(tooltip().title(t('inspector.add_to_relation')).placement(textDirection === 'ltr' ? 'right' : 'left'));
91428
91429                     addRowEnter
91430                         .append('div')
91431                         .attr('class', 'space-value');   // preserve space
91432
91433                     addRowEnter
91434                         .append('div')
91435                         .attr('class', 'space-buttons');  // preserve space
91436
91437                     // update
91438                     addRow = addRow
91439                         .merge(addRowEnter);
91440
91441                     addRow.select('.add-relation')
91442                         .on('click', function() {
91443                             _showBlank = true;
91444                             content(selection);
91445                             list.selectAll('.member-entity-input').node().focus();
91446                         });
91447
91448
91449                     function acceptEntity(d) {
91450                         if (!d) {
91451                             cancelEntity();
91452                             return;
91453                         }
91454                         var role = list.selectAll('.member-row-new .member-role').property('value');
91455                         addMembership(d, role);
91456                     }
91457
91458
91459                     function cancelEntity() {
91460                         var input = newMembership.selectAll('.member-entity-input');
91461                         input.property('value', '');
91462                     }
91463
91464
91465                     function bindTypeahead(d) {
91466                         var row = d3_select(this);
91467                         var role = row.selectAll('input.member-role');
91468                         var origValue = role.property('value');
91469
91470                         function sort(value, data) {
91471                             var sameletter = [];
91472                             var other = [];
91473                             for (var i = 0; i < data.length; i++) {
91474                                 if (data[i].value.substring(0, value.length) === value) {
91475                                     sameletter.push(data[i]);
91476                                 } else {
91477                                     other.push(data[i]);
91478                                 }
91479                             }
91480                             return sameletter.concat(other);
91481                         }
91482
91483                         role.call(uiCombobox(context, 'member-role')
91484                             .fetcher(function(role, callback) {
91485                                 var rtype = d.relation.tags.type;
91486                                 taginfo.roles({
91487                                     debounce: true,
91488                                     rtype: rtype || '',
91489                                     geometry: context.geometry(_entityID),
91490                                     query: role
91491                                 }, function(err, data) {
91492                                     if (!err) callback(sort(role, data));
91493                                 });
91494                             })
91495                             .on('cancel', function() {
91496                                 role.property('value', origValue);
91497                             })
91498                         );
91499                     }
91500
91501
91502                     function unbind() {
91503                         var row = d3_select(this);
91504
91505                         row.selectAll('input.member-role')
91506                             .call(uiCombobox.off);
91507                     }
91508                 }
91509             }
91510
91511
91512             rawMembershipEditor.entityID = function(val) {
91513                 if (!arguments.length) return _entityID;
91514                 _entityID = val;
91515                 _showBlank = false;
91516                 return rawMembershipEditor;
91517             };
91518
91519
91520             return rawMembershipEditor;
91521         }
91522
91523         // This currently only works with the 'restrictions' field
91524         // It borrows some code from uiHelp
91525
91526         function uiFieldHelp(context, fieldName) {
91527             var fieldHelp = {};
91528             var _inspector = d3_select(null);
91529             var _wrap = d3_select(null);
91530             var _body = d3_select(null);
91531
91532             var fieldHelpKeys = {
91533                 restrictions: [
91534                     ['about',[
91535                         'about',
91536                         'from_via_to',
91537                         'maxdist',
91538                         'maxvia'
91539                     ]],
91540                     ['inspecting',[
91541                         'about',
91542                         'from_shadow',
91543                         'allow_shadow',
91544                         'restrict_shadow',
91545                         'only_shadow',
91546                         'restricted',
91547                         'only'
91548                     ]],
91549                     ['modifying',[
91550                         'about',
91551                         'indicators',
91552                         'allow_turn',
91553                         'restrict_turn',
91554                         'only_turn'
91555                     ]],
91556                     ['tips',[
91557                         'simple',
91558                         'simple_example',
91559                         'indirect',
91560                         'indirect_example',
91561                         'indirect_noedit'
91562                     ]]
91563                 ]
91564             };
91565
91566             var fieldHelpHeadings = {};
91567
91568             var replacements = {
91569                 distField: t('restriction.controls.distance'),
91570                 viaField: t('restriction.controls.via'),
91571                 fromShadow: icon('#iD-turn-shadow', 'pre-text shadow from'),
91572                 allowShadow: icon('#iD-turn-shadow', 'pre-text shadow allow'),
91573                 restrictShadow: icon('#iD-turn-shadow', 'pre-text shadow restrict'),
91574                 onlyShadow: icon('#iD-turn-shadow', 'pre-text shadow only'),
91575                 allowTurn: icon('#iD-turn-yes', 'pre-text turn'),
91576                 restrictTurn: icon('#iD-turn-no', 'pre-text turn'),
91577                 onlyTurn: icon('#iD-turn-only', 'pre-text turn')
91578             };
91579
91580
91581             // For each section, squash all the texts into a single markdown document
91582             var docs = fieldHelpKeys[fieldName].map(function(key) {
91583                 var helpkey = 'help.field.' + fieldName + '.' + key[0];
91584                 var text = key[1].reduce(function(all, part) {
91585                     var subkey = helpkey + '.' + part;
91586                     var depth = fieldHelpHeadings[subkey];                     // is this subkey a heading?
91587                     var hhh = depth ? Array(depth + 1).join('#') + ' ' : '';   // if so, prepend with some ##'s
91588                     return all + hhh + t(subkey, replacements) + '\n\n';
91589                 }, '');
91590
91591                 return {
91592                     key: helpkey,
91593                     title: t(helpkey + '.title'),
91594                     html: marked(text.trim())
91595                 };
91596             });
91597
91598
91599             function show() {
91600                 updatePosition();
91601
91602                 _body
91603                     .classed('hide', false)
91604                     .style('opacity', '0')
91605                     .transition()
91606                     .duration(200)
91607                     .style('opacity', '1');
91608             }
91609
91610
91611             function hide() {
91612                 _body
91613                     .classed('hide', true)
91614                     .transition()
91615                     .duration(200)
91616                     .style('opacity', '0')
91617                     .on('end', function () {
91618                         _body.classed('hide', true);
91619                     });
91620             }
91621
91622
91623             function clickHelp(index) {
91624                 var d = docs[index];
91625                 var tkeys = fieldHelpKeys[fieldName][index][1];
91626
91627                 _body.selectAll('.field-help-nav-item')
91628                     .classed('active', function(d, i) { return i === index; });
91629
91630                 var content = _body.selectAll('.field-help-content')
91631                     .html(d.html);
91632
91633                 // class the paragraphs so we can find and style them
91634                 content.selectAll('p')
91635                     .attr('class', function(d, i) { return tkeys[i]; });
91636
91637                 // insert special content for certain help sections
91638                 if (d.key === 'help.field.restrictions.inspecting') {
91639                     content
91640                         .insert('img', 'p.from_shadow')
91641                         .attr('class', 'field-help-image cf')
91642                         .attr('src', context.imagePath('tr_inspect.gif'));
91643
91644                 } else if (d.key === 'help.field.restrictions.modifying') {
91645                     content
91646                         .insert('img', 'p.allow_turn')
91647                         .attr('class', 'field-help-image cf')
91648                         .attr('src', context.imagePath('tr_modify.gif'));
91649                 }
91650             }
91651
91652
91653             fieldHelp.button = function(selection) {
91654                 if (_body.empty()) return;
91655
91656                 var button = selection.selectAll('.field-help-button')
91657                     .data([0]);
91658
91659                 // enter/update
91660                 button.enter()
91661                     .append('button')
91662                     .attr('class', 'field-help-button')
91663                     .attr('tabindex', -1)
91664                     .call(svgIcon('#iD-icon-help'))
91665                     .merge(button)
91666                     .on('click', function () {
91667                         event.stopPropagation();
91668                         event.preventDefault();
91669                         if (_body.classed('hide')) {
91670                             show();
91671                         } else {
91672                             hide();
91673                         }
91674                     });
91675             };
91676
91677
91678             function updatePosition() {
91679                 var wrap = _wrap.node();
91680                 var inspector = _inspector.node();
91681                 var wRect = wrap.getBoundingClientRect();
91682                 var iRect = inspector.getBoundingClientRect();
91683
91684                 _body
91685                     .style('top', wRect.top + inspector.scrollTop - iRect.top + 'px');
91686             }
91687
91688
91689             fieldHelp.body = function(selection) {
91690                 // This control expects the field to have a form-field-input-wrap div
91691                 _wrap = selection.selectAll('.form-field-input-wrap');
91692                 if (_wrap.empty()) return;
91693
91694                 // absolute position relative to the inspector, so it "floats" above the fields
91695                 _inspector = d3_select('#sidebar .entity-editor-pane .inspector-body');
91696                 if (_inspector.empty()) return;
91697
91698                 _body = _inspector.selectAll('.field-help-body')
91699                     .data([0]);
91700
91701                 var enter = _body.enter()
91702                     .append('div')
91703                     .attr('class', 'field-help-body hide');   // initially hidden
91704
91705                 var titleEnter = enter
91706                     .append('div')
91707                     .attr('class', 'field-help-title cf');
91708
91709                 titleEnter
91710                     .append('h2')
91711                     .attr('class', ((textDirection === 'rtl') ? 'fr' : 'fl'))
91712                     .text(t('help.field.' + fieldName + '.title'));
91713
91714                 titleEnter
91715                     .append('button')
91716                     .attr('class', 'fr close')
91717                     .on('click', function() {
91718                         event.stopPropagation();
91719                         event.preventDefault();
91720                         hide();
91721                     })
91722                     .call(svgIcon('#iD-icon-close'));
91723
91724                 var navEnter = enter
91725                     .append('div')
91726                     .attr('class', 'field-help-nav cf');
91727
91728                 var titles = docs.map(function(d) { return d.title; });
91729                 navEnter.selectAll('.field-help-nav-item')
91730                     .data(titles)
91731                     .enter()
91732                     .append('div')
91733                     .attr('class', 'field-help-nav-item')
91734                     .text(function(d) { return d; })
91735                     .on('click', function(d, i) {
91736                         event.stopPropagation();
91737                         event.preventDefault();
91738                         clickHelp(i);
91739                     });
91740
91741                 enter
91742                     .append('div')
91743                     .attr('class', 'field-help-content');
91744
91745                 _body = _body
91746                     .merge(enter);
91747
91748                 clickHelp(0);
91749             };
91750
91751
91752             return fieldHelp;
91753         }
91754
91755         function uiFieldCheck(field, context) {
91756             var dispatch$1 = dispatch('change');
91757             var options = field.strings && field.strings.options;
91758             var values = [];
91759             var texts = [];
91760
91761             var input = d3_select(null);
91762             var text = d3_select(null);
91763             var label = d3_select(null);
91764             var reverser = d3_select(null);
91765
91766             var _impliedYes;
91767             var _entityID;
91768             var _value;
91769
91770
91771             if (options) {
91772                 for (var k in options) {
91773                     values.push(k === 'undefined' ? undefined : k);
91774                     texts.push(field.t('options.' + k, { 'default': options[k] }));
91775                 }
91776             } else {
91777                 values = [undefined, 'yes'];
91778                 texts = [t('inspector.unknown'), t('inspector.check.yes')];
91779                 if (field.type !== 'defaultCheck') {
91780                     values.push('no');
91781                     texts.push(t('inspector.check.no'));
91782                 }
91783             }
91784
91785
91786             // Checks tags to see whether an undefined value is "Assumed to be Yes"
91787             function checkImpliedYes() {
91788                 _impliedYes = (field.id === 'oneway_yes');
91789
91790                 // hack: pretend `oneway` field is a `oneway_yes` field
91791                 // where implied oneway tag exists (e.g. `junction=roundabout`) #2220, #1841
91792                 if (field.id === 'oneway') {
91793                     var entity = context.entity(_entityID);
91794                     for (var key in entity.tags) {
91795                         if (key in osmOneWayTags && (entity.tags[key] in osmOneWayTags[key])) {
91796                             _impliedYes = true;
91797                             texts[0] = t('presets.fields.oneway_yes.options.undefined');
91798                             break;
91799                         }
91800                     }
91801                 }
91802             }
91803
91804
91805             function reverserHidden() {
91806                 if (!d3_select('div.inspector-hover').empty()) return true;
91807                 return !(_value === 'yes' || (_impliedYes && !_value));
91808             }
91809
91810
91811             function reverserSetText(selection) {
91812                 var entity = context.hasEntity(_entityID);
91813                 if (reverserHidden() || !entity) return selection;
91814
91815                 var first = entity.first();
91816                 var last = entity.isClosed() ? entity.nodes[entity.nodes.length - 2] : entity.last();
91817                 var pseudoDirection = first < last;
91818                 var icon = pseudoDirection ? '#iD-icon-forward' : '#iD-icon-backward';
91819
91820                 selection.selectAll('.reverser-span')
91821                     .text(t('inspector.check.reverser'))
91822                     .call(svgIcon(icon, 'inline'));
91823
91824                 return selection;
91825             }
91826
91827
91828             var check = function(selection) {
91829                 checkImpliedYes();
91830
91831                 label = selection.selectAll('.form-field-input-wrap')
91832                     .data([0]);
91833
91834                 var enter = label.enter()
91835                     .append('label')
91836                     .attr('class', 'form-field-input-wrap form-field-input-check');
91837
91838                 enter
91839                     .append('input')
91840                     .property('indeterminate', field.type !== 'defaultCheck')
91841                     .attr('type', 'checkbox')
91842                     .attr('id', 'preset-input-' + field.safeid);
91843
91844                 enter
91845                     .append('span')
91846                     .text(texts[0])
91847                     .attr('class', 'value');
91848
91849                 if (field.type === 'onewayCheck') {
91850                     enter
91851                         .append('a')
91852                         .attr('id', 'preset-input-' + field.safeid + '-reverser')
91853                         .attr('class', 'reverser button' + (reverserHidden() ? ' hide' : ''))
91854                         .attr('href', '#')
91855                         .append('span')
91856                         .attr('class', 'reverser-span');
91857                 }
91858
91859                 label = label.merge(enter);
91860                 input = label.selectAll('input');
91861                 text = label.selectAll('span.value');
91862
91863                 input
91864                     .on('click', function() {
91865                         event.stopPropagation();
91866                         var t = {};
91867                         t[field.key] = values[(values.indexOf(_value) + 1) % values.length];
91868
91869                         // Don't cycle through `alternating` or `reversible` states - #4970
91870                         // (They are supported as translated strings, but should not toggle with clicks)
91871                         if (t[field.key] === 'reversible' || t[field.key] === 'alternating') {
91872                             t[field.key] = values[0];
91873                         }
91874
91875                         dispatch$1.call('change', this, t);
91876                     });
91877
91878                 if (field.type === 'onewayCheck') {
91879                     reverser = label.selectAll('.reverser');
91880
91881                     reverser
91882                         .call(reverserSetText)
91883                         .on('click', function() {
91884                             event.preventDefault();
91885                             event.stopPropagation();
91886                             context.perform(
91887                                 actionReverse(_entityID),
91888                                 t('operations.reverse.annotation')
91889                             );
91890                             d3_select(this)
91891                                 .call(reverserSetText);
91892                         });
91893                 }
91894             };
91895
91896
91897             check.entity = function(_) {
91898                 if (!arguments.length) return context.hasEntity(_entityID);
91899                 _entityID = _.id;
91900                 return check;
91901             };
91902
91903
91904             check.tags = function(tags) {
91905
91906                 function isChecked(val) {
91907                     return val !== 'no' && val !== '' && val !== undefined && val !== null;
91908                 }
91909
91910                 function textFor(val) {
91911                     if (val === '') val = undefined;
91912                     var index = values.indexOf(val);
91913                     return (index !== -1 ? texts[index] : ('"' + val + '"'));
91914                 }
91915
91916                 checkImpliedYes();
91917                 _value = tags[field.key] && tags[field.key].toLowerCase();
91918
91919                 if (field.type === 'onewayCheck' && (_value === '1' || _value === '-1')) {
91920                     _value = 'yes';
91921                 }
91922
91923                 input
91924                     .property('indeterminate', field.type !== 'defaultCheck' && !_value)
91925                     .property('checked', isChecked(_value));
91926
91927                 text
91928                     .text(textFor(_value));
91929
91930                 label
91931                     .classed('set', !!_value);
91932
91933                 if (field.type === 'onewayCheck') {
91934                     reverser
91935                         .classed('hide', reverserHidden())
91936                         .call(reverserSetText);
91937                 }
91938             };
91939
91940
91941             check.focus = function() {
91942                 input.node().focus();
91943             };
91944
91945             return utilRebind(check, dispatch$1, 'on');
91946         }
91947
91948         function uiFieldCombo(field, context) {
91949             var dispatch$1 = dispatch('change');
91950             var nominatim = services$1.geocoder;
91951             var taginfo = services$1.taginfo;
91952             var isMulti = (field.type === 'multiCombo');
91953             var isNetwork = (field.type === 'networkCombo');
91954             var isSemi = (field.type === 'semiCombo');
91955             var optstrings = field.strings && field.strings.options;
91956             var optarray = field.options;
91957             var snake_case = (field.snake_case || (field.snake_case === undefined));
91958             var caseSensitive = field.caseSensitive;
91959             var combobox = uiCombobox(context, 'combo-' + field.safeid)
91960                 .caseSensitive(caseSensitive)
91961                 .minItems(isMulti || isSemi ? 1 : 2);
91962             var container = d3_select(null);
91963             var inputWrap = d3_select(null);
91964             var input = d3_select(null);
91965             var _comboData = [];
91966             var _multiData = [];
91967             var _entity;
91968             var _country;
91969
91970             // ensure multiCombo field.key ends with a ':'
91971             if (isMulti && /[^:]$/.test(field.key)) {
91972                 field.key += ':';
91973             }
91974
91975
91976             function snake(s) {
91977                 return s.replace(/\s+/g, '_');
91978             }
91979
91980             function unsnake(s) {
91981                 return s.replace(/_+/g, ' ');
91982             }
91983
91984             function clean(s) {
91985                 return s.split(';')
91986                     .map(function(s) { return s.trim(); })
91987                     .join(';');
91988             }
91989
91990
91991             // returns the tag value for a display value
91992             // (for multiCombo, dval should be the key suffix, not the entire key)
91993             function tagValue(dval) {
91994                 dval = clean(dval || '');
91995
91996                 if (optstrings) {
91997                     var found = _comboData.find(function(o) {
91998                         return o.key && clean(o.value) === dval;
91999                     });
92000                     if (found) {
92001                         return found.key;
92002                     }
92003                 }
92004
92005                 if (field.type === 'typeCombo' && !dval) {
92006                     return 'yes';
92007                 }
92008
92009                 return (snake_case ? snake(dval) : dval) || undefined;
92010             }
92011
92012
92013             // returns the display value for a tag value
92014             // (for multiCombo, tval should be the key suffix, not the entire key)
92015             function displayValue(tval) {
92016                 tval = tval || '';
92017
92018                 if (optstrings) {
92019                     var found = _comboData.find(function(o) {
92020                         return o.key === tval && o.value;
92021                     });
92022                     if (found) {
92023                         return found.value;
92024                     }
92025                 }
92026
92027                 if (field.type === 'typeCombo' && tval.toLowerCase() === 'yes') {
92028                     return '';
92029                 }
92030
92031                 return snake_case ? unsnake(tval) : tval;
92032             }
92033
92034
92035             // Compute the difference between arrays of objects by `value` property
92036             //
92037             // objectDifference([{value:1}, {value:2}, {value:3}], [{value:2}])
92038             // > [{value:1}, {value:3}]
92039             //
92040             function objectDifference(a, b) {
92041                 return a.filter(function(d1) {
92042                     return !b.some(function(d2) { return d1.value === d2.value; });
92043                 });
92044             }
92045
92046
92047             function initCombo(selection, attachTo) {
92048                 if (optstrings) {
92049                     selection.attr('readonly', 'readonly');
92050                     selection.call(combobox, attachTo);
92051                     setStaticValues(setPlaceholder);
92052
92053                 } else if (optarray) {
92054                     selection.call(combobox, attachTo);
92055                     setStaticValues(setPlaceholder);
92056
92057                 } else if (taginfo) {
92058                     selection.call(combobox.fetcher(setTaginfoValues), attachTo);
92059                     setTaginfoValues('', setPlaceholder);
92060                 }
92061             }
92062
92063
92064             function setStaticValues(callback) {
92065                 if (!(optstrings || optarray)) return;
92066
92067                 if (optstrings) {
92068                     _comboData = Object.keys(optstrings).map(function(k) {
92069                         var v = field.t('options.' + k, { 'default': optstrings[k] });
92070                         return {
92071                             key: k,
92072                             value: v,
92073                             title: v
92074                         };
92075                     });
92076
92077                 } else if (optarray) {
92078                     _comboData = optarray.map(function(k) {
92079                         var v = snake_case ? unsnake(k) : k;
92080                         return {
92081                             key: k,
92082                             value: v,
92083                             title: v
92084                         };
92085                     });
92086                 }
92087
92088                 combobox.data(objectDifference(_comboData, _multiData));
92089                 if (callback) callback(_comboData);
92090             }
92091
92092
92093             function setTaginfoValues(q, callback) {
92094                 var fn = isMulti ? 'multikeys' : 'values';
92095                 var query = (isMulti ? field.key : '') + q;
92096                 var hasCountryPrefix = isNetwork && _country && _country.indexOf(q.toLowerCase()) === 0;
92097                 if (hasCountryPrefix) {
92098                     query = _country + ':';
92099                 }
92100
92101                 var params = {
92102                     debounce: (q !== ''),
92103                     key: field.key,
92104                     query: query
92105                 };
92106
92107                 if (_entity) {
92108                     params.geometry = context.geometry(_entity.id);
92109                 }
92110
92111                 taginfo[fn](params, function(err, data) {
92112                     if (err) return;
92113
92114                     var deprecatedValues = osmEntity.deprecatedTagValuesByKey()[field.key];
92115                     if (deprecatedValues) {
92116                         // don't suggest deprecated tag values
92117                         data = data.filter(function(d) {
92118                             return deprecatedValues.indexOf(d.value) === -1;
92119                         });
92120                     }
92121
92122                     if (hasCountryPrefix) {
92123                         data = data.filter(function(d) {
92124                             return d.value.toLowerCase().indexOf(_country + ':') === 0;
92125                         });
92126                     }
92127
92128                     // hide the caret if there are no suggestions
92129                     container.classed('empty-combobox', data.length === 0);
92130
92131                     _comboData = data.map(function(d) {
92132                         var k = d.value;
92133                         if (isMulti) k = k.replace(field.key, '');
92134                         var v = snake_case ? unsnake(k) : k;
92135                         return {
92136                             key: k,
92137                             value: v,
92138                             title: isMulti ? v : d.title
92139                         };
92140                     });
92141
92142                     _comboData = objectDifference(_comboData, _multiData);
92143                     if (callback) callback(_comboData);
92144                 });
92145             }
92146
92147
92148             function setPlaceholder(values) {
92149                 var ph;
92150
92151                 if (isMulti || isSemi) {
92152                     ph = field.placeholder() || t('inspector.add');
92153                 } else {
92154                     var vals = values
92155                         .map(function(d) { return d.value; })
92156                         .filter(function(s) { return s.length < 20; });
92157
92158                     var placeholders = vals.length > 1 ? vals : values.map(function(d) { return d.key; });
92159                     ph = field.placeholder() || placeholders.slice(0, 3).join(', ');
92160                 }
92161
92162                 if (!/(…|\.\.\.)$/.test(ph)) {
92163                     ph += '…';
92164                 }
92165
92166                 container.selectAll('input')
92167                     .attr('placeholder', ph);
92168             }
92169
92170
92171             function change() {
92172                 var t = {};
92173                 var val;
92174
92175                 if (isMulti || isSemi) {
92176                     val = tagValue(utilGetSetValue(input).replace(/,/g, ';')) || '';
92177                     container.classed('active', false);
92178                     utilGetSetValue(input, '');
92179
92180                     var vals = val.split(';').filter(Boolean);
92181                     if (!vals.length) return;
92182
92183                     if (isMulti) {
92184                         utilArrayUniq(vals).forEach(function(v) {
92185                             var key = field.key + v;
92186                             if (_entity) {
92187                                 // don't set a multicombo value to 'yes' if it already has a non-'no' value
92188                                 // e.g. `language:de=main`
92189                                 var old = _entity.tags[key] || '';
92190                                 if (old && old.toLowerCase() !== 'no') return;
92191                             }
92192                             field.keys.push(key);
92193                             t[key] = 'yes';
92194                         });
92195
92196                     } else if (isSemi) {
92197                         var arr = _multiData.map(function(d) { return d.key; });
92198                         arr = arr.concat(vals);
92199                         t[field.key] = utilArrayUniq(arr).filter(Boolean).join(';');
92200                     }
92201
92202                     window.setTimeout(function() { input.node().focus(); }, 10);
92203
92204                 } else {
92205                     val = tagValue(utilGetSetValue(input));
92206                     t[field.key] = val;
92207                 }
92208
92209                 dispatch$1.call('change', this, t);
92210             }
92211
92212
92213             function removeMultikey(d) {
92214                 event.stopPropagation();
92215                 var t = {};
92216                 if (isMulti) {
92217                     t[d.key] = undefined;
92218                 } else if (isSemi) {
92219                     var arr = _multiData.map(function(md) {
92220                         return md.key === d.key ? null : md.key;
92221                     }).filter(Boolean);
92222
92223                     arr = utilArrayUniq(arr);
92224                     t[field.key] = arr.length ? arr.join(';') : undefined;
92225                 }
92226                 dispatch$1.call('change', this, t);
92227             }
92228
92229
92230             function combo(selection) {
92231                 container = selection.selectAll('.form-field-input-wrap')
92232                     .data([0]);
92233
92234                 var type = (isMulti || isSemi) ? 'multicombo': 'combo';
92235                 container = container.enter()
92236                     .append('div')
92237                     .attr('class', 'form-field-input-wrap form-field-input-' + type)
92238                     .merge(container);
92239
92240                 if (isMulti || isSemi) {
92241                     container = container.selectAll('.chiplist')
92242                         .data([0]);
92243
92244                     var listClass = 'chiplist';
92245
92246                     // Use a separate line for each value in the Destinations field
92247                     // to mimic highway exit signs
92248                     if (field.id === 'destination_oneway') {
92249                         listClass += ' full-line-chips';
92250                     }
92251
92252                     container = container.enter()
92253                         .append('ul')
92254                         .attr('class', listClass)
92255                         .on('click', function() {
92256                             window.setTimeout(function() { input.node().focus(); }, 10);
92257                         })
92258                         .merge(container);
92259
92260
92261                     inputWrap = container.selectAll('.input-wrap')
92262                         .data([0]);
92263
92264                     inputWrap = inputWrap.enter()
92265                         .append('li')
92266                         .attr('class', 'input-wrap')
92267                         .merge(inputWrap);
92268
92269                     input = inputWrap.selectAll('input')
92270                         .data([0]);
92271                 } else {
92272                     input = container.selectAll('input')
92273                         .data([0]);
92274                 }
92275
92276                 input = input.enter()
92277                     .append('input')
92278                     .attr('type', 'text')
92279                     .attr('id', 'preset-input-' + field.safeid)
92280                     .call(utilNoAuto)
92281                     .call(initCombo, selection)
92282                     .merge(input);
92283
92284                 if (isNetwork && nominatim && _entity) {
92285                     var center = _entity.extent(context.graph()).center();
92286                     nominatim.countryCode(center, function (err, code) {
92287                         _country = code;
92288                     });
92289                 }
92290
92291                 input
92292                     .on('change', change)
92293                     .on('blur', change);
92294
92295                 input
92296                     .on('keydown.field', function() {
92297                         switch (event.keyCode) {
92298                             case 13: // ↩ Return
92299                                 input.node().blur(); // blurring also enters the value
92300                                 event.stopPropagation();
92301                                 break;
92302                         }
92303                     });
92304
92305                 if (isMulti || isSemi) {
92306                     combobox
92307                         .on('accept', function() {
92308                             input.node().blur();
92309                             input.node().focus();
92310                         });
92311
92312                     input
92313                         .on('focus', function() { container.classed('active', true); });
92314                 }
92315             }
92316
92317
92318             combo.tags = function(tags) {
92319                 if (isMulti || isSemi) {
92320                     _multiData = [];
92321
92322                     if (isMulti) {
92323                         // Build _multiData array containing keys already set..
92324                         for (var k in tags) {
92325                             if (k.indexOf(field.key) !== 0) continue;
92326                             var v = (tags[k] || '').toLowerCase();
92327                             if (v === '' || v === 'no') continue;
92328
92329                             var suffix = k.substring(field.key.length);
92330                             _multiData.push({
92331                                 key: k,
92332                                 value: displayValue(suffix)
92333                             });
92334                         }
92335
92336                         // Set keys for form-field modified (needed for undo and reset buttons)..
92337                         field.keys = _multiData.map(function(d) { return d.key; });
92338
92339                     } else if (isSemi) {
92340                         var arr = utilArrayUniq((tags[field.key] || '').split(';')).filter(Boolean);
92341                         _multiData = arr.map(function(k) {
92342                             return {
92343                                 key: k,
92344                                 value: displayValue(k)
92345                             };
92346                         });
92347                     }
92348
92349                     // Exclude existing multikeys from combo options..
92350                     var available = objectDifference(_comboData, _multiData);
92351                     combobox.data(available);
92352
92353                     // Hide 'Add' button if this field uses fixed set of
92354                     // translateable optstrings and they're all currently used..
92355                     container.selectAll('.combobox-input, .combobox-caret')
92356                         .classed('hide', optstrings && !available.length);
92357
92358
92359                     // Render chips
92360                     var chips = container.selectAll('.chips')
92361                         .data(_multiData);
92362
92363                     chips.exit()
92364                         .remove();
92365
92366                     var enter = chips.enter()
92367                         .insert('li', '.input-wrap')
92368                         .attr('class', 'chips');
92369
92370                     enter.append('span');
92371                     enter.append('a');
92372
92373                     chips = chips.merge(enter);
92374
92375                     chips.select('span')
92376                         .text(function(d) { return d.value; });
92377
92378                     chips.select('a')
92379                         .on('click', removeMultikey)
92380                         .attr('class', 'remove')
92381                         .text('×');
92382
92383                 } else {
92384                     utilGetSetValue(input, displayValue(tags[field.key]));
92385                 }
92386             };
92387
92388
92389             combo.focus = function() {
92390                 input.node().focus();
92391             };
92392
92393
92394             combo.entity = function(val) {
92395                 if (!arguments.length) return _entity;
92396                 _entity = val;
92397                 return combo;
92398             };
92399
92400
92401             return utilRebind(combo, dispatch$1, 'on');
92402         }
92403
92404         function uiFieldText(field, context) {
92405             var dispatch$1 = dispatch('change');
92406             var nominatim = services$1.geocoder;
92407             var input = d3_select(null);
92408             var _entity;
92409
92410             function i(selection) {
92411                 var preset = _entity && context.presets().match(_entity, context.graph());
92412                 var isLocked = preset && preset.suggestion && field.id === 'brand';
92413                 field.locked(isLocked);
92414
92415                 var wrap = selection.selectAll('.form-field-input-wrap')
92416                     .data([0]);
92417
92418                 wrap = wrap.enter()
92419                     .append('div')
92420                     .attr('class', 'form-field-input-wrap form-field-input-' + field.type)
92421                     .merge(wrap);
92422
92423                 var fieldID = 'preset-input-' + field.safeid;
92424
92425                 input = wrap.selectAll('input')
92426                     .data([0]);
92427
92428                 input = input.enter()
92429                     .append('input')
92430                     .attr('type', field.type)
92431                     .attr('id', fieldID)
92432                     .attr('placeholder', field.placeholder() || t('inspector.unknown'))
92433                     .classed(field.type, true)
92434                     .call(utilNoAuto)
92435                     .merge(input);
92436
92437                 input
92438                     .classed('disabled', !!isLocked)
92439                     .attr('readonly', isLocked || null)
92440                     .on('input', change(true))
92441                     .on('blur', change())
92442                     .on('change', change());
92443
92444
92445                 if (field.type === 'tel' && nominatim && _entity) {
92446                     var center = _entity.extent(context.graph()).center();
92447                     nominatim.countryCode(center, function (err, countryCode) {
92448                         if (err || !dataPhoneFormats[countryCode]) return;
92449                         wrap.selectAll('#' + fieldID)
92450                             .attr('placeholder', dataPhoneFormats[countryCode]);
92451                     });
92452
92453                 } else if (field.type === 'number') {
92454                     var rtl = (textDirection === 'rtl');
92455
92456                     input.attr('type', 'text');
92457
92458                     var buttons = wrap.selectAll('.increment, .decrement')
92459                         .data(rtl ? [1, -1] : [-1, 1]);
92460
92461                     buttons.enter()
92462                         .append('button')
92463                         .attr('tabindex', -1)
92464                         .attr('class', function(d) {
92465                             var which = (d === 1 ? 'increment' : 'decrement');
92466                             return 'form-field-button ' + which;
92467                         })
92468                         .merge(buttons)
92469                         .on('click', function(d) {
92470                             event.preventDefault();
92471                             var raw_vals = input.node().value || '0';
92472                             var vals = raw_vals.split(';');
92473                             vals = vals.map(function(v) {
92474                                 var num = parseFloat(v.trim(), 10);
92475                                 return isFinite(num) ? clamped(num + d) : v.trim();
92476                             });
92477                             input.node().value = vals.join(';');
92478                             change()();
92479                         });
92480                 }
92481             }
92482
92483
92484             // clamp number to min/max
92485             function clamped(num) {
92486                 if (field.minValue !== undefined) {
92487                     num = Math.max(num, field.minValue);
92488                 }
92489                 if (field.maxValue !== undefined) {
92490                     num = Math.min(num, field.maxValue);
92491                 }
92492                 return num;
92493             }
92494
92495
92496             function change(onInput) {
92497                 return function() {
92498                     var t = {};
92499                     var val = utilGetSetValue(input).trim() || undefined;
92500
92501                     if (!onInput) {
92502                         if (field.type === 'number' && val !== undefined) {
92503                             var vals = val.split(';');
92504                             vals = vals.map(function(v) {
92505                                 var num = parseFloat(v.trim(), 10);
92506                                 return isFinite(num) ? clamped(num) : v.trim();
92507                             });
92508                             val = vals.join(';');
92509                         }
92510                         utilGetSetValue(input, val || '');
92511                     }
92512                     t[field.key] = val;
92513                     dispatch$1.call('change', this, t, onInput);
92514                 };
92515             }
92516
92517
92518             i.entity = function(val) {
92519                 if (!arguments.length) return _entity;
92520                 _entity = val;
92521                 return i;
92522             };
92523
92524
92525             i.tags = function(tags) {
92526                 utilGetSetValue(input, tags[field.key] || '');
92527             };
92528
92529
92530             i.focus = function() {
92531                 var node = input.node();
92532                 if (node) node.focus();
92533             };
92534
92535             return utilRebind(i, dispatch$1, 'on');
92536         }
92537
92538         function uiFieldAccess(field, context) {
92539             var dispatch$1 = dispatch('change');
92540             var items = d3_select(null);
92541
92542             function access(selection) {
92543                 var wrap = selection.selectAll('.form-field-input-wrap')
92544                     .data([0]);
92545
92546                 wrap = wrap.enter()
92547                     .append('div')
92548                     .attr('class', 'form-field-input-wrap form-field-input-' + field.type)
92549                     .merge(wrap);
92550
92551                 var list = wrap.selectAll('ul')
92552                     .data([0]);
92553
92554                 list = list.enter()
92555                     .append('ul')
92556                     .attr('class', 'rows')
92557                     .merge(list);
92558
92559
92560                 items = list.selectAll('li')
92561                     .data(field.keys);
92562
92563                 // Enter
92564                 var enter = items.enter()
92565                     .append('li')
92566                     .attr('class', function(d) { return 'labeled-input preset-access-' + d; });
92567
92568                 enter
92569                     .append('span')
92570                     .attr('class', 'label preset-label-access')
92571                     .attr('for', function(d) { return 'preset-input-access-' + d; })
92572                     .text(function(d) { return field.t('types.' + d); });
92573
92574                 enter
92575                     .append('div')
92576                     .attr('class', 'preset-input-access-wrap')
92577                     .append('input')
92578                     .attr('type', 'text')
92579                     .attr('class', 'preset-input-access')
92580                     .attr('id', function(d) { return 'preset-input-access-' + d; })
92581                     .call(utilNoAuto)
92582                     .each(function(d) {
92583                         d3_select(this)
92584                             .call(uiCombobox(context, 'access-' + d)
92585                                 .data(access.options(d))
92586                             );
92587                     });
92588
92589
92590                 // Update
92591                 items = items.merge(enter);
92592
92593                 wrap.selectAll('.preset-input-access')
92594                     .on('change', change)
92595                     .on('blur', change);
92596             }
92597
92598
92599             function change(d) {
92600                 var tag = {};
92601                 tag[d] = utilGetSetValue(d3_select(this)) || undefined;
92602                 dispatch$1.call('change', this, tag);
92603             }
92604
92605
92606             access.options = function(type) {
92607                 var options = ['no', 'permissive', 'private', 'permit', 'destination'];
92608
92609                 if (type !== 'access') {
92610                     options.unshift('yes');
92611                     options.push('designated');
92612
92613                     if (type === 'bicycle') {
92614                         options.push('dismount');
92615                     }
92616                 }
92617
92618                 return options.map(function(option) {
92619                     return {
92620                         title: field.t('options.' + option + '.description'),
92621                         value: option
92622                     };
92623                 });
92624             };
92625
92626
92627             var placeholders = {
92628                 footway: {
92629                     foot: 'designated',
92630                     motor_vehicle: 'no'
92631                 },
92632                 steps: {
92633                     foot: 'yes',
92634                     motor_vehicle: 'no',
92635                     bicycle: 'no',
92636                     horse: 'no'
92637                 },
92638                 pedestrian: {
92639                     foot: 'yes',
92640                     motor_vehicle: 'no'
92641                 },
92642                 cycleway: {
92643                     motor_vehicle: 'no',
92644                     bicycle: 'designated'
92645                 },
92646                 bridleway: {
92647                     motor_vehicle: 'no',
92648                     horse: 'designated'
92649                 },
92650                 path: {
92651                     foot: 'yes',
92652                     motor_vehicle: 'no',
92653                     bicycle: 'yes',
92654                     horse: 'yes'
92655                 },
92656                 motorway: {
92657                     foot: 'no',
92658                     motor_vehicle: 'yes',
92659                     bicycle: 'no',
92660                     horse: 'no'
92661                 },
92662                 trunk: {
92663                     motor_vehicle: 'yes'
92664                 },
92665                 primary: {
92666                     foot: 'yes',
92667                     motor_vehicle: 'yes',
92668                     bicycle: 'yes',
92669                     horse: 'yes'
92670                 },
92671                 secondary: {
92672                     foot: 'yes',
92673                     motor_vehicle: 'yes',
92674                     bicycle: 'yes',
92675                     horse: 'yes'
92676                 },
92677                 tertiary: {
92678                     foot: 'yes',
92679                     motor_vehicle: 'yes',
92680                     bicycle: 'yes',
92681                     horse: 'yes'
92682                 },
92683                 residential: {
92684                     foot: 'yes',
92685                     motor_vehicle: 'yes',
92686                     bicycle: 'yes',
92687                     horse: 'yes'
92688                 },
92689                 unclassified: {
92690                     foot: 'yes',
92691                     motor_vehicle: 'yes',
92692                     bicycle: 'yes',
92693                     horse: 'yes'
92694                 },
92695                 service: {
92696                     foot: 'yes',
92697                     motor_vehicle: 'yes',
92698                     bicycle: 'yes',
92699                     horse: 'yes'
92700                 },
92701                 motorway_link: {
92702                     foot: 'no',
92703                     motor_vehicle: 'yes',
92704                     bicycle: 'no',
92705                     horse: 'no'
92706                 },
92707                 trunk_link: {
92708                     motor_vehicle: 'yes'
92709                 },
92710                 primary_link: {
92711                     foot: 'yes',
92712                     motor_vehicle: 'yes',
92713                     bicycle: 'yes',
92714                     horse: 'yes'
92715                 },
92716                 secondary_link: {
92717                     foot: 'yes',
92718                     motor_vehicle: 'yes',
92719                     bicycle: 'yes',
92720                     horse: 'yes'
92721                 },
92722                 tertiary_link: {
92723                     foot: 'yes',
92724                     motor_vehicle: 'yes',
92725                     bicycle: 'yes',
92726                     horse: 'yes'
92727                 }
92728             };
92729
92730
92731             access.tags = function(tags) {
92732                 utilGetSetValue(items.selectAll('.preset-input-access'),
92733                     function(d) { return tags[d] || ''; })
92734                     .attr('placeholder', function() {
92735                         return tags.access ? tags.access : field.placeholder();
92736                     });
92737
92738                 items.selectAll('#preset-input-access-access')
92739                     .attr('placeholder', 'yes');
92740
92741                 var which = tags.highway;
92742                 if (!placeholders[which]) return;
92743
92744                 var keys = Object.keys(placeholders[which]);
92745                 keys.forEach(function(k) {
92746                     var v = placeholders[which][k];
92747                     items.selectAll('#preset-input-access-' + k)
92748                         .attr('placeholder', tags.access || v);
92749                 });
92750             };
92751
92752
92753             access.focus = function() {
92754                 items.selectAll('.preset-input-access')
92755                     .node().focus();
92756             };
92757
92758
92759             return utilRebind(access, dispatch$1, 'on');
92760         }
92761
92762         function uiFieldAddress(field, context) {
92763             var dispatch$1 = dispatch('init', 'change');
92764             var nominatim = services$1.geocoder;
92765             var wrap = d3_select(null);
92766             var _isInitialized = false;
92767             var _entity;
92768
92769             function getNearStreets() {
92770                 var extent = _entity.extent(context.graph());
92771                 var l = extent.center();
92772                 var box = geoExtent(l).padByMeters(200);
92773
92774                 var streets = context.intersects(box)
92775                     .filter(isAddressable)
92776                     .map(function(d) {
92777                         var loc = context.projection([
92778                             (extent[0][0] + extent[1][0]) / 2,
92779                             (extent[0][1] + extent[1][1]) / 2
92780                         ]);
92781                         var choice = geoChooseEdge(context.childNodes(d), loc, context.projection);
92782
92783                         return {
92784                             title: d.tags.name,
92785                             value: d.tags.name,
92786                             dist: choice.distance
92787                         };
92788                     })
92789                     .sort(function(a, b) {
92790                         return a.dist - b.dist;
92791                     });
92792
92793                 return utilArrayUniqBy(streets, 'value');
92794
92795                 function isAddressable(d) {
92796                     return d.tags.highway && d.tags.name && d.type === 'way';
92797                 }
92798             }
92799
92800
92801             function getNearCities() {
92802                 var extent = _entity.extent(context.graph());
92803                 var l = extent.center();
92804                 var box = geoExtent(l).padByMeters(200);
92805
92806                 var cities = context.intersects(box)
92807                     .filter(isAddressable)
92808                     .map(function(d) {
92809                         return {
92810                             title: d.tags['addr:city'] || d.tags.name,
92811                             value: d.tags['addr:city'] || d.tags.name,
92812                             dist: geoSphericalDistance(d.extent(context.graph()).center(), l)
92813                         };
92814                     })
92815                     .sort(function(a, b) {
92816                         return a.dist - b.dist;
92817                     });
92818
92819                 return utilArrayUniqBy(cities, 'value');
92820
92821
92822                 function isAddressable(d) {
92823                     if (d.tags.name) {
92824                         if (d.tags.admin_level === '8' && d.tags.boundary === 'administrative')
92825                             return true;
92826                         if (d.tags.border_type === 'city')
92827                             return true;
92828                         if (d.tags.place === 'city' || d.tags.place === 'town' || d.tags.place === 'village')
92829                             return true;
92830                     }
92831
92832                     if (d.tags['addr:city'])
92833                         return true;
92834
92835                     return false;
92836                 }
92837             }
92838
92839             function getNearValues(key) {
92840                 var extent = _entity.extent(context.graph());
92841                 var l = extent.center();
92842                 var box = geoExtent(l).padByMeters(200);
92843
92844                 var results = context.intersects(box)
92845                     .filter(function hasTag(d) { return d.id !== _entity.id && d.tags[key]; })
92846                     .map(function(d) {
92847                         return {
92848                             title: d.tags[key],
92849                             value: d.tags[key],
92850                             dist: geoSphericalDistance(d.extent(context.graph()).center(), l)
92851                         };
92852                     })
92853                     .sort(function(a, b) {
92854                         return a.dist - b.dist;
92855                     });
92856
92857                 return utilArrayUniqBy(results, 'value');
92858             }
92859
92860
92861             function countryCallback(err, countryCode) {
92862                 if (err) return;
92863                 countryCode = countryCode.toLowerCase();
92864
92865                 var addressFormat;
92866                 for (var i = 0; i < dataAddressFormats.length; i++) {
92867                     var format = dataAddressFormats[i];
92868                     if (!format.countryCodes) {
92869                         addressFormat = format;   // choose the default format, keep going
92870                     } else if (format.countryCodes.indexOf(countryCode) !== -1) {
92871                         addressFormat = format;   // choose the country format, stop here
92872                         break;
92873                     }
92874                 }
92875
92876                 var dropdowns = addressFormat.dropdowns || [
92877                     'city', 'county', 'country', 'district', 'hamlet',
92878                     'neighbourhood', 'place', 'postcode', 'province',
92879                     'quarter', 'state', 'street', 'subdistrict', 'suburb'
92880                 ];
92881
92882                 var widths = addressFormat.widths || {
92883                     housenumber: 1/3, street: 2/3,
92884                     city: 2/3, state: 1/4, postcode: 1/3
92885                 };
92886
92887                 function row(r) {
92888                     // Normalize widths.
92889                     var total = r.reduce(function(sum, key) {
92890                         return sum + (widths[key] || 0.5);
92891                     }, 0);
92892
92893                     return r.map(function(key) {
92894                         return {
92895                             id: key,
92896                             width: (widths[key] || 0.5) / total
92897                         };
92898                     });
92899                 }
92900
92901                 wrap.selectAll('.addr-row')
92902                     .data(addressFormat.format)
92903                     .enter()
92904                     .append('div')
92905                     .attr('class', 'addr-row')
92906                     .selectAll('input')
92907                     .data(row)
92908                     .enter()
92909                     .append('input')
92910                     .property('type', 'text')
92911                     .attr('placeholder', function (d) {
92912                         var localkey = d.id + '!' + countryCode;
92913                         var tkey = field.strings.placeholders[localkey] ? localkey : d.id;
92914                         return field.t('placeholders.' + tkey);
92915                     })
92916                     .attr('class', function (d) { return 'addr-' + d.id; })
92917                     .call(utilNoAuto)
92918                     .each(addDropdown)
92919                     .style('width', function (d) { return d.width * 100 + '%'; });
92920
92921
92922                 function addDropdown(d) {
92923                     if (dropdowns.indexOf(d.id) === -1) return;  // not a dropdown
92924
92925                     var nearValues = (d.id === 'street') ? getNearStreets
92926                         : (d.id === 'city') ? getNearCities
92927                         : getNearValues;
92928
92929                     d3_select(this)
92930                         .call(uiCombobox(context, 'address-' + d.id)
92931                             .minItems(1)
92932                             .caseSensitive(true)
92933                             .fetcher(function(value, callback) {
92934                                 callback(nearValues('addr:' + d.id));
92935                             })
92936                         );
92937                 }
92938
92939                 wrap.selectAll('input')
92940                     .on('blur', change())
92941                     .on('change', change());
92942
92943                 wrap.selectAll('input:not(.combobox-input)')
92944                     .on('input', change(true));
92945
92946                 dispatch$1.call('init');
92947                 _isInitialized = true;
92948             }
92949
92950
92951             function address(selection) {
92952                 _isInitialized = false;
92953
92954                 wrap = selection.selectAll('.form-field-input-wrap')
92955                     .data([0]);
92956
92957                 wrap = wrap.enter()
92958                     .append('div')
92959                     .attr('class', 'form-field-input-wrap form-field-input-' + field.type)
92960                     .merge(wrap);
92961
92962                 if (nominatim && _entity) {
92963                     var center = _entity.extent(context.graph()).center();
92964                     nominatim.countryCode(center, countryCallback);
92965                 }
92966             }
92967
92968
92969             function change(onInput) {
92970                 return function() {
92971                     var tags = {};
92972
92973                     wrap.selectAll('input')
92974                         .each(function (field) {
92975                             tags['addr:' + field.id] = this.value || undefined;
92976                         });
92977
92978                     dispatch$1.call('change', this, tags, onInput);
92979                 };
92980             }
92981
92982
92983             function updateTags(tags) {
92984                 utilGetSetValue(wrap.selectAll('input'), function (field) {
92985                     return tags['addr:' + field.id] || '';
92986                 });
92987             }
92988
92989
92990             address.entity = function(val) {
92991                 if (!arguments.length) return _entity;
92992                 _entity = val;
92993                 return address;
92994             };
92995
92996
92997             address.tags = function(tags) {
92998                 if (_isInitialized) {
92999                     updateTags(tags);
93000                 } else {
93001                     dispatch$1.on('init', function () {
93002                         dispatch$1.on('init', null);
93003                         updateTags(tags);
93004                     });
93005                 }
93006             };
93007
93008
93009             address.focus = function() {
93010                 var node = wrap.selectAll('input').node();
93011                 if (node) node.focus();
93012             };
93013
93014
93015             return utilRebind(address, dispatch$1, 'on');
93016         }
93017
93018         function uiFieldCycleway(field, context) {
93019             var dispatch$1 = dispatch('change');
93020             var items = d3_select(null);
93021             var wrap = d3_select(null);
93022
93023             function cycleway(selection) {
93024
93025                 function stripcolon(s) {
93026                     return s.replace(':', '');
93027                 }
93028
93029
93030                 wrap = selection.selectAll('.form-field-input-wrap')
93031                     .data([0]);
93032
93033                 wrap = wrap.enter()
93034                     .append('div')
93035                     .attr('class', 'form-field-input-wrap form-field-input-' + field.type)
93036                     .merge(wrap);
93037
93038
93039                 var div = wrap.selectAll('ul')
93040                     .data([0]);
93041
93042                 div = div.enter()
93043                     .append('ul')
93044                     .attr('class', 'rows')
93045                     .merge(div);
93046
93047                 var keys = ['cycleway:left', 'cycleway:right'];
93048
93049                 items = div.selectAll('li')
93050                     .data(keys);
93051
93052                 var enter = items.enter()
93053                     .append('li')
93054                     .attr('class', function(d) { return 'labeled-input preset-cycleway-' + stripcolon(d); });
93055
93056                 enter
93057                     .append('span')
93058                     .attr('class', 'label preset-label-cycleway')
93059                     .attr('for', function(d) { return 'preset-input-cycleway-' + stripcolon(d); })
93060                     .text(function(d) { return field.t('types.' + d); });
93061
93062                 enter
93063                     .append('div')
93064                     .attr('class', 'preset-input-cycleway-wrap')
93065                     .append('input')
93066                     .attr('type', 'text')
93067                     .attr('class', function(d) { return 'preset-input-cycleway preset-input-' + stripcolon(d); })
93068                     .call(utilNoAuto)
93069                     .each(function(d) {
93070                         d3_select(this)
93071                             .call(uiCombobox(context, 'cycleway-' + stripcolon(d))
93072                                 .data(cycleway.options(d))
93073                             );
93074                     });
93075
93076
93077                 // Update
93078                 wrap.selectAll('.preset-input-cycleway')
93079                     .on('change', change)
93080                     .on('blur', change);
93081             }
93082
93083
93084             function change() {
93085                 var left = utilGetSetValue(d3_select('.preset-input-cyclewayleft'));
93086                 var right = utilGetSetValue(d3_select('.preset-input-cyclewayright'));
93087                 var tag = {};
93088
93089                 if (left === 'none' || left === '') { left = undefined; }
93090                 if (right === 'none' || right === '') { right = undefined; }
93091
93092                 // Always set both left and right as changing one can affect the other
93093                 tag = {
93094                     cycleway: undefined,
93095                     'cycleway:left': left,
93096                     'cycleway:right': right
93097                 };
93098
93099                 // If the left and right tags match, use the cycleway tag to tag both
93100                 // sides the same way
93101                 if (left === right) {
93102                     tag = {
93103                         cycleway: left,
93104                         'cycleway:left': undefined,
93105                         'cycleway:right': undefined
93106                     };
93107                 }
93108
93109                 dispatch$1.call('change', this, tag);
93110             }
93111
93112
93113             cycleway.options = function() {
93114                 return Object.keys(field.strings.options).map(function(option) {
93115                     return {
93116                         title: field.t('options.' + option + '.description'),
93117                         value: option
93118                     };
93119                 });
93120             };
93121
93122
93123             cycleway.tags = function(tags) {
93124                 utilGetSetValue(items.selectAll('.preset-input-cycleway'), function(d) {
93125                         // If cycleway is set, always return that
93126                         if (tags.cycleway) {
93127                             return tags.cycleway;
93128                         }
93129                         return tags[d] || '';
93130                     })
93131                     .attr('placeholder', field.placeholder());
93132             };
93133
93134
93135             cycleway.focus = function() {
93136                 var node = wrap.selectAll('input').node();
93137                 if (node) node.focus();
93138             };
93139
93140
93141             return utilRebind(cycleway, dispatch$1, 'on');
93142         }
93143
93144         function uiFieldLanes(field, context) {
93145             var dispatch$1 = dispatch('change');
93146             var LANE_WIDTH = 40;
93147             var LANE_HEIGHT = 200;
93148             var _entityID;
93149
93150             function lanes(selection) {
93151                 var lanesData = context.entity(_entityID).lanes();
93152
93153                 if (!d3_select('.inspector-wrap.inspector-hidden').empty() || !selection.node().parentNode) {
93154                     selection.call(lanes.off);
93155                     return;
93156                 }
93157
93158                 var wrap = selection.selectAll('.form-field-input-wrap')
93159                     .data([0]);
93160
93161                 wrap = wrap.enter()
93162                     .append('div')
93163                     .attr('class', 'form-field-input-wrap form-field-input-' + field.type)
93164                     .merge(wrap);
93165
93166                 var surface =  wrap.selectAll('.surface')
93167                     .data([0]);
93168
93169                 var d = utilGetDimensions(wrap);
93170                 var freeSpace = d[0] - lanesData.lanes.length * LANE_WIDTH * 1.5 + LANE_WIDTH * 0.5;
93171
93172                 surface = surface.enter()
93173                     .append('svg')
93174                     .attr('width', d[0])
93175                     .attr('height', 300)
93176                     .attr('class', 'surface')
93177                     .merge(surface);
93178
93179
93180                 var lanesSelection = surface.selectAll('.lanes')
93181                     .data([0]);
93182
93183                 lanesSelection = lanesSelection.enter()
93184                     .append('g')
93185                     .attr('class', 'lanes')
93186                     .merge(lanesSelection);
93187
93188                 lanesSelection
93189                     .attr('transform', function () {
93190                         return 'translate(' + (freeSpace / 2) + ', 0)';
93191                     });
93192
93193
93194                 var lane = lanesSelection.selectAll('.lane')
93195                    .data(lanesData.lanes);
93196
93197                 lane.exit()
93198                     .remove();
93199
93200                 var enter = lane.enter()
93201                     .append('g')
93202                     .attr('class', 'lane');
93203
93204                 enter
93205                     .append('g')
93206                     .append('rect')
93207                     .attr('y', 50)
93208                     .attr('width', LANE_WIDTH)
93209                     .attr('height', LANE_HEIGHT);
93210
93211                 enter
93212                     .append('g')
93213                     .attr('class', 'forward')
93214                     .append('text')
93215                     .attr('y', 40)
93216                     .attr('x', 14)
93217                     .text('▲');
93218
93219                 enter
93220                     .append('g')
93221                     .attr('class', 'bothways')
93222                     .append('text')
93223                     .attr('y', 40)
93224                     .attr('x', 14)
93225                     .text('▲▼');
93226
93227                 enter
93228                     .append('g')
93229                     .attr('class', 'backward')
93230                     .append('text')
93231                     .attr('y', 40)
93232                     .attr('x', 14)
93233                     .text('▼');
93234
93235
93236                 lane = lane
93237                     .merge(enter);
93238
93239                 lane
93240                     .attr('transform', function(d) {
93241                         return 'translate(' + (LANE_WIDTH * d.index * 1.5) + ', 0)';
93242                     });
93243
93244                 lane.select('.forward')
93245                     .style('visibility', function(d) {
93246                         return d.direction === 'forward' ? 'visible' : 'hidden';
93247                     });
93248
93249                 lane.select('.bothways')
93250                     .style('visibility', function(d) {
93251                         return d.direction === 'bothways' ? 'visible' : 'hidden';
93252                     });
93253
93254                 lane.select('.backward')
93255                     .style('visibility', function(d) {
93256                         return d.direction === 'backward' ? 'visible' : 'hidden';
93257                     });
93258             }
93259
93260
93261             lanes.entity = function(val) {
93262                 if (!_entityID || _entityID !== val.id) {
93263                     _entityID = val.id;
93264                 }
93265             };
93266
93267             lanes.tags = function() {};
93268             lanes.focus = function() {};
93269             lanes.off = function() {};
93270
93271             return utilRebind(lanes, dispatch$1, 'on');
93272         }
93273
93274         function uiFieldLocalized(field, context) {
93275             var dispatch$1 = dispatch('change', 'input');
93276             var wikipedia = services$1.wikipedia;
93277             var input = d3_select(null);
93278             var localizedInputs = d3_select(null);
93279
93280             var allSuggestions = context.presets().collection.filter(function(p) {
93281                 return p.suggestion === true;
93282             });
93283
93284             // reuse these combos
93285             var langCombo = uiCombobox(context, 'localized-lang')
93286                 .fetcher(fetchLanguages)
93287                 .minItems(0);
93288
93289             var brandCombo = uiCombobox(context, 'localized-brand')
93290                 .canAutocomplete(false)
93291                 .minItems(1);
93292
93293             var _selection = d3_select(null);
93294             var _multilingual = [];
93295             var _buttonTip = tooltip()
93296                 .title(t('translate.translate'))
93297                 .placement('left');
93298             var _wikiTitles;
93299             var _entity;
93300
93301
93302             function calcLocked() {
93303                 if (!_entity) {    // the original entity
93304                     field.locked(false);
93305                     return;
93306                 }
93307
93308                 var latest = context.hasEntity(_entity.id);
93309                 if (!latest) {    // get current entity, possibly edited
93310                     field.locked(false);
93311                     return;
93312                 }
93313
93314                 var hasOriginalName = (latest.tags.name && latest.tags.name === _entity.tags.name);
93315                 var hasWikidata = latest.tags.wikidata;
93316                 var preset = context.presets().match(latest, context.graph());
93317                 var isSuggestion = preset && preset.suggestion;
93318                 var showsBrand = preset && preset.fields
93319                     .filter(function(d) { return d.id === 'brand'; }).length;
93320
93321                 var isLocked = !!(field.id === 'name' && hasOriginalName &&
93322                     (hasWikidata || (isSuggestion && !showsBrand)));
93323
93324                 field.locked(isLocked);
93325             }
93326
93327
93328             function calcMultilingual(tags) {
93329                 _multilingual = [];
93330                 for (var k in tags) {
93331                     var m = k.match(/^(.*):([a-zA-Z_-]+)$/);
93332                     if (m && m[1] === field.key && m[2]) {
93333                         _multilingual.push({ lang: m[2], value: tags[k] });
93334                     }
93335                 }
93336                 _multilingual.reverse();
93337             }
93338
93339
93340             function localized(selection) {
93341                 _selection = selection;
93342                 calcLocked();
93343                 var isLocked = field.locked();
93344                 var entity = _entity && context.hasEntity(_entity.id);  // get latest
93345                 var preset = entity && context.presets().match(entity, context.graph());
93346
93347                 var wrap = selection.selectAll('.form-field-input-wrap')
93348                     .data([0]);
93349
93350                 // enter/update
93351                 wrap = wrap.enter()
93352                     .append('div')
93353                     .attr('class', 'form-field-input-wrap form-field-input-' + field.type)
93354                     .merge(wrap);
93355
93356                 input = wrap.selectAll('.localized-main')
93357                     .data([0]);
93358
93359                 // enter/update
93360                 input = input.enter()
93361                     .append('input')
93362                     .attr('type', 'text')
93363                     .attr('id', 'preset-input-' + field.safeid)
93364                     .attr('class', 'localized-main')
93365                     .attr('placeholder', field.placeholder())
93366                     .call(utilNoAuto)
93367                     .merge(input);
93368
93369                 if (preset && field.id === 'name') {
93370                     var pTag = preset.id.split('/', 2);
93371                     var pKey = pTag[0];
93372                     var pValue = pTag[1];
93373
93374                     if (!preset.suggestion) {
93375                         // Not a suggestion preset - Add a suggestions dropdown if it makes sense to.
93376                         // This code attempts to determine if the matched preset is the
93377                         // kind of preset that even can benefit from name suggestions..
93378                         // - true = shops, cafes, hotels, etc. (also generic and fallback presets)
93379                         // - false = churches, parks, hospitals, etc. (things not in the index)
93380                         var isFallback = preset.isFallback();
93381                         var goodSuggestions = allSuggestions.filter(function(s) {
93382                             if (isFallback) return true;
93383                             var sTag = s.id.split('/', 2);
93384                             var sKey = sTag[0];
93385                             var sValue = sTag[1];
93386                             return pKey === sKey && (!pValue || pValue === sValue);
93387                         });
93388
93389                         // Show the suggestions.. If the user picks one, change the tags..
93390                         if (allSuggestions.length && goodSuggestions.length) {
93391                             input
93392                                 .on('blur.localized', checkBrandOnBlur)
93393                                 .call(brandCombo
93394                                     .fetcher(fetchBrandNames(preset, allSuggestions))
93395                                     .on('accept', acceptBrand)
93396                                     .on('cancel', cancelBrand)
93397                                 );
93398                         }
93399                     }
93400                 }
93401
93402                 input
93403                     .classed('disabled', !!isLocked)
93404                     .attr('readonly', isLocked || null)
93405                     .on('input', change(true))
93406                     .on('blur', change())
93407                     .on('change', change());
93408
93409
93410                 var translateButton = wrap.selectAll('.localized-add')
93411                     .data([0]);
93412
93413                 translateButton = translateButton.enter()
93414                     .append('button')
93415                     .attr('class', 'localized-add form-field-button')
93416                     .attr('tabindex', -1)
93417                     .call(svgIcon('#iD-icon-plus'))
93418                     .merge(translateButton);
93419
93420                 translateButton
93421                     .classed('disabled', !!isLocked)
93422                     .call(isLocked ? _buttonTip.destroy : _buttonTip)
93423                     .on('click', addNew);
93424
93425
93426                 if (entity && !_multilingual.length) {
93427                     calcMultilingual(entity.tags);
93428                 }
93429
93430                 localizedInputs = selection.selectAll('.localized-multilingual')
93431                     .data([0]);
93432
93433                 localizedInputs = localizedInputs.enter()
93434                     .append('div')
93435                     .attr('class', 'localized-multilingual')
93436                     .merge(localizedInputs);
93437
93438                 localizedInputs
93439                     .call(renderMultilingual);
93440
93441                 localizedInputs.selectAll('button, input')
93442                     .classed('disabled', !!isLocked)
93443                     .attr('readonly', isLocked || null);
93444
93445
93446
93447                 // We are not guaranteed to get an `accept` or `cancel` when blurring the field.
93448                 // (This can happen if the user actives the combo, arrows down, and then clicks off to blur)
93449                 // So compare the current field value against the suggestions one last time.
93450                 function checkBrandOnBlur() {
93451                     var latest = context.hasEntity(_entity.id);
93452                     if (!latest) return;   // deleting the entity blurred the field?
93453
93454                     var preset = context.presets().match(latest, context.graph());
93455                     if (preset && preset.suggestion) return;   // already accepted
93456
93457                     // note: here we are testing against "decorated" names, i.e. 'Starbucks – Cafe'
93458                     var name = utilGetSetValue(input).trim();
93459                     var matched = allSuggestions.filter(function(s) { return name === s.name(); });
93460
93461                     if (matched.length === 1) {
93462                         acceptBrand({ suggestion: matched[0] });
93463                     } else {
93464                         cancelBrand();
93465                     }
93466                 }
93467
93468
93469                 function acceptBrand(d) {
93470                     if (!d) {
93471                         cancelBrand();
93472                         return;
93473                     }
93474
93475                     var entity = context.entity(_entity.id);  // get latest
93476                     var tags = entity.tags;
93477                     var geometry = entity.geometry(context.graph());
93478                     var removed = preset.unsetTags(tags, geometry);
93479                     for (var k in tags) {
93480                         tags[k] = removed[k];  // set removed tags to `undefined`
93481                     }
93482                     tags = d.suggestion.setTags(tags, geometry);
93483                     utilGetSetValue(input, tags.name);
93484                     dispatch$1.call('change', this, tags);
93485                 }
93486
93487
93488                 // user hit escape, clean whatever preset name appears after the last ' – '
93489                 function cancelBrand() {
93490                     var name = utilGetSetValue(input);
93491                     var clean = cleanName(name);
93492                     if (clean !== name) {
93493                         utilGetSetValue(input, clean);
93494                         dispatch$1.call('change', this, { name: clean });
93495                     }
93496                 }
93497
93498                 // Remove whatever is after the last ' – '
93499                 // NOTE: split/join on en-dash, not a hypen (to avoid conflict with fr - nl names in Brussels etc)
93500                 function cleanName(name) {
93501                     var parts = name.split(' – ');
93502                     if (parts.length > 1) {
93503                         parts.pop();
93504                         name = parts.join(' – ');
93505                     }
93506                     return name;
93507                 }
93508
93509
93510                 function fetchBrandNames(preset, suggestions) {
93511                     var pTag = preset.id.split('/', 2);
93512                     var pKey = pTag[0];
93513                     var pValue = pTag[1];
93514
93515                     return function(value, callback) {
93516                         var results = [];
93517                         if (value && value.length > 2) {
93518                             for (var i = 0; i < suggestions.length; i++) {
93519                                 var s = suggestions[i];
93520                                 var sTag = s.id.split('/', 2);
93521                                 var sKey = sTag[0];
93522                                 var sValue = sTag[1];
93523                                 var name = s.name();
93524                                 var dist = utilEditDistance(value, name.substring(0, value.length));
93525                                 var matchesPreset = (pKey === sKey && (!pValue || pValue === sValue));
93526
93527                                 if (dist < 1 || (matchesPreset && dist < 3)) {
93528                                     var obj = {
93529                                         title: name,
93530                                         value: name,
93531                                         suggestion: s,
93532                                         dist: dist + (matchesPreset ? 0 : 1)  // penalize if not matched preset
93533                                     };
93534                                     results.push(obj);
93535                                 }
93536                             }
93537                             results.sort(function(a, b) { return a.dist - b.dist; });
93538                         }
93539                         results = results.slice(0, 10);
93540                         callback(results);
93541                     };
93542                 }
93543
93544
93545                 function addNew() {
93546                     event.preventDefault();
93547                     if (field.locked()) return;
93548
93549                     var defaultLang = utilDetect().locale.toLowerCase().split('-')[0];
93550                     var langExists = _multilingual.find(function(datum) { return datum.lang === defaultLang; });
93551                     var isLangEn = defaultLang.indexOf('en') > -1;
93552                     if (isLangEn || langExists) {
93553                         defaultLang = '';
93554                     }
93555                     _multilingual.push({ lang: defaultLang, value: '' });
93556
93557                     localizedInputs
93558                         .call(renderMultilingual);
93559                 }
93560
93561
93562                 function change(onInput) {
93563                     return function() {
93564                         if (field.locked()) {
93565                             event.preventDefault();
93566                             return;
93567                         }
93568                         var t = {};
93569                         t[field.key] = utilGetSetValue(d3_select(this)) || undefined;
93570                         dispatch$1.call('change', this, t, onInput);
93571                     };
93572                 }
93573             }
93574
93575
93576             function key(lang) {
93577                 return field.key + ':' + lang;
93578             }
93579
93580
93581             function changeLang(d) {
93582                 var lang = utilGetSetValue(d3_select(this));
93583                 var t = {};
93584                 var language = wikipedia$2.find(function(d) {
93585                     return d[0].toLowerCase() === lang.toLowerCase() ||
93586                         d[1].toLowerCase() === lang.toLowerCase();
93587                 });
93588
93589                 if (language) lang = language[2];
93590
93591                 if (d.lang && d.lang !== lang) {
93592                     t[key(d.lang)] = undefined;
93593                 }
93594
93595                 var value = utilGetSetValue(d3_select(this.parentNode)
93596                     .selectAll('.localized-value'));
93597
93598                 if (lang && value) {
93599                     t[key(lang)] = value;
93600                 } else if (lang && _wikiTitles && _wikiTitles[d.lang]) {
93601                     t[key(lang)] = _wikiTitles[d.lang];
93602                 }
93603
93604                 d.lang = lang;
93605                 dispatch$1.call('change', this, t);
93606             }
93607
93608
93609             function changeValue(d) {
93610                 if (!d.lang) return;
93611                 var t = {};
93612                 t[key(d.lang)] = utilGetSetValue(d3_select(this)) || undefined;
93613                 dispatch$1.call('change', this, t);
93614             }
93615
93616
93617             function fetchLanguages(value, cb) {
93618                 var v = value.toLowerCase();
93619
93620                 cb(wikipedia$2.filter(function(d) {
93621                     return d[0].toLowerCase().indexOf(v) >= 0 ||
93622                     d[1].toLowerCase().indexOf(v) >= 0 ||
93623                     d[2].toLowerCase().indexOf(v) >= 0;
93624                 }).map(function(d) {
93625                     return { value: d[1] };
93626                 }));
93627             }
93628
93629
93630             function renderMultilingual(selection) {
93631                 var wraps = selection.selectAll('div.entry')
93632                     .data(_multilingual, function(d) { return d.lang; });
93633
93634                 wraps.exit()
93635                     .transition()
93636                     .duration(200)
93637                     .style('max-height', '0px')
93638                     .style('opacity', '0')
93639                     .style('top', '-10px')
93640                     .remove();
93641
93642                 var innerWrap = wraps.enter()
93643                     .insert('div', ':first-child');
93644
93645                 innerWrap
93646                     .attr('class', 'entry')
93647                     .each(function() {
93648                         var wrap = d3_select(this);
93649
93650                         var label = wrap
93651                             .append('label')
93652                             .attr('class', 'field-label');
93653
93654                         var text = label
93655                             .append('span')
93656                             .attr('class', 'label-text');
93657
93658                         text
93659                             .append('span')
93660                             .attr('class', 'label-textvalue')
93661                             .text(t('translate.localized_translation_label'));
93662
93663                         text
93664                             .append('span')
93665                             .attr('class', 'label-textannotation');
93666
93667                         label
93668                             .append('button')
93669                             .attr('class', 'remove-icon-multilingual')
93670                             .on('click', function(d){
93671                                 if (field.locked()) return;
93672                                 event.preventDefault();
93673                                 var t = {};
93674                                 t[key(d.lang)] = undefined;
93675                                 dispatch$1.call('change', this, t);
93676                                 d3_select(this.parentNode.parentNode.parentNode)
93677                                     .style('top', '0')
93678                                     .style('max-height', '240px')
93679                                     .transition()
93680                                     .style('opacity', '0')
93681                                     .style('max-height', '0px')
93682                                     .remove();
93683                             })
93684                             .call(svgIcon('#iD-operation-delete'));
93685
93686                         wrap
93687                             .append('input')
93688                             .attr('class', 'localized-lang')
93689                             .attr('type', 'text')
93690                             .attr('placeholder', t('translate.localized_translation_language'))
93691                             .on('blur', changeLang)
93692                             .on('change', changeLang)
93693                             .call(langCombo);
93694
93695                         wrap
93696                             .append('input')
93697                             .attr('type', 'text')
93698                             .attr('placeholder', t('translate.localized_translation_name'))
93699                             .attr('class', 'localized-value')
93700                             .on('blur', changeValue)
93701                             .on('change', changeValue);
93702                     });
93703
93704                 innerWrap
93705                     .style('margin-top', '0px')
93706                     .style('max-height', '0px')
93707                     .style('opacity', '0')
93708                     .transition()
93709                     .duration(200)
93710                     .style('margin-top', '10px')
93711                     .style('max-height', '240px')
93712                     .style('opacity', '1')
93713                     .on('end', function() {
93714                         d3_select(this)
93715                             .style('max-height', '')
93716                             .style('overflow', 'visible');
93717                     });
93718
93719
93720                 var entry = selection.selectAll('.entry');
93721
93722                 utilGetSetValue(entry.select('.localized-lang'), function(d) {
93723                     var lang = wikipedia$2.find(function(lang) { return lang[2] === d.lang; });
93724                     return lang ? lang[1] : d.lang;
93725                 });
93726
93727                 utilGetSetValue(entry.select('.localized-value'),
93728                     function(d) { return d.value; });
93729             }
93730
93731
93732             localized.tags = function(tags) {
93733                 // Fetch translations from wikipedia
93734                 if (tags.wikipedia && !_wikiTitles) {
93735                     _wikiTitles = {};
93736                     var wm = tags.wikipedia.match(/([^:]+):(.+)/);
93737                     if (wm && wm[0] && wm[1]) {
93738                         wikipedia.translations(wm[1], wm[2], function(err, d) {
93739                             if (err || !d) return;
93740                             _wikiTitles = d;
93741                         });
93742                     }
93743                 }
93744
93745                 utilGetSetValue(input, tags[field.key] || '');
93746
93747                 calcMultilingual(tags);
93748
93749                 _selection
93750                     .call(localized);
93751             };
93752
93753
93754             localized.focus = function() {
93755                 input.node().focus();
93756             };
93757
93758
93759             localized.entity = function(val) {
93760                 if (!arguments.length) return _entity;
93761                 _entity = val;
93762                 _multilingual = [];
93763                 return localized;
93764             };
93765
93766             return utilRebind(localized, dispatch$1, 'on');
93767         }
93768
93769         function uiFieldMaxspeed(field, context) {
93770             var dispatch$1 = dispatch('change');
93771             var unitInput = d3_select(null);
93772             var input = d3_select(null);
93773             var _entity;
93774             var _isImperial;
93775
93776             var speedCombo = uiCombobox(context, 'maxspeed');
93777             var unitCombo = uiCombobox(context, 'maxspeed-unit')
93778                     .data(['km/h', 'mph'].map(comboValues));
93779
93780             var metricValues = [20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120];
93781             var imperialValues = [5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80];
93782
93783
93784             function maxspeed(selection) {
93785
93786                 var wrap = selection.selectAll('.form-field-input-wrap')
93787                     .data([0]);
93788
93789                 wrap = wrap.enter()
93790                     .append('div')
93791                     .attr('class', 'form-field-input-wrap form-field-input-' + field.type)
93792                     .merge(wrap);
93793
93794
93795                 input = wrap.selectAll('#preset-input-' + field.safeid)
93796                     .data([0]);
93797
93798                 input = input.enter()
93799                     .append('input')
93800                     .attr('type', 'text')
93801                     .attr('id', 'preset-input-' + field.safeid)
93802                     .attr('placeholder', field.placeholder())
93803                     .call(utilNoAuto)
93804                     .call(speedCombo)
93805                     .merge(input);
93806
93807                 input
93808                     .on('change', change)
93809                     .on('blur', change);
93810
93811                 var loc;
93812                 if (_entity.type === 'node') {
93813                     loc = _entity.loc;
93814                 } else {
93815                     var childNodes = context.graph().childNodes(context.entity(_entity.id));
93816                     loc = childNodes[~~(childNodes.length/2)].loc;
93817                 }
93818
93819                 _isImperial = dataImperial.features.some(function(f) {
93820                     return f.geometry.coordinates.some(function(d) {
93821                         return geoPointInPolygon(loc, d);
93822                     });
93823                 });
93824
93825                 unitInput = wrap.selectAll('input.maxspeed-unit')
93826                     .data([0]);
93827
93828                 unitInput = unitInput.enter()
93829                     .append('input')
93830                     .attr('type', 'text')
93831                     .attr('class', 'maxspeed-unit')
93832                     .call(unitCombo)
93833                     .merge(unitInput);
93834
93835                 unitInput
93836                     .on('blur', changeUnits)
93837                     .on('change', changeUnits);
93838
93839
93840                 function changeUnits() {
93841                     _isImperial = utilGetSetValue(unitInput) === 'mph';
93842                     utilGetSetValue(unitInput, _isImperial ? 'mph' : 'km/h');
93843                     setSuggestions();
93844                     change();
93845                 }
93846             }
93847
93848
93849             function setSuggestions() {
93850                 speedCombo.data((_isImperial ? imperialValues : metricValues).map(comboValues));
93851                 utilGetSetValue(unitInput, _isImperial ? 'mph' : 'km/h');
93852             }
93853
93854
93855             function comboValues(d) {
93856                 return {
93857                     value: d.toString(),
93858                     title: d.toString()
93859                 };
93860             }
93861
93862
93863             function change() {
93864                 var tag = {};
93865                 var value = utilGetSetValue(input);
93866
93867                 if (!value) {
93868                     tag[field.key] = undefined;
93869                 } else if (isNaN(value) || !_isImperial) {
93870                     tag[field.key] = value;
93871                 } else {
93872                     tag[field.key] = value + ' mph';
93873                 }
93874
93875                 dispatch$1.call('change', this, tag);
93876             }
93877
93878
93879             maxspeed.tags = function(tags) {
93880                 var value = tags[field.key];
93881
93882                 if (value && value.indexOf('mph') >= 0) {
93883                     value = parseInt(value, 10);
93884                     _isImperial = true;
93885                 } else if (value) {
93886                     _isImperial = false;
93887                 }
93888
93889                 setSuggestions();
93890                 utilGetSetValue(input, value || '');
93891             };
93892
93893
93894             maxspeed.focus = function() {
93895                 input.node().focus();
93896             };
93897
93898
93899             maxspeed.entity = function(val) {
93900                 _entity = val;
93901             };
93902
93903
93904             return utilRebind(maxspeed, dispatch$1, 'on');
93905         }
93906
93907         function uiFieldRadio(field, context) {
93908             var dispatch$1 = dispatch('change');
93909             var placeholder = d3_select(null);
93910             var wrap = d3_select(null);
93911             var labels = d3_select(null);
93912             var radios = d3_select(null);
93913             var radioData = (field.options || field.keys).slice();  // shallow copy
93914             var typeField;
93915             var layerField;
93916             var _oldType = {};
93917             var _entity;
93918
93919
93920             function selectedKey() {
93921                 var node = wrap.selectAll('.form-field-input-radio label.active input');
93922                 return !node.empty() && node.datum();
93923             }
93924
93925
93926             function radio(selection) {
93927                 selection.classed('preset-radio', true);
93928
93929                 wrap = selection.selectAll('.form-field-input-wrap')
93930                     .data([0]);
93931
93932                 var enter = wrap.enter()
93933                     .append('div')
93934                     .attr('class', 'form-field-input-wrap form-field-input-radio');
93935
93936                 enter
93937                     .append('span')
93938                     .attr('class', 'placeholder');
93939
93940                 wrap = wrap
93941                     .merge(enter);
93942
93943
93944                 placeholder = wrap.selectAll('.placeholder');
93945
93946                 labels = wrap.selectAll('label')
93947                     .data(radioData);
93948
93949                 enter = labels.enter()
93950                     .append('label');
93951
93952                 enter
93953                     .append('input')
93954                     .attr('type', 'radio')
93955                     .attr('name', field.id)
93956                     .attr('value', function(d) { return field.t('options.' + d, { 'default': d }); })
93957                     .attr('checked', false);
93958
93959                 enter
93960                     .append('span')
93961                     .text(function(d) { return field.t('options.' + d, { 'default': d }); });
93962
93963                 labels = labels
93964                     .merge(enter);
93965
93966                 radios = labels.selectAll('input')
93967                     .on('change', changeRadio);
93968
93969             }
93970
93971
93972             function structureExtras(selection, tags) {
93973                 var selected = selectedKey();
93974                 var type = context.presets().field(selected);
93975                 var layer = context.presets().field('layer');
93976                 var showLayer = (selected === 'bridge' || selected === 'tunnel');
93977
93978
93979                 var extrasWrap = selection.selectAll('.structure-extras-wrap')
93980                     .data(selected ? [0] : []);
93981
93982                 extrasWrap.exit()
93983                     .remove();
93984
93985                 extrasWrap = extrasWrap.enter()
93986                     .append('div')
93987                     .attr('class', 'structure-extras-wrap')
93988                     .merge(extrasWrap);
93989
93990                 var list = extrasWrap.selectAll('ul')
93991                     .data([0]);
93992
93993                 list = list.enter()
93994                     .append('ul')
93995                     .attr('class', 'rows')
93996                     .merge(list);
93997
93998
93999                 // Type
94000                 if (type) {
94001                     if (!typeField || typeField.id !== selected) {
94002                         typeField = uiField(context, type, _entity, { wrap: false })
94003                             .on('change', changeType);
94004                     }
94005                     typeField.tags(tags);
94006                 } else {
94007                     typeField = null;
94008                 }
94009
94010                 var typeItem = list.selectAll('.structure-type-item')
94011                     .data(typeField ? [typeField] : [], function(d) { return d.id; });
94012
94013                 // Exit
94014                 typeItem.exit()
94015                     .remove();
94016
94017                 // Enter
94018                 var typeEnter = typeItem.enter()
94019                     .insert('li', ':first-child')
94020                     .attr('class', 'labeled-input structure-type-item');
94021
94022                 typeEnter
94023                     .append('span')
94024                     .attr('class', 'label structure-label-type')
94025                     .attr('for', 'preset-input-' + selected)
94026                     .text(t('inspector.radio.structure.type'));
94027
94028                 typeEnter
94029                     .append('div')
94030                     .attr('class', 'structure-input-type-wrap');
94031
94032                 // Update
94033                 typeItem = typeItem
94034                     .merge(typeEnter);
94035
94036                 if (typeField) {
94037                     typeItem.selectAll('.structure-input-type-wrap')
94038                         .call(typeField.render);
94039                 }
94040
94041
94042                 // Layer
94043                 if (layer && showLayer) {
94044                     if (!layerField) {
94045                         layerField = uiField(context, layer, _entity, { wrap: false })
94046                             .on('change', changeLayer);
94047                     }
94048                     layerField.tags(tags);
94049                     field.keys = utilArrayUnion(field.keys, ['layer']);
94050                 } else {
94051                     layerField = null;
94052                     field.keys = field.keys.filter(function(k) { return k !== 'layer'; });
94053                 }
94054
94055                 var layerItem = list.selectAll('.structure-layer-item')
94056                     .data(layerField ? [layerField] : []);
94057
94058                 // Exit
94059                 layerItem.exit()
94060                     .remove();
94061
94062                 // Enter
94063                 var layerEnter = layerItem.enter()
94064                     .append('li')
94065                     .attr('class', 'labeled-input structure-layer-item');
94066
94067                 layerEnter
94068                     .append('span')
94069                     .attr('class', 'label structure-label-layer')
94070                     .attr('for', 'preset-input-layer')
94071                     .text(t('inspector.radio.structure.layer'));
94072
94073                 layerEnter
94074                     .append('div')
94075                     .attr('class', 'structure-input-layer-wrap');
94076
94077                 // Update
94078                 layerItem = layerItem
94079                     .merge(layerEnter);
94080
94081                 if (layerField) {
94082                     layerItem.selectAll('.structure-input-layer-wrap')
94083                         .call(layerField.render);
94084                 }
94085             }
94086
94087
94088             function changeType(t, onInput) {
94089                 var key = selectedKey();
94090                 if (!key) return;
94091
94092                 var val = t[key];
94093                 if (val !== 'no') {
94094                     _oldType[key] = val;
94095                 }
94096
94097                 if (field.type === 'structureRadio') {
94098                     // remove layer if it should not be set
94099                     if (val === 'no' ||
94100                         (key !== 'bridge' && key !== 'tunnel') ||
94101                         (key === 'tunnel' && val === 'building_passage')) {
94102                         t.layer = undefined;
94103                     }
94104                     // add layer if it should be set
94105                     if (t.layer === undefined) {
94106                         if (key === 'bridge' && val !== 'no') {
94107                             t.layer = '1';
94108                         }
94109                         if (key === 'tunnel' && val !== 'no' && val !== 'building_passage') {
94110                             t.layer = '-1';
94111                         }
94112                     }
94113                  }
94114
94115                 dispatch$1.call('change', this, t, onInput);
94116             }
94117
94118
94119             function changeLayer(t, onInput) {
94120                 if (t.layer === '0') {
94121                     t.layer = undefined;
94122                 }
94123                 dispatch$1.call('change', this, t, onInput);
94124             }
94125
94126
94127             function changeRadio() {
94128                 var t = {};
94129                 var activeKey;
94130
94131                 if (field.key) {
94132                     t[field.key] = undefined;
94133                 }
94134
94135                 radios.each(function(d) {
94136                     var active = d3_select(this).property('checked');
94137                     if (active) activeKey = d;
94138
94139                     if (field.key) {
94140                         if (active) t[field.key] = d;
94141                     } else {
94142                         var val = _oldType[activeKey] || 'yes';
94143                         t[d] = active ? val : undefined;
94144                     }
94145                 });
94146
94147                 if (field.type === 'structureRadio') {
94148                     if (activeKey === 'bridge') {
94149                         t.layer = '1';
94150                     } else if (activeKey === 'tunnel' && t.tunnel !== 'building_passage') {
94151                         t.layer = '-1';
94152                     } else {
94153                         t.layer = undefined;
94154                     }
94155                 }
94156
94157                 dispatch$1.call('change', this, t);
94158             }
94159
94160
94161             radio.tags = function(tags) {
94162                 function checked(d) {
94163                     if (field.key) {
94164                         return tags[field.key] === d;
94165                     } else {
94166                         return !!(tags[d] && tags[d].toLowerCase() !== 'no');
94167                     }
94168                 }
94169
94170                 labels.classed('active', checked);
94171                 radios.property('checked', checked);
94172
94173                 var selection = radios.filter(function() { return this.checked; });
94174
94175                 if (selection.empty()) {
94176                     placeholder.text(t('inspector.none'));
94177                 } else {
94178                     placeholder.text(selection.attr('value'));
94179                     _oldType[selection.datum()] = tags[selection.datum()];
94180                 }
94181
94182                 if (field.type === 'structureRadio') {
94183                     // For waterways without a tunnel tag, set 'culvert' as
94184                     // the _oldType to default to if the user picks 'tunnel'
94185                     if (!!tags.waterway && !_oldType.tunnel) {
94186                         _oldType.tunnel = 'culvert';
94187                     }
94188
94189                     wrap.call(structureExtras, tags);
94190                 }
94191             };
94192
94193
94194             radio.focus = function() {
94195                 radios.node().focus();
94196             };
94197
94198
94199             radio.entity = function(val) {
94200                 if (!arguments.length) return _entity;
94201                 _entity = val;
94202                 _oldType = {};
94203                 return radio;
94204             };
94205
94206
94207             return utilRebind(radio, dispatch$1, 'on');
94208         }
94209
94210         function uiFieldRestrictions(field, context) {
94211             var dispatch$1 = dispatch('change');
94212             var breathe = behaviorBreathe(context);
94213             var storedViaWay = context.storage('turn-restriction-via-way');
94214             var storedDistance = context.storage('turn-restriction-distance');
94215
94216             var _maxViaWay = storedViaWay !== null ? (+storedViaWay) : 1;
94217             var _maxDistance = storedDistance ? (+storedDistance) : 30;
94218             var _initialized = false;
94219             var _parent = d3_select(null);       // the entire field
94220             var _container = d3_select(null);    // just the map
94221             var _oldTurns;
94222             var _graph;
94223             var _vertexID;
94224             var _intersection;
94225             var _fromWayID;
94226
94227             var _lastXPos;
94228
94229
94230             function restrictions(selection) {
94231                 _parent = selection;
94232
94233                 // try to reuse the intersection, but always rebuild it if the graph has changed
94234                 if (_vertexID && (context.graph() !== _graph || !_intersection)) {
94235                     _graph = context.graph();
94236                     _intersection = osmIntersection(_graph, _vertexID, _maxDistance);
94237                 }
94238
94239                 // It's possible for there to be no actual intersection here.
94240                 // for example, a vertex of two `highway=path`
94241                 // In this case, hide the field.
94242                 var isOK = (
94243                     _intersection &&
94244                     _intersection.vertices.length &&           // has vertices
94245                     _intersection.vertices                     // has the vertex that the user selected
94246                         .filter(function(vertex) { return vertex.id === _vertexID; }).length &&
94247                     _intersection.ways.length > 2 &&           // has more than 2 ways
94248                     _intersection.ways                         // has more than 1 TO way
94249                         .filter(function(way) { return way.__to; }).length > 1
94250                 );
94251
94252                 // Also hide in the case where
94253                 d3_select(selection.node().parentNode).classed('hide', !isOK);
94254
94255                 // if form field is hidden or has detached from dom, clean up.
94256                 if (!isOK ||
94257                     !d3_select('.inspector-wrap.inspector-hidden').empty() ||
94258                     !selection.node().parentNode ||
94259                     !selection.node().parentNode.parentNode) {
94260                     selection.call(restrictions.off);
94261                     return;
94262                 }
94263
94264
94265                 var wrap = selection.selectAll('.form-field-input-wrap')
94266                     .data([0]);
94267
94268                 wrap = wrap.enter()
94269                     .append('div')
94270                     .attr('class', 'form-field-input-wrap form-field-input-' + field.type)
94271                     .merge(wrap);
94272
94273                 var container = wrap.selectAll('.restriction-container')
94274                     .data([0]);
94275
94276                 // enter
94277                 var containerEnter = container.enter()
94278                     .append('div')
94279                     .attr('class', 'restriction-container');
94280
94281                 containerEnter
94282                     .append('div')
94283                     .attr('class', 'restriction-help');
94284
94285                 // update
94286                 _container = containerEnter
94287                     .merge(container)
94288                     .call(renderViewer);
94289
94290                 var controls = wrap.selectAll('.restriction-controls')
94291                     .data([0]);
94292
94293                 // enter/update
94294                 controls.enter()
94295                     .append('div')
94296                     .attr('class', 'restriction-controls-container')
94297                     .append('div')
94298                     .attr('class', 'restriction-controls')
94299                     .merge(controls)
94300                     .call(renderControls);
94301             }
94302
94303
94304             function renderControls(selection) {
94305                 var distControl = selection.selectAll('.restriction-distance')
94306                     .data([0]);
94307
94308                 distControl.exit()
94309                     .remove();
94310
94311                 var distControlEnter = distControl.enter()
94312                     .append('div')
94313                     .attr('class', 'restriction-control restriction-distance');
94314
94315                 distControlEnter
94316                     .append('span')
94317                     .attr('class', 'restriction-control-label restriction-distance-label')
94318                     .text(t('restriction.controls.distance') + ':');
94319
94320                 distControlEnter
94321                     .append('input')
94322                     .attr('class', 'restriction-distance-input')
94323                     .attr('type', 'range')
94324                     .attr('min', '20')
94325                     .attr('max', '50')
94326                     .attr('step', '5');
94327
94328                 distControlEnter
94329                     .append('span')
94330                     .attr('class', 'restriction-distance-text');
94331
94332                 // update
94333                 selection.selectAll('.restriction-distance-input')
94334                     .property('value', _maxDistance)
94335                     .on('input', function() {
94336                         var val = d3_select(this).property('value');
94337                         _maxDistance = +val;
94338                         _intersection = null;
94339                         _container.selectAll('.layer-osm .layer-turns *').remove();
94340                         context.storage('turn-restriction-distance', _maxDistance);
94341                         _parent.call(restrictions);
94342                     });
94343
94344                 selection.selectAll('.restriction-distance-text')
94345                     .text(displayMaxDistance(_maxDistance));
94346
94347
94348                 var viaControl = selection.selectAll('.restriction-via-way')
94349                     .data([0]);
94350
94351                 viaControl.exit()
94352                     .remove();
94353
94354                 var viaControlEnter = viaControl.enter()
94355                     .append('div')
94356                     .attr('class', 'restriction-control restriction-via-way');
94357
94358                 viaControlEnter
94359                     .append('span')
94360                     .attr('class', 'restriction-control-label restriction-via-way-label')
94361                     .text(t('restriction.controls.via') + ':');
94362
94363                 viaControlEnter
94364                     .append('input')
94365                     .attr('class', 'restriction-via-way-input')
94366                     .attr('type', 'range')
94367                     .attr('min', '0')
94368                     .attr('max', '2')
94369                     .attr('step', '1');
94370
94371                 viaControlEnter
94372                     .append('span')
94373                     .attr('class', 'restriction-via-way-text');
94374
94375                 // update
94376                 selection.selectAll('.restriction-via-way-input')
94377                     .property('value', _maxViaWay)
94378                     .on('input', function() {
94379                         var val = d3_select(this).property('value');
94380                         _maxViaWay = +val;
94381                         _container.selectAll('.layer-osm .layer-turns *').remove();
94382                         context.storage('turn-restriction-via-way', _maxViaWay);
94383                         _parent.call(restrictions);
94384                     });
94385
94386                 selection.selectAll('.restriction-via-way-text')
94387                     .text(displayMaxVia(_maxViaWay));
94388             }
94389
94390
94391             function renderViewer(selection) {
94392                 if (!_intersection) return;
94393
94394                 var vgraph = _intersection.graph;
94395                 var filter = utilFunctor(true);
94396                 var projection = geoRawMercator();
94397
94398                 // Reflow warning: `utilGetDimensions` calls `getBoundingClientRect`
94399                 // Instead of asking the restriction-container for its dimensions,
94400                 //  we can ask the #sidebar, which can have its dimensions cached.
94401                 // width: calc as sidebar - padding
94402                 // height: hardcoded (from `80_app.css`)
94403                 // var d = utilGetDimensions(selection);
94404                 var sdims = utilGetDimensions(d3_select('#sidebar'));
94405                 var d = [ sdims[0] - 50, 370 ];
94406                 var c = geoVecScale(d, 0.5);
94407                 var z = 22;
94408
94409                 projection.scale(geoZoomToScale(z));
94410
94411                 // Calculate extent of all key vertices
94412                 var extent = geoExtent();
94413                 for (var i = 0; i < _intersection.vertices.length; i++) {
94414                     extent._extend(_intersection.vertices[i].extent());
94415                 }
94416
94417                 // If this is a large intersection, adjust zoom to fit extent
94418                 if (_intersection.vertices.length > 1) {
94419                     var padding = 180;   // in z22 pixels
94420                     var tl = projection([extent[0][0], extent[1][1]]);
94421                     var br = projection([extent[1][0], extent[0][1]]);
94422                     var hFactor = (br[0] - tl[0]) / (d[0] - padding);
94423                     var vFactor = (br[1] - tl[1]) / (d[1] - padding);
94424                     var hZoomDiff = Math.log(Math.abs(hFactor)) / Math.LN2;
94425                     var vZoomDiff = Math.log(Math.abs(vFactor)) / Math.LN2;
94426                     z = z - Math.max(hZoomDiff, vZoomDiff);
94427                     projection.scale(geoZoomToScale(z));
94428                 }
94429
94430                 var padTop = 35;   // reserve top space for hint text
94431                 var extentCenter = projection(extent.center());
94432                 extentCenter[1] = extentCenter[1] - padTop;
94433
94434                 projection
94435                     .translate(geoVecSubtract(c, extentCenter))
94436                     .clipExtent([[0, 0], d]);
94437
94438                 var drawLayers = svgLayers(projection, context).only(['osm','touch']).dimensions(d);
94439                 var drawVertices = svgVertices(projection, context);
94440                 var drawLines = svgLines(projection, context);
94441                 var drawTurns = svgTurns(projection, context);
94442
94443                 var firstTime = selection.selectAll('.surface').empty();
94444
94445                 selection
94446                     .call(drawLayers);
94447
94448                 var surface = selection.selectAll('.surface')
94449                     .classed('tr', true);
94450
94451                 if (firstTime) {
94452                     _initialized = true;
94453
94454                     surface
94455                         .call(breathe);
94456                 }
94457
94458                 // This can happen if we've lowered the detail while a FROM way
94459                 // is selected, and that way is no longer part of the intersection.
94460                 if (_fromWayID && !vgraph.hasEntity(_fromWayID)) {
94461                     _fromWayID = null;
94462                     _oldTurns = null;
94463                 }
94464
94465                 surface
94466                     .call(utilSetDimensions, d)
94467                     .call(drawVertices, vgraph, _intersection.vertices, filter, extent, z)
94468                     .call(drawLines, vgraph, _intersection.ways, filter)
94469                     .call(drawTurns, vgraph, _intersection.turns(_fromWayID, _maxViaWay));
94470
94471                 surface
94472                     .on('click.restrictions', click)
94473                     .on('mouseover.restrictions', mouseover);
94474
94475                 surface
94476                     .selectAll('.selected')
94477                     .classed('selected', false);
94478
94479                 surface
94480                     .selectAll('.related')
94481                     .classed('related', false);
94482
94483                 if (_fromWayID) {
94484                     var way = vgraph.entity(_fromWayID);
94485                     surface
94486                         .selectAll('.' + _fromWayID)
94487                         .classed('selected', true)
94488                         .classed('related', true);
94489                 }
94490
94491                 document.addEventListener('resizeWindow', function () {
94492                     utilSetDimensions(_container, null);
94493                     redraw(1);
94494                 }, false);
94495
94496                 updateHints(null);
94497
94498
94499                 function click() {
94500                     surface
94501                         .call(breathe.off)
94502                         .call(breathe);
94503
94504                     var datum = event.target.__data__;
94505                     var entity = datum && datum.properties && datum.properties.entity;
94506                     if (entity) {
94507                         datum = entity;
94508                     }
94509
94510                     if (datum instanceof osmWay && (datum.__from || datum.__via)) {
94511                         _fromWayID = datum.id;
94512                         _oldTurns = null;
94513                         redraw();
94514
94515                     } else if (datum instanceof osmTurn) {
94516                         var actions, extraActions, turns, i;
94517                         var restrictionType = osmInferRestriction(vgraph, datum, projection);
94518
94519                         if (datum.restrictionID && !datum.direct) {
94520                             return;
94521
94522                         } else if (datum.restrictionID && !datum.only) {    // NO -> ONLY
94523                             var seen = {};
94524                             var datumOnly = JSON.parse(JSON.stringify(datum));   // deep clone the datum
94525                             datumOnly.only = true;                               // but change this property
94526                             restrictionType = restrictionType.replace(/^no/, 'only');
94527
94528                             // Adding an ONLY restriction should destroy all other direct restrictions from the FROM towards the VIA.
94529                             // We will remember them in _oldTurns, and restore them if the user clicks again.
94530                             turns = _intersection.turns(_fromWayID, 2);
94531                             extraActions = [];
94532                             _oldTurns = [];
94533                             for (i = 0; i < turns.length; i++) {
94534                                 var turn = turns[i];
94535                                 if (seen[turn.restrictionID]) continue;  // avoid deleting the turn twice (#4968, #4928)
94536
94537                                 if (turn.direct && turn.path[1] === datum.path[1]) {
94538                                     seen[turns[i].restrictionID] = true;
94539                                     turn.restrictionType = osmInferRestriction(vgraph, turn, projection);
94540                                     _oldTurns.push(turn);
94541                                     extraActions.push(actionUnrestrictTurn(turn));
94542                                 }
94543                             }
94544
94545                             actions = _intersection.actions.concat(extraActions, [
94546                                 actionRestrictTurn(datumOnly, restrictionType),
94547                                 t('operations.restriction.annotation.create')
94548                             ]);
94549
94550                         } else if (datum.restrictionID) {   // ONLY -> Allowed
94551                             // Restore whatever restrictions we might have destroyed by cycling thru the ONLY state.
94552                             // This relies on the assumption that the intersection was already split up when we
94553                             // performed the previous action (NO -> ONLY), so the IDs in _oldTurns shouldn't have changed.
94554                             turns = _oldTurns || [];
94555                             extraActions = [];
94556                             for (i = 0; i < turns.length; i++) {
94557                                 if (turns[i].key !== datum.key) {
94558                                     extraActions.push(actionRestrictTurn(turns[i], turns[i].restrictionType));
94559                                 }
94560                             }
94561                             _oldTurns = null;
94562
94563                             actions = _intersection.actions.concat(extraActions, [
94564                                 actionUnrestrictTurn(datum),
94565                                 t('operations.restriction.annotation.delete')
94566                             ]);
94567
94568                         } else {    // Allowed -> NO
94569                             actions = _intersection.actions.concat([
94570                                 actionRestrictTurn(datum, restrictionType),
94571                                 t('operations.restriction.annotation.create')
94572                             ]);
94573                         }
94574
94575                         context.perform.apply(context, actions);
94576
94577                         // At this point the datum will be changed, but will have same key..
94578                         // Refresh it and update the help..
94579                         var s = surface.selectAll('.' + datum.key);
94580                         datum = s.empty() ? null : s.datum();
94581                         updateHints(datum);
94582
94583                     } else {
94584                         _fromWayID = null;
94585                         _oldTurns = null;
94586                         redraw();
94587                     }
94588                 }
94589
94590
94591                 function mouseover() {
94592                     var datum = event.target.__data__;
94593                     updateHints(datum);
94594                 }
94595
94596                 _lastXPos = _lastXPos || sdims[0];
94597
94598                 function redraw(minChange) {
94599                     var xPos = -1;
94600
94601                     if (minChange) {
94602                         xPos = utilGetDimensions(d3_select('#sidebar'))[0];
94603                     }
94604
94605                     if (!minChange || (minChange && Math.abs(xPos - _lastXPos) >= minChange)) {
94606                         if (context.hasEntity(_vertexID)) {
94607                             _lastXPos = xPos;
94608                             _container.call(renderViewer);
94609                         }
94610                     }
94611                 }
94612
94613
94614                 function highlightPathsFrom(wayID) {
94615                     surface.selectAll('.related')
94616                         .classed('related', false)
94617                         .classed('allow', false)
94618                         .classed('restrict', false)
94619                         .classed('only', false);
94620
94621                     surface.selectAll('.' + wayID)
94622                         .classed('related', true);
94623
94624                     if (wayID) {
94625                         var turns = _intersection.turns(wayID, _maxViaWay);
94626                         for (var i = 0; i < turns.length; i++) {
94627                             var turn = turns[i];
94628                             var ids = [turn.to.way];
94629                             var klass = (turn.no ? 'restrict' : (turn.only ? 'only' : 'allow'));
94630
94631                             if (turn.only || turns.length === 1) {
94632                                 if (turn.via.ways) {
94633                                     ids = ids.concat(turn.via.ways);
94634                                 }
94635                             } else if (turn.to.way === wayID) {
94636                                 continue;
94637                             }
94638
94639                             surface.selectAll(utilEntitySelector(ids))
94640                                 .classed('related', true)
94641                                 .classed('allow', (klass === 'allow'))
94642                                 .classed('restrict', (klass === 'restrict'))
94643                                 .classed('only', (klass === 'only'));
94644                         }
94645                     }
94646                 }
94647
94648
94649                 function updateHints(datum) {
94650                     var help = _container.selectAll('.restriction-help').html('');
94651
94652                     var placeholders = {};
94653                     ['from', 'via', 'to'].forEach(function(k) {
94654                         placeholders[k] = '<span class="qualifier">' + t('restriction.help.' + k) + '</span>';
94655                     });
94656
94657                     var entity = datum && datum.properties && datum.properties.entity;
94658                     if (entity) {
94659                         datum = entity;
94660                     }
94661
94662                     if (_fromWayID) {
94663                         way = vgraph.entity(_fromWayID);
94664                         surface
94665                             .selectAll('.' + _fromWayID)
94666                             .classed('selected', true)
94667                             .classed('related', true);
94668                     }
94669
94670                     // Hovering a way
94671                     if (datum instanceof osmWay && datum.__from) {
94672                         way = datum;
94673
94674                         highlightPathsFrom(_fromWayID ? null : way.id);
94675                         surface.selectAll('.' + way.id)
94676                             .classed('related', true);
94677
94678                         var clickSelect = (!_fromWayID || _fromWayID !== way.id);
94679                         help
94680                             .append('div')      // "Click to select FROM {fromName}." / "FROM {fromName}"
94681                             .html(t('restriction.help.' + (clickSelect ? 'select_from_name' : 'from_name'), {
94682                                 from: placeholders.from,
94683                                 fromName: displayName(way.id, vgraph)
94684                             }));
94685
94686
94687                     // Hovering a turn arrow
94688                     } else if (datum instanceof osmTurn) {
94689                         var restrictionType = osmInferRestriction(vgraph, datum, projection);
94690                         var turnType = restrictionType.replace(/^(only|no)\_/, '');
94691                         var indirect = (datum.direct === false ? t('restriction.help.indirect') : '');
94692                         var klass, turnText, nextText;
94693
94694                         if (datum.no) {
94695                             klass = 'restrict';
94696                             turnText = t('restriction.help.turn.no_' + turnType, { indirect: indirect });
94697                             nextText = t('restriction.help.turn.only_' + turnType, { indirect: '' });
94698                         } else if (datum.only) {
94699                             klass = 'only';
94700                             turnText = t('restriction.help.turn.only_' + turnType, { indirect: indirect });
94701                             nextText = t('restriction.help.turn.allowed_' + turnType, { indirect: '' });
94702                         } else {
94703                             klass = 'allow';
94704                             turnText = t('restriction.help.turn.allowed_' + turnType, { indirect: indirect });
94705                             nextText = t('restriction.help.turn.no_' + turnType, { indirect: '' });
94706                         }
94707
94708                         help
94709                             .append('div')      // "NO Right Turn (indirect)"
94710                             .attr('class', 'qualifier ' + klass)
94711                             .text(turnText);
94712
94713                         help
94714                             .append('div')      // "FROM {fromName} TO {toName}"
94715                             .html(t('restriction.help.from_name_to_name', {
94716                                 from: placeholders.from,
94717                                 fromName: displayName(datum.from.way, vgraph),
94718                                 to: placeholders.to,
94719                                 toName: displayName(datum.to.way, vgraph)
94720                             }));
94721
94722                         if (datum.via.ways && datum.via.ways.length) {
94723                             var names = [];
94724                             for (var i = 0; i < datum.via.ways.length; i++) {
94725                                 var prev = names[names.length - 1];
94726                                 var curr = displayName(datum.via.ways[i], vgraph);
94727                                 if (!prev || curr !== prev)   // collapse identical names
94728                                     names.push(curr);
94729                             }
94730
94731                             help
94732                                 .append('div')      // "VIA {viaNames}"
94733                                 .html(t('restriction.help.via_names', {
94734                                     via: placeholders.via,
94735                                     viaNames: names.join(', ')
94736                                 }));
94737                         }
94738
94739                         if (!indirect) {
94740                             help
94741                                 .append('div')      // Click for "No Right Turn"
94742                                 .text(t('restriction.help.toggle', { turn: nextText.trim() }));
94743                         }
94744
94745                         highlightPathsFrom(null);
94746                         var alongIDs = datum.path.slice();
94747                         surface.selectAll(utilEntitySelector(alongIDs))
94748                             .classed('related', true)
94749                             .classed('allow', (klass === 'allow'))
94750                             .classed('restrict', (klass === 'restrict'))
94751                             .classed('only', (klass === 'only'));
94752
94753
94754                     // Hovering empty surface
94755                     } else {
94756                         highlightPathsFrom(null);
94757                         if (_fromWayID) {
94758                             help
94759                                 .append('div')      // "FROM {fromName}"
94760                                 .html(t('restriction.help.from_name', {
94761                                     from: placeholders.from,
94762                                     fromName: displayName(_fromWayID, vgraph)
94763                                 }));
94764
94765                         } else {
94766                             help
94767                                 .append('div')      // "Click to select a FROM segment."
94768                                 .html(t('restriction.help.select_from', {
94769                                     from: placeholders.from
94770                                 }));
94771                         }
94772                     }
94773                 }
94774             }
94775
94776
94777             function displayMaxDistance(maxDist) {
94778                 var isImperial = (utilDetect().locale.toLowerCase() === 'en-us');
94779                 var opts;
94780
94781                 if (isImperial) {
94782                     var distToFeet = {   // imprecise conversion for prettier display
94783                         20: 70, 25: 85, 30: 100, 35: 115, 40: 130, 45: 145, 50: 160
94784                     }[maxDist];
94785                     opts = { distance: t('units.feet', { quantity: distToFeet }) };
94786                 } else {
94787                     opts = { distance: t('units.meters', { quantity: maxDist }) };
94788                 }
94789
94790                 return t('restriction.controls.distance_up_to', opts);
94791             }
94792
94793
94794             function displayMaxVia(maxVia) {
94795                 return maxVia === 0 ? t('restriction.controls.via_node_only')
94796                     : maxVia === 1 ? t('restriction.controls.via_up_to_one')
94797                     : t('restriction.controls.via_up_to_two');
94798             }
94799
94800
94801             function displayName(entityID, graph) {
94802                 var entity = graph.entity(entityID);
94803                 var name = utilDisplayName(entity) || '';
94804                 var matched = context.presets().match(entity, graph);
94805                 var type = (matched && matched.name()) || utilDisplayType(entity.id);
94806                 return name || type;
94807             }
94808
94809
94810             restrictions.entity = function(val) {
94811                 _intersection = null;
94812                 _fromWayID = null;
94813                 _oldTurns = null;
94814                 _vertexID = val.id;
94815             };
94816
94817
94818             restrictions.tags = function() {};
94819             restrictions.focus = function() {};
94820
94821
94822             restrictions.off = function(selection) {
94823                 if (!_initialized) return;
94824
94825                 selection.selectAll('.surface')
94826                     .call(breathe.off)
94827                     .on('click.restrictions', null)
94828                     .on('mouseover.restrictions', null);
94829
94830                 d3_select(window)
94831                     .on('resize.restrictions', null);
94832             };
94833
94834
94835             return utilRebind(restrictions, dispatch$1, 'on');
94836         }
94837
94838         function uiFieldTextarea(field) {
94839             var dispatch$1 = dispatch('change');
94840             var input = d3_select(null);
94841
94842
94843             function textarea(selection) {
94844                 var wrap = selection.selectAll('.form-field-input-wrap')
94845                     .data([0]);
94846
94847                 wrap = wrap.enter()
94848                     .append('div')
94849                     .attr('class', 'form-field-input-wrap form-field-input-' + field.type)
94850                     .merge(wrap);
94851
94852                 input = wrap.selectAll('textarea')
94853                     .data([0]);
94854
94855                 input = input.enter()
94856                     .append('textarea')
94857                     .attr('id', 'preset-input-' + field.safeid)
94858                     .attr('placeholder', field.placeholder() || t('inspector.unknown'))
94859                     .attr('maxlength', 255)
94860                     .call(utilNoAuto)
94861                     .on('input', change(true))
94862                     .on('blur', change())
94863                     .on('change', change())
94864                     .merge(input);
94865             }
94866
94867
94868             function change(onInput) {
94869                 return function() {
94870                     var t = {};
94871                     t[field.key] = utilGetSetValue(input) || undefined;
94872                     dispatch$1.call('change', this, t, onInput);
94873                 };
94874             }
94875
94876
94877             textarea.tags = function(tags) {
94878                 utilGetSetValue(input, tags[field.key] || '');
94879             };
94880
94881
94882             textarea.focus = function() {
94883                 input.node().focus();
94884             };
94885
94886
94887             return utilRebind(textarea, dispatch$1, 'on');
94888         }
94889
94890         function uiFieldWikidata(field, context) {
94891             var wikidata = services$1.wikidata;
94892             var dispatch$1 = dispatch('change');
94893             var searchInput = d3_select(null);
94894             var _qid = null;
94895             var _wikidataEntity = null;
94896             var _wikiURL = '';
94897             var _entity;
94898
94899             var combobox = uiCombobox(context, 'combo-' + field.safeid)
94900                 .caseSensitive(true)
94901                 .minItems(1);
94902
94903             function wiki(selection) {
94904
94905                 var wrap = selection.selectAll('.form-field-input-wrap')
94906                     .data([0]);
94907
94908                 wrap = wrap.enter()
94909                     .append('div')
94910                     .attr('class', 'form-field-input-wrap form-field-input-' + field.type)
94911                     .merge(wrap);
94912
94913
94914                 var list = wrap.selectAll('ul')
94915                     .data([0]);
94916
94917                 list = list.enter()
94918                     .append('ul')
94919                     .attr('class', 'rows')
94920                     .merge(list);
94921
94922                 var searchRow = list.selectAll('li.wikidata-search')
94923                     .data([0]);
94924
94925                 var searchRowEnter = searchRow.enter()
94926                     .append('li')
94927                     .attr('class', 'wikidata-search');
94928
94929                 searchInput = searchRowEnter
94930                     .append('input')
94931                     .attr('type', 'text')
94932                     .style('flex', '1')
94933                     .call(utilNoAuto);
94934
94935                 searchInput
94936                     .on('focus', function() {
94937                         var node = d3_select(this).node();
94938                         node.setSelectionRange(0, node.value.length);
94939                     })
94940                     .on('blur', function() {
94941                         setLabelForEntity();
94942                     })
94943                     .call(combobox.fetcher(fetchWikidataItems));
94944
94945                 combobox.on('accept', function(d) {
94946                     _qid = d.id;
94947                     change();
94948                 }).on('cancel', function() {
94949                     setLabelForEntity();
94950                 });
94951
94952                 searchRowEnter
94953                     .append('button')
94954                     .attr('class', 'form-field-button wiki-link')
94955                     .attr('title', t('icons.open_wikidata'))
94956                     .attr('tabindex', -1)
94957                     .call(svgIcon('#iD-icon-out-link'))
94958                     .on('click', function() {
94959                         event.preventDefault();
94960                         if (_wikiURL) window.open(_wikiURL, '_blank');
94961                     });
94962
94963                 var wikidataProperties = ['description', 'identifier'];
94964
94965                 var items = list.selectAll('li.labeled-input')
94966                     .data(wikidataProperties);
94967
94968                 // Enter
94969                 var enter = items.enter()
94970                     .append('li')
94971                     .attr('class', function(d) { return 'labeled-input preset-wikidata-' + d; });
94972
94973                 enter
94974                     .append('span')
94975                     .attr('class', 'label')
94976                     .attr('for', function(d) { return 'preset-input-wikidata-' + d; })
94977                     .text(function(d) { return t('wikidata.' + d); });
94978
94979                 enter
94980                     .append('input')
94981                     .attr('type', 'text')
94982                     .attr('id', function(d) { return 'preset-input-wikidata-' + d; })
94983                     .call(utilNoAuto)
94984                     .classed('disabled', 'true')
94985                     .attr('readonly', 'true');
94986
94987                 enter
94988                     .append('button')
94989                     .attr('class', 'form-field-button')
94990                     .attr('title', t('icons.copy'))
94991                     .attr('tabindex', -1)
94992                     .call(svgIcon('#iD-operation-copy'))
94993                     .on('click', function() {
94994                         event.preventDefault();
94995                         d3_select(this.parentNode)
94996                             .select('input')
94997                             .node()
94998                             .select();
94999                         document.execCommand('copy');
95000                     });
95001
95002             }
95003
95004             function fetchWikidataItems(q, callback) {
95005
95006                 if (!q && _entity) {
95007                     q = context.entity(_entity.id).tags.name || '';
95008                 }
95009
95010                 wikidata.itemsForSearchQuery(q, function(err, data) {
95011                     if (err) return;
95012
95013                     for (var i in data) {
95014                         data[i].value = data[i].label + ' (' +  data[i].id + ')';
95015                         data[i].title = data[i].description;
95016                     }
95017
95018                     if (callback) callback(data);
95019                 });
95020             }
95021
95022
95023             function change() {
95024                 var syncTags = {};
95025                 syncTags[field.key] = _qid;
95026                 dispatch$1.call('change', this, syncTags);
95027
95028                 // attempt asynchronous update of wikidata tag..
95029                 var initGraph = context.graph();
95030                 var initEntityID = _entity.id;
95031
95032                 wikidata.entityByQID(_qid, function(err, entity) {
95033                     if (err) return;
95034
95035                     // If graph has changed, we can't apply this update.
95036                     if (context.graph() !== initGraph) return;
95037
95038                     if (!entity.sitelinks) return;
95039
95040                     var langs = wikidata.languagesToQuery();
95041                     // use the label and description languages as fallbacks
95042                     ['labels', 'descriptions'].forEach(function(key) {
95043                         if (!entity[key]) return;
95044
95045                         var valueLangs = Object.keys(entity[key]);
95046                         if (valueLangs.length === 0) return;
95047                         var valueLang = valueLangs[0];
95048
95049                         if (langs.indexOf(valueLang) === -1) {
95050                             langs.push(valueLang);
95051                         }
95052                     });
95053
95054                     var currTags = Object.assign({}, context.entity(initEntityID).tags);  // shallow copy
95055
95056                     var foundPreferred;
95057                     for (var i in langs) {
95058                         var lang = langs[i];
95059                         var siteID = lang.replace('-', '_') + 'wiki';
95060                         if (entity.sitelinks[siteID]) {
95061                             foundPreferred = true;
95062                             currTags.wikipedia = lang + ':' + entity.sitelinks[siteID].title;
95063                             // use the first match
95064                             break;
95065                         }
95066                     }
95067
95068                     if (!foundPreferred) {
95069                         // No wikipedia sites available in the user's language or the fallback languages,
95070                         // default to any wikipedia sitelink
95071
95072                         var wikiSiteKeys = Object.keys(entity.sitelinks).filter(function(site) {
95073                             return site.endsWith('wiki');
95074                         });
95075
95076                         if (wikiSiteKeys.length === 0) {
95077                             // if no wikipedia pages are linked to this wikidata entity, delete that tag
95078                             if (currTags.wikipedia) {
95079                                 delete currTags.wikipedia;
95080                             }
95081                         } else {
95082                             var wikiLang = wikiSiteKeys[0].slice(0, -4).replace('_', '-');
95083                             var wikiTitle = entity.sitelinks[wikiSiteKeys[0]].title;
95084                             currTags.wikipedia = wikiLang + ':' + wikiTitle;
95085                         }
95086                     }
95087
95088                     // Coalesce the update of wikidata tag into the previous tag change
95089                     context.overwrite(
95090                         actionChangeTags(initEntityID, currTags),
95091                         context.history().undoAnnotation()
95092                     );
95093
95094                     // do not dispatch.call('change') here, because entity_editor
95095                     // changeTags() is not intended to be called asynchronously
95096
95097                 });
95098             }
95099
95100             function setLabelForEntity() {
95101                 var label = '';
95102                 if (_wikidataEntity) {
95103                     label = entityPropertyForDisplay(_wikidataEntity, 'labels');
95104                     if (label.length === 0) {
95105                         label = _wikidataEntity.id.toString();
95106                     }
95107                 }
95108                 utilGetSetValue(d3_select('li.wikidata-search input'), label);
95109             }
95110
95111
95112             wiki.tags = function(tags) {
95113                 _qid = tags[field.key] || '';
95114
95115                 if (!/^Q[0-9]*$/.test(_qid)) {   // not a proper QID
95116                     unrecognized();
95117                     return;
95118                 }
95119
95120                 // QID value in correct format
95121                 _wikiURL = 'https://wikidata.org/wiki/' + _qid;
95122                 wikidata.entityByQID(_qid, function(err, entity) {
95123                     if (err) {
95124                         unrecognized();
95125                         return;
95126                     }
95127                     _wikidataEntity = entity;
95128
95129                     setLabelForEntity();
95130
95131                     var description = entityPropertyForDisplay(entity, 'descriptions');
95132
95133                     d3_select('.form-field-wikidata button.wiki-link')
95134                         .classed('disabled', false);
95135
95136                     d3_select('.preset-wikidata-description')
95137                         .style('display', function(){
95138                             return description.length > 0 ? 'flex' : 'none';
95139                         })
95140                         .select('input')
95141                         .attr('value', description);
95142
95143                     d3_select('.preset-wikidata-identifier')
95144                         .style('display', function(){
95145                             return entity.id ? 'flex' : 'none';
95146                         })
95147                         .select('input')
95148                         .attr('value', entity.id);
95149                 });
95150
95151
95152                 // not a proper QID
95153                 function unrecognized() {
95154                     _wikidataEntity = null;
95155                     setLabelForEntity();
95156
95157                     d3_select('.preset-wikidata-description')
95158                         .style('display', 'none');
95159                     d3_select('.preset-wikidata-identifier')
95160                         .style('display', 'none');
95161
95162                     d3_select('.form-field-wikidata button.wiki-link')
95163                         .classed('disabled', true);
95164
95165                     if (_qid && _qid !== '') {
95166                         _wikiURL = 'https://wikidata.org/wiki/Special:Search?search=' + _qid;
95167                     } else {
95168                         _wikiURL = '';
95169                     }
95170                 }
95171             };
95172
95173             function entityPropertyForDisplay(wikidataEntity, propKey) {
95174                 if (!wikidataEntity[propKey]) return '';
95175                 var propObj = wikidataEntity[propKey];
95176                 var langKeys = Object.keys(propObj);
95177                 if (langKeys.length === 0) return '';
95178                 // sorted by priority, since we want to show the user's language first if possible
95179                 var langs = wikidata.languagesToQuery();
95180                 for (var i in langs) {
95181                     var lang = langs[i];
95182                     var valueObj = propObj[lang];
95183                     if (valueObj && valueObj.value && valueObj.value.length > 0) return valueObj.value;
95184                 }
95185                 // default to any available value
95186                 return propObj[langKeys[0]].value;
95187             }
95188
95189
95190             wiki.entity = function(val) {
95191                 if (!arguments.length) return _entity;
95192                 _entity = val;
95193                 return wiki;
95194             };
95195
95196
95197             wiki.focus = function() {
95198                 searchInput.node().focus();
95199             };
95200
95201
95202             return utilRebind(wiki, dispatch$1, 'on');
95203         }
95204
95205         function uiFieldWikipedia(field, context) {
95206             var dispatch$1 = dispatch('change');
95207             var wikipedia = services$1.wikipedia;
95208             var wikidata = services$1.wikidata;
95209             var lang = d3_select(null);
95210             var title = d3_select(null);
95211             var _wikiURL = '';
95212             var _entity;
95213
95214             var langCombo = uiCombobox(context, 'wikipedia-lang')
95215                 .fetcher(function(value, cb) {
95216                     var v = value.toLowerCase();
95217
95218                     cb(wikipedia$2.filter(function(d) {
95219                         return d[0].toLowerCase().indexOf(v) >= 0 ||
95220                             d[1].toLowerCase().indexOf(v) >= 0 ||
95221                             d[2].toLowerCase().indexOf(v) >= 0;
95222                     }).map(function(d) {
95223                         return { value: d[1] };
95224                     }));
95225                 });
95226
95227             var titleCombo = uiCombobox(context, 'wikipedia-title')
95228                 .fetcher(function(value, cb) {
95229                     if (!value && _entity) {
95230                         value = context.entity(_entity.id).tags.name || '';
95231                     }
95232
95233                     var searchfn = value.length > 7 ? wikipedia.search : wikipedia.suggestions;
95234                     searchfn(language()[2], value, function(query, data) {
95235                         cb(data.map(function(d) {
95236                             return { value: d };
95237                         }));
95238                     });
95239                 });
95240
95241
95242             function wiki(selection) {
95243                 var wrap = selection.selectAll('.form-field-input-wrap')
95244                     .data([0]);
95245
95246                 wrap = wrap.enter()
95247                     .append('div')
95248                     .attr('class', 'form-field-input-wrap form-field-input-' + field.type)
95249                     .merge(wrap);
95250
95251
95252                 var langRow = wrap.selectAll('.wiki-lang-container')
95253                     .data([0]);
95254
95255                 langRow = langRow.enter()
95256                     .append('div')
95257                     .attr('class', 'wiki-lang-container')
95258                     .merge(langRow);
95259
95260
95261                 lang = langRow.selectAll('input.wiki-lang')
95262                     .data([0]);
95263
95264                 lang = lang.enter()
95265                     .append('input')
95266                     .attr('type', 'text')
95267                     .attr('class', 'wiki-lang')
95268                     .attr('placeholder', t('translate.localized_translation_language'))
95269                     .call(utilNoAuto)
95270                     .call(langCombo)
95271                     .merge(lang);
95272
95273                 utilGetSetValue(lang, language()[1]);
95274
95275                 lang
95276                     .on('blur', changeLang)
95277                     .on('change', changeLang);
95278
95279
95280                 var titleRow = wrap.selectAll('.wiki-title-container')
95281                     .data([0]);
95282
95283                 titleRow = titleRow.enter()
95284                     .append('div')
95285                     .attr('class', 'wiki-title-container')
95286                     .merge(titleRow);
95287
95288                 title = titleRow.selectAll('input.wiki-title')
95289                     .data([0]);
95290
95291                 title = title.enter()
95292                     .append('input')
95293                     .attr('type', 'text')
95294                     .attr('class', 'wiki-title')
95295                     .attr('id', 'preset-input-' + field.safeid)
95296                     .call(utilNoAuto)
95297                     .call(titleCombo)
95298                     .merge(title);
95299
95300                 title
95301                     .on('blur', blur)
95302                     .on('change', change);
95303
95304
95305                 var link = titleRow.selectAll('.wiki-link')
95306                     .data([0]);
95307
95308                 link = link.enter()
95309                     .append('button')
95310                     .attr('class', 'form-field-button wiki-link')
95311                     .attr('tabindex', -1)
95312                     .call(svgIcon('#iD-icon-out-link'))
95313                     .merge(link);
95314
95315                 link
95316                     .on('click', function() {
95317                         event.preventDefault();
95318                         if (_wikiURL) window.open(_wikiURL, '_blank');
95319                     });
95320             }
95321
95322
95323             function language() {
95324                 var value = utilGetSetValue(lang).toLowerCase();
95325                 var locale = utilDetect().locale.toLowerCase();
95326                 var localeLanguage;
95327                 return wikipedia$2.find(function(d) {
95328                     if (d[2] === locale) localeLanguage = d;
95329                     return d[0].toLowerCase() === value ||
95330                         d[1].toLowerCase() === value ||
95331                         d[2] === value;
95332                 }) || localeLanguage || ['English', 'English', 'en'];
95333             }
95334
95335
95336             function changeLang() {
95337                 utilGetSetValue(lang, language()[1]);
95338                 change(true);
95339             }
95340
95341
95342             function blur() {
95343                 change(true);
95344             }
95345
95346
95347             function change(skipWikidata) {
95348                 var value = utilGetSetValue(title);
95349                 var m = value.match(/https?:\/\/([-a-z]+)\.wikipedia\.org\/(?:wiki|\1-[-a-z]+)\/([^#]+)(?:#(.+))?/);
95350                 var l = m && wikipedia$2.find(function(d) { return m[1] === d[2]; });
95351                 var syncTags = {};
95352
95353                 if (l) {
95354                     // Normalize title http://www.mediawiki.org/wiki/API:Query#Title_normalization
95355                     value = decodeURIComponent(m[2]).replace(/_/g, ' ');
95356                     if (m[3]) {
95357                         var anchor;
95358                         // try {
95359                         // leave this out for now - #6232
95360                             // Best-effort `anchordecode:` implementation
95361                             // anchor = decodeURIComponent(m[3].replace(/\.([0-9A-F]{2})/g, '%$1'));
95362                         // } catch (e) {
95363                             anchor = decodeURIComponent(m[3]);
95364                         // }
95365                         value += '#' + anchor.replace(/_/g, ' ');
95366                     }
95367                     value = value.slice(0, 1).toUpperCase() + value.slice(1);
95368                     utilGetSetValue(lang, l[1]);
95369                     utilGetSetValue(title, value);
95370                 }
95371
95372                 if (value) {
95373                     syncTags.wikipedia = language()[2] + ':' + value;
95374                 } else {
95375                     syncTags.wikipedia = undefined;
95376                 }
95377
95378                 dispatch$1.call('change', this, syncTags);
95379
95380
95381                 if (skipWikidata || !value || !language()[2]) return;
95382
95383                 // attempt asynchronous update of wikidata tag..
95384                 var initGraph = context.graph();
95385                 var initEntityID = _entity.id;
95386
95387                 wikidata.itemsByTitle(language()[2], value, function(err, data) {
95388                     if (err) return;
95389
95390                     // If graph has changed, we can't apply this update.
95391                     if (context.graph() !== initGraph) return;
95392
95393                     if (!data || !Object.keys(data).length) return;
95394
95395                     var qids = Object.keys(data);
95396                     var value = qids && qids.find(function(id) { return id.match(/^Q\d+$/); });
95397                     var currTags = Object.assign({}, context.entity(initEntityID).tags);  // shallow copy
95398
95399                     currTags.wikidata = value;
95400
95401                     // Coalesce the update of wikidata tag into the previous tag change
95402                     context.overwrite(
95403                         actionChangeTags(initEntityID, currTags),
95404                         context.history().undoAnnotation()
95405                     );
95406
95407                     // do not dispatch.call('change') here, because entity_editor
95408                     // changeTags() is not intended to be called asynchronously
95409                 });
95410             }
95411
95412
95413             wiki.tags = function(tags) {
95414                 var value = tags[field.key] || '';
95415                 var m = value.match(/([^:]+):([^#]+)(?:#(.+))?/);
95416                 var l = m && wikipedia$2.find(function(d) { return m[1] === d[2]; });
95417                 var anchor = m && m[3];
95418
95419                 // value in correct format
95420                 if (l) {
95421                     utilGetSetValue(lang, l[1]);
95422                     utilGetSetValue(title, m[2] + (anchor ? ('#' + anchor) : ''));
95423                     if (anchor) {
95424                         try {
95425                             // Best-effort `anchorencode:` implementation
95426                             anchor = encodeURIComponent(anchor.replace(/ /g, '_')).replace(/%/g, '.');
95427                         } catch (e) {
95428                             anchor = anchor.replace(/ /g, '_');
95429                         }
95430                     }
95431                     _wikiURL = 'https://' + m[1] + '.wikipedia.org/wiki/' +
95432                         m[2].replace(/ /g, '_') + (anchor ? ('#' + anchor) : '');
95433
95434                 // unrecognized value format
95435                 } else {
95436                     utilGetSetValue(title, value);
95437                     if (value && value !== '') {
95438                         utilGetSetValue(lang, '');
95439                         _wikiURL = 'https://en.wikipedia.org/wiki/Special:Search?search=' + value;
95440                     } else {
95441                         _wikiURL = '';
95442                     }
95443                 }
95444             };
95445
95446
95447             wiki.entity = function(val) {
95448                 if (!arguments.length) return _entity;
95449                 _entity = val;
95450                 return wiki;
95451             };
95452
95453
95454             wiki.focus = function() {
95455                 title.node().focus();
95456             };
95457
95458
95459             return utilRebind(wiki, dispatch$1, 'on');
95460         }
95461
95462         var uiFields = {
95463             access: uiFieldAccess,
95464             address: uiFieldAddress,
95465             check: uiFieldCheck,
95466             combo: uiFieldCombo,
95467             cycleway: uiFieldCycleway,
95468             defaultCheck: uiFieldCheck,
95469             email: uiFieldText,
95470             lanes: uiFieldLanes,
95471             localized: uiFieldLocalized,
95472             maxspeed: uiFieldMaxspeed,
95473             multiCombo: uiFieldCombo,
95474             networkCombo: uiFieldCombo,
95475             number: uiFieldText,
95476             onewayCheck: uiFieldCheck,
95477             radio: uiFieldRadio,
95478             restrictions: uiFieldRestrictions,
95479             semiCombo: uiFieldCombo,
95480             structureRadio: uiFieldRadio,
95481             tel: uiFieldText,
95482             text: uiFieldText,
95483             textarea: uiFieldTextarea,
95484             typeCombo: uiFieldCombo,
95485             url: uiFieldText,
95486             wikidata: uiFieldWikidata,
95487             wikipedia: uiFieldWikipedia
95488         };
95489
95490         function uiField(context, presetField, entity, options) {
95491             options = Object.assign({
95492                 show: true,
95493                 wrap: true,
95494                 remove: true,
95495                 revert: true,
95496                 info: true
95497             }, options);
95498
95499             var dispatch$1 = dispatch('change');
95500             var field = Object.assign({}, presetField);   // shallow copy
95501             var _show = options.show;
95502             var _state = '';
95503             var _tags = {};
95504
95505             var _locked = false;
95506             var _lockedTip = tooltip()
95507                 .title(t('inspector.lock.suggestion', { label: field.label }))
95508                 .placement('bottom');
95509
95510
95511             field.keys = field.keys || [field.key];
95512
95513             // only create the fields that are actually being shown
95514             if (_show && !field.impl) {
95515                 createField();
95516             }
95517
95518             // Creates the field.. This is done lazily,
95519             // once we know that the field will be shown.
95520             function createField() {
95521                 field.impl = uiFields[field.type](field, context)
95522                     .on('change', function(t, onInput) {
95523                         dispatch$1.call('change', field, t, onInput);
95524                     });
95525
95526                 if (entity) {
95527                     field.entityID = entity.id;
95528                     // if this field cares about the entity, pass it along
95529                     if (field.impl.entity) {
95530                         field.impl.entity(entity);
95531                     }
95532                 }
95533             }
95534
95535
95536             function isModified() {
95537                 if (!entity) return false;
95538                 var original = context.graph().base().entities[entity.id];
95539                 return field.keys.some(function(key) {
95540                     return original ? _tags[key] !== original.tags[key] : _tags[key];
95541                 });
95542             }
95543
95544
95545             function isPresent() {
95546                 return field.keys.some(function(key) {
95547                     if (field.type === 'multiCombo') {
95548                         for (var tagKey in _tags) {
95549                             if (tagKey.indexOf(key) === 0) {
95550                                 return true;
95551                             }
95552                         }
95553                         return false;
95554                     }
95555                     return _tags[key] !== undefined;
95556                 });
95557             }
95558
95559
95560             function revert(d) {
95561                 event.stopPropagation();
95562                 event.preventDefault();
95563                 if (!entity || _locked) return;
95564
95565                 var original = context.graph().base().entities[entity.id];
95566                 var t = {};
95567                 d.keys.forEach(function(key) {
95568                     t[key] = original ? original.tags[key] : undefined;
95569                 });
95570
95571                 dispatch$1.call('change', d, t);
95572             }
95573
95574
95575             function remove(d) {
95576                 event.stopPropagation();
95577                 event.preventDefault();
95578                 if (_locked) return;
95579
95580                 var t = {};
95581                 d.keys.forEach(function(key) {
95582                     t[key] = undefined;
95583                 });
95584
95585                 dispatch$1.call('change', d, t);
95586             }
95587
95588
95589             field.render = function(selection) {
95590                 var container = selection.selectAll('.form-field')
95591                     .data([field]);
95592
95593                 // Enter
95594                 var enter = container.enter()
95595                     .append('div')
95596                     .attr('class', function(d) { return 'form-field form-field-' + d.safeid; })
95597                     .classed('nowrap', !options.wrap);
95598
95599                 if (options.wrap) {
95600                     var labelEnter = enter
95601                         .append('label')
95602                         .attr('class', 'field-label')
95603                         .attr('for', function(d) { return 'preset-input-' + d.safeid; });
95604
95605                     var textEnter = labelEnter
95606                         .append('span')
95607                         .attr('class', 'label-text');
95608
95609                     textEnter
95610                         .append('span')
95611                         .attr('class', 'label-textvalue')
95612                         .text(function(d) { return d.label(); });
95613
95614                     textEnter
95615                         .append('span')
95616                         .attr('class', 'label-textannotation');
95617
95618                     if (options.remove) {
95619                         labelEnter
95620                             .append('button')
95621                             .attr('class', 'remove-icon')
95622                             .attr('title', t('icons.remove'))
95623                             .attr('tabindex', -1)
95624                             .call(svgIcon('#iD-operation-delete'));
95625                     }
95626
95627                     if (options.revert) {
95628                         labelEnter
95629                             .append('button')
95630                             .attr('class', 'modified-icon')
95631                             .attr('title', t('icons.undo'))
95632                             .attr('tabindex', -1)
95633                             .call(svgIcon((textDirection === 'rtl') ? '#iD-icon-redo' : '#iD-icon-undo'));
95634                     }
95635                 }
95636
95637
95638                 // Update
95639                 container = container
95640                     .merge(enter);
95641
95642                 container.select('.field-label > .remove-icon')  // propagate bound data
95643                     .on('click', remove);
95644
95645                 container.select('.field-label > .modified-icon')  // propagate bound data
95646                     .on('click', revert);
95647
95648                 container
95649                     .each(function(d) {
95650                         var selection = d3_select(this);
95651
95652                         if (!d.impl) {
95653                             createField();
95654                         }
95655
95656                         var reference, help;
95657
95658                         // instantiate field help
95659                         if (options.wrap && field.type === 'restrictions') {
95660                             help = uiFieldHelp(context, 'restrictions');
95661                         }
95662
95663                         // instantiate tag reference
95664                         if (options.wrap && options.info) {
95665                             var referenceKey = d.key;
95666                             if (d.type === 'multiCombo') {   // lookup key without the trailing ':'
95667                                 referenceKey = referenceKey.replace(/:$/, '');
95668                             }
95669
95670                             reference = uiTagReference(d.reference || { key: referenceKey }, context);
95671                             if (_state === 'hover') {
95672                                 reference.showing(false);
95673                             }
95674                         }
95675
95676                         selection
95677                             .call(d.impl);
95678
95679                         // add field help components
95680                         if (help) {
95681                             selection
95682                                 .call(help.body)
95683                                 .select('.field-label')
95684                                 .call(help.button);
95685                         }
95686
95687                         // add tag reference components
95688                         if (reference) {
95689                             selection
95690                                 .call(reference.body)
95691                                 .select('.field-label')
95692                                 .call(reference.button);
95693                         }
95694
95695                         d.impl.tags(_tags);
95696                     });
95697
95698
95699                     container
95700                         .classed('locked', _locked)
95701                         .classed('modified', isModified())
95702                         .classed('present', isPresent());
95703
95704
95705                     // show a tip and lock icon if the field is locked
95706                     var annotation = container.selectAll('.field-label .label-textannotation');
95707                     var icon = annotation.selectAll('.icon')
95708                         .data(_locked ? [0]: []);
95709
95710                     icon.exit()
95711                         .remove();
95712
95713                     icon.enter()
95714                         .append('svg')
95715                         .attr('class', 'icon')
95716                         .append('use')
95717                         .attr('xlink:href', '#fas-lock');
95718
95719                     container.call(_locked ? _lockedTip : _lockedTip.destroy);
95720             };
95721
95722
95723             field.state = function(val) {
95724                 if (!arguments.length) return _state;
95725                 _state = val;
95726                 return field;
95727             };
95728
95729
95730             field.tags = function(val) {
95731                 if (!arguments.length) return _tags;
95732                 _tags = val;
95733                 return field;
95734             };
95735
95736
95737             field.locked = function(val) {
95738                 if (!arguments.length) return _locked;
95739                 _locked = val;
95740                 return field;
95741             };
95742
95743
95744             field.show = function() {
95745                 _show = true;
95746                 if (!field.impl) {
95747                     createField();
95748                 }
95749                 if (field.default && field.key && _tags[field.key] !== field.default) {
95750                     var t = {};
95751                     t[field.key] = field.default;
95752                     dispatch$1.call('change', this, t);
95753                 }
95754             };
95755
95756             // A shown field has a visible UI, a non-shown field is in the 'Add field' dropdown
95757             field.isShown = function() {
95758                 return _show || isPresent();
95759             };
95760
95761
95762             // An allowed field can appear in the UI or in the 'Add field' dropdown.
95763             // A non-allowed field is hidden from the user altogether
95764             field.isAllowed = function() {
95765                 if (!entity || isPresent()) return true;   // a field with a value should always display
95766
95767                 var latest = context.hasEntity(entity.id);   // check the most current copy of the entity
95768                 if (!latest) return true;
95769
95770                 var require = field.prerequisiteTag;
95771                 if (require && require.key) {
95772                     var value = latest.tags[require.key];
95773                     if (!value) return false;
95774
95775                     if (require.valueNot) {
95776                         return require.valueNot !== value;
95777                     }
95778                     if (require.value) {
95779                         return require.value === value;
95780                     }
95781                     return true;
95782                 }
95783                 return true;
95784             };
95785
95786
95787             field.focus = function() {
95788                 if (field.impl) {
95789                     field.impl.focus();
95790                 }
95791             };
95792
95793
95794             return utilRebind(field, dispatch$1, 'on');
95795         }
95796
95797         function uiFormFields(context) {
95798             var moreCombo = uiCombobox(context, 'more-fields').minItems(1);
95799             var _fieldsArr = [];
95800             var _lastPlaceholder = '';
95801             var _state = '';
95802             var _klass = '';
95803
95804
95805             function formFields(selection) {
95806                 var allowedFields = _fieldsArr.filter(function(field) { return field.isAllowed(); });
95807                 var shown = allowedFields.filter(function(field) { return field.isShown(); });
95808                 var notShown = allowedFields.filter(function(field) { return !field.isShown(); });
95809
95810                 var container = selection.selectAll('.form-fields-container')
95811                     .data([0]);
95812
95813                 container = container.enter()
95814                     .append('div')
95815                     .attr('class', 'form-fields-container ' + (_klass || ''))
95816                     .merge(container);
95817
95818
95819                 var fields = container.selectAll('.wrap-form-field')
95820                     .data(shown, function(d) { return d.id + (d.entityID || ''); });
95821
95822                 fields.exit()
95823                     .remove();
95824
95825                 // Enter
95826                 var enter = fields.enter()
95827                     .append('div')
95828                     .attr('class', function(d) { return 'wrap-form-field wrap-form-field-' + d.safeid; });
95829
95830                 // Update
95831                 fields = fields
95832                     .merge(enter);
95833
95834                 fields
95835                     .order()
95836                     .each(function(d) {
95837                         d3_select(this)
95838                             .call(d.render);
95839                     });
95840
95841
95842                 var titles = [];
95843                 var moreFields = notShown.map(function(field) {
95844                     var label = field.label();
95845                     titles.push(label);
95846                     return {
95847                         title: label,
95848                         value: label,
95849                         field: field
95850                     };
95851                 });
95852
95853                 var placeholder = titles.slice(0,3).join(', ') + ((titles.length > 3) ? '…' : '');
95854
95855
95856                 var more = selection.selectAll('.more-fields')
95857                     .data((_state === 'hover' || moreFields.length === 0) ? [] : [0]);
95858
95859                 more.exit()
95860                     .remove();
95861
95862                 more = more.enter()
95863                     .append('div')
95864                     .attr('class', 'more-fields')
95865                     .append('label')
95866                     .text(t('inspector.add_fields'))
95867                     .merge(more);
95868
95869
95870                 var input = more.selectAll('.value')
95871                     .data([0]);
95872
95873                 input.exit()
95874                     .remove();
95875
95876                 input = input.enter()
95877                     .append('input')
95878                     .attr('class', 'value')
95879                     .attr('type', 'text')
95880                     .attr('placeholder', placeholder)
95881                     .call(utilNoAuto)
95882                     .merge(input);
95883
95884                 input
95885                     .call(utilGetSetValue, '')
95886                     .call(moreCombo
95887                         .data(moreFields)
95888                         .on('accept', function (d) {
95889                             if (!d) return;  // user entered something that was not matched
95890                             var field = d.field;
95891                             field.show();
95892                             selection.call(formFields);  // rerender
95893                             if (field.type !== 'semiCombo' && field.type !== 'multiCombo') {
95894                                 field.focus();
95895                             }
95896                         })
95897                     );
95898
95899                 // avoid updating placeholder excessively (triggers style recalc)
95900                 if (_lastPlaceholder !== placeholder) {
95901                     input.attr('placeholder', placeholder);
95902                     _lastPlaceholder = placeholder;
95903                 }
95904             }
95905
95906
95907             formFields.fieldsArr = function(val) {
95908                 if (!arguments.length) return _fieldsArr;
95909                 _fieldsArr = val || [];
95910                 return formFields;
95911             };
95912
95913             formFields.state = function(val) {
95914                 if (!arguments.length) return _state;
95915                 _state = val;
95916                 return formFields;
95917             };
95918
95919             formFields.klass = function(val) {
95920                 if (!arguments.length) return _klass;
95921                 _klass = val;
95922                 return formFields;
95923             };
95924
95925
95926             return formFields;
95927         }
95928
95929         function uiPresetEditor(context) {
95930             var dispatch$1 = dispatch('change');
95931             var formFields = uiFormFields(context);
95932             var _state;
95933             var _fieldsArr;
95934             var _preset;
95935             var _tags;
95936             var _entityID;
95937
95938
95939             function presetEditor(selection) {
95940                 selection.call(uiDisclosure(context, 'preset_fields', true)
95941                     .title(t('inspector.all_fields'))
95942                     .content(render)
95943                 );
95944             }
95945
95946
95947             function render(selection) {
95948                 if (!_fieldsArr) {
95949                     var entity = context.entity(_entityID);
95950                     var geometry = context.geometry(_entityID);
95951                     var presets = context.presets();
95952
95953                     _fieldsArr = [];
95954
95955                     _preset.fields.forEach(function(field) {
95956                         if (field.matchGeometry(geometry)) {
95957                             _fieldsArr.push(
95958                                 uiField(context, field, entity)
95959                             );
95960                         }
95961                     });
95962
95963                     if (entity.isHighwayIntersection(context.graph()) && presets.field('restrictions')) {
95964                         _fieldsArr.push(
95965                             uiField(context, presets.field('restrictions'), entity)
95966                         );
95967                     }
95968
95969                     var additionalFields = utilArrayUnion(_preset.moreFields, presets.universal());
95970                     additionalFields.sort(function(field1, field2) {
95971                         return field1.label() > field2.label();
95972                     });
95973
95974                     additionalFields.forEach(function(field) {
95975                         if (_preset.fields.indexOf(field) === -1) {
95976                             _fieldsArr.push(
95977                                 uiField(context, field, entity, { show: false })
95978                             );
95979                         }
95980                     });
95981
95982                     _fieldsArr.forEach(function(field) {
95983                         field
95984                             .on('change', function(t, onInput) {
95985                                 dispatch$1.call('change', field, t, onInput);
95986                             });
95987                     });
95988                 }
95989
95990                 _fieldsArr.forEach(function(field) {
95991                     field
95992                         .state(_state)
95993                         .tags(_tags);
95994                 });
95995
95996
95997                 selection
95998                     .call(formFields
95999                         .fieldsArr(_fieldsArr)
96000                         .state(_state)
96001                         .klass('inspector-inner fillL3')
96002                     );
96003
96004
96005                 selection.selectAll('.wrap-form-field input')
96006                     .on('keydown', function() {
96007                         // if user presses enter, and combobox is not active, accept edits..
96008                         if (event.keyCode === 13 && d3_select('.combobox').empty()) {
96009                             context.enter(modeBrowse(context));
96010                         }
96011                     });
96012             }
96013
96014
96015             presetEditor.preset = function(val) {
96016                 if (!arguments.length) return _preset;
96017                 if (_preset && _preset.id === val.id) return presetEditor;
96018                 _preset = val;
96019                 _fieldsArr = null;
96020                 return presetEditor;
96021             };
96022
96023
96024             presetEditor.state = function(val) {
96025                 if (!arguments.length) return _state;
96026                 _state = val;
96027                 return presetEditor;
96028             };
96029
96030
96031             presetEditor.tags = function(val) {
96032                 if (!arguments.length) return _tags;
96033                 _tags = val;
96034                 // Don't reset _fieldsArr here.
96035                 return presetEditor;
96036             };
96037
96038
96039             presetEditor.entityID = function(val) {
96040                 if (!arguments.length) return _entityID;
96041                 if (_entityID === val) return presetEditor;
96042                 _entityID = val;
96043                 _fieldsArr = null;
96044                 return presetEditor;
96045             };
96046
96047
96048             return utilRebind(presetEditor, dispatch$1, 'on');
96049         }
96050
96051         function uiEntityIssues(context) {
96052             var _selection = d3_select(null);
96053             var _activeIssueID;
96054             var _entityID;
96055
96056             // Refresh on validated events
96057             context.validator()
96058                 .on('validated.entity_issues', function() {
96059                      _selection.selectAll('.disclosure-wrap-entity_issues')
96060                          .call(render);
96061
96062                     update();
96063                 })
96064                 .on('focusedIssue.entity_issues', function(issue) {
96065                      makeActiveIssue(issue.id);
96066                 });
96067
96068
96069             function entityIssues(selection) {
96070                 _selection = selection;
96071
96072                 selection
96073                     .call(uiDisclosure(context, 'entity_issues', true)
96074                         .content(render)
96075                     );
96076
96077                 update();
96078             }
96079
96080             function getIssues() {
96081                 return context.validator().getEntityIssues(_entityID, { includeDisabledRules: true });
96082             }
96083
96084             function makeActiveIssue(issueID) {
96085                 _activeIssueID = issueID;
96086                 _selection.selectAll('.issue-container')
96087                     .classed('active', function(d) { return d.id === _activeIssueID; });
96088             }
96089
96090             function update() {
96091
96092                 var issues = getIssues();
96093
96094                 _selection
96095                     .classed('hide', issues.length === 0);
96096
96097                 _selection.selectAll('.hide-toggle-entity_issues span')
96098                     .text(t('issues.list_title', { count: issues.length }));
96099             }
96100
96101
96102             function render(selection) {
96103                 var issues = getIssues();
96104                 _activeIssueID = issues.length > 0 ? issues[0].id : null;
96105
96106
96107                 var containers = selection.selectAll('.issue-container')
96108                     .data(issues, function(d) { return d.id; });
96109
96110                 // Exit
96111                 containers.exit()
96112                     .remove();
96113
96114                 // Enter
96115                 var containersEnter = containers.enter()
96116                     .append('div')
96117                     .attr('class', 'issue-container');
96118
96119
96120                 var itemsEnter = containersEnter
96121                     .append('div')
96122                     .attr('class', function(d) { return 'issue severity-' + d.severity; })
96123                     .on('mouseover.highlight', function(d) {
96124                         // don't hover-highlight the selected entity
96125                         var ids = d.entityIds
96126                             .filter(function(e) { return e !== _entityID; });
96127
96128                         utilHighlightEntities(ids, true, context);
96129                     })
96130                     .on('mouseout.highlight', function(d) {
96131                         var ids = d.entityIds
96132                             .filter(function(e) { return e !== _entityID; });
96133
96134                         utilHighlightEntities(ids, false, context);
96135                     });
96136
96137                 var labelsEnter = itemsEnter
96138                     .append('div')
96139                     .attr('class', 'issue-label')
96140                     .on('click', function(d) {
96141
96142                         makeActiveIssue(d.id); // expand only the clicked item
96143
96144                         var extent = d.extent(context.graph());
96145                         if (extent) {
96146                             var setZoom = Math.max(context.map().zoom(), 19);
96147                             context.map().unobscuredCenterZoomEase(extent.center(), setZoom);
96148                         }
96149                     });
96150
96151                 var textEnter = labelsEnter
96152                     .append('span')
96153                     .attr('class', 'issue-text');
96154
96155                 textEnter
96156                     .append('span')
96157                     .attr('class', 'issue-icon')
96158                     .each(function(d) {
96159                         var iconName = '#iD-icon-' + (d.severity === 'warning' ? 'alert' : 'error');
96160                         d3_select(this)
96161                             .call(svgIcon(iconName));
96162                     });
96163
96164                 textEnter
96165                     .append('span')
96166                     .attr('class', 'issue-message');
96167
96168
96169                 var infoButton = labelsEnter
96170                     .append('button')
96171                     .attr('class', 'issue-info-button')
96172                     .attr('title', t('icons.information'))
96173                     .attr('tabindex', -1)
96174                     .call(svgIcon('#iD-icon-inspect'));
96175
96176                 infoButton
96177                     .on('click', function () {
96178                         event.stopPropagation();
96179                         event.preventDefault();
96180                         this.blur();    // avoid keeping focus on the button - #4641
96181
96182                         var container = d3_select(this.parentNode.parentNode.parentNode);
96183                         var info = container.selectAll('.issue-info');
96184                         var isExpanded = info.classed('expanded');
96185
96186                         if (isExpanded) {
96187                             info
96188                                 .transition()
96189                                 .duration(200)
96190                                 .style('max-height', '0px')
96191                                 .style('opacity', '0')
96192                                 .on('end', function () {
96193                                     info.classed('expanded', false);
96194                                 });
96195                         } else {
96196                             info
96197                                 .classed('expanded', true)
96198                                 .transition()
96199                                 .duration(200)
96200                                 .style('max-height', '200px')
96201                                 .style('opacity', '1');
96202                         }
96203                     });
96204
96205                 itemsEnter
96206                     .append('ul')
96207                     .attr('class', 'issue-fix-list');
96208
96209                 containersEnter
96210                     .append('div')
96211                     .attr('class', 'issue-info')
96212                     .style('max-height', '0')
96213                     .style('opacity', '0')
96214                     .each(function(d) {
96215                         if (typeof d.reference === 'function') {
96216                             d3_select(this)
96217                                 .call(d.reference);
96218                         } else {
96219                             d3_select(this)
96220                                 .text(t('inspector.no_documentation_key'));
96221                         }
96222                     });
96223
96224
96225                 // Update
96226                 containers = containers
96227                     .merge(containersEnter)
96228                     .classed('active', function(d) { return d.id === _activeIssueID; });
96229
96230                 containers.selectAll('.issue-message')
96231                     .text(function(d) {
96232                         return d.message();
96233                     });
96234
96235                 // fixes
96236                 var fixLists = containers.selectAll('.issue-fix-list');
96237
96238                 var fixes = fixLists.selectAll('.issue-fix-item')
96239                     .data(function(d) { return d.fixes ? d.fixes : []; });
96240
96241                 var fixesEnter = fixes.enter()
96242                     .append('li')
96243                     .attr('class', function(d) {
96244                         return 'issue-fix-item ' + (d.onClick ? 'actionable' : '');
96245                     })
96246                     .on('click', function(d) {
96247                         // not all fixes are actionable
96248                         if (!d.onClick) return;
96249
96250                         // Don't run another fix for this issue within a second of running one
96251                         // (Necessary for "Select a feature type" fix. Most fixes should only ever run once)
96252                         if (d.issue.dateLastRanFix && new Date() - d.issue.dateLastRanFix < 1000) return;
96253                         d.issue.dateLastRanFix = new Date();
96254
96255                         // remove hover-highlighting
96256                         utilHighlightEntities(d.issue.entityIds.concat(d.entityIds), false, context);
96257
96258                         new Promise(function(resolve, reject) {
96259                             d.onClick(resolve, reject);
96260                             if (!d.onClick.length) {
96261                                 // if the fix doesn't take any completion parameters then consider it resolved
96262                                 resolve();
96263                             }
96264                         })
96265                         .then(function() {
96266                             // revalidate whenever the fix has finished running successfully
96267                             context.validator().validate();
96268                         });
96269                     })
96270                     .on('mouseover.highlight', function(d) {
96271                         utilHighlightEntities(d.entityIds, true, context);
96272                     })
96273                     .on('mouseout.highlight', function(d) {
96274                         utilHighlightEntities(d.entityIds, false, context);
96275                     });
96276
96277                 fixesEnter
96278                     .append('span')
96279                     .attr('class', 'fix-icon')
96280                     .each(function(d) {
96281                         var iconName = d.icon || 'iD-icon-wrench';
96282                         if (iconName.startsWith('maki')) {
96283                             iconName += '-15';
96284                         }
96285                         d3_select(this).call(svgIcon('#' + iconName));
96286                     });
96287
96288                 fixesEnter
96289                     .append('span')
96290                     .attr('class', 'fix-message')
96291                     .text(function(d) { return d.title; });
96292             }
96293
96294
96295             entityIssues.entityID = function(val) {
96296                 if (!arguments.length) return _entityID;
96297                 if (_entityID !== val) {
96298                     _entityID = val;
96299                     _activeIssueID = null;
96300                 }
96301                 return entityIssues;
96302             };
96303
96304
96305             return entityIssues;
96306         }
96307
96308         function uiEntityEditor(context) {
96309             var dispatch$1 = dispatch('choose');
96310             var _state = 'select';
96311             var _coalesceChanges = false;
96312             var _modified = false;
96313             var _scrolled = false;
96314             var _base;
96315             var _entityID;
96316             var _activePreset;
96317             var _tagReference;
96318             var _presetFavorite;
96319
96320             var entityIssues = uiEntityIssues(context);
96321             var quickLinks = uiQuickLinks();
96322             var presetEditor = uiPresetEditor(context).on('change', changeTags);
96323             var rawTagEditor = uiRawTagEditor(context).on('change', changeTags);
96324             var rawMemberEditor = uiRawMemberEditor(context);
96325             var rawMembershipEditor = uiRawMembershipEditor(context);
96326
96327             function entityEditor(selection) {
96328                 var entity = context.entity(_entityID);
96329                 var tags = Object.assign({}, entity.tags);  // shallow copy
96330
96331                 // Header
96332                 var header = selection.selectAll('.header')
96333                     .data([0]);
96334
96335                 // Enter
96336                 var headerEnter = header.enter()
96337                     .append('div')
96338                     .attr('class', 'header fillL cf');
96339
96340                 headerEnter
96341                     .append('button')
96342                     .attr('class', 'fl preset-reset preset-choose')
96343                     .call(svgIcon((textDirection === 'rtl') ? '#iD-icon-forward' : '#iD-icon-backward'));
96344
96345                 headerEnter
96346                     .append('button')
96347                     .attr('class', 'fr preset-close')
96348                     .on('click', function() { context.enter(modeBrowse(context)); })
96349                     .call(svgIcon(_modified ? '#iD-icon-apply' : '#iD-icon-close'));
96350
96351                 headerEnter
96352                     .append('h3')
96353                     .text(t('inspector.edit'));
96354
96355                 // Update
96356                 header = header
96357                     .merge(headerEnter);
96358
96359                 header.selectAll('.preset-reset')
96360                     .on('click', function() {
96361                         dispatch$1.call('choose', this, _activePreset);
96362                     });
96363
96364
96365                 // Body
96366                 var body = selection.selectAll('.inspector-body')
96367                     .data([0]);
96368
96369                 // Enter
96370                 var bodyEnter = body.enter()
96371                     .append('div')
96372                     .attr('class', 'inspector-body')
96373                     .on('scroll.entity-editor', function() { _scrolled = true; });
96374
96375                 bodyEnter
96376                     .append('div')
96377                     .attr('class', 'preset-list-item inspector-inner')
96378                     .append('div')
96379                     .attr('class', 'preset-list-button-wrap')
96380                     .append('button')
96381                     .attr('class', 'preset-list-button preset-reset')
96382                     .call(tooltip().title(t('inspector.back_tooltip')).placement('bottom'))
96383                     .append('div')
96384                     .attr('class', 'label')
96385                     .append('div')
96386                     .attr('class', 'label-inner');
96387
96388                 bodyEnter
96389                     .append('div')
96390                     .attr('class', 'preset-quick-links');
96391
96392                 bodyEnter
96393                     .append('div')
96394                     .attr('class', 'entity-issues');
96395
96396                 bodyEnter
96397                     .append('div')
96398                     .attr('class', 'preset-editor');
96399
96400                 bodyEnter
96401                     .append('div')
96402                     .attr('class', 'raw-tag-editor inspector-inner');
96403
96404                 bodyEnter
96405                     .append('div')
96406                     .attr('class', 'raw-member-editor inspector-inner');
96407
96408                 bodyEnter
96409                     .append('div')
96410                     .attr('class', 'raw-membership-editor inspector-inner');
96411
96412                 bodyEnter
96413                     .append('input')
96414                     .attr('type', 'text')
96415                     .attr('class', 'key-trap');
96416
96417
96418                 // Update
96419                 body = body
96420                     .merge(bodyEnter);
96421
96422                 if (_presetFavorite) {
96423                     body.selectAll('.preset-list-button-wrap')
96424                         .call(_presetFavorite.button);
96425                 }
96426
96427                 // update header
96428                 if (_tagReference) {
96429                     body.selectAll('.preset-list-button-wrap')
96430                         .call(_tagReference.button);
96431
96432                     body.selectAll('.preset-list-item')
96433                         .call(_tagReference.body);
96434                 }
96435
96436                 body.selectAll('.preset-reset')
96437                     .on('click', function() {
96438                         dispatch$1.call('choose', this, _activePreset);
96439                     });
96440
96441                 body.select('.preset-list-item button')
96442                     .call(uiPresetIcon(context)
96443                         .geometry(context.geometry(_entityID))
96444                         .preset(_activePreset)
96445                     );
96446
96447                 // NOTE: split on en-dash, not a hypen (to avoid conflict with hyphenated names)
96448                 var label = body.select('.label-inner');
96449                 var nameparts = label.selectAll('.namepart')
96450                     .data(_activePreset.name().split(' – '), function(d) { return d; });
96451
96452                 nameparts.exit()
96453                     .remove();
96454
96455                 nameparts
96456                     .enter()
96457                     .append('div')
96458                     .attr('class', 'namepart')
96459                     .text(function(d) { return d; });
96460
96461                 // update quick links
96462                 var choices = [{
96463                     id: 'zoom_to',
96464                     label: 'inspector.zoom_to.title',
96465                     tooltip: function() {
96466                         return uiTooltipHtml(t('inspector.zoom_to.tooltip_feature'), t('inspector.zoom_to.key'));
96467                     },
96468                     click: function zoomTo() {
96469                         context.mode().zoomToSelected();
96470                     }
96471                 }];
96472
96473                 body.select('.preset-quick-links')
96474                     .call(quickLinks.choices(choices));
96475
96476
96477                 // update editor sections
96478                 body.select('.entity-issues')
96479                     .call(entityIssues
96480                         .entityID(_entityID)
96481                     );
96482
96483                 body.select('.preset-editor')
96484                     .call(presetEditor
96485                         .preset(_activePreset)
96486                         .entityID(_entityID)
96487                         .tags(tags)
96488                         .state(_state)
96489                     );
96490
96491                 body.select('.raw-tag-editor')
96492                     .call(rawTagEditor
96493                         .preset(_activePreset)
96494                         .entityID(_entityID)
96495                         .tags(tags)
96496                         .state(_state)
96497                     );
96498
96499                 if (entity.type === 'relation') {
96500                     body.select('.raw-member-editor')
96501                         .style('display', 'block')
96502                         .call(rawMemberEditor
96503                             .entityID(_entityID)
96504                         );
96505                 } else {
96506                     body.select('.raw-member-editor')
96507                         .style('display', 'none');
96508                 }
96509
96510                 body.select('.raw-membership-editor')
96511                     .call(rawMembershipEditor
96512                         .entityID(_entityID)
96513                     );
96514
96515                 body.select('.key-trap')
96516                     .on('keydown.key-trap', function() {
96517                         // On tabbing, send focus back to the first field on the inspector-body
96518                         // (probably the `name` field) #4159
96519                         if (event.keyCode === 9 && !event.shiftKey) {
96520                             event.preventDefault();
96521                             body.select('input').node().focus();
96522                         }
96523                     });
96524
96525                 context.history()
96526                     .on('change.entity-editor', historyChanged);
96527
96528
96529                 function historyChanged(difference) {
96530                     if (_state === 'hide') return;
96531                     var significant = !difference ||
96532                             difference.didChange.properties ||
96533                             difference.didChange.addition ||
96534                             difference.didChange.deletion;
96535                     if (!significant) return;
96536
96537                     var entity = context.hasEntity(_entityID);
96538                     var graph = context.graph();
96539                     if (!entity) return;
96540
96541                     var match = context.presets().match(entity, graph);
96542                     var activePreset = entityEditor.preset();
96543                     var weakPreset = activePreset &&
96544                         Object.keys(activePreset.addTags || {}).length === 0;
96545
96546                     // A "weak" preset doesn't set any tags. (e.g. "Address")
96547                     // Don't replace a weak preset with a fallback preset (e.g. "Point")
96548                     if (!(weakPreset && match.isFallback())) {
96549                         entityEditor.preset(match);
96550                     }
96551                     entityEditor.modified(_base !== graph);
96552                     entityEditor(selection);
96553                 }
96554             }
96555
96556
96557             // Tag changes that fire on input can all get coalesced into a single
96558             // history operation when the user leaves the field.  #2342
96559             function changeTags(changed, onInput) {
96560                 var entity = context.entity(_entityID);
96561                 var annotation = t('operations.change_tags.annotation');
96562                 var tags = Object.assign({}, entity.tags);   // shallow copy
96563
96564                 for (var k in changed) {
96565                     if (!k) continue;
96566                     var v = changed[k];
96567                     if (v !== undefined || tags.hasOwnProperty(k)) {
96568                         tags[k] = v;
96569                     }
96570                 }
96571
96572                 if (!onInput) {
96573                     tags = utilCleanTags(tags);
96574                 }
96575
96576                 if (!fastDeepEqual(entity.tags, tags)) {
96577                     if (_coalesceChanges) {
96578                         context.overwrite(actionChangeTags(_entityID, tags), annotation);
96579                     } else {
96580                         context.perform(actionChangeTags(_entityID, tags), annotation);
96581                         _coalesceChanges = !!onInput;
96582                     }
96583                 }
96584
96585                 // if leaving field (blur event), rerun validation
96586                 if (!onInput) {
96587                     context.validator().validate();
96588                 }
96589             }
96590
96591
96592             entityEditor.modified = function(val) {
96593                 if (!arguments.length) return _modified;
96594                 _modified = val;
96595                 d3_selectAll('button.preset-close use')
96596                     .attr('xlink:href', (_modified ? '#iD-icon-apply' : '#iD-icon-close'));
96597                 return entityEditor;
96598             };
96599
96600
96601             entityEditor.state = function(val) {
96602                 if (!arguments.length) return _state;
96603                 _state = val;
96604                 return entityEditor;
96605             };
96606
96607
96608             entityEditor.entityID = function(val) {
96609                 if (!arguments.length) return _entityID;
96610                 if (_entityID === val) return entityEditor;  // exit early if no change
96611
96612                 _entityID = val;
96613                 _base = context.graph();
96614                 _coalesceChanges = false;
96615
96616                 // reset the scroll to the top of the inspector (warning: triggers reflow)
96617                 if (_scrolled) {
96618                     window.requestIdleCallback(function() {
96619                         var body = d3_selectAll('.entity-editor-pane .inspector-body');
96620                         if (!body.empty()) {
96621                             _scrolled = false;
96622                             body.node().scrollTop = 0;
96623                         }
96624                     });
96625                 }
96626
96627                 var presetMatch = context.presets().match(context.entity(_entityID), _base);
96628
96629                 return entityEditor
96630                     .preset(presetMatch)
96631                     .modified(false);
96632             };
96633
96634
96635             entityEditor.preset = function(val) {
96636                 if (!arguments.length) return _activePreset;
96637                 if (val !== _activePreset) {
96638                     _activePreset = val;
96639                     _tagReference = uiTagReference(_activePreset.reference(context.geometry(_entityID)), context)
96640                         .showing(false);
96641                 }
96642                 _presetFavorite = uiPresetFavoriteButton(_activePreset, context.geometry(_entityID), context);
96643                 return entityEditor;
96644             };
96645
96646
96647             return utilRebind(entityEditor, dispatch$1, 'on');
96648         }
96649
96650         function uiPresetList(context) {
96651             var dispatch$1 = dispatch('choose');
96652             var _entityID;
96653             var _currentPreset;
96654             var _autofocus = false;
96655             var geocoder = services$1.geocoder;
96656
96657
96658             function presetList(selection) {
96659                 var entity = context.entity(_entityID);
96660                 var geometry = context.geometry(_entityID);
96661
96662                 // Treat entities on addr:interpolation lines as points, not vertices (#3241)
96663                 if (geometry === 'vertex' && entity.isOnAddressLine(context.graph())) {
96664                     geometry = 'point';
96665                 }
96666
96667                 var presets = context.presets().matchGeometry(geometry);
96668
96669                 selection.html('');
96670
96671                 var messagewrap = selection
96672                     .append('div')
96673                     .attr('class', 'header fillL');
96674
96675                 var message = messagewrap
96676                     .append('h3')
96677                     .text(t('inspector.choose'));
96678
96679                 messagewrap
96680                     .append('button')
96681                     .attr('class', 'preset-choose')
96682                     .on('click', function() { dispatch$1.call('choose', this, _currentPreset); })
96683                     .call(svgIcon((textDirection === 'rtl') ? '#iD-icon-backward' : '#iD-icon-forward'));
96684
96685                 function initialKeydown() {
96686                     // hack to let delete shortcut work when search is autofocused
96687                     if (search.property('value').length === 0 &&
96688                         (event.keyCode === utilKeybinding.keyCodes['⌫'] ||
96689                          event.keyCode === utilKeybinding.keyCodes['⌦'])) {
96690                         event.preventDefault();
96691                         event.stopPropagation();
96692                         operationDelete([_entityID], context)();
96693
96694                     // hack to let undo work when search is autofocused
96695                     } else if (search.property('value').length === 0 &&
96696                         (event.ctrlKey || event.metaKey) &&
96697                         event.keyCode === utilKeybinding.keyCodes.z) {
96698                         event.preventDefault();
96699                         event.stopPropagation();
96700                         context.undo();
96701                     } else if (!event.ctrlKey && !event.metaKey) {
96702                         // don't check for delete/undo hack on future keydown events
96703                         d3_select(this).on('keydown', keydown);
96704                         keydown.call(this);
96705                     }
96706                 }
96707
96708                 function keydown() {
96709                     // down arrow
96710                     if (event.keyCode === utilKeybinding.keyCodes['↓'] &&
96711                         // if insertion point is at the end of the string
96712                         search.node().selectionStart === search.property('value').length) {
96713                         event.preventDefault();
96714                         event.stopPropagation();
96715                         // move focus to the first item in the preset list
96716                         var buttons = list.selectAll('.preset-list-button');
96717                         if (!buttons.empty()) buttons.nodes()[0].focus();
96718                     }
96719                 }
96720
96721                 function keypress() {
96722                     // enter
96723                     var value = search.property('value');
96724                     if (event.keyCode === 13 && value.length) {
96725                         list.selectAll('.preset-list-item:first-child')
96726                             .each(function(d) { d.choose.call(this); });
96727                     }
96728                 }
96729
96730                 function inputevent() {
96731                     var value = search.property('value');
96732                     list.classed('filtered', value.length);
96733                     if (value.length) {
96734                         var entity = context.entity(_entityID);
96735                         if (geocoder && entity) {
96736                             var center = entity.extent(context.graph()).center();
96737                             geocoder.countryCode(center, function countryCallback(err, countryCode) {
96738                                 // get the input value again because it may have changed
96739                                 var currentValue = search.property('value');
96740
96741                                 if (!currentValue.length) return;
96742
96743                                 var results;
96744                                 if (!err && countryCode) {
96745                                     countryCode = countryCode.toLowerCase();
96746                                     results = presets.search(currentValue, geometry, countryCode);
96747                                 } else {
96748                                     results = presets.search(currentValue, geometry);
96749                                 }
96750                                 message.text(t('inspector.results', {
96751                                     n: results.collection.length,
96752                                     search: currentValue
96753                                 }));
96754                                 list.call(drawList, results);
96755                             });
96756                         }
96757                     } else {
96758                         list.call(drawList, context.presets().defaults(geometry, 36));
96759                         message.text(t('inspector.choose'));
96760                     }
96761                 }
96762
96763                 var searchWrap = selection
96764                     .append('div')
96765                     .attr('class', 'search-header');
96766
96767                 var search = searchWrap
96768                     .append('input')
96769                     .attr('class', 'preset-search-input')
96770                     .attr('placeholder', t('inspector.search'))
96771                     .attr('type', 'search')
96772                     .call(utilNoAuto)
96773                     .on('keydown', initialKeydown)
96774                     .on('keypress', keypress)
96775                     .on('input', inputevent);
96776
96777                 searchWrap
96778                     .call(svgIcon('#iD-icon-search', 'pre-text'));
96779
96780                 if (_autofocus) {
96781                     search.node().focus();
96782                 }
96783
96784                 var listWrap = selection
96785                     .append('div')
96786                     .attr('class', 'inspector-body');
96787
96788                 var list = listWrap
96789                     .append('div')
96790                     .attr('class', 'preset-list fillL cf')
96791                     .call(drawList, context.presets().defaults(geometry, 36));
96792
96793                 context.features().on('change.preset-list', updateForFeatureHiddenState);
96794             }
96795
96796
96797             function drawList(list, presets) {
96798                 var collection = presets.collection.reduce(function(collection, preset) {
96799                     if (preset.members) {
96800                         collection.push(CategoryItem(preset));
96801                     } else if (preset.visible()) {
96802                         collection.push(PresetItem(preset));
96803                     }
96804                     return collection;
96805                 }, []);
96806
96807                 var items = list.selectAll('.preset-list-item')
96808                     .data(collection, function(d) { return d.preset.id; });
96809
96810                 items.order();
96811
96812                 items.exit()
96813                     .remove();
96814
96815                 items.enter()
96816                     .append('div')
96817                     .attr('class', function(item) { return 'preset-list-item preset-' + item.preset.id.replace('/', '-'); })
96818                     .classed('current', function(item) { return item.preset === _currentPreset; })
96819                     .each(function(item) { d3_select(this).call(item); })
96820                     .style('opacity', 0)
96821                     .transition()
96822                     .style('opacity', 1);
96823
96824                 updateForFeatureHiddenState();
96825             }
96826
96827             function itemKeydown(){
96828                 // the actively focused item
96829                 var item = d3_select(this.closest('.preset-list-item'));
96830                 var parentItem = d3_select(item.node().parentNode.closest('.preset-list-item'));
96831
96832                 // arrow down, move focus to the next, lower item
96833                 if (event.keyCode === utilKeybinding.keyCodes['↓']) {
96834                     event.preventDefault();
96835                     event.stopPropagation();
96836                     // the next item in the list at the same level
96837                     var nextItem = d3_select(item.node().nextElementSibling);
96838                     // if there is no next item in this list
96839                     if (nextItem.empty()) {
96840                         // if there is a parent item
96841                         if (!parentItem.empty()) {
96842                             // the item is the last item of a sublist,
96843                             // select the next item at the parent level
96844                             nextItem = d3_select(parentItem.node().nextElementSibling);
96845                         }
96846                     // if the focused item is expanded
96847                     } else if (d3_select(this).classed('expanded')) {
96848                         // select the first subitem instead
96849                         nextItem = item.select('.subgrid .preset-list-item:first-child');
96850                     }
96851                     if (!nextItem.empty()) {
96852                         // focus on the next item
96853                         nextItem.select('.preset-list-button').node().focus();
96854                     }
96855
96856                 // arrow up, move focus to the previous, higher item
96857                 } else if (event.keyCode === utilKeybinding.keyCodes['↑']) {
96858                     event.preventDefault();
96859                     event.stopPropagation();
96860                     // the previous item in the list at the same level
96861                     var previousItem = d3_select(item.node().previousElementSibling);
96862
96863                     // if there is no previous item in this list
96864                     if (previousItem.empty()) {
96865                         // if there is a parent item
96866                         if (!parentItem.empty()) {
96867                             // the item is the first subitem of a sublist select the parent item
96868                             previousItem = parentItem;
96869                         }
96870                     // if the previous item is expanded
96871                     } else if (previousItem.select('.preset-list-button').classed('expanded')) {
96872                         // select the last subitem of the sublist of the previous item
96873                         previousItem = previousItem.select('.subgrid .preset-list-item:last-child');
96874                     }
96875
96876                     if (!previousItem.empty()) {
96877                         // focus on the previous item
96878                         previousItem.select('.preset-list-button').node().focus();
96879                     } else {
96880                         // the focus is at the top of the list, move focus back to the search field
96881                         var search = d3_select(this.closest('.preset-list-pane')).select('.preset-search-input');
96882                         search.node().focus();
96883                     }
96884
96885                 // arrow left, move focus to the parent item if there is one
96886                 } else if (event.keyCode === utilKeybinding.keyCodes[(textDirection === 'rtl') ? '→' : '←']) {
96887                     event.preventDefault();
96888                     event.stopPropagation();
96889                     // if there is a parent item, focus on the parent item
96890                     if (!parentItem.empty()) {
96891                         parentItem.select('.preset-list-button').node().focus();
96892                     }
96893
96894                 // arrow right, choose this item
96895                 } else if (event.keyCode === utilKeybinding.keyCodes[(textDirection === 'rtl') ? '←' : '→']) {
96896                     event.preventDefault();
96897                     event.stopPropagation();
96898                     item.datum().choose.call(d3_select(this).node());
96899                 }
96900             }
96901
96902
96903             function CategoryItem(preset) {
96904                 var box, sublist, shown = false;
96905
96906                 function item(selection) {
96907                     var wrap = selection.append('div')
96908                         .attr('class', 'preset-list-button-wrap category');
96909
96910                     function click() {
96911                         var isExpanded = d3_select(this).classed('expanded');
96912                         var iconName = isExpanded ?
96913                             (textDirection === 'rtl' ? '#iD-icon-backward' : '#iD-icon-forward') : '#iD-icon-down';
96914                         d3_select(this)
96915                             .classed('expanded', !isExpanded);
96916                         d3_select(this).selectAll('div.label-inner svg.icon use')
96917                             .attr('href', iconName);
96918                         item.choose();
96919                     }
96920
96921                     var button = wrap
96922                         .append('button')
96923                         .attr('class', 'preset-list-button')
96924                         .classed('expanded', false)
96925                         .call(uiPresetIcon(context)
96926                             .geometry(context.geometry(_entityID))
96927                             .preset(preset))
96928                         .on('click', click)
96929                         .on('keydown', function() {
96930                             // right arrow, expand the focused item
96931                             if (event.keyCode === utilKeybinding.keyCodes[(textDirection === 'rtl') ? '←' : '→']) {
96932                                 event.preventDefault();
96933                                 event.stopPropagation();
96934                                 // if the item isn't expanded
96935                                 if (!d3_select(this).classed('expanded')) {
96936                                     // toggle expansion (expand the item)
96937                                     click.call(this);
96938                                 }
96939                             // left arrow, collapse the focused item
96940                             } else if (event.keyCode === utilKeybinding.keyCodes[(textDirection === 'rtl') ? '→' : '←']) {
96941                                 event.preventDefault();
96942                                 event.stopPropagation();
96943                                 // if the item is expanded
96944                                 if (d3_select(this).classed('expanded')) {
96945                                     // toggle expansion (collapse the item)
96946                                     click.call(this);
96947                                 }
96948                             } else {
96949                                 itemKeydown.call(this);
96950                             }
96951                         });
96952
96953                     var label = button
96954                         .append('div')
96955                         .attr('class', 'label')
96956                         .append('div')
96957                         .attr('class', 'label-inner');
96958
96959                     label
96960                         .append('div')
96961                         .attr('class', 'namepart')
96962                         .call(svgIcon((textDirection === 'rtl' ? '#iD-icon-backward' : '#iD-icon-forward'), 'inline'))
96963                         .append('span')
96964                         .html(function() { return preset.name() + '&hellip;'; });
96965
96966                     box = selection.append('div')
96967                         .attr('class', 'subgrid')
96968                         .style('max-height', '0px')
96969                         .style('opacity', 0);
96970
96971                     box.append('div')
96972                         .attr('class', 'arrow');
96973
96974                     sublist = box.append('div')
96975                         .attr('class', 'preset-list fillL3');
96976                 }
96977
96978
96979                 item.choose = function() {
96980                     if (!box || !sublist) return;
96981
96982                     if (shown) {
96983                         shown = false;
96984                         box.transition()
96985                             .duration(200)
96986                             .style('opacity', '0')
96987                             .style('max-height', '0px')
96988                             .style('padding-bottom', '0px');
96989                     } else {
96990                         shown = true;
96991                         var members = preset.members.matchGeometry(context.geometry(_entityID));
96992                         sublist.call(drawList, members);
96993                         box.transition()
96994                             .duration(200)
96995                             .style('opacity', '1')
96996                             .style('max-height', 200 + members.collection.length * 190 + 'px')
96997                             .style('padding-bottom', '10px');
96998                     }
96999                 };
97000
97001                 item.preset = preset;
97002                 return item;
97003             }
97004
97005
97006             function PresetItem(preset) {
97007                 function item(selection) {
97008                     var wrap = selection.append('div')
97009                         .attr('class', 'preset-list-button-wrap');
97010
97011                     var button = wrap.append('button')
97012                         .attr('class', 'preset-list-button')
97013                         .call(uiPresetIcon(context)
97014                             .geometry(context.geometry(_entityID))
97015                             .preset(preset))
97016                         .on('click', item.choose)
97017                         .on('keydown', itemKeydown);
97018
97019                     var label = button
97020                         .append('div')
97021                         .attr('class', 'label')
97022                         .append('div')
97023                         .attr('class', 'label-inner');
97024
97025                     // NOTE: split/join on en-dash, not a hypen (to avoid conflict with fr - nl names in Brussels etc)
97026                     label.selectAll('.namepart')
97027                         .data(preset.name().split(' – '))
97028                         .enter()
97029                         .append('div')
97030                         .attr('class', 'namepart')
97031                         .text(function(d) { return d; });
97032
97033                     wrap.call(item.reference.button);
97034                     selection.call(item.reference.body);
97035                 }
97036
97037                 item.choose = function() {
97038                     if (d3_select(this).classed('disabled')) return;
97039
97040                     context.presets().setMostRecent(preset, context.geometry(_entityID));
97041                     context.perform(
97042                         actionChangePreset(_entityID, _currentPreset, preset),
97043                         t('operations.change_tags.annotation')
97044                     );
97045
97046                     context.validator().validate();  // rerun validation
97047                     dispatch$1.call('choose', this, preset);
97048                 };
97049
97050                 item.help = function() {
97051                     event.stopPropagation();
97052                     item.reference.toggle();
97053                 };
97054
97055                 item.preset = preset;
97056                 item.reference = uiTagReference(preset.reference(context.geometry(_entityID)), context);
97057
97058                 return item;
97059             }
97060
97061
97062             function updateForFeatureHiddenState() {
97063                 if (!context.hasEntity(_entityID)) return;
97064
97065                 var geometry = context.geometry(_entityID);
97066                 var button = d3_selectAll('.preset-list .preset-list-button');
97067
97068                 // remove existing tooltips
97069                 button.call(tooltip().destroyAny);
97070
97071                 button.each(function(item, index) {
97072                     var hiddenPresetFeaturesId = context.features().isHiddenPreset(item.preset, geometry);
97073                     var isHiddenPreset = !!hiddenPresetFeaturesId && item.preset !== _currentPreset;
97074
97075                     d3_select(this)
97076                         .classed('disabled', isHiddenPreset);
97077
97078                     if (isHiddenPreset) {
97079                         var isAutoHidden = context.features().autoHidden(hiddenPresetFeaturesId);
97080                         var tooltipIdSuffix = isAutoHidden ? 'zoom' : 'manual';
97081                         var tooltipObj = { features: t('feature.' + hiddenPresetFeaturesId + '.description') };
97082                         d3_select(this).call(tooltip()
97083                             .title(t('inspector.hidden_preset.' + tooltipIdSuffix, tooltipObj))
97084                             .placement(index < 2 ? 'bottom' : 'top')
97085                         );
97086                     }
97087                 });
97088             }
97089
97090             presetList.autofocus = function(val) {
97091                 if (!arguments.length) return _autofocus;
97092                 _autofocus = val;
97093                 return presetList;
97094             };
97095
97096
97097             presetList.entityID = function(val) {
97098                 if (!arguments.length) return _entityID;
97099                 _entityID = val;
97100                 presetList.preset(context.presets().match(context.entity(_entityID), context.graph()));
97101                 return presetList;
97102             };
97103
97104
97105             presetList.preset = function(val) {
97106                 if (!arguments.length) return _currentPreset;
97107                 _currentPreset = val;
97108                 return presetList;
97109             };
97110
97111
97112             return utilRebind(presetList, dispatch$1, 'on');
97113         }
97114
97115         function uiInspector(context) {
97116             var presetList = uiPresetList(context);
97117             var entityEditor = uiEntityEditor(context);
97118             var wrap = d3_select(null),
97119                 presetPane = d3_select(null),
97120                 editorPane = d3_select(null);
97121             var _state = 'select';
97122             var _entityID;
97123             var _newFeature = false;
97124
97125
97126             function inspector(selection, newFeature) {
97127                 presetList
97128                     .entityID(_entityID)
97129                     .autofocus(_newFeature)
97130                     .on('choose', inspector.setPreset);
97131
97132                 entityEditor
97133                     .state(_state)
97134                     .entityID(_entityID)
97135                     .on('choose', inspector.showList);
97136
97137                 wrap = selection.selectAll('.panewrap')
97138                     .data([0]);
97139
97140                 var enter = wrap.enter()
97141                     .append('div')
97142                     .attr('class', 'panewrap');
97143
97144                 enter
97145                     .append('div')
97146                     .attr('class', 'preset-list-pane pane');
97147
97148                 enter
97149                     .append('div')
97150                     .attr('class', 'entity-editor-pane pane');
97151
97152                 wrap = wrap.merge(enter);
97153                 presetPane = wrap.selectAll('.preset-list-pane');
97154                 editorPane = wrap.selectAll('.entity-editor-pane');
97155
97156                 var entity = context.entity(_entityID);
97157
97158                 var hasNonGeometryTags = entity.hasNonGeometryTags();
97159                 var isTaglessOrIntersectionVertex = entity.geometry(context.graph()) === 'vertex' &&
97160                     (!hasNonGeometryTags && !entity.isHighwayIntersection(context.graph()));
97161                 var issues = context.validator().getEntityIssues(_entityID);
97162                 // start with the preset list if the feature is new and untagged or is an uninteresting vertex
97163                 var showPresetList = (newFeature && !hasNonGeometryTags) || (isTaglessOrIntersectionVertex && !issues.length);
97164
97165                 if (showPresetList) {
97166                     wrap.style('right', '-100%');
97167                     presetPane.call(presetList);
97168                 } else {
97169                     wrap.style('right', '0%');
97170                     editorPane.call(entityEditor);
97171                 }
97172
97173                 var footer = selection.selectAll('.footer')
97174                     .data([0]);
97175
97176                 footer = footer.enter()
97177                     .append('div')
97178                     .attr('class', 'footer')
97179                     .merge(footer);
97180
97181                 footer
97182                     .call(uiViewOnOSM(context)
97183                         .what(context.hasEntity(_entityID))
97184                     );
97185             }
97186
97187             inspector.showList = function(preset) {
97188                 wrap.transition()
97189                     .styleTween('right', function() { return d3_interpolate('0%', '-100%'); });
97190
97191                 presetPane
97192                     .call(presetList.preset(preset).autofocus(true));
97193             };
97194
97195             inspector.setPreset = function(preset) {
97196
97197                 // upon setting multipolygon, go to the area preset list instead of the editor
97198                 if (preset.id === 'type/multipolygon') {
97199                     presetPane
97200                         .call(presetList.preset(preset).autofocus(true));
97201
97202                 } else {
97203                     wrap.transition()
97204                         .styleTween('right', function() { return d3_interpolate('-100%', '0%'); });
97205
97206                     editorPane
97207                         .call(entityEditor.preset(preset));
97208                 }
97209
97210             };
97211
97212             inspector.state = function(val) {
97213                 if (!arguments.length) return _state;
97214                 _state = val;
97215                 entityEditor.state(_state);
97216
97217                 // remove any old field help overlay that might have gotten attached to the inspector
97218                 d3_selectAll('.field-help-body').remove();
97219
97220                 return inspector;
97221             };
97222
97223
97224             inspector.entityID = function(val) {
97225                 if (!arguments.length) return _entityID;
97226                 _entityID = val;
97227                 return inspector;
97228             };
97229
97230
97231             inspector.newFeature = function(val) {
97232                 if (!arguments.length) return _newFeature;
97233                 _newFeature = val;
97234                 return inspector;
97235             };
97236
97237
97238             return inspector;
97239         }
97240
97241         function uiSidebar(context) {
97242             var inspector = uiInspector(context);
97243             var dataEditor = uiDataEditor(context);
97244             var noteEditor = uiNoteEditor(context);
97245             var improveOsmEditor = uiImproveOsmEditor(context);
97246             var keepRightEditor = uiKeepRightEditor(context);
97247             var _current;
97248             var _wasData = false;
97249             var _wasNote = false;
97250             var _wasQAError = false;
97251
97252
97253             function sidebar(selection) {
97254                 var container = d3_select('#id-container');
97255                 var minWidth = 280;
97256                 var sidebarWidth;
97257                 var containerWidth;
97258                 var dragOffset;
97259
97260                 var resizer = selection
97261                     .append('div')
97262                     .attr('id', 'sidebar-resizer');
97263
97264                 // Set the initial width constraints
97265                 selection
97266                     .style('min-width', minWidth + 'px')
97267                     .style('max-width', '400px')
97268                     .style('width', '33.3333%');
97269
97270                 resizer.call(d3_drag()
97271                     .container(container.node())
97272                     .on('start', function() {
97273                         // offset from edge of sidebar-resizer
97274                         dragOffset = event.sourceEvent.offsetX - 1;
97275
97276                         sidebarWidth = selection.node().getBoundingClientRect().width;
97277                         containerWidth = container.node().getBoundingClientRect().width;
97278                         var widthPct = (sidebarWidth / containerWidth) * 100;
97279                         selection
97280                             .style('width', widthPct + '%')    // lock in current width
97281                             .style('max-width', '85%');        // but allow larger widths
97282
97283                         resizer.classed('dragging', true);
97284                     })
97285                     .on('drag', function() {
97286                         var isRTL = (textDirection === 'rtl');
97287                         var scaleX = isRTL ? 0 : 1;
97288                         var xMarginProperty = isRTL ? 'margin-right' : 'margin-left';
97289
97290                         var x = event.x - dragOffset;
97291                         sidebarWidth = isRTL ? containerWidth - x : x;
97292
97293                         var isCollapsed = selection.classed('collapsed');
97294                         var shouldCollapse = sidebarWidth < minWidth;
97295
97296                         selection.classed('collapsed', shouldCollapse);
97297
97298                         if (shouldCollapse) {
97299                             if (!isCollapsed) {
97300                                 selection
97301                                     .style(xMarginProperty, '-400px')
97302                                     .style('width', '400px');
97303
97304                                 context.ui().onResize([(sidebarWidth - event.dx) * scaleX, 0]);
97305                             }
97306
97307                         } else {
97308                             var widthPct = (sidebarWidth / containerWidth) * 100;
97309                             selection
97310                                 .style(xMarginProperty, null)
97311                                 .style('width', widthPct + '%');
97312
97313                             if (isCollapsed) {
97314                                 context.ui().onResize([-sidebarWidth * scaleX, 0]);
97315                             } else {
97316                                 context.ui().onResize([-event.dx * scaleX, 0]);
97317                             }
97318                         }
97319                     })
97320                     .on('end', function() {
97321                         resizer.classed('dragging', false);
97322                     })
97323                 );
97324
97325                 var featureListWrap = selection
97326                     .append('div')
97327                     .attr('class', 'feature-list-pane')
97328                     .call(uiFeatureList(context));
97329
97330                 var inspectorWrap = selection
97331                     .append('div')
97332                     .attr('class', 'inspector-hidden inspector-wrap fr');
97333
97334
97335                 function hover(datum) {
97336                     if (datum && datum.__featurehash__) {   // hovering on data
97337                         _wasData = true;
97338                         sidebar
97339                             .show(dataEditor.datum(datum));
97340
97341                         selection.selectAll('.sidebar-component')
97342                             .classed('inspector-hover', true);
97343
97344                     } else if (datum instanceof osmNote) {
97345                         if (context.mode().id === 'drag-note') return;
97346                         _wasNote = true;
97347
97348                         var osm = services$1.osm;
97349                         if (osm) {
97350                             datum = osm.getNote(datum.id);   // marker may contain stale data - get latest
97351                         }
97352
97353                         sidebar
97354                             .show(noteEditor.note(datum));
97355
97356                         selection.selectAll('.sidebar-component')
97357                             .classed('inspector-hover', true);
97358
97359                     } else if (datum instanceof qaError) {
97360                         _wasQAError = true;
97361
97362                         var errService = services$1[datum.service];
97363                         if (errService) {
97364                             // marker may contain stale data - get latest
97365                             datum = errService.getError(datum.id);
97366                         }
97367
97368                         // Temporary solution while only two services
97369                         var errEditor = (datum.service === 'keepRight') ? keepRightEditor : improveOsmEditor;
97370
97371                         d3_selectAll('.qa_error.' + datum.service)
97372                             .classed('hover', function(d) { return d.id === datum.id; });
97373
97374                         sidebar
97375                             .show(errEditor.error(datum));
97376
97377                         selection.selectAll('.sidebar-component')
97378                             .classed('inspector-hover', true);
97379
97380                     } else if (!_current && (datum instanceof osmEntity)) {
97381                         featureListWrap
97382                             .classed('inspector-hidden', true);
97383
97384                         inspectorWrap
97385                             .classed('inspector-hidden', false)
97386                             .classed('inspector-hover', true);
97387
97388                         if (inspector.entityID() !== datum.id || inspector.state() !== 'hover') {
97389                             inspector
97390                                 .state('hover')
97391                                 .entityID(datum.id);
97392
97393                             inspectorWrap
97394                                 .call(inspector);
97395                         }
97396
97397                     } else if (!_current) {
97398                         featureListWrap
97399                             .classed('inspector-hidden', false);
97400                         inspectorWrap
97401                             .classed('inspector-hidden', true);
97402                         inspector
97403                             .state('hide');
97404
97405                     } else if (_wasData || _wasNote || _wasQAError) {
97406                         _wasNote = false;
97407                         _wasData = false;
97408                         _wasQAError = false;
97409                         d3_selectAll('.note').classed('hover', false);
97410                         d3_selectAll('.qa_error').classed('hover', false);
97411                         sidebar.hide();
97412                     }
97413                 }
97414
97415                 sidebar.hover = throttle(hover, 200);
97416
97417
97418                 sidebar.intersects = function(extent) {
97419                     var rect = selection.node().getBoundingClientRect();
97420                     return extent.intersects([
97421                         context.projection.invert([0, rect.height]),
97422                         context.projection.invert([rect.width, 0])
97423                     ]);
97424                 };
97425
97426
97427                 sidebar.select = function(id, newFeature) {
97428                     sidebar.hide();
97429
97430                     if (id) {
97431                         var entity = context.entity(id);
97432                         // uncollapse the sidebar
97433                         if (selection.classed('collapsed')) {
97434                             if (newFeature) {
97435                                 var extent = entity.extent(context.graph());
97436                                 sidebar.expand(sidebar.intersects(extent));
97437                             }
97438                         }
97439
97440                         featureListWrap
97441                             .classed('inspector-hidden', true);
97442
97443                         inspectorWrap
97444                             .classed('inspector-hidden', false)
97445                             .classed('inspector-hover', false);
97446
97447                         if (inspector.entityID() !== id || inspector.state() !== 'select') {
97448                             inspector
97449                                 .state('select')
97450                                 .entityID(id)
97451                                 .newFeature(newFeature);
97452
97453                             inspectorWrap
97454                                 .call(inspector, newFeature);
97455                         }
97456
97457                         sidebar.showPresetList = function() {
97458                             inspector.showList(context.presets().match(entity, context.graph()));
97459                         };
97460
97461                     } else {
97462                         inspector
97463                             .state('hide');
97464                     }
97465                 };
97466
97467
97468                 sidebar.show = function(component, element) {
97469                     featureListWrap
97470                         .classed('inspector-hidden', true);
97471                     inspectorWrap
97472                         .classed('inspector-hidden', true);
97473
97474                     if (_current) _current.remove();
97475                     _current = selection
97476                         .append('div')
97477                         .attr('class', 'sidebar-component')
97478                         .call(component, element);
97479                 };
97480
97481
97482                 sidebar.hide = function() {
97483                     featureListWrap
97484                         .classed('inspector-hidden', false);
97485                     inspectorWrap
97486                         .classed('inspector-hidden', true);
97487
97488                     if (_current) _current.remove();
97489                     _current = null;
97490                 };
97491
97492
97493                 sidebar.expand = function(moveMap) {
97494                     if (selection.classed('collapsed')) {
97495                         sidebar.toggle(moveMap);
97496                     }
97497                 };
97498
97499
97500                 sidebar.collapse = function(moveMap) {
97501                     if (!selection.classed('collapsed')) {
97502                         sidebar.toggle(moveMap);
97503                     }
97504                 };
97505
97506
97507                 sidebar.toggle = function(moveMap) {
97508                     var e = event;
97509                     if (e && e.sourceEvent) {
97510                         e.sourceEvent.preventDefault();
97511                     } else if (e) {
97512                         e.preventDefault();
97513                     }
97514
97515                     // Don't allow sidebar to toggle when the user is in the walkthrough.
97516                     if (context.inIntro()) return;
97517
97518                     var isCollapsed = selection.classed('collapsed');
97519                     var isCollapsing = !isCollapsed;
97520                     var isRTL = (textDirection === 'rtl');
97521                     var scaleX = isRTL ? 0 : 1;
97522                     var xMarginProperty = isRTL ? 'margin-right' : 'margin-left';
97523
97524                     sidebarWidth = selection.node().getBoundingClientRect().width;
97525
97526                     // switch from % to px
97527                     selection.style('width', sidebarWidth + 'px');
97528
97529                     var startMargin, endMargin, lastMargin;
97530                     if (isCollapsing) {
97531                         startMargin = lastMargin = 0;
97532                         endMargin = -sidebarWidth;
97533                     } else {
97534                         startMargin = lastMargin = -sidebarWidth;
97535                         endMargin = 0;
97536                     }
97537
97538                     selection.transition()
97539                         .style(xMarginProperty, endMargin + 'px')
97540                         .tween('panner', function() {
97541                             var i = d3_interpolateNumber(startMargin, endMargin);
97542                             return function(t) {
97543                                 var dx = lastMargin - Math.round(i(t));
97544                                 lastMargin = lastMargin - dx;
97545                                 context.ui().onResize(moveMap ? undefined : [dx * scaleX, 0]);
97546                             };
97547                         })
97548                         .on('end', function() {
97549                             selection.classed('collapsed', isCollapsing);
97550
97551                             // switch back from px to %
97552                             if (!isCollapsing) {
97553                                 var containerWidth = container.node().getBoundingClientRect().width;
97554                                 var widthPct = (sidebarWidth / containerWidth) * 100;
97555                                 selection
97556                                     .style(xMarginProperty, null)
97557                                     .style('width', widthPct + '%');
97558                             }
97559                         });
97560                 };
97561
97562                 // toggle the sidebar collapse when double-clicking the resizer
97563                 resizer.on('dblclick', sidebar.toggle);
97564             }
97565
97566             sidebar.showPresetList = function() {};
97567             sidebar.hover = function() {};
97568             sidebar.hover.cancel = function() {};
97569             sidebar.intersects = function() {};
97570             sidebar.select = function() {};
97571             sidebar.show = function() {};
97572             sidebar.hide = function() {};
97573             sidebar.expand = function() {};
97574             sidebar.collapse = function() {};
97575             sidebar.toggle = function() {};
97576
97577             return sidebar;
97578         }
97579
97580         function uiSpinner(context) {
97581             var osm = context.connection();
97582
97583
97584             return function(selection) {
97585                 var img = selection
97586                     .append('img')
97587                     .attr('src', context.imagePath('loader-black.gif'))
97588                     .style('opacity', 0);
97589
97590                 if (osm) {
97591                     osm
97592                         .on('loading.spinner', function() {
97593                             img.transition()
97594                                 .style('opacity', 1);
97595                         })
97596                         .on('loaded.spinner', function() {
97597                             img.transition()
97598                                 .style('opacity', 0);
97599                         });
97600                 }
97601             };
97602         }
97603
97604         function uiSplash(context) {
97605
97606             return function(selection) {
97607                 if (context.storage('sawSplash'))
97608                      return;
97609
97610                 context.storage('sawSplash', true);
97611
97612                 var modalSelection = uiModal(selection);
97613
97614                 modalSelection.select('.modal')
97615                     .attr('class', 'modal-splash modal');
97616
97617                 var introModal = modalSelection.select('.content')
97618                     .append('div')
97619                     .attr('class', 'fillL');
97620
97621                 introModal
97622                     .append('div')
97623                     .attr('class','modal-section')
97624                     .append('h3').text(t('splash.welcome'));
97625
97626                 introModal
97627                     .append('div')
97628                     .attr('class','modal-section')
97629                     .append('p')
97630                     .html(t('splash.text', {
97631                         version: context.version,
97632                         website: '<a href="http://ideditor.com/">ideditor.com</a>',
97633                         github: '<a href="https://github.com/openstreetmap/iD">github.com</a>'
97634                     }));
97635
97636                 var buttonWrap = introModal
97637                     .append('div')
97638                     .attr('class', 'modal-actions');
97639
97640                 var walkthrough = buttonWrap
97641                     .append('button')
97642                     .attr('class', 'walkthrough')
97643                     .on('click', function() {
97644                         context.container().call(uiIntro(context));
97645                         modalSelection.close();
97646                     });
97647
97648                 walkthrough
97649                     .append('svg')
97650                     .attr('class', 'logo logo-walkthrough')
97651                     .append('use')
97652                     .attr('xlink:href', '#iD-logo-walkthrough');
97653
97654                 walkthrough
97655                     .append('div')
97656                     .text(t('splash.walkthrough'));
97657
97658                 var startEditing = buttonWrap
97659                     .append('button')
97660                     .attr('class', 'start-editing')
97661                     .on('click', modalSelection.close);
97662
97663                 startEditing
97664                     .append('svg')
97665                     .attr('class', 'logo logo-features')
97666                     .append('use')
97667                     .attr('xlink:href', '#iD-logo-features');
97668
97669                 startEditing
97670                     .append('div')
97671                     .text(t('splash.start'));
97672
97673
97674                 modalSelection.select('button.close')
97675                     .attr('class','hide');
97676
97677             };
97678         }
97679
97680         function uiStatus(context) {
97681             var osm = context.connection();
97682
97683
97684             return function(selection) {
97685                 if (!osm) return;
97686
97687                 function update() {
97688                     osm.status(function(err, apiStatus) {
97689                         selection.html('');
97690
97691                         if (err) {
97692                             if (apiStatus === 'connectionSwitched') {
97693                                 // if the connection was just switched, we can't rely on
97694                                 // the status (we're getting the status of the previous api)
97695                                 return;
97696
97697                             } else if (apiStatus === 'rateLimited') {
97698                                 selection
97699                                     .text(t('status.rateLimit'))
97700                                     .append('a')
97701                                     .attr('class', 'api-status-login')
97702                                     .attr('target', '_blank')
97703                                     .call(svgIcon('#iD-icon-out-link', 'inline'))
97704                                     .append('span')
97705                                     .text(t('login'))
97706                                     .on('click.login', function() {
97707                                         event.preventDefault();
97708                                         osm.authenticate();
97709                                     });
97710                             } else {
97711                                 // eslint-disable-next-line no-warning-comments
97712                                 // TODO: nice messages for different error types
97713                                 selection.text(t('status.error'));
97714                             }
97715
97716                         } else if (apiStatus === 'readonly') {
97717                             selection.text(t('status.readonly'));
97718                         } else if (apiStatus === 'offline') {
97719                             selection.text(t('status.offline'));
97720                         }
97721
97722                         selection.attr('class', 'api-status ' + (err ? 'error' : apiStatus));
97723                     });
97724                 }
97725
97726                 osm.on('change', function() { update(selection); });
97727
97728                 window.setInterval(update, 90000);
97729                 update(selection);
97730             };
97731         }
97732
97733         function modeDrawArea(context, wayID, startGraph, baselineGraph, button) {
97734             var mode = {
97735                 button: button,
97736                 id: 'draw-area'
97737             };
97738
97739             var behavior;
97740
97741             mode.wayID = wayID;
97742
97743             mode.enter = function() {
97744                 var way = context.entity(wayID);
97745
97746                 behavior = behaviorDrawWay(context, wayID, undefined, mode, startGraph, baselineGraph)
97747                     .tail(t('modes.draw_area.tail'));
97748
97749                 var addNode = behavior.addNode;
97750
97751                 behavior.addNode = function(node, d) {
97752                     var length = way.nodes.length;
97753                     var penultimate = length > 2 ? way.nodes[length - 2] : null;
97754
97755                     if (node.id === way.first() || node.id === penultimate) {
97756                         behavior.finish();
97757                     } else {
97758                         addNode(node, d);
97759                     }
97760                 };
97761
97762                 context.install(behavior);
97763             };
97764
97765
97766             mode.exit = function() {
97767                 context.uninstall(behavior);
97768             };
97769
97770
97771             mode.selectedIDs = function() {
97772                 return [wayID];
97773             };
97774
97775
97776             mode.activeID = function() {
97777                 return (behavior && behavior.activeID()) || [];
97778             };
97779
97780
97781             return mode;
97782         }
97783
97784         function modeAddArea(context, mode) {
97785             mode.id = 'add-area';
97786
97787             var behavior = behaviorAddWay(context)
97788                 .tail(t('modes.add_area.tail'))
97789                 .on('start', start)
97790                 .on('startFromWay', startFromWay)
97791                 .on('startFromNode', startFromNode);
97792
97793             var defaultTags = { area: 'yes' };
97794             if (mode.preset) defaultTags = mode.preset.setTags(defaultTags, 'area');
97795
97796
97797             function actionClose(wayId) {
97798                 return function (graph) {
97799                     return graph.replace(graph.entity(wayId).close());
97800                 };
97801             }
97802
97803
97804             function start(loc) {
97805                 var startGraph = context.graph();
97806                 var node = osmNode({ loc: loc });
97807                 var way = osmWay({ tags: defaultTags });
97808
97809                 context.perform(
97810                     actionAddEntity(node),
97811                     actionAddEntity(way),
97812                     actionAddVertex(way.id, node.id),
97813                     actionClose(way.id)
97814                 );
97815
97816                 context.enter(modeDrawArea(context, way.id, startGraph, context.graph(), mode.button));
97817             }
97818
97819
97820             function startFromWay(loc, edge) {
97821                 var startGraph = context.graph();
97822                 var node = osmNode({ loc: loc });
97823                 var way = osmWay({ tags: defaultTags });
97824
97825                 context.perform(
97826                     actionAddEntity(node),
97827                     actionAddEntity(way),
97828                     actionAddVertex(way.id, node.id),
97829                     actionClose(way.id),
97830                     actionAddMidpoint({ loc: loc, edge: edge }, node)
97831                 );
97832
97833                 context.enter(modeDrawArea(context, way.id, startGraph, context.graph(), mode.button));
97834             }
97835
97836
97837             function startFromNode(node) {
97838                 var startGraph = context.graph();
97839                 var way = osmWay({ tags: defaultTags });
97840
97841                 context.perform(
97842                     actionAddEntity(way),
97843                     actionAddVertex(way.id, node.id),
97844                     actionClose(way.id)
97845                 );
97846
97847                 context.enter(modeDrawArea(context, way.id, startGraph, context.graph(), mode.button));
97848             }
97849
97850
97851             mode.enter = function() {
97852                 context.install(behavior);
97853             };
97854
97855
97856             mode.exit = function() {
97857                 context.uninstall(behavior);
97858             };
97859
97860
97861             return mode;
97862         }
97863
97864         function modeAddLine(context, mode) {
97865             mode.id = 'add-line';
97866
97867             var behavior = behaviorAddWay(context)
97868                 .tail(t('modes.add_line.tail'))
97869                 .on('start', start)
97870                 .on('startFromWay', startFromWay)
97871                 .on('startFromNode', startFromNode);
97872
97873             var defaultTags = {};
97874             if (mode.preset) defaultTags = mode.preset.setTags(defaultTags, 'line');
97875
97876
97877             function start(loc) {
97878                 var startGraph = context.graph();
97879                 var node = osmNode({ loc: loc });
97880                 var way = osmWay({ tags: defaultTags });
97881
97882                 context.perform(
97883                     actionAddEntity(node),
97884                     actionAddEntity(way),
97885                     actionAddVertex(way.id, node.id)
97886                 );
97887
97888                 context.enter(modeDrawLine(context, way.id, startGraph, context.graph(), mode.button));
97889             }
97890
97891
97892             function startFromWay(loc, edge) {
97893                 var startGraph = context.graph();
97894                 var node = osmNode({ loc: loc });
97895                 var way = osmWay({ tags: defaultTags });
97896
97897                 context.perform(
97898                     actionAddEntity(node),
97899                     actionAddEntity(way),
97900                     actionAddVertex(way.id, node.id),
97901                     actionAddMidpoint({ loc: loc, edge: edge }, node)
97902                 );
97903
97904                 context.enter(modeDrawLine(context, way.id, startGraph, context.graph(), mode.button));
97905             }
97906
97907
97908             function startFromNode(node) {
97909                 var startGraph = context.graph();
97910                 var way = osmWay({ tags: defaultTags });
97911
97912                 context.perform(
97913                     actionAddEntity(way),
97914                     actionAddVertex(way.id, node.id)
97915                 );
97916
97917                 context.enter(modeDrawLine(context, way.id, startGraph, context.graph(), mode.button));
97918             }
97919
97920
97921             mode.enter = function() {
97922                 context.install(behavior);
97923             };
97924
97925
97926             mode.exit = function() {
97927                 context.uninstall(behavior);
97928             };
97929
97930             return mode;
97931         }
97932
97933         function modeAddPoint(context, mode) {
97934
97935             mode.id = 'add-point';
97936
97937             var behavior = behaviorDraw(context)
97938                 .tail(t('modes.add_point.tail'))
97939                 .on('click', add)
97940                 .on('clickWay', addWay)
97941                 .on('clickNode', addNode)
97942                 .on('cancel', cancel)
97943                 .on('finish', cancel);
97944
97945             var defaultTags = {};
97946             if (mode.preset) defaultTags = mode.preset.setTags(defaultTags, 'point');
97947
97948
97949             function add(loc) {
97950                 var node = osmNode({ loc: loc, tags: defaultTags });
97951
97952                 context.perform(
97953                     actionAddEntity(node),
97954                     t('operations.add.annotation.point')
97955                 );
97956
97957                 enterSelectMode(node);
97958             }
97959
97960
97961             function addWay(loc, edge) {
97962                 var node = osmNode({ tags: defaultTags });
97963
97964                 context.perform(
97965                     actionAddMidpoint({loc: loc, edge: edge}, node),
97966                     t('operations.add.annotation.vertex')
97967                 );
97968
97969                 enterSelectMode(node);
97970             }
97971
97972             function enterSelectMode(node) {
97973                 context.enter(
97974                     modeSelect(context, [node.id]).newFeature(true)
97975                 );
97976             }
97977
97978
97979             function addNode(node) {
97980                 if (Object.keys(defaultTags).length === 0) {
97981                     enterSelectMode(node);
97982                     return;
97983                 }
97984
97985                 var tags = Object.assign({}, node.tags);  // shallow copy
97986                 for (var key in defaultTags) {
97987                     tags[key] = defaultTags[key];
97988                 }
97989
97990                 context.perform(
97991                     actionChangeTags(node.id, tags),
97992                     t('operations.add.annotation.point')
97993                 );
97994
97995                 enterSelectMode(node);
97996             }
97997
97998
97999             function cancel() {
98000                 context.enter(modeBrowse(context));
98001             }
98002
98003
98004             mode.enter = function() {
98005                 context.install(behavior);
98006             };
98007
98008
98009             mode.exit = function() {
98010                 context.uninstall(behavior);
98011             };
98012
98013
98014             return mode;
98015         }
98016
98017         function modeAddNote(context) {
98018             var mode = {
98019                 id: 'add-note',
98020                 button: 'note',
98021                 title: t('modes.add_note.title'),
98022                 description: t('modes.add_note.description'),
98023                 key: t('modes.add_note.key')
98024             };
98025
98026             var behavior = behaviorDraw(context)
98027                 .tail(t('modes.add_note.tail'))
98028                 .on('click', add)
98029                 .on('cancel', cancel)
98030                 .on('finish', cancel);
98031
98032
98033             function add(loc) {
98034                 var osm = services$1.osm;
98035                 if (!osm) return;
98036
98037                 var note = osmNote({ loc: loc, status: 'open', comments: [] });
98038                 osm.replaceNote(note);
98039
98040                 // force a reraw (there is no history change that would otherwise do this)
98041                 context.pan([0,0]);
98042
98043                 context
98044                     .selectedNoteID(note.id)
98045                     .enter(modeSelectNote(context, note.id).newFeature(true));
98046             }
98047
98048
98049             function cancel() {
98050                 context.enter(modeBrowse(context));
98051             }
98052
98053
98054             mode.enter = function() {
98055                 context.install(behavior);
98056             };
98057
98058
98059             mode.exit = function() {
98060                 context.uninstall(behavior);
98061             };
98062
98063
98064             return mode;
98065         }
98066
98067         function uiConflicts(context) {
98068             var dispatch$1 = dispatch('cancel', 'save');
98069             var keybinding = utilKeybinding('conflicts');
98070             var _origChanges;
98071             var _conflictList;
98072
98073
98074             function keybindingOn() {
98075                 d3_select(document)
98076                     .call(keybinding.on('⎋', cancel, true));
98077             }
98078
98079             function keybindingOff() {
98080                 d3_select(document)
98081                     .call(keybinding.unbind);
98082             }
98083
98084             function tryAgain() {
98085                 keybindingOff();
98086                 dispatch$1.call('save');
98087             }
98088
98089             function cancel() {
98090                 keybindingOff();
98091                 dispatch$1.call('cancel');
98092             }
98093
98094
98095             function conflicts(selection) {
98096                 keybindingOn();
98097
98098                 var headerEnter = selection.selectAll('.header')
98099                     .data([0])
98100                     .enter()
98101                     .append('div')
98102                     .attr('class', 'header fillL');
98103
98104                 headerEnter
98105                     .append('button')
98106                     .attr('class', 'fr')
98107                     .on('click', cancel)
98108                     .call(svgIcon('#iD-icon-close'));
98109
98110                 headerEnter
98111                     .append('h3')
98112                     .text(t('save.conflict.header'));
98113
98114                 var bodyEnter = selection.selectAll('.body')
98115                     .data([0])
98116                     .enter()
98117                     .append('div')
98118                     .attr('class', 'body fillL');
98119
98120                 var conflictsHelpEnter = bodyEnter
98121                     .append('div')
98122                     .attr('class', 'conflicts-help')
98123                     .text(t('save.conflict.help'));
98124
98125
98126                 // Download changes link
98127                 var detected = utilDetect();
98128                 var changeset = new osmChangeset();
98129
98130                 delete changeset.id;  // Export without changeset_id
98131
98132                 var data = JXON.stringify(changeset.osmChangeJXON(_origChanges));
98133                 var blob = new Blob([data], { type: 'text/xml;charset=utf-8;' });
98134                 var fileName = 'changes.osc';
98135
98136                 var linkEnter = conflictsHelpEnter.selectAll('.download-changes')
98137                     .append('a')
98138                     .attr('class', 'download-changes');
98139
98140                 if (detected.download) {      // All except IE11 and Edge
98141                     linkEnter                 // download the data as a file
98142                         .attr('href', window.URL.createObjectURL(blob))
98143                         .attr('download', fileName);
98144
98145                 } else {                      // IE11 and Edge
98146                     linkEnter                 // open data uri in a new tab
98147                         .attr('target', '_blank')
98148                         .on('click.download', function() {
98149                             navigator.msSaveBlob(blob, fileName);
98150                         });
98151                 }
98152
98153                 linkEnter
98154                     .call(svgIcon('#iD-icon-load', 'inline'))
98155                     .append('span')
98156                     .text(t('save.conflict.download_changes'));
98157
98158
98159                 bodyEnter
98160                     .append('div')
98161                     .attr('class', 'conflict-container fillL3')
98162                     .call(showConflict, 0);
98163
98164                 bodyEnter
98165                     .append('div')
98166                     .attr('class', 'conflicts-done')
98167                     .attr('opacity', 0)
98168                     .style('display', 'none')
98169                     .text(t('save.conflict.done'));
98170
98171                 var buttonsEnter = bodyEnter
98172                     .append('div')
98173                     .attr('class','buttons col12 joined conflicts-buttons');
98174
98175                 buttonsEnter
98176                     .append('button')
98177                     .attr('disabled', _conflictList.length > 1)
98178                     .attr('class', 'action conflicts-button col6')
98179                     .text(t('save.title'))
98180                     .on('click.try_again', tryAgain);
98181
98182                 buttonsEnter
98183                     .append('button')
98184                     .attr('class', 'secondary-action conflicts-button col6')
98185                     .text(t('confirm.cancel'))
98186                     .on('click.cancel', cancel);
98187             }
98188
98189
98190             function showConflict(selection, index) {
98191                 index = utilWrap(index, _conflictList.length);
98192
98193                 var parent = d3_select(selection.node().parentNode);
98194
98195                 // enable save button if this is the last conflict being reviewed..
98196                 if (index === _conflictList.length - 1) {
98197                     window.setTimeout(function() {
98198                         parent.select('.conflicts-button')
98199                             .attr('disabled', null);
98200
98201                         parent.select('.conflicts-done')
98202                             .transition()
98203                             .attr('opacity', 1)
98204                             .style('display', 'block');
98205                     }, 250);
98206                 }
98207
98208                 var conflict = selection
98209                     .selectAll('.conflict')
98210                     .data([_conflictList[index]]);
98211
98212                 conflict.exit()
98213                     .remove();
98214
98215                 var conflictEnter = conflict.enter()
98216                     .append('div')
98217                     .attr('class', 'conflict');
98218
98219                 conflictEnter
98220                     .append('h4')
98221                     .attr('class', 'conflict-count')
98222                     .text(t('save.conflict.count', { num: index + 1, total: _conflictList.length }));
98223
98224                 conflictEnter
98225                     .append('a')
98226                     .attr('class', 'conflict-description')
98227                     .attr('href', '#')
98228                     .text(function(d) { return d.name; })
98229                     .on('click', function(d) {
98230                         event.preventDefault();
98231                         zoomToEntity(d.id);
98232                     });
98233
98234                 var details = conflictEnter
98235                     .append('div')
98236                     .attr('class', 'conflict-detail-container');
98237
98238                 details
98239                     .append('ul')
98240                     .attr('class', 'conflict-detail-list')
98241                     .selectAll('li')
98242                     .data(function(d) { return d.details || []; })
98243                     .enter()
98244                     .append('li')
98245                     .attr('class', 'conflict-detail-item')
98246                     .html(function(d) { return d; });
98247
98248                 details
98249                     .append('div')
98250                     .attr('class', 'conflict-choices')
98251                     .call(addChoices);
98252
98253                 details
98254                     .append('div')
98255                     .attr('class', 'conflict-nav-buttons joined cf')
98256                     .selectAll('button')
98257                     .data(['previous', 'next'])
98258                     .enter()
98259                     .append('button')
98260                     .text(function(d) { return t('save.conflict.' + d); })
98261                     .attr('class', 'conflict-nav-button action col6')
98262                     .attr('disabled', function(d, i) {
98263                         return (i === 0 && index === 0) ||
98264                             (i === 1 && index === _conflictList.length - 1) || null;
98265                     })
98266                     .on('click', function(d, i) {
98267                         event.preventDefault();
98268
98269                         var container = parent.selectAll('.conflict-container');
98270                         var sign = (i === 0 ? -1 : 1);
98271
98272                         container
98273                             .selectAll('.conflict')
98274                             .remove();
98275
98276                         container
98277                             .call(showConflict, index + sign);
98278                     });
98279
98280             }
98281
98282
98283             function addChoices(selection) {
98284                 var choices = selection
98285                     .append('ul')
98286                     .attr('class', 'layer-list')
98287                     .selectAll('li')
98288                     .data(function(d) { return d.choices || []; });
98289
98290                 // enter
98291                 var choicesEnter = choices.enter()
98292                     .append('li')
98293                     .attr('class', 'layer');
98294
98295                 var labelEnter = choicesEnter
98296                     .append('label');
98297
98298                 labelEnter
98299                     .append('input')
98300                     .attr('type', 'radio')
98301                     .attr('name', function(d) { return d.id; })
98302                     .on('change', function(d, i) {
98303                         var ul = this.parentNode.parentNode.parentNode;
98304                         ul.__data__.chosen = i;
98305                         choose(ul, d);
98306                     });
98307
98308                 labelEnter
98309                     .append('span')
98310                     .text(function(d) { return d.text; });
98311
98312                 // update
98313                 choicesEnter
98314                     .merge(choices)
98315                     .each(function(d, i) {
98316                         var ul = this.parentNode;
98317                         if (ul.__data__.chosen === i) {
98318                             choose(ul, d);
98319                         }
98320                     });
98321             }
98322
98323
98324             function choose(ul, datum) {
98325                 if (event) event.preventDefault();
98326
98327                 d3_select(ul)
98328                     .selectAll('li')
98329                     .classed('active', function(d) { return d === datum; })
98330                     .selectAll('input')
98331                     .property('checked', function(d) { return d === datum; });
98332
98333                 var extent = geoExtent();
98334                 var entity;
98335
98336                 entity = context.graph().hasEntity(datum.id);
98337                 if (entity) extent._extend(entity.extent(context.graph()));
98338
98339                 datum.action();
98340
98341                 entity = context.graph().hasEntity(datum.id);
98342                 if (entity) extent._extend(entity.extent(context.graph()));
98343
98344                 zoomToEntity(datum.id, extent);
98345             }
98346
98347
98348             function zoomToEntity(id, extent) {
98349                 context.surface().selectAll('.hover')
98350                     .classed('hover', false);
98351
98352                 var entity = context.graph().hasEntity(id);
98353                 if (entity) {
98354                     if (extent) {
98355                         context.map().trimmedExtent(extent);
98356                     } else {
98357                         context.map().zoomToEase(entity);
98358                     }
98359                     context.surface().selectAll(utilEntityOrMemberSelector([entity.id], context.graph()))
98360                         .classed('hover', true);
98361                 }
98362             }
98363
98364
98365             // The conflict list should be an array of objects like:
98366             // {
98367             //     id: id,
98368             //     name: entityName(local),
98369             //     details: merge.conflicts(),
98370             //     chosen: 1,
98371             //     choices: [
98372             //         choice(id, keepMine, forceLocal),
98373             //         choice(id, keepTheirs, forceRemote)
98374             //     ]
98375             // }
98376             conflicts.conflictList = function(_) {
98377                 if (!arguments.length) return _conflictList;
98378                 _conflictList = _;
98379                 return conflicts;
98380             };
98381
98382
98383             conflicts.origChanges = function(_) {
98384                 if (!arguments.length) return _origChanges;
98385                 _origChanges = _;
98386                 return conflicts;
98387             };
98388
98389
98390             return utilRebind(conflicts, dispatch$1, 'on');
98391         }
98392
98393         function uiChangesetEditor(context) {
98394             var dispatch$1 = dispatch('change');
98395             var formFields = uiFormFields(context);
98396             var commentCombo = uiCombobox(context, 'comment').caseSensitive(true);
98397             var _fieldsArr;
98398             var _tags;
98399             var _changesetID;
98400
98401
98402             function changesetEditor(selection) {
98403                 render(selection);
98404             }
98405
98406
98407             function render(selection) {
98408                 var initial = false;
98409
98410                 if (!_fieldsArr) {
98411                     initial = true;
98412                     var presets = context.presets();
98413
98414                     _fieldsArr = [
98415                         uiField(context, presets.field('comment'), null, { show: true, revert: false }),
98416                         uiField(context, presets.field('source'), null, { show: false, revert: false }),
98417                         uiField(context, presets.field('hashtags'), null, { show: false, revert: false }),
98418                     ];
98419
98420                     _fieldsArr.forEach(function(field) {
98421                         field
98422                             .on('change', function(t, onInput) {
98423                                 dispatch$1.call('change', field, t, onInput);
98424                             });
98425                     });
98426                 }
98427
98428                 _fieldsArr.forEach(function(field) {
98429                     field
98430                         .tags(_tags);
98431                 });
98432
98433
98434                 selection
98435                     .call(formFields.fieldsArr(_fieldsArr));
98436
98437
98438                 if (initial) {
98439                     var commentField = selection.select('#preset-input-comment');
98440                     var commentNode = commentField.node();
98441
98442                     if (commentNode) {
98443                         commentNode.focus();
98444                         commentNode.select();
98445                     }
98446
98447                     // trigger a 'blur' event so that comment field can be cleaned
98448                     // and checked for hashtags, even if retrieved from localstorage
98449                     utilTriggerEvent(commentField, 'blur');
98450
98451                     var osm = context.connection();
98452                     if (osm) {
98453                         osm.userChangesets(function (err, changesets) {
98454                             if (err) return;
98455
98456                             var comments = changesets.map(function(changeset) {
98457                                 var comment = changeset.tags.comment;
98458                                 return comment ? { title: comment, value: comment } : null;
98459                             }).filter(Boolean);
98460
98461                             commentField
98462                                 .call(commentCombo
98463                                     .data(utilArrayUniqBy(comments, 'title'))
98464                                 );
98465                         });
98466                     }
98467                 }
98468
98469                 // Add warning if comment mentions Google
98470                 var hasGoogle = _tags.comment.match(/google/i);
98471                 var commentWarning = selection.select('.form-field-comment').selectAll('.comment-warning')
98472                     .data(hasGoogle ? [0] : []);
98473
98474                 commentWarning.exit()
98475                     .transition()
98476                     .duration(200)
98477                     .style('opacity', 0)
98478                     .remove();
98479
98480                 var commentEnter = commentWarning.enter()
98481                     .insert('div', '.tag-reference-body')
98482                     .attr('class', 'field-warning comment-warning')
98483                     .style('opacity', 0);
98484
98485                 commentEnter
98486                     .append('a')
98487                     .attr('target', '_blank')
98488                     .attr('tabindex', -1)
98489                     .call(svgIcon('#iD-icon-alert', 'inline'))
98490                     .attr('href', t('commit.google_warning_link'))
98491                     .append('span')
98492                     .text(t('commit.google_warning'));
98493
98494                 commentEnter
98495                     .transition()
98496                     .duration(200)
98497                     .style('opacity', 1);
98498             }
98499
98500
98501             changesetEditor.tags = function(_) {
98502                 if (!arguments.length) return _tags;
98503                 _tags = _;
98504                 // Don't reset _fieldsArr here.
98505                 return changesetEditor;
98506             };
98507
98508
98509             changesetEditor.changesetID = function(_) {
98510                 if (!arguments.length) return _changesetID;
98511                 if (_changesetID === _) return changesetEditor;
98512                 _changesetID = _;
98513                 _fieldsArr = null;
98514                 return changesetEditor;
98515             };
98516
98517
98518             return utilRebind(changesetEditor, dispatch$1, 'on');
98519         }
98520
98521         function uiCommitChanges(context) {
98522             var detected = utilDetect();
98523             var _entityID;
98524
98525
98526             function commitChanges(selection) {
98527                 var history = context.history();
98528                 var summary = history.difference().summary();
98529
98530                 var container = selection.selectAll('.modal-section.commit-section')
98531                     .data([0]);
98532
98533                 var containerEnter = container.enter()
98534                     .append('div')
98535                     .attr('class', 'commit-section modal-section fillL2');
98536
98537                 containerEnter
98538                     .append('h3')
98539                     .text(t('commit.changes', { count: summary.length }));
98540
98541                 containerEnter
98542                     .append('ul')
98543                     .attr('class', 'changeset-list');
98544
98545                 container = containerEnter
98546                     .merge(container);
98547
98548
98549                 var items = container.select('ul').selectAll('li')
98550                     .data(summary);
98551
98552                 var itemsEnter = items.enter()
98553                     .append('li')
98554                     .attr('class', 'change-item');
98555
98556                 itemsEnter
98557                     .each(function(d) {
98558                         d3_select(this)
98559                             .call(svgIcon('#iD-icon-' + d.entity.geometry(d.graph), 'pre-text ' + d.changeType));
98560                     });
98561
98562                 itemsEnter
98563                     .append('span')
98564                     .attr('class', 'change-type')
98565                     .text(function(d) { return t('commit.' + d.changeType) + ' '; });
98566
98567                 itemsEnter
98568                     .append('strong')
98569                     .attr('class', 'entity-type')
98570                     .text(function(d) {
98571                         var matched = context.presets().match(d.entity, d.graph);
98572                         return (matched && matched.name()) || utilDisplayType(d.entity.id);
98573                     });
98574
98575                 itemsEnter
98576                     .append('span')
98577                     .attr('class', 'entity-name')
98578                     .text(function(d) {
98579                         var name = utilDisplayName(d.entity) || '',
98580                             string = '';
98581                         if (name !== '') {
98582                             string += ':';
98583                         }
98584                         return string += ' ' + name;
98585                     });
98586
98587                 itemsEnter
98588                     .style('opacity', 0)
98589                     .transition()
98590                     .style('opacity', 1);
98591
98592                 items = itemsEnter
98593                     .merge(items);
98594
98595                 items
98596                     .on('mouseover', mouseover)
98597                     .on('mouseout', mouseout)
98598                     .on('click', click);
98599
98600
98601                 // Download changeset link
98602                 var changeset = new osmChangeset().update({ id: undefined });
98603                 var changes = history.changes(actionDiscardTags(history.difference()));
98604
98605                 delete changeset.id;  // Export without chnageset_id
98606
98607                 var data = JXON.stringify(changeset.osmChangeJXON(changes));
98608                 var blob = new Blob([data], {type: 'text/xml;charset=utf-8;'});
98609                 var fileName = 'changes.osc';
98610
98611                 var linkEnter = container.selectAll('.download-changes')
98612                     .data([0])
98613                     .enter()
98614                     .append('a')
98615                     .attr('class', 'download-changes');
98616
98617                 if (detected.download) {      // All except IE11 and Edge
98618                     linkEnter                 // download the data as a file
98619                         .attr('href', window.URL.createObjectURL(blob))
98620                         .attr('download', fileName);
98621
98622                 } else {                      // IE11 and Edge
98623                     linkEnter                 // open data uri in a new tab
98624                         .attr('target', '_blank')
98625                         .on('click.download', function() {
98626                             navigator.msSaveBlob(blob, fileName);
98627                         });
98628                 }
98629
98630                 linkEnter
98631                     .call(svgIcon('#iD-icon-load', 'inline'))
98632                     .append('span')
98633                     .text(t('commit.download_changes'));
98634
98635
98636                 function mouseover(d) {
98637                     if (d.entity) {
98638                         context.surface().selectAll(
98639                             utilEntityOrMemberSelector([d.entity.id], context.graph())
98640                         ).classed('hover', true);
98641                     }
98642                 }
98643
98644
98645                 function mouseout() {
98646                     context.surface().selectAll('.hover')
98647                         .classed('hover', false);
98648                 }
98649
98650
98651                 function click(change) {
98652                     if (change.changeType === 'deleted') {
98653                         _entityID = null;
98654                     } else {
98655                         var entity = change.entity;
98656                         _entityID = change.entity.id;
98657                         context.map().zoomToEase(entity);
98658                         context.surface().selectAll(utilEntityOrMemberSelector([_entityID], context.graph()))
98659                             .classed('hover', true);
98660                     }
98661                 }
98662             }
98663
98664
98665             commitChanges.entityID = function(_) {
98666                 if (!arguments.length) return _entityID;
98667                 _entityID = _;
98668                 return commitChanges;
98669             };
98670
98671
98672             return commitChanges;
98673         }
98674
98675         function uiCommitWarnings(context) {
98676
98677             function commitWarnings(selection) {
98678                 var issuesBySeverity = context.validator()
98679                     .getIssuesBySeverity({ what: 'edited', where: 'all', includeDisabledRules: true });
98680
98681                 for (var severity in issuesBySeverity) {
98682                     var issues = issuesBySeverity[severity];
98683                     var section = severity + '-section';
98684                     var issueItem = severity + '-item';
98685
98686                     var container = selection.selectAll('.' + section)
98687                         .data(issues.length ? [0] : []);
98688
98689                     container.exit()
98690                         .remove();
98691
98692                     var containerEnter = container.enter()
98693                         .append('div')
98694                         .attr('class', 'modal-section ' + section + ' fillL2');
98695
98696                     containerEnter
98697                         .append('h3')
98698                         .text(severity === 'warning' ? t('commit.warnings') : t('commit.errors'));
98699
98700                     containerEnter
98701                         .append('ul')
98702                         .attr('class', 'changeset-list');
98703
98704                     container = containerEnter
98705                         .merge(container);
98706
98707
98708                     var items = container.select('ul').selectAll('li')
98709                         .data(issues, function(d) { return d.id; });
98710
98711                     items.exit()
98712                         .remove();
98713
98714                     var itemsEnter = items.enter()
98715                         .append('li')
98716                         .attr('class', issueItem);
98717
98718                     itemsEnter
98719                         .call(svgIcon('#iD-icon-alert', 'pre-text'));
98720
98721                     itemsEnter
98722                         .append('strong')
98723                         .attr('class', 'issue-message');
98724
98725                     itemsEnter.filter(function(d) { return d.tooltip; })
98726                         .call(tooltip()
98727                             .title(function(d) { return d.tooltip; })
98728                             .placement('top')
98729                         );
98730
98731                     items = itemsEnter
98732                         .merge(items);
98733
98734                     items.selectAll('.issue-message')
98735                         .text(function(d) {
98736                             return d.message();
98737                         });
98738
98739                     items
98740                         .on('mouseover', function(d) {
98741                             if (d.entityIds) {
98742                                 context.surface().selectAll(
98743                                     utilEntityOrMemberSelector(
98744                                         d.entityIds,
98745                                         context.graph()
98746                                     )
98747                                 ).classed('hover', true);
98748                             }
98749                         })
98750                         .on('mouseout', function() {
98751                             context.surface().selectAll('.hover')
98752                                 .classed('hover', false);
98753                         })
98754                         .on('click', function(d) {
98755                             context.validator().focusIssue(d);
98756                         });
98757                 }
98758             }
98759
98760
98761             return commitWarnings;
98762         }
98763
98764         var _changeset$1;
98765         var readOnlyTags = [
98766             /^changesets_count$/,
98767             /^created_by$/,
98768             /^ideditor:/,
98769             /^imagery_used$/,
98770             /^host$/,
98771             /^locale$/,
98772             /^warnings:/
98773         ];
98774
98775         // treat most punctuation (except -, _, +, &) as hashtag delimiters - #4398
98776         // from https://stackoverflow.com/a/25575009
98777         var hashtagRegex = /(#[^\u2000-\u206F\u2E00-\u2E7F\s\\'!"#$%()*,.\/:;<=>?@\[\]^`{|}~]+)/g;
98778
98779
98780         function uiCommit(context) {
98781             var dispatch$1 = dispatch('cancel', 'save');
98782             var _userDetails;
98783             var _selection;
98784
98785             var changesetEditor = uiChangesetEditor(context)
98786                 .on('change', changeTags);
98787             var rawTagEditor = uiRawTagEditor(context)
98788                 .on('change', changeTags);
98789             var commitChanges = uiCommitChanges(context);
98790             var commitWarnings = uiCommitWarnings(context);
98791
98792
98793             function commit(selection) {
98794                 _selection = selection;
98795
98796                 var osm = context.connection();
98797                 if (!osm) return;
98798
98799                 // expire stored comment, hashtags, source after cutoff datetime - #3947 #4899
98800                 var commentDate = +context.storage('commentDate') || 0;
98801                 var currDate = Date.now();
98802                 var cutoff = 2 * 86400 * 1000;   // 2 days
98803                 if (commentDate > currDate || currDate - commentDate > cutoff) {
98804                     context.storage('comment', null);
98805                     context.storage('hashtags', null);
98806                     context.storage('source', null);
98807                 }
98808
98809                 var tags;
98810                 // Initialize changeset if one does not exist yet.
98811                 // Also pull values from local storage.
98812                 if (!_changeset$1) {
98813                     var detected = utilDetect();
98814                     tags = {
98815                         comment: context.storage('comment') || '',
98816                         created_by: ('iD ' + context.version).substr(0, 255),
98817                         host: detected.host.substr(0, 255),
98818                         locale: detected.locale.substr(0, 255)
98819                     };
98820
98821                     // call findHashtags initially - this will remove stored
98822                     // hashtags if any hashtags are found in the comment - #4304
98823                     findHashtags(tags, true);
98824
98825                     var hashtags = context.storage('hashtags');
98826                     if (hashtags) {
98827                         tags.hashtags = hashtags;
98828                     }
98829
98830                     var source = context.storage('source');
98831                     if (source) {
98832                         tags.source = source;
98833                     }
98834                     var existingSources = (tags.source || '').split(';');
98835                     // add the photo overlays used during editing as sources
98836                     var photoOverlaysUsed = context.history().photoOverlaysUsed();
98837                     if (photoOverlaysUsed.length) {
98838                         // include this tag for any photo layer
98839                         if (existingSources.indexOf('streetlevel imagery') === -1) {
98840                             existingSources.push('streetlevel imagery');
98841                         }
98842                     }
98843                     photoOverlaysUsed.forEach(function(photoOverlay) {
98844                         if (existingSources.indexOf(photoOverlay) === -1) {
98845                             existingSources.push(photoOverlay);
98846                         }
98847                     });
98848                     if (existingSources.length) {
98849                         tags.source = existingSources.join(';').substr(0, 255);
98850                     }
98851
98852                     _changeset$1 = new osmChangeset({ tags: tags });
98853                 }
98854
98855                 tags = Object.assign({}, _changeset$1.tags);   // shallow copy
98856
98857                 // assign tags for imagery used
98858                 var imageryUsed = context.history().imageryUsed().join(';').substr(0, 255);
98859                 tags.imagery_used = imageryUsed || 'None';
98860
98861                 // assign tags for closed issues and notes
98862                 var osmClosed = osm.getClosedIDs();
98863                 if (osmClosed.length) {
98864                     tags['closed:note'] = osmClosed.join(';').substr(0, 255);
98865                 }
98866                 if (services$1.keepRight) {
98867                     var krClosed = services$1.keepRight.getClosedIDs();
98868                     if (krClosed.length) {
98869                         tags['closed:keepright'] = krClosed.join(';').substr(0, 255);
98870                     }
98871                 }
98872                 if (services$1.improveOSM) {
98873                     var iOsmClosed = services$1.improveOSM.getClosedIDs();
98874                     if (iOsmClosed.length) {
98875                         tags['closed:improveosm'] = iOsmClosed.join(';').substr(0, 255);
98876                     }
98877                 }
98878
98879                 // remove existing warning counts
98880                 for (var key in tags) {
98881                     if (key.match(/^warnings:/)) {
98882                         delete tags[key];
98883                     }
98884                 }
98885
98886                 // add counts of warnings generated by the user's edits
98887                 var warnings = context.validator()
98888                     .getIssuesBySeverity({ what: 'edited', where: 'all', includeIgnored: true, includeDisabledRules: true }).warning;
98889
98890                 var warningsByType = utilArrayGroupBy(warnings, 'type');
98891                 for (var warningType in warningsByType) {
98892                     var warningsOfType = warningsByType[warningType];
98893                     if (warningsOfType[0].subtype) {
98894                         var warningsBySubtype = utilArrayGroupBy(warningsOfType, 'subtype');
98895                         for (var warningSubtype in warningsBySubtype) {
98896                             var warningsOfSubtype = warningsBySubtype[warningSubtype];
98897                             tags['warnings:' + warningType + ':' + warningSubtype] = warningsOfSubtype.length.toString();
98898                         }
98899                     } else {
98900                         tags['warnings:' + warningType] = warningsOfType.length.toString();
98901                     }
98902                 }
98903
98904
98905                 _changeset$1 = _changeset$1.update({ tags: tags });
98906
98907                 var header = selection.selectAll('.header')
98908                     .data([0]);
98909
98910                 var headerTitle = header.enter()
98911                     .append('div')
98912                     .attr('class', 'header fillL header-container');
98913
98914                 headerTitle
98915                     .append('div')
98916                     .attr('class', 'header-block header-block-outer');
98917
98918                 headerTitle
98919                     .append('div')
98920                     .attr('class', 'header-block')
98921                     .append('h3')
98922                     .text(t('commit.title'));
98923
98924                 headerTitle
98925                     .append('div')
98926                     .attr('class', 'header-block header-block-outer header-block-close')
98927                     .append('button')
98928                     .attr('class', 'close')
98929                     .on('click', function() { context.enter(modeBrowse(context)); })
98930                     .call(svgIcon('#iD-icon-close'));
98931
98932                 var body = selection.selectAll('.body')
98933                     .data([0]);
98934
98935                 body = body.enter()
98936                     .append('div')
98937                     .attr('class', 'body')
98938                     .merge(body);
98939
98940
98941                 // Changeset Section
98942                 var changesetSection = body.selectAll('.changeset-editor')
98943                     .data([0]);
98944
98945                 changesetSection = changesetSection.enter()
98946                     .append('div')
98947                     .attr('class', 'modal-section changeset-editor')
98948                     .merge(changesetSection);
98949
98950                 changesetSection
98951                     .call(changesetEditor
98952                         .changesetID(_changeset$1.id)
98953                         .tags(tags)
98954                     );
98955
98956
98957                 // Warnings
98958                 body.call(commitWarnings);
98959
98960
98961                 // Upload Explanation
98962                 var saveSection = body.selectAll('.save-section')
98963                     .data([0]);
98964
98965                 saveSection = saveSection.enter()
98966                     .append('div')
98967                     .attr('class','modal-section save-section fillL cf')
98968                     .merge(saveSection);
98969
98970                 var prose = saveSection.selectAll('.commit-info')
98971                     .data([0]);
98972
98973                 if (prose.enter().size()) {   // first time, make sure to update user details in prose
98974                     _userDetails = null;
98975                 }
98976
98977                 prose = prose.enter()
98978                     .append('p')
98979                     .attr('class', 'commit-info')
98980                     .text(t('commit.upload_explanation'))
98981                     .merge(prose);
98982
98983                 // always check if this has changed, but only update prose.html()
98984                 // if needed, because it can trigger a style recalculation
98985                 osm.userDetails(function(err, user) {
98986                     if (err) return;
98987
98988                     if (_userDetails === user) return;  // no change
98989                     _userDetails = user;
98990
98991                     var userLink = d3_select(document.createElement('div'));
98992
98993                     if (user.image_url) {
98994                         userLink
98995                             .append('img')
98996                             .attr('src', user.image_url)
98997                             .attr('class', 'icon pre-text user-icon');
98998                     }
98999
99000                     userLink
99001                         .append('a')
99002                         .attr('class', 'user-info')
99003                         .text(user.display_name)
99004                         .attr('href', osm.userURL(user.display_name))
99005                         .attr('tabindex', -1)
99006                         .attr('target', '_blank');
99007
99008                     prose
99009                         .html(t('commit.upload_explanation_with_user', { user: userLink.html() }));
99010                 });
99011
99012
99013                 // Request Review
99014                 var requestReview = saveSection.selectAll('.request-review')
99015                     .data([0]);
99016
99017                 // Enter
99018                 var requestReviewEnter = requestReview.enter()
99019                     .append('div')
99020                     .attr('class', 'request-review');
99021
99022                 var labelEnter = requestReviewEnter
99023                     .append('label')
99024                     .attr('for', 'commit-input-request-review');
99025
99026                 labelEnter
99027                     .append('input')
99028                     .attr('type', 'checkbox')
99029                     .attr('id', 'commit-input-request-review');
99030
99031                 labelEnter
99032                     .append('span')
99033                     .text(t('commit.request_review'));
99034
99035                 // Update
99036                 requestReview = requestReview
99037                     .merge(requestReviewEnter);
99038
99039                 var requestReviewInput = requestReview.selectAll('input')
99040                     .property('checked', isReviewRequested(_changeset$1.tags))
99041                     .on('change', toggleRequestReview);
99042
99043
99044                 // Buttons
99045                 var buttonSection = saveSection.selectAll('.buttons')
99046                     .data([0]);
99047
99048                 // enter
99049                 var buttonEnter = buttonSection.enter()
99050                     .append('div')
99051                     .attr('class', 'buttons fillL cf');
99052
99053                 buttonEnter
99054                     .append('button')
99055                     .attr('class', 'secondary-action button cancel-button')
99056                     .append('span')
99057                     .attr('class', 'label')
99058                     .text(t('commit.cancel'));
99059
99060                 var uploadButton = buttonEnter
99061                     .append('button')
99062                     .attr('class', 'action button save-button');
99063
99064                 uploadButton.append('span')
99065                     .attr('class', 'label')
99066                     .text(t('commit.save'));
99067
99068                 var uploadBlockerTooltipText = getUploadBlockerMessage();
99069
99070                 // update
99071                 buttonSection = buttonSection
99072                     .merge(buttonEnter);
99073
99074                 buttonSection.selectAll('.cancel-button')
99075                     .on('click.cancel', function() {
99076                         var selectedID = commitChanges.entityID();
99077                         dispatch$1.call('cancel', this, selectedID);
99078                     });
99079
99080                 buttonSection.selectAll('.save-button')
99081                     .classed('disabled', uploadBlockerTooltipText !== null)
99082                     .on('click.save', function() {
99083                         if (!d3_select(this).classed('disabled')) {
99084                             this.blur();    // avoid keeping focus on the button - #4641
99085                             dispatch$1.call('save', this, _changeset$1);
99086                         }
99087                     });
99088
99089                 // remove any existing tooltip
99090                 tooltip().destroyAny(buttonSection.selectAll('.save-button'));
99091
99092                 if (uploadBlockerTooltipText) {
99093                     buttonSection.selectAll('.save-button')
99094                         .call(tooltip().title(uploadBlockerTooltipText).placement('top'));
99095                 }
99096
99097                 // Raw Tag Editor
99098                 var tagSection = body.selectAll('.tag-section.raw-tag-editor')
99099                     .data([0]);
99100
99101                 tagSection = tagSection.enter()
99102                     .append('div')
99103                     .attr('class', 'modal-section tag-section raw-tag-editor')
99104                     .merge(tagSection);
99105
99106                 var expanded = !tagSection.selectAll('a.hide-toggle.expanded').empty();
99107                 tagSection
99108                     .call(rawTagEditor
99109                         .expanded(expanded)
99110                         .readOnlyTags(readOnlyTags)
99111                         .tags(Object.assign({}, _changeset$1.tags))   // shallow copy
99112                     );
99113
99114
99115                 // Change summary
99116                 body.call(commitChanges);
99117
99118
99119                 function toggleRequestReview() {
99120                     var rr = requestReviewInput.property('checked');
99121                     updateChangeset({ review_requested: (rr ? 'yes' : undefined) });
99122
99123                     var expanded = !tagSection.selectAll('a.hide-toggle.expanded').empty();
99124                     tagSection
99125                         .call(rawTagEditor
99126                             .expanded(expanded)
99127                             .readOnlyTags(readOnlyTags)
99128                             .tags(Object.assign({}, _changeset$1.tags))   // shallow copy
99129                         );
99130                 }
99131             }
99132
99133
99134             function getUploadBlockerMessage() {
99135                 var errors = context.validator()
99136                     .getIssuesBySeverity({ what: 'edited', where: 'all' }).error;
99137
99138                 if (errors.length) {
99139                     return t('commit.outstanding_errors_message', { count: errors.length });
99140
99141                 } else {
99142                     var n = d3_select('#preset-input-comment').node();
99143                     var hasChangesetComment = n && n.value.length > 0;
99144                     if (!hasChangesetComment) {
99145                         return t('commit.comment_needed_message');
99146                     }
99147                 }
99148                 return null;
99149             }
99150
99151
99152             function changeTags(changed, onInput) {
99153                 if (changed.hasOwnProperty('comment')) {
99154                     if (changed.comment === undefined) {
99155                         changed.comment = '';
99156                     }
99157                     if (!onInput) {
99158                         context.storage('comment', changed.comment);
99159                         context.storage('commentDate', Date.now());
99160                     }
99161                 }
99162                 if (changed.hasOwnProperty('source')) {
99163                     if (changed.source === undefined) {
99164                         context.storage('source', null);
99165                     } else if (!onInput) {
99166                         context.storage('source', changed.source);
99167                         context.storage('commentDate', Date.now());
99168                     }
99169                 }
99170
99171                 updateChangeset(changed, onInput);
99172
99173                 if (_selection) {
99174                     _selection.call(commit);
99175                 }
99176             }
99177
99178
99179             function findHashtags(tags, commentOnly) {
99180                 var inComment = commentTags();
99181                 var inHashTags = hashTags();
99182
99183                 if (inComment !== null) {                    // when hashtags are detected in comment...
99184                     context.storage('hashtags', null);       // always remove stored hashtags - #4304
99185                     if (commentOnly) { inHashTags = []; }    // optionally override hashtags field
99186                 }
99187
99188                 // keep only one copy of the tags
99189                 var all = new Set();
99190                 var keepTags = [];
99191                 inComment.forEach(checkTag);
99192                 inHashTags.forEach(checkTag);
99193                 return keepTags;
99194
99195                 // Compare tags as lowercase strings, but keep original case tags
99196                 function checkTag(s) {
99197                     var compare = s.toLowerCase();
99198                     if (!all.has(compare)) {
99199                         all.add(compare);
99200                         keepTags.push(s);
99201                     }
99202                 }
99203
99204                 // Extract hashtags from `comment`
99205                 function commentTags() {
99206                     var matches = (tags.comment || '')
99207                         .replace(/http\S*/g, '')  // drop anything that looks like a URL - #4289
99208                         .match(hashtagRegex);
99209
99210                     return (matches || []);
99211                 }
99212
99213                 // Extract and clean hashtags from `hashtags`
99214                 function hashTags() {
99215                     var matches = (tags.hashtags || '')
99216                         .split(/[,;\s]+/)
99217                         .map(function (s) {
99218                             if (s[0] !== '#') { s = '#' + s; }    // prepend '#'
99219                             var matched = s.match(hashtagRegex);
99220                             return matched && matched[0];
99221                         }).filter(Boolean);                       // exclude falsy
99222
99223                     return (matches || []);
99224                 }
99225             }
99226
99227
99228             function isReviewRequested(tags) {
99229                 var rr = tags.review_requested;
99230                 if (rr === undefined) return false;
99231                 rr = rr.trim().toLowerCase();
99232                 return !(rr === '' || rr === 'no');
99233             }
99234
99235
99236             function updateChangeset(changed, onInput) {
99237                 var tags = Object.assign({}, _changeset$1.tags);   // shallow copy
99238
99239                 Object.keys(changed).forEach(function(k) {
99240                     var v = changed[k];
99241                     k = k.trim().substr(0, 255);
99242                     if (readOnlyTags.indexOf(k) !== -1) return;
99243
99244                     if (k !== '' && v !== undefined) {
99245                         if (onInput) {
99246                             tags[k] = v;
99247                         } else {
99248                             tags[k] = v.trim().substr(0, 255);
99249                         }
99250                     } else {
99251                         delete tags[k];
99252                     }
99253                 });
99254
99255                 if (!onInput) {
99256                     // when changing the comment, override hashtags with any found in comment.
99257                     var commentOnly = changed.hasOwnProperty('comment') && (changed.comment !== '');
99258                     var arr = findHashtags(tags, commentOnly);
99259                     if (arr.length) {
99260                         tags.hashtags = arr.join(';').substr(0, 255);
99261                         context.storage('hashtags', tags.hashtags);
99262                     } else {
99263                         delete tags.hashtags;
99264                         context.storage('hashtags', null);
99265                     }
99266                 }
99267
99268                 // always update userdetails, just in case user reauthenticates as someone else
99269                 if (_userDetails && _userDetails.changesets_count !== undefined) {
99270                     var changesetsCount = parseInt(_userDetails.changesets_count, 10) + 1;  // #4283
99271                     tags.changesets_count = String(changesetsCount);
99272
99273                     // first 100 edits - new user
99274                     if (changesetsCount <= 100) {
99275                         var s;
99276                         s = context.storage('walkthrough_completed');
99277                         if (s) {
99278                             tags['ideditor:walkthrough_completed'] = s;
99279                         }
99280
99281                         s = context.storage('walkthrough_progress');
99282                         if (s) {
99283                             tags['ideditor:walkthrough_progress'] = s;
99284                         }
99285
99286                         s = context.storage('walkthrough_started');
99287                         if (s) {
99288                             tags['ideditor:walkthrough_started'] = s;
99289                         }
99290                     }
99291                 } else {
99292                     delete tags.changesets_count;
99293                 }
99294
99295                 if (!fastDeepEqual(_changeset$1.tags, tags)) {
99296                     _changeset$1 = _changeset$1.update({ tags: tags });
99297                 }
99298             }
99299
99300
99301             commit.reset = function() {
99302                 _changeset$1 = null;
99303             };
99304
99305
99306             return utilRebind(commit, dispatch$1, 'on');
99307         }
99308
99309         function uiSuccess(context) {
99310             var MAXEVENTS = 2;
99311
99312             // All else being equal, rank more "social" communities higher
99313             // (anything not in this list receives no adjustment)
99314             var COMMUNITYRANK = {
99315                 'meetup': +5,
99316                 'slack': +4,
99317                 'facebook': +3,
99318                 'reddit': +2,
99319                 'forum': -2,
99320                 'mailinglist': -3,
99321                 'irc': -4
99322             };
99323
99324             var detected = utilDetect();
99325             var dispatch$1 = dispatch('cancel');
99326             var _changeset;
99327             var _location;
99328
99329
99330             // string-to-date parsing in JavaScript is weird
99331             function parseEventDate(when) {
99332                 if (!when) return;
99333
99334                 var raw = when.trim();
99335                 if (!raw) return;
99336
99337                 if (!/Z$/.test(raw)) {    // if no trailing 'Z', add one
99338                     raw += 'Z';           // this forces date to be parsed as a UTC date
99339                 }
99340
99341                 var parsed = new Date(raw);
99342                 return new Date(parsed.toUTCString().substr(0, 25));  // convert to local timezone
99343             }
99344
99345
99346             function success(selection) {
99347                 var header = selection
99348                     .append('div')
99349                     .attr('class', 'header fillL');
99350
99351                 header
99352                     .append('button')
99353                     .attr('class', 'fr')
99354                     .on('click', function() { dispatch$1.call('cancel'); })
99355                     .call(svgIcon('#iD-icon-close'));
99356
99357                 header
99358                     .append('h3')
99359                     .text(t('success.just_edited'));
99360
99361                 var body = selection
99362                     .append('div')
99363                     .attr('class', 'body save-success fillL');
99364
99365                 var summary = body
99366                     .append('div')
99367                     .attr('class', 'save-summary');
99368
99369                 summary
99370                     .append('h3')
99371                     .text(t('success.thank_you' + (_location ? '_location' : ''), { where: _location }));
99372
99373                 summary
99374                     .append('p')
99375                     .text(t('success.help_html'))
99376                     .append('a')
99377                     .attr('class', 'link-out')
99378                     .attr('target', '_blank')
99379                     .attr('tabindex', -1)
99380                     .attr('href', t('success.help_link_url'))
99381                     .call(svgIcon('#iD-icon-out-link', 'inline'))
99382                     .append('span')
99383                     .text(t('success.help_link_text'));
99384
99385                 var osm = context.connection();
99386                 if (!osm) return;
99387
99388                 var changesetURL = osm.changesetURL(_changeset.id);
99389
99390                 var table = summary
99391                     .append('table')
99392                     .attr('class', 'summary-table');
99393
99394                 var row = table
99395                     .append('tr')
99396                     .attr('class', 'summary-row');
99397
99398                 row
99399                     .append('td')
99400                     .attr('class', 'cell-icon summary-icon')
99401                     .append('a')
99402                     .attr('target', '_blank')
99403                     .attr('href', changesetURL)
99404                     .append('svg')
99405                     .attr('class', 'logo-small')
99406                     .append('use')
99407                     .attr('xlink:href', '#iD-logo-osm');
99408
99409                 var summaryDetail = row
99410                     .append('td')
99411                     .attr('class', 'cell-detail summary-detail');
99412
99413                 summaryDetail
99414                     .append('a')
99415                     .attr('class', 'cell-detail summary-view-on-osm')
99416                     .attr('target', '_blank')
99417                     .attr('href', changesetURL)
99418                     .text(t('success.view_on_osm'));
99419
99420                 summaryDetail
99421                     .append('div')
99422                     .text(t('success.changeset_id', { changeset_id: _changeset.id }));
99423
99424
99425                 // Gather community polygon IDs intersecting the map..
99426                 var matchFeatures = data.community.query(context.map().center(), true) || [];
99427                 var matchIDs = matchFeatures.map(function(feature) { return feature.id; });
99428
99429                 // Gather community resources that are either global or match a polygon.
99430                 var matchResources = Object.values(data.community.resources)
99431                     .filter(function(v) { return !v.featureId || matchIDs.indexOf(v.featureId) !== -1; });
99432
99433                 if (matchResources.length) {
99434                     // sort by size ascending, then by community rank
99435                     matchResources.sort(function(a, b) {
99436                         var aSize = Infinity;
99437                         var bSize = Infinity;
99438                         var aRank = COMMUNITYRANK[a.type] || 0;
99439                         var bRank = COMMUNITYRANK[b.type] || 0;
99440
99441                         if (a.featureId) {
99442                             aSize = data.community.features[a.featureId].properties.area;
99443                         }
99444                         if (b.featureId) {
99445                             bSize = data.community.features[b.featureId].properties.area;
99446                         }
99447
99448                         return aSize < bSize ? -1 : aSize > bSize ? 1 : bRank - aRank;
99449                     });
99450
99451                     body
99452                         .call(showCommunityLinks, matchResources);
99453                 }
99454             }
99455
99456
99457             function showCommunityLinks(selection, matchResources) {
99458                 var communityLinks = selection
99459                     .append('div')
99460                     .attr('class', 'save-communityLinks');
99461
99462                 communityLinks
99463                     .append('h3')
99464                     .text(t('success.like_osm'));
99465
99466                 var table = communityLinks
99467                     .append('table')
99468                     .attr('class', 'community-table');
99469
99470                 var row = table.selectAll('.community-row')
99471                     .data(matchResources);
99472
99473                 var rowEnter = row.enter()
99474                     .append('tr')
99475                     .attr('class', 'community-row');
99476
99477                 rowEnter
99478                     .append('td')
99479                     .attr('class', 'cell-icon community-icon')
99480                     .append('a')
99481                     .attr('target', '_blank')
99482                     .attr('href', function(d) { return d.url; })
99483                     .append('svg')
99484                     .attr('class', 'logo-small')
99485                     .append('use')
99486                     .attr('xlink:href', function(d) { return '#community-' + d.type; });
99487
99488                 var communityDetail = rowEnter
99489                     .append('td')
99490                     .attr('class', 'cell-detail community-detail');
99491
99492                 communityDetail
99493                     .each(showCommunityDetails);
99494
99495                 communityLinks
99496                     .append('div')
99497                     .attr('class', 'community-missing')
99498                     .text(t('success.missing'))
99499                     .append('a')
99500                     .attr('class', 'link-out')
99501                     .attr('target', '_blank')
99502                     .attr('tabindex', -1)
99503                     .call(svgIcon('#iD-icon-out-link', 'inline'))
99504                     .attr('href', 'https://github.com/osmlab/osm-community-index/issues')
99505                     .append('span')
99506                     .text(t('success.tell_us'));
99507             }
99508
99509
99510             function showCommunityDetails(d) {
99511                 var selection = d3_select(this);
99512                 var communityID = d.id;
99513                 var replacements = {
99514                     url: linkify(d.url),
99515                     signupUrl: linkify(d.signupUrl || d.url)
99516                 };
99517
99518                 selection
99519                     .append('div')
99520                     .attr('class', 'community-name')
99521                     .append('a')
99522                     .attr('target', '_blank')
99523                     .attr('href', d.url)
99524                     .text(t('community.' + d.id + '.name'));
99525
99526                 var descriptionHTML = t('community.' + d.id + '.description', replacements);
99527
99528                 if (d.type === 'reddit') {   // linkify subreddits  #4997
99529                     descriptionHTML = descriptionHTML
99530                         .replace(/(\/r\/\w*\/*)/i, function(match) { return linkify(d.url, match); });
99531                 }
99532
99533                 selection
99534                     .append('div')
99535                     .attr('class', 'community-description')
99536                     .html(descriptionHTML);
99537
99538                 if (d.extendedDescription || (d.languageCodes && d.languageCodes.length)) {
99539                     selection
99540                         .append('div')
99541                         .call(uiDisclosure(context, 'community-more-' + d.id, false)
99542                             .expanded(false)
99543                             .updatePreference(false)
99544                             .title(t('success.more'))
99545                             .content(showMore)
99546                         );
99547                 }
99548
99549                 var nextEvents = (d.events || [])
99550                     .map(function(event) {
99551                         event.date = parseEventDate(event.when);
99552                         return event;
99553                     })
99554                     .filter(function(event) {               // date is valid and future (or today)
99555                         var t = event.date.getTime();
99556                         var now = (new Date()).setHours(0,0,0,0);
99557                         return !isNaN(t) && t >= now;
99558                     })
99559                     .sort(function(a, b) {                  // sort by date ascending
99560                         return a.date < b.date ? -1 : a.date > b.date ? 1 : 0;
99561                     })
99562                     .slice(0, MAXEVENTS);                   // limit number of events shown
99563
99564                 if (nextEvents.length) {
99565                     selection
99566                         .append('div')
99567                         .call(uiDisclosure(context, 'community-events-' + d.id, false)
99568                             .expanded(false)
99569                             .updatePreference(false)
99570                             .title(t('success.events'))
99571                             .content(showNextEvents)
99572                         )
99573                         .select('.hide-toggle')
99574                         .append('span')
99575                         .attr('class', 'badge-text')
99576                         .text(nextEvents.length);
99577                 }
99578
99579
99580                 function showMore(selection) {
99581                     var more = selection
99582                         .append('div')
99583                         .attr('class', 'community-more');
99584
99585                     if (d.extendedDescription) {
99586                         more
99587                             .append('div')
99588                             .attr('class', 'community-extended-description')
99589                             .html(t('community.' + d.id + '.extendedDescription', replacements));
99590                     }
99591
99592                     if (d.languageCodes && d.languageCodes.length) {
99593                         more
99594                             .append('div')
99595                             .attr('class', 'community-languages')
99596                             .text(t('success.languages', { languages: d.languageCodes.join(', ') }));
99597                     }
99598                 }
99599
99600
99601                 function showNextEvents(selection) {
99602                     var events = selection
99603                         .append('div')
99604                         .attr('class', 'community-events');
99605
99606                     var item = events.selectAll('.community-event')
99607                         .data(nextEvents);
99608
99609                     var itemEnter = item.enter()
99610                         .append('div')
99611                         .attr('class', 'community-event');
99612
99613                     itemEnter
99614                         .append('div')
99615                         .attr('class', 'community-event-name')
99616                         .append('a')
99617                         .attr('target', '_blank')
99618                         .attr('href', function(d) { return d.url; })
99619                         .text(function(d) {
99620                             var name = d.name;
99621                             if (d.i18n && d.id) {
99622                                 name = t('community.' + communityID + '.events.' + d.id + '.name', { default: name });
99623                             }
99624                             return name;
99625                         });
99626
99627                     itemEnter
99628                         .append('div')
99629                         .attr('class', 'community-event-when')
99630                         .text(function(d) {
99631                             var options = {
99632                                 weekday: 'short', day: 'numeric', month: 'short', year: 'numeric'
99633                             };
99634                             if (d.date.getHours() || d.date.getMinutes()) {   // include time if it has one
99635                                 options.hour = 'numeric';
99636                                 options.minute = 'numeric';
99637                             }
99638                             return d.date.toLocaleString(detected.locale, options);
99639                         });
99640
99641                     itemEnter
99642                         .append('div')
99643                         .attr('class', 'community-event-where')
99644                         .text(function(d) {
99645                             var where = d.where;
99646                             if (d.i18n && d.id) {
99647                                 where = t('community.' + communityID + '.events.' + d.id + '.where', { default: where });
99648                             }
99649                             return where;
99650                         });
99651
99652                     itemEnter
99653                         .append('div')
99654                         .attr('class', 'community-event-description')
99655                         .text(function(d) {
99656                             var description = d.description;
99657                             if (d.i18n && d.id) {
99658                                 description = t('community.' + communityID + '.events.' + d.id + '.description', { default: description });
99659                             }
99660                             return description;
99661                         });
99662                 }
99663
99664
99665                 function linkify(url, text) {
99666                     text = text || url;
99667                     return '<a target="_blank" href="' + url + '">' + text + '</a>';
99668                 }
99669             }
99670
99671
99672             success.changeset = function(_) {
99673                 if (!arguments.length) return _changeset;
99674                 _changeset = _;
99675                 return success;
99676             };
99677
99678
99679             success.location = function(_) {
99680                 if (!arguments.length) return _location;
99681                 _location = _;
99682                 return success;
99683             };
99684
99685
99686             return utilRebind(success, dispatch$1, 'on');
99687         }
99688
99689         var _isSaving = false;
99690
99691
99692         function modeSave(context) {
99693             var mode = { id: 'save' };
99694             var keybinding = utilKeybinding('modeSave');
99695
99696             var loading = uiLoading(context)
99697                 .message(t('save.uploading'))
99698                 .blocking(true);
99699
99700             var commit = uiCommit(context)
99701                 .on('cancel', cancel)
99702                 .on('save', save);
99703
99704             var _toCheck = [];
99705             var _toLoad = [];
99706             var _loaded = {};
99707             var _toLoadCount = 0;
99708             var _toLoadTotal = 0;
99709
99710             var _conflicts = [];
99711             var _errors = [];
99712             var _origChanges;
99713             var _location;
99714
99715
99716             function cancel(selectedID) {
99717                 if (selectedID) {
99718                     context.enter(modeSelect(context, [selectedID]));
99719                 } else {
99720                     context.enter(modeBrowse(context));
99721                 }
99722             }
99723
99724
99725             function save(changeset, tryAgain, checkConflicts) {
99726                 // Guard against accidentally entering save code twice - #4641
99727                 if (_isSaving && !tryAgain) {
99728                     return;
99729                 }
99730
99731                 var osm = context.connection();
99732                 if (!osm) {
99733                     cancel();
99734                     return;
99735                 }
99736
99737                 // If user somehow got logged out mid-save, try to reauthenticate..
99738                 // This can happen if they were logged in from before, but the tokens are no longer valid.
99739                 if (!osm.authenticated()) {
99740                     osm.authenticate(function(err) {
99741                         if (err) {
99742                             cancel();   // quit save mode..
99743                         } else {
99744                             save(changeset, tryAgain, checkConflicts);  // continue where we left off..
99745                         }
99746                     });
99747                     return;
99748                 }
99749
99750                 if (!_isSaving) {
99751                     keybindingOff();
99752                     context.container().call(loading);  // block input
99753                     _isSaving = true;
99754                 }
99755
99756                 var history = context.history();
99757                 var localGraph = context.graph();
99758                 var remoteGraph = coreGraph(history.base(), true);
99759
99760                 _conflicts = [];
99761                 _errors = [];
99762
99763                 // Store original changes, in case user wants to download them as an .osc file
99764                 _origChanges = history.changes(actionDiscardTags(history.difference()));
99765
99766                 // First time, `history.perform` a no-op action.
99767                 // Any conflict resolutions will be done as `history.replace`
99768                 if (!tryAgain) {
99769                     history.perform(actionNoop());
99770                 }
99771
99772                 // Attempt a fast upload.. If there are conflicts, re-enter with `checkConflicts = true`
99773                 if (!checkConflicts) {
99774                     upload(changeset);
99775
99776                 // Do the full (slow) conflict check..
99777                 } else {
99778                     var summary = history.difference().summary();
99779                     _toCheck = [];
99780                     for (var i = 0; i < summary.length; i++) {
99781                         var item = summary[i];
99782                         if (item.changeType === 'modified') {
99783                             _toCheck.push(item.entity.id);
99784                         }
99785                     }
99786
99787                     _toLoad = withChildNodes(_toCheck, localGraph);
99788                     _loaded = {};
99789                     _toLoadCount = 0;
99790                     _toLoadTotal = _toLoad.length;
99791
99792                     if (_toCheck.length) {
99793                         showProgress(_toLoadCount, _toLoadTotal);
99794                         _toLoad.forEach(function(id) { _loaded[id] = false; });
99795                         osm.loadMultiple(_toLoad, loaded);
99796                     } else {
99797                         upload(changeset);
99798                     }
99799                 }
99800
99801                 return;
99802
99803
99804                 function withChildNodes(ids, graph) {
99805                     var s = new Set(ids);
99806                     ids.forEach(function(id) {
99807                         var entity = graph.entity(id);
99808                         if (entity.type !== 'way') return;
99809
99810                         graph.childNodes(entity).forEach(function(child) {
99811                             if (child.version !== undefined) {
99812                                 s.add(child.id);
99813                             }
99814                         });
99815                     });
99816
99817                     return Array.from(s);
99818                 }
99819
99820
99821                 // Reload modified entities into an alternate graph and check for conflicts..
99822                 function loaded(err, result) {
99823                     if (_errors.length) return;
99824
99825                     if (err) {
99826                         _errors.push({
99827                             msg: err.message || err.responseText,
99828                             details: [ t('save.status_code', { code: err.status }) ]
99829                         });
99830                         showErrors();
99831
99832                     } else {
99833                         var loadMore = [];
99834
99835                         result.data.forEach(function(entity) {
99836                             remoteGraph.replace(entity);
99837                             _loaded[entity.id] = true;
99838                             _toLoad = _toLoad.filter(function(val) { return val !== entity.id; });
99839
99840                             if (!entity.visible) return;
99841
99842                             // Because loadMultiple doesn't download /full like loadEntity,
99843                             // need to also load children that aren't already being checked..
99844                             var i, id;
99845                             if (entity.type === 'way') {
99846                                 for (i = 0; i < entity.nodes.length; i++) {
99847                                     id = entity.nodes[i];
99848                                     if (_loaded[id] === undefined) {
99849                                         _loaded[id] = false;
99850                                         loadMore.push(id);
99851                                     }
99852                                 }
99853                             } else if (entity.type === 'relation' && entity.isMultipolygon()) {
99854                                 for (i = 0; i < entity.members.length; i++) {
99855                                     id = entity.members[i].id;
99856                                     if (_loaded[id] === undefined) {
99857                                         _loaded[id] = false;
99858                                         loadMore.push(id);
99859                                     }
99860                                 }
99861                             }
99862                         });
99863
99864                         _toLoadCount += result.data.length;
99865                         _toLoadTotal += loadMore.length;
99866                         showProgress(_toLoadCount, _toLoadTotal);
99867
99868                         if (loadMore.length) {
99869                             _toLoad.push.apply(_toLoad, loadMore);
99870                             osm.loadMultiple(loadMore, loaded);
99871                         }
99872
99873                         if (!_toLoad.length) {
99874                             detectConflicts();
99875                         }
99876                     }
99877                 }
99878
99879
99880                 function detectConflicts() {
99881                     function choice(id, text, action) {
99882                         return { id: id, text: text, action: function() { history.replace(action); } };
99883                     }
99884                     function formatUser(d) {
99885                         return '<a href="' + osm.userURL(d) + '" target="_blank">' + d + '</a>';
99886                     }
99887                     function entityName(entity) {
99888                         return utilDisplayName(entity) || (utilDisplayType(entity.id) + ' ' + entity.id);
99889                     }
99890
99891                     function sameVersions(local, remote) {
99892                         if (local.version !== remote.version) return false;
99893
99894                         if (local.type === 'way') {
99895                             var children = utilArrayUnion(local.nodes, remote.nodes);
99896                             for (var i = 0; i < children.length; i++) {
99897                                 var a = localGraph.hasEntity(children[i]);
99898                                 var b = remoteGraph.hasEntity(children[i]);
99899                                 if (a && b && a.version !== b.version) return false;
99900                             }
99901                         }
99902
99903                         return true;
99904                     }
99905
99906                     _toCheck.forEach(function(id) {
99907                         var local = localGraph.entity(id);
99908                         var remote = remoteGraph.entity(id);
99909
99910                         if (sameVersions(local, remote)) return;
99911
99912                         var action = actionMergeRemoteChanges;
99913                         var merge = action(id, localGraph, remoteGraph, formatUser);
99914
99915                         history.replace(merge);
99916
99917                         var mergeConflicts = merge.conflicts();
99918                         if (!mergeConflicts.length) return;  // merged safely
99919
99920                         var forceLocal = action(id, localGraph, remoteGraph).withOption('force_local');
99921                         var forceRemote = action(id, localGraph, remoteGraph).withOption('force_remote');
99922                         var keepMine = t('save.conflict.' + (remote.visible ? 'keep_local' : 'restore'));
99923                         var keepTheirs = t('save.conflict.' + (remote.visible ? 'keep_remote' : 'delete'));
99924
99925                         _conflicts.push({
99926                             id: id,
99927                             name: entityName(local),
99928                             details: mergeConflicts,
99929                             chosen: 1,
99930                             choices: [
99931                                 choice(id, keepMine, forceLocal),
99932                                 choice(id, keepTheirs, forceRemote)
99933                             ]
99934                         });
99935                     });
99936
99937                     upload(changeset);
99938                 }
99939             }
99940
99941
99942             function upload(changeset) {
99943                 var osm = context.connection();
99944                 if (!osm) {
99945                     _errors.push({ msg: 'No OSM Service' });
99946                 }
99947
99948                 if (_conflicts.length) {
99949                     _conflicts.sort(function(a, b) { return b.id.localeCompare(a.id); });
99950                     showConflicts(changeset);
99951
99952                 } else if (_errors.length) {
99953                     showErrors();
99954
99955                 } else {
99956                     var history = context.history();
99957                     var changes = history.changes(actionDiscardTags(history.difference()));
99958                     if (changes.modified.length || changes.created.length || changes.deleted.length) {
99959                         loadLocation();  // so it is ready when we display the save screen
99960                         osm.putChangeset(changeset, changes, uploadCallback);
99961                     } else {        // changes were insignificant or reverted by user
99962                         d3_select('.inspector-wrap *').remove();
99963                         loading.close();
99964                         _isSaving = false;
99965                         context.flush();
99966                         cancel();
99967                     }
99968                 }
99969             }
99970
99971
99972             function uploadCallback(err, changeset) {
99973                 if (err) {
99974                     if (err.status === 409) {          // 409 Conflict
99975                         save(changeset, true, true);   // tryAgain = true, checkConflicts = true
99976                     } else {
99977                         _errors.push({
99978                             msg: err.message || err.responseText,
99979                             details: [ t('save.status_code', { code: err.status }) ]
99980                         });
99981                         showErrors();
99982                     }
99983
99984                 } else {
99985                     context.history().clearSaved();
99986                     success(changeset);
99987                     // Add delay to allow for postgres replication #1646 #2678
99988                     window.setTimeout(function() {
99989                         d3_select('.inspector-wrap *').remove();
99990                         loading.close();
99991                         _isSaving = false;
99992                         context.flush();
99993                     }, 2500);
99994                 }
99995             }
99996
99997
99998             function showProgress(num, total) {
99999                 var modal = context.container().select('.loading-modal .modal-section');
100000                 var progress = modal.selectAll('.progress')
100001                     .data([0]);
100002
100003                 // enter/update
100004                 progress.enter()
100005                     .append('div')
100006                     .attr('class', 'progress')
100007                     .merge(progress)
100008                     .text(t('save.conflict_progress', { num: num, total: total }));
100009             }
100010
100011
100012             function showConflicts(changeset) {
100013                 var history = context.history();
100014                 var selection = context.container()
100015                     .select('#sidebar')
100016                     .append('div')
100017                     .attr('class','sidebar-component');
100018
100019                 loading.close();
100020                 _isSaving = false;
100021
100022                 var ui = uiConflicts(context)
100023                     .conflictList(_conflicts)
100024                     .origChanges(_origChanges)
100025                     .on('cancel', function() {
100026                         history.pop();
100027                         selection.remove();
100028                         keybindingOn();
100029                     })
100030                     .on('save', function() {
100031                         for (var i = 0; i < _conflicts.length; i++) {
100032                             if (_conflicts[i].chosen === 1) {  // user chose "keep theirs"
100033                                 var entity = context.hasEntity(_conflicts[i].id);
100034                                 if (entity && entity.type === 'way') {
100035                                     var children = utilArrayUniq(entity.nodes);
100036                                     for (var j = 0; j < children.length; j++) {
100037                                         history.replace(actionRevert(children[j]));
100038                                     }
100039                                 }
100040                                 history.replace(actionRevert(_conflicts[i].id));
100041                             }
100042                         }
100043
100044                         selection.remove();
100045                         save(changeset, true, false);  // tryAgain = true, checkConflicts = false
100046                     });
100047
100048                 selection.call(ui);
100049             }
100050
100051
100052             function showErrors() {
100053                 keybindingOn();
100054                 context.history().pop();
100055                 loading.close();
100056                 _isSaving = false;
100057
100058                 var selection = uiConfirm(context.container());
100059                 selection
100060                     .select('.modal-section.header')
100061                     .append('h3')
100062                     .text(t('save.error'));
100063
100064                 addErrors(selection, _errors);
100065                 selection.okButton();
100066             }
100067
100068
100069             function addErrors(selection, data) {
100070                 var message = selection
100071                     .select('.modal-section.message-text');
100072
100073                 var items = message
100074                     .selectAll('.error-container')
100075                     .data(data);
100076
100077                 var enter = items.enter()
100078                     .append('div')
100079                     .attr('class', 'error-container');
100080
100081                 enter
100082                     .append('a')
100083                     .attr('class', 'error-description')
100084                     .attr('href', '#')
100085                     .classed('hide-toggle', true)
100086                     .text(function(d) { return d.msg || t('save.unknown_error_details'); })
100087                     .on('click', function() {
100088                         event.preventDefault();
100089
100090                         var error = d3_select(this);
100091                         var detail = d3_select(this.nextElementSibling);
100092                         var exp = error.classed('expanded');
100093
100094                         detail.style('display', exp ? 'none' : 'block');
100095                         error.classed('expanded', !exp);
100096                     });
100097
100098                 var details = enter
100099                     .append('div')
100100                     .attr('class', 'error-detail-container')
100101                     .style('display', 'none');
100102
100103                 details
100104                     .append('ul')
100105                     .attr('class', 'error-detail-list')
100106                     .selectAll('li')
100107                     .data(function(d) { return d.details || []; })
100108                     .enter()
100109                     .append('li')
100110                     .attr('class', 'error-detail-item')
100111                     .text(function(d) { return d; });
100112
100113                 items.exit()
100114                     .remove();
100115             }
100116
100117
100118             function success(changeset) {
100119                 commit.reset();
100120
100121                 var ui = uiSuccess(context)
100122                     .changeset(changeset)
100123                     .location(_location)
100124                     .on('cancel', function() { context.ui().sidebar.hide(); });
100125
100126                 context.enter(modeBrowse(context).sidebar(ui));
100127             }
100128
100129
100130             function keybindingOn() {
100131                 d3_select(document)
100132                     .call(keybinding.on('⎋', cancel, true));
100133             }
100134
100135
100136             function keybindingOff() {
100137                 d3_select(document)
100138                     .call(keybinding.unbind);
100139             }
100140
100141
100142             // Reverse geocode current map location so we can display a message on
100143             // the success screen like "Thank you for editing around place, region."
100144             function loadLocation() {
100145                 _location = null;
100146                 if (!services$1.geocoder) return;
100147
100148                 services$1.geocoder.reverse(context.map().center(), function(err, result) {
100149                     if (err || !result || !result.address) return;
100150
100151                     var addr = result.address;
100152                     var place = (addr && (addr.town || addr.city || addr.county)) || '';
100153                     var region = (addr && (addr.state || addr.country)) || '';
100154                     var separator = (place && region) ? t('success.thank_you_where.separator') : '';
100155
100156                     _location = t('success.thank_you_where.format',
100157                         { place: place, separator: separator, region: region }
100158                     );
100159                 });
100160             }
100161
100162
100163             mode.enter = function() {
100164                 // Show sidebar
100165                 context.ui().sidebar.expand();
100166
100167                 function done() {
100168                     context.ui().sidebar.show(commit);
100169                 }
100170
100171                 keybindingOn();
100172
100173                 context.container().selectAll('#content')
100174                     .attr('class', 'inactive');
100175
100176                 var osm = context.connection();
100177                 if (!osm) {
100178                     cancel();
100179                     return;
100180                 }
100181
100182                 if (osm.authenticated()) {
100183                     done();
100184                 } else {
100185                     osm.authenticate(function(err) {
100186                         if (err) {
100187                             cancel();
100188                         } else {
100189                             done();
100190                         }
100191                     });
100192                 }
100193             };
100194
100195
100196             mode.exit = function() {
100197                 _isSaving = false;
100198
100199                 keybindingOff();
100200
100201                 context.container().selectAll('#content')
100202                     .attr('class', 'active');
100203
100204                 context.ui().sidebar.hide();
100205             };
100206
100207             return mode;
100208         }
100209
100210         function uiToolOldDrawModes(context) {
100211
100212             var tool = {
100213                 id: 'old_modes',
100214                 label: t('toolbar.add_feature')
100215             };
100216
100217             var modes = [
100218                 modeAddPoint(context, {
100219                     title: t('modes.add_point.title'),
100220                     button: 'point',
100221                     description: t('modes.add_point.description'),
100222                     preset: context.presets().item('point'),
100223                     key: '1'
100224                 }),
100225                 modeAddLine(context, {
100226                     title: t('modes.add_line.title'),
100227                     button: 'line',
100228                     description: t('modes.add_line.description'),
100229                     preset: context.presets().item('line'),
100230                     key: '2'
100231                 }),
100232                 modeAddArea(context, {
100233                     title: t('modes.add_area.title'),
100234                     button: 'area',
100235                     description: t('modes.add_area.description'),
100236                     preset: context.presets().item('area'),
100237                     key: '3'
100238                 })
100239             ];
100240
100241
100242             function enabled() {
100243                 return osmEditable();
100244             }
100245
100246             function osmEditable() {
100247                 var mode = context.mode();
100248                 return context.editable() && mode && mode.id !== 'save';
100249             }
100250
100251             modes.forEach(function(mode) {
100252                 context.keybinding().on(mode.key, function() {
100253                     if (!enabled(mode)) return;
100254
100255                     if (mode.id === context.mode().id) {
100256                         context.enter(modeBrowse(context));
100257                     } else {
100258                         context.enter(mode);
100259                     }
100260                 });
100261             });
100262
100263             tool.render = function(selection) {
100264
100265                 var wrap = selection
100266                     .append('div')
100267                     .attr('class', 'joined')
100268                     .style('display', 'flex');
100269
100270                 context
100271                     .on('enter.editor', function(entered) {
100272                         selection.selectAll('button.add-button')
100273                             .classed('active', function(mode) { return entered.button === mode.button; });
100274                         context.container()
100275                             .classed('mode-' + entered.id, true);
100276                     });
100277
100278                 context
100279                     .on('exit.editor', function(exited) {
100280                         context.container()
100281                             .classed('mode-' + exited.id, false);
100282                     });
100283
100284
100285                 var debouncedUpdate = debounce(update, 500, { leading: true, trailing: true });
100286
100287                 context.map()
100288                     .on('move.modes', debouncedUpdate)
100289                     .on('drawn.modes', debouncedUpdate);
100290
100291                 context
100292                     .on('enter.modes', update);
100293
100294                 update();
100295
100296
100297                 function update() {
100298
100299                     var buttons = wrap.selectAll('button.add-button')
100300                         .data(modes, function(d) { return d.id; });
100301
100302                     // exit
100303                     buttons.exit()
100304                         .remove();
100305
100306                     // enter
100307                     var buttonsEnter = buttons.enter()
100308                         .append('button')
100309                         .attr('tabindex', -1)
100310                         .attr('class', function(d) { return d.id + ' add-button bar-button'; })
100311                         .on('click.mode-buttons', function(d) {
100312                             if (!enabled(d)) return;
100313
100314                             // When drawing, ignore accidental clicks on mode buttons - #4042
100315                             var currMode = context.mode().id;
100316                             if (/^draw/.test(currMode)) return;
100317
100318                             if (d.id === currMode) {
100319                                 context.enter(modeBrowse(context));
100320                             } else {
100321                                 context.enter(d);
100322                             }
100323                         })
100324                         .call(tooltip()
100325                             .placement('bottom')
100326                             .html(true)
100327                             .title(function(d) { return uiTooltipHtml(d.description, d.key); })
100328                         );
100329
100330                     buttonsEnter
100331                         .each(function(d) {
100332                             d3_select(this)
100333                                 .call(svgIcon('#iD-icon-' + d.button));
100334                         });
100335
100336                     buttonsEnter
100337                         .append('span')
100338                         .attr('class', 'label')
100339                         .text(function(mode) { return mode.title; });
100340
100341                     // if we are adding/removing the buttons, check if toolbar has overflowed
100342                     if (buttons.enter().size() || buttons.exit().size()) {
100343                         context.ui().checkOverflow('#bar', true);
100344                     }
100345
100346                     // update
100347                     buttons = buttons
100348                         .merge(buttonsEnter)
100349                         .classed('disabled', function(d) { return !enabled(d); });
100350                 }
100351             };
100352
100353             return tool;
100354         }
100355
100356         function uiToolNotes(context) {
100357
100358             var tool = {
100359                 id: 'notes',
100360                 label: t('modes.add_note.label')
100361             };
100362
100363             var mode = modeAddNote(context);
100364
100365             function enabled() {
100366                 return notesEnabled() && notesEditable();
100367             }
100368
100369             function notesEnabled() {
100370                 var noteLayer = context.layers().layer('notes');
100371                 return noteLayer && noteLayer.enabled();
100372             }
100373
100374             function notesEditable() {
100375                 var mode = context.mode();
100376                 return context.map().notesEditable() && mode && mode.id !== 'save';
100377             }
100378
100379             context.keybinding().on(mode.key, function() {
100380                 if (!enabled(mode)) return;
100381
100382                 if (mode.id === context.mode().id) {
100383                     context.enter(modeBrowse(context));
100384                 } else {
100385                     context.enter(mode);
100386                 }
100387             });
100388
100389             tool.render = function(selection) {
100390
100391                 context
100392                     .on('enter.editor.notes', function(entered) {
100393                         selection.selectAll('button.add-button')
100394                             .classed('active', function(mode) { return entered.button === mode.button; });
100395                         context.container()
100396                             .classed('mode-' + entered.id, true);
100397                     });
100398
100399                 context
100400                     .on('exit.editor.notes', function(exited) {
100401                         context.container()
100402                             .classed('mode-' + exited.id, false);
100403                     });
100404
100405
100406                 var debouncedUpdate = debounce(update, 500, { leading: true, trailing: true });
100407
100408                 context.map()
100409                     .on('move.notes', debouncedUpdate)
100410                     .on('drawn.notes', debouncedUpdate);
100411
100412                 context
100413                     .on('enter.notes', update);
100414
100415                 update();
100416
100417
100418                 function update() {
100419                     var showNotes = notesEnabled();
100420                     var data = showNotes ? [mode] : [];
100421
100422                     var buttons = selection.selectAll('button.add-button')
100423                         .data(data, function(d) { return d.id; });
100424
100425                     // exit
100426                     buttons.exit()
100427                         .remove();
100428
100429                     // enter
100430                     var buttonsEnter = buttons.enter()
100431                         .append('button')
100432                         .attr('tabindex', -1)
100433                         .attr('class', function(d) { return d.id + ' add-button bar-button'; })
100434                         .on('click.notes', function(d) {
100435                             if (!enabled(d)) return;
100436
100437                             // When drawing, ignore accidental clicks on mode buttons - #4042
100438                             var currMode = context.mode().id;
100439                             if (/^draw/.test(currMode)) return;
100440
100441                             if (d.id === currMode) {
100442                                 context.enter(modeBrowse(context));
100443                             } else {
100444                                 context.enter(d);
100445                             }
100446                         })
100447                         .call(tooltip()
100448                             .placement('bottom')
100449                             .html(true)
100450                             .title(function(d) { return uiTooltipHtml(d.description, d.key); })
100451                         );
100452
100453                     buttonsEnter
100454                         .each(function(d) {
100455                             d3_select(this)
100456                                 .call(svgIcon(d.icon || '#iD-icon-' + d.button));
100457                         });
100458
100459                     // if we are adding/removing the buttons, check if toolbar has overflowed
100460                     if (buttons.enter().size() || buttons.exit().size()) {
100461                         context.ui().checkOverflow('#bar', true);
100462                     }
100463
100464                     // update
100465                     buttons = buttons
100466                         .merge(buttonsEnter)
100467                         .classed('disabled', function(d) { return !enabled(d); });
100468                 }
100469             };
100470
100471             tool.uninstall = function() {
100472                 context
100473                     .on('enter.editor.notes', null)
100474                     .on('exit.editor.notes', null)
100475                     .on('enter.notes', null);
100476
100477                 context.map()
100478                     .on('move.notes', null)
100479                     .on('drawn.notes', null);
100480             };
100481
100482             return tool;
100483         }
100484
100485         function uiToolSave(context) {
100486
100487             var tool = {
100488                 id: 'save',
100489                 label: t('save.title')
100490             };
100491
100492             var button = null;
100493             var tooltipBehavior = null;
100494             var history = context.history();
100495             var key = uiCmd('⌘S');
100496             var _numChanges = 0;
100497
100498             function isSaving() {
100499                 var mode = context.mode();
100500                 return mode && mode.id === 'save';
100501             }
100502
100503             function isDisabled() {
100504                 return _numChanges === 0 || isSaving();
100505             }
100506
100507             function save() {
100508                 event.preventDefault();
100509                 if (!context.inIntro() && !isSaving() && history.hasChanges()) {
100510                     context.enter(modeSave(context));
100511                 }
100512             }
100513
100514             function bgColor() {
100515                 var step;
100516                 if (_numChanges === 0) {
100517                     return null;
100518                 } else if (_numChanges <= 50) {
100519                     step = _numChanges / 50;
100520                     return d3_interpolateRgb('#fff', '#ff8')(step);  // white -> yellow
100521                 } else {
100522                     step = Math.min((_numChanges - 50) / 50, 1.0);
100523                     return d3_interpolateRgb('#ff8', '#f88')(step);  // yellow -> red
100524                 }
100525             }
100526
100527
100528             function updateCount() {
100529                 var val = history.difference().summary().length;
100530                 if (val === _numChanges) return;
100531                 _numChanges = val;
100532
100533                 if (tooltipBehavior) {
100534                     tooltipBehavior
100535                         .title(uiTooltipHtml(
100536                             t(_numChanges > 0 ? 'save.help' : 'save.no_changes'), key)
100537                         );
100538                 }
100539
100540                 if (button) {
100541                     button
100542                         .classed('disabled', isDisabled())
100543                         .style('background', bgColor(_numChanges));
100544
100545                     button.select('span.count')
100546                         .text(_numChanges);
100547                 }
100548             }
100549
100550
100551             tool.render = function(selection) {
100552                 tooltipBehavior = tooltip()
100553                     .placement('bottom')
100554                     .html(true)
100555                     .title(uiTooltipHtml(t('save.no_changes'), key));
100556
100557                 button = selection
100558                     .append('button')
100559                     .attr('class', 'save disabled bar-button')
100560                     .attr('tabindex', -1)
100561                     .on('click', save)
100562                     .call(tooltipBehavior);
100563
100564                 button
100565                     .call(svgIcon('#iD-icon-save'));
100566
100567                 button
100568                     .append('span')
100569                     .attr('class', 'count')
100570                     .text('0');
100571
100572                 updateCount();
100573
100574
100575                 context.keybinding()
100576                     .on(key, save, true);
100577
100578
100579                 context.history()
100580                     .on('change.save', updateCount);
100581
100582                 context
100583                     .on('enter.save', function() {
100584                         if (button) {
100585                             button
100586                                 .classed('disabled', isDisabled());
100587
100588                             if (isSaving()) {
100589                                 button.call(tooltipBehavior.hide);
100590                             }
100591                         }
100592                     });
100593             };
100594
100595
100596             tool.uninstall = function() {
100597                 context.keybinding()
100598                     .off(key, true);
100599
100600                 context.history()
100601                     .on('change.save', null);
100602
100603                 context
100604                     .on('enter.save', null);
100605
100606                 button = null;
100607                 tooltipBehavior = null;
100608             };
100609
100610             return tool;
100611         }
100612
100613         function uiToolSidebarToggle(context) {
100614
100615             var tool = {
100616                 id: 'sidebar_toggle',
100617                 label: t('toolbar.inspect')
100618             };
100619
100620             tool.render = function(selection) {
100621                 selection
100622                     .append('button')
100623                     .attr('class', 'bar-button')
100624                     .attr('tabindex', -1)
100625                     .on('click', function() {
100626                         context.ui().sidebar.toggle();
100627                     })
100628                     .call(tooltip()
100629                         .placement('bottom')
100630                         .html(true)
100631                         .title(uiTooltipHtml(t('sidebar.tooltip'), t('sidebar.key')))
100632                     )
100633                     .call(svgIcon('#iD-icon-sidebar-' + (textDirection === 'rtl' ? 'right' : 'left')));
100634             };
100635
100636             return tool;
100637         }
100638
100639         function uiToolUndoRedo(context) {
100640
100641             var tool = {
100642                 id: 'undo_redo',
100643                 label: t('toolbar.undo_redo')
100644             };
100645
100646             var commands = [{
100647                 id: 'undo',
100648                 cmd: uiCmd('⌘Z'),
100649                 action: function() { if (editable()) context.undo(); },
100650                 annotation: function() { return context.history().undoAnnotation(); }
100651             }, {
100652                 id: 'redo',
100653                 cmd: uiCmd('⌘⇧Z'),
100654                 action: function() { if (editable()) context.redo(); },
100655                 annotation: function() { return context.history().redoAnnotation(); }
100656             }];
100657
100658
100659             function editable() {
100660                 var mode = context.mode();
100661                 return context.editable() && mode && mode.id !== 'save';
100662             }
100663
100664
100665             tool.render = function(selection) {
100666                 var tooltipBehavior = tooltip()
100667                     .placement('bottom')
100668                     .html(true)
100669                     .title(function (d) {
100670                         return uiTooltipHtml(d.annotation() ?
100671                             t(d.id + '.tooltip', {action: d.annotation()}) :
100672                             t(d.id + '.nothing'), d.cmd);
100673                     });
100674
100675                 var buttons = selection.selectAll('button')
100676                     .data(commands)
100677                     .enter()
100678                     .append('button')
100679                     .attr('class', function(d) { return 'disabled ' + d.id + '-button bar-button'; })
100680                     .on('click', function(d) { return d.action(); })
100681                     .call(tooltipBehavior);
100682
100683                 buttons.each(function(d) {
100684                     var iconName = d.id;
100685                     if (textDirection === 'rtl') {
100686                         if (iconName === 'undo') {
100687                             iconName = 'redo';
100688                         } else if (iconName === 'redo') {
100689                             iconName = 'undo';
100690                         }
100691                     }
100692                     d3_select(this)
100693                         .call(svgIcon('#iD-icon-' + iconName));
100694                 });
100695
100696                 context.keybinding()
100697                     .on(commands[0].cmd, function() { event.preventDefault(); commands[0].action(); })
100698                     .on(commands[1].cmd, function() { event.preventDefault(); commands[1].action(); });
100699
100700
100701                 var debouncedUpdate = debounce(update, 500, { leading: true, trailing: true });
100702
100703                 context.map()
100704                     .on('move.undo_redo', debouncedUpdate)
100705                     .on('drawn.undo_redo', debouncedUpdate);
100706
100707                 context.history()
100708                     .on('change.undo_redo', function(difference) {
100709                         if (difference) update();
100710                     });
100711
100712                 context
100713                     .on('enter.undo_redo', update);
100714
100715
100716                 function update() {
100717                     buttons
100718                         .property('disabled', !editable())
100719                         .classed('disabled', function(d) {
100720                             return !editable() || !d.annotation();
100721                         })
100722                         .each(function() {
100723                             var selection = d3_select(this);
100724                             if (selection.property('tooltipVisible')) {
100725                                 selection.call(tooltipBehavior.show);
100726                             }
100727                         });
100728                 }
100729             };
100730
100731             tool.uninstall = function() {
100732                 context.keybinding()
100733                     .off(commands[0].cmd)
100734                     .off(commands[1].cmd);
100735
100736                 context.map()
100737                     .on('move.undo_redo', null)
100738                     .on('drawn.undo_redo', null);
100739
100740                 context.history()
100741                     .on('change.undo_redo', null);
100742
100743                 context
100744                     .on('enter.undo_redo', null);
100745             };
100746
100747             return tool;
100748         }
100749
100750         function uiTopToolbar(context) {
100751
100752             var sidebarToggle = uiToolSidebarToggle(context),
100753                 modes = uiToolOldDrawModes(context),
100754                 //searchAdd = uiToolSearchAdd(context),
100755                 //addFavorite = uiToolAddFavorite(context),
100756                 //addRecent = uiToolAddRecent(context),
100757                 notes = uiToolNotes(context),
100758                 undoRedo = uiToolUndoRedo(context),
100759                 save = uiToolSave(context);
100760
100761             function notesEnabled() {
100762                 var noteLayer = context.layers().layer('notes');
100763                 return noteLayer && noteLayer.enabled();
100764             }
100765
100766             function topToolbar(bar) {
100767
100768                 var debouncedUpdate = debounce(update, 500, { leading: true, trailing: true });
100769                 context.layers()
100770                     .on('change.topToolbar', debouncedUpdate);
100771
100772                 context.presets()
100773                     .on('favoritePreset.topToolbar', update)
100774                     .on('recentsChange.topToolbar', update);
100775
100776                 update();
100777
100778                 function update() {
100779
100780                     var tools = [
100781                         sidebarToggle,
100782                         'spacer',
100783                         modes
100784                     //    searchAdd
100785                     ];
100786                     /*
100787                     if (context.presets().getFavorites().length > 0) {
100788                         tools.push(addFavorite);
100789                     }
100790
100791                     if (addRecent.shouldShow()) {
100792                         tools.push(addRecent);
100793                     }*/
100794
100795                     tools.push('spacer');
100796
100797                     if (notesEnabled()) {
100798                         tools = tools.concat([notes, 'spacer']);
100799                     }
100800
100801                     tools = tools.concat([undoRedo, save]);
100802
100803                     var toolbarItems = bar.selectAll('.toolbar-item')
100804                         .data(tools, function(d) {
100805                             return d.id || d;
100806                         });
100807
100808                     toolbarItems.exit()
100809                         .each(function(d) {
100810                             if (d.uninstall) {
100811                                 d.uninstall();
100812                             }
100813                         })
100814                         .remove();
100815
100816                     var itemsEnter = toolbarItems
100817                         .enter()
100818                         .append('div')
100819                         .attr('class', function(d) {
100820                             var classes = 'toolbar-item ' + (d.id || d).replace('_', '-');
100821                             if (d.klass) classes += ' ' + d.klass;
100822                             return classes;
100823                         });
100824
100825                     var actionableItems = itemsEnter.filter(function(d) { return d !== 'spacer'; });
100826
100827                     actionableItems
100828                         .append('div')
100829                         .attr('class', 'item-content')
100830                         .each(function(d) {
100831                             d3_select(this).call(d.render, bar);
100832                         });
100833
100834                     actionableItems
100835                         .append('div')
100836                         .attr('class', 'item-label')
100837                         .text(function(d) {
100838                             return d.label;
100839                         });
100840                 }
100841
100842             }
100843
100844             return topToolbar;
100845         }
100846
100847         // these are module variables so they are preserved through a ui.restart()
100848         var sawVersion = null;
100849         var isNewVersion = false;
100850         var isNewUser = false;
100851
100852
100853         function uiVersion(context) {
100854
100855             var currVersion = context.version;
100856             var matchedVersion = currVersion.match(/\d+\.\d+\.\d+.*/);
100857
100858             if (sawVersion === null && matchedVersion !== null) {
100859                 isNewVersion = (context.storage('sawVersion') !== currVersion);
100860                 isNewUser = !context.storage('sawSplash');
100861                 context.storage('sawVersion', currVersion);
100862                 sawVersion = currVersion;
100863             }
100864
100865             return function(selection) {
100866                 selection
100867                     .append('a')
100868                     .attr('target', '_blank')
100869                     .attr('tabindex', -1)
100870                     .attr('href', 'https://github.com/openstreetmap/iD')
100871                     .text(currVersion);
100872
100873                 // only show new version indicator to users that have used iD before
100874                 if (isNewVersion && !isNewUser) {
100875                     selection
100876                         .append('div')
100877                         .attr('class', 'badge')
100878                         .append('a')
100879                         .attr('target', '_blank')
100880                         .attr('tabindex', -1)
100881                         .attr('href', 'https://github.com/openstreetmap/iD/blob/master/CHANGELOG.md#whats-new')
100882                         .call(svgIcon('#maki-gift-11'))
100883                         .call(tooltip()
100884                             .title(t('version.whats_new', { version: currVersion }))
100885                             .placement('top')
100886                         );
100887                 }
100888             };
100889         }
100890
100891         function uiZoom(context) {
100892             var zooms = [{
100893                 id: 'zoom-in',
100894                 icon: 'plus',
100895                 title: t('zoom.in'),
100896                 action: context.zoomIn,
100897                 key: '+'
100898             }, {
100899                 id: 'zoom-out',
100900                 icon: 'minus',
100901                 title: t('zoom.out'),
100902                 action: context.zoomOut,
100903                 key: '-'
100904             }];
100905
100906
100907             function zoomIn() {
100908                 event.preventDefault();
100909                 context.zoomIn();
100910             }
100911
100912
100913             function zoomOut() {
100914                 event.preventDefault();
100915                 context.zoomOut();
100916             }
100917
100918
100919             function zoomInFurther() {
100920                 event.preventDefault();
100921                 context.zoomInFurther();
100922             }
100923
100924
100925             function zoomOutFurther() {
100926                 event.preventDefault();
100927                 context.zoomOutFurther();
100928             }
100929
100930
100931             return function(selection) {
100932                 var button = selection.selectAll('button')
100933                     .data(zooms)
100934                     .enter()
100935                     .append('button')
100936                     .attr('tabindex', -1)
100937                     .attr('class', function(d) { return d.id; })
100938                     .on('click.editor', function(d) { d.action(); })
100939                     .call(tooltip()
100940                         .placement((textDirection === 'rtl') ? 'right' : 'left')
100941                         .html(true)
100942                         .title(function(d) {
100943                             return uiTooltipHtml(d.title, d.key);
100944                         })
100945                     );
100946
100947                 button.each(function(d) {
100948                     d3_select(this)
100949                         .call(svgIcon('#iD-icon-' + d.icon, 'light'));
100950                 });
100951
100952                 ['plus', 'ffplus', '=', 'ffequals'].forEach(function(key) {
100953                     context.keybinding().on([key], zoomIn);
100954                     context.keybinding().on([uiCmd('⌘' + key)], zoomInFurther);
100955                 });
100956
100957                 ['_', '-', 'ffminus', 'dash'].forEach(function(key) {
100958                     context.keybinding().on([key], zoomOut);
100959                     context.keybinding().on([uiCmd('⌘' + key)], zoomOutFurther);
100960                 });
100961             };
100962         }
100963
100964         function uiInit(context) {
100965             var _initCounter = 0;
100966             var _initCallback;
100967             var _needWidth = {};
100968
100969
100970             function render(container) {
100971                 container
100972                     .attr('dir', textDirection);
100973
100974                 // setup fullscreen keybindings (no button shown at this time)
100975                 container
100976                     .call(uiFullScreen(context));
100977
100978                 var map = context.map();
100979                 map.redrawEnable(false);  // don't draw until we've set zoom/lat/long
100980
100981                 container
100982                     .append('svg')
100983                     .attr('id', 'defs')
100984                     .call(svgDefs(context));
100985
100986                 container
100987                     .append('div')
100988                     .attr('id', 'sidebar')
100989                     .call(ui.sidebar);
100990
100991                 var content = container
100992                     .append('div')
100993                     .attr('id', 'content')
100994                     .attr('class', 'active');
100995
100996                 // Top toolbar
100997                 content
100998                     .append('div')
100999                     .attr('id', 'bar')
101000                     .attr('class', 'fillD')
101001                     .call(uiTopToolbar(context));
101002
101003                 content
101004                     .append('div')
101005                     .attr('id', 'map')
101006                     .attr('dir', 'ltr')
101007                     .call(map);
101008
101009
101010                 // Map controls
101011                 var controls = content
101012                     .append('div')
101013                     .attr('class', 'map-controls');
101014
101015                 controls
101016                     .append('div')
101017                     .attr('class', 'map-control zoombuttons')
101018                     .call(uiZoom(context));
101019
101020                 controls
101021                     .append('div')
101022                     .attr('class', 'map-control geolocate-control')
101023                     .call(uiGeolocate(context));
101024
101025                 var background = uiBackground(context);
101026                 controls
101027                     .append('div')
101028                     .attr('class', 'map-control background-control')
101029                     .call(background.renderToggleButton);
101030
101031                 var mapData = uiMapData(context);
101032                 controls
101033                     .append('div')
101034                     .attr('class', 'map-control map-data-control')
101035                     .call(mapData.renderToggleButton);
101036
101037                 var issues = uiIssues(context);
101038                 controls
101039                     .append('div')
101040                     .attr('class', 'map-control map-issues-control')
101041                     .call(issues.renderToggleButton);
101042
101043                 var help = uiHelp(context);
101044                 controls
101045                     .append('div')
101046                     .attr('class', 'map-control help-control')
101047                     .call(help.renderToggleButton);
101048
101049                 content
101050                     .append('div')
101051                     .attr('class', 'spinner')
101052                     .call(uiSpinner(context));
101053
101054                 // Add attribution and footer
101055                 var about = content
101056                     .append('div')
101057                     .attr('id', 'about');
101058
101059                 about
101060                     .append('div')
101061                     .attr('id', 'attrib')
101062                     .attr('dir', 'ltr')
101063                     .call(uiAttribution(context));
101064
101065                 about
101066                     .append('div')
101067                     .attr('class', 'api-status')
101068                     .call(uiStatus(context));
101069
101070
101071                 var footer = about
101072                     .append('div')
101073                     .attr('id', 'footer')
101074                     .attr('class', 'fillD');
101075
101076                 footer
101077                     .append('div')
101078                     .attr('id', 'flash-wrap')
101079                     .attr('class', 'footer-hide');
101080
101081                 var footerWrap = footer
101082                     .append('div')
101083                     .attr('id', 'footer-wrap')
101084                     .attr('class', 'footer-show');
101085
101086                 footerWrap
101087                     .append('div')
101088                     .attr('id', 'scale-block')
101089                     .call(uiScale(context));
101090
101091                 var aboutList = footerWrap
101092                     .append('div')
101093                     .attr('id', 'info-block')
101094                     .append('ul')
101095                     .attr('id', 'about-list');
101096
101097                 if (!context.embed()) {
101098                     aboutList
101099                         .call(uiAccount(context));
101100                 }
101101
101102                 aboutList
101103                     .append('li')
101104                     .attr('class', 'version')
101105                     .call(uiVersion(context));
101106
101107                 var issueLinks = aboutList
101108                     .append('li');
101109
101110                 issueLinks
101111                     .append('a')
101112                     .attr('target', '_blank')
101113                     .attr('tabindex', -1)
101114                     .attr('href', 'https://github.com/openstreetmap/iD/issues')
101115                     .call(svgIcon('#iD-icon-bug', 'light'))
101116                     .call(tooltip().title(t('report_a_bug')).placement('top'));
101117
101118                 issueLinks
101119                     .append('a')
101120                     .attr('target', '_blank')
101121                     .attr('tabindex', -1)
101122                     .attr('href', 'https://github.com/openstreetmap/iD/blob/master/CONTRIBUTING.md#translating')
101123                     .call(svgIcon('#iD-icon-translate', 'light'))
101124                     .call(tooltip().title(t('help_translate')).placement('top'));
101125
101126                 aboutList
101127                     .append('li')
101128                     .attr('class', 'feature-warning')
101129                     .attr('tabindex', -1)
101130                     .call(uiFeatureInfo(context));
101131
101132                 aboutList
101133                     .append('li')
101134                     .attr('class', 'user-list')
101135                     .attr('tabindex', -1)
101136                     .call(uiContributors(context));
101137
101138
101139                 // Setup map dimensions and move map to initial center/zoom.
101140                 // This should happen after #content and toolbars exist.
101141                 ui.onResize();
101142                 map.redrawEnable(true);
101143
101144                 var hash = behaviorHash(context);
101145                 hash();
101146                 if (!hash.hadHash) {
101147                     map.centerZoom([0, 0], 2);
101148                 }
101149
101150
101151                 var overMap = content
101152                     .append('div')
101153                     .attr('class', 'over-map');
101154
101155                 // Add panes
101156                 // This should happen after map is initialized, as some require surface()
101157                 var panes = overMap
101158                     .append('div')
101159                     .attr('class', 'map-panes');
101160
101161                 panes
101162                     .call(background.renderPane)
101163                     .call(mapData.renderPane)
101164                     .call(issues.renderPane)
101165                     .call(help.renderPane);
101166
101167                 // Add absolutely-positioned elements that sit on top of the map
101168                 // This should happen after the map is ready (center/zoom)
101169                 overMap
101170                     .call(uiMapInMap(context))
101171                     .call(uiInfo(context))
101172                     .call(uiNotice(context));
101173
101174
101175                 overMap
101176                     .append('div')
101177                     .attr('id', 'photoviewer')
101178                     .classed('al', true)       // 'al'=left,  'ar'=right
101179                     .classed('hide', true)
101180                     .call(ui.photoviewer);
101181
101182
101183                 // Bind events
101184                 window.onbeforeunload = function() {
101185                     return context.save();
101186                 };
101187                 window.onunload = function() {
101188                     context.history().unlock();
101189                 };
101190
101191                 d3_select(window)
101192                     .on('gesturestart.editor', eventCancel)
101193                     .on('gesturechange.editor', eventCancel)
101194                     .on('gestureend.editor', eventCancel)
101195                     .on('resize.editor', ui.onResize);
101196
101197
101198                 var panPixels = 80;
101199                 context.keybinding()
101200                     .on('⌫', function() { event.preventDefault(); })
101201                     .on([t('sidebar.key'), '`', '²'], ui.sidebar.toggle)   // #5663 - common QWERTY, AZERTY
101202                     .on('←', pan([panPixels, 0]))
101203                     .on('↑', pan([0, panPixels]))
101204                     .on('→', pan([-panPixels, 0]))
101205                     .on('↓', pan([0, -panPixels]))
101206                     .on(['⇧←', uiCmd('⌘←')], pan([map.dimensions()[0], 0]))
101207                     .on(['⇧↑', uiCmd('⌘↑')], pan([0, map.dimensions()[1]]))
101208                     .on(['⇧→', uiCmd('⌘→')], pan([-map.dimensions()[0], 0]))
101209                     .on(['⇧↓', uiCmd('⌘↓')], pan([0, -map.dimensions()[1]]));
101210
101211                 context.enter(modeBrowse(context));
101212
101213                 if (!_initCounter++) {
101214                     if (!hash.startWalkthrough) {
101215                         context.container()
101216                             .call(uiSplash(context))
101217                             .call(uiRestore(context));
101218                     }
101219
101220                     context.container()
101221                         .call(uiShortcuts(context));
101222                 }
101223
101224                 var osm = context.connection();
101225                 var auth = uiLoading(context).message(t('loading_auth')).blocking(true);
101226
101227                 if (osm && auth) {
101228                     osm
101229                         .on('authLoading.ui', function() {
101230                             context.container()
101231                                 .call(auth);
101232                         })
101233                         .on('authDone.ui', function() {
101234                             auth.close();
101235                         });
101236                 }
101237
101238                 _initCounter++;
101239
101240                 if (hash.startWalkthrough) {
101241                     hash.startWalkthrough = false;
101242                     context.container().call(uiIntro(context));
101243                 }
101244
101245
101246                 function pan(d) {
101247                     return function() {
101248                         if (d3_select('.combobox').size()) return;
101249                         event.preventDefault();
101250                         context.pan(d, 100);
101251                     };
101252                 }
101253
101254                 function eventCancel() {
101255                     event.preventDefault();
101256                 }
101257             }
101258
101259
101260             function ui(node, callback) {
101261                 _initCallback = callback;
101262                 var container = d3_select(node);
101263                 context.container(container);
101264                 context.loadLocale(function(err) {
101265                     if (!err) {
101266                         render(container);
101267                     }
101268                     if (callback) {
101269                         callback(err);
101270                     }
101271                 });
101272             }
101273
101274
101275             ui.restart = function(arg) {
101276                 context.keybinding().clear();
101277                 context.locale(arg);
101278                 context.loadLocale(function(err) {
101279                     if (!err) {
101280                         context.container().selectAll('*').remove();
101281                         render(context.container());
101282                         if (_initCallback) _initCallback();
101283                     }
101284                 });
101285             };
101286
101287
101288             ui.sidebar = uiSidebar(context);
101289
101290             ui.photoviewer = uiPhotoviewer(context);
101291
101292             ui.onResize = function(withPan) {
101293                 var map = context.map();
101294
101295                 // Recalc dimensions of map and sidebar.. (`true` = force recalc)
101296                 // This will call `getBoundingClientRect` and trigger reflow,
101297                 //  but the values will be cached for later use.
101298                 var mapDimensions = utilGetDimensions(d3_select('#content'), true);
101299                 utilGetDimensions(d3_select('#sidebar'), true);
101300
101301                 if (withPan !== undefined) {
101302                     map.redrawEnable(false);
101303                     map.pan(withPan);
101304                     map.redrawEnable(true);
101305                 }
101306                 map.dimensions(mapDimensions);
101307
101308                 ui.photoviewer.onMapResize();
101309
101310                 // check if header or footer have overflowed
101311                 ui.checkOverflow('#bar');
101312                 ui.checkOverflow('#footer');
101313
101314                 // Use outdated code so it works on Explorer
101315                 var resizeWindowEvent = document.createEvent('Event');
101316
101317                 resizeWindowEvent.initEvent('resizeWindow', true, true);
101318
101319                 document.dispatchEvent(resizeWindowEvent);
101320             };
101321
101322
101323             // Call checkOverflow when resizing or whenever the contents change.
101324             ui.checkOverflow = function(selector, reset) {
101325                 if (reset) {
101326                     delete _needWidth[selector];
101327                 }
101328
101329                 var element = d3_select(selector);
101330                 var scrollWidth = element.property('scrollWidth');
101331                 var clientWidth = element.property('clientWidth');
101332                 var needed = _needWidth[selector] || scrollWidth;
101333
101334                 if (scrollWidth > clientWidth) {    // overflow happening
101335                     element.classed('narrow', true);
101336                     if (!_needWidth[selector]) {
101337                         _needWidth[selector] = scrollWidth;
101338                     }
101339
101340                 } else if (scrollWidth >= needed) {
101341                     element.classed('narrow', false);
101342                 }
101343             };
101344
101345             ui.togglePanes = function(showPane) {
101346                 var shownPanes = d3_selectAll('.map-pane.shown');
101347
101348                 var side = textDirection === 'ltr' ? 'right' : 'left';
101349
101350                 shownPanes
101351                     .classed('shown', false);
101352
101353                 d3_selectAll('.map-control button')
101354                     .classed('active', false);
101355
101356                 if (showPane) {
101357                     shownPanes
101358                         .style('display', 'none')
101359                         .style(side, '-500px');
101360
101361                     d3_selectAll('.' + showPane.attr('pane') + '-control button')
101362                         .classed('active', true);
101363
101364                     showPane
101365                         .classed('shown', true)
101366                         .style('display', 'block');
101367                     if (shownPanes.empty()) {
101368                         showPane
101369                             .style('display', 'block')
101370                             .style(side, '-500px')
101371                             .transition()
101372                             .duration(200)
101373                             .style(side, '0px');
101374                     } else {
101375                         showPane
101376                             .style(side, '0px');
101377                     }
101378                 } else {
101379                     shownPanes
101380                         .style('display', 'block')
101381                         .style(side, '0px')
101382                         .transition()
101383                         .duration(200)
101384                         .style(side, '-500px')
101385                         .on('end', function() {
101386                             d3_select(this).style('display', 'none');
101387                         });
101388                 }
101389             };
101390
101391             return ui;
101392         }
101393
101394         function coreContext() {
101395             var dispatch$1 = dispatch('enter', 'exit', 'change');
101396             var context = utilRebind({}, dispatch$1, 'on');
101397             var _deferred = new Set();
101398
101399             context.version = '2.15.0';
101400
101401             // create a special translation that contains the keys in place of the strings
101402             var tkeys = JSON.parse(JSON.stringify(en));  // clone deep
101403             var parents = [];
101404
101405             function traverser(v, k, obj) {
101406                 parents.push(k);
101407                 if (typeof v === 'object') {
101408                     forOwn(v, traverser);
101409                 } else if (typeof v === 'string') {
101410                     obj[k] = parents.join('.');
101411                 }
101412                 parents.pop();
101413             }
101414
101415             function forOwn(obj, fn) {
101416                 Object.keys(obj).forEach(function(k) { fn(obj[k], k, obj); });
101417             }
101418
101419             forOwn(tkeys, traverser);
101420             addTranslation('_tkeys_', tkeys);
101421
101422             addTranslation('en', en);
101423             setLocale('en');
101424
101425
101426             // https://github.com/openstreetmap/iD/issues/772
101427             // http://mathiasbynens.be/notes/localstorage-pattern#comment-9
101428             var storage;
101429             try { storage = localStorage; } catch (e) {}  // eslint-disable-line no-empty
101430             storage = storage || (function() {
101431                 var s = {};
101432                 return {
101433                     getItem: function(k) { return s[k]; },
101434                     setItem: function(k, v) { s[k] = v; },
101435                     removeItem: function(k) { delete s[k]; }
101436                 };
101437             })();
101438
101439             context.storage = function(k, v) {
101440                 try {
101441                     if (arguments.length === 1) return storage.getItem(k);
101442                     else if (v === null) storage.removeItem(k);
101443                     else storage.setItem(k, v);
101444                 } catch (e) {
101445                     // localstorage quota exceeded
101446                     /* eslint-disable no-console */
101447                     if (typeof console !== 'undefined') console.error('localStorage quota exceeded');
101448                     /* eslint-enable no-console */
101449                 }
101450             };
101451
101452
101453             /* User interface and keybinding */
101454             var ui;
101455             context.ui = function() { return ui; };
101456
101457             var keybinding = utilKeybinding('context');
101458             context.keybinding = function() { return keybinding; };
101459             d3_select(document).call(keybinding);
101460
101461
101462             /* Straight accessors. Avoid using these if you can. */
101463             var connection, history, validator;
101464             context.connection = function() { return connection; };
101465             context.history = function() { return history; };
101466             context.validator = function() { return validator; };
101467
101468             /* Connection */
101469             context.preauth = function(options) {
101470                 if (connection) {
101471                     connection.switch(options);
101472                 }
101473                 return context;
101474             };
101475
101476
101477             function afterLoad(cid, callback) {
101478                 return function(err, result) {
101479                     if (err) {
101480                         // 400 Bad Request, 401 Unauthorized, 403 Forbidden..
101481                         if (err.status === 400 || err.status === 401 || err.status === 403) {
101482                             if (connection) {
101483                                 connection.logout();
101484                             }
101485                         }
101486                         if (typeof callback === 'function') {
101487                             callback(err);
101488                         }
101489                         return;
101490
101491                     } else if (connection && connection.getConnectionId() !== cid) {
101492                         if (typeof callback === 'function') {
101493                             callback({ message: 'Connection Switched', status: -1 });
101494                         }
101495                         return;
101496
101497                     } else {
101498                         history.merge(result.data, result.extent);
101499                         if (typeof callback === 'function') {
101500                             callback(err, result);
101501                         }
101502                         return;
101503                     }
101504                 };
101505             }
101506
101507
101508             context.loadTiles = function(projection, callback) {
101509                 var handle = window.requestIdleCallback(function() {
101510                     _deferred.delete(handle);
101511                     if (connection && context.editable()) {
101512                         var cid = connection.getConnectionId();
101513                         connection.loadTiles(projection, afterLoad(cid, callback));
101514                     }
101515                 });
101516                 _deferred.add(handle);
101517             };
101518
101519             context.loadTileAtLoc = function(loc, callback) {
101520                 var handle = window.requestIdleCallback(function() {
101521                     _deferred.delete(handle);
101522                     if (connection && context.editable()) {
101523                         var cid = connection.getConnectionId();
101524                         connection.loadTileAtLoc(loc, afterLoad(cid, callback));
101525                     }
101526                 });
101527                 _deferred.add(handle);
101528             };
101529
101530             context.loadEntity = function(entityID, callback) {
101531                 if (connection) {
101532                     var cid = connection.getConnectionId();
101533                     connection.loadEntity(entityID, afterLoad(cid, callback));
101534                 }
101535             };
101536
101537             context.zoomToEntity = function(entityID, zoomTo) {
101538                 if (zoomTo !== false) {
101539                     this.loadEntity(entityID, function(err, result) {
101540                         if (err) return;
101541                         var entity = result.data.find(function(e) { return e.id === entityID; });
101542                         if (entity) {
101543                             map.zoomTo(entity);
101544                         }
101545                     });
101546                 }
101547
101548                 map.on('drawn.zoomToEntity', function() {
101549                     if (!context.hasEntity(entityID)) return;
101550                     map.on('drawn.zoomToEntity', null);
101551                     context.on('enter.zoomToEntity', null);
101552                     context.enter(modeSelect(context, [entityID]));
101553                 });
101554
101555                 context.on('enter.zoomToEntity', function() {
101556                     if (mode.id !== 'browse') {
101557                         map.on('drawn.zoomToEntity', null);
101558                         context.on('enter.zoomToEntity', null);
101559                     }
101560                 });
101561             };
101562
101563             var minEditableZoom = 16;
101564             context.minEditableZoom = function(val) {
101565                 if (!arguments.length) return minEditableZoom;
101566                 minEditableZoom = val;
101567                 if (connection) {
101568                     connection.tileZoom(val);
101569                 }
101570                 return context;
101571             };
101572
101573
101574             /* History */
101575             var inIntro = false;
101576             context.inIntro = function(val) {
101577                 if (!arguments.length) return inIntro;
101578                 inIntro = val;
101579                 return context;
101580             };
101581
101582             context.save = function() {
101583                 // no history save, no message onbeforeunload
101584                 if (inIntro || d3_select('.modal').size()) return;
101585
101586                 var canSave;
101587                 if (mode && mode.id === 'save') {
101588                     canSave = false;
101589
101590                     // Attempt to prevent user from creating duplicate changes - see #5200
101591                     if (services$1.osm && services$1.osm.isChangesetInflight()) {
101592                         history.clearSaved();
101593                         return;
101594                     }
101595
101596                 } else {
101597                     canSave = context.selectedIDs().every(function(id) {
101598                         var entity = context.hasEntity(id);
101599                         return entity && !entity.isDegenerate();
101600                     });
101601                 }
101602
101603                 if (canSave) {
101604                     history.save();
101605                 }
101606                 if (history.hasChanges()) {
101607                     return t('save.unsaved_changes');
101608                 }
101609             };
101610
101611
101612             /* Graph */
101613             context.hasEntity = function(id) {
101614                 return history.graph().hasEntity(id);
101615             };
101616             context.entity = function(id) {
101617                 return history.graph().entity(id);
101618             };
101619             context.childNodes = function(way) {
101620                 return history.graph().childNodes(way);
101621             };
101622             context.geometry = function(id) {
101623                 return context.entity(id).geometry(history.graph());
101624             };
101625
101626
101627             /* Modes */
101628             var mode;
101629             context.mode = function() {
101630                 return mode;
101631             };
101632             context.enter = function(newMode) {
101633                 if (mode) {
101634                     mode.exit();
101635                     dispatch$1.call('exit', this, mode);
101636                 }
101637
101638                 mode = newMode;
101639                 mode.enter();
101640                 dispatch$1.call('enter', this, mode);
101641             };
101642
101643             context.selectedIDs = function() {
101644                 if (mode && mode.selectedIDs) {
101645                     return mode.selectedIDs();
101646                 } else {
101647                     return [];
101648                 }
101649             };
101650
101651             context.activeID = function() {
101652                 return mode && mode.activeID && mode.activeID();
101653             };
101654
101655             var _selectedNoteID;
101656             context.selectedNoteID = function(noteID) {
101657                 if (!arguments.length) return _selectedNoteID;
101658                 _selectedNoteID = noteID;
101659                 return context;
101660             };
101661
101662             var _selectedErrorID;
101663             context.selectedErrorID = function(errorID) {
101664                 if (!arguments.length) return _selectedErrorID;
101665                 _selectedErrorID = errorID;
101666                 return context;
101667             };
101668
101669
101670             /* Behaviors */
101671             context.install = function(behavior) {
101672                 context.surface().call(behavior);
101673             };
101674             context.uninstall = function(behavior) {
101675                 context.surface().call(behavior.off);
101676             };
101677
101678
101679             /* Copy/Paste */
101680             var copyIDs = [], copyGraph;
101681             context.copyGraph = function() { return copyGraph; };
101682             context.copyIDs = function(val) {
101683                 if (!arguments.length) return copyIDs;
101684                 copyIDs = val;
101685                 copyGraph = history.graph();
101686                 return context;
101687             };
101688
101689
101690             /* Background */
101691             var background;
101692             context.background = function() { return background; };
101693
101694
101695             /* Features */
101696             var features;
101697             context.features = function() { return features; };
101698             context.hasHiddenConnections = function(id) {
101699                 var graph = history.graph();
101700                 var entity = graph.entity(id);
101701                 return features.hasHiddenConnections(entity, graph);
101702             };
101703
101704
101705             /* Photos */
101706             var photos;
101707             context.photos = function() { return photos; };
101708
101709
101710             /* Presets */
101711             var presets;
101712             context.presets = function() { return presets; };
101713
101714
101715             /* Map */
101716             var map;
101717             context.map = function() { return map; };
101718             context.layers = function() { return map.layers; };
101719             context.surface = function() { return map.surface; };
101720             context.editable = function() { return map.editable(); };
101721             context.surfaceRect = function() {
101722                 return map.surface.node().getBoundingClientRect();
101723             };
101724
101725
101726             /* Debug */
101727             var debugFlags = {
101728                 tile: false,        // tile boundaries
101729                 collision: false,   // label collision bounding boxes
101730                 imagery: false,     // imagery bounding polygons
101731                 community: false,   // community bounding polygons
101732                 imperial: false,    // imperial (not metric) bounding polygons
101733                 driveLeft: false,   // driveLeft bounding polygons
101734                 target: false,      // touch targets
101735                 downloaded: false   // downloaded data from osm
101736             };
101737             context.debugFlags = function() {
101738                 return debugFlags;
101739             };
101740             context.setDebug = function(flag, val) {
101741                 if (arguments.length === 1) val = true;
101742                 debugFlags[flag] = val;
101743                 dispatch$1.call('change');
101744                 return context;
101745             };
101746             context.getDebug = function(flag) {
101747                 return flag && debugFlags[flag];
101748             };
101749
101750
101751             /* Container */
101752             var container = d3_select(document.body);
101753             context.container = function(val) {
101754                 if (!arguments.length) return container;
101755                 container = val;
101756                 container.classed('id-container', true);
101757                 return context;
101758             };
101759             var embed;
101760             context.embed = function(val) {
101761                 if (!arguments.length) return embed;
101762                 embed = val;
101763                 return context;
101764             };
101765
101766
101767             /* Assets */
101768             var assetPath = '';
101769             context.assetPath = function(val) {
101770                 if (!arguments.length) return assetPath;
101771                 assetPath = val;
101772                 return context;
101773             };
101774
101775             var assetMap = {};
101776             context.assetMap = function(val) {
101777                 if (!arguments.length) return assetMap;
101778                 assetMap = val;
101779                 return context;
101780             };
101781
101782             context.asset = function(val) {
101783                 var filename = assetPath + val;
101784                 return assetMap[filename] || filename;
101785             };
101786
101787             context.imagePath = function(val) {
101788                 return context.asset('img/' + val);
101789             };
101790
101791
101792             /* locales */
101793             // `locale` variable contains a "requested locale".
101794             // It won't become the `currentLocale` until after loadLocale() is called.
101795             var locale, localePath;
101796
101797             context.locale = function(loc, path) {
101798                 if (!arguments.length) return currentLocale;
101799                 locale = loc;
101800                 localePath = path;
101801                 return context;
101802             };
101803
101804             context.loadLocale = function(callback) {
101805                 if (locale && locale !== 'en' && dataLocales.hasOwnProperty(locale)) {
101806                     localePath = localePath || context.asset('locales/' + locale + '.json');
101807                     d3_json(localePath)
101808                         .then(function(result) {
101809                             addTranslation(locale, result[locale]);
101810                             setLocale(locale);
101811                             utilDetect(true);
101812                             if (callback) callback();
101813                         })
101814                         .catch(function(err) {
101815                             if (callback) callback(err.message);
101816                         });
101817                 } else {
101818                     if (locale) {
101819                         setLocale(locale);
101820                         utilDetect(true);
101821                     }
101822                     if (callback) {
101823                         callback();
101824                     }
101825                 }
101826             };
101827
101828
101829             /* reset (aka flush) */
101830             context.reset = context.flush = function() {
101831                 context.debouncedSave.cancel();
101832
101833                 Array.from(_deferred).forEach(function(handle) {
101834                     window.cancelIdleCallback(handle);
101835                     _deferred.delete(handle);
101836                 });
101837
101838                 Object.values(services$1).forEach(function(service) {
101839                     if (service && typeof service.reset === 'function') {
101840                         service.reset(context);
101841                     }
101842                 });
101843
101844                 validator.reset();
101845                 features.reset();
101846                 history.reset();
101847
101848                 return context;
101849             };
101850
101851
101852             /* Init */
101853
101854             context.projection = geoRawMercator();
101855             context.curtainProjection = geoRawMercator();
101856
101857             locale = utilDetect().locale;
101858             if (locale && !dataLocales.hasOwnProperty(locale)) {
101859                 locale = locale.split('-')[0];
101860             }
101861
101862             history = coreHistory(context);
101863             validator = coreValidator(context);
101864
101865             context.graph = history.graph;
101866             context.changes = history.changes;
101867             context.intersects = history.intersects;
101868             context.pauseChangeDispatch = history.pauseChangeDispatch;
101869             context.resumeChangeDispatch = history.resumeChangeDispatch;
101870
101871             // Debounce save, since it's a synchronous localStorage write,
101872             // and history changes can happen frequently (e.g. when dragging).
101873             context.debouncedSave = debounce(context.save, 350);
101874             function withDebouncedSave(fn) {
101875                 return function() {
101876                     var result = fn.apply(history, arguments);
101877                     context.debouncedSave();
101878                     return result;
101879                 };
101880             }
101881
101882             context.perform = withDebouncedSave(history.perform);
101883             context.replace = withDebouncedSave(history.replace);
101884             context.pop = withDebouncedSave(history.pop);
101885             context.overwrite = withDebouncedSave(history.overwrite);
101886             context.undo = withDebouncedSave(history.undo);
101887             context.redo = withDebouncedSave(history.redo);
101888
101889             ui = uiInit(context);
101890
101891             connection = services$1.osm;
101892             background = rendererBackground(context);
101893             features = rendererFeatures(context);
101894             photos = rendererPhotos(context);
101895             presets = presetIndex(context);
101896
101897             if (services$1.maprules && utilStringQs(window.location.hash).maprules) {
101898                 var maprules = utilStringQs(window.location.hash).maprules;
101899                 d3_json(maprules)
101900                     .then(function(mapcss) {
101901                         services$1.maprules.init();
101902                         mapcss.forEach(function(mapcssSelector) {
101903                             return services$1.maprules.addRule(mapcssSelector);
101904                         });
101905                     })
101906                     .catch(function() {
101907                         /* ignore */
101908                     });
101909             }
101910
101911             map = rendererMap(context);
101912             context.mouse = map.mouse;
101913             context.extent = map.extent;
101914             context.pan = map.pan;
101915             context.zoomIn = map.zoomIn;
101916             context.zoomOut = map.zoomOut;
101917             context.zoomInFurther = map.zoomInFurther;
101918             context.zoomOutFurther = map.zoomOutFurther;
101919             context.redrawEnable = map.redrawEnable;
101920
101921             Object.values(services$1).forEach(function(service) {
101922                 if (service && typeof service.init === 'function') {
101923                     service.init(context);
101924                 }
101925             });
101926
101927             validator.init();
101928             background.init();
101929             features.init();
101930             photos.init();
101931
101932             if (utilStringQs(window.location.hash).presets) {
101933                 var external = utilStringQs(window.location.hash).presets;
101934                 presets.fromExternal(external, function(externalPresets) {
101935                     context.presets = function() { return externalPresets; }; // default + external presets...
101936                     osmSetAreaKeys(presets.areaKeys());
101937                     osmSetPointTags(presets.pointTags());
101938                     osmSetVertexTags(presets.vertexTags());
101939                 });
101940             } else {
101941                 presets.init();
101942                 osmSetAreaKeys(presets.areaKeys());
101943                 osmSetPointTags(presets.pointTags());
101944                 osmSetVertexTags(presets.vertexTags());
101945             }
101946
101947             return context;
101948         }
101949
101950         function uiSourceSwitch(context) {
101951             var keys;
101952
101953
101954             function click() {
101955                 event.preventDefault();
101956
101957                 var osm = context.connection();
101958                 if (!osm) return;
101959
101960                 if (context.inIntro()) return;
101961
101962                 if (context.history().hasChanges() &&
101963                     !window.confirm(t('source_switch.lose_changes'))) return;
101964
101965                 var isLive = d3_select(this)
101966                     .classed('live');
101967
101968                 isLive = !isLive;
101969                 context.enter(modeBrowse(context));
101970                 context.history().clearSaved();          // remove saved history
101971                 context.flush();                         // remove stored data
101972
101973                 d3_select(this)
101974                     .text(isLive ? t('source_switch.live') : t('source_switch.dev'))
101975                     .classed('live', isLive);
101976
101977                 osm.switch(isLive ? keys[0] : keys[1]);  // switch connection (warning: dispatches 'change' event)
101978             }
101979
101980             var sourceSwitch = function(selection) {
101981                 selection
101982                     .append('a')
101983                     .attr('href', '#')
101984                     .text(t('source_switch.live'))
101985                     .classed('live', true)
101986                     .attr('tabindex', -1)
101987                     .on('click', click);
101988             };
101989
101990
101991             sourceSwitch.keys = function(_) {
101992                 if (!arguments.length) return keys;
101993                 keys = _;
101994                 return sourceSwitch;
101995             };
101996
101997
101998             return sourceSwitch;
101999         }
102000
102001         var Connection = services$1.osm;
102002
102003         var debug = false;
102004
102005         var iD = /*#__PURE__*/Object.freeze({
102006                 Connection: Connection,
102007                 debug: debug,
102008                 d3: index$3,
102009                 Context: coreContext,
102010                 setAreaKeys: osmSetAreaKeys,
102011                 get areaKeys () { return osmAreaKeys; },
102012                 Difference: coreDifference,
102013                 Graph: coreGraph,
102014                 History: coreHistory,
102015                 Tree: coreTree,
102016                 geoCross: geoVecCross,
102017                 geoInterp: geoVecInterp,
102018                 geoRoundCoordinates: geoVecFloor,
102019                 geoEuclideanDistance: geoVecLength,
102020                 Entity: osmEntity,
102021                 Node: osmNode,
102022                 Relation: osmRelation,
102023                 Way: osmWay,
102024                 BackgroundSource: rendererBackgroundSource,
102025                 Background: rendererBackground,
102026                 Features: rendererFeatures,
102027                 Map: rendererMap,
102028                 TileLayer: rendererTileLayer,
102029                 Detect: utilDetect,
102030                 uiPreset: uiPresetEditor,
102031                 actionAddEntity: actionAddEntity,
102032                 actionAddMember: actionAddMember,
102033                 actionAddMidpoint: actionAddMidpoint,
102034                 actionAddVertex: actionAddVertex,
102035                 actionChangeMember: actionChangeMember,
102036                 actionChangePreset: actionChangePreset,
102037                 actionChangeTags: actionChangeTags,
102038                 actionCircularize: actionCircularize,
102039                 actionConnect: actionConnect,
102040                 actionCopyEntities: actionCopyEntities,
102041                 actionDeleteMember: actionDeleteMember,
102042                 actionDeleteMultiple: actionDeleteMultiple,
102043                 actionDeleteNode: actionDeleteNode,
102044                 actionDeleteRelation: actionDeleteRelation,
102045                 actionDeleteWay: actionDeleteWay,
102046                 actionDiscardTags: actionDiscardTags,
102047                 actionDisconnect: actionDisconnect,
102048                 actionExtract: actionExtract,
102049                 actionJoin: actionJoin,
102050                 actionMerge: actionMerge,
102051                 actionMergeNodes: actionMergeNodes,
102052                 actionMergePolygon: actionMergePolygon,
102053                 actionMergeRemoteChanges: actionMergeRemoteChanges,
102054                 actionMove: actionMove,
102055                 actionMoveMember: actionMoveMember,
102056                 actionMoveNode: actionMoveNode,
102057                 actionNoop: actionNoop,
102058                 actionOrthogonalize: actionOrthogonalize,
102059                 actionRestrictTurn: actionRestrictTurn,
102060                 actionReverse: actionReverse,
102061                 actionRevert: actionRevert,
102062                 actionRotate: actionRotate,
102063                 actionSplit: actionSplit,
102064                 actionStraightenNodes: actionStraightenNodes,
102065                 actionStraightenWay: actionStraightenWay,
102066                 actionUnrestrictTurn: actionUnrestrictTurn,
102067                 actionReflect: actionReflect,
102068                 actionUpgradeTags: actionUpgradeTags,
102069                 behaviorAddWay: behaviorAddWay,
102070                 behaviorBreathe: behaviorBreathe,
102071                 behaviorCopy: behaviorCopy,
102072                 behaviorDrag: behaviorDrag,
102073                 behaviorDrawWay: behaviorDrawWay,
102074                 behaviorDraw: behaviorDraw,
102075                 behaviorEdit: behaviorEdit,
102076                 behaviorHash: behaviorHash,
102077                 behaviorHover: behaviorHover,
102078                 behaviorLasso: behaviorLasso,
102079                 behaviorOperation: behaviorOperation,
102080                 behaviorPaste: behaviorPaste,
102081                 behaviorSelect: behaviorSelect,
102082                 behaviorTail: behaviorTail,
102083                 coreContext: coreContext,
102084                 coreDifference: coreDifference,
102085                 coreGraph: coreGraph,
102086                 coreHistory: coreHistory,
102087                 coreTree: coreTree,
102088                 coreValidator: coreValidator,
102089                 data: data,
102090                 dataWikipedia: wikipedia$2,
102091                 dataAddressFormats: dataAddressFormats,
102092                 dataDeprecated: dataDeprecated,
102093                 dataDiscarded: dataDiscarded,
102094                 dataLocales: dataLocales,
102095                 dataPhoneFormats: dataPhoneFormats,
102096                 dataShortcuts: dataShortcuts,
102097                 dataImperial: dataImperial,
102098                 dataDriveLeft: dataDriveLeft,
102099                 dataEn: en,
102100                 geoExtent: geoExtent,
102101                 geoLatToMeters: geoLatToMeters,
102102                 geoLonToMeters: geoLonToMeters,
102103                 geoMetersToLat: geoMetersToLat,
102104                 geoMetersToLon: geoMetersToLon,
102105                 geoMetersToOffset: geoMetersToOffset,
102106                 geoOffsetToMeters: geoOffsetToMeters,
102107                 geoScaleToZoom: geoScaleToZoom,
102108                 geoSphericalClosestNode: geoSphericalClosestNode,
102109                 geoSphericalDistance: geoSphericalDistance,
102110                 geoZoomToScale: geoZoomToScale,
102111                 geoAngle: geoAngle,
102112                 geoChooseEdge: geoChooseEdge,
102113                 geoEdgeEqual: geoEdgeEqual,
102114                 geoGetSmallestSurroundingRectangle: geoGetSmallestSurroundingRectangle,
102115                 geoHasLineIntersections: geoHasLineIntersections,
102116                 geoHasSelfIntersections: geoHasSelfIntersections,
102117                 geoRotate: geoRotate,
102118                 geoLineIntersection: geoLineIntersection,
102119                 geoPathHasIntersections: geoPathHasIntersections,
102120                 geoPathIntersections: geoPathIntersections,
102121                 geoPathLength: geoPathLength,
102122                 geoPointInPolygon: geoPointInPolygon,
102123                 geoPolygonContainsPolygon: geoPolygonContainsPolygon,
102124                 geoPolygonIntersectsPolygon: geoPolygonIntersectsPolygon,
102125                 geoViewportEdge: geoViewportEdge,
102126                 geoRawMercator: geoRawMercator,
102127                 geoVecAdd: geoVecAdd,
102128                 geoVecAngle: geoVecAngle,
102129                 geoVecCross: geoVecCross,
102130                 geoVecDot: geoVecDot,
102131                 geoVecEqual: geoVecEqual,
102132                 geoVecFloor: geoVecFloor,
102133                 geoVecInterp: geoVecInterp,
102134                 geoVecLength: geoVecLength,
102135                 geoVecNormalize: geoVecNormalize,
102136                 geoVecNormalizedDot: geoVecNormalizedDot,
102137                 geoVecProject: geoVecProject,
102138                 geoVecSubtract: geoVecSubtract,
102139                 geoVecScale: geoVecScale,
102140                 geoOrthoNormalizedDotProduct: geoOrthoNormalizedDotProduct,
102141                 geoOrthoCalcScore: geoOrthoCalcScore,
102142                 geoOrthoMaxOffsetAngle: geoOrthoMaxOffsetAngle,
102143                 geoOrthoCanOrthogonalize: geoOrthoCanOrthogonalize,
102144                 modeAddArea: modeAddArea,
102145                 modeAddLine: modeAddLine,
102146                 modeAddPoint: modeAddPoint,
102147                 modeAddNote: modeAddNote,
102148                 modeBrowse: modeBrowse,
102149                 modeDragNode: modeDragNode,
102150                 modeDragNote: modeDragNote,
102151                 modeDrawArea: modeDrawArea,
102152                 modeDrawLine: modeDrawLine,
102153                 modeMove: modeMove,
102154                 modeRotate: modeRotate,
102155                 modeSave: modeSave,
102156                 modeSelect: modeSelect,
102157                 modeSelectData: modeSelectData,
102158                 modeSelectError: modeSelectError,
102159                 modeSelectNote: modeSelectNote,
102160                 operationCircularize: operationCircularize,
102161                 operationContinue: operationContinue,
102162                 operationDelete: operationDelete,
102163                 operationDisconnect: operationDisconnect,
102164                 operationDowngrade: operationDowngrade,
102165                 operationExtract: operationExtract,
102166                 operationMerge: operationMerge,
102167                 operationMove: operationMove,
102168                 operationOrthogonalize: operationOrthogonalize,
102169                 operationReflectShort: operationReflectShort,
102170                 operationReflectLong: operationReflectLong,
102171                 operationReverse: operationReverse,
102172                 operationRotate: operationRotate,
102173                 operationSplit: operationSplit,
102174                 operationStraighten: operationStraighten,
102175                 osmChangeset: osmChangeset,
102176                 osmEntity: osmEntity,
102177                 osmNode: osmNode,
102178                 osmNote: osmNote,
102179                 osmRelation: osmRelation,
102180                 osmWay: osmWay,
102181                 qaError: qaError,
102182                 osmIntersection: osmIntersection,
102183                 osmTurn: osmTurn,
102184                 osmInferRestriction: osmInferRestriction,
102185                 osmLanes: osmLanes,
102186                 osmOldMultipolygonOuterMemberOfRelation: osmOldMultipolygonOuterMemberOfRelation,
102187                 osmIsOldMultipolygonOuterMember: osmIsOldMultipolygonOuterMember,
102188                 osmOldMultipolygonOuterMember: osmOldMultipolygonOuterMember,
102189                 osmJoinWays: osmJoinWays,
102190                 get osmAreaKeys () { return osmAreaKeys; },
102191                 osmSetAreaKeys: osmSetAreaKeys,
102192                 get osmPointTags () { return osmPointTags; },
102193                 osmSetPointTags: osmSetPointTags,
102194                 get osmVertexTags () { return osmVertexTags; },
102195                 osmSetVertexTags: osmSetVertexTags,
102196                 osmNodeGeometriesForTags: osmNodeGeometriesForTags,
102197                 osmOneWayTags: osmOneWayTags,
102198                 osmPavedTags: osmPavedTags,
102199                 osmIsInterestingTag: osmIsInterestingTag,
102200                 osmRoutableHighwayTagValues: osmRoutableHighwayTagValues,
102201                 osmFlowingWaterwayTagValues: osmFlowingWaterwayTagValues,
102202                 osmRailwayTrackTagValues: osmRailwayTrackTagValues,
102203                 presetCategory: presetCategory,
102204                 presetCollection: presetCollection,
102205                 presetField: presetField,
102206                 presetPreset: presetPreset,
102207                 presetIndex: presetIndex,
102208                 rendererBackgroundSource: rendererBackgroundSource,
102209                 rendererBackground: rendererBackground,
102210                 rendererFeatures: rendererFeatures,
102211                 rendererMap: rendererMap,
102212                 rendererPhotos: rendererPhotos,
102213                 rendererTileLayer: rendererTileLayer,
102214                 services: services$1,
102215                 serviceKeepRight: serviceKeepRight,
102216                 serviceImproveOSM: serviceImproveOSM,
102217                 serviceMapillary: serviceMapillary,
102218                 serviceMapRules: serviceMapRules,
102219                 serviceNominatim: serviceNominatim,
102220                 serviceOpenstreetcam: serviceOpenstreetcam,
102221                 serviceOsm: serviceOsm,
102222                 serviceOsmWikibase: serviceOsmWikibase,
102223                 serviceStreetside: serviceStreetside,
102224                 serviceTaginfo: serviceTaginfo,
102225                 serviceVectorTile: serviceVectorTile,
102226                 serviceWikidata: serviceWikidata,
102227                 serviceWikipedia: serviceWikipedia,
102228                 svgAreas: svgAreas,
102229                 svgData: svgData,
102230                 svgDebug: svgDebug,
102231                 svgDefs: svgDefs,
102232                 svgKeepRight: svgKeepRight,
102233                 svgIcon: svgIcon,
102234                 svgGeolocate: svgGeolocate,
102235                 svgLabels: svgLabels,
102236                 svgLayers: svgLayers,
102237                 svgLines: svgLines,
102238                 svgMapillaryImages: svgMapillaryImages,
102239                 svgMapillarySigns: svgMapillarySigns,
102240                 svgMidpoints: svgMidpoints,
102241                 svgNotes: svgNotes,
102242                 svgMarkerSegments: svgMarkerSegments,
102243                 svgOpenstreetcamImages: svgOpenstreetcamImages,
102244                 svgOsm: svgOsm,
102245                 svgPassiveVertex: svgPassiveVertex,
102246                 svgPath: svgPath,
102247                 svgPointTransform: svgPointTransform,
102248                 svgPoints: svgPoints,
102249                 svgRelationMemberTags: svgRelationMemberTags,
102250                 svgSegmentWay: svgSegmentWay,
102251                 svgStreetside: svgStreetside,
102252                 svgTagClasses: svgTagClasses,
102253                 svgTouch: svgTouch,
102254                 svgTurns: svgTurns,
102255                 svgVertices: svgVertices,
102256                 uiFields: uiFields,
102257                 uiFieldDefaultCheck: uiFieldCheck,
102258                 uiFieldOnewayCheck: uiFieldCheck,
102259                 uiFieldCheck: uiFieldCheck,
102260                 uiFieldMultiCombo: uiFieldCombo,
102261                 uiFieldNetworkCombo: uiFieldCombo,
102262                 uiFieldSemiCombo: uiFieldCombo,
102263                 uiFieldTypeCombo: uiFieldCombo,
102264                 uiFieldCombo: uiFieldCombo,
102265                 uiFieldUrl: uiFieldText,
102266                 uiFieldNumber: uiFieldText,
102267                 uiFieldTel: uiFieldText,
102268                 uiFieldEmail: uiFieldText,
102269                 uiFieldText: uiFieldText,
102270                 uiFieldAccess: uiFieldAccess,
102271                 uiFieldAddress: uiFieldAddress,
102272                 uiFieldCycleway: uiFieldCycleway,
102273                 uiFieldLanes: uiFieldLanes,
102274                 uiFieldLocalized: uiFieldLocalized,
102275                 uiFieldMaxspeed: uiFieldMaxspeed,
102276                 uiFieldStructureRadio: uiFieldRadio,
102277                 uiFieldRadio: uiFieldRadio,
102278                 uiFieldRestrictions: uiFieldRestrictions,
102279                 uiFieldTextarea: uiFieldTextarea,
102280                 uiFieldWikidata: uiFieldWikidata,
102281                 uiFieldWikipedia: uiFieldWikipedia,
102282                 uiIntro: uiIntro,
102283                 uiInfoPanels: uiInfoPanels,
102284                 uiPanelBackground: uiPanelBackground,
102285                 uiPanelHistory: uiPanelHistory,
102286                 uiPanelLocation: uiPanelLocation,
102287                 uiPanelMeasurement: uiPanelMeasurement,
102288                 uiSettingsCustomBackground: uiSettingsCustomBackground,
102289                 uiSettingsCustomData: uiSettingsCustomData,
102290                 uiInit: uiInit,
102291                 uiAccount: uiAccount,
102292                 uiAttribution: uiAttribution,
102293                 uiBackground: uiBackground,
102294                 uiBackgroundDisplayOptions: uiBackgroundDisplayOptions,
102295                 uiBackgroundOffset: uiBackgroundOffset,
102296                 uiChangesetEditor: uiChangesetEditor,
102297                 uiCmd: uiCmd,
102298                 uiCombobox: uiCombobox,
102299                 uiCommit: uiCommit,
102300                 uiCommitChanges: uiCommitChanges,
102301                 uiCommitWarnings: uiCommitWarnings,
102302                 uiConfirm: uiConfirm,
102303                 uiConflicts: uiConflicts,
102304                 uiContributors: uiContributors,
102305                 uiCurtain: uiCurtain,
102306                 uiDataEditor: uiDataEditor,
102307                 uiDataHeader: uiDataHeader,
102308                 uiDisclosure: uiDisclosure,
102309                 uiEditMenu: uiEditMenu,
102310                 uiEntityEditor: uiEntityEditor,
102311                 uiFeatureInfo: uiFeatureInfo,
102312                 uiFeatureList: uiFeatureList,
102313                 uiField: uiField,
102314                 uiFieldHelp: uiFieldHelp,
102315                 uiFlash: uiFlash,
102316                 uiFormFields: uiFormFields,
102317                 uiFullScreen: uiFullScreen,
102318                 uiGeolocate: uiGeolocate,
102319                 uiHelp: uiHelp,
102320                 uiImproveOsmComments: uiImproveOsmComments,
102321                 uiImproveOsmDetails: uiImproveOsmDetails,
102322                 uiImproveOsmEditor: uiImproveOsmEditor,
102323                 uiImproveOsmHeader: uiImproveOsmHeader,
102324                 uiInfo: uiInfo,
102325                 uiInspector: uiInspector,
102326                 uiKeepRightDetails: uiKeepRightDetails,
102327                 uiKeepRightEditor: uiKeepRightEditor,
102328                 uiKeepRightHeader: uiKeepRightHeader,
102329                 uiLasso: uiLasso,
102330                 uiLoading: uiLoading,
102331                 uiMapData: uiMapData,
102332                 uiMapInMap: uiMapInMap,
102333                 uiModal: uiModal,
102334                 uiNotice: uiNotice,
102335                 uiNoteComments: uiNoteComments,
102336                 uiNoteEditor: uiNoteEditor,
102337                 uiNoteHeader: uiNoteHeader,
102338                 uiNoteReport: uiNoteReport,
102339                 uiPresetEditor: uiPresetEditor,
102340                 uiPresetIcon: uiPresetIcon,
102341                 uiPresetList: uiPresetList,
102342                 uiQuickLinks: uiQuickLinks,
102343                 uiRadialMenu: uiRadialMenu,
102344                 uiRawMemberEditor: uiRawMemberEditor,
102345                 uiRawMembershipEditor: uiRawMembershipEditor,
102346                 uiRawTagEditor: uiRawTagEditor,
102347                 uiRestore: uiRestore,
102348                 uiScale: uiScale,
102349                 uiSelectionList: uiSelectionList,
102350                 uiSidebar: uiSidebar,
102351                 uiSourceSwitch: uiSourceSwitch,
102352                 uiSpinner: uiSpinner,
102353                 uiSplash: uiSplash,
102354                 uiStatus: uiStatus,
102355                 uiSuccess: uiSuccess,
102356                 uiTagReference: uiTagReference,
102357                 uiToggle: uiToggle,
102358                 uiTooltipHtml: uiTooltipHtml,
102359                 uiVersion: uiVersion,
102360                 uiViewOnOSM: uiViewOnOSM,
102361                 uiViewOnKeepRight: uiViewOnKeepRight,
102362                 uiZoom: uiZoom,
102363                 utilArrayChunk: utilArrayChunk,
102364                 utilArrayDifference: utilArrayDifference,
102365                 utilArrayFlatten: utilArrayFlatten,
102366                 utilArrayGroupBy: utilArrayGroupBy,
102367                 utilArrayIntersection: utilArrayIntersection,
102368                 utilArrayUnion: utilArrayUnion,
102369                 utilArrayUniq: utilArrayUniq,
102370                 utilArrayUniqBy: utilArrayUniqBy,
102371                 utilAsyncMap: utilAsyncMap,
102372                 utilCleanTags: utilCleanTags,
102373                 utilDetect: utilDetect,
102374                 utilDisplayName: utilDisplayName,
102375                 utilDisplayNameForPath: utilDisplayNameForPath,
102376                 utilDisplayType: utilDisplayType,
102377                 utilDisplayLabel: utilDisplayLabel,
102378                 utilEntityRoot: utilEntityRoot,
102379                 utilEditDistance: utilEditDistance,
102380                 utilEntitySelector: utilEntitySelector,
102381                 utilEntityOrMemberSelector: utilEntityOrMemberSelector,
102382                 utilEntityOrDeepMemberSelector: utilEntityOrDeepMemberSelector,
102383                 utilFastMouse: utilFastMouse,
102384                 utilFunctor: utilFunctor,
102385                 utilGetAllNodes: utilGetAllNodes,
102386                 utilGetSetValue: utilGetSetValue,
102387                 utilHashcode: utilHashcode,
102388                 utilHighlightEntities: utilHighlightEntities,
102389                 utilKeybinding: utilKeybinding,
102390                 utilNoAuto: utilNoAuto,
102391                 utilObjectOmit: utilObjectOmit,
102392                 utilPrefixCSSProperty: utilPrefixCSSProperty,
102393                 utilPrefixDOMProperty: utilPrefixDOMProperty,
102394                 utilPreset: utilPreset,
102395                 utilQsString: utilQsString,
102396                 utilRebind: utilRebind,
102397                 utilSetTransform: utilSetTransform,
102398                 utilSessionMutex: utilSessionMutex,
102399                 utilStringQs: utilStringQs,
102400                 utilTagDiff: utilTagDiff,
102401                 utilTagText: utilTagText,
102402                 utilTiler: utilTiler,
102403                 utilTriggerEvent: utilTriggerEvent,
102404                 utilWrap: utilWrap,
102405                 validationAlmostJunction: validationAlmostJunction,
102406                 validationCloseNodes: validationCloseNodes,
102407                 validationCrossingWays: validationCrossingWays,
102408                 validationDisconnectedWay: validationDisconnectedWay,
102409                 validationFixmeTag: validationFixmeTag,
102410                 validationGenericName: validationGenericName,
102411                 validationImpossibleOneway: validationImpossibleOneway,
102412                 validationIncompatibleSource: validationIncompatibleSource,
102413                 validationMaprules: validationMaprules,
102414                 validationMissingRole: validationMissingRole,
102415                 validationMissingTag: validationMissingTag,
102416                 validationOutdatedTags: validationOutdatedTags,
102417                 validationPrivateData: validationPrivateData,
102418                 validationTagSuggestsArea: validationTagSuggestsArea,
102419                 validationUnsquareWay: validationUnsquareWay
102420         });
102421
102422         // polyfill requestIdleCallback
102423         window.requestIdleCallback = window.requestIdleCallback ||
102424             function(cb) {
102425                 var start = Date.now();
102426                 return window.requestAnimationFrame(function() {
102427                     cb({
102428                         didTimeout: false,
102429                         timeRemaining: function() {
102430                             return Math.max(0, 50 - (Date.now() - start));
102431                         }
102432                     });
102433                 });
102434             };
102435
102436         window.cancelIdleCallback = window.cancelIdleCallback ||
102437             function(id) {
102438                 window.cancelAnimationFrame(id);
102439             };
102440         window.iD = iD;
102441
102442 }());
102443 //# sourceMappingURL=iD.js.map